summaryrefslogtreecommitdiff
path: root/macros/latex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex')
-rw-r--r--macros/latex/contrib/arraycols/arraycols.dtx148
-rw-r--r--macros/latex/contrib/arraycols/arraycols.ins4
-rw-r--r--macros/latex/contrib/arraycols/arraycols.pdfbin464654 -> 129129 bytes
-rw-r--r--macros/latex/contrib/babel-contrib/french/README.md4
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb-doc.pdfbin190506 -> 208709 bytes
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb-doc.tex156
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb.dtx1331
-rw-r--r--macros/latex/contrib/babel-contrib/french/frenchb.pdfbin366313 -> 345330 bytes
-rw-r--r--macros/latex/contrib/babel-contrib/latvian/README.md10
-rw-r--r--macros/latex/contrib/babel-contrib/latvian/latvian.dtx18
-rw-r--r--macros/latex/contrib/babel-contrib/latvian/latvian.pdfbin267036 -> 282377 bytes
-rw-r--r--macros/latex/contrib/babel-contrib/welsh/README.md (renamed from macros/latex/contrib/babel-contrib/welsh/README)13
-rw-r--r--macros/latex/contrib/babel-contrib/welsh/welsh.dtx12
-rw-r--r--macros/latex/contrib/babel-contrib/welsh/welsh.pdfbin111128 -> 119975 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/DEPENDS.txt2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/README.md33
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamercolorthemerainbow.sty2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc-settings.sty199
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.pdfbin161174 -> 164420 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.tex164
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/DEPENDS.txt4
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/README.md31
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamerinnerthemetcolorbox.sty2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc-settings.sty199
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.pdfbin177469 -> 178055 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.tex198
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/README3
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdfbin411119 -> 412844 bytes
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex29
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx41
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx4
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx2
-rw-r--r--macros/latex/contrib/catppuccinpalette/README.md28
-rw-r--r--macros/latex/contrib/catppuccinpalette/catppuccinpalette.dtx422
-rw-r--r--macros/latex/contrib/catppuccinpalette/catppuccinpalette.ins57
-rw-r--r--macros/latex/contrib/catppuccinpalette/catppuccinpalette.pdfbin0 -> 212270 bytes
-rw-r--r--macros/latex/contrib/colorblind/ChangeLog7
-rw-r--r--macros/latex/contrib/colorblind/README.md23
-rw-r--r--macros/latex/contrib/colorblind/bib.bib43
-rw-r--r--macros/latex/contrib/colorblind/colorblind.sty398
-rw-r--r--macros/latex/contrib/colorblind/documentation.pdfbin0 -> 105258 bytes
-rw-r--r--macros/latex/contrib/colorblind/documentation.tex365
-rw-r--r--macros/latex/contrib/csvsimple/CHANGES.md12
-rw-r--r--macros/latex/contrib/csvsimple/README.md2
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-doc.sty6
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-example.pdfbin72044 -> 72044 bytes
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-example.tex2
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-l3.pdfbin937516 -> 951198 bytes
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-l3.sty12
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-l3.tex53
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-legacy.pdfbin690987 -> 690985 bytes
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-legacy.sty4
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-legacy.tex2
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple.pdfbin295559 -> 295659 bytes
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple.sty4
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple.tex2
-rw-r--r--macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdfbin182916 -> 183174 bytes
-rw-r--r--macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex6
-rw-r--r--macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdfbin1399073 -> 1446315 bytes
-rw-r--r--macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex185
-rw-r--r--macros/latex/contrib/customenvs/doc/envtexo_exemples.tex158
-rw-r--r--macros/latex/contrib/customenvs/tex/customenvs.sty267
-rw-r--r--macros/latex/contrib/easybook/easybook.dtx353
-rw-r--r--macros/latex/contrib/easybook/easybook.pdfbin641249 -> 632955 bytes
-rw-r--r--macros/latex/contrib/easybook/easybook.tex433
-rw-r--r--macros/latex/contrib/els-cas-templates/README2
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-common.sty11
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-dc-sample.pdfbin0 -> 909164 bytes
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-dc-sample.tex463
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-dc-template.tex61
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-dc.cls26
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-model2-names.bst8
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-refs.bib2
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-sc-sample.pdfbin0 -> 956878 bytes
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-sc-sample.tex457
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-sc-template.tex62
-rw-r--r--macros/latex/contrib/els-cas-templates/cas-sc.cls11
-rw-r--r--macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.pdfbin433973 -> 430989 bytes
-rw-r--r--macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.tex6
-rw-r--r--macros/latex/contrib/els-cas-templates/doc/rvdtx.sty4
-rw-r--r--macros/latex/contrib/els-cas-templates/figs/cas-grabs.pdfbin0 -> 8354 bytes
-rw-r--r--macros/latex/contrib/els-cas-templates/figs/cas-munnar-2024.jpgbin0 -> 681950 bytes
-rw-r--r--macros/latex/contrib/els-cas-templates/figs/cas-pic1.pdfbin0 -> 2546 bytes
-rw-r--r--macros/latex/contrib/els-cas-templates/manifest.txt36
-rw-r--r--macros/latex/contrib/esindex/README.md4
-rw-r--r--macros/latex/contrib/esindex/esindex.pdfbin62539 -> 68921 bytes
-rw-r--r--macros/latex/contrib/esindex/esindex.sty37
-rw-r--r--macros/latex/contrib/esindex/esindex.tex8
-rw-r--r--macros/latex/contrib/fadingimage/README.md18
-rw-r--r--macros/latex/contrib/fadingimage/doc/fadingimage.pdfbin138677 -> 137070 bytes
-rw-r--r--macros/latex/contrib/fadingimage/doc/fadingimage.tex29
-rw-r--r--macros/latex/contrib/fadingimage/tex/fadingimage.sty52
-rw-r--r--macros/latex/contrib/fontscale/CHANGELOG.md26
-rw-r--r--macros/latex/contrib/fontscale/fontscale-manual.pdfbin117119 -> 117192 bytes
-rw-r--r--macros/latex/contrib/fontscale/fontscale-manual.tex28
-rw-r--r--macros/latex/contrib/fontscale/fontscale.sty549
-rw-r--r--macros/latex/contrib/frenchmath/frenchmath.dtx724
-rw-r--r--macros/latex/contrib/frenchmath/frenchmath.pdfbin580908 -> 864717 bytes
-rw-r--r--macros/latex/contrib/fvextra/CHANGELOG.md231
-rw-r--r--macros/latex/contrib/fvextra/fvextra.dtx210
-rw-r--r--macros/latex/contrib/fvextra/fvextra.ins4
-rw-r--r--macros/latex/contrib/fvextra/fvextra.pdfbin905185 -> 895911 bytes
-rw-r--r--macros/latex/contrib/huaz/README2
-rw-r--r--macros/latex/contrib/huaz/huaz.pdfbin323827 -> 371130 bytes
-rw-r--r--macros/latex/contrib/huaz/huaz.sty567
-rw-r--r--macros/latex/contrib/huaz/huaz.tex869
-rw-r--r--macros/latex/contrib/hvqrurl/Changes1
-rw-r--r--macros/latex/contrib/hvqrurl/doc/hvqrurl.pdfbin117382 -> 118777 bytes
-rw-r--r--macros/latex/contrib/hvqrurl/doc/hvqrurl.tex6
-rw-r--r--macros/latex/contrib/hvqrurl/latex/hvqrurl.sty33
-rw-r--r--macros/latex/contrib/hyperref/ChangeLog.txt15
-rw-r--r--macros/latex/contrib/hyperref/README.md2
-rw-r--r--macros/latex/contrib/hyperref/doc/backref.pdfbin206469 -> 206469 bytes
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc.html2
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc.pdfbin318424 -> 318600 bytes
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc.tex2
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc2.html4
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc3.html4
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc4.html4
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc5.html4
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc6.html4
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc7.html4
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc8.html4
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-doc9.html4
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref-linktarget.pdfbin439699 -> 439109 bytes
-rw-r--r--macros/latex/contrib/hyperref/doc/hyperref.pdfbin2343152 -> 2341341 bytes
-rw-r--r--macros/latex/contrib/hyperref/doc/nameref.pdfbin172475 -> 172475 bytes
-rw-r--r--macros/latex/contrib/hyperref/doc/xr-hyper.pdfbin318270 -> 304784 bytes
-rw-r--r--macros/latex/contrib/hyperref/hluatex.dtx5
-rw-r--r--macros/latex/contrib/hyperref/hyperref-linktarget.dtx2
-rw-r--r--macros/latex/contrib/hyperref/hyperref-patches.dtx2
-rw-r--r--macros/latex/contrib/hyperref/hyperref.dtx81
-rw-r--r--macros/latex/contrib/hyperref/xr-hyper.dtx8
-rw-r--r--macros/latex/contrib/jsonparse/README.md9
-rw-r--r--macros/latex/contrib/jsonparse/jason/jason.pdf1662
-rw-r--r--macros/latex/contrib/jsonparse/jason/jason.svg67
-rw-r--r--macros/latex/contrib/jsonparse/jsonparse-doc.pdfbin414511 -> 578489 bytes
-rw-r--r--macros/latex/contrib/jsonparse/jsonparse-doc.tex30
-rw-r--r--macros/latex/contrib/jsonparse/jsonparse.sty95
-rw-r--r--macros/latex/contrib/l3packages/CHANGELOG.md11
-rw-r--r--macros/latex/contrib/l3packages/README.md2
-rw-r--r--macros/latex/contrib/l3packages/l3keys2e-demo.tex2
-rw-r--r--macros/latex/contrib/l3packages/l3keys2e.dtx4
-rw-r--r--macros/latex/contrib/l3packages/l3keys2e.pdfbin412717 -> 412900 bytes
-rw-r--r--macros/latex/contrib/l3packages/xfp.dtx4
-rw-r--r--macros/latex/contrib/l3packages/xfp.pdfbin332422 -> 332573 bytes
-rw-r--r--macros/latex/contrib/l3packages/xparse.dtx4
-rw-r--r--macros/latex/contrib/l3packages/xparse.pdfbin551698 -> 551837 bytes
-rw-r--r--macros/latex/contrib/l3packages/xtemplate.dtx7
-rw-r--r--macros/latex/contrib/l3packages/xtemplate.pdfbin448862 -> 449003 bytes
-rw-r--r--macros/latex/contrib/lastpage/README6
-rw-r--r--macros/latex/contrib/lastpage/lastpage-example.pdfbin130736 -> 130201 bytes
-rw-r--r--macros/latex/contrib/lastpage/lastpage.dtx320
-rw-r--r--macros/latex/contrib/lastpage/lastpage.pdfbin448061 -> 440278 bytes
-rw-r--r--macros/latex/contrib/latex2pydata/CHANGELOG.md39
-rw-r--r--macros/latex/contrib/latex2pydata/README13
-rw-r--r--macros/latex/contrib/latex2pydata/latex2pydata.dtx282
-rw-r--r--macros/latex/contrib/latex2pydata/latex2pydata.ins4
-rw-r--r--macros/latex/contrib/latex2pydata/latex2pydata.pdfbin292477 -> 296929 bytes
-rw-r--r--macros/latex/contrib/listings/listings-devel.pdfbin1451842 -> 1454841 bytes
-rw-r--r--macros/latex/contrib/listings/listings.dtx210
-rw-r--r--macros/latex/contrib/listings/listings.pdfbin1026586 -> 1028632 bytes
-rw-r--r--macros/latex/contrib/listings/lstdrvrs.dtx190
-rw-r--r--macros/latex/contrib/listings/lstdrvrs.pdfbin761854 -> 790575 bytes
-rw-r--r--macros/latex/contrib/litesolution/README.md20
-rw-r--r--macros/latex/contrib/litesolution/doc/figure/universe.pdfbin97187 -> 97170 bytes
-rw-r--r--macros/latex/contrib/litesolution/doc/figure/universe.tex10
-rw-r--r--macros/latex/contrib/litesolution/doc/litesolution.pdfbin628872 -> 276452 bytes
-rw-r--r--macros/latex/contrib/litesolution/doc/litesolution.tex129
-rw-r--r--macros/latex/contrib/litesolution/tex/litesolution.cls198
-rw-r--r--macros/latex/contrib/mathgreeks/README.md30
-rw-r--r--macros/latex/contrib/mathgreeks/mathgreeks.dtx1330
-rw-r--r--macros/latex/contrib/mathgreeks/mathgreeks.ins56
-rw-r--r--macros/latex/contrib/mathgreeks/mathgreeks.pdfbin0 -> 1716766 bytes
-rw-r--r--macros/latex/contrib/mismath/README.md8
-rw-r--r--macros/latex/contrib/mismath/mismath.dtx1097
-rw-r--r--macros/latex/contrib/mismath/mismath.ins2
-rw-r--r--macros/latex/contrib/mismath/mismath.pdfbin155495 -> 438746 bytes
-rw-r--r--macros/latex/contrib/msu-thesis/README.md18
-rw-r--r--macros/latex/contrib/msu-thesis/docs/msu-thesis.tex35
-rw-r--r--macros/latex/contrib/msu-thesis/msu-thesis.cls18
-rw-r--r--macros/latex/contrib/msu-thesis/msu-thesis.pdfbin114013 -> 117097 bytes
-rw-r--r--macros/latex/contrib/nmbib/Makefile6
-rw-r--r--macros/latex/contrib/nmbib/README2
-rw-r--r--macros/latex/contrib/nmbib/nmbib-sample.pdf (renamed from macros/latex/contrib/nmbib/nmsample.pdf)bin96763 -> 101693 bytes
-rw-r--r--macros/latex/contrib/nmbib/nmbib-sample.tex (renamed from macros/latex/contrib/nmbib/nmsample.tex)0
-rw-r--r--macros/latex/contrib/nmbib/nmbib.dtx4
-rw-r--r--macros/latex/contrib/nmbib/nmbib.pdfbin347244 -> 368243 bytes
-rw-r--r--macros/latex/contrib/nmbib/nmbibtex.1135
-rw-r--r--macros/latex/contrib/notebeamer/README.md25
-rw-r--r--macros/latex/contrib/notebeamer/doc/notebeamer.pdfbin1357620 -> 907049 bytes
-rw-r--r--macros/latex/contrib/notebeamer/doc/notebeamer.tex21
-rw-r--r--macros/latex/contrib/notebeamer/tex/notebeamer.sty6
-rw-r--r--macros/latex/contrib/osda/README.md4
-rw-r--r--macros/latex/contrib/osda/example.pngbin162079 -> 186840 bytes
-rw-r--r--macros/latex/contrib/osda/osda.dtx111
-rw-r--r--macros/latex/contrib/osda/osda.ins4
-rw-r--r--macros/latex/contrib/osda/osda.pdfbin192843 -> 219701 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md7
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/README.md2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx18
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdfbin988498 -> 988776 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx31
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdfbin710596 -> 711669 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdfbin602231 -> 602769 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdfbin515190 -> 515851 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdfbin558195 -> 558756 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdfbin541346 -> 541897 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdfbin542807 -> 543358 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdfbin537794 -> 538339 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdfbin593846 -> 594389 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx2
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdfbin516025 -> 516578 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdfbin753165 -> 753718 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdfbin567628 -> 568304 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdfbin685171 -> 685930 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx8
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdfbin847957 -> 848504 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx14
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdfbin529823 -> 530707 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdfbin427235 -> 428064 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdfbin586990 -> 587757 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx4
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdfbin434032 -> 434746 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx6
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdfbin463888 -> 464617 bytes
-rw-r--r--macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty2
-rw-r--r--macros/latex/contrib/ppt-slides/README.md9
-rw-r--r--macros/latex/contrib/ppt-slides/ppt-slides.dtx4
-rw-r--r--macros/latex/contrib/ppt-slides/ppt-slides.pdfbin935972 -> 935953 bytes
-rw-r--r--macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdfbin10283638 -> 10330568 bytes
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCArbreChiffre.tex200
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCCartesJeux.tex11
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCEcrireunQCM.tex10
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCPatronPaves.tex177
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCVisualisationMulDeci.tex135
-rw-r--r--macros/latex/contrib/profcollege/latex/PfCVueCubes.tex99
-rw-r--r--macros/latex/contrib/profcollege/latex/ProfCollege.sty105
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdfbin1691169 -> 1783164 bytes
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex314
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.pdfbin73910 -> 74004 bytes
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.tex427
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pythontex.tex242
-rw-r--r--macros/latex/contrib/proflycee/tex/ProfLycee.sty4
-rw-r--r--macros/latex/contrib/proflycee/tex/proflycee-tools-aleatoire.tex14
-rw-r--r--macros/latex/contrib/proflycee/tex/proflycee-tools-analyse.tex30
-rw-r--r--macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex390
-rw-r--r--macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex189
-rw-r--r--macros/latex/contrib/proflycee/tex/proflycee-tools-probas.tex183
-rw-r--r--macros/latex/contrib/profmaquette/doc/ProfMaquette-doc.pdfbin288571 -> 298965 bytes
-rw-r--r--macros/latex/contrib/profmaquette/latex/ProfMaquette.sty314
-rw-r--r--macros/latex/contrib/reledmac/doc-include/migrate-mac.dtx2
-rw-r--r--macros/latex/contrib/reledmac/doc-more/page-typesetting-columns.pdfbin40793 -> 40800 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/1-criticalendnotes.pdfbin201564 -> 201562 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/1-criticalnotes.pdfbin197819 -> 197818 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/1-sidenotes.pdfbin295209 -> 295212 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/1-tabular.pdfbin285556 -> 285559 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/1-verses-doublenumbering.pdfbin198959 -> 198959 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/1-verses.pdfbin198794 -> 198796 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-antilabe.pdfbin210969 -> 210970 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-cross_referencing.pdfbin198304 -> 198303 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-footnote_spacing.pdfbin201443 -> 201445 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-glossaries.pdfbin285503 -> 285501 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-indexing.pdfbin278070 -> 278069 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-lemma_disambigution.pdfbin276219 -> 276219 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-line_numbers_in_header.pdfbin292434 -> 292435 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-linespacing.pdfbin286626 -> 286624 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-manuscript-apparatus.pdfbin288123 -> 288122 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-notes-width.pdfbin204669 -> 204669 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-one_series_per_pstart.pdfbin212242 -> 212239 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-performances.pdfbin284583 -> 284580 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-reledmac-right-to-left.pdfbin36940 -> 36941 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-subdivision-number-in-header.pdfbin310603 -> 310601 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-titles_in_line_numbering_with_notes.pdfbin288795 -> 288795 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/2-titles_not_in_line_numbering.pdfbin199918 -> 199919 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_columns_different_languages.pdfbin23442 -> 23444 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_mwe.pdfbin175650 -> 175645 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_pages_different_languages_lualatex.pdfbin32047 -> 32049 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_same_page_number_in_both_side.pdfbin289211 -> 289211 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted-nomax.pdfbin200041 -> 200045 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted.pdfbin199278 -> 199281 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_default.pdfbin177110 -> 177110 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax-shifted.pdfbin199681 -> 199684 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax.pdfbin198615 -> 198615 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nosync.pdfbin198665 -> 198673 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_shifted.pdfbin198797 -> 198798 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column-continuous-numbering.pdfbin214377 -> 214375 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column.pdfbin210488 -> 210491 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_columns_alignment.pdfbin204974 -> 204973 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_columns_titles_in_line_numbering_with_notes.pdfbin298422 -> 298425 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_inside-outside-columns.pdfbin204015 -> 204015 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_one_series_per_pstart.pdfbin225555 -> 225554 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_pages_long_notes.pdfbin251002 -> 251039 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_pages_notes_leftpage.pdfbin202381 -> 202382 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_pages_paragraph_separator_between.pdfbin198565 -> 198565 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_pages_titles_in_line_numbering_with_notes.pdfbin302774 -> 302779 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_titles_not_in_line_numbering.pdfbin206955 -> 206948 bytes
-rw-r--r--macros/latex/contrib/reledmac/examples/4-reledpar_verse_text_between.pdfbin194198 -> 194201 bytes
-rw-r--r--macros/latex/contrib/reledmac/migration.pdfbin368423 -> 368433 bytes
-rw-r--r--macros/latex/contrib/reledmac/reledmac.dtx29
-rw-r--r--macros/latex/contrib/reledmac/reledmac.pdfbin2159903 -> 2162033 bytes
-rw-r--r--macros/latex/contrib/reledmac/reledpar.dtx4
-rw-r--r--macros/latex/contrib/reledmac/reledpar.pdfbin1046923 -> 1041243 bytes
-rw-r--r--macros/latex/contrib/rigidnotation/README.md31
-rw-r--r--macros/latex/contrib/rigidnotation/rigidnotation.dtx507
-rw-r--r--macros/latex/contrib/rigidnotation/rigidnotation.ins41
-rw-r--r--macros/latex/contrib/rigidnotation/rigidnotation.pdfbin0 -> 273004 bytes
-rw-r--r--macros/latex/contrib/rpgicons/LICENSE415
-rw-r--r--macros/latex/contrib/rpgicons/README.md30
-rw-r--r--macros/latex/contrib/rpgicons/rpgicons-doc.pdfbin0 -> 500755 bytes
-rw-r--r--macros/latex/contrib/rpgicons/rpgicons-doc.tex868
-rw-r--r--macros/latex/contrib/rpgicons/rpgicons-l3.sty2025
-rw-r--r--macros/latex/contrib/rpgicons/rpgicons-pgf.sty2596
-rw-r--r--macros/latex/contrib/rpgicons/rpgicons.sty35
-rw-r--r--macros/latex/contrib/se2thesis/CHANGELOG.md29
-rw-r--r--macros/latex/contrib/se2thesis/se2colors.dtx7
-rw-r--r--macros/latex/contrib/se2thesis/se2fonts.dtx63
-rw-r--r--macros/latex/contrib/se2thesis/se2packages.dtx31
-rw-r--r--macros/latex/contrib/se2thesis/se2thesis-master-thesis-example.pdfbin232557 -> 232548 bytes
-rw-r--r--macros/latex/contrib/se2thesis/se2thesis.dtx8
-rw-r--r--macros/latex/contrib/se2thesis/se2thesis.ins6
-rw-r--r--macros/latex/contrib/se2thesis/se2thesis.pdfbin359300 -> 360380 bytes
-rw-r--r--macros/latex/contrib/se2thesis/se2thesis.tex2
-rw-r--r--macros/latex/contrib/siunitx/CHANGELOG.md9
-rw-r--r--macros/latex/contrib/siunitx/siunitx-code.pdfbin645251 -> 646201 bytes
-rw-r--r--macros/latex/contrib/siunitx/siunitx-quantity.dtx2
-rw-r--r--macros/latex/contrib/siunitx/siunitx.dtx2
-rw-r--r--macros/latex/contrib/siunitx/siunitx.pdfbin703738 -> 703731 bytes
-rw-r--r--macros/latex/contrib/skillicons/README.md15
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Dark-eps-converted-to.pdfbin0 -> 4797 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Dark.epsbin0 -> 3388 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Light-eps-converted-to.pdfbin0 -> 4809 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Light.epsbin0 -> 3398 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Dark-eps-converted-to.pdfbin0 -> 2972 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Dark.epsbin0 -> 1684 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Light-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Light.epsbin0 -> 1692 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Dark-eps-converted-to.pdfbin0 -> 2597 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Dark.epsbin0 -> 1295 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Light-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Light.epsbin0 -> 1293 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Dark-eps-converted-to.pdfbin0 -> 5045 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Dark.epsbin0 -> 3670 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Light-eps-converted-to.pdfbin0 -> 5059 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Light.epsbin0 -> 3681 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Adonis-eps-converted-to.pdfbin0 -> 2700 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Adonis.epsbin0 -> 1398 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AfterEffects-eps-converted-to.pdfbin0 -> 3463 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AfterEffects.epsbin0 -> 2172 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Dark-eps-converted-to.pdfbin0 -> 6362 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Dark.epsbin0 -> 5237 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Light-eps-converted-to.pdfbin0 -> 6346 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Light.epsbin0 -> 5219 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Dark-eps-converted-to.pdf76
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Dark.epsbin0 -> 1224 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Light-eps-converted-to.pdfbin0 -> 2522 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Light.epsbin0 -> 1221 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Dark-eps-converted-to.pdfbin0 -> 4610 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Dark.epsbin0 -> 3234 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Light-eps-converted-to.pdfbin0 -> 4609 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Light.epsbin0 -> 3236 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Dark-eps-converted-to.pdfbin0 -> 4039 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Dark.epsbin0 -> 2656 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Light-eps-converted-to.pdfbin0 -> 4038 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Light.epsbin0 -> 2656 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Dark-eps-converted-to.pdf76
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Dark.epsbin0 -> 1314 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Light-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Light.epsbin0 -> 1315 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ansible-eps-converted-to.pdfbin0 -> 3275 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ansible.epsbin0 -> 1893 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Apollo-eps-converted-to.pdfbin0 -> 3733 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Apollo.epsbin0 -> 2141 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Dark-eps-converted-to.pdfbin0 -> 3431 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Dark.epsbin0 -> 2088 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Light-eps-converted-to.pdfbin0 -> 3428 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Light.epsbin0 -> 2087 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Appwrite-eps-converted-to.pdfbin0 -> 3524 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Appwrite.epsbin0 -> 2159 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Dark-eps-converted-to.pdfbin0 -> 6959 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Dark.epsbin0 -> 3511 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Light-eps-converted-to.pdfbin0 -> 6957 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Light.epsbin0 -> 3513 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Arduino-eps-converted-to.pdfbin0 -> 3877 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Arduino.epsbin0 -> 2535 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Astro-eps-converted-to.pdfbin0 -> 6185 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Astro.epsbin0 -> 3447 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Atom-eps-converted-to.pdfbin0 -> 4785 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Atom.epsbin0 -> 3181 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Audition-eps-converted-to.pdfbin0 -> 3301 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Audition.epsbin0 -> 1997 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AutoCAD-Light.epsbin0 -> 1702 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_AutoCAD_Dark.epsbin0 -> 1702 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Autocad-Light-eps-converted-to.pdfbin0 -> 3024 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Azul-eps-converted-to.pdfbin0 -> 4443 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Azul.epsbin0 -> 2854 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Dark-eps-converted-to.pdfbin0 -> 7499 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Dark.epsbin0 -> 4703 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Light-eps-converted-to.pdfbin0 -> 7499 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Light.epsbin0 -> 4701 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Dark-eps-converted-to.pdfbin0 -> 4603 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Dark.epsbin0 -> 3382 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Light-eps-converted-to.pdfbin0 -> 4606 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Light.epsbin0 -> 3383 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Babel-eps-converted-to.pdfbin0 -> 28831 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Babel.epsbin0 -> 27068 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Dark-eps-converted-to.pdfbin0 -> 3644 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Dark.epsbin0 -> 2304 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Light-eps-converted-to.pdfbin0 -> 3658 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Light.epsbin0 -> 2316 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Dark-eps-converted-to.pdfbin0 -> 4389 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Dark.epsbin0 -> 3055 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Light-eps-converted-to.pdfbin0 -> 13642 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Light.epsbin0 -> 13057 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Dark-eps-converted-to.pdf128
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Dark.epsbin0 -> 1960 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Light-eps-converted-to.pdfbin0 -> 3532 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Light.epsbin0 -> 1957 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Dark-eps-converted-to.pdfbin0 -> 3601 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Dark.epsbin0 -> 2267 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Light-eps-converted-to.pdfbin0 -> 3605 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Light.epsbin0 -> 2265 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bootstrap-eps-converted-to.pdf163
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bootstrap.epsbin0 -> 2653 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Dark-eps-converted-to.pdfbin0 -> 5928 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Dark.epsbin0 -> 4558 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Light-eps-converted-to.pdfbin0 -> 5926 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Light.epsbin0 -> 4556 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_C-eps-converted-to.pdfbin0 -> 2698 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_C.epsbin0 -> 1383 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Dark-eps-converted-to.pdfbin0 -> 5848 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Dark.epsbin0 -> 4177 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Light-eps-converted-to.pdfbin0 -> 5848 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Light.epsbin0 -> 4173 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Dark-eps-converted-to.pdf231
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Dark.epsbin0 -> 3114 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Light-eps-converted-to.pdf230
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Light.epsbin0 -> 3111 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CPP-eps-converted-to.pdfbin0 -> 2707 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CPP.epsbin0 -> 1408 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CS-eps-converted-to.pdfbin0 -> 2821 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CS.epsbin0 -> 1517 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CSS-eps-converted-to.pdf73
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CSS.epsbin0 -> 1351 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Dark-eps-converted-to.pdfbin0 -> 12025 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Dark.epsbin0 -> 12030 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Light-eps-converted-to.pdfbin0 -> 12059 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Light.epsbin0 -> 12066 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Dark-eps-converted-to.pdfbin0 -> 3589 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Dark.epsbin0 -> 2234 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Light-eps-converted-to.pdfbin0 -> 3592 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Light.epsbin0 -> 2233 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Dark-eps-converted-to.pdfbin0 -> 3288 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Dark.epsbin0 -> 1951 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Light-eps-converted-to.pdfbin0 -> 3287 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Light.epsbin0 -> 1948 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Dark-eps-converted-to.pdfbin0 -> 2752 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Dark.epsbin0 -> 1435 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Light-eps-converted-to.pdfbin0 -> 2748 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Light.epsbin0 -> 1434 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Dark-eps-converted-to.pdfbin0 -> 3558 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Dark.epsbin0 -> 2228 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Light-eps-converted-to.pdfbin0 -> 3570 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Light.epsbin0 -> 2235 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Dark-eps-converted-to.pdfbin0 -> 2682 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Dark.epsbin0 -> 1363 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Light-eps-converted-to.pdfbin0 -> 2712 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Light.epsbin0 -> 1369 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Dark-eps-converted-to.pdfbin0 -> 7506 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Dark.epsbin0 -> 5053 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Light-eps-converted-to.pdfbin0 -> 7506 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Light.epsbin0 -> 5052 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Dark-eps-converted-to.pdfbin0 -> 2791 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Dark.epsbin0 -> 1480 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Light-eps-converted-to.pdfbin0 -> 2792 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Light.epsbin0 -> 1476 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Dark-eps-converted-to.pdfbin0 -> 7375 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Dark.epsbin0 -> 5916 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Light-eps-converted-to.pdfbin0 -> 7374 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Light.epsbin0 -> 5914 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Dark-eps-converted-to.pdfbin0 -> 3029 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Dark.epsbin0 -> 1702 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Light-eps-converted-to.pdfbin0 -> 3024 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Light.epsbin0 -> 1703 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Dark-eps-converted-to.pdfbin0 -> 4376 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Dark.epsbin0 -> 2984 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Light-eps-converted-to.pdfbin0 -> 4373 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Light.epsbin0 -> 2981 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Dark-eps-converted-to.pdf79
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Dark.epsbin0 -> 1486 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Light-eps-converted-to.pdfbin0 -> 2798 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Light.epsbin0 -> 1487 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Discord-eps-converted-to.pdfbin0 -> 3211 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Discord.epsbin0 -> 1865 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordBots-eps-converted-to.pdfbin0 -> 3264 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordBots.epsbin0 -> 1968 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Dark-eps-converted-to.pdfbin0 -> 4353 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Dark.epsbin0 -> 3005 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Light-eps-converted-to.pdfbin0 -> 4352 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Light.epsbin0 -> 3003 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Django-eps-converted-to.pdfbin0 -> 2775 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Django.epsbin0 -> 1460 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Docker-eps-converted-to.pdfbin0 -> 2664 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Docker.epsbin0 -> 1436 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DotNet-eps-converted-to.pdfbin0 -> 2836 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DotNet.epsbin0 -> 1522 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Dark-eps-converted-to.pdfbin0 -> 3082 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Dark.epsbin0 -> 1778 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Light-eps-converted-to.pdfbin0 -> 3082 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Light.epsbin0 -> 1778 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Dark-eps-converted-to.pdfbin0 -> 2331 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Dark.epsbin0 -> 2874 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Light-eps-converted-to.pdfbin0 -> 4531 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Light.epsbin0 -> 2874 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Dark-eps-converted-to.pdfbin0 -> 3129 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Dark.epsbin0 -> 1845 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Light-eps-converted-to.pdfbin0 -> 3130 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Light.epsbin0 -> 1843 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Electron-eps-converted-to.pdfbin0 -> 5479 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Electron.epsbin0 -> 4060 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Dark-eps-converted-to.pdfbin0 -> 18746 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Dark.epsbin0 -> 12298 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Light-eps-converted-to.pdfbin0 -> 18745 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Light.epsbin0 -> 12296 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Dark-eps-converted-to.pdfbin0 -> 19140 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Dark.epsbin0 -> 17600 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Light-eps-converted-to.pdfbin0 -> 19138 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Light.epsbin0 -> 17598 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Emacs-eps-converted-to.pdfbin0 -> 4010 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Emacs.epsbin0 -> 2463 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ember-eps-converted-to.pdfbin0 -> 39149 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ember.epsbin0 -> 40887 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Dark-eps-converted-to.pdfbin0 -> 77591 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Dark.epsbin0 -> 75345 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Light-eps-converted-to.pdfbin0 -> 77585 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Light.epsbin0 -> 75343 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Dark-eps-converted-to.pdfbin0 -> 3261 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Dark.epsbin0 -> 1922 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Light-eps-converted-to.pdfbin0 -> 3267 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Light.epsbin0 -> 1927 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_FastAPI-eps-converted-to.pdf76
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_FastAPI.epsbin0 -> 1233 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Dark-eps-converted-to.pdfbin0 -> 4502 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Dark.epsbin0 -> 2799 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Light-eps-converted-to.pdfbin0 -> 4502 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Light.epsbin0 -> 2802 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Dark-eps-converted-to.pdfbin0 -> 2754 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Dark.epsbin0 -> 1439 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Light-eps-converted-to.pdfbin0 -> 2750 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Light.epsbin0 -> 1438 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Dark-eps-converted-to.pdfbin0 -> 32404 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Dark.epsbin0 -> 16147 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Light-eps-converted-to.pdfbin0 -> 32404 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Light.epsbin0 -> 16147 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Dark-eps-converted-to.pdfbin0 -> 9035 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Dark.epsbin0 -> 7650 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Light-eps-converted-to.pdfbin0 -> 9035 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Light.epsbin0 -> 7650 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Dark-eps-converted-to.pdfbin0 -> 2672 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Dark.epsbin0 -> 1370 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Light-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Light.epsbin0 -> 1370 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Forth-eps-converted-to.pdfbin0 -> 2765 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Forth.epsbin0 -> 1474 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Fortran-eps-converted-to.pdfbin0 -> 2815 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Fortran.epsbin0 -> 1513 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Dark-eps-converted-to.pdfbin0 -> 3026 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Dark.epsbin0 -> 1719 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Light-eps-converted-to.pdfbin0 -> 3031 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Light.epsbin0 -> 1715 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Dark-eps-converted-to.pdfbin0 -> 2637 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Dark.epsbin0 -> 1369 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Light-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Light.epsbin0 -> 1365 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GameMakerStudio-eps-converted-to.pdf72
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GameMakerStudio.epsbin0 -> 1203 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gatsby-eps-converted-to.pdfbin0 -> 2614 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gatsby.epsbin0 -> 1306 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Dark-eps-converted-to.pdfbin0 -> 4552 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Dark.epsbin0 -> 3179 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Light-eps-converted-to.pdfbin0 -> 4556 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Light.epsbin0 -> 3181 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Git-eps-converted-to.pdfbin0 -> 3425 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Git.epsbin0 -> 2111 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Dark-eps-converted-to.pdfbin0 -> 2653 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Dark.epsbin0 -> 1360 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Light-eps-converted-to.pdfbin0 -> 2655 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Light.epsbin0 -> 1362 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Dark-eps-converted-to.pdfbin0 -> 3546 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Dark.epsbin0 -> 2216 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Light-eps-converted-to.pdfbin0 -> 3553 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Light.epsbin0 -> 2224 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Dark-eps-converted-to.pdfbin0 -> 3241 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Dark.epsbin0 -> 1935 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Light-eps-converted-to.pdfbin0 -> 3239 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Light.epsbin0 -> 1931 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Dark-eps-converted-to.pdf76
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Dark.epsbin0 -> 1379 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Light-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Light.epsbin0 -> 1381 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GoLang-eps-converted-to.pdfbin0 -> 3412 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GoLang.epsbin0 -> 2138 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Dark-eps-converted-to.pdfbin0 -> 4080 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Dark.epsbin0 -> 2708 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Light-eps-converted-to.pdfbin0 -> 4079 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Light.epsbin0 -> 2705 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Dark-eps-converted-to.pdfbin0 -> 3804 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Dark.epsbin0 -> 2440 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Light-eps-converted-to.pdfbin0 -> 3815 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Light.epsbin0 -> 2452 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Dark-eps-converted-to.pdfbin0 -> 6269 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Dark.epsbin0 -> 4605 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Light-eps-converted-to.pdfbin0 -> 6340 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Light.eps216
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Dark-eps-converted-to.pdfbin0 -> 3168 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Dark.epsbin0 -> 1862 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Light-eps-converted-to.pdfbin0 -> 3168 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Light.epsbin0 -> 1864 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gulp-eps-converted-to.pdfbin0 -> 3865 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Gulp.epsbin0 -> 2508 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_HTML-eps-converted-to.pdfbin0 -> 2606 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_HTML.epsbin0 -> 1311 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Dark-eps-converted-to.pdfbin0 -> 2604 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Dark.epsbin0 -> 1295 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Light-eps-converted-to.pdf79
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Light.epsbin0 -> 1323 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Dark-eps-converted-to.pdfbin0 -> 2811 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Dark.epsbin0 -> 1498 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Light-eps-converted-to.pdfbin0 -> 2805 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Light.epsbin0 -> 1493 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Dark-eps-converted-to.pdf73
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Dark.epsbin0 -> 1284 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Light-eps-converted-to.pdfbin0 -> 2600 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Light.epsbin0 -> 1286 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Heroku-eps-converted-to.pdfbin0 -> 2663 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Heroku.epsbin0 -> 1351 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Dark-eps-converted-to.pdf72
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Dark.epsbin0 -> 1285 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Light-eps-converted-to.pdfbin0 -> 2576 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Light.epsbin0 -> 1278 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Dark-eps-converted-to.pdfbin0 -> 3648 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Dark.epsbin0 -> 2267 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Light-eps-converted-to.pdfbin0 -> 3657 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Light.epsbin0 -> 2275 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Dark-eps-converted-to.pdfbin0 -> 4555 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Dark.epsbin0 -> 2828 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Light-eps-converted-to.pdfbin0 -> 4542 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Light.epsbin0 -> 2820 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Dark-eps-converted-to.pdfbin0 -> 9094 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Dark.epsbin0 -> 7585 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Light-eps-converted-to.pdfbin0 -> 9096 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Light.epsbin0 -> 7581 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Illustrator-eps-converted-to.pdfbin0 -> 3043 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Illustrator.epsbin0 -> 1716 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Instagram-eps-converted-to.pdfbin0 -> 7097 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Instagram.epsbin0 -> 4824 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_JQuery-eps-converted-to.pdfbin0 -> 8062 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_JQuery.epsbin0 -> 6356 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Dark-eps-converted-to.pdfbin0 -> 3227 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Dark.epsbin0 -> 1939 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Light-eps-converted-to.pdfbin0 -> 3238 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Light.epsbin0 -> 1944 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_JavaScript-eps-converted-to.pdfbin0 -> 2845 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_JavaScript.epsbin0 -> 1541 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Dark-eps-converted-to.pdfbin0 -> 10702 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Dark.epsbin0 -> 9466 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Light-eps-converted-to.pdfbin0 -> 10705 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Light.epsbin0 -> 9467 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Jest-eps-converted-to.pdfbin0 -> 4394 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Jest.epsbin0 -> 3044 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Dark-eps-converted-to.pdfbin0 -> 2682 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Dark.epsbin0 -> 1374 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Light-eps-converted-to.pdf76
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Light.epsbin0 -> 1381 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kafka-eps-converted-to.pdfbin0 -> 3269 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kafka.epsbin0 -> 1951 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Dark-eps-converted-to.pdfbin0 -> 7302 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Dark.epsbin0 -> 5357 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Light-eps-converted-to.pdfbin0 -> 7309 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Light.epsbin0 -> 5356 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Dark-eps-converted-to.pdf155
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Dark.epsbin0 -> 1857 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Light-eps-converted-to.pdf156
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Light.epsbin0 -> 1856 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Dark-eps-converted-to.pdfbin0 -> 2557 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Dark.epsbin0 -> 1254 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Light-eps-converted-to.pdfbin0 -> 2554 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Light.epsbin0 -> 1249 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kubernetes-eps-converted-to.pdfbin0 -> 5422 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Kubernetes.epsbin0 -> 4033 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Dark-eps-converted-to.pdfbin0 -> 8103 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Dark.epsbin0 -> 6676 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Light-eps-converted-to.pdfbin0 -> 8105 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Light.epsbin0 -> 6670 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Dark-eps-converted-to.pdfbin0 -> 4466 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Dark.eps8539
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Light-eps-converted-to.pdfbin0 -> 3824 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Light.epsbin0 -> 2438 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Dark-eps-converted-to.pdfbin0 -> 6272 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Dark.epsbin0 -> 6733 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Light-eps-converted-to.pdfbin0 -> 6273 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Light.epsbin0 -> 6735 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_LinkedIn-eps-converted-to.pdfbin0 -> 2866 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_LinkedIn.epsbin0 -> 1545 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Dark-eps-converted-to.pdfbin0 -> 5071 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Dark.epsbin0 -> 3757 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Light-eps-converted-to.pdfbin0 -> 5074 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Light.epsbin0 -> 3756 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Dark-eps-converted-to.pdfbin0 -> 2555 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Dark.epsbin0 -> 1251 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Light-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Light.epsbin0 -> 1244 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Dark-eps-converted-to.pdfbin0 -> 3355 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Dark.epsbin0 -> 2078 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Light-eps-converted-to.pdfbin0 -> 3356 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Light.epsbin0 -> 2076 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Dark-eps-converted-to.pdfbin0 -> 2597 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Dark.epsbin0 -> 1327 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Light-eps-converted-to.pdfbin0 -> 2594 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Light.epsbin0 -> 1326 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Dark-eps-converted-to.pdfbin0 -> 3030 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Dark.epsbin0 -> 1727 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Light-eps-converted-to.pdfbin0 -> 3029 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Light.epsbin0 -> 1729 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Dark-eps-converted-to.pdfbin0 -> 3943 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Dark.epsbin0 -> 2575 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Light-eps-converted-to.pdfbin0 -> 3944 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Light.epsbin0 -> 2575 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Dark-eps-converted-to.pdfbin0 -> 5929 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Dark.epsbin0 -> 4399 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Light-eps-converted-to.pdfbin0 -> 5930 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Light.epsbin0 -> 4391 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Dark-eps-converted-to.pdfbin0 -> 15567 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Dark.epsbin0 -> 14631 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Light-eps-converted-to.pdfbin0 -> 15567 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Light.epsbin0 -> 14631 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Dark-eps-converted-to.pdfbin0 -> 2929 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Dark.epsbin0 -> 1597 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Light-eps-converted-to.pdfbin0 -> 2929 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Light.epsbin0 -> 1598 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Dark-eps-converted-to.pdfbin0 -> 3187 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Dark.epsbin0 -> 1866 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Light-eps-converted-to.pdfbin0 -> 3185 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Light.epsbin0 -> 1866 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MongoDB-eps-converted-to.pdfbin0 -> 2885 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MongoDB.epsbin0 -> 1562 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Dark-eps-converted-to.pdfbin0 -> 4160 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Dark.epsbin0 -> 2808 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Light-eps-converted-to.pdfbin0 -> 4165 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Light.epsbin0 -> 2812 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Dark-eps-converted-to.pdfbin0 -> 7063 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Dark.epsbin0 -> 4396 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Light-eps-converted-to.pdfbin0 -> 7062 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Light.epsbin0 -> 4396 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Dark-eps-converted-to.pdfbin0 -> 7429 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Dark.epsbin0 -> 6050 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Light-eps-converted-to.pdfbin0 -> 7428 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Light.epsbin0 -> 6050 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Dark-eps-converted-to.pdfbin0 -> 5998 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Dark.epsbin0 -> 4248 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Light-eps-converted-to.pdfbin0 -> 5997 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Light.epsbin0 -> 4247 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Dark-eps-converted-to.pdfbin0 -> 3294 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Dark.epsbin0 -> 1953 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Light-eps-converted-to.pdfbin0 -> 3291 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Light.epsbin0 -> 1954 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nginx-eps-converted-to.pdf72
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nginx.epsbin0 -> 1334 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Dark-eps-converted-to.pdfbin0 -> 2940 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Dark.epsbin0 -> 1639 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Light-eps-converted-to.pdfbin0 -> 2937 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Light.epsbin0 -> 1635 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Dark-eps-converted-to.pdfbin0 -> 5949 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Dark.epsbin0 -> 4813 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Light-eps-converted-to.pdfbin0 -> 5945 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Light.epsbin0 -> 4810 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Dark-eps-converted-to.pdfbin0 -> 3931 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Dark.epsbin0 -> 2556 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Light-eps-converted-to.pdfbin0 -> 3933 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Light.epsbin0 -> 2553 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Dark-eps-converted-to.pdfbin0 -> 3241 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Dark.epsbin0 -> 1925 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Light-eps-converted-to.pdfbin0 -> 3243 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Light.epsbin0 -> 1925 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Dark-eps-converted-to.pdfbin0 -> 2641 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Dark.epsbin0 -> 1344 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Light-eps-converted-to.pdfbin0 -> 2644 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Light.epsbin0 -> 1346 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Dark-eps-converted-to.pdfbin0 -> 2901 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Dark.epsbin0 -> 1594 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Light-eps-converted-to.pdfbin0 -> 2907 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Light.epsbin0 -> 1591 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OCaml-eps-converted-to.pdfbin0 -> 9685 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OCaml.epsbin0 -> 3057 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Dark-eps-converted-to.pdfbin0 -> 25990 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Dark.epsbin0 -> 14873 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Light-eps-converted-to.pdfbin0 -> 25987 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Light.epsbin0 -> 14871 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Dark-eps-converted-to.pdfbin0 -> 3626 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Dark.epsbin0 -> 2104 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Light-eps-converted-to.pdfbin0 -> 3627 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Light.epsbin0 -> 2104 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Dark-eps-converted-to.pdfbin0 -> 3499 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Dark.epsbin0 -> 2199 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Light-eps-converted-to.pdfbin0 -> 3500 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Light.epsbin0 -> 2195 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenShift-eps-converted-to.pdfbin0 -> 4281 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenShift.epsbin0 -> 2913 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Dark-eps-converted-to.pdf77
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Dark.epsbin0 -> 1408 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Light-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Light.epsbin0 -> 1407 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Dark-eps-converted-to.pdfbin0 -> 3239 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Dark.epsbin0 -> 1916 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Light-eps-converted-to.pdfbin0 -> 3238 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Light.epsbin0 -> 1917 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Perl-eps-converted-to.pdfbin0 -> 7822 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Perl.epsbin0 -> 6362 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Photoshop-eps-converted-to.pdfbin0 -> 3627 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Photoshop.epsbin0 -> 2277 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Dark-eps-converted-to.pdfbin0 -> 5691 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Dark.epsbin0 -> 4248 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Light-eps-converted-to.pdfbin0 -> 5691 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Light.epsbin0 -> 4248 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Dark-eps-converted-to.pdfbin0 -> 5974 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Dark.epsbin0 -> 4296 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Light-eps-converted-to.pdfbin0 -> 5975 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Light.epsbin0 -> 4296 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Dark-eps-converted-to.pdfbin0 -> 3945 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Dark.epsbin0 -> 2592 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Light-eps-converted-to.pdfbin0 -> 3941 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Light.epsbin0 -> 2590 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Dark-eps-converted-to.pdfbin0 -> 115454 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Dark.epsbin0 -> 112962 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Light-eps-converted-to.pdfbin0 -> 115454 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Light.epsbin0 -> 112965 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Dark-eps-converted-to.pdfbin0 -> 2585 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Dark.epsbin0 -> 1267 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Light-eps-converted-to.pdf76
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Light.epsbin0 -> 1255 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Dark-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Dark.epsbin0 -> 1191 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Light-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Light.epsbin0 -> 1192 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Dark-eps-converted-to.pdfbin0 -> 3877 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Dark.epsbin0 -> 2583 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Light-eps-converted-to.pdfbin0 -> 4215 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Light.epsbin0 -> 2960 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Postman-eps-converted-to.pdfbin0 -> 5334 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Postman.epsbin0 -> 3998 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Dark-eps-converted-to.pdfbin0 -> 4935 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Dark.epsbin0 -> 3255 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Light-eps-converted-to.pdfbin0 -> 4937 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Light.epsbin0 -> 3254 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Premiere-eps-converted-to.pdfbin0 -> 3267 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Premiere.epsbin0 -> 1937 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Prisma-eps-converted-to.pdfbin0 -> 2675 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Prisma.epsbin0 -> 1369 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Dark-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Dark.epsbin0 -> 1262 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Light-eps-converted-to.pdf73
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Light.epsbin0 -> 1255 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Prometheus-eps-converted-to.pdfbin0 -> 2897 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Prometheus.epsbin0 -> 1582 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Dark-eps-converted-to.pdfbin0 -> 6871 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Dark.epsbin0 -> 5380 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Light-eps-converted-to.pdfbin0 -> 6883 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Light.epsbin0 -> 5388 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Dark-eps-converted-to.pdfbin0 -> 5630 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Dark.epsbin0 -> 4047 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Light-eps-converted-to.pdfbin0 -> 5628 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Light.epsbin0 -> 4046 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Dark-eps-converted-to.pdfbin0 -> 2678 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Dark.epsbin0 -> 1384 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Light-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Light.epsbin0 -> 1383 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Dark-eps-converted-to.pdfbin0 -> 3938 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Dark.epsbin0 -> 2347 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Light-eps-converted-to.pdfbin0 -> 3936 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Light.epsbin0 -> 2344 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Dark-eps-converted-to.pdfbin0 -> 3060 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Dark.epsbin0 -> 1748 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Light-eps-converted-to.pdfbin0 -> 3059 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Light.epsbin0 -> 1747 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_R-Dark-eps-converted-to.pdfbin0 -> 3932 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_R-Dark.epsbin0 -> 2358 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_R-Light-eps-converted-to.pdfbin0 -> 3933 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_R-Light.epsbin0 -> 2359 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Dark-eps-converted-to.pdfbin0 -> 2917 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Dark.epsbin0 -> 1615 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Light-eps-converted-to.pdfbin0 -> 2931 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Light.epsbin0 -> 1625 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Dark-eps-converted-to.pdfbin0 -> 2795 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Dark.epsbin0 -> 1494 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Light-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Light.epsbin0 -> 1494 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rails-eps-converted-to.pdfbin0 -> 3347 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rails.epsbin0 -> 2014 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Dark-eps-converted-to.pdfbin0 -> 5476 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Dark.epsbin0 -> 4091 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Light-eps-converted-to.pdfbin0 -> 5478 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Light.epsbin0 -> 4090 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_React-Dark-eps-converted-to.pdfbin0 -> 3081 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_React-Dark.epsbin0 -> 1789 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_React-Light-eps-converted-to.pdfbin0 -> 3082 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_React-Light.epsbin0 -> 1787 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Dark-eps-converted-to.pdfbin0 -> 10145 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Dark.epsbin0 -> 7340 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Light-eps-converted-to.pdfbin0 -> 10143 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Light.epsbin0 -> 7337 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Dark-eps-converted-to.pdfbin0 -> 2893 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Dark.epsbin0 -> 1584 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Light-eps-converted-to.pdfbin0 -> 2893 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Light.epsbin0 -> 1584 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Dark-eps-converted-to.pdfbin0 -> 3720 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Dark.epsbin0 -> 2401 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Light-eps-converted-to.pdfbin0 -> 3720 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Light.epsbin0 -> 2398 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Redux-eps-converted-to.pdfbin0 -> 4032 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Redux.eps8471
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Dark-eps-converted-to.pdfbin0 -> 3952 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Dark.epsbin0 -> 2614 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Light-eps-converted-to.pdfbin0 -> 3950 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Light.epsbin0 -> 2612 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Dark-eps-converted-to.pdfbin0 -> 3162 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Dark.epsbin0 -> 1569 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Light-eps-converted-to.pdf103
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Light.epsbin0 -> 1573 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Dark-eps-converted-to.pdfbin0 -> 2621 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Dark.epsbin0 -> 1323 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Light-eps-converted-to.pdf73
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Light.epsbin0 -> 1318 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Dark-eps-converted-to.pdfbin0 -> 4935 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Dark.epsbin0 -> 3339 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Light-eps-converted-to.pdfbin0 -> 4935 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Light.epsbin0 -> 3338 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RobloxStudio-eps-converted-to.pdfbin0 -> 2527 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RobloxStudio.epsbin0 -> 1220 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rocket-eps-converted-to.pdfbin0 -> 6081 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rocket.epsbin0 -> 4391 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Dark-eps-converted-to.pdfbin0 -> 7977 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Dark.epsbin0 -> 5649 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Light-eps-converted-to.pdfbin0 -> 7979 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Light.epsbin0 -> 5648 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ruby-eps-converted-to.pdfbin0 -> 16451 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ruby.epsbin0 -> 14774 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rust-eps-converted-to.pdfbin0 -> 5956 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Rust.epsbin0 -> 4509 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SQLite-eps-converted-to.pdfbin0 -> 15210 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SQLite.epsbin0 -> 5041 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Dark-eps-converted-to.pdfbin0 -> 3929 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Dark.epsbin0 -> 2354 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Light-eps-converted-to.pdfbin0 -> 3927 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Light.epsbin0 -> 2356 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sass-eps-converted-to.pdfbin0 -> 4841 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sass.epsbin0 -> 3494 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Dark-eps-converted-to.pdfbin0 -> 3178 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Dark.epsbin0 -> 1875 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Light-eps-converted-to.pdfbin0 -> 3181 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Light.epsbin0 -> 1874 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SciKitLearn-Light-eps-converted-to.pdfbin0 -> 5983 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SciKitLearn-Light.epsbin0 -> 4618 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ScikitLearn-Dark-eps-converted-to.pdfbin0 -> 5978 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ScikitLearn-Dark.epsbin0 -> 4640 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Selenium-eps-converted-to.pdfbin0 -> 4429 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Selenium.epsbin0 -> 3043 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sentry-eps-converted-to.pdfbin0 -> 3399 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sentry.epsbin0 -> 2048 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Dark-eps-converted-to.pdfbin0 -> 3608 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Dark.epsbin0 -> 2290 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Light-eps-converted-to.pdfbin0 -> 3609 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Light.epsbin0 -> 2291 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Dark-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Dark.epsbin0 -> 1332 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Light-eps-converted-to.pdf76
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Light.epsbin0 -> 1334 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Dark-eps-converted-to.pdfbin0 -> 9174 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Dark.epsbin0 -> 6368 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Light-eps-converted-to.pdfbin0 -> 9175 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Light.epsbin0 -> 6368 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Solidity-eps-converted-to.pdfbin0 -> 3098 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Solidity.epsbin0 -> 1375 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Dark-eps-converted-to.pdfbin0 -> 2968 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Dark.epsbin0 -> 1654 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Light-eps-converted-to.pdfbin0 -> 2971 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Light.epsbin0 -> 1653 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Dark-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Dark.epsbin0 -> 1349 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Light-eps-converted-to.pdfbin0 -> 2662 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Light.epsbin0 -> 1348 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_StyledComponents-eps-converted-to.pdfbin0 -> 5455 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_StyledComponents.epsbin0 -> 3815 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Dark-eps-converted-to.pdfbin0 -> 3643 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Dark.epsbin0 -> 2114 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Light-eps-converted-to.pdfbin0 -> 3644 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Light.epsbin0 -> 2114 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Dark-eps-converted-to.pdfbin0 -> 5322 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Dark.epsbin0 -> 3040 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Light-eps-converted-to.pdfbin0 -> 5324 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Light.epsbin0 -> 3041 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Svelte-eps-converted-to.pdfbin0 -> 3552 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Svelte.epsbin0 -> 2219 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Swift-eps-converted-to.pdfbin0 -> 2842 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Swift.epsbin0 -> 1525 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Dark-eps-converted-to.pdfbin0 -> 3513 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Dark.epsbin0 -> 2161 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Light-eps-converted-to.pdfbin0 -> 3526 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Light.epsbin0 -> 2171 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Dark-eps-converted-to.pdfbin0 -> 3262 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Dark.epsbin0 -> 1723 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Light-eps-converted-to.pdfbin0 -> 3263 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Light.epsbin0 -> 1722 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Dark-eps-converted-to.pdfbin0 -> 3660 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Dark.epsbin0 -> 2335 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Light-eps-converted-to.pdfbin0 -> 3663 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Light.epsbin0 -> 2338 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Dark-eps-converted-to.pdfbin0 -> 2547 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Dark.epsbin0 -> 1242 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Light-eps-converted-to.pdfbin0 -> 2547 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Light.epsbin0 -> 1241 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Dark-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Dark.epsbin0 -> 1271 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Light-eps-converted-to.pdfbin0 -> 2579 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Light.epsbin0 -> 1272 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Dark-eps-converted-to.pdfbin0 -> 2625 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Dark.epsbin0 -> 1347 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Light-eps-converted-to.pdfbin0 -> 2613 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Light.epsbin0 -> 1334 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Twitter-eps-converted-to.pdfbin0 -> 2853 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Twitter.epsbin0 -> 1539 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TypeScript-eps-converted-to.pdfbin0 -> 3155 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_TypeScript.epsbin0 -> 1828 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Dark-eps-converted-to.pdfbin0 -> 3218 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Dark.epsbin0 -> 1913 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Light-eps-converted-to.pdfbin0 -> 3214 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Light.epsbin0 -> 1900 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Dark-eps-converted-to.pdfbin0 -> 3142 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Dark.epsbin0 -> 1813 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Light-eps-converted-to.pdfbin0 -> 3142 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Light.epsbin0 -> 1817 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_UnrealEngine-eps-converted-to.pdfbin0 -> 3486 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_UnrealEngine.epsbin0 -> 2148 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_V-Dark-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_V-Dark.epsbin0 -> 1849 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_V-Light-eps-converted-to.pdfbin0 -> 2737 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_V-Light.epsbin0 -> 1850 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Dark-eps-converted-to.pdfbin0 -> 2757 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Dark.epsbin0 -> 1444 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Light-eps-converted-to.pdfbin0 -> 2773 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Light.epsbin0 -> 1485 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Dark-eps-converted-to.pdfbin0 -> 2849 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Dark.epsbin0 -> 1554 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Light-eps-converted-to.pdfbin0 -> 2851 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Light.epsbin0 -> 1556 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Dark-eps-converted-to.pdfbin0 -> 16653 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Dark.epsbin0 -> 2489 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Light-eps-converted-to.pdfbin0 -> 16728 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Light.eps142
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vala-eps-converted-to.pdfbin0 -> 5183 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vala.epsbin0 -> 3180 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Dark-eps-converted-to.pdf72
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Dark.epsbin0 -> 1154 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Light-eps-converted-to.pdf72
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Light.epsbin0 -> 1155 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Dark-eps-converted-to.pdfbin0 -> 17979 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Dark.epsbin0 -> 6904 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Light-eps-converted-to.pdfbin0 -> 17979 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Light.epsbin0 -> 6904 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Dark-eps-converted-to.pdfbin0 -> 4196 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Dark.epsbin0 -> 2586 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Light-eps-converted-to.pdfbin0 -> 4193 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Light.epsbin0 -> 2586 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Dark-eps-converted-to.pdfbin0 -> 3741 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Dark.epsbin0 -> 2101 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Light-eps-converted-to.pdfbin0 -> 3745 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Light.epsbin0 -> 2103 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Dark-eps-converted-to.pdf74
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Dark.epsbin0 -> 1240 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Light-eps-converted-to.pdfbin0 -> 2546 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Light.epsbin0 -> 1247 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Dark-eps-converted-to.pdfbin0 -> 2664 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Dark.epsbin0 -> 1350 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Light-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Light.epsbin0 -> 1353 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WebAssembly-eps-converted-to.pdfbin0 -> 2725 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WebAssembly.epsbin0 -> 1427 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Dark-eps-converted-to.pdfbin0 -> 4228 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Dark.epsbin0 -> 2664 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Light-eps-converted-to.pdfbin0 -> 4230 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Light.epsbin0 -> 2664 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Webflow-eps-converted-to.pdfbin0 -> 2664 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Webflow.epsbin0 -> 1356 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Dark-eps-converted-to.pdfbin0 -> 2753 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Dark.epsbin0 -> 1448 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Light-eps-converted-to.pdf75
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Light.epsbin0 -> 1404 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Dark-eps-converted-to.pdf157
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Dark.epsbin0 -> 3352 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Light-eps-converted-to.pdfbin0 -> 3827 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Light.epsbin0 -> 3351 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Dark-eps-converted-to.pdfbin0 -> 2559 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Dark.epsbin0 -> 1253 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Light-eps-converted-to.pdfbin0 -> 2560 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Light.epsbin0 -> 1249 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Wordpress-eps-converted-to.pdfbin0 -> 3163 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Wordpress.epsbin0 -> 1835 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Dark-eps-converted-to.pdfbin0 -> 14551 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Dark.epsbin0 -> 9894 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Light-eps-converted-to.pdfbin0 -> 14552 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Light.epsbin0 -> 9894 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_XD-eps-converted-to.pdfbin0 -> 3582 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_XD.epsbin0 -> 2250 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Dark-eps-converted-to.pdfbin0 -> 5113 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Dark.epsbin0 -> 3684 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Light-eps-converted-to.pdfbin0 -> 5113 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Light.epsbin0 -> 3681 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Dark-eps-converted-to.pdfbin0 -> 2648 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Dark.epsbin0 -> 1364 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Light-eps-converted-to.pdf78
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Light.epsbin0 -> 1366 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Dark-eps-converted-to.pdfbin0 -> 2736 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Dark.epsbin0 -> 1437 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Light-eps-converted-to.pdfbin0 -> 2737 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Light.epsbin0 -> 1437 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_p5js-eps-converted-to.pdfbin0 -> 3844 bytes
-rw-r--r--macros/latex/contrib/skillicons/skill-icons/skillicons_p5js.epsbin0 -> 2501 bytes
-rw-r--r--macros/latex/contrib/skillicons/skillicons.pdfbin0 -> 1447019 bytes
-rw-r--r--macros/latex/contrib/skillicons/skillicons.sty28
-rw-r--r--macros/latex/contrib/skillicons/skillicons.tex584
-rw-r--r--macros/latex/contrib/spbmark/spbmark.pdfbin95175 -> 91750 bytes
-rw-r--r--macros/latex/contrib/spbmark/spbmark.sty113
-rw-r--r--macros/latex/contrib/spbmark/spbmark.tex44
-rw-r--r--macros/latex/contrib/synthslant/LICENSE415
-rw-r--r--macros/latex/contrib/synthslant/Makefile302
-rw-r--r--macros/latex/contrib/synthslant/README.md64
-rw-r--r--macros/latex/contrib/synthslant/RELEASE-HOWTO.md51
-rw-r--r--macros/latex/contrib/synthslant/docs/index.md4
-rw-r--r--macros/latex/contrib/synthslant/docs/synthslant-gauge.pdfbin0 -> 181403 bytes
-rw-r--r--macros/latex/contrib/synthslant/docs/synthslant.pdfbin0 -> 796407 bytes
-rw-r--r--macros/latex/contrib/synthslant/synthslant.dtx5264
-rw-r--r--macros/latex/contrib/synthslant/synthslant.ins67
-rw-r--r--macros/latex/contrib/tblr-extras/README.md12
-rw-r--r--macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.pdfbin26714 -> 29492 bytes
-rw-r--r--macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.tex19
-rw-r--r--macros/latex/contrib/tblr-extras/tblr-extras.sty87
-rw-r--r--macros/latex/contrib/thuthesis/CHANGELOG.md14
-rw-r--r--macros/latex/contrib/thuthesis/thuthesis-author-year.bst24
-rw-r--r--macros/latex/contrib/thuthesis/thuthesis-bachelor.bst24
-rw-r--r--macros/latex/contrib/thuthesis/thuthesis-example.pdfbin408220 -> 407055 bytes
-rw-r--r--macros/latex/contrib/thuthesis/thuthesis-numeric.bst24
-rw-r--r--macros/latex/contrib/thuthesis/thuthesis.dtx25
-rw-r--r--macros/latex/contrib/thuthesis/thuthesis.pdfbin1188909 -> 1190791 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/README.md136
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-circle.tex8
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-ellipse.tex133
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-line.tex70
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-point.tex1
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-regular.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-triangle.tex225
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-examples.tex308
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-main.tex30
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-organization.tex3
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-presentation.tex3
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-structure.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transfers.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transferts.tex150
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/doc/tkz-elements.pdfbin696762 -> 704147 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.pdfbin20611 -> 20614 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.pdfbin16392 -> 16396 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.pdfbin17158 -> 17162 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.pdfbin11343 -> 11341 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz-elements.sty4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_circle.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_class.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_ellipse.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_circles.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_intersections.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_lines.lua15
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_matrices.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_points.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_regular.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_line.lua13
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_main.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_misc.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_parallelogram.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_point.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_quadrilateral.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_rectangle.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_regular.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_square.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_triangle.lua48
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_vector.lua4
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/README.md16
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-FAQ.tex4
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-angles.tex3
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circleby.tex4
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circles.tex35
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-clipping.tex19
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-compass.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-documentation.tex3
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-drawing.tex26
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-elements.tex4
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-examples.tex25
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-filling.tex3
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-intersection.tex70
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-labelling.tex2
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lines.tex36
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lua.tex20
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex24
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-news.tex427
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointby.tex15
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-points.tex12
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointsSpc.tex122
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-polygons.tex4
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-presentation.tex72
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-show.tex10
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-styles.tex16
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-tools.tex17
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdfbin1116500 -> 1103289 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex268
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-arcs.tex262
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-ellipses.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex11
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles-by.tex4
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-by.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-spc.tex4
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-with.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg24
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty47
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-angles.tex23
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-base.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-intersections.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-math.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex11
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex6
-rw-r--r--macros/latex/contrib/tuda-ci/README.md4
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdfbin551881 -> 551934 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdfbin601729 -> 601729 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdfbin561720 -> 561720 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdfbin570474 -> 570473 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdfbin559903 -> 559914 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdfbin567048 -> 567042 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdfbin629331 -> 616232 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdfbin536007 -> 536048 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdfbin662459 -> 662470 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdfbin527518 -> 527496 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdfbin563701 -> 563701 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdfbin625767 -> 615311 bytes
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudabeamer.cls6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudacolors.def6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudacolors.sty6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudaexercise.cls6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudafonts.sty6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudaletter.cls6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudaposter.cls6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudapub.cls6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudarules.sty6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudasciposter.cls6
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo2
-rw-r--r--macros/latex/contrib/tuda-ci/tex/tudathesis.cfg8
-rw-r--r--macros/latex/contrib/typog/Makefile302
-rw-r--r--macros/latex/contrib/typog/README.md79
-rw-r--r--macros/latex/contrib/typog/RELEASE-HOWTO.md51
-rw-r--r--macros/latex/contrib/typog/docs/index.md5
-rw-r--r--macros/latex/contrib/typog/docs/typog-example.pdfbin0 -> 392419 bytes
-rw-r--r--macros/latex/contrib/typog/docs/typog-grep.1428
-rw-r--r--macros/latex/contrib/typog/docs/typog-grep.1.pdfbin0 -> 511632 bytes
-rw-r--r--macros/latex/contrib/typog/docs/typog.pdfbin0 -> 902362 bytes
-rw-r--r--macros/latex/contrib/typog/typog.dtx9974
-rw-r--r--macros/latex/contrib/typog/typog.ins74
-rw-r--r--macros/latex/contrib/univie-ling/README6
-rw-r--r--macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx2
-rw-r--r--macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx2
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdfbin130780 -> 132626 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdfbin126894 -> 127848 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdfbin200672 -> 201366 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex1
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdfbin200676 -> 200967 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex1
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdfbin158161 -> 172478 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdfbin154403 -> 167579 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdfbin227166 -> 227174 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdfbin224973 -> 224980 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdfbin171777 -> 190196 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdfbin168772 -> 186339 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdfbin372040 -> 250470 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdfbin371831 -> 250366 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdfbin457978 -> 458151 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex10
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdfbin448122 -> 448221 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex7
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdfbin454263 -> 455332 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex16
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdfbin450725 -> 454323 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex53
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdfbin458988 -> 459107 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex6
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdfbin345784 -> 345852 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex14
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling.pdfbin365425 -> 365602 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling.tex2
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls20
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls47
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls73
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls70
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls21
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg12
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls43
-rw-r--r--macros/latex/contrib/ximera/LICENSE415
-rw-r--r--macros/latex/contrib/ximera/Makefile50
-rw-r--r--macros/latex/contrib/ximera/README18
-rw-r--r--macros/latex/contrib/ximera/README.md62
-rw-r--r--macros/latex/contrib/ximera/installingLocally.md91
-rw-r--r--macros/latex/contrib/ximera/pgfsys-ximera.def62
-rw-r--r--macros/latex/contrib/ximera/src/abstract.dtx14
-rw-r--r--macros/latex/contrib/ximera/src/activity.dtx158
-rw-r--r--macros/latex/contrib/ximera/src/answer.dtx111
-rw-r--r--macros/latex/contrib/ximera/src/banner.dtx21
-rw-r--r--macros/latex/contrib/ximera/src/choice.dtx226
-rw-r--r--macros/latex/contrib/ximera/src/clearEnv.dtx18
-rw-r--r--macros/latex/contrib/ximera/src/dialogue.dtx28
-rw-r--r--macros/latex/contrib/ximera/src/ending.dtx20
-rw-r--r--macros/latex/contrib/ximera/src/enumerate.dtx10
-rw-r--r--macros/latex/contrib/ximera/src/feedback.dtx72
-rw-r--r--macros/latex/contrib/ximera/src/foldable.dtx76
-rw-r--r--macros/latex/contrib/ximera/src/footnotes.dtx63
-rw-r--r--macros/latex/contrib/ximera/src/freeresponse.dtx60
-rw-r--r--macros/latex/contrib/ximera/src/graded.dtx20
-rw-r--r--macros/latex/contrib/ximera/src/hideEnv.dtx36
-rw-r--r--macros/latex/contrib/ximera/src/hints.dtx53
-rw-r--r--macros/latex/contrib/ximera/src/html.dtx20
-rw-r--r--macros/latex/contrib/ximera/src/hyperref.dtx12
-rw-r--r--macros/latex/contrib/ximera/src/image.dtx60
-rw-r--r--macros/latex/contrib/ximera/src/instructornotes.dtx101
-rw-r--r--macros/latex/contrib/ximera/src/interactives/desmos.dtx14
-rw-r--r--macros/latex/contrib/ximera/src/interactives/geogebra.dtx27
-rw-r--r--macros/latex/contrib/ximera/src/interactives/google.dtx26
-rw-r--r--macros/latex/contrib/ximera/src/interactives/graph.dtx14
-rw-r--r--macros/latex/contrib/ximera/src/interactives/include.dtx22
-rw-r--r--macros/latex/contrib/ximera/src/interactives/javascript.dtx31
-rw-r--r--macros/latex/contrib/ximera/src/interactives/sagemath.dtx43
-rw-r--r--macros/latex/contrib/ximera/src/interactives/video.dtx21
-rw-r--r--macros/latex/contrib/ximera/src/jax.dtx115
-rw-r--r--macros/latex/contrib/ximera/src/labels.dtx15
-rw-r--r--macros/latex/contrib/ximera/src/leash.dtx18
-rw-r--r--macros/latex/contrib/ximera/src/link.dtx31
-rw-r--r--macros/latex/contrib/ximera/src/logo.dtx30
-rw-r--r--macros/latex/contrib/ximera/src/macros.dtx14
-rw-r--r--macros/latex/contrib/ximera/src/makeCounter.dtx37
-rw-r--r--macros/latex/contrib/ximera/src/metadata.dtx32
-rw-r--r--macros/latex/contrib/ximera/src/only.dtx38
-rw-r--r--macros/latex/contrib/ximera/src/options.dtx123
-rw-r--r--macros/latex/contrib/ximera/src/optionsxourse.dtx27
-rw-r--r--macros/latex/contrib/ximera/src/outcomes.dtx34
-rw-r--r--macros/latex/contrib/ximera/src/packages.dtx54
-rw-r--r--macros/latex/contrib/ximera/src/pagesetup.dtx55
-rw-r--r--macros/latex/contrib/ximera/src/problem.dtx197
-rw-r--r--macros/latex/contrib/ximera/src/proof.dtx10
-rw-r--r--macros/latex/contrib/ximera/src/sectioning.dtx49
-rw-r--r--macros/latex/contrib/ximera/src/solution.dtx30
-rw-r--r--macros/latex/contrib/ximera/src/suppress.dtx33
-rw-r--r--macros/latex/contrib/ximera/src/textcolor.dtx20
-rw-r--r--macros/latex/contrib/ximera/src/theorems.dtx174
-rw-r--r--macros/latex/contrib/ximera/src/tikzexport.dtx42
-rw-r--r--macros/latex/contrib/ximera/src/title.dtx122
-rw-r--r--macros/latex/contrib/ximera/src/ungraded.dtx22
-rw-r--r--macros/latex/contrib/ximera/src/utilitymacros.dtx45
-rw-r--r--macros/latex/contrib/ximera/src/verbatim.dtx36
-rw-r--r--macros/latex/contrib/ximera/src/xkcd.dtx13
-rw-r--r--macros/latex/contrib/ximera/ximera.dtx363
-rw-r--r--macros/latex/contrib/ximera/ximera.ins211
-rw-r--r--macros/latex/contrib/ximera/ximera.pdfbin0 -> 320915 bytes
-rw-r--r--macros/latex/contrib/zref-clever/CHANGELOG.md8
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever-code.pdfbin1217642 -> 880835 bytes
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever-code.tex5
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever-doc.pdfbin344167 -> 227507 bytes
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever-doc.tex38
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever.dtx1265
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever.ins1
-rw-r--r--macros/latex/required/babel/base/README.md20
-rw-r--r--macros/latex/required/babel/base/babel-code.pdfbin647068 -> 647398 bytes
-rw-r--r--macros/latex/required/babel/base/babel.dtx74
-rw-r--r--macros/latex/required/babel/base/babel.ins2
-rw-r--r--macros/latex/required/babel/base/babel.pdfbin423110 -> 423656 bytes
-rw-r--r--macros/latex/required/babel/base/bbcompat.dtx2
-rw-r--r--macros/latex/required/l3backend/CHANGELOG.md (renamed from macros/latex/contrib/l3backend/CHANGELOG.md)24
-rw-r--r--macros/latex/required/l3backend/README.md (renamed from macros/latex/contrib/l3backend/README.md)2
-rw-r--r--macros/latex/required/l3backend/l3backend-basics.dtx (renamed from macros/latex/contrib/l3backend/l3backend-basics.dtx)14
-rw-r--r--macros/latex/required/l3backend/l3backend-box.dtx (renamed from macros/latex/contrib/l3backend/l3backend-box.dtx)2
-rw-r--r--macros/latex/required/l3backend/l3backend-code.pdf (renamed from macros/latex/contrib/l3backend/l3backend-code.pdf)bin908163 -> 907117 bytes
-rw-r--r--macros/latex/required/l3backend/l3backend-code.tex (renamed from macros/latex/contrib/l3backend/l3backend-code.tex)0
-rw-r--r--macros/latex/required/l3backend/l3backend-color.dtx (renamed from macros/latex/contrib/l3backend/l3backend-color.dtx)28
-rw-r--r--macros/latex/required/l3backend/l3backend-draw.dtx (renamed from macros/latex/contrib/l3backend/l3backend-draw.dtx)4
-rw-r--r--macros/latex/required/l3backend/l3backend-graphics.dtx (renamed from macros/latex/contrib/l3backend/l3backend-graphics.dtx)2
-rw-r--r--macros/latex/required/l3backend/l3backend-header.dtx (renamed from macros/latex/contrib/l3backend/l3backend-header.dtx)4
-rw-r--r--macros/latex/required/l3backend/l3backend-opacity.dtx (renamed from macros/latex/contrib/l3backend/l3backend-opacity.dtx)2
-rw-r--r--macros/latex/required/l3backend/l3backend-pdf.dtx (renamed from macros/latex/contrib/l3backend/l3backend-pdf.dtx)110
-rw-r--r--macros/latex/required/l3backend/l3backend.ins (renamed from macros/latex/contrib/l3backend/l3backend.ins)0
-rw-r--r--macros/latex/required/l3kernel/CHANGELOG.md (renamed from macros/latex/contrib/l3kernel/CHANGELOG.md)40
-rw-r--r--macros/latex/required/l3kernel/README.md (renamed from macros/latex/contrib/l3kernel/README.md)2
-rw-r--r--macros/latex/required/l3kernel/expl3.dtx (renamed from macros/latex/contrib/l3kernel/expl3.dtx)6
-rw-r--r--macros/latex/required/l3kernel/expl3.pdf (renamed from macros/latex/contrib/l3kernel/expl3.pdf)bin610363 -> 610545 bytes
-rw-r--r--macros/latex/required/l3kernel/interface3.pdf (renamed from macros/latex/contrib/l3kernel/interface3.pdf)bin1795605 -> 1803277 bytes
-rw-r--r--macros/latex/required/l3kernel/interface3.tex (renamed from macros/latex/contrib/l3kernel/interface3.tex)2
-rw-r--r--macros/latex/required/l3kernel/l3.ins (renamed from macros/latex/contrib/l3kernel/l3.ins)3
-rw-r--r--macros/latex/required/l3kernel/l3basics.dtx (renamed from macros/latex/contrib/l3kernel/l3basics.dtx)16
-rw-r--r--macros/latex/required/l3kernel/l3bitset.dtx (renamed from macros/latex/contrib/l3kernel/l3bitset.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3bootstrap.dtx (renamed from macros/latex/contrib/l3kernel/l3bootstrap.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3box.dtx (renamed from macros/latex/contrib/l3kernel/l3box.dtx)10
-rw-r--r--macros/latex/required/l3kernel/l3cctab.dtx (renamed from macros/latex/contrib/l3kernel/l3cctab.dtx)33
-rw-r--r--macros/latex/required/l3kernel/l3clist.dtx (renamed from macros/latex/contrib/l3kernel/l3clist.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3coffins.dtx (renamed from macros/latex/contrib/l3kernel/l3coffins.dtx)10
-rw-r--r--macros/latex/required/l3kernel/l3color.dtx (renamed from macros/latex/contrib/l3kernel/l3color.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3debug.dtx (renamed from macros/latex/contrib/l3kernel/l3debug.dtx)17
-rw-r--r--macros/latex/required/l3kernel/l3deprecation.dtx (renamed from macros/latex/contrib/l3kernel/l3deprecation.dtx)70
-rw-r--r--macros/latex/required/l3kernel/l3doc.dtx (renamed from macros/latex/contrib/l3kernel/l3doc.dtx)12
-rw-r--r--macros/latex/required/l3kernel/l3doc.pdf (renamed from macros/latex/contrib/l3kernel/l3doc.pdf)bin565279 -> 565744 bytes
-rw-r--r--macros/latex/required/l3kernel/l3docstrip.dtx (renamed from macros/latex/contrib/l3kernel/l3docstrip.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3docstrip.pdf (renamed from macros/latex/contrib/l3kernel/l3docstrip.pdf)bin151266 -> 151414 bytes
-rw-r--r--macros/latex/required/l3kernel/l3expan.dtx (renamed from macros/latex/contrib/l3kernel/l3expan.dtx)4
-rw-r--r--macros/latex/required/l3kernel/l3file.dtx (renamed from macros/latex/contrib/l3kernel/l3file.dtx)25
-rw-r--r--macros/latex/required/l3kernel/l3flag.dtx (renamed from macros/latex/contrib/l3kernel/l3flag.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-assign.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-assign.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-aux.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-aux.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-basics.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-basics.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-convert.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-convert.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-expo.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-expo.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-extended.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-extended.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-functions.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-functions.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-logic.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-logic.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-parse.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-parse.dtx)4
-rw-r--r--macros/latex/required/l3kernel/l3fp-random.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-random.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-round.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-round.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-symbolic.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-symbolic.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-traps.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-traps.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-trig.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-trig.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp-types.dtx (renamed from macros/latex/contrib/l3kernel/l3fp-types.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fp.dtx (renamed from macros/latex/contrib/l3kernel/l3fp.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3fparray.dtx (renamed from macros/latex/contrib/l3kernel/l3fparray.dtx)57
-rw-r--r--macros/latex/required/l3kernel/l3int.dtx (renamed from macros/latex/contrib/l3kernel/l3int.dtx)4
-rw-r--r--macros/latex/required/l3kernel/l3intarray.dtx (renamed from macros/latex/contrib/l3kernel/l3intarray.dtx)77
-rw-r--r--macros/latex/required/l3kernel/l3kernel-functions.dtx (renamed from macros/latex/contrib/l3kernel/l3kernel-functions.dtx)29
-rw-r--r--macros/latex/required/l3kernel/l3keys.dtx (renamed from macros/latex/contrib/l3kernel/l3keys.dtx)309
-rw-r--r--macros/latex/required/l3kernel/l3legacy.dtx (renamed from macros/latex/contrib/l3kernel/l3legacy.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3luatex.dtx (renamed from macros/latex/contrib/l3kernel/l3luatex.dtx)6
-rw-r--r--macros/latex/required/l3kernel/l3msg.dtx (renamed from macros/latex/contrib/l3kernel/l3msg.dtx)22
-rw-r--r--macros/latex/required/l3kernel/l3names.dtx (renamed from macros/latex/contrib/l3kernel/l3names.dtx)4
-rw-r--r--macros/latex/required/l3kernel/l3news.pdf (renamed from macros/latex/contrib/l3kernel/l3news.pdf)bin396222 -> 396223 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news.tex (renamed from macros/latex/contrib/l3kernel/l3news.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news01.pdf (renamed from macros/latex/contrib/l3kernel/l3news01.pdf)bin122959 -> 122959 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news01.tex (renamed from macros/latex/contrib/l3kernel/l3news01.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news02.pdf (renamed from macros/latex/contrib/l3kernel/l3news02.pdf)bin150919 -> 150919 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news02.tex (renamed from macros/latex/contrib/l3kernel/l3news02.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news03.pdf (renamed from macros/latex/contrib/l3kernel/l3news03.pdf)bin148747 -> 148747 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news03.tex (renamed from macros/latex/contrib/l3kernel/l3news03.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news04.pdf (renamed from macros/latex/contrib/l3kernel/l3news04.pdf)bin114754 -> 114754 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news04.tex (renamed from macros/latex/contrib/l3kernel/l3news04.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news05.pdf (renamed from macros/latex/contrib/l3kernel/l3news05.pdf)bin112524 -> 112524 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news05.tex (renamed from macros/latex/contrib/l3kernel/l3news05.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news06.pdf (renamed from macros/latex/contrib/l3kernel/l3news06.pdf)bin151591 -> 151591 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news06.tex (renamed from macros/latex/contrib/l3kernel/l3news06.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news07.pdf (renamed from macros/latex/contrib/l3kernel/l3news07.pdf)bin128344 -> 128344 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news07.tex (renamed from macros/latex/contrib/l3kernel/l3news07.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news08.pdf (renamed from macros/latex/contrib/l3kernel/l3news08.pdf)bin163484 -> 163484 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news08.tex (renamed from macros/latex/contrib/l3kernel/l3news08.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news09.pdf (renamed from macros/latex/contrib/l3kernel/l3news09.pdf)bin250159 -> 250161 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news09.tex (renamed from macros/latex/contrib/l3kernel/l3news09.tex)2
-rw-r--r--macros/latex/required/l3kernel/l3news10.pdf (renamed from macros/latex/contrib/l3kernel/l3news10.pdf)bin150302 -> 150302 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news10.tex (renamed from macros/latex/contrib/l3kernel/l3news10.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news11.pdf (renamed from macros/latex/contrib/l3kernel/l3news11.pdf)bin170102 -> 170102 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news11.tex (renamed from macros/latex/contrib/l3kernel/l3news11.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3news12.pdf (renamed from macros/latex/contrib/l3kernel/l3news12.pdf)bin205020 -> 205020 bytes
-rw-r--r--macros/latex/required/l3kernel/l3news12.tex (renamed from macros/latex/contrib/l3kernel/l3news12.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3pdf.dtx (renamed from macros/latex/contrib/l3kernel/l3pdf.dtx)375
-rw-r--r--macros/latex/required/l3kernel/l3prefixes.csv (renamed from macros/latex/contrib/l3kernel/l3prefixes.csv)9
-rw-r--r--macros/latex/required/l3kernel/l3prefixes.pdf (renamed from macros/latex/contrib/l3kernel/l3prefixes.pdf)bin82720 -> 82856 bytes
-rw-r--r--macros/latex/required/l3kernel/l3prefixes.tex (renamed from macros/latex/contrib/l3kernel/l3prefixes.tex)0
-rw-r--r--macros/latex/required/l3kernel/l3prg.dtx (renamed from macros/latex/contrib/l3kernel/l3prg.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3prop.dtx (renamed from macros/latex/contrib/l3kernel/l3prop.dtx)74
-rw-r--r--macros/latex/required/l3kernel/l3quark.dtx (renamed from macros/latex/contrib/l3kernel/l3quark.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3regex.dtx (renamed from macros/latex/contrib/l3kernel/l3regex.dtx)46
-rw-r--r--macros/latex/required/l3kernel/l3seq.dtx (renamed from macros/latex/contrib/l3kernel/l3seq.dtx)4
-rw-r--r--macros/latex/required/l3kernel/l3skip.dtx (renamed from macros/latex/contrib/l3kernel/l3skip.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3sort.dtx (renamed from macros/latex/contrib/l3kernel/l3sort.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3str-convert.dtx (renamed from macros/latex/contrib/l3kernel/l3str-convert.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3str.dtx (renamed from macros/latex/contrib/l3kernel/l3str.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3styleguide.pdf (renamed from macros/latex/contrib/l3kernel/l3styleguide.pdf)bin296553 -> 296746 bytes
-rw-r--r--macros/latex/required/l3kernel/l3styleguide.tex (renamed from macros/latex/contrib/l3kernel/l3styleguide.tex)2
-rw-r--r--macros/latex/required/l3kernel/l3syntax-changes.pdf (renamed from macros/latex/contrib/l3kernel/l3syntax-changes.pdf)bin231402 -> 231577 bytes
-rw-r--r--macros/latex/required/l3kernel/l3syntax-changes.tex (renamed from macros/latex/contrib/l3kernel/l3syntax-changes.tex)2
-rw-r--r--macros/latex/required/l3kernel/l3sys.dtx (renamed from macros/latex/contrib/l3kernel/l3sys.dtx)21
-rw-r--r--macros/latex/required/l3kernel/l3term-glossary.pdf (renamed from macros/latex/contrib/l3kernel/l3term-glossary.pdf)bin242191 -> 242381 bytes
-rw-r--r--macros/latex/required/l3kernel/l3term-glossary.tex (renamed from macros/latex/contrib/l3kernel/l3term-glossary.tex)2
-rw-r--r--macros/latex/required/l3kernel/l3text-case.dtx (renamed from macros/latex/contrib/l3kernel/l3text-case.dtx)4
-rw-r--r--macros/latex/required/l3kernel/l3text-map.dtx (renamed from macros/latex/contrib/l3kernel/l3text-map.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3text-purify.dtx (renamed from macros/latex/contrib/l3kernel/l3text-purify.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3text.dtx (renamed from macros/latex/contrib/l3kernel/l3text.dtx)4
-rw-r--r--macros/latex/required/l3kernel/l3tl-analysis.dtx (renamed from macros/latex/contrib/l3kernel/l3tl-analysis.dtx)2
-rw-r--r--macros/latex/required/l3kernel/l3tl-build.dtx (renamed from macros/latex/contrib/l3kernel/l3tl-build.dtx)5
-rw-r--r--macros/latex/required/l3kernel/l3tl.dtx (renamed from macros/latex/contrib/l3kernel/l3tl.dtx)4
-rw-r--r--macros/latex/required/l3kernel/l3token.dtx (renamed from macros/latex/contrib/l3kernel/l3token.dtx)10
-rw-r--r--macros/latex/required/l3kernel/l3unicode.dtx (renamed from macros/latex/contrib/l3kernel/l3unicode.dtx)6
-rw-r--r--macros/latex/required/l3kernel/source3.pdf (renamed from macros/latex/contrib/l3kernel/source3.pdf)bin7574289 -> 7620398 bytes
-rw-r--r--macros/latex/required/l3kernel/source3.tex (renamed from macros/latex/contrib/l3kernel/source3.tex)2
-rw-r--r--macros/latex/required/l3kernel/source3body.tex (renamed from macros/latex/contrib/l3kernel/source3body.tex)0
1593 files changed, 68614 insertions, 8048 deletions
diff --git a/macros/latex/contrib/arraycols/arraycols.dtx b/macros/latex/contrib/arraycols/arraycols.dtx
index b3a438be98..aebd0bb195 100644
--- a/macros/latex/contrib/arraycols/arraycols.dtx
+++ b/macros/latex/contrib/arraycols/arraycols.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019-2023 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+% Copyright (C) 2019-2024 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,16 +20,16 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{arraycols}
- [2023/09/13 v1.4 .dtx arraycols file]
+ [2024/05/04 v1.5 .dtx New column types for array and tabular]
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french,english]{babel}
-\usepackage{lmodern}
+\usepackage[charter]{mathdesign}
\usepackage{arraycols}
-
+\usepackage{spacingtricks}
\usepackage{sectsty}
\usepackage{xcolor}
\definecolor{darkbrown}{rgb}{0.5,0.1,0.1}
@@ -56,7 +56,7 @@
%</driver>
% \fi
%
-% \CheckSum{46}
+% \CheckSum{42}
%
% \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
@@ -81,23 +81,29 @@
% minor changes in documentation}
% \changes{v1.2}{2021/09/20}{Incompatibility with siunitx package
% (called by pstricks-add) is solved}
-% \changes{v1.3}{2023/08/09}{Small changes in documentation}
-% \changes{v1.4}{2023/09/13}{More changes in documentation}
+% \changes{v1.3}{2023/08/09}{A few changes in the documentation}
+% \changes{v1.4}{2023/09/13}{More changes in the documentation}
+% \changes{v1.5}{2024/05/04}{Mention of the tabularray and mdwtab packages in the doc;
+% explanations about the gape and Gape macros from the makecell package}
%
% \GetFileInfo{arraycols.sty}
%
% \title{The \textsf{arraycols} package\thanks{This document
% corresponds to \textsf{arraycols}~\fileversion, dated \filedate.
-% Thanks to François Bastouil for assistance with the English translation.}}
+% Thanks to François Bastouil for initial assistance with the English translation.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{September 13, 2023}
+% \date{May 4, 2024}
% \maketitle
%
% \section{Introduction}
%
-% This package introduces new predefined column types for tables, in addition to
-% the \textsf{array} package by Frank Mittelbach and David Carlisle~\cite{ARRAY}.
-% It also includes a command for wide horizontal rule drawing.
+% Although the remarkable \textsf{tabularray} package by Jianrui Lyu~\cite{TABUL},
+% developed in \LaTeX 3, offers many new possibilities and great flexibility
+% in composing tables, many users are still familiar with
+% Frank Mittelbach and David Carlisle's \textsf{array} package~\cite{ARRAY}.
+% In addition to \textsf{array}, this modest \textsf{arraycols} package introduces
+% new predefined column types for tables and also includes a command
+% for wide horizontal rule drawing.
% Below is a summary of the column types and macro defined by \textsf{arraycols},
% which will be detailed in the following section.
%
@@ -142,7 +148,7 @@
% \end{tabular}
% \end{center}
%
-% Note that if a column type has been previously defined by another package,
+% If a column type has been previously defined by another package,
% using \textsf{arraycols} will overwrite it and display a warning message.
%
% In addition to loading the \textsf{array} package, \textsf{arraycols}
@@ -151,13 +157,10 @@
% Moreover it relies on
% \textsf{tabularx}~\cite{TABX} for \texttt{T} and \texttt{Z} column types and
% loads \textsf{makecell}~\cite{MKCELL} for creation of multilined tabular cells.
-% It's worth mentioning that the \textsf{tablestyles} package~\cite{TBLSTY}
-% also defines L, C, R and Z column types, but differently.
-% Nevertheless, \textsf{tablestyles} is incompatible with \textsf{makecell}
-% and consequently with \textsf{arraycols} as well.
-%
-% With its minimal code, \textsf{arraycols} makes no claim to develop new macros.
-% Its purpose is to combine and configure functionalities derived from other packages.
+% Note that the \textsf{tablestyles} package~\cite{TBLSTY}
+% also defines the column types L, C, R and Z, but differently.
+% However, \textsf{tablestyles} is incompatible with \textsf{makecell}
+% and therefore also with \textsf{arraycols} as well.
%
% \section{Usage}
%
@@ -171,14 +174,13 @@
% in a \texttt{tabular} environment.
% For instance, using the declaration "\begin{tabular}{|l|C|r|}" sets the second column
% in centered mathematical mode. Similarly, using the declaration "\begin{array}{|L|c|c|}"
-% sets the first column in text mode, left-aligned\footnote{The declarations
-% \texttt{L, C, R} do not work in a \texttt{tabularx} environment.
+% sets the first column in text mode, left-aligned
+% \footnote{The declarations \texttt{L, C, R} do not work in a \texttt{tabularx} environment.
% Additionally, the \mbox{\textsf{tabulary}} package by David Carlisle~\cite{TABY}
% already defines the \texttt{L, C, R} (and \texttt{J}) column types for specific alignments
% in tables of the same type as \texttt{tabularx}.
-% However, there is no incompatibility with \textsf{arraycols} because these column definitions
-% apply exclusively within \texttt{tabulary} environments.
-% }.
+% However, there is no incompatibility with \textsf{arraycols} because these
+% column definitions apply exclusively within \texttt{tabulary} environments.}.
%
% \medskip
% \DescribeEnv{t\marg{width}}
@@ -230,17 +232,18 @@
% \end{array}
% \]
%
-% The \textsf{cellspace} package is loaded with the \texttt{math} option\footnote{The
-% \texttt{math} option loads the \textsf{amsmath} package.
+% The \textsf{cellspace} package is loaded with the \texttt{math} option
+% \footnote{The \texttt{math} option loads the \textsf{amsmath} package.
% As mentionned in the \textsf{cellspace} package documentation:
% \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.}
% to efficiently manage row heights, including in matrices.
% Another option of \textsf{cellspace}, \texttt{column=Q}
-% (with \texttt{S} being the default in \textsf{cellspace})\footnote{The
-% letter Q is a substitute for the default column modifier S of the \textsf{cellspace}
-% package.}, was necessary to prevent any compatibility issues
+% (with \texttt{S} being the default in \textsf{cellspace})
+% \footnote{The letter Q is a substitute for the default column modifier
+% S of the \textsf{cellspace} package.},
+% was necessary to prevent any compatibility issues
% with the \textsf{siunitx} package (also loaded by \textsf{pstricks-add}).
% The \texttt{Q} declaration serves as a \og modifier \fg{}
% that, when placed before a column type declaration,
@@ -253,19 +256,44 @@
% excellent row height adjustment. However, regrettably, it doesn't handle the height
% of vertical separators ``"|"''.
% In order to achieve a similar vertical adjustment as \textsf{booktabs},
-% we set the \textsf{cellspace} parameters as follows:\\
-% \indent\indent"\setlength{\cellspacetoplimit}{3pt}", \\
-% \indent\indent"\setlength{\cellspacebottomlimit}{2pt}".
-%
-% Additionally, it's worth mentioning the \textsf{tabls} package by Donald Arneseau~\cite{TABLS}
-% that makes a good adjustment of row heights as well, but it is incompatible
-% with the \textsf{array} and \textsf{numprint} packages.
+% we set the \textsf{cellspace} parameters as follows:
+% \begin{center}
+% \begin{tabular}{l}
+% "\setlength{\cellspacetoplimit}{3pt}", \\
+% "\setlength{\cellspacebottomlimit}{2pt}".
+% \end{tabular}
+% \end{center}
%
% \medskip
-% Finally, manual adjustments can also be achieved using the "\vstrut" command
-% from the \textsf{spacingtricks} package~\cite{SPA}, or by utilizing "\gape" and "\Gape"
-% from the \textsf{makecell} package~\cite{MKCELL},
-% as well as employing "\bigstrut" from the \textsf{bigstrut} package~\cite{STRUT}.
+% A common issue with \LaTeX\ tables is that there isn’t enough space
+% around horizontal rules. As seen previously,
+% \textsf{cellspace} partially addresses this issue,
+% but if you want to add some more space around the horizontal rules, it's not straightforward.
+% First, note that Donald Arsenau's \textsf{tabls} package~\cite{TABLS} produces
+% a nice and automatic solution in this regard, but is not compatible with \textsf{array}
+% nor with \textsf{numprint}.
+%
+% Several other methods can be employed:
+% you can increase the space on top or bottom of a particular cell
+% by using
+% \begin{center}
+% "\gape"\oarg{\texttt{t} or \texttt{b}}\marg{text}
+% or "\Gape"\oarg{height}\oarg{depth}\marg{text}
+% \end{center}
+% from the \textsf{makecell} package~\cite{MKCELL}.
+% You have also the "\bigstrut" command from the \textsf{bigstrut} package~\cite{STRUT},
+% but it's less efficient and convenient.
+% An efficient method is provided by the \textsf{mdwtab} package
+% of Mark Wooding~\cite{MDWTAB} with its macros
+% "\vgap"\marg{length} or "\hlx"\marg{hlx-cmd},
+% where in \marg{hlx-cmd} you can place "h", representing "\hline", and "s"\oarg{length},
+% meaning "\vgap" (among others).
+% This package provides also many other interesting features.
+% Finally, manual adjustments of particular rows can be achieved using
+% the "\vstrut"\oarg{depth}\marg{height} command
+% from the \textsf{spacingtricks} package~\cite{SPA},
+% These packages are not loaded by \textsf{arraycols}, except \textsf{makecell}.
+% Have a look at their documentation.
%
% \medskip
% \DescribeEnv{z\marg{width}}
@@ -281,16 +309,19 @@
% the \texttt{X} column definition, which calculates its width in relation to
% the required width for the entire table. It aligns text to the left
% similar to \texttt{p}\marg{width}.
-% For instance, using "\begin{tabularx}{8cm}{|c|X|X|}"
+% Using "\begin{tabularx}{8cm}{|c|X|X|}"
% adjusts the width of the \texttt{X} columns
% to achieve a total width of 8\,cm. To complement this, we offer
% the \texttt{T} declaration, which performs a similar function
% but centers the content horizontally.
% Additionally the \texttt{Z} declaration activates mathematical
% mode and adjusts
-% line heights, comparable to \texttt{x} or \texttt{z}). Here's an example with
-% "\begin{tabularx}{\linewidth}{|T|y|x|Z|T|}".
+% line heights, comparable to \texttt{x} or \texttt{z}).
+% The following example is obtained with
% \begin{center}
+% "\begin{tabularx}{\linewidth}{|T|y|x|Z|T|}".
+%
+% \medskip
% \begin{tabularx}{\linewidth}{|T|y|x|Z|T|}
% \hline
% A good job &
@@ -301,6 +332,7 @@
% \hline
% \end{tabularx}
% \end{center}
+%
% Observe that cells 3 and 4 are not vertically centered to preserve
% the precise alignment of fraction bars within mathematical formulas
% across cells.
@@ -317,7 +349,8 @@
% compared to the one achieved
% with the standard declaration ``"|"''. For selecting the line thickness,
% we additionally provide the column
-% definition \texttt{V}\marg{thickness}\footnote{The definition of \texttt{V}
+% definition \texttt{V}\marg{thickness}
+% \footnote{The definition of \texttt{V}
% would have been simplified by utilizing an optional argument for \texttt{I},
% but unfortunately, this approach doesn't function.}.
%
@@ -334,14 +367,12 @@
% Horizontal rules at the beginning and end of the table are accomplished using "\whline",
% while a "\Xhline{0.8pt}" rule is employed after the legend rows.
% The formatting of header rows is achieved using the "\thead" command
-% from the \textsf{makecell} package. By default, \textsf{arraycols} sets:
-% "\renewcommand\theadfont{\footnotesize\sffamily}"
-% (in \textsf{makecell} it is |\footnotesize| only, without "\sffamily").
+% from the \textsf{makecell} package.
% Lastly, following a recommendation of the \textsf{array} package~\cite{ARRAY},
% an additional 1\,pt has been added to the standard height of each row within this table.
% This adjustment is implemented with the command
-% "\setlength{\extrarowheight}{1pt}"\footnote{As stated
-% in the \textsf{array} package documentation:
+% "\setlength{\extrarowheight}{1pt}"
+% \footnote{As stated in the \textsf{array} package documentation:
% \og This is important for tables with horizontal lines because those
% lines normally touch the capital letters\fg.}.
%
@@ -362,8 +393,8 @@
% The \textsf{cellspace} package provides the \texttt{S} modifier
% (we used \texttt{Q} instead), which,
% when placed before a column declaration, allows for the adjustment of cell content height
-% to prevent any overlap with horizontal rules. The spacing between the content and the rules
-% is governed by the parameters
+% to prevent any overlap with horizontal rules. The spacing between the content and the
+% horizontal rules is governed by the parameters
% "\cellspacetoplimit" and "\cellspacebottomlimit".
%
% \begin{macrocode}
@@ -400,32 +431,35 @@
\newcolumntype{V}[1]{!{\vrule width #1}}
\newlength\savedwidth
\newcommand{\whline}{%
- \noalign{\global\savedwidth\arrayrulewidth\global\arrayrulewidth 1pt}
+ \noalign{\global\savedwidth\arrayrulewidth
+ \global\arrayrulewidth 1pt}
\hline
\noalign{\global\arrayrulewidth\savedwidth}
}
-\renewcommand\theadfont{\footnotesize\sffamily}
% \end{macrocode}
%
% \bigskip
-% \begin{thebibliography}{11}
+% \begin{thebibliography}{13}
+% \bibitem{TABUL} \emph{Tabularray -- Typeset Tabulars and Arrays with \LaTeX 3},
+% Jianrui Lyu, CTAN, 2024A 2024/02/16.
% \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,
% v1.8.1 2019/03/11.
% \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{TABY} \emph{The \textsf{tabulary} package}, David Carlisle, CTAN, v1.10 2014/06/11.
% \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.
% \bibitem{STRUT} \emph{The \textsf{multirow}, \textsf{bigstrut}
% and \textsf{bigdelim} packages},
% Piet van Oostrum, Øystein Bache, Jerry Leichter, CTAN, v2.4 2019/01/01.
+% \bibitem{MDWTAB} \emph{The \textsf{mdwtab} package}, Mark Wooding, CTAN, v1.9 1998/04/28.
% \bibitem{SPA} \emph{The \textsf{spacingtricks} package}, Antoine Missier,
-% CTAN, v1.3 2020/11/02.
+% CTAN, v1.8 2023/12/06.
% \bibitem{COMP} \emph{The \LaTeX\ Companion}. Frank Mittelbach, Michel Goossens,
% Johannes Braams, David Carlisle, Chris Rowley, 2nd edition, Pearson Education, 2004.
% \end{thebibliography}
diff --git a/macros/latex/contrib/arraycols/arraycols.ins b/macros/latex/contrib/arraycols/arraycols.ins
index 567b7a7540..66bf4af2f4 100644
--- a/macros/latex/contrib/arraycols/arraycols.ins
+++ b/macros/latex/contrib/arraycols/arraycols.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2019-2023 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+%% Copyright (C) 2019-2024 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-2023 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+Copyright (C) 2019-2024 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/macros/latex/contrib/arraycols/arraycols.pdf b/macros/latex/contrib/arraycols/arraycols.pdf
index b42c461d36..d280a956f3 100644
--- a/macros/latex/contrib/arraycols/arraycols.pdf
+++ b/macros/latex/contrib/arraycols/arraycols.pdf
Binary files differ
diff --git a/macros/latex/contrib/babel-contrib/french/README.md b/macros/latex/contrib/babel-contrib/french/README.md
index 5f6d25139a..9706a70579 100644
--- a/macros/latex/contrib/babel-contrib/french/README.md
+++ b/macros/latex/contrib/babel-contrib/french/README.md
@@ -23,7 +23,7 @@ The bundle consists of the following files:
License
-------
-Released under the LaTeX Project Public License v1.3 or later
+Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
## Installation
@@ -49,5 +49,5 @@ Changes
See the included manual frenchb.pdf, section "Change History".
---
-Copyright 1996--2023 Daniel Flipo
+Copyright 1996--2024 Daniel Flipo
E-mail: daniel (dot) flipo (at) free (dot) fr
diff --git a/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf b/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf
index 4b901cdf3e..27f13a814f 100644
--- a/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf
+++ b/macros/latex/contrib/babel-contrib/french/frenchb-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/babel-contrib/french/frenchb-doc.tex b/macros/latex/contrib/babel-contrib/french/frenchb-doc.tex
index 9434072bd6..d1ef9c5a3a 100644
--- a/macros/latex/contrib/babel-contrib/french/frenchb-doc.tex
+++ b/macros/latex/contrib/babel-contrib/french/frenchb-doc.tex
@@ -120,7 +120,7 @@
\title{Mode d’emploi du module \ext{babel-french}}
\author{\href{mailto:daniel.flipo@free.fr}{Daniel \textsc{Flipo}}}
-\newcommand*{\latestversion}{3.5s}
+\newcommand*{\latestversion}{3.6a}
\date{Version {\latestversion} -- \today}
\begin{document}
@@ -135,7 +135,7 @@
trouve à la section~\ref{sec:changes-3.0} p.~\pageref{sec:changes-3.0}.
La version actuelle de frenchb (\latestversion), dont le nom officiel est
- \ext{babel-french}, est prévue pour fonctionner aussi bien avec les anciens
+ \ext{babel-french}, est conçue pour fonctionner aussi bien avec les anciens
formats TeX comme pdf(La)TeX qu’avec les nouveaux Lua(La)TeX et Xe(La)TeX.
Les mises à jour de \ext{babel-french} sont désormais affichées très
@@ -157,11 +157,6 @@
\vspace{-\baselineskip}\noindent
\descindentFB=0pt
\begin{description}
- \item[30 avril 2017] Utiliser |\frenchsetup{}| de préférence à
- |\frenchbsetup{}|, voir p.~\pageref{sec:Perso}.
- Personnalisation de la commande |\part{}|, voir p.~\pageref{ssec:captions}.
- \item[31 août 2017] Ajout de l’option \fbo{UnicodeNoBreakSpaces},
- voir p.~\pageref{ucs-nbsp}.
\item[30 janvier 2018] Adaptation à la version 3.4a, voir
section~\ref{ssec:changes-3.4}.
\item[24 février 2018] Regroupement par thèmes des options de \fbsetup{}.
@@ -183,6 +178,8 @@
voir p.~\pageref{par-in-lists}.
\item[19 déc. 2023] \ext{babel-french} est maintenant compatible
avec \pkg{ucharclasses} (XeLaTeX). \file{frenchb.ins} supprimée.
+ \item[22 mai 2024] Adaptation à la version 3.6a, voir
+ section~\ref{ssec:changes-3.6}.
\end{description}
\end{abstract}
\egroup
@@ -880,8 +877,9 @@ La liste étant longue, les options sont regroupées par thèmes.
\item [AutoSpaceFootnotes=false (true*)] supprime l’espace fine
insécable ajoutée par défaut avant l’appel de chaque note dans le texte
- courant. Cette option affecte la totalité du document.
-
+ courant. Cette option affecte la totalité du document.
+ L’espace éventuellement ajoutée peut être ajustée, la commande par défaut
+ est : |\newcommand*{\FBfnmarkspace}{\kern .5\fontdimen2\font}|
\end{description}
\subsubsection*{Ponctuation haute}
@@ -1123,10 +1121,10 @@ La liste étant longue, les options sont regroupées par thèmes.
section~\ref{sec:description}, p.~\pageref{sec:description}.
\item [LowercaseSuperscripts=false (true)] rend possible d’avoir des lettres
- supérieures en capitales (est-ce bien utile ?). Par défaut, la nouvelle
- commande |\up| (sauf si elle est redéfinie en |\textsuperscript| par l’option
- précédente) empêche le passage en capitales des lettres supérieures dans les
- hauts de pages par exemple.
+ supérieures en capitales (est-ce bien utile ?). Par défaut, la commande
+ |\up| (sauf si elle est redéfinie en |\textsuperscript| par l’option
+ précédente) empêche le passage en capitales des lettres supérieures dans
+ les hauts de pages par exemple.
\item [SuppressWarning=true (false)] peut être utilisée pour supprimer les
avertissements non essentiels émis par \ext{babel-french}.
@@ -1521,10 +1519,28 @@ aurait :
}
%\newpage
-\section{Changements entre les versions 3.5 et 2.6}
+\section{Changements entre les versions \latestversion{} et 3.4 (2018)}
\label{sec:changes-3.0}
-\subsection{Changements entre les versions \latestversion{} et 3.4d}
+\subsection{Changements entre les versions \latestversion{} et 3.5s}
+\label{ssec:changes-3.6}
+
+La version 3.6a n’a plus recours à l’extension \pkg{keyval} pour gérer les
+options, les commandes internes du noyau LaTeX (\pkg{ltkeys})
+|\DeclareKeys{}| et |\SetKeys{}| sont utilisées.\\
+L’espace fine ajoutée avant l’appel des notes de bas de pages est maintenant
+personnalisable (suggestion de Thomas Savary) ; le nom de la commande est
+|\FBfnmarkspace{}|, c’est une \emph{vraie} espace fine (demie espace-mot de la
+police courante) contrairement à la commande LaTeX |\,| alias |\thinspace|%
+\footnote{Elles sont définies pour fonctionner aussi en mode mathématique.}
+précédemment utilisée qui chasse toujours 1/6em. Les deux définitions
+coïncident pour les polices dont l’espace-mot vaut 1/3em, (cas le plus
+courant), l’écart est infime pour celles qui chassent moins : il est par
+exemple de $(1/6-1/8)12=0,5$pt en 12pt pour une police dont l’espace-mot
+chasse 1/4em. Il est toujours possible de revenir à l’ancien comportement en
+codant |\renewcommand\FBfnmarkspace{\,}|.
+
+\subsection{Changements entre les versions 3.5a et 3.4d}
\label{ssec:changes-3.5}
La version 3.5a propose une nouvelle option \fbo{ListItemsAsPar} qui permet
@@ -1671,116 +1687,6 @@ judicieux de renommer la commande de personnalisation |\frenchbsetup{}| en
De nouvelles possibilités de personnalisation de la commande |\part{}| ont été
introduites, voir page~\pageref{ssec:captions}.
-\subsection{Changements entre les versions 3.2h et 3.1m}
-\label{ssec:changes-3.2}
-
-La version 3.2g modifie le comportement par défaut de la commande |\frquote{}|
-sous LuaTeX qui est maintenant le même que sous XeTeX ou pdfTeX.
-Il suffit d’ajouter l’option \fbo{EveryLineGuill=open} pour retrouver le
-comportement des versions précédentes.
-
-Depuis la version 3.2f, \ext{babel-french} est compatible avec l’extension
-\ext{icomma} qui offre une solution alternative à la commande
-|\DecimalMathComma|.
-
-La construction des notes de bas de page a été revue pour les classes
-\cls{beamer}, \cls{memoir} et koma-script (\cls{scrartcl}, \cls{scrreprt}
-et \cls{scrbook}). Le rendu final est conservé mais les possibilités de
-personnalisation offertes par ces classes pour la présentation des notes de
-bas de page (changement de police, de couleur, etc.) sont désormais
-disponibles même lorsque l’option \fbo{FrenchFootnotes} est activée.
-
-Un vieux bug affectant le comportement de |\frquote{}| lorsque l’extension
-\ext{xspace} est chargée, a été corrigé.
-
-Les commandes |\NoAutoSpacing|, |\ttfamilyFB|, |\rmfamilyFB| et |\sffamilyFB|
-ont été complètement réécrites dans la version~3.2c afin de leur assurer un
-comportement identique quel que soit le moteur utilisé, pdfTeX, XeTeX ou
-LuaTeX.
-
-\textbf{{babel-french} v.3.2b et suivantes, mise en garde pour les
- utilisateurs de Lua(La)TeX :}
-\nopagebreak
-La version~3.2b est la première compatible avec la version~0.95 de LuaTeX
-incluse dans TeXLive~2016. Les changements intervenus dans la structure des
-nœuds de type \textit{glue} rendent cette nouvelle version de LuaTeX
-incompatible avec les précédentes. Le code lua contenu dans les versions 3.2b
-et suivantes de \file{frenchb.lua} ne fonctionne pas avec les versions de
-LuaTeX antérieures à 0.95, aussi à partir de la version~3.2b \ext{babel-french}
-revient aux caractères actifs pour la gestion de la ponctuation haute avec les
-moteurs LuaTeX antérieurs à 0.95 !
-La bonne solution consiste à installer rapidement TeXLive~2016 ou une autre
-distribution contenant LuaTeX~0.95.
-En revanche il n’y a aucun problème de compatibilité ascendante avec les
-moteurs XeTeX et pdfTeX.
-
-\subsection{Changements entre les versions 3.1m et 3.0c}
-\label{ssec:changes-3.1}
-
-{\sloppy
- Ajout de la commande |\frquote{}| et de sa variante |\frquote*{}|
- recommandées pour saisir les citations, notamment les citations imbriquées
- ou celles s’étendant sur plusieurs paragraphes, voir p.~\pageref{frquote}
- et les nouvelles options \fbo{EveryParGuill}, \fbo{EveryLineGuill} et
- \fbo{InnerGuillSingle}.
-\par}
-
-Nouvelle option \fbo{SmallCapsFigTabCaptions}, voir p.~\pageref{scfigtab}.
-
-\subsection{Changements entre les versions 3.0c et 2.6h}
-\label{ssec:changes-3.0}
-
-Plusieurs modifications de fond ont motivé le passage à la version~3.0.
-
-\begin{itemize}
-
-\item \ext{babel-french} ne fonctionne désormais qu’avec la version~3.9
- de Babel ce qui donne accès à une syntaxe plus agréable pour modifier les
- \textit{captions}, voir p.~\pageref{captionsfrench}.
- Le séparateur utilisé dans les légendes de figures et de tableaux est
- choisi de manière globale pour toutes les langues, voir
- p.~\pageref{captionseparator}.
-
-\item La gestion des options par \fbsetup{} a été complètement remaniée ; deux
- nouvelles options ont été ajoutées.
-
-\item La variante « canadien » du français fonctionne désormais comme un vrai
- \textit{dialect} au sens de Babel ; parallèlement le français ne devrait
- plus être désigné que sous le nom \opt{french}, à la fois en option de
- |\usepackage[...]{babel}|%
- \footnote{Le mieux est encore de mettre toutes les déclarations de langues
- en option de \cs{documentclass}.}
- et en argument de |\selectlanguage{}| et consorts.
- Les variantes \opt{frenchb} et \opt{francais} sont encore tolérées mais
- sans aucune garantie de pérennité.
-
-\item \ext{babel-french} ne charge plus le fichier \file{frenchb.cfg} ; la
- personnalisation passe par l’utilisation exclusive de \fbsetup{}.
-
-\item Les étiquettes des listes \env{description} sont positionnées comme
- celles des listes \env{itemize} et \env{enumerate} avec un retrait
- paramétrable |\listindentFB| par rapport à la marge gauche.
-
-\item Enfin et c’est probablement le plus important, le recours aux
- caractères actifs est supprimé pour la gestion de la ponctuation haute
- lorsqu’un format basé sur LuaTeX%
- \footnote{C’est déjà le cas pour XeTeX depuis la version~2.5 de
- \ext{babel-french}.}
- est utilisé (LuaLaTeX par exemple).
- Le mécanisme des caractères actifs est remplacé par un appel aux
- \textit{callbacks} |pre_linebreak_filter| et |hpack_filter|%
- \footnote{Depuis la version 3.1g c’est le\textit{callbacks} \texttt{kerning}
- qui est mis en œuvre à la place.}.
-
- La base du code |lua| se trouve dans l’exposé de Paul Isambert
- à la journée GUT’2010. Un grand merci à Paul pour cette source d’inspiration
- et pour ses suggestions lors de la relecture finale de \file{frenchb.lua}.
-
-\end{itemize}
-
-À partir de la version 3.0c, \ext{babel-french} laisse le contrôle total des
-listes à la classe \cls{beamer} (option \fbo{StandardLists} automatiquement
-activée) ; nouvelle option \fbo{INGuillSpace} (voir p.~\pageref{INGuillspace}).
\subsection{Comment recompiler un document écrit pour
{babel-french}~2.x ?}
diff --git a/macros/latex/contrib/babel-contrib/french/frenchb.dtx b/macros/latex/contrib/babel-contrib/french/frenchb.dtx
index 71171ba2bf..331a0195e0 100644
--- a/macros/latex/contrib/babel-contrib/french/frenchb.dtx
+++ b/macros/latex/contrib/babel-contrib/french/frenchb.dtx
@@ -27,11 +27,11 @@ to be used with the Babel system.
-------------------------------------------------------------
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
-and version 1.3 or later is part of all distributions of LaTeX
+and version 1.3c or later is part of all distributions of LaTeX
version 2003/12/01 or later.
This work has the LPPL maintenance status "maintained".
@@ -75,7 +75,7 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
%<frenchb>\ProvidesLanguage{frenchb}
%<lua>--[[
%<lua> File `frenchb.lua’ generated from frenchb.dtx
- [2024-02-29 v3.5s French support from the babel system]
+ [2024-05-24 v3.6a French support from the babel system]
%<lua> Copyright © 2014-2024 Daniel Flipo
%<lua> <daniel (dot) flipo (at) free (dot) fr>
%<lua> License LPPL: see french.ldf.
@@ -101,17 +101,24 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
\usepackage[dvipsnames]{xcolor}
\usepackage[no-math]{fontspec}
\usepackage{realscripts}
-\setmainfont{Vera.ttf}[
- ItalicFont = VeraIt.ttf,
- BoldFont = VeraBd.ttf,
- BoldItalicFont = VeraBI.ttf,
- Scale = 0.92
- ]
-\setmonofont{VeraMono.ttf}[
- ItalicFont = VeraMoIt.ttf,
- BoldFont = VeraMoBd.ttf,
- BoldItalicFont = VeraMoBI.ttf,
- Scale = MatchLowercase,
+\usepackage{setspace}
+\setstretch{1.15}
+\setmainfont{SourceSansPro}[
+ Scale = 1.13 ,
+ Extension = .otf ,
+ UprightFont = *-Regular ,
+ ItalicFont = *-RegularIt ,
+ BoldFont = *-Bold ,
+ BoldItalicFont = *-BoldIt ]
+\setmonofont{iosevka}[%
+ Scale = MatchLowercase ,
+ FakeStretch = 1.05 ,
+ Extension = .ttf,
+ UprightFont = *-medium,
+ BoldFont = *-bold,
+ ItalicFont = *-italic,
+ BoldItalicFont = *-bolditalic,
+% RawFeatures = -dlig;-clig % ligature >= (l.1314)
]
%
\def\PrintMacroName#1{%
@@ -149,8 +156,8 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
\clearpage
\section{Change History}%
\GlossaryPrologue{}%
- Changes are listed in reverse order (latest first) and limited to
- \frenchb{}~v3.
+ Changes listed in reverse order (latest first) and not older
+ than~v3.3 (2018).
\PrintChanges
}
\begin{document}
@@ -298,8 +305,8 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% the quotation either an opening French guillemet («), or
% a closing one (») or nothing depending on option
% \fbo{EveryParGuill=open} or \fbo{=close} or \fbo{=none},
-% see p.~\pageref{everyparguill}.
-% Command |\NoEveryParQuote| is provided to locally suppress
+% see p.~\pageref{everyparguill}.\\
+% The command |\NoEveryParQuote| is provided to locally suppress
% unwanted guillemets (typically when lists are embedded in
% |\frquote{}|), it is meant to be used inside an environment
% or a group.
@@ -355,7 +362,7 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% Usage: |Albert~\bsc{Camus}|.
%
% \item Commands |\primo|, |\secundo|, |\tertio| and |\quarto|
-% print 1\up{o}, 2\up{o}, 3\up{o}, 4\up{o}.
+% print 1\up{o}, 2\up{o}, 3\up{o}, 4\up{o}.\linebreak
% |\FrenchEnumerate{6}| prints 6\up{o}.
% \item Abbreviations for ``Numéro(s)’’ and ``numéro(s)’’
% (N\up{o} N\up{os} n\up{o} and n\up{os}~) are obtained
@@ -403,7 +410,7 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% Customisation of \frenchb{} relies on command \fbsetup{}
% (formerly called |\frenchbsetup{}|, the latter name will be kept
% for ever to ensure backwards compatibility), options are entered
-% using the \file{keyval} syntax.
+% using the \file{l3keys} syntax.
% The command \fbsetup{} is to appear in the preamble only
% (after loading \babel).
%
@@ -418,7 +425,7 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
%
% \fbsetup{ShowOptions} prints all available options to
% the \file{.log} file, it is just meant as a remainder of the
-% list of offered options. As usual with \file{keyval} syntax,
+% list of offered options. As usual with \file{l3keys} syntax,
% boolean options (as \fbo{ShowOptions}) can be entered as
% \fbo{ShowOptions=true} or just \fbo{ShowOptions}, the
% \fbo{=true} part can be omitted.
@@ -453,9 +460,10 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% first paragraph of sections. When French is the main language,
% this option applies to all languages.
%
-% \item [PartNameFull=false (true)]; when true, \frenchb{} numbers
-% the title of |\part{}| commands as ``Première partie’’,
-% ``Deuxième partie’’ and so on. With some classes which
+% \item [PartNameFull=false (true)]; when true (the default),
+% \frenchb{} numbers the title of |\part{}| commands as
+% ``Première partie’’, ``Deuxième partie’’ and so on.
+% With some classes which
% change the |\part{}| command (AMS classes do so), you could
% get ``Première partie~1’’, ``Deuxième partie~2’’ in the toc;
% when this occurs, this option should be set to
@@ -506,9 +514,9 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% you had to set \fbo{ReduceListSpacing=false} to revert to the
% class settings which actually reduce list’s spacings even more
% than \frenchb! \fbo{StandardListSpacing=true} replaces
-% \fbo{ReduceListSpacing=false}.}; \frenchb{} customises
+% \fbo{ReduceListSpacing=false}.}; \frenchb{} usually customises
% the vertical spaces in the \env{list} environment, this affects
-% all lists, including \env{itemize} \env{enumerate},
+% all lists, including \env{itemize}, \env{enumerate},
% \env{description}, but also \env{abstract}, \env{quote},
% \env{quotation}, \env{verse}, etc. which are based on \env{list}.
% Setting this option to \fbo{true} reverts to the standard
@@ -552,12 +560,14 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% \cs{ding\{43\}} (\cs{textemdash}*)]\hfill
%
% \item [StandardLists=true (false*)] forbids \frenchb{} to
-% customise any kind of list. Try the option \fbo{StandardLists}
-% in case of conflicts with classes or packages that customise
+% customise any kind of list. The option \fbo{StandardLists=true}
+% should be used in case of conflicts with classes or packages that
+% customise
% lists too. This option is just a shorthand setting all four
% options \fbo{StandardListSpacing=true},
-% \fbo{StandardItemizeEnv=true}, \fbo{StandardEnumerateEnv=true}
-% and \fbo{StandardItemLabels=true}.
+% \fbo{StandardItemizeEnv=true},\linebreak
+% \fbo{StandardEnumerateEnv=true} and
+% \fbo{StandardItemLabels=true}.
%
% \item [ListOldLayout=true (false)]; starting with version~2.6a,
% the layout of lists has changed regarding leftmargins’ sizes
@@ -576,9 +586,11 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% instance).
%
% \item [AutoSpaceFootnotes=false (true*)]; by default \frenchb{}
-% adds a thin space in the running text before the number or
-% symbol calling the footnote. Making this option \fbo{false}
-% reverts to the standard setting (no space added).
+% adds a (customisable) thin space in the running text before the
+% number or symbol calling the footnote. Making this option
+% \fbo{false} reverts to the standard setting (no space added).
+% The default definition of this thin space is:\\
+% |\newcommand*{\FBfnmarkspace}{\kern .5\fontdimen2\font}|
%
% \item [AutoSpacePunctuation=false (true)]; in French, the user
% \hlabel{autospacepunctuation}
@@ -677,7 +689,7 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% always surrounded by « and », the next option is ineffective.
%
% \item [InnerGuillSingle=true (false)];
-% if \fbo{InnerGuillSingle=false} (default), inner quotations
+% if \fbo{InnerGuillSingle=false} (the default), inner quotations
% entered with |\frquote{}| start with~\texttt{``} and end
% with~\texttt{’’}.
% If \fbo{InnerGuillSingle=true}, \texttt{\guilsinglleft} and
@@ -693,7 +705,7 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% |\npthousandsep| is defined as a non-breaking space (|~|)%
% \footnote{Actually without stretch nor shrink.} in French;
% when set to true, this option redefines |\npthousandsep|
-% as a thin space (|\,|).
+% as a thin space (|\FBthinspace|).
%
% \item [SmallCapsFigTabCaptions=false (true*)]; when set to
% \fbo{false}, |\figurename| and |\tablename| will be printed in
@@ -702,8 +714,8 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% achieved by defining |\FBfigtabshape| as |\relax| before
% loading \frenchb{} (in a document class f.i.).
%
-% \item [CustomiseFigTabCaptions=false (true*)]; when \fbo{false}
-% the default separator (colon) is used instead of
+% \item [CustomiseFigTabCaptions=false (true*)]; when set to
+% \fbo{false} the default separator (colon) is used instead of
% |\CaptionSeparator|. Anyway, \frenchb{} tries hard to insert
% a proper space before it in French and warns if it fails to do
% so.
@@ -735,23 +747,23 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% in the order they appear in the \fbsetup{} command.
% Someone wishing that \frenchb{} leaves the layout of lists
% and footnotes untouched but caring for indentation of first
-% paragraph of sections should choose\\
-% \fbsetup{StandardLayout,IndentFirst} to get the expected
-% layout. The reverse order
-% \fbsetup{IndentFirst,StandardLayout} would lead to option
-% \fbo{IndentFirst} being overwritten by \fbo{StandardLayout}.
+% paragraph of sections should choose
+% \fbsetup{StandardLayout,IndentFirst}\par
+% The reverse order \fbsetup{IndentFirst,StandardLayout}
+% would lead to option \fbo{IndentFirst} being overwritten by
+% \fbo{StandardLayout}.
%
% \subsubsection{Caption names}
% \label{sssec-captions-name}
%
-% All caption names can easily be customised in French using the
-% simplified syntax introduced by \babel~3.9, for instance
-% |\def\frenchproofname{Preuve}| or
+% {\sloppy All caption names can easily be customised in French
+% using the simplified syntax introduced by \babel~3.9,
+% for instance |\def\frenchproofname{Preuve}| or
% |\def\acadianproofname{Preuve}| for the \opt{acadian} dialect.
% The older syntax |\addto\captionsfrench{\def\proofname{Preuve}}|
% still works. Keep in mind that \emph{only} |french| can be used
% to redefine captions, even if \babel{}’s option was entered as
-% |frenchb| or |francais|.
+% |frenchb| or |francais|.\par}
%
% \subsubsection{Figure and table captions}
% \label{sssec-captions-fig}
@@ -839,6 +851,13 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% \subsection{Changes}
% \label{ssec-changes}
%
+% \subsubsection*{What’s new in version 3.6?}
+%
+% Version 3.6a no longer loads the \pkg{keyval} package, replaced by
+% core LaTeX commands (\pkg{ltkeys}). The thin space added before
+% footnote’s calls is now customisable (suggested by Thomas Savary),
+% the command’s name is |\FBfnmarkspace|.
+%
% \subsubsection*{What’s new in version 3.5?}
%
% Version 3.5a offers a new option \fbo{ListItemsAsPar}. The default
@@ -864,7 +883,7 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% kerning was disabled for Type1 fonts since v3.1g (2015).
%
% Version 3.5j also fixes a long standing bug affecting koma-script,
-% \cls{memoir} et \cls{beamer} classes: redefintions of the caption
+% \cls{memoir} and \cls{beamer} classes: redefintions of the caption
% separator (commands |\captionformat|, |\captiondelim|, etc.) are
% now taken into account properly.
%
@@ -958,92 +977,6 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% three new commands |\frenchpartfirst|, |\frenchpartsecond| and
% |\frenchpartnameord|.
%
-% \subsubsection*{What’s new in version 3.2?}
-%
-% Version 3.2g changes the default behaviour of |\frquote{}|
-% with LuaTeX based engines, the output is now the same with
-% all engines; to recover the former behaviour, add option
-% \fbo{EveryLineGuill=open}.
-%
-% The handling of footnotes has been redesigned for the
-% \cls{beamer}, \cls{memoir} and koma-script classes.
-% The layout of footnotes ``à la française’’ should be unchanged
-% but footnotes’ customisations offered by these classes
-% (i.e.\ font or color changes) are now available even when option
-% \fbo{FrenchFootnotes} is \fbo{true}.
-%
-% A long standing bug regarding the \pkg{xspace} package has been
-% fixed: |\xspace| has been moved up from the internal command
-% |\FB@fg| to |\fg|; |\frquote{}| now works properly when the
-% \pkg{xspace} package is loaded.
-%
-% Version 3.2b is the first one designed to work with LuaTeX
-% v.~0.95 as included in TeXLive 2016 (LuaTeX’s new glue node
-% structure is not compatible with previous versions).
-%
-% \textbf{Warning to Lua(La)TeX users:} starting with version~3.2b
-% the lua code included in \file{frenchb.lua} will \emph{not work}
-% on older installations (TL2015 f.i.), so \frenchb{} reverts to
-% active characters while handling high punctuation with LuaTeX
-% engines older than 0.95!
-% The best way to go is to upgrade to TL2016 or equivalent asap.
-% Xe(La)TeX and pdf(La)TeX users can safely use \frenchb{} v.~3.2b
-% and later on older installations too.
-%
-% The internals of commands |\NoAutoSpacing|, |\ttfamilyFB|,
-% |\rmfamilyFB| and |\sffamilyFB| have been completely redesigned
-% in version~3.2c, they behave now consistently with all engines.
-%
-% \subsubsection*{What’s new in version 3.1?}
-%
-% New command |\frquote{}| meant to enter French quotations,
-% especially long ones (spreading over several paragraphs) and/or
-% embedded ones. see p.~\pageref{frquote} for details.
-%
-% \subsubsection*{What’s new in version 3.0?}
-%
-% Many deep changes lead me to step \frenchb’s version number
-% to~3.0a:
-% \begin{itemize}
-% \item \babel{}~3.9 is required now to process
-% \file{frenchb.ldf}, this change allows for cleaner definitions
-% of dates and captions for the Unicode engines LuaTeX and
-% XeTeX and also provides a simpler syntax for end-users, see
-% section~\ref{sssec-captions-name}
-% p.\pageref{sssec-captions-name}.
-% \item \fbsetup{} options management has been completely
-% reworked; two new options added.
-% \item Canadian French didn’t work as a normal \babel’s dialect,
-% it should now; btw. the French language should now be loaded
-% as \opt{french}, \emph{not as} \opt{frenchb} or
-% \opt{francais} and preferably as a \emph{global} option of
-% |\documentclass|. Some tolerance still exists in v3.0, but
-% do not rely on it.
-% \item \frenchb{} no longer loads \file{frenchb.cfg}:
-% customisation should definitely be done using \fbsetup{}
-% options.
-% \item Description lists labels are now indented; try setting
-% |\descindentFB=0pt| (or |\listindentFB=0pt| for all lists)
-% in the preamble if you don’t like it.
-% \item The last but not least change affects the (recent)
-% LuaTeX-based engines, (this means version 0.76 as included in
-% TL2013 and up): active characters are no longer used in French
-% for `high punctuation’%
-% \footnote{The current \frenchb{} version requires LuaTeX
-% v.~1.0.4 as included in TL2017, see above.}.
-% Functionalities and user interface are unchanged.
-%
-% Many thanks to Paul Isambert who provided the basis for the
-% lua code (see his presentation at GUT’2010) and kindly
-% reviewed my first drafts suggesting significant improvements.
-%
-% \end{itemize}
-%
-% Starting with version~3.0c, \frenchb{} no longer customises
-% lists with the \cls{beamer} class and offers a new option
-% (\fbo{INGuillSpace}) to follow French `Imprimerie Nationale’
-% recommendations regarding quotes’ spacing.
-%
% \StopEventually{}
%
% \changes{v2.6c}{2013/05/20}{Dummy file frenchb.cfg is no longer
@@ -1217,7 +1150,12 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\ifFBunicode}
+% Check LaTeX2e version (support for \pkg{ltkeys} required).
+% \begin{macrocode}
+\ifLaTeXe \NeedsTeXFormat{LaTeX2e}[2022/06/01] \fi
+% \end{macrocode}
+%
+%\begin{macro}{\ifFBunicode}
% \begin{macro}{\ifFBLuaTeX}
% \begin{macro}{\ifFBXeTeX}
% French hyphenation patterns are now coded in Unicode, see file
@@ -1460,8 +1398,8 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
%
% \begin{macro}{\FBsetspaces}
% This command makes it easy to fine tune |\FBguillspace|,
-% |\FBcolonspace| and |\FBthinspace| in French (defaut) or
-% independently in a French dialect using the optional argument.
+% |\FBcolonspace| and\linebreak |\FBthinspace| in French (defaut)
+% or independently in a French dialect using the optional argument.
% They are meant for LaTeX2e \emph{only} and can only be used
% in the preamble.
% Four mandatory arguments are expected besides the optional one:
@@ -1469,8 +1407,8 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
% "thin", the last four are decimal numbers specifying
% \textit{width}, \textit{stretch} and \textit{shrink} relative to
% \textit{fontdimens}.\hlabel{FBsetspaces}
-% For instance |\FBsetspaces[acadian]{colon}{0.5}{0}{0}| defines
-% |\acadianFBcolonspace| as a thinspace which will be used for
+% For \kern0pt instance |\FBsetspaces[acadian]{colon}{0.5}{0}{0}|
+% defines |\acadianFBcolonspace| as a thinspace which will be used for
% the Acadian dialect only. When used without optional argument or
% with argument `french’, the same command would tune the basic
% |\FBcolonspace| command.
@@ -1687,13 +1625,16 @@ Please report errors to: <daniel (dot) flipo (at) free (dot) fr>
with this version of LuaTeX!}
\fi
% \end{macrocode}
-% The next command will be used in the first call of |\extrasfrench|
-% to convert |\FBcolonspace|, |\FBthinspace| and |\FBguillspace|
-% into a table usable by LuaTeX. This way, any customisation done
-% in the preamble (by \fbsetup{}, redefinitions or |\FBsetspaces|
-% commands) are taken into account. Values not explicitly set for
-% Acadian by |\FBsetspaces[|\textit{acadian}|]| commands are copied
-% from the French ones.
+%
+% {\sloppy The next command will be used in the first call of
+% |\extrasfrench| to convert |\FBcolonspace|, |\FBthinspace| and
+% |\FBguillspace| into a table usable by LuaTeX.
+% This way, any customisation done in the preamble (by \fbsetup{},
+% redefinitions or |\FBsetspaces| commands) are taken into account.
+% Values not explicitly set for Acadian by
+% |\FBsetspaces[|\textit{acadian}|]| commands are copied from the
+% French ones.\par}
+
% In case parsing by the Lua function |FBget_glue| (defined in file
% \file{frenchb.lua}) fails due to unexpected syntax in |\FB...space|
% the table remains unchanged and a warning is issued.
@@ -2744,13 +2685,13 @@ return french_punctuation
% tex4ht, pointed out by MPG.}
%
% {\sloppypar |\autospace@beforeFDP| and |\noautospace@beforeFDP| are
-% internal commands. |\autospace@beforeFDP| defines |\FDP@thinspace|
-% and |\FDP@colonspace| as non-breaking spaces and sets LuaTeX
-% attribute |\FB@addDPspace| to 1 (true), while
-% |\noautospace@beforeFDP| lets these spaces empty and sets flag
+% internal commands. |\autospace@beforeFDP| defines commands
+% |\FDP@thinspace| and |\FDP@colonspace| as non-breaking spaces and
+% sets LuaTeX attribute |\FB@addDPspace| to 1 (true), while
+% |\noautospace@beforeFDP| makes them no-op and sets flag
% |\FB@addDPspace| to 0 (false). User commands |\AutoSpaceBeforeFDP|
% and |\NoAutoSpaceBeforeFDP| do the same and take care of the flag
-% |\ifFBAutoSpacePunctuation| in \LaTeX{}.\par}
+% |\ifFBAutoSpacePunctuation| in LaTeX{}.\par}
%
% Set the default now for Plain (done later for LaTeX).
% \begin{macrocode}
@@ -3600,64 +3541,41 @@ return french_punctuation
\providecommand*{\textbackslash}{{\char"005C}}
\providecommand*{\textasciicircum}{{\char"005E}}
\providecommand*{\textasciitilde}{{\char"007E}}
- \newcommand*{\FB@degre}{°}
+ \DeclareRobustCommand*{\degre}{°}
\else
- \ifLaTeXe
- \newcommand*{\FB@degre}{\r{}}
- \fi
+ \DeclareRobustCommand*{\degre}{\textdegree}
\fi
\DeclareRobustCommand*{\boi}{\textbackslash}
\DeclareRobustCommand*{\circonflexe}{\textasciicircum}
\DeclareRobustCommand*{\tild}{\textasciitilde}
-\DeclareRobustCommand*{\degre}{%
- \texorpdfstring{\FB@degre}{\textdegree}}
\newcommand*{\at}{@}
% \end{macrocode}
%
% \begin{macro}{\degres}
% We now define a macro |\degres| for typesetting the abbreviation
-% for `degrees’ (as in `degrees Celsius’). As the bounding box of
-% the character `degree’ has \emph{very} different widths in CM/EC
-% and PostScript fonts, we fix the width of the bounding box of
-% |\degres| to 0.3\,em, this lets the symbol `degree’ stick to the
-% preceding (e.g., |45\degres|) or following character
-% (e.g., |20~\degres C|). |\degres| works in math-mode (angles).
+% for `degrees’ (as in `°C’ or `°K’) in text fonts which also works
+% in math mode for angles.
%
% \changes{v2.6e}{2013/07/06}{Refrain from redefining \cs{textdegree}
% from latin1.def, applemac.def, etc. as \cs{degres} because it
% loops in hyperref’s bookmarks. Pointed out by Eddy Flas on fctt.}
%
-% If \TeX{} Companion fonts are available (\file{textcomp.sty}),
-% we pick up |\textdegree| from them instead of emulating `degrees’
-% from the |\r{}| accent. Otherwise we advise the user (once only)
-% to use TS1-encoding.
-%
% \changes{v2.1c}{2008/04/29}{Provide a temporary definition (hyperref
% safe) of \cs{degres} in case it has to be expanded in the preamble
% (by beamer’s \cs{title} command for instance).}
%
+% \changes{v3.6a}{2024/05/20}{Simplify \cs{degres} definition for text
+% and math mode: \cs{textdegree} always defined (TS1) since 2019.}
+%
% \begin{macrocode}
\DeclareRobustCommand*{\degres}{\degre}
\ifLaTeXe
\AtBeginDocument{%
- \@ifpackageloaded{fontspec}{}{%
- \ifdefined\DeclareEncodingSubset
- \DeclareRobustCommand*{\degres}{%
+ \@ifpackageloaded{fontspec}{}%
+ {\DeclareRobustCommand*{\degres}{%
\texorpdfstring{\hbox{\UseTextSymbol{TS1}{\textdegree}}}%
{\textdegree}}%
- \else
- \def\Warning@degree@TSone{\FBWarning
- {Degrees would look better in TS1-encoding:%
- \MessageBreak add \protect
- \usepackage{textcomp} to the preamble.%
- \MessageBreak Degrees used}}
- \DeclareRobustCommand*{\degres}{%
- \texorpdfstring{\hbox to 0.3em{\hss\degre\hss}%
- \Warning@degree@TSone
- \global\let\Warning@degree@TSone\relax}%
- {\textdegree}}%
- \fi
- }%
+ }%
}
\fi
% \end{macrocode}
@@ -4056,9 +3974,10 @@ return french_punctuation
% ua-thesis.cls… change it).
% If they are identical, \frenchb{} just adds a hook called
% |\FBCaption@Separator| to |\@makecaption|; |\FBCaption@Separator|
-% defaults to `:~’ as in the standard |\@makecaption| and will be
-% changed to `~:~’ in French `AtBeginDocument’; it can be also set to
-% |\CaptionSeparator| (` -- ’) using \fbo{CustomiseFigTabCaptions}.
+% defaults to `:~’ as in the standard definition of |\@makecaption|
+% and will be changed to `~:~’ in French `AtBeginDocument’;
+% it can be also set to |\CaptionSeparator| (` -- ’) using
+% \fbo{CustomiseFigTabCaptions}.
%
% \changes{v2.6c}{2013/05/18}{Former \cs{CaptionSeparator}
% has been renamed as \cs{FBCaption@Separator};
@@ -4076,7 +3995,7 @@ return french_punctuation
% active).
% \begin{macrocode}
\bgroup
- \catcode`:=12 \catcode`>=12 \relax
+ \catcode`: =12 \catcode`> =12 \relax
\long\gdef\STD@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{#1: #2}%
@@ -4256,7 +4175,7 @@ return french_punctuation
% with XeTeX and LuaTeX.
%
% \changes{v2.0}{2006/11/06}{Added special case for LY1 encoding,
-% see bug report from Bruno Voisin (2004/05/18).}
+% see bug report from Bruno Voisin (2004/05/18).}
%
% \changes{v2.5f}{2011/06/18}{Unicode fonts also provide a ready made
% character for \cs{textellipsis}, let’s just use it!
@@ -4345,7 +4264,7 @@ return french_punctuation
}
% \end{macrocode}
%
-% \subsection{Setup options: keyval stuff}
+% \subsection{Setup options: key/value stuff (ltkeys)}
% \label{ssec-keyval}
%
% \changes{v2.0}{2006/11/06}{New command \cs{frenchbsetup} added
@@ -4355,125 +4274,34 @@ return french_punctuation
% reorganised, now \cs{babel@save} and\cs{babel@savevariable} are
% usable for French.}
%
-% All setup options are handled by command \fbsetup{} using the
-% keyval syntax. A list of flags is defined and set to a default
-% value which will possibly be changed `AtEndOfPackage’ if French is
-% the main language. After this, \fbsetup{} eventually modifies the
-% preset values of these flags.
+% \changes{v3.6a}{2024/05/16}{Internal `ltkeys’ replaces package
+% `keyval’ for options’ management.}
+%
+% All setup options are handled by command \fbsetup{} based on
+% the \file{ltkeys}’ |\SetKeys{}| command. A list of flags is
+% defined beforehand and set to default values which will possibly
+% be changed `AtEndOfPackage’ in case French is the main language.
+% After this, \fbsetup{} eventually modifies the preset values of
+% these flags.
%
-% {\sloppypar Option processing can occur either in \fbsetup{}, but
-% \emph{only for options explicitly set} by \fbsetup{}, or
+% {\sloppypar Some options processing occurs in \fbsetup{},
+% \emph{only for options explicitly set} by \fbsetup{}, the rest
% `AtBeginDocument’; any option affecting |\extrasfrench{}|
-% \emph{must} be processed by \fbsetup{}: when French is the main
-% language, |\extrasfrench{}| is executed by \babel{} when it
-% switches the main language and this occurs \emph{before} reading
+% \emph{must} be immediatelt processed by \fbsetup{}: when French is
+% the main language, |\extrasfrench{}| is executed by \babel{} when
+% it switches the main language and this occurs \emph{before} reading
% the stuff postponed by \frenchb{} `AtBeginDocument’. Reexecuting
-% |\extrasfrench{}| is an option which was used up to v2.6h, it has
-% been dropped in v3.0a because of its side-effects (f.i.\
-% |\babel@save| and |\babel@savevariable| did not work for
+% |\extrasfrench{}| is not an option because of its side-effects
+% (f.i.\ |\babel@save| and |\babel@savevariable| did not work for
% French).\par}
%
-% \begin{macro}{\frenchsetup}
-% Let’s now define this command which reads and sets the options
-% to be processed either immediately (i.e.\ just after setting the
-% key) or later (at |\begin{document}|) by |\FBprocess@options|.
-% \fbsetup{} can only be called in the preamble.
-%
-% \changes{v2.0c}{2007/06/25}{Option ThinSpaceInFrenchNumbers added.}
-%
-% \changes{v2.0d}{2007/07/15}{Options og and fg changed: limit
-% the definition to French so that quote characters can be used
-% in German.}
-%
-% \changes{v2.0e}{2007/10/05}{New option: StandardLists.}
-%
-% \changes{v2.0f}{2008/03/23}{Two typos corrected in
-% option StandardLists.}
-%
-% \changes{v2.0f}{2008/03/23}{StandardLayout option had no
-% effect on lists. Test moved to \cs{FBprocess@options}.}
-%
-% \changes{v2.0g}{2008/03/23}{Revert previous change to
-% StandardLayout. This option must set the three flags
-% \cs{FBReduceListSpacingfalse}, \cs{FBCompactItemizefalse},
-% and \cs{FBStandardItemLabeltrue} instead of
-% \cs{FBStandardListstrue}, so that later options can still
-% change their value before executing \cs{FBprocess@options}.
-% Same thing for option StandardLists.}
-%
-% \changes{v2.1a}{2008/03/24}{New option: FrenchSuperscripts
-% to define \cs{up} as \cs{fup} or as \cs{textsuperscript}.}
-%
-% \changes{v2.1a}{2008/03/30}{New option: LowercaseSuperscripts.}
-%
-% \changes{v2.2a}{2008/05/08}{The global layout of the document is
-% no longer changed when frenchb is not the last option of babel
-% (\cs{bbl@main@language}). Suggested by Ulrike Fischer.}
-%
-% \changes{v2.2a}{2008/05/08}{Default values of flags changed:
-% default now means `StandardLayout’, they will be changed to
-% `FrenchLayout’ AtEndOfPackage only if french is
-% \cs{bbl@main@language}.}
-%
-% \changes{v2.2a}{2008/05/08}{When frenchb is babel’s last option,
-% French becomes the document’s main language, so
-% GlobalLayoutFrench applies.}
-%
-% \changes{v2.4a}{2009/11/23}{New option SuppressWarning.}
-%
-% \changes{v2.6a}{2013/01/30}{New options ListOldLayout,
-% StandardItemizeEnv and StandardEnumerateEnv (CompactItemize is
-% deprecated).}
-%
-% \changes{v3.0a}{2014/02/28}{New options OldFigTabCaptions and
-% CustomiseFigTabCaptions.}
-%
-% \changes{v3.0c}{2014/04/18}{New option INGuillSpace.}
-%
-% \changes{v3.1a}{2014/05/20}{New options InnerGuillSingle,
-% EveryParGuill and EveryLineGuill to control \cs{frquote}.}
-%
-% \changes{v3.1b}{2014/09/15}{New option SmallCapsFigTabCaptions.}
-%
-% \changes{v3.1e}{2015/04/10}{Corrected typo: SmallCapsFigTabcaptions
-% instead of SmallCapsFigTabCaptions. Pointed out by Céline
-% Chevalier.}
-%
-% \changes{v3.1g}{2015/05/10}{PartNameFull now just sets the flag,
-% nothing to add to \cs{captionsfrench} when false.}
-%
-% \changes{v3.3a}{2017/04/30}{\cs{frenchbsetup} is now an alias for
-% \cs{frenchsetup}.}
-%
-% \changes{v3.3a}{2017/04/30}{Options INGuillSpace, ThinColonSpace no
-% longer delayed AtBeginDocument.}
-%
-% \changes{v3.5a}{2018/07/04}{New option ListItemsAsPar for displaying
-% lists’ items ``as paragraphs’’.}
-%
-% \changes{v3.5d}{2019/01/24}{ReduceListSpacing option depreciated: see
-% StandardListSpacing.}
-%
-% \begin{macrocode}
-\newcommand*{\frenchsetup}[1]{%
- \setkeys{FB}{#1}%
-}%
-\@onlypreamble\frenchsetup
-% \end{macrocode}
-% Keep the former name |\frenchbsetup| working for compatibility.
-% \begin{macrocode}
-\let\frenchbsetup\frenchsetup
-\@onlypreamble\frenchbsetup
-% \end{macrocode}
-%
-% We define a collection of conditionals with their defaults
-% (true or false).
+% We first define a collection of conditionals and set their
+% defaults (true or false).
%
% \begin{macrocode}
\newif\ifFBShowOptions
\newif\ifFBStandardLayout \FBStandardLayouttrue
\newif\ifFBGlobalLayoutFrench \FBGlobalLayoutFrenchtrue
-\newif\ifFBReduceListSpacing
\newif\ifFBStandardListSpacing \FBStandardListSpacingtrue
\newif\ifFBListOldLayout
\newif\ifFBListItemsAsPar
@@ -4498,25 +4326,6 @@ return french_punctuation
\newif\ifFBINGuillSpace
% \end{macrocode}
%
-% The defaults values of these flags have been choosen so that
-% \frenchb{} does not change anything regarding the global layout.
-% |\bbl@main@language|, set by the last option of \babel, controls
-% the global layout of the document. `AtEndOfPackage’ we check the
-% main language in |\bbl@main@language|; if it is French (or a
-% French dialect) the values of some flags have to be changed to
-% ensure a French looking layout for the whole document (even in
-% parts written in languages other than French); the end-user will
-% then be able to customise the values of all these flags with
-% \fbsetup{}.
-%
-% \changes{v2.5b}{2010/10/30}{Do not use the
-% test \cs{iflanguage}\{french\} to check whether French is the
-% main language or not, as it might be be erroneously positive
-% when English is the main language and no hyphenation patterns
-% are available for French.
-% In this case \cs{l@french} and \cs{l@english} are 0.
-% Pointed out by Günter Milde.}
-%
% \changes{v3.1g}{2015/05/10}{Bug fix for koma-scripts classes:
% a spurious dot was added by the \cs{partformat} command.}
%
@@ -4540,6 +4349,14 @@ return french_punctuation
\fi
% \end{macrocode}
%
+% \changes{v2.5b}{2010/10/30}{Do not use the
+% test \cs{iflanguage}\{french\} to check whether French is the
+% main language or not, as it might be be erroneously positive
+% when English is the main language and no hyphenation patterns
+% are available for French.
+% In this case \cs{l@french} and \cs{l@english} are 0.
+% Pointed out by Günter Milde.}
+%
% \changes{v3.0c}{2014/03/30}{No list customisation when beamer
% class is loaded.}
%
@@ -4553,6 +4370,13 @@ return french_punctuation
% options can no longer be toggled when French is not the main
% language.}
%
+% The defaults values of these flags are choosen so that
+% \frenchb{} does not change anything regarding the global layout.
+% Some of them must be toogled when French (or a French dialect) is
+% the main language. The latter (last option of \babel, stored in
+% |\bbl@main@language|) will be known `AtEndOfPackage’.
+% So we postpone the |\bbl@main@language| checking until then.
+%
% Our list customisation conflicts with the \cls{beamer} class and
% with the \pkg{beamerarticle} package. The patch provided in
% \pkg{beamerbasecompatibility} solves the conflict except in case
@@ -4600,206 +4424,304 @@ return french_punctuation
\FBAutoSpaceFootnotestrue
\FBCustomiseFigTabCaptionstrue
\fi
+}
+% \end{macrocode}
+%
+% \begin{macro}{\frenchsetup}
+% Let’s define the keys to be used in \fbsetup{}.
+% \begin{macrocode}
+\DeclareKeys[FBsetup]
+ {
+ ShowOptions.if = FBShowOptions ,
+ StandardLayout.default:n = {true} ,
+ StandardLayout.code = \FBStandardLayout@setup{#1} ,
+ GlobalLayoutFrench.default:n = {true} ,
+ GlobalLayoutFrench.code = \FBGlobalLayout@setup{#1} ,
+ StandardListSpacing.if = FBStandardListSpacing ,
+ ReduceListSpacing.ifnot = FBStandardListSpacing ,
+ ListOldLayout.default:n = {true} ,
+ ListOldLayout.code = \FBListOldLayout@setup{#1} ,
+ CompactItemize.default:n = {true} ,
+ CompactItemize.code = \FBCompactItemize@setup{#1} ,
+ StandardItemizeEnv.if = FBStandardItemizeEnv ,
+ StandardEnumerateEnv.if = FBStandardEnumerateEnv ,
+ StandardItemLabels.if = FBStandardItemLabels ,
+ ItemLabels.store = \FrenchLabelItem ,
+ ItemLabeli.store = \Frlabelitemi ,
+ ItemLabelii.store = \Frlabelitemii ,
+ ItemLabeliii.store = \Frlabelitemiii ,
+ ItemLabeliv.store = \Frlabelitemiv ,
+ StandardLists.default:n = {true} ,
+ StandardLists.code = \FBStandardLists@setup{#1} ,
+ ListItemsAsPar.if = FBListItemsAsPar ,
+ IndentFirst.if = FBIndentFirst ,
+ FrenchFootnotes.if = FBFrenchFootnotes ,
+ AutoSpaceFootnotes.if = FBAutoSpaceFootnotes ,
+ AutoSpacePunctuation.if = FBAutoSpacePunctuation ,
+ OriginalTypewriter.if = FBOriginalTypewriter ,
+ ThinColonSpace.default:n = {true} ,
+ ThinColonSpace.code = \FBThinColonSpace@setup{#1} ,
+ ThinSpaceInFrenchNumbers.if = FBThinSpaceInFrenchNumbers ,
+ FrenchSuperscripts.if = FBFrenchSuperscripts ,
+ LowercaseSuperscripts.if = FBLowercaseSuperscripts ,
+ PartNameFull.if = FBPartNameFull ,
+ CustomiseFigTabCaptions.if = FBCustomiseFigTabCaptions ,
+ OldFigTabCaptions.default:n = {true} ,
+ OldFigTabCaptions.code = \FBOldFigTabCaptions@setup{#1} ,
+ SmallCapsFigTabCaptions.default:n = {true} ,
+ SmallCapsFigTabCaptions.code = \FBSmallCapsFigTabCaptions@setup{#1} ,
+ SuppressWarning.default:n = {true} ,
+ SuppressWarning.code = \FBSuppressWarning@setup{#1} ,
+ INGuillSpace.default:n = {true} ,
+ INGuillSpace.code = \FBINGuillSpace@setup{#1} ,
+ InnerGuillSingle.if = FBInnerGuillSingle ,
+ EveryParGuill.default:n = {open} ,
+ EveryParGuill.code = \FBEveryParGuill@setup{#1} ,
+ EveryLineGuill.default:n = {open} ,
+ EveryLineGuill.code = \FBEveryLineGuill@setup{#1} ,
+ UnicodeNoBreakSpaces.default:n = {true} ,
+ UnicodeNoBreakSpaces.code = \FBUnicodeNoBreakSpaces@setup{#1} ,
+ og.code = \FBog@setup{#1} ,
+ fg.code = \FBfg@setup{#1} ,
+}
% \end{macrocode}
-% \frenchb{} being an option of \babel, it cannot load a package
-% (\pkg{keyval}) while \file{french.ldf} is read, so we defer the
-% loading of \file{keyval} and the options setup at the end of
-% \babel’s loading.
+%
+% Let’s now define this command which reads and sets the options
+% to be processed either immediately (i.e.\ just after setting the
+% key) or later (at |\begin{document}|) by |\FBprocess@options|.
+% \fbsetup{} can only be called in the preamble.
+%
+% \changes{v2.0c}{2007/06/25}{Option ThinSpaceInFrenchNumbers added.}
+%
+% \changes{v2.0d}{2007/07/15}{Options og and fg changed: limit
+% the definition to French so that quote characters can be used
+% in German.}
+%
+% \changes{v2.0e}{2007/10/05}{New option: StandardLists.}
+%
+% \changes{v2.0f}{2008/03/23}{Two typos corrected in
+% option StandardLists.}
+%
+% \changes{v2.0f}{2008/03/23}{StandardLayout option had no
+% effect on lists. Test moved to \cs{FBprocess@options}.}
+%
+% \changes{v2.0g}{2008/03/23}{Revert previous change to
+% StandardLayout. This option must set the three flags
+% \cs{FBReduceListSpacingfalse}, \cs{FBCompactItemizefalse},
+% and \cs{FBStandardItemLabeltrue} instead of
+% \cs{FBStandardListstrue}, so that later options can still
+% change their value before executing \cs{FBprocess@options}.
+% Same thing for option StandardLists.}
+%
+% \changes{v2.1a}{2008/03/24}{New option: FrenchSuperscripts
+% to define \cs{up} as \cs{fup} or as \cs{textsuperscript}.}
+%
+% \changes{v2.1a}{2008/03/30}{New option: LowercaseSuperscripts.}
+%
+% \changes{v2.2a}{2008/05/08}{The global layout of the document is
+% no longer changed when frenchb is not the last option of babel
+% (\cs{bbl@main@language}). Suggested by Ulrike Fischer.}
+%
+% \changes{v2.2a}{2008/05/08}{Default values of flags changed:
+% default now means `StandardLayout’, they will be changed to
+% `FrenchLayout’ AtEndOfPackage only if french is
+% \cs{bbl@main@language}.}
+%
+% \changes{v2.2a}{2008/05/08}{When frenchb is babel’s last option,
+% French becomes the document’s main language, so
+% GlobalLayoutFrench applies.}
+%
+% \changes{v2.4a}{2009/11/23}{New option SuppressWarning.}
+%
+% \changes{v2.6a}{2013/01/30}{New options ListOldLayout,
+% StandardItemizeEnv and StandardEnumerateEnv (CompactItemize is
+% deprecated).}
+%
+% \changes{v3.0a}{2014/02/28}{New options OldFigTabCaptions and
+% CustomiseFigTabCaptions.}
+%
+% \changes{v3.0c}{2014/04/18}{New option INGuillSpace.}
+%
+% \changes{v3.1a}{2014/05/20}{New options InnerGuillSingle,
+% EveryParGuill and EveryLineGuill to control \cs{frquote}.}
+%
+% \changes{v3.1b}{2014/09/15}{New option SmallCapsFigTabCaptions.}
+%
+% \changes{v3.1e}{2015/04/10}{Corrected typo: SmallCapsFigTabcaptions
+% instead of SmallCapsFigTabCaptions. Pointed out by Céline
+% Chevalier.}
+%
+% \changes{v3.1g}{2015/05/10}{PartNameFull now just sets the flag,
+% nothing to add to \cs{captionsfrench} when false.}
+%
+% \changes{v3.3a}{2017/04/30}{\cs{frenchbsetup} is now an alias for
+% \cs{frenchsetup}.}
+%
+% \changes{v3.3a}{2017/04/30}{Options INGuillSpace, ThinColonSpace no
+% longer delayed AtBeginDocument.}
+%
+% \changes{v3.5a}{2018/07/04}{New option ListItemsAsPar for displaying
+% lists’ items ``as paragraphs’’.}
+%
+% \changes{v3.5d}{2019/01/24}{ReduceListSpacing option depreciated: see
+% StandardListSpacing.}
+%
% \begin{macrocode}
- \RequirePackage{keyval}%
- \define@key{FB}{ShowOptions}[true]%
- {\csname FBShowOptions#1\endcsname}%
+\newcommand*{\frenchsetup}[1]{%
+ \SetKeys[FBsetup]{#1}%
+}%
+\@onlypreamble\frenchsetup
% \end{macrocode}
-% The next two keys can only be toggled when French is the main
-% language.
+% Keep the former name |\frenchbsetup| working for compatibility.
% \begin{macrocode}
- \define@key{FB}{StandardLayout}[true]%
- {\ifFB@mainlanguage@FR
- \csname FBStandardLayout#1\endcsname
- \else
- \PackageWarning{french.ldf}%
- {Option `StandardLayout' skipped:\MessageBreak
- French is *not* babel's last option.\MessageBreak
- Reported}%
- \fi
- \ifFBStandardLayout
- \FBStandardListSpacingtrue
- \FBStandardItemizeEnvtrue
- \FBStandardItemLabelstrue
- \FBStandardEnumerateEnvtrue
- \FBIndentFirstfalse
- \FBFrenchFootnotesfalse
- \FBAutoSpaceFootnotesfalse
- \else
- \FBStandardListSpacingfalse
- \FBStandardItemizeEnvfalse
- \FBStandardItemLabelsfalse
- \FBStandardEnumerateEnvfalse
- \FBIndentFirsttrue
- \FBFrenchFootnotestrue
- \FBAutoSpaceFootnotestrue
- \fi}%
- \define@key{FB}{GlobalLayoutFrench}[true]%
- {\ifFB@mainlanguage@FR
- \csname FBGlobalLayoutFrench#1\endcsname
- \else
- \PackageWarning{french.ldf}%
- {Option `GlobalLayoutFrench' skipped:\MessageBreak
- French is *not* babel's last option.\MessageBreak
- Reported}%
- \fi}%
+\let\frenchbsetup\frenchsetup
+\@onlypreamble\frenchbsetup
% \end{macrocode}
-% If this key is set to \fbo{true} when French is the main language,
-% nothing to do: all flags keep their default value.
-% If this key is set to \fbo{false}, nothing to do either:
-% |\babel@save| will do the job at every language’s switch.
-% \begin{macrocode}
- \define@key{FB}{ReduceListSpacing}[true]%
- {\csname FBReduceListSpacing#1\endcsname
- \ifFBReduceListSpacing \FBStandardListSpacingfalse
- \else \FBStandardListSpacingtrue\fi
- }%
- \define@key{FB}{StandardListSpacing}[true]%
- {\csname FBStandardListSpacing#1\endcsname}%
- \define@key{FB}{ListOldLayout}[true]%
- {\csname FBListOldLayout#1\endcsname
- \ifFBListOldLayout
- \FBStandardEnumerateEnvtrue
- \renewcommand*{\FrenchLabelItem}{\textendash}%
- \fi}%
- \define@key{FB}{CompactItemize}[true]%
- {\csname FBCompactItemize#1\endcsname
- \ifFBCompactItemize
- \FBStandardItemizeEnvfalse
- \FBStandardEnumerateEnvfalse
- \else
- \FBStandardItemizeEnvtrue
- \FBStandardEnumerateEnvtrue
- \fi}%
- \define@key{FB}{StandardItemizeEnv}[true]%
- {\csname FBStandardItemizeEnv#1\endcsname}%
- \define@key{FB}{StandardEnumerateEnv}[true]%
- {\csname FBStandardEnumerateEnv#1\endcsname}%
- \define@key{FB}{StandardItemLabels}[true]%
- {\csname FBStandardItemLabels#1\endcsname}%
- \define@key{FB}{ItemLabels}%
- {\renewcommand*{\FrenchLabelItem}{#1}}%
- \define@key{FB}{ItemLabeli}%
- {\renewcommand*{\Frlabelitemi}{#1}}%
- \define@key{FB}{ItemLabelii}%
- {\renewcommand*{\Frlabelitemii}{#1}}%
- \define@key{FB}{ItemLabeliii}%
- {\renewcommand*{\Frlabelitemiii}{#1}}%
- \define@key{FB}{ItemLabeliv}%
- {\renewcommand*{\Frlabelitemiv}{#1}}%
- \define@key{FB}{StandardLists}[true]%
- {\csname FBStandardLists#1\endcsname
- \ifFBStandardLists
- \FBStandardListSpacingtrue
- \FBStandardItemizeEnvtrue
- \FBStandardEnumerateEnvtrue
- \FBStandardItemLabelstrue
- \else
- \FBStandardListSpacingfalse
- \FBStandardItemizeEnvfalse
- \FBStandardEnumerateEnvfalse
- \FBStandardItemLabelsfalse
- \fi}%
- \define@key{FB}{ListItemsAsPar}[true]%
- {\csname FBListItemsAsPar#1\endcsname}
- \define@key{FB}{IndentFirst}[true]%
- {\csname FBIndentFirst#1\endcsname}%
- \define@key{FB}{FrenchFootnotes}[true]%
- {\csname FBFrenchFootnotes#1\endcsname}%
- \define@key{FB}{AutoSpaceFootnotes}[true]%
- {\csname FBAutoSpaceFootnotes#1\endcsname}%
- \define@key{FB}{AutoSpacePunctuation}[true]%
- {\csname FBAutoSpacePunctuation#1\endcsname}%
- \define@key{FB}{OriginalTypewriter}[true]%
- {\csname FBOriginalTypewriter#1\endcsname}%
- \define@key{FB}{ThinColonSpace}[true]%
- {\csname FBThinColonSpace#1\endcsname
- \ifFBThinColonSpace
- \renewcommand*{\FBcolonspace}{\FBthinspace}%
- \fi}%
- \define@key{FB}{ThinSpaceInFrenchNumbers}[true]%
- {\csname FBThinSpaceInFrenchNumbers#1\endcsname}%
- \define@key{FB}{FrenchSuperscripts}[true]%
- {\csname FBFrenchSuperscripts#1\endcsname}
- \define@key{FB}{LowercaseSuperscripts}[true]%
- {\csname FBLowercaseSuperscripts#1\endcsname}
- \define@key{FB}{PartNameFull}[true]%
- {\csname FBPartNameFull#1\endcsname}%
- \define@key{FB}{CustomiseFigTabCaptions}[true]%
- {\csname FBCustomiseFigTabCaptions#1\endcsname}%
- \define@key{FB}{OldFigTabCaptions}[true]%
- {\csname FBOldFigTabCaptions#1\endcsname
- \ifFBOldFigTabCaptions
- \def\FB@capsep@fix{\babel@save\FBCaption@Separator
- \def\FBCaption@Separator{\CaptionSeparator}}%
+%
+% The following commands, defined with property |.code| in
+% |DeclareKeys{}|, execute some post-treatment required to
+% immediately take the flags value into account.
+% \begin{macrocode}
+\newcommand*{\FBStandardLayout@setup}[1]%
+ {\ifFB@mainlanguage@FR
+ \csname FBStandardLayout#1\endcsname
+ \else
+ \PackageWarning{french.ldf}%
+ {Option `StandardLayout' skipped:\MessageBreak
+ French is *not* babel's last option.\MessageBreak
+ Reported}%
+ \fi
+ \ifFBStandardLayout
+ \FBStandardListSpacingtrue
+ \FBStandardItemizeEnvtrue
+ \FBStandardItemLabelstrue
+ \FBStandardEnumerateEnvtrue
+ \FBIndentFirstfalse
+ \FBFrenchFootnotesfalse
+ \FBAutoSpaceFootnotesfalse
+ \else
+ \FBStandardListSpacingfalse
+ \FBStandardItemizeEnvfalse
+ \FBStandardItemLabelsfalse
+ \FBStandardEnumerateEnvfalse
+ \FBIndentFirsttrue
+ \FBFrenchFootnotestrue
+ \FBAutoSpaceFootnotestrue
+ \fi
+ }
+\newcommand*{\FBGlobalLayout@setup}[1]%
+ {\ifFB@mainlanguage@FR
+ \csname FBGlobalLayoutFrench#1\endcsname
+ \else
+ \PackageWarning{french.ldf}%
+ {Option `GlobalLayoutFrench' skipped:\MessageBreak
+ French is *not* babel's last option.\MessageBreak
+ Reported}%
+ \fi
+ }
+\newcommand*{\FB@ListOldLayout@setup}[1]%
+ {\csname FBListOldLayout#1\endcsname
+ \ifFBListOldLayout
+ \FBStandardEnumerateEnvtrue
+ \renewcommand*{\FrenchLabelItem}{\textendash}%
+ \fi
+ }
+\newcommand*{\FB@CompactItemize@setup}[1]%
+ {\csname FBCompactItemize#1\endcsname
+ \ifFBCompactItemize
+ \FBStandardItemizeEnvfalse
+ \FBStandardEnumerateEnvfalse
+ \else
+ \FBStandardItemizeEnvtrue
+ \FBStandardEnumerateEnvtrue
+ \fi
+ }
+\newcommand*{\FBStandardLists@setup}[1]%
+ {\csname FBStandardLists#1\endcsname
+ \ifFBStandardLists
+ \FBStandardListSpacingtrue
+ \FBStandardItemizeEnvtrue
+ \FBStandardEnumerateEnvtrue
+ \FBStandardItemLabelstrue
+ \else
+ \FBStandardListSpacingfalse
+ \FBStandardItemizeEnvfalse
+ \FBStandardEnumerateEnvfalse
+ \FBStandardItemLabelsfalse
+ \fi
+ }
+\newcommand*{\FBThinColonSpace@setup}[1]%
+ {\csname FBThinColonSpace#1\endcsname
+ \ifFBThinColonSpace
+ \renewcommand*{\FBcolonspace}{\FBthinspace}%
+ \fi
+ }
+\newcommand*{\FBOldFigTabCaptions@setup}[1]%
+ {\csname FBOldFigTabCaptions#1\endcsname
+ \ifFBOldFigTabCaptions
+ \def\FB@capsep@fix{\babel@save\FBCaption@Separator
+ \def\FBCaption@Separator{\CaptionSeparator}}%
\addto\extrasfrench{\FB@capsep@fix}%
\ifdefined\extrasacadian
\addto\extrasacadian{\FB@capsep@fix}%
\fi
- \fi}%
- \define@key{FB}{SmallCapsFigTabCaptions}[true]%
- {\csname FBSmallCapsFigTabCaptions#1\endcsname
- \ifFBSmallCapsFigTabCaptions
- \else \let\FBfigtabshape\relax \fi}%
- \define@key{FB}{SuppressWarning}[true]%
- {\csname FBSuppressWarning#1\endcsname
- \ifFBSuppressWarning
- \renewcommand{\FBWarning}[1]{}%
- \fi}%
-% \end{macrocode}
-% Here are the options controlling French guillemets spacing
-% and the output of |\frquote{}|.
-%
-% \changes{v3.2g}{2017/01/30}{Warn when wrong values are provided to
-% options EveryParGuill or EveryLineGuill.}
-%
-% \begin{macrocode}
- \define@key{FB}{INGuillSpace}[true]%
- {\csname FBINGuillSpace#1\endcsname
- \ifFBINGuillSpace
- \renewcommand*{\FBguillspace}{\space}%
- \fi}%
- \define@key{FB}{InnerGuillSingle}[true]%
- {\csname FBInnerGuillSingle#1\endcsname}%
- \define@key{FB}{EveryParGuill}[open]%
- {\expandafter\let\expandafter
- \FBeveryparguill\csname FBguill#1\endcsname
- \ifx\FBeveryparguill\FBguillopen
- \else\ifx\FBeveryparguill\FBguillclose
- \else\ifx\FBeveryparguill\FBguillnone
- \else
- \let\FBeveryparguill\FBguillopen
- \FBWarning{Wrong value for `EveryParGuill':
- try `open',\MessageBreak
- `close' or `none'. Reported}%
- \fi
- \fi
- \fi}%
- \define@key{FB}{EveryLineGuill}[open]%
- {\ifFB@luatex@punct
- \expandafter\let\expandafter
- \FBeverylineguill\csname FBguill#1\endcsname
- \ifx\FBeverylineguill\FBguillopen
- \else\ifx\FBeverylineguill\FBguillclose
- \else\ifx\FBeverylineguill\FBguillnone
- \else
- \let\FBeverylineguill\FBguillnone
- \FBWarning{Wrong value for `EveryLineGuill':
- try `open',\MessageBreak
- `close' or `none'. Reported}%
- \fi
- \fi
- \fi
- \else
- \FBWarning{Option `EveryLineGuill' skipped:%
- \MessageBreak this option is for
- LuaTeX *only*.\MessageBreak Reported}%
- \fi}%
+ \fi
+ }
+\newcommand*{\FBSmallCapsFigTabCaptions@setup}[1]%
+ {\csname FBSmallCapsFigTabCaptions#1\endcsname
+ \ifFBSmallCapsFigTabCaptions
+ \else
+ \let\FBfigtabshape\relax
+ \fi
+ }
+\newcommand*{\FBSuppressWarning@setup}[1]%
+ {\csname FBSuppressWarning#1\endcsname
+ \ifFBSuppressWarning
+ \renewcommand{\FBWarning}[1]{}%
+ \fi
+ }
+\newcommand*{\FBINGuillSpace@setup}[1]%
+ {\csname FBINGuillSpace#1\endcsname
+ \ifFBINGuillSpace
+ \renewcommand*{\FBguillspace}{\space}%
+ \fi
+ }
+\newcommand*{\FBEveryParGuill@setup}[1]%
+ {\expandafter\let\expandafter
+ \FBeveryparguill\csname FBguill#1\endcsname
+ \ifx\FBeveryparguill\FBguillopen
+ \else\ifx\FBeveryparguill\FBguillclose
+ \else\ifx\FBeveryparguill\FBguillnone
+ \else
+ \let\FBeveryparguill\FBguillopen
+ \FBWarning{Wrong value for `EveryParGuill':
+ try `open',\MessageBreak
+ `close' or `none'. Reported}%
+ \fi
+ \fi
+ \fi
+ }
+\newcommand*{\FBEveryLineGuill@setup}[1]%
+ {\ifFB@luatex@punct
+ \expandafter\let\expandafter
+ \FBeverylineguill\csname FBguill#1\endcsname
+ \ifx\FBeverylineguill\FBguillopen
+ \else\ifx\FBeverylineguill\FBguillclose
+ \else\ifx\FBeverylineguill\FBguillnone
+ \else
+ \let\FBeverylineguill\FBguillnone
+ \FBWarning{Wrong value for `EveryLineGuill':
+ try `open',\MessageBreak
+ `close' or `none'. Reported}%
+ \fi
+ \fi
+ \fi
+ \else
+ \FBWarning{Option `EveryLineGuill' skipped:%
+ \MessageBreak this option is for
+ LuaTeX *only*.\MessageBreak Reported}%
+ \fi
+ }
% \end{macrocode}
%
% \changes{v3.3c}{2017/07/23}{New option `UnicodeNoBreakSpaces’ for
@@ -4807,20 +4729,21 @@ return french_punctuation
%
% Option \fbo{UnicodeNoBreakSpaces} (LuaLaTeX only) is meant for
% HTML translators: when true, all non-breaking spaces added by
-% \frenchb{} are coded in the PDF file as Unicode characters, namely
-% U+A0 or U+202F, instead of penalties and glues.
+% \frenchb{} are coded in the PDF file as Unicode characters,
+% namely U+A0 or U+202F, instead of penalties and glues.
% \begin{macrocode}
- \define@key{FB}{UnicodeNoBreakSpaces}[true]%
- {\ifFB@luatex@punct
- \csname FBucsNBSP#1\endcsname
- \ifFBucsNBSP \FB@ucsNBSP=\@ne \fi
- \else
- \FBWarning{Option `UnicodeNoBreakSpaces' skipped:%
- \MessageBreak this option is for
- LuaTeX *only*.\MessageBreak Reported}%
- \fi
- }%
+\newcommand*{\FBUnicodeNoBreakSpaces@setup}[1]%
+ {\ifFB@luatex@punct
+ \csname FBucsNBSP#1\endcsname
+ \ifFBucsNBSP \FB@ucsNBSP=\@ne \fi
+ \else
+ \FBWarning{Option `UnicodeNoBreakSpaces' skipped:%
+ \MessageBreak this option is for
+ LuaTeX *only*.\MessageBreak Reported}%
+ \fi
+ }%
% \end{macrocode}
+%
% Inputing French quotes as \emph{single characters} when they are
% available on the keyboard (through a compose key for instance)
% is more comfortable than typing |\og| and |\fg|.
@@ -4861,145 +4784,145 @@ return french_punctuation
% it can be single-byte (latin1, latin9, applemac,…) or
% multi-bytes (utf-8, utf8x); the next command is meant for checking
% whether a character is single-byte (|\FB@second| is empty) or not.
-% \begin{macrocode}
- \def\FB@parse#1#2\endparse{\def\FB@second{#2}}%
-% \end{macrocode}
%
% \begin{macrocode}
- \define@key{FB}{og}%
- {\ifFBunicode
+\def\FB@parse#1#2\endparse{\def\FB@second{#2}}%
+\newcommand*{\FB@@og}%
+ {\ifFBfrench
+ \ifFB@spacing \FB@og\ignorespaces
+ \else \guillemotleft
+ \fi
+ \else \guillemotleft
+ \fi
+ }
+\newcommand*{\FB@@fg}%
+ {\ifFBfrench
+ \ifFB@spacing \FB@fg
+ \else \guillemotright
+ \fi
+ \else \guillemotright
+ \fi
+ }
+\newcommand*{\FBog@setup}[1]%
+ {\ifFBunicode
% \end{macrocode}
% LuaTeX or XeTeX in use, first try modern LuaTeX: we just need
% to set LuaTeX’s attribute |\FB@addGUILspace| to 1,
% \begin{macrocode}
- \ifFB@luatex@punct
- \FB@addGUILspace=1 \relax
- \fi
+ \ifFB@luatex@punct
+ \FB@addGUILspace=1 \relax
+ \fi
% \end{macrocode}
% then with XeTeX it is a bit more tricky:
% \begin{macrocode}
- \ifFB@xetex@punct
+ \ifFB@xetex@punct
% \end{macrocode}
% |\XeTeXinterchartokenstate| is defined, we just need to set
% |\XeTeXcharclass| to |\FB@guilo| for the French opening quote
% in T1 and Unicode encoding (see subsection~\ref{ssec-punct}).
% \begin{macrocode}
- \XeTeXcharclass"13 = \FB@guilo
- \XeTeXcharclass"AB = \FB@guilo
- \XeTeXcharclass"A0 = \FB@guilnul
- \XeTeXcharclass"202F = \FB@guilnul
- \fi
+ \XeTeXcharclass"13 = \FB@guilo
+ \XeTeXcharclass"AB = \FB@guilo
+ \XeTeXcharclass"A0 = \FB@guilnul
+ \XeTeXcharclass"202F = \FB@guilnul
+ \fi
% \end{macrocode}
% Issue a warning with older Unicode engines requiring active
% characters.
% \begin{macrocode}
- \ifFB@active@punct
- \FBWarning{Option og=« not supported with this version
- of\MessageBreak LuaTeX/XeTeX; reported}%
- \fi
- \else
+ \ifFB@active@punct
+ \FBWarning{Option og=« not supported with this version of
+ \MessageBreak LuaTeX/XeTeX; reported}% »
+ \fi
+ \else
% \end{macrocode}
% This is for conventional TeX engines:
% \begin{macrocode}
- \newcommand*{\FB@@og}{%
- \ifFBfrench
- \ifFB@spacing\FB@og\ignorespaces
- \else\guillemotleft
- \fi
- \else\guillemotleft\fi}%
- \AtBeginDocument{%
- \ifdefined\uc@dclc
+ \AtBeginDocument{%
+ \ifdefined\uc@dclc
% \end{macrocode}
% Package \pkg{inputenc} with utf8x (ucs) encoding loaded,
% use |\uc@dclc|:
% \begin{macrocode}
- \uc@dclc{171}{default}{\FB@@og}%
- \else
+ \uc@dclc{171}{default}{\FB@@og}%
+ \else
% \end{macrocode}
% if encoding is not utf8x, check if the argument of |og|
% is a single-byte character:
% \begin{macrocode}
- \FB@parse#1\endparse
- \ifx\FB@second\@empty
+ \FB@parse#1\endparse
+ \ifx\FB@second\@empty
% \end{macrocode}
% This means 8-bit character encoding.
% Package \pkg{MULEenc} (from CJK) defines |\mule@def|
% to map characters to control sequences.
% \begin{macrocode}
- \ifdefined\mule@def
- \mule@def{11}{\FB@@og}%
- \else
- \ifdefined\DeclareInputText
- \@tempcnta`#1\relax
- \DeclareInputText{\the\@tempcnta}{\FB@@og}%
- \else
+ \ifdefined\mule@def
+ \mule@def{11}{\FB@@og}%
+ \else
+ \ifdefined\DeclareInputText
+ \@tempcnta`#1\relax
+ \DeclareInputText{\the\@tempcnta}{\FB@@og}%
+ \else
% \end{macrocode}
% Package \pkg{inputenc} not loaded, no way…
% \begin{macrocode}
- \FBWarning{Option `og' requires package
- inputenc;\MessageBreak reported}%
- \fi
- \fi
- \else
+ \FBWarning{Option `og' requires package
+ inputenc;\MessageBreak reported}%
+ \fi
+ \fi
+ \else
% \end{macrocode}
% This means multi-byte character encoding, we assume UTF-8
% \begin{macrocode}
- \DeclareUnicodeCharacter{00AB}{\FB@@og}%
- \fi
- \fi}%
- \fi
- }%
+ \DeclareUnicodeCharacter{00AB}{\FB@@og}%
+ \fi
+ \fi}%
+ \fi
+ }
% \end{macrocode}
%
% Same code for the closing quote.
% \begin{macrocode}
- \define@key{FB}{fg}%
- {\ifFBunicode
- \ifFB@luatex@punct
- \FB@addGUILspace=1 \relax
- \fi
- \ifFB@xetex@punct
- \XeTeXcharclass"14 = \FB@guilf
- \XeTeXcharclass"BB = \FB@guilf
- \XeTeXcharclass"A0 = \FB@guilnul
- \XeTeXcharclass"202F = \FB@guilnul
- \fi
- \ifFB@active@punct
- \FBWarning{Option fg=» not supported with this version
- of\MessageBreak LuaTeX/XeTeX; reported}%
- \fi
- \else
- \newcommand*{\FB@@fg}{%
- \ifFBfrench
- \ifFB@spacing\FB@fg
- \else\guillemotright
- \fi
- \else\guillemotright\fi}%
- \AtBeginDocument{%
- \ifdefined\uc@dclc
- \uc@dclc{187}{default}{\FB@@fg}%
- \else
- \FB@parse#1\endparse
- \ifx\FB@second\@empty
- \ifdefined\mule@def
- \mule@def{27}{{\FB@@fg}}%
- \else
- \ifdefined\DeclareInputText
- \@tempcnta`#1\relax
- \DeclareInputText{\the\@tempcnta}{\FB@@fg}%
- \else
- \FBWarning{Option `fg' requires package
- inputenc;\MessageBreak reported}%
- \fi
- \fi
- \else
- \DeclareUnicodeCharacter{00BB}{\FB@@fg}%
- \fi
- \fi}%
- \fi
- }%
-}
-% \end{macrocode}
+\newcommand*{\FBfg@setup}[1]%
+ {\ifFBunicode
+ \ifFB@luatex@punct
+ \FB@addGUILspace=1 \relax
+ \fi
+ \ifFB@xetex@punct
+ \XeTeXcharclass"14 = \FB@guilf
+ \XeTeXcharclass"BB = \FB@guilf
+ \XeTeXcharclass"A0 = \FB@guilnul
+ \XeTeXcharclass"202F = \FB@guilnul
+ \fi
+ \ifFB@active@punct
+ \FBWarning{Option fg=» not supported with this version of
+ \MessageBreak LuaTeX/XeTeX; reported}%
+ \fi
+ \else
+ \AtBeginDocument{%
+ \ifdefined\uc@dclc
+ \uc@dclc{187}{default}{\FB@@fg}%
+ \else
+ \FB@parse#1\endparse
+ \ifx\FB@second\@empty
+ \ifdefined\mule@def
+ \mule@def{27}{{\FB@@fg}}%
+ \else
+ \ifdefined\DeclareInputText
+ \@tempcnta`#1\relax
+ \DeclareInputText{\the\@tempcnta}{\FB@@fg}%
+ \else
+ \FBWarning{Option `fg' requires package
+ inputenc;\MessageBreak reported}%
+ \fi
+ \fi
+ \else
+ \DeclareUnicodeCharacter{00BB}{\FB@@fg}%
+ \fi
+ \fi}%
+ \fi
+ }
% \end{macro}
%
% \begin{macro}{\FBprocess@options}
@@ -5113,8 +5036,8 @@ return french_punctuation
%
% When package \pkg{numprint} is loaded with option
% \opt{autolanguage}, \pkg{numprint}’s command |\npstylefrench| has
-% to be redefined differently according to the value of flag
-% \fbo{ThinSpaceInFrenchNumbers}.
+% to be redefined differently according to the value of
+% flag\linebreak \fbo{ThinSpaceInFrenchNumbers}.
% As |\npstylefrench| was undefined in old versions of
% \pkg{numprint}, we provide this command.
% \begin{macrocode}
@@ -5122,17 +5045,16 @@ return french_punctuation
{\ifnprt@autolanguage
\providecommand*{\npstylefrench}{}%
\ifFBThinSpaceInFrenchNumbers
- \renewcommand*{\FBthousandsep}{\,}%
+ \renewcommand*{\FBthousandsep}{\FBthinspace}%
\fi
\g@addto@macro\npstylefrench{\npthousandsep{\FBthousandsep}}%
\fi
}{}%
% \end{macrocode}
% \fbo{FrenchSuperscripts}: if \fbo{true} |\up=\fup|, else
-% |\up=\textsuperscript|. Anyway |\up*=\FB@up@fake|. The star-form
-% |\up*{}| is provided for fonts that lack some superior letters:
-% Adobe Jenson Pro and Utopia Expert have no ``g superior’’ for
-% instance.
+% |\up=\textsuperscript|. The star-form |\up*=\FB@up@fake| is
+% provided for fonts that lack some superior letters: Adobe Jenson
+% Pro and Utopia Expert have no ``g superior’’ for instance.
% \begin{macrocode}
\ifFBFrenchSuperscripts
\DeclareRobustCommand*{\up}{%
@@ -5275,9 +5197,8 @@ return french_punctuation
% Reported by Sébastien Gouezel.}
%
% At |\begin{document}|, we have to provide an |\xspace| command
-% in case the \pkg{xspace} package is not loaded, do some setup for
-% \file{hyperref}’s bookmarks, execute |\FBprocess@options|, switch
-% LuaTeX punctuation on and issue some warnings if necessary.
+% in case the \pkg{xspace} package is not loaded and execute
+% |\FBprocess@options|.
% \begin{macrocode}
\AtBeginDocument{%
\providecommand*{\xspace}{\relax}%
@@ -5426,13 +5347,14 @@ return french_punctuation
% \begin{macro}{\Frlabelitemii}
% \begin{macro}{\Frlabelitemiii}
% \begin{macro}{\Frlabelitemiv}
-% Default labels for French itemize-lists (same label for all levels):
+% Default labels for French itemize-lists ---same label for all
+% levels---, (already defined as empty by |\DeclareKey{}|):
% \begin{macrocode}
-\newcommand*{\FrenchLabelItem}{\textemdash}
-\newcommand*{\Frlabelitemi}{\FrenchLabelItem}
-\newcommand*{\Frlabelitemii}{\FrenchLabelItem}
-\newcommand*{\Frlabelitemiii}{\FrenchLabelItem}
-\newcommand*{\Frlabelitemiv}{\FrenchLabelItem}
+\renewcommand*{\FrenchLabelItem}{\textemdash}
+\renewcommand*{\Frlabelitemi}{\FrenchLabelItem}
+\renewcommand*{\Frlabelitemii}{\FrenchLabelItem}
+\renewcommand*{\Frlabelitemiii}{\FrenchLabelItem}
+\renewcommand*{\Frlabelitemiv}{\FrenchLabelItem}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -5444,14 +5366,14 @@ return french_punctuation
% \begin{macro}{\descindentFB}
% \begin{macro}{\labelindentFB}
% \begin{macro}{\labelwidthFB}
-% Let’s define four dimens |\listindentFB|, |\descindentFB|,
+% {\sloppy Let’s define four dimens |\listindentFB|, |\descindentFB|,
% |\labelindentFB| and |\labelwidthFB| to customise lists’ horizontal
% indentations.
% They are given silly negative values here in order to eventually
% enable their customisation in the preamble. They will get
% reasonnable defaults later when entering French (see
% |\setlabelitemsFB| and |\setlistindentFB|) unless they have been
-% customised.
+% customised.\par}
% \begin{macrocode}
\newdimen\listindentFB
\setlength{\listindentFB}{-1pt}
@@ -5784,20 +5706,6 @@ return french_punctuation
% \changes{v2.0}{2006/11/06}{Footnotes are now printed
% by default `à la française’ for the whole document.}
%
-% \changes{v2.0b}{2007/04/18}{Footnotes: Just do nothing
-% (except warning) when the bigfoot package is loaded.}
-%
-% \changes{v3.5s}{2024/01/05}{Footnotes: no customising of
-% \cs{@footnotetext} when the footnotebackref package is loaded.
-% Just warn the user.}
-%
-% The \pkg{bigfoot} package deeply changes the way footnotes are
-% handled. When \file{bigfoot} is loaded, we just warn the user
-% that \frenchb{} will not customise footnotes at all.
-% When the \pkg{footnotebackref} package is loaded, \frenchb{}
-% will not customise |\@footnotetext| in order to keep back
-% referencing working.
-%
% The layout of footnotes is controlled by two flags
% |\ifFBAutoSpaceFootnotes| and |\ifFBFrenchFootnotes| which are
% set by options of \fbsetup{} (see section~\ref{ssec-keyval}).
@@ -5806,40 +5714,9 @@ return french_punctuation
% different because one was called in a French part, the other one
% in English!).
%
-% We save the original definition of |\@footnotemark| at the
-% |\begin{document}| in order to include any customisation that
-% packages might have done; we define a variant |\@footnotemarkFB|
-% which just adds a thin space before the number or symbol calling
-% a footnote (any space typed in is removed first). The choice
-% between the two definitions (valid for the whole document) is
-% controlled by flag |\ifFBAutoSpaceFootnotes|.
-%
% \changes{v2.4a}{2009/11/23}{\cs{PackageWarning} changed to
% \cs{PackageInfo} (when bigfoot package in use).}
%
-% \begin{macrocode}
-\AtBeginDocument{%
- \@ifpackageloaded{bigfoot}%
- {\PackageWarning{french.ldf}%
- {bigfoot package in use.\MessageBreak
- babel-french will NOT customise footnotes;%
- \MessageBreak reported}}%
- {\let\@footnotemarkORI\@footnotemark
- \def\@footnotemarkFB{\leavevmode\unskip\unkern
- \,\@footnotemarkORI}%
- \ifFBAutoSpaceFootnotes
- \let\@footnotemark\@footnotemarkFB
- \fi}%
- \@ifpackageloaded{footnotebackref}%
- {\FBFrenchFootnotesfalse
- \PackageWarning{french.ldf}%
- {footnotebackref package loaded.\MessageBreak
- babel-french will NOT customise footnotes;%
- \MessageBreak reported}}%
- {}%
- }
-% \end{macrocode}
-%
% \begin{macro}{\@makefntextFB}
% We then define |\@makefntextFB|, a variant of |\@makefntext|
% which is responsible for the layout of footnotes, to match the
@@ -5880,10 +5757,9 @@ return french_punctuation
\newcommand*{\kernFFN}{\kern .5em}
\newdimen\FBfnindent
% \end{macrocode}
-% |\@makefntextFB|’s definition is now tuned according to the
-% document’s class for better compatibility.
+% |\@makefntextFB|’s definition depends on the document’s class.
%
-% Koma-script classes provide |\deffootnote|, a handy command
+% Koma-script classes: they provide |\deffootnote|, a handy command
% to customise the footnotes’ layout (see English manual
% \file{scrguien.pdf}); it redefines |\@makefntext| and
% |\@@makefnmark|. First, save the original definitions.
@@ -5929,19 +5805,17 @@ return french_punctuation
\makefootmark #1}%
}{}
% \end{macrocode}
-% Definitions for the \cls{beamer} class:
-% \begin{macrocode}
-\@ifclassloaded{beamer}
-% \end{macrocode}
-% (see original definition in \file{beamerbaseframecomponents.sty}),
-% note that for the \cls{beamer} class footnotes are LR-boxes, not
-% paragraphs, so |\parindentFFN| is irrelevant.
-% class.
+% Definitions for the \cls{beamer} class:\par
+% the original definition is in
+% \file{beamerbaseframecomponents.sty}, note that for the
+% \cls{beamer} class footnotes are LR-boxes, not paragraphs,
+% so |\parindentFFN| is irrelevant.
%
% \changes{v3.2h}{2016/04/09}{With beamer.cls, add \cs{llap} to
% \cs{@thefnmark} for notes numbered over 99.}
%
% \begin{macrocode}
+\@ifclassloaded{beamer}
{\def\@makefntextFB#1{%
\def\insertfootnotetext{#1}%
\def\insertfootnotemark{\insertfootnotemarkFB}%
@@ -5952,9 +5826,9 @@ return french_punctuation
\llap{\@thefnmark}\dotFFN\kernFFN}%
}{}
% \end{macrocode}
+%
% Now the default definition of |\@makefntextFB| for standard LaTeX
% and AMS classes.
-%
% The next command prints the footnote mark according to the
% specifications of the French `Imprimerie Nationale’.
% Keep in mind that |\@thefnmark| might be empty (i.e.\ in
@@ -5971,11 +5845,36 @@ return french_punctuation
% \end{macrocode}
% \end{macro}
%
-% The rest of |\@makefntext|’s customisation is done at the
-% |\begin{document}|. We save the original definition of
-% |\@makefntext|, and then redefine |\@makefntext| according
+% The rest of |\@makefntext|’s customisation will be done at
+% the |\begin{document}|: saving the original definition of
+% |\@makefntext|, then redefining |\@makefntext| according
% to the value of flag |\ifFBFrenchFootnotes| (true or false).
-% Koma-script classes require a special treatment.
+%
+% \begin{macro}{\@footnotemark}
+%
+% \changes{v3.6a}{2024/05/13}{Allow customisation of the space added
+% in \cs{\@footnotemarkFB}.}
+%
+% We will save the original definition of |\@footnotemark| at the
+% |\begin{document}| in order to include any customisation that
+% packages might have done; we define a variant |\@footnotemarkFB|
+% which just adds a (customisable) thin space before the number or
+% symbol calling a footnote (any space typed in is removed first).
+% The choice between the two definitions (valid for the whole
+% document) is controlled by flag |\ifFBAutoSpaceFootnotes|.
+%
+% |\@footnotemark|’s customisation: let’s define a customisable
+% thin space which will be added before footnote’s call by
+% |\@footnotemarkFB|.
+% \begin{macrocode}
+\newcommand*{\FBfnmarkspace}{\kern .5\fontdimen2\font}
+\def\@footnotemarkFB{\leavevmode\unskip\unkern
+ \protect\FBfnmarkspace\@footnotemarkORI}%
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0b}{2007/04/18}{Footnotes: Just do nothing
+% (except warning) when the bigfoot package is loaded.}
%
% \changes{v3.3c}{2017/07/28}{Reset \cs{localleftbox} locally
% inside \cs{@makefntext}. Needed by \cs{frquote} with LuaTeX.}
@@ -5987,14 +5886,49 @@ return french_punctuation
% \cs{localleftbox} and \cs{FBeverypar@quote} saved and restored
% instead.}
%
+% \changes{v3.5s}{2024/01/05}{Footnotes: no customising of
+% \cs{@footnotetext} when the footnotebackref package is loaded.
+% Just warn the user.}
+%
+% Switching between French or Standard layout for footnotes is done
+% `AtBeginDocument’.
% The LuaTeX command |\localleftbox| and |\FBeverypar@quote| used
% by |\frquote{}| have to be reset inside footnotes; done for LaTeX
% based formats only.
% \begin{macrocode}
\providecommand\localleftbox[1]{}
\AtBeginDocument{%
- \@ifpackageloaded{bigfoot}{}%
- {\ifdim\parindentFFN<10in
+% \end{macrocode}
+% When the \pkg{footnotebackref} package is loaded, \frenchb{}
+% will not customise |\@footnotetext| in order to keep back
+% referencing working.
+% \begin{macrocode}
+ \@ifpackageloaded{footnotebackref}%
+ {\FBFrenchFootnotesfalse
+ \PackageWarning{french.ldf}%
+ {footnotebackref package loaded.\MessageBreak
+ babel-french will NOT customise footnotes;%
+ \MessageBreak reported}}%
+ {}%
+% \end{macrocode}
+% The \pkg{bigfoot} package deeply changes the way footnotes are
+% handled. When \file{bigfoot} is loaded, we just warn the user
+% that \frenchb{} will not customise footnotes at all.
+% \begin{macrocode}
+ \@ifpackageloaded{bigfoot}%
+ {\PackageWarning{french.ldf}%
+ {bigfoot package in use.\MessageBreak
+ babel-french will NOT customise footnotes;%
+ \MessageBreak reported}}%
+% \end{macrocode}
+% Otherwise, footnotes may be customised according to the
+% \fbsetup{} options.
+% \begin{macrocode}
+ {\let\@footnotemarkORI\@footnotemark
+ \ifFBAutoSpaceFootnotes
+ \let\@footnotemark\@footnotemarkFB
+ \fi
+ \ifdim\parindentFFN<10in
\else
\parindentFFN=\parindent
\ifdim\parindentFFN<1.5em \parindentFFN=1.5em \fi
@@ -6002,14 +5936,15 @@ return french_punctuation
\settowidth{\FBfnindent}{\dotFFN\kernFFN}%
\addtolength{\FBfnindent}{\parindentFFN}%
\let\@makefntextORI\@makefntext
- \ifFB@koma
% \end{macrocode}
+% Koma-script classes require a special treatment.\par
% Definition of |\@makefntext| for koma-script classes: running
% \@makefntextORI inside a group to reset |\localleftbox{}| and
% |\FBeverypar@quote| would mess up the layout of footnotes whenever
% the first manadatory argument of |\deffootnote{}| (used as
% |\leftskip|) is non-nil (default is 1em, 0pt in French).
% \begin{macrocode}
+ \ifFB@koma
\let\@@makefnmarkORI\@@makefnmark
\long\def\@makefntext#1{%
\localleftbox{}%
@@ -6071,7 +6006,7 @@ return french_punctuation
\localleftbox{\FBeveryline@quote}}%
\fi
}%
-}
+ }
% \end{macrocode}
%
% For compatibility reasons, we provide definitions for the commands
diff --git a/macros/latex/contrib/babel-contrib/french/frenchb.pdf b/macros/latex/contrib/babel-contrib/french/frenchb.pdf
index b0ab9ae43b..d9a61f7681 100644
--- a/macros/latex/contrib/babel-contrib/french/frenchb.pdf
+++ b/macros/latex/contrib/babel-contrib/french/frenchb.pdf
Binary files differ
diff --git a/macros/latex/contrib/babel-contrib/latvian/README.md b/macros/latex/contrib/babel-contrib/latvian/README.md
index dc9d7d99e9..6edd83b2a0 100644
--- a/macros/latex/contrib/babel-contrib/latvian/README.md
+++ b/macros/latex/contrib/babel-contrib/latvian/README.md
@@ -1,9 +1,15 @@
-## Latvian 2.0b
+## Latvian 2.0c
This is the babel style for Latvian. It bears the version number 2.0
because there were a 1.x, by Andris Lasis. Version 2.0 is heavily
based on the latter.
+### Changes 2.0c
+
+```
+* Fix an incompatibility with titlesec.
+```
+
### Changes 2.0b
```
@@ -17,5 +23,3 @@ based on the latter.
* Modififier t1composite, which redefines some T1 'composite commands'
related to the cedilla.
```
-
-2018-02-19 \ No newline at end of file
diff --git a/macros/latex/contrib/babel-contrib/latvian/latvian.dtx b/macros/latex/contrib/babel-contrib/latvian/latvian.dtx
index 82c44e2980..39555f81c4 100644
--- a/macros/latex/contrib/babel-contrib/latvian/latvian.dtx
+++ b/macros/latex/contrib/babel-contrib/latvian/latvian.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1999 - 2000 Andris Lasis, 2014-2018 Javier Bezos and any
+% Copyright 1999 - 2000 Andris Lasis, 2014-2024 Javier Bezos and any
% individual authors listed elsewhere in this file. All rights
% reserved.
%
@@ -37,8 +37,8 @@
%</dtx>
%<code>\ProvidesLanguage{latvian}
% \fi
-% \ProvidesLanguage{latvian}
- [2018/02/19 v2.0b Latvian support from the babel system]
+% \ProvidesFile{latvian}
+ [2024/04/27 v2.0c Latvian support from the babel system]
% \iffalse
%<*filedriver>
\documentclass{ltxdoc}
@@ -58,7 +58,7 @@
% \section{The Latvian Language}
%
% The file \textsf{latvian.ldf}\footnote{The file described in this
-% section has version number 2.0a and was last revised on 2018/02/19.}
+% section has version number 2.0c and was last revised on 2024/04/27.}
% defines the language definition macros for the Latvian language. It
% is heavily based on the work by Andris Lasis, and this file just
% cleans the code up and adapts it to babel 3.9.
@@ -192,11 +192,13 @@
%
% \begin{macrocode}
\gdef\the@chapter{%
- \ifx\chapter\undefined\relax\else
- \ifnum\c@chapter>\z@\thechapter\fi\fi}
+ \ifx\c@chapter\@undefined\else
+ \ifnum\c@chapter>\z@\thechapter\fi
+ \fi}
\def\thechapter{%
- \ifx\chapter\undefined\relax\else
- \arabic{chapter}.\fi}
+ \ifx\c@chapter\@undefined\else
+ \arabic{chapter}.%
+ \fi}
\def\thesection{\the@chapter\arabic{section}.}
\def\thesubsection{\thesection\arabic{subsection}.}
\def\thesubsubsection{\thesubsection\arabic{subsubsection}.}
diff --git a/macros/latex/contrib/babel-contrib/latvian/latvian.pdf b/macros/latex/contrib/babel-contrib/latvian/latvian.pdf
index fce2fa1395..2897bcc5a7 100644
--- a/macros/latex/contrib/babel-contrib/latvian/latvian.pdf
+++ b/macros/latex/contrib/babel-contrib/latvian/latvian.pdf
Binary files differ
diff --git a/macros/latex/contrib/babel-contrib/welsh/README b/macros/latex/contrib/babel-contrib/welsh/README.md
index 65ac842dc9..4f975962cb 100644
--- a/macros/latex/contrib/babel-contrib/welsh/README
+++ b/macros/latex/contrib/babel-contrib/welsh/README.md
@@ -1,12 +1,13 @@
-Welsh 1.1a
+## Welsh 1.1b
------------
This is the babel style for Welsh.
-Changes 1.1
------------
+## Changes 1.1b
+
+* Removed extra space in \ccname in TU strings.
+
+## Changes 1.1a
+
* Date fixed
* UTF-8 encoded strings for XeTeX and LuaTeX
-
-----------
-2015-09-03 \ No newline at end of file
diff --git a/macros/latex/contrib/babel-contrib/welsh/welsh.dtx b/macros/latex/contrib/babel-contrib/welsh/welsh.dtx
index d39ced6622..9e59856b2b 100644
--- a/macros/latex/contrib/babel-contrib/welsh/welsh.dtx
+++ b/macros/latex/contrib/babel-contrib/welsh/welsh.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1989-2015 Johannes L. Braams, Javier Bezos and any
+% Copyright 1989-2024 Johannes L. Braams, Javier Bezos and any
% individual authors listed elsewhere in this file. All rights
% reserved.
%
@@ -38,16 +38,13 @@
%<code>\ProvidesLanguage{welsh}
%\fi
%\ProvidesFile{welsh.dtx}
- [2015/09/03 v1.1a Welsh support from the babel system]
+ [2024/04/27 v1.1b Welsh support from the babel system]
%\iffalse
%% File `welsh.dtx'
%% Babel package for LaTeX version 2e
-%% Copyright (C) 1989 -- 2015
+%% Copyright (C) 1989 -- 2024
%% by Johannes Braams, TeXniek
% by Javier Bezos
-%
-% This file is part of the babel system, it provides the source
-% code for the Welsh language definition file.
%<*filedriver>
\documentclass{ltxdoc}
\newcommand*{\TeXhax}{\TeX hax}
@@ -126,11 +123,12 @@
% of \cs{today}}
% \changes{welsh-1.1a}{2015/09/03}{Strings are defined in the 3.9 way.
% Also Unicode strings}
+% \changes{welsh-1.1b}{2024/04/27}{Remove extra space in \cs{ccname}}
% \begin{macrocode}
\StartBabelCommands*{welsh}{captions}
[unicode, charset=utf8, fontenc=EU1 EU2]
\SetString{\enclname}{amgaeëdig}
- \SetString{\ccname}{copï au}
+ \SetString{\ccname}{copïau}
% \end{macrocode}
%
% And now, the generic branch, using the LICR and assuming T1.
diff --git a/macros/latex/contrib/babel-contrib/welsh/welsh.pdf b/macros/latex/contrib/babel-contrib/welsh/welsh.pdf
index fcac31cc60..6c8a9fc97c 100644
--- a/macros/latex/contrib/babel-contrib/welsh/welsh.pdf
+++ b/macros/latex/contrib/babel-contrib/welsh/welsh.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/DEPENDS.txt b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/DEPENDS.txt
new file mode 100644
index 0000000000..c8cacfa6a5
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/DEPENDS.txt
@@ -0,0 +1,2 @@
+hard beamer
+hard tools
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/README.md b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/README.md
index 3d8f35fb39..c5c10200dd 100644
--- a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/README.md
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/README.md
@@ -1,9 +1,34 @@
# beamertheme-rainbow
-A beamer colour theme which alternates theme colours on every frame
+[![GitHub](https://img.shields.io/github/license/samcarter/beamertheme-rainbow.svg?color=blue)](http://www.latex-project.org/lppl.txt)
+[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/samcarter/beamertheme-rainbow.svg?label=current%20version)](https://github.com/samcarter/beamertheme-rainbow/releases/latest)
+[![CTAN](https://img.shields.io/ctan/v/beamertheme-rainbow.svg)](https://ctan.org/pkg/beamertheme-rainbow)
-Current version: 2023/07/04 version v0.1
+A beamer colour theme which alternates theme colours on every frame.
-This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
+This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt .
-The project repository, including a bug tracker, can be found at https://github.com/samcarter/beamertheme-rainbow/issues
+The project repository, including a bug tracker, can be found at https://github.com/samcarter/beamertheme-rainbow/issues .
+
+### Usage
+
+```latex
+\documentclass{beamer}
+
+\usetheme{Berkeley}
+\usecolortheme{rainbow}
+
+\begin{document}
+
+\begin{frame}
+content...
+\end{frame}
+
+\begin{frame}
+content...
+\end{frame}
+
+\end{document}
+```
+
+For more details, please consult the [package documentation](https://github.com/samcarter/beamertheme-rainbow/blob/main/DOCUMENTATION.pdf).
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamercolorthemerainbow.sty b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamercolorthemerainbow.sty
index 94e9a0f10c..f4f9a162ee 100644
--- a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamercolorthemerainbow.sty
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamercolorthemerainbow.sty
@@ -12,7 +12,7 @@
% See http://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{beamercolorthemerainbow}[2023/07/04 version v0.1 Beamer colour theme with alternating theme colours]
+\ProvidesPackage{beamercolorthemerainbow}[2024/04/28 version v0.2 Beamer colour theme with alternating theme colours]
\mode<presentation>
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc-settings.sty b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc-settings.sty
new file mode 100644
index 0000000000..777cedba6e
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc-settings.sty
@@ -0,0 +1,199 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Personal helper theme for package documentations
+% Copyright samcarter
+%
+% This file may be distributed and/or modified
+% under the LaTeX Project Public License 1.3c or later
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Usage:
+% ln ~/Life/latex/beamertheme-sam/themesam.sty package-doc-settings.sty
+% \usepackage[
+% themecolor=samdblue
+% ]{\jobname-settings}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Colours
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xcolor}
+\definecolor{samyellow}{RGB}{246,193,65}
+\definecolor{samorange}{RGB}{241,147,45}
+\definecolor{samred}{RGB}{191,26,46}% TikZbricks
+\definecolor{sammagenta}{RGB}{170,42,104}% TikZmarmots
+\definecolor{samviolet}{RGB}{136,46,114}% TikZlings
+\definecolor{samlila}{RGB}{101,67,159}% Rainbow beamer theme
+\definecolor{samdblue}{RGB}{0,51,134}% beamer theme
+\definecolor{samlblue}{RGB}{22,89,155}% TikZducks
+\definecolor{samteal}{RGB}{25,143,157}% Tcolorbox beamer theme
+\definecolor{samlgreen}{RGB}{68,170,153}% Jigsaw
+\definecolor{samdgreen}{RGB}{78,178,125}
+\definecolor{samlgray}{RGB}{160,160,185}
+\definecolor{samdgray}{RGB}{60,60,85}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Package options
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xkeyval}
+\DeclareOptionX{themecolor}[samdblue]{\colorlet{themecolor}{#1}}
+\DeclareOptionX{listingcolor}[samlblue]{\colorlet{listingcolor}{#1}}
+\ExecuteOptionsX{themecolor,listingcolor}
+\ProcessOptionsX
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Packages
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{beamer}{}{%
+ \RequirePackage[english]{babel}
+ \RequirePackage[paper=a4paper,margin=2.9cm]{geometry}
+ \RequirePackage{scrlayer-scrpage}
+ \let\hrulefillx\hrulefill
+ \RequirePackage[bitstream-charter]{mathdesign}
+ \let\hrulefill\hrulefillx
+ \RequirePackage[hang,flushmargin,bottom]{footmisc}
+ \RequirePackage{footnotehyper}
+ \makesavenoteenv{tcolorbox}
+ \RequirePackage[all]{nowidow}
+ \RequirePackage[colorlinks=true,breaklinks=true,allcolors=themecolor,hyperfootnotes=false]{hyperref}
+}
+\RequirePackage[T1]{fontenc}
+\RequirePackage{xspace}
+\RequirePackage{inconsolata}% mono font with bold, but italic is missing
+% \RequirePackage[scale=0.85]{cascadia-code}
+% \AddToHook{cmd/ttfamily/before}{\fontseries{sl}}
+\RequirePackage{iexec}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Listings
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage[
+ cachedir=$TMPDIR/minted/
+]{minted}
+
+% smuggling custom pygmentize style in cache folder
+% (a real pygmentise style would need installtion in some python folder)
+\begin{filecontents*}[noheader]{./sam.pygstyle}
+\makeatletter
+\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
+ \let\PYG@ul=\relax \let\PYG@tc=\relax%
+ \let\PYG@bc=\relax \let\PYG@ff=\relax}
+\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
+\def\PYG@toks#1+{\ifx\relax#1\empty\else%
+ \PYG@tok{#1}\expandafter\PYG@toks\fi}
+\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
+ \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
+\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
+
+% optional arguments
+\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor{black}{##1}}}
+
+% macros
+\expandafter\def\csname PYG@tok@k\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
+% curly brakets
+\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
+
+% comments (italics won't work with the inconsolata font)
+\expandafter\def\csname PYG@tok@c\endcsname{\def\PYG@tc##1{\textcolor{gray}{##1}}}
+
+\def\PYGZbs{\char`\\}
+\def\PYGZus{\char`\_}
+\def\PYGZob{\char`\{}
+\def\PYGZcb{\char`\}}
+\def\PYGZca{\char`\^}
+\def\PYGZam{\char`\&}
+\def\PYGZlt{\char`\<}
+\def\PYGZgt{\char`\>}
+\def\PYGZsh{\char`\#}
+\def\PYGZpc{\char`\%}
+\def\PYGZdl{\char`\$}
+\def\PYGZhy{\char`\-}
+\def\PYGZsq{\char`\'}
+\def\PYGZdq{\char`\"}
+\def\PYGZti{\char`\~}
+% for compatibility with earlier versions
+\def\PYGZat{@}
+\def\PYGZlb{[}
+\def\PYGZrb{]}
+\makeatother
+\end{filecontents*}
+
+\iexec{mkdir -p $TMPDIR/minted && mv sam.pygstyle $TMPDIR/minted/.}
+
+\usemintedstyle{sam}
+\setminted{
+ breaksymbolleft={},
+ tabsize=2,
+ breaklines=true,
+}
+\newminted[samcode]{latex}{}
+\newmintinline[saminline]{latex}{}
+
+% use non-bold and all coloured for inline code in articles
+\ifdefined\insertaspectratio\else
+ \patchcmd{\minted@inputpyg@inline}{\minted@input}{\color{listingcolor}\renewcommand\textcolor[3][]{##3}\renewcommand\bfseries{}\minted@input}{}{}
+\fi
+
+\RequirePackage[most]{tcolorbox}
+\tcbuselibrary{minted}
+\tcbset{%
+ colframe=themecolor,
+ fonttitle=\bfseries,
+ sidebyside,
+ center lower,
+ righthand width=5.7cm,
+ bottom=2pt,
+ top=2pt,
+ left=3pt,
+ right=3pt,
+ sidebyside gap=10pt,
+ lower separated=false,
+ listing engine=minted,
+ minted language=latex,
+ colback=themecolor!10,
+ sharp corners,
+ boxrule=0pt,
+ before title={\strut}
+}
+
+% avoid page breaks right in front of the tcolorbox
+\@ifclassloaded{beamer}{}{
+ \tcbuselibrary{hooks}
+ \tcbset{before pre={\nopagebreak[4]}}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% document settings
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{scrartcl}{%
+ \KOMAoptions{parskip=half}
+ \addtokomafont{sectioning}{\color{themecolor}}
+ \addtokomafont{date}{\normalsize}
+ \addtokomafont{author}{\normalsize}
+ \setlength{\footnotemargin}{0.7em}
+}{}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Custom macros
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecommand*{\CTAN}{\textsc{CTAN}\xspace}
+\providecommand*{\TikZ}{Ti\emph{k}Z\xspace}
+\providecommand*{\miktex}{MiK\TeX\xspace}
+\providecommand*{\texlive}{\TeX{}Live\xspace}
+\providecommand*{\tikzbrick}{Ti\emph{k}Zbrick\xspace}
+\providecommand*{\tikzducks}{Ti\emph{k}Zducks\xspace}
+\providecommand*{\tikzlings}{Ti\emph{k}Zlings\xspace}
+\providecommand*{\tikzmarmots}{Ti\emph{k}Zmarmots\xspace}
+\providecommand*{\ConTeXt}{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt} \ No newline at end of file
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.pdf b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.pdf
index beb9295d5f..78442b5a99 100644
--- a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.tex b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.tex
index 14f84a1b1a..e5819e54b9 100644
--- a/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.tex
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-rainbow/beamertheme-rainbow-doc.tex
@@ -1,5 +1,3 @@
-% !TeX TS-program = latexmk -time -pdf -pdflatex="pdflatex -synctex=1 -interaction=nonstopmode -shell-escape %%O %%S" % | txs:///view-log | txs:///view-pdf
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Documentation for the rainbow colour theme
@@ -13,82 +11,81 @@
% See http://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\documentclass[parskip=half]{scrartcl}
-
-% packages %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\usepackage[T1]{fontenc}
-\usepackage[utf8]{inputenc}
-\usepackage[english]{babel}
-\let\hrulefillx\hrulefill
-\usepackage[bitstream-charter]{mathdesign}
-\let\hrulefill\hrulefillx
-\usepackage[most]{tcolorbox}
-\usepackage[paper=a4paper,hmargin=2.9cm,vmargin=2.5cm]{geometry}
-\usepackage{scrlayer-scrpage}
-\usepackage{gradient-text}
-\usepackage[colorlinks=true,breaklinks=true,urlcolor=blendedblue,linkcolor=blendedblue,citecolor=blendedblue,filecolor=blendedblue]{hyperref}
+% !TeX program = txs:///arara
+% arara: latexmk: {
+% arara: --> engine: pdflatex,
+% arara: --> options: [
+% arara: --> '-shell-escape',
+% arara: --> '-synctex=1',
+% arara: --> '-interaction=nonstopmode',
+% arara: --> ]
+% arara: --> }
+\documentclass{scrartcl}
-% customisation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\definecolor{blendedblue}{rgb}{0.2,0.2,0.7}
-\addtokomafont{sectioning}{\color{blendedblue}}
-\addtokomafont{date}{\normalsize}
-\addtokomafont{author}{\normalsize}
-\renewcommand*\dictumwidth{0.35\linewidth}
-\renewcommand*{\dictumrule}{\vskip1ex}
-\renewcommand*{\dictumauthorformat}[1]{#1}
+% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\title{\texorpdfstring{\gradient{HSB}{The rainbow beamer colour theme}{0,240,200}{240,240,200}}{The rainbow beamer colour theme}}
+\subtitle{A beamer colour theme which alternates theme colours on every frame}
+\author{%
+ \texorpdfstring{
+ \texttt{samcarter}\\
+ \url{https://github.com/samcarter/beamertheme-rainbow}\\
+ \url{https://www.ctan.org/pkg/beamertheme-rainbow}
+ }{samcarter}}
+\date{Version v0.2 \textendash{} 2024/04/28}
-\lstdefinestyle{tcolorboxstyle}{%
- language={[latex]TeX},
- tabsize=2,
- breaklines,
- basicstyle=\ttfamily,
- columns=fullflexible,
-}
+\usepackage[
+ themecolor=samlila
+]{\jobname-settings}
+
+\colorlet{orange}{samorange}
-\tcbset{%
- toptitle=1mm,
- left=2mm,
- title={Example},
- fonttitle=\large\sffamily,
- colbacktitle=blendedblue!75!black,
- colframe=blendedblue!75!black,
- colback=blendedblue!75!black!10!white,
- boxrule=0cm,
- frame hidden,
- arc=1.3mm,
- arc=2mm,
- sidebyside,
- listing options={style=tcolorboxstyle},
- bottom=0pt,
- top=0pt,
- lower separated=false,
- comment style={scale=2},
- enhanced,
- drop fuzzy shadow=black!90,
- title code app={
- \shade[top color=blendedblue!75!black,bottom color=blendedblue!75!black!10!white] (title.south west) rectangle ([yshift=-1mm]title.south east);
- }
+% rainbow text (based on the gradient-text package) %%%%%%%%%%%%%%%%%
+\makeatletter
+\ExplSyntaxOn
+\clist_new:N\l_gtext_First_clist
+\clist_new:N\l_gtext_Last_clist
+\int_new:N\l_gtext_MaxIndex_int
+\int_new:N\l_gtext_Ratio_int
+\newcommand{\gr@dient}[8]{
+ \int_set:Nn\l_gtext_MaxIndex_int{\int_eval:n{\str_count:n{#1}}}
+ \int_step_inline:nnn{1}{\l_gtext_MaxIndex_int}{
+ \exp_args:Ne\str_if_eq:nnTF{\str_item:Nn{#1}{##1}}{~}{}{
+ \int_set:Nn\l_gtext_Ratio_int{\int_eval:n{\l_gtext_Ratio_int+1}}
+ }
+ \color_select:nn{#8}{
+ \int_eval:n{(\int_use:N\l_gtext_Ratio_int*#5+(\l_gtext_MaxIndex_int-##1)*#2)/\l_gtext_MaxIndex_int},
+ \int_eval:n{(\int_use:N\l_gtext_Ratio_int*#6+(\l_gtext_MaxIndex_int-##1)*#3)/\l_gtext_MaxIndex_int},
+ \int_eval:n{(\int_use:N\l_gtext_Ratio_int*#7+(\l_gtext_MaxIndex_int-##1)*#4)/\l_gtext_MaxIndex_int}
+ }\str_item:Nn{#1}{##1}
+ }
}
-\lstset{style=tcolorboxstyle}
+\NewDocumentCommand\gradient{mmmm}{{
+ \clist_set:Nn\l_gtext_First_clist {#3}
+ \clist_set:Nn\l_gtext_Last_clist {#4}
+ \gr@dient{#2}
+ {\clist_item:Nn\l_gtext_First_clist{1}}
+ {\clist_item:Nn\l_gtext_First_clist{2}}
+ {\clist_item:Nn\l_gtext_First_clist{3}}
+ {\clist_item:Nn\l_gtext_Last_clist{1}}
+ {\clist_item:Nn\l_gtext_Last_clist{2}}
+ {\clist_item:Nn\l_gtext_Last_clist{3}}
+ {#1}
+}}
+\ExplSyntaxOff
+\makeatother
-\newcommand{\prefix}{./build}
+% customisation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\renewcommand*\dictumwidth{0.35\linewidth}
+\renewcommand*{\dictumrule}{\vskip1ex}
+\renewcommand*{\dictumauthorformat}[1]{#1}
+
+\newcommand{\prefix}{./include}
\tcbset{
compilable listing/.style={listing file={\prefix/\jobname-listing-\thetcblistingcount.tex}},
run pdflatex/.style={run@system@command={cd\space \prefix;\space pdflatex}{\jobname-listing-\thetcblistingcount.tex}},%
}
-% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\title{\texorpdfstring{\gradientRGB{The rainbow beamer colour theme}{255,128,51}{51,51,255}}{The rainbow beamer coloir theme}}
-\subtitle{A beamer colour theme which alternates theme colours on every frame}
-\author{%
- \texorpdfstring{
- \texttt{samcarter}\\
- \url{https://github.com/samcarter/beamertheme-rainbow}\\
-% \url{https://www.ctan.org/pkg/beamertheme-rainbow}
- }{samcarter}}
-\date{Version v0.1 \textendash{} 2023/07/04}
-
\begin{document}
\maketitle
@@ -97,29 +94,28 @@
\section{Introduction}
\label{intro}
-The rainbow beamer colour theme will bring more colours to your presentation. It works similarly to the structure beamer colour theme, but instead of having just one theme colour throughout the whole presentation, the rainbow beamer colour theme will cycle through a list of colors and change the theme colour on every frame.
+The rainbow beamer colour theme will bring more colours to your presentation. It works similarly to the structure beamer colour theme, but instead of having just one theme colour throughout the whole presentation, the rainbow beamer colour theme will cycle through a list of colors and change the theme colour on every frame.
By default, it will cycle through colours of the rainbow (hence the name), but a custom set of colours is also possible.
-%The package is included in \TeX{}Live and MiK\TeX\ and available from \textsc{CTAN} (\url{https://www.ctan.org/pkg/beamertheme-tcolorbox}).
+The package is included in \TeX{}Live and MiK\TeX\ and available from \textsc{CTAN} (\url{https://www.ctan.org/pkg/beamertheme-tcolorbox}).
The development version of this package is located at \url{https://github.com/samcarter/beamertheme-rainbow}. If you have any problems, ideas or other feedback, please make constructive use of the issue tracker.
Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright} \texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{http://www.latex-project.org/lppl.txt}.
\section{Usage}
-The basic usage is fairly simple. After choosing a beamer theme, one can load the rainbow beamer colour theme via
-\begin{tcolorbox}[title={}]
-\begin{lstlisting}
+The basic usage is fairly simple. After choosing a beamer theme, one can load the rainbow beamer colour theme via
+\begin{tcolorbox}[title={Usage}]
+\begin{samcode}
\usecolortheme{rainbow}
-\end{lstlisting}
+\end{samcode}
\end{tcolorbox}
-This will work with most of the themes which are provided by the beamer class as well some third party themes. Notable exceptions are the \lstinline|AnnArbor| and \lstinline|CambridgeUS| themes.
-
-\newpage
+This will work with most of the themes which are provided by the beamer class as well some third party themes. Notable exceptions are the \saminline|AnnArbor| and \saminline|CambridgeUS| themes.
This basic usage will colour frames in alternating rainbow colours:
+\nopagebreak
\begin{tcblisting}{
listing and comment,
pdf comment,
@@ -129,7 +125,7 @@ This basic usage will colour frames in alternating rainbow colours:
comment={
\begin{tikzpicture}
\foreach \i in {1,...,6}{%
- \node at (0.4*\i,-0.7*\i) {\includegraphics[page=\i,width=4cm]{beamertheme-rainbow-doc-listing-1.pdf}};
+ \node at (0.35*\i,-0.7*\i) {\includegraphics[page=\i,width=3.7cm]{beamertheme-rainbow-doc-listing-1.pdf}};
}
\end{tikzpicture}
},
@@ -150,7 +146,7 @@ This basic usage will colour frames in alternating rainbow colours:
\end{document}
\end{tcblisting}
-As pretty as rainbow colours are, there might be some users who would like to choose their own colours. This can be done with the \lstinline|colors={...}| option which accepts a comma separated list of colours. The colours can be predefined colours e.g. from the \lstinline|xcolor| package, user-defined colours or (for more fun) from the \lstinline|xkcdcolors| package.
+As pretty as rainbow colours are, there might be some users who would like to choose their own colours. This can be done with the \saminline|colors={...}| option which accepts a comma separated list of colours. The colours can be predefined colours e.g. from the \saminline|xcolor| package, user-defined colours or (for more fun) from the \saminline|xkcdcolors| package.
\begin{tcblisting}{
listing and comment,
@@ -161,7 +157,7 @@ As pretty as rainbow colours are, there might be some users who would like to ch
comment={
\begin{tikzpicture}
\foreach \i in {1,...,6}{%
- \node at (0.4*\i,-0.7*\i) {\includegraphics[page=\i,width=4cm]{beamertheme-rainbow-doc-listing-2.pdf}};
+ \node at (0.35*\i,-0.7*\i) {\includegraphics[page=\i,width=3.7cm]{beamertheme-rainbow-doc-listing-2.pdf}};
}
\end{tikzpicture}
},
@@ -172,12 +168,12 @@ As pretty as rainbow colours are, there might be some users who would like to ch
\usetheme{Copenhagen}
\usepackage{xkcdcolors}
\definecolor{mycolor}
- {RGB}{127,0,127}
+ {RGB}{101,67,159}
\usecolortheme[
colors={
orange,
mycolor,
- xkcdVibrantBlue
+ xkcdMediumBlue
}
]{rainbow}
@@ -185,9 +181,11 @@ As pretty as rainbow colours are, there might be some users who would like to ch
% just for this test example
\ExplSyntaxOn
-\prg_replicate:nn{6}{\frame{\frametitle{title}}}
+\prg_replicate:nn{6}{
+ \frame{\frametitle{title}}
+}
\ExplSyntaxOff
-
+
\end{document}
\end{tcblisting}
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/DEPENDS.txt b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/DEPENDS.txt
new file mode 100644
index 0000000000..09e806e193
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/DEPENDS.txt
@@ -0,0 +1,4 @@
+hard beamer
+hard tools
+hard tcolorbox
+hard tikzfill
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/README.md b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/README.md
index 91f07c7663..b8501189d6 100644
--- a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/README.md
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/README.md
@@ -1,9 +1,32 @@
# beamertheme-tcolorbox
-A beamer inner theme which reproduces standard beamer blocks using tcolorboxes
+[![GitHub](https://img.shields.io/github/license/samcarter/beamertheme-tcolorbox.svg?color=blue)](http://www.latex-project.org/lppl.txt)
+[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/samcarter/beamertheme-tcolorbox.svg?label=current%20version)](https://github.com/samcarter/beamertheme-tcolorbox/releases/latest)
+[![CTAN](https://img.shields.io/ctan/v/beamertheme-tcolorbox.svg)](https://ctan.org/pkg/beamertheme-tcolorbox)
-Current version: 2023/05/03 version v0.6
+A beamer inner theme which reproduces standard beamer blocks using tcolorboxes.
-This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
+This project is licensed under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt .
-The project repository, including a bug tracker, can be found at https://github.com/samcarter/beamertheme-tcolorbox/issues
+The project repository, including a bug tracker, can be found at https://github.com/samcarter/beamertheme-tcolorbox .
+
+### Usage
+
+```latex
+\documentclass{beamer}
+
+\usecolortheme{orchid}
+\useinnertheme{tcolorbox}
+
+\begin{document}
+
+\begin{frame}
+ \begin{block}{Title}
+ Content
+ \end{block}
+\end{frame}
+
+\end{document}
+```
+
+For more details, please consult the [package documentation](https://github.com/samcarter/beamertheme-tcolorbox/blob/main/DOCUMENTATION.pdf).
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamerinnerthemetcolorbox.sty b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamerinnerthemetcolorbox.sty
index 770a00d0b5..9469f0591e 100644
--- a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamerinnerthemetcolorbox.sty
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamerinnerthemetcolorbox.sty
@@ -12,7 +12,7 @@
% See http://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesPackage{beamerinnerthemetcolorbox}[2023/05/03 version v0.6 Beamer blocks with tcolorboxes]
+\ProvidesPackage{beamerinnerthemetcolorbox}[2024/04/29 version v0.7 Beamer blocks with tcolorboxes]
\RequirePackage{tcolorbox}
\tcbuselibrary{skins,hooks}
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc-settings.sty b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc-settings.sty
new file mode 100644
index 0000000000..777cedba6e
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc-settings.sty
@@ -0,0 +1,199 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Personal helper theme for package documentations
+% Copyright samcarter
+%
+% This file may be distributed and/or modified
+% under the LaTeX Project Public License 1.3c or later
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Usage:
+% ln ~/Life/latex/beamertheme-sam/themesam.sty package-doc-settings.sty
+% \usepackage[
+% themecolor=samdblue
+% ]{\jobname-settings}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Colours
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xcolor}
+\definecolor{samyellow}{RGB}{246,193,65}
+\definecolor{samorange}{RGB}{241,147,45}
+\definecolor{samred}{RGB}{191,26,46}% TikZbricks
+\definecolor{sammagenta}{RGB}{170,42,104}% TikZmarmots
+\definecolor{samviolet}{RGB}{136,46,114}% TikZlings
+\definecolor{samlila}{RGB}{101,67,159}% Rainbow beamer theme
+\definecolor{samdblue}{RGB}{0,51,134}% beamer theme
+\definecolor{samlblue}{RGB}{22,89,155}% TikZducks
+\definecolor{samteal}{RGB}{25,143,157}% Tcolorbox beamer theme
+\definecolor{samlgreen}{RGB}{68,170,153}% Jigsaw
+\definecolor{samdgreen}{RGB}{78,178,125}
+\definecolor{samlgray}{RGB}{160,160,185}
+\definecolor{samdgray}{RGB}{60,60,85}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Package options
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xkeyval}
+\DeclareOptionX{themecolor}[samdblue]{\colorlet{themecolor}{#1}}
+\DeclareOptionX{listingcolor}[samlblue]{\colorlet{listingcolor}{#1}}
+\ExecuteOptionsX{themecolor,listingcolor}
+\ProcessOptionsX
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Packages
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{beamer}{}{%
+ \RequirePackage[english]{babel}
+ \RequirePackage[paper=a4paper,margin=2.9cm]{geometry}
+ \RequirePackage{scrlayer-scrpage}
+ \let\hrulefillx\hrulefill
+ \RequirePackage[bitstream-charter]{mathdesign}
+ \let\hrulefill\hrulefillx
+ \RequirePackage[hang,flushmargin,bottom]{footmisc}
+ \RequirePackage{footnotehyper}
+ \makesavenoteenv{tcolorbox}
+ \RequirePackage[all]{nowidow}
+ \RequirePackage[colorlinks=true,breaklinks=true,allcolors=themecolor,hyperfootnotes=false]{hyperref}
+}
+\RequirePackage[T1]{fontenc}
+\RequirePackage{xspace}
+\RequirePackage{inconsolata}% mono font with bold, but italic is missing
+% \RequirePackage[scale=0.85]{cascadia-code}
+% \AddToHook{cmd/ttfamily/before}{\fontseries{sl}}
+\RequirePackage{iexec}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Listings
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage[
+ cachedir=$TMPDIR/minted/
+]{minted}
+
+% smuggling custom pygmentize style in cache folder
+% (a real pygmentise style would need installtion in some python folder)
+\begin{filecontents*}[noheader]{./sam.pygstyle}
+\makeatletter
+\def\PYG@reset{\let\PYG@it=\relax \let\PYG@bf=\relax%
+ \let\PYG@ul=\relax \let\PYG@tc=\relax%
+ \let\PYG@bc=\relax \let\PYG@ff=\relax}
+\def\PYG@tok#1{\csname PYG@tok@#1\endcsname}
+\def\PYG@toks#1+{\ifx\relax#1\empty\else%
+ \PYG@tok{#1}\expandafter\PYG@toks\fi}
+\def\PYG@do#1{\PYG@bc{\PYG@tc{\PYG@ul{%
+ \PYG@it{\PYG@bf{\PYG@ff{#1}}}}}}}
+\def\PYG#1#2{\PYG@reset\PYG@toks#1+\relax+\PYG@do{#2}}
+
+% optional arguments
+\expandafter\def\csname PYG@tok@na\endcsname{\def\PYG@tc##1{\textcolor{black}{##1}}}
+
+% macros
+\expandafter\def\csname PYG@tok@k\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
+% curly brakets
+\expandafter\def\csname PYG@tok@nb\endcsname{\def\PYG@tc##1{\textcolor{listingcolor}{\bfseries ##1}}}
+
+% comments (italics won't work with the inconsolata font)
+\expandafter\def\csname PYG@tok@c\endcsname{\def\PYG@tc##1{\textcolor{gray}{##1}}}
+
+\def\PYGZbs{\char`\\}
+\def\PYGZus{\char`\_}
+\def\PYGZob{\char`\{}
+\def\PYGZcb{\char`\}}
+\def\PYGZca{\char`\^}
+\def\PYGZam{\char`\&}
+\def\PYGZlt{\char`\<}
+\def\PYGZgt{\char`\>}
+\def\PYGZsh{\char`\#}
+\def\PYGZpc{\char`\%}
+\def\PYGZdl{\char`\$}
+\def\PYGZhy{\char`\-}
+\def\PYGZsq{\char`\'}
+\def\PYGZdq{\char`\"}
+\def\PYGZti{\char`\~}
+% for compatibility with earlier versions
+\def\PYGZat{@}
+\def\PYGZlb{[}
+\def\PYGZrb{]}
+\makeatother
+\end{filecontents*}
+
+\iexec{mkdir -p $TMPDIR/minted && mv sam.pygstyle $TMPDIR/minted/.}
+
+\usemintedstyle{sam}
+\setminted{
+ breaksymbolleft={},
+ tabsize=2,
+ breaklines=true,
+}
+\newminted[samcode]{latex}{}
+\newmintinline[saminline]{latex}{}
+
+% use non-bold and all coloured for inline code in articles
+\ifdefined\insertaspectratio\else
+ \patchcmd{\minted@inputpyg@inline}{\minted@input}{\color{listingcolor}\renewcommand\textcolor[3][]{##3}\renewcommand\bfseries{}\minted@input}{}{}
+\fi
+
+\RequirePackage[most]{tcolorbox}
+\tcbuselibrary{minted}
+\tcbset{%
+ colframe=themecolor,
+ fonttitle=\bfseries,
+ sidebyside,
+ center lower,
+ righthand width=5.7cm,
+ bottom=2pt,
+ top=2pt,
+ left=3pt,
+ right=3pt,
+ sidebyside gap=10pt,
+ lower separated=false,
+ listing engine=minted,
+ minted language=latex,
+ colback=themecolor!10,
+ sharp corners,
+ boxrule=0pt,
+ before title={\strut}
+}
+
+% avoid page breaks right in front of the tcolorbox
+\@ifclassloaded{beamer}{}{
+ \tcbuselibrary{hooks}
+ \tcbset{before pre={\nopagebreak[4]}}
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% document settings
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\@ifclassloaded{scrartcl}{%
+ \KOMAoptions{parskip=half}
+ \addtokomafont{sectioning}{\color{themecolor}}
+ \addtokomafont{date}{\normalsize}
+ \addtokomafont{author}{\normalsize}
+ \setlength{\footnotemargin}{0.7em}
+}{}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Custom macros
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\providecommand*{\CTAN}{\textsc{CTAN}\xspace}
+\providecommand*{\TikZ}{Ti\emph{k}Z\xspace}
+\providecommand*{\miktex}{MiK\TeX\xspace}
+\providecommand*{\texlive}{\TeX{}Live\xspace}
+\providecommand*{\tikzbrick}{Ti\emph{k}Zbrick\xspace}
+\providecommand*{\tikzducks}{Ti\emph{k}Zducks\xspace}
+\providecommand*{\tikzlings}{Ti\emph{k}Zlings\xspace}
+\providecommand*{\tikzmarmots}{Ti\emph{k}Zmarmots\xspace}
+\providecommand*{\ConTeXt}{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt} \ No newline at end of file
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.pdf b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.pdf
index db3b354834..fe64e72639 100644
--- a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.tex b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.tex
index 8bd7fc2fa4..c17e7fc17e 100644
--- a/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.tex
+++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.tex
@@ -1,5 +1,3 @@
-% !TeX TS-program = latexmk -time -pdf -pdflatex="pdflatex -synctex=1 -interaction=nonstopmode -shell-escape %%O %%S" % | txs:///view-log | txs:///view-pdf
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Documentation for the tcolorbox inner theme
@@ -13,80 +11,37 @@
% See http://www.latex-project.org/lppl.txt
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\documentclass[parskip=half]{scrartcl}
-
-% packages %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\usepackage[T1]{fontenc}
-\usepackage[utf8]{inputenc}
-\usepackage[english]{babel}
-\usepackage[bitstream-charter]{mathdesign}
-\usepackage[most]{tcolorbox}
-\usepackage[paper=a4paper,hmargin=2.9cm,vmargin=2.5cm]{geometry}
-\usepackage{scrlayer-scrpage}
-\usepackage[colorlinks=true,breaklinks=true,urlcolor=blendedblue,linkcolor=blendedblue,citecolor=blendedblue,filecolor=blendedblue]{hyperref}
-
-% customisation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\definecolor{blendedblue}{rgb}{0.2,0.2,0.7}
-\addtokomafont{sectioning}{\color{blendedblue}}
-\addtokomafont{date}{\normalsize}
-\addtokomafont{author}{\normalsize}
-
-\lstdefinestyle{tcolorboxstyle}{%
- language={[latex]TeX},
- tabsize=2,
- breaklines,
- basicstyle=\ttfamily,
- columns=fullflexible,
-% texcsstyle=*\color{blendedblue}\bfseries,
-% moretexcs={usetheme,useinnertheme},
-}
-
-\tcbset{%
- toptitle=1mm,
- left=2mm,
- title={Example},
- fonttitle=\large\sffamily,
- colbacktitle=blendedblue!75!black,
- colframe=blendedblue!75!black,
- colback=blendedblue!75!black!10!white,
- boxrule=0cm,
- frame hidden,
- arc=1.3mm,
- arc=2mm,
- sidebyside,
- listing options={style=tcolorboxstyle},
- bottom=0pt,
- top=0pt,
- lower separated=false,
- comment style={scale=2},
- enhanced,
- drop fuzzy shadow=black!90,
- title code app={
- \shade[top color=blendedblue!75!black,bottom color=blendedblue!75!black!10!white] (title.south west) rectangle ([yshift=-1mm]title.south east);
- }
-}
+% !TeX program = txs:///arara
+% arara: latexmk: {
+% arara: --> engine: pdflatex,
+% arara: --> options: [
+% arara: --> '-shell-escape',
+% arara: --> '-synctex=1',
+% arara: --> '-interaction=nonstopmode',
+% arara: --> ]
+% arara: --> }
+\documentclass{scrartcl}
-\lstset{style=tcolorboxstyle}
-
-%\makeatletter
-\newcommand{\prefix}{./build}
+% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\title{The tcolorbox beamer inner theme}
+\subtitle{A beamer inner theme to replicate standard beamer blocks with tcolorboxes}
+\author{%
+ \texorpdfstring{
+ \texttt{samcarter}\\
+ \url{https://github.com/samcarter/beamertheme-tcolorbox}\\
+ \url{https://www.ctan.org/pkg/beamertheme-tcolorbox}
+ }{samcarter}}
+\date{Version v0.7 \textendash{} 2024/04/29}
+
+\usepackage[
+ themecolor=samteal
+]{\jobname-settings}
+
+\newcommand{\prefix}{./include}
\tcbset{
compilable listing/.style={listing file={\prefix/\jobname-listing-\thetcblistingcount.tex}},
run pdflatex/.style={run@system@command={cd\space \prefix;\space pdflatex}{\jobname-listing-\thetcblistingcount.tex}},%
}
-%\makeatother
-
-
-% meta %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\title{The tcolorbox beamer inner theme}
-\subtitle{A beamer inner theme to reproduce standard beamer blocks using tcolorboxes}
-\author{%
- \texorpdfstring{
- \texttt{samcarter}\\
- \url{https://github.com/samcarter/beamertheme-tcolorbox}\\
- \url{https://www.ctan.org/pkg/beamertheme-tcolorbox}
- }{samcarter}}
-\date{Version v0.6 \textendash{} 2023/05/03}
\begin{document}
\maketitle
@@ -94,77 +49,81 @@
\section{Introduction}
\label{intro}
-Over the last decade of answering beamer problems and more recently also being one of the maintainers of the beamer class, I saw countless of requests about beamer blocks. There were users who were looking for sometimes smaller, sometimes larger tweaks to the blocks in their document, for example "How to use the rectangular blocks with sharp corners, but with the shadows from the rounded beamer blocks". Other users encountered various tiny or something bigger problems with the default beamer blocks, like issues with some pdf viewers in which the seams of the underlying colorboxes would become visible.
+Over the last decade of answering beamer problems and more recently also being one of the maintainers of the beamer class, I saw countless of requests about beamer blocks. There were users who were looking for sometimes smaller, sometimes larger tweaks to the blocks in their document, for example "How to use the rectangular blocks with sharp corners, but with the shadows from the rounded beamer blocks". Other users encountered various tiny or something bigger problems with the default beamer blocks, like issues with some pdf viewers in which the seams of the underlying colorboxes would become visible.
For all these cases, there is now an alternative to the default beamer blocks: The tcolorbox inner beamer theme will replace the usual beamer mechanism to draw blocks with tcolorboxes. The tcolorboxes will automatically adopt the look and feel (round vs.\ sharp corners and shadows) as well as the colours of the normal beamer blocks.
-The package is included in \TeX{}Live and MiK\TeX\ and available from \textsc{CTAN} (\url{https://www.ctan.org/pkg/beamertheme-tcolorbox}).
+The package is included in \TeX{}Live and MiK\TeX\ and available from \textsc{CTAN} (\url{https://www.ctan.org/pkg/beamertheme-tcolorbox}).
The development version of this package is located at \url{https://github.com/samcarter/beamertheme-tcolorbox}. If you have any problems, ideas or other feedback, please make constructive use of the issue tracker.
Copyright \raisebox{0.2em}{\tiny\fontfamily{cmr}\selectfont\textcopyright} \texttt{samcarter}. Permission is granted to copy, distribute and\slash or modify this software under the terms of the LaTeX project public licence, version 1.3c or later \url{http://www.latex-project.org/lppl.txt}.
\section{Usage}
-The basic usage is fairly simple. One just needs to load the theme via
-\begin{tcolorbox}[title={}]
-\begin{lstlisting}
+The basic usage is fairly simple. One just needs to load the theme via
+\begin{tcolorbox}[lower separated=false,title={Usage}]
+\begin{samcode}
\useinnertheme{tcolorbox}
-\end{lstlisting}
+\end{samcode}
\end{tcolorbox}
-and after that, one can use the normal beamer \lstinline|block| environment as usual.
+and after that, one can use the normal beamer \saminline|block| environment as usual.
-Behind the scenes, this will replace the default mechanism of puzzling together the block from two separate \lstinline|beamercolorboxes|, with one tcolorbox.
+Behind the scenes, this will replace the default mechanism of puzzling together the block from two separate \saminline|beamercolorboxes|, with one tcolorbox.
In this simple configuration, the look and feel of the new blocks will be taken from other themes loaded in the presentation. For example if the Madrid theme is loaded, the resulting tcolorbox will have the usual colours, rounded corners and a shadow:
\begin{tcblisting}{
+ title={Example},
listing and comment,
pdf comment,
freeze pdf,
compilable listing,
run pdflatex,
+ comment style={scale=2}
}
\documentclass{beamer}
\usetheme{Madrid}
\useinnertheme{tcolorbox}
\begin{document}
\begin{frame}
-\begin{block}{Title}
- Body
-\end{block}
-\begin{alertblock}{Title}
- Body
-\end{alertblock}
-\begin{exampleblock}{Title}
- Body
-\end{exampleblock}
+ \begin{block}{Title}
+ Body
+ \end{block}
+ \begin{alertblock}{Title}
+ Body
+ \end{alertblock}
+ \begin{exampleblock}{Title}
+ Body
+ \end{exampleblock}
\end{frame}
\end{document}
\end{tcblisting}
-Additional settings done by user, like e.g. \lstinline|\setbeamertemplate{blocks}[rounded]|, won't be taken into account and the \lstinline|tcolorbox| inner theme should be loaded after such modifications.
+Additional settings done by user, like e.g. \saminline|\setbeamertemplate{blocks}[rounded]|, won't be taken into account and the \saminline|tcolorbox| inner theme should be loaded after such modifications.
\section{Options}
In addition to automatically adopting settings from other themes, one can also explicitly influence the look and feel via these options:
\begin{description}
-\item[blocks] controls if tcolorboxes should be used for beamer blocks (default: \lstinline|true|)
-\item[inmargin] controls if the block titles are placed in the left sidebar instead of the top of the block, e.g. for themes like \lstinline|Bergen| (default: \lstinline|false|, but set to \lstinline|true| if the \lstinline|inmargin| inner theme is detected)
-\item[rounded] controls if corners are rounded or sharp (default: \lstinline|false|, but set to \lstinline|true| if the \lstinline|rounded| inner theme is detected)
-\item[shaded] controls if there is a short colour gradient between the title and the body (default: \lstinline|false|, but set to \lstinline|true| if the block corners are rounded)
-\item[shadow] controls if the block has a shadow (default: \lstinline|false|, but set to \lstinline|true| if the \lstinline|shadow| outer theme is detected)
-\item[showtitle] controls if a small coloured stripe is shown for blocks with empty title (default: \lstinline|true|, but set to \lstinline|false| if the block has rounded corners)
-\item[titlepage] controls if tcolorboxes should be used for the title page, section page etc. (default: \lstinline|true|)
+\item[blocks] controls if tcolorboxes should be used for beamer blocks (default: \saminline|true|)
+\item[inmargin] controls if the block titles are placed in the left sidebar instead of the top of the block, e.g. for themes like \saminline|Bergen| (default: \saminline|false|, but set to \saminline|true| if the \saminline|inmargin| inner theme is detected)
+\item[rounded] controls if corners are rounded or sharp (default: \saminline|false|, but set to \saminline|true| if the \saminline|rounded| inner theme is detected)
+\item[shaded] controls if there is a short colour gradient between the title and the body (default: \saminline|false|, but set to \saminline|true| if the block corners are rounded)
+\item[shadow] controls if the block has a shadow (default: \saminline|false|, but set to \saminline|true| if the \saminline|shadow| outer theme is detected)
+\item[showtitle] controls if a small coloured stripe is shown for blocks with empty title (default: \saminline|true|, but set to \saminline|false| if the block has rounded corners)
+\item[titlepage] controls if tcolorboxes should be used for the title page, section page etc. (default: \saminline|true|)
\end{description}
-These options can be set to \lstinline|true| or \lstinline|false| (calling either option without explicit \lstinline|true| or \lstinline|false| will set it to \lstinline|true|).
+These options can be set to \saminline|true| or \saminline|false| (calling either option without explicit \saminline|true| or \saminline|false| will set it to \saminline|true|).
-If one for example likes the Antibes theme, but prefers the blocks to have shadows, they can now easily be added: \nopagebreak
+If one, for example, likes the Antibes theme, but prefers the blocks to have shadows, they can now easily be added: \nopagebreak
\begin{tcblisting}{
+ title={Example},
listing and comment,
pdf comment,
freeze pdf,
compilable listing,
run pdflatex,
+ comment style={scale=2}
}
\documentclass{beamer}
\usetheme{Antibes}
@@ -173,46 +132,47 @@ If one for example likes the Antibes theme, but prefers the blocks to have shado
]{tcolorbox}
\begin{document}
\begin{frame}
-\begin{block}{Title}
- Body
-\end{block}
-\begin{alertblock}{Title}
- Body
-\end{alertblock}
-\begin{exampleblock}{Title}
- Body
-\end{exampleblock}
+ \begin{block}{Title}
+ Body
+ \end{block}
+ \begin{alertblock}{Title}
+ Body
+ \end{alertblock}
+ \begin{exampleblock}{Title}
+ Body
+ \end{exampleblock}
\end{frame}
\end{document}
\end{tcblisting}
-Beyond these two options, the users also has the myriads of options of the tcolobox package to their disposal, e.g.\ via \lstinline|\tcbset{...}| or \lstinline|\tcbsetforeverylayer{...}|:
+Beyond these two options, the users also has the myriads of options of the tcolobox package to their disposal, e.g.\ via \saminline|\tcbset{...}| or \saminline|\tcbsetforeverylayer{...}|:
\begin{tcblisting}{
+ title={Example},
listing and comment,
pdf comment,
freeze pdf,
compilable listing,
run pdflatex,
+ comment style={scale=2}
}
\documentclass{beamer}
\usetheme{Ilmenau}
\useinnertheme{tcolorbox}
\tcbsetforeverylayer{
- borderline={1pt}{0pt}{
- black,dashed}
+ borderline={1pt}{0pt}{black,dashed}
}
\begin{document}
\begin{frame}
-\begin{block}{Title}
- Body
-\end{block}
-\begin{alertblock}{Title}
- Body
-\end{alertblock}
-\begin{exampleblock}{Title}
- Body
-\end{exampleblock}
+ \begin{block}{Title}
+ Body
+ \end{block}
+ \begin{alertblock}{Title}
+ Body
+ \end{alertblock}
+ \begin{exampleblock}{Title}
+ Body
+ \end{exampleblock}
\end{frame}
\end{document}
\end{tcblisting}
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/README b/macros/latex/contrib/biblatex-contrib/biblatex-publist/README
index 10c4d180a9..3cebed7b7b 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/README
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/README
@@ -46,6 +46,9 @@ instructions.
== CHANGES ==
+* V. 2.9 (2025-05-09):
+ - Add bibchecks to exclude (specific kinds of) unpublished work.
+
* V. 2.8 (2024-03-08):
- Fix delimiter with plauthor second in a truncated author list (#50).
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf b/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf
index 2fd5c90dbe..fb8333ecf7 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf
Binary files differ
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex b/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex
index 19b80cb4f2..aa64fc9861 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex
@@ -115,7 +115,7 @@
\thanks{Please report issues via \protect\url{https://github.com/jspitz/biblatex-publist}.}%
}
-\date{Version 2.8, 2024/03/08}
+\date{Version 2.9, 2025/05/09}
\maketitle
\begin{abstract}
@@ -862,6 +862,28 @@ entries of diverse type and authors, specify:
Note that this method sometimes requires several reruns of \texttt{latex}
to fix the numbering.
+Sometimes you might also want to omit some publications from the list which are not yet
+published or not yet accepted (e.g., because they are under blind review and you do not
+want to reveal your identity yet). To this end, \bpl\ features some \joption{bibchecks}
+(for the concept, please refer to \cite[sec.~3.8.2]{bibltx}). Bibchecks can be activated
+by passing \joption{check=<bibcheck>} to the optional argument of \jfcsmacro{printbibliography}.
+
+The following bibchecks are available:
+\begin{itemize}
+ \item \joption{nosubmitted}: omits all entries with pubstate \joption{submitted}.
+ \item \joption{noprepared}: omits all entries with pubstate \joption{inpreparation}.
+ \item \joption{onlypublished}: omits all unpublished entries (i.e., entries that have
+ a pubstate) with the exception of \joption{prepublished} entries.
+ \item \joption{onlyaccepted}: omits all unpublished entries (i.e., entries that have
+ a pubstate) with the exception of \joption{prepublished} and \joption{forthcoming}
+ (and thus accepted) entries.
+\end{itemize}
+%
+Several of these bibchecks might be used in a row, e.g.:
+\begin{lstlisting}[moretexcs={[1]{printbibliography}}]
+\printbibliography[heading=none,filter=mine,check=nosubmitted,check=noprepared]
+\end{lstlisting}
+
\section{Sorting\label{sec:sorting}}
@@ -942,6 +964,11 @@ until further change).
\section{Revision Log}
\begin{description}
+ \item [{V. 2.9 (2025/05/09):}]~
+ \begin{itemize}
+ \item Add bibchecks to exclude (specific kinds of) unpublished work
+ (see sec.~\ref{sec:filtering}).
+ \end{itemize}
\item [{V. 2.8 (2024/03/08):}]~
\begin{itemize}
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx
index 7e955db150..c7d385b452 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx
@@ -25,8 +25,8 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\bpl@version{2.8}
-\def\bpl@rdate{2024/03/08}
+\def\bpl@version{2.9}
+\def\bpl@rdate{2025/05/09}
\ProvidesFile{publist.bbx}[\bpl@rdate\space v.\bpl@version\space
biblatex bibliography style (JSP)]
@@ -1105,6 +1105,43 @@
\defbibfilter{mine}{category=filtered}
+%
+% bibchecks
+%
+% check to exclude submitted work (which is under review)
+% from publist
+\defbibcheck{nosubmitted}{%
+ \edef\tmpps{\bibstring{submitted}}%
+ \iffieldequals{pubstate}{\tmpps}{\skipentry}{}%
+}
+
+% check to exclude work in preparation
+% from publist
+\defbibcheck{noprepared}{%
+ \edef\tmpps{\bibstring{inpreparation}}%
+ \iffieldequals{pubstate}{\tmpps}{\skipentry}{}%
+}
+
+% check to exclude all work which is not (pre-)published
+\defbibcheck{onlypublished}{%
+ \iffieldundef{pubstate}{}{%
+ \edef\tmpps{\bibstring{prepublished}}%
+ \iffieldequals{pubstate}{\tmpps}{}{\skipentry}%
+ }%
+}
+
+% check to exclude all work which is not accepted or published
+\defbibcheck{onlyaccepted}{%
+ \iffieldundef{pubstate}{}{%
+ \edef\tmpps{\bibstring{prepublished}}%
+ \edef\tmppss{\bibstring{forthcoming}}%
+ \iffieldequals{pubstate}{\tmpps}{}{%
+ \iffieldequals{pubstate}{\tmppss}{}{%
+ \skipentry}%
+ }%
+ }%
+}
+
%
% Count non-plauthors
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx
index d1b46b1ab9..bfc159a131 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx
@@ -26,8 +26,8 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\bpl@version{2.8}
-\def\bpl@rdate{2024/03/08}
+\def\bpl@version{2.9}
+\def\bpl@rdate{2025/05/09}
\ProvidesFile{publist.cbx}[\bpl@rdate\space v.\bpl@version\space
biblatex citation style (JSP)]
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx
index 87aebdbf2b..d43f60a465 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx
@@ -1,5 +1,5 @@
% publist.dbx, biblatex data model specification for the biblatex-publist
-% package, version 2.8 (2024/03/08).
+% package, version 2.9 (2025/05/09).
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/catppuccinpalette/README.md b/macros/latex/contrib/catppuccinpalette/README.md
new file mode 100644
index 0000000000..105e5497a4
--- /dev/null
+++ b/macros/latex/contrib/catppuccinpalette/README.md
@@ -0,0 +1,28 @@
+# Readme for the package catppuccinPalette
+
+Author: Lukas Heindl (`oss.heindl+latex@protonmail.com`).
+
+CTAN page: [catppuccinPalette](https://ctan.org/pkg/catppuccinpalette)
+
+## License
+The LaTeX package `catppuccinPalette` is distributed under the LPPL 1.3 license.
+
+## Description
+
+The LaTeX package `catppuccinPalette` provides new colors for xcolor.
+
+## Installation
+
+For a manual installation:
+
+* put the files `catppuccinpalette.ins` and `catppuccinpalette.dtx` in the same directory;
+* run `latex catppuccinpalette.ins` in that directory.
+
+The file `catppuccinpalette.sty` will be generated.
+
+The file `catppuccinpalette.sty` is the only file necessary to use the latex package `catppuccinPalette`.
+You have to put it in the same directory as your document or (best) in a `texmf` tree.
+
+Simplified version:
+
+* run `l3build unpack` to generate the `.sty` in `build/unpacked/`
diff --git a/macros/latex/contrib/catppuccinpalette/catppuccinpalette.dtx b/macros/latex/contrib/catppuccinpalette/catppuccinpalette.dtx
new file mode 100644
index 0000000000..f74df5dd95
--- /dev/null
+++ b/macros/latex/contrib/catppuccinpalette/catppuccinpalette.dtx
@@ -0,0 +1,422 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2024 by Lukas Heindl <oss.heindl+latex@protonmail.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 Lukas Heindl.
+%
+% This work consists of the files catppuccinpalette.dtx and catppuccinpalette.ins
+% and the derived filebase catppuccinpalette.sty.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{catppuccinpalette.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<package>\ProvidesPackage{catppuccinpalette}
+%<*package>
+ [2024/05/22 v1.0.2 catppuccin xcolor palette]
+%</package>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{catppuccinpalette}
+\usepackage{multicol}
+\usepackage{pgffor}
+\usepackage{tabularx, booktabs}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{catppuccinpalette.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{111}
+%
+% \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.1}{2024/02/09}{Converted to DTX file}
+% \changes{v1.0.0}{2024/02/27}{First full release}
+% \changes{v1.0.1}{2024/05/19}{Make fit for CTAN}
+% \changes{v1.0.2}{2024/05/19}{Fix colors in documentation}
+%
+% \DoNotIndex{\newcommand,\newenvironment,\color,\colorlet,\def,\fi,\RequirePackage,\ProvidesPackage,\ProcessPgfOptions,\preparecolorset,\pgfkeys,\pagecolor,\newif,\NeedsTeXFormat}
+%
+% \providecommand*{\url}{\texttt}
+% \GetFileInfo{catppuccinpalette.dtx}
+% \title{The \textsf{catppuccinPalette} package}
+% \author{Lukas Heindl \\ \url{oss.heindl+latex@protonmail.com} \\ \url{https://github.com/atticus-sullivan/catpuccinPalette}}
+% \date{\fileversion~from \filedate}
+%
+% \maketitle
+%
+% \begin{abstract}
+% The LaTeX package \pkg{catppuccinPalette} provides new colors for xcolor.
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% Catppuccin\footnote{\url{https://github.com/catppuccin/catppuccin}} is a nice
+% pastel theme in 4 flavours/styles (\emph{Latte}, \emph{Frapp\'e},
+% \emph{Macchiato}, \emph{Mocha}). This package defines these themes as xcolor
+% colors.
+%
+% \section{Usage}
+%
+% Load via |\usepackage{catppuccinpalette}|
+%
+% Just use the new colors (prefixed with \verb|Cat<Style>|) like normal xcolors.
+% In addition to the usual colors of the palette, this package defines some
+% colors according to the
+% style guide\footnote{\url{https://github.com/catppuccin/catppuccin/blob/main/docs/style-guide.md}}
+% for ease of use.
+%
+% This package also allows you to set a specific style which sets the shortened
+% color names (prefixed only with \verb|Cat|) to the selected style (allows for
+% easy switching style) via the package option \verb|style|.
+%
+% This package loads xcolor (without options) so if you want to set some xcolor
+% options you should load xcolor before loading this package.
+%
+% \subsection{Package options}
+% \begin{tabularx}{\linewidth}{lX}
+% \emph{Option} & \emph{Description}
+% \\\toprule
+% \verb|style| &
+% set the style used by the shortened prefix (\verb|Cat|). Possible values:
+% \verb|Latte| (default+initial), \verb|latte|, \verb|Frappe|, \verb|frappe|,
+% \verb|Mocha|, \verb|mocha|
+% \\
+% \verb|textcolor| &
+% set the default textcolor of the document to \verb|CatText|. Possible values:
+% \verb|false| (default+initial), \verb|true|
+% \\
+% \verb|pagecolor| &
+% set the pagecolor of the document to \verb|CatBackground|. Possible values:
+% \verb|false| (default+initial), \verb|true|
+% \\\midrule
+% \verb|styleAll| &
+% shortcut for setting \verb|pagecolor| and \verb|textcolor|
+% \\\bottomrule
+% \end{tabularx}
+%
+% \subsection{Colors}
+% \newcommand{\showCol}[1]{\raisebox{0.5ex}{\fcolorbox{black}{#1}{\hspace{1em}}} #1}
+% \foreach \Style in {Latte,Frappe,Macchiato,Mocha}{
+% \subsubsection{Style \texttt{\Style}}
+% \begin{multicols}{2}
+% \showCol{Cat\Style Blue}\par
+% \showCol{Cat\Style Rosewater}\par
+% \showCol{Cat\Style Flamingo}\par
+% \showCol{Cat\Style Pink}\par
+% \showCol{Cat\Style Mauve}\par
+% \showCol{Cat\Style Red}\par
+% \showCol{Cat\Style Maroon}\par
+% \showCol{Cat\Style Peach}\par
+% \showCol{Cat\Style Yellow}\par
+% \showCol{Cat\Style Green}\par
+% \showCol{Cat\Style Teal}\par
+% \showCol{Cat\Style Sky}\par
+% \showCol{Cat\Style Sapphire}\par
+% \showCol{Cat\Style Blue}\par
+% \showCol{Cat\Style Lavender}\par
+% \showCol{Cat\Style Text}\par
+% \showCol{Cat\Style Subtext1}\par
+% \showCol{Cat\Style Subtext0}\par
+% \showCol{Cat\Style Overlay2}\par
+% \showCol{Cat\Style Overlay1}\par
+% \showCol{Cat\Style Overlay0}\par
+% \showCol{Cat\Style Surface2}\par
+% \showCol{Cat\Style Surface1}\par
+% \showCol{Cat\Style Surface0}\par
+% \showCol{Cat\Style Base}\par
+% \showCol{Cat\Style Mantle}\par
+% \showCol{Cat\Style Crust}\par
+% \end{multicols}
+%
+% Some basic colors according to the style guide:
+%
+% \begin{multicols}{2}
+% \showCol{Cat\Style Background}\par
+% \showCol{Cat\Style Link}\par
+% \phantom{}\par
+% \columnbreak
+% \showCol{Cat\Style Success}\par
+% \showCol{Cat\Style Warning}\par
+% \showCol{Cat\Style Error}\par
+% \end{multicols}
+%
+% }
+%
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/06/01]
+\RequirePackage{pgfopts}
+\RequirePackage{xcolor}
+% \end{macrocode}
+% Define the conditionals used by package options
+% \begin{macrocode}
+\newif\ifcatppuccinpalette@pagecolor
+\newif\ifcatppuccinpalette@textcolor
+\pgfkeys{
+ /catppuccinPalette/.cd,
+% \end{macrocode}
+% Define the package option keys
+% \begin{macrocode}
+ style/.is choice,
+ style/.value required,
+ style/Latte/.code = {\def\catppuccinpalette@style{Latte}},
+ style/latte/.forward to = /catppuccinPalette/style/Latte,
+ style/Frappe/.code = {\def\catppuccinpalette@style{Frappe}},
+ style/frappe/.forward to = /catppuccinPalette/style/frappe,
+ style/Macchiato/.code = {\def\catppuccinpalette@style{Macchiato}},
+ style/macchiato/.forward to = /catppuccinPalette/style/Macchiato,
+ style/Mocha/.code = {\def\catppuccinpalette@style{Mocha}},
+ style/mocha/.forward to = /catppuccinPalette/style/Mocha,
+ textcolor/.is if = catppuccinpalette@textcolor,
+ textcolor/.default = true,
+ pagecolor/.is if = catppuccinpalette@pagecolor,
+ pagecolor/.default = true,
+ styleAll/.style = {pagecolor,textcolor},
+% \end{macrocode}
+% Set initial values for all options
+% \begin{macrocode}
+ textcolor = false,
+ pagecolor = false,
+ style = Latte,
+}
+\ProcessPgfOptions*
+% \end{macrocode}
+% Define the \emph{Latte} colorset
+% \begin{macrocode}
+\preparecolorset{RGB/HTML}{CatLatte}{}{%
+ Rosewater,220,138,120/DC8A78;%
+ Flamingo,221,120,120/DD7878;%
+ Pink,234,118,203/EA76CB;%
+ Mauve,136,57,239/8839EF;%
+ Red,210,15,57/D20F39;%
+ Maroon,230,69,83/E64553;%
+ Peach,254,100,11/FE640B;%
+ Yellow,223,142,29/DF8E1D;%
+ Green,64,160,43/40A02B;%
+ Teal,23,146,153/179299;%
+ Sky,4,165,229/04A5E5;%
+ Sapphire,32,159,181/209FB5;%
+ Blue,30,102,245/1E66F5;%
+ Lavender,114,135,253/7287FD;%
+ Text,76,79,105/4C4F69;%
+ Subtext1,92,95,119/5C5F77;%
+ Subtext0,108,111,133/6C6F85;%
+ Overlay2,124,127,147/7C7F93;%
+ Overlay1,140,143,161/8C8FA1;%
+ Overlay0,156,160,176/9CA0B0;%
+ Surface2,172,176,190/ACB0BE;%
+ Surface1,188,192,204/BCC0CC;%
+ Surface0,204,208,218/CCD0DA;%
+ Base,239,241,245/EFF1F5;%
+ Mantle,230,233,239/E6E9EF;%
+ Crust,220,224,232/DCE0E8%
+}
+% \end{macrocode}
+% Define colors according to the catppuccin style guide
+% \begin{macrocode}
+\colorlet{CatLatteBackground}{CatLatteBase}
+\colorlet{CatLatteLink}{CatLatteBlue}
+\colorlet{CatLatteSuccess}{CatLatteGreen}
+\colorlet{CatLatteWarning}{CatLatteYellow}
+\colorlet{CatLatteError}{CatLatteRed}
+% \end{macrocode}
+% Define the styles \emph{Frappe}, \emph{Macchiato} and \emph{Mocha} accordingly
+% \begin{macrocode}
+\preparecolorset{RGB/HTML}{CatFrappe}{}{%
+ Rosewater,242,213,207/F2D5CF;%
+ Flamingo,238,190,190/EEBEBE;%
+ Pink,244,184,228/F4B8E4;%
+ Mauve,202,158,230/CA9EE6;%
+ Red,231,130,132/E78284;%
+ Maroon,234,153,156/EA999C;%
+ Peach,239,159,118/EF9F76;%
+ Yellow,229,200,144/E5C890;%
+ Green,166,209,137/A6D189;%
+ Teal,129,200,190/81C8BE;%
+ Sky,153,209,219/99D1DB;%
+ Sapphire,133,193,220/85C1DC;%
+ Blue,140,170,238/8CAAEE;%
+ Lavender,186,187,241/BABBF1;%
+ Text,198,208,245/C6D0F5;%
+ Subtext1,181,191,226/B5BFE2;%
+ Subtext0,165,173,206/A5ADCE;%
+ Overlay2,148,156,187/949CBB;%
+ Overlay1,131,139,167/838BA7;%
+ Overlay0,115,121,148/737994;%
+ Surface2,98,104,128/626880;%
+ Surface1,81,87,109/51576D;%
+ Surface0,65,69,89/414559;%
+ Base,48,52,70/303446;%
+ Mantle,41,44,60/292C3C;%
+ Crust,35,38,52/232634%
+}
+\colorlet{CatFrappeBackground}{CatFrappeBase}
+\colorlet{CatFrappeLink}{CatFrappeBlue}
+\colorlet{CatFrappeSuccess}{CatFrappeGreen}
+\colorlet{CatFrappeWarning}{CatFrappeYellow}
+\colorlet{CatFrappeError}{CatFrappeRed}
+\preparecolorset{RGB/HTML}{CatMacchiato}{}{%
+ Rosewater,244,219,214/F4DBD6;%
+ Flamingo,240,198,198/F0C6C6;%
+ Pink,245,189,230/F5BDE6;%
+ Mauve,198,160,246/C6A0F6;%
+ Red,237,135,150/ED8796;%
+ Maroon,238,153,160/EE99A0;%
+ Peach,245,169,127/F5A97F;%
+ Yellow,238,212,159/EED49F;%
+ Green,166,218,149/A6DA95;%
+ Teal,139,213,202/8BD5CA;%
+ Sky,145,215,227/91D7E3;%
+ Sapphire,125,196,228/7DC4E4;%
+ Blue,138,173,244/8AADF4;%
+ Lavender,183,189,248/B7BDF8;%
+ Text,202,211,245/CAD3F5;%
+ Subtext1,184,192,224/B8C0E0;%
+ Subtext0,165,173,203/A5ADCB;%
+ Overlay2,147,154,183/939AB7;%
+ Overlay1,128,135,162/8087A2;%
+ Overlay0,110,115,141/6E738D;%
+ Surface2,91,96,120/5B6078;%
+ Surface1,73,77,100/494D64;%
+ Surface0,54,58,79/363A4F;%
+ Base,36,39,58/24273A;%
+ Mantle,30,32,48/1E2030;%
+ Crust,24,25,38/181926%
+}
+\colorlet{CatMacchiatoBackground}{CatMacchiatoBase}
+\colorlet{CatMacchiatoLink}{CatMacchiatoBlue}
+\colorlet{CatMacchiatoSuccess}{CatMacchiatoGreen}
+\colorlet{CatMacchiatoWarning}{CatMacchiatoYellow}
+\colorlet{CatMacchiatoError}{CatMacchiatoRed}
+\preparecolorset{RGB/HTML}{CatMocha}{}{%
+ Rosewater,245,224,220/F5E0DC;%
+ Flamingo,242,205,205/F2CDCD;%
+ Pink,245,194,231/F5C2E7;%
+ Mauve,203,166,247/CBA6F7;%
+ Red,243,139,168/F38BA8;%
+ Maroon,235,160,172/EBA0AC;%
+ Peach,250,179,135/FAB387;%
+ Yellow,249,226,175/F9E2AF;%
+ Green,166,227,161/A6E3A1;%
+ Teal,148,226,213/94E2D5;%
+ Sky,137,220,235/89DCEB;%
+ Sapphire,116,199,236/74C7EC;%
+ Blue,137,180,250/89B4FA;%
+ Lavender,180,190,254/B4BEFE;%
+ Text,205,214,244/CDD6F4;%
+ Subtext1,186,194,222/BAC2DE;%
+ Subtext0,166,173,200/A6ADC8;%
+ Overlay2,147,153,178/9399B2;%
+ Overlay1,127,132,156/7F849C;%
+ Overlay0,108,112,134/6C7086;%
+ Surface2,88,91,112/585B70;%
+ Surface1,69,71,90/45475A;%
+ Surface0,49,50,68/313244;%
+ Base,30,30,46/1E1E2E;%
+ Mantle,24,24,37/181825;%
+ Crust,17,17,27/11111B%
+}
+% \end{macrocode}
+% Define shortcuts for active style
+% \begin{macrocode}
+\colorlet{CatMochaBackground}{CatMochaBase}
+\colorlet{CatMochaLink}{CatMochaBlue}
+\colorlet{CatMochaSuccess}{CatMochaGreen}
+\colorlet{CatMochaWarning}{CatMochaYellow}
+\colorlet{CatMochaError}{CatMochaRed}
+\colorlet{CatRosewater}{Cat\catppuccinpalette@style Rosewater}
+\colorlet{CatFlamingo}{Cat\catppuccinpalette@style Flamingo}
+\colorlet{CatPink}{Cat\catppuccinpalette@style Pink}
+\colorlet{CatMauve}{Cat\catppuccinpalette@style Mauve}
+\colorlet{CatRed}{Cat\catppuccinpalette@style Red}
+\colorlet{CatMaroon}{Cat\catppuccinpalette@style Maroon}
+\colorlet{CatPeach}{Cat\catppuccinpalette@style Peach}
+\colorlet{CatYellow}{Cat\catppuccinpalette@style Yellow}
+\colorlet{CatGreen}{Cat\catppuccinpalette@style Green}
+\colorlet{CatTeal}{Cat\catppuccinpalette@style Teal}
+\colorlet{CatSky}{Cat\catppuccinpalette@style Sky}
+\colorlet{CatSapphire}{Cat\catppuccinpalette@style Sapphire}
+\colorlet{CatBlue}{Cat\catppuccinpalette@style Blue}
+\colorlet{CatLavender}{Cat\catppuccinpalette@style Lavender}
+\colorlet{CatText}{Cat\catppuccinpalette@style Text}
+\colorlet{CatSubtext1}{Cat\catppuccinpalette@style Subtext1}
+\colorlet{CatSubtext0}{Cat\catppuccinpalette@style Subtext0}
+\colorlet{CatOverlay2}{Cat\catppuccinpalette@style Overlay2}
+\colorlet{CatOverlay1}{Cat\catppuccinpalette@style Overlay1}
+\colorlet{CatOverlay0}{Cat\catppuccinpalette@style Overlay0}
+\colorlet{CatSurface2}{Cat\catppuccinpalette@style Surface2}
+\colorlet{CatSurface1}{Cat\catppuccinpalette@style Surface1}
+\colorlet{CatSurface0}{Cat\catppuccinpalette@style Surface0}
+\colorlet{CatBase}{Cat\catppuccinpalette@style Base}
+\colorlet{CatMantle}{Cat\catppuccinpalette@style Mantle}
+\colorlet{CatCrust}{Cat\catppuccinpalette@style Crust}
+\colorlet{CatBackground}{Cat\catppuccinpalette@style Base}
+\colorlet{CatLink}{Cat\catppuccinpalette@style Blue}
+\colorlet{CatSuccess}{Cat\catppuccinpalette@style Green}
+\colorlet{CatWarning}{Cat\catppuccinpalette@style Yellow}
+\colorlet{CatError}{Cat\catppuccinpalette@style Red}
+% \end{macrocode}
+% Set (only initial) pagecolor according to the style guide if the user wants this
+% \begin{macrocode}
+\ifcatppuccinpalette@pagecolor
+ \pagecolor{CatBackground}
+\fi
+% \end{macrocode}
+% Set textcolor according to the style guide if the user wants this
+% \begin{macrocode}
+\ifcatppuccinpalette@textcolor
+ \color{CatText}
+\fi
+% \end{macrocode}
+\endinput
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/catppuccinpalette/catppuccinpalette.ins b/macros/latex/contrib/catppuccinpalette/catppuccinpalette.ins
new file mode 100644
index 0000000000..c93b929dcd
--- /dev/null
+++ b/macros/latex/contrib/catppuccinpalette/catppuccinpalette.ins
@@ -0,0 +1,57 @@
+%% Copyright (C) 2024 by Lukas Heindl <oss.heindl+latex@protonmail.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 Lukas Heindl.
+%%
+%% This work consists of the files catppuccinpalette.dtx and catppuccinpalette.ins
+%% and the derived filebase catppuccinpalette.sty.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/catppuccinpalette}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2024 by Lukas Heindl <oss.heindl+latex@protonmail.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{catppuccinpalette.sty}{\from{catppuccinpalette.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{* catppuccinpalette.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file catppuccinpalette.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/macros/latex/contrib/catppuccinpalette/catppuccinpalette.pdf b/macros/latex/contrib/catppuccinpalette/catppuccinpalette.pdf
new file mode 100644
index 0000000000..8a5e2d9c89
--- /dev/null
+++ b/macros/latex/contrib/catppuccinpalette/catppuccinpalette.pdf
Binary files differ
diff --git a/macros/latex/contrib/colorblind/ChangeLog b/macros/latex/contrib/colorblind/ChangeLog
new file mode 100644
index 0000000000..a864cd215e
--- /dev/null
+++ b/macros/latex/contrib/colorblind/ChangeLog
@@ -0,0 +1,7 @@
+Package `colorblind` by Simon Pfahler
+https://github.com/simon-pfahler/colorblind
+
+History
+=======
+2024/05/12 v1.0
+* First published release.
diff --git a/macros/latex/contrib/colorblind/README.md b/macros/latex/contrib/colorblind/README.md
new file mode 100644
index 0000000000..0fd83d42f8
--- /dev/null
+++ b/macros/latex/contrib/colorblind/README.md
@@ -0,0 +1,23 @@
+## Package `colorblind` by Simon Pfahler
+
+Version 2024-05-12 v1.0
+
+In colorblind-safe documents, the contents are presented in a way that the same information is conveyed to readers regardless of a potential color vision deficiency.
+This package provides the tools necessary for colorblind-safe typesetting in LaTeX.
+It provides color schemes for a wide range of applications.
+The most commonly used schemes are qualitative schemes, providing easily distinguishable colors for use in graphics, but also for text coloring or highlighting.
+Additionally, diverging and sequential schemes are included which can be used for encoding quantitative information in the colors of a graphic.
+Therefore, colorblind-safeness is incorporated into the writing process, making it both less cumbersome and less error-prone.
+
+## Copyright (C)
+- 2023-2024 Simon Pfahler
+
+## License
+LaTeX Project Public License, version 1.3c or later.
+
+## Notes
+This package is available on github:
+https://github.com/simon-pfahler/colorblind
+
+If you find any bugs, please report them there.
+
diff --git a/macros/latex/contrib/colorblind/bib.bib b/macros/latex/contrib/colorblind/bib.bib
new file mode 100644
index 0000000000..4639115ad7
--- /dev/null
+++ b/macros/latex/contrib/colorblind/bib.bib
@@ -0,0 +1,43 @@
+%%
+%% ----------------------------------------------------------------
+%% Copyright (C) 2023-2024 by Simon Pfahler <simon.pfahler at ur dot de>
+%% ----------------------------------------------------------------
+%%
+@online{Tol,
+ author = {Paul Tol},
+ title = {Paul Tol's Notes: Colour schemes and templates},
+ year = {2021},
+ url = {https://personal.sron.nl/~pault/},
+ urldate = {2023-12-29},
+}
+
+@inproceedings{Ichihara_2008,
+ author = {Yasuyo G. Ichihara and Masataka Okabe and Koichi Iga and Yosuke Tanaka and Kohei Musha and Kei Ito},
+ title = {{Color universal design: the selection of four easily distinguishable colors for all color vision types}},
+ year = {2008},
+ volume = {6807},
+ booktitle = {Color Imaging XIII: Processing, Hardcopy, and Applications},
+ editor = {Reiner Eschbach and Gabriel G. Marcu and Shoji Tominaga},
+ organization = {International Society for Optics and Photonics},
+ publisher = {SPIE},
+ pages = {68070O},
+ keywords = {Color Universal Design, color vision, color category, visual communication},
+ doi = {10.1117/12.765420},
+ url = {https://doi.org/10.1117/12.765420},
+}
+
+@article{Wong_2011,
+ author={Wong, Bang},
+ title={Points of view: Color blindness},
+ journal={Nature Methods},
+ year={2011},
+ month={Jun},
+ day={01},
+ volume={8},
+ number={6},
+ pages={441-441},
+ issn={1548-7105},
+ doi={10.1038/nmeth.1618},
+ url={https://doi.org/10.1038/nmeth.1618}
+}
+
diff --git a/macros/latex/contrib/colorblind/colorblind.sty b/macros/latex/contrib/colorblind/colorblind.sty
new file mode 100644
index 0000000000..a549ea06f9
--- /dev/null
+++ b/macros/latex/contrib/colorblind/colorblind.sty
@@ -0,0 +1,398 @@
+%%
+%% ----------------------------------------------------------------
+%% Copyright (C) 2023-2024 by Simon Pfahler <simon.pfahler at ur dot de>
+%% ----------------------------------------------------------------
+%%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{colorblind}[2024/05/12 Easy colorblind-safe typesetting]
+
+\RequirePackage{xcolor}
+\RequirePackage{ifthen}
+\RequirePackage{tikz}
+\usetikzlibrary{math}
+\RequirePackage{pgfplots}
+\pgfplotsset{compat=1.18}
+
+\DeclareOption{Tol}{
+%>>> Color schemes by Paul Tol, source: https://personal.sron.nl/~pault
+%
+%>>> Qualitative color schemes
+%
+% Bright Qualitative color scheme
+\providecolorset{RGB}{T-Q-B}{}{%
+ 1,68,119,170;%
+ 2,102,204,238;%
+ 3,34,136,51;%
+ 4,204,187,68;%
+ 5,238,102,119;%
+ 6,170,51,119;%
+ 0,187,187,187%
+}
+%
+% High-contrast qualitative color scheme
+\providecolorset{RGB}{T-Q-HC}{}{%
+ 1,255,255,255;%
+ 2,221,170,51;%
+ 3,187,85,102;%
+ 4,0,68,136;%
+ 0,0,0,0%
+}
+%
+% Vibrant qualitative color scheme
+\providecolorset{RGB}{T-Q-V}{}{%
+ 1,0,119,187;%
+ 2,51,187,238;%
+ 3,0,153,136;%
+ 4,238,119,51;%
+ 5,204,51,17;%
+ 6,238,51,119;%
+ 0,187,187,187%
+}
+%
+% Muted qualitative color scheme
+\providecolorset{RGB}{T-Q-M}{}{%
+ 1,51,34,136;%
+ 2,136,204,238;%
+ 3,68,170,153;%
+ 4,153,153,51;%
+ 5,221,204,119;%
+ 6,204,102,119;%
+ 7,136,34,85;%
+ 8,170,68,153;%
+ 0,221,221,221%
+}
+%
+% Medium-contrast qualitative color scheme
+\providecolorset{RGB}{T-Q-MC}{}{%
+ 1,255,255,255;%
+ 2,238,204,102;%
+ 3,238,153,170;%
+ 4,102,153,204;%
+ 5,153,119,0;%
+ 6,153,68,85;%
+ 7,0,68,136;%
+ 0,0,0,0%
+}
+%
+% Pale qualitative color scheme, for highlighting
+\providecolorset{RGB}{T-Q-PH}{}{%
+ 1,187,204,238;%
+ 2,204,238,255;%
+ 3,204,221,170;%
+ 4,238,238,187;%
+ 5,255,204,204;%
+ 0,221,221,221%
+}
+%
+% Dark qualitative color scheme, for text colors
+\providecolorset{RGB}{T-Q-DT}{}{%
+ 1,34,34,85;%
+ 2,34,85,85;%
+ 3,34,85,34;%
+ 4,102,102,51;%
+ 5,102,51,51;%
+ 0,85,85,85%
+}
+%
+% Light qualitative color scheme
+\providecolorset{RGB}{T-Q-L}{}{%
+ 1,119,170,221;%
+ 2,153,221,255;%
+ 3,68,187,153;%
+ 4,187,204,51;%
+ 5,170,170,0;%
+ 6,238,221,136;%
+ 7,238,136,102;%
+ 8,255,170,187;%
+ 0,221,221,221%
+}
+%
+%<<< Qualitative color schemes
+%
+%>>> Diverging color schemes
+%
+% Sunset diverging color scheme
+\providecolorset{RGB}{T-D-S}{}{%
+ 1,54,75,154;%
+ 2,74,123,183;%
+ 3,110,166,205;%
+ 4,152,202,225;%
+ 5,194,228,239;%
+ 6,234,236,204;%
+ 7,254,218,139;%
+ 8,253,179,102;%
+ 9,246,126,75;%
+ 10,221,61,45;%
+ 11,165,0,38;%
+ 0,255,255,255%
+}
+\pgfplotsset{
+ colormap={T-D-S}{color(0)=(T-D-S1) color(1)=(T-D-S2) color(2)=(T-D-S3) color(3)=(T-D-S4) color(4)=(T-D-S5) color(5)=(T-D-S6) color(6)=(T-D-S7) color(7)=(T-D-S8) color(8)=(T-D-S9) color(9)=(T-D-S10) color(10)=(T-D-S11)}
+}
+%
+% Nightfall diverging color scheme
+\providecolorset{RGB}{T-D-N}{}{%
+ 1,18,90,86;%
+ 2,0,118,123;%
+ 3,35,143,157;%
+ 4,66,167,198;%
+ 5,96,188,233;%
+ 6,157,204,239;%
+ 7,198,219,237;%
+ 8,222,230,231;%
+ 9,236,234,218;%
+ 10,240,230,178;%
+ 11,249,213,118;%
+ 12,255,185,84;%
+ 13,253,154,68;%
+ 14,245,118,52;%
+ 15,233,76,31;%
+ 16,209,24,7;%
+ 17,160,24,19;%
+ 0,255,255,255%
+}
+\pgfplotsset{
+ colormap={T-D-N}{color(0)=(T-D-N1) color(1)=(T-D-N2) color(2)=(T-D-N3) color(3)=(T-D-N4) color(4)=(T-D-N5) color(5)=(T-D-N6) color(6)=(T-D-N7) color(7)=(T-D-N8) color(8)=(T-D-N9) color(9)=(T-D-N10) color(10)=(T-D-N11) color(11)=(T-D-N12) color(12)=(T-D-N13) color(13)=(T-D-N14) color(14)=(T-D-N15) color(15)=(T-D-N16) color(16)=(T-D-N17)}
+}
+%
+% BuRd diverging color scheme
+\providecolorset{RGB}{T-D-BR}{}{%
+ 1,32,102,172;%
+ 2,67,147,195;%
+ 3,146,197,222;%
+ 4,209,229,240;%
+ 5,247,247,247;%
+ 6,253,219,199;%
+ 7,244,165,130;%
+ 8,214,96,77;%
+ 9,178,24,43;%
+ 0,255,238,153%
+}
+\pgfplotsset{
+ colormap={T-D-BR}{color(0)=(T-D-BR1) color(1)=(T-D-BR2) color(2)=(T-D-BR3) color(3)=(T-D-BR4) color(4)=(T-D-BR5) color(5)=(T-D-BR6) color(6)=(T-D-BR7) color(7)=(T-D-BR8) color(8)=(T-D-BR9)}
+}
+%
+% PRGn diverging color scheme
+\providecolorset{RGB}{T-D-PG}{}{%
+ 1,118,42,131;%
+ 2,153,112,171;%
+ 3,194,165,207;%
+ 4,231,212,232;%
+ 5,247,247,247;%
+ 6,217,240,211;%
+ 7,172,211,158;%
+ 8,90,174,97;%
+ 9,27,120,55;%
+ 0,255,238,153%
+}
+\pgfplotsset{
+ colormap={T-D-PG}{color(0)=(T-D-PG1) color(1)=(T-D-PG2) color(2)=(T-D-PG3) color(3)=(T-D-PG4) color(4)=(T-D-PG5) color(5)=(T-D-PG6) color(6)=(T-D-PG7) color(7)=(T-D-PG8) color(8)=(T-D-PG9)}
+}
+%
+%<<< Diverging color schemes
+%
+%>>> Sequential color schemes
+%
+% YlOrBr sequential color scheme
+\providecolorset{RGB}{T-S-YOB}{}{%
+ 1,255,255,229;%
+ 2,255,247,188;%
+ 3,254,227,145;%
+ 4,254,196,79;%
+ 5,251,154,41;%
+ 6,236,112,20;%
+ 7,204,76,2;%
+ 8,153,52,4;%
+ 9,102,37,6;%
+ 0,136,136,136%
+}
+\pgfplotsset{
+ colormap={T-S-YOB}{color(0)=(T-S-YOB1) color(1)=(T-S-YOB2) color(2)=(T-S-YOB3) color(3)=(T-S-YOB4) color(4)=(T-S-YOB5) color(5)=(T-S-YOB6) color(6)=(T-S-YOB7) color(7)=(T-S-YOB8) color(8)=(T-S-YOB9)}
+}
+%
+% Iridescent sequential color scheme
+\providecolorset{RGB}{T-S-IR}{}{%
+ 1,254,251,233;%
+ 2,252,247,213;%
+ 3,245,243,193;%
+ 4,234,240,181;%
+ 5,221,236,191;%
+ 6,208,231,202;%
+ 7,194,227,210;%
+ 8,181,221,216;%
+ 9,168,216,220;%
+ 10,155,210,225;%
+ 11,141,203,228;%
+ 12,129,196,231;%
+ 13,123,188,231;%
+ 14,126,178,228;%
+ 15,136,165,221;%
+ 16,147,152,210;%
+ 17,155,138,196;%
+ 18,157,125,178;%
+ 19,154,112,158;%
+ 20,144,99,136;%
+ 21,128,87,112;%
+ 22,104,73,87;%
+ 23,70,53,58;%
+ 0,153,153,153%
+}
+\pgfplotsset{
+ colormap={T-S-IR}{color(0)=(T-S-IR1) color(1)=(T-S-IR2) color(2)=(T-S-IR3) color(3)=(T-S-IR4) color(4)=(T-S-IR5) color(5)=(T-S-IR6) color(6)=(T-S-IR7) color(7)=(T-S-IR8) color(8)=(T-S-IR9) color(9)=(T-S-IR10) color(10)=(T-S-IR11) color(11)=(T-S-IR12) color(12)=(T-S-IR13) color(13)=(T-S-IR14) color(14)=(T-S-IR15) color(15)=(T-S-IR16) color(16)=(T-S-IR17) color(17)=(T-S-IR18) color(18)=(T-S-IR19) color(19)=(T-S-IR20) color(20)=(T-S-IR21) color(21)=(T-S-IR22) color(22)=(T-S-IR23)}
+}
+%
+% Incandescent sequential color scheme
+\providecolorset{RGB}{T-S-IN}{}{%
+ 1,206,255,255;%
+ 2,198,247,214;%
+ 3,162,244,155;%
+ 4,187,228,83;%
+ 5,213,206,4;%
+ 6,231,181,3;%
+ 7,241,153,3;%
+ 8,246,121,11;%
+ 9,249,73,2;%
+ 10,228,5,21;%
+ 11,168,0,3;%
+ 0,136,136,136%
+}
+\pgfplotsset{
+ colormap={T-S-IN}{color(0)=(T-S-IN1) color(1)=(T-S-IN2) color(2)=(T-S-IN3) color(3)=(T-S-IN4) color(4)=(T-S-IN5) color(5)=(T-S-IN6) color(6)=(T-S-IN7) color(7)=(T-S-IN8) color(8)=(T-S-IN9) color(9)=(T-S-IN10) color(10)=(T-S-IN11)}
+}
+%
+% Discrete rainbow color scheme
+\providecolorset{RGB}{T-S-DR}{}{%
+ 1,209,187,215;%
+ 2,174,118,163;%
+ 3,136,46,114;%
+ 4,25,101,176;%
+ 5,82,137,199;%
+ 6,123,175,222;%
+ 7,78,178,101;%
+ 8,144,201,135;%
+ 9,202,224,171;%
+ 10,247,240,86;%
+ 11,246,193,65;%
+ 12,241,147,45;%
+ 13,232,96,28;%
+ 14,220,5,12;%
+ 0,119,119,119%
+}
+%
+\providecolorset{RGB}{T-S-SR}{}{%
+ 1,232,236,251;%
+ 2,221,216,239;%
+ 3,209,193,225;%
+ 4,195,168,209;%
+ 5,181,143,194;%
+ 6,167,120,180;%
+ 7,155,98,167;%
+ 8,140,78,153;%
+ 9,111,76,155;%
+ 10,96,89,169;%
+ 11,85,104,184;%
+ 12,78,121,197;%
+ 13,77,138,198;%
+ 14,78,150,188;%
+ 15,84,158,179;%
+ 16,89,165,169;%
+ 17,96,171,158;%
+ 18,105,177,144;%
+ 19,119,183,125;%
+ 20,140,188,104;%
+ 21,166,190,84;%
+ 22,190,188,72;%
+ 23,209,181,65;%
+ 24,221,170,60;%
+ 25,228,156,57;%
+ 26,231,140,53;%
+ 27,230,121,50;%
+ 28,228,99,45;%
+ 29,223,72,40;%
+ 30,218,34,34;%
+ 31,184,34,30;%
+ 32,149,33,27;%
+ 33,114,30,23;%
+ 34,82,26,19;%
+ 0,102,102,102%
+}
+\pgfplotsset{
+ colormap={T-S-SR}{color(0)=(T-S-SR1) color(1)=(T-S-SR2) color(2)=(T-S-SR3) color(3)=(T-S-SR4) color(4)=(T-S-SR5) color(5)=(T-S-SR6) color(6)=(T-S-SR7) color(7)=(T-S-SR8) color(8)=(T-S-SR9) color(9)=(T-S-SR10) color(10)=(T-S-SR11) color(11)=(T-S-SR12) color(12)=(T-S-SR13) color(13)=(T-S-SR14) color(14)=(T-S-SR15) color(15)=(T-S-SR16) color(16)=(T-S-SR17) color(17)=(T-S-SR18) color(18)=(T-S-SR19) color(19)=(T-S-SR20) color(20)=(T-S-SR21) color(21)=(T-S-SR22) color(22)=(T-S-SR23) color(23)=(T-S-SR24) color(24)=(T-S-SR25) color(25)=(T-S-SR26) color(26)=(T-S-SR27) color(27)=(T-S-SR28) color(28)=(T-S-SR29) color(29)=(T-S-SR30) color(30)=(T-S-SR31) color(31)=(T-S-SR32) color(32)=(T-S-SR33) color(33)=(T-S-SR34)}
+}
+%
+%<<< Sequential color schemes
+%
+%<<< Color schemes by Paul Tol, source: https://personal.sron.nl/~pault
+}
+
+\DeclareOption{OkabeIto}{
+%>>> Qualitative color scheme by Okabe and Ito
+\providecolorset{RGB}{OI}{}{%
+ 1,230,159,0;%
+ 2,86,180,233;%
+ 3,0,158,115;%
+ 4,240,228,66;%
+ 5,0,114,178;%
+ 6,213,94,0;%
+ 7,204,121,167;%
+ 0,0,0,0%
+}
+%<<< Qualitative color scheme by Okabe and Ito
+}
+
+\DeclareOption*{\PackageWarning{colorblind}{Unknown '\CurrentOption'}}
+\ProcessOptions\relax
+
+%>>> Function to print a discrete color scheme
+\newcommand\@drawSchemeRadius{0.7cm}
+\newcommand\@drawSchemeOffset{1cm}
+\newcounter{ColorNum}
+\newcommand\drawScheme[1]{%
+ \tikz{%
+ \node[inner sep=1, fill=red] at (-1.2*\@drawSchemeRadius,2.3*\@drawSchemeRadius) {R};
+ \node[inner sep=1, fill=green] at (-1.2*\@drawSchemeRadius, 1.8*\@drawSchemeRadius) {G};
+ \node[inner sep=1, fill=blue] at (-1.2*\@drawSchemeRadius,1.3*\@drawSchemeRadius) {B};
+ \setcounter{ColorNum}{1}%
+ \whiledo{%
+ \@ifundefined{\string\color@#1\theColorNum}{\boolean{false}}{\boolean{true}}%
+ }{%
+ \extractcolorspecs{#1\the\value{ColorNum}}{\modelspec}{\colorspec}%
+ \tikzmath{
+ int \r, \g, \b;
+ \r = round(255*array({\colorspec},0));
+ \g = round(255*array({\colorspec},1));
+ \b = round(255*array({\colorspec},2));
+ }%
+ \node at (\value{ColorNum}*\@drawSchemeOffset-\@drawSchemeOffset,2.3*\@drawSchemeRadius) {\r};
+ \node at (\value{ColorNum}*\@drawSchemeOffset-\@drawSchemeOffset,1.8*\@drawSchemeRadius) {\g};
+ \node at (\value{ColorNum}*\@drawSchemeOffset-\@drawSchemeOffset,1.3*\@drawSchemeRadius) {\b};
+ \draw[fill=#1\the\value{ColorNum}] (\value{ColorNum}*\@drawSchemeOffset-\@drawSchemeOffset,0) circle (\@drawSchemeRadius);%
+ \node[rotate=25, anchor=north east] at (\value{ColorNum}*\@drawSchemeOffset-\@drawSchemeOffset,-1*\@drawSchemeRadius) {#1\theColorNum};%
+ \stepcounter{ColorNum}%
+ }%
+ \extractcolorspecs{#10}{\modelspec}{\colorspec}%
+ \tikzmath{
+ int \r, \g, \b;
+ \r = round(255*array({\colorspec},0));
+ \g = round(255*array({\colorspec},1));
+ \b = round(255*array({\colorspec},2));
+ }%
+ \node at (\value{ColorNum}*\@drawSchemeOffset-0.5*\@drawSchemeOffset,2.3*\@drawSchemeRadius) {\r};
+ \node at (\value{ColorNum}*\@drawSchemeOffset-0.5*\@drawSchemeOffset,1.8*\@drawSchemeRadius) {\g};
+ \node at (\value{ColorNum}*\@drawSchemeOffset-0.5*\@drawSchemeOffset,1.3*\@drawSchemeRadius) {\b};
+ \draw[fill=#10] (\value{ColorNum}*\@drawSchemeOffset-0.5*\@drawSchemeOffset,0) circle(\@drawSchemeRadius);%
+ \node[rotate=25, anchor=north east] at (\value{ColorNum}*\@drawSchemeOffset-0.5*\@drawSchemeOffset, -1*\@drawSchemeRadius) {#10};%
+ }%
+}
+%<<< Function to print a discrete color scheme
+
+%>>> Function to print a continuous color scheme
+\newcommand\drawSchemeC[2][0.5\textwidth]{%
+ \tikz{%
+ \pgfplotscolorbardrawstandalone[colormap name=#2, colorbar horizontal, colorbar style={width=#1, ticks=none}]%
+ \draw[fill=#20] (#1+0.5*\@drawSchemeOffset,-0.55cm) circle(0.5*\@drawSchemeRadius);%
+ }%
+}
+%<<< Function to print a continuous color scheme
+
+\endinput
diff --git a/macros/latex/contrib/colorblind/documentation.pdf b/macros/latex/contrib/colorblind/documentation.pdf
new file mode 100644
index 0000000000..f35c947328
--- /dev/null
+++ b/macros/latex/contrib/colorblind/documentation.pdf
Binary files differ
diff --git a/macros/latex/contrib/colorblind/documentation.tex b/macros/latex/contrib/colorblind/documentation.tex
new file mode 100644
index 0000000000..a04188b570
--- /dev/null
+++ b/macros/latex/contrib/colorblind/documentation.tex
@@ -0,0 +1,365 @@
+%%
+%% ----------------------------------------------------------------
+%% Copyright (C) 2023-2024 by Simon Pfahler <simon.pfahler at ur dot de>
+%% ----------------------------------------------------------------
+%%
+%! TeX program = lualatex
+\documentclass{scrartcl}
+\usepackage[left=4cm,right=3cm,top=3cm,bottom=3cm, marginpar=3cm]{geometry}
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{1ex}
+
+\usepackage{cprotect}
+\usepackage{tikz}
+\usetikzlibrary{math}
+
+\usepackage{xcolor}
+\usepackage{soul}
+
+\usepackage{tikz}
+\usetikzlibrary{positioning, shapes, fit, arrows.meta, decorations.pathmorphing}
+\pgfdeclarelayer{bg}
+\pgfsetlayers{bg,main}
+
+\usepackage{pgfplots, pgfplotstable}
+\pgfplotsset{compat=1.18}
+
+%%%% from https://tex.stackexchange.com/questions/355713/pgfplots-show-error-marker-in-legend
+\pgfplotsset{error bar legend/.style={%
+ /pgfplots/legend image code/.prefix code={%
+ \pgfkeysgetvalue{/pgfplots/error bars/error mark}{\pgfplotserrorbarsmark}%
+ \draw[%
+ /pgfplots/every error bar,
+ mark=\pgfplotserrorbarsmark,
+ /pgfplots/error bars/error mark options,
+ sharp plot,
+ ##1
+ ] plot coordinates {(0.3cm, -0.15cm) (0.3cm, 0.15cm)};%
+ }
+ }
+}
+%%%%
+
+\pgfplotsset{custom area legend/.style={%
+ /pgfplots/legend image code/.prefix code={%
+ \fill[##1, draw=white] plot coordinates {(0cm, -0.1cm) (0.6cm,-0.1cm) (0.6cm, 0.1cm) (0cm, 0.1cm)};%
+ }
+ }
+}
+
+\def\w{420pt}
+
+\usepackage{hyperref}
+\hypersetup{
+ pdftitle={Easy colorblind-safe typesetting: the colorblind package},
+ pdfauthor={Simon Pfahler},
+}
+\usepackage{cleveref}
+
+\usepackage{csquotes}
+\usepackage[backend=biber, style=numeric-comp, seconds=true, sorting=none, subentry=true, doi=false, alldates=iso]{biblatex}
+\renewcommand*{\entrysetpunct}{\\[5pt]}
+\addbibresource{bib.bib}
+
+\usepackage[Tol, OkabeIto]{colorblind}
+
+\newcommand\colorblind{\textbf{colorblind} }
+\newcommand\hlc[2][T-Q-PH4]{{%
+ \colorlet{foo}{#1}%
+ \sethlcolor{foo}\hl{#2}}%
+}
+
+\reversemarginpar
+\newcommand\marg[1]{\leavevmode\marginpar{\raggedleft #1}}
+\newcommand\tbs{\textbackslash}
+
+\title{Easy colorblind-safe typesetting:\\ the \colorblind package}
+\author{Simon Pfahler}
+\date{\today\\Version 1.0}
+
+
+\begin{document}
+
+\maketitle
+
+\begin{abstract}
+ In colorblind-safe documents, the contents are presented in a way that the same information is conveyed to readers regardless of a potential color vision deficiency.
+ This package provides the tools necessary for colorblind-safe typesetting in \LaTeX.
+ It provides color schemes for a wide range of applications.
+ The most commonly used schemes are qualitative schemes, providing easily distinguishable colors for use in graphics, but also for text coloring or highlighting.
+ Additionally, diverging and sequential schemes are included which can be used for encoding quantitative information using colors.
+ This package incorporates colorblind-safeness into the writing process, making it both less cumbersome and less error-prone.
+\end{abstract}
+
+\tableofcontents
+\clearpage
+
+\section{Introduction}
+\subsection{Package options}
+\cprotect\marg{\verb!Tol!\\\verb!OkabeIto!}%
+The \colorblind package provides the color schemes by Paul Tol~\cite{Tol} and the Okabe Ito color palette~\cite{Ichihara_2008}.
+By default, no schemes are loaded.
+Providing one of the options \verb!Tol! or \verb!OkabeIto! loads all corresponding schemes.
+
+\subsection{Overview}
+As an example for how to use the colors, we look at the \emph{bright qualitative} color scheme by Tol.
+\cref{fig:T-Q-Bexample} shows the colors in the scheme
+
+\begin{figure}[ht]
+ \centering
+ \drawScheme{T-Q-B}
+ \caption{Bright qualitative color scheme by Tol.}
+ \label{fig:T-Q-Bexample}
+\end{figure}
+
+All colors in this model start with \verb!T-Q-B!, indicating that it is a scheme by \textbf{T}ol, that it is a \textbf{q}ualitative scheme, and that it is the \textbf{b}right scheme.
+The colors in the scheme are specified by a number following the scheme name, in this case ranging from \verb!T-Q-B1! to \verb!T-Q-B6! for the non-grey colors.
+The additional color \verb!T-Q-B0! provides a color that can be used, e.g., to indicate bad data.
+
+There are two reasons why color names are not based on natural color names (e.g., ``\hlc[T-Q-PH1]{blue}''):
+\begin{enumerate}
+ \item Certain colors (\hlc[T-Q-PH3]{green}, \hlc[T-Q-PH5]{red}) are often used by people with full color vision to convey certain meanings (\hlc[T-Q-PH3]{good}, \hlc[T-Q-PH5]{bad}).
+ This meaning is difficult for people with color vision deficiencies to pick up.
+ By not using natural color names, it is easier to write colorblind-safe documents that do not make use of said connotations.
+ \item Natural color names can be cumbersome, e.g., when multiple variations of a primary color are used. It is annoying having to look up if a color is called, e.g., \hlc[T-Q-PH1]{blue} or \hlc[T-Q-PH2]{cyan}.
+\end{enumerate}
+
+These colors are used the same way as any other colors. To change the text color to \verb!T-Q-B1! for example, use \verb!\color{T-Q-B1}!.
+
+\section{Guidelines}
+On its own, using colorblind-safe colors is not sufficient for making a document truly colorblind-safe.
+This section provides some general rules to follow for colorblind-safe typesetting.
+
+These rules apply to each visual unit of a document individually.
+A visual unit may be a graphic, a table or a paragraph of text.
+It might be advisable to be consistent also between different visual units (e.g., use the same color scheme for all graphics), but this is more of an aesthetic argument and is not strictly necessary for a colorblind-safe document.
+
+The most important rules are:
+\begin{enumerate}
+ \item \hlc{Do not mix the colors in qualitative schemes!}\newline
+ The colors in each scheme are defined with the purpose of being easily distinguishable.
+ Mixing of colors, e.g., \verb?T-Q-B1!50!T-Q-B5? interferes with this.
+ A special case of this is that qualitative colors should not be mixed in order to convey quantitative information.
+ In this case, a suitable non-qualitative color scheme (i.e.\ a diverging or sequential scheme) should be used.
+ \item \hlc{Only use colors from one color scheme for a given visual unit!}\newline
+ The colors between different schemes are not tuned to be distinguishable.
+ Using colors from multiple schemes therefore defies the point of this package.
+ \item \hlc{Do not use shades of colors!}\newline
+ Saturation and brightness are also used for distinguishability, so mixings involving \verb!white! and \verb!black! should also be avoided.
+\end{enumerate}
+
+The first two rules should be ensured in any visual unit. If the need for more colors arises, a different color scheme should be used alltogether.
+While the third rule should also be followed in most scenarios, there are some situations that might allow for breaking this rule. As an example, consider \cref{fig:errorbar_plot}, where the error band is colored with a lighter shade of the original color.
+This is ok because only few colors are used in the plot and the colors are not necessary for conveying the message of the plot.
+
+\begin{figure}[ht]
+ \centering
+ \begin{tikzpicture}
+ \begin{axis}[
+ width=0.4*\w,
+ height=0.28*\w,
+ scale only axis=true,
+ xlabel = {x},
+ ylabel = {y},
+ x label style = {yshift=2mm},
+ y label style = {yshift=-2mm},
+ clip marker paths=true,
+ axis on top
+ ]
+
+ \fill[T-Q-B5!20] (0,0.1068558) -- (40,0.1068558) -- (40,0.0668558) -- (0,0.0668558) -- cycle;
+ \draw[T-Q-B5] (0,0.0868558) -- (40,0.0868558);
+
+ \addplot[color=T-Q-B1, mark=*, only marks, forget plot]
+ plot[/pgfplots/error bars/.cd, x dir=none, y dir=both, y explicit,
+ error mark=-, error bar style={color=T-Q-B1}]
+ coordinates {
+ (4,0.263148) +- (0.120064,0.120064)
+ (8,0.159158) +- (0.0621894,0.0621894)
+ (12,0.129892) +- (0.0543303,0.0543303)
+ (16,0.112302) +- (0.0358508,0.0358508)
+ (20,0.098435) +- (0.02648,0.02648)
+ (24,0.0909784) +- (0.0215048,0.0215048)
+ (28,0.0894657) +- (0.0212992,0.0212992)
+ (32,0.0869343) +- (0.0202553,0.0202553)
+ };
+ \addlegendimage{T-Q-B1, mark=*, only marks, error bar legend};
+ \addlegendentry{data};
+ \addlegendimage{draw=T-Q-B5, fill=T-Q-B5!20, custom area legend};
+ \addlegendentry{reference};
+
+ \end{axis}
+ \end{tikzpicture}
+ \cprotect\caption{This plot breaks rule 3 by using the shade \verb?T-Q-B5!20? for the error band of the reference, but it is still colorblind-safe.}
+ \label{fig:errorbar_plot}
+\end{figure}
+
+There are additional guidelines that should be kept in mind when typesetting colorblind-safe documents.
+Their importance may vary between different applications, so try to follow them as best as possible, at your own judgement.
+In no particular order, they are:
+\begin{itemize}
+ \item \hlc{Do not convey information only through color!}\newline
+ When possible, encode the information the color provides also in a different way, e.g., through text, patterns or symbols.
+ \item \hlc{Do not use color for information and aesthetics simultaneously!}\newline
+ Color is often also used for aesthetic reasons, e.g., on a scientific poster.
+ While this is ok in principle, do not mix information and aesthetics within the same visual unit, as this makes it more difficult to extract the encoded information.
+ \item \hlc{Do not use rainbow color schemes!}\newline
+ Due to the many different colors in a rainbow color scheme, they are very difficult to distinguish for people with color vision deficiencies (even when the scheme is tuned for this purpose).
+ Therefore, it is best to avoid them.
+ If you insist on using them, Paul Tol provides both a sequential as well as a continuous version, which are optimized to be as distinguishable as possible.
+\end{itemize}
+
+\section{Provided color schemes}\label{sec:colors}
+The color schemes provided are split into three groups:
+\begin{itemize}
+ \item Qualitative schemes:\newline
+ These schemes are used to convey qualitative information, such as different data sources, countries or manufacturers.
+ They should usually be used for coloring text or distinguishing different lines/bars in a plot.
+ \item Diverging color schemes:\newline
+ When quantitative data ranges between two extremes, and the middle is being considered ``neutral'', a diverging color scheme should be used.
+ Examples for this kind of data might be test grades, temperatures or pH values.
+ \item Sequential color schemes:\newline
+ For quantitative data without an important midpoint, sequential color schemes should be preferred over diverging ones.
+ This is especially true for quantites that start from $0$.
+ They can be used to denote for example velocities, concentrations or pressures.
+\end{itemize}
+
+For each type of schemes, this package provides a range of options.
+\Cref{sec:Tol_schemes} shows the schemes designed by Paul Tol~\cite{Tol}, which include qualitative, diverging and sequential schemes (see \cref{sec:T-Q,sec:T-D,sec:T-S}).
+In \cref{sec:OkabeIto}, the Okabe Ito color scheme~\cite{Ichihara_2008} is provided, which is probably the most famous qualitative colorblind-safe color scheme due to it being mentioned in various articles in high-ranking journals.
+
+All of the schemes are colorblind-safe, and some are optimized for printout or designed for a particular purpose.
+This is denoted under the scheme name.\clearpage
+
+\subsection{Paul Tol's color schemes}\label{sec:Tol_schemes}
+
+\subsubsection{Qualitative color schemes}\label{sec:T-Q}
+\begin{minipage}{0.5\textwidth}
+ \centering
+ \scalebox{0.7}{\drawScheme{T-Q-B}}\\
+ \textbf{B}right\\
+ \phantom{pb}
+\end{minipage}\hfill%
+\begin{minipage}{0.5\textwidth}
+ \centering
+ \scalebox{0.7}{\drawScheme{T-Q-V}}\\
+ \textbf{V}ibrant
+\end{minipage}
+
+\begin{minipage}{0.5\textwidth}
+ \centering
+ \scalebox{0.7}{\drawScheme{T-Q-HC}}\\
+ \textbf{H}igh-\textbf{C}ontrast\\
+ works for black and white printout
+\end{minipage}\hfill%
+\begin{minipage}{0.5\textwidth}
+ \centering
+ \scalebox{0.7}{\drawScheme{T-Q-MC}}\\
+ \textbf{M}edium-\textbf{C}ontrast\\
+ works for black and white printout
+\end{minipage}
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{T-Q-M}}\\
+ \textbf{M}uted
+\end{center}
+
+\begin{minipage}{0.5\textwidth}
+ \centering
+ \scalebox{0.7}{\drawScheme{T-Q-PH}}\\
+ \textbf{P}ale \textbf{H}ighlight\\
+ specifically for text background
+\end{minipage}\hfill%
+\begin{minipage}{0.5\textwidth}
+ \centering
+ \scalebox{0.7}{\drawScheme{T-Q-DT}}\\
+ \textbf{D}ark \textbf{T}ext\\
+ specifically for text color
+\end{minipage}
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{T-Q-L}}\\
+ \textbf{L}ight\\
+ less distinguishable than other schemes,\\ mostly meant for filling in labelled cells
+\end{center}\clearpage
+
+\subsubsection{Diverging color schemes}\label{sec:T-D}
+For diverging schemes, when a continuous palette is needed, the colors are allowed to be linearly interpolated.
+When using \verb!pgfplots! (or \verb!TikZ!), the interpolations are available as colormaps with the names of their color scheme.
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{T-D-S}}\\
+ \drawSchemeC[0.6\textwidth]{T-D-S}\\
+ \textbf{S}unset
+\end{center}
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{T-D-N}}\\
+ \drawSchemeC[0.9\textwidth]{T-D-N}\\
+ \textbf{N}ightfall
+\end{center}
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{T-D-BR}}\\
+ \drawSchemeC[0.5\textwidth]{T-D-BR}\\
+ \textbf{B}u\textbf{R}d
+\end{center}\clearpage
+
+\subsubsection{Sequential color schemes}\label{sec:T-S}
+For most sequential schemes, a continuous palette can be obtained again by linearly interpolating the colors.
+The only exception to this is the \emph{discrete rainbow} scheme, which has an explicitly continuos variation, the \emph{smooth rainbow} scheme.
+When using \verb!pgfplots!, the interpolations are available as colormaps with the names of their color scheme.
+
+When the discrete scheme is not shown, this is because there are too many colors in them.
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{T-S-YOB}}\\
+ \drawSchemeC[0.5\textwidth]{T-S-YOB}\\
+ \textbf{Y}l\textbf{O}r\textbf{B}r
+\end{center}
+
+\begin{center}
+ \drawSchemeC[0.9\textwidth]{T-S-IR}\\
+ \textbf{Ir}idescent
+\end{center}
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{T-S-IN}}\\
+ \drawSchemeC[0.6\textwidth]{T-S-IN}\\
+ \textbf{In}candescent\\
+ not print-friendly
+\end{center}
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{T-S-DR}}\\
+ \textbf{D}iscrete \textbf{R}ainbow\\
+ Do not interpolate!
+\end{center}
+
+\begin{center}
+ \drawSchemeC[\textwidth]{T-S-SR}\\
+ \textbf{S}mooth \textbf{R}ainbow\\
+\end{center}
+
+\subsection{Okabe Ito qualitative color scheme}\label{sec:OkabeIto}
+This is the qualitative color scheme commonly known as the \emph{Okabe Ito} color palette~\cite{Ichihara_2008}.
+
+\begin{center}
+ \scalebox{0.7}{\drawScheme{OI}}\\
+ \textbf{O}kabe \textbf{I}to
+\end{center}
+
+\section{Provided commands}
+\cprotect\marg{\verb!\drawScheme{...}!}%
+The discrete visualizations of color schemes given in this documentation are created with the command \verb!\drawScheme{...}!.
+The name of the color scheme should be provided to the command, e.g.\ \verb!\drawScheme{T-Q-B}! to print the \emph{qualitative bright} scheme by Tol.
+
+\cprotect\marg{\verb!\drawSchemeC{...}!}%
+The continuous visualizations of color schemes given in this documentation are created with the command \verb!\drawSchemeC{...}!.
+The name of the color scheme should be provided to the command, e.g.\ \verb!\drawSchemeC{T-D-S}! to print the \emph{diverging sunset} scheme by Tol.
+Note that this command only works for color schemes that are allowed to be interpolated.
+
+\clearpage
+\printbibliography
+
+\end{document}
diff --git a/macros/latex/contrib/csvsimple/CHANGES.md b/macros/latex/contrib/csvsimple/CHANGES.md
index 768f8f65cb..3178395f76 100644
--- a/macros/latex/contrib/csvsimple/CHANGES.md
+++ b/macros/latex/contrib/csvsimple/CHANGES.md
@@ -17,6 +17,18 @@ and this project adheres to
+## [2.6.1] - 2024-05-16
+
+### Changed
+- Documentation of `csvsim/filter fp`, `csvsim/and filter fp`, `\IfCsvsimFpCompareTF`,
+ and `\IfCsvsimIntCompareTF` clarified (issue #37)
+- Reset `data collection` to `\csvdatacollection` for every csv reader (issue #39)
+
+### Fixed
+- Documentation typos fixed (issue #38)
+
+
+
## [2.6.0] - 2024-01-19
### Added
diff --git a/macros/latex/contrib/csvsimple/README.md b/macros/latex/contrib/csvsimple/README.md
index d3e0860104..29196c03e9 100644
--- a/macros/latex/contrib/csvsimple/README.md
+++ b/macros/latex/contrib/csvsimple/README.md
@@ -1,4 +1,4 @@
-# The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+# The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
> Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
diff --git a/macros/latex/contrib/csvsimple/csvsimple-doc.sty b/macros/latex/contrib/csvsimple/csvsimple-doc.sty
index 2f507037fb..c8d933c684 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-doc.sty
+++ b/macros/latex/contrib/csvsimple/csvsimple-doc.sty
@@ -1,5 +1,5 @@
% !TeX encoding=UTF-8
-%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+%% The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
%% csvsimple-doc.sty: style file for the documentation
%%
%% -------------------------------------------------------------------------------------------
@@ -18,8 +18,8 @@
%%
%% This work consists of all files listed in README.md
%%
-\def\version{2.6.0}%
-\def\datum{2024/01/19}%
+\def\version{2.6.1}%
+\def\datum{2024/05/16}%
\IfFileExists{csvsimple-doc.cfg}{\input{csvsimple-doc.cfg}}{}\providecommand\csvpkgprefix{}
diff --git a/macros/latex/contrib/csvsimple/csvsimple-example.pdf b/macros/latex/contrib/csvsimple/csvsimple-example.pdf
index 5485a99c1e..f85684f6d1 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-example.pdf
+++ b/macros/latex/contrib/csvsimple/csvsimple-example.pdf
Binary files differ
diff --git a/macros/latex/contrib/csvsimple/csvsimple-example.tex b/macros/latex/contrib/csvsimple/csvsimple-example.tex
index 364596562a..0baf2183c7 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-example.tex
+++ b/macros/latex/contrib/csvsimple/csvsimple-example.tex
@@ -1,4 +1,4 @@
-%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+%% The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
%% csvsimple-example.tex: an example for csvsimple
%%
%% -------------------------------------------------------------------------------------------
diff --git a/macros/latex/contrib/csvsimple/csvsimple-l3.pdf b/macros/latex/contrib/csvsimple/csvsimple-l3.pdf
index bbef5c75a9..f17b9183c3 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-l3.pdf
+++ b/macros/latex/contrib/csvsimple/csvsimple-l3.pdf
Binary files differ
diff --git a/macros/latex/contrib/csvsimple/csvsimple-l3.sty b/macros/latex/contrib/csvsimple/csvsimple-l3.sty
index 9aa9b2c428..849aa79aec 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-l3.sty
+++ b/macros/latex/contrib/csvsimple/csvsimple-l3.sty
@@ -1,4 +1,4 @@
-%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+%% The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
%% csvsimple-l3.sty: Simple LaTeX CSV file processing (LaTeX3)
%%
%% -------------------------------------------------------------------------------------------
@@ -18,7 +18,7 @@
%% This work consists of all files listed in README.md
%%
\NeedsTeXFormat{LaTeX2e}[2023-11-01]
-\ProvidesExplPackage{csvsimple-l3}{2024/01/19}{2.6.0}
+\ProvidesExplPackage{csvsimple-l3}{2024/05/16}{2.6.1}
{LaTeX3 CSV file processing}
@@ -1037,13 +1037,6 @@
}
-\keys_set:nn { csvsim }
- {
- data~collection = \csvdatacollection,
- }
-
-
-
%---- catcodes
\cs_new_protected_nopar:Npn \__csvsim_setup_catcode_list:
@@ -1606,6 +1599,7 @@
check~column~count,
head~to~column~names~prefix = ,
head~to~column~names = false,
+ data~collection = \csvdatacollection,
collect~data = false,
consume~collected~data = false,
column~count = 0,
diff --git a/macros/latex/contrib/csvsimple/csvsimple-l3.tex b/macros/latex/contrib/csvsimple/csvsimple-l3.tex
index 9fad48644d..6c70fa3003 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-l3.tex
+++ b/macros/latex/contrib/csvsimple/csvsimple-l3.tex
@@ -1,7 +1,7 @@
% \LaTeX-Main\
% !TeX encoding=UTF-8
% !TeX spellcheck=en_US
-%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+%% The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
%% csvsimple.tex: Manual
%%
%% -------------------------------------------------------------------------------------------
@@ -214,7 +214,7 @@ way.
An even more comfortable and preferable way to create a table is setting
appropriate option keys. Note, that this gives you the possibility to create a
meta key (called style here) which contains the whole table creation
-using \refCom{csvstyle} or |keys_define:nn| from |l3keys|.
+using \refCom{csvstyle} or |\keys_define:nn| from |l3keys|.
\begin{dispExample}
\csvreader[
@@ -1182,9 +1182,10 @@ The following string compare filters \refKey{csvsim/filter strcmp} and
\end{docCsvKey}
-\begin{docCsvKey}[][doc new and updated={2021-06-25}{2022-10-21}]{filter fp}{=\marg{floating point expression}}{no default}
- Only data lines which fulfill a \LaTeX3 \meta{floating point expression}
- (|l3fp|, \ctanpkg{xfp}) are accepted.
+\enlargethispage*{1cm}
+\begin{docCsvKey}[][doc new and updated={2021-06-25}{2022-10-21}]{filter fp}{=\marg{floating point comparison}}{no default}
+ Only data lines which fulfill a \LaTeX3 \meta{floating point comparison}
+ are accepted. The evaluation is done using \docAuxCommand*{fp_compare_p:n}.
\begin{dispExample}
% \usepackage{booktabs}
\csvreader[
@@ -1316,7 +1317,7 @@ filter options:
\begin{docCsvKeys}[
- doc parameter = {=\marg{floating point expression}},
+ doc parameter = {=\marg{floating point comparison}},
doc description = {style, no default},
doc new = {2022-10-21}
]
@@ -1326,9 +1327,23 @@ filter options:
}
Like \refKey{csvsim/filter fp}, but appended to a required existing
expl3 based filter with \emph{and} (|&&|) resp. \emph{or} (\texttt{\textbar\textbar}).
+\begin{dispExample}
+% \usepackage{booktabs}
+\csvreader[
+ head to column names,
+ tabular = llll,
+ table head = \toprule & \bfseries Name & \bfseries Matr & \bfseries Grade\\\midrule,
+ table foot = \bottomrule,
+ %>> list only matriculation numbers greater than 20000 and grade less than 4.0 <<
+ filter fp = { \matriculation > 20000 },
+ and filter fp = { \grade < 4.0 },
+ ]{grade.csv}{}{%
+ \thecsvrow & \slshape\name, \givenname & \matriculation & \grade
+ }
+\end{dispExample}
\end{docCsvKeys}
-
+\enlargethispage*{1cm}
\begin{docCsvKeys}[
doc parameter = {=\marg{boolean expression}},
doc description = {style, no default},
@@ -2304,14 +2319,18 @@ If set to |false|, the collected data of a CSV file processed with
\refKey{csvsim/collect data} is saved into \refCom{csvdatacollection}.\par
Otherwise, if set to |true|, the collected data is not saved, but directly used
after reading the CSV file, see \refKey{csvsim/generic collected table}.
+After usage, the collected data is cleared, i.e. \refCom{csvdatacollection} is emptied.
\end{docCsvKey}
-\begin{docCsvKey}[][doc new=2021-07-06]{data collection}{=\meta{macro}}{no default, initially \refCom{csvdatacollection}}
+\begin{docCsvKey}[][doc new and updated={2021-07-06}{2024-05-16}]{data collection}{=\meta{macro}}{no default, initially \refCom{csvdatacollection}}
Sets the collection macro to an alternative for \refCom{csvdatacollection}.
\begin{dispListing}
data collection = \myData, % instead of \csvdatacollection
\end{dispListing}
+Note that until version 2.6.0 (2024/01/19), \refKey{csvsim/data collection} was
+not reset to the default \refCom{csvdatacollection} for following CSV files,
+but it is now.
\end{docCsvKey}
@@ -2432,29 +2451,35 @@ for backward compatibility.
\begin{docCommands}[
- doc parameter = \marg{floating point expression}\marg{token list B}\marg{true}\marg{false}
+ doc parameter = \marg{floating point comparison}\marg{true}\marg{false}
]
{
{ doc name = IfCsvsimFpCompareTF, doc new and updated = {2021-06-28}{2023-12-19} },
{ doc name = ifcsvfpcmp, color command=black }
}
- Evaluates the given \meta{floating point expression}
+ Evaluates the given \meta{floating point comparison}
and executes \meta{true} or \meta{false} appropriately.
- The evaluation is done using |\fp_compare:nTF|.
+ The evaluation is done using \docAuxCommand*{fp_compare:nTF}.\\
+ Basically, a \meta{floating point comparison} consists of
+ \mbox{\meta{fp expr\textsubscript{1}} \meta{relation} \meta{fp expr\textsubscript{2}}},
+ like \mbox{$x<y$}, but \docAuxCommand*{fp_compare:nTF} even allows a chain of comparisons.
\refCom{IfCsvsimFpCompareTF} is expandable.
\end{docCommands}
\begin{docCommands}[
- doc parameter = \marg{integer expression}\marg{token list B}\marg{true}\marg{false}
+ doc parameter = \marg{integer comparison}\marg{true}\marg{false}
]
{
{ doc name = IfCsvsimIntCompareTF, doc new and updated = {2021-06-28}{2023-12-19} },
{ doc name = ifcsvintcmp, color command=black }
}
- Evaluates the given \meta{integer expression}
+ Evaluates the given \meta{integer comparison}
and executes \meta{true} or \meta{false} appropriately.
- The evaluation is done using |\int_compare:nTF|.
+ The evaluation is done using \docAuxCommand*{int_compare:nTF}.\\
+ Basically, a \meta{integer comparison} consists of
+ \mbox{\meta{int expr\textsubscript{1}} \meta{relation} \meta{int expr\textsubscript{2}}},
+ like \mbox{$x<y$}, but \docAuxCommand*{int_compare:nTF} even allows a chain of comparisons.
\refCom{IfCsvsimIntCompareTF} is expandable.
\end{docCommands}
diff --git a/macros/latex/contrib/csvsimple/csvsimple-legacy.pdf b/macros/latex/contrib/csvsimple/csvsimple-legacy.pdf
index 7079052a74..6138c507e3 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-legacy.pdf
+++ b/macros/latex/contrib/csvsimple/csvsimple-legacy.pdf
Binary files differ
diff --git a/macros/latex/contrib/csvsimple/csvsimple-legacy.sty b/macros/latex/contrib/csvsimple/csvsimple-legacy.sty
index 28b5562b5d..ecaba4a7b0 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-legacy.sty
+++ b/macros/latex/contrib/csvsimple/csvsimple-legacy.sty
@@ -1,4 +1,4 @@
-%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+%% The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
%% csvsimple-legacy.sty: Simple LaTeX CSV file processing (LaTeX2e)
%%
%% -------------------------------------------------------------------------------------------
@@ -18,7 +18,7 @@
%% This work consists of all files listed in README.md
%%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{csvsimple-legacy}[2024/01/19 version 2.6.0 LaTeX2e CSV file processing]
+\ProvidesPackage{csvsimple-legacy}[2024/05/16 version 2.6.1 LaTeX2e CSV file processing]
%---- check package
diff --git a/macros/latex/contrib/csvsimple/csvsimple-legacy.tex b/macros/latex/contrib/csvsimple/csvsimple-legacy.tex
index caa65712ec..ae40e8563d 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-legacy.tex
+++ b/macros/latex/contrib/csvsimple/csvsimple-legacy.tex
@@ -1,6 +1,6 @@
% \LaTeX-Main\
% !TeX encoding=UTF-8
-%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+%% The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
%% csvsimple.tex: Manual
%%
%% -------------------------------------------------------------------------------------------
diff --git a/macros/latex/contrib/csvsimple/csvsimple.pdf b/macros/latex/contrib/csvsimple/csvsimple.pdf
index 7f4023fd07..8d148b5a6f 100644
--- a/macros/latex/contrib/csvsimple/csvsimple.pdf
+++ b/macros/latex/contrib/csvsimple/csvsimple.pdf
Binary files differ
diff --git a/macros/latex/contrib/csvsimple/csvsimple.sty b/macros/latex/contrib/csvsimple/csvsimple.sty
index 60776f67ce..01ccbb3f72 100644
--- a/macros/latex/contrib/csvsimple/csvsimple.sty
+++ b/macros/latex/contrib/csvsimple/csvsimple.sty
@@ -1,4 +1,4 @@
-%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+%% The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
%% csvsimple.sty: Simple LaTeX CSV file processing
%%
%% -------------------------------------------------------------------------------------------
@@ -18,7 +18,7 @@
%% This work consists of all files listed in README.md
%%
\NeedsTeXFormat{LaTeX2e}[2022-06-01]
-\ProvidesExplPackage{csvsimple}{2024/01/19}{2.6.0}
+\ProvidesExplPackage{csvsimple}{2024/05/16}{2.6.1}
{LaTeX CSV file processing}
\cs_if_exist:NT \c__csvsim_package_expl_bool
diff --git a/macros/latex/contrib/csvsimple/csvsimple.tex b/macros/latex/contrib/csvsimple/csvsimple.tex
index 7d34586a42..73d34f4c34 100644
--- a/macros/latex/contrib/csvsimple/csvsimple.tex
+++ b/macros/latex/contrib/csvsimple/csvsimple.tex
@@ -1,6 +1,6 @@
% \LaTeX-Main\
% !TeX encoding=UTF-8
-%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
+%% The LaTeX package csvsimple - version 2.6.1 (2024/05/16)
%% csvsimple.tex: Manual
%%
%% -------------------------------------------------------------------------------------------
diff --git a/macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf
index f1bf30aacc..34320ab758 100644
--- a/macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf
+++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.pdf
Binary files differ
diff --git a/macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex
index b8352c628d..7335cdbb96 100644
--- a/macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex
+++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-en.tex
@@ -34,8 +34,8 @@
\usepackage[margin=1.5cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.4}
-\def\TPdate{04/04/2024}
+\def\TPversion{0.1.5}
+\def\TPdate{17/05/2024}
\usepackage{tcolorbox}
\sethlcolor{lightgray!25}
\NewDocumentCommand\MontreCode{ m }{%
@@ -111,6 +111,8 @@
\section{History}
+\verb|v0.1.5|~:~~~~New macros for boxes with \textsf{tcolorbox} (see \texttt{[fr]} documentation)
+
\verb|v0.1.4|~:~~~~Create a SMS conversation
\verb|v0.1.3|~:~~~~Environment for exercise(s) (in french doc)
diff --git a/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf
index 87d7507f61..9007eb82b0 100644
--- a/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf
+++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.pdf
Binary files differ
diff --git a/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex
index 9cdaeadf73..f76efcea01 100644
--- a/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex
+++ b/macros/latex/contrib/customenvs/doc/customenvs-doc-fr.tex
@@ -39,8 +39,8 @@
\usepackage[margin=1.5cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.4}
-\def\TPdate{4 avril 2024}
+\def\TPversion{0.1.5}
+\def\TPdate{17 mai 2024}
\usepackage{tcolorbox}
\tcbuselibrary{listingsutf8}
\newtcblisting{DemoCode}[1]{%
@@ -66,10 +66,10 @@
keywordstyle={\color{violet}},%
classoffset=2,%
alsoletter={-},%
- morekeywords={\ReponsesQCM,MultiCols,\CreerListeItems,\ListeChoixItems,\TableauCompetences,\CrayonDeCompetences,\StyleEnvtExo,\StyleEnvtExoDefaut,\TitreExo,\ipsum,EnvSMS,\SMSrec,\SMSenv},%
+ morekeywords={\ReponsesQCM,MultiCols,\CreerListeItems,\ListeChoixItems,\TableauCompetences,\CrayonDeCompetences,\StyleEnvtExo,\StyleEnvtExoDefaut,\TitreExo,\ipsum,EnvSMS,\SMSrec,\SMSenv,BoiteSimple,\SujetTitreExo,\CircledNumber,\AffVignette,\BoiteArrondie},%
keywordstyle={\color{green!50!black}},%
classoffset=3,%
- morekeywords={Largeur,Filets,EspacesCL,NbCols,Labels,PoliceLabels,EspaceLabels,Swap,Type,CoeffEspVert,EpTrait,Alea,LargeurNivs,Niveaux,NoticeNiveaux,Titre,PolTitre,PolNotice,PolComp,LigneSep,CouleurNotice,CouleurNiveaux,CouleurFond,Note,Notice,PoliceCateg,PoliceBloc,Couleurs,LargeurBloc,Echelle,NoirBlanc,Libelle,EpTrait,Police,Type,ComplementTitre,Titre,CodeDebut,Couleur,EchelleImage,Decoration,Trait,Avatar,AffAvatar,NoirBlanc,CouleurE,CouleurR,CouleurFond,Hauteur,Largeur,PoliceTxt,CouleurTitre},%
+ morekeywords={Largeur,Filets,EspacesCL,NbCols,Labels,PoliceLabels,EspaceLabels,Swap,Type,CoeffEspVert,EpTrait,Alea,LargeurNivs,Niveaux,NoticeNiveaux,Titre,PolTitre,PolNotice,PolComp,LigneSep,CouleurNotice,CouleurNiveaux,CouleurFond,Note,Notice,PoliceCateg,PoliceBloc,Couleurs,LargeurBloc,Echelle,NoirBlanc,Libelle,EpTrait,Police,Type,ComplementTitre,Titre,CodeDebut,Couleur,EchelleImage,Decoration,Trait,Avatar,AffAvatar,NoirBlanc,CouleurE,CouleurR,CouleurFond,Hauteur,Largeur,PoliceTxt,CouleurTitre,AlignH,bg,txt,bthick,bcol,raise,Type,EspH,Fond,Texte,Style},%
keywordstyle={\color{orange}}
},%
#1
@@ -149,6 +149,10 @@
\section{Historique}
+\verb|v0.1.5|~:~~~~Vignettes + Numéros encerclés + Création de boîtes 'simples'
+
+\verb|v0.1.4|~:~~~~Commande pour du texte dans une boîte arrondie, de hauteur 'figée' + 'Chat' SMS
+
\verb|v0.1.3|~:~~~~Environnement/commande pour des exercices, avec personnalisation(s)
\verb|v0.1.2|~:~~~~Crayon de compétences
@@ -1058,4 +1062,177 @@ Le code proposé utilise l'environnement, mais la commande simple est complètem
\includegraphics{envtexo_exemples.pdf}
\end{DemoCode}
+\pagebreak
+
+\section{Boîtes divers}
+
+\subsection{Introduction}
+
+L'idée est de proposer (modestement) des commandes, basées sur \MontreCode{tcolorbox}, pour, avec un style prédéfini :
+
+\begin{itemize}
+ \item créer des boîtes de présentation ;
+ \item créer des titres de sujets d'examens, par exemple ;
+ \item créer des titres d'exercices, pour des sujets d'examens par exemple ;
+ \item créer des numéros encadrés ;
+ \item créer de vignettes.
+\end{itemize}
+
+\subsection{Boîtes de présentation}
+
+\begin{DemoCode}{listing only}
+\begin{BoiteSimple}[couleur]<options tcbox>{titre}
+ ...
+\end{BoiteSimple}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\begin{BoiteSimple}[red]{Propriété}
+Si M est la matrice d'adjacence d'un graphe simple orienté de sommets $A_1$, $A_2$, \dots, $A_n$, le nombre de chemins de longueur $p$ d'un sommet $A_i$ à un sommet $A_j$ est le nombre situé ligne $i$ et colonne $j$ dans la matrice $M^p$.
+\end{BoiteSimple}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\begin{BoiteSimple}[blue]<width=0.75\linewidth,flush right>{Propriété}
+Si M est la matrice d'adjacence d'un graphe simple orienté de sommets $A_1$, $A_2$, \dots, $A_n$, le nombre de chemins de longueur $p$ d'un sommet $A_i$ à un sommet $A_j$ est le nombre situé ligne $i$ et colonne $j$ dans la matrice $M^p$.
+\end{BoiteSimple}
+\end{DemoCode}
+
+\subsection{Titres de sujets d'examens, titres d'exercices}
+
+\begin{DemoCode}{listing only}
+\begin{TitreSujet}[Couleur=...,AlignH=...]<options tcbox>{titre onglet}
+...
+\end{TitreSujet}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\begin{TitreSujet}[Couleur=red!50!black]{SUJET}
+Métropole, SIO, 16 Mai 2024
+\end{TitreSujet}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\begin{TitreSujet}[Couleur=teal,AlignH=center]{CORRIGÉ}
+Baccalauréat Centres étrangers Groupe 1\\
+14 mars 2023
+\end{TitreSujet}
+\end{DemoCode}
+
+\begin{DemoCode}{listing only}
+\SujetTitreExo[couleur]{titre}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\SujetTitreExo{Exercice 4 (5 points)}
+
+\SujetTitreExo[olive]{Exercice 1 [Matrices]\dotfill(5 points)}
+\end{DemoCode}
+
+\subsection{Numéros encerclés}
+
+\begin{DemoCode}{listing only}
+\CircledNumber[bg=...,txt=...,bthick=...,bcol=...,raise=true/false]%
+ {nombre}{noeud tikz}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+En ligne \CircledNumber{1} avec texte après.
+\end{DemoCode}
+
+\begin{DemoCode}{}
+{\bfseries\sffamily\Huge En ligne (\CircledNumber[bthick=0.25mm,bcol=red,bg=cyan!25,txt=darkgray]{7}) avec texte après}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+{\Large En ligne \CircledNumber[raise=false,bthick=0.5mm,bcol=cyan,bg=cyan!25,txt=orange]{4} avec texte après}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+\begin{enumerate}[label={\CircledNumber[raise=false]{\arabic*}}]
+ \item A
+ \item B
+ \item C
+\end{enumerate}
+\end{DemoCode}
+
+\subsection{Vignettes}
+
+\begin{DemoCode}{listing only}
+\AffVignette(*)[Type=...,Couleur=...,Police=...]{texte}
+% la version étoilée active le \NoAutoSpacing
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette de base
+\AffVignette{test} ou \AffVignette[Couleur=magenta]{test}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette type algo
+\AffVignette[Type=algo]{test} ou \AffVignette[Type=algo,Couleur=teal]{Renvoyer}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette type python, classique
+\AffVignette[Type=py]{test} ou \AffVignette[Type=py,Couleur=lime]{return}
+
+%vignette type python, avec piton (et lualatex)
+%\AffVignette[Type=pypit]{from math import sqrt}
+
+%vignette type python, avec piton et pyluatex (et lualatex + shell-escape)
+%\AffVignette[Type=pyl,Couleur=blue]{1+4/5}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette type graphique
+\AffVignette[Type=grph]{fonction} ou \AffVignette[Couleur=olive,Type=grph]{intersection}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette type MPM
+\AffVignette[Type=mpm]{marge} ou \AffVignette[Type=mpm,Couleur=orange]{chemin}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette type xcas
+\AffVignette[Type=xcas]{calcul formel} ou \AffVignette[Type=xcas,Couleur=brown]{calcul formel}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette type shell
+\AffVignette[Type=shell,Couleur=red!50!orange]{fenêtre cmd}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette type LaTeX
+\AffVignette[Type=tex]{code LaTeX}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%vignette type tableur
+\AffVignette[Type=sheet,Couleur=green!50!black,Police=\footnotesize\sffamily]
+ {cellule A3}
+\end{DemoCode}
+
+\begin{DemoCode}{}
+%création d'une macro personnelle
+\NewDocumentCommand\VignetteTableur{ m }{%
+ \AffVignette*[Type=sheet,Couleur=green!50!black,Police=\footnotesize\sffamily]
+ {#1}
+}
+On se place dans la plage \VignetteTableur{A3:B5} pour...
+
+\end{DemoCode}
+
+\subsection{Boîte arrondie}
+
+\begin{DemoCode}{listing only}
+\BoiteArrondie[Fond=...,Texte=...,EspH=...,Style=...]{texte}[noeud tikz]
+\end{DemoCode}
+
+\begin{DemoCode}{}
+On lance le logiciel \BoiteArrondie[Fond=cyan!33,Texte=violet,EspH=2mm,Style=rect]{situé sur le bureau} en cliquant \BoiteArrondie[Fond=lightgray!25,Texte=darkgray]{droit}.
+\end{DemoCode}
+
\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/customenvs/doc/envtexo_exemples.tex b/macros/latex/contrib/customenvs/doc/envtexo_exemples.tex
index e782579dec..2daa195179 100644
--- a/macros/latex/contrib/customenvs/doc/envtexo_exemples.tex
+++ b/macros/latex/contrib/customenvs/doc/envtexo_exemples.tex
@@ -1,80 +1,80 @@
-% !TeX TXS-program:compile = txs:///arara
-% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode}
-% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
-
-\documentclass[a5paper,11pt]{article}
-\usepackage[margin=1cm]{geometry}
-\usepackage{customenvs}
-%facultatif, pour les décorations
-\usepackage{graphicx}
-\usepackage{dashrulex}
-\usepackage{coloredbelts}
-\usepackage{pictochrono}
-%mise en page
-\usepackage{ipsum}
-\setlength{\parindent}{0pt}
-
-\begin{document}
-
-\begin{EnvtExo}%exo1
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Trait=pointilles]%exo2
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Trait=dashilles]%exo3
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Decoration=Icone/\faPython]%exo4
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Decoration=Ceinture/rouge]%exo5
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Decoration=Chrono/20]%exo6
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Decoration=Image/goku_ssj4]%exo7
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Decoration=Image/sseiya_shura]%exo8
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Decoration=Points/7]%exo9
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Type=Perso/{Titre perso }]%exo10
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\StyleEnvtExo[Couleur=red,Police=\bfseries\ttfamily,EpTrait=2pt,Libelle={Exercice n°}]
-
-\begin{EnvtExo}[Decoration=Icone/\faAddressBook]%exo11
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\begin{EnvtExo}[Type=Perso/{Titre perso },Decoration=Chrono/25,Couleur=red,Trait=dashilles]%exo12
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\StyleEnvtExoDefaut
-
-\begin{EnvtExo}%
- [Type=Perso/{Titre perso~},Decoration=Image/goku_ssj4,Trait=non,Compteur=false]%exo13
- \ipsum<Lang=FR,Type=sent>
-\end{EnvtExo}
-
-\TitreExo[Type=Perso/{Annexe Exercice 3},Compteur=false,Decoration=Image/sseiya_aiolos]%exo14
-
-\ipsum<Lang=FR,Type=sent>
-
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode}
+% arara: pdflatex: {shell: no, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+
+\documentclass[a5paper,11pt]{article}
+\usepackage[margin=1cm]{geometry}
+\usepackage{customenvs}
+%facultatif, pour les décorations
+\usepackage{graphicx}
+\usepackage{dashrulex}
+\usepackage{coloredbelts}
+\usepackage{pictochrono}
+%mise en page
+\usepackage{ipsum}
+\setlength{\parindent}{0pt}
+
+\begin{document}
+
+\begin{EnvtExo}%exo1
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Trait=pointilles]%exo2
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Trait=dashilles]%exo3
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Decoration=Icone/\faPython]%exo4
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Decoration=Ceinture/rouge]%exo5
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Decoration=Chrono/20]%exo6
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Decoration=Image/goku_ssj4]%exo7
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Decoration=Image/sseiya_shura]%exo8
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Decoration=Points/7]%exo9
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Type=Perso/{Titre perso }]%exo10
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\StyleEnvtExo[Couleur=red,Police=\bfseries\ttfamily,EpTrait=2pt,Libelle={Exercice n°}]
+
+\begin{EnvtExo}[Decoration=Icone/\faAddressBook]%exo11
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\begin{EnvtExo}[Type=Perso/{Titre perso },Decoration=Chrono/25,Couleur=red,Trait=dashilles]%exo12
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\StyleEnvtExoDefaut
+
+\begin{EnvtExo}%
+ [Type=Perso/{Titre perso~},Decoration=Image/goku_ssj4,Trait=non,Compteur=false]%exo13
+ \ipsum<Lang=FR,Type=sent>
+\end{EnvtExo}
+
+\TitreExo[Type=Perso/{Annexe Exercice 3},Compteur=false,Decoration=Image/sseiya_aiolos]%exo14
+
+\ipsum<Lang=FR,Type=sent>
+
\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/customenvs/tex/customenvs.sty b/macros/latex/contrib/customenvs/tex/customenvs.sty
index ee8f4427a2..797a4e65bc 100644
--- a/macros/latex/contrib/customenvs/tex/customenvs.sty
+++ b/macros/latex/contrib/customenvs/tex/customenvs.sty
@@ -3,9 +3,10 @@
% source pencil...: CC-BY-SA 4.0 https://tex.stackexchange.com/questions/504092/replicating-a-fancy-bordered-text-style-in-latex/504145#504145
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{customenvs}[2024/04/04 0.1.4 Custom classic environments]
+\ProvidesPackage{customenvs}[2024/05/17 0.1.5 Custom classic environments]
%====HISTORIQUE
+% v 0.1.6 Boxes for exam title + circled numbers + Vignettes + Small simple boxes creation
% v 0.1.4 Commande (en/fr) pour du texte dans une boîte arrondie, de hauteur 'figée' + 'Chat' SMS
% v 0.1.3 Environnement/Commande pour présentation d'un exercice
% v 0.1.2 Crayon de compétences
@@ -54,8 +55,9 @@
\RequirePackage{listofitems}
\RequirePackage{calc}
\RequirePackage{tikz}
-\usetikzlibrary{decorations.pathmorphing,positioning,shapes.misc,calc}
-\usepackage{tcolorbox}
+\usetikzlibrary{decorations.pathmorphing,positioning,shapes.misc,calc,babel}
+\RequirePackage{tcolorbox}
+\RequirePackage{varwidth}
\tcbuselibrary{skins}
%%----COMMANDES FR
@@ -922,7 +924,7 @@
\setKVdefault[BoiteArrondie]{%
Fond=red,%
Texte=white,%
- EspH=0.25em,%
+ EspH=0.125em,%
Style=rect
}
\NewDocumentCommand\BoiteArrondie{ O{} m O{char} }{%
@@ -1346,25 +1348,23 @@
}
%====ROUNDED BOX
-\defKV[RoundedBox]{hmargin=\def\RoundedBoxDelta{#1},style=\def\RoundedBoxStyle{#1}}
-\setKVdefault[RoundedBox]{%
- bg=red,%
- txt=white,%
- hmargin=0.25em,%
- style=rect
-}
-
-
-
-\NewDocumentCommand\RoundedBox{ O{} m O{char} }{%
- \restoreKV[RoundedBox]%
- \setKV[RoundedBox]{#1}%
- \settototalheight{\tmpheightbox}{\hbox{(EazertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN)#2}}%hauteur globale
- \IfStrEqCase{\RoundedBoxStyle}{%
- {rect}{\tikz[remember picture,baseline=(#3.base)]{\node[minimum height=\tmpheightbox,shape=rectangle,rounded corners=0.25em,fill={\useKV[RoundedBox]{bg}},inner sep=0.75pt,outer sep=0pt,text={\useKV[RoundedBox]{txt}}] (#3) {\vphantom{(qE)}\kern\RoundedBoxDelta#2\kern\RoundedBoxDelta};}}%
- {circle}{\tikz[remember picture,baseline=(#3.base)]{\node[minimum height=\tmpheightbox,shape=circle,fill={\useKV[RoundedBox]{bg}},inner sep=0.75pt,outer sep=0pt,text={\useKV[RoundedBox]{txt}}] (#3) {\vphantom{(qE)}#2};}}%
- }\relax
-}
+% \defKV[RoundedBox]{hmargin=\def\RoundedBoxDelta{#1},style=\def\RoundedBoxStyle{#1}}
+% \setKVdefault[RoundedBox]{%
+ % bg=red,%
+ % txt=white,%
+ % hmargin=0.25em,%
+ % style=rect
+% }
+
+% \NewDocumentCommand\RoundedBox{ O{} m O{char} }{%
+ % \restoreKV[RoundedBox]%
+ % \setKV[RoundedBox]{#1}%
+ % \settototalheight{\tmpheightbox}{\hbox{(EazertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN)#2}}%hauteur globale
+ % \IfStrEqCase{\RoundedBoxStyle}{%
+ % {rect}{\tikz[remember picture,baseline=(#3.base)]{\node[minimum height=\tmpheightbox,shape=rectangle,rounded corners=0.25em,fill={\useKV[RoundedBox]{bg}},inner sep=0.75pt,outer sep=0pt,text={\useKV[RoundedBox]{txt}}] (#3) {\vphantom{(qE)}\kern\RoundedBoxDelta#2\kern\RoundedBoxDelta};}}%
+ % {circle}{\tikz[remember picture,baseline=(#3.base)]{\node[minimum height=\tmpheightbox,shape=circle,fill={\useKV[RoundedBox]{bg}},inner sep=0.75pt,outer sep=0pt,text={\useKV[RoundedBox]{txt}}] (#3) {\vphantom{(qE)}#2};}}%
+ % }\relax
+% }
%====Chat SMS
%===Keys [EN]
@@ -1489,5 +1489,226 @@
title={#2\IfBooleanTF{#1}{}{$\cdot$\scalebox{0.6}[0.6]{\faCheckCircle[regular]\!\faCheckCircle[regular]}~}},left=1mm,right=1mm,boxsep=0mm]{#3}%
}
+%====SMALL BOXES CREATION
+\tikzset{simpleboxrulearrow/.style={line width=0.8pt,|->,>=latex}}
+
+% \NewTColorBox{SimpleBox}{ O{blue} D<>{} m }{
+ % enhanced,nobeforeafter,blanker,size=small,bottom=1mm,before=\par\noindent,%top=0mm,left=1mm,right=1mm,
+ % title={#3},fonttitle=\sffamily\bfseries\color{#1},lefttitle=1em,
+ % finish={\draw[#1,simpleboxrulearrow] ([xshift=1em]title.west) --++ (-1em,0) |- (frame.south east) -- ($(frame.south east)!0.5!(frame.north east)$) ;},%
+ % #2
+% }
+
+\NewTColorBox{BoiteSimple}{ O{blue} D<>{} m }{
+ enhanced,nobeforeafter,blanker,size=small,bottom=1mm,before=\par\noindent,%top=0mm,left=1mm,right=1mm,
+ title={#3},fonttitle=\sffamily\bfseries\color{#1},lefttitle=1em,
+ finish={\draw[#1,simpleboxrulearrow] ([xshift=1em]title.west) --++ (-1em,0) |- (frame.south east) -- ($(frame.south east)!0.5!(frame.north east)$) ;},%
+ #2
+}
+
+% \NewDocumentCommand\GenSimpleBox{ O{blue} m }{%
+ % 1 = couleur
+ % 2 = nom
+ % \NewTColorBox{#2}{ O{} m }{
+ % enhanced,nobeforeafter,blanker,size=small,bottom=1mm,before=\par\noindent,%top=0mm,left=1mm,right=1mm,
+ % title={##2},fonttitle=\sffamily\bfseries\color{#1},lefttitle=1em,
+ % finish={\draw[#1,simpleboxrulearrow] ([xshift=1em]title.west) --++ (-1em,0) |- (frame.south east) -- ($(frame.south east)!0.5!(frame.north east)$) ;},%
+ % ##1
+ % }
+% }
+
+\NewDocumentCommand\GenereBoiteSimple{ O{blue} m }{%
+ %1 = couleur
+ %2 = nom
+ \NewTColorBox{#2}{ O{} m }{
+ enhanced,nobeforeafter,blanker,size=small,bottom=1mm,before=\par\noindent,%top=0mm,left=1mm,right=1mm,
+ title={##2},fonttitle=\sffamily\bfseries\color{#1},lefttitle=1em,
+ finish={\draw[#1,simpleboxrulearrow] ([xshift=1em]title.west) --++ (-1em,0) |- (frame.south east) -- ($(frame.south east)!0.5!(frame.north east)$) ;},%
+ ##1
+ }
+}
+
+%====CIRCLEDNUMBERSSIMPLE
+\defKV[CircledBoxNumber]{bg=\def\tmpbordernbcircbox{#1}}
+\setKVdefault[CircledBoxNumber]{bg={},txt=black,bthick=0.5pt,bcol=black,raise=true}
+
+\newlength{\tmpheightnbcircbox}
+\newlength{\tmpdepthnbcircbox}
+\NewDocumentCommand\CircledNumber{ O{} m O{circnb} }{%
+ \restoreKV[CircledBoxNumber]%
+ \setKV[CircledBoxNumber]{#1}%
+ \settototalheight{\tmpheightnbcircbox}{(1234567890)}%hauteur globale
+ \settodepth{\tmpdepthnbcircbox}{(1234567890)}%
+ \ifboolKV[CircledBoxNumber]{raise}%
+ {%
+ \IfEq{\tmpbordernbcircbox}{}%
+ {%
+ {\tikz[baseline={([yshift=\tmpdepthnbcircbox]current bounding box.south)}]\node[outer sep=0pt,inner sep=0.5pt,minimum height={\tmpheightnbcircbox-\useKV[CircledBoxNumber]{bthick}},draw,{\useKV[CircledBoxNumber]{bcol}},line width={\useKV[CircledBoxNumber]{bthick}},circle,text={\useKV[CircledBoxNumber]{txt}}] (#3) {\ifnum#2<10 #2\else\scalebox{0.5}[1]{#2}\fi} ;}%
+ }%
+ {%
+ {\tikz[baseline={([yshift=\tmpdepthnbcircbox]current bounding box.south)}]\node[outer sep=0pt,inner sep=0.5pt,minimum height={\tmpheightnbcircbox-\useKV[CircledBoxNumber]{bthick}},draw,{\useKV[CircledBoxNumber]{bcol}},line width={\useKV[CircledBoxNumber]{bthick}},circle,fill={\useKV[CircledBoxNumber]{bg}},text={\useKV[CircledBoxNumber]{txt}}] (#3) {\ifnum#2<10 #2\else\scalebox{0.5}[1]{#2}\fi} ;}%
+ }%
+ }%
+ {%
+ \IfEq{\tmpbordernbcircbox}{}%
+ {%
+ {\tikz[baseline=(#3.base)] \node[outer sep=0pt,inner sep=0.5pt,minimum height={\tmpheightnbcircbox-\useKV[CircledBoxNumber]{bthick}},draw,{\useKV[CircledBoxNumber]{bcol}},line width={\useKV[CircledBoxNumber]{bthick}},circle,text={\useKV[CircledBoxNumber]{txt}}] (#3) {\ifnum#2<10 #2\else\scalebox{0.5}[1]{#2}\fi} ;}%
+ }%
+ {%
+ {\tikz[baseline=(#3.base)] \node[outer sep=0pt,inner sep=0.5pt,minimum height={\tmpheightnbcircbox-\useKV[CircledBoxNumber]{bthick}},draw,{\useKV[CircledBoxNumber]{bcol}},line width={\useKV[CircledBoxNumber]{bthick}},circle,fill={\useKV[CircledBoxNumber]{bg}},text={\useKV[CircledBoxNumber]{txt}}] (#3) {\ifnum#2<10 #2\else\scalebox{0.5}[1]{#2}\fi} ;}%
+ }%
+ }%
+}
+
+%====EXAM BOX TITLE(s)
+\NewDocumentCommand\LetPhantomBox{}{%
+ \vphantom{(ÉAZERTYUIOPQSDFGHJKLMWXCVBN,éàço)}%
+}
+
+\tcbset{StyleTitreSujet/.style={%
+ enhanced,size=small,
+ colback=white!5,boxrule=1.25pt,
+ attach boxed title to top left={xshift=0.5cm,yshift=1mm-\tcboxedtitleheight},
+ varwidth boxed title*=-3cm,
+ boxed title style={frame code={
+ \path[fill=tcbcolframe!50!black]
+ ([yshift=-1mm,xshift=-1mm]frame.north west)
+ arc[start angle=0,end angle=180,radius=1mm]
+ ([yshift=-1mm,xshift=1mm]frame.north east)
+ arc[start angle=180,end angle=0,radius=1mm];
+ \path[fill=tcbcolframe] ([xshift=-2mm]frame.north west) -- ([xshift=2mm]frame.north east) [rounded corners=1mm]-- ([xshift=1mm,yshift=-1mm]frame.north east) -- (frame.south east) -- (frame.south west) -- ([xshift=-1mm,yshift=-1mm]frame.north west) [sharp corners]-- cycle;
+ },interior engine=empty,size=fbox,
+ },
+ fonttitle=\bfseries\sffamily,
+ fontupper=\huge\bfseries\sffamily,
+ }
+}
+
+\defKV[tcbtitresujet]{%
+ AlignH=\def\tcbtitresujethalign{#1}
+}
+
+\setKVdefault[tcbtitresujet]{%
+ Couleur=black,
+ AlignH=center
+}
+
+\NewDocumentEnvironment{TitreSujet}{ O{} D<>{} m }%
+{%
+ \restoreKV[tcbtitresujet]%
+ \setKV[tcbtitresujet]{#1}%
+ \IfStrEqCase{\tcbtitresujethalign}{%
+ {right}{\tcbset{StyleTitreSujetAlign/.style={halign=flush right}}}%
+ {left}{\tcbset{StyleTitreSujetAlign/.style={halign=flush left}}}%
+ }[\tcbset{StyleTitreSujetAlign/.style={halign=flush center}}]%
+ \tcolorbox[colupper={\useKV[tcbtitresujet]{Couleur}},colframe={\useKV[tcbtitresujet]{Couleur}},StyleTitreSujet,StyleTitreSujetAlign,title={\vphantom{QJ}#3},before upper=\LetPhantomBox,after upper=\LetPhantomBox,#2]%
+}%
+{%
+ \endtcolorbox%
+}
+
+\tcbset{StyleTitreSujetSousEpreuve/.style={%
+ center,after skip=1pt,size=small,boxsep=3pt,boxrule=1pt,colback=white,left=2pt,right=2pt,%
+ sharp corners,rounded corners=downhill,arc=8pt,
+ fontupper={\sffamily\bfseries\large}
+ }
+}
+
+\NewDocumentCommand\SousTitreSujetEpreuve{ O{black} m }{%
+ \tcbset{StyleTitreSujetSousEpreuveCouleur/.style={colframe=#1,colupper=#1}}
+ \IfStrEqCase{#2}{%
+ {}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur]{#2}}%
+ {U21}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faSortNumericDown\:\:,after upper=\:\:\faProjectDiagram]{Épreuve U2 - Mathématiques pour l'Informatique}}%
+ {U2}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faSortNumericDown\:\:,after upper=\:\:\faProjectDiagram]{Épreuve U2 - Mathématiques pour l'Informatique}}%
+ {U2CG}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faSortNumericDown\:\:,after upper=\:\:\faProjectDiagram]{Épreuve U2 - Mathématiques appliquées}}%
+ {UF2}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faDice\:\:,after upper=\:\:\faChartLine]{Épreuve UF2 - Mathématiques Approfondies}}%
+ {U41OL}{\tcbox[StyleTitreSujetSousEpreuve,StyleTitreSujetSousEpreuveCouleur,before upper=\faDice\:\:,after upper=\:\:\faBezierCurve]{Épreuve U41 - Mathématiques}}
+ }%
+}
+
+\NewDocumentCommand\SujetTitreExo{ O{black} m }{%
+ \tcolorbox[enhanced,width=\linewidth,size=small,colback=white,colframe=#1,boxrule=0.75pt,fontupper=\color{#1}\Large\sffamily\bfseries,sharp corners,rounded corners=south,arc=4pt,before upper=\LetPhantomBox]
+ #2
+ \endtcolorbox%
+}
+
+%====vignettes
+\NewDocumentCommand\LetPhantomVignette{}{%
+ \vphantom{(AZERTYUIOPQSDFGHJKLMWXCVBN,éàço)}%
+}
+
+\tcbset{cevignettes/.style={%
+ nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,arc=2pt,boxrule=0.65pt,left=1.75pt,right=1.25pt,top=1.25pt,bottom=0.5pt,colback=white,before upper=\LetPhantomVignette
+ }
+}
+
+\tcbset{cevignettepy/.style={%
+ cevignettes,left=6pt,coltitle=tcbcolframe,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{PY}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettealgo/.style={%
+ cevignettes,left=6pt,coltitle=tcbcolframe,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{ALGO}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettetableur/.style={%
+ cevignettes,left=6pt,coltitle=tcbcolframe,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.5}[0.75]{\textbf{EXCEL}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignetteMPM/.style={%
+ cevignettes,left=6pt,coltitle=white,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{MPM}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettegraph/.style={%
+ cevignettes,left=6pt,coltitle=white,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{GRPH}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignetteshell/.style={%
+ cevignettes,left=6pt,coltitle=white,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black] {\scalebox{0.5}[0.75]{\textbf{SHELL}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettelatex/.style={%
+ cevignettes,left=6pt,coltitle=white,
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{\LaTeX}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\tcbset{cevignettexcas/.style={%
+ cevignettes,left=6pt,coltitle=white,colback=white,%
+ underlay={\begin{tcbclipinterior}\fill[fill=tcbcolframe!33]($(interior.south west)$) rectangle node[rotate=90,font=\tiny\sffamily,tcbcolframe!75!black]{\scalebox{0.55}[0.75]{\textbf{XCAS}}} ($(interior.north west)+(5pt,0pt)$);\end{tcbclipinterior}}
+ }
+}
+
+\defKV[cevignette]{Type=\def\cevignettetype{#1},Couleur=\def\cevignettecolor{#1},Police=\def\cevignettefont{#1}}
+\setKVdefault[cevignette]{Type={},Couleur={darkgray},Police=\footnotesize}
+
+\NewDocumentCommand\AffVignette{ s O{} m }{%
+ \restoreKV[cevignette]%
+ \setKV[cevignette]{#2}%
+ \IfStrEqCase{\cevignettetype}{%
+ {}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettes]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {algo}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettealgo]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {py}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettepy]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {pypit}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettepy]{\piton{#3}}}%
+ {pyl}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettepy]{\piton{\py{#3}}}}%
+ {mpm}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignetteMPM]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {grph}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettegraph]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {xcas}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettexcas]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {shell}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignetteshell]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {tex}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont\ttfamily},cevignettelatex]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ {sheet}{\tcbox[colframe=\cevignettecolor,fontupper={\cevignettefont},cevignettetableur]{\IfBooleanTF{#1}{\NoAutoSpacing}{}#3}}%
+ }\relax%
+}
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx
index 2a60d8894f..511b24fa08 100644
--- a/macros/latex/contrib/easybook/easybook.dtx
+++ b/macros/latex/contrib/easybook/easybook.dtx
@@ -14,8 +14,7 @@
% This work has the LPPL maintenance status `maintained'.
%<*class>
\NeedsTeXFormat{LaTeX2e}[2021/11/15]
-\RequirePackage{l3keys2e}
-\ProvidesExplClass{easybook}{2024/04/26}{2024bb}
+\ProvidesExplClass{easybook}{2024/05/24}{2024bu}
{Easily typesetting Chinese theses or books}
\bool_new:N \l__eb_compile_draft_bool
@@ -29,7 +28,7 @@
\keys_define:nn { easybook }
{
newline .code:n = \bool_set_true:N \l__eb_title_newline_bool,
- scheme .code:n = \eb_put_ctexbook:n { scheme = #1 },
+ scheme .code:n = \eb_put_ctexbook:n { scheme = {#1} },
enmode .meta:n = { newline,scheme = plain },
font .choices:nn =
{ noto,times,times*,ebgaramond,libertine,palatino,auto }
@@ -47,7 +46,12 @@
unknown .code:n = \clist_gput_right:NV \g__eb_doc_options_clist \CurrentOption
}
-\ProcessKeysOptions{easybook}
+\cs_if_exist:NTF \ProcessKeyOptions
+ { \ProcessKeyOptions[easybook] }
+ {
+ \RequirePackage{l3keys2e}
+ \ProcessKeysOptions{easybook}
+ }
\PassOptionsToPackage{no-math,quiet,CJKmath}{xeCJK}
\eb_put_ctexbook:V \g__eb_doc_options_clist
\LoadClass[UTF8]{ctexbook}
@@ -81,7 +85,7 @@
{ \eb_set_family:xnn { \CJKsfdefault } {#2} {#1} }
\cs_new_protected:Npn \eb_setCJKmonofont:nn #1#2
{ \eb_set_family:xnn { \CJKttdefault } {#2} {#1} }
-\eb_seq_map_inline:nn
+\clist_map_inline:nn
{ main,sans,mono,CJKmain,CJKsans,CJKmono }
{
\exp_args:Nc \RenewDocumentCommand { set#1font }{O{}mO{}}
@@ -296,8 +300,8 @@
%</class>
%<*package>
\NeedsTeXFormat{LaTeX2e}[2021/11/15]
-\RequirePackage{l3keys2e,etoolbox}
-\ProvidesExplPackage{easybase}{2024/04/26}{2024bb}
+\RequirePackage{etoolbox}
+\ProvidesExplPackage{easybase}{2024/05/24}{2024bu}
{Easily typesetting Chinese theses or books}
\cs_generate_variant:Nn \dim_set:Nn { NV }
@@ -314,11 +318,6 @@
\cs_set_protected:Npn \ctex_define:nn #1
{ \keys_define:nn { ctex/#1 } }
-\cs_new_protected:Npn \eb_seq_map_inline:nn #1#2
- {
- \seq_set_from_clist:Nn \l_tmpa_seq {#1}
- \seq_map_inline:Nn \l_tmpa_seq {#2}
- }
\cs_new_protected:Npn \eb_patch_cmd:Nnn #1#2#3
{
\ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3}
@@ -330,7 +329,7 @@
{ \AddToHook{cmd/#1/after}{#2} }
\cs_new_protected:Npn \eb_at_begin_environment:nn #1#2
{
- \eb_seq_map_inline:nn {#1}
+ \clist_map_inline:nn {#1}
{ \AtBeginEnvironment{##1}{#2} }
}
\cs_new_protected:Npn \eb_at_end_preamble:n
@@ -356,7 +355,7 @@
\RenewDocumentCommand{\usepackage}{O{}mO{}}
{
\PassOptionsToPackage{#1}{#2}
- \eb_seq_map_inline:nn {#2}
+ \clist_map_inline:nn {#2}
{
\eb_if_package_loaded:nnF {##1} {#1}
{ \eb@usepackage@save{##1}[#3] }
@@ -379,7 +378,7 @@
\int_compare:nTF { \clist_count:n {#1} <= 1 }
{ \RequirePackage }
{
- \eb_seq_map_inline:nn {#1}
+ \clist_map_inline:nn {#1}
{ \eb_match_load_package:n {##1} }
}
}
@@ -421,7 +420,12 @@
\PassOptionsToPackage{list = off}{bicaption}
\PassOptionsToPackage{svgnames}{xcolor}
\PassOptionsToPackage{many}{tcolorbox}
-\ProcessKeysOptions{easybase}
+\cs_if_exist:NTF \ProcessKeyOptions
+ { \ProcessKeyOptions[easybase] }
+ {
+ \RequirePackage{l3keys2e}
+ \ProcessKeysOptions{easybase}
+ }
\PassOptionsToPackage{\g__eb_ctex_options_clist}{ctex}
\IfClassLoadedTF{ctexbook}{}
{
@@ -431,12 +435,15 @@
{\RequirePackage[heading]{ctex}}
}
}
+\ctex_disable_package:n { nccfoots }
+\ctex_disable_package:n { tocloft }
+\ctex_disable_package:n { titlesec }
\seq_set_from_clist:Nn \l__eb_module_paths_seq
{
tools,font,spread,
bib,thmt,toc,
- hdr,ref,geo,float
+ hdr,float,ref,geo
}
\seq_map_inline:Nn \l__eb_module_paths_seq
{
@@ -450,7 +457,7 @@
{\ctex_set:n {#2}}
}
\bool_until_do:nn
- { \int_compare_p:nNn { \seq_count:N \l__eb_module_paths_seq } < { 8 } }
+ { \int_compare_p:nNn { \seq_count:N \l__eb_module_paths_seq } < { 9 } }
{ \seq_pop_right:NN \l__eb_module_paths_seq \l_tmpa_tl }
\seq_map_inline:Nn \l__eb_module_paths_seq
{
@@ -602,7 +609,7 @@
\booltrue{@mainmatter}
\pagenumbering{arabic}
}
-\eb_seq_map_inline:nn
+\clist_map_inline:nn
{ chapter,section,subsection }
{
\exp_args:Nc \NewDocumentCommand { eb@mark@#1@label@layout }
@@ -817,7 +824,7 @@
\cs_new_protected:Npn \eb_fnmarktext_short_label_set:Nn #1#2
{
\tl_set:Nn \l__eb_fnmarktext_short_tokens_tl {#2}
- \eb_seq_map_inline:nn
+ \clist_map_inline:nn
{ A,a,1,I,i,c,s }
{
\regex_match:nnT {##1} {#2}
@@ -889,7 +896,7 @@
fntext-code .initial:n = { ,\tl_if_eq:NnF \l__eb_fntext_position_tl { super } { ~ } },
fnmarktext-format .code:n = \eb_fnboth_format_set:nn {#1} { marktext },
fncustom-format .code:n = \eb_fnboth_format_set:nn {#1} { custom },
- fnboth-format .meta:n = { fnmarktext-format = #1,fncustom-format = #1 },
+ fnboth-format .meta:n = { fnmarktext-format = {#1},fncustom-format = {#1} },
footnotetype .multichoices:nn =
{ plain,hang,bottom,para,flush }
{ \eb_footnote_value_handle:n {#1} },
@@ -912,7 +919,7 @@
{ \eb_fnmarktext_normal_label_set:Nn \thefootnote {#1} },
fntext-num .value_required:n = true,
fntext-num/unknown .code:n = \eb_fnmarktext_short_label_set:Nn \thefootnote {#1},
- fnmarktext-num .meta:n = { fntext-num = #1,fnmark-num = #1 },
+ fnmarktext-num .meta:n = { fntext-num = {#1},fnmark-num = {#1} },
fnmarktext-num .initial:n = plain,
unknown .code:n = \eb_msg_deprecated_option:n { hdr }
}
@@ -1034,7 +1041,7 @@
\l__eb_fnpara_format_tl{#1}
\tl_if_eq:NnT \l__eb_footnote_value_tl { hang } { \par }
}
-\eb_seq_map_inline:nn { \@footnotetext,\@mpfootnotetext }
+\clist_map_inline:nn { \@footnotetext,\@mpfootnotetext }
{
\eb_patch_cmd:Nnn #1
{ \reset@font }
@@ -1045,6 +1052,7 @@
}
\cs_set_eq:NN \eb@@makefntext \@makefntext
\cs_set_eq:NN \eb@@footnotetext \@footnotetext
+\cs_set_eq:NN \eb@@mpfootnotetext \@mpfootnotetext
\ctex_at_end_package:nn { footmisc }
{
\eb_package_date_check:nn { footmisc } { 2022/02/10 }
@@ -1068,7 +1076,11 @@
hang,~symbol,~perpage,~marginal~or~flushmargin \\
options~of~'footmisc'~package.
}
-
+\ctex_at_end_package:nn { setspace }
+ {
+ \cs_set_eq:NN \@footnotetext \eb@@footnotetext
+ \cs_set_eq:NN \@mpfootnotetext \eb@@mpfootnotetext
+ }
\cs_set_protected:Npn \footref #1
{
\group_begin:
@@ -1145,18 +1157,17 @@
\bool_set_true:N \l__eb_normal_footnote_bool
\bool_new:N \l__eb_fnmarktext_format_match_bool
\bool_new:N \l__eb_fncustom_format_match_bool
+\cs_new:Npn \eb_fnmarktext_format_clear:n #1
+ {
+ \bool_if:cTF { l__eb_fn#1_format_match_bool }
+ { \tl_clear:N \l__eb_fnmarktext_format_tl }
+ { \spbset{spcmd = { }} }
+ }
\cs_new_protected:Npn \eb_fnmarktext_format_initial:
{
\bool_if:NTF \l__eb_normal_footnote_bool
- {
- \bool_if:NT \l__eb_fnmarktext_format_match_bool
- { \tl_clear:N \l__eb_fnmarktext_format_tl }
- }
- {
- \bool_if:NT \l__eb_fncustom_format_match_bool
- { \tl_clear:N \l__eb_fnmarktext_format_tl }
- }
- \bool_if:NF \l__eb_fnmarktext_format_match_bool { \spbset{spcmd = { }} }
+ { \eb_fnmarktext_format_clear:n { marktext } }
+ { \eb_fnmarktext_format_clear:n { custom } }
\eb@font@footnote
}
\cs_new_protected:Npn \defupfntmark #1
@@ -1283,7 +1294,7 @@
{ \use:c { CTEX@#1@tocline }{#1}{#2} }
\group_end:
}
-\cs_new_protected:Npn \RegisterBititle #1
+\cs_new_protected:Npn \eb@register@bititle #1
{
\exp_args:Nc \NewDocumentCommand { bi#1 }{sO{##3}mm}
{
@@ -1292,7 +1303,6 @@
\use:c {#1}*{\phantomsection ##3}
\CTEX@addtocline{#1}{##2}
\tl_if_empty:oF {##4} { \CTEX@addbitocline{#1}{##4} }
- \tl_set:Nn \l__eb__bitoc_mark_title_level_tl {#1}
\use:c { #1mark }{##2}
}{
\stepcounter{bi#1}
@@ -1301,33 +1311,54 @@
}
}
}
-\clist_map_function:nN
- { chapter,section,subsection }
- \RegisterBititle
+\cs_new_protected:Npn \RegisterBititle #1
+ {
+ \clist_map_function:nN {#1}
+ \eb@register@bititle
+ }
+\RegisterBititle{chapter,section,subsection}
\eb_preto_cmd:nn { @chapter }
{
\skip_if_eq:nnF { \eb@toc@lol@skip } { \c_zero_skip }
{ \addtocontents{lol}{\protect\addvspace{\skip_use:N \eb@toc@lol@skip}} }
}
-\cs_new_protected:Npn \NewTitleCommand #1#2
- {
- \newcounter{#1}
- \cs_set_eq:cN { #1mark } \use_none:n
+\cs_new_protected:Npn \eb_title_base_set_eq:nn #1#2
+ {
+ \tl_set_eq:cc { CTEX@#2@beforeskip } { CTEX@#1@beforeskip }
+ \tl_set_eq:cc { CTEX@#2@afterskip } { CTEX@#1@afterskip }
+ \bool_set_eq:cc { CTEX@#2@numbering } { CTEX@#1@numbering }
+ \bool_set_eq:cc { CTEX@#2@fixskip } { CTEX@#1@fixskip }
+ \bool_set_eq:cc { CTEX@#2@hang } { CTEX@#1@hang }
+ \bool_set_eq:cc { CTEX@#2@runin } { CTEX@#1@runin }
+ \cs_set_eq:cc { CTEX@#2@tocline } { CTEX@#1@tocline }
+ \tl_set_eq:cc { CTEX@#2@break } { CTEX@#1@break }
+ \tl_set_eq:cc { CTEX@#2@format } { CTEX@#1@format }
+ \tl_set_eq:cc { CTEX@#2@nameformat } { CTEX@#1@nameformat }
+ \tl_set_eq:cc { CTEX@#2@numberformat } { CTEX@#1@numberformat }
+ \tl_set_eq:cc { CTEX@#2@titleformat } { CTEX@#1@titleformat }
+ \tl_set_eq:cc { CTEX@#2@aftername } { CTEX@#1@aftername }
+ \tl_set_eq:cc { CTEX@#2@aftertitle } { CTEX@#1@aftertitle }
+ }
+\NewDocumentCommand{\NewTitleCommand}{omm}
+ {
+ \newcounter{#2}
+ \cs_set_eq:cN { #2mark } \use_none:n
\tl_clear:N \l__ctex_tmp_tl
- \__ctex_initial_heading:n {#1}
- \__ctex_def_heading_keys:n {#1}
+ \__ctex_initial_heading:n {#2}
+ \__ctex_def_heading_keys:n {#2}
\exp_args:No \ctex_define:n { \l__ctex_tmp_tl }
- \cs_gset_protected:cpx {#1}
+ \cs_gset_protected:cpx {#2}
{
- \exp_not:N \@startsection{#1}{#2}
- {\exp_not:c { CTEX@#1@indent }}
- {\exp_not:c { CTEX@#1@beforeskip }}
- {\exp_not:c { CTEX@#1@afterskip }}
- {\exp_not:N \normalfont\exp_not:c { CTEX@#1@format }}
+ \exp_not:N \@startsection{#2}{#3}
+ {\exp_not:c { CTEX@#2@indent }}
+ {\exp_not:c { CTEX@#2@beforeskip }}
+ {\exp_not:c { CTEX@#2@afterskip }}
+ {\exp_not:N \normalfont\exp_not:c { CTEX@#2@format }}
}
- \cs_new:cpn { CTEX@#1@tocline } ##1##2
+ \cs_new:cpn { CTEX@#2@tocline } ##1##2
{ \CTEXnumberline{##1}##2 }
- \exp_args:Nc \providecommand { toclevel@#1 }{#2}
+ \exp_args:Nc \providecommand { toclevel@#2 }{#3}
+ \IfValueT{#1}{\eb_title_base_set_eq:nn {#1} {#2}}
}
\NewDocumentCommand{\NewTitleEntryCommand}{O{toc}m}
{
@@ -1344,18 +1375,18 @@
{
hyphen-figure .tl_set:N = \l__eb_hyphen_figure_tl,
hyphen-table .tl_set:N = \l__eb_hyphen_table_tl,
- hyphen-listing .tl_set:N = \l__eb_hyphen_lstlisting_tl,
+ hyphen-listing .tl_set:N = \l__eb_hyphen_listing_tl,
hyphen-equation .tl_set:N = \l__eb_hyphen_equation_tl,
hyphen-every .meta:n =
{
- hyphen-figure = #1,hyphen-table = #1,
- hyphen-listing = #1,hyphen-equation = #1
+ hyphen-figure = {#1},hyphen-table = {#1},
+ hyphen-listing = {#1},hyphen-equation = {#1}
},
hyphen-every .initial:n = .,
unknown .code:n = \eb_msg_deprecated_option:n { tools }
}
-\eb_seq_map_inline:nn
- { figure,table,lstlisting,equation }
+\clist_map_inline:nn
+ { figure,table,listing,equation }
{
\cs_set:cpn { the#1 }
{
@@ -1412,21 +1443,24 @@
\bool_set_true:N \l__eb_toc_plan_bi_bool
},
plan .initial:n = cn,
- columns .meta:n = { multoc = #1 },
+ columns .meta:n = { multoc = {#1} },
title .code:n = \eb_assign_toc_title:n {#1},
bilist .code:n =
{
\tl_gset:Nn \g__eb_bilist_permute_value_tl {#1}
\str_if_eq:nnTF {#1} { mix }
{
- \eb_preto_cmd:nn { CTEX@addtocline }
- { \addtocontents{toc}{\boolfalse{bitoc}} }
- \eb_preto_cmd:nn { CTEX@addbitocline }
- { \addtocontents{toc}{\booltrue{bitoc}} }
+ \AddToHook{cmd/CTEX@addtocline/before}[bitoc]
+ {\addtocontents{toc}{\boolfalse{bitoc}}}
+ \AddToHook{cmd/CTEX@addbitocline/before}[bitoc]
+ {\addtocontents{toc}{\booltrue{bitoc}}}
}
{
- \RemoveFromHook{cmd/CTEX@addtocline/before}
- \RemoveFromHook{cmd/CTEX@addbitocline/before}
+ \IfHookEmptyTF{cmd/CTEX@addtocline/before}{}
+ {
+ \RemoveFromHook{cmd/CTEX@addtocline/before}[bitoc]
+ \RemoveFromHook{cmd/CTEX@addbitocline/before}[bitoc]
+ }
}
},
name .tl_set:N = \l__eb_print_index_name_tl,
@@ -1582,11 +1616,8 @@
\tl_new:N \l__eb_toc_tmpb_tl
\cs_new_protected:Npn \eb_toc_format_initial:nn #1#2
{
- \exp_last_unbraced:Nx
- \use:n
+ \exp_last_unbraced:Nx \titlecontents
{
- \exp_not:N
- \titlecontents
\tl_use:N \l__eb_toc_tmpa_tl
\exp_not:n
{
@@ -1603,7 +1634,7 @@
\ctex_set:nn {#2}
{
tocformat = \IfBooleanT{#1}{\contentsmargin{0pt}},
- tocindent = 0em,
+ tocindent = 0pt,
tocrule = \IfBooleanTF{#1}{,~\thecontentspage}{\tocrule{$\cdot$}},
toclabel =
{
@@ -1617,7 +1648,21 @@
tocend = .
}
}
-\NewDocumentCommand{\RegisterTocName}{sm}
+\seq_new:N \l__eb_toc_every_include_name_seq
+\cs_new_protected:Npn \ExcludeEveryTocName #1
+ {
+ \clist_map_inline:nn {#1}
+ { \seq_remove_all:Nn \l__eb_toc_every_include_name_seq {##1} }
+ }
+\cs_new_protected:Npn \IncludeEveryTocName #1
+ {
+ \clist_map_inline:nn {#1}
+ {
+ \seq_put_right:Nn \l__eb_toc_every_include_name_seq {##1}
+ \seq_remove_duplicates:N \l__eb_toc_every_include_name_seq
+ }
+ }
+\cs_new_protected:Npn \eb@register@toc@name #1#2
{
\IfBooleanT{#1}
{
@@ -1629,48 +1674,42 @@
[\tl_use:c { l__eb_toc_#2_end_tl }]
}
}
+ \IncludeEveryTocName{#2}
\eb_toc_format_define:n {#2}
\eb_toc_format_initial:nn {#1} {#2}
\tl_clear:N \l__eb_toc_tmpa_tl
\tl_clear:N \l__eb_toc_tmpb_tl
}
-\seq_map_function:NN
-\c__ctex_headings_seq \RegisterTocName
-\eb_seq_map_inline:nn
+\NewDocumentCommand{\RegisterTocName}{sm}
{
- tocformat,tocformat+,tocformat~+,
- tocindent,tocrule,tocline,tocafter,between
+ \clist_map_inline:nn {#2}
+ { \eb@register@toc@name{#1}{##1} }
}
+\clist_set_from_seq:NN
+\c__ctex_headings_clist \c__ctex_headings_seq
+\exp_args:NV \RegisterTocName \c__ctex_headings_clist
+\ctex_define:n { float/unknown .code:n = \eb_msg_deprecated_option:n { float } }
+\cs_new_protected:Npn \eb@register@every@toc@option #1
{
- \ctex_define:n
+ \ctex_define:nn { toc }
{
- float/#1 .meta:n =
+ #1-every .code:n =
{
- figure/#1 = ##1,table/#1 = ##1,
- lstlisting/#1 = ##1
+ \seq_map_inline:Nn \l__eb_toc_every_include_name_seq
+ { \ctex_set:n { ####1/#1 = {##1} } }
}
}
}
-\eb_seq_map_inline:nn
- { tocafter,tocindent,tocrule }
+\cs_new_protected:Npn \RegisterEveryTocOption #1
{
- \ctex_define:nn { toc }
- {
- #1-every .code:n =
- {
- \ctex_set:n
- {
- part/#1 = ##1,chapter/#1 = ##1,
- section/#1 = ##1,subsection/#1 = ##1,
- float/#1 = ##1
- }
- }
- }
+ \clist_map_function:nN {#1}
+ \eb@register@every@toc@option
}
+\RegisterEveryTocOption{tocafter,tocindent,tocrule}
\NewDocumentCommand{\tocrule}{st-O{0.7pc}d()mO{}}
{
\normalsize\normalfont
- \titlerule*[#3]{\IfValueTF{#4}{\scalebox{#4}{#5}}{#5}}#6
+ \ttl@row@i[#3]{\IfValueTF{#4}{\scalebox{#4}{#5}}{#5}}#6
{
\IfBooleanF{#2}
{
@@ -1709,19 +1748,53 @@
\ifbool{@filesw}
{
\tl_if_exist:cF { tf@#1 }
- {\iow_new:c { tf@#1 }\iow_open:cn { tf@#1 } { \jobname.#1 }}
+ { \iow_new:c { tf@#1 }\iow_open:cn { tf@#1 } { \jobname.#1 } }
}
{}
}
\cs_set:Npn \@starttoc #1
{
\group_begin:
+ \makeatletter
\file_if_exist_input:n { \jobname.#1 }
\UseHookWithArguments{starttoc/after}{1}{#1}
\boolfalse{@nobreak}
\group_end:
}
-\AtEndDocument{\iow_now:Nn \@mainaux { \RemoveFromHook{starttoc/after}[aux] }}
+\AddToHook{enddocument/afterlastpage}
+ {
+ \IfHookEmptyTF{starttoc/after}{}
+ {\iow_now:Nn \@mainaux { \RemoveFromHook{starttoc/after}[aux] }}
+ }
+\cs_set_protected:Npn \AllotPartialExt #1#2
+ {
+ \tl_set:cn { ttl@partial#1 } {#2}
+ \AddToHookWithArguments{cmd/ttl@writepartial/before}
+ {\ttl@topartial{#1}{##1}{##2}}
+ }
+\AllotPartialExt{lol}{pll}
+
+\cs_new_protected:Npn \RegisterTitleIfname #1
+ {
+ \clist_map_function:nN {#1}
+ \eb@register@title@ifname
+ }
+\cs_new_protected:Npn \eb@register@title@ifname #1
+ {
+ \AddToHookWithArguments{cmd/addcontentsline/before}[title/ifname/#1]
+ {
+ \str_if_eq:nnT {##1} {#1}
+ {
+ \addtocontents{##1}
+ {\CTEXifname{\CTEX@ifnametrue}{\CTEX@ifnamefalse}}
+ }
+ }
+ \AddToHook{file/\jobname.#1/before}
+ {\cs_set_eq:NN \eb@title@ifname@resume \CTEXifname}
+ \AddToHook{file/\jobname.#1/after}
+ {\cs_set_eq:NN \CTEXifname \eb@title@ifname@resume}
+ }
+\RegisterTitleIfname{toc}
\cs_set_eq:NN \eb@ctexsetii \ctex_set:nn
\cs_new_protected:Npn \SetTocStyle #1#2#3
@@ -1743,21 +1816,21 @@
part =
{
tocformat = \addvspace{1pc}\sffamily\large,
- tocindent = 0em,
+ tocindent = 0pt,
tocrule = \tocrule{}[\bfseries],
tocline = \CTEXnumberline{#1}#2
},
chapter =
{
tocformat = \addvspace{1pc}\sffamily,
- tocindent = 0em,
+ tocindent = 0pt,
tocrule = \tocrule{$\cdot$}[\bfseries],
tocline = \CTEXnumberline{#1}#2
},
section =
{
tocformat = \bool_if:NF \l__eb_class_mode_book_bool { \sffamily },
- tocindent = \bool_if:NTF \l__eb_class_mode_book_bool { 1.5em } { 0em },
+ tocindent = \bool_if:NTF \l__eb_class_mode_book_bool { 1.5em } { 0pt },
tocrule =
{
\bool_if:NTF \l__eb_class_mode_book_bool
@@ -1794,7 +1867,7 @@
binumber .initial:n = \arabic{chapter}
}
\cs_new_protected:Npn \eb_counter_zero:n #1
- { \eb_seq_map_inline:nn {#1} { \setcounter{##1}{0} } }
+ { \clist_map_inline:nn {#1} { \setcounter{##1}{0} } }
\RenewDocumentCommand{\appendix}
{O{Appendix\space}D(){\Alph{chapter}}}
{
@@ -1834,8 +1907,8 @@
caption-listing .tl_set:N = \l__eb_font_caption_listing_tl,
caption-every .meta:n =
{
- caption-table = #1,caption-figure = #1,
- caption-listing = #1
+ caption-table = {#1},caption-figure = {#1},
+ caption-listing = {#1}
},
caption-every .initial:n = \sffamily\small,
footnote .tl_set:N = \eb@font@footnote,
@@ -1865,18 +1938,14 @@
{ \tl_put_right:Nn \marginfont {#2} }
}
}
+\cs_set_eq:NN \addtosubfont \ebaddtofont
+
\ctex_define:nn { spread }
{
line .code:n = \setspread{#1},
- line .initial:n =
- {
- \fp_compare:nNnTF { \l__ctex_line_spread_fp } = { 1.3 }
- { 1.354 }
- { \fp_use:N \l__ctex_line_spread_fp }
- },
table .fp_set:N = \l__eb_spread_table_fp,
- table .initial:n = 1.354,
- math .fp_set:N = \l__eb_spread_math_fp,
+ table .initial:n = 1.2,
+ math .tl_set:N = \eb@spread@math,
math .initial:n = 1.2,
footnote .code:n =
{
@@ -1893,17 +1962,17 @@
caption-listing .fp_set:N = \l__eb_spread_caption_listing_fp,
caption-every .meta:n =
{
- caption-table = #1,caption-figure = #1,
- caption-listing = #1
+ caption-table = {#1},caption-figure = {#1},
+ caption-listing = {#1}
},
caption-every .initial:n = 1.2,
every .meta:n =
{
- line = #1,table = #1,math = #1,
- caption-every = #1,footnote = #1
+ line = {#1},table = {#1},math = {#1},
+ caption-every = {#1},footnote = {#1}
},
abovedisplayskip .code:n =
- {\AfterPreamble{\skip_set:Nn \abovedisplayskip {#1}}},
+ { \AfterPreamble{\skip_set:Nn \abovedisplayskip {#1}} },
abovedisplayskip .initial:n = 0.5ex plus .1ex minus .1ex,
belowdisplayskip .code:n =
{
@@ -1916,10 +1985,15 @@
belowdisplayskip .initial:n = 0.5ex plus .1ex minus .1ex,
unknown .code:n = \eb_msg_deprecated_option:n { spread }
}
-\AfterPreamble
- {\skip_set:Nn \abovedisplayshortskip { 0ex plus .1ex }}
+\tl_if_eq:NnT \l__ctex_scheme_tl { chinese }
+ {
+ \fp_compare:nNnTF { \l__ctex_line_spread_fp } = { 1.3 }
+ { \ctex_set:nn { spread } { line = 1.354,table = 1.354 } }
+ { \ctex_set:nn { spread } { line = \fp_use:N \l__ctex_line_spread_fp } }
+ }
+\AfterPreamble{\skip_set:Nn \abovedisplayshortskip { 0ex plus .1ex }}
-\eb_seq_map_inline:nn
+\clist_map_inline:nn
{ table,figure,listing }
{
\DeclareCaptionFont{eb@#1@font}
@@ -1994,7 +2068,7 @@
}{}
\cs_new_protected:Npn \eb_enumitem_label_set:nn #1#2
{ \SetEnumitemValue{label}{#1}{\color{ctex@emph}#2} }
-\eb_seq_map_inline:nn
+\clist_map_inline:nn
{
{ bullet } { \textbullet },
{ endash } { \normalfont\bfseries\textendash },
@@ -2017,7 +2091,7 @@
\setlist[enumerate,3]{label = roman,ref = enumiii}
\setlist[description]{font = sf,style = standard}
\newlist{eb@eqcomp@list}{description}{1}
-\setlist[eb@eqcomp@list]{nosep,labelsep = 0em}
+\setlist[eb@eqcomp@list]{nosep,labelsep = 0pt}
\cs_new:Npn \seteqcomplist #1 { \setlist*[eb@eqcomp@list]{#1} }
\keys_define:nn { eb/eqcomp }
@@ -2025,7 +2099,7 @@
width .dim_set:N = \l__eb_eqsymb_width_dim,
width .initial:n = 10pt,
delim .tl_set:N = \l__eb_eqsymb_delim_tl,
- delim .initial:n = ——,
+ delim .initial:n = \tl_if_eq:NnTF \l__ctex_scheme_tl { chinese } { —— } { --- },
space .dim_set:N = \l__eb_eqsymb_space_dim,
space .initial:n = 0.25em,
item-align .tl_set:N = \l__eb_eqsymb_item_align_tl,
@@ -2100,9 +2174,19 @@
\bool_if:NT \l__eb_theorem_support_bool
{
\RequirePackage{amsthm,thmtools}
- \cs_set_eq:NN \eb@declaretheoremsyle@save \declaretheoremstyle
+ \cs_set_eq:NN \eb@declaretheoremstyle@save \declaretheoremstyle
+ \cs_set_eq:NN \eb@declaretheorem@save \declaretheorem
\RenewDocumentCommand{\declaretheoremstyle}{O{}mO{}}
- {\eb@declaretheoremsyle@save[#1,#3]{#2}}
+ {\eb@declaretheoremstyle@save[#1,#3]{#2}}
+ \RenewDocumentCommand{\declaretheorem}{O{}mO{}}
+ {
+ \eb@declaretheorem@save[style = default,#1,#3]{#2}
+ \settheoremtocline{#2}
+ {
+ \listnumberline{#2}
+ \thmtname\thmtifnote{~(\thmtnote)}{}
+ }
+ }
\ctex_define:nn { thmt }
{
loeskip .skip_set:N = \eb@thmt@loe@skip,
@@ -2112,7 +2196,7 @@
\declaretheoremstyle{default}[
spaceabove = 0ex plus .1ex,
spacebelow = 0ex plus .1ex,
- headindent = 0em,
+ headindent = 0pt,
within = \bool_if:NT \l__eb_class_mode_book_bool { chapter },
headpunct = { },
headfont = \color{ctex@emph}\sffamily,
@@ -2122,6 +2206,7 @@
\theoremstyle{default}
\cs_undefine:N \proof
\DeclareFloatList{theorem}{loe}
+ \AllotPartialExt{loe}{ple}
\eb_preto_cmd:nn { listoftheorems }
{
\group_begin:
@@ -2148,7 +2233,7 @@
\NewDocumentCommand{\settheoremtocline}{smm}
{
\IfBooleanT{#1}{\def\thmt@contentslineIgnore{\thmt@contentsline}}
- \cs_set:cpn { ll@#2 } {#3}
+ \cs_set:cpn { ll@#2 } { \@bsphack #3\@esphack }
}
}
@@ -2177,21 +2262,21 @@
cases,cases*,dcases,dcases*,rcases,rcases*,drcases,drcases*,
aligned,alignedat,gathered,multlined,lgathered,rgathered
}
- { \setspread{\fp_use:N \l__eb_spread_math_fp} }
-\eb_seq_map_inline:nn
+ { \setspread{\eb@spread@math} }
+\clist_map_inline:nn
{ \start@gather,\start@align,\start@multline }
{
\eb_patch_cmd:Nnn #1
{ \collect@body }
{
- \setspread{\fp_use:N \l__eb_spread_math_fp}
+ \setspread{\eb@spread@math}
\collect@body
}
}
\eb_patch_cmd:Nnn \gather@split
{ \spread@equation }
{
- \setspread{\fp_use:N \l__eb_spread_math_fp}
+ \setspread{\eb@spread@math}
\spread@equation
}
\ctex_at_end_package:nn { unicode-math }
@@ -2210,7 +2295,7 @@
bibstyle .initial:n = numerical,
citestyle .tl_set:N = \l__eb_bib_cite_style_tl,
datafile .clist_set:N = \l__eb_bib_datafile_clist,
- bititle .tl_set:N = \eb@bib@bitoc@title,
+ bititle .tl_set:N = \bibibname,
bititle .initial:n = Bibliography,
unknown .code:n = \eb_msg_deprecated_option:n { bib }
}
@@ -2255,8 +2340,8 @@
\cs_new_protected:Npn \eb_biber_toc_title:n #1
{
\bool_if:NTF \l__eb_class_mode_book_bool
- { \bichapter*{#1}{\eb@bib@bitoc@title} }
- { \bisection*{#1}{\eb@bib@bitoc@title} }
+ { \bichapter*{#1}{\bibibname} }
+ { \bisection*{#1}{\bibibname} }
}
\cs_new_protected:Npn \eb_biber_biblatex_set:
{
@@ -2357,7 +2442,7 @@
},
}
}
-\eb_seq_map_inline:nn
+\clist_map_inline:nn
{
{ linkcolor } { link },
{ color } { theme }
@@ -2504,7 +2589,7 @@
}
%</package>
%<*tcolorbox>
-\ProvidesExplFile{eb-tcolorbox.cfg}{2024/04/26}{2024bb}
+\ProvidesExplFile{eb-tcolorbox.cfg}{2024/05/24}{2024bu}
{Customization of tcolorbox for easybook}
\cs_set_protected:Npn \addtotcbstyle #1#2
diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf
index b2ead2bd49..08b461d7d4 100644
--- a/macros/latex/contrib/easybook/easybook.pdf
+++ b/macros/latex/contrib/easybook/easybook.pdf
Binary files differ
diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex
index 5bb0355843..f01355d47c 100644
--- a/macros/latex/contrib/easybook/easybook.tex
+++ b/macros/latex/contrib/easybook/easybook.tex
@@ -4,8 +4,8 @@
\usepackage[fontset = fandol]{ctex}
\usepackage
{
- enumitem,newtxmath,indentfirst,tabularray,
- fancyvrb,geometry,hologo,pifont,changelog,calc
+ enumitem,indentfirst,tabularray,fancyvrb,
+ geometry,hologo,pifont,changelog,calc
}
\definecolorscheme{blue}
{
@@ -23,8 +23,8 @@
name = easybook,
color-scheme = blue,
title = EASYBOOK使用手册,
- version = v2024bb,
- date = 2024/04/26,
+ version = v2024bu,
+ date = 2024/05/24,
authors = 瞿毅,
info = 简便地排版中文学位论文或书籍,
email = toquyi@163.com,
@@ -47,11 +47,24 @@
\addtokomafont{subsubsection}{\normalfont\sffamily}
\DeclareTOCStyleEntry[entryformat = \sffamily]{default}{section}
\DeclareFieldFormat[book]{title}{\textsf{#1}}
-\geometry{margin = 1in,marginparwidth = 0.6in}
+\geometry{margin = 1in,marginparwidth = 0.6in,footskip = 0.5in}
+\renewlist{cnltxlist}{description}{2}
\SetEnumitemValue{label}{smallbullet}{\small\color{DarkBlue}\textbullet}
\setlist{nosep,topsep = \smallskipamount,labelsep = 0.5em}
\setlist[1]{labelindent = \parindent}
\setlist[itemize,1]{label = smallbullet,leftmargin = *}
+\setlist[cnltxlist]
+ {
+ leftmargin = 0pt,
+ labelwidth = 2em,
+ itemindent = -1em,
+ labelsep = 0pt,
+ listparindent = 2em,
+ topsep = \smallskipamount,
+ itemsep = \smallskipamount,
+ partopsep = 0ex,
+ parsep = 0ex
+ }
\setcounter{tocdepth}{2}
\SetTblrInner[longtblr]{columns = c,hline{1,Z} = {1pt,DarkBlue}}
\SetTblrOuter[longtblr]{presep = \bigskipamount,postsep = \bigskipamount}
@@ -118,6 +131,11 @@
}
\newnote{\newtag}[1][New]{\fbox{#1}}
\newnote{\newtagv}[2][New]{#1\\#2}
+\NewDocumentCommand{\optpath}{sm}
+ {
+ \IfBooleanF{#1}{\item}
+ \code{\textcolor{SlateGray}{#2}}
+ }
% Multi-row values alignment when there are many choices
\newcommand{\leftfillchoice}[2]
{
@@ -126,21 +144,8 @@
}
% Use a separate module margin marker to prevent overlap
\newcommand{\smodule}[1]{\cnltx@module@text*{\normalsize #1}}
-\newcommand{\noitemsep}{\setlength{\itemsep}{0ex}}
\renewcommand{\cnltx@package@abstract@width}{0.85\linewidth}
\renewcommand{\cnltx@write@lastname}{}
-\renewcommand{\cmltx@list@setup}
- {
- \setlength{\leftmargin}{0em}
- \setlength{\labelwidth}{2em}
- \setlength{\itemindent}{-1em}
- \setlength{\labelsep}{0em}
- \setlength{\listparindent}{2em}
- \setlength{\topsep}{\smallskipamount}
- \setlength{\itemsep}{\smallskipamount}
- \setlength{\partopsep}{0ex}
- \setlength{\parsep}{0ex}
- }
\newcounter{ctexexam}
\define@key{FV}{labelref}{\def\ctexexamlabelref{\label{#1}}}
\let\ctexexamlabelref\empty
@@ -173,7 +178,13 @@
\refstepcounter{ctexexam}\ctexexamlabelref
}
}
-\newcommand{\optpath}[1]{\item\code{\textcolor{SlateGray}{#1}}}
+\def\command{\cnltx@command}
+\def\environment{\cnltx@environment}
+\def\opt{\@cnltx@option@item\option}
+\def\keyval{\@cnltx@option@item\key}
+\def\keylit{\@cnltx@option@item\keyis}
+\def\keychoice{\@cnltx@option@item\choicekey}
+\def\keybool{\@cnltx@option@item\boolkey}
\makeatother\ExplSyntaxOff
\labelformat{section}{节#1}
\labelformat{subsection}{小节#1}
@@ -186,8 +197,8 @@
您在使用 \easybook{} 文档类编写文档前可能需要具备以下的条件:
\begin{itemize}
\item 使用 \hologo{XeLaTeX}(推荐)或 \hologo{LuaLaTeX} 两种编译方式之一。
- \item 由于文档类用到了一些 \LaTeX 和依赖宏包较新的功能,需要版本至少在\textbf{2021/11/15}以后的 \LaTeX 内核支持。建议您安装最新的 \TeX 发行版。
- \item 虽然手册对基本用法做了介绍,但这并不是入门教程,所涉及到宏包的用法与命令并未进行详细介绍,需要对它们有所了解。您应当具有一定的 \LaTeX 使用基础,可以在 \TeX 综合网站 \href{https://www.ctan.org/}{CTAN} 查看相关资源。
+ \item 由于文档类用到了一些 \hologo{LaTeX} 和依赖宏包较新的功能,需要版本至少在\textbf{2021/11/15}以后的 \hologo{LaTeX} 内核支持。建议您安装最新的 \hologo{TeX} 发行版。
+ \item 虽然手册对基本用法做了介绍,但这并不是入门教程,所涉及到宏包的用法与命令并未进行详细介绍,需要对它们有所了解。您应当具有一定的 \hologo{LaTeX} 使用基础,可以在 \hologo{TeX} 综合网站 \href{https://www.ctan.org/}{CTAN} 查看相关资源。
\end{itemize}
\subsection{前言}
@@ -195,7 +206,7 @@
\subsection{基本用法}
\label{subsec:basic usage}
-以下一份简单的 \TeX 文档演示了 \easybook{} 的最基本用法,在导言区进行宏包载入与文档设置,一些详细的使用样例会不定期上传在 \href{https://www.latexstudio.net/}{\LaTeX 工作室} 的网站。
+以下一份简单的 \TeX 文档演示了 \easybook{} 的最基本用法,在导言区进行宏包载入与文档设置,一些详细的使用样例会不定期上传在 \href{https://www.latexstudio.net/}{\hologo{LaTeX} 工作室} 的网站。
\begin{frameverb}
\documentclass[文档类选项]{easybook}
@@ -262,7 +273,7 @@
文档类选项应当在使用 \easybook{} 文档类或 \pkg*{easybase} 宏包(部分支持)时指定,可见\ref{subsec:basic usage} 的例子。选项前带有 \ding{73} 符号表示只可用于文档类,否则文档类与宏包都适用。除了下面列举的选项以外,还支持标准和 \CTeX 文档类的选项。
\subsection{基本选项}
-\begin{options}
+\begin{cnltxlist}
\opt{draft}
开启草稿模式会加快编译速度,表现有显示页面边框、行溢出的地方显示黑色方块、图片变成占位方框、显示当前日期和关闭超链接渲染。不使用绘图宏包及依赖 \pkg*{tcolorbox} 宏包的盒子环境也会增快编译速度,详情见\ref{subsec:box}。
\opt{newline}\dtag
@@ -271,7 +282,7 @@
文档主题方案选项 \option{scheme} 扩展了 \CTeX 文档类中同名选项原有的作用范围,选项值 \code{plain} 可使各类标题变为英文形式。包括章节标题、图表标题和定理名等。
\opt{enmode}\dtag
同时开启 \option{newline} 和 \keyis{scheme}{plain} 选项以符合英文原生风格。
- \keychoice{paper}{\fbox{a4paper},b5paper,c5paper,letterpaper,\textcolor{SlateGray}{other paper}}
+ \keychoice{paper}{\fbox{a4paper},b5paper,c5paper,letterpaper,\optpath*{other paper}}
文档页面尺寸选项将参数交给 \pkg*{geometry} 宏包处理,可使用它支持的所有标准纸张规格。
\keyval{configs}{配置文件列表}\dtag\newtag[Chg]%
载入用户配置的文件名列表,文件列表以花括号包裹并以英文逗号分隔。文件名应包含如 \code{tex}、\code{def} 或 \code{cfg} 等扩展名。若配置文件不在当前文件夹则文件名需要包含路径,即 \code{path/file.cfg}。
@@ -279,10 +290,10 @@
开启这个选项后浮动环境 \env{table} 和 \env{figure} 的比例参数会使用默认值。关闭它则尽可能避免出现浮动页,使图表环境与正文段落更加紧凑,减少多余的空白版面。
\keychoice{theorem}{\fbox{true},false}
是否提供定理功能支持。选项开启时定理模块生效,此时会载入 \pkg*{amsthm} 和 \pkg*{thmtools} 宏包。
-\end{options}
+\end{cnltxlist}
\subsection{配置字体}
-\begin{options}
+\begin{cnltxlist}
\keychoice{cjkfont}{adobe,fandol,founder,mac,macnew,macold,ubuntu,windows,none}\dtag
中文字体采用 \CTeX 宏集包含的字库并与其一致,具体配置方案可以查看 \CTeX 使用手册。它与 \option*{fontset} 选项是等效的,如果没有指定 \option{cjkfont} 的值,将会自动检测操作系统并选择相应的字体。
@@ -317,21 +328,21 @@
\keychoice{mathfont}{\fbox{times},noto,notosans,nc,ncf,stix2,charter,ebgaramond,libertine}\dtag
\leftfillchoice{mathfont}{minion,garamondx,baskervaldx,baskerville,none} \\
选择合适的数学字体,将会加载 \pkg*{newtxmath} 和 \pkg*{bm} 宏包。使用选项 \code{none} 时可以使用 \pkg*{unicode-math} 等其它数学字体宏包定义字体。
-\end{options}
+\end{cnltxlist}
\subsection{\textsf{article} 模式}
-\begin{options}
+\begin{cnltxlist}
\keychoice{class}{\fbox{book},article}
使用 \easybook{} 文档类可以有两种模式,默认为 \cls*{book} 模式。选用 \code{article} 会变为 \code{oneside} 单面排版,同时使文档编号、结构等与标准 \cls*{article} 文档类的特性相似,可用于短篇幅的文章,不需要再使用 \cs*{chapter} 命令。此时\ref{subsec:directory command} 中目录命令的 \option{chapter} 选项会失效,将以 \code{section} 标题级别输出目录。如果使用 \cls*{ctexart} 配合 \pkg*{easybase} 宏包,则选项值 \code{book} 会失效。
\opt{book}
开启 \cls*{book} 书籍模式,与 \keyis*{class}{book} 等效。
\opt{article}
开启 \cls*{article} 文章模式,与 \keyis*{class}{article} 等效。
-\end{options}
+\end{cnltxlist}
\section{接口选项}
\label{sec:interface options}
-\begin{commands}
+\begin{cnltxlist}
\command*{ctexset}[\oarg{模块名}\marg{键值列表}]
\easybook{} 扩展了 \CTeX 宏集 \hologo{LaTeX3} 风格键值的通用控制命令 \cs*{ctexset},接口选项同样可用它设置,原有的 \meta{键值列表} 仍然可用。本文档类目前有9个模块用于实现常规的排版功能,如\ref{table:module List} 所示。
\begin{longtblr}
@@ -362,22 +373,20 @@
\ebtoolsset{hyphen-figure = {-}}
\end{ctexexam}
- \easybook{} 文档类有三种选项:布尔型 \choicekey*{key}{true,false},选项的值为真 \code{true} 或假 \code{false},如果不指定默认为真。键值型 \key*{key}{value} 需要为选项指定值,后面 \code{=} 号不能省略。选择型 \choicekey*{key}{one,\fbox{two},three} 根据提供的可选值进行设定。
-\end{commands}
+ \easybook{} 文档类有四种选项:1. 布尔型 \choicekey*{key}{true,false} 选项的值为真 \code{true} 或假 \code{false},如果不指定默认为真。2. 键值型 \key*{key}{value} 需要为选项指定值,后面 \code{=} 号不能省略。3. 键型 \option*{key} 不需要为选项指定值。4. 选择型 \choicekey*{key}{one,\fbox{two},three} 根据提供的可选值进行设定。
+\end{cnltxlist}
\subsection[工具]{工具\smodule{tools}}
\label{subsec:tools}
-\begin{options}
+\begin{cnltxlist}
\keychoice{color}{\fbox{none},seaside,energy,cyberpunk}
\easybook{} 预置了四种颜色主题,默认主题 \code{none} 为黑白页面,颜色主题不包括超链接。
- \begin{commands}
\command{DeclareThemeColor}[\splitmarg{风格名称,颜色1,颜色2,颜色3}]
声明新的颜色主题命令。它的参数以英文逗号分隔,第一部分为颜色风格名称,后面三部分为 \code{HTML} 颜色代码,构成主题颜色列表。其中 \meta{颜色1} 为标题标签,\meta{颜色2} 为列表编号、定理标签和公式编号括号,\meta{颜色3} 为代码抄录。类似地更改超链接颜色见\ref{subsec:hyperlinks}。
\begin{ctexexam}
\DeclareThemeColor{fancy,2acb25,60aacc,ebc01c}
\ctexset{tools/color = fancy}
\end{ctexexam}
- \end{commands}
\keyval{color-every}{HTML颜色代码}
统一设置主题的各部分颜色。参数是6个十六进制数字组成的 \code{HTML} 颜色代码,任意颜色的代码可以在常见的图片处理工具拾色器中查看。
\keyval{multoc}{整数}\Default{2}
@@ -396,10 +405,10 @@
\end{ctexexam}
\kvsplit-{figurepath}{\marg{路径名1}\marg{路径名2}$\cdots$\marg{路径名n}}
设置插入图片的文件夹路径名。可以有多个路径名,每个路径包含在花括号内分隔,只有一个路径时需要包含在两层括号内。
-\end{options}
+\end{cnltxlist}
\subsubsection{连字符}
-\begin{options}
+\begin{cnltxlist}
\keyval{hyphen-figure}{图片连字符}\Default{\Marg{.}}
设置图片题注编号的连字符。
\keyval{hyphen-table}{表格连字符}\Default{\Marg{.}}
@@ -410,11 +419,11 @@
设置公式题注编号的连字符。
\keyval{hyphen-every}{连字符}\Default{\Marg{.}}
统一设置上述所有编号的连字符。
-\end{options}
+\end{cnltxlist}
\subsubsection{上下标全局设置}
\label{subsubsec:super-sub-script}
-\begin{options}
+\begin{cnltxlist}
\keyval{spvmove}{刚性长度}\Default{0pt}
上标命令 \cs{super} 对应的上标垂直偏移量。
\keyval{sphmove}{刚性长度}\Default{0pt}
@@ -439,32 +448,30 @@
上下标命令 \cs{supersub} 对应的上下标额外垂直距离。前部分为上标的偏移量,后部分为下标的偏移量。如果只有前部分则上下标各自垂直移动当前值的一半。
\keychoice{halign}{\fbox{l},c,r}
上下标命令 \cs{supersub} 对应的上下标水平对齐方式,有左 \code{l}、居中 \code{c} 和右 \code{r} 三种对齐方式。
-\end{options}
+\end{cnltxlist}
\subsection[超链接]{超链接\smodule{ref}}
\label{subsec:hyperlinks}
模块 \module*{ref} 将超链接选项交给 \pkg*{hyperref} 宏包处理。除了一些超链接颜色的选项失效,其它由宏包全局和接口命令 \cs*{hypersetup} 支持的多数选项可用。
-\begin{options}
+\begin{cnltxlist}
\keychoice{linktype}{\fbox{edge},colors,none}
超链接类型。\code{edge} 使超链接形式为边框,\code{colors} 使超链接字体为彩色,\code{none} 关闭超链接边框与颜色,此时 \option{linkcolor} 选项无效。
\keychoice{linkcolor}{fresh,cutepink,\fbox{navyblue},crimson}
当超链接类型为 \code{colors} 时文本的颜色样式。预置了四种超链接颜色风格,默认为海军蓝 \code{navyblue}。
- \begin{commands}
\command{DeclareLinkColor}[\splitmarg{风格名称,颜色1,颜色2,颜色3}]
声明新的超链接颜色样式命令。它的参数以英文逗号分隔,第一部分为颜色风格名称,后面三部分为 \code{HTML} 颜色代码,构成超链接颜色列表。其中 \meta{颜色1} 为普通链接,\meta{颜色2} 为网址,\meta{颜色3} 为参考文献引用。
- \end{commands}
\keyval{linkcolor-every}{HTML颜色代码}
统一设置超链接的各部分颜色。参数是6个十六进制数字组成的 \code{HTML} 颜色代码,任意颜色的代码可以在常见的图片处理工具拾色器中查看。
\keychoice{linktoc}{none,section,page,\fbox{all}}
将目录中的超链接取消、置于标题上、置于页码上或置于标题和页码上。
-\end{options}
+\end{cnltxlist}
\subsection[行距]{行距\smodule{spread}}
\label{subsec:spread}
行距因子用于设置各种行距倍数,\meta{数值} 是不带有长度单位的浮点数。各类行距既可以在导言区全局设置,也可以在正文中设置对后面生效。
-\begin{options}
- \keyval{line}{数值}
- 正文行距因子。行距因子初始值为 \code{1.354}(相当于 \textsf{Word} 的1.25倍行距),如果设置了文类或 \pkg*{ctex} 宏包的全局行距选项 \option*{linespread} 则初始值设为它的值。
+\begin{cnltxlist}
+ \keyval{line}{数值}\Default{1.354}
+ 正文行距因子。中文主题下行距因子初始值为 \code{1.354}(相当于 \textsf{Word} 的1.25倍行距),如果设置了文类或 \pkg*{ctex} 宏包的全局行距选项 \option*{linespread} 则初始值设为它的值。
\keyval{table}{数值}\Default{1.354}
表格内容行距因子,对传统表格 \env{tabular} 和 \env{tabularx} 等环境生效。\pkg*{tabularray} 宏包的 \env{tblr} 环境自带 \option*{stretch} 和 \option*{rowsep} 等行间距选项,这里不做调整。
\keyval{math}{数值}\Default{1.2}
@@ -489,11 +496,11 @@
行间公式与上面正文间的额外距离。
\keyval{belowdisplayskip}{弹性长度}\Default{0.5ex plus .1ex minus .1ex}\newtag%
行间公式与下面正文间的额外距离。
-\end{options}
+\end{cnltxlist}
\subsection[部件字体]{部件字体\smodule{font}}
\label{subsec:font}
-\begin{options}
+\begin{cnltxlist}
\keyval{caption-table}{字体命令}\Default{\cs*{sffamily}\cs*{small}}
设置表格题注的字体,包括字体族、字体系列、字体尺寸和字体形状命令。
\keyval{caption-figure}{字体命令}\Default{\cs*{sffamily}\cs*{small}}
@@ -506,36 +513,27 @@
设置脚注标记与内容的字体,包括字体族、字体系列和字体形状命令。
\keyval{marginpar}{字体命令}\Default{\cs*{footnotesize}}
设置边注的字体,包括字体族、字体系列、字体尺寸和字体形状命令。
-\end{options}
-
-\begin{commands}
\command{ebaddtofont}[\marg{字体类型}\marg{字体命令}]
用于在上述各种字体原有的格式上附加代码。其中 \meta{字体命令} 也可以包括行距命令且相对于 \module*{spread} 模块具有优先性,不同题注的 \meta{字体类型} 则为相应选项的后缀名。
\begin{ctexexam}
\ebaddtofont{every}{\linespread{1.5}\selectfont}
\ebaddtofont{footnote}{\sffamily}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
\subsection[参考文献]{参考文献\smodule{bib}}
\label{subsec:reference}
-\begin{options}
+\begin{cnltxlist}
\keychoice{backend}{\fbox{bibtex},biblatex}
参考文献处理后端。默认用传统的 \hologo{BibTeX} 处理参考文献\footnote{使用 \hologo{BibTeX} 引擎时加载 \pkg*{natbib} 宏包,使用 \hologo{biber} 时将加载 \pkg*{biblatex} 宏包。}。
- \keychoice{bibstyle}{\fbox{numerical},authoryear,\textcolor{SlateGray}{other sty}}
+ \keychoice{bibstyle}{\fbox{numerical},authoryear,\optpath*{other sty}}
参考文献格式使用中国参考文献推荐标准GB/T 7714-2015,对应顺序编码制和著者—出版年制两种风格。若使用其它格式,使用 \hologo{BibTeX} 处理时需确保正确的 \code{bst} 文件,使用 \hologo{biber} 处理可使用 \pkg*{biblatex} 宏包支持的参考文献风格名称。
\keyval{citestyle}{标注风格}
标注参考文献的风格。后端为 \hologo{BibTeX} 时可使用 \option{super}(数字上标标注,默认)或 \option{numbers}(数字标注)等 \pkg*{natbib} 宏包带有的标注风格,后端为 \hologo{biber} 时可使用 \pkg*{biblatex} 宏包支持的标注风格。
\keyval{datafile}{数据库列表}
参考文献数据库的文件名列表,文件列表以花括号包裹并以英文逗号分隔。使用 \hologo{biber} 处理时文件名要带 \code{bib} 扩展名,若参考文献文件不在当前文件夹则文件名需要包含路径,即 \code{path/file.bib}。不设置参考文献数据库名时 \module*{bib} 模块中的选项会失效,即不自动载入 \pkg*{natbib} 或 \pkg*{biblatex} 宏包,此时需要手动载入相关宏包配置参考文献。
-\end{options}
-
-\begin{commands}
\command{printbibliography}[\oarg{键值列表}]
两种方式\textbf{均使用}此命令打印参考文献,不同处理后端此命令的 \meta{键值列表} 不同。使用 \hologo{BibTeX} 处理时选项与\ref{subsec:directory command} 目录命令的选项相同,使用 \hologo{biber} 处理时常用的选项如下:
-\end{commands}
-
-\begin{options}
\keychoice*{heading}{bibliography,subbibliography,\fbox{bibintoc},subbibintoc}
参考文献通常有一个章标题或者节标题,该选项选择由 \cs{defbibheading} 定义的标题名。
\keyval{title}{参考文献标题名}
@@ -558,26 +556,25 @@
\defbibentryset{Zhang2022}{张三2022,ZhangSan2022}
\cite{Zhang2022} % 在正文中引用
\end{ctexexam}
-\end{options}
+\end{cnltxlist}
\subsection[定理]{定理\smodule{thmt}}
\label{subsec:theorem}
-定理模块 \module*{thmt} 由 \pkg*{thmtools} 宏包提供支持,主要提供了定理环境和样式声明两个命令。定理环境声明命令 \cs{declaretheorem} 使用的定理样式由样式声明命令 \cs{declaretheoremstyle} 提供,文档类预置了一个定理样式 \code{default},但未定义任何定理环境。
-\begin{commands}
+定理模块 \module*{thmt} 由 \pkg*{thmtools} 宏包提供支持,主要提供了定理环境和样式声明两个命令。定理环境声明命令 \cs{declaretheorem} 使用的定理样式由样式声明命令 \cs{declaretheoremstyle} 提供。文档类未预声明任何定理环境,如果声明定理环境时不指定样式,则使用默认定理样式 \code{default},可以对它重新定义。
+\begin{cnltxlist}
\command{declaretheorem}[\oarg{键值列表1}\marg{环境名}\oarg{键值列表2}]
定理环境声明命令。可选参数的 \meta{键值列表1} 与 \meta{键值列表2} 等效,其中常用的选项如下:
- \begin{options}
\keyval{name}{定理名}
定理环境的标题名称,默认为英文首字母大写的环境名。
- \keychoice{numbered}{no,yes,unless unique}
+ \keychoice{numbered}{no,\fbox{yes},unless unique}
定理可以被编号、不被编号或者只有在文档中多次出现时才被编号。
- \keychoice{within}{chapter,section,empty,\textcolor{SlateGray}{counter}}
+ \keychoice{within}{\fbox{chapter},section,\optpath*{empty},\optpath*{counter}}
定理编号跟随的计数器。当计数器值递增时定理编号会从零开始,通常这是一个章节计数器。
\keyval{numberlike}{计数器}
定理将使用此 \meta{计数器} 进行编号,通常这是另一个定理环境的名称。
\keyval{qed}{证毕符号}
证毕符号。位于定理段落末尾行的版心右边,可以设置成 \cs{qedsymbol} 默认是空心方块。
- \keyval{style}{定理样式}
+ \keyval{style}{定理样式}\Default{default}
选项的值为使用 \cs{declaretheoremstyle} 命令新定义的定理样式。
使用 \cs{declaretheorem} 命令以\ref{exam:new theorem sty} 中的定理样式 \code{fancy} 新建一个定理环境猜想,然后用一个基于 \pkg*{tcolorbox} 宏包的预置彩色盒子 \env{easyboxi} 增加背景:
@@ -586,31 +583,28 @@
\addtotcbstyle{tc-easyboxi}{colback = GreenYellow}
\tcolorboxenvironment{caixiang}{tc-easyboxi}
\end{ctexexam}
- \end{options}
\command{declaretheoremstyle}[\oarg{键值列表1}\marg{定理样式}\oarg{键值列表2}]
定理样式声明命令,键值列表支持自身以及定理声明命令 \cs{declaretheorem} 的所有选项。可选参数的 \meta{键值列表1} 与 \meta{键值列表2} 等效,其中支持的选项如下:
- \begin{options}
- \keyval{headfont}{字体命令}
- 定理标题部分的字体,包括字体族、字体系列、字体尺寸和字体形状命令。
- \keyval{notefont}{字体命令}
+ \keyval{headfont}{字体命令}\Default{\cs*{sffamily}}
+ 定理标题部分(包括题注)的字体,包括字体族、字体系列、字体尺寸和字体形状命令。
+ \keyval{notefont}{字体命令}\Default{\cs*{sffamily}}
定理题注部分的字体,包括字体族、字体系列、字体尺寸和字体形状命令。
- \keyval{bodyfont}{字体命令}
+ \keyval{bodyfont}{字体命令}\Default{\cs*{normalfont}}
定理内容部分的字体,包括字体族、字体系列、字体尺寸和字体形状命令。
\keyval{headpunct}{代码}
紧随定理标题末尾的标记代码,位于定理第一段内容的间距 \option{postheadspace} 之前,可以是字符或插入换行符 \cs*{newline} 等命令。
- \keyval{headindent}{刚性长度}
+ \keyval{headindent}{刚性长度}\Default{0pt}
定理标题的缩进。默认无缩进,可用 \cs*{parindent} 命令设置为段落缩进。
- \keyval{postheadspace}{刚性长度}
+ \keyval{postheadspace}{刚性长度}\Default{1em}
定理标题后与定理第一段内容的间距。
- \keyval{spaceabove}{弹性长度}
+ \keyval{spaceabove}{弹性长度}\Default{0ex plus .1ex}
定理环境前的间距,使用 \pkg*{tcolorbox} 的盒子环境包装后被覆盖。
- \keyval{spacebelow}{弹性长度}
+ \keyval{spacebelow}{弹性长度}\Default{0ex plus .1ex}
定理环境后的间距,使用 \pkg*{tcolorbox} 的盒子环境包装后被覆盖。
- \kvsplit-{notebraces}{\marg{左括号}\marg{右括号}}
+ \kvsplit-{notebraces}{\marg{左括号}\marg{右括号}}\Default{\Marg{(}\Marg{)}}
设置定理题注两边的括号,两个必选参数分别代表左括号和右括号。
\keyval{headformat}{标题排列}
定理标题各组成元素的位置排列和格式。定理标题由定理名、编号和题注组成,\meta{标题排列} 中命令 \cs*{NAME}、\cs*{NUMBER} 和 \cs*{NOTE} 分别代表定理名、编号和题注。
- \end{options}
\command{theoremstyle}[\marg{定理样式}]
设置其后由 \cs{declaretheorem} 命令声明的定理环境的样式。
@@ -626,16 +620,12 @@
bodyfont = \itshape
]
\end{ctexexam}
-\end{commands}
-
-\begin{commands}\noitemsep
+ \begin{cnltxlist}[itemsep = 0ex]
\command{listoftheorems}[\sarg\oarg{键值列表}]\default{}
\item\key{listoftheorems}{定理目录标题名}
\command{settheoremtocline}[\sarg\marg{环境名}\marg{标题定义}]\newtagv{2024bb}%
对 \pkg*{thmtools} 宏包的定理环境目录命令 \cs{listoftheorems} 进行了适配调整,\ref{subsec:directory command} 和\ref{subsec:catalog} 中的选项机制均可用,但标题定义选项 \option{tocline} 较为特殊,需用 \cs{settheoremtocline} 命令单独设置。在 \meta{标题定义} 中有三个命令 \cs{thmtname}、\cs{thmtenvname} 和 \cs{thmtnote} 分别代表定理名、定理环境名和题注用于排版目录条目。
-\end{commands}
-
-\begin{commands}
+ \end{cnltxlist}
\optpath{thmt/}\key{loeskip}{弹性长度}\Default{10pt}
定理目录中每章第一个条目上方增加的垂直距离。与 \CTeX 的表格和图片目录中每章间的条目距离选项 \option*{lotskip} 和 \option*{lofskip} 类似,在 \cls*{article} 模式中此选项失效。
\command{thmtifnote}[\marg{存在题注代码}\marg{不存在题注代码}]
@@ -647,17 +637,17 @@
\RegisterTocName{caixiang}
\setlisttheoremstyle{ignoreall,show = caixiang}
\settheoremtocline{caixiang}
- {%
+ {
\listnumberline{caixiang}
\thmtname\thmtifnote{[\thmtnote]}{}
}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
\subsection[页面尺寸]{页面尺寸\smodule{geo}}
\label{subsec:page margins}
模块 \module*{geo} 会将选项(除了前两个为附加)交给页面尺寸宏包 \pkg*{geometry} 处理,并且支持它的键值列表,预置的页面尺寸与 \textsf{Word} 的默认值接近。下面列举几种代表性选项,其它选项可查阅宏包帮助文档。当在此设置纸张规格时,会覆盖文类选项 \option{paper} 的设置。
-\begin{options}\noitemsep
+\begin{cnltxlist}[itemsep = 0ex]
\keyval{headruleskip}{页眉线间距}\Default*{0pt}
\keyval{footruleskip}{页脚线间距}\Default*{3.5pt}
\kvsplit{hdivide}{左边距,版心文本宽度,右边距}\default{}
@@ -673,12 +663,12 @@
vcentering
}
\end{ctexexam}
-\end{options}
+\end{cnltxlist}
\subsection[页眉页脚]{页眉页脚\smodule{hdr}}
\label{subsec:header and footer}
模块 \module*{hdr} 设置的命令由 \pkg*{fancyhdr} 宏包提供支持。标题标记由标签和标题组成,选项中参数 \code{\#1} 代表当前章、节或小节的标题。在 \cls*{book} 模式时使用标题标记选项 \option{chap-mark} 和 \option{sec-mark},在 \cls*{article} 模式时使用 \option{sec-mark} 和 \option{subsec-mark} 选项,这与标准文档类的行为一致。重新设置标题标记选项时标记大小写选项 \option{uppercase} 会失效。
-\begin{options}
+\begin{cnltxlist}
\keyval{chap-mark}{标题标记}
\code{chapter} 级别标题标记的内容,包含了标签选项 \option{chap-label} 和章标题 \code{\#1}。
\keyval{sec-mark}{标题标记}
@@ -699,19 +689,17 @@
\kvsplit-{subsec-label}{\oarg{编号输出命令}\marg{距离命令}}\Default{\cs*{hspace}\Marg{0.5em}}
\code{subsection} 级别标题标记的标签,用法与 \option{chap-label} 类似。
\keyval{headrule}{横线命令}
- 绘制页眉横线的选项,可以使用 \cs*{hrule} 或下述 \cs{markrule} 等画线命令来绘制横线。
+ 绘制页眉横线的选项,可以使用 \cs*{hrule} 或\ref{exam:markrule} 所述 \cs{markrule} 等画线命令来绘制横线。
\keyval{footrule}{横线命令}
- 绘制页脚横线的选项,可以使用 \cs*{hrule} 或下述 \cs{markrule} 等画线命令来绘制横线。
+ 绘制页脚横线的选项,可以使用 \cs*{hrule} 或\ref{exam:markrule} 所述 \cs{markrule} 等画线命令来绘制横线。
\keyval{footnoterule}{横线命令}
- 绘制脚注横线的选项,可以使用 \cs*{hrule} 或下述 \cs{markrule} 等画线命令来绘制横线。
+ 绘制脚注横线的选项,可以使用 \cs*{hrule} 或\ref{exam:markrule} 所述 \cs{markrule} 等画线命令来绘制横线。
\keyval{headrulewd}{刚性长度}\Default{0.5pt}
页眉横线默认的粗细,使用 \option{headrule} 选项绘制横线后失效。
\keyval{footnoterulewd}{刚性长度}\Default{0.5pt}
脚注横线默认的粗细,使用 \option{footnoterule} 选项绘制横线后失效。
-\end{options}
-
-\begin{commands}\noitemsep
- \command{fancyhead}[\marg{风格名}\oarg{基础风格}\marg{风格定义}]
+ \begin{cnltxlist}[itemsep = 0ex]
+ \command{fancypagestyle}[\marg{风格名}\oarg{基础风格}\marg{风格定义}]
定义名为 \meta{风格名} 的页面风格。\meta{风格定义} 中可包含设置页眉页脚不同位置格式的命令,如果为空则等于 \code{fancy} 风格。如果存在 \meta{基础风格},则在它的基础上进行定义。
\begin{ctexexam}
\fancypagestyle{plain}
@@ -724,29 +712,24 @@
\command{fancyhead}[\oarg{位置}\marg{内容}]\default{}
\command{fancyfoot}[\oarg{位置}\marg{内容}]
为了确保页面显示正确,使用 \cs{fancyhead} 和 \cs{fancyfoot} 等命令设置页眉页脚时需要在页边距的命令之后。默认设置的是一个名为 \code{fancy} 的页面风格。\pkg*{fancyhdr} 将页眉页脚分成了左中右和奇数页(odd)、偶数页(even)共12个部分,可选参数中 \code{E} 和 \code{O} 代表偶数和奇数,\code{L}、\code{C} 和 \code{R} 代表左、中和右部分。单面打印时,含有偶数位置的命令无效。
-\end{commands}
-
-\begin{commands}\noitemsep
\command{markboth}[\marg{左页标题标记}\marg{右页标题标记}]\default{}
\command{markright}[\marg{右页标题标记}]\default{}
\command{markdouble}[\marg{双页标题标记}]
这三个命令用于手动设置当前页标题标记,特殊情况下可以使用它们定义与标题不同的页眉页脚标记。上述标记命令内容的选项便是基于这三个命令。其中 \cs{markdouble} 根据是否是双面打印设置相应标记。如果是单面打印,则 \meta{左页标题标记} 无效。
-\end{commands}
-
-\begin{commands}
+ \end{cnltxlist}
\command{markrule}[\oarg{长度}\darg{颜色名}\marg{线宽}\baroarg{上间距,下间距}]
实线命令 \cs{markrule} 既可在 \meta{横线命令} 中用于绘制页眉页脚横线,也可以在正文中使用。\meta{长度} 默认为版心的宽度,上下间距为横线与上下方部件的间距,带有长度单位,上下间距之间用符号 \code{|} 分开,若只有一部分则表示 \meta{上间距}。下面举一个设置页眉内容的例子:
- \begin{ctexexam}
+ \begin{ctexexam}[labelref = exam:markrule]
\ebhdrset{headrule = \markrule(DarkOrchid){0.5pt}[2pt|2pt]}
- \fancyhead[ER]{\leftmark}
+ \fancyhead[ER]{\FirstMark{2e-left}} % 来自ltmarks的标记机制
\fancyhead[OL]{\rightmark}
\fancyhead[EL,OR]{\textbf{\thepage}}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
\subsection[脚注]{脚注\smodule{hdr}}
模块 \module*{hdr} 还可以灵活调整脚注编号和内容的格式。格式主要包括脚注标记的编号类型、字体、附加符号和对齐方式等,以及脚注内容的首行缩进、行距和字体等。基本思想是提供常规和自定义标记(\code{fncustom})两种脚注,常规脚注的标记分为正文(\code{fnmark})和内容(\code{fntext})标记两种,且两者编号类型分离,自定义脚注的标记与其共享格式。目前脚注模块基本兼容 \pkg*{footmisc} 宏包。
-\begin{options}
+\begin{cnltxlist}
\keychoice{footnotetype}{plain,\fbox{hang},flush,bottom}
脚注的类型。悬挂缩进 \code{hang} 是默认值,\code{plain} 是原始的类型,\code{flush} 使脚注内容标记位于脚注首行边缘外侧并右对齐。当存在浮动环境排版时,脚注可能位于页面中间,\code{bottom} 使脚注始终位于页面底端。其中 \code{bottom} 是复合选项,可以与前三种类型重复或复合使用:
\begin{ctexexam}
@@ -763,19 +746,17 @@
不同脚注之间的距离,默认情况下它自适应 \module*{spread} 模块脚注行距选项 \option{footnote} 的值。
\keychoice{fntext-pos}{normal,\fbox{super}}
设置脚注内容标记的位置,正常文本或是上标形式。
- \keychoice{fnmark-num}{\fbox{plain},pifont,pifont*,pisans,pisans*,\textcolor{SlateGray}{short num}}
+ \keychoice{fnmark-num}{\fbox{plain},pifont,pifont*,pisans,pisans*,\optpath*{short num}}
脚注正文标记编号的类型。默认为原生样式 \code{plain},还可以改为 \code{pifont} 的各个版本,从左往右依次为普通版、阴文衬线版、阳文无衬线版和阴文无衬线版,缺点是它们的编号仅包括1-10。
短编号的参数与列表环境类似,有 \code{1}、\code{A}、\code{a}、\code{I} 和 \code{i},除此之外还增加了中文数字 \code{c} 和符号 \code{s} 格式。原生样式 \code{plain} 等同于单独使用数字 \code{1} 参数。这个选项可以用在正文中改变其后脚注编号类型。
- \begin{commands}
\command{footref}[\marg{脚注标签名}]
在当前位置对自动编号的脚注进行引用,与被引用的正文标记共享一个编号与格式。
- \end{commands}
\begin{ctexexam}
\ebhdrset{fnmark-num = 1} % 等于编号类型plain
\ebhdrset{fnmark-num = (a)}
\end{ctexexam}
- \begin{commands}\noitemsep
+ \begin{cnltxlist}[itemsep = 0ex]
\command{SetFntSymbsList}[\marg{符号表名}\marg{符号数量}\marg{符号列表}]\default{}
\command{UseFntSymbsList}[\marg{符号表名}]\newtag[Chg]%
这两个命令用于在脚注短编号标记为 \code{s} 自定义符号型时设置符号列表。\cs{SetFntSymbsList} 命令用于定义名为 \meta{符号表名} 的符号列表,\cs{UseFntSymbsList} 命令用于启用已定义的符号列表。默认的脚注符号列表是空的,注意使用符号型标记的脚注时计数器 \code{footnote} 的值仍然递增,以及定义新列表时 \meta{符号列表} 的写法和命令顺序:
@@ -784,18 +765,18 @@
\UseFntSymbsList{fancy}
\ebhdrset{fnmark-num = s}
\end{ctexexam}
- \end{commands}
- \keychoice{fntext-num}{\fbox{plain},pifont,pifont*,pisans,pisans*,\textcolor{SlateGray}{short num}}
+ \end{cnltxlist}
+ \keychoice{fntext-num}{\fbox{plain},pifont,pifont*,pisans,pisans*,\optpath*{short num}}
脚注内容标记编号的类型。用法与 \option{fnmark-num} 一样,所以脚注内容与正文标记编号类型\textbf{可以不同}。
- \keychoice{fnmarktext-num}{\fbox{plain},pifont,pifont*,pisans,pisans*,\textcolor{SlateGray}{short num}}
+ \keychoice{fnmarktext-num}{\fbox{plain},pifont,pifont*,pisans,pisans*,\optpath*{short num}}
同时设定脚注正文标记编号 \option{fnmark-num} 与脚注内容标记编号 \option{fntext-num} 的类型。目前脚注编号类型选项对于迷你页环境 \env*{minipage} 无效,其中的脚注保持默认英文字母的编号类型。
- \keychoice{fnmark-vmove}{\textcolor{SlateGray}{fixed length},match}\Default{0pt}
+ \keychoice{fnmark-vmove}{\optpath*{fixed length},match}\Default{0pt}
脚注正文标记的垂直偏移。可以设为刚性长度,或用 \code{match} 匹配 \option{spvmove} 全局的值。
- \keychoice{fnmark-hmove}{\textcolor{SlateGray}{fixed length},match}\Default{0pt}
+ \keychoice{fnmark-hmove}{\optpath*{fixed length},match}\Default{0pt}
脚注正文标记的水平偏移。可以设为刚性长度,或用 \code{match} 匹配 \option{sphmove} 全局的值。
- \keychoice{fntext-vmove}{\textcolor{SlateGray}{fixed length},match}\Default{0pt}
+ \keychoice{fntext-vmove}{\optpath*{fixed length},match}\Default{0pt}
脚注内容标记的垂直偏移。可以设为刚性长度,或用 \code{match} 匹配 \option{spvmove} 全局的值。
- \keychoice{fnmarktext-format}{\textcolor{SlateGray}{format code},match}
+ \keychoice{fnmarktext-format}{\optpath*{format code},match}
默认脚注标记的格式,选项 \code{match} 可以匹配 \option{spcmd} 全局的值。一般配合 \keyis{fnmarktext-num}{plain} 原生编号形式使用,例如用 \pkg*{circledtext} 宏包的带圈字符命令 \cs{circledtext} 给脚注标记添加圆圈:
\begin{ctexexam}
\usepackage{circledtext}
@@ -806,7 +787,6 @@
fnmarktext-format = \circledtext
}
\end{ctexexam}
- \begin{commands}
\command{defupfntmark}[\marg{脚注正文标记格式}]
定义脚注正文标记的格式,与正文标记编号命令 \cs{theupfootnote} 配合使用。
\command{defdownfntmark}[\marg{脚注内容标记格式}]
@@ -819,15 +799,14 @@
保存正文标记编号类型选项 \option{fnmark-num} 指定的正文标记。
\command{thedownfootnote}
保存内容标记编号类型选项 \option{fntext-num} 指定的内容标记。
- \end{commands}
\begin{ctexexam}
\defupfntmark{\super[vmove = 2pt]{\theupfootnote}}
\defdownfntmark{\notminipage{\textcolor{blue}{\thedownfootnote}}{}}
\deffntpara{\makebox[2em][r]{\thefootnote}#1}
\end{ctexexam}
- \keychoice{fncustom-format}{\textcolor{SlateGray}{format code},match}
+ \keychoice{fncustom-format}{\optpath*{format code},match}
单独设定自定义脚注标记的格式,选项 \code{match} 可以匹配 \option{spcmd} 全局的值。自定义脚注内容和正文标记的命令与用法可以见下方和\ref{exam:custom footnote markers} 的介绍。
- \begin{commands}\noitemsep
+ \begin{cnltxlist}[itemsep = 0ex]
\command{Footnote}[\oarg{内容标记}\marg{正文标记}\marg{脚注文本}]\default{}
\command{Footnotetext}[\marg{内容标记}\marg{脚注文本}]\default{}
\command{Footnotemark}[\marg{正文标记}]
@@ -835,8 +814,8 @@
\begin{ctexexam}[labelref = exam:custom footnote markers]
\Footnote{*}{这是可以自定义标记的脚注。}
\end{ctexexam}
- \end{commands}
- \keychoice{fnboth-format}{\textcolor{SlateGray}{format code},match}
+ \end{cnltxlist}
+ \keychoice{fnboth-format}{\optpath*{format code},match}
同时设定默认脚注标记 \option{fnmarktext-format} 和自定义脚注标记 \option{fncustom-format} 的格式。两种脚注标记匹配上标格式 \option{spcmd} 的值是独立的,使用 \code{match} 则可以同时匹配。会覆盖 \module*{font} 模块脚注字体选项 \option{footnote} 相同类型的命令,最后一个格式命令可以带有一个参数接受脚注标记。
\keyval{fnpara-format}{格式代码}
脚注内容文本的格式。会覆盖 \module*{font} 模块脚注字体选项 \option{footnote} 相同类型的命令,最后一个格式命令可以带有一个参数接受脚注内容文本。
@@ -849,14 +828,14 @@
fntext-code = {\hspace{1em}\llap,\enskip}
}
\end{ctexexam}
-\end{options}
+\end{cnltxlist}
\subsection[目录]{目录\smodule{toc}}
\label{subsec:catalog}
-模块 \module*{toc} 将使用 \pkg*{titletoc} 宏包处理目录样式。默认包括 \module*{part}、\module*{chapter}、\module*{section}、\module*{subsection}、\module*{figure}、\module*{table} 和 \module*{lstlisting} 条目名的键路径,而使用 \module*{float} 路径可以统一设置图片、表格和代码目录的样式。选项前带有 \ding{73} 符号表示支持所有相应\textbf{条目名}的路径,其它选项则处于 \module*{toc} 键路径下。目前支持多数学术论文目录样式,更复杂的样式可以查看 \pkg*{titletoc} 的相关用法。
-\begin{options}
+模块 \module*{toc} 将使用 \pkg*{titletoc} 宏包处理目录样式。默认包括 \module*{part}$\longrightarrow$\module*{subparagraph}、\module*{figure}、\module*{table} 和 \module*{lstlisting} 条目名的键路径。选项前带有 \ding{73} 符号表示支持所有相应\textbf{条目名}的路径,其它选项则处于 \module*{toc} 键路径下。目录选项均支持标题编号判定命令 \cs{CTEXifname}。目前支持多数学术论文目录样式,更复杂的样式可以查看 \pkg*{titletoc} 的相关用法。
+\begin{cnltxlist}
\keyval{tocformat}{条目格式}\dtag
- 目录中各类型条目的格式。可以设置条目字体和加入垂直间距等,垂直间距最好使用防止垂直间距重合的 \cs*{addvspace} 命令。如果是段落型目录,格式代码仅在段落中当前级别条目前执行一次。
+ 目录中各类型条目的格式。可以设置条目字体和加入垂直间距等,垂直间距最好使用防止垂直间距重合的 \cs*{addvspace} 命令。如果是段落型目录,格式代码仅在段落中当前级别条目前执行一次。也可以用 \cs{CTEXifname} 命令或 \option{tocformat*} 选项给有无编号的标题分别设置格式。
\keyval{tocformat+}{条目格式}\dtag
与选项 \option{tocformat} 用法一样,只是在已有的格式命令后附加代码。
\keyval{tocformat*}{条目格式}\dtag
@@ -865,10 +844,8 @@
目录条目左边的缩进距离,通常标题级别越低缩进越大。如果是段落型目录,仅在当前条目级别为段落中最高时有效。
\keyval{tocrule}{引导线命令}\dtag
目录条目的引导线和页码。引导线可以使用基于 \cs*{xleaders} 命令的 \cs{tocrule} 绘制(同时输出页码),如果是一般不需要引导线的段落型目录,可以使用 \cs{thecontentspage} 命令输出页码。
- \begin{commands}
\command{tocrule}[\sarg\harg\oarg{引导点间距}\darg{放大因子}\marg{引导点}\oarg{页码格式}]
生成目录引导线的命令,需要在引导线选项 \option{tocrule} 中使用。带有星号的命令与 \keyis{dotalign}{false} 效果相同。命令带 \harg{} 号参数不输出目录页码,此时无格式的页码被保存在 \cs{thecontentspage} 命令中,可以配合盒子命令设置不同的页码左右间距和对齐方式。\meta{放大因子} 为 \meta{引导点} 的放大倍数。\meta{页码格式} 中最后一个命令可以带有一个参数用于接受页码。
- \end{commands}
\keyval{toclabel}{标题标签定义}\dtag\newtagv{2024as}%
目录中各类型条目标题标签的定义,可与 \option{tocline} 选项联用设置标题。其中参数 \code{\#1} 代表标签的编号 \cs{thecontentslabel},参数 \code{\#2} 代表 \meta{条目名}。定义最后的命令可带有一个参数,用于接受标题内容,一些特殊情况例如需要将标题内容放在标签后,可以通过定义命令实现:
\begin{ctexexam}
@@ -886,28 +863,24 @@
{
chapter =
{
- tocformat = \addvspace{8pt}\large,
- tocindent = 1.5em,
+ tocformat = \CTEXifname{\addvspace{8pt}\large}{},
+ tocindent = \CTEXifname{2em}{1.5em},
tocrule = \tocrule[0.6pc](1.1){.}[\zihao{5}],
tocline = \CTEXnumberline{#1}#2
},
section/toclabel = \contentspush{#1\hspace{0.5em}},
- section/tocrule = \tocrule-{}\makebox[1cm]{\rlap{\thecontentspage}}
+ section/tocrule = \tocrule-{}\makebox[1cm]{\rlap{\thecontentspage}},
+ toc/pagenumwd = 0pt
}
\end{ctexexam}
-\end{options}
-
-\begin{commands}
- \command{RegisterTocName}[\sarg\marg{条目名}]\newtagv[Changed]{2024as}%
- 给条目类型名称为 \meta{条目名} 的标题注册用于设置目录样式的选项,即选项前有符号 \ding{73} 表示需要注册后使用。前面提到的条目类型均已注册,新类型的条目注册后默认格式与图表条目相同。这个命令可以重复使用,会重置目录条目为默认格式。带有星号参数的命令使注册目录的条目形成一个段落,此时多出下面三个选项可用:
- \begin{options}
+ \command{RegisterTocName}[\sarg\marg{条目名列表}]\newtagv[Changed]{2024bo}%
+ 给 \meta{条目名列表} 中的每个 \meta{条目名} 标题注册用于设置目录样式的选项,即选项前有符号 \ding{73} 表示需要注册后使用。前面提到的条目类型均已注册,新类型的条目注册后默认格式与图表条目相同。这个命令可以重复使用,会重置目录条目为默认格式。带有星号参数的命令使注册目录的条目形成一个段落,此时多出下面三个选项可用:
\keyval{tocbegin}{开始代码}\dtag\newtagv{2024as}%
当前级别目录条目第一个标题前的代码,仅在存在更高级别的条目时有效。
\keyval{tocsep}{中间代码}\dtag\Default{\Marg{.—}}\newtagv{2024as}%
当前级别目录条目每个标题之间的代码。
\keyval{tocend}{结束代码}\dtag\Default{\Marg{.}}\newtagv{2024as}%
当前级别目录条目最后一个标题后的代码。
- \end{options}
\command{contentsuse}[\marg{条目名}\marg{扩展名}]
激活条目类型名称为 \meta{条目名} 的目录定制功能,它使用的目录文件后缀为 \meta{扩展名}。需要在激活条目后再使用命令 \cs{RegisterTocName} 注册选项。
\command{DeclareFloatList}[\marg{条目名}\marg{扩展名}]
@@ -928,6 +901,15 @@
\AllotCaptionExt{table}{lof}
\newcommand{\listoffiguretables}{\listoffigures} % 同时输出图表目录的命令
\end{ctexexam}
+ \command{AllotPartialExt}[\marg{扩展名1}\marg{扩展名2}]\newtagv{2024bk}
+ 给目录文件扩展名为 \meta{扩展名1} 的目录分配扩展名为 \meta{扩展名2} 的局部目录,预注册的条目均无需再分配。用于搭配题注标题 \cs{caption} 命令和 \pkg*{titletoc} 宏包的局部题注目录命令。
+ \begin{ctexexam}
+ \AllotPartialExt{loa}{pla}
+ \startlist[fancy]{loa}
+ \captionof{algorithm}{算法标题}
+ \stoplist[fancy]{loa}
+ \printlist[fancy]{loa}{}{}
+ \end{ctexexam}
\command{SetTocStyle}[\marg{条目名}\marg{风格名}\marg{键值列表}]
定义条目类型名称为 \meta{风格名} 的目录风格。使用 \cs*{ctexset} 命令设置目录样式时,除了条目标题定义选项 \option{tocline},其它选项只有在目录输出命令前设置才有效,定义完目录风格后用 \cs{UseTocStyle} 命令可以在正文中任意位置生效。如果是没有 \ding{73} 符号的选项,\meta{条目名} 设置为 \module*{toc}。
\command{UseTocStyle}[\marg{条目名}\marg{风格名}\marg{扩展名}]
@@ -947,9 +929,6 @@
\end{ctexexam}
\command{contentsmargin}[\oarg{修正距离}\marg{右边距}]
设置目录中引导线到版心右边的距离,用于条目页码的精细调整。当设计条目页码对齐方式或数字较大时,可以设置适当的 \meta{右边距}。\meta{修正距离} 是在过长而换行的标题右侧 \meta{右边距} 基础上附加的距离。此命令可在导言区全局使用或在 \option{tocformat} 选项给特定条目类型单独使用。
-\end{commands}
-
-\begin{options}
\keychoice{hang}{\fbox{true},false}
悬挂缩进选项 \option{hang} 使目录条目为悬挂缩进形式。缩进距离为条目标签及其与标题内容间距的长度和。通常情况下会统一设置条目标题是否悬挂缩进,因此这个选项被设计为对所有类型条目生效。
\keyval{lolskip}{弹性长度}\Default{10pt}
@@ -959,21 +938,23 @@
\keyval{bibetween}{代码钩子}
与选项 \option{between} 类似,是英文章节标题目录(如果启用)标题代码钩子。
\keychoice{dotalign}{\fbox{true},false}
- 引导线选项 \option{dotalign} 可以使目录引导线右端对齐并与页码保持一定间距,否则会与页码相连。
+ 将目录页码装进一个右对齐的水平盒子里。这样可以使目录引导线右端对齐并与页码保持一定间距,否则会与页码相连。
\keyval{pagenumwd}{刚性长度}\Default{1.55em}
- 目录条目页码的宽度。开启 \option{dotalign} 选项时宽度越大引导线与页码的距离就越大。
+ 设置开启 \option{dotalign} 选项时页码水平盒子的宽度。
\keyval{tocafter-every}{距离命令}\Default{\cs*{hspace}\Marg{1em}}
- 统一设置所有类型条目编号与标题间的代码(仅支持上述预注册的条目)。
+ 统一设置所有类型条目编号与标题间的代码。
\keyval{tocindent-every}{刚性长度}
- 统一设置所有类型条目的左边缩进(仅支持上述预注册的条目)。
+ 统一设置所有类型条目的左边缩进。
\keyval{tocrule-every}{引导线命令}
- 统一设置所有类型的目录引导线样式(仅支持上述预注册的条目)。
-\end{options}
+ 统一设置所有类型的目录引导线样式。
+ \command{ExcludeEveryTocName}[\marg{条目名列表}]\newtagv{2024bn}
+ 用于指定带有 \option*{every} 后缀选项排除的条目类型。
+\end{cnltxlist}
\section{环境和命令}
\subsection{文区命令}
-\begin{commands}
+\begin{cnltxlist}
\command{frontmatter}[\sarg\oarg{编号格式}]\Default{Roman}
前言区命令。使部分和章标题不编号,带有星号的变体命令不使用 \cs{cleardoublepage} 命令。页码 \meta{编号格式} 可设置为 \code{arabic}、\code{Alph}、\code{alph}、\code{Roman}、\code{roman} 和 \code{chinese} 形式。
\command{mainmatter}[\sarg]
@@ -984,20 +965,18 @@
清双页命令可以确保下一页文本总在奇数页开始,在奇数页使用它会产生空白偶数页。文区命令 \cs{frontmatter} 和 \cs{mainmatter} 会用到清双页命令,在启用文类选项 \option*{openright} 时标题命令 \cs*{part} 和 \cs*{chapter} 也会默认用到清双页命令。
\command{blankpagestyle}[\marg{页面风格}]
多出空白页的 \meta{页面风格} 用空白页面风格命令 \cs{blankpagestyle} 全局指定,或使用清双页命令的可选参数局部指定。空白页默认的风格为 \code{empty},即空的页眉页脚。
- \end{commands}
+\end{cnltxlist}
\subsection{目录命令}
\label{subsec:directory command}
\easybook{} 改进了标准文档类中定制性较低的章节标题和图表标题目录命令。现在目录命令带有可选参数用于设置标题格式和栏数等,并且与标准文档类不同的是目录命令可在正文中\textbf{重复}使用。更多目录命令的创建和样式设置可参考\ref{subsec:catalog}。
-\begin{commands}
+\begin{cnltxlist}
\command{tableofcontents}[\sarg\oarg{键值列表}\darg{代码钩子}]
章节标题目录命令,支持中英文双语标题目录输出。带有星号参数不输出目录条目上方的标题。\meta{代码钩子} 是当输出方案 \keyis{plan}{both} 时中文与英文目录之间执行的代码,可以插入设置目录样式和换页等命令。
- \begin{options}
\keychoice{plan}{\fbox{cn},bi,both}\newtag[Exp]%
章节标题目录的输出方案。\code{cn} 只输出中文目录,\code{bi} 只输出英文目录。\code{both} 同时连续输出中文和英文目录,需要与双语目录标题命令 \cs{bichapter} 等或双语标题选项 \option{title} 配合使用。
\keyval{bicontentsname}{英文目录标题}\Default{Contents}
英文目录的标题,为通用接口命令 \cs*{ctexset} 的选项。
- \end{options}
\command{listoffigures}[\sarg\oarg{键值列表}]
输出图片目录命令。带有星号参数的命令不输出目录标题。
\command{listoftables}[\sarg\oarg{键值列表}]
@@ -1006,11 +985,8 @@
输出代码目录命令。带有星号参数的命令不输出目录标题。
如果需要部分而不是全文的目录或其它类型的目录,可以查看 \pkg*{titletoc} 宏包的相关示例。如果需要双语图表目录,可以查看 \pkg*{bicaption} 宏包的相关示例。上面目录命令的可选参数改进了原本单一的功能,也提供了配置命令 \cs{SetTocOuter} 在目录命令外设置选项默认值。
- \begin{commands}
\command{SetTocOuter}[\marg{键值列表}]\newtag%
统一设置上述所有目录可选参数的默认值\footnote{由于目录命令通常只在文中使用一次,因此不设计为可以分别指定不同目录的参数。},其中 \meta{键值列表} 的选项如下:
- \end{commands}
- \begin{options}
\keyval{level}{标题命令}
设定输出目录标题的命令。如果使用 \option{title} 选项设置了双语标题则需要配合双语标题命令。
\begin{ctexexam}
@@ -1029,7 +1005,6 @@
用于更改目录的双语标题。标题之间用一个英文逗号分开,对主目录来说前部分为中文目录标题,后部分为英文目录标题,对图表和代码目录来说后部分则是加入英文目录的条目。也可以只有一部分,表示中文目录的标题。
\keychoice{bilist}{mix,\fbox{new}}
确定章节标题目录中双语标题条目的输出排列方式。选项 \code{mix} 使每个英文标题条目在中文目录中跟随对应的中文标题输出,\code{new} 则在新建的英文目录中输出英文标题。这是个全局选项,在所有目录的可选参数中使用均可生效,但推荐在章节标题目录中使用。
- \begin{commands}
\command{ebifbitoc}[\marg{英文目录代码}\marg{中文目录代码}]\newtag%
启用混合双语目录条目即 \keyis{bilist}{mix} 时,在设置目录样式时可以配合 \cs{ebifbitoc} 命令判断当前条目是否为英文,从而输出不同的代码。
\begin{ctexexam}
@@ -1041,7 +1016,6 @@
\UseTocStyle{section}{fancy}{toc}
\tableofcontents[bilist = mix]
\end{ctexexam}
- \end{commands}
\keyval{format}{目录标题格式}
设置目录标题的格式,在标题级别为 \code{chapter} 或者 \cls*{article} 模式且标题级别为 \code{section} 时有效。
\keyval{aftername}{标签后代码}
@@ -1052,12 +1026,11 @@
控制章节标题与之前正文的分隔关系。一般用于设置是否在标题之前分页或者设置行间罚点,生效情形同上。
\keyval{pagestyle}{页面风格}\Default{empty}
目录标题所在页的页面格式,仅当目录以 \code{chapter} 级别输出时有效。除了上述选项还支持 \CTeX 键值列表路径 \module*{chapter} 或 \module*{section} 所有的章节标题样式选项。
- \end{options}
-\end{commands}
+\end{cnltxlist}
\subsection{双语章节标题和新建标题}
双语目录标题命令目前设置了常用的三个级别,它们将中文标题正常输出,并使中英文标题加入双语目录。类似于标准文档类,这三个标题命令分别具有独立的计数器\footnote{默认情况下与普通标题命令共享使用计数器。},并对应 \cs*{the}\meta{计数器} 的值,可以用于 \option{number} 选项更改英文目录中标题的编号格式。这个功能是为国内一些高校的学位论文模板的要求设计,在一般情况和英文模式下\textbf{不需要使用}。
-\begin{commands}
+\begin{cnltxlist}
\command{bichapter}[\sarg\oarg{目录中文标题}\marg{中文标题}\marg{目录英文标题}]
\code{chapter} 章级别的双语目录标题命令,具有独立的 \code{bichapter} 计数器。
\command{bisection}[\sarg\oarg{目录中文标题}\marg{中文标题}\marg{目录英文标题}]
@@ -1066,19 +1039,14 @@
\code{subsection} 小节级别的双语目录标题命令,具有独立的 \code{bisubsection} 计数器。
它们的星号变体命令使文中标题不编号,但是仍然加入双语目录,若英文标题参数空置那么仅加入中文目录而不加入英文目录,这一特点与 \cs*{chapter}\sarg{} 等命令的行为不太一样,在一些情况下会用到。可选参数是目录中的中文条目,默认与中文标题一致,正文标题过长时可用它设置在目录中显示的标题。默认情况下双语目录条目的格式是一致的,共享使用 \module*{toc} 模块的设置。提供了两个选项 \option{biname} 和 \option{binumber} 修改英文目录章标题条目的名字及编号:
- \begin{options}
\optpath{chapter/}\kvsplit+{biname}{英文目录前名字,英文目录后名字}\Default{Chapter\cs*{space}}
更改英文目录 \code{chapter} 级别的标题条目编号前后名字,类似于 \CTeX 的 \option*{name} 选项。
\optpath{chapter/}\key{binumber}{英文目录编号输出命令}\Default{\cs*{arabic}\Marg{chapter}}
更改英文目录 \code{chapter} 级别的标题条目编号输出格式,类似于 \CTeX 的 \option*{number} 选项。下面两种设置英文目录中章标题编号的方式等效:
- \end{options}
\begin{ctexexam}
\ctexset{chapter/binumber = \arabic{chapter}}
\BeforeAddtoBitoc{\ctexset{chapter/nmuber = \arabic{chapter}}}
\end{ctexexam}
-\end{commands}
-
-\begin{commands}
\command{appendix}[\splitoarg{前名字,后名字}\darg{编号输出命令}]
附录起始命令,其后的章节标题变为附录形式。\meta{前名字} 为英文目录中附录标题的前名字,同理 \meta{后名字} 为英文目录中附录标题的后名字。前后名字之间用一个半角逗号分开,也可以只有一部分,表示英文目录中附录标题前名字。\meta{编号输出命令} 为附录标题计数器在英文目录中的编号命令。注意这两个参数仅对 \code{bichapter} 级别的标题生效。
\command{BeforeAddtoBitoc}[\sarg\marg{英文标题加入目录前的代码}]
@@ -1087,27 +1055,28 @@
\BeforeAddtoBitoc{\ctexset{section/name = Section\space}}
\bisection{中文标题}{English title}
\end{ctexexam}
-\end{commands}
-
-\begin{commands}
- \command{NewTitleCommand}[\marg{条目名}\marg{章节层次}]\newtagv{2024aw}%
- 创建一个命令名为 \meta{条目名} 新章节标题,并且支持 \CTeX 中的标题样式选项机制,默认的标题格式为空。同时创建一个名为 \meta{条目名} 的计数器和标记命令 \code{\textbackslash}\meta{条目名}\code{\textcolor{cs}{mark}}。同时还需指定标题的 \meta{章节层次},例如标准文档类中 \code{chapter} 级别为 \code{0}。
+ \command{NewTitleCommand}[\oarg{基础标题}\marg{条目名}\marg{章节层次}]\newtagv{2024aw}%
+ 创建一个命令名为 \meta{条目名} 新章节标题,并且支持 \CTeX 中的标题样式选项机制。指定可选参数后标题格式除了编号/名字会与 \meta{基础标题} 相同,否则默认为空。同时创建一个名为 \meta{条目名} 的计数器和标记命令 \code{\textbackslash}\meta{条目名}\code{\textcolor{cs}{mark}}。同时还需指定标题的 \meta{章节层次},例如标准文档类中 \code{chapter} 级别为 \code{0}。
\command{NewTitleEntryCommand}[\oarg{扩展名}\marg{条目名}]\newtagv{2024aw}%
创建一个命令 \code{\textbackslash}\meta{条目名}\code{\textcolor{cs}{entry}}\marg{标题},仅将 \meta{标题} 加入文件扩展名为 \meta{扩展名} 的目录中,而不在正文中输出标题,默认扩展名为 \code{toc}。
\begin{ctexexam}
- \NewTitleCommand{lchapter}{0}
+ \NewTitleCommand[chapter]{lchapter}{0}
\NewTitleEntryCommand{lchapter}
\contentsuse{lchapter}{toc}
\RegisterTocName{lchapter}
- \ctexset{lchapter/number = \thechapter}
+ \ctexset
+ {
+ lchapter/runin = true,
+ lchapter/number = \thelchapter
+ }
\lchapter{正常标题}
\lchapterentry{加入目录的标题}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
\subsection[上标和下标]{上标和下标\smodule{tools}}
上标和下标的功能来自 \pkg*{spbmark} 宏包,下面有三个命令可以用于输出上标和下标。可以使用键值列表的形式对上下标格式进行局部或全局设置,下面命令中两个可选参数的键值列表是等效的。全局设置的详情见\ref{subsubsec:super-sub-script},更多命令和详细用法见 \pkg*{spbmark} 宏包说明文档。
-\begin{commands}
+\begin{cnltxlist}
\command{super}[\sarg\oarg{键值列表1}\marg{内容}\oarg{键值列表2}]
输出上标的命令,可用于文本和数学模式,在数学模式中可代替 \code{\^{}} 符号和 \cs*{sp} 命令。
\command{sub}[\sarg\oarg{键值列表1}\marg{内容}\oarg{键值列表2}]
@@ -1118,7 +1087,6 @@
根据上下标处于数学还是文本模式分别设置不同的值,应当在格式命令或偏移距离选项中使用。
上下标命令键值列表中共同的选项如下所示。当下面除 \option{mode} 以外的选项用于 \module*{style} 模块全局设置时,它们将根据前面最近一个命令的类型设定相应值。
- \begin{options}
\keyval{vmove}{刚性长度}\Default{0pt}
上标或下标的垂直偏移。如果是上下标命令使用则代表上标和上标间的额外垂直距离 \option{vsep}。
\keyval{hmove}{刚性长度}\Default{0pt}
@@ -1131,20 +1099,19 @@
段落中当前行上标或下标的基线与下一行的间距。
\keychoice{mode}{text,math,\fbox{match}}
上标或下标的输出格式。可以为文本 \code{text} 或数学 \code{math} 模式。当使用选项 \code{match} 时可以根据当前段落所处的模式自动匹配。
- \end{options}
-\end{commands}
+\end{cnltxlist}
\subsection{公式}
-\begin{environments}\noitemsep
+\begin{cnltxlist}[itemsep = 0ex]
\environment{equation}\default{}
\environment{multline}\default{}
\environment{gather}\default{}
\environment{align}
\pkg*{amsmath} 宏包提供了一系列行间数学环境,它们可以排布各种对齐或不对齐的公式组。\env{multline} 环境用于一行无法放下的长公式,\env{gather} 环境用于每行居中的公式组,\env{align} 环境用于多列对齐的公式组。还有例如 \pkg*{mathtools} 等对数学功能进行扩展的宏包,提供了更全面的数学命令与环境。
-\end{environments}
+\end{cnltxlist}
\subsection{表格}
-\begin{environments}\noitemsep
+\begin{cnltxlist}[itemsep = 0ex]
\environment{tabular}[\marg{列格式}]\default{}
\environment{tblr}[\marg{键值列表}]
\pkg*{tabularray} 是一个强大且全面的表格宏包,不依赖其它表格宏包所以同时使用不会产生冲突。不仅提供了各种传统表格宏包的功能,还实现了用键值列表方式简便地设置表格样式。具体用法可见宏包的说明文档,下面演示一个 \env{tblr} 表格的用法:
@@ -1166,10 +1133,10 @@
Rho & Sigma & Tau & Upsilon
\end{tblr}
\end{ctexexam}
-\end{environments}
+\end{cnltxlist}
\subsection{列表}
-\begin{commands}
+\begin{cnltxlist}
\command{setlist}[\sarg\splitoarg{列表类型,级别}\marg{键值列表}]
列表宏包 \pkg*{enumitem} 为系统预置的三个列表环境提供了灵活的标签以及间距控制,这是设置列表环境的通用接口命令。带有星号参数的命令在原有格式上补充。\meta{列表类型} 是排序列表 \code{enumerate}、常规列表 \code{itemize} 和主题列表 \code{description} 三个基本类型,也可以是 \cs{newlist} 新建的定理环境,若不指定则设置所有列表类型的格式。若不指定 \meta{级别} 则设置所有列表级别的格式。
\command{newlist}[\marg{列表名}\marg{列表类型}\marg{最大级别}]
@@ -1182,24 +1149,24 @@
\newlist{steps}{enumerate}{2}
\setlist[steps,1,2]{label = (\alph*)}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
-\begin{environments}\noitemsep
+\begin{cnltxlist}[itemsep = 0ex]
\environment{enumerate}[\oarg{键值列表}]\default{}
\environment{itemize}[\oarg{键值列表}]\default{}
\environment{description}[\oarg{键值列表}]
已为三种列表各自预置了三个级别。同种列表或不同种列表间的不同级别可相互嵌套,可以使用短编号的形式,带有星号的环境为行内列表。默认列表标签与标准文档类一致,下面举几个更改列表标签以及其它格式的例子:
\begin{ctexexam}
- \setlist*{wide = 0em} % 取消所有列表的左边距
+ \setlist*{wide = 0pt} % 取消所有列表的左边距
\begin{enumerate}[label = (\arabic*),leftmargin = 1cm,resume]
\begin{enumerate*}[(1)] % 短编号形式
\begin{itemize}[label = \textbullet,labelsep = *]
\begin{description}[font = \sffamily\bfseries,style = nextline]
\end{ctexexam}
-\end{environments}
+\end{cnltxlist}
\subsection{悬挂缩进}
-\begin{commands}
+\begin{cnltxlist}
\command{hangpara}[\marg{缩进长度}\marg{缩进开始行数}]
悬挂缩进命令 \cs{hangpara} 使其后的一个段落保持悬挂缩进。参数与 \env{hangparas} 环境相同,不过只有一个段落。\meta{缩进长度} 可以是带单位的数值或由文本长度测定命令 \cs{widthof} 提供。
\command{hangfrom}[\sarg\oarg{缩进长度}\marg{悬挂内容}\oarg{缩进开始行数}]\newtag%
@@ -1208,22 +1175,16 @@
\hangfrom[\hangwd + 1em]{悬挂标签\hspace{0.5em}}[1]
\hangfrom*[3em]{}
\end{ctexexam}
-\end{commands}
-
-\begin{environments}
\environment{hangparas}[\marg{缩进长度}\marg{缩进开始行数}]
悬挂缩进环境 \env{hangparas} 有两个必选参数,使其中的段落均保持悬挂缩进。每个段落的缩进将以 \meta{缩进长度} 从 \meta{缩进开始行数} 开始。
-\end{environments}
+\end{cnltxlist}
\subsection{代码}
-\begin{commands}
+\begin{cnltxlist}
\command{lstdefinestyle}[\marg{代码风格}\marg{键值列表}]
代码抄录宏包 \pkg*{listings} 的代码风格定义命令,提供大量选项对代码样式进行高度定制。可以根据需要的代码语言和样式定义多种风格,默认使用的 \meta{代码风格} 为 \code{lst-latex}。
\command{lstinline}[\oarg{键值列表}\marg{行内代码}]
行内代码抄录命令。较原生的 \cs*{verb} 命令有较大改进,具有代码语言和样式支持。
-\end{commands}
-
-\begin{environments}
\environment{lstlisting}[\oarg{键值列表}]
行间代码抄录环境。支持多种语言库,默认使用 \code{LaTeX} 代码语言,可使用 \meta{键值列表} 局部修改代码样式。另外还提供了 \cs{lstnewenvironment} 命令包装自定义名称的代码环境。
\begin{ctexexam}
@@ -1238,18 +1199,18 @@
}
\lstnewenvironment{mypascal}[1][]{\lstset{style = lst-pascal,#1}}{}
\end{ctexexam}
-\end{environments}
+\end{cnltxlist}
-\begin{options}\noitemsep
+\begin{cnltxlist}[itemsep = 0ex]
\keyval{lstlistlistingname}{代码目录标题名}\default{}
\keyval{lstlistingname}{代码题注标题名}
代码目录名与代码环境题注名选项 \option{lstlistlistingname} 和 \option{lstlistingname} 用法与 \CTeX 使用手册标题汉化一节类似,可以看作对这节的扩展。
-\end{options}
+\end{cnltxlist}
\subsection{盒子}
\label{subsec:box}
文档类预置了两个行间盒子环境和两个行内盒子命令,需要在导言区\textbf{手动载入} \pkg*{tcolorbox} 宏包提供支持。它们 \meta{配置选项} 的键值列表可见宏包文档的Option Keys一节,可以进行边距、字体及背景颜色等各种个性化设置。如果 \meta{配置选项} 较长且希望在原有基础上改为全局固定的样式,可以使用 \cs{addtotcbstyle} 命令设置,第一个参数为 \code{tc-}\meta{环境或命令名}。
-\begin{commands}
+\begin{cnltxlist}
\command{deftcbstyle}[\marg{盒子风格}\marg{键值列表}]
新建或重置一个名称为 \meta{盒子风格} 的 \pkg*{tcolorbox} 宏包盒子风格,可以与 \cs{addtotcbstyle} 命令联用。
\command{addtotcbstyle}[\marg{盒子风格}\marg{键值列表}]
@@ -1270,9 +1231,6 @@
盒子内容
\end{mytcbox}
\end{ctexexam}
-\end{commands}
-
-\begin{environments}
\environment{easyboxi}[\sarg\oarg{颜色名}\darg{段落标题}\oarg{配置选项}]
行间环境 \env{easyboxi} 创建一个带有三个可选参数的扁平盒子。使用星号参数时给盒子添加边框,\meta{颜色名} 选项设置背景颜色,\meta{段落标题} 选项可以设置标题,默认标题为空。
\begin{ctexexam}
@@ -1285,20 +1243,17 @@
\end{ctexexam}
\environment{easyboxii}[\sarg\oarg{颜色名}\darg{段落标题}\oarg{配置选项}]
环境 \env{easyboxii} 用法与 \env{easyboxi} 类似,同样带有三个可选参数。盒子的左边带有一条粗竖线,背景颜色为竖线颜色的浅色。\meta{颜色名} 选项可以设置竖线的颜色。使用星号参数则盒子无背景颜色。
-\end{environments}
-
-\begin{commands}
\command{eboxi}[\oarg{颜色名}\marg{内容}\oarg{配置选项}]
行内盒子命令 \cs{eboxi} 具有模糊边缘类似高亮的效果。
\command{eboxii}[\oarg{颜色名}\marg{内容}\oarg{配置选项}]
行内盒子命令 \cs{eboxii} 则有直角边缘和四周框线,效果类似带背景色的 \cs*{fbox} 盒子。
-\end{commands}
+\end{cnltxlist}
\section{扩展功能}
\subsection{物理量}
-使用 \pkg*{siunitx} 宏包提供国际单位制的物理量支持。\pkg*{siunitx} 宏包旨在为 \LaTeX 用户提供一种统一的方法,以便正确、轻松地排版数字和单位。\pkg*{siunitx} 的设计理念是默认遵循约定的规则,但允许通过选项设置进行更改。
-\begin{commands}
+使用 \pkg*{siunitx} 宏包提供国际单位制的物理量支持。\pkg*{siunitx} 宏包旨在为 \hologo{LaTeX} 用户提供一种统一的方法,以便正确、轻松地排版数字和单位。\pkg*{siunitx} 的设计理念是默认遵循约定的规则,但允许通过选项设置进行更改。
+\begin{cnltxlist}
\command{num}[\oarg{键值列表}\marg{数字}]
\cs{num} 命令可以输出以科学计数法表示的数值。
\command{unit}[\oarg{键值列表}\marg{单位}]
@@ -1313,21 +1268,21 @@
\qty{5}{\mole}
\qtyrange[unit-color = green]{1.5}{4}{kg}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
\subsection{化学式}
除了以普通公式的方式,化学式的输出还可用 \pkg*{chemformula} 宏包实现。\pkg*{chemformula} 的工作原理与 \pkg*{mhchem} 非常相似,但对化合物、化学计量数和箭头的输入方式更为严格。同时 \pkg*{chemformula} 提供了多种自定义输出的可能性。
-\begin{commands}
+\begin{cnltxlist}
\command{ch}[\oarg{键值列表}\marg{化学式}]
无机化学式使用 \cs{ch} 命令书写。化合物表达式中的原子数不需要加下标符号,化学计量数与表达式间隔一个空格。
\begin{ctexexam}
\ch{[Cu(NH3)4]^2+}
\ch{Cu2S + 2 O2 - 2 e^- == 2 Cu^2+ + SO4^2-}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
\subsection{计数器}
-\begin{commands}\noitemsep
+\begin{cnltxlist}[itemsep = 0ex]
\command{newcounter}[\marg{计数器}\oarg{父计数器}]\default{}
\command{setcounter}[\marg{计数器}\marg{整数}]\default{}
\command{stepcounter}[\marg{计数器}]
@@ -1340,10 +1295,10 @@
\counterwithin[\Roman]{child}[-]{parent}
\counterwithout*{child}{parent}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
\subsection{标签引用}
-\begin{commands}
+\begin{cnltxlist}
\command{labelformat}[\marg{计数器}\marg{标签引用格式}]
标签格式命令 \cs{labelformat} 可以设置标签引用格式。\meta{标签引用格式} 中 \code{\#1} 代表 \cs*{the}\meta{计数器},可以设置引用序号的前缀和后缀。也可以使用 \pkg*{cleveref} 宏包提供更强大的标签功能。
\command{AtEndPreamble}[\marg{钩子代码}]
@@ -1353,24 +1308,24 @@
\labelformat{chapter}{第\thechapter 章}
\AtEndPreamble{\usepackage{cleveref}}
\end{ctexexam}
-\end{commands}
+\end{cnltxlist}
\subsection{图表题注}
\pkg*{caption} 宏包提供了多种方法来定制浮动环境(例如 \env{figure} 和 \env{table})中的标题,并可与许多其它宏包配合使用。功能包括旋转题注、侧向题注和连续题注等。
-\begin{commands}
+\begin{cnltxlist}
\command{captionsetup}[\oarg{条目名}\marg{键值列表}]
这是 \pkg*{caption} 宏包的接口命令,\meta{键值列表} 提供多个选项更改图表题注的格式。题注主要由三部分组成:标题标签即图表名与题注编号的组合,标题文本本身通常是内容的简短描述,以及将文本与标签分开的题注分隔符。可以在导言区设置整体格式,也可以在正文使用局部更改格式。
-\end{commands}
+\end{cnltxlist}
-\begin{commands}\noitemsep
+\begin{cnltxlist}[itemsep = 0ex]
\command{caption}[\sarg\oarg{目录标题}\marg{标题}]\default{}
\command{captionof}[\sarg\marg{条目名}\oarg{目录标题}\marg{标题}]\default{}
\command{bicaption}[\sarg\oarg{目录中文标题}\marg{中文标题}\oarg{目录英文标题}\marg{英文标题}]
题注命令 \cs{caption} 用于在图表上下方插入题注,需要在浮动环境 \env*{figure} 和 \env*{table} 中使用。在浮动环境外可以使用 \cs{captionof} 命令,第一个参数指定条目名。可以搭配 \pkg*{newfloat} 宏包创建更多类型的浮动环境并设置相应题注。\cs{bicaption} 命令可以实现中英文双语题注,需要在导言区载入 \pkg*{bicaption} 宏包,具体用法见说明文档。
-\end{commands}
+\end{cnltxlist}
\subsection{索引}
-\begin{commands}
+\begin{cnltxlist}
\command{indexsetup}[\marg{键值列表}]
\pkg*{imakeidx} 宏包增强了索引的功能,可使用户在制作和排版文档的同时制作一个或多个索引。这是 \pkg*{imakeidx} 宏包的接口命令,用于设置索引表的整体格式。
\command{index}[\oarg{索引名}\marg{标签}]
@@ -1379,22 +1334,20 @@
用于导言区开启索引收集的命令。这个命令可以重复使用收集多个索引表,以不同的 \meta{索引名} 作为区分,如果仅打印一个索引表没必要重复使用。
\command{printindex}[\sarg\oarg{键值列表}]
打印不同索引表的命令。这个命令被重新定义,\meta{键值列表} 中的选项与\ref{subsec:directory command} 其它目录命令相同,但是接口命令 \cs{indexsetup} 的部分选项失效。
- \begin{options}
\keyval{name}{索引名}
指定输出名为 \meta{索引名} 的索引表,如果只使用一个索引表则默认为项目文件名不需要指定。
- \end{options}
-\end{commands}
+\end{cnltxlist}
\subsection{边注}
-\begin{commands}
+\begin{cnltxlist}
\command{marginnote}[\oarg{左文本}\marg{右文本}\oarg{垂直偏移}]
边注命令用于在两侧页边空白添加标注。如果只给定了 \meta{右文本},那么边注在奇偶数页文字相同。如果同时给定了 \meta{左文本},则偶数页使用 \meta{左文本} 的文字。
\command{reversemarginpar}
边注位置设置命令,用于将边注排版到与默认边空位置相反的边空中。
-\end{commands}
+\end{cnltxlist}
\subsection{公式符号对照}
-\begin{environments}
+\begin{cnltxlist}
\environment{eqcomp}[\oarg{键值列表1}\darg{键值列表2}]
一些公式之后可以使用基于列表环境的 \env{eqcomp} 进行符号对照。对照列表的 \meta{键值列表2} 与 \pkg*{enumitem} 的选项相同,一般较少用到,可以用于设置垂直间距等。
\begin{ctexexam}
@@ -1404,16 +1357,12 @@
\symb{C}[---] 符号说明
\end{eqcomp}
\end{ctexexam}
-\end{environments}
-
-\begin{commands}
\command{symb}[\sarg\marg{符号}\oarg{引导符}]
符号条目命令 \cs{symb} 类似 \cs*{item},需要在环境内使用,带有星号的命令可在文本段落单独使用。
\command{seteqcomplist}[\marg{键值列表2}]
对照列表条目格式的 \meta{键值列表2} 可以使用 \cs{seteqcomplist} 全局设置。
\command{seteqcomp}[\marg{键值列表1}]
对照环境的 \meta{键值列表1} 可以使用 \cs{seteqcomp} 全局设置,它的选项如下:
- \begin{options}
\keyval{width}{符号宽度}\Default{10pt}
设置适当的符号宽度可以防止文字重叠和边界溢出等问题。
\keyval{delim}{引导符}\Default{——}
@@ -1432,22 +1381,21 @@
符号的字体。数学和文本符号模式应采用不同的字体命令,最后一个命令可以接受一个参数,这个参数为符号。
\keychoice{mode}{\fbox{math},text}
符号字体模式,可以为数学字体或者文本字体。
- \end{options}
-\end{commands}
+\end{cnltxlist}
\subsection{插入文档}
-\begin{commands}
+\begin{cnltxlist}
\command{includepdf}[\oarg{键值列表}\marg{文档名}]
该命令由文档宏包 \pkg*{pdfpages} 提供。可以将其它 \code{pdf} 文档插入当前文档,比如插入其它软件制作的封面。可选参数可以指定插入页数、逻辑页和横向页面等,详情查看宏包文档。
-\end{commands}
+\end{cnltxlist}
\subsection{下划线}
-\begin{commands}\noitemsep
+\begin{cnltxlist}[itemsep = 0ex]
\command{uline}[\marg{下划直线}]\default{}
\command{uuline}[\marg{下划双直线}]\default{}
\command{uwave}[\marg{下划波浪线}]
\pkg*{ulem} 宏包提供了多种下划线命令,可以重新定义 \cs{ULthickness} 命令控制下划线的粗细。下划线的深度由 \cs{ULdepth} 控制,默认值 \cs*{maxdimen} 是一个允许深度根据当前字体变化的特殊标志,当然也可以使用 \cs*{setlength} 设定为指定深度。
-\end{commands}
+\end{cnltxlist}
\appendix
\setlist[1]{}
@@ -1503,6 +1451,13 @@
\end{version}
\shortversion{v = 2024aw,date = 2022/04/22,changes = 新增新建章节标题命令 \cs{NewTitleCommand} 和 \cs{NewTitleEntryCommand}。}
\shortversion{v = 2024bb,date = 2022/04/26,changes = 增加对 \pkg*{thmtools} 宏包定理环境目录 \cs{listoftheorems} 的支持。}
+ \shortversion{v = 2024bk,date = 2022/05/07,changes = 新增局部题注目录分配命令 \cs{AllotPartialExt}。}
+ \begin{version}[v = 2024bn,date = 2022/05/10]
+ \fixed
+ \item 修复 \module*{toc} 模块中带有 \option*{every} 后缀的选项不对所有已注册条目有效的问题。
+ \added
+ \item 新增统一设置所有目录格式时的条目类型排除命令 \cs{ExcludeEveryTocName}。
+ \end{version}
\end{changelog}
\nocite{*}
diff --git a/macros/latex/contrib/els-cas-templates/README b/macros/latex/contrib/els-cas-templates/README
index c925f30042..ffc9f6d112 100644
--- a/macros/latex/contrib/els-cas-templates/README
+++ b/macros/latex/contrib/els-cas-templates/README
@@ -1,3 +1,5 @@
+Version 2.4
+
This bundle provides two classfiles, namely cas-sc.cls and cas-dc.cls
and corresponding template files for typesetting journal articles
supposed to go through Elsevier's updated workflow. cas-sc.cls is meant
diff --git a/macros/latex/contrib/els-cas-templates/cas-common.sty b/macros/latex/contrib/els-cas-templates/cas-common.sty
index 3ffe3ea218..e3e4154b7f 100644
--- a/macros/latex/contrib/els-cas-templates/cas-common.sty
+++ b/macros/latex/contrib/els-cas-templates/cas-common.sty
@@ -15,11 +15,11 @@
%% given in the file `manifest.txt'.
%%
-% $Id: cas-common.sty 66 2021-05-11 14:17:42Z rishi $
+% $Id: cas-common.sty 94 2024-05-04 09:27:09Z rishi $
\def\RCSfile{cas-common}%
- \def\RCSversion{2.3}%
- \def\RCSdate{2021/05/11}%
+ \def\RCSversion{2.4}%
+ \def\RCSdate{2024/05/04}%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\pretolerance=-1
@@ -1537,7 +1537,7 @@
\ifnum\theblind>0\relax
\vspace*{\the\baselineskip}
\else
- \seq_use:Nn \g_stm_prelimsau_seq { , }
+ \seq_use:Nn \g_stm_prelimsau_seq { ,~ }
\fi
\vskip12pt
\par
@@ -2628,7 +2628,7 @@
\xspaceaddexceptions{]}
-\ABD{\bibsep=0pt}
+\ABD{\@ifundefined{bibsep}{}{\bibsep=0pt}}
%\ifbool{casfinallayout}
% {%
\ABD{\gdef\bibfont{\fontsize{8pt}{10pt}\selectfont}%
@@ -2638,3 +2638,4 @@
% {}
\endinput
+
diff --git a/macros/latex/contrib/els-cas-templates/cas-dc-sample.pdf b/macros/latex/contrib/els-cas-templates/cas-dc-sample.pdf
new file mode 100644
index 0000000000..aeaa27f1a3
--- /dev/null
+++ b/macros/latex/contrib/els-cas-templates/cas-dc-sample.pdf
Binary files differ
diff --git a/macros/latex/contrib/els-cas-templates/cas-dc-sample.tex b/macros/latex/contrib/els-cas-templates/cas-dc-sample.tex
new file mode 100644
index 0000000000..aeaa9e565c
--- /dev/null
+++ b/macros/latex/contrib/els-cas-templates/cas-dc-sample.tex
@@ -0,0 +1,463 @@
+%%
+%% Copyright 2019-2024 Elsevier Ltd
+%%
+%% Version 2.4
+%%
+%% This file is part of the 'CAS 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.
+%%
+%% The list of all files belonging to the 'CAS Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%% Template article for cas-dc documentclass for
+%% double column output.
+
+%\documentclass[a4paper,fleqn,longmktitle]{cas-dc}
+\documentclass[a4paper,fleqn]{cas-dc}
+
+%\usepackage[authoryear,longnamesfirst]{natbib}
+%\usepackage[authoryear]{natbib}
+\usepackage[numbers]{natbib}
+
+%%%Author definitions
+\def\tsc#1{\csdef{#1}{\textsc{\lowercase{#1}}\xspace}}
+\tsc{WGM}
+\tsc{QE}
+\tsc{EP}
+\tsc{PMS}
+\tsc{BEC}
+\tsc{DE}
+%%%
+
+\begin{document}
+\let\WriteBookmarks\relax
+\def\floatpagepagefraction{1}
+\def\textpagefraction{.001}
+\shorttitle{Leveraging social media news}
+\shortauthors{J.K. Krishnan et~al.}
+
+\title [mode = title]{This is a specimen $a_b$ title}
+\tnotemark[1,2]
+
+\tnotetext[1]{This document is the results of the research
+ project funded by the National Science Foundation.}
+
+\tnotetext[2]{The second title footnote which is a longer text matter
+ to fill through the whole text width and overflow into
+ another line in the footnotes area of the first page.}
+
+
+\author[1,3]{J.K. Krishnan}[type=editor,
+ auid=000,bioid=1,
+ prefix=Sir,
+ role=Researcher,
+ orcid=0000-0001-0000-0000]
+\cormark[1]
+\fnmark[1]
+\ead{jkk@example.in}
+\ead[url]{www.jkkrishnan.in}
+
+\credit{Conceptualization of this study, Methodology, Software}
+
+%\address[1]{, Street 129, 1043 NX Amsterdam, The Netherlands}
+\affiliation[1]{organization={Department of Physics, J.K. Institute of Science},
+ addressline={Jawahar Nagar},
+ city={Trivandrum},
+% citysep={}, % Uncomment if no comma needed between city and postcode
+ postcode={695013},
+ state={Kerala},
+ country={India}}
+
+\author[2,4]{Han Thane}[style=chinese]
+
+\author[2,3]{William {J. Hansen}}[%
+ role=Co-ordinator,
+ suffix=Jr,
+ ]
+\fnmark[2]
+\ead{wjh@example.org}
+\ead[URL]{https://www.university.org}
+
+\credit{Data curation, Writing - Original draft preparation}
+
+\affiliation[2]{organization={World Scientific University},
+ addressline={Street 29},
+ postcode={1011 NX},
+ postcodesep={},
+ city={Amsterdam},
+ country={The Netherlands}}
+
+\author[1,3]{T. Rafeeq}
+\cormark[2]
+\fnmark[1,3]
+\ead{t.rafeeq@example.in}
+\ead[URL]{www.campus.in}
+
+\affiliation[3]{organization={University of Intelligent Studies},
+ addressline={Street 15},
+ city={Jabaldesh},
+ postcode={825001},
+ state={Orissa},
+ country={India}}
+
+\cortext[cor1]{Corresponding author}
+\cortext[cor2]{Principal corresponding author}
+\fntext[fn1]{This is the first author footnote, but is common to third
+ author as well.}
+\fntext[fn2]{Another author footnote, this is a very long footnote and
+ it should be a really long footnote. But this footnote is not yet
+ sufficiently long enough to make two lines of footnote text.}
+
+\nonumnote{This note has no numbers. In this work we demonstrate $a_b$
+ the formation Y\_1 of a new type of polariton on the interface
+ between a cuprous oxide slab and a polystyrene micro-sphere placed
+ on the slab.
+ }
+
+\begin{abstract}
+This template helps you to create a properly formatted \LaTeX\ manuscript.
+
+\noindent\texttt{\textbackslash begin{abstract}} \dots
+\texttt{\textbackslash end{abstract}} and
+\verb+\begin{keyword}+ \verb+...+ \verb+\end{keyword}+
+which
+contain the abstract and keywords respectively.
+
+\noindent Each keyword shall be separated by a \verb+\sep+ command.
+\end{abstract}
+
+\begin{graphicalabstract}
+\includegraphics{figs/cas-grabs.pdf}
+\end{graphicalabstract}
+
+\begin{highlights}
+\item Research highlights item 1
+\item Research highlights item 2
+\item Research highlights item 3
+\end{highlights}
+
+\begin{keywords}
+quadrupole exciton \sep polariton \sep \WGM \sep \BEC
+\end{keywords}
+
+
+\maketitle
+
+\section{Introduction}
+
+The Elsevier cas-dc class is based on the
+standard article class and supports almost all of the functionality of
+that class. In addition, it features commands and options to format the
+\begin{itemize} \item document style \item baselineskip \item front
+matter \item keywords and MSC codes \item theorems, definitions and
+proofs \item lables of enumerations \item citation style and labeling.
+\end{itemize}
+
+This class depends on the following packages
+for its proper functioning:
+
+\begin{enumerate}
+\itemsep=0pt
+\item {natbib.sty} for citation processing;
+\item {geometry.sty} for margin settings;
+\item {fleqn.clo} for left aligned equations;
+\item {graphicx.sty} for graphics inclusion;
+\item {hyperref.sty} optional packages if hyperlinking is
+ required in the document;
+\end{enumerate}
+
+All the above packages are part of any
+standard \LaTeX{} installation.
+Therefore, the users need not be
+bothered about downloading any extra packages.
+
+\section{Installation}
+
+The package is available at author resources page at Elsevier
+(\url{http://www.elsevier.com/locate/latex}).
+The class may be moved or copied to a place, usually,\linebreak
+\verb+$TEXMF/tex/latex/elsevier/+, %$%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+or a folder which will be read
+by \LaTeX{} during document compilation. The \TeX{} file
+database needs updation after moving/copying class file. Usually,
+we use commands like \verb+mktexlsr+ or \verb+texhash+ depending
+upon the distribution and operating system.
+
+\section{Front matter}
+
+The author names and affiliations could be formatted in two ways:
+\begin{enumerate}[(1)]
+\item Group the authors per affiliation.
+\item Use footnotes to indicate the affiliations.
+\end{enumerate}
+See the front matter of this document for examples.
+You are recommended to conform your choice to the journal you
+are submitting to.
+
+\section{Bibliography styles}
+
+There are various bibliography styles available. You can select the
+style of your choice in the preamble of this document. These styles are
+Elsevier styles based on standard styles like Harvard and Vancouver.
+Please use Bib\TeX\ to generate your bibliography and include DOIs
+whenever available.
+
+Here are two sample references:
+\cite{Fortunato2010}
+\cite{Fortunato2010,NewmanGirvan2004}
+\cite{Fortunato2010,Vehlowetal2013}
+
+\section{Floats}
+{Figures} may be included using the command,\linebreak
+\verb+\includegraphics+ in
+combination with or without its several options to further control
+graphic. \verb+\includegraphics+ is provided by {graphic[s,x].sty}
+which is part of any standard \LaTeX{} distribution.
+{graphicx.sty} is loaded by default. \LaTeX{} accepts figures in
+the postscript format while pdf\LaTeX{} accepts {*.pdf},
+{*.mps} (metapost), {*.jpg} and {*.png} formats.
+pdf\LaTeX{} does not accept graphic files in the postscript format.
+
+\begin{figure}
+ \centering
+ \includegraphics[width=.9\columnwidth]{figs/cas-munnar-2024.jpg}
+ \caption{The beauty of Munnar, Kerala. (See also Table \protect\ref{tbl1}).}
+ \label{FIG:1}
+\end{figure}
+
+
+The \verb+table+ environment is handy for marking up tabular
+material. If users want to use {multirow.sty},
+{array.sty}, etc., to fine control/enhance the tables, they
+are welcome to load any package of their choice and
+{cas-dc.cls} will work in combination with all loaded
+packages.
+
+\begin{table}[width=.9\linewidth,cols=4,pos=h]
+\caption{This is a test caption. This is a test caption. This is a test
+caption. This is a test caption. Use \{table*\} instead of \{table\} if you
+want a two column spanned table.}\label{tbl1}
+\begin{tabular*}{\tblwidth}{@{} LLLL@{} }
+\toprule
+Col 1 & Col 2 & Col 3 & Col4\\
+\midrule
+12345 & 12345 & 123 & 12345 \\
+12345 & 12345 & 123 & 12345 \\
+12345 & 12345 & 123 & 12345 \\
+12345 & 12345 & 123 & 12345 \\
+12345 & 12345 & 123 & 12345 \\
+\bottomrule
+\end{tabular*}
+\end{table}
+
+\section[Theorem and ...]{Theorem and theorem like environments}
+
+{cas-dc.cls} provides a few shortcuts to format theorems and
+theorem-like environments with ease. In all commands the options that
+are used with the \verb+\newtheorem+ command will work exactly in the same
+manner. {cas-dc.cls} provides three commands to format theorem or
+theorem-like environments:
+
+\begin{verbatim}
+ \newtheorem{theorem}{Theorem}
+ \newtheorem{lemma}[theorem]{Lemma}
+ \newdefinition{rmk}{Remark}
+ \newproof{pf}{Proof}
+ \newproof{pot}{Proof of Theorem \ref{thm2}}
+\end{verbatim}
+
+
+The \verb+\newtheorem+ command formats a
+theorem in \LaTeX's default style with italicized font, bold font
+for theorem heading and theorem number at the right hand side of the
+theorem heading. It also optionally accepts an argument which
+will be printed as an extra heading in parentheses.
+
+\begin{verbatim}
+ \begin{theorem}
+ For system (8), consensus can be achieved with
+ $\|T_{\omega z}$ ...
+ \begin{eqnarray}\label{10}
+ ....
+ \end{eqnarray}
+ \end{theorem}
+\end{verbatim}
+
+
+\newtheorem{theorem}{Theorem}
+
+\begin{theorem}
+For system (8), consensus can be achieved with
+$\|T_{\omega z}$ ...
+\begin{eqnarray}\label{10}
+....
+\end{eqnarray}
+\end{theorem}
+
+The \verb+\newdefinition+ command is the same in
+all respects as its \verb+\newtheorem+ counterpart except that
+the font shape is roman instead of italic. Both
+\verb+\newdefinition+ and \verb+\newtheorem+ commands
+automatically define counters for the environments defined.
+
+The \verb+\newproof+ command defines proof environments with
+upright font shape. No counters are defined.
+
+\begin{figure*}
+ \centering
+ \includegraphics[width=.9\textwidth]{figs/cas-munnar-2024.jpg}
+ \caption{The beauty of Munnar, Kerala. (See also Table \protect\ref{tbl1}).}
+ \label{FIG:2}
+\end{figure*}
+
+
+\section[Enumerated ...]{Enumerated and Itemized Lists}
+{cas-dc.cls} provides an extended list processing macros
+which makes the usage a bit more user friendly than the default
+\LaTeX{} list macros. With an optional argument to the
+\verb+\begin{enumerate}+ command, you can change the list counter
+type and its attributes.
+
+\begin{verbatim}
+ \begin{enumerate}[1.]
+ \item The enumerate environment starts with an optional
+ argument `1.', so that the item counter will be suffixed
+ by a period.
+ \item You can use `a)' for alphabetical counter and '(i)'
+ for roman counter.
+ \begin{enumerate}[a)]
+ \item Another level of list with alphabetical counter.
+ \item One more item before we start another.
+ \item One more item before we start another.
+ \item One more item before we start another.
+ \item One more item before we start another.
+\end{verbatim}
+
+Further, the enhanced list environment allows one to prefix a
+string like `step' to all the item numbers.
+
+\begin{verbatim}
+ \begin{enumerate}[Step 1.]
+ \item This is the first step of the example list.
+ \item Obviously this is the second step.
+ \item The final step to wind up this example.
+ \end{enumerate}
+\end{verbatim}
+
+\section{Cross-references}
+In electronic publications, articles may be internally
+hyperlinked. Hyperlinks are generated from proper
+cross-references in the article. For example, the words
+\textcolor{black!80}{Fig.~1} will never be more than simple text,
+whereas the proper cross-reference \verb+\ref{tiger}+ may be
+turned into a hyperlink to the figure itself:
+\textcolor{blue}{Fig.~1}. In the same way,
+the words \textcolor{blue}{Ref.~[1]} will fail to turn into a
+hyperlink; the proper cross-reference is \verb+\cite{Knuth96}+.
+Cross-referencing is possible in \LaTeX{} for sections,
+subsections, formulae, figures, tables, and literature
+references.
+
+\section{Bibliography}
+
+Two bibliographic style files (\verb+*.bst+) are provided ---
+{model1-num-names.bst} and {model2-names.bst} --- the first one can be
+used for the numbered scheme. This can also be used for the numbered
+with new options of {natbib.sty}. The second one is for the author year
+scheme. When you use model2-names.bst, the citation commands will be
+like \verb+\citep+, \verb+\citet+, \verb+\citealt+ etc. However when
+you use model1-num-names.bst, you may use only \verb+\cite+ command.
+
+\verb+thebibliography+ environment. Each reference is a\linebreak
+\verb+\bibitem+ and each \verb+\bibitem+ is identified by a label,
+by which it can be cited in the text:
+
+\noindent In connection with cross-referencing and
+possible future hyperlinking it is not a good idea to collect
+more that one literature item in one \verb+\bibitem+. The
+so-called Harvard or author-year style of referencing is enabled
+by the \LaTeX{} package {natbib}. With this package the
+literature can be cited as follows:
+
+\begin{enumerate}[\textbullet]
+\item Parenthetical: \verb+\citep{WB96}+ produces (Wettig \& Brown, 1996).
+\item Textual: \verb+\citet{ESG96}+ produces Elson et al. (1996).
+\item An affix and part of a reference:\break
+\verb+\citep[e.g.][Ch. 2]{Gea97}+ produces (e.g. Governato et
+al., 1997, Ch. 2).
+\end{enumerate}
+
+In the numbered scheme of citation, \verb+\cite{<label>}+ is used,
+since \verb+\citep+ or \verb+\citet+ has no relevance in the numbered
+scheme. {natbib} package is loaded by {cas-dc} with
+\verb+numbers+ as default option. You can change this to author-year
+or harvard scheme by adding option \verb+authoryear+ in the class
+loading command. If you want to use more options of the {natbib}
+package, you can do so with the \verb+\biboptions+ command. For
+details of various options of the {natbib} package, please take a
+look at the {natbib} documentation, which is part of any standard
+\LaTeX{} installation.
+
+\appendix
+\section{My Appendix}
+Appendix sections are coded under \verb+\appendix+.
+
+\verb+\printcredits+ command is used after appendix sections to list
+author credit taxonomy contribution roles tagged using \verb+\credit+
+in frontmatter.
+
+\printcredits
+
+%% Loading bibliography style file
+%\bibliographystyle{model1-num-names}
+\bibliographystyle{cas-model2-names}
+
+% Loading bibliography database
+\bibliography{cas-refs}
+
+
+%\vskip3pt
+
+\bio{}
+Author biography without author photo.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+\endbio
+
+\bio{figs/cas-pic1}
+Author biography with author photo.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+\endbio
+
+\bio{figs/cas-pic1}
+Author biography with author photo.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+\endbio
+
+\end{document}
+
diff --git a/macros/latex/contrib/els-cas-templates/cas-dc-template.tex b/macros/latex/contrib/els-cas-templates/cas-dc-template.tex
index 5cefee69db..609fc3005c 100644
--- a/macros/latex/contrib/els-cas-templates/cas-dc-template.tex
+++ b/macros/latex/contrib/els-cas-templates/cas-dc-template.tex
@@ -1,14 +1,14 @@
%%
-%% Copyright 2019-2021 Elsevier Ltd
+%% Copyright 2019-2024 Elsevier Ltd
%%
%% This file is part of the 'CAS 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
+%% 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
+%% and version 1.3c or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%%
%% The list of all files belonging to the 'CAS Bundle' is
@@ -47,21 +47,21 @@
\def\textpagefraction{.001}
% Short title
-\shorttitle{<short title of the paper for running head>}
+\shorttitle{}
% Short author
-\shortauthors{<short author list for running head>}
+\shortauthors{}
% Main title of the paper
-\title [mode = title]{<main title>}
+\title [mode = title]{}
% Title footnote mark
% eg: \tnotemark[1]
-\tnotemark[<tnote number>]
+\tnotemark[1]
% Title footnote 1.
% eg: \tnotetext[1]{Title footnote text}
-\tnotetext[<tnote number>]{<tnote text>}
+\tnotetext[1]{}
% First author
%
@@ -77,26 +77,26 @@
% linkedin=<linkedin id>,
% gplus=<gplus id>]
-\author[<aff no>]{<author name>}[<options>]
+\author[1]{}%[<options>]
% Corresponding author indication
-\cormark[<corr mark no>]
+\cormark[1]
% Footnote of the first author
-\fnmark[<footnote mark no>]
+\fnmark[1]
% Email id of the first author
-\ead{<email address>}
+\ead{}
% URL of the first author
-\ead[url]{<URL>}
+\ead[url]{}
% Credit authorship
% eg: \credit{Conceptualization of this study, Methodology, Software}
-\credit{<Credit authorship details>}
+\credit{}
% Address/affiliation
-\affiliation[<aff no>]{organization={},
+\affiliation[1]{organization={},
addressline={},
city={},
% citysep={}, % Uncomment if no comma needed between city and postcode
@@ -104,7 +104,7 @@
state={},
country={}}
-\author[<aff no>]{<author name>}[<options>]
+\author[2]{}%[]
% Footnote of the second author
\fnmark[2]
@@ -119,7 +119,7 @@
\credit{}
% Address/affiliation
-\affiliation[<aff no>]{organization={},
+\affiliation[2]{organization={},
addressline={},
city={},
% citysep={}, % Uncomment if no comma needed between city and postcode
@@ -138,7 +138,7 @@
% Here goes the abstract
\begin{abstract}
-
+Here goes the abstract \nocite{*}%% Remove this line from your manuscript.
\end{abstract}
% Use if graphical abstract is present
@@ -153,6 +153,9 @@
\item
\end{highlights}
+
+%\nocite{*}
+
% Keywords
% Each keyword is seperated by \sep
\begin{keywords}
@@ -187,15 +190,17 @@
%\item[]
%\end{description}
+\clearpage %%Remove this from your manuscript
+
% Figure
-\begin{figure}[<options>]
- \centering
- \includegraphics[<options>]{}
- \caption{}\label{fig1}
+\begin{figure}%[]
+ \centering
+% \includegraphics{}
+ \caption{}\label{fig1}
\end{figure}
-\begin{table}[<options>]
+\begin{table}%[]
\caption{}\label{tbl1}
\begin{tabular*}{\tblwidth}{@{}LL@{}}
\toprule
@@ -231,16 +236,16 @@
\bibliographystyle{cas-model2-names}
% Loading bibliography database
-\bibliography{}
+\bibliography{cas-refs}
% Biography
-\bio{}
+%\bio{}
% Here goes the biography details.
-\endbio
+%\endbio
-\bio{pic1}
+%\bio{pic1}
% Here goes the biography details.
-\endbio
+%\endbio
\end{document}
diff --git a/macros/latex/contrib/els-cas-templates/cas-dc.cls b/macros/latex/contrib/els-cas-templates/cas-dc.cls
index a96661bd27..674299c7f7 100644
--- a/macros/latex/contrib/els-cas-templates/cas-dc.cls
+++ b/macros/latex/contrib/els-cas-templates/cas-dc.cls
@@ -15,11 +15,11 @@
%% given in the file `manifest.txt'.
%%
-%% $Id: cas-dc.cls 66 2021-05-11 14:17:42Z rishi $
+%% $Id: cas-dc.cls 96 2024-05-04 09:29:44Z rishi $
\def\RCSfile{cas-dc}%
- \def\RCSversion{2.3}%
- \def\RCSdate{2021/05/11}%
+ \def\RCSversion{2.4}%
+ \def\RCSdate{2024/05/04}%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{\RCSfile}[\RCSdate, \RCSversion: Formatting class
for CAS double column articles]
@@ -48,7 +48,7 @@
\DeclareOption{final}{\global\casfinallayouttrue}
\DeclareOption{review}{\global\casreviewlayouttrue}
-\ExecuteOptions{a4paper,10pt,oneside,fleqn,review}
+\ExecuteOptions{a4paper,10pt,oneside,fleqn}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions
\LoadClass{article}
@@ -64,6 +64,8 @@
\RequirePackage{xspace,xstring,footmisc}
\RequirePackage[svgnames,dvipsnames]{xcolor}
+\ifbool{casreviewlayout}{\RequirePackage{setspace}}{}
+
\RequirePackage[colorlinks]{hyperref}
\colorlet{scolor}{black}
\colorlet{hscolor}{DarkSlateGrey}
@@ -112,17 +114,26 @@
\thispagestyle{first}
\ifbool{longmktitle}
{
- \LongMaketitleBox
+ \ifnum\theblind>0\relax
+ \LongMaketitleBox[Blind]
+ \else
+ \LongMaketitleBox
+ \fi
\ProcessLongTitleBox
}
{
- \twocolumn[\MaketitleBox]
+ \ifnum\theblind>0\relax
+ \twocolumn[{\MaketitleBox[blind]}]
+ \else
+ \twocolumn[\MaketitleBox]
+ \fi
\printFirstPageNotes
}
\setcounter{footnote}{\int_use:N \g_stm_fnote_int}
\renewcommand\thefootnote{\arabic{footnote}}
\gdef\@pdfauthor{\infoauthors}
\gdef\@pdfsubject{Complex ~STM ~Content}
+ \ifbool{casreviewlayout}{\doublespacing}{}
}
%
@@ -170,6 +181,7 @@
\endinput
%
-% End of class 'cas-sc'
+% End of class 'cas-dc'
%
+
diff --git a/macros/latex/contrib/els-cas-templates/cas-model2-names.bst b/macros/latex/contrib/els-cas-templates/cas-model2-names.bst
index 503b2b7a34..726b5f6acf 100644
--- a/macros/latex/contrib/els-cas-templates/cas-model2-names.bst
+++ b/macros/latex/contrib/els-cas-templates/cas-model2-names.bst
@@ -1,16 +1,16 @@
%%
-%% This is file `cas-model2-names.bst' (Version 2.3),
+%% This is file `cas-model2-names.bst' (Version 2.4),
%%
-%% Copyright 2009-2021 Elsevier Ltd
+%% Copyright 2009-2024 Elsevier Ltd
%%
%% This file is part of the 'Elsarticle 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
+%% 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
+%% and version 1.3c or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%%
%% $Id: cas-model2-names.bst$
diff --git a/macros/latex/contrib/els-cas-templates/cas-refs.bib b/macros/latex/contrib/els-cas-templates/cas-refs.bib
index ba1cb22d73..867e4283f7 100644
--- a/macros/latex/contrib/els-cas-templates/cas-refs.bib
+++ b/macros/latex/contrib/els-cas-templates/cas-refs.bib
@@ -205,7 +205,7 @@
}
@ARTICLE{Havensetal2013,
- author = {Havens, T. C. and Bezdek, J. C. and Leckie, C., Ramamohanarao, K. and Palaniswami, M.},
+ author = {Havens, T. C. and Bezdek, J. C. and Leckie, C. and Ramamohanarao, K. and Palaniswami, M.},
title = {A Soft Modularity Function For Detecting Fuzzy Communities in Social Networks},
journal = {IEEE Trans. Fuzzy Syst.},
volume = {21},
diff --git a/macros/latex/contrib/els-cas-templates/cas-sc-sample.pdf b/macros/latex/contrib/els-cas-templates/cas-sc-sample.pdf
new file mode 100644
index 0000000000..2e9931d2b0
--- /dev/null
+++ b/macros/latex/contrib/els-cas-templates/cas-sc-sample.pdf
Binary files differ
diff --git a/macros/latex/contrib/els-cas-templates/cas-sc-sample.tex b/macros/latex/contrib/els-cas-templates/cas-sc-sample.tex
new file mode 100644
index 0000000000..8f7a3343c7
--- /dev/null
+++ b/macros/latex/contrib/els-cas-templates/cas-sc-sample.tex
@@ -0,0 +1,457 @@
+%%
+%% Copyright 2019-2024 Elsevier Ltd
+%%
+%% Version 2.4
+%%
+%% This file is part of the 'CAS 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.
+%%
+%% The list of all files belonging to the 'CAS Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%% Template article for cas-sc documentclass for
+%% single column output.
+
+%\documentclass[a4paper,fleqn,longmktitle]{cas-sc}
+\documentclass[a4paper,fleqn]{cas-sc}
+
+%\usepackage[numbers]{natbib}
+%\usepackage[authoryear]{natbib}
+\usepackage[authoryear,longnamesfirst]{natbib}
+
+%%%Author macros
+\def\tsc#1{\csdef{#1}{\textsc{\lowercase{#1}}\xspace}}
+\tsc{WGM}
+\tsc{QE}
+\tsc{EP}
+\tsc{PMS}
+\tsc{BEC}
+\tsc{DE}
+%%%
+
+\begin{document}
+\let\WriteBookmarks\relax
+\def\floatpagepagefraction{1}
+\def\textpagefraction{.001}
+\shorttitle{Leveraging social media news}
+\shortauthors{J.K. Krishnan et~al.}
+%\begin{frontmatter}
+
+\title [mode = title]{This is a specimen $a_b$ title}
+\tnotemark[1,2]
+
+\tnotetext[1]{This document is the results of the research
+ project funded by the National Science Foundation.}
+
+\tnotetext[2]{The second title footnote which is a longer text matter
+ to fill through the whole text width and overflow into
+ another line in the footnotes area of the first page.}
+
+
+\author[1,3]{J.K. Krishnan}[type=editor,
+ auid=000,bioid=1,
+ prefix=Sir,
+ role=Researcher,
+ orcid=0000-0001-0000-0000]
+\cormark[1]
+\fnmark[1]
+\ead{jkk@example.in}
+\ead[url]{www.jkkrishnan.in}
+
+\credit{Conceptualization of this study, Methodology, Software}
+
+\affiliation[1]{organization={Department of Physics, J.K. Institute of Science},
+ addressline={Jawahar Nagar},
+ city={Trivandrum},
+% citysep={}, % Uncomment if no comma needed between city and postcode
+ postcode={695013},
+ state={Kerala},
+ country={India}}
+
+\author[2,4]{Han Thane}[style=chinese]
+
+\author[2,3]{William {J. Hansen}}[%
+ role=Co-ordinator,
+ suffix=Jr,
+ ]
+\fnmark[2]
+\ead{wjh@example.org}
+\ead[URL]{https://www.university.org}
+
+\credit{Data curation, Writing - Original draft preparation}
+
+\affiliation[2]{organization={World Scientific University},
+ addressline={Street 29},
+ postcode={1011 NX},
+ postcodesep={},
+ city={Amsterdam},
+ country={The Netherlands}}
+
+\author[1,3]{T. Rafeeq}
+\cormark[2]
+\fnmark[1,3]
+\ead{t.rafeeq@example.in}
+\ead[URL]{www.campus.in}
+
+\affiliation[3]{organization={University of Intelligent Studies},
+ addressline={Street 15},
+ city={Jabaldesh},
+ postcode={825001},
+ state={Orissa},
+ country={India}}
+
+\cortext[cor1]{Corresponding author}
+\cortext[cor2]{Principal corresponding author}
+\fntext[fn1]{This is the first author footnote, but is common to third
+ author as well.}
+\fntext[fn2]{Another author footnote, this is a very long footnote and
+ it should be a really long footnote. But this footnote is not yet
+ sufficiently long enough to make two lines of footnote text.}
+
+\nonumnote{This note has no numbers. In this work we demonstrate $a_b$
+ the formation Y\_1 of a new type of polariton on the interface
+ between a cuprous oxide slab and a polystyrene micro-sphere placed
+ on the slab.
+ }
+
+\begin{abstract}
+This template helps you to create a properly formatted \LaTeX\ manuscript.
+
+\noindent\texttt{\textbackslash begin{abstract}} \dots
+\texttt{\textbackslash end{abstract}} and
+\verb+\begin{keyword}+ \verb+...+ \verb+\end{keyword}+
+which
+contain the abstract and keywords respectively.
+Each keyword shall be separated by a \verb+\sep+ command.
+\end{abstract}
+
+\begin{graphicalabstract}
+\includegraphics{figs/cas-grabs.pdf}
+\end{graphicalabstract}
+
+\begin{highlights}
+\item Research highlights item 1
+\item Research highlights item 2
+\item Research highlights item 3
+\end{highlights}
+
+\begin{keywords}
+quadrupole exciton \sep polariton \sep \WGM \sep \BEC
+\end{keywords}
+
+
+\maketitle
+
+
+\section{Introduction}
+
+The Elsevier cas-sc class is based on the
+standard article class and supports almost all of the functionality of
+that class. In addition, it features commands and options to format the
+\begin{itemize} \item document style \item baselineskip \item front
+matter \item keywords and MSC codes \item theorems, definitions and
+proofs \item lables of enumerations \item citation style and labeling.
+\end{itemize}
+
+This class depends on the following packages
+for its proper functioning:
+
+\begin{enumerate}
+\itemsep=0pt
+\item {natbib.sty} for citation processing;
+\item {geometry.sty} for margin settings;
+\item {fleqn.clo} for left aligned equations;
+\item {graphicx.sty} for graphics inclusion;
+\item {hyperref.sty} optional packages if hyperlinking is
+ required in the document;
+\end{enumerate}
+
+All the above packages are part of any
+standard \LaTeX{} installation.
+Therefore, the users need not be
+bothered about downloading any extra packages.
+
+\section{Installation}
+
+The package is available at author resources page at Elsevier
+(\url{http://www.elsevier.com/locate/latex}).
+The class may be moved or copied to a place, usually,
+\verb+$TEXMF/tex/latex/elsevier/+, %$%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+or a folder which will be read
+by \LaTeX{} during document compilation. The \TeX{} file
+database needs updation after moving/copying class file. Usually,
+we use commands like \verb+mktexlsr+ or \verb+texhash+ depending
+upon the distribution and operating system.
+
+\section{Front matter}
+
+The author names and affiliations could be formatted in two ways:
+\begin{enumerate}[(1)]
+\item Group the authors per affiliation.
+\item Use footnotes to indicate the affiliations.
+\end{enumerate}
+See the front matter of this document for examples.
+You are recommended to conform your choice to the journal you
+are submitting to.
+
+\section{Bibliography styles}
+
+There are various bibliography styles available. You can select the
+style of your choice in the preamble of this document. These styles are
+Elsevier styles based on standard styles like Harvard and Vancouver.
+Please use Bib\TeX\ to generate your bibliography and include DOIs
+whenever available.
+
+Here are two sample references:
+See \citet{Fortunato2010}. Also refer \citet{Fortunato2010,NewmanGirvan2004}.
+More citations are here \citep{Fortunato2010,Vehlowetal2013}.
+
+\section{Floats}
+{Figures} may be included using the command, \verb+\includegraphics+ in
+combination with or without its several options to further control
+graphic. \verb+\includegraphics+ is provided by {graphic[s,x].sty}
+which is part of any standard \LaTeX{} distribution.
+{graphicx.sty} is loaded by default. \LaTeX{} accepts figures in
+the postscript format while pdf\LaTeX{} accepts {*.pdf},
+{*.mps} (metapost), {*.jpg} and {*.png} formats.
+pdf\LaTeX{} does not accept graphic files in the postscript format.
+
+\begin{figure}
+ \centering
+ \includegraphics[width=.9\textwidth]{figs/cas-munnar-2024.jpg}
+ \caption{The beauty of Munnar, Kerala. (See also Table \protect\ref{tbl1}).}
+ \label{FIG:1}
+\end{figure}
+
+
+The \verb+table+ environment is handy for marking up tabular
+material. If users want to use {multirow.sty},
+{array.sty}, etc., to fine control/enhance the tables, they
+are welcome to load any package of their choice and
+{cas-sc.cls} will work in combination with all loaded
+packages.
+
+\begin{table}[width=.9\linewidth,cols=4,pos=h]
+\caption{This is a test caption. This is a test caption. This is a test
+caption. This is a test caption.}\label{tbl1}
+\begin{tabular*}{\tblwidth}{@{} LLLL@{} }
+\toprule
+Col 1 & Col 2 & Col 3 & Col4\\
+\midrule
+12345 & 12345 & 123 & 12345 \\
+12345 & 12345 & 123 & 12345 \\
+12345 & 12345 & 123 & 12345 \\
+12345 & 12345 & 123 & 12345 \\
+12345 & 12345 & 123 & 12345 \\
+\bottomrule
+\end{tabular*}
+\end{table}
+
+\section[Theorem and ...]{Theorem and theorem like environments}
+
+{cas-sc.cls} provides a few shortcuts to format theorems and
+theorem-like environments with ease. In all commands the options that
+are used with the \verb+\newtheorem+ command will work exactly in the same
+manner. {cas-sc.cls} provides three commands to format theorem or
+theorem-like environments:
+
+\begin{verbatim}
+ \newtheorem{theorem}{Theorem}
+ \newtheorem{lemma}[theorem]{Lemma}
+ \newdefinition{rmk}{Remark}
+ \newproof{pf}{Proof}
+ \newproof{pot}{Proof of Theorem \ref{thm2}}
+\end{verbatim}
+
+
+The \verb+\newtheorem+ command formats a
+theorem in \LaTeX's default style with italicized font, bold font
+for theorem heading and theorem number at the right hand side of the
+theorem heading. It also optionally accepts an argument which
+will be printed as an extra heading in parentheses.
+
+\begin{verbatim}
+ \begin{theorem}
+ For system (8), consensus can be achieved with
+ $\|T_{\omega z}$ ...
+ \begin{eqnarray}\label{10}
+ ....
+ \end{eqnarray}
+ \end{theorem}
+\end{verbatim}
+
+\newtheorem{theorem}{Theorem}
+
+\begin{theorem}
+For system (8), consensus can be achieved with
+$\|T_{\omega z}$ ...
+\begin{eqnarray}\label{10}
+....
+\end{eqnarray}
+\end{theorem}
+
+The \verb+\newdefinition+ command is the same in
+all respects as its \verb+\newtheorem+ counterpart except that
+the font shape is roman instead of italic. Both
+\verb+\newdefinition+ and \verb+\newtheorem+ commands
+automatically define counters for the environments defined.
+
+The \verb+\newproof+ command defines proof environments with
+upright font shape. No counters are defined.
+
+
+\section[Enumerated ...]{Enumerated and Itemized Lists}
+{cas-sc.cls} provides an extended list processing macros
+which makes the usage a bit more user friendly than the default
+\LaTeX{} list macros. With an optional argument to the
+\verb+\begin{enumerate}+ command, you can change the list counter
+type and its attributes.
+
+\begin{verbatim}
+ \begin{enumerate}[1.]
+ \item The enumerate environment starts with an optional
+ argument `1.', so that the item counter will be suffixed
+ by a period.
+ \item You can use `a)' for alphabetical counter and '(i)' for
+ roman counter.
+ \begin{enumerate}[a)]
+ \item Another level of list with alphabetical counter.
+ \item One more item before we start another.
+ \item One more item before we start another.
+ \item One more item before we start another.
+ \item One more item before we start another.
+\end{verbatim}
+
+Further, the enhanced list environment allows one to prefix a
+string like `step' to all the item numbers.
+
+%\pagebreak
+\begin{verbatim}
+ \begin{enumerate}[Step 1.]
+ \item This is the first step of the example list.
+ \item Obviously this is the second step.
+ \item The final step to wind up this example.
+ \end{enumerate}
+\end{verbatim}
+
+\section{Cross-references}
+In electronic publications, articles may be internally
+hyperlinked. Hyperlinks are generated from proper
+cross-references in the article. For example, the words
+\textcolor{black!80}{Fig.~1} will never be more than simple text,
+whereas the proper cross-reference \verb+\ref{tiger}+ may be
+turned into a hyperlink to the figure itself:
+\textcolor{blue}{Fig.~1}. In the same way,
+the words \textcolor{blue}{Ref.~[1]} will fail to turn into a
+hyperlink; the proper cross-reference is \verb+\cite{Knuth96}+.
+Cross-referencing is possible in \LaTeX{} for sections,
+subsections, formulae, figures, tables, and literature
+references.
+
+\section{Bibliography}
+
+Two bibliographic style files (\verb+*.bst+) are provided ---
+{model1-num-names.bst} and {model2-names.bst} --- the first one can be
+used for the numbered scheme. This can also be used for the numbered
+with new options of {natbib.sty}. The second one is for the author year
+scheme. When you use model2-names.bst, the citation commands will be
+like \verb+\citep+, \verb+\citet+, \verb+\citealt+ etc. However when
+you use model1-num-names.bst, you may use only \verb+\cite+ command.
+
+\verb+thebibliography+ environment. Each reference is a
+\verb+\bibitem+ and each \verb+\bibitem+ is identified by a label,
+by which it can be cited in the text:
+
+\noindent In connection with cross-referencing and
+possible future hyperlinking it is not a good idea to collect
+more that one literature item in one \verb+\bibitem+. The
+so-called Harvard or author-year style of referencing is enabled
+by the \LaTeX{} package {natbib}. With this package the
+literature can be cited as follows:
+
+
+\begin{enumerate}[\textbullet]
+\item Parenthetical: \verb+\citep{WB96}+ produces (Wettig \& Brown, 1996).
+\item Textual: \verb+\citet{ESG96}+ produces Elson et al. (1996).
+\item An affix and part of a reference:
+\verb+\citep[e.g.][Ch. 2]{Gea97}+ produces (e.g. Governato et
+al., 1997, Ch. 2).
+\end{enumerate}
+
+In the numbered scheme of citation, \verb+\cite{<label>}+ is used,
+since \verb+\citep+ or \verb+\citet+ has no relevance in the numbered
+scheme. {natbib} package is loaded by {cas-sc} with
+\verb+numbers+ as default option. You can change this to author-year
+or harvard scheme by adding option \verb+authoryear+ in the class
+loading command. If you want to use more options of the {natbib}
+package, you can do so with the \verb+\biboptions+ command. For
+details of various options of the {natbib} package, please take a
+look at the {natbib} documentation, which is part of any standard
+\LaTeX{} installation.
+
+\appendix
+\section{My Appendix}
+Appendix sections are coded under \verb+\appendix+.
+
+\verb+\printcredits+ command is used after appendix sections to list
+author credit taxonomy contribution roles tagged using \verb+\credit+
+in frontmatter.
+
+\printcredits
+
+%% Loading bibliography style file
+%\bibliographystyle{model1-num-names}
+\bibliographystyle{cas-model2-names}
+
+% Loading bibliography database
+\bibliography{cas-refs}
+
+
+%\vskip3pt
+
+\bio{}
+Author biography without author photo.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+\endbio
+
+\bio{figs/cas-pic1}
+Author biography with author photo.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+\endbio
+
+\vskip3pc
+
+\bio{figs/cas-pic1}
+Author biography with author photo.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+Author biography. Author biography. Author biography.
+\endbio
+
+
+\end{document}
+
diff --git a/macros/latex/contrib/els-cas-templates/cas-sc-template.tex b/macros/latex/contrib/els-cas-templates/cas-sc-template.tex
index 909bcdd024..c2cd7e58de 100644
--- a/macros/latex/contrib/els-cas-templates/cas-sc-template.tex
+++ b/macros/latex/contrib/els-cas-templates/cas-sc-template.tex
@@ -1,21 +1,21 @@
%%
-%% Copyright 2019-2021 Elsevier Ltd
+%% Copyright 2019-2024 Elsevier Ltd
%%
%% This file is part of the 'CAS 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
+%% 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
+%% and version 1.3c or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%%
%% The list of all files belonging to the 'CAS Bundle' is
%% given in the file `manifest.txt'.
%%
%% Template article for cas-sc documentclass for
-%% single column output.
+%% double column output.
\documentclass[a4paper,fleqn]{cas-sc}
@@ -47,21 +47,21 @@
\def\textpagefraction{.001}
% Short title
-\shorttitle{<short title of the paper for running head>}
+\shorttitle{}
% Short author
-\shortauthors{<short author list for running head>}
+\shortauthors{}
% Main title of the paper
-\title [mode = title]{<main title>}
+\title [mode = title]{}
% Title footnote mark
% eg: \tnotemark[1]
-\tnotemark[<tnote number>]
+\tnotemark[1]
% Title footnote 1.
% eg: \tnotetext[1]{Title footnote text}
-\tnotetext[<tnote number>]{<tnote text>}
+\tnotetext[1]{}
% First author
%
@@ -77,26 +77,26 @@
% linkedin=<linkedin id>,
% gplus=<gplus id>]
-\author[<aff no>]{<author name>}[<options>]
+\author[1]{}%[<options>]
% Corresponding author indication
-\cormark[<corr mark no>]
+\cormark[1]
% Footnote of the first author
-\fnmark[<footnote mark no>]
+\fnmark[1]
% Email id of the first author
-\ead{<email address>}
+\ead{}
% URL of the first author
-\ead[url]{<URL>}
+\ead[url]{}
% Credit authorship
% eg: \credit{Conceptualization of this study, Methodology, Software}
-\credit{<Credit authorship details>}
+\credit{}
% Address/affiliation
-\affiliation[<aff no>]{organization={},
+\affiliation[1]{organization={},
addressline={},
city={},
% citysep={}, % Uncomment if no comma needed between city and postcode
@@ -104,7 +104,7 @@
state={},
country={}}
-\author[<aff no>]{<author name>}[<options>]
+\author[2]{}%[]
% Footnote of the second author
\fnmark[2]
@@ -119,7 +119,7 @@
\credit{}
% Address/affiliation
-\affiliation[<aff no>]{organization={},
+\affiliation[2]{organization={},
addressline={},
city={},
% citysep={}, % Uncomment if no comma needed between city and postcode
@@ -138,7 +138,7 @@
% Here goes the abstract
\begin{abstract}
-
+Here goes the abstract \nocite{*}%% Remove this line from your manuscript.
\end{abstract}
% Use if graphical abstract is present
@@ -153,6 +153,7 @@
\item
\end{highlights}
+
% Keywords
% Each keyword is seperated by \sep
\begin{keywords}
@@ -187,15 +188,18 @@
%\item[]
%\end{description}
+\clearpage %%Remove this from your manuscript
+
+
% Figure
-\begin{figure}[<options>]
- \centering
- \includegraphics[<options>]{}
- \caption{}\label{fig1}
+\begin{figure}%[]
+ \centering
+% \includegraphics{}
+ \caption{}\label{fig1}
\end{figure}
-\begin{table}[<options>]
+\begin{table}%[]
\caption{}\label{tbl1}
\begin{tabular*}{\tblwidth}{@{}LL@{}}
\toprule
@@ -231,16 +235,16 @@
\bibliographystyle{cas-model2-names}
% Loading bibliography database
-\bibliography{}
+\bibliography{cas-refs}
% Biography
-\bio{}
+%\bio{}
% Here goes the biography details.
-\endbio
+%\endbio
-\bio{pic1}
+%\bio{pic1}
% Here goes the biography details.
-\endbio
+%\endbio
\end{document}
diff --git a/macros/latex/contrib/els-cas-templates/cas-sc.cls b/macros/latex/contrib/els-cas-templates/cas-sc.cls
index d84d03c2f2..51f829742e 100644
--- a/macros/latex/contrib/els-cas-templates/cas-sc.cls
+++ b/macros/latex/contrib/els-cas-templates/cas-sc.cls
@@ -15,11 +15,11 @@
%% given in the file `manifest.txt'.
%%
-%% $Id: cas-sc.cls 66 2021-05-11 14:17:42Z rishi $
+%% $Id: cas-sc.cls 96 2024-05-04 09:29:44Z rishi $
\def\RCSfile{cas-sc}%
- \def\RCSversion{2.3}%
- \def\RCSdate{2021/05/11}%
+ \def\RCSversion{2.4}%
+ \def\RCSdate{2024/05/04}%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{\RCSfile}[\RCSdate, \RCSversion: Formatting class
for CAS single column articles]
@@ -64,6 +64,8 @@
\RequirePackage{xspace,xstring,footmisc}
\RequirePackage[svgnames,dvipsnames]{xcolor}
+\ifbool{casreviewlayout}{\RequirePackage{setspace}}{}
+
\RequirePackage[colorlinks]{hyperref}
\colorlet{scolor}{black}
\colorlet{hscolor}{DarkSlateGrey}
@@ -161,8 +163,6 @@
{ \RequirePackage[scaled=.85]{inconsolata} }
{ \tex_gdef:D \ttdefault { cmtt } }
-\ifbool{casreviewlayout}{\RequirePackage{setspace}}{}
-
\ExplSyntaxOff
%
@@ -186,3 +186,4 @@
% End of class 'cas-sc'
%
+
diff --git a/macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.pdf b/macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.pdf
index 606232b3e3..b5ac0efabc 100644
--- a/macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.pdf
+++ b/macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.pdf
Binary files differ
diff --git a/macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.tex b/macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.tex
index 6b5b7186eb..2128780862 100644
--- a/macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.tex
+++ b/macros/latex/contrib/els-cas-templates/doc/elsdoc-cas.tex
@@ -5,16 +5,16 @@
%% ---------------------------------------------
%%
%% 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
+%% 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
+%% and version 1.3c or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%%
%% The list of all files belonging to the 'CAS Bundle' is
%% given in the file `manifest.txt'.
%%
-%% $Id: elsdoc-cas.tex 71 2021-05-12 06:14:05Z rishi $
+%% $Id: elsdoc-cas.tex 76 2021-05-12 14:42:29Z rishi $
%%
\documentclass[a4paper,12pt]{article}
diff --git a/macros/latex/contrib/els-cas-templates/doc/rvdtx.sty b/macros/latex/contrib/els-cas-templates/doc/rvdtx.sty
index 06bb30edf6..0d94ff20a4 100644
--- a/macros/latex/contrib/els-cas-templates/doc/rvdtx.sty
+++ b/macros/latex/contrib/els-cas-templates/doc/rvdtx.sty
@@ -7,13 +7,13 @@
% Copyright (c) 2008-2021 CV Radhakrishnan <cvr@stmdocs.in>,
%
% This file may be distributed and/or modified under the conditions
-% of the LaTeX Project Public License, either version 1.2 of this
+% 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
+% and version 1.3c or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
%
%
diff --git a/macros/latex/contrib/els-cas-templates/figs/cas-grabs.pdf b/macros/latex/contrib/els-cas-templates/figs/cas-grabs.pdf
new file mode 100644
index 0000000000..a1ff5be7a5
--- /dev/null
+++ b/macros/latex/contrib/els-cas-templates/figs/cas-grabs.pdf
Binary files differ
diff --git a/macros/latex/contrib/els-cas-templates/figs/cas-munnar-2024.jpg b/macros/latex/contrib/els-cas-templates/figs/cas-munnar-2024.jpg
new file mode 100644
index 0000000000..14b57f7be0
--- /dev/null
+++ b/macros/latex/contrib/els-cas-templates/figs/cas-munnar-2024.jpg
Binary files differ
diff --git a/macros/latex/contrib/els-cas-templates/figs/cas-pic1.pdf b/macros/latex/contrib/els-cas-templates/figs/cas-pic1.pdf
new file mode 100644
index 0000000000..97471d0bdd
--- /dev/null
+++ b/macros/latex/contrib/els-cas-templates/figs/cas-pic1.pdf
Binary files differ
diff --git a/macros/latex/contrib/els-cas-templates/manifest.txt b/macros/latex/contrib/els-cas-templates/manifest.txt
index 2ab9dfa0f1..a7443de7b8 100644
--- a/macros/latex/contrib/els-cas-templates/manifest.txt
+++ b/macros/latex/contrib/els-cas-templates/manifest.txt
@@ -1,14 +1,16 @@
-% Copyright 2019-2021 Elsevier Ltd
+% Copyright 2019-2024 Elsevier Ltd
+%
+% Version 2.4
%
% This file is part of the 'CAS Bundle'.
% --------------------------------------
%
% It 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
+% and version 1.3c or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
%
% The list of all files belonging to the LaTeX 'CAS Bundle' is
@@ -19,6 +21,12 @@
Directory elsevier-cas-template/
+manifest.txt
+ This file
+
+README
+ A brief readme documentation
+
cas-sc.cls
Classfile to be used for single column format
@@ -29,21 +37,21 @@ cas-model2-names.bst
BibTeX style file
cas-sc-template.tex
- TeX template
+ TeX template to be used for manuscript preparation (single column).
cas-dc-template.tex
- TeX template
+ TeX template to be used for manuscript preparation (double column).
-manifest.txt
- this file
+cas-sc-sample.tex
+ Minimum working exmple (MWE) file - single column.
-README
- small readme documentation
+cas-dc-sample.tex
+ Minimum working exmple (MWE) file - double column.
Directory doc/
The following files are graphic files needed for creating pdf output
-of the documentation from elsdoc.tex:
+of the documentation from elsdoc-cas.tex:
dc-sample.pdf
sc-sample.pdf
@@ -76,3 +84,11 @@ Auxiliary packages needed to generate pdf output from elsdoc.tex:
pdfwidgets.sty
glyphtounicode.tex
+
+Directory figs/
+
+Contains images used in the sample PDF.
+
+ cas-grabs.pdf
+ cas-munnar-2024.jpg
+ cas-pic1.pdf
diff --git a/macros/latex/contrib/esindex/README.md b/macros/latex/contrib/esindex/README.md
index 6ebd7e4c79..b1163025c4 100644
--- a/macros/latex/contrib/esindex/README.md
+++ b/macros/latex/contrib/esindex/README.md
@@ -18,6 +18,10 @@ in the document.
### Recent changes
```
+1.8 2024-04-27
+ - Fix - Some replacements stopped working in pdflatex with utf8
+ because of a change the LaTeX LICR.
+
1.7 2019-10-10
- Fix - because of a change in a macro name, it stopped
working with xe/lua
diff --git a/macros/latex/contrib/esindex/esindex.pdf b/macros/latex/contrib/esindex/esindex.pdf
index bc78b36c15..9272dd8291 100644
--- a/macros/latex/contrib/esindex/esindex.pdf
+++ b/macros/latex/contrib/esindex/esindex.pdf
Binary files differ
diff --git a/macros/latex/contrib/esindex/esindex.sty b/macros/latex/contrib/esindex/esindex.sty
index a63bdba6eb..72a0937c4d 100644
--- a/macros/latex/contrib/esindex/esindex.sty
+++ b/macros/latex/contrib/esindex/esindex.sty
@@ -1,5 +1,5 @@
%
-% Copyright (C) 1998-2019 Javier Bezos http://www.texnia.com
+% Copyright (C) 1998-2024 Javier Bezos http://www.texnia.com
%
% This file may be distributed and/or modified under the conditions of
% the MIT License. A version can be found at the end of this file.
@@ -7,7 +7,7 @@
% Repository: https://github.com/jbezos/esindex
%
-\ProvidesPackage{esindex}[2019/10/10 v1.7 Spanish indexes (and more)]
+\ProvidesPackage{esindex}[2024/04/27 v1.8 Spanish indexes (and more)]
\def\esx@level{`\!}
\def\esx@actual{`\@}
@@ -92,15 +92,40 @@
\gdef\esx@bar@eat#1|{\def\esx@a{|#1}}
}
-\gdef\esindexexpandkey{%
- \protected@edef\esindexkey{\esindexkey}}
+\gdef\esx@tolicr#1#2{%
+ \@ifundefined{u8\string:\string#1\string#2}%
+ {\unexpanded{#1#2}}%
+ {\@nameuse{u8\string:\string#1\string#2}}}
+
+\begingroup
+ \catcode`\^^c2=\active
+ \catcode`\^^c3=\active
+ \gdef\esx@expandkey#1{%
+ \ifnum\catcode`\^^c2=\active \ifnum\catcode`\^^c3=\active
+ \def\esx@a{^^c2^^c3}%
+ \protected@edef\esx@b{\esx@a}%
+ \ifx\esx@a\esx@b
+ \let\esx@cii ^^c2%
+ \let\esx@ciii ^^c3%
+ \def ^^c2{\esx@tolicr ^^c2}%
+ \def ^^c3{\esx@tolicr ^^c3}%
+ \protected@edef#1{#1}%
+ \let ^^c2\esx@cii
+ \let ^^c3\esx@ciii
+ \else
+ \protected@edef#1{#1}%
+ \fi
+ \fi\fi}
+\endgroup
+
+\gdef\esindexexpandkey{\esx@expandkey\esindexkey}
\gdef\esindexexpandsubkey{%
\ifx\esindexsubkey\relax\else
- \protected@edef\esindexsubkey{\esindexsubkey}%
+ \esx@expandkey\esindexsubkey
\fi}
\gdef\esindexexpandsubsubkey{%
\ifx\esindexsubsubkey\relax\else
- \protected@edef\esindexsubsubkey{\esindexsubsubkey}%
+ \esx@expandkey\esindexsubsubkey
\fi}
\gdef\esindexexpandkeys{%
diff --git a/macros/latex/contrib/esindex/esindex.tex b/macros/latex/contrib/esindex/esindex.tex
index 03d0b24386..64a6f18735 100644
--- a/macros/latex/contrib/esindex/esindex.tex
+++ b/macros/latex/contrib/esindex/esindex.tex
@@ -1,5 +1,5 @@
%
-% Copyright (C) 1998-2019 Javier Bezos http://www.texnia.com
+% Copyright (C) 1998-2024 Javier Bezos http://www.texnia.com
%
% This file may be distributed and/or modified under the conditions of
% the MIT License. A version can be found at the end of this file.
@@ -14,7 +14,7 @@
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
-\title{\textsf{esindex}\\\large 1.7\quad 2019-10-10}
+\title{\textsf{esindex}\\\large 1.8\quad 2024-04-27}
\author{Javier Bezos}
@@ -46,7 +46,7 @@
{\LARGE Generating automatically sort keys for \textit{MakeIndex}
with \LaTeX\par}
\vspace*{1ex}
-Version 1.7 (2019-10-10)\par
+Version 1.8 (2024-04-27)\par
\texttt{https://github.com/jbezos/esindex}\par
Javier Bezos (\texttt{http://www.texnia.com})
@@ -100,6 +100,8 @@ three-level key use \verb|\esindexreplacesubsub| (with 4 arguments). With
with the definitions above the key for \verb|ràpid| is
\verb|rapid^^Ar1pid|.)
+(Version 1.8 is just a bug fix.)
+
\section{Spanish}
Este paquete ha sido diseñado para facilitar la escritura de índices
diff --git a/macros/latex/contrib/fadingimage/README.md b/macros/latex/contrib/fadingimage/README.md
index d62c0a6078..9ed33c1695 100644
--- a/macros/latex/contrib/fadingimage/README.md
+++ b/macros/latex/contrib/fadingimage/README.md
@@ -1,17 +1,19 @@
# The `fadingimage` package
-This package provides three commands for adding fading full width picture at the top or bottom of a page.
+This package provides macros for inputting full width picture at the edges of pages quickly.
-**Welcome to pull requests
-[here](https://github.com/xiamyphys/fadingimage).**
+**Welcome to pull requests [here](https://github.com/xiamyphys/fadingimage/pulls).**
## License
-This work may be distributed and/or modified under the conditions of the
-[LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
-either version 1.3c of this license or (at your option) any later version.
+This work may be distributed and/or modified under the conditions of the [LaTeX Project Public License](http://www.latex-project.org/lppl.txt), either version 1.3c of this license or (at your option) any later version.
This work has the LPPL maintenance status `maintained`.
-The Current Maintainer of this work is
-[Mingyu Hsia](https://www.ctan.org/author/xia-my). \ No newline at end of file
+The Current Maintainer of this work is [Mingyu Hsia](https://www.ctan.org/author/xia-my).
+
+## Derivative Works
+
+- [notebeamer](https://ctan.org/pkg/notebeamer): Package provides macros for inputting slides on note papers quickly.
+
+- [litesolution](https://ctan.org/pkg/litesolution): Class designed for typesetting solutions of problems in exams, textbooks, etc.
diff --git a/macros/latex/contrib/fadingimage/doc/fadingimage.pdf b/macros/latex/contrib/fadingimage/doc/fadingimage.pdf
index 85856e112f..ad4ab7eb7f 100644
--- a/macros/latex/contrib/fadingimage/doc/fadingimage.pdf
+++ b/macros/latex/contrib/fadingimage/doc/fadingimage.pdf
Binary files differ
diff --git a/macros/latex/contrib/fadingimage/doc/fadingimage.tex b/macros/latex/contrib/fadingimage/doc/fadingimage.tex
index 2aa6637e95..ad1ebbc3ae 100644
--- a/macros/latex/contrib/fadingimage/doc/fadingimage.tex
+++ b/macros/latex/contrib/fadingimage/doc/fadingimage.tex
@@ -1,5 +1,5 @@
\documentclass[11pt,svgnames]{article}
-\usepackage{geometry,titlesec,authblk,hyperref,hologo}
+\usepackage{geometry,indentfirst,titlesec,authblk,hyperref,hologo}
\titleformat*{\section}{\bfseries\large}
\hologoFontSetup{general=\sffamily}
\usepackage{datetime}\yyyymmdddate
@@ -11,19 +11,19 @@
\def\cmd#1{\textcolor{MidnightBlue}{\texttt{\string#1}}}
\title{\bfseries The \pkg{fadingimage} Package}
-\author{Mingyu Hsia, \href{mailto:xiamyphys@gmail.com}{\ttfamily xiamyphys@gmail.com}}
+\author{Mingyu Hsia, \href{mailto:xiamyphys@hdu.edu.cn}{\ttfamily xiamyphys@hdu.edu.cn}}
\affil{Hangzhou Dianzi University}
-\date{\today\quad Version 0.2a\thanks{\url{https://github.com/xiamyphys/fadingimage}}}
+\date{\today\quad Version 0.3a\thanks{\url{https://github.com/xiamyphys/fadingimage}}}
\begin{document}
\maketitle
-\UPFadingImage[trim={0 {.96\paperheight} 0 0},clip]{Beautiful-realities}
-\LOWFadingImage[trim={0 0 0 {.96\paperheight}},clip]{Beautiful-realities}
+\UPFadingImage*[trim={0 {.96\paperheight} 0 0},clip]{Beautiful-realities}
+\LOWFadingImage*[trim={0 0 0 {.96\paperheight}},clip]{Beautiful-realities}
\vspace{-6ex}
\begin{abstract}
-This is \textsf{\textbf{not only the document but also the demo}} for the \pkg{fadingimage} package, which provides three commands for adding fading full width picture at the top, bottom or both of them on a page. This package is contained in the \pkg{LiteBook} and \pkg{LiteSolution} class.
+This is \textsf{\textbf{not only the document but also the demo}} for the \pkg{fadingimage} package, which provides macros for inputting full width picture at the edges of pages quickly. This package is contained in the \pkg{LiteBook} and \pkg{LiteSolution} class.
Welcome to feedback bugs or ideas via email \href{mailto:xiamyphys@gmail.com}{\ttfamily xiamyphys@gmail.com} or \href{https://github.com/xiamyphys/fadingimage}{GitHub}.
@@ -41,15 +41,18 @@ Simply download \verb|fadingimage.cls| file from \href{https://github.com/xiamyp
To learn more, please refer to \href{https://tex.stackexchange.com/questions/55437/how-do-i-update-my-tex-distribution}{How do I update my \hologo{TeX} distribution?}
-\section{Commands \cmd{UPFadingImage}, \cmd{LOWFadingImage} and \cmd{UPLOWFadingImage}}
+\section{Macros in this package}
-\begin{small}\begin{verbatim}
- \UPFadingImage [<keyval list>]{<file>} \LOWFadingImage[<keyval list>]{<file>}
- \UPLOWFadingImage[<keyval list>]{<file>}[<keyval list>]{<file>}
-\end{verbatim}\end{small}
+\begin{verbatim}
+ \UPFadingImage <*> [<keyval list>] {<file>} <!> % fading from top
+ \LOWFadingImage <*> [<keyval list>] {<file>} <!> % fading from bottom
+ \LTFadingImage <*> [<keyval list>] {<file>} <!> % fading from left
+ \RITFadingImage <*> [<keyval list>] {<file>} <!> % fading from right
+\end{verbatim}
+
+The four commands all have 2 variables and the first one is optional. The second variable can assign the image that you want to insert and the first one can assign the parameters of command \cmd{includegraphics}, such as clip to the inserted image.
-The first two commands all have 2 variables and the first one is optional. The second variable of the commands can assign the image that you want to insert, and the first one can assign the parameters of command \cmd{includegraphics}, such as clip to the inserted image.
+If an exclamation \verb|<!>| is added at the end of the commands, the image inserted won't be faded. If a star \verb|<*>| is added after the commands it will automatically exit vertical mode \verb|\leavevmode| after inserting the image.
-The third command is just a combination of the first two commands. If a star (*) is added after the commands above, the image you inserted won't be faded.
\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/fadingimage/tex/fadingimage.sty b/macros/latex/contrib/fadingimage/tex/fadingimage.sty
index 6cfceced3b..a4147cd3cf 100644
--- a/macros/latex/contrib/fadingimage/tex/fadingimage.sty
+++ b/macros/latex/contrib/fadingimage/tex/fadingimage.sty
@@ -1,5 +1,5 @@
%% ***********************************************************
-%% Copyright 2024 by Mingyu Hsia <xiamyphys@gmail.com> *
+%% Copyright 2024 by Mingyu Hsia <xiamyphys@hdu.edu.cn> *
%% *
%% This work may be distributed and/or modified under *
%% the conditions of the LaTeX Project Public License *
@@ -13,48 +13,48 @@
%% *
%% The Current Maintainer of this work is Mingyu Hsia. *
%% *
-%% This work consists of the files fadingimage.cls, *
+%% This work consists of the files fadingimage.sty, *
%% and README.md. *
%% available at https://github.com/xiamyphys/fadingimage *
%% ***********************************************************
% !Mode:: "TeX:UTF-8"
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
-\ProvidesPackage{fadingimage}[2024/04/19/ v0.2a Package for adding fading full width picture at the top and bottom of a page.]
+\ProvidesPackage{fadingimage}[2024/05/06/ v0.3a Package provides macros for inputting full width picture at the edges of pages quickly.]
-\RequirePackage{tikz,xcolor}
-\usetikzlibrary{fadings}
-\NewDocumentCommand{\UPFadingImage}{ s O{} m }{
- \IfBooleanTF{#1}
- {
+\RequirePackage{tikz}\usetikzlibrary{fadings}
+\NewDocumentCommand{\UPFadingImage}{ s O{} m t! }{
+ \IfBooleanTF{#4}{
\tikz[remember picture,overlay]
\node[below,inner sep=0pt,outer sep=auto] at (current page.north) {\includegraphics[width=\paperwidth,#2]{#3}};
}{
\tikz[remember picture,overlay]
\node[scope fading=south,below,inner sep=0pt,outer sep=auto] at (current page.north) {\includegraphics[width=\paperwidth,#2]{#3}};
- }
+ }\IfBooleanT{#1}{\leavevmode}
}
-\NewDocumentCommand{\LOWFadingImage}{ s O{} m }{
- \IfBooleanTF{#1}
- {
+\NewDocumentCommand{\LOWFadingImage}{ s O{} m t! }{
+ \IfBooleanTF{#4}{
\tikz[remember picture,overlay]
\node[above,inner sep=0pt,outer sep=auto] at (current page.south) {\includegraphics[width=\paperwidth,#2]{#3}};
}{
\tikz[remember picture,overlay]
\node[scope fading=north,above,inner sep=0pt,outer sep=auto] at (current page.south) {\includegraphics[width=\paperwidth,#2]{#3}};
- }
+ }\IfBooleanT{#1}{\leavevmode}
}
-
-\NewDocumentCommand{\UPLOWFadingImage}{ s O{} m O{} m }{
- \IfBooleanTF{#1}
- {
- \tikz[remember picture,overlay]{
- \node[below,inner sep=0pt,outer sep=auto] at (current page.north) {\includegraphics[width=\paperwidth,#2]{#3}};
- \node[above,inner sep=0pt,outer sep=auto] at (current page.south) {\includegraphics[width=\paperwidth,#4]{#5}};
- }
+\NewDocumentCommand{\LTFadingImage}{ s O{} m t! }{
+ \IfBooleanTF{#4}{
+ \tikz[remember picture,overlay]
+ \node[right,inner sep=0pt,outer sep=auto] at (current page.west) {\includegraphics[height=\paperheight,#2]{#3}};
}{
- \tikz[remember picture,overlay]{
- \node[scope fading=south,below,inner sep=0pt,outer sep=auto] at (current page.north) {\includegraphics[width=\paperwidth,#2]{#3}};
- \node[scope fading=north,above,inner sep=0pt,outer sep=auto] at (current page.south) {\includegraphics[width=\paperwidth,#4]{#5}};
- }
- }
+ \tikz[remember picture,overlay]
+ \node[scope fading=east,right,inner sep=0pt,outer sep=auto] at (current page.west) {\includegraphics[height=\paperheight,#2]{#3}};
+ }\IfBooleanT{#1}{\leavevmode}
+}
+\NewDocumentCommand{\RITFadingImage}{ s O{} m t! }{
+ \IfBooleanTF{#4}{
+ \tikz[remember picture,overlay]
+ \node[left,inner sep=0pt,outer sep=auto] at (current page.east) {\includegraphics[height=\paperheight,#2]{#3}};
+ }{
+ \tikz[remember picture,overlay]
+ \node[scope fading=west,left,inner sep=0pt,outer sep=auto] at (current page.east) {\includegraphics[height=\paperheight,#2]{#3}};
+ }\IfBooleanT{#1}{\leavevmode}
} \ No newline at end of file
diff --git a/macros/latex/contrib/fontscale/CHANGELOG.md b/macros/latex/contrib/fontscale/CHANGELOG.md
index 304749e825..9706fbbe09 100644
--- a/macros/latex/contrib/fontscale/CHANGELOG.md
+++ b/macros/latex/contrib/fontscale/CHANGELOG.md
@@ -7,6 +7,32 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to
## [Unreleased]
+## [v1.3.0] - 2024-05-17
+
+### Added
+- `\fontscalesetup` now provides error checking for the keys `modular/ratio`,
+ `musical/ratio`, and `musical/notes`.
+- It is now documented that `\fontscalesetup` uses `\normalsize` after it
+ finishes processing the package keys.
+
+### Changed
+- The code now regularly uses `V`- and `v`-type arguments to get the value of a
+ variable.
+- The code now uses private `expl3` wrappers around the LaTeX2e commands
+ `\@setfontsize`, `\fontsize`, and `\selectfont`.
+
+## [v1.2.2] - 2024-04-29
+
+### Changed
+- Improved package messages when issuing errors and warnings.
+- Code improvements.
+
+### Fixed
+- The documentation no longer incorrectly compares `\ScaleFont` with
+ `\scalefont` from the `scalefnt` package.
+- The internal function for the key `reset=preamble` now correctly initializes
+ to `\prg_do_nothing:`.
+
## [v1.2.1] - 2024-04-21
### Changed
diff --git a/macros/latex/contrib/fontscale/fontscale-manual.pdf b/macros/latex/contrib/fontscale/fontscale-manual.pdf
index c21ffd29a9..2637ef9c1f 100644
--- a/macros/latex/contrib/fontscale/fontscale-manual.pdf
+++ b/macros/latex/contrib/fontscale/fontscale-manual.pdf
Binary files differ
diff --git a/macros/latex/contrib/fontscale/fontscale-manual.tex b/macros/latex/contrib/fontscale/fontscale-manual.tex
index db839a0fd2..9917636a04 100644
--- a/macros/latex/contrib/fontscale/fontscale-manual.tex
+++ b/macros/latex/contrib/fontscale/fontscale-manual.tex
@@ -13,7 +13,7 @@ A user interface for setting document font sizes
Oliver Beery
-Version 1.2.1\quad{}21 April 2024
+Version 1.3.0\quad{}17 May 2024
\section{Introduction}
@@ -25,9 +25,9 @@ Version 1.2.1\quad{}21 April 2024
\listheading{The \pkg{fontscale} package provides the following functionalities:}
\begin{itemize}
\item
- Set document font sizes via a classic, modular, or musical typographic scale.
+ Set font sizes via a classic, modular, or musical typographic scale.
\item
- Set arbitrary scales, sizes, and baselineskips for the standard font size commands \cs{tiny}, \cs{scriptsize}, \cs{footnotesize}, \cs{small}, \cs{normalsize}, \cs{large}, \cs{Large}, \cs{LARGE}, \cs{huge}, and \cs{Huge}.
+ Set arbitrary sizes and baselineskips for the standard font size commands \cs{tiny}, \cs{scriptsize}, \cs{footnotesize}, \cs{small}, \cs{normalsize}, \cs{large}, \cs{Large}, \cs{LARGE}, \cs{huge}, and \cs{Huge}.
\item
Set the font size settings mid\-/document or within a local group.
\item
@@ -46,7 +46,7 @@ Version 1.2.1\quad{}21 April 2024
\label{subsec:loading}
This package requires the 10 October 2023 \pkg{l3kernel} update.
-Since this update is fairly recent, you may need to ensure that your \LaTeX{} installation is up\-/to\-/date before using this package.
+You may need to ensure that your \LaTeX{} installation is up\-/to\-/date before using this package.
This package lets the user set arbitrary font sizes.
This works with most fonts produced today, but, for historical reasons, the default Computer Modern font is available only in a number of fixed sizes.
@@ -223,7 +223,7 @@ Caution: \cs{CurrentFontStep} will expand to nothing if the current font step is
Internally, \cs{CurrentFontStep}, \cs{CurrentFontScale}, and \cs{CurrentFontSize} use the kernel command \cs{f@size}.
\cs{CurrentFontSize} expands to \texttt{f@size pt}.
\cs{CurrentFontBaselineskip} expands to the kernel command \cs{f@baselineskip}.
-Note that the low\-/level font command \cs{fontsize}\marg{\meta{dimen}}\marg{\meta{skip}} sets \cs{f@size} before expanding its second argument.
+Note that the low\-/level font command \cs{fontsize}\marg{\meta{dimen}}\marg{\meta{skip}} sets \cs{f@size} to the new font size before expanding its second argument.
This means that \cs{CurrentFontStep}, \cs{CurrentFontScale}, and \cs{CurrentFontSize} may need to be first expanded if used in \meta{skip}.
This package provides the command \cs{SetFontSizeBaselineskip} as an alternative to \cs{fontsize} + \cs{selectfont} that avoids this issue (\S\ref{subsec:fontsize}).
@@ -285,7 +285,6 @@ For example, \cs{SetFontSize*}\marg{1} and \cs{SetFontSize*}\marg{-1pt} increase
\KeepNextPar*
Scales the current font size and the current font baselineskip by a factor of \meta{fp expr}.
-\cs{ScaleFont} resembles the \cs{scalefont} command provided by the \pkg{scalefnt} package, except that it uses floating point calculations and clears the stretch and shrink components of the font baselineskip.
For example, if the current font size and font baselineskip are \qty{10}{pt} and \qty{12}{pt}, using \cs{ScaleFont}\marg{0.8} will reduce them proportionally to \qty{8}{pt} and \qty{9.6}{pt}.
\cs{SetFontSizeBaselineskip}\marg{\meta{dim expr}}\marg{\meta{skip expr}}
@@ -317,15 +316,16 @@ If the current font step is undefined (as explained for \cs{SetFontStep} in \S\r
The starred version \cs{PrintSampleText*} reverses the sizing order.
The \meta{text} can be changed via the optional argument, but cannot contain \cs{par} tokens.
The default \meta{text} is \enquote{The \texttt{fontscale} package: A user interface for setting document font sizes}.
+One useful way of printing example text is by using
+\cs{PrintSampleText}\oarg{\cs{PrintFontSizeCommand}:\textvisiblespace{}\cs{PrintFontParameters}}.
\cs{PrintFontSizeCommand}
\KeepNextPar*
-\cs{PrintFontSizeCommand} tests whether the current font size and font baselineskip match that of any font size command.
-If so, it prints the name of that font size command.
+\cs{PrintFontSizeCommand} tests whether the current font size and the current font baselineskip match the font size and font baselineskip of any font size command from \cs{tiny} to \cs{Huge}.
+If so, it prints the name of that font size command, including the backslash character.
If not, it instead prints \enquote{UNDEFINED\@}.
-One useful way of printing example text is by using
-\cs{PrintSampleText}\oarg{\cs{PrintFontSizeCommand}:\textvisiblespace{}\cs{PrintFontParameters}}.
+\vfill\pagebreak%manual
\subsection
{%
@@ -338,8 +338,12 @@ One useful way of printing example text is by using
\cs{fontscalesetup}\marg{\meta{keyval list}}
\KeepNextPar*
-Sets and processes the \pkg{fontscale} package keys and uses \cs{normalsize}.
+Sets and processes the \pkg{fontscale} package keys and then uses \cs{normalsize}.
\cs{fontscalesetup} can be applied mid\-/document or locally within the current \TeX{} group.
+
+\Key{reset}[initial, preamble]
+\KeepNextPar*
+
The key \Key{reset} is also available.
Its value must be either \texttt{initial} or \texttt{preamble}.
The key \Key{reset}[initial] or just \Key{reset} sets all the keys to their initial values.
@@ -351,7 +355,7 @@ The key \Key{reset}[preamble] sets all the keys to their values at the end of th
This section is relevant to \LaTeX3 programmers.
-The user commands \cs{SetFontStep}, \cs{SetFontScale}, \cs{SetFontSize}, \cs{ScaleFont}, and \cs{SetFontSizeBaselineskip} are set up to work with \cs{text_purify:n}.
+The document commands \cs{SetFontStep}, \cs{SetFontScale}, \cs{SetFontSize}, \cs{ScaleFont}, and \cs{SetFontSizeBaselineskip} are set up to work with \cs{text_purify:n}.
\cs{text_purify:n} will correctly remove these commands and their arguments.
This includes the starred versions \cs{SetFontStep*}, \cs{SetFontScale*}, and \cs{SetFontSize*}.
diff --git a/macros/latex/contrib/fontscale/fontscale.sty b/macros/latex/contrib/fontscale/fontscale.sty
index 7aa22fdd73..d032e49860 100644
--- a/macros/latex/contrib/fontscale/fontscale.sty
+++ b/macros/latex/contrib/fontscale/fontscale.sty
@@ -8,8 +8,8 @@
\NeedsTeXFormat{LaTeX2e}[2022-06-01]
\ProvidesExplPackage
{fontscale}
- {2024-04-21}
- {1.2.1}
+ {2024-05-17}
+ {1.3.0}
{A user interface for setting document font sizes}
% The 2023-10-10 l3kernel update added many 'e'-variants.
@@ -25,7 +25,9 @@
\msg_critical:nn { fontscale } { expl3-out-of-date }
}
-% SOME VARIABLES
+% This package does not require any other packages!
+
+% DECLARE FONT PARAMETER VARIABLES
\fp_const:Nn \c_fontscale_tiny_step_fp { -4 }
\fp_const:Nn \c_fontscale_scriptsize_step_fp { -3 }
@@ -40,41 +42,6 @@
\fp_const:Nn \c_fontscale_normalsize_scale_fp { 1 }
-\tl_const:Nn \c__fontscale_names_tl
- {
- {tiny} {scriptsize} {footnotesize} {small} {normalsize}
- {large} {Large} {LARGE} {huge} {Huge}
- }
-\tl_const:Nn \c__fontscale_names_other_tl
- {
- {tiny} {scriptsize} {footnotesize} {small}
- {large} {Large} {LARGE} {huge} {Huge}
- }
-
-\prop_new:N \l_fontscale_tiny_prop
-\prop_new:N \l_fontscale_scriptsize_prop
-\prop_new:N \l_fontscale_footnotesize_prop
-\prop_new:N \l_fontscale_small_prop
-\prop_new:N \l_fontscale_normalsize_prop
-\prop_new:N \l_fontscale_large_prop
-\prop_new:N \l_fontscale_Large_prop
-\prop_new:N \l_fontscale_LARGE_prop
-\prop_new:N \l_fontscale_huge_prop
-\prop_new:N \l_fontscale_Huge_prop
-
-\prop_put:Nnn \l_fontscale_tiny_prop { step } { -4 }
-\prop_put:Nnn \l_fontscale_scriptsize_prop { step } { -3 }
-\prop_put:Nnn \l_fontscale_footnotesize_prop { step } { -2 }
-\prop_put:Nnn \l_fontscale_small_prop { step } { -1 }
-\prop_put:Nnn \l_fontscale_normalsize_prop { step } { 0 }
-\prop_put:Nnn \l_fontscale_large_prop { step } { 1 }
-\prop_put:Nnn \l_fontscale_Large_prop { step } { 2 }
-\prop_put:Nnn \l_fontscale_LARGE_prop { step } { 3 }
-\prop_put:Nnn \l_fontscale_huge_prop { step } { 4 }
-\prop_put:Nnn \l_fontscale_Huge_prop { step } { 5 }
-
-\prop_put:Nnn \l_fontscale_normalsize_prop { scale } { 1 }
-
\fp_new:N \l_fontscale_tiny_scale_fp
\fp_new:N \l_fontscale_scriptsize_scale_fp
\fp_new:N \l_fontscale_footnotesize_scale_fp
@@ -107,21 +74,41 @@
\skip_new:N \l_fontscale_huge_baselineskip_skip
\skip_new:N \l_fontscale_Huge_baselineskip_skip
-\str_new:N \l__fontscale_typographic_scale_str
+\prop_new:N \l_fontscale_tiny_prop
+\prop_new:N \l_fontscale_scriptsize_prop
+\prop_new:N \l_fontscale_footnotesize_prop
+\prop_new:N \l_fontscale_small_prop
+\prop_new:N \l_fontscale_normalsize_prop
+\prop_new:N \l_fontscale_large_prop
+\prop_new:N \l_fontscale_Large_prop
+\prop_new:N \l_fontscale_LARGE_prop
+\prop_new:N \l_fontscale_huge_prop
+\prop_new:N \l_fontscale_Huge_prop
-% Used in floating point expressions for speed.
-\fp_new:N \l__fontscale_normalsize_size_fp
-\fp_new:N \l__fontscale_musical_notes_fp
+\prop_put:Nnn \l_fontscale_tiny_prop { step } { -4 }
+\prop_put:Nnn \l_fontscale_scriptsize_prop { step } { -3 }
+\prop_put:Nnn \l_fontscale_footnotesize_prop { step } { -2 }
+\prop_put:Nnn \l_fontscale_small_prop { step } { -1 }
+\prop_put:Nnn \l_fontscale_normalsize_prop { step } { 0 }
+\prop_put:Nnn \l_fontscale_large_prop { step } { 1 }
+\prop_put:Nnn \l_fontscale_Large_prop { step } { 2 }
+\prop_put:Nnn \l_fontscale_LARGE_prop { step } { 3 }
+\prop_put:Nnn \l_fontscale_huge_prop { step } { 4 }
+\prop_put:Nnn \l_fontscale_Huge_prop { step } { 5 }
-% Temporary variables
-\tl_new:N \l__fontscale_step_tl
-\tl_new:N \l__fontscale_scale_tl
-\dim_new:N \l__fontscale_size_dim
-\skip_new:N \l__fontscale_baselineskip_skip
+\prop_put:Nnn \l_fontscale_normalsize_prop { scale } { 1 }
-% INITIAL FONT PARAMETERS
+% INITIALIZE FONT PARAMETER VARIABLES
-\fp_set:Nn \l__fontscale_normalsize_size_fp { 10 }
+\fp_set:Nn \l_fontscale_tiny_scale_fp { 0.6 }
+\fp_set:Nn \l_fontscale_scriptsize_scale_fp { 0.7 }
+\fp_set:Nn \l_fontscale_footnotesize_scale_fp { 0.8 }
+\fp_set:Nn \l_fontscale_small_scale_fp { 0.9 }
+\fp_set:Nn \l_fontscale_large_scale_fp { 1.1 }
+\fp_set:Nn \l_fontscale_Large_scale_fp { 1.2 }
+\fp_set:Nn \l_fontscale_LARGE_scale_fp { 1.4 }
+\fp_set:Nn \l_fontscale_huge_scale_fp { 1.6 }
+\fp_set:Nn \l_fontscale_Huge_scale_fp { 1.8 }
\dim_set:Nn \l_fontscale_tiny_size_dim { 6pt }
\dim_set:Nn \l_fontscale_scriptsize_size_dim { 7pt }
@@ -134,16 +121,6 @@
\dim_set:Nn \l_fontscale_huge_size_dim { 16pt }
\dim_set:Nn \l_fontscale_Huge_size_dim { 18pt }
-\fp_set:Nn \l_fontscale_tiny_scale_fp { 0.6 }
-\fp_set:Nn \l_fontscale_scriptsize_scale_fp { 0.7 }
-\fp_set:Nn \l_fontscale_footnotesize_scale_fp { 0.8 }
-\fp_set:Nn \l_fontscale_small_scale_fp { 0.9 }
-\fp_set:Nn \l_fontscale_large_scale_fp { 1.1 }
-\fp_set:Nn \l_fontscale_Large_scale_fp { 1.2 }
-\fp_set:Nn \l_fontscale_LARGE_scale_fp { 1.4 }
-\fp_set:Nn \l_fontscale_huge_scale_fp { 1.6 }
-\fp_set:Nn \l_fontscale_Huge_scale_fp { 1.8 }
-
\skip_set:Nn \l_fontscale_tiny_baselineskip_skip { 7.2pt }
\skip_set:Nn \l_fontscale_scriptsize_baselineskip_skip { 8.4pt }
\skip_set:Nn \l_fontscale_footnotesize_baselineskip_skip { 9.6pt }
@@ -187,21 +164,87 @@
\prop_put:Nnn \l_fontscale_huge_prop { baselineskip } { 19.2pt }
\prop_put:Nnn \l_fontscale_Huge_prop { baselineskip } { 21.6pt }
+% SOME VARIABLES
+
+% Used for mapping.
+\tl_const:Nn \c__fontscale_names_tl
+ {
+ {tiny} {scriptsize} {footnotesize} {small} {normalsize}
+ {large} {Large} {LARGE} {huge} {Huge}
+ }
+\tl_const:Nn \c__fontscale_names_other_tl
+ {
+ {tiny} {scriptsize} {footnotesize} {small}
+ {large} {Large} {LARGE} {huge} {Huge}
+ }
+
+% Used to speed up floating point calculations.
+\fp_new:N \l__fontscale_normalsize_size_fp
+\fp_set:Nn \l__fontscale_normalsize_size_fp { 10 }
+\fp_new:N \l__fontscale_musical_notes_fp
+
+% Temporary variables
+\tl_new:N \l__fontscale_step_tl
+\tl_new:N \l__fontscale_scale_tl
+\dim_new:N \l__fontscale_size_dim
+
% SOME HELPER FUNCTIONS
-% Sets a dimen or skip variable, supplying a default unit of pt.
-\cs_new_protected:Npn \__fontscale_dim_set_with_default_unit:Nn #1#2
+% Sets a dimen/skip variable from a dimen/skip expression, supplying a default
+% unit of pt.
+\cs_new_protected:Npn \__fontscale_dim_set_with_default_pt:Nn #1#2
{ \@defaultunits #1 = \dimexpr #2 pt \relax \relax \@nnil }
-\cs_generate_variant:Nn \__fontscale_dim_set_with_default_unit:Nn { c }
-\cs_new_protected:Npn \__fontscale_skip_set_with_default_unit:Nn #1#2
+\cs_generate_variant:Nn \__fontscale_dim_set_with_default_pt:Nn { c }
+\cs_new_protected:Npn \__fontscale_skip_set_with_default_pt:Nn #1#2
{ \@defaultunits #1 = \glueexpr #2 pt \relax \@nnil }
-\cs_generate_variant:Nn \__fontscale_skip_set_with_default_unit:Nn { c }
+\cs_generate_variant:Nn \__fontscale_skip_set_with_default_pt:Nn { c }
+% Used to define \tiny to \Huge. Need \dim_use:N for compatibility with the
+% microtype package. Otherwise the following would do:
+% \cs_new_protected:Npn \__fontscale_fontsize:NNN { \@setfontsize }
+\cs_new_protected:Npn \__fontscale_fontsize:NNN #1#2
+ { \@setfontsize #1 { \dim_use:N #2 } }
+% Similar to \fontsize + \selectfont, except that it takes dimen and skip
+% expressions as arguments and avoids the issue where \f@size is set to the new
+% font size before the second argument is expanded.
+\skip_new:N \l__fontscale_fontsize_skip
+\cs_new_protected:Npn \__fontscale_fontsize:nn #1#2
+ {
+ \__fontscale_skip_set_with_default_pt:Nn \l__fontscale_fontsize_skip {#2}
+ \fontsize { = \dimexpr #1 pt \relax \relax } \l__fontscale_fontsize_skip
+ \selectfont
+ }
+% Similar to the above function, except that it sets the font baselineskip
+% equal to the new font size times the baselineskip-size-ratio.
+\cs_new_protected:Npn \__fontscale_fontsize:n #1
+ {
+ \fontsize { = \dimexpr #1 pt \relax \relax }
+ { \fp_to_dim:n { \f@size * \l__fontscale_baselineskip_size_ratio_fp } }
+ \selectfont
+ }
% MESSAGES
+\msg_new:nnn { fontscale } { modular-ratio-out-of-bounds }
+ {
+ The~ value~ for~ the~ key~ 'modular / ratio'~
+ \msg_line_context: \c_space_tl
+ must~ be~ greater~ than~ 1.
+ }
+\msg_new:nnn { fontscale } { musical-ratio-out-of-bounds }
+ {
+ The~ value~ for~ the~ key~ 'musical / ratio'~
+ \msg_line_context: \c_space_tl
+ must~ be~ greater~ than~ 1.
+ }
+\msg_new:nnn { fontscale } { musical-notes-out-of-bounds }
+ {
+ The~ value~ for~ the~ key~ 'musical / notes'~
+ \msg_line_context: \c_space_tl
+ must~ be~ a~ positive~ integer.
+ }
\msg_new:nnn { fontscale } { key-font-scale-ignored }
{
- Key~ #1 / scale~
+ Key~ '#1 / scale'~
\msg_line_context: \c_space_tl
ignored.~
Setting~ the~ scale~ and~ size~ keys~ for~ the~ same~
@@ -213,7 +256,8 @@
\msg_line_context: \c_space_tl
are~ not~ in~ the~ correct~ order.~
The~ magnitude~ of~ the~ font~ sizes~ should~ be~ ordered~ from~
- \iow_char:N \\tiny~ to~ \iow_char:N \\normalsize~ to~ \iow_char:N \\Huge .
+ '\iow_char:N \\tiny'~ to~ '\iow_char:N \\normalsize'~ to~
+ '\iow_char:N \\Huge'.
}
\msg_new:nnn { fontscale } { font-baselineskips-out-of-order }
{
@@ -221,18 +265,20 @@
\msg_line_context: \c_space_tl
are~ not~ in~ the~ correct~ order.~
The~ magnitude~ of~ the~ font~ baselineskips~ should~ be~ ordered~ from~
- \iow_char:N \\tiny~ to~ \iow_char:N \\normalsize~ to~ \iow_char:N \\Huge .
+ '\iow_char:N \\tiny'~ to~ '\iow_char:N \\normalsize'~ to~
+ '\iow_char:N \\Huge'.
}
\msg_new:nnn { fontscale } { font-step-out-of-bounds }
{
The~ font~ step~
\msg_line_context: \c_space_tl
must~ be~ an~ integer~ from~ -4~ to~ 5,~
- unless~ the~ choice~ of~ typographic~ scale~ is~ modular~ or~ musical.
+ unless~ the~ value~ for~ the~ choice~ key~ 'typographic-scale'~
+ is~ 'modular'~ or~ 'musical'.
}
\msg_new:nnn { fontscale } { current-font-step-out-of-bounds }
{
- \iow_char:N \\SetFontStep*~
+ '\iow_char:N \\SetFontStep*'~
\msg_line_context: \c_space_tl
could~ not~ calculate~ the~ new~ font~ step~ because~
the~ current~ font~ step~ is~ undefined.
@@ -240,6 +286,8 @@
% DEFINE KEYS
+\str_new:N \l__fontscale_typographic_scale_str
+
\keys_define:nn { fontscale }
{
reset .choices:nn = { initial , preamble }
@@ -437,8 +485,8 @@
% PRE-COMPILE KEYS
-% Pre-compiles the keys with their initial values. The keys are pre-compiled
-% by hand for speed.
+% Pre-compiles the keys with their initial values and then sets the keys to
+% their initial values. This is done by hand for speed.
\cs_new_protected:Npn \__fontscale_keys_precompile_initial:
{
\bool_set_false:N \l__fontscale_ignore_order_bool
@@ -484,7 +532,8 @@
% Pre-compiles the keys with their values at the end of the preamble. The keys
% are pre-compiled by hand for speed.
-\cs_new_eq:NN \__fontscale_keys_precompile_preamble: \prg_do_nothing
+\cs_new_eq:NN \__fontscale_keys_precompile_preamble: \prg_do_nothing:
+% \AddToHook is passed only a single token for speed.
\AddToHook { begindocument / before }
{ \__fontscale_keys_precompile_preamble_set: }
\cs_new_protected:Npn \__fontscale_keys_precompile_preamble_set:
@@ -506,65 +555,65 @@
{ \int_use:N \l__fontscale_musical_notes_int }
\tl_set:Nn \exp_not:N \l__fontscale_tiny_scale_tl
- { \exp_not:o \l__fontscale_tiny_scale_tl }
+ { \exp_not:V \l__fontscale_tiny_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_scriptsize_scale_tl
- { \exp_not:o \l__fontscale_scriptsize_scale_tl }
+ { \exp_not:V \l__fontscale_scriptsize_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_footnotesize_scale_tl
- { \exp_not:o \l__fontscale_footnotesize_scale_tl }
+ { \exp_not:V \l__fontscale_footnotesize_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_small_scale_tl
- { \exp_not:o \l__fontscale_small_scale_tl }
+ { \exp_not:V \l__fontscale_small_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_large_scale_tl
- { \exp_not:o \l__fontscale_large_scale_tl }
+ { \exp_not:V \l__fontscale_large_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_Large_scale_tl
- { \exp_not:o \l__fontscale_Large_scale_tl }
+ { \exp_not:V \l__fontscale_Large_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_LARGE_scale_tl
- { \exp_not:o \l__fontscale_LARGE_scale_tl }
+ { \exp_not:V \l__fontscale_LARGE_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_huge_scale_tl
- { \exp_not:o \l__fontscale_huge_scale_tl }
+ { \exp_not:V \l__fontscale_huge_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_Huge_scale_tl
- { \exp_not:o \l__fontscale_Huge_scale_tl }
+ { \exp_not:V \l__fontscale_Huge_scale_tl }
\tl_set:Nn \exp_not:N \l__fontscale_tiny_size_tl
- { \exp_not:o \l__fontscale_tiny_size_tl }
+ { \exp_not:V \l__fontscale_tiny_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_scriptsize_size_tl
- { \exp_not:o \l__fontscale_scriptsize_size_tl }
+ { \exp_not:V \l__fontscale_scriptsize_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_footnotesize_size_tl
- { \exp_not:o \l__fontscale_footnotesize_size_tl }
+ { \exp_not:V \l__fontscale_footnotesize_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_small_size_tl
- { \exp_not:o \l__fontscale_small_size_tl }
+ { \exp_not:V \l__fontscale_small_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_normalsize_size_tl
- { \exp_not:o \l__fontscale_normalsize_size_tl }
+ { \exp_not:V \l__fontscale_normalsize_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_large_size_tl
- { \exp_not:o \l__fontscale_large_size_tl }
+ { \exp_not:V \l__fontscale_large_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_Large_size_tl
- { \exp_not:o \l__fontscale_Large_size_tl }
+ { \exp_not:V \l__fontscale_Large_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_LARGE_size_tl
- { \exp_not:o \l__fontscale_LARGE_size_tl }
+ { \exp_not:V \l__fontscale_LARGE_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_huge_size_tl
- { \exp_not:o \l__fontscale_huge_size_tl }
+ { \exp_not:V \l__fontscale_huge_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_Huge_size_tl
- { \exp_not:o \l__fontscale_Huge_size_tl }
+ { \exp_not:V \l__fontscale_Huge_size_tl }
\tl_set:Nn \exp_not:N \l__fontscale_tiny_baselineskip_tl
- { \exp_not:o \l__fontscale_tiny_baselineskip_tl }
+ { \exp_not:V \l__fontscale_tiny_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_scriptsize_baselineskip_tl
- { \exp_not:o \l__fontscale_scriptsize_baselineskip_tl }
+ { \exp_not:V \l__fontscale_scriptsize_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_footnotesize_baselineskip_tl
- { \exp_not:o \l__fontscale_footnotesize_baselineskip_tl }
+ { \exp_not:V \l__fontscale_footnotesize_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_small_baselineskip_tl
- { \exp_not:o \l__fontscale_small_baselineskip_tl }
+ { \exp_not:V \l__fontscale_small_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_normalsize_baselineskip_tl
- { \exp_not:o \l__fontscale_normalsize_baselineskip_tl }
+ { \exp_not:V \l__fontscale_normalsize_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_large_baselineskip_tl
- { \exp_not:o \l__fontscale_large_baselineskip_tl }
+ { \exp_not:V \l__fontscale_large_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_Large_baselineskip_tl
- { \exp_not:o \l__fontscale_Large_baselineskip_tl }
+ { \exp_not:V \l__fontscale_Large_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_LARGE_baselineskip_tl
- { \exp_not:o \l__fontscale_LARGE_baselineskip_tl }
+ { \exp_not:V \l__fontscale_LARGE_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_huge_baselineskip_tl
- { \exp_not:o \l__fontscale_huge_baselineskip_tl }
+ { \exp_not:V \l__fontscale_huge_baselineskip_tl }
\tl_set:Nn \exp_not:N \l__fontscale_Huge_baselineskip_tl
- { \exp_not:o \l__fontscale_Huge_baselineskip_tl }
+ { \exp_not:V \l__fontscale_Huge_baselineskip_tl }
}
}
@@ -575,35 +624,59 @@
{
\keys_set:nn { fontscale } {#1}
\__fontscale_keys_process:
+ \normalsize
+ \prg_break:
+ \prg_break_point:
}
\cs_new_protected:Npn \__fontscale_keys_process:
{
+ \__fontscale_keys_process_check_modular_musical:
\__fontscale_keys_process_normalsize:
\__fontscale_keys_process_other:
- \__fontscale_keys_process_props:
\__fontscale_keys_process_check_order:
}
-% Sets the size and baselineskip of \normalsize and uses \normalsize.
+% Issues an error if the key 'modular/ratio', 'musical/ratio', or
+% 'musical/notes' is set to an impossible value.
+\cs_new_protected:Npn \__fontscale_keys_process_check_modular_musical:
+ {
+ \fp_compare:nNnF \l__fontscale_modular_ratio_fp > \c_one_fp
+ {
+ \msg_error:nn { fontscale } { modular-ratio-out-of-bounds }
+ \prg_break:
+ }
+ \fp_compare:nNnF \l__fontscale_musical_ratio_fp > \c_one_fp
+ {
+ \msg_error:nn { fontscale } { musical-ratio-out-of-bounds }
+ \prg_break:
+ }
+ \int_compare:nNnF \l__fontscale_musical_notes_int > 0
+ {
+ \msg_error:nn { fontscale } { musical-notes-out-of-bounds }
+ \prg_break:
+ }
+ }
+% Sets the size and baselineskip of \normalsize and updates their property list
+% entries.
\cs_new_protected:Npn \__fontscale_keys_process_normalsize:
{
\quark_if_no_value:NTF \l__fontscale_normalsize_size_tl
{
\dim_set:Nn \l_fontscale_normalsize_size_dim
{
- \str_case:on \l__fontscale_typographic_scale_str
+ \str_case:VnF \l__fontscale_typographic_scale_str
{
- { classic-10pt } { 10pt }
{ classic-11pt } { 11pt }
{ classic-12pt } { 12pt }
- { modular } { 10pt }
- { musical } { 10pt }
}
+ { 10pt }
}
}
{
- \__fontscale_dim_set_with_default_unit:Nn
+ \__fontscale_dim_set_with_default_pt:Nn
\l_fontscale_normalsize_size_dim { \l__fontscale_normalsize_size_tl }
}
+ \prop_put:NnV \l_fontscale_normalsize_prop { size }
+ \l_fontscale_normalsize_size_dim
\fp_set:Nn \l__fontscale_normalsize_size_fp
{ \l_fontscale_normalsize_size_dim }
\quark_if_no_value:NTF \l__fontscale_normalsize_baselineskip_tl
@@ -618,14 +691,14 @@
}
}
{
- \__fontscale_skip_set_with_default_unit:Nn
+ \__fontscale_skip_set_with_default_pt:Nn
\l_fontscale_normalsize_baselineskip_skip
{ \l__fontscale_normalsize_baselineskip_tl }
}
- \normalsize
+ \prop_put:NnV \l_fontscale_normalsize_prop { baselineskip }
+ \l_fontscale_normalsize_baselineskip_skip
}
-% Sets the size, scale, and baselineskip of the other font size commands.
-% Issues a warning if the user sets both the scale and size keys for the same
+% Auxiliary functions that expand to the font size depending on the name of the
% font size command.
\cs_new:Npn \__fontscale_keys_process_other_classic_xpt:n #1
{
@@ -689,37 +762,26 @@
/ \l__fontscale_musical_notes_fp )
}
}
+% Sets the size, scale, and baselineskip of the other font size commands and
+% updates their property list entries. Issues a warning if the user sets both
+% the scale and size keys for the same font size command.
\cs_new_protected:Npn \__fontscale_keys_process_other:
{
- \str_case:on \l__fontscale_typographic_scale_str
+ \cs_set_eq:Nc \__fontscale_keys_process_other_typographic_scale:n
{
- { classic-10pt }
- {
- \cs_set_eq:NN \__fontscale_keys_process_other_typographic_scale:n
- \__fontscale_keys_process_other_classic_xpt:n
- }
- { classic-11pt }
- {
- \cs_set_eq:NN \__fontscale_keys_process_other_typographic_scale:n
- \__fontscale_keys_process_other_classic_xipt:n
- }
- { classic-12pt }
- {
- \cs_set_eq:NN \__fontscale_keys_process_other_typographic_scale:n
- \__fontscale_keys_process_other_classic_xiipt:n
- }
- { modular }
- {
- \cs_set_eq:NN \__fontscale_keys_process_other_typographic_scale:n
- \__fontscale_keys_process_other_modular:n
- }
- { musical }
- {
- \cs_set_eq:NN \__fontscale_keys_process_other_typographic_scale:n
- \__fontscale_keys_process_other_musical:n
- \fp_set:Nn \l__fontscale_musical_notes_fp
- { \l__fontscale_musical_notes_int }
- }
+ \str_case:Vn \l__fontscale_typographic_scale_str
+ {
+ { classic-10pt } { __fontscale_keys_process_other_classic_xpt:n }
+ { classic-11pt } { __fontscale_keys_process_other_classic_xipt:n }
+ { classic-12pt } { __fontscale_keys_process_other_classic_xiipt:n }
+ { modular } { __fontscale_keys_process_other_modular:n }
+ { musical } { __fontscale_keys_process_other_musical:n }
+ }
+ }
+ \str_if_eq:VnT \l__fontscale_typographic_scale_str { musical }
+ {
+ \fp_set:Nn \l__fontscale_musical_notes_fp
+ { \l__fontscale_musical_notes_int }
}
\tl_map_function:NN \c__fontscale_names_other_tl
\__fontscale_keys_process_other_aux:n
@@ -728,7 +790,7 @@
{
\quark_if_no_value:cF { l__fontscale_#1_size_tl }
{
- \__fontscale_dim_set_with_default_unit:cn { l_fontscale_#1_size_dim }
+ \__fontscale_dim_set_with_default_pt:cn { l_fontscale_#1_size_dim }
{ \use:c { l__fontscale_#1_size_tl } }
\quark_if_no_value:cF { l__fontscale_#1_scale_tl }
{ \msg_warning:nnn { fontscale } { key-font-scale-ignored } {#1} }
@@ -752,6 +814,9 @@
\prg_break_point:
\fp_set:cn { l_fontscale_#1_scale_fp }
{ \use:c { l_fontscale_#1_size_dim } / \l__fontscale_normalsize_size_fp }
+ \prop_put:cne { l_fontscale_#1_prop } { scale }
+ { \fp_use:c { l_fontscale_#1_scale_fp } }
+ \prop_put:cnv { l_fontscale_#1_prop } { size } { l_fontscale_#1_size_dim }
\quark_if_no_value:cTF { l__fontscale_#1_baselineskip_tl }
{
\skip_set:cn { l_fontscale_#1_baselineskip_skip }
@@ -764,78 +829,16 @@
}
}
{
- \__fontscale_skip_set_with_default_unit:cn
+ \__fontscale_skip_set_with_default_pt:cn
{ l_fontscale_#1_baselineskip_skip }
{ \use:c { l__fontscale_#1_baselineskip_tl } }
}
+ \prop_put:cnv { l_fontscale_#1_prop } { baselineskip }
+ { l_fontscale_#1_baselineskip_skip }
}
-% Puts the scale, size, and baselineskip of each font size command in
-% property lists, except the scale of \normalsize.
-\cs_new_protected:Npn \__fontscale_keys_process_props:
- {
- \prop_put:Nne \l_fontscale_tiny_prop { scale }
- { \fp_use:N \l_fontscale_tiny_scale_fp }
- \prop_put:Nne \l_fontscale_scriptsize_prop { scale }
- { \fp_use:N \l_fontscale_scriptsize_scale_fp }
- \prop_put:Nne \l_fontscale_footnotesize_prop { scale }
- { \fp_use:N \l_fontscale_footnotesize_scale_fp }
- \prop_put:Nne \l_fontscale_small_prop { scale }
- { \fp_use:N \l_fontscale_small_scale_fp }
- \prop_put:Nne \l_fontscale_large_prop { scale }
- { \fp_use:N \l_fontscale_large_scale_fp }
- \prop_put:Nne \l_fontscale_Large_prop { scale }
- { \fp_use:N \l_fontscale_Large_scale_fp }
- \prop_put:Nne \l_fontscale_LARGE_prop { scale }
- { \fp_use:N \l_fontscale_LARGE_scale_fp }
- \prop_put:Nne \l_fontscale_huge_prop { scale }
- { \fp_use:N \l_fontscale_huge_scale_fp }
- \prop_put:Nne \l_fontscale_Huge_prop { scale }
- { \fp_use:N \l_fontscale_Huge_scale_fp }
-
- \prop_put:Nno \l_fontscale_tiny_prop { size }
- { \dim_use:N \l_fontscale_tiny_size_dim }
- \prop_put:Nno \l_fontscale_scriptsize_prop { size }
- { \dim_use:N \l_fontscale_scriptsize_size_dim }
- \prop_put:Nno \l_fontscale_footnotesize_prop { size }
- { \dim_use:N \l_fontscale_footnotesize_size_dim }
- \prop_put:Nno \l_fontscale_small_prop { size }
- { \dim_use:N \l_fontscale_small_size_dim }
- \prop_put:Nno \l_fontscale_normalsize_prop { size }
- { \dim_use:N \l_fontscale_normalsize_size_dim }
- \prop_put:Nno \l_fontscale_large_prop { size }
- { \dim_use:N \l_fontscale_large_size_dim }
- \prop_put:Nno \l_fontscale_Large_prop { size }
- { \dim_use:N \l_fontscale_Large_size_dim }
- \prop_put:Nno \l_fontscale_LARGE_prop { size }
- { \dim_use:N \l_fontscale_LARGE_size_dim }
- \prop_put:Nno \l_fontscale_huge_prop { size }
- { \dim_use:N \l_fontscale_huge_size_dim }
- \prop_put:Nno \l_fontscale_Huge_prop { size }
- { \dim_use:N \l_fontscale_Huge_size_dim }
-
- \prop_put:Nno \l_fontscale_tiny_prop { baselineskip }
- { \skip_use:N \l_fontscale_tiny_baselineskip_skip }
- \prop_put:Nno \l_fontscale_scriptsize_prop { baselineskip }
- { \skip_use:N \l_fontscale_scriptsize_baselineskip_skip }
- \prop_put:Nno \l_fontscale_footnotesize_prop { baselineskip }
- { \skip_use:N \l_fontscale_footnotesize_baselineskip_skip }
- \prop_put:Nno \l_fontscale_small_prop { baselineskip }
- { \skip_use:N \l_fontscale_small_baselineskip_skip }
- \prop_put:Nno \l_fontscale_normalsize_prop { baselineskip }
- { \skip_use:N \l_fontscale_normalsize_baselineskip_skip }
- \prop_put:Nno \l_fontscale_large_prop { baselineskip }
- { \skip_use:N \l_fontscale_large_baselineskip_skip }
- \prop_put:Nno \l_fontscale_Large_prop { baselineskip }
- { \skip_use:N \l_fontscale_Large_baselineskip_skip }
- \prop_put:Nno \l_fontscale_LARGE_prop { baselineskip }
- { \skip_use:N \l_fontscale_LARGE_baselineskip_skip }
- \prop_put:Nno \l_fontscale_huge_prop { baselineskip }
- { \skip_use:N \l_fontscale_huge_baselineskip_skip }
- \prop_put:Nno \l_fontscale_Huge_prop { baselineskip }
- { \skip_use:N \l_fontscale_Huge_baselineskip_skip }
- }
-% Issues a warning if the font sizes or font baselineskips are not in the
-% correct order.
+% Issues a warning if the font sizes or font baselineskips (ignoring the
+% stretch and shrink components) are not in the correct order unless the value
+% for the key 'ignore-order' is 'true'.
\cs_new_protected:Npn \__fontscale_keys_process_check_order:
{
\bool_if:NF \l__fontscale_ignore_order_bool
@@ -876,66 +879,64 @@
% The internal functions of each font size command are not used elsewhere in
% the code for compatibility with user-defined hooks
% (e.g. \AddToHook{cmd/normalsize/after}{<user-defined-function>}).
-% Need \dim_use:N for compatibility with the microtype package.
\DeclareDocumentCommand \tiny { } { \__fontscale_tiny: }
\cs_new_protected:Npn \__fontscale_tiny:
{
- \@setfontsize \tiny { \dim_use:N \l_fontscale_tiny_size_dim }
+ \__fontscale_fontsize:NNN \tiny \l_fontscale_tiny_size_dim
\l_fontscale_tiny_baselineskip_skip
}
\DeclareDocumentCommand \scriptsize { } { \__fontscale_scriptsize: }
\cs_new_protected:Npn \__fontscale_scriptsize:
{
- \@setfontsize \scriptsize { \dim_use:N \l_fontscale_scriptsize_size_dim }
+ \__fontscale_fontsize:NNN \scriptsize \l_fontscale_scriptsize_size_dim
\l_fontscale_scriptsize_baselineskip_skip
}
\DeclareDocumentCommand \footnotesize { } { \__fontscale_footnotesize: }
\cs_new_protected:Npn \__fontscale_footnotesize:
{
- \@setfontsize \footnotesize
- { \dim_use:N \l_fontscale_footnotesize_size_dim }
+ \__fontscale_fontsize:NNN \footnotesize \l_fontscale_footnotesize_size_dim
\l_fontscale_footnotesize_baselineskip_skip
}
\DeclareDocumentCommand \small { } { \__fontscale_small: }
\cs_new_protected:Npn \__fontscale_small:
{
- \@setfontsize \small { \dim_use:N \l_fontscale_small_size_dim }
+ \__fontscale_fontsize:NNN \small \l_fontscale_small_size_dim
\l_fontscale_small_baselineskip_skip
}
\DeclareDocumentCommand \normalsize { } { \__fontscale_normalsize: }
\cs_new_protected:Npn \__fontscale_normalsize:
{
- \@setfontsize \normalsize { \dim_use:N \l_fontscale_normalsize_size_dim }
+ \__fontscale_fontsize:NNN \normalsize \l_fontscale_normalsize_size_dim
\l_fontscale_normalsize_baselineskip_skip
}
\DeclareDocumentCommand \large { } { \__fontscale_large: }
\cs_new_protected:Npn \__fontscale_large:
{
- \@setfontsize \large { \dim_use:N \l_fontscale_large_size_dim }
+ \__fontscale_fontsize:NNN \large \l_fontscale_large_size_dim
\l_fontscale_large_baselineskip_skip
}
\DeclareDocumentCommand \Large { } { \__fontscale_Large: }
\cs_new_protected:Npn \__fontscale_Large:
{
- \@setfontsize \Large { \dim_use:N \l_fontscale_Large_size_dim }
+ \__fontscale_fontsize:NNN \Large \l_fontscale_Large_size_dim
\l_fontscale_Large_baselineskip_skip
}
\DeclareDocumentCommand \LARGE { } { \__fontscale_LARGE: }
\cs_new_protected:Npn \__fontscale_LARGE:
{
- \@setfontsize \LARGE { \dim_use:N \l_fontscale_LARGE_size_dim }
+ \__fontscale_fontsize:NNN \LARGE \l_fontscale_LARGE_size_dim
\l_fontscale_LARGE_baselineskip_skip
}
\DeclareDocumentCommand \huge { } { \__fontscale_huge: }
\cs_new_protected:Npn \__fontscale_huge:
{
- \@setfontsize \huge { \dim_use:N \l_fontscale_huge_size_dim }
+ \__fontscale_fontsize:NNN \huge \l_fontscale_huge_size_dim
\l_fontscale_huge_baselineskip_skip
}
\DeclareDocumentCommand \Huge { } { \__fontscale_Huge: }
\cs_new_protected:Npn \__fontscale_Huge:
{
- \@setfontsize \Huge { \dim_use:N \l_fontscale_Huge_size_dim }
+ \__fontscale_fontsize:NNN \Huge \l_fontscale_Huge_size_dim
\l_fontscale_Huge_baselineskip_skip
}
% Initializes to \normalsize.
@@ -959,7 +960,7 @@
{ \l_fontscale_Huge_size_dim } { 5 }
}
{
- \str_case:on \l__fontscale_typographic_scale_str
+ \str_case:Vn \l__fontscale_typographic_scale_str
{
{ modular }
{
@@ -1001,6 +1002,8 @@
{ \__fontscale_add_font_step:n {#2} }
{ \__fontscale_set_font_step:n {#2} }
}
+% Using \str_case: here is significantly faster (and easier to write) than
+% repeatedly testing \fp_compare:.
\cs_new_protected:Npn \__fontscale_set_font_step:n #1
{
\str_case:enF { \fp_eval:n {#1} }
@@ -1017,11 +1020,11 @@
{ 5 } { \Huge }
}
{
- \str_case:onF \l__fontscale_typographic_scale_str
+ \str_case:VnF \l__fontscale_typographic_scale_str
{
{ modular }
{
- \fontsize
+ \__fontscale_fontsize:n
{
\fp_to_dim:n
{
@@ -1029,15 +1032,10 @@
* \l__fontscale_modular_ratio_fp ^ (#1)
}
}
- {
- \fp_to_dim:n
- { \f@size * \l__fontscale_baselineskip_size_ratio_fp }
- }
- \selectfont
}
{ musical }
{
- \fontsize
+ \__fontscale_fontsize:n
{
\fp_to_dim:n
{
@@ -1046,11 +1044,6 @@
^ ( (#1) / \l__fontscale_musical_notes_fp )
}
}
- {
- \fp_to_dim:n
- { \f@size * \l__fontscale_baselineskip_size_ratio_fp }
- }
- \selectfont
}
}
{ \msg_error:nn { fontscale } { font-step-out-of-bounds } }
@@ -1073,17 +1066,13 @@
}
\cs_new_protected:Npn \__fontscale_set_font_scale:n #1
{
- \fontsize
+ \__fontscale_fontsize:n
{ \fp_to_dim:n { \l__fontscale_normalsize_size_fp * (#1) } }
- { \fp_to_dim:n { \f@size * \l__fontscale_baselineskip_size_ratio_fp } }
- \selectfont
}
\cs_new_protected:Npn \__fontscale_add_font_scale:n #1
{
- \fontsize
+ \__fontscale_fontsize:n
{ \fp_to_dim:n { \l__fontscale_normalsize_size_fp * (#1) + \f@size } }
- { \fp_to_dim:n { \f@size * \l__fontscale_baselineskip_size_ratio_fp } }
- \selectfont
}
\NewDocumentCommand \SetFontSize { s m }
@@ -1092,41 +1081,27 @@
{ \__fontscale_add_font_size:n {#2} }
{ \__fontscale_set_font_size:n {#2} }
}
-\cs_new_protected:Npn \__fontscale_set_font_size:n #1
- {
- \__fontscale_dim_set_with_default_unit:Nn \l__fontscale_size_dim {#1}
- \fontsize \l__fontscale_size_dim
- { \fp_to_dim:n { \f@size * \l__fontscale_baselineskip_size_ratio_fp } }
- \selectfont
- }
+\cs_new_eq:NN \__fontscale_set_font_size:n \__fontscale_fontsize:n
\cs_new_protected:Npn \__fontscale_add_font_size:n #1
{
- \__fontscale_dim_set_with_default_unit:Nn \l__fontscale_size_dim {#1}
+ \__fontscale_dim_set_with_default_pt:Nn \l__fontscale_size_dim {#1}
\dim_add:Nn \l__fontscale_size_dim { \f@size pt }
- \fontsize \l__fontscale_size_dim
- { \fp_to_dim:n { \f@size * \l__fontscale_baselineskip_size_ratio_fp } }
- \selectfont
+ \__fontscale_fontsize:n { \l__fontscale_size_dim }
}
-\NewDocumentCommand \ScaleFont { m } { \__fontscale_scalefont:n {#1} }
-\cs_new_protected:Npn \__fontscale_scalefont:n #1
+\NewDocumentCommand \ScaleFont { m }
+ { \__fontscale_scale_font_size_baselineskip:n {#1} }
+\cs_new_protected:Npn \__fontscale_scale_font_size_baselineskip:n #1
{
- \fontsize
+ \__fontscale_fontsize:nn
{ \fp_to_dim:n { \f@size * (#1) } }
{ \fp_to_dim:n { \dim_to_fp:n { \f@baselineskip } * (#1) } }
- \selectfont
}
\NewDocumentCommand \SetFontSizeBaselineskip { m m }
{ \__fontscale_set_font_size_baselineskip:nn {#1} {#2} }
-\cs_new_protected:Npn \__fontscale_set_font_size_baselineskip:nn #1#2
- {
- \__fontscale_dim_set_with_default_unit:Nn \l__fontscale_size_dim {#1}
- \__fontscale_skip_set_with_default_unit:Nn \l__fontscale_baselineskip_skip
- {#2}
- \fontsize \l__fontscale_size_dim \l__fontscale_baselineskip_skip
- \selectfont
- }
+\cs_new_eq:NN \__fontscale_set_font_size_baselineskip:nn
+ \__fontscale_fontsize:nn
\NewDocumentCommand \PrintFontParameters { }
{ \__fontscale_print_font_parameters: }
@@ -1197,70 +1172,72 @@
\NewDocumentCommand \PrintFontSizeCommand { } { \__fontscale_print_name: }
\cs_new_protected:Npn \__fontscale_print_name:
{
- \dim_case:nnF { \f@size pt }
+ \dim_case:nn { \f@size pt }
{
{ \l_fontscale_tiny_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_tiny_baselineskip_skip }
- { \token_to_str:N \tiny } { UNDEFINED \@ }
+ { \token_to_str:N \tiny \prg_break: }
}
{ \l_fontscale_scriptsize_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_scriptsize_baselineskip_skip }
- { \token_to_str:N \scriptsize } { UNDEFINED \@ }
+ { \token_to_str:N \scriptsize \prg_break: }
}
{ \l_fontscale_footnotesize_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_footnotesize_baselineskip_skip }
- { \token_to_str:N \footnotesize } { UNDEFINED \@ }
+ { \token_to_str:N \footnotesize \prg_break: }
}
{ \l_fontscale_small_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_small_baselineskip_skip }
- { \token_to_str:N \small } { UNDEFINED \@ }
+ { \token_to_str:N \small \prg_break: }
}
{ \l_fontscale_normalsize_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_normalsize_baselineskip_skip }
- { \token_to_str:N \normalsize } { UNDEFINED \@ }
+ { \token_to_str:N \normalsize \prg_break: }
}
{ \l_fontscale_large_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_large_baselineskip_skip }
- { \token_to_str:N \large } { UNDEFINED \@ }
+ { \token_to_str:N \large \prg_break: }
}
{ \l_fontscale_Large_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_Large_baselineskip_skip }
- { \token_to_str:N \Large } { UNDEFINED \@ }
+ { \token_to_str:N \Large \prg_break: }
}
{ \l_fontscale_LARGE_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_LARGE_baselineskip_skip }
- { \token_to_str:N \LARGE \@ } { UNDEFINED \@ }
+ { \token_to_str:N \LARGE \@ \prg_break: }
}
{ \l_fontscale_huge_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_huge_baselineskip_skip }
- { \token_to_str:N \huge } { UNDEFINED \@ }
+ { \token_to_str:N \huge \prg_break: }
}
{ \l_fontscale_Huge_size_dim }
{
- \skip_if_eq:nnTF { \f@baselineskip }
+ \skip_if_eq:nnT { \f@baselineskip }
{ \l_fontscale_Huge_baselineskip_skip }
- { \token_to_str:N \Huge } { UNDEFINED \@ }
+ { \token_to_str:N \Huge \prg_break: }
}
}
- { UNDEFINED \@ }
+ UNDEFINED \@
+ \prg_break:
+ \prg_break_point:
}
% TEXT PURIFY
diff --git a/macros/latex/contrib/frenchmath/frenchmath.dtx b/macros/latex/contrib/frenchmath/frenchmath.dtx
index edd050c10a..4b042e9ef6 100644
--- a/macros/latex/contrib/frenchmath/frenchmath.dtx
+++ b/macros/latex/contrib/frenchmath/frenchmath.dtx
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{frenchmath}
- [2024/02/25 v2.10 .dtx Typesetting mathematics according to French rules]
+ [2024/05/07 v3.1 .dtx Typesetting mathematics according to French rules]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -28,26 +28,21 @@
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
-\usepackage[lgrmath]{frenchmath}
-\usepackage[Euler]{upgreek}
-\usepackage{textalpha}
+\usepackage[lgrmath,savegreeks,otherfonts]{frenchmath}
\usepackage{metalogo} % pour les logos XeLaTeX et LuaLaTeX
\usepackage{sectsty}
\usepackage{xcolor}
+%\usepackage{textalpha}
+\usepackage{tabls}
\definecolor{darkbrown}{rgb}{0.5,0.1,0.1}
\allsectionsfont{\color{darkbrown}}
-% pour les lettres de upgreek avec l'option Symbol :
-\DeclareSymbolFont{ugrfm}{U}{psy}{m}{n}
-\DeclareMathSymbol{\upalphasym}{\mathord}{ugrfm}{`a}
-\DeclareMathSymbol{\upbetasym}{\mathord}{ugrfm}{`b}
-\DeclareMathSymbol{\uppisym}{\mathord}{ugrfm}{`p}
-% symbole \emptyset de computer modern au cas où veut changer la police de ce doc :
-\DeclareSymbolFont{cmsymbols}{OMS}{cmsy}{m}{n}
-\DeclareMathSymbol{\cmemptyset}{\mathord}{cmsymbols}{'73} % code octal dans cmsy
+
+% symbole \emptyset de computer modern au cas où on change la police de ce doc :
+\def\CMemptyset{\mathord{\text{\usefont{OMS}{cmsy}{m}{n}\symbol{'73}}}}
% pour avoir le mu de micro :
\DeclareTextSymbol{\textmicro}{TS1}{181}
-\DeclareTextSymbolDefault{\textmicro}{TS1}
+%\DeclareTextSymbolDefault{\textmicro}{TS1}
\DisableCrossrefs
%\CodelineIndex
@@ -62,6 +57,7 @@
pdfauthor={Antoine Missier}
}
\begin{document}
+%\MakeShortVerb" % incompatible si placé avant
\DocInput{frenchmath.dtx}
%\PrintChanges
%\PrintIndex
@@ -69,7 +65,7 @@
%</driver>
% \fi
%
-% \CheckSum{594}
+% \CheckSum{322}
%
% \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
@@ -118,7 +114,7 @@
% - ajout des macros pour les bases (i,j) et (i,j,k).}
%
% \changes{v1.6}{2022/10/16}{
-% - Remplacement de icomma par ncccomma, grâce à une proposition de J. F. Burnol,
+% - Remplacement de icomma par ncccomma, grâce à un "patch" de J. F. Burnol,
% - amélioration du code redéfinissant les majuscules mathématiques,
% - suppression de l'option capsup (capsit à false suffit),
% - remplacement de tgh par th pour la tangente hyperbolique.}
@@ -182,17 +178,31 @@
% - compatibilité des options de lettres grecques avec unicode-math (XeLaTeX uniquement)
% -> nouvelles macros SaveGreekItalics et upgreekUndefined,
% - commentaires dans la doc pour la compatibilité avec unicode-math.}
-
+%
% \changes{v2.10}{22/02/2024}{
% - Changements dans la doc concernant la gestion des lettres grecques et unicode-math.}
%
+% \changes{v3.0}{04/03/2024}{
+% - Redéfinition de cmod qui correspond au pod de amsmath,
+% - Modification du chargement conditionnel de dotlessj,
+% - Copie du code de legslant, geqslant, varnothing sans importer amssymb,
+% - Utilisation de AtEndPreamble pour pouvoir charger frenchmath avant unicode-math,
+% - Ajout d'une table des matières.}
+% \changes{v3.0}{12/04/2024}{
+% - Développement et intégration de l'extension mathgreeks
+% - Mise à jour de la documentation}
+%
+% \changes{v3.1}{07/05/2024}{
+% - Correction de bug pour les macros varnothing et AMSvarnothing}
+%
% \GetFileInfo{frenchmath.sty}
%
% \title{L'extension \textsf{frenchmath}\thanks{Ce document
-% correspond à \textsf{frenchmath}~\fileversion, dernière modification le 25/02/2024.}}
+% correspond à \textsf{frenchmath}~\fileversion, dernière modification le 07/05/2024.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{25 février 2024}
+% \date{7 mai 2024}
% \maketitle
+% \tableofcontents
%
% \section{Introduction}
% Cette extension, inspirée à l'origine de \textsf{mafr} de Christian Obrecht~\cite{MAFR},
@@ -206,19 +216,20 @@
% \footnote{Contrairement à \textsf{mafr} nous avons choisi de ne pas
% conserver le même nom de commande pour substituer
% des symboles français aux symboles anglais.}.
-% Depuis la version 2.0, \textsf{frenchmath} propose en outre deux options permettant
+% Depuis la version 2.0, \textsf{frenchmath} propose en outre des options permettant
% de composer les minuscules grecques du mode mathématique en forme droite.
%
% \medskip
% D'autres solutions existent pour composer les majuscules mathématiques en romain,
% par exemple avec \XeLaTeX\ ou \LuaLaTeX\ et l'extension \textsf{unicode-math}~\cite{UNIC}.
-% Celle-ci peut être utilisée avec \textsf{frenchmath} à condition d'être chargée \emph{avant}.
% Pour pdf\LaTeX\, nous avons les extensions \textsf{fourier} de Michel Bovani~\cite{FOUR}
-% (avec la famille des fontes Adobe Utopia)
-% ou encore \textsf{mathdesign} de Paul Pichaureau~\cite{DESIGN}
-% (avec les polices Adobe Utopia, URW Garamond ou Bitstream Charter).
+% (avec la famille des fontes Adobe Utopia),
+% \textsf{mathdesign} de Paul Pichaureau~\cite{DESIGN}
+% (avec les polices Adobe Utopia, URW Garamond ou Bitstream Charter)
+% ou encore \textsf{kpfonts} de Christophe Caignaert~\cite{KPF}.
% Mais \textsf{frenchmath} fournit une solution générique
-% s'adaptant à n'importe quelle police de caractères.
+% s'adaptant à n'importe quelle police de caractères
+% (et compatible avec \textsf{unicode-math}).
%
% \medskip
% Certaines préconisations, telles que composer en lettre droite
@@ -250,10 +261,11 @@
% (cf. \cite{RTIN} p.107, voir aussi~\cite{IGEN}).
% En utilisant \XeLaTeX\ ou \LuaLaTeX,
% avec l'option \texttt{math-style=french} de l'extension \textsf{unicode-math},
-% cette convention est assez commode à mettre en œuvre,
-% y compris avec les polices TrueType ou OpenType ;
+% cette convention est commode à mettre en œuvre,
% par contre, avec \LaTeX\ ou pdf\LaTeX, elle est peu respectée
-% et les extensions précitées ne fonctionnent qu'avec des polices particulières.
+% et les extensions comme \textsf{mathdesign} (avec \texttt{uppercase=upright}),
+% \textsf{fourier} (avec \texttt{upright}) ou \textsf{kpfonts} (avec \texttt{uprightRoman})
+% ne fonctionnent qu'avec des polices particulières.
% Par défaut \textsf{frenchmath} compose automatiquement les majuscules
% mathématiques latines en romain,
% quelle que soit la police utilisée.
@@ -302,28 +314,30 @@
% (sans espace), sinon c'est un caractère de ponctuation.
% \end{itemize}
%
-% Cette deuxième approche parait meilleure, néanmoins \textsf{ncccomma}
+% Cette deuxième approche est plus souple, néanmoins \textsf{ncccomma}
% ne fonctionne pas avec \textsf{babel-french} utilisé conjointement avec
-% l'extension \textsf{numprint} et son option \texttt{autolanguage}
+% l'option \texttt{autolanguage}
% \footnote{L'option \texttt{autolanguage} de \textsf{numprint} utilisée
% conjointement avec l'option \texttt{french} de \textsf{babel} garantit un espacement
% correct entre les groupes de trois chiffres dans les grands nombres,
% qui doit être une espace insécable et non dilatable~\cite{RTIN},
-% légèrement plus grande que l'espace que l'on obtient sans cette option.}.
+% légèrement plus grande que l'espace que l'on obtient sans cette option.}
+% de l'extension \textsf{numprint}.
% En outre \textsf{ncccomma} ne fonctionne pas non plus
% avec l'extension \textsf{unicode-math} (et bugue à l'appel |\setmathfont|).
% Dans son article \emph{Intelligent commas}~\cite{BECC},
% Claudio Beccari propose une autre solution,
% voisine de \textsf{ncccomma}, mais qui produit le même type d'incompatibilités.
-% Le code a donc été revu et simplifié afin de régler proprement ces incompatibilités.
-% Comme bien des pays utilisent la virgule comme
+% Le code a donc été revu afin de régler ces incompatibilités.
+% Comme de nombreux pays utilisent la virgule comme
% séparateur décimal, il fait l'objet d'une extension séparée,
% \mbox{\textsf{decimalcomma}}~\cite{DECC}, qui est chargée par \textsf{frenchmath}
% (depuis la version 2.7).
-% Mais, si on utilise \textsf{unicode-math}, il est alors impératif de charger
-% \textsf{frenchmath} \emph{après}.
+% Bien que \textsf{decimalcomma} ne fonctionne avec \textsf{unicode-math}
+% que s'il est chargé après
% \footnote{L'extension \textsf{icomma} présente la même limitation et doit être chargée
-% après \textsf{unicode-math}.}.
+% après \textsf{unicode-math}.},
+% \textsf{frenchmath} s'est affranchi de cette contrainte (depuis la version 2.11).
%
% \medskip
% Lorsque l'on utilise l'extension \textsf{pstricks-add} de \textsf{PSTricks}
@@ -340,7 +354,7 @@
% avec \textsf{frenchmath} ;
% le comportement de \og ;\fg devient identique à celui de \og:\fg.
%
-% \medskip
+% \bigskip
% \DescribeMacro{crochets}
% Alors que les Anglais utilisent généralement les parenthèses
% pour les intervalles ouverts $(0, +\infty)$, l'usage en français est d'utiliser
@@ -349,7 +363,7 @@
% Nous avons redéfini les crochets dans l'extension \textsf{ibrackets}~\cite{BRACKETS}
% qui est chargée par \textsf{frenchmath},
% \DescribeMacro{[noibrackets]}
-% sauf si l'on active l'option \texttt{noibrackets}
+% sauf si on la désactive avec l'option \texttt{noibrackets}
% \footnote{D'autres solutions existent,
% par exemple avec l'extension \textsf{interval}
% ou encore avec la macro \texttt{\string\DeclarePairedDelimiter}
@@ -374,8 +388,8 @@
% et le signe}: par exemple |$x \in ] -\infty, 0]$| produit
% $x \in ] -\infty, 0]$ au lieu de $x \in ]-\infty, 0]$.
% Mais au contraire lorsque l'on veut faire de l'algèbre sur les intervalles,
-% \emph{il faut laisser une espace entre le second crochet et l'opération} + ou -,
-% par exemple, |$[a,b] + [c,d]$| produit $[a,b] + [c,d]$
+% \emph{il faut laisser une espace entre le second crochet et l'opération} + ou --,
+% par exemple, |$[a,b] +[c,d]$| donne $[a,b] +[c,d]$
% mais |$[a,b]+ [c,d]$| produit $[a,b]+ [c,d]$.
%
% En cas de comportement problématique, par exemple si
@@ -405,15 +419,23 @@
% \DescribeMacro{\infeg} \DescribeMacro{\supeg}
% Les relations $\infeg$ et $\supeg$ s'obtiennent avec les commandes |\infeg| et |\supeg|
% et diffèrent des versions anglaises de |\leq| ($\leq$) et |\geq| ($\geq$).
-% Ce sont des alias de |\leqslant| et |\geqslant| de l'extension \textsf{amssymb},
-% chargée par \textsf{frenchmath}.
+% Ce sont des alias de |\leqslant| et |\geqslant| de l'extension \textsf{amssymb}
+% (non chargée par \textsf{frenchmath}).
%
% \medskip
% \DescribeMacro{\vide}
% Le symbole de l'ensemble vide $\vide$
-% s'obtient avec |\vide| (alias de la commande |\varnothing| de l'extension \textsf{amssymb}) ;
+% s'obtient avec |\vide| (alias de la commande |\varnothing|
+% de l'extension \textsf{amssymb}) ;
% il diffère de celui obtenu avec |\emptyset|,
-% particulièrement laid dans la fonte classique Latin Modern : $\cmemptyset$.
+% particulièrement laid dans la fonte classique Latin Modern : $\CMemptyset$.
+%
+% \DescribeMacro{\AMSvarnothing}
+% Avec \textsf{unicode-math} et la fonte mathématique Latin Modern Math
+% (appelée avec |\setmathfont|), |\varnothing| produit le même glyphe
+% laid que |\emptyset|. Pour corriger cela, on dispose de la commande
+% |\AMSvarnothing|, qui doit être appelée dans le préambule
+% et permet d'obtenir le même glyphe que celui de \textsf{amssymb}.
%
% \medskip
% \DescribeMacro{\paral}
@@ -431,10 +453,10 @@
%
% \medskip
% \DescribeMacro{\cmod}
-% Le modulo se compose normalement entre parenthèses, avec |\pmod|,
-% mais on rencontre aussi, en français, le modulo entre crochets,
-% ce que permet la commande |\cmod| en respectant le bon espacement
-% propre au modulo : $ 53 \equiv 5 \cmod{12}$.
+% Le modulo se compose normalement entre parenthèses, avec |\pod| ou |\pmod|,
+% mais, en français, on le rencontre aussi entre crochets,
+% ce que permet la commande |\cmod|, en respectant le bon espacement
+% propre au modulo : $53 \equiv 5 \cmod{12}$.
%
% \subsection{Identifiants de \og fonctions\fg classiques}
%
@@ -492,8 +514,9 @@
% 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.
+% (utilisé dans le plan complexe).
+% \DescribeMacro{\Ouv}
+% Ces commandes peuvent être utilisées sans expliciter 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
@@ -503,9 +526,10 @@
% \medskip
% \DescribeMacro{\ij} \DescribeMacro{\ijk}
% Enfin les macros |\ij|
-% \footnote{Notons que la macro \texttt{\string\ij} existait déjà
-% (ligature entre i et j pour le hollandais) et a été redéfinie.}
-% et |\ijk| composent les bases du plan et de l'espace, \ij
+% \footnote{Notons que la macro \texttt{\string\ij} existe déjà
+% (ligature entre i et j pour le hollandais) ; elle a été redéfinie pour le mode
+% mathématique uniquement, qui doit donc ici être explicite : \texttt{\$\string\ij \$}.}
+% et |\ijk| composent les bases du plan et de l'espace, $\ij$
% et \ijk, en homogénéisant la hauteur des flèches.
%
% Signalons que, pour l'extension \textsf{mathptmx} (basée sur la police de texte Times),
@@ -514,8 +538,9 @@
% ce qui permet aux macros ci-dessus de fonctionner normalement.
%
% \subsection{Lettres grecques}
-% La norme concernant l'usage des lettres grecques en italique ou en forme droite
-% pour les mathématiques françaises ne semble pas aussi claire que pour les lettres romaines
+% Dans les mathématiques françaises, la norme concernant l'usage
+% des lettres grecques minuscules en italique ou en forme droite
+% ne semble pas aussi claire que pour les lettres romaines
% et il y a parfois divergence sur ce point.
% Beaucoup recommandent l'usage des lettres grecques
% minuscules en forme droite (\cite{FOUR}~\cite{DESIGN}~\cite{PMISO}), mais certains
@@ -538,29 +563,17 @@
% la documentation de \textsf{isomath} de Günter Milde~\cite{ISOM}
% expose différentes méthodes pour obtenir les lettres grecques
% en forme droite.
-% Par exemple les extensions \textsf{mathdesign}~\cite{DESIGN},
-% \textsf{fourier}~\cite{FOUR}
+% Par exemple les extensions \textsf{fourier}~\cite{FOUR}
+% \mbox{\textsf{mathdesign}}~\cite{DESIGN},
% ou \textsf{kpfonts}~\cite{KPF} disposent d'options permettant
% l'écriture automatique des lettres grecques minuscules en forme droite
-% (ou des majuscules en italique).
+% (et aussi des majuscules en italique) dans la police donnée.
% Citons également \textsf{newpxmath}, \textsf{newtxmath}
-% \footnote{L'extension \textsf{newtxmath} doit être chargée
-% après \textsf{frenchmath} qui utilise \textsf{amssymb} car la compilation
-% produit sinon un message d'erreur ;
-% ou sinon on peut ajouter \texttt{\string\let\string\Bbbk\string\relax}
-% avant de charger \textsf{frenchmath}.}
-% et \textsf{libertinust1math}
-% de Michael Sharpe,
+% et \textsf{libertinust1math} de Michael Sharpe ou
% \textsf{pxgreeks}, \textsf{txgreeks}
-% \footnote{Si on utilise \textsf{amsmath} (ou \textsf{mismath}),
-% \textsf{pxgreeks} ou \textsf{txgreeks} doit être chargée
-% \emph{après} \textsf{amsmath} (ou \textsf{mismath}),
-% pour éviter une erreur de compilation due à la redéfinition des commandes
-% \texttt{\string\iint}, \texttt{\string\iiint}, \texttt{\string\iiiint},
-% \texttt{\string\idotsint}.}
% et \textsf{libgreek} de Jean-François Burnol,
-% qui donnent de beaux résultats pour une utilisation avec
-% respectivement les polices Palatino, Times et Libertinus.
+% qui fournissent les formes droites avec
+% les polices Palatino, Times et Libertine respectivement.
%
% Jean-François Burnol a également développé l'extension \textsf{lgrmath}~\cite{LGR}
% qui permet d'utiliser, en mode mathématique, les différentes fontes de lettres
@@ -571,171 +584,207 @@
% \medskip
% Enfin, comme pour les majuscules, l'extension \textsf{unicode-math}
% réalise cette tâche automatiquement avec l'option \texttt{math-style=french},
-% mais nécessite une compilation avec \XeLaTeX\ ou \LuaLaTeX.
-%
-% \medskip
-% L'extension \textsf{frenchmath} fournit les options décrites ci-dessous
-% qui permettent d'obtenir les lettres grecques en forme droite.
-% Ces options peuvent être utilisées y compris avec \textsf{unicode-math},
-% mais \textsf{frenchmath} doit toujours être chargé
-% \emph{après} \textsf{unicode-math}.
+% mais nécessite une compilation \XeLaTeX\ ou \LuaLaTeX.
%
% \medskip
-% \DescribeEnv{[lgrmath]}
-% En activant l'option \texttt{lgrmath}, \textsf{frenchmath}
-% charge l'extension du même nom avec son option \texttt{style=french}
-% et la fonte \texttt{fcm} (de l'extension \textsf{cm-lgc})
-% \footnote{Évidemment il faut que \textsf{cm-lgc} soit installée
-% sur votre distribution sans quoi la fonte de substitution LGR/cmr/m/n sera utilisée.}.
-% Celle-ci se marie particulièrement bien avec la police usuelle Latin Modern.
-% Les commandes |\alpha|, |\beta|, etc.
-% produisent alors les lettres en forme droite
-% $\alphaup$, $\betaup$, \ldots, $\piup$, etc.,
-% tandis que |\alphait|, |\betait|, etc. produisent des formes italiques
-% $\alphait$, $\betait$, \ldots, $\piit$, etc.
-% Ces dernières sont peu à notre goût, mais on conserve les lettres
-% d'origine avec |\italpha|, |\itbeta| : $\italpha$, $\itbeta$, \ldots, $\itpi$, etc.
-%
-% \DescribeMacro{\SaveGreekItalics}
-% On peut aussi choisir d'autres fontes en chargeant l'extension
-% \textsf{lgrmath} indépendamment de \textsf{frenchmath}
-% (voir par exemple les options \texttt{font=Alegreya-LF} ou \texttt{font=Cochineal-LF}
-% de \textsf{lgrmath}).
-% Dans ce cas, il ne faut pas activer l'option \texttt{lgrmath} de \textsf{frenchmath}
-% et, si l'on veut conserver les lettres italiques d'origine,
-% il faut précéder le chargement
-% de \textsf{lgrmath} de la commande |\SaveGreekItalics| ;
-% avec \textsf{unicode-math}, il faut en outre placer cette commande
-% dans un |\AtBeginDocument| avec |\usepackage[style=french,font=...]{lgrmath}|
-% et \emph{après} le chargement de \textsf{unicode-math}.
+% Avant la version 3.0, \textsf{frenchmath} disposait de deux options pour composer
+% les lettres grecques en forme droite : \texttt{lgrmath} et \texttt{upgreek}
+% \footnote{En fait il y avait une troisième option, \texttt{Upgreek}, mais celle-ci
+% est désormais obsolète.}.
+% Inspiré par le travail de Jean-François Burnol, nous avons développé, et intégré
+% à \textsf{frenchmath}, l'extension \textsf{mathgreeks}~\cite{MGREEK}
+% qui permet d'utiliser de nombreuses fontes de lettres grecques
+% sans modifier les autres caractères et symboles.
+% Il suffit d'appeler \textsf{frenchmath} avec une des options de fonte de
+% \textsf{mathgreeks}, de la forme \texttt{clé=valeur}.
+% Par exemple, les lettres grecques droites de la police Utopia,
+% telles que fournies par l'extension \textsf{mathdesign}, s'obtiennent avec
+% \begin{center}
+% |\usepackage[mathdesign=Utopia]{frenchmath}|.
+% \end{center}
+% L'extension \textsf{mathdesign} elle-même ne sera pas chargée.
+% Lorsqu'une valeur n'est pas précisée, il y a toujours une valeur par défaut.
+% Par exemple pour \texttt{mathdesign}, nous avons choisi \texttt{Charter}.
+% Pour \texttt{upgreek}, la fonte par défaut est \texttt{Symbol}.
+% Pour \texttt{lgrmath}, nous avons choisi \texttt{fcm}
+% \footnote{Il faut que l'extension \textsf{cm-lgc} (développée par Alexej Kryukov)
+% soit installée sur votre distribution,
+% sans quoi la fonte de substitution LGR/lmr/m/n sera utilisée.
+% Les formes italiques du thêta $\ittheta$ ou du rho $\itrho$ de \texttt{fcm}
+% ne sont pas vraiment ceux d'usage en mathématiques, mais les formes droites
+% sont bien adaptées.
+% \texttt{Alegreya-LF} est une autre fonte assez élégante pour \texttt{lgrmath},
+% {\mathgreeksfont{enc=LGR,fam=Alegreya-LF,shape=n}\
+% mais produit un \texttt{\string \phi} $\phi$} moins courant et sans la variante
+% $\phi$.
+% }
+% qui se marie particulièrement bien avec la police usuelle Latin Modern.
+% Ainsi les options précédentes de \textsf{frenchmath} fonctionnent toujours.
+%
+% Les commandes |\alpha|, |\beta|, \ldots |\pi|, etc.
+% produisent alors les lettres en forme droite $\alpha$, $\beta$, \ldots, $\pi$, etc.
+% tandis que |\italpha|, |\itbeta|, \ldots, |\itpi|, etc. produisent les formes italiques
+% $\italpha$, $\itbeta$, \ldots, $\itpi$, etc.
+% Si ces dernières déplaisent, on peut activer l'option \texttt{savegreeks}
+% (option booléenne passée à \textsf{mathgreeks}) pour conserver les lettres
+% d'origine avec |\backalpha|, |\backbeta|, \ldots, |\backpi|, etc. :
+% $\backalpha$, $\backbeta$, \ldots, $\backpi$, etc.
%
% \medskip
-% \DescribeEnv{[upgreek]}
-% Avec la même philosophie, \textsf{frenchmath} fournit aussi l'option \texttt{upgreek}
-% basée sur l'extension \textsf{upgreek} de Walter Schmidt~\cite{UPGREEK} qui donne
-% accès à d'autres fontes de lettres grecques minuscules en forme droite avec
-% |\upalpha|, |\upbeta|, etc.
-% L'extension \textsf{upgreek} sera chargée avec son option \texttt{Symbol}
-% \footnote{L'option \texttt{Symbol} de \textsf{upgreek} se marie bien
-% avec une police comme Times par exemple.}
-% utilisant la police Adobe Symbol et qui produit des lettres grecques assez grasses :
-% $\upalphasym$, $\upbetasym$, \ldots, $\uppisym$, etc.
-%
-% Si l'on veut utiliser l'extension \textsf{upgreek}
-% avec l'une des deux autres options disponibles, \texttt{Euler}
-% (qui produit $\upalpha, \upbeta, \ldots, \uppi$, etc.)
-% ou \texttt{Symbolsmallscale},
-% il faut charger l'extension \textsf{upgreek} avec l'option souhaitée
-% indépendamment de \mbox{\textsf{frenchmath}}.
-% Par contre, pour que les commandes |\alpha|, |\beta|\ldots correspondent
-% aux formes droites (comme alias de |\upalpha|, |\upbeta|\ldots),
-% il faut ici conserver l'option \texttt{upgreek} de \textsf{frenchmath}.
-% Comme pour \textsf{lgrmath}, si l'on veut que les formes italiques d'origine
-% restent toujours disponibles avec les commandes
-% |\italpha|, |\itbeta|, etc.,
-% il faut précéder le chargement de l'extension \textsf{upgreek} de la commande
-% |\SaveGreekItalics| ;
-% \DescribeMacro{\upgreekUndefined}
-% et si l'on utilise \textsf{unicode-math}, il faut en outre ajouter la commande
-% |\upgreekUndefined| avant le |\usepackage[...]{upgreek}| et les trois
-% dans un |\AtBeginDocument| placé \emph{entre} le chargement de \textsf{unicode-math}
-% et celui de \textsf{frenchmath}
-% \footnote{Tout cela est bien contraignant, mais c'est lié au fonctionnement capricieux
-% de \textsf{unicode-math} qui génère de nombreuses incompatibilités. Ceci dit,
-% on n'a en principe besoin de nos options de lettres grecques droites que si l'on n'est
-% pas satisfait de celles fournies par \textsf{unicode-math}.}.
+% Nous présentons ci-après quelques unes des nombreuses options possibles.
+% On se référera à la documentation de \textsf{mathgreeks}~\cite{MGREEK}
+% pour d'autres exemples ou pour les formes italiques correspondantes.
+% La seconde ligne de chaque exemple contient, outre les majuscules,
+% des variantes obtenues avec |\varpepsilon|, |\vartheta|, etc.
+% (sans effet avec la clé \texttt{lgrmath}, excepté pour |\varsigma|).
+% Les clés sans valeur sont en fait des booléens dont la valeur par défaut est \texttt{true}.
%
% \medskip
-% \DescribeEnv{[Upgreek]}
-% Avec \LaTeX, les lettres grecques majuscules sont automatiquement composées
-% en forme droite et l'option \texttt{upgreek} ne concerne que les minuscules.
-% Cependant l'extension \textsf{upgreek}
-% propose aussi |\Upgamma|, \ldots, |Upomega| : $\Upgamma, \ldots, \Upomega$.
-% Afin de conserver majuscules et minuscules dans le même style,
-% \textsf{frenchmath} fournit l'option \texttt{Upgreek} qui redéfinit les majuscules
-% |\Gamma|, \ldots, |\Omega| pour correspondre à ces variantes.
-% Par contre l'on n'a alors plus accès aux caractères d'origine : $\Gamma, \ldots, \Omega$.
-% L'option \texttt{Upgreek} reprend aussi
-% les minuscules grecques de l'option \texttt{upgreek}, qu'il est donc
-% inutile d'invoquer simultanément.
+% \DeleteShortVerb{\|}
+% \newcommand\eg{\texttt{=}}
+% \noindent\begin{tabular}{|l|c|}
+% \hline
+% Option \texttt{clé=valeur} & Résultat \\
+% \hline
+% \textbf{lgrmath\eg Cochineal-LF} &
+% \mathgreeksfont{enc=LGR, fam=Cochineal-LF, shape=n}
+% \greektable \\
+% \hline
+% \textbf{lgrmath\eg fcm} &
+% \mathgreeksfont{enc=LGR, fam=fcm, shape=n}
+% \greektable \\
+% \hline
+% \textbf{upgreek\eg Euler} &
+% \mathgreeksfont{enc=U, fam=eur, shape=n}
+% \greektable \\
+% \hline
+% \textbf{upgreek\eg Symbol} &
+% \mathgreeksfont{enc=U, fam=psy, shape=n}
+% \greektable \\
+% \hline
+% \textbf{mathdesign\eg Charter} &
+% \mathgreeksfont{enc=OML, fam=mdbch, shape=n}
+% \greektable \\
+% \hline
+% \textbf{fourier} &
+% \mathgreeksfont{enc=FML, fam=futm}
+% \greektable \\
+% \hline
+% \textbf{pxfonts} &
+% \mathgreeksfont{enc=U, fam=pxmia}
+% \greektable \\
+% \hline
+% \textbf{txfonts} &
+% \mathgreeksfont{enc=U, fam=txmia}
+% \greektable \\
+% \hline
+% \textbf{libertinus} &
+% \mathgreeksfont{enc=LS1, fam=libertinust1math, shape=n}
+% \greektable \\
+% \hline
+% \end{tabular}
+% \MakeShortVerb{|}
+
+% \bigskip
+% Une option spéciale, \texttt{libsans} (booléen), permet d'obtenir une fonte
+% sans empattement pour \texttt{libertinus}.
+% Une autre option, non présentée dans le tableau, est \textbf{kpfonts},
+% avec deux valeurs possibles. Enfin
+% deux autres options sont disponibles, mais pour une compilation avec
+% \LuaLaTeX\ (ou \XeLaTeX):
+% \begin{description}
+% \item[fontspec\eg \ldots] De nombreuses valeurs sont possibles, par exemple
+% \texttt{FreeSerif},
+% \texttt{LiberationSerif},
+% \texttt{GFS Artemisia},
+% \texttt{GFS Didot} (valeur par défaut)\ldots
+% mais aussi des polices non libres comme \texttt{Cambria}, \texttt{Arial},
+% \texttt{Palatino Linotype}, \texttt{Times New Roman}\ldots\
+% si elles sont installées sur votre système ;
+% nécessite de charger l'extension \textsf{fontspec}
+% \footnote{L'extension \textsf{fontspec} est chargée automatiquement par
+% \textsf{unicode-math} ou \textsf{mathspec} (cette dernière étant spécifique à
+% \XeLaTeX), mais l'option \texttt{fontspec} permet une variété de polices
+% TrueType ou OpenType bien plus grande que l'option \texttt{unicode-math}.}.
+%
+% \item[unicode-math\eg \ldots]
+% Donne un beau résultat avec \texttt{Latin Modern Math} (valeur par défaut)
+% ou \texttt{STIX Two Math} ; nécessite le module \textsf{unicode-math}.
+%
+% \end{description}
%
% \medskip
-% Signalons aussi l'extension \textsf{textalpha} de Günter Milde~\cite{ALPHA} qui
-% donne accès aux lettres en forme droite \textalpha, \textbeta, \ldots,
-% \textpi, etc.,
-% mais en mode texte avec |\textalpha|, |\textbeta|, etc.
-% Ces glyphes, semblables à celles de la fonte \texttt{lmr} accessible avec \textsf{lgrmath},
-% se marient également bien avec la police Latin Modern,
-% par contre le thêta produit, \texttheta, n'est pas vraiment
-% celui qui est d'usage en mathématiques.
+% Par défaut \LaTeX\ compose les majuscules grecques en forme droite et il
+% n'est donc pas indispensable de recoder celles-ci. L'option \texttt{uppercase=false}
+% permet de conserver les majuscules d'origine : $\backGamma$, $\backDelta$, \ldots,
+% $\backOmega$ (sans le préfixe |\back...|).
%
% \medskip
% Mentionnons pour finir ce commentaire de Walter Schmidt~\cite{UPGREEK} que le mu
-% utilisé pour le préfixe des unités physiques, \textmicro, doit se composer avec |\textmu|
+% utilisé pour le préfixe des unités physiques, \textmu, doit se composer avec |\textmu|
% \footnote{L'extension \textsf{textalpha} fournit à la place \texttt{\string\textmicro}
% (depuis 2020) car elle redéfinit \texttt{\string\textmu}.},
% disponible en mode texte dans beaucoup de fontes (ou avec \textsf{textcomp}) ;
-% il diffère du $\mu$ droit mathématique.
+% il diffère du $\mu$ droit mathématique, obtenu avec |$\mu$| si l'on a activé
+% une des options de fonte précédentes.
+%
%
% \StopEventually{}
%
% \section{Le code}
%
+% Les seules options de \textsf{frenchmath} sont \texttt{capsit} et \texttt{noibrackets}.
+% Tout le travail sur les lettre grecques est dorénavant géré par \textsf{mathgreeks}
+% et toute option inconnue de \textsf{frenchmath} sera passée à \textsf{mathgreeks}.
+% Auquel cas, l'on y ajoute automatiquement l'option \texttt{upright}
+% pour composer les lettres grecques en forme droite.
+% Si l'on donne une clé ou une valeur invalide, c'est alors \textsf{mathgreeks} qui produira
+% un message d'erreur.
+%
% \begin{macrocode}
-\newif\ifcapsit
-\DeclareOption{capsit}{\capsittrue}
-\newif\iflgrmath
-\DeclareOption{lgrmath}{\lgrmathtrue}
-\newif\ifupgreek
-\DeclareOption{upgreek}{\upgreektrue}
-\newif\ifUpgreek
-\DeclareOption{Upgreek}{\Upgreektrue\upgreektrue}
-\newif\ifnoibrackets
-\DeclareOption{noibrackets}{\noibracketstrue}
+\newif\iffrenchmath@capsit
+\DeclareOption{capsit}{\frenchmath@capsittrue}
+\newif\iffrenchmath@noibrackets
+\DeclareOption{noibrackets}{\frenchmath@noibracketstrue}
+\newif\iffrenchmath@mathgreeks
+\DeclareOption*{\frenchmath@mathgreekstrue
+ \PassOptionsToPackage{\CurrentOption,upright}{mathgreeks}}
\ProcessOptions \relax
-\@ifpackageloaded{unicode-math}{
- \@ifpackageloaded{mathdesign}{
- \PackageInfo{frenchmath}{Package mathdesign
- is loaded, \MessageBreak
- I don't load mathrsfs and amssymb}
- }{
- %\let\circledS\relax % utilisé uniquement par mathdesign
- \let\eth\relax % 3 incompatibilités unicode-math / amssymb
- \let\digamma\relax
- \let\backepsilon\relax
- \RequirePackage{amssymb}
- \PackageInfo{frenchmath}{Package unicode-math
- is loaded, \MessageBreak
- I don't load mathrsfs}
- }
- \let\vide\varnothing % \varnothing sera écrasé par unicode-math
-}{
- \AtBeginDocument{
- \@ifpackageloaded{mathdesign}{
- \PackageInfo{frenchmath}{Package mathdesign
- is loaded, \MessageBreak
- I don't load mathrsfs and amssymb}
- }{
- \RequirePackage{amssymb} % \leqslant, \geqslant, \varnothing
- \@ifundefined{mathscr}{\RequirePackage{mathrsfs}}{
- \PackageInfo{frenchmath}{Command \string\mathscr\space
- already defined, \MessageBreak
- I don't load mathrsfs}
- }
- }
- }
-}
+% \end{macrocode}
+% Assurer une bonne compatibilité avec \textsf{unicode-math} est un peu compliqué
+% car \textsf{unicode-math} définit ou redéfinit de nombreux symboles, lettres,
+% signes dans |\AtBeginDocument|. Les extensions \textsf{decimalcomma}
+% et \textsf{ibrackets} font déjà appel à |\AtBeginDocument| mais pour garantir
+% que leur action soit bien postérieure à celle de \textsf{unicode-math}
+% leur appel a été placé dans un |\AtEndPreamble|, fourni par l'extension \textsf{etoolbox}.
+% Il y a par contre un problème si on utilise une instruction comme |\MakeShortVerb"| du
+% module \textsf{shortvrb} ou |\lstMakeShortInline"| du module \mbox{\textsf{listings}}.
+% Ce type d'instruction doit agir \emph{après} \textsf{frenchmath}, donc être
+% placée après |\begin{document}| ou bien dans un |\AtBeginDocument{...}|.
+%
+% L'extension \textsf{mathptmx} ne fournit pas de |\jmath| mais considère néanmoins
+% cette commande comme existante. Dans ce cas, nous la rendons donc \og indéfinie \fg
+% pour la définir ensuite dans une commande générale faisant appel
+% à l'extension \textsf{dotlessj}.
+% \begin{macrocode}
\RequirePackage{amsopn} % fournit \DeclareMathOperator
-\@ifpackageloaded{mathptmx}{\RequirePackage{dotlessj}}{}
\RequirePackage{xspace} % utile pour les commandes \ssi, \Oij
-\ifnoibrackets\else\RequirePackage{ibrackets}\fi % intelligent brackets
-\RequirePackage{decimalcomma} % depuis frenchmath 2.7
+\RequirePackage{etoolbox} % fournit \AtEndPreamble
+\iffrenchmath@mathgreeks \RequirePackage{mathgreeks} \fi
+\AtEndPreamble{
+ \RequirePackage{decimalcomma}
+ \iffrenchmath@noibrackets\else\RequirePackage{ibrackets}\fi
+ \@ifpackageloaded{mathptmx}{\let\jmath\@undefined}{}
+ \@ifundefined{jmath}{\RequirePackage{dotlessj}}{}
+ \@ifpackageloaded{pstricks-add}{\psset{comma=true}}{}
+}
% \end{macrocode}
%
% \DescribeMacro{\DeclareMathUp}
-% Sauf si l'option \texttt{capsit} est activée, on redéfinit toutes les lettres majuscules
+% Sauf si l'on a invoqué l'option \texttt{capsup=false} (ou \texttt{capsit}),
+% on redéfinit toutes les lettres majuscules
% du mode mathématique grâce à la commande |\DeclareMathUp|.
% Contrairement aux bascules |\MathUp| et |\MathIt| de l'extension \textsf{mismath},
% |\DeclareMathUp| ne fonctionne que dans le préambule, mais son code est bien plus simple
@@ -753,14 +802,14 @@
% se trouve sur le forum de discussion \texttt{iterate190.rssing.com},
% en réponse à \og TeX How to iterate over a comma separated list$?$\fg.
% Que son auteur, Petr Olšák, soit remercié.
-% Cette macro a été définie de manière identique dans \textsf{mismath},
+% Cette macro a d'ailleurs été utilisée de manière identique dans \textsf{mismath},
% mais cela ne génère pas d'incompatibilité.}.
% |\AtBeginDocument| est nécessaire pour que ces définitions
% soient prises en compte avec la classe \textsf{beamer} par exemple,
% ou avec \textsf{unicode-math}.
% \smallskip
% \begin{macrocode}
-\newcommand*\DeclareMathUp[1]{
+\providecommand*\DeclareMathUp[1]{
\DeclareMathSymbol{#1}{\mathalpha}{operators}{`#1}}
\def\apply#1#2{\apply@#1#2,\apply@,}
@@ -768,33 +817,103 @@
\else #1{#2}\afterfi@{\apply@#1}\fi}
\def\afterfi@#1#2\fi{\fi#1}
-\ifcapsit\else\AtBeginDocument{
+\AtEndPreamble{\iffrenchmath@capsit\else\AtBeginDocument{
\apply\DeclareMathUp{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}
- }
-\fi
+ }\fi
+}
-\AtBeginDocument{\@ifpackageloaded{pstricks-add}{\psset{comma=true}}{}}
-\DeclareMathSymbol{;}{\mathbin}{operators}{'73} % \mathpunct à l'origine
+% \end{macrocode}
+% En utilisant |\AtEndPreamble| (de l'extension \mbox{\textsf{etoolbox}}),
+% avec |\AtBeginDocument| à l'intérieur, on garantit que certaines actions
+% auront bien lieu après celles de \textsf{unicode-math},
+% même si \textsf{frenchmath} est chargé avant \mbox{\textsf{unicode-math}}.
+%
+% Certains symboles, provenant de \textsf{amssymb} sont déjà définis par certaines
+% extensions (\textsf{mathdesign} ou \textsf{unicode-math}) et ne seront pas redéfinis.
+% Un avertissement sera affiché dans ce cas. Comme \textsf{amssymb}
+% (qui utilise \textsf{amsfonts}) charge plusieurs fontes mathématiques et un grand
+% nombre de symboles pas forcément nécessaires, nous n'avons extrait que les
+% trois symboles dont nous avons besoin dans cette extension :
+% |\leqslant|, |\geqslant| et |\varnothing|.
+% \begin{macrocode}
+\AtEndPreamble{% au cas où frenchmath est chargé avant unicode-math
+ \AtBeginDocument{% après actions de unicode-math
+ \DeclareMathSymbol{;}{\mathbin}{operators}{'73} % et non \mathpunct
+ \@ifundefined{mathscr}{\RequirePackage{mathrsfs}}{
+ \PackageWarningNoLine{frenchmath}{Command \string\mathscr\space
+ already defined, \MessageBreak
+ I don't load mathrsfs}
+ }
+ \@ifundefined{leqslant}{
+ \DeclareSymbolFont{AMSa}{U}{msa}{m}{n}% de amsfonts
+ \DeclareMathSymbol{\leqslant}{\mathrel}{AMSa}{"36}% de amssymb
+ \DeclareMathSymbol{\geqslant}{\mathrel}{AMSa}{"3E}
+ }{
+ \PackageWarningNoLine{frenchmath}{\string\leqslant\space
+ and \string\geqslant\space already defined,
+ \MessageBreak
+ they will not be redefined}
+ }
+ \@ifundefined{varnothing}{% de amssymb
+ \@ifundefined{text}{\RequirePackage{amstext}}{}
+ \newcommand\varnothing{% \usefont évite de déclarer AMSb
+ \mathord{\text{\usefont{U}{msb}{m}{n}\symbol{"3F}}}}
+ }{
+ \PackageWarningNoLine{frenchmath}{\string\varnothing\space
+ already defined,
+ \MessageBreak
+ it will not be redefined,
+ \MessageBreak
+ except by using \string\AMSvarnothing}
+ }
+ }
+}
% \end{macrocode}
-% Passons aux alias et identifiants de fonctions classiques.
+% Voyons les alias et quelques commandes particulières.
+%
+% La commande |\varnothing| produit $\varnothing$ mais par contre,
+% le symbole fournit par \textsf{unicode-math}, avec \textsf{Latin Modern Math},
+% est très laid et malheureusement identique à |\emptyset| : $\CMemptyset$.
+% Afin de récupérer le symbole de \textsf{amssymb}, sans être obligé de charger
+% cette extension, nous proposons la commande |\AMSvarnothing|,
+% à placer dans le préambule, après l'appel de \textsf{unicode-math}.
% \begin{macrocode}
\newcommand\curs{\mathscr}
\newcommand\infeg{\leqslant}
\newcommand\supeg{\geqslant}
-\@ifundefined{vide}{\newcommand\vide{\varnothing}}{}
+\newcommand\vide{\varnothing}
+\newcommand\AMSvarnothing{% doit être appelé après \setmathfont ?
+ \AtEndPreamble{\AtBeginDocument{% après actions de unicode-math
+ \renewcommand\varnothing{%
+ \mathord{\text{\usefont{U}{msb}{m}{n}\symbol{"3F}}}}
+ }}
+}
% \end{macrocode}
% La définition de |\paral| remplace, depuis la version 2.2,
% l'ancienne définition plus simple |\mathrel{/\!\!/}|, mais qui donnait des barres
-% trop serrées avec \textsf{mathastext} + \textsf{times} ou avec \textsf{libertinust1math}.
+% trop serrées avec \mbox{\textsf{mathastext}} + \textsf{times}
+% ou avec \textsf{libertinust1math}.
% Merci à Jean-François Burnol de me l'avoir fait remarquer
% et pour ses suggestions dans la mise au point d'une macro plus efficace.
+%
+% La macro |\cmod|, copiée du |\pod| de \textsf{amsmath} (depuis v2.11),
+% permet de gérer différemment
+% l'espacement en mode \og mathématiques centrées \fg (hors-ligne)
+% ou en mode \og en ligne \fg.
% \begin{macrocode}
\newcommand\paral{\mathrel{\ooalign{$\mkern-1.75mu/\mkern1.75mu$\cr%
$\mkern1.75mu/\mkern-1.75mu$}}}
\newcommand\ssi{si, et seulement si,\xspace}
-\newcommand*\cmod[1]{\quad[#1]}
+%\newcommand*\cmod[1]{\quad[#1]}
+\newif\if@display % provient de amsmath, peut être appelé 2 fois
+\everydisplay\@xp{\the\everydisplay \@displaytrue}
+\newcommand*\cmod[1]{\penalty \z@ % similaire à amsmath \allowbreak
+ \if@display\mkern 18mu\else\mkern 8mu\fi [#1]}
+% \end{macrocode}
+% Passons aux identifiants de fonctions classiques.
+% \begin{macrocode}
\DeclareMathOperator{\pgcd}{pgcd}
\DeclareMathOperator{\ppcm}{ppcm}
\DeclareMathOperator{\card}{card}
@@ -811,7 +930,7 @@
\DeclareMathOperator{\cosech}{cosech}
% \end{macrocode}
-% Présentons les commandes pour les bases et repères, qui peuvent être utilisées
+% Les commandes pour les bases et repères peuvent être utilisées
% en mode texte grâce à |\ensuremath| (et |\xspace| qui garantit le bon espacement).
% \begin{macrocode}
\newcommand\@Oij{%
@@ -838,9 +957,10 @@
\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}}
+\AtBeginDocument{\let\oldij\ij %\ij existe déjà (mode texte)
+ \renewcommand\ij{\TextOrMath{\oldij}{%
+ \left(\vec{\imath}, \vec{\jmath}\,\right)}}
+}
\newcommand\ijk{%
\ensuremath{%
\left(\vec{\vphantom{t}\imath}, \vec{\vphantom{t}\jmath},
@@ -848,141 +968,9 @@
\xspace}
% \end{macrocode}
-% Ce n'est qu'à la fin du préambule, donc avec |\AtBeginDocument|, que l'on examine
-% les options \texttt{lgrmath} ou \texttt{upgreek},
-% pour que cela fonctionne avec \textsf{unicode-math} et
-% pour laisser à l'utilisateur la possibilité de charger \textsf{upgreek}
-% après \textsf{frenchmath} et éviter un conflit d'option.
-% On sauvegarde les lettres grecques d'origine dans les macros |\italpha|, \ldots,
-% |\itomega|, grâce à la commande |\SavedGreekItalics|.
-% La macro |\upgreekUndefined| ne sert que si l'on veut utiliser \textsf{upgreek}
-% avec \textsf{unicode-math} : elle permet de \og vider \fg la définition
-% de |\upalpha|, |\upbeta|\ldots, car sinon leur redéfinition par \textsf{upgreek}
-% est impossible.
-% \begin{macrocode}
-\providecommand\SaveGreekItalics{% pourrait être définie ailleurs
- \let\italpha\alpha
- \let\itbeta\beta
- \let\itgamma\gamma
- \let\itdelta\delta
- \let\itepsilon\epsilon
- \let\itzeta\zeta
- \let\iteta\eta
- \let\ittheta\theta
- \let\itiota\iota
- \let\itkappa\kappa
- \let\itlambda\lambda
- \let\itmu\mu
- \let\itnu\nu
- \let\itxi\xi
- \let\itpi\pi
- \let\itrho\rho
- \let\itsigma\sigma
- \let\ittau\tau
- \let\itupsilon\upsilon
- \let\itphi\phi
- \let\itchi\chi
- \let\itpsi\psi
- \let\itomega\omega
- \let\itvarepsilon\varepsilon
- \let\itvartheta\vartheta
- \let\itvarpi\varpi
- \let\itvarsigma\varsigma
- \let\itvarphi\varphi
-}
-
-\providecommand\upgreekUndefined{
- \let\upalpha\@undefined
- \let\upbeta\@undefined
- \let\upgamma\@undefined
- \let\updelta\@undefined
- \let\upepsilon\@undefined
- \let\upzeta\@undefined
- \let\upeta\@undefined
- \let\uptheta\@undefined
- \let\upiota\@undefined
- \let\upkappa\@undefined
- \let\uplambda\@undefined
- \let\upmu\@undefined
- \let\upnu\@undefined
- \let\upxi\@undefined
- \let\uppi\@undefined
- \let\uprho\@undefined
- \let\upsigma\@undefined
- \let\uptau\@undefined
- \let\upupsilon\@undefined
- \let\upphi\@undefined
- \let\upchi\@undefined
- \let\uppsi\@undefined
- \let\upomega\@undefined
- \let\upvarepsilon\@undefined
- \let\upvartheta\@undefined
- \let\upvarpi\@undefined
- \let\upvarrho\@undefined
- \let\upvarsigma\@undefined
- \let\upvarphi\@undefined
-}
-
-\AtBeginDocument{
- \iflgrmath
- \SaveGreekItalics
- \RequirePackage[font=fcm,style=french]{lgrmath}
- \fi
- \ifupgreek
- \@ifpackageloaded{upgreek}{}{
- \@ifpackageloaded{unicode-math}{\upgreekUndefined}{}
- \SaveGreekItalics
- \RequirePackage[Symbol]{upgreek}
- }
- \renewcommand\alpha{\upalpha}
- \renewcommand\beta{\upbeta}
- \renewcommand\gamma{\upgamma}
- \renewcommand\delta{\updelta}
- \renewcommand\epsilon{\upepsilon}
- \renewcommand\zeta{\upzeta}
- \renewcommand\eta{\upeta}
- \renewcommand\theta{\uptheta}
- \renewcommand\iota{\upiota}
- \renewcommand\kappa{\upkappa}
- \renewcommand\lambda{\uplambda}
- \renewcommand\mu{\upmu}
- \renewcommand\nu{\upnu}
- \renewcommand\xi{\upxi}
- \renewcommand\pi{\uppi}
- \renewcommand\rho{\uprho}
- \renewcommand\sigma{\upsigma}
- \renewcommand\tau{\uptau}
- \renewcommand\upsilon{\upupsilon}
- \renewcommand\phi{\upphi}
- \renewcommand\chi{\upchi}
- \renewcommand\psi{\uppsi}
- \renewcommand\omega{\upomega}
- \renewcommand\varepsilon{\upvarepsilon}
- \renewcommand\vartheta{\upvartheta}
- \renewcommand\varpi{\upvarpi}
- \renewcommand\varrho{\upvarrho}
- \renewcommand\varsigma{\upvarsigma}
- \renewcommand\varphi{\upvarphi}
- \fi
- \ifUpgreek
- % unicode-math utilise \upGamma, \upDelta...
- \renewcommand\Gamma{\Upgamma}
- \renewcommand\Delta{\Updelta}
- \renewcommand\Theta{\Uptheta}
- \renewcommand\Lambda{\Uplambda}
- \renewcommand\Xi{\Upxi}
- \renewcommand\Pi{\Uppi}
- \renewcommand\Sigma{\Upsigma}
- \renewcommand\Upsilon{\Upupsilon}
- \renewcommand\Phi{\Upphi}
- \renewcommand\Psi{\Uppsi}
- \renewcommand\Omega{\Upomega}
- \fi
-}
-% \end{macrocode}
%
% \medskip
-% \begin{thebibliography}{31}
+% \begin{thebibliography}{32}
% \begin{raggedright}
% \bibitem{RTIN} \emph{Lexique des règles typographiques en usage à l’Imprimerie Nationale},
% édition du 26/08/2002.
@@ -1010,6 +998,12 @@
% Claudio Beccari, CTAN, v1.2.00 2021/08/04.
% \bibitem{MAFR} \emph{La distribution \textsf{mafr}}, Christian Obrecht,
% CTAN, v1.0 17/09/2006.
+% \bibitem{BABEL} \emph{A Babel language definition file for French}, extension \LaTeX\
+% \textsf{babel-french} de Daniel Flipo, CTAN, v3.5c 14/09/2018.
+% \bibitem{FRM} \emph{L'extension \textsf{tdsfrmath}}, Yvon Henel,
+% CTAN, v1.3 22/06/2009.
+% \bibitem{TABL} \emph{L'extension \textsf{tablvar}}, Antoine Missier,
+% CTAN, v2.0 23/12/2023.
% \bibitem{UNIC} \emph{Experimental Unicode mathematical typesetting:
% The \textsf{unicode-math} package}, Will Robertson, Philipp Stephani, Joseph Wright,
% Khaled Hosny, and others, CTAN, v0.8r 13/08/2023.
@@ -1017,16 +1011,12 @@
% Michel Bovani, CTAN, v1.3 30/01/2005.
% \bibitem{DESIGN} \emph{The \textsf{mathdesign} package},
% Paul Pichaureau, CTAN, v2.31 29/08/2013.
-% \bibitem{MIS} \emph{\textsf{mismath} -- Miscellaneous mathematical macros},
-% Antoine Missier, CTAN, v2.10 20/02/2024.
+% \bibitem{KPF} \emph{\textsf{Kp-Fonts} -- The Johannes Kepler project},
+% Christophe Caignaert, CTAN, v3.34 20/09/2022.
+% \bibitem{MIS} \emph{Miscellaneous mathematical macros -- The \textsf{mismath} package},
+% Antoine Missier, CTAN, v3.0 04/05/2024.
% \bibitem{VECT} \emph{\textsf{esvect} -- Typesetting vectors with beautiful
% arrow with \LaTeXe}, Eddie Saudrais, CTAN, v1.3 11/07/2013.
-% \bibitem{FRM} \emph{L'extension \textsf{tdsfrmath}}, Yvon Henel,
-% CTAN, v1.3 22/06/2009.
-% \bibitem{TABL} \emph{L'extension \textsf{tablvar}}, Antoine Missier,
-% CTAN, v2.0 23/12/2023.
-% \bibitem{BABEL} \emph{A Babel language definition file for French}, extension \LaTeX\
-% \textsf{babel-french} de Daniel Flipo, CTAN, v3.5c 14/09/2018.
% \bibitem{ICOMMA} \emph{The \textsf{icomma} package for \LaTeXe}.
% Walter Schmidt, CTAN, v2.0 10/03/2002.
% \bibitem{NCC} \emph{The \textsf{ncccomma} package}. Alexander I.~Rozhenko,
@@ -1043,12 +1033,12 @@
% \bibitem{MATAL} \emph{The \textsf{mathalpha}, \textsc{aka} \textsf{mathalfa} package},
% Michael Sharpe, CTAN, v1.143 18/11/2021.
% \bibitem{DLJ} \emph{\textsf{dotlessj}}, David Carlisle, CTAN, v0.03 09/12/1998.
-% \bibitem{KPF} \emph{\textsf{Kp-Fonts} -- The Johannes Kepler project},
-% Christophe Caignaert, CTAN, v3.34 20/09/2022.
% \bibitem{LGR} \emph{The \textsf{lgrmath} package}, Jean-François B., CTAN,
% v1.0 16/11/2022.
% \bibitem{UPGREEK} \emph{The \textsf{upgreek} package for \LaTeXe}, Walter Schmidt, CTAN,
% v2.0 12/03/2003.
+% \bibitem{MGREEK} \emph{The \textsf{mathgreeks} package}, Antoine Missier, CTAN,
+% v1.1 04/05/2024.
% \bibitem{ALPHA} \emph{The \textsf{textalpha} package}
% (partie de l'extension \textsf{greek-fontenc}), Günter Milde, CTAN, v2.1 14/06/2022.
% \bibitem{COMP} \emph{\LaTeX\ Companion}, Frank Mittelbach, Michel Goossens,
diff --git a/macros/latex/contrib/frenchmath/frenchmath.pdf b/macros/latex/contrib/frenchmath/frenchmath.pdf
index 566efe4362..070aec4914 100644
--- a/macros/latex/contrib/frenchmath/frenchmath.pdf
+++ b/macros/latex/contrib/frenchmath/frenchmath.pdf
Binary files differ
diff --git a/macros/latex/contrib/fvextra/CHANGELOG.md b/macros/latex/contrib/fvextra/CHANGELOG.md
new file mode 100644
index 0000000000..7556c74a2d
--- /dev/null
+++ b/macros/latex/contrib/fvextra/CHANGELOG.md
@@ -0,0 +1,231 @@
+# Changelog
+
+
+## v1.7.0 (2024/05/16)
+
+* Added new command `\VerbatimClearBuffer`.
+
+* `VerbatimBuffer` environments with the same buffer name now append to the
+ same buffer, regardless of the value of `globalbuffer`. Previously,
+ `globalbuffer=false` caused any pre-existing buffer to be cleared. Now,
+ `globalbuffer=false` causes anything that is appended to the buffer to be
+ removed at the end of the environment, but the entire buffer is not
+ cleared.
+
+* `\FVExtraUnexpandedReadStarOArgMArgBVArg` now checks that the final
+ argument it reads is braced (#22).
+
+* Text that immediately follows `\VerbatimInsertBuffer` is no longer indented
+ to start a new paragraph.
+
+* Updated `tcblisting` usage in docs for compatibility with the latest
+ `tcolorbox`.
+
+
+## v1.6.1 (2023/11/28)
+
+* Fixed bug from v1.6 that caused a space following a comma to be lost (#21).
+
+
+## v1.6 (2023/11/19)
+
+* Added new environment `VerbatimWrite`. This is similar to `fancyvrb`'s
+ `VerbatimOut`, except that it allows for writing to a file multiple times
+ and guarantees truly verbatim output via `\detokenize`.
+
+* Added new environment `VerbatimBuffer`. This stores the contents of an
+ environment verbatim in a "buffer," a sequence of numbered macros each of
+ which contains one line of the environment. The "buffered" lines can then
+ be looped over for further processing or later use.
+
+* Added new command `\VerbatimInsertBuffer`. This inserts an existing buffer
+ created by `VerbatimBuffer` as a `Verbatim` environment.
+
+* Redefined visible space `\FancyVerbSpace` so that it now has the correct
+ width. It had previously been redefined as `\textvisiblespace`, but that
+ was slightly too narrrow.
+
+* Added option `spacebreak`. This determines the line break that is inserted
+ around spaces when `showspaces=true` or `breakcollapsespaces=false`, by
+ defining the new macro `\FancyVerbSpaceBreak`.
+
+* `breakbefore`, `breakafter`, and `breakanywhere` now produce plain breaks
+ around spaces when `showspaces=true`, instead of breaks with a break symbol
+ at the end of wrapped lines. `\FancyVerbBreakAnywhereBreak`,
+ `\FancyVerbBreakBeforeBreak`, and `\FancyVerbBreakAfterBreak` are no longer
+ inserted next to spaces. Instead, `\FancyVerbSpaceBreak` is inserted or
+ (depending on options) `\FV@Space` is defined to include
+ `\FancyVerbSpaceBreak`.
+
+* Added option `breakcollapsespaces`. When `true` (default), a line break
+ within a run of regular spaces (`showspaces=false`) replaces all spaces
+ with a single break, and the wrapped line after the break starts with a
+ non-space character. When `false`, a line break within a run of regular
+ spaces preserves all spaces, and the wrapped line after the break may start
+ with one or more spaces. This causes regular spaces to behave exactly like
+ the visible spaces produced with `showspaces`; both give identical line
+ breaks, with the only difference being the appearance of spaces.
+
+* `breaklines` now automatically enables breaks after space characters when
+ `showspaces=true`.
+
+* Reimplemented definition of `\FV@Space` to work with new space options.
+
+* Added documentation about how reimplemented commands handle the `codes`
+ option differently compared to `fancyvrb` (#17).
+
+* Starred commands such as `\Verb*` now use both visible spaces and visible
+ tabs instead of just visible spaces. This is more similar to the current
+ behavior of `\verb*`, except that `\verb*` converts tabs into visible
+ spaces (#19).
+
+* The `mathescape` option now resets the ampersand `&` catcode (#18).
+
+
+## v1.5 (2022/11/30)
+
+* Added `\FancyVerbFormatInline` for customizing the formatting of inline
+ verbatim, such as `\Verb`. This parallels `\FancyVerbFormatLine` and
+ `\FancyVerbFormatText`.
+
+* Added line breaking option `breaknonspaceingroup`. When `commandchars` is
+ used to allow macros within verbatim, this inserts breaks within groups
+ `{...}`.
+
+* Added `\FVExtraUnexpandedReadStarOArgMArgBVArg` to support reimplementation
+ of `\mintinline` for `minted`.
+
+* Added `VerbEnv` environment, which is an environment variant of `\Verb`.
+ This supports reimplementation of `\mintinline` for `minted`.
+
+* `breakbefore` and `breakafter` now support the escaped comma `\,` (#15).
+
+* Fixed unintended line breaks after hyphens under LuaTeX (#14).
+
+* Added documentation on Pandoc compatibility (#11).
+
+* Replaced `breakbeforegroup` with `breakbeforeinrun`, and replaced
+ `breakaftergroup` with `breakafterinrun`. With the introduction of
+ `breaknonspaceingroup`, "`group`" is now reserved for referring to TeX
+ groups `{...}`.
+
+* Removed dependency on `ifthen` package.
+
+* `breakautoindent` now works correctly with Pygments output that treats
+ leading whitespace as a separate token or as part of a token.
+
+
+## v1.4 (2019/02/04)
+
+* Reimplemented `\Verb`. It now works as expected inside other commands
+ (with a few limitations), including in movable arguments, and is compatible
+ with `hyperref` for things like PDF bookmarks. It now supports
+ `breaklines` and relevant line-breaking options.
+
+* Reimplemented `\SaveVerb` and `\UseVerb` to be equivalent to the new
+ `\Verb`. The new option `retokenize` allows saved verbatim material to be
+ retokenized under new `commandchars` and `codes` when it is inserted with
+ `\UseVerb`.
+
+* New command `\EscVerb` works like the reimplemented `\Verb`, except that
+ special characters can be escaped with a backslash. It works inside other
+ commands without any limitations, including in movable arguments, and is
+ compatible with `hyperref` for things like PDF bookmarks.
+
+* Added `extra` option for switching between the reimplemented `\Verb`,
+ `\SaveVerb`, `\UseVerb` and the original `fancyvrb` definitions.
+ Reimplemented versions are used by default. This option will apply to any
+ future reimplemented commands and environments.
+
+* New command `\fvinlineset` only applies options to commands related to
+ typesetting verbatim inline, like `\Verb`, `\SaveVerb`, `\UseVerb`. It
+ only works with commands that are defined or reimplemented by `fvextra`.
+ It overrides options from `\fvset`.
+
+* Patched `fancyvrb` so that `\Verb` (either reimplemented version or
+ original) can use characters like `%` for delimiters when used outside any
+ commands.
+
+* `obeytabs` now works with the `calc` package's redefined `\setcounter`.
+ Since `minted` loads `calc`, this also fixes `minted` compatibility
+ (`minted` #221).
+
+* Added new option `fontencoding` (`minted` #208).
+
+* `highlightlines` now works correctly with `frame` (#7).
+
+
+## v1.3.1 (2017/07/08)
+
+* `beameroverlays` now works with `VerbatimOut`.
+
+
+## v1.3 (2017/07/08)
+
+* Added `beameroverlays` option, which enables `beamer` overlays using the
+ `<` and `>` characters.
+
+* Added options `breakindentnchars`, `breaksymbolsepleftnchars` (alias
+ `breaksymbolsepnchars`), `breaksymbolseprightnchars`,
+ `breaksymbolindentleftnchars` (alias `breaksymbolindentnchars`), and
+ `breaksymbolindentrightnchars`. These are identical to the pre-existing
+ options without the `nchars` suffix, except that they allow indentation to
+ be specified as an integer number of characters rather than as a dimension.
+ As a result of these new options, `\settowidth` is no longer used in the
+ preamble, resolving some font incompatibilities (#4).
+
+* Clarified in the docs that `breaksymbolsepright` is a *minimum*, rather
+ than exact, distance.
+
+
+## v1.2.1 (2016/09/02)
+
+* The package is now compatible with classes and packages that redefine
+ `\raggedright`.
+
+* Fixed a bug that introduced extra space in inline contexts such as
+ `\mintinline` when `breaklines=true` (#3).
+
+
+
+## v1.2 (2016/07/20)
+
+* Added support for line breaking when working with Pygments for syntax
+ highlighting.
+
+* The default `highlightcolor` is now defined with `rgb` for compatibility
+ with the `color` package. Fixed a bug in the conditional color definition
+ when `color` and `xcolor` are not loaded before `fvextra`.
+
+
+
+## v1.1 (2016/07/14)
+
+* The options `rulecolor` and `fillcolor` now accept color names directly;
+ using `\color{<color_name>}` is no longer necessary, though it still works.
+
+* Added `tabcolor` and `spacecolor` options for use with `showtabs` and
+ `showspaces`.
+
+* Added `highlightlines` option that takes a line number or range of line
+ numbers and highlights the corresponding lines. Added `highlightcolor`
+ option that controls hightlighting color.
+
+* `obeytabs` no longer causes lines to vanish when tabs are inside macro
+ arguments. Tabs and spaces inside a macro argument but otherwise at the
+ beginning of a line are expanded correctly. Tabs inside a macro argument
+ that are preceded by non-whitespace characters (not spaces or tabs) are
+ expanded based on the starting position of the run of whitespace in which
+ they occur.
+
+* The line breaking options `breakanywhere`, `breakbefore`, and `breakafter`
+ now work with multi-byte UTF-8 code points under pdfTeX with `inputenc`.
+ They were already fully functional under XeTeX and LuaTeX.
+
+* Added `curlyquotes` option, which essentially disables the `uquote` package.
+
+
+
+## v1.0 (2016/06/28)
+
+* Initial release.
diff --git a/macros/latex/contrib/fvextra/fvextra.dtx b/macros/latex/contrib/fvextra/fvextra.dtx
index ca5877ee0f..e4182b6f88 100644
--- a/macros/latex/contrib/fvextra/fvextra.dtx
+++ b/macros/latex/contrib/fvextra/fvextra.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2016-2023 by Geoffrey M. Poore <gpoore@gmail.com>
+% Copyright (C) 2016-2024 by Geoffrey M. Poore <gpoore@gmail.com>
% ---------------------------------------------------------------------------
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -26,7 +26,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{fvextra}
%<*package>
- [2023/11/28 v1.6.1 fvextra - extensions and patches for fancyvrb]
+ [2024/05/16 v1.7.0 fvextra - extensions and patches for fancyvrb]
%</package>
%
%<*driver>
@@ -66,23 +66,7 @@
\usepackage{tcolorbox}
\tcbuselibrary{listings}
-% strip leading percent symbols
-\def\tcbverbatimwrite#1{%
- \@bsphack
- \tcb@set@verbatim@finish%
- \tcb@allocate@tcb@out%
- \immediate\openout\tcb@out #1
- \tcb@verbatim@begin@hook%
- \let\do\@makeother\dospecials
- \tcb@verbatim@change@percent\catcode`\^^M\active \catcode`\^^I=12
- \def\verbatim@processline{%
- \immediate\write\tcb@out
- {\expandafter\@gobble\the\verbatim@line}}%
- \verbatim@start}%
-
-% fix redefinition by tcolorbox
-\def\verbatim@processline{%
- \expandafter\check@percent\the\verbatim@line\par}
+\tcbset{verbatim ignore percent}
\usepackage{hyperref}
@@ -223,22 +207,6 @@
\edef\hashchar{\string#}
-\newcommand{\changestext}{}
-\NewEnviron{changelog}[2]{%
- \g@addto@macro\changestext{\item[#1] (#2) \begin{itemize}}%
- \expandafter\g@addto@macro\expandafter\changestext\expandafter{\BODY}%
- \g@addto@macro\changestext{\end{itemize}}%
-}
-\newcommand{\PrintChangelog}{%
- %\addcontentsline{toc}{section}{Changelog}
- %\section*{Changelog}%
- \section{Changelog}%
- \label{sec:changelog}
- \begin{description}%
- \changestext
- \end{description}%
-}
-
%\EnableCrossrefs
%\CodelineIndex
%\RecordChanges
@@ -253,89 +221,6 @@
% \fi
%
%
-% \begin{changelog}{v1.6.1}{2023/11/28}
-% \item Fixed bug from v1.6 that caused a space following a comma to be lost (\#21).
-% \end{changelog}
-%
-% \begin{changelog}{v1.6}{2023/11/19}
-% \item Added new environment \Verb{VerbatimWrite}. This is similar to \Verb{fancyvrb}'s \Verb{VerbatimOut}, except that it allows for writing to a file multiple times and guarantees truly verbatim output via \Verb{\detokenize}.
-% \item Added new environment \Verb{VerbatimBuffer}. This stores the contents of an environment verbatim in a ``buffer,'' a sequence of numbered macros each of which contains one line of the environment. The ``buffered'' lines can then be looped over for further processing or later use.
-% \item Added new command \Verb{\VerbatimInsertBuffer}. This inserts an existing buffer created by \Verb{VerbatimBuffer} as a \Verb{Verbatim} environment.
-% \item Redefined visible space \Verb{\FancyVerbSpace} so that it now has the correct width. It had previously been redefined as \Verb{\textvisiblespace}, but that was slightly too narrrow.
-% \item Added option \Verb{spacebreak}. This determines the line break that is inserted around spaces when \Verb{showspaces=true} or \Verb{breakcollapsespaces=false}, by defining the new macro \Verb{\FancyVerbSpaceBreak}.
-% \item \Verb{breakbefore}, \Verb{breakafter}, and \Verb{breakanywhere} now produce plain breaks around spaces when \Verb{showspaces=true}, instead of breaks with a break symbol at the end of wrapped lines. \Verb{\FancyVerbBreakAnywhereBreak}, \Verb{\FancyVerbBreakBeforeBreak}, and \Verb{\FancyVerbBreakAfterBreak} are no longer inserted next to spaces. Instead, \Verb{\FancyVerbSpaceBreak} is inserted or (depending on options) \Verb{\FV@Space} is defined to include \Verb{\FancyVerbSpaceBreak}.
-% \item Added option \Verb{breakcollapsespaces}. When \Verb{true} (default), a line break within a run of regular spaces (\Verb{showspaces=false}) replaces all spaces with a single break, and the wrapped line after the break starts with a non-space character. When \Verb{false}, a line break within a run of regular spaces preserves all spaces, and the wrapped line after the break may start with one or more spaces. This causes regular spaces to behave exactly like the visible spaces produced with \Verb{showspaces}; both give identical line breaks, with the only difference being the appearance of spaces.
-% \item \Verb{breaklines} now automatically enables breaks after space characters when \Verb{showspaces=true}.
-% \item Reimplemented definition of \Verb{\FV@Space} to work with new space options.
-% \item Added documentation about how reimplemented commands handle the \Verb{codes} option differently compared to \fancyvrb\ (\#17).
-% \item Starred commands such as \Verb{\Verb*} now use both visible spaces and visible tabs instead of just visible spaces. This is more similar to the current behavior of \Verb{\verb*}, except that \Verb{\verb*} converts tabs into visible spaces (\#19).
-% \item The \Verb{mathescape} option now resets the ampersand \Verb{&} catcode (\#18).
-% \end{changelog}
-%
-%
-% \begin{changelog}{v1.5}{2022/11/30}
-% \item Added \cmd{\FancyVerbFormatInline} for customizing the formatting of inline verbatim, such as \cmd{\Verb}. This parallels \cmd{\FancyVerbFormatLine} and \cmd{\FancyVerbFormatText}.
-% \item Added line breaking option \Verb{breaknonspaceingroup}. When \cmd{commandchars} is used to allow macros within verbatim, this inserts breaks within groups \Verb{{...}}.
-% \item Added \cmd{\FVExtraUnexpandedReadStarOArgMArgBVArg} to support reimplementation of \cmd{\mintinline} for \pkg{minted}.
-% \item Added \cmd{VerbEnv} environment, which is an environment variant of \cmd{\Verb}. This supports reimplementation of \cmd{\mintinline} for \pkg{minted}.
-% \item \cmd{breakbefore} and \cmd{breakafter} now support the escaped comma \cmd{\,} (\#15).
-% \item Fixed unintended line breaks after hyphens under LuaTeX (\#14).
-% \item Added documentation on Pandoc compatibility (\#11).
-% \item Replaced \Verb{breakbeforegroup} with \Verb{breakbeforeinrun}, and replaced \Verb{breakaftergroup} with \Verb{breakafterinrun}. With the introduction of \Verb{breaknonspaceingroup}, ``\Verb{group}'' is now reserved for referring to TeX groups \Verb{{...}}.
-% \item Removed dependency on \Verb{ifthen} package.
-% \item \Verb{breakautoindent} now works correctly with Pygments output that treats leading whitespace as a separate token or as part of a token.
-% \end{changelog}
-%
-% \begin{changelog}{v1.4}{2019/02/04}
-% \item Reimplemented \texttt{\string\Verb}. It now works as expected inside other commands (with a few limitations), including in movable arguments, and is compatible with \texttt{hyperref} for things like PDF bookmarks. It now supports \texttt{breaklines} and relevant line-breaking options.
-% \item Reimplemented \texttt{\string\SaveVerb} and \texttt{\string\UseVerb} to be equivalent to the new \texttt{\string\Verb}. The new option \texttt{retokenize} allows saved verbatim material to be retokenized under new \texttt{commandchars} and \texttt{codes} when it is inserted with \texttt{\string\UseVerb}.
-% \item New command \texttt{\string\EscVerb} works like the reimplemented \texttt{\string\Verb}, except that special characters can be escaped with a backslash. It works inside other commands without any limitations, including in movable arguments, and is compatible with \texttt{hyperref} for things like PDF bookmarks.
-% \item Added \texttt{extra} option for switching between the reimplemented \texttt{\string\Verb}, \texttt{\string\SaveVerb}, \texttt{\string\UseVerb} and the original \texttt{fancyvrb} definitions. Reimplemented versions are used by default. This option will apply to any future reimplemented commands and environments.
-% \item New command \texttt{\string\fvinlineset} only applies options to commands related to typesetting verbatim inline, like \texttt{\string\Verb}, \texttt{\string\SaveVerb}, \texttt{\string\UseVerb}. It only works with commands that are defined or reimplemented by \texttt{fvextra}. It overrides options from \texttt{\string\fvset}.
-% \item Patched \texttt{fancyvrb} so that \texttt{\string\Verb} (either reimplemented version or original) can use characters like \texttt{\%} for delimiters when used outside any commands.
-% \item \texttt{obeytabs} now works with the \texttt{calc} package's redefined \texttt{\string\setcounter}. Since \texttt{minted} loads \texttt{calc}, this also fixes \texttt{minted} compatibility (\texttt{minted} \#221).
-% \item Added new option \texttt{fontencoding} (\texttt{minted} \#208).
-% \item \texttt{highlightlines} now works correctly with \texttt{frame} (\#7).
-% \end{changelog}
-%
-% \begin{changelog}{v1.3.1}{2017/07/08}
-% \item \texttt{beameroverlays} now works with \texttt{VerbatimOut}.
-% \end{changelog}
-%
-% \begin{changelog}{v1.3}{2017/07/08}
-% \item Added \texttt{beameroverlays} option, which enables \texttt{beamer} overlays using the \texttt{<} and \texttt{>} characters.
-% \item Added options \texttt{breakindentnchars}, \texttt{breaksymbolsepleftnchars} (alias \texttt{breaksymbolsepnchars}), \texttt{breaksymbolseprightnchars}, \texttt{breaksymbolindentleftnchars} (alias \texttt{breaksymbolindentnchars}), and \texttt{breaksymbolindentrightnchars}. These are identical to the pre-existing options without the \texttt{nchars} suffix, except that they allow indentation to be specified as an integer number of characters rather than as a dimension. As a result of these new options, \texttt{\string\settowidth} is no longer used in the preamble, resolving some font incompatibilities (\#4).
-% \item Clarified in the docs that \texttt{breaksymbolsepright} is a \emph{minimum}, rather than exact, distance.
-% \end{changelog}
-%
-%
-% \begin{changelog}{v1.2.1}{2016/09/02}
-% \item The package is now compatible with classes and packages that redefine \texttt{\string\raggedright}.
-% \item Fixed a bug that introduced extra space in inline contexts such as \texttt{\string\mintinline} when \texttt{breaklines=true} (\#3).
-% \end{changelog}
-%
-%
-% \begin{changelog}{v1.2}{2016/07/20}
-% \item Added support for line breaking when working with Pygments for syntax highlighting.
-% \item The default \texttt{highlightcolor} is now defined with \texttt{rgb} for compatibility with the \texttt{color} package. Fixed a bug in the conditional color definition when \texttt{color} and \texttt{xcolor} are not loaded before \texttt{fvextra}.
-% \end{changelog}
-%
-%
-% \begin{changelog}{v1.1}{2016/07/14}
-% \item The options \texttt{rulecolor} and \texttt{fillcolor} now accept color names directly; using \texttt{\string\color\{<color\_name>\}} is no longer necessary, though it still works.
-% \item Added \texttt{tabcolor} and \texttt{spacecolor} options for use with \texttt{showtabs} and \texttt{showspaces}.
-% \item Added \texttt{highlightlines} option that takes a line number or range of line numbers and highlights the corresponding lines. Added \texttt{highlightcolor} option that controls hightlighting color.
-% \item \texttt{obeytabs} no longer causes lines to vanish when tabs are inside macro arguments. Tabs and spaces inside a macro argument but otherwise at the beginning of a line are expanded correctly. Tabs inside a macro argument that are preceded by non-whitespace characters (not spaces or tabs) are expanded based on the starting position of the run of whitespace in which they occur.
-% \item The line breaking options \texttt{breakanywhere}, \texttt{breakbefore}, and \texttt{breakafter} now work with multi-byte UTF-8 code points under pdfTeX with \texttt{inputenc}. They were already fully functional under XeTeX and LuaTeX.
-% \item Added \texttt{curlyquotes} option, which essentially disables the \texttt{uquote} package.
-% \end{changelog}
-%
-%
-% \begin{changelog}{v1.0}{2016/06/28}
-% \item Initial release.
-% \end{changelog}
-%
-%
% \DoNotIndex{\newcommand,\newenvironment}
% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
% \DoNotIndex{\@ne}
@@ -918,11 +803,11 @@
% Shortcut for setting |bufferlengthname| and |bufferlinename| simultaneously, using the same root name. This sets |bufferlengthname| to |<buffername>length| and |bufferlinename| to |<buffername>line|.
%
% \item[globalbuffer (bool) (false)]
-% This determines whether buffer line macros are defined globally, that is, whether they are accessible after the end of the |VerbatimBuffer| environment. It does not affect any |afterbuffer| macro, since that is invoked inside the environment. |globalbuffer| also determines whether the buffer length counter contains the buffer length or is reset to zero after the end of the |VerbatimBuffer| environment.
+% This determines whether buffer line macros are defined globally, that is, whether they are accessible after the end of the |VerbatimBuffer| environment. If the line macros are defined globally, then the buffer length counter is also increased appropriately outside the environment. |globalbuffer| does not affect any |afterbuffer| macro, since that is invoked inside the environment.
%
% When buffered lines are used immediately, consider using |afterbuffer| instead of |globalbuffer|. When buffered lines must be used later in a document, consider using |globalbuffer| with custom (and perhaps unique) |bufferlinename| and |bufferlengthname|.
%
-% When |globalbuffer=false|, at the end of the environment all buffer line macros based on the current |bufferlinename| are ``deleted'' (|\let| to an undefined macro), and the buffer length counter from |bufferlengthname| is set to zero. This means that a |VerbatimBuffer| environment with |globalbuffer=false| will clear the buffer created by any previous |VerbatimBuffer| that had |globalbuffer=true| and shared the same |bufferlinename|.
+% When |globalbuffer=true|, |VerbatimBuffer| environments with the same buffer name will append to a single buffer, so that it ultimately contains the concatenated contents of all environments. A |VerbatimBuffer| environment with |globalbuffer=false| will append to the buffer created by any previous |VerbatimBuffer| that had |globalbuffer=true| and shared the same buffer name. Any |afterbuffer| macro will have access to a buffer containing the concatenated data. At the very end of the environment with |globalbuffer=false|, after any |afterbuffer|, this appended content will be removed. All buffer line macros (from |bufferlinename|) that were created by that environment are ``deleted'' (|\let| to an undefined macro), and the buffer length counter (from |bufferlengthname|) is reduced proportionally.
% \end{optionlist}
%
%
@@ -936,6 +821,12 @@
% |\VerbatimInsertBuffer| is not implemented using the typical \fancyvrb\ command and environment implementation styles, so it is not compatible with |\RecustomVerbatimCommand| or |\RecustomVerbatimEnvironment|.
%
%
+% \subsection{\cmd{\VerbatimClearBuffer}}
+% \DescribeMacro{\VerbatimClearBuffer\oarg{options}}
+%
+% Clear an existing buffer created with \cmd{VerbatimBuffer}. |\global\let| all buffer line macros to an undefined macro and set the buffer length counter to zero.
+%
+%
%
%
% \section{Line breaking}
@@ -1503,8 +1394,6 @@
%
%
%
-% \PrintChangelog
-%
% \StopEventually{\PrintIndex}
%
% \section{Implementation}
@@ -2219,12 +2108,16 @@
% \begin{macrocode}
\def\FVExtraUnexpandedReadStarOArgMArgBVArg#1#{%
\FV@UnexpandedReadStarOArgMArgBVArg@i{#1}}
-\def\FV@UnexpandedReadStarOArgMArgBVArg@i#1#2#3{%
- \FVExtraAlwaysUnexpanded{\FVExtraUnexpandedReadStarOArgMArgBVArg#1{#2}{#3}}}
+\def\FV@UnexpandedReadStarOArgMArgBVArg@i#1#2{%
+ \FV@UnexpandedReadStarOArgMArgBVArg@ii{#1}{#2}}
+\def\FV@UnexpandedReadStarOArgMArgBVArg@ii#1#2#3#{%
+ \FV@UnexpandedReadStarOArgMArgBVArg@iii{#1}{#2}{#3}}
+\def\FV@UnexpandedReadStarOArgMArgBVArg@iii#1#2#3#4{%
+ \FVExtraAlwaysUnexpanded{\FVExtraUnexpandedReadStarOArgMArgBVArg#1{#2}#3{#4}}}
\FVExtrapdfstringdefDisableCommands{%
\makeatletter
- \def\FV@UnexpandedReadStarOArgMArgBVArg@i#1#2#3{%
- \FVExtraPDFStringVerbatimDetokenize{#3}}%
+ \def\FV@UnexpandedReadStarOArgMArgBVArg@iii#1#2#3#4{%
+ \FVExtraPDFStringVerbatimDetokenize{#4}}%
\makeatother}
% \end{macrocode}
% \end{macro}
@@ -4038,7 +3931,7 @@
% \begin{macro}{VerbatimBuffer}
% The environment implementation follows standard \fancyvrb\ environment style.
%
-% A special buffer counter is used to track line numbers while avoiding incrementing the regular counter that is used for typeset code. Some macros do nothing with the default |bufferer|, but are needed to enable \fancyvrb\ options when a custom |bufferer| is used in conjuction with optional environment arguments. These include |\FancyVerbDefineActive| and |\FancyVerbFormatCom|. Since counters are global, the location of |\setcounter| at the end of the environment relative to |\begingroup...\endgroup| is not important.
+% A special buffer counter is used to track line numbers while avoiding incrementing the regular counter that is used for typeset code. Some macros do nothing with the default |bufferer|, but are needed to enable \fancyvrb\ options when a custom |bufferer| is used in conjuction with optional environment arguments. These include |\FancyVerbDefineActive| and |\FancyVerbFormatCom|. Since counters are global, the exact location of the |\setcounter| commands at the end of the environment relative to |\begingroup...\endgroup| is not important.
% \begin{macrocode}
\newcounter{FancyVerbBufferLine}
\newcounter{FV@oldbufferlength}
@@ -4054,17 +3947,19 @@
\def\FVB@VerbatimBuffer{%
\@bsphack
\begingroup
- \setcounter{FancyVerbBufferLine}{0}%
- \let\c@FancyVerbLine\c@FancyVerbBufferLine
- \setcounter{FancyVerbBufferIndex}{0}%
- \setcounter{FV@oldbufferlength}{\expandafter\value\expandafter{\FV@bufferlengthname}}%
- \expandafter\setcounter\expandafter{\FV@bufferlengthname}{0}%
\FV@UseKeyValues
+ \setcounter{FancyVerbBufferLine}%
+ {\expandafter\value\expandafter{\FV@bufferlengthname}}%
+ \let\c@FancyVerbLine\c@FancyVerbBufferLine
+ \setcounter{FancyVerbBufferIndex}%
+ {\expandafter\value\expandafter{\FV@bufferlengthname}}%
\ifbool{FV@globalbuffer}%
{\global\booltrue{FV@globalbuffer@tmp}}%
- {\global\boolfalse{FV@globalbuffer@tmp}}%
- \global\let\FV@bufferlengthname@tmp\FV@bufferlengthname
- \global\let\FancyVerbBufferLineName@tmp\FancyVerbBufferLineName
+ {\global\boolfalse{FV@globalbuffer@tmp}%
+ \setcounter{FV@oldbufferlength}%
+ {\expandafter\value\expandafter{\FV@bufferlengthname}}%
+ \global\let\FV@bufferlengthname@tmp\FV@bufferlengthname
+ \global\let\FancyVerbBufferLineName@tmp\FancyVerbBufferLineName}%
\global\let\FV@afterbuffer@tmp\FV@afterbuffer
\FV@DefineWhiteSpace
\def\FV@ProcessLine{\stepcounter{FancyVerbBufferIndex}\FV@Bufferer}%
@@ -4074,28 +3969,27 @@
\FancyVerbFormatCom
\FV@Scan}
\def\FVE@VerbatimBuffer{%
- \endgroup
- \@esphack
- \expandafter\setcounter\expandafter{\FV@bufferlengthname@tmp}%
+ \expandafter\setcounter\expandafter{\FV@bufferlengthname}%
{\value{FancyVerbBufferIndex}}%
\setcounter{FancyVerbBufferIndex}{0}%
+ \endgroup
+ \@esphack
\begingroup
\FV@afterbuffer@tmp
+ \global\let\FV@afterbuffer@tmp\relax
\endgroup
\ifbool{FV@globalbuffer@tmp}%
{}%
- {\ifnum\value{FV@oldbufferlength}>%
- \expandafter\value\expandafter{\FV@bufferlengthname@tmp}\relax
- \expandafter\setcounter\expandafter{\FV@bufferlengthname@tmp}%
- {\value{FV@oldbufferlength}}%
- \fi
- \loop\unless\ifnum\expandafter\value\expandafter{\FV@bufferlengthname@tmp}=0\relax
+ {\loop\unless\ifnum\expandafter\value\expandafter{\FV@bufferlengthname@tmp}=
+ \value{FV@oldbufferlength}\relax
\expandafter\global\expandafter\let\csname
\FancyVerbBufferLineName@tmp
\expandafter\arabic\expandafter{\FV@bufferlengthname@tmp}%
\endcsname\FV@Undefined
\expandafter\addtocounter\expandafter{\FV@bufferlengthname@tmp}{-1}%
- \repeat}}
+ \repeat
+ \global\let\FV@bufferlengthname@tmp\relax
+ \global\let\FancyVerbBufferLineName@tmp\relax}}
\def\endVerbatimBuffer{\FVE@VerbatimBuffer}
% \end{macrocode}
% \end{macro}
@@ -4129,7 +4023,7 @@
\global\let\FV@EnvironName\relax
\let\next\relax
\else
- \ifcsname \FancyVerbBufferLineName\arabic{FancyVerbBufferIndex}\endcsname
+ \ifcsname\FancyVerbBufferLineName\arabic{FancyVerbBufferIndex}\endcsname
\expandafter\let\expandafter\FV@Line@Buffer
\csname\FancyVerbBufferLineName\arabic{FancyVerbBufferIndex}\endcsname
\expandafter\VerbatimInsertBuffer@def@FV@Line\expandafter{\FV@Line@Buffer}%
@@ -4148,6 +4042,30 @@
\FVB@Verbatim
\FVE@Verbatim
\setcounter{FancyVerbBufferIndex}{0}%
+ \endgroup
+ \@doendpe}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{\cmd{\VerbatimClearBuffer}}
+% \begin{macro}{\VerbatimClearBuffer}
+% Clear an existing buffer.
+% \begin{macrocode}
+\newcommand{\VerbatimClearBuffer}[1][]{%
+ \begingroup
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues
+ \setcounter{FancyVerbBufferIndex}%
+ {\expandafter\value\expandafter{\FV@bufferlengthname}}%
+ \expandafter\setcounter\expandafter{\FV@bufferlengthname}{0}%
+ \loop\unless\ifnum\value{FancyVerbBufferIndex}<1\relax
+ \expandafter\global\expandafter\let
+ \csname\FancyVerbBufferLineName\arabic{FancyVerbBufferIndex}\endcsname
+ \FV@Undefined
+ \addtocounter{FancyVerbBufferIndex}{-1}%
+ \repeat
+ \setcounter{FancyVerbBufferIndex}{0}%
\endgroup}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/fvextra/fvextra.ins b/macros/latex/contrib/fvextra/fvextra.ins
index f36b3c4715..17b718fa06 100644
--- a/macros/latex/contrib/fvextra/fvextra.ins
+++ b/macros/latex/contrib/fvextra/fvextra.ins
@@ -1,4 +1,4 @@
-%% Copyright (C) 2016-2022 by Geoffrey M. Poore <gpoore@gmail.com>
+%% Copyright (C) 2016-2024 by Geoffrey M. Poore <gpoore@gmail.com>
%% --------------------------------------------------------------------------
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -26,7 +26,7 @@
This is a generated file.
-Copyright (C) 2016-2022 by Geoffrey M. Poore <gpoore@gmail.com>
+Copyright (C) 2016-2024 by Geoffrey M. Poore <gpoore@gmail.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/macros/latex/contrib/fvextra/fvextra.pdf b/macros/latex/contrib/fvextra/fvextra.pdf
index 9e1182bd63..b38e213561 100644
--- a/macros/latex/contrib/fvextra/fvextra.pdf
+++ b/macros/latex/contrib/fvextra/fvextra.pdf
Binary files differ
diff --git a/macros/latex/contrib/huaz/README b/macros/latex/contrib/huaz/README
index b37490a04a..4e8306629f 100644
--- a/macros/latex/contrib/huaz/README
+++ b/macros/latex/contrib/huaz/README
@@ -14,7 +14,7 @@ version 2005/12/01 or later.
This work has the LPPL maintenance status `maintained'.
-The Current Maintainer of this work is Tibor Tomacs.
+The Current Maintainer of this work is Tibor Tómács.
This work consists of the files
diff --git a/macros/latex/contrib/huaz/huaz.pdf b/macros/latex/contrib/huaz/huaz.pdf
index fe31b1cfad..1de65fbd30 100644
--- a/macros/latex/contrib/huaz/huaz.pdf
+++ b/macros/latex/contrib/huaz/huaz.pdf
Binary files differ
diff --git a/macros/latex/contrib/huaz/huaz.sty b/macros/latex/contrib/huaz/huaz.sty
index 1a9435bfff..19ae1dacba 100644
--- a/macros/latex/contrib/huaz/huaz.sty
+++ b/macros/latex/contrib/huaz/huaz.sty
@@ -3,7 +3,7 @@
%%
%% Automatic Hungarian definite articles
%%
-%% Copyright 2022-2024 by Tibor Tomacs
+%% Copyright 2022-2024 by Tibor Tómács
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -15,10 +15,10 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is Tibor Tomacs.
+%% The Current Maintainer of this work is Tibor Tómács.
%%
\NeedsTeXFormat{LaTeX2e}[2021/10/10]
-\ProvidesPackage{huaz}[2024/04/20 v1.2 Automatic Hungarian definite articles]
+\ProvidesPackage{huaz}[2024/05/05 v2.1 Automatic Hungarian definite articles]
\RequirePackage{xstring,refcount,iftex}
@@ -33,36 +33,62 @@
%=================================================
%
% utf8:
-% \huaz@list@A = ö,ü,ó,ő,ú,é,á,ű,í,Ö,Ü,Ó,Ő,Ú,É,Á,Ű,Í,Ä,À,Ã,Â,Ă,Å,Ą,Æ,ä,à,ã,â,ă,å,ą,æ,Ë,È,Ê,Ě,Ę,ë,è,ê,ě,ę,Ï,Í,Ì,Î,ï,ì,î,Ò,Õ,Ô,Ø,OE,ò,õ,ô,ø,Ù,Û,Ů,ù,û,ů
-% \huaz@list@X = Ĺ,Ł,ļ,ĺ,ł,Ņ,Ń,Ñ,Ň,Ŋ,ń,ñ,ň,ŋ,Ŗ,Ŕ,Ř,ŗ,ŕ,ř,Ş,Ș,Ś,Š,ş,ș,ś,š,Ÿ,Ý,ÿ,ý
+% \huaz@list@A = ö,ü,ó,ő,ú,é,á,ű,í,Ö,Ü,Ó,Ő,Ú,É,Á,Ű,Í,Ä,À,Ã,Â,Ă,Å,Ą,Æ,ä,à,ã,â,ă,å,ą,æ,
+% Ë,È,Ê,Ě,Ę,ë,è,ê,ě,ę,Ï,Í,Ì,Î,ï,ì,î,Ò,Õ,Ô,Ø,OE,ò,õ,ô,ø,Ù,Û,Ů,ù,û,ů
+% \huaz@list@S = Ĺ,Ł,ļ,ĺ,ł,Ņ,Ń,Ñ,Ň,Ŋ,ń,ñ,ň,ŋ,Ŗ,Ŕ,Ř,ŗ,ŕ,ř,Ş,Ș,Ś,Š,ş,ș,ś,š,Ÿ,Ý,ÿ,ý
%
% latin2:
% \huaz@list@A = Ą,ą,Á,Â,Ă,Ä,É,Ę,Ë,Ě,Í,Î,Ó,Ô,Ő,Ö,Ů,Ú,Ű,Ü,á,â,ă,ä,é,ę,ë,ě,í
-% \huaz@list@X = Ľ,Ś,Š,Ş,ś,š,ş,Ŕ,Ĺ,Ń,Ň,Ř,Ý,ĺ
+% \huaz@list@S = Ľ,Ś,Š,Ş,ś,š,ş,Ŕ,Ĺ,Ń,Ň,Ř,Ý,ĺ
%
%=================================================
-\ifpdftex
+\ifpdftex% latex, pdflatex
\def\huaz@utfviii{utf8}
\ifx\inputencodingname\huaz@utfviii
- \def\huaz@list@A{^^c3^^b6,^^c3^^bc,^^c3^^b3,^^c5^^91,^^c3^^ba,^^c3^^a9,^^c3^^a1,^^c5^^b1,^^c3^^ad,^^c3^^96,^^c3^^9c,^^c3^^93,^^c5^^90,^^c3^^9a,^^c3^^89,^^c3^^81,^^c5^^b0,^^c3^^8d,^^c3^^84,^^c3^^80,^^c3^^83,^^c3^^82,^^c4^^82,^^c3^^85,^^c4^^84,^^c3^^86,^^c3^^a4,^^c3^^a0,^^c3^^a3,^^c3^^a2,^^c4^^83,^^c3^^a5,^^c4^^85,^^c3^^a6,^^c3^^8b,^^c3^^88,^^c3^^8a,^^c4^^9a,^^c4^^98,^^c3^^ab,^^c3^^a8,^^c3^^aa,^^c4^^9b,^^c4^^99,^^c3^^8f,^^c3^^8d,^^c3^^8c,^^c3^^8e,^^c3^^af,^^c3^^ac,^^c3^^ae,^^c3^^92,^^c3^^95,^^c3^^94,^^c3^^98,^^4f^^45,^^c3^^b2,^^c3^^b5,^^c3^^b4,^^c3^^b8,^^c3^^99,^^c3^^9b,^^c5^^ae,^^c3^^b9,^^c3^^bb,^^c5^^af}
- \def\huaz@list@X{^^c4^^b9,^^c5^^81,^^c4^^bc,^^c4^^ba,^^c5^^82,^^c5^^85,^^c5^^83,^^c3^^91,^^c5^^87,^^c5^^8a,^^c5^^84,^^c3^^b1,^^c5^^88,^^c5^^8b,^^c5^^96,^^c5^^94,^^c5^^98,^^c5^^97,^^c5^^95,^^c5^^99,^^c5^^9e,^^c8^^98,^^c5^^9a,^^c5^^a0,^^c5^^9f,^^c8^^99,^^c5^^9b,^^c5^^a1,^^c5^^b8,^^c3^^9d,^^c3^^bf,^^c3^^bd}
+ \def\huaz@list@A{%
+ ^^c3^^b6,^^c3^^bc,^^c3^^b3,^^c5^^91,^^c3^^ba,^^c3^^a9,^^c3^^a1,^^c5^^b1,^^c3^^ad,%
+ ^^c3^^96,^^c3^^9c,^^c3^^93,^^c5^^90,^^c3^^9a,^^c3^^89,^^c3^^81,^^c5^^b0,^^c3^^8d,%
+ ^^c3^^84,^^c3^^80,^^c3^^83,^^c3^^82,^^c4^^82,^^c3^^85,^^c4^^84,^^c3^^86,^^c3^^a4,%
+ ^^c3^^a0,^^c3^^a3,^^c3^^a2,^^c4^^83,^^c3^^a5,^^c4^^85,^^c3^^a6,^^c3^^8b,^^c3^^88,%
+ ^^c3^^8a,^^c4^^9a,^^c4^^98,^^c3^^ab,^^c3^^a8,^^c3^^aa,^^c4^^9b,^^c4^^99,^^c3^^8f,%
+ ^^c3^^8d,^^c3^^8c,^^c3^^8e,^^c3^^af,^^c3^^ac,^^c3^^ae,^^c3^^92,^^c3^^95,^^c3^^94,%
+ ^^c3^^98,^^4f^^45,^^c3^^b2,^^c3^^b5,^^c3^^b4,^^c3^^b8,^^c3^^99,^^c3^^9b,^^c5^^ae,%
+ ^^c3^^b9,^^c3^^bb,^^c5^^af}
+ \def\huaz@list@S{%
+ ^^c4^^b9,^^c5^^81,^^c4^^bc,^^c4^^ba,^^c5^^82,^^c5^^85,^^c5^^83,^^c3^^91,^^c5^^87,%
+ ^^c5^^8a,^^c5^^84,^^c3^^b1,^^c5^^88,^^c5^^8b,^^c5^^96,^^c5^^94,^^c5^^98,^^c5^^97,%
+ ^^c5^^95,^^c5^^99,^^c5^^9e,^^c8^^98,^^c5^^9a,^^c5^^a0,^^c5^^9f,^^c8^^99,^^c5^^9b,%
+ ^^c5^^a1,^^c5^^b8,^^c3^^9d,^^c3^^bf,^^c3^^bd}
\huaz@must@oneunit@false
\fi
\def\huaz@latinii{latin2}
\ifx\inputencodingname\huaz@latinii
- \def\huaz@list@A{^^a1,^^b1,^^c1,^^c2,^^c3,^^c4,^^c9,^^ca,^^cb,^^cc,^^cd,^^ce,^^d3,^^d4,^^d5,^^d6,^^d9,^^da,^^db,^^dc,^^e1,^^e2,^^e3,^^e4,^^e5,^^e9,^^ea,^^eb,^^ec,^^ed,^^ee,^^f3,^^f4,^^f5,^^f6,^^f9,^^fa,^^fb,^^fc}
- \def\huaz@list@X{^^a3,^^a5,^^a6,^^a9,^^aa,^^b3,^^b6,^^b9,^^ba,^^c0,^^c5,^^d1,^^d2,^^d8,^^dd,^^df,^^e0,^^f1,^^f2,^^f8,^^fd}
+ \def\huaz@list@A{%
+ ^^a1,^^b1,^^c1,^^c2,^^c3,^^c4,^^c9,^^ca,^^cb,^^cc,^^cd,^^ce,^^d3,^^d4,^^d5,^^d6,%
+ ^^d9,^^da,^^db,^^dc,^^e1,^^e2,^^e3,^^e4,^^e5,^^e9,^^ea,^^eb,^^ec,^^ed,^^ee,^^f3,%
+ ^^f4,^^f5,^^f6,^^f9,^^fa,^^fb,^^fc}
+ \def\huaz@list@S{%
+ ^^a3,^^a5,^^a6,^^a9,^^aa,^^b3,^^b6,^^b9,^^ba,^^c0,^^c5,^^d1,^^d2,^^d8,^^dd,^^df,%
+ ^^e0,^^f1,^^f2,^^f8,^^fd}
\huaz@must@oneunit@true
\fi
- \ifx\inputencodingname\huaz@utfviii\else
- \ifx\inputencodingname\huaz@latinii\else
- \PackageError{huaz}{You should use utf8 or latin2 inputenc}{}
- \fi
- \fi
-\else
- \def\huaz@list@A{^^^^00f6,^^^^00fc,^^^^00f3,^^^^0151,^^^^00fa,^^^^00e9,^^^^00e1,^^^^0171,^^^^00ed,^^^^00d6,^^^^00dc,^^^^00d3,^^^^0150,^^^^00da,^^^^00c9,^^^^00c1,^^^^0170,^^^^00cd,^^^^00c4,^^^^00c0,^^^^00c3,^^^^00c2,^^^^0102,^^^^00c5,^^^^0104,^^^^00c6,^^^^00e4,^^^^00e0,^^^^00e3,^^^^00e2,^^^^0103,^^^^00e5,^^^^0105,^^^^00e6,^^^^00cb,^^^^00c8,^^^^00ca,^^^^011a,^^^^0118,^^^^00eb,^^^^00e8,^^^^00ea,^^^^011b,^^^^0119,^^^^00cf,^^^^00cd,^^^^00cc,^^^^00ce,^^^^00ef,^^^^00ec,^^^^00ee,^^^^00d2,^^^^00d5,^^^^00d4,^^^^00d8,^^^^004f,^^^^0045,^^^^00f2,^^^^00f5,^^^^00f4,^^^^00f8,^^^^00d9,^^^^00db,^^^^016e,^^^^00f9,^^^^00fb,^^^^016f}
- \def\huaz@list@X{^^^^0139,^^^^0141,^^^^013c,^^^^013a,^^^^0142,^^^^0145,^^^^0143,^^^^00d1,^^^^0147,^^^^014a,^^^^0144,^^^^00f1,^^^^0148,^^^^014b,^^^^0156,^^^^0154,^^^^0158,^^^^0157,^^^^0155,^^^^0159,^^^^015e,^^^^0218,^^^^015a,^^^^0160,^^^^015f,^^^^0219,^^^^015b,^^^^0161,^^^^0178,^^^^00dd,^^^^00ff,^^^^00fd}
+ \ifdefined\huaz@list@A\else\PackageError{huaz}{You should use utf8 or latin2 inputenc}{}\fi
+\else% xelatex lualatex
+ \def\huaz@list@A{%
+ ^^^^00f6,^^^^00fc,^^^^00f3,^^^^0151,^^^^00fa,^^^^00e9,^^^^00e1,^^^^0171,^^^^00ed,%
+ ^^^^00d6,^^^^00dc,^^^^00d3,^^^^0150,^^^^00da,^^^^00c9,^^^^00c1,^^^^0170,^^^^00cd,%
+ ^^^^00c4,^^^^00c0,^^^^00c3,^^^^00c2,^^^^0102,^^^^00c5,^^^^0104,^^^^00c6,^^^^00e4,%
+ ^^^^00e0,^^^^00e3,^^^^00e2,^^^^0103,^^^^00e5,^^^^0105,^^^^00e6,^^^^00cb,^^^^00c8,%
+ ^^^^00ca,^^^^011a,^^^^0118,^^^^00eb,^^^^00e8,^^^^00ea,^^^^011b,^^^^0119,^^^^00cf,%
+ ^^^^00cd,^^^^00cc,^^^^00ce,^^^^00ef,^^^^00ec,^^^^00ee,^^^^00d2,^^^^00d5,^^^^00d4,%
+ ^^^^00d8,^^^^004f,^^^^0045,^^^^00f2,^^^^00f5,^^^^00f4,^^^^00f8,^^^^00d9,^^^^00db,%
+ ^^^^016e,^^^^00f9,^^^^00fb,^^^^016f}
+ \def\huaz@list@S{%
+ ^^^^0139,^^^^0141,^^^^013c,^^^^013a,^^^^0142,^^^^0145,^^^^0143,^^^^00d1,^^^^0147,%
+ ^^^^014a,^^^^0144,^^^^00f1,^^^^0148,^^^^014b,^^^^0156,^^^^0154,^^^^0158,^^^^0157,%
+ ^^^^0155,^^^^0159,^^^^015e,^^^^0218,^^^^015a,^^^^0160,^^^^015f,^^^^0219,^^^^015b,%
+ ^^^^0161,^^^^0178,^^^^00dd,^^^^00ff,^^^^00fd}
\huaz@must@oneunit@true
\fi
@@ -74,15 +100,27 @@
\NewHook{huaz}
-\AddToHook{huaz}{% In \StrChar, these commands will be considered as one syntax unit.
- \let\"\relax\let\'\relax\let\H\relax\let\`\relax\let\~\relax\let\^\relax\let\v\relax\let\u\relax%
- \let\=\relax\let\k\relax\let\.\relax\let\AA\relax\let\aa\relax\let\AE\relax\let\ae\relax\let\&\relax%
- \let\#\relax\let\_\relax}
-
-\def\huaz@y@#1#{\@gobble}
-\def\huaz@deloptparam{\huaz@y@\relax}% \def\textcolor{\huaz@deloptparam} --> \textcolor[RGB]{0,255,0}{text} --> text; \textcolor{red}{text} --> text
-
-\AddToHook{huaz}{% Ignored commands
+\AddToHook{huaz}{%
+ %
+ % Accent commands are considered as one unit
+ \let\"\relax\let\'\relax\let\`\relax\let\~\relax% \def\'{} ==> \az*{\'{X}}=\az*{X}=\az*{10}=a is not correct
+ \let\^\relax\let\=\relax\let\.\relax%
+ \let\b\relax\let\B\relax\let\c\relax\let\d\relax%
+ \let\H\relax\let\k\relax\let\r\relax\let\u\relax\let\v\relax%
+ %
+ % Redefining letter commands
+ \def\AA{a}\def\aa{a}\def\AE{a}\def\ae{a}%
+ \def\IJ{a}\def\ij{a}\def\i{a}% \def\i{i} ==> \az*{\i x}=\az*{ix}=\az*{9}=a is not correct
+ \def\O{a}\def\o{a}\def\OE{a}\def\oe{a}%
+ \def\l{s}\def\NG{s}\def\ng{s}\def\SS{s}\def\ss{s}%
+ %
+ % Redefinition of punctuation commands to period
+ \def\&{.}\def\#{.}\def\%{.}\def\_{.}%
+ %
+ % Redefinition of space commands to normal space
+ \def\,{ }\def\:{ }\def\;{ }\def\enspace{ }\def\enskip{ }\def\quad{ }\def\qquad{ }%
+ %
+ % Ignore commands
\def\usefont#1#2#3#4{}%
\def\fontsize#1#2{}%
\def\fontencoding#1{}%
@@ -108,19 +146,106 @@
\def\tiny{}\def\scriptsize{}\def\footnotesize{}\def\small{}\def\normalsize{}%
\def\large{}\def\Large{}\def\LARGE{}\def\huge{}\def\Huge{}%
\def\uppercase{}\def\lowercase{}\def\MakeUppercase{}\def\MakeLowercase{}%
- \def\textcolor{\huaz@deloptparam}\def\color{\huaz@deloptparam}%
- \def\mbox{}\def\fbox{}%
+ \def\textcolor#1#{\@gobble}% \textcolor[...]{...}{text} and \textcolor{...}{text} --> text
+ \def\color#1#{\@gobble}% \color[...]{...}text and \color{...}text --> text
+ \def\href#1#{\@gobble}% \href{URL}{text} --> text
+ \def\mbox{}\def\fbox{}\def\hbox{}%
\def\makebox#1#{}% \makebox{text} and \makebox[opt]{text} --> text
\def\framebox#1#{}% \framebox{text} and \framebox[opt]{text} --> text
\def\textqq{}%
\def\enquote#1#{}% \enquote{text} and \enquote*{text} --> text
- \def\told{}}
-
-\AddToHook{huaz}{% Expandable cross-references commands
+ \def\told{}%
+ \def\num#1#{}% (siunitx package) \num[...]{1000000} --> 1000000
+ \def\negthinspace{}\def\!{}%
+ %
+ % Expandable cross-references commands
\def\ref#1#{\getrefnumber}% \ref{...} and \ref*{...} --> \getrefnumber{...}
\def\pageref#1#{\getpagerefnumber}% \pageref{...} and \pageref*{...} --> \getpagerefnumber{...}
- \def\eqref#1{\getrefnumber{#1}}%
- \def\cite{\huaz@cite}}
+ \def\eqref#1#{\getrefnumber}% \eqref{...} (amsmath) and \eqref*{...} (!!) --> \getrefnumber{...}
+ \def\refeq#1#{\getrefnumber}% \refeq{...} (mathtools) and \refeq*{...} (!!) --> \getrefnumber{...}
+ \def\cite{\huaz@cite}%
+ \def\citeauthor{\huaz@citeauthor}%
+ \def\textcite{\huaz@citeauthor}%
+ \def\citeyear{\huaz@citeyear}%
+ }
+
+%=================================================
+%
+% \huazignorecmd[option]{\command}
+% option: 0,1,...,9
+%
+% \huazignorecmd{\foo} = \AddToHook{huaz}{\def\foo{}}
+% ignored: \foo
+% for example: \huazignorecmd{\rmfamily}
+% \rmfamily text --> text
+%
+% \huazignorecmd[0]{\foo} = \AddToHook{huaz}{\def\foo#1#{}}
+% ignored: \foo, \foo*, \foo[...], \foo*[...]
+% for example: \huazignorecmd{\textrm}
+% \textrm{text} --> text
+% \huazignorecmd{\makebox}
+% \makebox[5cm]{text} --> text
+%
+% \huazignorecmd[1]{\foo} = \AddToHook{huaz}{\def\foo#1#{\@gobble}}
+% ignored: \foo{...}, \foo[...]{...}, \foo*[...]{...}
+% for example: \huazignorecmd{\textcolor}
+% \textcolor[RGB]{0,255,0}{text} --> text
+%
+% \huazignorecmd[2]{\foo} = \AddToHook{huaz}{\def\foo#1#{\huaz@gobble@ii}}
+% ignored: \foo{...}{...}, \foo[...]{...}{...}, \foo*[...]{...}{...}
+% for example: \huazignorecmd{\fontsize}
+% \fontsize{12pt}{12pt}text --> text
+%
+%=================================================
+
+\newcommand{\huaz@gobble@ii}[2]{}
+\newcommand{\huaz@gobble@iii}[3]{}
+\newcommand{\huaz@gobble@iv}[4]{}
+\newcommand{\huaz@gobble@v}[5]{}
+\newcommand{\huaz@gobble@vi}[6]{}
+\newcommand{\huaz@gobble@vii}[7]{}
+\newcommand{\huaz@gobble@viii}[8]{}
+\newcommand{\huaz@gobble@ix}[9]{}
+
+\def\huaz@check@opt#1{%
+ \def\huaz@opt{#1}%
+ \huaz@temp@if@false%
+ \@for\huaz@list:={,0,1,2,3,4,5,6,7,8,9,10}%
+ \do{\IfStrEq{\huaz@opt}{\huaz@list}{\huaz@temp@if@true}{}}%
+ \IfStrEq{\huaz@opt}{}{\def\huaz@opt{10}}{}%
+ \ifhuaz@temp@if@\else
+ \def\huaz@opt{10}%
+ \PackageWarning{huaz}{Valid options for \string\huazignorecmd: 0,1,...,9. The '[#1]' has been removed.}\fi}
+
+\NewDocumentCommand{\huazignorecmd}{>{\TrimSpaces}O{10}m}{%
+ \huaz@check@opt{#1}%
+ \ifcase\huaz@opt%
+ \AddToHook{huaz}{\def#2##1##{}}\or
+ \AddToHook{huaz}{\def#2##1##{\@gobble}}\or
+ \AddToHook{huaz}{\def#2##1##{\huaz@gobble@ii}}\or
+ \AddToHook{huaz}{\def#2##1##{\huaz@gobble@iii}}\or
+ \AddToHook{huaz}{\def#2##1##{\huaz@gobble@iv}}\or
+ \AddToHook{huaz}{\def#2##1##{\huaz@gobble@v}}\or
+ \AddToHook{huaz}{\def#2##1##{\huaz@gobble@vi}}\or
+ \AddToHook{huaz}{\def#2##1##{\huaz@gobble@vii}}\or
+ \AddToHook{huaz}{\def#2##1##{\huaz@gobble@viii}}\or
+ \AddToHook{huaz}{\def#2##1##{\huaz@gobble@ix}}\or
+ \AddToHook{huaz}{\def#2{}}\fi}
+
+%=================================================
+%
+% \huazrefcmd{\foo} = \AddToHook{huaz}{\def\foo#1#{\getrefnumber}}
+% --> \foo{...}, \foo[...]{...}, \foo*[...]{...} --> \getrefnumber{...}
+%
+% \huazpagerefcmd{\foo} = \AddToHook{huaz}{\def\foo#1#{\getpagerefnumber}}
+% --> \foo{...}, \foo[...]{...}, \foo*[...]{...} --> \getpagerefnumber{...}
+%
+% \huazdefcmd{...} = \AddToHook{huaz}{...}
+%=================================================
+
+\NewDocumentCommand{\huazrefcmd}{m}{\AddToHook{huaz}{\def#1##1##{\getrefnumber}}}
+\NewDocumentCommand{\huazpagerefcmd}{m}{\AddToHook{huaz}{\def#1##1##{\getpagerefnumber}}}
+\NewDocumentCommand{\huazdefcmd}{m}{\AddToHook{huaz}{#1}}
%=================================================
%
@@ -136,75 +261,141 @@
\UseHook{huaz}%
\huaz@must@z@false%
%
- % 1. syntax unit \AA,\aa,\AE,\ae,e,u,i,o,a,E,U,I,O,A,5
+ % 1. unit: e,u,i,o,a,E,U,I,O,A,5
+ %
\StrChar{#1}{1}[\huaz@temp]%
- \@for\huaz@list:={\AA,\aa,\AE,\ae,e,u,i,o,a,E,U,I,O,A,5}%
+ \@for\huaz@list:={e,u,i,o,a,E,U,I,O,A,5}%
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
%
- % 1. syntax unit accent command and 2. character e,u,i,o,a,E,U,I,O,A (e.g. "\'A")
+ % 1. unit: accent command
+ % 2. unit: e,u,i,o,a,E,U,I,O,A
+ % "\'A" "\'{A}"
+ %
+ \ifhuaz@must@z@\else%
+ \huaz@temp@if@false%
+ \StrChar{#1}{1}[\huaz@temp]%
+ \@for\huaz@list:={\",\',\`,\~,\^,\=,\.,\b,\B,\c,\d,\H,\k,\r,\u,\v}%
+ \do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@temp@if@true}{}}%
+ \ifhuaz@temp@if@%
+ \StrChar{#1}{2}[\huaz@temp]%
+ \@for\huaz@list:={e,u,i,o,a,E,U,I,O,A}%
+ \do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
+ \fi%
+ \fi%
+ %
+ % 1. unit: \",\',\`,\~,\^,\=,\.
+ % 2. unit: space(s)
+ % 3. unit: e,u,i,o,a,E,U,I,O,A
+ % "\' A", "\' A", "\' {A}"
+ %
\ifhuaz@must@z@\else%
\huaz@temp@if@false%
\StrChar{#1}{1}[\huaz@temp]%
- \@for\huaz@list:={\",\',\H,\`,\~,\^,\v,\u,\=,\k}%
+ \@for\huaz@list:={\",\',\`,\~,\^,\=,\.}%
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@temp@if@true}{}}%
\ifhuaz@temp@if@%
+ \huaz@temp@if@false%
\StrChar{#1}{2}[\huaz@temp]%
- \@for\huaz@list:={e,u,i,a,E,U,I,O,A}%
+ \IfStrEq{\huaz@temp}{ }{\huaz@temp@if@true}{}%
+ \fi%
+ \ifhuaz@temp@if@%
+ \StrChar{#1}{3}[\huaz@temp]%
+ \@for\huaz@list:={e,u,i,o,a,E,U,I,O,A}%
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
\fi%
\fi%
%
- % 1. character ö,ü,ó,ő,ú,é,á,ű,í,Ö,Ü,Ó,Ő,Ú,É,Á,Ű,Í,...
+ % 1. unit: \huaz@list@A
+ %
\ifhuaz@must@z@\else%
- \ifhuaz@must@oneunit@\StrLeft{#1}{1}[\huaz@tempa]\else\StrLeft{#1}{2}[\huaz@tempa]\fi% in pdflatex(utf8) Ő is two syntax units; in pdflatex(latin2)/xelatex/lualatex Ő is one syntax unit
+ \ifhuaz@must@oneunit@\StrLeft{#1}{1}[\huaz@tempa]\else\StrLeft{#1}{2}[\huaz@tempa]\fi% in pdflatex(utf8) Ő is two units; in pdflatex(latin2)/xelatex/lualatex Ő is one unit
\@for\huaz@list:=\huaz@list@A%
\do{\StrLeft{\huaz@list}{2}[\huaz@tempb]%
\IfStrEq{\huaz@tempa}{\huaz@tempb}{\huaz@must@z@true}{}}%
\fi%
%
- % 1. character f,l,m,n,r,x,y,F,L,M,N,S,R,X,Y and the 2. character is not letter (e.g. "M-10")
+ % 1. unit: f,l,m,n,s,r,x,y,F,L,M,N,S,R,X,Y,\huaz@list@S(one unit)
+ % 2. unit: punctuation
+ % "M-10"
+ %
\ifhuaz@must@z@\else%
\huaz@temp@if@false%
\StrChar{#1}{2}[\huaz@temp]%
- \@for\huaz@list:={;,`,',",+,!,/,=,(,),<,>,@,.,?,:,-,*,0,1,2,3,4,5,6,7,8,9,{,},{ },{},\&,\#,\_,\unskip,\kern}% \kern, \unskip for active characters
+ \@for\huaz@list:={;,`,',",+,!,/,=,(,),<,>,@,.,?,:,-,*,0,1,2,3,4,5,6,7,8,9,{,},{ },{},\unskip,\kern}% \kern, \unskip for active characters
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@temp@if@true}{}}%
\ifhuaz@temp@if@%
\StrChar{#1}{1}[\huaz@temp]%
- \@for\huaz@list:={f,l,m,n,r,x,y,F,L,M,N,S,R,X,Y}%
+ \@for\huaz@list:={f,l,m,n,s,r,x,y,F,L,M,N,S,R,X,Y}%
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
\ifhuaz@must@oneunit@%
\ifhuaz@must@z@\else%
- \@for\huaz@list:=\huaz@list@X% in pdflatex(latin2)/xelatex/lualatex Š is one syntax unit
+ \@for\huaz@list:=\huaz@list@S% in pdflatex(latin2)/xelatex/lualatex Š is one unit
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
\fi%
\fi%
\fi%
\fi%
%
- % 1. syntax unit accent command, 2. character f,l,m,n,r,x,y,F,L,M,N,S,R,X,Y and the 3. character is not letter (e.g. "\^Y.")
+ % 1. unit: accent command
+ % 2. unit: f,l,m,n,r,x,y,F,L,M,N,S,R,X,Y
+ % 3. unit: punctuation
+ % "\^Y."
+ %
\ifhuaz@must@z@\else%
\huaz@temp@if@false%
\StrChar{#1}{3}[\huaz@temp]%
- \@for\huaz@list:={;,`,',",+,!,/,=,(,),<,>,@,.,?,:,-,*,0,1,2,3,4,5,6,7,8,9,{,},{ },{},\&,\#,\_,\unskip,\kern}% \kern, \unskip for active characters
+ \@for\huaz@list:={;,`,',",+,!,/,=,(,),<,>,@,.,?,:,-,*,0,1,2,3,4,5,6,7,8,9,{,},{ },{},\unskip,\kern}% \kern, \unskip for active characters
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@temp@if@true}{}}%
\ifhuaz@temp@if@%
\huaz@temp@if@false%
\StrChar{#1}{2}[\huaz@temp]%
- \@for\huaz@list:={f,l,m,n,r,x,y,F,L,M,N,S,R,X,Y}%
+ \@for\huaz@list:={f,l,m,n,s,r,x,y,F,L,M,N,S,R,X,Y}%
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@temp@if@true}{}}%
- \ifhuaz@temp@if@%
- \StrChar{#1}{1}[\huaz@temp]%
- \@for\huaz@list:={\",\',\H,\`,\~,\^,\v,\u,\=,\k}%
- \do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
- \fi%
+ \fi%
+ \ifhuaz@temp@if@%
+ \StrChar{#1}{1}[\huaz@temp]%
+ \@for\huaz@list:={\",\',\`,\~,\^,\=,\.,\b,\B,\c,\d,\H,\k,\r,\u,\v}%
+ \do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
\fi%
\fi%
%
- % first two characters ly,Ly,LY,ny,Ny,NY,sz,Sz,SZ,... and the 3. character is not letter (e.g. "NY" or "SZ-2")
+ % 1. unit: \",\',\`,\~,\^,\=,\.
+ % 2. unit: space(s)
+ % 3. unit: f,l,m,n,r,x,y,F,L,M,N,S,R,X,Y
+ % 4. unit: punctuation
+ % "\^ Y."
+ %
+ \ifhuaz@must@z@\else%
+ \huaz@temp@if@false%
+ \StrChar{#1}{4}[\huaz@temp]%
+ \@for\huaz@list:={;,`,',",+,!,/,=,(,),<,>,@,.,?,:,-,*,0,1,2,3,4,5,6,7,8,9,{,},{ },{},\unskip,\kern}% \kern, \unskip for active characters
+ \do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@temp@if@true}{}}%
+ \ifhuaz@temp@if@%
+ \huaz@temp@if@false%
+ \StrChar{#1}{3}[\huaz@temp]%
+ \@for\huaz@list:={f,l,m,n,s,r,x,y,F,L,M,N,S,R,X,Y}%
+ \do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@temp@if@true}{}}%
+ \fi%
+ \ifhuaz@temp@if@%
+ \huaz@temp@if@false%
+ \StrChar{#1}{2}[\huaz@temp]%
+ \IfStrEq{\huaz@temp}{ }{\huaz@temp@if@true}{}%
+ \fi%
+ \ifhuaz@temp@if@%
+ \StrChar{#1}{1}[\huaz@temp]%
+ \@for\huaz@list:={\",\',\`,\~,\^,\=,\.}%
+ \do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
+ \fi%
+ \fi%
+ %
+ % 1-2. units: ly,Ly,LY,ny,Ny,NY,sz,Sz,SZ,\huaz@list@S(two units)
+ % 3. unit: punctuation
+ % "NY" "SZ-2"
+ %
\ifhuaz@must@z@\else%
\huaz@temp@if@false%
\StrChar{#1}{3}[\huaz@temp]%
- \@for\huaz@list:={;,`,',",+,!,/,=,(,),<,>,@,.,?,:,-,*,0,1,2,3,4,5,6,7,8,9,{,},{ },{},\&,\#,\_,\unskip,\kern}% \kern, \unskip for active characters
+ \@for\huaz@list:={;,`,',",+,!,/,=,(,),<,>,@,.,?,:,-,*,0,1,2,3,4,5,6,7,8,9,{,},{ },{},\unskip,\kern}% \kern, \unskip for active characters
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@temp@if@true}{}}%
\ifhuaz@temp@if@%
\StrLeft{#1}{2}[\huaz@temp]%
@@ -212,14 +403,17 @@
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
\ifhuaz@must@oneunit@\else%
\ifhuaz@must@z@\else%
- \@for\huaz@list:=\huaz@list@X% in pdflatex(utf8) Š is two syntax units
+ \@for\huaz@list:=\huaz@list@S% in pdflatex(utf8) Š is two units
\do{\IfStrEq{\huaz@temp}{\huaz@list}{\huaz@must@z@true}{}}%
\fi%
\fi%
\fi%
\fi%
%
- % 1. character 1 and the 2. character is not number (e.g. "1H")
+ % 1. unit: 1
+ % 2. unit: not digit
+ % "1H"
+ %
\ifhuaz@must@z@\else%
\StrChar{#1}{1}[\huaz@temp]%
\IfStrEq{\huaz@temp}{1}{%
@@ -228,14 +422,17 @@
}{}%
\fi%
%
- % 1000,...,1999 and the 5. character is not number ("ezer...")
+ % 1000,...,1999
+ % 5. unit: not digit
+ % "1000. sor" --> ezredik sor
+ %
\ifhuaz@must@z@\else%
\StrLen{#1}[\huaz@temp]%
\setcounter{huaz@temp@count}{\huaz@temp}%
\ifnum\value{huaz@temp@count}>3%
\StrChar{#1}{1}[\huaz@temp]%
\IfStrEq{\huaz@temp}{1}{%
- \StrMid{#1}{2}{4}[\huaz@temp]%
+ \StrLeft{#1}{4}[\huaz@temp]%
\IfInteger{\huaz@temp}{%
\StrChar{#1}{5}[\huaz@temp]%
\IfInteger{\huaz@temp}{}{\huaz@must@z@true}%
@@ -244,14 +441,17 @@
\fi%
\fi%
%
- % 1000000,...,1999999 and the 8. character is not number ("egymillió...")
+ % 1000000,...,1999999
+ % 8. unit: not digit
+ % "1000000 ember" --> egymillió ember
+ %
\ifhuaz@must@z@\else%
\StrLen{#1}[\huaz@temp]%
\setcounter{huaz@temp@count}{\huaz@temp}%
\ifnum\value{huaz@temp@count}>6%
\StrChar{#1}{1}[\huaz@temp]%
\IfStrEq{\huaz@temp}{1}{%
- \StrMid{#1}{2}{7}[\huaz@temp]%
+ \StrLeft{#1}{7}[\huaz@temp]%
\IfInteger{\huaz@temp}{%
\StrChar{#1}{8}[\huaz@temp]%
\IfInteger{\huaz@temp}{}{\huaz@must@z@true}%
@@ -260,14 +460,17 @@
\fi%
\fi%
%
- % 1000000000,...,1999999999 and the 11. character is not number ("egymilliárd...")
+ % 1000000000,...,1999999999
+ % 11. unit: not digit
+ % "1000000000 ember" --> egymilliárd ember
+ %
\ifhuaz@must@z@\else%
\StrLen{#1}[\huaz@temp]%
\setcounter{huaz@temp@count}{\huaz@temp}%
\ifnum\value{huaz@temp@count}>9%
\StrChar{#1}{1}[\huaz@temp]%
\IfStrEq{\huaz@temp}{1}{%
- \StrMid{#1}{2}{10}[\huaz@temp]%
+ \StrLeft{#1}{10}[\huaz@temp]%
\IfInteger{\huaz@temp}{%
\StrChar{#1}{11}[\huaz@temp]%
\IfInteger{\huaz@temp}{}{\huaz@must@z@true}%
@@ -302,36 +505,49 @@
%=================================================
%
-% \huaz@try@roman{<...>}
-% Collect the characters i,v,x,l,c,d,m,I,V,X,L,C,D,M from the beginning of <...>.
-% This string is saved into \huaz@try@roman@result.
-% If this string is empty, then \huaz@try@roman@result is <...>. E.g.
-% \huaz@try@roman{XIV.6}\huaz@try@roman@result --> "XIV"
-% \huaz@try@roman{xiii.x}\huaz@try@roman@result --> "xiii"
-% \huaz@try@roman{d.xiii}\huaz@try@roman@result --> "d"
-% \huaz@try@roman{a.xiii}\huaz@try@roman@result --> "a.xiii"
-% \huaz@try@roman{XIii}\huaz@try@roman@result --> "XIii"
-% \huaz@try@roman{aXIIII}\huaz@try@roman@result --> "aXIIII"
+% \huaz@collect@roman{<...>}
+% Collecting the characters i,v,x,l,c,d,m,I,V,X,L,C,D,M from the beginning of <...>
+% "XIII" --> result string is "XIII"
+% "xiii.x" --> result string is "xiii"
+% "x ii.x" --> result string is "x"
+% "VB" --> result string is "V"
+% "XIV6" --> result string is "XIV"
+% "aXIII" --> result string is ""
+% If the result string = <...>, then \huaz@collect@roman@result := result string
+% \huaz@collect@roman{XIII}\huaz@collect@roman@result --> "XIII"
+% If the result string is not empty and the first character after it is a punctuation mark or space in <...> , then \huaz@collect@roman@result := result string
+% \huaz@collect@roman{xiii.x}\huaz@collect@roman@result --> "xiii"
+% \huaz@collect@roman{x ii.x}\huaz@collect@roman@result --> "x"
+% If the result string is not empty and the first character after it is a letter or digit in <...> , then \huaz@collect@roman@result := ""
+% \huaz@collect@roman{VB}\huaz@collect@roman@result --> ""
+% \huaz@collect@roman{XIV6}\huaz@collect@roman@result --> ""
+% If the result string is empty then \huaz@collect@roman@result := ""
+% \huaz@collect@roman{aXIII}\huaz@collect@roman@result --> ""
%
%=================================================
-\NewDocumentCommand{\huaz@try@roman}{m}{%
+\NewDocumentCommand{\huaz@collect@roman}{m}{%
\begingroup%
\exploregroups%
\UseHook{huaz}%
\StrLen{#1}[\huaz@temp]%
\setcounter{huaz@temp@count}{\huaz@temp}%
\setcounter{huaz@temp@count@}{1}%
- \gdef\huaz@try@roman@result{}%
+ \gdef\huaz@collect@roman@result{}%
\loop%
- \huaz@temp@if@false%
\StrChar{#1}{\thehuaz@temp@count@}[\huaz@temp]%
- \IfSubStr{ivxlcdmIVXLCDM}{\huaz@temp}{%
- \expandafter\g@addto@macro\expandafter\huaz@try@roman@result\expandafter{\huaz@temp}}
+ \IfSubStr{ivxlcdmIVXLCDM}{\huaz@temp}
+ {\expandafter\g@addto@macro\expandafter\huaz@collect@roman@result\expandafter{\huaz@temp}}
{\setcounter{huaz@temp@count@}{\value{huaz@temp@count}}}%
\ifnum\value{huaz@temp@count@}<\value{huaz@temp@count}\stepcounter{huaz@temp@count@}%
\repeat%
- \ifx\huaz@try@roman@result\@empty\gdef\huaz@try@roman@result{#1}\fi%
+ \IfStrEq{\huaz@collect@roman@result}{}{}{%
+ \huaz@temp@if@false%
+ \StrBehind{#1}{\huaz@collect@roman@result}[\huaz@tempa]%
+ \StrChar{\huaz@tempa}{1}[\huaz@tempb]%
+ \@for\huaz@list:={;,`,',",+,!,/,=,(,),<,>,@,.,?,:,-,*,{,},{ },{},\unskip,\kern}% \kern, \unskip for active characters
+ \do{\IfStrEq{\huaz@tempb}{\huaz@list}{\huaz@temp@if@true}{}}%
+ \ifhuaz@temp@if@\else\gdef\huaz@collect@roman@result{}\fi}%
\endgroup}
%=================================================
@@ -344,21 +560,32 @@
%=================================================
%
+% \azseparator
+%
+%=================================================
+
+\def\azseparator#1{\def\huaz@sep{#1}}
+\def\huaz@sep{~}
+
+%=================================================
+%
% \huaz@text
%
%=================================================
\NewDocumentCommand{\huaz@text}{st{=}m}{%
- \huaz@try@roman{#3}%
- \def\huaz@tempa{-1}%
- \edef\huaz@tempb{\huaz@romantoarabic{\huaz@try@roman@result}}%
+ \huaz@collect@roman{#3}%
+ \huaz@temp@if@true%
+ \edef\huaz@temp{\huaz@romantoarabic{\huaz@collect@roman@result}}%
+ \IfStrEq{\huaz@temp}{0}{\huaz@temp@if@false}{}%
+ \IfStrEq{\huaz@temp}{-1}{\huaz@temp@if@false}{}%
\IfBooleanTF{#2}{\huaz@z{#3}}{%
- \ifx\huaz@tempb\huaz@tempa%
- \huaz@z{#3}%
+ \ifhuaz@temp@if@%
+ \huaz@z{\huaz@romantoarabic{\huaz@collect@roman@result}}%
\else%
- \huaz@z{\huaz@romantoarabic{\huaz@try@roman@result}}%
+ \huaz@z{#3}%
\fi}%
- \IfBooleanF{#1}{\ifhuaz@show@~#3\fi}%
+ \IfBooleanF{#1}{\ifhuaz@show@\huaz@sep{#3}\fi}%
\huaz@show@true}
%=================================================
@@ -367,10 +594,29 @@
%
%=================================================
-\DeclareDocumentCommand{\az}{sm}{\ifhuaz@show@ a\fi\IfBooleanTF{#1}{\huaz@text*{#2}}{\huaz@text{#2}}\xdef\azsaved{a\huaz@save}}
-\DeclareDocumentCommand{\Az}{sm}{\ifhuaz@show@ A\fi\IfBooleanTF{#1}{\huaz@text*{#2}}{\huaz@text{#2}}\xdef\azsaved{A\huaz@save}}
-\DeclareDocumentCommand{\azv}{sm}{\ifhuaz@show@ a\fi\IfBooleanTF{#1}{\huaz@text*={#2}}{\huaz@text={#2}}\xdef\azsaved{a\huaz@save}}
-\DeclareDocumentCommand{\Azv}{sm}{\ifhuaz@show@ A\fi\IfBooleanTF{#1}{\huaz@text*={#2}}{\huaz@text={#2}}\xdef\azsaved{A\huaz@save}}
+\DeclareDocumentCommand{\az}{s>{\TrimSpaces}m}{%
+ \ifhuaz@show@ a\fi
+ \IfBooleanTF{#1}{\huaz@text*{#2}}{\huaz@text{#2}}%
+ \IfBlankT{#2}{\PackageWarning{huaz}{Argument of \string\az\space is empty}\textup{(?)}}%
+ \xdef\azsaved{a\huaz@save}}
+
+\DeclareDocumentCommand{\Az}{s>{\TrimSpaces}m}{%
+ \ifhuaz@show@ A\fi
+ \IfBooleanTF{#1}{\huaz@text*{#2}}{\huaz@text{#2}}%
+ \IfBlankT{#2}{\PackageWarning{huaz}{Argument of \string\Az\space is empty}\textup{(?)}}%
+ \xdef\azsaved{A\huaz@save}}
+
+\DeclareDocumentCommand{\azv}{s>{\TrimSpaces}m}{%
+ \ifhuaz@show@ a\fi
+ \IfBooleanTF{#1}{\huaz@text*={#2}}{\huaz@text={#2}}%
+ \IfBlankT{#2}{\PackageWarning{huaz}{Argument of \string\azv\space is empty}\textup{(?)}}%
+ \xdef\azsaved{a\huaz@save}}
+
+\DeclareDocumentCommand{\Azv}{s>{\TrimSpaces}m}{%
+ \ifhuaz@show@ A\fi
+ \IfBooleanTF{#1}{\huaz@text*={#2}}{\huaz@text={#2}}%
+ \IfBlankT{#2}{\PackageWarning{huaz}{Argument of \string\Azv\space is empty}\textup{(?)}}%
+ \xdef\azsaved{A\huaz@save}}
%=================================================
%
@@ -378,10 +624,10 @@
%
%=================================================
-\DeclareDocumentCommand{\aref}{sm}{\IfBooleanTF{#1}{\az*{\ref{#2}}}{\az{\ref{#2}}}}
-\DeclareDocumentCommand{\Aref}{sm}{\IfBooleanTF{#1}{\Az*{\ref{#2}}}{\Az{\ref{#2}}}}
-\DeclareDocumentCommand{\avref}{sm}{\IfBooleanTF{#1}{\azv*{\ref{#2}}}{\azv{\ref{#2}}}}
-\DeclareDocumentCommand{\Avref}{sm}{\IfBooleanTF{#1}{\Azv*{\ref{#2}}}{\Azv{\ref{#2}}}}
+\DeclareDocumentCommand{\aref}{sm}{\IfBooleanTF{#1}{\az{\ref*{#2}}}{\az{\ref{#2}}}}
+\DeclareDocumentCommand{\Aref}{sm}{\IfBooleanTF{#1}{\Az{\ref*{#2}}}{\Az{\ref{#2}}}}
+\DeclareDocumentCommand{\avref}{sm}{\IfBooleanTF{#1}{\azv{\ref*{#2}}}{\azv{\ref{#2}}}}
+\DeclareDocumentCommand{\Avref}{sm}{\IfBooleanTF{#1}{\Azv{\ref*{#2}}}{\Azv{\ref{#2}}}}
%=================================================
%
@@ -389,10 +635,10 @@
%
%=================================================
-\DeclareDocumentCommand{\apageref}{sm}{\IfBooleanTF{#1}{\az*{\pageref{#2}}}{\az{\pageref{#2}}}}
-\DeclareDocumentCommand{\Apageref}{sm}{\IfBooleanTF{#1}{\Az*{\pageref{#2}}}{\Az{\pageref{#2}}}}
-\DeclareDocumentCommand{\avpageref}{sm}{\IfBooleanTF{#1}{\azv*{\pageref{#2}}}{\azv{\pageref{#2}}}}
-\DeclareDocumentCommand{\Avpageref}{sm}{\IfBooleanTF{#1}{\Azv*{\pageref{#2}}}{\Azv{\pageref{#2}}}}
+\DeclareDocumentCommand{\apageref}{sm}{\IfBooleanTF{#1}{\az{\pageref*{#2}}}{\az{\pageref{#2}}}}
+\DeclareDocumentCommand{\Apageref}{sm}{\IfBooleanTF{#1}{\Az{\pageref*{#2}}}{\Az{\pageref{#2}}}}
+\DeclareDocumentCommand{\avpageref}{sm}{\IfBooleanTF{#1}{\azv{\pageref*{#2}}}{\azv{\pageref{#2}}}}
+\DeclareDocumentCommand{\Avpageref}{sm}{\IfBooleanTF{#1}{\Azv{\pageref*{#2}}}{\Azv{\pageref{#2}}}}
%=================================================
%
@@ -400,10 +646,21 @@
%
%=================================================
-\DeclareDocumentCommand{\aeqref}{sm}{\IfBooleanTF{#1}{\az*{\eqref{#2}}}{\az{\eqref{#2}}}}
-\DeclareDocumentCommand{\Aeqref}{sm}{\IfBooleanTF{#1}{\Az*{\eqref{#2}}}{\Az{\eqref{#2}}}}
-\DeclareDocumentCommand{\aveqref}{sm}{\IfBooleanTF{#1}{\azv*{\eqref{#2}}}{\azv{\eqref{#2}}}}
-\DeclareDocumentCommand{\Aveqref}{sm}{\IfBooleanTF{#1}{\Azv*{\eqref{#2}}}{\Azv{\eqref{#2}}}}
+\DeclareDocumentCommand{\aeqref}{m}{\az{\eqref{#1}}}
+\DeclareDocumentCommand{\Aeqref}{m}{\Az{\eqref{#1}}}
+\DeclareDocumentCommand{\aveqref}{m}{\azv{\eqref{#1}}}
+\DeclareDocumentCommand{\Aveqref}{m}{\Azv{\eqref{#1}}}
+
+%=================================================
+%
+% \arefeq \Arefeq \avrefeq \Avrefeq
+%
+%=================================================
+
+\DeclareDocumentCommand{\arefeq}{m}{\az{\refeq{#1}}}
+\DeclareDocumentCommand{\Arefeq}{m}{\Az{\refeq{#1}}}
+\DeclareDocumentCommand{\avrefeq}{m}{\azv{\refeq{#1}}}
+\DeclareDocumentCommand{\Avrefeq}{m}{\Azv{\refeq{#1}}}
%=================================================
%
@@ -411,65 +668,10 @@
%
%=================================================
-\DeclareDocumentCommand{\acite}{som}{%
- \IfBooleanTF{#1}{%
- \IfNoValueTF{#2}{%
- \az*{\cite{#3}}%
- }{%
- \az*{\cite[#2]{#3}}%
- }%
- }{%
- \IfNoValueTF{#2}{%
- \az{\cite{#3}}%
- }{%
- \az{\cite[#2]{#3}}%
- }%
- }}
-
-\DeclareDocumentCommand{\Acite}{som}{%
- \IfBooleanTF{#1}{%
- \IfNoValueTF{#2}{%
- \Az*{\cite{#3}}%
- }{%
- \Az*{\cite[#2]{#3}}%
- }%
- }{%
- \IfNoValueTF{#2}{%
- \Az{\cite{#3}}%
- }{%
- \Az{\cite[#2]{#3}}%
- }%
- }}
-
-\DeclareDocumentCommand{\avcite}{som}{%
- \IfBooleanTF{#1}{%
- \IfNoValueTF{#2}{%
- \azv*{\cite{#3}}%
- }{%
- \azv*{\cite[#2]{#3}}%
- }%
- }{%
- \IfNoValueTF{#2}{%
- \azv{\cite{#3}}%
- }{%
- \azv{\cite[#2]{#3}}%
- }%
- }}
-
-\DeclareDocumentCommand{\Avcite}{som}{%
- \IfBooleanTF{#1}{%
- \IfNoValueTF{#2}{%
- \Azv*{\cite{#3}}%
- }{%
- \Azv*{\cite[#2]{#3}}%
- }%
- }{%
- \IfNoValueTF{#2}{%
- \Azv{\cite{#3}}%
- }{%
- \Azv{\cite[#2]{#3}}%
- }%
- }}
+\DeclareDocumentCommand{\acite}{om}{\IfNoValueTF{#1}{\az{\cite{#2}}}{\az{\cite[#1]{#2}}}}
+\DeclareDocumentCommand{\Acite}{om}{\IfNoValueTF{#1}{\Az{\cite{#2}}}{\Az{\cite[#1]{#2}}}}
+\DeclareDocumentCommand{\avcite}{om}{\IfNoValueTF{#1}{\azv{\cite{#2}}}{\azv{\cite[#1]{#2}}}}
+\DeclareDocumentCommand{\Avcite}{om}{\IfNoValueTF{#1}{\Azv{\cite{#2}}}{\Azv{\cite[#1]{#2}}}}
%=================================================
%
@@ -477,8 +679,8 @@
%
%=================================================
-\def\huaz@x@#1#{\huaz@citelist}
-\def\huaz@cite{\huaz@x@\relax}
+\def\huaz@cite@#1#{\huaz@citelist}
+\def\huaz@cite{\huaz@cite@\relax}
\def\huaz@citelist#1{\huaz@@citelist#1,\relax,}
\def\huaz@@citelist#1,{\ifx#1\relax\else\@nameuse{huaz@bib@#1},\expandafter\huaz@@citelist\fi}%
@@ -501,6 +703,7 @@
\def\bibcite#1#2{\global\@namedef{huaz@bib@#1}{\huaz@bibparam#2}\huaz@old@bibcite{#1}{#2}}
%
\@ifpackageloaded{biblatex}{
+ \settoggle{blx@labelalpha}{true}
\def\huaz@biblatexlabel{}
\ifx\blx@opt@eldt@style\@empty\ifx\blx@opt@eldt@citestyle\@empty\def\huaz@biblatexlabel{\strfield{labelnumber}}\fi\fi
\def\huaz@temp{numeric}
@@ -516,14 +719,46 @@
\ifx\blx@opt@eldt@style\huaz@temp\def\huaz@biblatexlabel{\strfield{labelalpha}}\fi
\ifx\blx@opt@eldt@citestyle\huaz@temp\def\huaz@biblatexlabel{\strfield{labelalpha}}\fi
\def\huaz@temp{authoryear}
- \ifx\blx@opt@eldt@style\huaz@temp\settoggle{blx@labelalpha}{true}\def\huaz@biblatexlabel{\strfield{labelalpha}}\fi
- \ifx\blx@opt@eldt@citestyle\huaz@temp\settoggle{blx@labelalpha}{true}\def\huaz@biblatexlabel{\strfield{labelalpha}}\fi
+ \ifx\blx@opt@eldt@style\huaz@temp\def\huaz@biblatexlabel{\strfield{labelalpha}}\fi
+ \ifx\blx@opt@eldt@citestyle\huaz@temp\def\huaz@biblatexlabel{\strfield{labelalpha}}\fi
\ifx\huaz@biblatexlabel\@empty\else
\AtEveryBibitem{\protected@write\@auxout{}{\string\global\string\@namedef{huaz@bib@\strfield{entrykey}}{\huaz@biblatexlabel}}}
\fi}{}}
%=================================================
%
+% \huaz@citeauthor
+%
+%=================================================
+
+\def\huaz@citeauthor@#1#{\huaz@citeauthorlist}
+\def\huaz@citeauthor{\huaz@citeauthor@\relax}
+\def\huaz@citeauthorlist#1{\huaz@@citeauthorlist#1,\relax,}
+\def\huaz@@citeauthorlist#1,{\ifx#1\relax\else\@nameuse{huaz@bibalpha@#1},\expandafter\huaz@@citeauthorlist\fi}
+
+\AddToHook{begindocument/before}{
+ \@ifpackageloaded{biblatex}{
+ \AtEveryBibitem{\protected@write\@auxout{}{\string\global\string\@namedef{huaz@bibalpha@\strfield{entrykey}}{\strfield{labelalpha}}}}
+ }{}}
+
+%=================================================
+%
+% \huaz@citeyear
+%
+%=================================================
+
+\def\huaz@citeyear@#1#{\huaz@citeyearlist}
+\def\huaz@citeyear{\huaz@citeyear@\relax}
+\def\huaz@citeyearlist#1{\huaz@@citeyearlist#1,\relax,}
+\def\huaz@@citeyearlist#1,{\ifx#1\relax\else\@nameuse{huaz@bibyear@#1},\expandafter\huaz@@citeyearlist\fi}
+
+\AddToHook{begindocument/before}{
+ \@ifpackageloaded{biblatex}{
+ \AtEveryBibitem{\protected@write\@auxout{}{\string\global\string\@namedef{huaz@bibyear@\strfield{entrykey}}{\strfield{year}}}}
+ }{}}
+
+%=================================================
+%
% end
%
%=================================================
diff --git a/macros/latex/contrib/huaz/huaz.tex b/macros/latex/contrib/huaz/huaz.tex
index a9bb258ad6..4b178dbb44 100644
--- a/macros/latex/contrib/huaz/huaz.tex
+++ b/macros/latex/contrib/huaz/huaz.tex
@@ -1,7 +1,7 @@
%%
%% `huaz.tex' documentation of the huaz package
%%
-%% Copyright 2022 by Tibor Tomacs
+%% Copyright 2022-2024 by Tibor Tómács
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -13,44 +13,61 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is Tibor Tomacs.
+%% The Current Maintainer of this work is Tibor Tómács.
%%
\documentclass[12pt]{article}
-\usepackage{listings,xcolor,lmodern,xurl}
-\usepackage[pdfstartview=FitH,colorlinks,allcolors=teal,bookmarksnumbered]{hyperref}
-\usepackage[a4paper,top=1in,bottom=1.2in]{geometry}
+\usepackage[a4paper,top=1in,bottom=1in]{geometry}
+\usepackage{listings,xcolor,lmodern,xurl,multicol}
\usepackage[T1]{fontenc}
-\PassOptionsToPackage{defaults=hu-min}{magyar.ldf}
+\PassOptionsToPackage{
+ defaults=hu-min,
+ labelitems=unchanged,
+ }{magyar.ldf}
\usepackage[english,magyar]{babel}
+\usepackage[
+ pdfstartview=FitH,
+ colorlinks,
+ allcolors=purple,
+ bookmarksnumbered,
+ bookmarksopen,
+ ]{hyperref}
+\usepackage{upquote}
+
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt}
+\def\codefont{\usefont{T1}{pcrs}{m}{n}}
+
\lstset{literate={<}{{$\langle$}}1{>}{{$\rangle$}}1
- {ö}{{\"o}}1{ü}{{\"u}}1{ó}{{\'o}}1{é}{{\'e}}1{á}{{\'a}}1{í}{{\'i}}1}
-
-\lstnewenvironment{examplelst}{\lstset{
-aboveskip=\bigskipamount,
-basicstyle=\footnotesize\color{blue!70!black}\ttfamily,
-backgroundcolor=\color{black!3},
-rulecolor=\color{black!15},
-frame=trbl,
-framesep=5pt,
-columns=fullflexible,
-xleftmargin=5.4pt,
-xrightmargin=5.4pt,
-keepspaces}}{}
-
-\newcommand{\commandinline}{\hspace*{-15mm}\lstinline[
-delim={[is][\color{green!50!black}\normalfont\small\sffamily]{!}{!}},
-basicstyle=\color{red!70!black}\normalfont\normalsize\ttfamily,
-columns=fullflexible,
-keepspaces]}
-
-\newcommand{\verbinline}{\lstinline[
-delim={[is][\color{green!50!black}\normalfont\small\sffamily]{!}{!}},
-basicstyle=\normalfont\normalsize\ttfamily,
-columns=fullflexible,
-keepspaces]}
+ {ű}{{\H u}}1{ö}{{\"o}}1{ő}{{\H o}}1{ü}{{\"u}}1
+ {ó}{{\'o}}1{é}{{\'e}}1{á}{{\'a}}1{í}{{\'i}}1}
+
+\lstnewenvironment{examplelst}{%
+ \lstset{
+ aboveskip=\bigskipamount,
+ basicstyle=\color{blue!70!black}\small\codefont,
+ backgroundcolor=\color{black!3},
+ rulecolor=\color{black!15},
+ frame=trbl,
+ framesep=5pt,
+ columns=fullflexible,
+ xleftmargin=5.4pt,
+ xrightmargin=5.4pt,
+ keepspaces}}{}
+
+\newcommand{\huazcmd}{\hspace*{-15mm}%
+ \lstinline[
+ delim={[is][\color{teal}\normalfont\small\sffamily]{!}{!}},
+ basicstyle=\color{magenta}\normalfont\small\codefont,
+ columns=fullflexible,
+ keepspaces]}
+
+\newcommand{\code}{%
+ \lstinline[
+ delim={[is][\color{teal}\normalfont\small\sffamily]{!}{!}},
+ basicstyle=\normalfont\small\codefont,
+ columns=fullflexible,
+ keepspaces]}
\makeatletter
\def\@oddfoot{\hfill\textsf{\color{gray}\thepage}\hfill}
@@ -58,270 +75,476 @@ keepspaces]}
\def\ps@plain{\def\@oddfoot{\hfill\textsf{\color{gray}\thepage}\hfill}}
\makeatother
-\def\huaz{\textbf{\sffamily hu\color{gray}az}}
+\definecolor{hured}{RGB}{207,36,54}
+\definecolor{hugreen}{RGB}{69,113,79}
+\usepackage{contour}
+\def\huazlogo{%
+ {\contourlength{.8pt}\Huge
+ \sbox0{\contour{black!30}{\Huge\bfseries\sffamily\color{white}HUAZ}}%
+ \mbox{}%
+ \lower-\dimeval{2\ht0/3}%
+ \rlap{{\color{hured}\rule{\wd0}{\dimeval{\ht0/3}}}}%
+ {\color{hugreen}\rule{\wd0}{\dimeval{\ht0/3}}}%
+ \llap{\usebox0}}}
+
+\def\huaz{\textbf{\sffamily hu\itshape\color{gray}az}}
+
+\def\labelenumi{\textbf{\theenumi.}}
+
+\def\huqq#1{,,{\color{gray}#1}''}
+
+\def\paragraph#1{\par\bigskip\textbf{#1.}}
\begin{document}
-\title{The \huaz\ package\\
- {\large v1.2 (2024/04/20)}}
+\title{\huazlogo\\ The \huaz\ package\\{\large v2.1 (2024/05/05)}}
\author{Tibor Tómács\\
- {\normalsize\href{email:tomacs.tibor@gmail.com}{\nolinkurl{tomacs.tibor@gmail.com}}}}
+ {\normalsize\href{email:tomacs.tibor@gmail.com}{\nolinkurl{tomacs.tibor@gmail.com}}}}
\date{}
\maketitle
\begin{otherlanguage}{english}
\begin{abstract}
-In Hungarian there are two definite articles, \emph{``a''} and \emph{``az''}, which are determined by the pronunciation of the subsequent word. The definite article is \emph{``az''}, if the first phoneme of the pronounced word is a vowel, otherwise it is \emph{``a''}.
-The \huaz\ package helps the user to insert automatically the correct definite article for cross-references and other commands containing text. Thus, if these change, the definite articles will also change accordingly.
+There are two definite articles in Hungarian, ``a'' and ``az'', depending on the first sound of the word that follows. If the word begins with a vowel sound, the definite article is ``az'', otherwise it is ``a''.
+
+The \huaz\ package helps the user to automatically insert the correct definite article for cross-references and other commands containing text.
+This way, if the number or text changes, the definite articles will change accordingly.
-\medskip
-\emph{The documentation is in Hungarian, because only Hungarian-speaking users are interested.}
+The documentation of the \huaz\ package is in Hungarian, as it is assumed that only Hungarian-speaking users are interested.
\end{abstract}
\end{otherlanguage}
\section{Bevezetés}
-A magyar nyelvben a határozott névelő egy szó előtt aszerint \emph{,,a''} vagy \emph{,,az''}, hogy a szó kiejtve mássalhangzóval vagy magánhangzóval kezdődik. Például \emph{,,a szék''} vagy \emph{,,az asztal''}. Ez egyszerűnek tűnik, de gondoljon a következő esetekre:
+A magyar nyelvben a határozott névelő egy szó előtt aszerint \huqq{a} vagy \huqq{az}, hogy a szó kiejtve mássalhangzóval vagy magánhangzóval kezdődik.
+Például \huqq{a szék} vagy \huqq{az asztal}.
+Ez egyszerű szabály, de írásban összetett vizsgálatot igényel.
+Itt felsorolunk néhány nehézséget:
\begin{itemize}
-\item Például ha oldalszámra akar hivatkozni, akkor a \verb|\pageref| parancsot szoktuk használni. Ha ez elé akar határozott névelőt rakni, akkor nem mindegy, hogy mi az oldalszám. Például \emph{,,az~1.~oldal''}, \emph{,,a~2.~oldal''}, \emph{,,az~5.~oldal''}, \emph{,,a~10.~oldal''}. Így egyáltalán nem biztos, hogy az ,,\verbinline|a \pageref{!<kulcs>!}|'' kód megfelelő eredményt ad. Hasonló a probléma minden kereszthivatkozás esetén (\verb|\ref|, \verb|\pageref|, \verb|\eqref|, \verb|\cite|).
-
-\item Az is fontos, hogy egy kifejezés római szám vagy sem. Például \emph{,,az~V.~fejezet''}, ha \emph{V} római szám, azaz 5 a jelentése. Ugyanakkor \emph{,,a~V.~fejezet''}, ha \emph{V} betűt jelöl vagy alfanumerikus szám esetén a 22 értéket (\emph{V} az angol ábécében a 22.~betű).
-
-\item Néhány mássalhangzó speciális tulajdonságú. Például \emph{,,az M betű''}, de \emph{,,a Magyar Közlöny''}; \emph{,,az Ny betű''}, de \emph{,,a Nyugdíjfolyósító Igazgatóság''}; stb.
+\item
+Ha oldalszámra akarunk hivatkozni, akkor a \code|\pageref| parancsot szoktuk használni.
+Ha ez elé kell határozott névelőt rakni, akkor nem mindegy, hogy mi az oldalszám.
+Például \huqq{az~1.~oldal}, \huqq{a~2.~oldal}, \huqq{az~5.~oldal}, \huqq{a~10.~oldal}.
+Így egyáltalán nem biztos, hogy az ,,\code|a \pageref{!<kulcs>!}|'' kód megfelelő eredményt ad.
+Hasonló a probléma minden kereszthivatkozás esetén (\code|\ref|, \code|\pageref|, \code|\eqref|, \code|\cite|).
+
+\item
+Az is fontos, hogy egy kifejezés római szám vagy sem.
+Például \huqq{az~V.~fejezet}, ha V római szám, azaz 5 a jelentése.
+Ugyanakkor \huqq{a~V.~fejezet}, ha V betűt jelöl vagy alfanumerikus szám esetén a 22 értéket (V az angol ábécében a 22.~betű).
+
+\item
+Néhány mássalhangzó speciális tulajdonságú.
+Például \huqq{a Magyar Közlöny} de \huqq{az M betű}; \huqq{a Nyugdíjfolyósító Igazgatóság} de \huqq{az Ny betű}; stb.
\end{itemize}
Először megemlítünk két eddigi megoldást a határozott névelők automatikus kezelésére, kiemelve azok hibáit és hiányosságait.
-\subsection{A magyar.ldf}
+\subsection{A \texttt{magyar.ldf}}
-Egyik lehetőség a \texttt{babel} csomag \texttt{magyar} opcióját beállító \texttt{magyar.ldf} fájl használata. Ennek teljes dokumentációja elérhető innen: \url{https://math.bme.hu/latex/magyarldf-doc.pdf}.
+Egyik lehetőség a \code{babel} csomag \code{magyar} opcióját beállító \code{magyar.ldf} fájl használata.
+Ennek teljes dokumentációja elérhető innen: \url{https://math.bme.hu/latex/magyarldf-doc.pdf}.
-Az ebben definiált \verb|\az|, \verb|\aref|, \verb|\apageref|, \verb|\acite|, stb. parancsok alapvetően jól használhatóak, de van néhány fontos hiba, melyek a \huaz\ csomag megírását motiválták:
+Az ebben definiált \code|\az|, \code|\aref|, \code|\apageref|, \code|\acite|, stb.~parancsok alapvetően jól használhatóak, de van néhány fontos hiba, melyek a \huaz\ csomag megírását motiválták:
\begin{itemize}
-\item Az \verb|\eqref| parancsnak nincs névelős verziója. Helyette az \verbinline|\aref({!<kulcs>!})| használható, de ez dőlt betűs környezetben nem álló betűs eredményt ad, mint az \verb|\eqref| esetében. Másik lehetőség, ami ezt a problémát megoldja, az \verbinline|\az{\eqref{!<kulcs>!}}| parancs. Ugyanakkor egyik megoldás sem kezeli a római számozású vagy a \verb|\tag| paranccsal címkézett egyenleteket.
-
-\item Az \verbinline|\az{\ref{!<kulcs>!}}| és \verbinline|\az{\pageref{!<kulcs>!}}| nem kezeli a római számozású hivatkozásokat.
-
-\item Az előző hiba akkor is fennáll, amikor az \verb|\az| parancsban egy római számmal kezdődő szöveg van. Például \verb|\az{V.~osztály}| eredménye \emph{,,a V.~osztály''}.
-
-\item Amennyiben nem kereszthivatkozáshoz, hanem egy szöveghez, vagy valamilyen szöveget tároló parancshoz kell automatikus névelő, akkor az ékezetes betűket UTF-8 kódolás esetén rosszul detektálja. A hiba alapvető oka, hogy az UTF-8 kódolású karakterek nem egy, hanem több bájton vannak kódolva, amit a \texttt{magyar.ldf} nem vesz figyelembe. Ezért például \verb|\az{ágy}| eredménye \emph{,,a ágy''}, mert nem betűként érzékeli az \emph{,,á''} betűt, így azt sem tudja, hogy ez magánhangzó. Meglepő módon \verb|\az{száz}| eredménye \emph{,,az száz''} is rossz. Ennek az az oka, hogy mivel számára az \emph{,,á''} nem betű, ezért az \emph{,,sz''} betűt különállónak tekinti, ami elé valóban \emph{,,az''} kell.
-
-\item Hibának ugyan nem tekinthető, de mindenesetre kényelmetlen, hogy például \verb|\az{\textbf{N betű}}| esetén a \verb|\textbf| parancs megzavarja a szó betűinek detektálását, így a névelő helytelenül \emph{,,a''} lesz.
+\item
+Az \code|\eqref| parancsnak nincs névelős verziója.
+Helyette az \code|\aref({!<kulcs>!})| használható, de ez dőlt betűs környezetben nem álló betűs eredményt ad, mint az \code|\eqref| esetében.
+Másik lehetőség, ami ezt a problémát megoldja, az \code|\az{\eqref{!<kulcs>!}}| parancs.
+Ugyanakkor egyik megoldás sem kezeli a római számozású vagy a \code|\tag| paranccsal címkézett egyenleteket.
+
+\item
+Az \code|\az{\ref{!<kulcs>!}}| és \code|\az{\pageref{!<kulcs>!}}| nem kezeli a római számozású hivatkozásokat.
+
+\item
+Az előző hiba akkor is fennáll, amikor az \code|\az| parancsban egy római számmal kezdődő szöveg van.
+Például \code|\az{V.~osztály}| eredménye \huqq{a V.~osztály}.
+
+\item
+Amennyiben nem kereszthivatkozáshoz, hanem egy szöveghez, vagy valamilyen szöveget tároló parancshoz kell automatikus névelő, akkor az ékezetes betűket \texttt{UTF-8} kódolás esetén rosszul detektálja, mivel azok nem egy, hanem több bájton vannak kódolva, amit a \code{magyar.ldf} nem vesz figyelembe.
+Ezért például \code|\az{ágy}| eredménye \huqq{a ágy}, mert nem betűként érzékeli az \huqq{á} betűt, így azt sem tudja, hogy ez magánhangzó.
+Meglepő módon \code|\az{száz}| eredménye \huqq{az száz} is rossz.
+Ennek oka, hogy számára az \huqq{á} nem betű, ezért az \huqq{sz} betűt különállónak tekinti, ami elé valóban \huqq{az} kell.
+
+\item
+Például \code|\az{\textbf{N betű}}| esetén a \code|\textbf| parancs megzavarja a szó betűinek detektálását, így a névelő helytelenül \huqq{a} lesz.
\end{itemize}
-\subsection{A nevelok csomag}
-
-2015-ben készült a \texttt{nevelok} csomag, ami szintén az automatikus határozott névelők kezelésére készült. A szerzője valószínűleg nem ismerte a \texttt{magyar.ldf} már akkor létező lehetőségeit, ezért készíthette ezt a jóval kevesebbet tudó csomagot.
+\subsection{A \texttt{nevelok} csomag}
-2022-ben telepített \TeX-rendszeren tesztelve azt tapasztaltam, hogy nem kezeli az ékezetes betűk semmilyen formáját és sok esetben ad kereszthivatkozásoknál is rossz névelőt. Az utóbbinak az az oka, hogy közvetlenül a \verb|\ref| parancsot vizsgálja, ami nem kifejthető parancs.
-
-Ezen dokumentáció elkészültéig semmilyen fejlesztése nem történt. Jelen állapotában nem javasolt ennek a csomagnak a használata.
+A \code{nevelok} csomag szintén a határozott névelők automatikus beillesztéséhez készült.
+Nem kezeli az ékezetes betűk semmilyen formáját és sok esetben ad kereszthivatkozásoknál rossz névelőt, ugyanis közvetlenül a \code|\ref| és \code|\pageref| parancsokat vizsgálja, amelyek nem kifejthetőek.
+Ezért ennek a csomagnak a jelenlegi verzióját nem szabad használni!
\subsection{A \texorpdfstring{\huaz}{huaz} csomag célja és működése}
-A \huaz\ csomag célja segíteni a felhasználót abban, hogy a kereszthivatkozásokhoz és szöveget tartalmazó parancsokhoz automatikusan beszúrja a megfelelő határozott névelőt. Így ha ezek változnak, akkor a határozott névelők is megfelelően változnak.
+A \huaz\ csomag segíti a felhasználót abban, hogy a kereszthivatkozásokhoz és szöveget tartalmazó parancsokhoz automatikusan beszúrja a megfelelő határozott névelőt.
+Így ha ezek változnak, akkor a határozott névelők is megfelelően változnak.
-A másik cél ezt úgy megtenni, hogy a \texttt{magyar.ldf} és a \texttt{nevelok.sty} hibáit és hiányosságait korrigálja illetve pótolja.
+Fontos cél volt ezt úgy megtenni, hogy a \code{magyar.ldf} és a \code{nevelok.sty} hibáit és hiányosságait korrigálja illetve pótolja.
-A \huaz\ csomag a következő esetekben illeszt az adott szöveg elé ,,az'' névelőt:
+A \huaz\ csomag a következő esetekben illeszt az adott szöveg elé \huqq{az} névelőt:
\begin{enumerate}
-\item Az első betű magánhangzó (legyen az kis- vagy nagybetű, ékezetes vagy sem, magyar vagy sem, UTF-8, ISO-8859-2 karakterrel vagy repülő ékezettel megadva).
+\item
+Az első betű magánhangzó (legyen az kis- vagy nagybetű, ékezetes vagy sem, magyar vagy sem, \texttt{UTF-8}, \texttt{ISO-8859-2} karakterrel vagy ékezet paranccsal megadva).
-\item Az első betű olyan kis vagy nagy mássalhangzó, amit önmagában kiejtve magánhangzóval kezdünk (például F, L, M, stb.) míg a második karakter (ha van) nem betű, hanem szám, írásjel vagy szóköz. Például ,,M-10''. Ide soroltunk néhány nem magyar ékezetes mássalhangzót is. Például ,,Ň.1''.
+\item
+Az első betű olyan kis vagy nagy mássalhangzó, amit önmagában kiejtve magánhangzóval kezdünk (például F, L, M, stb.) míg a második karakter (ha van) nem betű, hanem szám, írásjel vagy szóköz.
+Például \huqq{M-10}.
+Ide soroltunk néhány nem magyar ékezetes mássalhangzót is.
+Például \huqq{Ň.1}.
-\item Az első két karakter egy olyan kis vagy nagy kétjegyű mássalhangzó, amit önmagában kiejtve magánhangzóval kezdünk (például Ny, Ly, Sz, stb.) míg a harmadik karakter (ha van) nem betű, hanem szám, írásjel vagy szóköz. Például ,,NY betű''.
+\item
+Az első két karakter egy olyan kis vagy nagy kétjegyű mássalhangzó, amit önmagában kiejtve magánhangzóval kezdünk (például NY, LY, SZ, stb.) míg a harmadik karakter (ha van) nem betű, hanem szám, írásjel vagy szóköz.
+Például \huqq{SZ betű}.
-\item Az első karakter 5.
+\item
+Az első karakter 5.
-\item 1, 4, 7 vagy 10 jegyű számmal kezdődik és az első számjegy 1 (egy, ezer, egymillió, egymilliárd).
+\item
+1, 4, 7 vagy 10 jegyű számmal kezdődik és az első számjegy 1 (egy, ezer, egymillió, egymilliárd).
\end{enumerate}
-Ha a szó elején található karakterek római számként is értelmezhetőek, akkor megválasztható, hogy azt konvertálja arab számra és a névelőt ahhoz határozza meg vagy sem. Például ,,XII/A'' esetén.
+Ha a szó elején található karakterek római számként is értelmezhetőek, akkor megválasztható, hogy azt konvertálja arab számra és a névelőt ahhoz határozza meg vagy sem. Például \huqq{V. emelet} esetén.
\section{A \texorpdfstring{\huaz}{huaz} csomag használata}
A \huaz\ csomagot a szokott módon kell betölteni:
-\commandinline|\usepackage{huaz}|
+\huazcmd|\usepackage{huaz}|
-Csomagopciók nincsenek. UTF-8 (\texttt{utf8}) és ISO-8859-2 (\texttt{latin2}) kódolású forrásfájl esetén működik, de a repülő ékezeteket is jól kezeli. Kompatibilis a \texttt{pdflatex}, \texttt{xelatex} és \texttt{lualatex} fordítókkal is. Például \texttt{pdflatex} fordítóval a következő betöltés megfelelő:
+Kompatibilis a \code{latex}, \code{pdflatex}, \code{xelatex} és \code{lualatex} fordítókkal is.
+A \code{latex} és \code{pdflatex} fordítóval a következő betöltés megfelelő:
\begin{examplelst}
\documentclass{article}
\usepackage[T1]{fontenc}
-\usepackage{huaz}
\PassOptionsToPackage{defaults=hu-min}{magyar.ldf}
\usepackage[magyar]{babel}
+\usepackage{huaz}
\begin{document}
...
\end{document}
\end{examplelst}
-A \texttt{hyperref} csomaggal is kompatibilis, így az is betölthető a \huaz\ mellé.
-A \texttt{magyar.ldf} \texttt{defaults=hu-min} opciója bekapcsol néhány olyan opciót is, amely elérhetővé teszi a saját automatikus névelőparancsait. Ezt ugyan nem kötelező, de hasznos a \huaz\ csomag használata esetén kikapcsolni. Ehhez a
+Az ékezetes betűket \texttt{UTF-8} (\code{utf8}) és \texttt{ISO-8859-2} (\code{latin2}) kódolású forrásfájl esetén, illetve ékezet parancsokkal (\code|\'|, \code|\"|, \code|\H|, stb.) is jól kezeli.
+
+A \code{hyperref} csomaggal is kompatibilis, így az is betölthető a \huaz\ mellé.
+
+A \code{magyar.ldf} \code{defaults=hu-min} opciója bekapcsol néhány olyan opciót is, amely elérhetővé teszi a saját automatikus névelőparancsait.
+Ha ezeket a \huaz\ csomag használata esetén ki akarja kapcsolni, akkor a
\begin{examplelst}
\PassOptionsToPackage{defaults=hu-min}{magyar.ldf}
\end{examplelst}
sor helyett használja a következőt:
\begin{examplelst}
-\PassOptionsToPackage{defaults=hu-min,az=no,
- shortrefcmds=no,hunnewlabel=no}{magyar.ldf}
+\PassOptionsToPackage{
+ defaults=hu-min,
+ az=no,
+ shortrefcmds=no,
+ hunnewlabel=no
+ }{magyar.ldf}
\end{examplelst}
+Ezt nem kell feltétlenül megtenni, mert a \huaz\ csomag átdefiniálja a \code{magyar.ldf} névelőparancsait függetlenül attól, hogy a \code{babel} előtt vagy után töltötte be.
-A \texttt{xelatex} és \texttt{lualatex} fordítók esetén \texttt{babel} helyett a
+A \code{xelatex} és \code{lualatex} fordítók esetén \code{babel} helyett a
\begin{examplelst}
\usepackage{polyglossia}
\setdefaultlanguage{hungarian}
\end{examplelst}
is használható.
-A \huaz\ csomag felhasználja az \texttt{xstring}, \texttt{refcount} és \texttt{iftex} csomagok szolgáltatásait, így ezek is betöltődnek. Másrészt felhasználásra kerül néhány 2021. október 10-én bevezetett változás a \LaTeX\ kerneljében, így csak az ezután telepített rendszereken működik megfelelően a csomag.
+A \huaz\ csomag felhasználja az \code{xstring}, \code{refcount} és \code{iftex} csomagok szolgáltatásait, így ezek is betöltődnek.
+Felhasználásra kerül néhány 2021. október 10-én bevezetett változás a \LaTeX\ kerneljében, így csak az ezután telepített rendszereken működik megfelelően a csomag.
\subsection{Parancsok}
-\commandinline|\az{!<szöveg>!}|
+\huazcmd|\az{!<szöveg>!}|
-A \verbinline|!<szöveg>!| elé a megfelelő határozott névelő kerül kisbetűs alakban. Ha a \verbinline|!<szöveg>!| elején római számként értelmezhető karakterek vannak, akkor a névelő az arab megfelelőjéhez igazodik. Például
+A \code|!<szöveg>!| elé a megfelelő határozott névelő kerül kisbetűs alakban.
+Ha a \code|!<szöveg>!| római számként is értelmezhető (pl.~\huqq{XII}), esetleg azt írásjel vagy szóköz követi (pl.~\huqq{XII.A}), akkor a névelő az arab megfelelőjéhez igazodik.
+Például
\begin{examplelst}
Idén \az{V.B}~osztály rendezi a farsangot.
\end{examplelst}
-eredménye ,,Idén az V.B~osztály rendezi a farsangot.''.
+eredménye \huqq{Idén az~V.B~osztály rendezi a farsangot.}.
+De
+\begin{examplelst}
+\az{VB}, \az{V4}
+\end{examplelst}
+eredménye \huqq{a~VB, a~V4} lesz, mert V után betű illetve szám következik, ezért nem 5-nek, hanem V betűnek értelmezi mindkét esetben.
-A \verbinline|!<szöveg>!| lehet szöveget tároló parancs is. Például
+A \code|!<szöveg>!| lehet szöveget tároló parancs is.
+Például
\begin{examplelst}
\newcommand{\osztaly}{V.B}
Idén \az{\osztaly}~osztály rendezi a farsangot.
\end{examplelst}
-eredménye ,,Idén az V.B~osztály rendezi a farsangot.''.
+eredménye \huqq{Idén az~V.B~osztály rendezi a farsangot.}.
-A \verbinline|!<szöveg>!| tartalmazhat szövegformázó parancsokat is (bővebben lásd \az{\ref{subsec-kapocs}}.~alszakaszban). Például
+A \code|!<szöveg>!| tartalmazhat szövegformázó parancsokat is (bővebben lásd \az{\ref{subsec-ignoralt-parancsok}}.~alszakaszban).
+Például
\begin{examplelst}
\newcommand{\osztaly}{V.B}
Idén \az{\textbf{\osztaly}}~osztály rendezi a farsangot.
\end{examplelst}
-eredménye ,,Idén az \textbf{V.B}~osztály rendezi a farsangot.''.
+eredménye \huqq{Idén az~\textbf{V.B}~osztály rendezi a farsangot.}.
-A \verbinline|!<szöveg>!| lehet standard kereszthivatkozás is (\verb|\ref|, \verb|\pageref|, \verb|\eqref|, \verb|\cite|). Például
+A \code|!<szöveg>!| lehet kereszthivatkozás is.
+Például
\begin{examplelst}
\section{Cím}\label{seca}
\section{Cím}\label{secb}
-\az{\ref{seca}}.~szakaszban, \az{\textbf{\ref{secb}}}.~szakaszban
+\az{\ref{seca}}.~szakaszban,
+\az{\textbf{\ref{secb}}}.~szakaszban
+\end{examplelst}
+eredménye \huqq{az~1.~szakaszban, a~\textbf{2}.~szakaszban}.
+
+Ha a \code{section} számláló kiírása római számozásra van állítva a
+\begin{examplelst}
+\renewcommand{\thesection}{\Roman{section}}
\end{examplelst}
-eredménye ,,az 1. szakaszban, a \textbf{2}. szakaszban''. Ha a \texttt{section} számláló kiírása római számozásra van állítva a \verb|\renewcommand{\thesection}{\Roman{section}}| paranccsal, akkor az előző kód eredménye ,,az I. szakaszban, a \textbf{II}. szakaszban''.
+paranccsal, akkor az előző kód eredménye \huqq{az I. szakaszban, a \textbf{II}. szakaszban}.
\subsubsection*{Korlátozások}
+
\begin{enumerate}
-\item A \verbinline|!<szöveg>!| elején csak a \verb|\ref|, \verb|\ref*|, \verb|\pageref|, \verb|\pageref*|, \verb|\eqref|, \verb|\cite| kereszthivatkozásokkal működik helyesen.
+\item
+A \code|!<szöveg>!| elején a \code|\ref|, \code|\ref*|, \code|\pageref|, \code|\pageref*|, \code|\eqref|, \code|\refeq| kereszthivatkozásokkal működik helyesen.
+Az \code|\eqref| az \code{amsmath}, a \code|\refeq| pedig a \code{mathtools} csomaggal van definiálva.
+
+\item
+A \code|!<szöveg>!| elején a \code|\cite| jól működik a \code{natbib} csomaggal és \code{bibtex} esetében is.
+
+A \code{biblatex} csomaggal a \code|\cite|, \code|\citeauthor|, \code|\textcite|, \code|\citeyear| akkor működik jól, ha a \code{style} vagy \code{citestyle} opciók értéke:
-\item A \verbinline|!<szöveg>!| elején a \verb|\cite| parancs jól működik a \texttt{natbib} csomaggal és \texttt{bibtex} esetében is. A \texttt{biblatex} csomag használata esetén akkor működik jól, ha a \texttt{style} vagy \texttt{citestyle} opciók értéke \texttt{numeric}, \texttt{numeric-verb}, \texttt{alphabetic}, \texttt{alphabetic-verb} vagy \texttt{authoryear}. Akkor is jól működik, ha nem adjuk meg a \texttt{style} illetve \texttt{citestyle} opciók egyikét sem.
+\code{numeric}\\
+\code{numeric-verb}\\
+\code{alphabetic}\\
+\code{alphabetic-verb}\\
+\code{authoryear}
-\item A pdf vázlatfájába nem lehet \verb|\az| paranccsal szöveget beilleszteni. Tehát például a következő kód nem ad helyes vázlatfát, ha \texttt{hyperref} vagy \texttt{bookmark} csomagot használ:
+Akkor is jól működik, ha nem adjuk meg a \code{style} illetve \code{citestyle} opciók egyikét sem.
+
+\item
+A pdf vázlatfájába nem lehet \code|\az| paranccsal szöveget beilleszteni.
+Tehát például a következő kód nem ad helyes vázlatfát, ha \code{hyperref} vagy \code{bookmark} csomagot használ (bár a cím a szövegben, fejlécben és a tartalomjegyzékben jól fog megjelenni).
\begin{examplelst}
\section{...\az{\ref{sec}}...}
\end{examplelst}
-Viszont a cím a szövegben, fejlécben és a tartalomjegyzékben jól fog megjelenni. A problémát a később ismertetett \verb|\azsaved| paranccsal lehet megoldani.
+A problémát a később ismertetett \code|\azsaved| illetve \code|\aznotshow| parancsokkal lehet megoldani.
\end{enumerate}
-\commandinline|\az*{!<szöveg>!}|
+\huazcmd|\az*{!<szöveg>!}|
-Ugyanaz mint a \verb|*| nélküli esetben, de ekkor csak a névelő kerül kiírásra.
+Ugyanaz mint a \code|*| nélküli esetben, de ekkor csak a névelő kerül kiírásra.
+Például, ha az \code{amsmath} és \code{hyperref} csomagok használata mellett szeretnénk egy link nélküli egyenlethivatkozást, akkor ezt (mivel nincs \code|\eqref*| definiálva) például így tehetjük meg:
+\begin{examplelst}
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \textup{(\ref*{eq})} egyenletet!}
+\end{examplelst}
+Szebb lenne a mondat határozott névelővel a képlet száma előtt, de most nem ad feltétlenül helyes eredményt az
+\begin{examplelst}
+\az{\textup{(\ref*{eq})}}
+\end{examplelst}
+kód, mert az első karakter a \code{(} jel lesz, és nem a képlet száma.
+Így minden esetben \huqq{a} lesz a névelő.
+Ezt a következő módon javíthatjuk:
+\begin{examplelst}
+\az*{\ref{eq}} \textup{(\ref*{eq})}
+\end{examplelst}
-\commandinline|\azv{!<szöveg>!}|
+\huazcmd|\azv{!<szöveg>!}|
-Ugyanaz mint \verbinline|\az{!<szöveg>!}|, de ha a \verbinline|!<szöveg>!| elején római számként értelmezhető karakterek vannak, akkor a névelő nem az arab megfelelőjéhez igazodik, hanem mint egyszerű karakterekhez. Például
+Ugyanaz mint az \code|\az{!<szöveg>!}|, de ha a \code|!<szöveg>!| elején római számként értelmezhető karakterek vannak, akkor a névelő nem az arab megfelelőjéhez igazodik, hanem mint egyszerű karakterekhez.
+Például
\begin{examplelst}
\renewcommand{\thesection}{\Alph{section}}
\setcounter{section}{21}
\section{Cím}\label{sec}
\az{\ref{sec}}.~szakaszban, \azv{\ref{sec}}.~szakaszban
\end{examplelst}
-eredménye ,,az V.~szakaszban, a V.~szakaszban'', mert az első esetben a V betűt római számként értelmezte, a második esetben pedig nem. Mivel most alfanumerikus számra van beállítva a \texttt{section} számláló, ezért a második eset a jó.
+eredménye \huqq{az V.~szakaszban, a V.~szakaszban}, mert az első esetben a V betűt római számként értelmezte, a második esetben pedig nem.
+Mivel most alfanumerikus számra van beállítva a \code{section} számláló, ezért a második eset a jó.
-\commandinline|\azv*{!<szöveg>!}|
+\huazcmd|\azv*{!<szöveg>!}|
-Ugyanaz mint a \verb|*| nélküli esetben, de ekkor csak a névelő kerül kiírásra.
+Ugyanaz mint a \code|*| nélküli esetben, de ekkor csak a névelő kerül kiírásra.
-\commandinline|\Az{!<szöveg>!}|\\
-\commandinline|\Az*{!<szöveg>!}|\\
-\commandinline|\Azv{!<szöveg>!}|\\
-\commandinline|\Azv*{!<szöveg>!}|
+\huazcmd|\Az{!<szöveg>!}|\\
+\huazcmd|\Az*{!<szöveg>!}|\\
+\huazcmd|\Azv{!<szöveg>!}|\\
+\huazcmd|\Azv*{!<szöveg>!}|
-Ugyanaz, mint a kis ,,\texttt{a}'' betűvel kezdődő parancsok, de ekkor a határozott névelő nagybetűvel fog kezdődni, ami mondatok elején szükséges. Például
+Ugyanaz, mint a kis \code{a} betűvel kezdődő parancsok, de ekkor a határozott névelő nagybetűvel kezdődik, ami mondatok elején szükséges.
+Például
\begin{examplelst}
\section{Cím}\label{sec}
-\Az{\ref{sec}}.~szakaszban áttekintjük a téma rövid történetét.
+\Az{\ref{sec}}.~szakaszban \dots
\end{examplelst}
-eredménye {,,Az 1.~szakaszban áttekintjük a téma rövid történetét.''}.
+eredménye \huqq{Az 1.~szakaszban \dots}.
-\commandinline|\azsaved|
+\huazcmd|\azsaved|
-Amikor kiadja az előző parancsok bármelyikét, akkor generálódik egy kifejthető \verb|\azsaved| parancs is. Ennek eredménye az a határozott névelő amelyik a szó elé kell.
+Az előző parancsok bármelyikét használva, generálódik egy kifejthető \code|\azsaved| parancs.
+Ennek eredménye az a határozott névelő amelyik a szó elé kell.
-Amikor \texttt{hyperref} vagy \texttt{bookmark} csomagot használ, akkor ahogyan azt korábban említettük, a következő kód esetén a cím, fejléc, tartalomjegyzék rendben lesz, de a pdf vázlatfája nem:
+Amikor \code{hyperref} vagy \code{bookmark} csomagot használ, akkor (ahogyan azt korábban említettük) a következő kód esetén a cím, fejléc, tartalomjegyzék rendben lesz, de a pdf vázlatfája nem:
\begin{examplelst}
\section{\Az{\ref{sec}}...}
\end{examplelst}
-Ez az \verb|\azsaved| paranccsal a következő módon oldható meg:
+Ez az \code|\azsaved| paranccsal a következő módon oldható meg:
\begin{examplelst}
-\section{\texorpdfstring{\Az{\ref{sec}}...}{\azsaved~\ref{sec}...}}
+\section{\texorpdfstring {\Az*{\ref{sec}}} {\azsaved}
+ \ref{sec}...}
\end{examplelst}
Ekkor a vázlatfába az
\begin{examplelst}
-\azsaved~\ref{sec}...
+\azsaved \ref{sec}...
\end{examplelst}
-kód kerül, ami már helyes eredményt ad.
+kód kerül, ami már helyes eredményt ad.
-\commandinline|\aznotshow|
+\huazcmd|\aznotshow|
-Az előző probléma a \verb|\texorpdfstring| helyett ezzel a paranccsal egyszerűbben is megoldható. Ugyanis ezt helyezve az \verb|\az| (vagy bármelyik verziója) elé, az eredmény nem jelenik meg, csak az \verb|\azsaved| generálódik le a megfelelő határozott névelővel. Így
+Az előző probléma a \code|\texorpdfstring| helyett ezzel a paranccsal egyszerűbben is megoldható.
+Ugyanis ezt helyezve az \code|\az| (vagy bármelyik verziója) elé, az eredmény nem jelenik meg, csak az \code|\azsaved| generálódik le a megfelelő határozott névelővel.
+Így
\begin{examplelst}
\aznotshow\Az{\ref{sec}}
-\section{\azsaved~\ref{sec}...}
+\section{\azsaved \ref{sec}...}
\end{examplelst}
szintén helyes eredményt ad a vázlatfában is.
+\huazcmd|\azseparator{!<kód>!}|
+
+Ezzel lehet megadni, hogy a határozott névelő és a \code|!<szöveg>!| mivel legyen elválasztva.
+Alapértelmezetten ez a törhetetlen normál méretű szóköz, ami
+\begin{examplelst}
+\azseparator{~}
+\end{examplelst}
+módon lett beállítva.
+Ha át akarjuk állítani például törhető szóközre akkor ez
+\begin{examplelst}
+\azseparator{ }
+\end{examplelst}
+módon tehető meg.
+
\subsection{Rövidítések}
-A \verb|\ref|, \verb|\pageref|, \verb|\eqref|, \verb|\cite| kereszthivatkozások (csak a \verb|*| nélküli verziók) elé nem csak az előbbi parancsokkal tehetünk határozott névelőt, mert mindegyiknek van egy rövidített egyparancsos verziója is:
+A \code|\ref|, \code|\ref*|, \code|\eqref|, \code|\refeq|, \code|\pageref|, \code|\pageref*|, \code|\cite| kereszthivatkozások elé nem csak az előbbi parancsokkal tehetünk határozott névelőt, ugyanis mindegyiknek van egy rövidített egyparancsos verziója is:
+
+\huazcmd|\aref{!<kulcs>!} | $\equiv$ \code|\az{\ref{!<kulcs>!}}|\\
+\huazcmd|\aref*{!<kulcs>!} | $\equiv$ \code|\az{\ref*{!<kulcs>!}}|\\
+\huazcmd|\avref{!<kulcs>!} | $\equiv$ \code|\azv{\ref{!<kulcs>!}}|\\
+\huazcmd|\avref*{!<kulcs>!}| $\equiv$ \code|\azv{\ref*{!<kulcs>!}}|
-\commandinline|\aref{!<kulcs>!} | $\equiv$ \verbinline|\az{\ref{!<kulcs>!}}|\\
-\commandinline|\aref*{!<kulcs>!} | $\equiv$ \verbinline|\az*{\ref{!<kulcs>!}}|\\
-\commandinline|\avref{!<kulcs>!} | $\equiv$ \verbinline|\azv{\ref{!<kulcs>!}}|\\
-\commandinline|\avref*{!<kulcs>!}| $\equiv$ \verbinline|\azv*{\ref{!<kulcs>!}}|
+\huazcmd|\aeqref{!<kulcs>!} | $\equiv$ \code|\az{\eqref{!<kulcs>!}}|\\
+\huazcmd|\aveqref{!<kulcs>!} | $\equiv$ \code|\azv{\eqref{!<kulcs>!}}|
-\commandinline|\aeqref{!<kulcs>!} | $\equiv$ \verbinline|\az{\eqref{!<kulcs>!}}|\\
-\commandinline|\aeqref*{!<kulcs>!} | $\equiv$ \verbinline|\az*{\eqref{!<kulcs>!}}|\\
-\commandinline|\aveqref{!<kulcs>!} | $\equiv$ \verbinline|\azv{\eqref{!<kulcs>!}}|\\
-\commandinline|\aveqref*{!<kulcs>!}| $\equiv$ \verbinline|\azv*{\eqref{!<kulcs>!}}|
+\huazcmd|\arefeq{!<kulcs>!} | $\equiv$ \code|\az{\refeq{!<kulcs>!}}|\\
+\huazcmd|\avrefeq{!<kulcs>!} | $\equiv$ \code|\azv{\refeq{!<kulcs>!}}|
-\commandinline|\apageref{!<kulcs>!} | $\equiv$ \verbinline|\az{\pageref{!<kulcs>!}}|\\
-\commandinline|\apageref*{!<kulcs>!} | $\equiv$ \verbinline|\az*{\pageref{!<kulcs>!}}|\\
-\commandinline|\avpageref{!<kulcs>!} | $\equiv$ \verbinline|\azv{\pageref{!<kulcs>!}}|\\
-\commandinline|\avpageref*{!<kulcs>!}| $\equiv$ \verbinline|\azv*{\pageref{!<kulcs>!}}|
+\huazcmd|\apageref{!<kulcs>!} | $\equiv$ \code|\az{\pageref{!<kulcs>!}}|\\
+\huazcmd|\apageref*{!<kulcs>!} | $\equiv$ \code|\az{\pageref*{!<kulcs>!}}|\\
+\huazcmd|\avpageref{!<kulcs>!} | $\equiv$ \code|\azv{\pageref{!<kulcs>!}}|\\
+\huazcmd|\avpageref*{!<kulcs>!}| $\equiv$ \code|\azv{\pageref*{!<kulcs>!}}|
-\commandinline|\acite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!} | $\equiv$ \verbinline|\az{\cite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!}}|\\
-\commandinline|\acite*[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!} | $\equiv$ \verbinline|\az*{\cite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!}}|\\
-\commandinline|\avcite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!} | $\equiv$ \verbinline|\azv{\cite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!}}|\\
-\commandinline|\avcite*[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!}| $\equiv$ \verbinline|\azv*{\cite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!}}|
+\huazcmd|\acite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!} | $\equiv$ \code|\az{\cite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!}}|\\
+\huazcmd|\avcite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!} | $\equiv$ \code|\azv{\cite[!<szöveg>!]{!<kulcs1>!,!<kulcs2>!,!...!}}|
-A parancsok nevében az első ,,\texttt{a}'' betű kicserélhető ,,\texttt{A}'' betűre. Ekkor a határozott névelő nagybetűvel fog kezdődni, ami mondatok elején szükséges:
+A parancsok nevében az első \code{a} betű kicserélhető \code{A} betűre.
+Ekkor a határozott névelő nagybetűvel kezdődik, ami mondatok elején szükséges:
-\commandinline|\Aref \Avref \Aeqref \Aveqref \Apageref \Avpageref \Acite \Avcite|
+\huazcmd|\Aref \Aref* \Avref \Avref*|\\
+\huazcmd|\Aeqref \Aveqref|\\
+\huazcmd|\Arefeq \Avrefeq|\\
+\huazcmd|\Apageref \Apageref* \Avpageref \Avpageref*|\\
+\huazcmd|\Acite \Avcite|
Például
\begin{examplelst}
\section{Cím}\label{seca}
\section{Cím}\label{secb}
-\Aref{seca}.~és \aref{secb}.~szakaszban
+\Aref{seca}.~és \aref{secb}.~szakaszokban
\end{examplelst}
-eredménye ,,Az 1. és a 2. szakaszban''.
-
-\subsection{A huaz kapocs}\label{subsec-kapocs}
-
-Amikor a \huaz\ csomag megkeresi a megfelelő határozott névelőt, akkor a szövegben található \verb|\ref|, \verb|\ref*|, \verb|\pageref|, \verb|\pageref*|, \verb|\eqref|, \verb|\cite| kereszthivatkozásokat lecseréli a kifejthető verziójukra, továbbá a kifejtés során egy adott listában található formázó parancsokat (\verb|\emph|, \verb|\textbf|, \verb|\small|, stb.) figyelmen kívül hagyja. Emiatt lehetséges, hogy például a következő kódok működnek:
+eredménye \huqq{Az 1. és a 2. szakaszokban}.
+
+\subsection{Ignorált parancsok}\label{subsec-ignoralt-parancsok}
+
+Amikor a \huaz\ csomag megkeresi a megfelelő határozott névelőt, akkor a szövegben a következő parancsokat a nem szöveget tároló argumentumaikkal együtt (ha van) figyelmen kívül hagyja:
+
+\begin{multicols}{4}
+\code|\bfseries|\\
+\code|\color|\\
+\code|\emph|\\
+\code|\em|\\
+\code|\enquote|\\
+\code|\fbox|\\
+\code|\fontencoding|\\
+\code|\fontfamily|\\
+\code|\fontseries|\\
+\code|\fontshape|\\
+\code|\fontsize|\\
+\code|\footnotesize|\\
+\code|\framebox|\\
+\code|\hbox|\\
+\code|\href|\\
+\code|\huge|\\
+\code|\Huge|\\
+\code|\itshape|\\
+\code|\large|\\
+\code|\Large|\\
+\code|\LARGE|\\
+\code|\lowercase|\\
+\code|\makebox|\\
+\code|\MakeLowercase|\\
+\code|\MakeUppercase|\\
+\code|\mbox|\\
+\code|\mdseries|\\
+\code|\negthinspace|\\
+\code|\normalfont|\\
+\code|\normalsize|\\
+\code|\num|\\
+\code|\rmfamily|\\
+\code|\scriptsize|\\
+\code|\scshape|\\
+\code|\selectfont|\\
+\code|\sffamily|\\
+\code|\slshape|\\
+\code|\small|\\
+\code|\sscshape|\\
+\code|\swshape|\\
+\code|\textbf|\\
+\code|\textcolor|\\
+\code|\textit|\\
+\code|\textmd|\\
+\code|\textnormal|\\
+\code|\textqq|\\
+\code|\textrm|\\
+\code|\textsc|\\
+\code|\textsf|\\
+\code|\textsl|\\
+\code|\textssc|\\
+\code|\textsw|\\
+\code|\texttt|\\
+\code|\textulc|\\
+\code|\textup|\\
+\code|\tiny|\\
+\code|\told|\\
+\code|\ttfamily|\\
+\code|\ulcshape|\\
+\code|\underline|\\
+\code|\uppercase|\\
+\code|\upshape|\\
+\code|\usefont|
+\end{multicols}
+
+Emiatt lehetséges, hogy a következő kódok jól működnek:
\begin{examplelst}
\newcommand{\osztaly}{V.B}
Idén \az{\textbf{\osztaly}}~osztály rendezi a farsangot.
@@ -329,52 +552,376 @@ Idén \az{\textbf{\osztaly}}~osztály rendezi a farsangot.
\begin{examplelst}
\section{Cím}\label{sec}
-\az{\textbf{\ref{sec}}}
+\az{\footnotesize\ref{sec}}
\end{examplelst}
-De a következő kód is jól fog működni:
+De ez is helyes eredményt ad:
\begin{examplelst}
\newcommand{\myfont}[1]{{\usefont{T1}{yv1d}{m}{n}#1}}
-\newcommand{\osztaly}{X.A~osztály}
+\newcommand{\osztaly}{V.A~osztály}
\az{\myfont{\osztaly}}
\end{examplelst}
-Ez nem azért van, mert a \verb|\myfont| is szerepel ebben az adott listában, hanem azért, mert a \verb|\myfont| kifejtésében található \verb|\usefont| benne van.
+Azért kapunk helyes eredményt, mert a \code|\myfont| kifejtésében található \code|\usefont| szerepel az előző listában. Ha a \code|\myfont| erős parancsként lett volna definiálva, akkor már nem működne megfelelően az előző kód (lásd később). Ebben az esetben a \code|\myfont| parancsot is fel kell venni a listára.
+
+\huazcmd|\huazignorecmd[!<opció>!]{!<parancs>!}|
-\commandinline|\AddToHook{huaz}{!<kód>!}|
+Az ignoráló listát ezzel lehet bővíteni.
+A \code|!<parancs>!| helyére az ignorálandó parancsot kell írni az argumentumai és \code{*} nélkül.
+Az \code|!<opció>!| \code{0} és \code{9} közötti egész szám lehet.
+Amennyiben ezektől eltérő a beírt \code|!<opció>!|, akkor erre figyelmeztet a fordító.
+A használata három esetre bontható.
-Amennyiben olyan formázó parancsot használ, ami még ezen a listán nem található, akkor az a felhasználó által is bővíthető. Például a \texttt{shadowtext} csomag \verb|\shadowtext| parancsa nincs a listában, ezért a következő kód eredménye hibás lesz:
+\paragraph{1. eset}
+%
+Opció nélkül használva, a \code|!<parancs>!| a névelő megállapításakor törlődik, de az utána írt \code{*}, opció vagy argumentum nem.
+Deklarációs parancsok esetén jól használható.
+Például a \code|\tiny| parancs így lett besorolva a listába:
+\begin{examplelst}
+\huazignorecmd{\tiny}
+\end{examplelst}
+Ugyanez alkalmazható abban az esetben is, ha a \code|!<parancs>!|-nak nincs csillagos verziója sem opciója, továbbá az első \code|{ }| jelek közé írt argumentuma a figyelembe vett szöveg. Például a \code|\textrm| ilyen, ezért így lett besorolva:
+\begin{examplelst}
+\huazignorecmd{\textrm}
+\end{examplelst}
+
+A \code{shadowtext} csomag \code|\shadowtext| parancsa nincs a listában, ezért a következő kód eredménye hibás lesz:
\begin{examplelst}
\newcommand{\osztaly}{X.A~osztály}
\az{\shadowtext{\osztaly}}
\end{examplelst}
-A listára az
+A listára
\begin{examplelst}
-\AddToHook{huaz}{\def\shadowtext{}}
+\huazignorecmd{\shadowtext}
\end{examplelst}
-módon vehető fel. Ezzel a névelő megállapítása során a \verb|\shadowtext| parancs nem jelent semmit. Tehát a következő kód már megfelelően működik:
+módon vehető fel, mert a \code|\shadowtext| parancsnak sem opciója sem csillagos verziója nincs, továbbá egyetlen argumentuma a szöveg.
+Tehát a következő kód már megfelelően működik:
\begin{examplelst}
-\AddToHook{huaz}{\def\shadowtext{}}
+\huazignorecmd{\shadowtext}
\newcommand{\osztaly}{X.A~osztály}
\az{\shadowtext{\osztaly}}
\end{examplelst}
-Az előző eset a \texttt{huaz} kapocs nélkül így is megoldható:
+Megjegyezzük, hogy az előző eset így is megoldható:
\begin{examplelst}
\newcommand{\osztaly}{X.A~osztály}
\az*{\osztaly}~\shadowtext{\osztaly}
\end{examplelst}
-Ha a \verb|\shadowtext| az \verb|\osztaly| definíciójában szerepel, akkor a \texttt{huaz} kapocs használata nem kerülhető meg:
+Ha a \code|\shadowtext| az \code|\osztaly| definíciójában szerepel, akkor nem tudjuk megkerülni a \code|\huazignorecmd| használatát az előző módon:
\begin{examplelst}
-\AddToHook{huaz}{\def\shadowtext{}}
+\huazignorecmd{\shadowtext}
\newcommand{\osztaly}{\shadowtext{X.A~osztály}}
\az{\osztaly}
\end{examplelst}
-Ha a formázó parancs erős, akkor a \texttt{huaz} kapocs használata szintén nem kerülhető meg. Például
+
+\paragraph{2. eset}
+%
+Ha az \code|!<opció>!| \code{0}, akkor a \code|!<parancs>!| és az utána található első \code|{| jelig található kódok mindegyike ignorálódik a névelő megállapításakor.
+Tehát például
\begin{examplelst}
-\AddToHook{huaz}{\def\myfont{}}
-\DeclareRobustCommand{\myfont}[1]{{\usefont{T1}{yv1d}{m}{n}#1}}
-\renewcommand{\thesection}{\myfont{\arabic{section}}}
+\huazignorecmd[0]{\foo}
+\end{examplelst}
+esetén a
+\begin{examplelst}
+\foo{...} \foo*{...} \foo[...]{...} \foo*[...]{...}
+\end{examplelst}
+kódokban a
+\begin{examplelst}
+\foo \foo* \foo[...] \foo*[...]
+\end{examplelst}
+mindegyike figyelmen kívül lesz hagyva a névelő megállapításakor.
+A \code|\makebox| például
+\begin{examplelst}
+\huazignorecmd[0]{\makebox}
+\end{examplelst}
+módon lett besorolva, ezért például
+\begin{examplelst}
+\makebox[2cm][s]{szöveg}
+\end{examplelst}
+esetén a \code|\makebox[2cm][s]| rész törlődik és csak a \huqq{szöveg} lesz figyelembe véve.
+
+
+Ha a formázó parancs erős, akkor a \code|\huazignorecmd| használata nem kerülhető meg még akkor sem, ha a listán szereplő parancsokkal épül fel.
+Például
+\begin{examplelst}
+\huazignorecmd[0]{\myfont}
+\DeclareRobustCommand{\myfont}[2][cmr]
+ {{\usefont{T1}{#1}{m}{n}#2}}
+\renewcommand{\thesection}{\myfont[yv1d]{\arabic{section}}}
\section{Cím}\label{sec}
\aref{sec}
\end{examplelst}
+Ebben a példában nem hagyható el a \code{[0]}, mert a \code|\myfont|-nak van opciója.
+
+\paragraph{3. eset}
+%
+Ha az \code|!<opció>!| \code{1} és \code{9} közötti egész szám, akkor a \code|\huazignorecmd| parancs a névelő megállapítása során a \code|!<parancs>!|-ot és az utána következő első \code|{| jelig tartó kódokat ignorálja, továbbá ezután az első \code|!<opció>!| darab \code|{ }| jelek közé írt részeket szintén figyelmen kívül hagyja.
+Tehát például
+\begin{examplelst}
+\huazignorecmd[1]{\foo}
+\end{examplelst}
+esetén a
+\begin{examplelst}
+\foo{...} \foo*{...} \foo[...]{...} \foo*[...]{...}
+\end{examplelst}
+kódok mindegyike figyelmen kívül lesz hagyva a névelő megállapításakor.
+Például a \code|\textcolor| parancs
+\begin{examplelst}
+\huazignorecmd[1]{\textcolor}
+\end{examplelst}
+módon lett a listába sorolva, így a
+\begin{examplelst}
+\textcolor[RGB]{20,30,40}{szöveg}
+\end{examplelst}
+parancsban a
+\begin{examplelst}
+\textcolor[RGB]{20,30,40}
+\end{examplelst}
+kódrész ignorálva lesz, és csak a ,,\code{szöveg}'' kerül vizsgálatra a névelő megállapításakor.
+Ha a
+\begin{examplelst}
+\huazignorecmd[2]{\foo}
+\end{examplelst}
+parancsot használjuk, akkor a
+\begin{examplelst}
+\foo{...}{...} \foo*{...}{...}
+\foo[...]{...}{...} \foo*[...]{...}{...}
+\end{examplelst}
+kódok mindegyike figyelmen kívül lesz hagyva a névelő megállapításakor.
+Például a \code|\fontsize| parancs
+\begin{examplelst}
+\huazignorecmd[2]{\fontsize}
+\end{examplelst}
+módon lett a listába sorolva, így a
+\begin{examplelst}
+\fontsize{14pt}{14pt}
+\end{examplelst}
+parancs figyelmen kívül lesz hagyva a névelő megállapításakor.
+
+\subsection{A kereszthivatkozások kifejthető verziói}
+Ha a szöveg elején kereszthivatkozás van, akkor a határozott névelő megállapítása előtt a kereszthivatkozás parancsát le kell cserélni annak kifejthető verziójára.
+A \code{refcount} csomag két ilyen parancsot definiál:
+A \code|\getrefnumber| a \code|\ref|, \code|\ref*|, \code|\eqref|, \code|\refeq| esetén
+használható, a \code|\getpagerefnumber| pedig a \code|\pageref| és \code|\pageref*| esetén.
+
+\huazcmd|\huazrefcmd{!<parancs>!}|
+
+Ezzel a paranccsal elérhető, hogy a \code|!<parancs>!| helyére beírt parancsot és annak csillagos verzióját a határozott névelő megállapítása során a \code|\getrefnumber| paranccsal helyettesítse.
+
+A \code|\ref|, \code|\ref*|, \code|\eqref|, \code|\refeq| parancsok így lettek besorolva a \huaz\ csomagban:
+\begin{examplelst}
+\huazrefcmd{\ref}
+\huazrefcmd{\eqref}
+\huazrefcmd{\refeq}
+\end{examplelst}
+Ezzel már az \code|\eqref*| és \code|\refeq*| is működne, de ezek a csillagos verziók nincsenek definiálva a csillag nélküli verziókat definiáló \code{amsmath} illetve \code{mathtools} csomagokban. Ezt mi is pótolhatjuk, amire \aref{subsec-eqref}.~alszakaszban láthatunk megoldást.
+
+\huazcmd|\huazpagerefcmd{!<parancs>!}|
+
+Ezzel a paranccsal elérhető, hogy a \code|!<parancs>!| helyére beírt parancsot és annak csillagos verzióját a határozott névelő megállapítása során a \code|\getpagerefnumber| paranccsal helyettesítse.
+
+A \code|\pageref| és \code|\pageref*| parancsok így lettek besorolva a \huaz\ csomagban:
+\begin{examplelst}
+\huazrefcmd{\pageref}
+\end{examplelst}
+
+Ezekre láthatunk egy alkalmazást \aref{subsec-autoref}.~alszakaszban.
+
+\subsection{Az \texttt{\textbackslash autoref} és \texttt{\textbackslash autopageref} parancsok}\label{subsec-autoref}
+
+Ezeket a parancsokat a \code{hyperref} csomag definiálja.
+Ezekkel hivatkozva egy címkére, nem csak a sorszám, hanem a sorszámozott egység neve (szakasz, alszakasz, oldal, stb.) is megjelenik link formájában.
+Ezeknek léteznek csillagos verzióik is, melyeknek ugyanaz a hatásuk, de nem generálnak linket.
+
+Magyar nyelvű dokumentumokban nem lehet közvetlenül alkalmazni, mert az angol szabály szerint \huqq{1.~szakasz} helyett \huqq{szakasz~1} lesz az eredménye a következőnek:
+\begin{examplelst}
+\section{Cím}\label{sec}
+\autoref*{sec}
+\end{examplelst}
+A használatához először magyarosítani kell a következő kóddal a \code{hyperref} betöltése után a preambulumban:
+\begin{examplelst}
+\usepackage{regexpatch}
+\makeatletter
+\xpatchcmd{\HyRef@autosetref}{\HyRef@currentHtag}{}{}{}
+\xpatchcmd{\HyRef@autosetref}{\null}
+ {\null.~\HyRef@currentHtag}{}{}
+\xpatchcmd*{\HyRef@testreftype}{~}{}{}{}
+\makeatother
+\RenewDocumentCommand{\autopageref}{sm}{%
+ \IfBooleanTF{#1}
+ {\pageref*{#2}.~oldal}
+ {\hyperref[{#2}]{\pageref*{#2}.~oldal}}}
+\end{examplelst}
+Ezután már \huqq{1.~szakasz} lesz az eredmény.
+
+Ha az így módosított \code|\autoref|, \code|\autoref*|, \code|\autopageref|, \code|\autopageref*| parancsokhoz automatikus határozott névelőt szeretnénk, akkor írjuk be a következőket a \huaz\ betöltése után:
+\begin{examplelst}
+\huazrefcmd{\autoref}
+\huazpagerefcmd{\autopageref}
+\end{examplelst}
+Ezután a következő kód eredménye \huqq{Az 1. szakasz az 1. oldalon kezdődik.} lesz:
+\begin{examplelst}
+\section{Cím}\label{sec}
+\Az{\autoref*{sec}} \az{\autopageref*{sec}on} kezdődik.
+\end{examplelst}
+
+\subsection{Az \texttt{\textbackslash eqref*} és \texttt{\textbackslash refeq*} parancsok}\label{subsec-eqref}
+
+A \code|\ref| és \code|\pageref| parancsoknak definiált a csillagos verziójuk is, amely alapesetben nem különbözik a normál verziótól, de a \code{hyperref} csomaggal használva a csillag nélküli verzió linket generál, míg a csillagos nem.
+
+Az \code{amsmath} csomag által definiált \code|\eqref| a \code{hyperref} csomaggal együtt használva szintén generál linket, de ennek nincs definiálva csillagos verziója, így ekkor a link nélküli verzió nem érhető el közvetlenül.
+További gond az ilyen link nélküli egyenlethivatkozás előtti automatikus névelő megadása.
+
+Négy lehetséges megoldást mutatunk.
+
+\begin{enumerate}
+\item
+A \code{NoHyper} környezet használatával:
+\begin{examplelst}
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \begin{NoHyper}\aeqref{eq}\end{NoHyper}
+ egyenletet!}
+\end{examplelst}
+
+\item
+Az \code|\az*| parancs használatával:
+\begin{examplelst}
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \az*{\ref{eq}} \textup{(\ref*{eq})}
+ egyenletet!}
+\end{examplelst}
+
+\item
+Az \code|\eqrefstyle| parancs definiálásával és a \code|\huazignorecmd| paranccsal, amely az előzőnek egy kényelmesebben használható verziója:
+\begin{examplelst}
+\makeatletter
+\newcommand{\eqrefstyle}[1]{\textup{\tagform@{#1}}}
+\makeatother
+\huazignorecmd{\eqrefstyle}
+
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \az{\eqrefstyle{\ref*{eq}}} egyenletet!}
+\end{examplelst}
+
+\item
+Ebben az esetben definiáljuk az \code|\eqref| csillagos verzióját (az \code{amsmath} betöltése után), amely nem generál linket a \code{hyperref} csomaggal együtt használva:
+\begin{examplelst}
+\makeatletter
+\DeclareDocumentCommand{\eqref}{ s m }{%
+ \textup{\tagform@{%
+ \IfBooleanTF{#1}{\ref*{#2}}{\ref{#2}}%
+ }}%
+}
+\makeatother
+\end{examplelst}
+Ezután a
+\begin{examplelst}
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \az{\eqref*{eq}} egyenletet!}
+\end{examplelst}
+kód helyes eredményt ad, mert a \huaz\ csomagban nem csak az \code|\eqref|, hanem az \code|\eqref*| is a kifejthető \code|\getrefnumber| parancsra lesz kicserélve a határozott névelő meghatározásánál.
+\end{enumerate}
+
+Ugyanez a probléma a \code{mathtools} csomag által definiált \code|\refeq| és a \code{hyperref} csomag együttes használata esetében.
+
+Az előző négy megoldás mindegyikét lehet alkalmazni megfelelő módosításokkal:
+\begin{enumerate}
+\item
+A \code{NoHyper} környezet használatával:
+\begin{examplelst}
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \begin{NoHyper}\arefeq{eq}\end{NoHyper}
+ egyenletet!}
+\end{examplelst}
+
+\item
+Az \code|\az*| parancs használatával:
+\begin{examplelst}
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \az*{\ref{eq}} \textup{\ref*{eq}} egyenletet!}
+\end{examplelst}
+
+\item
+A \code|\refeqstyle| parancs definiálásával:
+\begin{examplelst}
+\newcommand{\refeqstyle}[1]{\textup{#1}}
+
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \az{\refeqstyle{\ref*{eq}}} egyenletet!}
+\end{examplelst}
+Itt nincs szükség a \code|\huazignorecmd{\refeqstyle}| használatára.
+
+\item
+A \code|\refeq*| parancs definiálásával:
+\begin{examplelst}
+\DeclareDocumentCommand{\refeq}{ s m }{%
+ \textup{%
+ \IfBooleanTF{#1}{\ref*{#2}}{\ref{#2}}%
+ }%
+}
+\end{examplelst}
+Ezután a
+\begin{examplelst}
+\begin{equation}\label{eq}
+a=b
+\end{equation}
+\emph{Lásd \az{\refeq*{eq}} egyenletet!}
+\end{examplelst}
+kód helyes eredményt ad, mert a \huaz\ csomagban nem csak a \code|\refeq|, hanem a \code|\refeq*| is a kifejthető \code|\getrefnumber| parancsra lesz kicserélve a határozott névelő meghatározásánál.
+\end{enumerate}
+
+\subsection{Parancsok átdefiniálása a határozott névelő megállapításakor}
+
+A \code|\huazignorecmd|, \code|\huazrefcmd| és \code|\huazpagerefcmd| parancsok is a címben szereplő funkciót látják el, de speciális esetekben.
+Ezek általánosított verziója a következő parancs:
+
+\huazcmd|\huazdefcmd{!<átdefiniáló kód>!}|
+
+Az \code|!<átdefiniáló kód>!| helyére egy parancsnak azt a definícióját kell írni, amelynek a határozott névelő megállapítása során kell érvényesülnie.
+Felsorolunk néhány kódpárt, melyek ekvivalensek egymással:
+\begin{examplelst}
+\huazignorecmd{\tiny}
+\huazdefcmd{\def\tiny{}}
+\end{examplelst}
+
+\begin{examplelst}
+\huazignorecmd[0]{\makebox}
+\huazdefcmd{\def\makebox#1#{}}
+\end{examplelst}
+
+\begin{examplelst}
+\huazignorecmd[1]{\textcolor}
+\huazdefcmd{\def\textcolor#1#{\@gobble}}
+\end{examplelst}
+
+\begin{examplelst}
+\huazrefcmd{\ref}
+\huazdefcmd{\def\ref#1#{\getrefnumber}}
+\end{examplelst}
+
+Alkalmazásként tekintsük a következő kódot, amely hibával fog fordulni:
+\begin{examplelst}
+\newcommand{\tananyag}{\LaTeX\ alapjai}
+A mai óra anyaga \az{\tananyag}.
+\end{examplelst}
+A megfelelő eredményhez a \code|\LaTeX| parancsot át kell definiálni a névelő megállapításakor:
+\begin{examplelst}
+\huazdefcmd{\def\LaTeX{latex}}
+\newcommand{\tananyag}{\LaTeX\ alapjai}
+A mai óra anyaga \az{\tananyag}.
+\end{examplelst}
+Az eredmény \huqq{A mai óra anyaga a \LaTeX.} lesz.
\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/hvqrurl/Changes b/macros/latex/contrib/hvqrurl/Changes
index aa30416b54..ac9fca90d3 100644
--- a/macros/latex/contrib/hvqrurl/Changes
+++ b/macros/latex/contrib/hvqrurl/Changes
@@ -1,4 +1,5 @@
hvqrurl.sty:
+0.08 2024-05-14 - fix for color setting of the qrcode
0.07 2024-02-06 - allow active chars in linktext
0.06 2024-02-03 - fix for introduced bug with linktext
0.05a 2024-02-02 - modified documentation
diff --git a/macros/latex/contrib/hvqrurl/doc/hvqrurl.pdf b/macros/latex/contrib/hvqrurl/doc/hvqrurl.pdf
index 95b739d2b2..0960eb3f17 100644
--- a/macros/latex/contrib/hvqrurl/doc/hvqrurl.pdf
+++ b/macros/latex/contrib/hvqrurl/doc/hvqrurl.pdf
Binary files differ
diff --git a/macros/latex/contrib/hvqrurl/doc/hvqrurl.tex b/macros/latex/contrib/hvqrurl/doc/hvqrurl.tex
index 89fd8cdea6..9886a639c0 100644
--- a/macros/latex/contrib/hvqrurl/doc/hvqrurl.tex
+++ b/macros/latex/contrib/hvqrurl/doc/hvqrurl.tex
@@ -1,4 +1,4 @@
-%% $Id: hvqrurl.tex 872 2024-02-06 16:11:47Z herbert $
+%% $Id: hvqrurl.tex 895 2024-05-14 19:22:17Z herbert $
\listfiles
\errorcontextlines=100
\documentclass[twoside=on,usegeometry]{scrartcl}
@@ -38,7 +38,7 @@
linktocpage, colorlinks=true}%
\begin{document}
-\title{Package \texttt{hvqrurl}\\Creating a QR-code of an URL in the margin \\\small ver 0.07}
+\title{Package \texttt{hvqrurl}\\Creating a QR-code of an URL in the margin \\\small ver 0.08}
\author{Herbert Voß\thanks{\protect\url{hvoss@tug.org}}}
\date{\today}
\maketitle
@@ -100,7 +100,7 @@ if hyperref is aktive.
\subsection{Color of the QR code}
-Without using \LPack{hyperref} the default color is \Lkeyval{black}. It can be changed by
+The default color is \Lkeyval{black}. It can be changed by
the optional argument \Lkeyword{qrcolor}. The package
\LPack{xcolor}\hvqrurl*[qrlink=nolink,qrcolor=red!40!white]{https://mirror.ctan.org/pkg/xcolor}
is loaded by default,
diff --git a/macros/latex/contrib/hvqrurl/latex/hvqrurl.sty b/macros/latex/contrib/hvqrurl/latex/hvqrurl.sty
index af29f1a446..da8f84fc10 100644
--- a/macros/latex/contrib/hvqrurl/latex/hvqrurl.sty
+++ b/macros/latex/contrib/hvqrurl/latex/hvqrurl.sty
@@ -1,4 +1,4 @@
-%% $Id: hvqrurl.sty 872 2024-02-06 16:11:47Z herbert $
+%% $Id: hvqrurl.sty 895 2024-05-14 19:22:17Z herbert $
%%
%% This file is distributed under the terms of the LaTeX Project Public
%% License from CTAN archives in directory macros/latex/base/lppl.txt.
@@ -7,7 +7,7 @@
% Copyright 2019,21,23,24 Herbert Voss hvoss@tug.org
%%
\ProvidesPackage{hvqrurl}[%
- 2024/02/06 v.0.07 (Herbert Voss) Supports qr images into the margin (hv)]
+ 2024/05/14 v.0.08 (Herbert Voss) Supports qr images into the margin (hv)]
%
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{url}
@@ -16,7 +16,9 @@
\RequirePackage{qrcode}
\RequirePackage{xkeyval}
-\newif\if@no@hyperref \@no@hyperreffalse
+\newif\if@no@hyperref
+\@no@hyperreffalse
+
\DeclareOption{nohyperref}{\@no@hyperreftrue}
\ProcessOptions
@@ -33,6 +35,8 @@
\define@key{hvqr}{linktext}[]{\def\qr@url@linktext{#1}}
\define@boolkey{hvqr}[hv@]{qrreverse}[true]{}
+\newcommand*\qr@url@qr@nolink{nolink}
+
\setkeys{hvqr}{qrheight,qrcolor=black,qradjust,qrlevel,qrlink=link,
qrreverse=false,linktext={}}% the default setting
@@ -46,10 +50,6 @@
\newcommand*\hvqr@@url[2][]{%
\begingroup
\providecommand*\qr@blank{0}%
- \ifx\relax#1\relax \else\hvqrset{#1}\fi
- % Set options for package qrcode
- \expandafter\qrset\expandafter{\qr@url@qrlink,height=\qr@url@qrheight,level=\qr@url@qrlevel}%
- \ifhv@qrreverse\reversemarginpar\fi
\if@tempswa
\ifx\@empty\qr@url@linktext % alternative link text?
\edef\hv@foo{\detokenize\expandafter{#2}}%
@@ -62,9 +62,24 @@
\href{\hv@fooA}{\hv@fooB}%
\fi
\fi
- \edef\reserved@a{\noexpand\marginnote{\noexpand\color{qr@url@qrcolor}\noexpand\qrcode{%
+% \endgroup
+% \begingroup
+ \ifx\relax#1\relax \else\hvqrset{#1}\fi
+ % Set options for package qrcode
+ \expandafter\qrset\expandafter{\qr@url@qrlink,height=\qr@url@qrheight,level=\qr@url@qrlevel}%
+ \ifhv@qrreverse\reversemarginpar\fi
+ \if@no@hyperref
+ \color{qr@url@qrcolor}%
+ \else
+ \ifx\qr@url@qrlink\qr@url@qr@nolink
+ \color{qr@url@qrcolor}%
+ \else
+ \hypersetup{urlcolor=qr@url@qrcolor}%
+ \fi
+ \fi
+ \edef\reserved@a{\noexpand\marginnote{\noexpand\qrcode{%
\detokenize\expandafter{#2}}}[\qr@url@qradjust]}%
- \reserved@a
+ \reserved@a
\endgroup
}
diff --git a/macros/latex/contrib/hyperref/ChangeLog.txt b/macros/latex/contrib/hyperref/ChangeLog.txt
index 28d6ff9240..7d8f3b3a24 100644
--- a/macros/latex/contrib/hyperref/ChangeLog.txt
+++ b/macros/latex/contrib/hyperref/ChangeLog.txt
@@ -1,3 +1,17 @@
+2024-05-25 Ulrike Fischer
+ * hyperref.dtx: load stringenc always to allow the use of pdfencoding in a group.
+
+2024-05-22 Ulrike Fischer
+ * hyperref.dtx: add \@makeother{:} to \hyper@normalise, issue #340
+
+2024-04-22 Ulrike Fischer
+ * hyperref.dtx: remove auxhook package.
+
+2024-02-14 Ulrike Fischer
+ * hyperref.dtx: allow commands in counter names
+issue #330
+
+Version: 2024-01-20 v7.01h
2024-01-20 Ulrike Fischer
* hyperref.dtx: alias for \deferred@thm@head to allow patching if czech is used,
issue #324
@@ -5,7 +19,6 @@ issue #324
2024-01-20 Ulrike Fischer
* create xr-hyper.dtx, align it with the current xr.dtx to prepare the merge
-Version: 2024-01-20 v7.01h
2024-01-19 Ulrike Fischer
* xr-hyper.sty: add support for properties, issue latex3/latex2e#1180
diff --git a/macros/latex/contrib/hyperref/README.md b/macros/latex/contrib/hyperref/README.md
index 0718a1e221..7161209179 100644
--- a/macros/latex/contrib/hyperref/README.md
+++ b/macros/latex/contrib/hyperref/README.md
@@ -1,6 +1,6 @@
# README for hyperref bundle
-Version 2024-01-20 v7.01h
+Version 2024-05-23 v7.01i
## INTRODUCTION
diff --git a/macros/latex/contrib/hyperref/doc/backref.pdf b/macros/latex/contrib/hyperref/doc/backref.pdf
index c145263b55..ae783bd0cf 100644
--- a/macros/latex/contrib/hyperref/doc/backref.pdf
+++ b/macros/latex/contrib/hyperref/doc/backref.pdf
Binary files differ
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc.html b/macros/latex/contrib/hyperref/doc/hyperref-doc.html
index b83a28781f..70741ce170 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc.html
@@ -25,7 +25,7 @@ href="https://github.com/latex3/hyperref/issues" class="url" ><span
class="ec-lmvtt-10x-x-120">https://github.com/latex3/hyperref/issues</span></a><span
class="ec-lmr-12">)</span></div><br />
<div class="date" ><span
-class="ec-lmr-12">2024-01-20 v7.01h</span></div>
+class="ec-lmr-12">2024-05-23 v7.01i</span></div>
</div>
<h3 class="likesectionHead"><a
id="x1-1000"></a>Contents</h3>
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc.pdf b/macros/latex/contrib/hyperref/doc/hyperref-doc.pdf
index fff97a2b36..51e6b0d29b 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc.pdf
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc.tex b/macros/latex/contrib/hyperref/doc/hyperref-doc.tex
index ea17fc7817..55b0476967 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc.tex
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc.tex
@@ -166,7 +166,7 @@
}
\makeatother
\title{Hypertext marks in \hologo{LaTeX}: a manual for \xpackage{hyperref}}
-\date{2024-01-20 v7.01h}
+\date{2024-05-23 v7.01i}
\begin{document}
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc2.html b/macros/latex/contrib/hyperref/doc/hyperref-doc2.html
index e24d5ff1cd..a3d6f2bce0 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc2.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc2.html
@@ -12,8 +12,8 @@
>
<div class="footnote-text">
<!--l. 212--><p class="indent" > <span class="footnote-mark"><a
- id="fn1x0"><a
- id="x2-4002x2"></a> <sup class="textsuperscript">1</sup></a></span><span
+ id="x2-4002x2"></a><a
+ id="fn1x0"> <sup class="textsuperscript">1</sup></a></span><span
class="ec-lmr-8">Now: </span><a
href="https://ctan.org/tex-archive/support/hypertex/hypertex" class="url" ><span
class="ec-lmvtt-10x-x-80">https://ctan.org/tex-archive/support/hypertex/hypertex</span></a></div>
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc3.html b/macros/latex/contrib/hyperref/doc/hyperref-doc3.html
index 516b3b2573..5307489974 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc3.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc3.html
@@ -12,8 +12,8 @@
>
<div class="footnote-text">
<!--l. 230--><p class="indent" > <span class="footnote-mark"><a
- id="fn2x0"><a
- id="x3-4004x2"></a> <sup class="textsuperscript">2</sup></a></span><span
+ id="x3-4004x2"></a><a
+ id="fn2x0"> <sup class="textsuperscript">2</sup></a></span><span
class="ec-lmr-8">This is borrowed from an article by Arthur Smith.</span></div>
</body></html>
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc4.html b/macros/latex/contrib/hyperref/doc/hyperref-doc4.html
index cada83835b..1003f3d1c8 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc4.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc4.html
@@ -12,8 +12,8 @@
>
<div class="footnote-text">
<!--l. 300--><p class="indent" > <span class="footnote-mark"><a
- id="fn3x0"><a
- id="x4-4006x2"></a> <sup class="textsuperscript">3</sup></a></span><span
+ id="x4-4006x2"></a><a
+ id="fn3x0"> <sup class="textsuperscript">3</sup></a></span><span
class="ec-lmr-8">Make sure you turn off the partial font downloading supported by </span><span
class="ec-lmss-8">dvips </span><span
class="ec-lmr-8">and </span><span
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc5.html b/macros/latex/contrib/hyperref/doc/hyperref-doc5.html
index e8d78ad09f..040bfb56b8 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc5.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc5.html
@@ -12,8 +12,8 @@
>
<div class="footnote-text">
<!--l. 338--><p class="indent" > <span class="footnote-mark"><a
- id="fn4x0"><a
- id="x5-5002x3"></a> <sup class="textsuperscript">4</sup></a></span><span
+ id="x5-5002x3"></a><a
+ id="fn4x0"> <sup class="textsuperscript">4</sup></a></span><span
class="ec-lmr-8">But work has started to reduce the number of redefinition and so the dependencies on the loading</span>
<span
class="ec-lmr-8">order.</span></div>
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc6.html b/macros/latex/contrib/hyperref/doc/hyperref-doc6.html
index 8d8b5298b1..3f287f8bb4 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc6.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc6.html
@@ -12,8 +12,8 @@
>
<div class="footnote-text">
<span class="footnote-mark"><a
- id="fn5x0"><a
- id="x6-29002x7"></a> <sup class="textsuperscript">5</sup></a></span><span
+ id="x6-29002x7"></a><a
+ id="fn5x0"> <sup class="textsuperscript">5</sup></a></span><span
class="ec-lmr-8">This section moved from the README file, needs more integration into the manual</span></div>
</body></html>
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc7.html b/macros/latex/contrib/hyperref/doc/hyperref-doc7.html
index 767dd0b5b4..30410c45c9 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc7.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc7.html
@@ -12,8 +12,8 @@
>
<div class="footnote-text">
<!--l. 2886--><p class="indent" > <span class="footnote-mark"><a
- id="fn6x0"><a
- id="x7-64002x11"></a> <sup class="textsuperscript">6</sup></a></span><span
+ id="x7-64002x11"></a><a
+ id="fn6x0"> <sup class="textsuperscript">6</sup></a></span><span
class="ec-lmr-8">It will be merged with the </span><span
class="ec-lmss-8">xr </span><span
class="ec-lmr-8">package soon</span></div>
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc8.html b/macros/latex/contrib/hyperref/doc/hyperref-doc8.html
index dc87a971db..4a67e9b1b2 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc8.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc8.html
@@ -12,8 +12,8 @@
>
<div class="footnote-text">
<span class="footnote-mark"><a
- id="fn7x0"><a
- id="x8-104002x12"></a> <sup class="textsuperscript">7</sup></a></span><span
+ id="x8-104002x12"></a><a
+ id="fn7x0"> <sup class="textsuperscript">7</sup></a></span><span
class="ec-lmr-8">This section moved from the README file, needs more integration into the manual</span></div>
</body></html>
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-doc9.html b/macros/latex/contrib/hyperref/doc/hyperref-doc9.html
index da2b18955e..c6f5c87fc8 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-doc9.html
+++ b/macros/latex/contrib/hyperref/doc/hyperref-doc9.html
@@ -12,8 +12,8 @@
>
<div class="footnote-text">
<span class="footnote-mark"><a
- id="fn8x0"><a
- id="x9-108002x13"></a> <sup class="textsuperscript">8</sup></a></span><span
+ id="x9-108002x13"></a><a
+ id="fn8x0"> <sup class="textsuperscript">8</sup></a></span><span
class="ec-lmr-8">This section moved from the README file, needs more integration into the manual</span></div>
</body></html>
diff --git a/macros/latex/contrib/hyperref/doc/hyperref-linktarget.pdf b/macros/latex/contrib/hyperref/doc/hyperref-linktarget.pdf
index 7392570e8a..f95e9380f6 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref-linktarget.pdf
+++ b/macros/latex/contrib/hyperref/doc/hyperref-linktarget.pdf
Binary files differ
diff --git a/macros/latex/contrib/hyperref/doc/hyperref.pdf b/macros/latex/contrib/hyperref/doc/hyperref.pdf
index cb1dbc9af6..62ce7aba61 100644
--- a/macros/latex/contrib/hyperref/doc/hyperref.pdf
+++ b/macros/latex/contrib/hyperref/doc/hyperref.pdf
Binary files differ
diff --git a/macros/latex/contrib/hyperref/doc/nameref.pdf b/macros/latex/contrib/hyperref/doc/nameref.pdf
index acea390806..47209adb7c 100644
--- a/macros/latex/contrib/hyperref/doc/nameref.pdf
+++ b/macros/latex/contrib/hyperref/doc/nameref.pdf
Binary files differ
diff --git a/macros/latex/contrib/hyperref/doc/xr-hyper.pdf b/macros/latex/contrib/hyperref/doc/xr-hyper.pdf
index 65cfddbafa..3b4395c0f6 100644
--- a/macros/latex/contrib/hyperref/doc/xr-hyper.pdf
+++ b/macros/latex/contrib/hyperref/doc/xr-hyper.pdf
Binary files differ
diff --git a/macros/latex/contrib/hyperref/hluatex.dtx b/macros/latex/contrib/hyperref/hluatex.dtx
index 092b41aad2..8a90953abb 100644
--- a/macros/latex/contrib/hyperref/hluatex.dtx
+++ b/macros/latex/contrib/hyperref/hluatex.dtx
@@ -1,6 +1,6 @@
% \iffalse
% Source File: hluatex.dtx
-% 2024-01-20 v7.01h
+% 2024-05-23 v7.01i
%
% Copyright
% 2016-2019 Oberdiek Package Support Group
@@ -31,13 +31,12 @@
%
% \begin{macrocode}
%<*luatex>
-%% 2024-01-20 v7.01h
+%% 2024-05-23 v7.01i
%% force unicode encoding, see issue #101
%% code mostly copied from hxetex.def
\HyPsd@LoadUnicode
\Hy@unicodetrue
\let\HyPsd@pdfencoding\HyPsd@pdfencoding@unicode
-\HyPsd@LoadStringEnc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% remains of luatex85 package
\protected\def\pdfcatalog {\pdfextension catalog }
diff --git a/macros/latex/contrib/hyperref/hyperref-linktarget.dtx b/macros/latex/contrib/hyperref/hyperref-linktarget.dtx
index 2348e91e8f..c35b68d116 100644
--- a/macros/latex/contrib/hyperref/hyperref-linktarget.dtx
+++ b/macros/latex/contrib/hyperref/hyperref-linktarget.dtx
@@ -53,7 +53,7 @@
% }^^A
% }
%
-% \date{Version 2024-01-20 v7.01h}
+% \date{Version 2024-05-23 v7.01i}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/hyperref/hyperref-patches.dtx b/macros/latex/contrib/hyperref/hyperref-patches.dtx
index 0f23ee5525..c9ffbf15bc 100644
--- a/macros/latex/contrib/hyperref/hyperref-patches.dtx
+++ b/macros/latex/contrib/hyperref/hyperref-patches.dtx
@@ -55,7 +55,7 @@
% }^^A
% }
%
-% \date{Version 2024-01-20 v7.01h}
+% \date{Version 2024-05-23 v7.01i}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/hyperref/hyperref.dtx b/macros/latex/contrib/hyperref/hyperref.dtx
index 2c6347a623..8f6096d77d 100644
--- a/macros/latex/contrib/hyperref/hyperref.dtx
+++ b/macros/latex/contrib/hyperref/hyperref.dtx
@@ -51,7 +51,7 @@
%<puvnenc>\ProvidesFile{puvnenc.def}
%<puarenc>\ProvidesFile{puarenc.def}
%<psdextra>\ProvidesFile{psdextra.def}
-%<!none&!packageEnd> [2024-01-20 v7.01h %
+%<!none&!packageEnd> [2024-05-23 v7.01i %
%<package> Hypertext links for LaTeX]
%<nohyperref> Dummy hyperref (SR)]
%<driver> Hyperref documentation driver file]
@@ -594,6 +594,7 @@
% change 2021-08-14: require expl3
% change 2023-11-26: no longer require pdftexcmds
% change 2023-11-26: no longer require expl3, we assume kernel is new enough.
+% change 2024-05-23: load stringenc always (for pdfx)
% \begin{macrocode}
\RequirePackage{iftex}[2019/10/24]
\RequirePackage{keyval}[1997/11/10]
@@ -601,9 +602,9 @@
\RequirePackage{kvdefinekeys}[2011/04/07]
\RequirePackage{pdfescape}[2007/11/11]
\RequirePackage{hycolor}
-\RequirePackage{auxhook}[2009/12/14]
\RequirePackage{nameref}[2012/07/28]
\RequirePackage{etoolbox}
+\RequirePackage{stringenc}[2009/12/15]%
\def\Hy@Error{\PackageError{hyperref}}
\def\Hy@Warning{\PackageWarning{hyperref}}
\def\Hy@WarningNoLine{\PackageWarningNoLine{hyperref}}
@@ -1864,30 +1865,27 @@
%
% \begin{macrocode}
\ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
- \@ifundefined{StringEncodingConvertTest}{%
- }{%
- \EdefUnescapeString\HyPsd@temp#1%
- \iftutex
- \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@EscapeTeX#1%
- }%
- \else
- \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp
- {utf16be}{pdfdoc}{%
- \EdefEscapeString\HyPsd@temp\HyPsd@temp
- \global\let#1\HyPsd@temp
- \HyPsd@EscapeTeX#1%
- \Hy@unicodefalse
- }{}%
- \fi
- }%
+ \EdefUnescapeString\HyPsd@temp#1%
+ \iftutex
+ \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@EscapeTeX#1%
+ }%
+ \else
+ \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp
+ {utf16be}{pdfdoc}{%
+ \EdefEscapeString\HyPsd@temp\HyPsd@temp
+ \global\let#1\HyPsd@temp
+ \HyPsd@EscapeTeX#1%
+ \Hy@unicodefalse
+ }{}%
+ \fi
\fi
\fi
% \end{macrocode}
@@ -4819,9 +4817,6 @@
\hypersetup{unicode}%
\ifHy@unicode
\def\HyPsd@pdfencoding{#1}%
- \ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
- \HyPsd@LoadStringEnc
- \fi
\else
\Hy@Warning{Cannot switch to unicode bookmarks}%
\let\HyPsd@pdfencoding\HyPsd@pdfencoding@pdfdoc
@@ -4844,22 +4839,6 @@
% \begin{macrocode}
\let\HyPsd@pdfencoding\HyPsd@pdfencoding@unicode
\HyPsd@LoadUnicode
-\def\HyPsd@LoadStringEnc{%
- \RequirePackage{stringenc}[2009/12/15]%
- \let\HyPsd@LoadStringEnc\relax
-}
-\Hy@AtBeginDocument{%
- \@ifpackageloaded{stringenc}{%
- \let\HyPsd@LoadStringEnc\relax
- }{%
- \def\HyPsd@LoadStringEnc{%
- \Hy@WarningNoLine{%
- Missing package `stringenc'. Use `pdfencoding=auto'\MessageBreak
- in the preamble or load the package there%
- }%
- }%
- }%
-}
% \end{macrocode}
%
% \begin{macrocode}
@@ -7414,7 +7393,8 @@
% command, you can use |#| and |%| unescaped, to produce themselves.
% even if, say, |#| is entered as |#| it will be converted to |\#|
% so it does not die if written to an aux file etc. |\#| will write
-% as |#| locally while making |\special|s.
+% as |#| locally while making |\special|s. The catcode |:| is set to other
+% to avoid problems with expl3 syntax.
% \begin{macrocode}
\begingroup
\endlinechar=-1 %
@@ -7427,6 +7407,7 @@
\catcode`\&\active
\gdef\hyper@normalise{^^A
\begingroup
+ \@makeother{:}^^A
\catcode`\^^M\active
\def^^M{ }^^A
\catcode`\%\active
@@ -10119,7 +10100,6 @@
\else
\let\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
\fi
-\HyPsd@LoadStringEnc
\define@key{Hyp}{unicode}[true]{%
\Hy@boolkey{unicode}{#1}%
\ifHy@unicode
@@ -12035,14 +12015,17 @@
% The whole theorem business makes up new counters on the fly;
% we are going to intercept this. Sigh. Do it at the level where
% new counters are defined.
+% change 2024-02-14: use a csname to handle counter names with commands,
+% see issue \#330
% \begin{macrocode}
\@ifundefined{hyper@nopatch@counter}
{
\let\H@definecounter\@definecounter
\def\@definecounter#1{%
\H@definecounter{#1}%
- \expandafter\gdef\csname theH#1\endcsname{\arabic{#1}}%
- }
+ \expandafter
+ \gdef\csname theH#1\expandafter\endcsname\expandafter
+ {\expandafter\@arabic\csname c@#1\endcsname}}%
}{}
% \end{macrocode}
% But what if they have used the optional argument to e.g. |\newtheorem|
diff --git a/macros/latex/contrib/hyperref/xr-hyper.dtx b/macros/latex/contrib/hyperref/xr-hyper.dtx
index 1acb21c688..aced2ac70b 100644
--- a/macros/latex/contrib/hyperref/xr-hyper.dtx
+++ b/macros/latex/contrib/hyperref/xr-hyper.dtx
@@ -26,7 +26,7 @@
%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{xr-hyper}
-%<package> [2024-01-20 v7.01h eXternal References (DPC)]
+%<package> [2024-05-23 v7.01i eXternal References (DPC)]
%
%<*driver>
\documentclass{l3doc}
@@ -95,7 +95,7 @@
% In the \LaTeX{} release 2023-06-01 the label syntax of \pkg{hyperref}
% and the \LaTeX{} kernel have been synchronized and there is no longer
% a need for two packages. \pkg{xr-hyper} already works with all documents --
-% it is not required to load\pkg{hyperref} -- and its code will move in the
+% it is not required to load \pkg{hyperref} -- and its code will move in the
% next \LaTeX{} release into the \pkg{xr} package. Then \pkg{xr-hyper} can be
% deprecated.
%
@@ -108,7 +108,7 @@
% If one document needs to refer to sections of another, say |aaa.tex|,
% then this package may be loaded in the main file, and the command
% \begin{verbatim}
-% |\externaldocument{aaa}|
+% \externaldocument{aaa}
% \end{verbatim}
% given in the preamble.
%
@@ -140,7 +140,7 @@
% always work, it can be disabled by specifying \texttt{[nocite]} after the
% \meta{prefix}:
% \begin{verbatim}
-% \externaldocument[][nocite]{aaa}
+% \externaldocument[][nocite]{aaa}
% \end{verbatim}
%
% The `document' referred to by the main argument \meta{document} is the file
diff --git a/macros/latex/contrib/jsonparse/README.md b/macros/latex/contrib/jsonparse/README.md
index b8750b8a8f..69258570db 100644
--- a/macros/latex/contrib/jsonparse/README.md
+++ b/macros/latex/contrib/jsonparse/README.md
@@ -1,4 +1,6 @@
-![Version 0.8.2](https://img.shields.io/badge/version-0.8.2-blue)
+![Version 0.8.3](https://img.shields.io/badge/version-0.8.3-blue)
+
+![Jason, the JSON parsing horse](https://github.com/jasperhabicht/jsonparse/assets/6378801/d6abde3a-fa12-4b63-a213-ad8332e32199)
# The `jsonparse` package
@@ -42,6 +44,7 @@ Let's assume a file with the name `example.json` is stored in the working direct
We can store it in the token variable `\myJSONdata` using the command `\JSONParseFromFile{\myJSONdata}{example.json}`. Calling the command `\JSONParseValue{\myJSONdata}{contactPoint[0].telephone}` would then result in the output `+1 (555) 555-1234` (indices are zero-based per default).
-This package including all files is subject to the LPPL 1.3c license.
-Copyright 2024 Jasper Habicht (mail(at)jasperhabicht.de).
+This package including all files is subject to the LPPL 1.3c license. Copyright 2024 Jasper Habicht (mail(at)jasperhabicht.de).
+
+Jason, the JSON parseing horse: Copyright 2024 Hannah Klöber.
diff --git a/macros/latex/contrib/jsonparse/jason/jason.pdf b/macros/latex/contrib/jsonparse/jason/jason.pdf
new file mode 100644
index 0000000000..324458e684
--- /dev/null
+++ b/macros/latex/contrib/jsonparse/jason/jason.pdf
@@ -0,0 +1,1662 @@
+%PDF-1.5 %
+1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R]/Order 6 0 R/RBGroups[]>>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 53578/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/pdf</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">jason</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xmp:CreatorTool>Adobe Illustrator CS6 (Windows)</xmp:CreatorTool>
+ <xmp:CreateDate>2024-04-28T16:34:40+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-04-28T16:34:40+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-04-28T16:34:40+02:00</xmp:MetadataDate>
+ <xmp:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xmpGImg:width>256</xmpGImg:width>
+ <xmpGImg:height>256</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXlf5z+Y7yZ7XyZpU7W9xqCG51a5jNHis1NFUEftSvt8h75hazNwig5elxWbKaflX5&#xA;8n1m2k0DW3C+ZdLUCZjsLqAbJcp416P4H50yzTZ+MUebDUYeE2OT0DMlx3Yq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVsssUUbSSuscairOxAAHuThAJ&#xA;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&#xA;dirsVdirsVdirsVdirsVdirsVf/Z</xmpGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xmp:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
+ <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+ <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+ <xmpMM:DocumentID>xmp.did:AAFD4D716C05EF11A916FAD4CB59D3F6</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:a8cd6e00-15a5-43a6-9809-50c4d7e4d80f</xmpMM:InstanceID>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>uuid:02dc5f24-85b4-40be-bdfc-38989c0de5dd</stRef:instanceID>
+ <stRef:documentID>xmp.did:27205CC46305EF1186B9D67BF1058F23</stRef:documentID>
+ <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+ <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+ </xmpMM:DerivedFrom>
+ <xmpMM:History>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:27205CC46305EF1186B9D67BF1058F23</stEvt:instanceID>
+ <stEvt:when>2024-04-28T15:32:32+02:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS6 (Windows)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:AAFD4D716C05EF11A916FAD4CB59D3F6</stEvt:instanceID>
+ <stEvt:when>2024-04-28T16:34:38+02:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS6 (Windows)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpMM:History>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:StartupProfile>Web</illustrator:StartupProfile>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>450.000000</stDim:w>
+ <stDim:h>450.000000</stDim:h>
+ <stDim:unit>Pixels</stDim:unit>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ </rdf:Seq>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Standard-Farbfeldgruppe</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Weiß</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Schwarz</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Rot</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Gelb</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Grün</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Blau</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>193</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>45</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>28</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>241</xmpG:red>
+ <xmpG:green>90</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>247</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>251</xmpG:red>
+ <xmpG:green>176</xmpG:green>
+ <xmpG:blue>59</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>252</xmpG:red>
+ <xmpG:green>238</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>217</xmpG:red>
+ <xmpG:green>224</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>198</xmpG:green>
+ <xmpG:blue>63</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>57</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>74</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>146</xmpG:green>
+ <xmpG:blue>69</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>104</xmpG:green>
+ <xmpG:blue>55</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>34</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>115</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>157</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>41</xmpG:red>
+ <xmpG:green>171</xmpG:green>
+ <xmpG:blue>226</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>113</xmpG:green>
+ <xmpG:blue>188</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>46</xmpG:red>
+ <xmpG:green>49</xmpG:green>
+ <xmpG:blue>146</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>27</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>100</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>45</xmpG:green>
+ <xmpG:blue>145</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>147</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>143</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>158</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>93</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>212</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>90</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>30</xmpG:green>
+ <xmpG:blue>121</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>199</xmpG:red>
+ <xmpG:green>178</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>134</xmpG:green>
+ <xmpG:blue>117</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>115</xmpG:red>
+ <xmpG:green>99</xmpG:green>
+ <xmpG:blue>87</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>83</xmpG:red>
+ <xmpG:green>71</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>198</xmpG:red>
+ <xmpG:green>156</xmpG:green>
+ <xmpG:blue>109</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>166</xmpG:red>
+ <xmpG:green>124</xmpG:green>
+ <xmpG:blue>82</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>98</xmpG:green>
+ <xmpG:blue>57</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>117</xmpG:red>
+ <xmpG:green>76</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>96</xmpG:red>
+ <xmpG:green>56</xmpG:green>
+ <xmpG:blue>19</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>66</xmpG:red>
+ <xmpG:green>33</xmpG:green>
+ <xmpG:blue>11</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Graustufen</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>26</xmpG:red>
+ <xmpG:green>26</xmpG:green>
+ <xmpG:blue>26</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>51</xmpG:red>
+ <xmpG:green>51</xmpG:green>
+ <xmpG:blue>51</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>77</xmpG:red>
+ <xmpG:green>77</xmpG:green>
+ <xmpG:blue>77</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>102</xmpG:green>
+ <xmpG:blue>102</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>128</xmpG:red>
+ <xmpG:green>128</xmpG:green>
+ <xmpG:blue>128</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>153</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>179</xmpG:red>
+ <xmpG:green>179</xmpG:green>
+ <xmpG:blue>179</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>204</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>204</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>230</xmpG:red>
+ <xmpG:green>230</xmpG:green>
+ <xmpG:blue>230</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>242</xmpG:red>
+ <xmpG:green>242</xmpG:green>
+ <xmpG:blue>242</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Webfarben</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>63</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>245</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>122</xmpG:red>
+ <xmpG:green>201</xmpG:green>
+ <xmpG:blue>67</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>29</xmpG:green>
+ <xmpG:blue>37</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>123</xmpG:green>
+ <xmpG:blue>172</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>189</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>212</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 10.01</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?>
+endstream endobj 3 0 obj <</Count 1/Kids[7 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[11.7476 0.0 450.0 430.838]/BleedBox[0.0 0.0 450.0 450.0]/Contents 8 0 R/LastModified(D:20240428163440+02'00')/MediaBox[0.0 0.0 450.0 450.0]/Parent 3 0 R/PieceInfo<</Illustrator 9 0 R>>/Resources<</ExtGState<</GS0 10 0 R>>/Properties<</MC0 5 0 R>>>>/Thumb 11 0 R/TrimBox[0.0 0.0 450.0 450.0]/Type/Page>> endobj 8 0 obj <</Filter/FlateDecode/Length 2581>>stream
+HM u@[Ƭа GfVwI=/n4"3GovtK[m㧿㖎\ǖ w}H}lKVk;-=xC}fW>J;tKNGj+兠Iҁkq{IYC*דt?\nӭcx-VYenϿ?J.6֗N\}J]W^Kɩ]ԳQOg|芯e>k?_8+ݒ?„e}Nɶ}TߛSͳΜB tL#kά籖PQGZ9Zq̬z -Hh?Dt3wr11zlGC' 0hLd}A[iju길~‖i,_G=vԆG C[(t'fth G<rAN^Iw3G%]3
+aҶSP,Se{F b8UpmD~uk"ph2 RSXf3иr"TBH.X`ߪ€p x%! Dt8.0j[sdsqbw%Ku7[j.d
+S@w%K;]dϯ )ms0;#r}>׫L I-iT3+o'5LSKIrx^6H.7! .
+51w/c[l@֯P4,x<2
+l%ђ*ĺue-^>^gN7foJOY5GQx :~kp v0[{lmmeUbz<b߷4ѭ p,YM׫S2N F)2<O5*t׍NH)R[>Lɏl{'kN)I+֫~9([
+%VO1|͗4=+|u?H-ph@ޗIiFI=u׉~!c_֍%߿
+endstream endobj 11 0 obj <</BitsPerComponent 8/ColorSpace 12 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 56/Length 874/Width 56>>stream
+8;YQVZ$#@d$q6LSV%LYg$TqB,_*^bY#5M7/;gFFC"Kh7r&0sPu[W>?c4G^)knC-J$
+805gDGi<j\;uBq\&gQh<N1X\cm$p#j6C:FD+R9g2M"++Qq0e7S=`]tJ6i[n?.EpUm
+on^hEPgXaW@0u[W4F]bq@D2:dI=n_W&GcelQE2q<!\9_>gf"nr)H.C]rT-gUeA*%8
+H%%arT3fs)!D>1"MhPg<_0HP"h5hkqQ@)@?ZQ<]SZWa6$9]Zs[]_$YrH,ZO-0jUf$
+*0nh3[.CPKZm:7$99lYB"*ku(-(9%;/nV\Om!n)seQ$&m6:)PEdktU24O`g33[$5X
+U/kuVV7IS(llRsA;<>S<3kFH^la%OS!Q@gW_L.(+7o.1_0YdHt'jEh;F:h55]Q/n4
+@[Z(SB"50NV:(F[IIoC]o[?.9GJF/4I2m]:]rq^Emim$$d"I$@K]6o`I!\)=>)h@.
+2@kojb\Tr=4M(ei5F0#"\qkoMV_CGdNqm;;)*=!/6*2MW4te0W_Y'bf/Xo_t)`gK&
+raFVajJm^)9:^QgCYZ;KjEdYCT!f])@Tk]f>^,ZP=/mdEqT!]Z_]_+YJCOJ-'Kql/
+IFTK_L%MpIXZApaK\M"g*GlrNF;CTq,!8l-q,d5)T`a1h?-hJ/[AG=XM-Y5AO"%h&
+SQ!:IK\Gk":<HpmA6+HYT%#kl<D&ZS(BYYg@[N4XP#n,toeQ9[B?l,NEj42t53c<D
+UFJ]pA">cHn_dmJC[#dYXh+\#MV7h^bIAq!m7%6O:X9Ph9NO*3DVN+(-\m-Z=.J=I
+Rf/(:p;2C;+AMSVIj,iu'Z7:q+4S!nV"Q',?6/"((LNt\HXX]oZBM-t\dEkXAZC&S
+1UY%8rXT!nDI2l~>
+endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 13 0 R] endobj 13 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
+endstream endobj 5 0 obj <</Intent 14 0 R/Name(Ebene 1)/Type/OCG/Usage 15 0 R>> endobj 14 0 obj [/View/Design] endobj 15 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 10 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 9 0 obj <</LastModified(D:20240428163440+02'00')/Private 16 0 R>> endobj 16 0 obj <</AIMetaData 17 0 R/AIPDFPrivateData1 18 0 R/AIPDFPrivateData10 19 0 R/AIPDFPrivateData2 20 0 R/AIPDFPrivateData3 21 0 R/AIPDFPrivateData4 22 0 R/AIPDFPrivateData5 23 0 R/AIPDFPrivateData6 24 0 R/AIPDFPrivateData7 25 0 R/AIPDFPrivateData8 26 0 R/AIPDFPrivateData9 27 0 R/ContainerVersion 11/CreatorVersion 16/NumBlock 10/RoundtripVersion 16>> endobj 17 0 obj <</Length 1005>>stream
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(R) 16.0
+%%AI8_CreatorVersion: 16.0.3
+%%For: (DCW Laptop 1) ()
+%%Title: (jason.ai)
+%%CreationDate: 4/28/2024 4:34 PM
+%%Canvassize: 16383
+%%BoundingBox: 230 -502 665 -73
+%%HiResBoundingBox: 230.7476 -501.166 664.166 -73.1621
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%AI5_FileFormat 12.0
+%AI12_BuildNumber: 691
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBProcessColor: 0 0 0 ([Passermarken])
+%AI3_Cropmarks: 219 -504 669 -54
+%AI3_TemplateBox: 480.5 -280.5 480.5 -280.5
+%AI3_TileBox: 158.3999 -687.8398 729.5996 129.8398
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 14400 14400
+%AI5_RulerUnits: 6
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
+%AI5_TargetResolution: 800
+%AI5_NumLayers: 1
+%AI9_OpenToView: -382 173 1 1588 914 18 0 0 50 117 0 0 0 1 1 0 1 1 0 1
+%AI5_OpenViewLayers: 7
+%%PageOrigin:80 -580
+%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%AI12_CMSettings: 00.MS
+%%EndComments
+
+endstream endobj 18 0 obj <</Length 27925>>stream
+%%BoundingBox: 230 -502 665 -73
+%%HiResBoundingBox: 230.7476 -501.166 664.166 -73.1621
+%AI7_Thumbnail: 128 128 8
+%%BeginData: 27768 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FD33FF76FD7EFF7D4A51FD7CFFA8757C7576FD7BFF7D4AA17C4A7D
+%FD7AFF4BA0A0A77C51A8FD05FFA9AFA9AF85AF85AF85AFA9AFAFFD66FF7D
+%51FD04A0754B7D855A6137373637373736373737363737373661618585AF
+%FD60FF7C75A1A0A1A0A1754B2F3D3761373D3761373D3761373D3761373D
+%373D373737616185A9FD5BFFA94AA0A0A07CA0A0A0754B2E373637363736
+%37363736373637363736373637363736373637368585FD56FF85613075A0
+%A1A0A7A0A0A0A7A0752E6137613761376137613761376137613761376137
+%6137613761373D3785AFFD50FFA9613637372F6FA1A0A07CA0A0A07CA775
+%4A2E3D3737363D3737363D3737363D3737363D3737363D3737363D373736
+%375BA9AFFD4BFFAF5B3D373D37612E99A0A7A0A1A0A1A0A0A07C4A752F61
+%373D3761373D3761373D3761373D3761373D3761373D3761373D373D3761
+%85FD48FF846136373637373D37524A754B75517C76A0A0A0514A754B2F3D
+%363736373637363736373637363736373637363736373637363736373637
+%3685FD44FFAF613D3761376137612F524A75749974754A7551A0A0764A75
+%755137613761376137613761376137613761376137613761376137613761
+%37613761376185FD40FFA9853737363D3737375A4B7498C1C0C1C0C1C0C1
+%98754A7C4B996E7575523737363D3737363D3737363D3737363D3737363D
+%3737363D3737363D3737363D37375AFD3EFF85613761373D376137594A98
+%C0C1C0C1C1C1C0C1C1C1C09F4A4B9EC14A7C4B5A373D3761373D3761373D
+%3761373D3761373D3761373D3761373D3761373D37613737378BFD3BFF5A
+%373637363736373759275227514A9898C19EC198C19EC1C0996EC1C0994A
+%75283D373736373637363736373637363736373637363736373637363736
+%3D373D373D37371561A9FD37FFAF373D376137613761376136613761375A
+%277598C1C0C1C1C1C0C1C1C1C0C1C19F4A4B363D37613761376137613761
+%3761376137613761376137613761375B35592E592E532E592F5B84FD35FF
+%853737363D3737363D3737363D3737363D37534A4B98C198C1C0C198C1C0
+%C198C1C09F4A51275228532F37373D3737363D3737363D3737363D373D36
+%362E514AFD09754A2E61FD33FF853761373D3761373D3761373D3761373D
+%37612F99764B9EC1C0C1C1C1C0C1C1C1C0C1C1C198C1989874754B533661
+%373D3761373D3761373D375B2E514A9FA0A0A0A7A0A1A0A7A0C975523737
+%5BFD30FFA961363736373637363736373637363736FD04372F4BA05175C0
+%C198C19EC198C19EC198C1C0C1BAC1C0C1BAC16E4B2F3D37373637363736
+%3D372F267575FD05A07CA0A0A07CA0754B363D363736AFFD2DFFAF613761
+%3761376137613761376137613761375A2E524B754A752699C0C1C1C1C0C1
+%C1C1C0C1C1C1C0C1C1C1C0C1C1C198752E6137613761376136524AA0A0A1
+%A0A7A0A0A0A7A0A0A0A7A0752F613761373D37AFFD2BFFA95B363D373736
+%3D3737363D3737363D37372E516E9898C19EC174754AC1C0C1C0C198C1C0
+%C198C1C0C198C1C0C198C1C0C1C0742E3D363D373D365175FD05A07CA0A0
+%A07CFD05A02737363D3737363737AFFD29FFAF6137613761373D3761373D
+%3761373D375A4B7498C1C1C1C0C1C1C1C0759EC1C0C1C1C1C0C1C1C1C0C1
+%C1C1C0C1C1C1C0C1C1C1C0742F3D3761364B75A7A0A0A0A1A0A0A0A1A0A0
+%A0A1A0A77553373D3761373D373D37AFFD27FFA95B363736373637363736
+%373637363D372E4AC0C0C198C19EC198C19EC198C1C0C198C19EC198C19E
+%C198C19EC198C19EC198C19EC198513737365175A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0752F3D363736373637363736A9FD26FF6137613761376137
+%6137613761376137526EC1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0
+%C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C16E5A375375A7A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A04B613761376137613761373D37FD25FF613737363D
+%3737363D3737363D373737354AC1C0C1C0C198C1C0C198C1C0C198C1C0C1
+%98C1C0C198C1C0C198C1C0C198C1C0C198C1C0C1C0982F364AA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA17552373D3737363D3737363D373736FD23FF
+%853761373D3761373D3761373D3761373D27C1C1C1C0C1C1C1C0C1C1C1C0
+%C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1985227
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A075363D3761373D3761373D37
+%61373737FD21FF853637363736373637363736373637363D2F74BAC19EC1
+%98C1C0C198C1C0C198C19EC198C19EC198C19EC198C19EC198C19EC198C1
+%9EC198C1C0C12675A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A027373737
+%3637363736373637363736375AFD1FFFAF37613761376137613761376137
+%613761375374C7C1C1C0C1C1C1C0C1989F74C1C1C1C0C1C1C1C0C1C1C1C0
+%C1C1C1C0C1C1C1C0C1C1C1C0C1C1C19E517CA7A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A775593761376137613761376137613761373D85FD1EFF363737
+%37363D3737363D3737363D3737363D2798C0C1C0C198744B4B264B4A7598
+%C1C0C198C1C0C198C1C0C198C1C0C198C1C0C198C1C0C198C1C07451A1A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA07C51373D373736FD04373D3737373D
+%3737363785FD1CFF61373761373D3761373D3761373D3761373D3651C0C1
+%C0C16E522F594B9998C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1
+%C1C1C0C1C1C1C09F4BA0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0752759
+%2E5252524B5252522E5A36373761373D3761FD1BFF843736373637363736
+%37363736373637363737374AC1C0982635372F4AC1C0C198C19EC198C19E
+%C198C19EC198C19EC198C19EC198C19EC198C1C0C14A7CA0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A02675749898C098C0FD04986E754A51282F2F37
+%1485FD19FFAF613761376137613761376137613761376137613675C09827
+%613D5A4AC1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1
+%C1C0C1C1C14A7CA0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A74B75C1C1C0
+%C1C1C1C0C1C1C1C0C1C0C1989F74742E6137AFFD18FF61363D3737363D37
+%37363D3737363D3737363D37374A98273737372798C0C1C0C198C1C0C198
+%C1C0C198C1C0C198C1C0C198C1C0C198C1C0C1C0C14A75FD04A07CA0A0A0
+%7CA0A0A07CA0A0A07CA1754A98C1C0C198C1C0C198C1C0C198C1C0C1C0C1
+%4A36373737FD17FFAF373D3761373D3761373D3761373D3761373D376136
+%4B4A5B373D2F98C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0
+%C1C1C1C0C1C1C14A76A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A1764B98
+%C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C17452373D373D85FD16FF363736
+%373637363736373637363736373637363736372653373D364B98C19EC198
+%C19EC198C1C0C1C0C19EC198C1C0C198C1C0C198C1C0C198994A75FD04A0
+%7CA0A0A07CA0A0A07CA0A0A07CA0764B6EC1C0C198C19EC198C19EC198C1
+%9EC198C1984B363D36373637A9FD14FF853D376137613761376137613761
+%37613761376137613752366137524AC1C1C1C0C1C1C1C0C1C1C1989FC1C1
+%C0C1C1C1C0C1C1C1C0C1C0C1747551A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7
+%A0A0A0C97C4B74C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1982E613761
+%37613785FD13FFAF37363D3737363D3737363D3737363D3737363D373736
+%372F3737534A75C0C1C0C198C1C0C198754A4A98C1C0986E754A756E756E
+%744A754B7575A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0754B74C1C0
+%C1C0C198C1C0C198C1C0C198C1C0C1C0C14A36373D3737363D37AFFD12FF
+%85373D3761373D3761373D3761373D3761373D3761373D376137594A7574
+%C1C0C1C1C1C09F6E7551519EC174754B7675A07C7C757C76A07CA1A0A0A0
+%A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A7754B98C1C1C1C0C1C1C1C0C1C1
+%C1C0C1C1C1C0C1C1C19852373D3761373D373D61FD12FF36373637363736
+%373637363736373637363736373637363737364AA04B99C0C198C198744A
+%76A0A04AC14A5175A0A0A07CFD07A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A04A4B4AC1C0C19EC198C19EC198C19EC198C19EC198C1C0742F
+%3D3637363736373637A9FD10FF853D376137613761376137613761376137
+%6137613761376137614BA0A07598C1C0C1985175A7A0A776754A7CA0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A04A
+%76A07C4AC1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C14B613761376137
+%6137613785FD10FF61363D3737363D3737363D3737363D3737363D373736
+%3D373D2875A0A04B99C0C174517CFD05A0267CA0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C754A7CA0A0A0754AC1C0
+%C198C1C0C198C1C0C198C1C0C198C19852373D3737363D3737363D37AFFD
+%0EFFAF373D3761373D3761373D3761373D3761373D3761373D37613575A0
+%A7A07574C798517CA7A0A0A0A1A07CA0A1A0A0A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A7A05151FD04A0A1A05174C1C1C1C0C1
+%C1C1C0C1C1C1C0C1C1C1C0982E3D3761373D3761373D373D85FD0EFF5A37
+%36373637363736373637363736373637363736373637365175A07CA05174
+%984B75A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA075A07CA0A0A07CA0764A98C19EC198C19EC1
+%98C19EC198C19EC16E2F373736373637363736373661AFFD0CFFAF613761
+%3761376137613761376137613761376137613761375975A7A0A7A07C7499
+%51A7A0A7A0A0A0A7A0A1A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0
+%A0A7A0A0A0A7A0A0A0A7A0A1A0A7A0A0A0A7A0A75199C1C1C0C1C1C1C0C1
+%C1C1C0C1C1C1C09F2E3D3761376137613761376137AFFD0CFF85143D3737
+%363D3737363D3737363D3737363D3737363D373727A0A0A07CA07C4B4AA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A04AC1C0C198C1C0C198C1
+%C0C198C1C0C19851363D363D3737363D373736375BFD0CFF61373761373D
+%3761373D3761373D3761373D3761373D37612F75A0A1A0A0A0A74B51A0A1
+%A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0
+%A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A07574C1C1C1C0C1C1C1C0C1
+%C1C1C0C1C1C17452363D3761373D3761373D3761AFFD0AFFA83736373637
+%363736373637363736373637363736373637375275A07CFD04A0754BA07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0756E98C19EC198C19EC198
+%C19EC198C1C0C1744B2E36373D37373637373714AFFD0AFFAF3761376137
+%613761376137613761376137613761376137614BA0A0A7A0A0A0A7A0A0A0
+%A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A7A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A14BC1C1C1C0C1C1C1C0
+%C1C1C1C0C1C1C1C0C1C0984A522F5A3661373D373D61FD0AFF5A37373736
+%3D3737363D3737363D3737363D3737363D373D2E75A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07575517575A0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0756EC1C0C198C1C0
+%C198C1C0C198C1C0C198C1C0C198986E754A514B522752A9FD09FF613761
+%373D3761373D3761373D3761373D3761373D37613651A0A7A0A0A0A1A0A0
+%A0A1A0A0A0A1A0A0A0A1A0A0A0A1FD04A04B767CA17C754AFD04A0A1A0A0
+%A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A77C759EC1C1C1C0C1
+%C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C0C1BAC198C098CFFD08FFAF3637
+%363736373637363736373637363736373637363D304B75A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0754AA8FD05FFA14AA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA04B98C0C19EC1
+%98C19EC198C19EC198C19EC198C19EC198C1C0C198C1C0C0A0FD08FF8537
+%37613761376137613761376137613761376137612F5175A7A0A7A0A0A0A7
+%A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A04AFD08FFA84AA0A0A7A0A0A0
+%A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A07C6EC1C1C1C0C1C1
+%C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1BAA0FD08FF85373736
+%3D3737363D3737363D3737363D3737373D2E4A75A1A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA14B7DFFFFFFA77DFD04FF7C75A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA07C4B98C1C0C1
+%98C1C0C198C1C0C198C1C0C198C1C0C198C1C0C198C1C0984BFD08FF5B3D
+%373D3761373D3761373D3761373D376137372775A0A1A0A1A0A0A0A1A0A0
+%A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A075A8FFCA5220264BFFFFFFA175
+%A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A75199
+%C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C17459AFFD
+%06FFAF373637363736373637363736373637363737362675FD04A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A04ACAFFA1F82620207D
+%FFFFA84AA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CFD04
+%A07C4AC198C19EC198C19EC198C19EC198C19EC198C19EC198C19EC1984B
+%36AFFD07FF37613761376137613761376137613761375A4AA0A0A7A0A0A0
+%A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A075A1FFA82620
+%2620A8FFFF7C75A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0
+%A7A0A0A0A7A07598C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1
+%C1C0982F3D85FD06FF8537363D3737363D3737363D3737363D372F4AA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A075
+%75FFFF7D4B4B7DFFFFA85175A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA15198C0C1C0C198C1C0C198C1C0C198C1C0C198
+%C1C0C198C1C09827373785FD06FFAF373D3761373D3761373D3761373D37
+%534AA0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A1A0A15176FD06FFA87675A1A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0
+%A0A1A0A0A0A1A0A0A0A1FD04A06EC1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1
+%C1C0C1C1C1C0994B36373D61FD06FF603736373637363736373637363D37
+%524AA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A04A517CA8A8A8764B51A0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C5198C198C19EC198C19EC198
+%C19EC198C19EC198C19874273637373661FD06FF85376137613761376137
+%613761375275A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0
+%A7A0A0A0A7A0A0A0A7A0A0A0C97C75517551757CC9A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0C97599C0C1C1C1C0
+%C1C1C1C0C1C1C1C0C1C1C1C0C174512F61376137615BFD06FF5A37373736
+%3D3737363D373D365175FD05A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CFD04A07C4AC19EC1
+%C0C198C1C0C198C1C0C19EC198754A53363D373D37373661FD06FF853761
+%373D3761373D3761365175A7A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0
+%A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1
+%A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0
+%A07598C1C0C1C1C1C0C1C1C1C0C1C1C1744B27363761373D3761373D37FD
+%06FF5A37363736373637363D304B75A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A04B74C0C198C19EC198C19EC198C19EC174754A522F37373D
+%36373637FD06FF613761376137613761365175A7A0A7A0A0A0A7A0A0A0A7
+%A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0
+%A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7
+%A0A0A0A7A0A0A0A7FD04A04AC1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C198
+%994B522F61376137FD06FF5B37363D3737363D364B75A1A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07C7598C198C1C0C198C1C0C198C1C0
+%C198C1C0C1C0C198744A522F37FD06FF61373D3761373D2F5175A7A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0
+%A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A15199C1C1C0C1C1C1C0
+%C1C1C1C0C1C1C1C0C1C1C1C0C1C0C198754BFD06FF5A37373D373D2F4A75
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A07C4AC1C0
+%C198C19EC198C19EC198C19EC198C19EC198C1C0C1C0C1FD06FF85375B2F
+%592E4B75C9A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0
+%A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0
+%A1A07598C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C1C1FD06
+%FF61364B754A754A5175A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A05175C0C198C1C0C198C1C0C198C1C0C198C1C0C198C1C0
+%C1C0C1FD06FF844A7C76A075A05175A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0
+%A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A04AC1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0
+%C1C1C1C0C1C19F4BFD06FF4A75757C7576757C4AA07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A05198C19EC198C19EC198C19E
+%C198C19EC198C19EC1C098265AFD05FF7D7576A076A075A0767576A7A0A0
+%A0A7A0A0A0A7A0A1A0A7A0A1A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7
+%A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0
+%A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A77599C1C1C0C1
+%C1C1C0C1C1C1C0C1C1C1C0C1C1C1C09F4B3661FD04FFA851757C757C757C
+%75A04B76FD04A07CFD04A0A1A0A07CA075A07CA1A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0
+%4AC1C0C198C1C0C198C1C0C198C1C0C198C1C09E26363785FD04FFA74AA0
+%76A075A076A0757575A7A0A1A0A0A0A7A0A075754B514A754B7575A1A0A0
+%A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1
+%A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0
+%A0A1A0A0A0A1A07598C1C1C1C0C1C1C1C0C1C1C1C0C1C1C1C0C14A36373D
+%85FD04FF5175757C7576757C757C4B75FD04A07C754B514A514B76757675
+%7C754B4AA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CFD07A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA05174C0C19EC198C19EC198C19EC198C19EC16E2F37
+%3736AFFD04FF7575A076A075A076A075A04B7C767C51754B7575A076A076
+%A075A076A0767575A7A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0
+%A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A1A0A0A0A1A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A04AC1C1C1C0C1C1C1C0C1C1C1C0
+%C1C1C1985137613761FD04FFA84A7C757C757C757C757C75764A514A7575
+%7C75A0757C757C757C757C757C754B75A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A04AA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A05198C1C0C198
+%C1C0C198C1C0C198C1C0742F3D373736FD04FF7C7576A075A076A075A076
+%A075A076A075A076A075A076A075A076A075A076A07575A0A0A0A1A0A0A0
+%A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A77575A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0
+%A77575C0C1C1C1C0C1C1C1C0C1C1C1C0C14B3D37613785FD04FF764B7C75
+%76757C7576757C7576757C7576757C757C75754B4B4A757576757C75764A
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CFD04A07551A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07CA04AC198C19EC198C19EC198C19EC16E2F3737363785FD
+%04FF4BA076A075A076A075A076A075A076A075A076A075754A4B4A4B4AA0
+%75A076A07575A0A1A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7
+%A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A74BA0A0A7A0A0A0A7A0A0A0A7A0A0
+%A0A7A0A0A0A7A0A0A0A7A0A0A0A7A07598C1C1C1C0C1C1C1C0C1C1C1C075
+%363D376137AFFFFFFFA84B757C757C757C757C757C757C757C757C75A075
+%4B264B4A4A2675757C757C75764AA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07551A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA17574C0C1C0C198
+%C1C0C198C1C0C16E754B522F5BFD04FFA14BA075A076A075A076A075A076
+%A075A076A075754A4B4A4B4A5175A076A075A0767575A7A0A0A0A1A0A0A0
+%A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0
+%7551A7A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1FD04A0
+%4AC1C0C1C1C1C0C1C1C1C0C1C1C1C0C1987476FD04FF4A757576757C7576
+%757C7576757C7576757C7575204B264A2651757C757C7576757C754B75A0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA04A7C7CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07C7574C198C19EC198C19EC198C1C0C198C1BAC9FFFFFF7C
+%757CA075A076A075A076A075A076A075A076764A4B4A4B4B7C76A075A076
+%A075A076A07575A0A1A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0
+%A7A0A0A0A7A0A0A0A7A0A0A0C97575A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0C97575C0C1C1C1C0C1C1C1C0C1C1C1C0
+%C1C0C1CFFFFFA84B75A0757C757C757C757C757C757C757C75A051755176
+%757C757C757C757C757C757C757C4A7CA0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0754B76A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CFD05A04AC1C0C1C0C198C1
+%C0C198C1C0C198C0A0FFFFFF7C51A075A076A075A076A075A076A075A076
+%A075A076A075A076A075A076A075A0757C75A076754BA7A0A0A0A1A0A0A0
+%A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A7A05175A7A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0
+%7598C1C0C1C1C1C0C1C1C1C0C1C1C1BACAFFFFFF4A767576757C7576757C
+%7576757C7576757C7576757C7576757C7576757C757C7551517C757C754B
+%76A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07C514BA07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA0A0A07574C0C198C19EC198C19EC198C1BAC1A8FFFFFF7576
+%A075A076A075A076A075A076A075A076A075A076A075A076A076A0757651
+%5151A075A076A04BFD04A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0
+%A0A7A0A0A0A7A0A1757575A7A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7
+%A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A14BC1C0C1C1C1C0C1C1C1C0C1C1C1
+%A0FD04FF4A7C757C757C757C757C757C757C757C75A07575757675755175
+%75754A754B4A4BA0757C757C755175A0A0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CFD07A076764A4B75A1A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CFD04A07574C198C1C0C198C1C0C198
+%C198CFFD04FF7651A076A075A076A075A076A075A075754A754B75517675
+%7C4B4A4BA8A77575A075A076A075A04BA0A0A1A0A0A0A1A0A0A0A1A0A0A0
+%A1A0A0A0A1A0A0A0A7A0A0757651514BA0A0A1A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A17575C1C1C0
+%C1C1C1C0C1C1C1C0C8FD05FF7D4A757C7576757C7576757C75754A5176A7
+%A8FD04FFCF76517DFFA84B4BA07576757C757C75517CA07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA075754B754A514B7C7CFD05A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A04A
+%C1C0C198C19EC198C1C0C0A7FD06FF765175A076A076A076A075514BA8FD
+%06FFA87C4BA1FFFFA14B75A076A075A076A0767651A1A0A7A0A0A0A7A0A0
+%A0A7A0A7FD04A075754B514A7C76A0A0C9A0A1A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0
+%7674C1C0C1C1C1C0C1C1C19FFD08FF7C514A75517675754A757DFD06FFCA
+%765176FFFFFF764B757C757C757C757C757C4A75A0A07CFD07A0759F7575
+%4A522E2F2F373651A0A1A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07575C0C1
+%98C1C0C198C198CAFD0AFF7D4A754A4A51CAFD06FFA8764BA1FD04FF764B
+%75A076A075A076A075A0755176A7A0A0A0A7A0A075754B512E5935373761
+%373D37612EA0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0
+%A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A04AC1C1C1C0C1
+%C1C1C0C8FD0BFF7D757575517676FFFFFFA8A14B757DFD04FFA84B51757C
+%757C7576757C757675754BA07CA0A0A075754A512E363637373D37373637
+%3637372F4AA07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0756EC19EC198C1
+%C0C0A7FD0BFFA84BA04AA8FF7C517C757676CAFD05FFA74A757CA075A076
+%A075A076A0767C4AA0A0A7A0A06F512E5A37613761376137613761376137
+%613651A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A17C75C1C1C0C1C1C1A0
+%FD0CFF7D75767576FFFFFFA8CACAFD05FFA87C4A75757C757C757C757C75
+%7C757C4A76A0A07575272F363D3737363D3737363D3737363D3737363D27
+%75FD04A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A04A99C0C198C19FFD0DFFA74A
+%A07551A8FD09FFA7514AA076A075A076A075A076A075A05175A0A075512F
+%61373D3761373D3761373D3761373D3761373D375975A1A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0
+%A1A0A0A0A1A0A0A0A1A0766EC1C1C1BACAFD0DFFA15175A0514BA7FD06FF
+%A8514B517C757C7576757C7576757C757C514B7C754A52363D3637363736
+%3736373637363736373637363736373051A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA07C4B98C1BAC2AFFD0EFF4BA076A075517CA8A8CA7D764A7576
+%A075A076A075A076A075A076A0FD0475275A376137613761376137613761
+%3761376137613761376137614BA0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0
+%A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7
+%A0A75199C0C1CAFD0FFF764BA0757C75754A514A755176757C757C757C75
+%7C757C757C757C75514A512E37373D3737363D3737363D3737363D373736
+%3D3737363D3737375275A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A07C4A
+%C1A7FD10FFA74B75A076A075A075A075A076A075A076A075A076A075A076
+%A076754A523661373D3761373D3761373D3761373D3761373D3761373D37
+%61373D2E75A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A075A0FD12FF76
+%4A757C7576757C7576757C7576757C7576757C7576757C75752653373736
+%3736373637363736373637363736373637363736373637363737354AA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA07CFD14FF765175A075A076A075
+%A076A075A076A075A076A075A075754B5A37613761376137613761376137
+%61376137613761376137613761376137613675A0A1A0A7A0A0A0A7A0A0A0
+%A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7FD05A0FD16FF7C4B4A7575A0757C757C757C757C757C75A075764A
+%4B2E37373D3737363D3737363D3737363D3737363D3737363D3737363D37
+%37363D37374AA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CFD18FFA87C4B
+%5175A076A075A076A075A076A075754A523661373D3761373D3761373D37
+%61373D3761373D3761373D3761373D3761373D37613751A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0
+%A1A0A0A0A1FD05A0CFFD1BFF7C764A514A754B7551754A754A4B27363737
+%363736373637363736373637363736373637363736373637363736373637
+%3637363727A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A076A8FD1FFFA8A17C7C76
+%7C757C7C5A36613761376137613761376137613761376137613761376137
+%61376137613761376137613761375275A7A0A0A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0
+%CFFD29FFAF61363D3737363D3737363D3737363D3737363D3737363D3737
+%363D3737363D3737363D3737363D2E75FD04A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA07CA8FD
+%2BFFAF613761373D3761373D3761373D3761373D3761373D3761373D3761
+%373D3761373D3761373D375375A1A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0
+%A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A07CCFFD2DFFAF
+%611437363736373637363736373637363736373637363736373637363736
+%3736373637363D2E75A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA07CA8FD30FF85373D376137
+%613761376137613761376137613761376137613761376137613761376137
+%5975A7A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0
+%A0A0A7A0A0A0A7FD04A0A1FD33FF853737363D3737363D3737363D373736
+%3D3737363D3737363D3737363D3737363D373D2F75A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A0A1
+%FD35FFAF37373761373D3761373D3761373D3761373D3761373D3761373D
+%3761373D3761375975A7A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1
+%A0A0A0A1A0A0A0A1A0A0A0A1FD04A0A8FD38FF5B37363736373637363736
+%37363736373637363736373637363736373637363D2F75FD04A07CA0A0A0
+%7CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA07BA1A8FD
+%3AFF85613761376137613761376137613761376137613761376137613761
+%3761375A75A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7
+%A0A0A0A7FD05A0A8FD3DFFA9853737363D3737363D3737363D3737363D37
+%37363D3737363D3737363D2F75FD04A07CA0A0A07CA0A0A07CA0A0A07CA0
+%A0A07CA0A0A07CA0A0A07CA0A0A07CFD41FFAF61373761373D3761373D37
+%61373D3761373D3761373D3761373D375A51A0A0A1A0A0A0A1A0A0A0A1A0
+%A0A0A1A0A0A0A1A0A0A0A1A0A0A0A1A0A0A0A7A8FD44FF85611437363736
+%373637363736373637363736373637363736372F75A0A07CA0A0A07CA0A0
+%A07CA0A0A07CA0A0A07CA0A0A07CA0A0A07CA07CA8A8FD47FFAF613D3761
+%376137613761376137613761376137613761375A51A0A0A7A0A0A0A7A0A0
+%A0A7A0A0A0A7A0A0A0A7A0A0A0A7A0A0A0A7A7FD4CFFA96136373737363D
+%3737363D3737363D3737363D37373651A0A07CA0A0A07CA0A0A07CA0A0A0
+%7CA0A0A07CA0A0A07BA0A0A8A8FD50FF856137373761373D3761373D3761
+%373D376137374BFD04A0A1A0A0A0A1A0A0A0A1A0A0A0A1FD05A0A7A8FD54
+%FFA9AF6161363736373637363736373637363D36517CA0A0A07CA0A0A07C
+%A0A0A07CA0A0A075A07CA7A8FD5CFF8585376137373761373D376137374B
+%FD04A0A7A0A0A0A1FD05A0A1A1CAA8FD62FFA9AF8561366137373637364B
+%75A07CA076A07CA07CA17DA7A7FD6EFFAFAF85AF7DCAA7CAA8CAA8FFA8FD
+%B5FFFF
+%%EndData
+
+endstream endobj 19 0 obj <</Filter[/FlateDecode]/Length 1592>>stream
+Hj^Gxi$hEqllN*WWpTnyG 4ˋ'߱oPR7jiؖߤWS(#Xꖭ9d_](2ʖK =bS(ގ<^d#V0 eD3?6BCNպ=.Ob."kr+6RCrUaL#=%بk(͹+cviZ̺KB7Q0%#IG
+6e $Hӷ1Hu\:KG6zfRM:մzsyaCJJCzK<*y?ljia?w)YCOy‹DVRtK:'s(nOPraL~ŐD26G*.W'P!Sem fs?/+`sFл 创' {R#o3{JZ cz
+AW[Gu韑kgQ+:MyBHjw\]1m/M|ǚ=gAx]y>EkɋNO
+싁ɓZC>9>r./7NjG_í?Zh<RH'iҖإz$4[ڑi5fZp8 Oˡ8X\05l6"V>ٟOk%@a&ԘU"pN7Aus0c5ȯfqAĤ
+%)`ր1ژS_AVI}ʳ & )iH7\7@N+צEjL.8\mIvhhI k~ȹfg̜
+endstream endobj 20 0 obj <</Filter[/FlateDecode]/Length 17764>>stream
+HW]oܸ}7><+DERYqb,ma(֮, 4d_+JCa[[I%y%᳿\^u:e+;>z,r3^{My͉+R|Wۺkۊi<K^x|y[Moۮ]%LdoP!U)ۏv[L?LP7۵뺽g^|4C/#4
+?oaU“T VA:MPiu7.nӮ홗~.[ŗG4'O7ohΣn*L $? ֻYݿX]՟07O߼XK8BoUrm+i1MoMoOWpYH0UƴbbKB1aIolu{յuꇫH}OovM;9[W ZMMI!owns/e2כ}۽2zA`3 !B'A2wִcL%}׷u{&L
+R{&οx1ai‰uqezu"`*tncB/e_ѫ񛸾lvvCw||-0ƯX)7'iU~Ʒ?%im9|ֻ_ct+۵soeSeч׮wU_6#pÓz
+
+p 0E\Ą0`JsTy7
+X,(!N/0r9[%w)A!(bi@.$y93~#?q9j̢5#3(c
+%HE&rQHX -LrX
+2e@3$\E*VJ*JU
+_
+9I*BbYHR9")5#qG!ENTȍB&Ȓ%C
+DgiU)0Fdٖ#Ⱦ>3q)rBnI,![3d
+Wpʼnv%C` j%(G0_-Itod#]3Y",.xqǜ&%8,4EIvyd7n*ljU q&;.W>AxyKPweҬ%ZsGf.+nl7[l4<|L:KN^?}Xj*3YWY)Uό얶N/5mfMb@S̓w=I6u@7q32#mf02;nڙ5獵\(,w/Sm?;3$_2_-xq]H fVG܇;Ix-Bx5=>p SΣ%ٚZ(0g?IjF P2@΁5 Rj4DdBIgBI )NPaZ!)')-R^ )1RfL?
+4qrxK/-s I)Rr$%IL ,YN|9
+'yFS zù!#)7ȑ3%Bx2t
+)Bc("S"Jf)@F\K[B-{G< Ӕ3Á%P02P
+w(EZzQ~ҭ => Ga`$rAmL8qocƶ´c]Vmlž k.lscNJ+6\8pz[3^ la5mk]Sy}5ٸxEe{> ~?4(::!#?>><}G+:$} r1;our.egz`jq8ԋ!5*u^U*XG9q^D_LC{մGc{łyLyLLVP1sAT W*!>lM;
+'.^զ__EuS:=ח?׷v7z~ЎP̳ *q%`3Sn<G֙T)p%`m2D԰|zTEI2I4I.=~!
+4SM+xG$Hqjgpk;th$jVNcMWv⹪WX8 ;ۀ\9P$x2)xhx7H4{?Azۋ(.@
+rȎ !<EAΐaz_p\$KW @YvNyv]y:rt\<7-c[cF>-4/->edx}r:w29?Q@?ytEwѦΜ)Gt^Lƴr<kǺ{tEkl~LDlL4
+1I3`QC*^6rϯ߲|S/Љl۷v. l/WBv|ޮfQE4fնhlɾ"'/6>ne3yj-=zkoj7Zf?b'6XW c?We?G,?M ?Y~c{ӿYfO`15?9&f{z>ngߢ.}<}GSX:_mxY>'Ϸc_>IS̴lx?-PxcbXk>5<
+Ibb q8&D8֞ A[f*LkB;"͍4ail8,M"I$$t-Rًe/U0ىYqb+VV  $b!K%C,&Wc& /^HM'^:̣(%d9uֈ P=ǣģ^h
+<Sх"Ji s>4mpoaFp"U4O`*NP\mzUU;TMN0wo.FgK'ͥ-t&z\_X{\XCkU7:gƓ{
+<7PV }ڸA o@T({ 6+lT4
+ק a{4#wH+D,O`cvp.頎
+YGɁRu
+{iK#s-;%8k|Dj?Yf\>~~}y^~}}k;|ϿLJeҗpÂ9ւ{H꣋誋 i?ޜ9t?ܛ&$,Rԙ936v{[=w,*Y1]&|Y[N||){GT qߗ/_erǞ8=sdaee$.1ja*`٤#$% H_S*/d&iI"3IO )Svuz $* E舞O4E%kg`dXZ:7Kht%>)RdM{CcH_Z0dSƜQwۡЭŌеhT~A )[ΰ^v} P_fHh0cH|eɚ#+y#wќXe
+v
+/ZR`xU \o0唲ɓGg$c+`Ykgj֒FE+ƀ -*F&{u=iIL_-}7B"~08Rr@O.va{haͺN{OK/CL}qv]
+dEAAh* `2##0h@B2du;ID ԐIsfK g@fL#Z
+l$N)Zl;((ָkcxqsӾ7s \8 I`!I#//XE2B(\h9~Yb*Q*J*'?cѥĕPַ/-YkYZUZaH}:&>VU)#VZ<43/G]}i4SoH%
+/K18CUSA Њe }FinjPM;.Rvt>`:xKzFU=Wo |3h*1 nMF/Hwdo o=yGabM.;Qǁlk0e#VH331œaakݣQݬrVVsՊ6{A:0gUZL=wt_tY g!'@O *{N<NJ|:ќbOW)> f7Ч¹B EDfRx1P9pÛφA{:FF_t
+RHqĖ/FH/.r/b/B[;5ؘP ǸAl9C9MWo`s<B1]/ChAr]vQ0bDZ-'4kTƜFrـcy-" NQ,y)sj
+]2$z0 K
+U/E S$%s{=SDӴjI2zIƬu{Sc+iP=Uń]@B^F8A,o@:0\C 0M׍í7_#x(=deEM#Ӗ$HEL}l઱5׿UՔHwsYUUӕ*}PeedCW}YLc2)J#@Qg=9|[fv.>ѨSIg3+hr}vxo18ޘ8
+x?Ҍ;Em8Cc -AB>8ҼYwj:S-JHZ܊lXFSUu ՚rnlO^+U
+ Dz(j萇퓗(*ܨ!jE/LOV~
+bUda.A<@y'Ф$hT'g1N0 x,h^oR߂ۮ[ܭ7_#͘e۶50q[uY'~-۲YyûPI=A@:rPSx'7`2N`ED8f`ԂBѓzy#Wt =}
++:h5C[;d]#/ 9K$r㏃gv:E^VVI]yd*h-@sRp
+NzN@O
+`*ig
+RϩK &FE+<Iy%]ǫHy3o}y
+&pCKZLZ( 38/aihmi)ZimW7{Ьm&FHjsY[v|Yi"3hBO
+
+r1 qK9`6i]=2<L-}Ej/R1OE5cJY$(5<\̀n}o-zNSp 'QQ9fvgnpm? m?l XK[o+4|$8̩G=m)zzLVVXѲ--+/n
+u&2mBnsx>'("Snb^ 傧BLo h| ofM0J^LmҮNډho00/!32ݲt::H6'uӵͮچC(/T+&K]kVI^ige:r]I8q~(YcEywzc1:GU[@F}&ʬs%?ApBr:SiUԺRcodۙnT҂ beաOѝjB'*1E?.7/$a1 bevfF"ۙY*lgf,2k؝h꾸
+p#tEA?2Fޗ㾌Eﳸߤ?0~B2J!A뿎} aƝ5t?m?7܈aW41!6(CхET %(:PT <?*|N
+ph@U"F,
+cɤ4Ą,IjiSҦu,ٜ&߿|Fh|`2/0*dh]MU!
+CQ 7ՂI՟E鉶rf+}ƫk4qtt6Ƌuެf:ٌ I-'uw尸'y~Qk<2>gsA )2`2ǁ73-ŴK,!#'Np([QTjw]z`@l$$<@Du;K
+%<Ks0՗q0-q\nޙR^Rk(ыNU-S9'ES+A 40َ\;yiXd+(r6M`y9QWh؂uA;ֆ_)I͋.1-R14iCۼn>X{}G$]k*Ը9O$F%yh lW1%2հEŢ8YФJ,Zި{V͟U]{Uv/TbZ3힡Fؿz2uŰ5R`JAĀZye5j7"*MA_AL}ux0y+KpfA=x7+NO'j=٨ JFc\d8-;ۏ2X31a4*Nب
+/T?Z,*} D I|_!i&eU2b_X$FF M{I8yᔰ?b/7jaJ,k@KjN͖pT&l5JVLoE"/+&`8tlz$Nw'wۨ_K. bzW[<jZrtO
+=?0p"mT+QJUJ*\ڨ$
+.pj} cQ)2lfS6ʘ%)]P+*]BVaOl%eR&&-qSeHzN11ѿ1,)аU%MP"KJ40Ŗ]14ۇ yiQbBfF֔2:Ť:&
+;stL1Kk8OFUCr.R"'WbP9)z<4k+Y3G#ܮ#Ynio@aO`P| Y”дU)[ADRz~drΉ8C
+5b7s438@tq;1h!d"T
+R) -1GtŁIP&W{0G&>2C&yvjYZWuL[`$fpӲ
+3pcbU X - 0摭t7Ko, t'+ -  {GEBNc6*Ni}+.Fג<.ʯ{m~䪶X?RgPQi~`p{Tk$n-ɇ}΃VF%Wi8JV9W,GW:}h=sk)O<
+nE<ټ )([NauDܬV50wjFkռsθEyբT
+L!:Tg-AKx]^`jqi"V), ;?QE#a~
+Oy@}H<8UlF44  &aeSyC6شgX_ (CO}XSt2yM[SӾd#5Ύ[p8ɊMeDb}]fT<!igmJ ö
+r*i0+杗]^?qG7]đp*QE݅*
+Ş~?)8rl@cvy*oFNtke"#>" {ﴚp]J+6̜U$к5/p]/]UQGY'0f?,VRUj  ̱s Gdd;Bt谌vkzrv#Ya
+Z~fAհR굚3Oǩ2KIz8[.rpSQ"̕[]IBN3|D4,Jj൬Ԟhyoguk^rGaj7 ֲy}#$ZD(h՟6ꐳ4:rGO!<l#Exc)}&-u,iH0D-u̦>c؁J9L
+ ъL`&eCڵd\(B
+4qI=i$ݪN%$[=ZaBlQ6{"F
+
+y26΋Ǜh<wQPBi06.S 9ʃ,+vHBHf<R{*1{?(Bbg'iQl@EIy]E>!]N`vMa3f:ؠ-*eAH`Q+>ҡ nV4O:Zq)8]LNdH(s*1՜]2ϦD`bhehPAJ3" 4 +|GYY&exTߕD
+gEp`Eڡ+04
+fY t7E}g Bjʗt`P_qHc#H?&0V0.bf )JODiߊn62@viIkj"6} -62W9*"Bdɲ-6RzZH7=N\}aF*>׶-7^\>[uuG t\k/EzNЋ0hb_!i9xZ'O2;XHX4Ǒ06Λe+Ow(TYKwMQ- mP@K,kr)J6{0樢3tXw6-c$lZd'L 4 @Y:Zv*[8*7ՒP¶DwXP,<R}(3r Nk(1&Z%* Xf71 zƈm(`$2E\+how5mEuzdC%b $
+ %'*%3 a 1&9WjvA>G\sp)Z}ԑMSk!FZ8bfu{#{>j5=yZxAdT>vs%BJ崱Q /4N m\ǫUU4j`IO F]3ޛ7:Oc}ghÏ2Nэ'iRem<eǍ'ˍgv$f{AdC-,e<ȗ󤝔ß"he4i/i
+endstream endobj 21 0 obj <</Filter[/FlateDecode]/Length 25827>>stream
+H s~N6qCK_388Wt/w%b1^޷G_˿|LOMا;ʓB|[f&6ΦpO)y`+Z2 1k!7hѕF֩cze'vS2O]f]O8ܬ=jT=I_NI%*V C<pXkOg5H|\ V?r/ģml#ԹuiUAƢ{zN:u!sr,Wz`#~${bY"Ash)zS`}G}D6N\SyXlU%s鯀y2?' Bj<~X3so'r,ͥ
+MۥCH3ӂOOhaLdF}|iD[)Cx3nWݓ*U^pR-ѵ.ȄGaHMIΉuq?h!Aʓ=WBxrqB`WmJ,~\#rUTTx+k*hV8>ex-`5GBEp[3s7x$7b xNۦT~;FO zPȄ?̙v OsS G΍ !oN^߶ޯNjwz =)Tt1TtEI{r2DWo#yW };8E@[g3 ?.@;ZZ%F}BF3'О[;] 6#h5u;>X@bGOF D"Loj8dfS9n؃E1 *ޖC[/Ue"nMm%W;l*db\ϧ <x>FD &` g{UdԵ6rFN1CJ\ X( (xAJ֝ Ÿ8f"U )Xr<dLOQzZJP
+ ]RKh(b]$-2WYHK˷y6Lk3E{&27n6~/ۻeu7l=%*^iQZO%d$!ͧI9\ )ސ<uopާ.dn]
+]8<=='$@K nX}jSSՃ:6$r SC K1YlcTJYgOXUR5OPbwoE#$G'IA 8٨a!ہQtbueBs놃nc}Dӽp_a(%A.F{u`~CBEP׈r%br.^H@el#ԭ)&\cj:tcvn-;Z>.Z P] H3Et%z
+feY-N*ZHyZ:s3[ZT.KJ#2Um/ocrQl#"z=+U)GDBJފ(G?
+He˽
+IRg5Ґ
+Gb{kFAe#&l+iK31ސRUkڣ^[U (5΀lab pxO]0rRgT*&g(_P|SS QfJf8/DccKkh), KK)+S_Ίb(%\ZL^ZͻMi!ӂ-{P՝+$btO3ީԉewDSRm
+
+,,m<1vyJ weS'29`+,cw)} ѩYB-La4(Ҥ(gvY![Y̹0KL C7l\oA[oM㮅 Y[?3y3<7[؍SThsk\Wle!S{BΐEWU?*9jẓ,#ڧ*h$Fߩ AKuݵǵj;`(5SA87R1e@h:Β\sOJ>D%
+`2VMŻD9^@2
+d=9a"ZQ `!D2|NI::bI:|KRR4xsC4 &* YÔ+Ϩp!Li<l;G v`AA'EĮd- SZ^9@OA g+]-v#_-7g3'Ƹ^uuF@>&AasIONN40@Q|֒ Ys8j6 3sUUxN鞗<PqI rj&Ca^7|:<yٚ:P=׶16~\6سmYIw
+gB"3A #URQ!+S,s{chPaYWbeƥ6z`B7C'Y)oHDP5a<=NrZ!1;SD( L&_ b\ Q`{ƘR-Yэu3a$MDDUZ*5TD9j(bDKX<GGxQIΘ!4FY:]9Q-0}3DV[?0Us>o*[-<[h)} 2BK.m C @bWI7D u#tqe&^Bp>1 ׁ\8RnP)6Y2cĬ/ V&G\3D 414T7>[ƢMNjf.QR rS(/]`rI Z bMMk m:["Mc׋s BwW6mC4h}As[a Sgj1AdNOCU&N- ;Il%`~7
+nU'Pab L2|k=BeRE~ߚHcyE`L+P_m(DMfv
+ZKo
+giw6s|W(̭^W2#a|ImY*ĐO  ͟²e#ah߇>_!0 *+qAOLB&߶>
+*NښZd ֥"F<46[h}x4P 2 s YWS%/
+KGB3(ax9[Fn- dԝNBWn|DBKˌ4
+N ֍.͏NCq]C<.w0Fap'mlODsC Ԓq3DVi HF&BKsУ%"G.Zф
+ae:oj*C6[;0nimh<u_Bj
+dCIf]dLwHQ:U zXY3vٽxoCcՉ"5tLy~3[DgDI :x(Aʭ8*hw &pIH0wIjN
+ΰIv3˘mT5wѦ϶2VBe~]Χ*˶ndE0ƷlӘ8V3'ʹ#J4 y%iʉZXq20PΓ @Vq w,rA h3sߣIHce2SY`
+˃MBC
+eich
+qY׀giGڼ{˓zo ivk~o8H</rx[?9xǶgn.W ٓ7FP*}.vDT>tk_Lxs}?>xf8կI()zˉp|v{o!<gf<<?^)7ǟ};J%J6WSȏob/vo/o`uv?쓾Aq9h']߁-[FſW؟.NY*_}2DH&Wh\˵E=4M̝xǙ ?Da@
+ ;z E0n
+!Al_@lS=͕env';(Nw~xWG>5m#=}q]w: -N}?Q&_-Wi ߦUs\R+{WiEqR{j>QABY˯RFBe
+Ph M;FCK
+]K5OMUXJlqUS:}
+OrËRd򼕞"ktzǂ %ZnH$P. bNI#="tB[i49cQ
+((*o@c8f
+^?wHoEDcF3:|1Gai}$M< e{(QmvS'P}-(1'^U_?{(f NE_޷ q3-Jc v?P4VkgԗDB1QB& ܦעNL;EmV;]#ud{=K 2pu?{I'EhpG:nLm0y`:u┷5w{HЊiF'%ZM5]pOsOj?wǝ4UU㌣&NJ=ZH߳NGp=O9BiA}4Y|o :A@yeEa<6~
++u(VP(vd3&:T
+PI)waFT x*&#ё1NZdȨH~"w <q*^FtTص4+ܯ
+蘼wݡfXAhpwiʽ[kf62\ Oe0e9ȝSrwMfAH9XS?
+(]%o$ڽ|+ DP#1hTMw2)9 *q;PuW_t1RۻQuVm[^/1Gm._@Ab+Sܼ3"IOe}S'SjfL*s#eTZu3y^.2_8|ﺶ2Œ ~Z:)xa}/H4²8U=w(/IxK,.5 {VXhB9aw\q߅C) w
+ Z (<h0Q:EMciuY+.(}g״DH]H{z<NJ}ٺs 虬Mi9C]?;XAyY{Bj$XH}k Ҧ(skgC0( +xYjnM,4gɊ-߁_LmMeKO5I*x' ^ BS1tHyg/uanDI67êB5RfB-yN_$!XmG=h<@
++U+?
+5T" Q[`I|缍tԻ+*0w\ќ>T= ^[K7iįޥeMj"%wF5@~hF2SaB"K3$mZ>| ZRVѻRvBjg-n
+n85E=!ϱ5d+VZ<W}#Ҁ]ެ\*պS iACG߸$:82\Ib!FHZl'%^-LXz.4 ,v9Q3ɿ+. ǫ_ ڳG~sZ慸5ҙ#|!a>cz.Ev.w5
+˕-`V z(ث5A!A5iBU r2
+N!]iDRnpW/)BZlsSHg:ͱnoGEM}&\lա!$r49Q:=غgh,jlwh.A/1{
+Y<;2a?#jkd(\vY }Dj"-Wf&Gm[I c_~2
+ {I3"(}jst.lEP&^eڰ
+@ʱ= ҽ吽0Ȅ'pb ٮEozʱQ2c#>GnR`ɩ1`3zZ[?L kYգz<Ziə%6P ?8@j#U5h}J;Z4gyb&zy2T^-x*Q헩" 
+Z{׬Jg&.98
+nPQFkW .#8sty
+#Ϣ㢨r@B
+^WFuhnS7!G=xY.xbNcNlkY*ґws\YG
+a3J
+wJ، bkSq<LhP:*jEK
+SGDLVY4vlNS8{*S'~
+LT7HSLaJax6ʖoF~
+
+x"eMLX
+*je~N}娄L06 .ޯh7WX"ӲR${nm'tEو
+71p)34wlLˍjbPJC8GyJt)WGw ( !Ce6g#-\^f\Z:(W 1<@f!`-HoU}." CݗZ9K΋VQXj~w~bȆ\RgTcǹ.p i W,a@k>:9]7 p^BT&6:x(9 #=[x9Rb'@ C]]Cꌇяr HI|"Иǎ[[S@V>eŪ
+GQEơ}K#A]˔*VʯgQ߳@%Kh\+)8'fQY=Iv/t`?j|s*(;WSZ wz0aΧD)i٠h5 +~0KdЊzXەʔ*U
+5hKRRP*Im]qR 4*%=p'mXfYlӋF~Iͺ~2j RE CM6@ -5ԿBSY}x݌ǥQhlX#ОhUchsoh;g@ u
+S'hĘ7G/*! UNYn O79{sm(l
+IqN_ZaI6̢]F` t%`7#K=[[ 2+gT+ .)P-JuW&U] F`WZBߢdPD<sSUf}%JϔZh%u>}h,D"²LfapD.7:v26Oh|.e׍rJZdЊj-}|x\kRg^9e݅Q ΎkXb;ˆFd*al
+C8ƵLs{9zo:ZuZUA,鄵?Q2.qy׹q ˆ{Zxn#QDq$<#,{%|ŁtfL?b[N4^2+2y{neSgtT):H2LE%IdWXQ~Vwe(܀UT]f[CnL*i^dUG&a6I%%X4e|p r<# S~YdDQWU/N*Ԭ yΫWη`VCДf1%̊SϚ#G+e]1nIk#
+2a_]^1*Ҏ`jRZ>zvz cAنs&E1y,o0Z|-?ry*)끄"r,e*H)$1>){f >ڊwQw迎5]=gbjH& WE 0qL&V/;_.|(hvPoD9}3Z7c߷mJC 3߇"]KH6+nx5ߋIjv4J("UWG$y}_N%bZIN@+]1j LvH~Dk-5@ܰL A#, 羝h> \~!,^;%ܸ
+y(B
+
+׀d/2T T Wu:f=eG.L^O%Y:<g4c ^\4 vK>Z@?ib]%R֧,;hZרfU4e(dy8™4oI%9P;OIwR XJ$>ȃܯQʰ*2ַ"d=@qgC ?x0Ac-Dv^CaJ$ig;zafAz3N+D &;Πü7Iy+yǰ tb<!ᇑd( Bt#T 1|JR㶽^ɠ%矋ΈE夺OLZ2)Ɏ[}nRpѲs{L]3
+4>%,fƢƢ{))8;QysTwzrMʤO"OXڴn@ZjaGt -ĸLeEFv G%)3⯕K&;{\s9doC
+D.k)IJhfCk.$ _kdRD1~DH0&j"DZBtDڍ?6asLZlhi,UwyrMCJLi!ЌrN.zK}Yp_w  ^g ``CNNk ݟh~kouTE7qj-)I 0m4ֹ"}VԮ-yӷ+l6:.g[Þ?
+}6Bw׋1fF Z k{:}3*eʄk6В(P)Uuh;_[au:VJ > /6?엥XߪE$LD]ât^
+,[ <;:Q=iIxH1_[hh vVȺ)ڏǪT?VtMS
+u3yMڅʦ{Ӝ,|]9 qѥ⯴S>9ww*Sy+i%Vhi
+RT~i:%$69E\/vR<3J>\:v=$Ǯ㈢[XR=+j`p` w{nd_
+(>I!R^9hT@Cvڻ۟
+X3zlsJH//z:Pv9vz %a㏼JG>P.-J-;g
+P"qTzR75Ät X=m<B3iQG)X'ʋ} RH'0Շӟ(dkKT`ubr-n;J {UeTN՝Ů{_)OڷXl+F]DU٣P ;>`DkGԽQ@Ӛ"G?M3iYߌ4()p< z )-&lbx's-<wʜJk!uh[̊桹@&z+cT0#fR_
+$Id X}h
+uJbAo+Nۃ$PS}QkOcR&K3qk$½5iP+ *H~Wl+dMqH\TI跧k`m<,A_n9 UvKUB8Iϖ-@@)t+v5O=W#έ"-}{ Uo_jKFzh
+BMՅTnOGŮi֪ϤQ9j {\bQ c[{^uCphB
+Z+*$xJ뚄̑KMԣqOA4`? lܠJY0ޝ5J^B\xEpGPgtӄNVޟ @Kh]%Ҁ(Z&X|жL/m4!NWy؊ l%BFm樝Jk P\G|]j@"
+T>u7ZLSQk[C jo4[~mZ/Gj\4:6@$Ѫe4~@38ǃ0?K; GeZ~iؚC2iûj^c{</my^nFr{EJ_"F]b#Y5ޡ9rp(JSR*PtL*}{G{ì2N<W!, %%aͅt'cz!UcBPf
+! #7 *"oVt*\ʲ[ş9[Lp9XcUW{z|j:ƶN93 _TWN/+\+RiڽH#hMڳݍt ʞ14\cܗ[y&*a%/a?;e-G',x*DZ|%l2tQE,rYG}> V=œ)g,k8!I8E38*:6GJ8R:Mt+fKtoTۣ<j ]:%VF)ha
+()h?`_4TY⩙mN"R%j(h*RUG#SBit= -T7ƕ`MW˩&T <UN +Ϫ`W!}m(=UنT̼pbـ8,#ې]4ދ
+E(Khք&JYp*Oq4Μ:
+V&Scuk§):P9RJ, 5[g&r053TT oVڏz[mB}{%KЈ1-Jp(G-z[`  F7:Օ|
+ݐĺުq͖jXiKt]Bb)ά@Ί7B $~s<‚ Nd?p??GӅyILkU2OqO!0?K^,,e!B,!GZ߻z7q1fthpAq2;88i$o 'K21T;k +;g{ƴQN9&nSd2hA(q!RȑvUAU{ƳZtR鵱<*Òq|(haYc~p
+EwYH |ΝZtPXe0JR ,bRM"A3͋T/X;`N&S*w2g@^=T~XqX9515BơYˆ IETcc /w
+:aa15^<{zY[LL<$JrL&]9sOKJ,}B鮌Uf~|dP"hnv^IJ(7բ^
+ơ]0nw^^şۻO>7~?=yO_/}ݳ?<'}}Z*!h{R9ũ%0EjOoY>e~o .%) 4FxÍ6ke3ā
+ơLF
+<k.UVQkFE׭Ly;) W}.:Rqn%eMr#~⣤I"yc
+1K]P`v!;'ڨm
+}bׄ!/.TrN1#o@<D+iv{)yC
+Ilļփx^Vy+ñHPDHnKyl;=zTbѳDÔ˹ RU|㏝\z6ivI4\.*1čDlm:Č$T5B|OYV $K؜АCC)k*dXھ~l7hI$lU42zD+D4OT'̰R D-iIV7#c`
+[۳ԝr ?(lQn@\9 KR)F'HK YJX)6&}U} 5ڲx>OReUv!h\Qh57W!Gimgs/k
+LdKu#$K:+bCb]BцYuSQ}"}$Uz?k^*
+endstream endobj 22 0 obj <</Filter[/FlateDecode]/Length 22972>>stream
+HTW;6 ];LK$bdr@z6-A$ϿdzG[,cџȶ?[ָ֟Y<|>-SY3x~Ewqˎ',[Z{γ I b暵-NO!}f+ pOg⺳= [?zjOzӵ¡{Ccԉ=p:pJxiaB
+:"-ĩ !LK{zQ ̏`. 45 ||}\%Ԁ aSg,z`UoN`SO_A05܃i'>xϴ8!QŘo,3rC˙,@@ DOk>ܘ!GM8h*ӸމdOU<G QQl4X?~q:oY>@q@o9_^7v`.4&&28Q <_qՑ[pT#ЈOf8Ji?"7߁~
+Mf}uM'J\6@Ggg蓀f,QZ9 LC0q?-\5hOkVXRY. -2Ņ^< !ŗPNB"&o-Ɣ R]>bD6蚆$Em%/!D$UN!%bYY} j\s%@h+Jc
+Mh_aWէ[)̛J6rxeD(*7CZz)yE"jiSX)~{ ޒyDjoD6󝺟4<HddE
+'@1B} 6ҏb6:. "xY+Ke$АlY{K
+$CHl-0JP;ϟ]hu$긓Uzq\
+9v>"fsϹPF=ۛ*_ ؈SY bC v0F_Zz\wAc'
+E[mlj?3E)Wёj\!}>\?\VoGT^!7b*e-z
+Z6#o Bsd̤|aGVn@AV_4 ȸkN[fi#0YKTSQgfgs:n5xp+S
+(ās11
+ l9#QUF-.;qv/^LuD^>׷CǕDtA-5?DKNx]F0}Coy7g:$ ;- NQm۱C)_Q Wn¾ya?m*6Hz.yxp
+ƈ3ů4r bӼډL WFI6ݾDA4o~`z[(VUN~PT)<LEɋb\()C5sV95y0sm\VqzRvgtˡ8A|K ?5*}g*#M۶ɗ$
+J38$`sT,|d3ap!4S#)g!g]-+}Ze,g>sDA8!|Z>ݡL6h'V(aT*kWF*ĎXkELz}r宙c`g
+13_⠡Gf5[eC*lPuK)$R0էQOuS}M7u)`E ; U ܲR;z {2y-Ȣ$}< Q:^!^˨xUGh+JvQv+FkIV5O
+#piFn~$+OU=ZeSz*'S
+
+NUvɞDM=zR^QvIvl%s򤺑Ea*mB!^ {G!?o|?~_O_|;wMo?_~w?߿~boe?+^Z*>r>Y{>NO+ dW(q v;-ANFF
+˧RY`D^H,^:A`k·ą^ 9Fl㶺dPSfUե/,5Fq4dI=[;g=l7(wӈioPjWm阙ݟ+P&{p7^ Dƅ8yR w9VN5yTZ.dy`%½$b*NVDFt$'sPeL0F*b>.3O.iKKA;/kT,VubIwūq>nI%&3+پaw@W-\zq^SWS"mo&Xa)σ
+^p̸ՈXHN0ʥ/+Ns
+ .iIqNJ-v>pg3Q?{JŽ=x
+'qr}H5
+%Z(؊ܩi6z{S+k`%ۥȑe/DV(qtP3/ \{'}}u
+6Ie&>ԇxg)#r۹yIlP})`1\}Bbҿn5
+~
+NsDn^=hBB9 jKUjoh圧(~{Պ[,$KVy8>t)I\.U* X{y1kpw=
+w!FZ
+c7oȸO~G/\ӌ"h+H83uTa).]X'5}CGOj%'8vKirDNM~2N9<](i$
+_NnfyEj ; _srdK;'D;"-(zamިaKu,IK{hrTQUji4 B^ !$wn$K2 =;72̰3Ș=Qs;uH!6L.y#QSi7"cYUuvApDՙ:s'|o1EvLY#0:<SEs vH6`5{e+*ƫ`n=2?,vSL՜9^%o_8ׂBx@>BwG
+E/g̽We츎P !D%f
+  WϢ3Y6٫W/D5<4Y.c4 6ojWiz% `)>>EHlZ{Ч r-$H$qnt)<\3әk*o!lh2Ot|3X ar̆ %x9UDܹ<Buqݏg ?=URE&^< ֯wƒ̄TTF .@FρZbUwřگp#
+֨قRw/{nw;?g' PGX&u*= h,e~sM%
+ftͤ\)Z<n*Č?sPA'I_5h!^TWQdMo9W ܍'eRNR{)wMu-)l .iGכr.3A|UE9QC]b5Lޕįԃ8 1q0νgL
+ln<A THA W)fQmsQzL8j9(]U?SɌy!V* bXD
+^)YJ1Uo5r8 lqBe)JS)q{`P1j:8)5tzհiuy;R#i sB_]@(똅JA<r3 3rG l3Ar< 2pqCB%=MSΙ d[e,Rޮ6rXb/y,c"v;먲{#nM{lvA#8A#J
+dOFJbnD"tz"$d~p0*0}!GN1g*ݾ]3u7VlѺj%c<'?q'8֐C|L"HO0OQMNt}_
+
+
+w1#9ߪkBMWN3_'S0 jm;.+e_'(---Q8ţ4F+Ȟe$%*O|SZxؔ>}WkFGU ?'U T8Dr7SĎƶºR;qu>FܻGp
+iqOE 0|t<Q놲%3HsyZVY ѫuH5vs/ :Ϟ124"AL"4=E7˴AM&`@u}Q^f?cV"JF@)yZy(?h yM˦tiXC?:S@Ĺn2f9oɲpeex|Lq T{Wr+y?g01"w[Y|}Fr"0?
+osktI^4Ժ~GhڙO'%paV(? w.+2CPw\4ķr]dubI !s=J\Q$z;XR/gJL{}Z{넮i' 0 ΋ǺY\kLQܩn IIu؟TmU `Ji1(Ido"Ժ
+5֍Z6pOئ@8_;:
+`q;Tôs
+͡/SU=mXJ{N167mbCxϴ9Bj
+ff#1WGT7gE"!T}2W(*Wh~Y`J~r(mUS",-bC_L/';511yQ}?VC dqJզIp@߽E}Uۊ/l1'#J6 o]&,3?eGR kL.|4AU[Pۆ͛= <JeN_65(",UY *q:4ʅZXF4\g1gK{|x48J}nLiʒ{ \D.]O@OYS>o׿~_)1U+5h# pcd3ŵ(AxRǦj궂ڵl.Lej
+X(X-nIf,B(a$ʝԯPYX4s?>Iˉ0isXx2
+>ei0+@N=>JYxjQY0ބ@RsMPM'HeuΗv=Ab12]o(wiP!9jdf~^Rb ]Xj A3^:
+<o"3 7 >AߠC UCNas rnΰ9#JQfRdx/ <C[j*L.͊+J-!^A,Ez od޿Bj2oN
+ZOB
+P󤺹9՞ul8nd  )\Rqiz7#vf(@FFSûD3U2(Q nT9vS<fPm6?̡Ǜ԰~W76h "] >J27z n(YW:bQ[5TM`bl6r6uLA
+VqyG7xY#=܏*X>m*;P@FkGZ}
+.0J 0alt dNwY;zÜ2
+Lҩ~e>7r&3mf:4%>GܢDZ9kr/@s尮N$rѩ0E
+O'f).׍.Ioì #;H&w@q\ 
+i:=Mwq(MK'ˆ"fhV>>BWkvZ8/j𸦖oXT
+@(
+7P'"/{8O(IpyU'PqXM+jR~ų4꿟Ĩv *<1N+^!xeE?9kgQWz-5m1W!jG
+䤓1DZdU?Q'E,뽍ܐay¿ &To P4BF8X19혰xXIQަJ:@CΞ>:fXH5]!BC>SkKSOo*8EBMVFꝝ})qf*Hd+[4w^PU=O%R.܌Rmr|Շ Jv0x tsDOBYd>QBexf,Z07yIDzLp~Y7.9$-ڑU}{~d&wJ
+yL-$af`
+!cp`reG
+¯ˁK0,@@k4/Nf2+9qfR0z$rm;\|"7zybKDzcydY鉺˔(8+\%a>R(px0z9YiU۳0]LRş!WSgkndMݖ6ǫfRos\I~6R.߯څ[ޙw-Ү)GbeL@H-(u`&U.ER|A5(~/ƍǕ1$i[4stZ F7mz.`{J|F=ٚ#\3\B}E :M@TMYbz ;%dq6TCRJRqv\I:ՇO-kIH)XuZmeȀkp:?c !'+kzbgbu
+q%Yeb ϷΚ05f!$WNr
+U!N,2f I6o&ĥ}BJ,+BL% ̚C[pzSu;^"nH\ϥpB+}:Ͼ[?^;@ʳ[D \@̻pbh&?I{?"ȝ8oYETx<ⵧ-B[tĈsUKT[J
+kK6ZװaH@kk
+/
+jd4dm MeN#!K*P(gf޴|a
+OiX;s6q{. ;֖$Զj>yK^iF
+I3ED{b nY'ovȲTPIJ
+5 ~iyưI
+81vk
+{j.fYnR̓ E)5Wwrᄶa,v38cHrO;
+IWA;Յ!#BtPb[9 "jU_ tL@rRB 1Vk%zGasv%|c&`7a 2h)~Rr%/d>ΐ [5-Gm{Eh3bġyȘض'd*h9iG^'AsӐebgλ^GDt)8YIl! AHVm恳8JÐh)e7Z/ fGCN͡`ҩc'BG %
+sjѧi;653hXɚm;P(YA $$qnc25|Z4!Hс/ftˌڳ맧wt[JTE7U?˕
+FJ'-ωz1T@+ VlZic\0>fuyOD¶ϙ/6ךm&R'l2784vQ)`1 2I\yV4=eO3 I4w*B"(fr d/W%fpi gsWyÄ)mdY&_hkϞL\fG=zhhK `˺H 4J: #!ޝ@J@bf\m\@+ Vl?/tʿ1Ҙ\\
+?gs1
+?F~u\
+5 b qXLkPoధVƇddvKK-@-h!pqK E+ j@ =6jPO=#0=HV@MÞJro|؎*vvR>qR&5NӻYO*gzLh8>| Z Xh%фQih-L]
+5V"M8 ( Z+󄈐B\|
+
+MEDq5D@}g\.8BvsЊηN7w?>x{{uէ/{?zuu?Oxg:,g=O/+a^Nޛ~q)64g~_mٳZ3VK-eYk3 #4)aI+t㰘nPIX
+)= /Z6]0b$펡7fFZEBX_ɛ]Au-.*sø
+f7UʡtZ'Ք
+.>-8&[mRG0#H CPwZ,]#W/H]ͭꦰN
+`kEvg}hcVPZUiB+&-q [(EB{-T5iB+&&#W.
+@c@+7
+H+ 8Zl4+!vS:'Ak4}Bf%-ӤP`a;P@vABPDhs9A VP+So
+)q0G; 좆~Q-*4m~0[Xη"P]p*Ɓbo'Ӈgӛ|Wӗ?^_]NL'5ng&A? zJ䦗ӻfN)D~2nBiSG_³:_95-H ω>~l}YJT1gX4lXbN7zqu[67AWepp\?.`X(I{cn_LЫ/t+FsT˫@@Hig~ ֡Z7/u)U\!Tߍ'|u:ZT0/wK_c%Mx'p'WLdvChFc۵R
+E}&cgf_۩bROQm [AnjO;A}q]SNk-hS(B$C;%@ ̾xF`.6ŹzD`,iMnzP(R VjV<,m׍q5i1+rB!.փWފR-.B#έ5 u0SVr}m+pކ0=BaL)IuǍ Z ٖ`H$Qk5=޾J(S;ElCG.ntcV13b\Kia"vl|[Ey0
+%
+ɒRc=:rˆZK+#lp~Kx+Wvð_:ŎDRz[י:@]_OJü<E)pZ|3%$k-/`I_OM
+MV.kimdxfFXilű_@bǐ
+sʨCc䉏 (bk,sƣ$=C$S[*j$G mZ̒O#5moCR9
+^֟C~7+YBMD9wÎ(T=Gz`Y )Pu28Zt1 x
+JdRQ1 >{Tط6;(9k}͜0 no'q: go`K;`LN;.2XiTsΗYy`L_ミ+lǠ:7
+-r91:u ~O3{?a0<!_?h:L8#P b!YX_\G y:`+oqj
+yIJgiV |.jgR+P#R
+veË㬅JgY#8edubd(y Zarbn GBb-hs~@&뀸MK=gTz;I\q7DȽlaAZL,N- :WOʍ-q9I5umӒZ*> @4PLgǍm%xt6L\v^n *3t|o7;VXh"UA,B ۼćZFzfޜQ^uq>g`>PJ>ƫ)4"5m*[3<FˑO#i I|F#CE`G Kts[Akn|$\I Oھ%5#wYK`x[E[HDNR7C$igk\'K^jbͱ[!S U <aJTfKcEJ൰{;jUӳjuiTF9znר*InrnDhM
+Xh*f[צ,ݖxYaih2@<&\.מ~c[Mh!Q|EPcz:UסZ*9C66X(X
+"CYN84F 9AuvS~Opas8 Ps-08$}{lñsJP|p'/2I*!ӡt(Z-!-W&AW!._udnhHPY"?86dc&ɱ "-'Hi=7pEشfOE]H'݃ij9?|N)OgcV&=^〔丞=Ν"]wt NiN'9xR-Xr7-:p-6ރ7&cG@tw5鶁cw;hijaY'ȍZ_*l`MW
+W +ߏYRrAVg| nzn9U<P ҕJtc!O(!
+$$
+6B@|Wch{g͋ ϟΕ: XYsd^:Ͱ҅z ,egFxRD^sp8'X20ƁR@ZqF0C )@A`]
+endstream endobj 23 0 obj <</Filter[/FlateDecode]/Length 9026>>stream
+HlW;%7 s?GRwpŢzw j)~5af_?/>=x7qa7uħ~mp~h~@A%a!<SM\mѾzddiE]8idx|5q06>_Mҍ53pK &4tk"j.3à0;OE
+3ƹ7DΖ>NFNE&Er3ּkv'SJ#י;5llk8L㥋'?e\KZv?9 `G廚ܯ E/.XI 5:=,IN*i `l9G~-؀֥Vq4
+@Jg{m{%hkڠ9?XL'8@)Ϋ[7cunm^kH<բܕ7eCC4=\b~5Ō 6˃e|<J9۽,_Xj@[\/nvsct R18͡i
+c 6' FgAm!z*vMwn$6}`v" .jK}\rG7 pL^oIV|dn/jiY`ͬumv nYf`嗁hc2cCWK`E;@H`Y
+6Wsaˀ)8OaZxղSF{;j?Rr3Cǝji7ze】,T睟 g Ib+ƈ0+k t26=8#TbF_ ,_ĮLEy#oz: ɠyIi){\ rg \^m,vf^Vug#<dWۑE9
+Ke"貍Coݿ[*. Çk%Հj$3oUy{"Iy`N('` uCw+³x-0|p .x#+0 s]9PE |"ֆM f?Q%v_24 edz]韁g->~ܰl^P}
+Td23 -*o.-i2I:ě<hR[}~#(g}2BI}
+JP7ôZr8p*3'=,umRu(7v9P*zw2&zks؄j1;.f\H}F4l[<וYR]sF(88x?OtP'@gw ] :ѵ1"rV*;di<#vrhyRkykt:Sw-H_G<oɰۨ/#g||RRH萊|GXi8>:.gk%R&Ĕk0[VEn>Vëk9<]:=\:prd$DtM"CQ7ptּ]+
+jcg_:mY c76aSVƒm]E⮹ӗF+4nxu$~h:Hҍ?3uɣrlpX:a6p^[YX 9B{ ytp.)k5΢cA@&.#?R(w%+).25@vCqp~y뫂4bۄʣQA;Ť[c˝PA:yjl?l%{LI`gd
+38?krv
+OUr
+ڛ7{jCrhnbT)ImŅsxxx$MBuV>&bȓp ﶇ,|xL脟qWVLICJM9+,(nsX
+;z.R2<,Dz[r{YyaD_;[aJsGgpQ@g̡ۡ4`ߜ-Alkl3^2yͲe^l#@
+\Y7H4li:qy7LxIWO(gLLN/?Y 0NOA7{]YyR/x Ҳ:o1~r
+Mˀ6O{݆&#sB$;)бx`xE_mm#GUNb`0v$V\/U[T9l?ɏ&H[[fLӡAb⍅50!ŝ 5&kIMr5, c:6}r
+5GlFI 6F/266$r "11o XSxF]VʔYmbLy\ʕPI
+7\1FfKLe#a0+|O`$%t R̸zbz/Zvj$8!1*{/ y @GP6GnT.ݤƈ0ƝEzXt(1\;,Ȏ3[(^('fr.}%7X6 h4{;5Y*_j| m԰5ھ!1
+PI8Ļݖ"j#(Ýѳt@~uɤVa1:l> j }5>UӪ?fpA__~yZ.ꊘ]nI8#@i P9s `c(^r@:3Mh4A>Ƿ[
+M 6o 8(QCKkN"F{rYF(.aѷ2Z'mlCEjhmAMvj[‡a^Cj1n^Y#cF(B~#l;ob#ms(#lj 3401M(sWi:A2O`j*(HTS>\ݸ4F=4= gd;Dq Q'+e8eԜhoDck&m
+ǟ&y.ҀXvSwًx + '픣#CÎ1qJw~} V?QĈ=i~­q6&iu+ :ٙPD
+S̻}nqiQ#Xhۚ8vRͅʪ6]ٍ[q\!Vrnc+5x3n{d ʛXhY\2eE3zҤkݥt\ i`n!O9Mm>q[d36m"צ-e-ÚLj`׾d_C\Fy Y|ݢ
+FbmL[=S($ʡDuJ r<eJ%OcHGAd v¬,3"cp4nn^ S 1ZL)XU02АS$;onc7ɰIl8~ Bg%o #m=@J_V8a'OM~ON_G/YլI]PV&o}uVܜɊ/]|O8UCǏۿ'?f\y6H=?4yz g񴪒myJʃL.Gn%ԏO}=y6yK>ͦ$os*{,7?O٢Nݱ<y2OkśSYť ;[>i('#޹?ݑ@utkؗuu8D~3_ WyS9ĺ{-nV6\4q'O
+,w͞Zg5+ao|O^z 냩B\/J#vV633aYcr%.ݗCĬl8Wi҃If'<>|G(rW.6opבCU @{ Ghsn Cԣz<:]:?0γ}2ZK]T*QLvrh#^,o0QyǬzH_5H$k>🟋OX_/^Oo|{\ĩnSS}}u͸C볲)YyS1kw iJK $[<|p=t/;;
+@{j y"Mu䢘`{^=jx{6YGуv V3ȫd-^U <x~l(E9zg
+vகYQ7>
+lKgX7y݃W}SrURQbV5 kV6\\T*=7x(rrz
+JE?e,<JGN+)UZ卻
+&hz4FB$YAIF$:_J8Ѕ2;RH};?/IE(&kÄflU]dј]|hbخ^еy980J$lb
+绔N.4]9@<w.%%‽*5EgZ?Zp8mܗuh]+L<(xN2$a/Jg'gئBO0Q
+1o{%/-|_tuDě&<ԐPwi4a(>F4Q'וD
+i)[ZqM LO|>:=sn-<NӔ%(] $ep6|fo"f6wW
+endstream endobj 24 0 obj <</Filter[/FlateDecode]/Length 3723>>stream
+HWQo~/KJ'˪'+r(mn[.e~[Ǻ$pHLY3~|ILVB*BQ**:kԋuU.z=W?OoG;iїtP._K DkmyJ;/>s xxR>G-M(c‡~ ޢ)\2cjfqXBr@f10tע,
+)ϐlf(rU^IbV\nӴ
+3Ck;1'\.{-‚l𸶷q '1U!wQ/*;YoMǔB|LvwV;Րp"3S[̗2&xŖUiIvJV
+㧃r2 zvdVUl :L"#X ȓ5x}Uvo{AbIhC< exlp.hfb76N1fƹ+ckD# O
+VM^~o747uF #!QK - IQD<sH%Lo[8le/Tc<vjF`%|iYAWM Z'x^e@qOV<
+LnӴ
+L`%X}V B"xI4֥ťI*]4h<0eV*Be8D:|¨Ѳ BS'</\# 744.Öՠ4)[دë@ u/6x`~;ai`'aAprDrj˅oSk2TY$eF?AReQHNJ R\~nvrgZ͞K!nӴ
+L`%X}V B"xkQzJYiP,'S g3aBO/yt R9ϊ ȓ5x}UvQhPwWRL؍MԱixąTKPEkn!31i"1(:TóppF!8.R[cpDL$ɶn|XJORu"lqH$#ԽY(".氠,3pzA/g{߈ИG<ijnqBˌ2wh
+L`%XxY\5:WmBԖRѤ73BK_Br j‚/Xϣ)\(VݖZ69X |mk+ 6t؀_l~-[D/`]9u@`"G<;X6ÏGmZl 3.xD9Qͅn#p28%L>x|kj)lB~O F*<EC]wc¥fb76NQfMc> O?5">8N%~kn!31i"1(:TX97) fT(J%߳1gH'J! DK BS'epADN:T@l6Ӹ{x EwN^l*ꄥ.氠,3p.` zѠ7y`񬛛2iaa%XI=fW]U5T49LicPRB"ڦKhG
+ע,
+)c% 2M.XZQ"W=n@)sb|Yl!د%Q4g~ FgOҦ~I$lfqwAڠdQI{صc!3+R)좹:TjٶT4:5&QOCq\fZ.~<$NvCF%5)OdAĻ:SThД6ج߰z$#ԽyWㄥ٠]#ݼF GJ04
+B22V^nǖ!ig)yhQ|P"PPxj)lMf[! SH/uj|TҏarS{k/L>Auc~
+4^:/jKei>-7`lȦ,ZV\>cwwM-df7T
+/h.Tjf5jmK97]F)`WD*~})? uo58ݙY~DYk%\@M|ZKr&5| xR*ZOF DHoOx/|qWhД62C#񑜲#x EA .xp3XP83MIAkpɃ|}b ax]}ly l#cӿp^ytҦ*F-)F:_,T^)U³T+aK<BK-Ka[jDv<\s _cl{gq7$ospC!|[تK\LlY0y&aQB6x[g?R|L)j8]֩]Tgb;QϘZ6 .
+%x1K5cZBuu"MzN(O&to[be|{f=kNHbճRH~t"J{[GI ksmUN;HЖF0Cs[QĥЃ$Ÿ&XnJvZD%#xPf3]pcb"34sJa+
+endstream endobj 25 0 obj <</Filter[/FlateDecode]/Length 12564>>stream
+HW[o۸~/
+]Ŀ漜 )R[tMMǹp&\ Sr>;r6X'ޣihGha6-O<'Ўcl' m&d1 ^q<ߍI(d48rfIF~{%1Y~
+@yiͥmA3rZn-o͏ߘ/I|O;18Jcs*Y*
+42CXogL>IFQ
+Nߝ%3jb2'vr/#,ݥ۰=Dq [)c,tٷpxM]AstBb7^ ceCX
+M٘B+El]aPwvtl^LbǻU?CwѾӊv賢т(g-MK۔G$z.ڇȌ|MiCIV6U%ќv퐼
+aCޡi 6Zݻ|F>E<Z4K{~B;Gό5Ƈ}x;<낾 ܓ&qEIFQ(zn3_ڤe0'HSDid;Z64ReD7uˀ[G-&-r[wNQip$#!ypvjj/w81,]0򯞿Q+L]AafLC#;.??)Cw5[PWWt؆˿?GU=j{uߢ[}oQ-oQnު5.M HI@PG ;5/iJ#z$ߝ#=~2@A0{:x)~M$ٿ%fa Fnh1ƪz
+z!+O]\GB:#P'xEpQ>9,L(c`)\Rhg75їlTnLU:fN 0f ݔ5,n@ HWb1HG!,6xcfEYN<=Lb,e 12,,T(eRN[v2d2+Flo]TyU=fťN%:t31*,]Ҡ0&-F+w'I֪`R1,Y樝LT- wtC!SnaY]52"aKLN~hlJ
+RH,L{t.&2[!۔XSRtiUq8G,>Շ#<.ޅh8ip%6%fypBSkFŊc:
+$JBgȂT:Q9VO'[՛1fz3f9PJC'DOmuCg@VMT#:˨6eI0!F NObqgDRBYAflGj*CU|zB ᕒJI8RWW Y+NQHdsb|Y o216 8"#vK n1)pcef2;\/~بK]0Q Q-:9"gPp/y+PF]$@1hA|xA[R IM YeYRYFWbdpD{S7Edu]Z0Ŵ̷̛1E-hePxˍtlR>ĐdؗH @H= (1H+EI4(T:{A8)eN5^Ġ]]XԴ,d Yy
+$Z/+'<UT^Vm5N89ċB;^$,~M n_I=S"t4</v8ƾ琱c^x{/dy>P: 7[$MN Gȯ'g'>ϣ8)HJ{xre0lA@P,܍IHcp!'ݤcdTr6~wX{D{?F)V߲,MB`#UzE*̾醊̾iʼntA!>QϦN
+XٔR+[)-\leqΪ+[pS\h"ĦUJYw8+=9ϕ_@]<xzy ֛w\8:иO.mO|ͺ>-Ah'5DziBBM|ɋ~=M"Ҥf8꼢D6Yh;C7YK:шwY-=EUUZY)-
+]!-x[<gE&|ͽ*\Rു@D>GqHE#7*4
+ ޤ׽JmV'-]Φ/U_Wm^lT[K.pqCi㳨~/7S/(rN0uVô'̸~kN+M5\Tqhk&Vmz0:hBԸ!ءUIz8m^EdRXV 1WvX=S&9BvVM(ZNYNƑ% ,%sK*vn\X~,\&ZPC`b; lkX0uݟp1>I8ѽ;@~˘޴1
+Gyв[r>wh!`"'K$*/>o;څAyLlH zlojڒT&W;eVWw6;:e94NʳKz?AK Lx]-&Y.^߾^YۼZ(DJiZpR~iv$ B|r!uo@@a )Ү)-12*A(bKiSkl[ 򐠕Ϙ6SBmDt.AـT q$1BOzζ$s_=aU@ fF6xj,;0-. 
+@MB+F5=KCPJK[΅`
+WF٭a$_ZJ%y~
+$B'4n
+AHA~NBV vgx|$xad|*/n{\\ Bi h
+OY 聵t}}H)
+} ޼>]vţw.ώ޺t.(Go*=ʆVg/^Mf~\H 91":dDk_V_)m8-\쭷iJ%-lGG^T3s"PG\tPȔ5
+R.V֟"W֟"X֟ YvѲ~T3 ׏\[
+`{s%y6qq f՛.|}_\^,5NtW(dT0:|qV{_2!2p&GK lلc[JTRzdWpodpUA[
+QL
+kIm H 6H*%\vP).gF؋Q'"GꝈCN$މU6`ȔXGp=Ї`MmG9c(BL
+391n^&]A$DXږkbqV%y%V`K<¸K:BRVPh@u ;Ȗ>^n
+8zղ\y3*y z!#a]piD^v] 9FÐ|p[
+1dY
+VpNQo$}R 8
+B"
+g
+Œ%$"n,,й'h!aAzn?js}$:,t]a]ϦuW?ލ/g<~Wyooߧbt>ޠwv(K'Uj9~?i=}?rU* Ғh?kD9qd?*=?'/ٰwv_|/zǎP!҇;^k&fw_'ZP6t61<Z7iϭzP+$tzbwny09B&J5~ud}e{*ը+un/,ۉd湜KmS
+B0A'SX7rVUy䗠vE g1zm~:3%b|9XWAG>uo4:1qe7k]]aש*qՔu !e-4qJH&2@v[-O} w 7 =&Yc 5\ʖGNt^dYN>R˼pϜ\'I%)M=%A
+] T :#Ӻt_M8*Wk&|i<}PY-N@,
+Zh /'x'YꌢN2A:˼q%٫T5LDs\P}ֺ{kԶ2 SE=)UӲ0bUYqSIJ`(([GUX[%fwT5.핉Πa@WAH\wb39"e8@,ثT5LDxR1œ9rg]=5jUE7kWRrĪ}~XmC m?޺DXjk κj/o^wBPfC l?8غmgr0d )dN,  (:1cZ
+0ϜE92FX<q.j1T9 !n !ɮ
+
+7[8âv)TH!"r|"2@z3`g-~ET&tX,&s4hx&{]N[>{?j5]ˇӖc>F":߭[{]u,Oڌ\޵/dc08vy 74O.n.3+A{=C:qN=O^ =ם<o#9Mt>jDk% >īT4cm ՃA~/}%$ =En6Mo
+tJLm޿gR@ؠkhô 96N؅ŷbD:K8Ђ% }Ki7AuoAK@h϶ uOYSfl8޵~P OMY4-J3cNa\V've6y;S9M+Jys1^W%׫tBRN`9ej9˽}mHZbX̂/Y~:ij_o˕07imYK,+*$z&j(N
+s ByfvZmє>K񤩨 HͲ&Y97KT5|&P@r\GًC'h,Mfk)
+щ<>qdUj
+Z8YSMBשn(]/տȯ9n#zЗÎdr7`R ~+c?d7g:Zh]bU꽨;e/p|8(_6,Rn~</.4SYeٮ|i!qrs.6Ů0
+ (Wg, <0} 3㦑Y8}D% ZBvp7|g+UPRaNU@Qux{|=?^\_\ov'^nٮ(
+at)| *)6iZH{ˎ\ L`3nae(Y1h蓝iA}G q(g!Z HVdn:1J-3NV%h>NЃo*g_#?158b.DXT$ce5,T e dJń*kTZv'/
+9CCtKŶ0C޺X=
+W@͠n[f& ̫
+5u:yUR@]plQ@4$@/}y(f;3>fc+OsOkҼW<B=Һ^R3[9V)zڤsH=.7%A}6wBn#A:@ 0=*tI#'5 cWb PbR @D*
+j fB,i 4ȚG! M8$@{eneQS,D麢! O
+ZV3 ύ]M<rz'J$<17jӈޤL(j0z1U\,j@@Ay;x-F{MaXLD/y]
+csǎGr F.UG#39»ZςJrfђAێ^ 2#P̖, [Mɒu2zp ({#kb7÷
+X֢q G>F-H/ʓq`"%c/NGY"rzDjZ QBEN"Q x%XRH@(l"Ŭ_Eq/U5q4v
+f0ݳ6$8}tf!۬TY̦g^ sƷ_(KHGYV
+bs8bi1eY#|A,7lD(TLtjrTB?ga :/#t!`Ea,lIc$1B󙫛,|=Cr*j2q"n{ #g1ppĶ"b
+z{w;$r #ɇ N+[!!FQE!&U<'gs@j
+;qZ[>ubXA6KkJQ'(o|\^;}zZ7O;Uۓ8_49iKOz|)\b )tjmI_T7[JʉG5R^v;3s6ac&)ڃ2L2l@+J1:sM"#D¿#g29"!B7 \:I]|&,
+綖N=S<Jb(ֲBc<&HQ Sq Z=q7wjaMt}g߸!c}W (|MαӘ:A fELt|Y/k9/]w!3sLŮKz U`-z!5av5mc!EzLa; |XmO )]M{ n=|4k/
+Q7pyoW5VRuU0%ؿiV`5-cmkX[lbHeHXҐUVH)Lu0UZf-'Y9t^hQQ$W
+endstream endobj 26 0 obj <</Filter[/FlateDecode]/Length 16172>>stream
+HWNK}?H4u$$XDDQ.pn%?s~dc`%R(Vjյ_6C`/'QCT{EuQzbdži6tuwlV qv^!Zy +<Fz4Jfʋnh8וm[q/AOQU<
+Ax;4n|K&}>[y0N
+<q}
+ T]r#M㨸Y\s1>KS8<`/zfg܋m2X\]w&r:<S>06IO*Hq=jQ:pl5W0Yo[۰%%F"pFsArn0s0d>Hg]}8ײzȂ":^( ._6
+ ;]2w~},lie:HSɖnt` i#-mFʧ4er, %U\@ j8wG/wOa
+ r#Jb('@pbE %rQ%5iIL˫(FqO+XTƍfE;ϓ'H_:pl1jNU'g:yA W0V
+l)* f"iY7p_LX%1++$1
+o5k)#TjC@7eCs'7nP|
+b)%ɵg}xFE}qp#$<H=m]Lk#M㨸YJ"GliZsylw_Bt[Y7m~ES]0Co$b69C
+ǶYOd'glw驗v%]a| Ъ#&"nBF?!  Wp!B7)! S'^~{3
+.a=M˅t}Yqta^6·H۟`kuhӏQm}NՆȎ$B{vƁ]=۱A\=dQڗ#i]>q'6~Ii"[{|_BIA8DH~iq]+(У^~L0(9p88+l_Br.hZKw2_u;GŸ/{4,OSz{ >B?Hp}'# SiܵD*,8%C=~n  M" 4S{:Y#gI}DUuy)QwR(dsTuIϬZejdZn~'^:{ޞ+$-  q)Ŏnށ޻RD*"Z5$nB/^?h#sB=6`ʇ&IRzphYw ?ĕ$vCwkv-ơ
+KP^׃㇂LKGXF$Kc))ugjYВ
+Lxzk7X(J 1 J%a`JD8PAS\!;y~
+b1J_`/iJv3mG`Ch!EO
+Iv,De̅k7aҶo1תbHskLK5@V\U CcU )N^3ƶpBm>fL>oﱍ`pLsa"(P0M=
+^<<&
+6"y:ӫ)5@]8;F}%
+CF1>!IA3c&9ԡ0Ab xx`FBAc.nb"m1l
+
+,h.B{Tµ?HXBpM!<qdpΛo* a
+®U;ft.nߤD&Tscqz{?2gy6*i 秊L#YD,+ 掊S'#RsgRD֪p.Ur6G.WE>l -n}8:z;⚇Ӈ,K?eR-?=؃9P ઻>V3U(4K}sOk9)<>퍱b.T8JGhpʞU.QԞ> 5AVwp>xw^<\MhzFvN}VĐ?g4'E=K0 \_}S<'ټ,W`?7/ ϫ8Keۋ,R[|\')ATy@QQ_UWzKO!p1 (Er<>KZˢy94ˤnr`*V͇jMvtKꋿ g,f$vrҊ~͢ _n,Q;u.'«aAGk?6f=i*:O
+%GxZ|ԓ~\=aO8С:QŠ[N2O[YY~T|E'4[νvZLF- #*ɮƢIVx|L-$}g$`q^j":Q Y'Suae06d-2eyy̳jLb#E(mnͳ
+ft*seY"6 qlU9wi6YYY6.DVbFҡ\Nkl
+?k?fׂ fEA9
+9kYe~VP6Ll%}pgXZѓ&Gez/ TN
+U^97c弉J$l!{W"&wYw:չs
+ T
+ǷTNE[ڭ\e\+(W1C^tY˥r&Yޖ/9KLU^'epךqomMd6LTQ
+
+VÓRaD.Gn:MS׺BlC 3Uw$U"{r} _M_N,+ vK |s>"ʹ.%Tk怄 8!el5+
+dM k7M("4B+>;QDv e ^TʽM?,kdnI DMw=ש۪ÐY^$H'U1;L3,CH͍O>858=xeijƳoŲ}z{(F ck&&@
+MNVN"[.f|qA)S3_pgxHE.[@H+{.@5qnH/+sR]Ll7=vIRL_.y8 d#
+kX[!xsU RO65=Xz$|ik}'h/`$a R6K1AP͹;*aẞ
+++^.
+ha 7} ]mLC;Nǥ
+ uUK~ `rhQ0V"X-Fr?Ҡ IPOt@m_t4g1@+gYSWĽ9A%Qa^W rC~7Ѩ@c˂lnO3ZWS `KٯHsŔ$ϫ@NI.:0xI#(8AUbE(",bT9 q0rdh:o!fm o;^͸}84\pbsr%?n0zl[8%L.`det㏔r؛ǒC4Ekv*f'x%qA;@y\bE54A܊t5H-8%tqmW
+v&KК}SA_%;{g4޼Lt cZT%
+% M~aaˍ 2Ls҄AG*pi 2NC4WxE@HGV]גn
+?א
+ܖFEqYV/nڳUoNvY5hpϞD߯Ls]hNS~qTV3Ţξ|z!?wyU_pm452ݸۮIO<,I,|bGM`ߟi(cjlrz. (5DiW?mݦNnrld/5x{1b\0+K|i۾8ن h|Q/v( !=9v`lloU}mqu{'=d~LGU5$v]*8JߚH`S-d/|OhU7K&w~*Ps
+Bk[7KISuY(4^"ϳyHƾÏQ7lgfYMǵg:TOyɵfyyv#R9>8Uf~mЩ0.3lkrvS?XV,)V/ΠԞ^f[+(N/y%}F nP =QjvVY_TwgsWN]}+ޠok\-@S?2pHx?]n tڳ֐H)]LR}u2]%l_K)S} ^m^.*5jV
+~e7S..6nZs3;`S՚(چ:m#N5}w*NUKb, FqF5` { Ɯ>PE_M>N=t(] VJW[ XbE Zg4\1%Ornw+iWSF5k"vCI,l f
+'*3*3vMlu]&᧽|K/~./C|o:T\hځD 1:^@O
+*J‘K/RdRo b,E
+Y. iW } mjwPj/$׉>!s Λ+
+te N`vn'JExyqqp$C TokJ!UEs @ bolcu
+ٿ,# maF4o7+xo:n۵l+W2$O`L|fK{ck`k{Kr<&Zkp^2;kQZ\gf"pl -:FM (LSP 35#_8
+1Ut}x]$bYV:e3={~15R
+G[q>KX;MQh9X
+JFտhH2xjFx1>$*H2,Ow۬XX^K-Ǧv ¯f.մoU LR@adh! lm#p個X #ROw5H%~_ s_ ·:Ia3 cuk[O{8{ځL}ܩ]ׅ/dҏ@ZP*H͕^/+FB0l9#-opV駠QB¨ѳ"k<-l<OlomCX^YAHuq
+_}:{.D㻷M=} k naV:9 ⱲQ͖CߡYg{-1VI9-ey4W~"{rm2JGefq%TZ5R
+!4*Uۺg0Y2 3]q4|4(796+L{%;xj̑W+͛|M(z}j>Ŵ5ņ9FkJrӫP{VЫֆ+2K~ 劑ٙJ~][9>|7fi;@k'/f4{HR| x'V xڇV &ta)`)(>)-Z8M*گ3mi0hI~˷4AG~^=fܮp%A|3SԲ~pNԬ}YDz2A/9 WZ~GA!,`VGy N9&j*V^2Ar2|M>$]7MC'˯}ݎngƠK`/i 0Y
+,`7qIA<5T͸7-Y0sVO.`3l>gvSw\ +l bBjfzG&^ٮֻ3|VL\IZEͮZd?r2`ɧj?m9ƥX40Ht
+*䚶|P)؍\^Z#darw1.JUFއε
+\w=BϝLabN=ܮDg4䂤5h]
+Рnv!!99
+3tR
+q;Z)G.m>ˌqFմ QX*˅N#p$;Lɇ{ ]+ζlC9z'q'uoރQ#A 2p3kM'&DjgsDǘ=Q &bnIQD`U"}m8C$yXcXɑ#W4] Ke"ӢS{-hhm)CHP%l&<$]|aٍ;_zjyKѮki dy,m8~'04BMY~ y2
+ [%BR +RtAt]F:1CFL d"RA 0d!It T@9U'8ߞ+=Ͽ~#ԙ6»:eȖio'E)Wd`X:6^CH\z+W\}Wl'soJ̋u۹C[> ݫQ_2M
+ԥ1@2把0 UiH.4&-\@aea88N(tHvAu߄82@$t?[~(/d_nt"ljJ7 %t7!@~j3]PCzQMB6?HO+M Fʟm~#wf#3tgs{H
+3 3 ;lpA"m~J[R,'ӏG$/`9<B]ʐlO\`ZjzK>$q1?V.gj\D5J}$mǬ{iss|0?-4p3|ˌoV4~\t$;>\ QtRE䵥_,$lP%<l>,j?%&jЭRGC;`\,N)#Cf[=|ˤy},.Rk yQ<=BY,ݵGe4rQc
+r++OC-R <gays+N=p:]R%i 溅j5)
+p_,;.L{SŅSdh_BPwWb\7݉)wAg`(ofܭA7 6[(9٥|"gL]
+vX&]q>2|<A?[YjQ2
+
+sLo"%㺾3 v.~n@ 7`*4Q#Qux}hX$;됨\#|)j,BOmܙ/z>
+XP O `ZX-f'`~< FmݡY QL7{SL)b}D'/R~Il+V.v:H1T
+0"ph.p0'PnOH"*͔n+Z, ubpTt~;u[qzEh n<FvQ6aySxj#xSi<XС!uZ"l63=c]QysY(ΌO?OxDVȒ SkXjRc?4
+i8 =h_I5S9Z
+ԹYR}>~pcKGZ A{LNCDžE$"0y CMLɡ>|MQ%:@~e Z(:6 `rbgrI<_hx={.)z՜u9<F ;MCq8囩Mkq,SzACua"f$z]khfT.Ix}PDU6?h'CJ/z=2J}G_>Vzp\
+o}h.uIB! !O"QUkxACZq!|٨"f+*{SD'ng\5_(k~'wNÙw3)zMy5]^sVKSK
+G<ڲtB
+(鄳KbV!fP@J
+Dc; ͕ j]³Fkg34 ~.*KۈRvZQ
+i+2bC:_Hb.
+ pL˚lrb @S+D.z;adDU)oAU=u2j$F9jdSx&֏FmڨP R=fh<*֬+[#Neu&L[hu֕y몾+.|WݦHݒW'g,pBuQ74lu/R7}
+endstream endobj 27 0 obj <</Filter[/FlateDecode]/Length 15293>>stream
+HWV"}kݏ`*ƂV)PT.4MRST
+0%PIÀ wDH' `DP ofCϺK0$D7Q
+?N?G1{У=de. ǝ[FnZurkcR{_ji
+=~R`dtlJllkSd-E6~A+s $Nڷt(ir9̈F?.n ` )$bdI/a jAj[B0=CPXikl~4q#u /Q1i* |Ntf++wZ$f4{KEn7%׫q8 {#0\gZ?gxVe՞Q$rm0Zyk5xu p=rNp(f5fuEp [y*eՋGXVAOtRBx/գH?q)7Xߪzq*Sیm8pBZ]Yj1}CH`xZt]@9ňwW8{Z֗Oe >GfVA?/6?<`y ߊf(OwGr8R@،1v_#ŭ+,_) 0_3k"˛ &@%mBB5,O=wn s/ (aLR.m|_#vsB׭R 
+Opz}F7JUJ >:an+5J·rfVhxϹ_Y8K*]'}GctP{cWu>عRބ9c |8/]
+i*HI;<NFx^)`
+SK?,yS€{OS
+6=>Vh}#~~:+2"3 $R!S%V)u`bIdqK9 *̦M\3Y4Eg'i?U3MoT>m|".;|"Y-*"r2\lF.9giEip˛dy nDuZU21\jxOE#O@<Gp*+8[ 8
+z kp\1;.Z b.!ə- weA\x*1$s3\&̓$x ;x ZҤWn>nBڛi9!&#yC6GC@A)uG<NAp%OG*8]JAnFet),|
+ 6!e_e+gOR'Dҹ!s'DnxJLؒ1: &R] LZע$7 o V,g
+< R^*<<xTct, ܣqc7yC
+l<~hqc\BIWz7/=AA3'1]j?S'-3tgP1H1b42dmxW߁H1C.op^B@ I4#p7m6F00i])
+˔^c{4#v4^AͫWY4Qkbfd`HH[ֺˠSXʗ3_o4E&z=}jܔڧAmPk z%"ŖM(8"".#Ew\$M$$i
+ƒN7]
+׉3/.{b-D8=}yv`tqnw0-%hVCQ/=U;ы wHs6[OrV?TXo>vx4o>W MpXA^ )8Zsĭܸ>l+pc^LUĄj#*7@emT>w ¢iPa凢P SS0#KOՕjFK? ר?-b)>i|_Pu}9(rS:Bw@{)!gM}ՑO|=^`|\&wn6[b L@SPNRX@w/*PxZ@8% ̴}c7uԛܮ0PjjslցË6t<j9 'A<Mbl83vW<ңh`'SRz!bOa0u&c
+Au/V ET*D9xH(9KtJގg c~p|J\4mdCljsSNMvQwuZw;IHpbz$J5d?M[hubRD~ Iqtb dMlbm(hC614)/^Ñ,iO"+&9o
+ vdgG-/iyẍֆΏ)QM ƊeA^vS&7ϘչAhk` Ć^6g :.
+|P^M:jJ\]3Qh- VApNݠl
+j %Ƙ0ƾ&4*1Jb/FxKs6@.M O BA[M!7x2vn6[<S[02{~~5eZAS^"S=9GnNg0"hm(2h0Z֋7RN5~U pS=x;?R_F&:> "@G6
+IZ_wIOs/vRwTKZ
+?L /? ~/64yO+Z_N+ZU\p^̦ʞkVk`8#E(tza j-_e4&* &,:&ZG3!KFQ,' Jb6b?*+e6TX7oj_yC""hOiLN炙di=.m,CFxz[/|\pDxuYR ./[tuYEZQKe.ENc!arq&즎+GEL5s'$6nJ4NɄ)_y/PsEuR ID 60iS5К)1)F'C6(j2'ȒⲩKo':< ,|E%֖
+(EzUD@"xFI'_ɚ]^EX s:z|+͢_C [ N,2\EzNY<p:eUcT+x)d
+,j`T7Dj6IAӛeЅ!sV4Krx.gT\Z"0:̅A<?
+GzҠb/vd40Eʱ7/@^騒->X.
+I 2ڴ<lCZU,E~EUzoU9t,N5guyYUM{ì@M'A,@%`*,f4'2T+[ЛSwYcXڄ91?Gؤ2{:T16鵀YN&iY YrNI\f hdI6U~*F|7E`V v"V,%̎(wӂ~DDkz n1Aiگgz𩗮m+6a-s:q1sseفf+<9t_˺6Am f2GG\8-t66yv7ȳMlHy
+817GmE+7\o{BP2rB3Eh
+ `qQ^ ; ij2шN.cVrs@hBm %quuYEA%:d
+(G%@oeFʶvc
+a8GAJ^@@ lhO A''H(aWҁ `E#he6~b,YS# NO
+ڀ|a"p#@
+"-8*ǡh,Yh@
+KH>`#JV+W/2ڣ!*y㵌 )hSc),QTr\![ srx{yLP1!W"(琑?ǬrƩkeesąo9F$8n'{#~'P ^?D$52[9~!+]Z|H%sxc*݌S]3vbN0Aӆ%0mR0?_j8 hȒ*WYS2K}_Jo 4
+"( 
+1O'«:/]]y%7͑ґFc2RL2Mk oRr#{k 
+P?mw63c~CEBP/׉S-E*p̉s!θeYl
+SB$% /ainaȲM%:KCWU^Y*+;&Uʄe }nhL-moBx }TM=PbSoQomvlF7fታ:]:.UӗUpTS*؏0F=Ce""<FE$*|O tT cLC`g8eҭ1:[c|L]Nka~Q1o bh2IW ֮"~Ho۔6=tLE;(ځ<ZZ*W{i&o~\s!3>[C[yy1nQxMT]LVf00FE/yUłxX6R;3v 6fRQm#m6 aQ2Q2R~wƾ tܹEJ0`?P:[$CO5OM_<_ 07-ܹx0ƫ&3pQ~H(o~AO<_"FW 2s$?B"0R"G'(TaDeQ9qHm` u<wal\yM[ԘS^kG!-HLѤPN,'Y
+P9OU1~@ݻ*jjU *Rq\+l(\,KϪJ%\4C @EY5~br ÝX\1q5 )ȷOwP4qxrfo? -./9WQj.?cr]REz2cihbNtgy@//Lo352^nbTb7-#M8^B~FNz܋h 8{w{ҽ26y1E`T+̝k,?)lc.+5(X,p6 vQt~!o]kN;.yf$9x. tf+Fܠޠ # #^wLzwhrh)2aC;5&% r&HCzE ɤ!kOQ59 5E7k`MyA=̊⢟tutJ6(KTL,goUgc`1~9劔}t Zd@^uZ$ߏTȞe#?P˛PnPaǀF]&"`V\ R*-H7jnMrN}x9`<W;&aR =mcR68mIEG{kKÌ("][Ⱥ0(DXmܖ-;:U8xVtWiS">Pn^wYdUAA/
+(o2W #:j:u u{2neR.ۼ':ӗג[RhT tuŵ<?F,hk}fཙ8!c %R!9J7-M}3qNluJhkH'NC;/;
+0
+m"[AC
+.Q^RFYnV!#R'Pg3Zpr\x@RgA@LP*.z%瘸H8vNؑ힝
+8:Y7r+=PY(&-K[$K@[jaO:b}Lbc IY󆝔Q@S1GDrXC f
+-tW<wKɕO˰Ldž 9(Fc ;=9<\uYuҨKbc_PAb `
+"LNٓhd #Q-}MnY_y+u{U,L^4i&(г
+bY҉% nK0 i п cPaVa_OP-X.uV%M1}.3c|jFl#ix\M>14f^jMa@8Ńm|vթ!М 9 (I͊$
+$k_b,c4cR-. bAN,b^l
+[FzW;JJps;Hi|LJNswsFb#$ߟGK$ W\F(/Yl>VJ3c
+lK]/
+&, bxM"OL20G1dQ`07J0o &LK;6z{V^l 9=RYATDC7"2$S5 O0 ]C1*BM(ĺb5Uv
+z4=QB $WdE 'bM0E"XpYg1ɔz{簉n=*)5+%Lɒk!ynWk劾 cY^JѶys5Lhy xK+ᣌINTHFx5i+&k^(ڢi\*H5:6a(b>AZGFz^TS0C`k`4ۭ)&s@toማ2>=]c3k(u-*
+W
+endstream endobj 6 0 obj [5 0 R] endobj 28 0 obj <</CreationDate(D:20240428163440+02'00')/Creator(Adobe Illustrator CS6 \(Windows\))/ModDate(D:20240428163440+02'00')/Producer(Adobe PDF library 10.01)/Title(jason)>> endobj xref
+0 29
+0000000000 65535 f
+0000000016 00000 n
+0000000144 00000 n
+0000053800 00000 n
+0000000000 00000 f
+0000058408 00000 n
+0000213771 00000 n
+0000053851 00000 n
+0000054179 00000 n
+0000058707 00000 n
+0000058594 00000 n
+0000056830 00000 n
+0000057846 00000 n
+0000057894 00000 n
+0000058478 00000 n
+0000058509 00000 n
+0000058780 00000 n
+0000059140 00000 n
+0000060197 00000 n
+0000088175 00000 n
+0000089840 00000 n
+0000107678 00000 n
+0000133579 00000 n
+0000156625 00000 n
+0000165724 00000 n
+0000169520 00000 n
+0000182158 00000 n
+0000198404 00000 n
+0000213794 00000 n
+trailer
+<</Size 29/Root 1 0 R/Info 28 0 R/ID[<533976EE79E2684BA015A921443B9E75><D8242482EBE1814DB4EE97872CA857B8>]>>
+startxref
+213976
+%%EOF
diff --git a/macros/latex/contrib/jsonparse/jason/jason.svg b/macros/latex/contrib/jsonparse/jason/jason.svg
new file mode 100644
index 0000000000..fe8793dfa8
--- /dev/null
+++ b/macros/latex/contrib/jsonparse/jason/jason.svg
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="250px" height="250px" viewBox="0 0 450 450" enable-background="new 0 0 449.5 435" xml:space="preserve">
+<circle fill="#3FA9F5" cx="239" cy="226" r="206.166"/>
+<g>
+ <defs>
+ <circle id="SVGID_1_" cx="239" cy="226" r="206.166"/>
+ </defs>
+ <clipPath id="SVGID_2_">
+ <use xlink:href="#SVGID_1_" overflow="visible"/>
+ </clipPath>
+ <path clip-path="url(#SVGID_2_)" fill="#C69C6D" d="M418.334,389.667c0,0-10.334-12.333-36-86.667S344,189.333,333.667,163
+ c-5.552-14.149-12.545-22.326-17.83-26.869c7.769-5.957,15.778-13.185,19.83-20.131c6.902-11.834,11.667-24.5,15.667-38.5
+ C353.731,69.108,361,63.333,361,63.333s-55-13-78.666,29.5c-1.534,2.754-3.036,5.383-4.538,7.892l-125.587,25.33
+ C141.705,137.165,130.648,151.436,126,166c-4.127,12.93-11.333,16-26.333,28s-47.398,43.774-47.398,43.774l12.106,48.851
+ l56.113,69.247c13.436-9.009,28.206-20.065,46.512-27.122c13.874-5.348,33.133-8.479,51.113-12.082
+ c2.555,6.323,8.828,23.014,11.387,40.332c3.25,22,4.5,91.5,4.5,91.5L418.334,389.667z"/>
+ <path clip-path="url(#SVGID_2_)" fill="#F7931E" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M465.5,307.334
+ c0,0-9.667-14.833-21.667-21c-11.409-5.863-24.5-7.167-24.5-7.167s2.853-11.646,11.167-22.833C439.667,244,456,233.667,456,233.667
+ l-51.499-17.5c0,0,17.166-6.5,25.166-13.833c9.095-8.336,13.333-30,13.333-30s-47.621,2.806-54.333-15.167
+ C383.501,143.333,402.001,114,402.001,114s-27.334-6.333-41.167-6.167c-7.572,0.091-15.827,0.876-22.104,2.556
+ c-0.978,1.889-1.986,3.764-3.063,5.611c-4.052,6.946-12.062,14.174-19.83,20.131c5.285,4.543,12.278,12.72,17.83,26.869
+ c10.333,26.333,23.001,65.666,48.667,140s36,86.667,36,86.667l32.5-36.5c-15.167-3-22.334-20.5-22.334-20.5L465.5,307.334z"/>
+ <path clip-path="url(#SVGID_2_)" fill="none" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M234,448.5
+ c0,0-1.25-69.5-4.5-91.5c-2.559-17.318-8.832-34.009-11.387-40.332c-0.185,0.037-0.369,0.074-0.554,0.111"/>
+</g>
+<path fill="#F7931E" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M267.334,75.167
+ C256.668,65.5,245.5,64.333,236.667,64c-15.107-0.57-25-26.667-25-26.667s0,15.167-3,18.333c-6.167-9.333-19.333-11.833-29.667-11
+ c-14.596,1.177-24,11.667-24,11.667s14.5-2.833,24.167,7.167c9.667,10,10.167,15.167,10.167,15.167
+ c-7.167-9-25.834-6.334-42.167,5.333s-11.5,43-11.5,43s3.667-12.833,20.667-20.667c6.572-3.028,24-3.667,24-3.667
+ S155.5,103.5,150.667,132.5c-2.909,17.455,3.667,32.333,3.667,32.333s1.5-15.5,16.333-24.667c10.31-6.371,21.833-9.333,21.833-9.333
+ c-5.167,3.833-3.166,14.833-3.166,14.833s9-15.167,32.833-13.667c30.479,1.918,43.022-10.208,55.629-31.275
+ C277.24,94.63,275.157,82.257,267.334,75.167z"/>
+<path fill="#A67C52" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M120.487,355.872
+ c8.348-10.395,19.908-25.626,22.763-33.622c7.5-21-1.25-30.75-6-38s3.25-11.5-10-24.25S73.5,268.25,68,265.75S63,260,61.5,249
+ s-7.183-12.182-16.5-11c-12.646,1.604-18.5,24.5-21.75,40.25s-11.549,15.507-9.75,29c0.854,6.402,4.447,12.983,15.898,15.396
+ c-0.721,5.758-0.935,12.787,0.283,20.442c3.164,19.888,34.804,29.832,58.308,27.572C98.749,369.626,109.143,363.479,120.487,355.872
+ z"/>
+<path fill="#C69C6D" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M189.334,78.667c0,0-0.5-5.167-10.167-15.167
+ c-1.713-1.772-3.58-3.135-5.489-4.188c0.317,6.082,0.921,11.189,1.303,14.006C181.138,73.124,186.281,74.833,189.334,78.667z"/>
+<path fill="#C69C6D" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M179,44.667c10.334-0.833,23.5,1.667,29.667,11
+ c3-3.167,3-18.333,3-18.333s7.525,19.843,19.471,25.298c-4.58-16.15-21.08-31.12-27.888-36.632
+ c-7-5.667-16.625-19.333-16.625-19.333s-8.979,11.333-11.979,29c-0.542,3.195-0.864,6.542-1.031,9.882
+ C175.318,45.129,177.115,44.819,179,44.667z"/>
+<ellipse fill="#FFFFFF" stroke="#603813" stroke-width="3" stroke-miterlimit="10" cx="223.167" cy="190.959" rx="19.5" ry="17.375"/>
+<ellipse fill="#42210B" cx="221.751" cy="193" rx="7.917" ry="7"/>
+<path fill="#603813" d="M80.519,293.464c0,0,2.443-4.219,6.106-9.089C91.052,278.49,99.007,273.351,103,273
+ c7.125-0.625,12.198,1.105,9.299,6.695S99.936,291.193,93,292.125S80.519,293.464,80.519,293.464z"/>
+<path fill="none" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M296,149.5c0,0,30.334-17.5,39.667-33.5
+ c6.902-11.834,11.667-24.5,15.667-38.5C353.731,69.108,361,63.333,361,63.333s-55-13-78.666,29.5
+ c-1.534,2.754-3.036,5.383-4.538,7.892"/>
+<path fill="none" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M120.488,355.872
+ c13.437-9.009,28.207-20.065,46.512-27.122c24.045-9.269,64.273-11.878,85.969-21.821s24.408-43.392,24.408-43.392"/>
+<path fill="#FFFFFF" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M127.5,299.5c0,0-0.749,0.729-2.083,1.995
+ C126.919,300.316,127.5,299.5,127.5,299.5z"/>
+<path fill="#FFFFFF" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M39.236,323.495
+ c-0.724,4.556-1.093,11.276,2.014,15.005c5,6,14.5,15,36,2c18.048-10.912,41.196-32.388,48.167-39.005
+ c-4.023,3.157-14.707,8.937-38.917,8.755C59.839,310.05,53.549,322.611,39.236,323.495z"/>
+<path fill="none" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M29.398,322.646c1.963,0.413,4.15,0.708,6.602,0.854
+ c1.129,0.067,2.202,0.06,3.236-0.005"/>
+<path fill="none" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M108.345,308.401
+ c-16.22,8.63-44.097,22.899-51.74,23.26c-7.288,0.344-13.568-4.744-16.966-8.201c-0.135,0.01-0.266,0.026-0.403,0.035"/>
+<path fill="none" stroke="#603813" stroke-width="3" stroke-miterlimit="10" d="M152.209,126.056
+ C141.705,137.165,130.648,151.436,126,166c-4.126,12.93-11.333,16-26.333,28s-47.398,43.774-47.398,43.774"/>
+</svg>
diff --git a/macros/latex/contrib/jsonparse/jsonparse-doc.pdf b/macros/latex/contrib/jsonparse/jsonparse-doc.pdf
index 07bb66590c..ed7a1dded6 100644
--- a/macros/latex/contrib/jsonparse/jsonparse-doc.pdf
+++ b/macros/latex/contrib/jsonparse/jsonparse-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/jsonparse/jsonparse-doc.tex b/macros/latex/contrib/jsonparse/jsonparse-doc.tex
index 485bec0cbf..1cfcde1e18 100644
--- a/macros/latex/contrib/jsonparse/jsonparse-doc.tex
+++ b/macros/latex/contrib/jsonparse/jsonparse-doc.tex
@@ -11,8 +11,8 @@
% This work has the LPPL maintenance status `maintained'.
%
\documentclass[a4paper]{article}
-\def\jsonparsefileversion{0.8.2}
-\def\jsonparsefiledate{26 April 2024}
+\def\jsonparsefileversion{0.8.3}
+\def\jsonparsefiledate{28 April 2024}
\usepackage[T1]{fontenc}
\usepackage{Alegreya}
@@ -182,8 +182,8 @@
\makedoctitle
[The jsonparse package]
{The \titlemacro{jsonparse} package}
- {An easy way to parse, store and access JSON data from files or strings in LaTeX documents}
- {Jasper Habicht}[E-mail: \href{mailto:mail@jasperhabicht.de}{mail@jasperhabicht.de}]
+ {A handy way to parse, store and access JSON data from files or strings in LaTeX documents}
+ {Jasper Habicht}[E-mail: \href{mailto:mail@jasperhabicht.de}{mail@jasperhabicht.de}. I am grateful to Joseph Wright, Jonathan P. Spratte and David Carlisle who helped me navigating the peculiarities of TeX and optimizing the code. Jason, the JSON parsing horse: Copyright 2024 Hannah Klöber.]
{Version \jsonparsefileversion, released on \jsonparsefiledate}
\changes{v0.3.0}{2024/04/08}{First public beta release.}
@@ -196,8 +196,11 @@
\changes{v0.7.1}{2024/04/20}{Access to first-level keys of object added.}
\changes{v0.8.0}{2024/04/24}{Internal rewrite, escaping procedures changed.}
\changes{v0.8.2}{2024/04/26}{Bug fixes, externalizing parsed data.}
+\changes{v0.8.3}{2024/04/28}{Escaping of characters with special meaning in TeX.}
\begin{document}
+\vspace*{-1cm}
+\noindent\hspace*{-3.5mm}\includegraphics[width=5cm]{jason/jason.pdf}
\printdoctitle
@@ -205,6 +208,8 @@
\section{Introduction}
+Hello guys, I am Jason, the JSON parsing horse. JSON data is my favorite thing to parse! But I found that converting JSON to TeX can be a bit tricky. Therefore, I created this package which I am happy to introduce to you.
+
The \macro{jsonparse} package provides a handy way to read in JSON data from files or strings in LaTeX documents, parse the data and store it in a user-defined token variable. The package allows accessing the stored data via a JavaScript-flavored syntax.
This package is still in a beta stage and not thoroughly tested. Bugs or improvements can be issued via GitHub at \url{https://github.com/jasperhabicht/jsonparse/issues}.
@@ -248,6 +253,21 @@ Using the control sequence \macro{\x}, it is possible to nest JSON strings into
\end{codeexamplecolumns}
\begin{macrodef}
+|escape|={<all>}
+|escape|={<none>}
+|escape|={<number sign>}
+|escape|={<dollar sign>}
+|escape|={<percent sign>}
+|escape|={<ampersand>}
+|escape|={<circumflex accent>}
+|escape|={<low line>}
+|escape|={<tilde>}
+\end{macrodef}
+The key \macro{escape} can be used to convert characters that don't require escaping in JSON but in TeX into their relevant TeX escape sequences. Apart from the backslash and curly braces that need to be escaped anyways, these are the number sign, the dollar sign, the percent sign, the ampersand, the circumflex accent, the low line and the tilde. The characters can be selected individually separated by a comma (for example \macro{escape={dollar sign, circumflex accent, low line}}. With \macro{escape={all}}, all escaping sequences are selected, with \macro{escape={none}}, none is selected.
+
+The naming of the relevant characters follows their Unicode names. However, \macro{hash} exists as alias for \macro{number sign}, \macro{dollar} as alias for \macro{dollar sign}, \macro{percent} for \macro{percent sign}, \macro{circumflex} for \macro{circumflex accent} and \macro{underscore} for \macro{low line}.
+
+\begin{macrodef}
replacement/|backspace|={<string>}
replacement/|formfeed|={<string>}
replacement/|linefeed|={<string>}
@@ -356,7 +376,7 @@ Parsing large JSON files can take quite a while. In order to speed up follow-up
\begin{macrodef}
|\JSONParsePut|{<token variable>}{<key>}[<JSON string>]
\end{macrodef}
-The commannd \macro{\JSONParsePut} is used by the externalization procedure to re-read already parsed JSON data to the main file. It essentially just adds a key-value pair to a property list (where the value part is read as string). Hence, it can also be used to append more entries to an already existing property list containing parsed JSON data.
+The command \macro{\JSONParsePut} is used by the externalization procedure to re-read already parsed JSON data to the main file. It just adds a key-value pair to the property list (where the value part is read as string). Hence, it can also be used to append more entries to an already existing property list containing parsed JSON data.
\subsection{Changing separators, output and other settings}\label{sec:settings}
diff --git a/macros/latex/contrib/jsonparse/jsonparse.sty b/macros/latex/contrib/jsonparse/jsonparse.sty
index 404e769ba7..680e89bfca 100644
--- a/macros/latex/contrib/jsonparse/jsonparse.sty
+++ b/macros/latex/contrib/jsonparse/jsonparse.sty
@@ -10,7 +10,7 @@
%
% This work has the LPPL maintenance status `maintained'.
%
-\ProvidesExplPackage {jsonparse} {2024-04-26} {0.8.2}
+\ProvidesExplPackage {jsonparse} {2024-04-28} {0.8.3}
{JSON Parse}
\bool_new:N \l__jsonparse_debug_mode_bool
@@ -51,6 +51,11 @@
Invalid ~ escape ~ sequence ~ #1 ~ in ~ key.
}
+\msg_new:nnn { jsonparse } { escape-char-not-found } {
+ \msg_error_text:n { jsonparse } \iow_newline:
+ Escape ~ character ~ #1 ~ not ~ found.
+}
+
\msg_new:nnn { jsonparse } { saving-external } {
\msg_info_text:n { jsonparse } \iow_newline:
Saving ~ external ~ file: ~ #1.
@@ -77,6 +82,22 @@
\str_new:N \l__jsonparse_carriage_return_str
\str_new:N \l__jsonparse_horizontal_tab_str
+\clist_new:N \l__jsonparse_escape_tex_chars_clist
+\clist_set:Nn \l__jsonparse_escape_tex_chars_clist {
+ number_sign ,
+ dollar_sign ,
+ percent_sign ,
+ ampersand ,
+ circumflex_accent ,
+ low_line ,
+ tilde
+}
+
+\str_new:N \l__jsonparse_escape_temp_str
+\clist_map_inline:Nn \l__jsonparse_escape_tex_chars_clist {
+ \bool_new:c { l__jsonparse_escape_ #1 _bool }
+}
+
\keys_define:nn { jsonparse } {
array ~ index ~ zero-based .bool_set:N = \l__jsonparse_array_index_zero_based_bool ,
array ~ index ~ zero-based .default:n = { true } ,
@@ -104,7 +125,50 @@
replacement / carriage ~ return .str_set:N = \l__jsonparse_carriage_return_str ,
replacement / carriage ~ return .initial:n = { ~ } ,
replacement / horizontal ~ tab .str_set:N = \l__jsonparse_horizontal_tab_str ,
- replacement / horizontal ~ tab .initial:n = { ~ }
+ replacement / horizontal ~ tab .initial:n = { ~ } ,
+ escape .code:n = {
+ \str_case:nnF {#1} {
+ { all } {
+ \clist_map_inline:Nn \l__jsonparse_escape_tex_chars_clist {
+ \bool_set_true:c { l__jsonparse_escape_ ##1 _bool }
+ }
+ }
+ { none } {
+ \clist_map_inline:Nn \l__jsonparse_escape_tex_chars_clist {
+ \bool_set_false:c { l__jsonparse_escape_ ##1 _bool }
+ }
+ }
+ } {
+ \clist_map_inline:nn {#1} {
+ \str_set:Nn \l__jsonparse_escape_temp_str {##1}
+ \str_replace_all:Nnn \l__jsonparse_escape_temp_str { ~ } { _ }
+ \bool_if_exist:cTF { l__jsonparse_escape_ \l__jsonparse_escape_temp_str _bool } {
+ \bool_set_true:c { l__jsonparse_escape_ \l__jsonparse_escape_temp_str _bool }
+ } {
+ \str_case:nnF {##1} {
+ { hash } {
+ \bool_set_true:c { l__jsonparse_escape_number_sign_bool }
+ }
+ { dollar } {
+ \bool_set_true:c { l__jsonparse_escape_dollar_sign_bool }
+ }
+ { percent } {
+ \bool_set_true:c { l__jsonparse_escape_percent_sign_bool }
+ }
+ { circumflex } {
+ \bool_set_true:c { l__jsonparse_escape_circumflex_accent_bool }
+ }
+ { underscore } {
+ \bool_set_true:c { l__jsonparse_escape_low_line_bool }
+ }
+ } {
+ \msg_error:nno { jsonparse } { escape-char-not-found }
+ {##1}
+ }
+ }
+ }
+ }
+ }
}
\NewDocumentCommand { \JSONParseSet } { m } {
@@ -121,6 +185,7 @@
\cs_generate_variant:Nn \tl_range:nnn { nne , nen }
\cs_generate_variant:Nn \tl_range:Nnn { Nne , Nen }
\cs_generate_variant:Nn \tl_remove_once:Nn { NV }
+\cs_generate_variant:Nn \tl_replace_all:Nnn { Non , Noe }
\cs_generate_variant:Nn \tl_replace_once:Nnn { Non }
\cs_generate_variant:Nn \tl_rescan:nn { no , ne }
\cs_generate_variant:Nn \tl_set:Nn { Ne }
@@ -132,6 +197,7 @@
\cs_generate_variant:Nn \prop_item:Nn { Ne , ce }
\cs_generate_variant:Nn \prop_put:Nnn { Nen , Nee }
\cs_generate_variant:Nn \iow_now:Nn { Ne }
+\cs_generate_variant:Nn \msg_error:nnn { nno }
\cs_generate_variant:Nn \msg_error:nnnn { nnoo }
\cs_generate_variant:Nn \msg_log:nnn { nne }
@@ -591,6 +657,27 @@
\tl_set:Ne \l__jsonparse_temp_tl {#1}
\cs_set_eq:NN \" \__jsonparse_tex_quote
\cs_set_eq:NN \\ \__jsonparse_tex_backslash
+ \bool_if:NT \l__jsonparse_escape_number_sign_bool {
+ \tl_replace_all:Noe \l__jsonparse_temp_tl { \c_hash_str } { \c_backslash_str \c_hash_str }
+ }
+ \bool_if:NT \l__jsonparse_escape_dollar_sign_bool {
+ \tl_replace_all:Noe \l__jsonparse_temp_tl { \c_dollar_str } { \c_backslash_str \c_dollar_str }
+ }
+ \bool_if:NT \l__jsonparse_escape_percent_sign_bool {
+ \tl_replace_all:Noe \l__jsonparse_temp_tl { \c_percent_str } { \c_backslash_str \c_percent_str }
+ }
+ \bool_if:NT \l__jsonparse_escape_ampersand_bool {
+ \tl_replace_all:Noe \l__jsonparse_temp_tl { \c_ampersand_str } { \c_backslash_str \c_ampersand_str }
+ }
+ \bool_if:NT \l__jsonparse_escape_circumflex_accent_bool {
+ \tl_replace_all:Non \l__jsonparse_temp_tl { \c_circumflex_str } { \textasciicircum }
+ }
+ \bool_if:NT \l__jsonparse_escape_low_line_bool {
+ \tl_replace_all:Noe \l__jsonparse_temp_tl { \c_underscore_str } { \c_backslash_str \c_underscore_str }
+ }
+ \bool_if:NT \l__jsonparse_escape_tilde_bool {
+ \tl_replace_all:Non \l__jsonparse_temp_tl { \c_tilde_str } { \textasciitilde }
+ }
\tl_rescan:no { } { \l__jsonparse_temp_tl }
\group_end:
}
@@ -670,6 +757,10 @@
\group_end:
}
+\tl_new:N \JSONParseArrayIndex
+\tl_new:N \JSONParseArrayKey
+\tl_new:N \JSONParseArrayValue
+
\NewDocumentCommand { \JSONParseArrayValuesMap } { s m m O{} m } {
\group_begin:
\jsonparse_filter:Nn #2 {#3}
diff --git a/macros/latex/contrib/l3packages/CHANGELOG.md b/macros/latex/contrib/l3packages/CHANGELOG.md
index b12b36ec76..cd9143da08 100644
--- a/macros/latex/contrib/l3packages/CHANGELOG.md
+++ b/macros/latex/contrib/l3packages/CHANGELOG.md
@@ -7,6 +7,12 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2024-05-08]
+
+### Changed
+- Prepare for kernel adjustments to templates:
+ `\IfInstanceExist(TF)` as alias for `\IfInstanceExists(TF)`
+
## [2024-03-14]
### Changed
@@ -133,7 +139,7 @@ this project uses date-based 'snapshot' version identifiers.
## [2021-05-07]
### Fixed
-- Implmentation of `\DeclareRestrictedTemplate`
+- Implementation of `\DeclareRestrictedTemplate`
- Incorrect use of restricted template in `xfrac`
## [2021-03-12]
@@ -253,7 +259,8 @@ this project uses date-based 'snapshot' version identifiers.
- Switch to ISO date format
- Improve cross-module use of internal functions
-[Unreleased]: https://github.com/latex3/latex3/compare/2024-03-14...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2024-05-08...HEAD
+[2024-05-08]: https://github.com/latex3/latex3/compare/2024-03-14...2024-05-08
[2024-03-14]: https://github.com/latex3/latex3/compare/2024-02-18...2024-03-14
[2024-02-18]: https://github.com/latex3/latex3/compare/2024-02-13...2024-02-18
[2024-02-13]: https://github.com/latex3/latex3/compare/2023-10-10...2024-02-13
diff --git a/macros/latex/contrib/l3packages/README.md b/macros/latex/contrib/l3packages/README.md
index 601e8d229a..10899672d6 100644
--- a/macros/latex/contrib/l3packages/README.md
+++ b/macros/latex/contrib/l3packages/README.md
@@ -1,6 +1,6 @@
# `l3packages`: Higher-level LaTeX3 Concepts (Deprecated)
-Release 2024-03-14
+Release 2024-05-08
## Overview
diff --git a/macros/latex/contrib/l3packages/l3keys2e-demo.tex b/macros/latex/contrib/l3packages/l3keys2e-demo.tex
index fda8fa40ff..a7565a7944 100644
--- a/macros/latex/contrib/l3packages/l3keys2e-demo.tex
+++ b/macros/latex/contrib/l3packages/l3keys2e-demo.tex
@@ -16,7 +16,7 @@
% Load the class with some options.
% The class itself recognises `option1', leaving `option2' and
-% `option3' as global optons which are not yet used.
+% `option3' as global options which are not yet used.
\documentclass[option1=check,option2=more stuff,option3=unused]
{l3keys2e-class}
diff --git a/macros/latex/contrib/l3packages/l3keys2e.dtx b/macros/latex/contrib/l3packages/l3keys2e.dtx
index 817d37a46c..2e5c419165 100644
--- a/macros/latex/contrib/l3packages/l3keys2e.dtx
+++ b/macros/latex/contrib/l3packages/l3keys2e.dtx
@@ -62,7 +62,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -154,7 +154,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2024-03-14}{}
+\ProvidesExplPackage{l3keys2e}{2024-05-08}{}
{LaTeX2e option processing using LaTeX3 keys}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/l3keys2e.pdf b/macros/latex/contrib/l3packages/l3keys2e.pdf
index ecf18342cf..df3821afb8 100644
--- a/macros/latex/contrib/l3packages/l3keys2e.pdf
+++ b/macros/latex/contrib/l3packages/l3keys2e.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xfp.dtx b/macros/latex/contrib/l3packages/xfp.dtx
index 8baebbfc19..fe8dcd51b1 100644
--- a/macros/latex/contrib/l3packages/xfp.dtx
+++ b/macros/latex/contrib/l3packages/xfp.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -171,7 +171,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfp}{2024-03-14}{}
+\ProvidesExplPackage{xfp}{2024-05-08}{}
{L3 Floating point unit}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/xfp.pdf b/macros/latex/contrib/l3packages/xfp.pdf
index 1bfdb01596..2097c2b079 100644
--- a/macros/latex/contrib/l3packages/xfp.pdf
+++ b/macros/latex/contrib/l3packages/xfp.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xparse.dtx b/macros/latex/contrib/l3packages/xparse.dtx
index 4b731d1e0f..62ac19ff25 100644
--- a/macros/latex/contrib/l3packages/xparse.dtx
+++ b/macros/latex/contrib/l3packages/xparse.dtx
@@ -67,7 +67,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -1079,7 +1079,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xparse}{2024-03-14}{}
+\ProvidesExplPackage{xparse}{2024-05-08}{}
{L3 Experimental document command parser}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/xparse.pdf b/macros/latex/contrib/l3packages/xparse.pdf
index 91a774d39f..bb31c0a5e6 100644
--- a/macros/latex/contrib/l3packages/xparse.pdf
+++ b/macros/latex/contrib/l3packages/xparse.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xtemplate.dtx b/macros/latex/contrib/l3packages/xtemplate.dtx
index 4aac33434a..7d20c6142f 100644
--- a/macros/latex/contrib/l3packages/xtemplate.dtx
+++ b/macros/latex/contrib/l3packages/xtemplate.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -704,12 +704,15 @@
\endinput
}
{%
- \ProvidesExplPackage{xtemplate}{2024-03-14}{}
+ \ProvidesExplPackage{xtemplate}{2024-05-08}{}
{L3 Experimental prototype document functions}
\long\protected\def\DeclareRestrictedTemplate#1#2#3#4{%
\DeclareTemplateCopy{#1}{#3}{#2}%
\EditTemplateDefaults{#1}{#3}{#4}%
}%
+ \let\IfInstanceExistT\IfInstanceExistsT
+ \let\IfInstanceExistF\IfInstanceExistsF
+ \let\IfInstanceExistTF\IfInstanceExistsTF
}
\ExplSyntaxOn
\cs_new_protected:Npn \DeclareObjectType #1#2
diff --git a/macros/latex/contrib/l3packages/xtemplate.pdf b/macros/latex/contrib/l3packages/xtemplate.pdf
index b52381f6dc..b70bd7c991 100644
--- a/macros/latex/contrib/l3packages/xtemplate.pdf
+++ b/macros/latex/contrib/l3packages/xtemplate.pdf
Binary files differ
diff --git a/macros/latex/contrib/lastpage/README b/macros/latex/contrib/lastpage/README
index 50b80f6b3a..4545b13a60 100644
--- a/macros/latex/contrib/lastpage/README
+++ b/macros/latex/contrib/lastpage/README
@@ -1,4 +1,4 @@
-README for lastpage package, 2023-10-14, v2.0e
+README for lastpage package, 2024-04-27, v2.1a
TABLE OF CONTENTS
@@ -50,7 +50,7 @@ the manual (lastpage.pdf), the example (lastpage-example.tex),
the compiled example (lastpage-example.pdf),
driver (lastpage.drv), lastpage.dtx,
installation file (lastpage.ins),
-the style files (lastpage.sty, lastpage209.sty, lastpage23.sty,
+the style files (lastpage.sty, lastpage209.sty, lastpage2e.sty,
lastpageclassic.sty, lastpagemodern.sty),
and this README, already sorted in a TDS tree:
https://mirror.ctan.org/install/macros/latex/contrib/lastpage.tds.zip
@@ -83,7 +83,7 @@ b) Generate the package and driver files:
c) Install the files "*.sty" in your TDS tree:
cp lastpage.sty TDS:tex/latex/lastpage/
cp lastpage209.sty TDS:tex/latex/lastpage/
- cp lastpage23.sty TDS:tex/latex/lastpage/
+ cp lastpage2e.sty TDS:tex/latex/lastpage/
cp lastpageclassic.sty TDS:tex/latex/lastpage/
cp lastpagemodern.sty TDS:tex/latex/lastpage/
Replace "TDS:" by the prefix of your TDS tree
diff --git a/macros/latex/contrib/lastpage/lastpage-example.pdf b/macros/latex/contrib/lastpage/lastpage-example.pdf
index 1062a3273e..6d1c748525 100644
--- a/macros/latex/contrib/lastpage/lastpage-example.pdf
+++ b/macros/latex/contrib/lastpage/lastpage-example.pdf
Binary files differ
diff --git a/macros/latex/contrib/lastpage/lastpage.dtx b/macros/latex/contrib/lastpage/lastpage.dtx
index ed088fea50..104d6b8418 100644
--- a/macros/latex/contrib/lastpage/lastpage.dtx
+++ b/macros/latex/contrib/lastpage/lastpage.dtx
@@ -1,19 +1,18 @@
% \iffalse meta-comment
%
% File: lastpage.dtx
-% Version: 2023-10-14 v2.0e
+% Version: 2024-04-27 v2.1a
% Info: Refers to last page's name
%
-% Copyright © 2010 - 2023 by
+% Copyright © 2010 - 2024 by
% H.-Martin Münch <Martin dot Muench at Uni-Bonn dot de>
% Portions of code copyrighted by other people as marked.
%
% This package was invented by Jeffrey P. Goldberg.
% I thought that a replacement was needed and therefore created the pageslts package,
-% https://ctan.org/pkg/pageslts
-% . Nevertheless, for compatibility with existing documents/packages as well as for
-% the low amount of resources needed by the lastpage package (no new counter!),
-% I updated this package.
+% https://ctan.org/pkg/pageslts. Nevertheless, for compatibility with existing
+% documents/packages as well as for the low amount of resources needed by the
+% lastpage package (no new counter!), I updated this package.
% Thanks go to Jeffrey P. Goldberg for allowing me to do this.
%
% While this package allows for things like "Page \thepage{} of \pageref{LastPage}"
@@ -66,7 +65,7 @@
\input docstrip.tex
\Msg{**********************************************************************}
\Msg{* Installation *}
-\Msg{* Package: lastpage 2023-10-14 v2.0e Refers to last page's name (HMM)*}
+\Msg{* Package: lastpage 2024-04-27 v2.1a Refers to last page's name (HMM)*}
\Msg{**********************************************************************}
\keepsilent
@@ -78,10 +77,10 @@
This is a generated file.
Project: lastpage
-Version: 2023-10-14 v2.0e
+Version: 2024-04-27 v2.1a
Info: Refers to last page's name
-Copyright (C) 2010 - 2023 by
+Copyright (C) 2010 - 2024 by
H.-Martin Muench <Martin dot Muench at Uni-Bonn dot de>
Portions of code copyrighted by other people as marked.
@@ -184,9 +183,9 @@ In memoriam
%
% \begin{macrocode}
%<*driver>
-\NeedsTeXFormat{LaTeX2e}[2022-11-01]
+\NeedsTeXFormat{LaTeX2e}[2023-11-01]
\ProvidesFile{lastpage.drv}%
- [2023-10-14 v2.0e Refers to last page's name (HMM)]
+ [2024-04-27 v2.1a Refers to last page's name (HMM)]
\documentclass{ltxdoc}[2023/03/28]% v2.1j Standard LaTeX documentation class
\usepackage{holtxdoc}[2019/12/09]% v0.30 Private additional ltxdoc support (HO)
\hypersetup{%
@@ -251,7 +250,7 @@ In memoriam
% \DoNotIndex{\today,\upshape,\url,\usepackage,\value,\verb,\wd,\write}
%
% \title{The \xpackage{lastpage} package}
-% \date{2023-10-14 v2.0e}
+% \date{2024-04-27 v2.1a}
% \author{H.-Martin Münch\\\xemail{Martin.Muench at Uni-Bonn.de}\\
% invented by Jeffrey P. Goldberg\\\xemail{jeffrey+news at goldmark.org}}
%
@@ -370,7 +369,7 @@ In memoriam
% \section{Some \textsc{Warnings}\label{sec:warn}}
% \subsection{\texttt{\textbackslash AtEndDocument}\label{ssec:aed}}
% \indent {\bfseries |\AtEndDocument| is not used by the \pkg{lastpagemodern.sty}
-% version of the lastpage package, requiring \LaTeX -format 2022-11-01
+% version of the lastpage package, requiring \LaTeX -format 2023-06-01
% or newer. Instead |\AddToHook{enddocument/afterlastpage}| is used
% and the problem does not arise.}
% \bigskip
@@ -413,7 +412,7 @@ In memoriam
% \subsection{Interaction with ancient versions of the \xpackage{endfloat} package\label{sec:endfloat}}
%
% \indent {\bfseries |\AtEndDocument| is not used by the \pkg{lastpagemodern.sty}
-% version of the lastpage package, requiring \LaTeX -format 2022-11-01
+% version of the lastpage package, requiring \LaTeX -format 2023-06-01
% or newer. Instead |\AddToHook{enddocument/afterlastpage}| is used
% and the problem does not arise.}
%
@@ -552,22 +551,13 @@ In memoriam
% (with appropriate options) can do this.
%
% \subsection{Other packages manipulating \texttt{\textbackslash lastpage@putlabel}}
-% The \xpackage{hyperref} package redefined the |\lastpage@putlabel| command,
-% and the \xpackage{revtex4} class still redefines the |\lastpage@putlabel| command,
-% and the \xpackage{hyperref} package redefined the |\lastpage@putlabel| command,
-% if the \xpackage{revtex4} class was used, and the \xpackage{pageslts} package
+% The \xpackage{revtex4} class redefines the |\lastpage@putlabel| command
+% (with outdated two arguments), and the \xpackage{pageslts} package
% \textquotedblleft kills\textquotedblright{} the |\lastpage@putlabel| command,
% because that package uses more advanced labels.\newline
-% In my humble opinion it would be preferably if one package (the original one,
-% i.\,e. \xpackage{lastpage}) would do the job right, all others packages would
-% check for the version of that package, and if an old version is found,
-% an error (or at least a warning) message about the use of an outdated
-% package is given, and \textit{then} as
-% \textquotedblleft last aid\textquotedblright{} the command of the outdated
-% package is redefined.\newline
-% Therefore here none of the definitions or commands of the other packages
-% is altered, but |\lastpage@putlabel| was replaced by |\lastpage@putl@bel|.
-% Because |\lastpage@putlabel| is no longer called, now there should not be any
+% None of the definitions or commands of the other packages are altered,
+% but |\lastpage@putlabel| was replaced by |\lastpage@putl@bel|.
+% Because \linebreak |\lastpage@putlabel| is no longer called, now there should not be any
% double definitions of the \texttt{lastpage} label.
% \newpage
%
@@ -740,9 +730,9 @@ In memoriam
\message{^^JLaTeX Info: Executing hook `enddocument/afterlastpage'.}}%
}{\AtEndDocument{\message{^^JLaTeX Info: Executing hook `AtEndDocument'.}}%
}
-\usepackage[draft]{showkeys}[2023/05/11]% v3.19 Show cite and label keys (DPC, MH)
+\usepackage[draft]{showkeys}[2023/07/08]% v3.19 Show cite and label keys (DPC, MH)
%% Use final instead of draft to hide the keys. %%
-\usepackage[pdfpagelabels=true,hyperindex=false]{hyperref}[2023-07-08]% v7.01b
+\usepackage[pdfpagelabels=true,hyperindex=false]{hyperref}[2024-01-20]% v7.01h
%% Hypertext links for LaTeX
\hypersetup{extension=pdf,%
plainpages=false,%
@@ -756,7 +746,7 @@ In memoriam
pdfpagelayout=SinglePage%
}
\@ifpackageloaded{hyperref}{}{\usepackage{url}[2013/09/16]}% v3.4
-\usepackage{lastpage}[2023-10-14]% v2.0e
+\usepackage{lastpage}[2024/04/27]% v2.1a
\renewcommand{\@evenfoot}{%
\normalsize\slshape \today\hfil \upshape %
page \thepage{} of \pageref{LastPage}}
@@ -768,7 +758,7 @@ In memoriam
\section*{Example for lastpage}
\markboth{Example for lastpage}{Example for lastpage}
This example demonstrates the use of package\newline
-\textsf{lastpage}, v2.0e as of 2023-10-14 (HMM; JPG).\newline
+\textsf{lastpage}, v2.1a as of 2024-04-27 (HMM; JPG).\newline
The package takes no options.\newline
For more details please see the documentation!\newline
@@ -793,7 +783,7 @@ trademark owner. There is no intention of infringement; the
usage is to the benefit of the trademark owner.\newline
\textbf{Tip}: Use \textit{logical page numbers}
-for the display of the pdf (in Adobe Acrobat Reader 2023.006.20320:
+for the display of the pdf (in Adobe Acrobat Reader 2024.002.20687:
Edit $>$ Preferences $>$ Page Display $>$
Page Content and Information: Use logical page numbers)!\newline
@@ -866,7 +856,7 @@ Last page's name (LastPage): \pageref{LastPage}
With modern \LaTeX{} it is possible to say:
\begin{quote}
\begin{verbatim}
-\NeedsTeXFormat{LaTeX2e}[2023-06-01]
+\NeedsTeXFormat{LaTeX2e}[2023-11-01]
\documentclass{article}
\pagenumbering{fnsymbol}
\begin{document}
@@ -904,7 +894,7 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \DescribeMacro{lastpage.sty}
% We first need to determine whether we are on \TeX~2.09 or \LaTeX2e.\newline
% (That line, which is too long for the documentation, reads:\newline
-% |\def\loadlastpage{\ProvidesPackage{lastpage}[2023/10/14 v2.0e lastpage:|\linebreak
+% |\def\loadlastpage{\ProvidesPackage{lastpage}[2024/04/27 v2.1a lastpage:|\linebreak
% | 2.09 or 2e? (HMM)]\relax\RequirePackage{lastpage2e}}|.)
%
% \begin{macrocode}
@@ -912,7 +902,7 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
%% Part of the "lastpage" package
%% loads either lastpage2.09.sty for TeX 2.09 or lastpage2e.sty for LaTeX 2e
%% with code from https://groups.google.com/g/comp.text.tex/c/-Qmhj1ZI4xM
-\def\loadlastpage{\ProvidesPackage{lastpage}[2023/10/14 v2.0e lastpage: 2.09 or 2e? (HMM)]\relax\RequirePackage{lastpage2e}}
+\def\loadlastpage{\ProvidesPackage{lastpage}[2024/04/27 v2.1a lastpage: 2.09 or 2e? (HMM)]\relax\RequirePackage{lastpage2e}}
\begingroup \expandafter \ifx \csname documentclass\endcsname\relax
\endgroup \expandafter \input{lastpage209.sty}
\else \endgroup \expandafter \loadlastpage
@@ -952,9 +942,9 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
%<*lastpage2e>
%% Part of the "lastpage" package
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{lastpage2e}[2023/10/14 v2.0e %
+\ProvidesPackage{lastpage2e}[2024/04/27 v2.1a %
Decide which 2e lastpage version to use (HMM)]
-\@ifl@t@r\fmtversion{2022/11/01}{\RequirePackage{lastpagemodern}}{%
+\@ifl@t@r\fmtversion{2023/06/01}{\RequirePackage{lastpagemodern}}{%
\RequirePackage{lastpageclassic}}
\message{^^J}
%</lastpage2e>
@@ -967,7 +957,7 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
%<*lastpageclassic>
%% Part of the "lastpage" package
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{lastpageclassic}[2023/10/14 v2.0e %
+\ProvidesPackage{lastpageclassic}[2024/04/27 v2.1a %
Refers to last page's name (HMM; JPG)]
%% allows for things like "Page \thepage{} of \pageref{LastPage}"
%% to get "Page 7 of 9"
@@ -1384,8 +1374,8 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \begin{macrocode}
%<*lastpagemodern>
%% Part of the "lastpage" package
-\NeedsTeXFormat{LaTeX2e}[2022-11-01]
-\ProvidesPackage{lastpagemodern}[2023-10-14 v2.0e %
+\NeedsTeXFormat{LaTeX2e}[2023-06-01]
+\ProvidesPackage{lastpagemodern}[2024-04-27 v2.1a %
Refers to last page's name (HMM; JPG)]
%% allows for things like "Page \thepage{} of \pageref{LastPage}"
%% to get "Page 7 of 9" or "Page VII of IX";
@@ -1413,58 +1403,33 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \end{macrocode}
%
-% People use the label |LastPage| for calculations, for example with
-% \begin{quote}
-%\begin{verbatim}
-%\getrefbykeydefault{LastPage}{page}{0}
-%\end{verbatim}
-% \end{quote}
-% and with
-% \begin{quote}
-%\begin{verbatim}
-%\getpagerefnumber{LastPage}
-%\end{verbatim}
-% \end{quote}
-% (using the \pkg{refcount} package). On the one hand, direct calculations do not work,
-% if the page \textquotedblleft number\textquotedblright{} is not
-% a plain arabic number (1, 2, 3,\ldots) but |alph| (a, b, c,\ldots), |Alph| (A, B, C,\ldots),
-% |roman| (i, ii, iii, iv,\ldots), |Roman| (I, II, III, IV,\ldots),
-% |fnsymbol| (foot note symbols: \textasteriskcentered{} (asterisk), \textdagger{} (dagger),
-% \textdaggerdbl{} (double dagger), \textsection{} (section symbol),\ldots) or some other fancy name.
-% On the other hand, if the page number \emph{is} a plain arabic number,
-% calculations do work, if that plain number can be extracted from the label.
-% To handle non-numeric page \textquotedblleft number\textquotedblright{} as well as providing
-% extractable numeric page numbers, we need to determine (later), whether a page number is numeric or not:
-%
-% \begin{macro}{\lastpage@gobbleminus}
+% \begin{macro}{\lastpage@IfNumericTF}
+% |\lastpage@IfNumericTF| was needed to determine whether a page number was numeric or not.
+% Although it is no longer used, I am reluctant to remove it because it may have been used
+% in other places in documents.
+%
% \begin{macrocode}
\newcommand\lastpage@gobbleminus[1]{\ifx-#1\else#1\fi}
-%% from https://texfaq.org/FAQ-isitanum
-
% \end{macrocode}
-% \end{macro}
+% which is from \url{https://texfaq.org/FAQ-isitanum},
% \begin{macrocode}
\newcounter{lastpagecount}
-
% \end{macrocode}
-% \begin{macro}{\lastpage@IfNumericTF}
+% and similar to \url{https://tex.stackexchange.com/a/12811/17119}
% \begin{macrocode}
\newcommand{\lastpage@IfNumericTF}[3]{%
-%% similar to https://tex.stackexchange.com/a/17119
\sbox\z@{\c@lastpagecount=0\lastpage@gobbleminus{#1}\relax}%
\ifdim\wd0>\z@\relax#3% is not numeric
\else#2% is numeric
-\fi%
-}
+\fi}
% \end{macrocode}
% \end{macro}
%
% \DescribeMacro{\AddToHook\{begindocument/end\}}
% \indent |\lastpage@putlabel|, used by older versions of this package,
-% is redefined e.\,g. by \xpackage{revtex}, \xpackage{frenchle},
-% \xpackage{PPRcorners}, and old versions of \xpackage{hyperref}.
-% While now |\lastpage@putl@bel| is used instead, \xpackage{revtex}
+% is/was redefined by other packages.
+% While now |\lastpage@putl@bel| is used instead, other packages
% could also define a label \texttt{LastPage},
% which then would be multiply defined. (Which is no big issue,
% if it is associated with the same page.) Therefore we define
@@ -1483,8 +1448,8 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% (thanks to Ulrike Fischer for the report).
%
% \begin{macrocode}
-%% From https://tex.stackexchange.com/a/542425 with thanks to
-%% Prof. Enrico Gregorio
+%% from https://tex.stackexchange.com/a/12811/542425
+%% with thanks to Prof. Enrico Gregorio
\long\def\protected@iwrite#1#2#3{%
\begingroup%
#2%
@@ -1498,42 +1463,15 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \end{macrocode}
% \end{macro}
%
-% We need two macros for writing numeric and non-numeric page
-% \textquotedblleft numbers\textquotedblright{} into the \xfile{aux} file:
-%
-% \begin{macro}{\lastpage@numeric}
+% \begin{macro}{\lastpage@rmpage}
+% Just once we need |\@currentHpage| without the \mbox{\textquotedblleft |page.|\textquotedblright :}
% \begin{macrocode}
-\newcommand{\lastpage@numeric}{\protected@iwrite\@auxout{}{%
- \string\newlabel{LastPage}{%
- {\@currentlabel}%
- {\thepage}%
- {\@currentlabelname}%
- {\IfPackageLoadedTF{hyperref}{\ifHy@pageanchor page.\Hy@temp\fi%
- }{\@currentHref}}%
- {\@kernel@reserved@label@data}}}%
- }
+%% similar to https://tex.stackexchange.com/a/12811/6865
+\def\lastpage@rmpage#1{\expandafter\lastpage@currentH#1\relax}
+\def\lastpage@currentH#1.#2\relax{#2}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\lastpage@nonnumeric}
-% \begin{macrocode}
-\newcommand{\lastpage@nonnumeric}{\protected@iwrite\@auxout{}{%
- \string\newlabel{LastPage}{%
- {\@currentlabel}%
- {\IfPackageLoadedTF{hyperref}{\string\begingroup%
- \string\pdfstringdefDisableCommands{\string\let%
- \string\TextOrMath\string\@firstoftwo}\thepage%
- \string\endgroup%
- }{\thepage}}%
- {\@currentlabelname}%
- {\IfPackageLoadedTF{hyperref}{\ifHy@pageanchor page.\Hy@temp\fi%
- }{\@currentHref}}%
- {\@kernel@reserved@label@data}}}%
- }
-
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\lastpage@putl@bel}
% \indent This command does the writing of the label.
% If the \xpackage{pageslts} package is used, this \xpackage{lastpage} package
@@ -1544,22 +1482,28 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
\newcommand{\lastpage@putl@bel}{%
\IfPackageLoadedTF{pageslts}{\relax}{%
% \end{macrocode}
-%
-% \noindent Otherwise the label is set:\newpage
-%
+% \noindent Otherwise the label is set:
% \noindent If the \xpackage{hyperref} package is used, but page-anchors are disabled,
% the hyperlinking will not work. (The warning will also be shown, when only
% |\pageref*{LastPage}| is used (or neither one), but without messing with |\pageref|
% we cannot detect this.)
%
% \begin{macrocode}
- \IfPackageLoadedTF{hyperref}{\ifHy@pageanchor\else%
- \PackageWarningNoLine{lastpage}{%
- The \string\pageref{LastPage} link does not work\MessageBreak%
- using hyperref with disabled option `pageanchor'.\MessageBreak%
- Better enable `pageanchor' or use\MessageBreak%
- \string\pageref*{LastPage} (not generating a link)%
- }\fi}{}%
+ \IfPackageLoadedTF{hyperref}{%
+ \IfPackageAtLeastTF{hyperref}{2023-11-07}{\relax}{%
+ \PackageError{lastpage}{hyperref package version too old}{%
+ required version: 2023-11-07 or newer, found version:\MessageBreak%
+ \csname ver@hyperref.sty\endcsname\MessageBreak%
+ Update hyperref or use lastpageclassic.sty instead of\MessageBreak%
+ lastpagemodern.sty!}}%
+ \ifHy@pageanchor\else%
+ \PackageWarningNoLine{lastpage}{%
+ The \string\pageref{LastPage} link does not work\MessageBreak%
+ using hyperref with disabled option `pageanchor'.\MessageBreak%
+ Better enable `pageanchor' or use\MessageBreak%
+ \string\pageref*{LastPage} (not generating a link)}%
+ \fi%
+ }{}%
\begingroup%
% \end{macrocode}
%
@@ -1577,65 +1521,25 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% may be no more invocations of the output routines.
% To force the write out, we need to do an |\immediate| protected write
% into the \xfile{aux} file.
-%
-% \begin{macrocode}
- \IfPackageLoadedTF{hyperref}{%
- % with code from \Hy@EveryPageAnchor of the hyperref package,
- % 2023-07-08 v7.01b
- \ifHy@pageanchor%
- \ifHy@hypertexnames%
- \ifHy@plainpages%
- \def\Hy@temp{\the\c@page}%
- \def\Hy@TempPageAnchor{\hyper@@anchor{page.\the\c@page}}%
- \Hy@PageAnchorSlidesPlain%
- \else%
- % No \begingroup, because we are in a group anyway.
- \let\@number\@firstofone%
- \Hy@unicodefalse%
- \Hy@PageAnchorSlide%
- \pdfstringdef\@the@H@page{\thepage}%
- % No \endgroup, because we are in a group anyway.
- \EdefUnescapeString\@the@H@page{\@the@H@page}%
- \def\Hy@TempPageAnchor{\hyper@@anchor{page.\@the@H@page}}%
- \def\Hy@temp{\@the@H@page}%
- \fi%
- \else%
- % NOT! \Hy@GlobalStepCount\Hy@pagecounter
- \def\Hy@TempPageAnchor{\hyper@@anchor{page.\the\Hy@pagecounter}}%
- \def\Hy@temp{\the\Hy@pagecounter}%
- \fi%
- \fi%
- }{}%
- \IfFormatAtLeastTF{2023/06/01}{%
-% \end{macrocode}
-%
-% \noindent The |\label| command has been extended, see \LaTeX{} News Issue~37,
-% June~2023 (\LaTeX{} release 2023-06-01),
-% \url{https://www.latex-project.org/news/latex2e-news/ltnews37.pdf}.
-%
-% Here we need to distinguish between numeric page numbers, which shall be extractable,
-% and non-numeric ones, which need some protection:
% \begin{macrocode}
- \lastpage@IfNumericTF{\thepage}{\lastpage@numeric}{\lastpage@nonnumeric}%
- }{\IfPackageLoadedTF{hyperref}{\protected@iwrite\@auxout{}{%
- \string\newlabel{LastPage}{{}{\thepage}{}{%
- \ifHy@pageanchor page.\Hy@temp\fi}{}}}%
- }{\IfPackageLoadedTF{nameref}{\protected@iwrite\@auxout{}{%
- \string\newlabel{LastPage}{{}{\thepage}{}{}{}}}%
- }{\protected@iwrite\@auxout{}{\string\newlabel{LastPage}{%
- {}{\thepage}}}%
- }%
- }%
- }%
+ \protected@iwrite\@auxout{}{\string\newlabel{LastPage}{%
+ {\@currentlabel}{\thepage}{\@currentlabelname}%
+ {\IfPackageLoadedTF{hyperref}{\ifHy@pageanchor\@currentHpage\fi%
+ }{\@currentHref}}%
+ {\@kernel@reserved@label@data}}%
+ }%
% \end{macrocode}
-%
+% \pagebreak
% \noindent We also save the values, so that we can later (next rerun) check,
% whether they have been saved in the \xfile{aux} file.
%
% \begin{macrocode}
- \protected@iwrite\@auxout{}{\string\gdef\string\lastpage@lastpage{\thepage}}%
- \gdef\lastpage@Hy{\IfPackageLoadedTF{hyperref}{\ifHy@pageanchor\Hy@temp\fi}{}}%
- \protected@iwrite\@auxout{}{\string\gdef\string\lastpage@lastpageHy{\lastpage@Hy}}%
+ \protected@iwrite\@auxout{}{%
+ \string\gdef\string\lastpage@lastpage{\thepage}}%
+ \gdef\lastpage@Hy{\IfPackageLoadedTF{hyperref}{%
+ \ifHy@pageanchor\lastpage@rmpage{\@currentHpage}\fi}{}}%
+ \protected@iwrite\@auxout{}{%
+ \string\gdef\string\lastpage@lastpageHy{\lastpage@Hy}}%
% \end{macrocode}
%
% \noindent After the write-out we restore the page number again,
@@ -1691,7 +1595,6 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \end{macrocode}
% \end{macro}
-% \newpage
%
% \begin{macro}{\lastpage@fileswtestHy}
% \indent \hspace*{2em}When the \xpackage{hyperref} package has been loaded,
@@ -1702,7 +1605,7 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \begin{macrocode}
\newcommand{\lastpage@fileswtestHy}{%
\ifHy@pageanchor%
- \lastpage@fileswtest{\Hy@temp}{\lastpage@lastpageHy}%
+ \lastpage@fileswtest{\@currentHpage}{\@the@H@page}%
\else%
\lastpage@fileswtest{\empty}{\lastpage@lastpageHy}%
\fi%
@@ -1789,7 +1692,7 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \begin{description}
% \item[-] \TeX, \url{https://www.CTAN.org}
%
-% \item[-] package \xpackage{lastpage}, 2023-10-14, v2.0e,
+% \item[-] package \xpackage{lastpage}, 2024-04-27, v2.1a,
% \url{https://ctan.org/pkg/lastpage}
% \end{description}
%
@@ -1799,10 +1702,10 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \begin{description}
% \item[-] \TeX-format \LaTeX{}, v2.09
%
-% \item[-] package \xpackage{lastpage209}, 2023-10-14, v2.0e,
+% \item[-] package \xpackage{lastpage209}, 2024-04-27, v2.1a,
% \url{https://ctan.org/pkg/lastpage}
% \end{description}
-% and does not work with \xpackage{hyperref}, which needs \LaTeX2e{}.
+% and does not work with \xpackage{hyperref}, which needs \LaTeX2e{}.\smallskip
%
% \DescribeMacro{lastpage2e.sty}
% The |lastpage2e.sty| for \LaTeXe{} (i.\,e. each document using
@@ -1811,7 +1714,7 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \item[-] \TeX-format \LaTeXe{} 1994/12/01 or newer,
% \url{https://www.CTAN.org}
%
-% \item[-] package \xpackage{lastpage}, 2023-10-14, v2.0e,
+% \item[-] package \xpackage{lastpage}, 2024-04-27, v2.1a,
% \url{https://ctan.org/pkg/lastpage}
% \end{description}
%
@@ -1819,39 +1722,42 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% The |lastpageclassic.sty| for \LaTeXe{} (i.\,e. each document using
% the \xpackage{lastpageclassic} package) requires:
% \begin{description}
-% \item[-] \TeX-format \LaTeXe{} between 1994/12/01 and 2022/11/01,\newline
+% \item[-] \TeX-format \LaTeXe{} between 1994/12/01 and 2023-05-31,\newline
% \url{https://www.CTAN.org}
%
-% \item[-] package \xpackage{lastpage}, 2023-10-14, v2.0e,
+% \item[-] package \xpackage{lastpage}, 2024-04-27, v2.1a,
% \url{https://ctan.org/pkg/lastpage}
% \end{description}
% and can use
% \begin{description}
% \item[-] package \xpackage{hyperref}, 2023-07-08, v7.01b,
-% \url{https://ctan.org/pkg/hyperref}
+% \url{https://ctan.org/pkg/hyperref}\newline
+% (probably also some older and newer versions)
% \end{description}
%
% \DescribeMacro{lastpagemodern.sty}
% The |lastpagemodern.sty| for \LaTeXe{} (i.\,e. each document using
% the \xpackage{lastpagemodern} package) requires:
% \begin{description}
-% \item[-] \TeX-format \LaTeXe{} 2022-11-01, better yet 2023-06-01 or newer,\newline
+% \item[-] \TeX-format \LaTeXe{} 2023-06-01 or newer,\newline
% \url{https://www.CTAN.org}
%
-% \item[-] package \xpackage{lastpage}, 2023-10-14, v2.0e,
+% \item[-] package \xpackage{lastpage}, 2024-04-27, v2.1a,
% \url{https://ctan.org/pkg/lastpage}
% \end{description}
% and can use
% \begin{description}
-% \item[-] package \xpackage{hyperref}, 2023-07-08, v7.01b,
+% \item[-] package \xpackage{hyperref}, 2023-11-07 and newer
+% (tested with: 2024-01-20, v7.01h),
% \url{https://ctan.org/pkg/hyperref}
% \end{description}
+% \pagebreak
%
% \DescribeMacro{lastpage-example.tex}
% The |lastpage-example.tex| requires the same file as all
% documents using the \xpackage{lastpage} package, i.\,e.
% \begin{description}
-% \item[-] package \xpackage{lastpage}, 2023-10-14, v2.0e,
+% \item[-] package \xpackage{lastpage}, 2024-04-27, v2.1a,
% \url{https://ctan.org/pkg/lastpage}\newline
% (Well, it is the example file for this package, and because you are reading the
% documentation for the \xpackage{lastpage} package, it can be assumed that you already
@@ -1862,10 +1768,10 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \item[-] class \xpackage{article}, 2023-05-17, v1.4n, from \xpackage{classes}:
% \url{https://ctan.org/pkg/classes}
%
-% \item[-] package \xpackage{showkeys}, 2023-05-11, v3.19,
+% \item[-] package \xpackage{showkeys}, 2023-07-08, v3.19,
% \url{https://ctan.org/pkg/showkeys}
%
-% \item[-] package \xpackage{hyperref}, 2023-07-08, v7.01b,
+% \item[-] package \xpackage{hyperref}, 2024-01-20, v7.01h,
% \url{https://ctan.org/pkg/hyperref}
% \end{description}
%
@@ -1886,7 +1792,7 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \xpackage{fancyheadings}), but because they were mentioned, also they are listed
% here:
% \begin{description}
-% \item[-] package \xpackage{fancyhdr}, 2022-11-09, v4.1,
+% \item[-] package \xpackage{fancyhdr}, 2024/04/23, v4.2,
% \url{https://ctan.org/pkg/fancyhdr}
%
% \item[-] package \xpackage{nccfancyhdr}, 2004/12/07, v1.1,
@@ -1929,7 +1835,7 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \item[-] package \xpackage{zref}, 2023-09-14, v2.35,
% \url{https://ctan.org/pkg/zref}
%
-% \item[-] class \xpackage{memoir}, 2023-08-21, v3.8.1,
+% \item[-] class \xpackage{memoir}, 2024-01-26, v3.8.2,
% \url{https://ctan.org/pkg/memoir}.
% \end{description}
%
@@ -1971,13 +1877,13 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \end{description}
% which additionally contains\\
% \begin{tabular}{ll}
-% lastpage.ins & The installation file.\\
-% lastpage.drv & The driver to generate the documentation.\\
-% lastpage.sty & The \xext{sty}le file.\\
-% lastpage209.sty & The \xext{sty}le file for \LaTeX2.09{} \textbf{only}.\\
-% lastpage2e.sty & The \xext{sty}le file to determine which 2e-style to use.\\
-% lastpageclassic.sty & The \xext{sty}le file for older \LaTeX-formats.\\
-% lastpagemodern.sty & The \xext{sty}le file for the recent \LaTeX-format.\\
+% lastpage.ins & The \texttt{ins}tallation file.\\
+% lastpage.drv & The \mbox{\texttt{dr}i\texttt{v}er} to generate the documentation.\\
+% lastpage.sty & The \texttt{sty}le file.\\
+% lastpage209.sty & The \texttt{sty}le file for \LaTeX2.09{} \textbf{only}.\\
+% lastpage2e.sty & The \texttt{sty}le file to determine which 2e-style to use.\\
+% lastpageclassic.sty & The \texttt{sty}le file for older \LaTeX-formats.\\
+% lastpagemodern.sty & The \texttt{sty}le file for the recent \LaTeX-format.\\
% lastpage-example.tex & The example file.%
% \end{tabular}
%
@@ -2131,12 +2037,10 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% inventing the \xpackage{lastpage} package as well as for allowing me
% to update it. Further I would like to thank \textsc{Heiko Oberdiek}
% for providing a~lot~(!) of useful packages (from which I also learned everything
-% I know about creating a file in \xfile{dtx} format, OK, say it: copying),
-% and the \Newsgroup{comp.text.tex} and \Newsgroup{de.comp.text.tex}
-% newsgroups for their help in all things \TeX{}. Thanks for bug reports
-% to \textsc{Ulrike Fischer} (twice), \textsc{Sebastian Bank}, \textsc{James Hedges},
-% \textsc{Mikhail Titov}, \textsc{Micha\l{} Herman}, \textsc{Matteo Gamboz}, and
-% \textsc{James Small}.
+% I know about creating a file in \xfile{dtx} format, OK, say it: copying).
+% Thanks for bug reports go to \textsc{Ulrike Fischer} (twice),
+% \textsc{Sebastian Bank}, \textsc{James Hedges}, \textsc{Mikhail Titov},
+% \textsc{Micha\l{} Herman}, \textsc{Matteo Gamboz}, and \textsc{James Small}.
% Thanks to \textsc{Sven Siegmund} for pointing out a necessary further
% explanation in the documentation.
%
@@ -2315,7 +2219,8 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \item Replaced |\immediate\write| by a form of (pseudo-code!) |\immediate\protected@write|.
% (Thanks to \textsc{Ulrike Fischer} for the error report and solution!)
% \item Update of the |\lastpage@putl@bel| code to \pkg{hyperref} 2023-07-08, v7.01b,
-% which now allows fnsymbol as page numbering scheme.
+% which now allows fnsymbol as page numbering scheme (while links to, for example,
+% a page named $\|$ still do not work).
% \end{Version}
% \begin{Version}{2023-10-06 v2.0d}
% \item For plain arabic page numbers only, \pkg{lastpage} again writes the page number
@@ -2325,6 +2230,13 @@ To see the content of the \texttt{enddocument/afterlastpage}-hook
% \begin{Version}{2023-10-14 v2.0e}
% \item Replaced a |\PackageError| by |\PackageWarningNoLine| as suggested by \textsc{Ulrike Fischer}.
% \end{Version}
+% \begin{Version}{2024-04-27 v2.1a}
+% \item Utilizes the new |\@currentHpage| provided by the \LaTeX -kernel.
+% \item The issue with |\thepage| (former |\lastpage@nonnumeric| command) has has been fixed
+% at 2023-11-07, \url{https://github.com/latex3/hyperref/issues/303}.
+% \item |\lastpage@IfNumericTF| is no longer needed, but has not been removed
+% so as not to break older documents that use it in a different context.
+% \end{Version}
% \end{History}
% \bigskip
%
diff --git a/macros/latex/contrib/lastpage/lastpage.pdf b/macros/latex/contrib/lastpage/lastpage.pdf
index bd129a18b2..02cb1362b7 100644
--- a/macros/latex/contrib/lastpage/lastpage.pdf
+++ b/macros/latex/contrib/lastpage/lastpage.pdf
Binary files differ
diff --git a/macros/latex/contrib/latex2pydata/CHANGELOG.md b/macros/latex/contrib/latex2pydata/CHANGELOG.md
new file mode 100644
index 0000000000..f079e3c167
--- /dev/null
+++ b/macros/latex/contrib/latex2pydata/CHANGELOG.md
@@ -0,0 +1,39 @@
+# Changelog — latex2pydata LaTeX package
+
+
+## v0.2.0 (2024-05-16)
+
+* Operations on file handles, file names, and buffers are now global.
+ This prevents errors due to groups.
+
+* `\pydatasetfilehandle`, `\pydatareleasefilehandle`, `\pydatasetfilename`,
+ and `\pydataclosefilename` are redesigned to deal with cases where the same
+ file is opened, written, closed, and then later reopened and overwritten.
+ `\pydatasetfilename` now reuses file handles when the same file is
+ opened and closed multiple times. `\pydataclosefilename` no longer
+ attempts to close files `\AtEndDocument`, since that can interfere with
+ files that need to remain open as long as possible.
+
+* Added new commands `\pydatawritekeyedefvalue` and
+ `\pydatabufferkeyedefvalue`. These `\edef` the value before interpreting
+ it as verbatim text.
+
+* Simplified implementation of `pydatabuffermlvalue` environment, based on
+ latest `fvextra`.
+
+* Added error messages for unknown file handles and file names.
+
+* Added additional state and data checks in `\pydatawritebuffer`.
+
+* Added documentation for `\pydatawritemlvaluestart`,
+ `\pydatawritemlvalueline`, `\pydatawritemlvalueend`,
+ `\pydatabuffermlvaluestart`, `\pydatabuffermlvalueline`,
+ `\pydatabuffermlvalueend`.
+
+* Updated `tcblisting` usage in docs for compatibility with the latest
+ `tcolorbox`.
+
+
+## v0.1.0 (2023-11-19)
+
+* Initial release.
diff --git a/macros/latex/contrib/latex2pydata/README b/macros/latex/contrib/latex2pydata/README
index 678217ebc7..4f7751d62b 100644
--- a/macros/latex/contrib/latex2pydata/README
+++ b/macros/latex/contrib/latex2pydata/README
@@ -2,14 +2,15 @@ latex2pydata - write data to file in Python literal format
Author: Geoffrey M. Poore
License: LPPL v1.3c or later
-Development: https://github.com/gpoore/latex2pydata_tex
+Development: https://github.com/gpoore/latex2pydata/tree/main/latex
latex2pydata is a LaTeX package for writing data to file using Python literal
syntax (https://docs.python.org/3/reference/lexical_analysis.html#literals).
The data may be loaded safely in Python using the ast.literal_eval() function
(https://docs.python.org/3/library/ast.html#ast.literal_eval) or the
-latex2pydata Python package https://github.com/gpoore/latex2pydata_py).
+latex2pydata Python package
+https://github.com/gpoore/latex2pydata/tree/main/python).
The top-level data structure can be configured as either a Python dict or a
list of dicts. Within dicts, all keys and values are written to file as
@@ -20,10 +21,10 @@ data types such as dicts, lists, sets, bools, and numbers.
The data is suitable for direct loading in Python with ast.literal_eval().
It is also possible to load data using the latex2pydata Python package
-(https://github.com/gpoore/latex2pydata_py). This functions as a wrapper for
-ast.literal_eval(). The package requires all keys to match the regex
-"[A-Za-z_][0-9A-Za-z_]*". Periods in keys are interpreted as key paths and
-indicate sub-dicts. For example, the key path "main.sub" represents a key
+(https://github.com/gpoore/latex2pydata/tree/main/python). This functions as
+a wrapper for ast.literal_eval(). The package requires all keys to match the
+regex "[A-Za-z_][0-9A-Za-z_]*". Periods in keys are interpreted as key paths
+and indicate sub-dicts. For example, the key path "main.sub" represents a key
"main" in the main dict that maps to a sub-dict containing a key "sub". The
Python package supports the schema features provided by the LaTeX package, so
that data types other than dicts of strings are possible.
diff --git a/macros/latex/contrib/latex2pydata/latex2pydata.dtx b/macros/latex/contrib/latex2pydata/latex2pydata.dtx
index c49c732037..a9d1751557 100644
--- a/macros/latex/contrib/latex2pydata/latex2pydata.dtx
+++ b/macros/latex/contrib/latex2pydata/latex2pydata.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2023 by Geoffrey M. Poore <gpoore@gmail.com>
+% Copyright (C) 2023-2024 by Geoffrey M. Poore <gpoore@gmail.com>
% ---------------------------------------------------------------------------
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -26,7 +26,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{latex2pydata}
%<*package>
- [2023/11/19 v0.1 latex2pydata - write data to file in Python literal format]
+ [2024/05/16 v0.2.0 latex2pydata - write data to file in Python literal format]
%</package>
%
%<*driver>
@@ -67,23 +67,7 @@
\usepackage{tcolorbox}
\tcbuselibrary{listings}
-% strip leading percent symbols
-\def\tcbverbatimwrite#1{%
- \@bsphack
- \tcb@set@verbatim@finish%
- \tcb@allocate@tcb@out%
- \immediate\openout\tcb@out #1
- \tcb@verbatim@begin@hook%
- \let\do\@makeother\dospecials
- \tcb@verbatim@change@percent\catcode`\^^M\active \catcode`\^^I=12
- \def\verbatim@processline{%
- \immediate\write\tcb@out
- {\expandafter\@gobble\the\verbatim@line}}%
- \verbatim@start}%
-
-% fix redefinition by tcolorbox
-\def\verbatim@processline{%
- \expandafter\check@percent\the\verbatim@line\par}
+\tcbset{verbatim ignore percent}
\usepackage{hyperref}
\hypersetup{
@@ -248,27 +232,11 @@
\edef\hashchar{\string#}
-\newcommand{\changestext}{}
-\NewEnviron{changelog}[2]{%
- \g@addto@macro\changestext{\item[#1] (#2) \begin{itemize}}%
- \expandafter\g@addto@macro\expandafter\changestext\expandafter{\BODY}%
- \g@addto@macro\changestext{\end{itemize}}%
-}
-\newcommand{\PrintChangelog}{%
- %\addcontentsline{toc}{section}{Changelog}
- %\section*{Changelog}%
- \section{Changelog}
- \label{sec:changelog}
- \begin{description}%
- \changestext
- \end{description}%
-}
-
\begingroup
\catcode`\#=12\relax
\gdef\astliteval{\href{https://docs.python.org/3/library/ast.html#ast.literal_eval}{\code{ast.literal_eval()}}}
\endgroup
-\def\pydatapy{\href{https://github.com/gpoore/latex2pydata_py}{\pkg{latex2pydata} Python package}}
+\def\pydatapy{\href{https://github.com/gpoore/latex2pydata/tree/main/python}{\pkg{latex2pydata} Python package}}
\def\fvextra{\href{https://github.com/gpoore/fvextra/}{\pkg{fvextra}}}
\def\fancyvrb{\href{https://ctan.org/pkg/fancyvrb}{\pkg{fancyvrb}}}
@@ -286,11 +254,6 @@
% \fi
%
%
-% \begin{changelog}{v0.1}{2023-11-19}
-% \item Initial release.
-% \end{changelog}
-%
-%
% \DoNotIndex{\newcommand,\newenvironment}
% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
% \DoNotIndex{\@ne}
@@ -303,7 +266,7 @@
% \GetFileInfo{latex2pydata.dtx}
%
% \title{\vspace{-0.5in}The \pydata\ package}
-% \author{Geoffrey M.\ Poore \\ \href{mailto://gpoore@gmail.com}{\texttt{gpoore@gmail.com}} \\ \href{https://github.com/gpoore/latex2pydata_tex}{\Verb{github.com/gpoore/latex2pydata_tex}}}
+% \author{Geoffrey M.\ Poore \\ \href{mailto://gpoore@gmail.com}{\texttt{gpoore@gmail.com}} \\ \href{https://github.com/gpoore/latex2pydata/tree/main/latex}{\Verb{github.com/gpoore/latex2pydata/tree/main/latex}}}
% \date{\fileversion~from \filedate}
%
% \maketitle
@@ -385,6 +348,8 @@
%
% \subsection{File handling}
%
+% All file handling commands operate globally (|\global|, |\gdef|, etc.).
+%
% \DescMacro{\pydatasetfilehandle\marg{filehandle}}
% Configure writing to file using an existing file handle created with |\newwrite|. This allows manual management of the file handle. For example:
% \begin{Verbatim}[gobble=2]
@@ -398,10 +363,12 @@
%
% To switch from one file handle to another, simply use |\pydatasetfilehandle| with the new file handle. When the file handle is no longer in use, |\pydatareleasefilehandle| is recommended (but not required) to remove references to the file handle and perform basic checking for incomplete or malformed data written to file.
%
+% |\pydatasetfilehandle| sets the file handle globally.
+%
% \DescMacro{\pydatareleasefilehandle\marg{filehandle}}
% When a file handle is no longer needed, remove references to it. Also perform basic checking for incomplete or malformed data written to file.
%
-% This should only be used once per file handle, after all data has been written. It is not needed when switching from one file handle to another when both files remain open; in that case, only |\pydatasetfilehandle| is needed.
+% This should only be used once per opened file, after all data has been written, just before the file is closed. It is not needed when switching from one file handle to another when both files remain open; in that case, only |\pydatasetfilehandle| is needed. If |\pydatareleasefilehandle| is used before all data is written, or it is used multiple times while writing to the same file, then it is no longer possible to detect incomplete or malformed data.
%
% \DescMacro{\pydatasetfilename\marg{filename}}
% Configure a file for writing based on filename, opening the file if necessary. For example:
@@ -412,6 +379,8 @@
%
% To switch from one file to another, simply use |\pydatasetfilename| with the new filename. When the file is no longer in use, |\pydataclosefilename| is recommended.
%
+% |\pydatasetfilename| sets the filename globally.
+%
% \DescMacro{\pydataclosefilename\marg{filename}}
% Close a file previously opened with |\pydatasetfilename|. Also perform basic checking for incomplete or malformed data written to file.
%
@@ -465,7 +434,13 @@
% \subsection{Writing keys and values}
% All keys must be single-line strings of text without a newline. Both single-line and multi-line values are supported. Keys and values are written to the file previously configured via |\pydatasetfilehandle| or |\pydatasetfilename|.
%
-% The \pydata\ commands read keys and values verbatim. When these commands are used inside other commands, they use macros from \fvextra\ to attempt to interpret their arguments as verbatim. However, there are limitations in this case because the arguments are already tokenized:
+% Commands for writing keys and values may read these keys and values in one of two ways.
+% \begin{itemize}
+% \item Commands whose names contain |key| or |value| read these arguments verbatim, as described below.
+% \item Commands whose names contain |edefkey| or |edefvalue| read these arguments normally, then expand the arguments via |\edef|, and finally interpret the result as verbatim text.
+% \end{itemize}
+%
+% The \pydata\ commands that read keys and values verbatim have some limitations. When these commands are used inside other commands, they use macros from \fvextra\ to attempt to interpret their arguments as verbatim. However, there are limitations in this case because the arguments are already tokenized:
% \begin{itemize}
% \item |#| and |%| cannot be used.
% \item Curly braces are only allowed in pairs.
@@ -473,7 +448,7 @@
% \item Be careful with backslashes. A backslash that is followed by one or more ASCII letters will cause a following space to be lost, if the space is not immediately followed by an ASCII letter.
% \item A single |^| is fine, but |^^| will serve as an escape sequence for an ASCII command character.
% \end{itemize}
-% When the \pydata\ commands are used inside other commands that pass their arguments to the \pydata\ commands, it will usually be best to avoid these limitations by defining the other commands to read their arguments verbatim. Consider using the \href{https://ctan.org/pkg/xparse}{\pkg{xparse}} package. It is also possible to use |\FVExtraReadVArg| from \fvextra; for an example, see the implementation of |\pydatawritekey|.
+% When the \pydata\ commands are used inside other commands that pass their arguments to the \pydata\ commands, it may be best to avoid these limitations by defining the other commands to read their arguments verbatim. Consider using the \href{https://ctan.org/pkg/xparse}{\pkg{xparse}} package. It is also possible to use |\FVExtraReadVArg| from \fvextra; for an example, see the implementation of |\pydatawritekey|.
%
% Because the \pydata\ commands treat keys and values as verbatim, any desired macro expansion must be performed before passing the keys and values to the \pydata\ commands.
%
@@ -486,11 +461,22 @@
% \DescMacro{\pydatawritekeyvalue\marg{key}\marg{value}}
% Write a key and a single-line value to file simultaneously.
%
+% \DescMacro{\pydatawritekeyedefvalue\marg{key}\marg{value}}
+% Write a key and a single-line value to file simultaneously. The value is expanded via |\edef| before being interpreted as verbatim text and then written.
+%
% \DescEnv{pydatawritemlvalue}
% Write a multi-line value to file.
%
% This environment uses \fvextra\ and \fancyvrb\ internally to capture the environment contents verbatim. If a new environment is defined as a wrapper for |pydatawritemlvalue|, then |\VerbatimEnvironment| must be used at the beginning of the new environment definition. This configures \fancyvrb\ to find the end of the new environment correctly.
%
+% \DescMacro{\pydatawritemlvaluestart}
+%
+% \DescMacro{\pydatawritemlvalueline\marg{line}}
+%
+% \DescMacro{\pydatawritemlvalueend}
+% These commands allow writing a multi-line value to file one line at a time. \meta{line} is interpreted verbatim.
+%
+%
%
% \subsection{Buffer}
%
@@ -498,6 +484,8 @@
%
% A buffer consists of a sequence of macros of the form |\|\meta{buffername}|line|\meta{n}, where each line of data corresponds to a macro and \meta{n} is an integer greater than or equal to one (one-based indexing). The length of the buffer is stored in the counter \meta{buffername}|length|. Buffers are limited to containing comma-separated key-value data, without any opening or closing dict delimiters |{}|.
%
+% All buffer commands that set the buffer or modify the buffer operate globally (|\global|, |\gdef|, etc.).
+%
%
% \subsubsection{Creating and deleting buffers}
%
@@ -538,15 +526,23 @@
% \DescMacro{\pydatabufferkeyvalue\marg{key}\marg{value}}
% Append a key and a single-line value to the buffer simultaneously.
%
+% \DescMacro{\pydatabufferkeyedefvalue\marg{key}\marg{value}}
+% Append a key and a single-line value to the buffer simultaneously. The value is expanded via |\edef| before being interpreted as verbatim text and then buffered.
+%
% \DescEnv{pydatabuffermlvalue}
% Append a multi-line value to the buffer.
%
% This environment uses \fvextra\ and \fancyvrb\ internally to capture the environment contents verbatim. If a new environment is defined as a wrapper for |pydatabuffermlvalue|, then |\VerbatimEnvironment| must be used at the beginning of the new environment definition. This configures \fancyvrb\ to find the end of the new environment correctly.
%
+% \DescMacro{\pydatabuffermlvaluestart}
+%
+% \DescMacro{\pydatabuffermlvalueline\marg{line}}
+%
+% \DescMacro{\pydatabuffermlvalueend}
+% These commands allow buffering a multi-line value one line at a time. \meta{line} is interpreted verbatim.
%
%
%
-% \PrintChangelog
%
% \StopEventually{\PrintIndex}
%
@@ -582,7 +578,7 @@
% \begin{macrocode}
\RequirePackage{etoolbox}
\RequirePackage{fvextra}
-\IfPackageAtLeastTF{fvextra}{2023/11/19}%
+\IfPackageAtLeastTF{fvextra}{2024/05/16}%
{}{\pydata@error{package fvextra is outdated; upgrade to the latest version}}
\RequirePackage{pdftexcmds}
% \end{macrocode}
@@ -599,55 +595,83 @@
% \end{macro}
%
%
+% \begin{macro}{\pydata@newglobalbool, \pydata@provideglobalbool}
+% Variants of \pkg{etoolbox}'s |\newbool| and |\providebool| that create bools whose state is always global. When these global bools are used with |\setbool|, |\booltrue|, or |\boolfalse|, the global state is updated regardless of whether the command is prefixed with |\global|. These use a global variant of \LaTeX's |\newif| internally.
+% \begin{macrocode}
+\def\pydata@gnewif#1{%
+ \count@\escapechar
+ \escapechar\m@ne
+ \global\let#1\iffalse
+ \pydata@gif#1\iftrue
+ \pydata@gif#1\iffalse
+ \escapechar\count@}
+\def\pydata@gif#1#2{%
+ \expandafter\gdef\csname
+ \expandafter\@gobbletwo\string#1\expandafter\@gobbletwo\string#2\endcsname
+ {\global\let#1#2}}
+\newrobustcmd*{\pydata@newglobalbool}[1]{%
+ \begingroup
+ \let\newif\pydata@gnewif
+ \newbool{#1}%
+ \endgroup}
+\newrobustcmd*{\pydata@provideglobalbool}[1]{%
+ \begingroup
+ \let\newif\pydata@gnewif
+ \providebool{#1}%
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+%
%
% \subsection{State}
%
-% Track state of writing data and of buffering data.
+% Track state of writing data and of buffering data. Notice that bools for tracking state are a special, custom variant that is always global.
%
% \begin{macro}{pydata@canwrite}
% Whether data can be written. False if a file handle has not been set or if the top-level data structure has been closed.
% \begin{macrocode}
-\newbool{pydata@canwrite}
+\pydata@newglobalbool{pydata@canwrite}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{pydata@hasmeta}
% Whether metadata was written. Metadata is a \code{dict[str, str | dict[str, str]]}.
% \begin{macrocode}
-\newbool{pydata@hasmeta}
+\pydata@newglobalbool{pydata@hasmeta}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{pydata@topexists}
% Whether the top-level data structure has been configured. The top-level data structure can be a list or a dict. The overall data structure must be either |dict[str, str]| or |list[dict[str, str]]|.
% \begin{macrocode}
-\newbool{pydata@topexists}
+\pydata@newglobalbool{pydata@topexists}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{pydata@topislist}
% Whether the top-level data structure is a list.
% \begin{macrocode}
-\newbool{pydata@topislist}
+\pydata@newglobalbool{pydata@topislist}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{pydata@indict}
% Whether a dict has been opened.
% \begin{macrocode}
-\newbool{pydata@indict}
+\pydata@newglobalbool{pydata@indict}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{pydata@haskey}
% Whether a key has been written (waiting for a value).
% \begin{macrocode}
-\newbool{pydata@haskey}
+\pydata@newglobalbool{pydata@haskey}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\pydata@fhstartstate, \pydata@fhstopstate}
-% Start and stop state tracking for a file handle (|\newwrite|). Each file handle has its own set of state bools of the form |pydata@|\meta{boolname}|@|\meta{fh}. When a file handle is in use, the values of these bools are copied into the |pydata@|\meta{boolname} bools; when the file handle is no longer in use, |pydata@|\meta{boolname} values are copied back into |pydata@|\meta{boolname}|@|\meta{fh}.
+% \begin{macro}{\pydata@fhstartstate, \pydata@fhstopstate, \pydata@fhresetstate}
+% Start and stop state tracking for a file handle (|\newwrite|), or reset state after writing is complete. Each file handle has its own set of state bools of the form |pydata@|\meta{boolname}|@|\meta{fh}. When a file handle is in use, the values of these bools are copied into the |pydata@|\meta{boolname} bools; when the file handle is no longer in use, |pydata@|\meta{boolname} values are copied back into |pydata@|\meta{boolname}|@|\meta{fh}.
% \begin{macrocode}
\def\pydata@fhstartstate#1{%
\expandafter\pydata@fhstartstate@i\expandafter{\number#1}}
@@ -659,10 +683,13 @@
\booltrue{pydata@fhnewstate}%
\fi
\def\do##1{%
- \providebool{pydata@##1@#1}%
+ \pydata@provideglobalbool{pydata@##1@#1}%
\ifbool{pydata@##1@#1}{\booltrue{pydata@##1}}{\boolfalse{pydata@##1}}}%
\docsvlist{canwrite, hasmeta, topexists, topislist, indict, haskey}%
- \ifbool{pydata@fhnewstate}{\booltrue{pydata@canwrite}{}}{}}
+ \ifbool{pydata@fhnewstate}%
+ {\booltrue{pydata@canwrite}}{}%
+ \ifbool{pydata@fhisreleased@#1}%
+ {\boolfalse{pydata@fhisreleased@#1}\booltrue{pydata@canwrite}}{}}
\def\pydata@fhstopstate#1{%
\expandafter\pydata@fhstopstate@i\expandafter{\number#1}}
\def\pydata@fhstopstate@i#1{%
@@ -672,6 +699,12 @@
\boolfalse{pydata@##1}}%
\docsvlist{canwrite, hasmeta, topexists, topislist, indict, haskey}%
\fi}
+\def\pydata@fhresetstate#1{%
+ \expandafter\pydata@fhresetstate@i\expandafter{\number#1}}
+\def\pydata@fhresetstate@i#1{%
+ \def\do##1{%
+ \boolfalse{pydata@##1@#1}}%
+ \docsvlist{canwrite, hasmeta, topexists, topislist, indict, haskey}}
% \end{macrocode}
% \end{macro}
%
@@ -680,7 +713,7 @@
%
% If multiple buffers are in use, all buffers use the same |pydata@bufferhaskey|. Inconsistent state is avoided by requiring that |\pydatasetbuffername| can only be invoked when |pydata@bufferhaskey| is false.
% \begin{macrocode}
-\newbool{pydata@bufferhaskey}
+\pydata@newglobalbool{pydata@bufferhaskey}
% \end{macrocode}
% \end{macro}
%
@@ -709,49 +742,68 @@
% Set and release file handle. Release isn't strictly required, but it is necessary for basic data checking on the \LaTeX\ side.
% \begin{macrocode}
\def\pydatasetfilehandle#1{%
+ \if\relax\detokenize{#1}\relax
+ \pydata@error{Missing file handle}%
+ \fi
\ifx\pydata@filehandle\relax
+ \else\ifx\pydata@filehandle#1\relax
\else
\pydata@fhstopstate{\pydata@filehandle}%
- \fi
- \let\pydata@filehandle#1\relax
- \pydata@fhstartstate{#1}}
+ \fi\fi
+ \ifx\pydata@filehandle#1\relax
+ \else
+ \global\let\pydata@filehandle#1\relax
+ \pydata@provideglobalbool{pydata@fhisreleased@\number#1}%
+ \pydata@fhstartstate{#1}%
+ \fi}
\def\pydatareleasefilehandle#1{%
- \ifx\pydata@filehandle\relax
+ \ifcsname ifpydata@canwrite@\number#1\endcsname
\else
- \ifx\pydata@filehandle#1\relax
- \pydata@fhstopstate{#1}%
- \let\pydata@filehandle\relax
- \fi
+ \pydata@error{Unknown file handle #1}%
\fi
- \ifcsname ifpydata@canwrite@\number#1\endcsname
- \ifbool{pydata@canwrite@\number#1}%
- {\ifbool{pydata@haskey@\number#1}%
- {\pydata@error{Incomplete data: key is waiting for value}}{}%
- \ifbool{pydata@indict@\number#1}%
- {\pydata@error{Incomplete data: dict is not closed}}{}%
- \ifbool{pydata@topislist@\number#1}%
- {\pydata@error{Incomplete data: list is not closed}}{}}%
- {}%
- \fi}
+ \ifx\pydata@filehandle#1\relax
+ \pydata@fhstopstate{#1}%
+ \global\let\pydata@filehandle\relax
+ \fi
+ \ifbool{pydata@canwrite@\number#1}%
+ {\ifbool{pydata@haskey@\number#1}%
+ {\pydata@error{Incomplete data: key is waiting for value}}{}%
+ \ifbool{pydata@indict@\number#1}%
+ {\pydata@error{Incomplete data: dict is not closed}}{}%
+ \ifbool{pydata@topislist@\number#1}%
+ {\pydata@error{Incomplete data: list is not closed}}{}}%
+ {}%
+ \pydata@fhresetstate{#1}%
+ \booltrue{pydata@fhisreleased@\number#1}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\pydatasetfilename, \pydataclosefilename}
-% Shortcut for creating a |\newwrite| and then passing the file handle to |\pydatasetfilehandle|. Automatically attempt to close the file handle (if it still exists) at the end of the document. This isn't strictly required since \TeX\ will \href{https://tex.stackexchange.com/a/337291}{automatically close open writes}. Invoking the close macro is necessary for basic data checking on the \LaTeX\ side.
+% Shortcut for creating a |\newwrite| and then passing the file handle to |\pydatasetfilehandle|. File handles are global. If the close macro is not invoked, then basic data checking on the \LaTeX\ side will not be performed. However, \TeX\ will \href{https://tex.stackexchange.com/a/337291}{automatically close open writes at the end of the compile}.
% \begin{macrocode}
\def\pydatasetfilename#1{%
+ \if\relax\detokenize{#1}\relax
+ \pydata@error{Missing filename}%
+ \fi
\ifcsname pydata@fh@#1\endcsname
\else
\expandafter\newwrite\csname pydata@fh@#1\endcsname
- \expandafter\immediate\expandafter\openout\csname pydata@fh@#1\endcsname=#1\relax
- \AtEndDocument{\pydataclosefilename{#1}}%
\fi
+ \pydata@provideglobalbool{pydata@fileisopen@#1}%
+ \ifbool{pydata@fileisopen@#1}%
+ {}%
+ {\expandafter\immediate\expandafter\openout\csname pydata@fh@#1\endcsname=#1\relax
+ \booltrue{pydata@fileisopen@#1}}%
\expandafter\pydatasetfilehandle\expandafter{\csname pydata@fh@#1\endcsname}}
\def\pydataclosefilename#1{%
\ifcsname pydata@fh@#1\endcsname
- \expandafter\pydatareleasefilehandle\expandafter{\csname pydata@fh@#1\endcsname}%
- \expandafter\immediate\expandafter\closeout\csname pydata@fh@#1\endcsname
- \expandafter\let\csname pydata@fh@#1\endcsname\pydata@undefined
+ \ifbool{pydata@fileisopen@#1}%
+ {\expandafter\pydatareleasefilehandle\expandafter{\csname pydata@fh@#1\endcsname}%
+ \expandafter\immediate\expandafter\closeout\csname pydata@fh@#1\endcsname
+ \boolfalse{pydata@fileisopen@#1}}%
+ {}%
+ \else
+ \pydata@error{Unknown file name "#1"}%
\fi}
% \end{macrocode}
% \end{macro}
@@ -779,14 +831,13 @@
\ifbool{pydata@bufferhaskey}%
{\pydata@error{Cannot change buffers when a buffered key is waiting for a value}}%
{}%
- \def\pydata@buffername{#1}%
- \def\pydata@bufferlinename{#1line}%
- \def\pydata@bufferlengthname{#1length}%
+ \gdef\pydata@buffername{#1}%
+ \gdef\pydata@bufferlinename{#1line}%
+ \gdef\pydata@bufferlengthname{#1length}%
\ifcsname c@\pydata@bufferlengthname\endcsname
\else
\expandafter\newcounter\expandafter{\pydata@bufferlengthname}%
- \fi
- \expandafter\setcounter\expandafter{\pydata@bufferlengthname}{0}}
+ \fi}
\pydatasetbuffername{pydata@defaultbuffer}
% \end{macrocode}
% \end{macro}
@@ -798,7 +849,10 @@
\ifnum\expandafter\value\expandafter{\pydata@bufferlengthname}<1\relax
\pydata@error{Cannot write empty buffer}%
\fi
- \ifbool{pydata@indict}{}{\pydata@error{Cannot write a buffer unless in a dict}}%
+ \pydata@checkfilehandle
+ \ifbool{pydata@indict}{}{\pydata@error{Cannot write buffer unless in a dict}}%
+ \ifbool{pydata@haskey}%
+ {\pydata@error{Cannot write buffer when file has a key waiting for a value}}{}%
\ifbool{pydata@bufferhaskey}%
{\pydata@error{Cannot write buffer when a buffered key is waiting for a value}}{}%
\setcounter{pydata@bufferindex}{1}%
@@ -824,7 +878,7 @@
\fi
\setcounter{pydata@bufferindex}{1}%
\loop\unless\ifnum\value{pydata@bufferindex}>\value{#1length}\relax
- \expandafter\let
+ \expandafter\global\expandafter\let
\csname#1line\arabic{pydata@bufferindex}\endcsname\pydata@undefined
\stepcounter{pydata@bufferindex}%
\repeat
@@ -948,7 +1002,7 @@
\else
\pydata@error{Invalid schema missing setting #1}%
\fi
- \def\pydata@schemamissing{#1}}
+ \gdef\pydata@schemamissing{#1}}
\pydatasetschemamissing{error}
% \end{macrocode}
% \end{macro}
@@ -972,7 +1026,7 @@
% Delete existing schema. This isn't done automatically upon writing so that a schema can be defined and then reused.
% \begin{macrocode}
\def\pydataclearschema{%
- \def\pydata@schema{}}
+ \gdef\pydata@schema{}}
% \end{macrocode}
% \end{macro}
%
@@ -1111,7 +1165,7 @@
\ifbool{pydata@bufferhaskey}%
{\pydata@error{Cannot buffer a key when waiting for a value}}{}%
\expandafter\stepcounter\expandafter{\pydata@bufferlengthname}%
- \expandafter\edef\csname
+ \expandafter\xdef\csname
\pydata@bufferlinename\expandafter\arabic\expandafter{\pydata@bufferlengthname}%
\endcsname{%
\pydata@quotestr{#1}:%
@@ -1140,7 +1194,7 @@
\ifbool{pydata@bufferhaskey}%
{}{\pydata@error{Cannot buffer value when waiting for a key}}%
\expandafter\stepcounter\expandafter{\pydata@bufferlengthname}%
- \expandafter\edef\csname
+ \expandafter\xdef\csname
\pydata@bufferlinename\expandafter\arabic\expandafter{\pydata@bufferlengthname}%
\endcsname{%
\pydata@quotestr{#1},%
@@ -1150,7 +1204,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\pydatawritekeyvalue, \pydatabufferkeyvalue}
+% \begin{macro}{\pydatawritekeyvalue, \pydatawritekeyedefvalue, \pydatabufferkeyvalue, \pydatabufferkeyedefvalue}
% Write a key and a single-line value to file simultaneously, or append them to the buffer.
% \begin{macrocode}
\begingroup
@@ -1166,6 +1220,13 @@
\immediate\write\pydata@filehandle{%
\pydata@quotestr{#1}: \pydata@quotestr{#2},%
}}
+\gdef\pydatawritekeyedefvalue{%
+ \FVExtraReadVArg{\FVExtraDetokenizeVArg{\pydatawritekeyedefvalue@i}}}
+\gdef\pydatawritekeyedefvalue@i#1#2{%
+ \edef\pydata@tmp{#2}%
+ \expandafter\pydatawritekeyedefvalue@ii\expandafter{\pydata@tmp}{#1}}
+\gdef\pydatawritekeyedefvalue@ii#1#2{%
+ \FVExtraDetokenizeVArg{\pydatawritekeyvalue@ii{#2}}{#1}}
\gdef\pydatabufferkeyvalue{%
\FVExtraReadVArg{\FVExtraDetokenizeVArg{\pydatabufferkeyvalue@i}}}
\gdef\pydatabufferkeyvalue@i#1{%
@@ -1174,11 +1235,18 @@
\ifbool{pydata@bufferhaskey}%
{\pydata@error{Cannot buffer a key when waiting for a value}}{}%
\expandafter\stepcounter\expandafter{\pydata@bufferlengthname}%
- \expandafter\edef\csname
+ \expandafter\xdef\csname
\pydata@bufferlinename\expandafter\arabic\expandafter{\pydata@bufferlengthname}%
\endcsname{%
\pydata@quotestr{#1}: \pydata@quotestr{#2},%
}}
+\gdef\pydatabufferkeyedefvalue{%
+ \FVExtraReadVArg{\FVExtraDetokenizeVArg{\pydatabufferkeyedefvalue@i}}}
+\gdef\pydatabufferkeyedefvalue@i#1#2{%
+ \edef\pydata@tmp{#2}%
+ \expandafter\pydatabufferkeyedefvalue@ii\expandafter{\pydata@tmp}{#1}}
+\gdef\pydatabufferkeyedefvalue@ii#1#2{%
+ \FVExtraDetokenizeVArg{\pydatabufferkeyvalue@ii{#2}}{#1}}
\endgroup
% \end{macrocode}
% \end{macro}
@@ -1209,7 +1277,7 @@
\ifbool{pydata@bufferhaskey}%
{}{\pydata@error{Cannot buffer value when waiting for a key}}%
\expandafter\stepcounter\expandafter{\pydata@bufferlengthname}%
- \expandafter\edef\csname
+ \expandafter\xdef\csname
\pydata@bufferlinename\expandafter\arabic\expandafter{\pydata@bufferlengthname}%
\endcsname{%
\pydata@mlstropen
@@ -1218,7 +1286,7 @@
\ifbool{pydata@bufferhaskey}%
{}{\pydata@error{Cannot buffer value when waiting for a key}}%
\expandafter\stepcounter\expandafter{\pydata@bufferlengthname}%
- \expandafter\edef\csname
+ \expandafter\xdef\csname
\pydata@bufferlinename\expandafter\arabic\expandafter{\pydata@bufferlengthname}%
\endcsname{%
\pydata@escstrtext{#1}%
@@ -1227,7 +1295,7 @@
\ifbool{pydata@bufferhaskey}%
{}{\pydata@error{Cannot buffer value when waiting for a key}}%
\expandafter\stepcounter\expandafter{\pydata@bufferlengthname}%
- \expandafter\edef\csname
+ \expandafter\xdef\csname
\pydata@bufferlinename\expandafter\arabic\expandafter{\pydata@bufferlengthname}%
\endcsname{%
\pydata@mlstrclose,%
@@ -1252,21 +1320,9 @@
% \begin{macrocode}
\newenvironment{pydatabuffermlvalue}%
{\VerbatimEnvironment
- \begin{VerbatimBuffer}[buffername=pydata@tmpbuffer, globalbuffer=true]}%
- {\end{VerbatimBuffer}}
-\AfterEndEnvironment{pydatabuffermlvalue}{%
\pydatabuffermlvaluestart
- \setcounter{pydata@bufferindex}{1}%
- \loop\unless\ifnum\value{pydata@bufferindex}>\value{pydata@tmpbufferlength}\relax
- \expandafter\let\expandafter\pydata@tmpbufferline
- \csname pydata@tmpbufferline\arabic{pydata@bufferindex}\endcsname
- \expandafter\let
- \csname pydata@tmpbufferline\arabic{pydata@bufferindex}\endcsname\pydata@undefined
- \expandafter\pydatabuffermlvalueline\expandafter{\pydata@tmpbufferline}%
- \stepcounter{pydata@bufferindex}%
- \repeat
- \setcounter{pydata@tmpbufferlength}{0}%
- \setcounter{pydata@bufferindex}{0}%
+ \begin{VerbatimBuffer}[bufferer=\pydatabuffermlvalueline]}%
+ {\end{VerbatimBuffer}%
\pydatabuffermlvalueend}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/latex2pydata/latex2pydata.ins b/macros/latex/contrib/latex2pydata/latex2pydata.ins
index 6367807032..ed696a1f38 100644
--- a/macros/latex/contrib/latex2pydata/latex2pydata.ins
+++ b/macros/latex/contrib/latex2pydata/latex2pydata.ins
@@ -1,4 +1,4 @@
-%% Copyright (C) 2023 by Geoffrey M. Poore <gpoore@gmail.com>
+%% Copyright (C) 2023-2024 by Geoffrey M. Poore <gpoore@gmail.com>
%% --------------------------------------------------------------------------
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -26,7 +26,7 @@
This is a generated file.
-Copyright (C) 2023 by Geoffrey M. Poore <gpoore@gmail.com>
+Copyright (C) 2023-2024 by Geoffrey M. Poore <gpoore@gmail.com>
--------------------------------------------------------------------------
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/macros/latex/contrib/latex2pydata/latex2pydata.pdf b/macros/latex/contrib/latex2pydata/latex2pydata.pdf
index 96eca7e89d..815d40d7be 100644
--- a/macros/latex/contrib/latex2pydata/latex2pydata.pdf
+++ b/macros/latex/contrib/latex2pydata/latex2pydata.pdf
Binary files differ
diff --git a/macros/latex/contrib/listings/listings-devel.pdf b/macros/latex/contrib/listings/listings-devel.pdf
index 5cf9af1ff8..da1506f1df 100644
--- a/macros/latex/contrib/listings/listings-devel.pdf
+++ b/macros/latex/contrib/listings/listings-devel.pdf
Binary files differ
diff --git a/macros/latex/contrib/listings/listings.dtx b/macros/latex/contrib/listings/listings.dtx
index 06f881726b..525ba1a4ae 100644
--- a/macros/latex/contrib/listings/listings.dtx
+++ b/macros/latex/contrib/listings/listings.dtx
@@ -135,7 +135,7 @@
% Hoffmann became the maintainer of the \packagename{listings}
% package in 2013; see the Preface for details.}~ %
% \textless\lstemail\textgreater}
-% \date{2024/03/11\enspace\enspace Version 1.10a\ \box\abstractbox}
+% \date{2024/05/25\enspace\enspace Version 1.10b\ \box\abstractbox}
% \def\lstemail{\href{mailto:j.hoffmann@fh-aachen.de}{\texttt{j.hoffmann(at)fh-aachen.de}}}
% \ifhyper
% \hypersetup{pdftitle=The Listings Package,
@@ -3561,15 +3561,18 @@
% other & \texttt{!\ " \#\ \%\ \&\ ' ( ) * + , - .\ / :\ ; < = > ?}\\
% & {\catcode`\|=12\texttt{[ \char92\ ] \textasciicircum\ \char123\
% | \char125\ \textasciitilde}}\\
-% space & chr(32)\\
-% tabulator & chr(9)\\
-% form feed & chr(12)\\
+% space & \texttt{chr(32)}\footnotemark{}\\
+% tabulator & \texttt{chr(9)}\\
+% form feed & \texttt{chr(12)}\\
% \noalign{\smallskip}
% \end{tabular}
% \par\noindent
% Note: Extended characters of codes 128--255 (if defined) are \emph{currently}
% letters.
% \end{table}
+% \footnotetext{Here and at other places |chr(|\meta{number}|)| means a
+% Pascal function which returns the character which has ASCII value
+% \meta{number}.}
%
%
% \paragraph{Strings}\label{uStrings}
@@ -4197,20 +4200,25 @@
%
% \subsection{Listings inside arguments}\label{uListingsArguments}
%
-% At the moment it isn't possible to use \verb-\lstinline{...}- in a cell
+% A long time it wasn't possible to use \verb-\lstinline{...}- in a cell
% of a table\makeatletter\@ifundefined{r@uProcessingInline}{}{%
% (see section \ref{uProcessingInline} on page \pageref{uProcessingInline}
% for more information)},%
% \makeatother%
-% but it is possible to define a wrapper macro
-% which can be used instead of \verb-\lstinline{...}-:
+% but there was a recommended workaround. This workaround is still
+% functional, but now one can use \verb-\lstinline{...}- and of course
+% \verb-\lstinline|...|- directly:
% \begin{lstsample}[lstlisting]{}{}
% \newcommand\foo{\lstinline{t}}
% \newcommand\foobar[2][]{\lstinline[#1]{#2}}
%
% \begin{tabular}{ll}
-% \foo & a variable\\
-% \foobar[language=java]{int u;} & a declaration
+% \lstinline|r| & a first variable (standard)\\
+% \lstinline[language=java]|int s;| & a standard declaration \\
+% \foo & a second variable (workaround)\\
+% \foobar[language=java]{int u;} & a (workaraond) declaration \\
+% \lstinline{v} & another variable using braces\\
+% \lstinline[language=java]{int w;} & an additional braced declaration
% \end{tabular}
% \end{lstsample}
%
@@ -5744,7 +5752,7 @@
% \item |\lst@Init\relax|
% \item |\lst@Def{`#1}{\lst@DeInit\egroup}| installs the `end inline'
% detection, where |#1| is the next character after |\lstinline|.
-% Moreover chr(13) is redefined to end the fragment in the same way but
+% Moreover |chr(13)| is redefined to end the fragment in the same way but
% also issues an error message.
% \item Now comes the source code and \ldots
% \item \ldots\ |\lst@DeInit| (from |\lst@Def| above) ends the code snippet
@@ -5978,7 +5986,7 @@
% \part{Implementation}
%
%
-% \CheckSum{12409}
+% \CheckSum{12435}
%^^A
%^^A Don't index TeX-primitives.
%^^A
@@ -6122,8 +6130,8 @@
% All files will have same date and version.
% \begin{macrocode}
%<*kernel|misc|doc>
-\def\filedate{2024/03/11}
-\def\fileversion{1.10a}
+\def\filedate{2024/05/25}
+\def\fileversion{1.10b}
%</kernel|misc|doc>
% \end{macrocode}
% What we need and who we are.
@@ -6662,11 +6670,11 @@
\ifx#1\relax
\else \lccode`\^^@=`#1%
% \end{macrocode}
-% Otherwise we say that |^^@|=chr(0) is the lower case version of the first
+% Otherwise we say that |^^@|=|chr(0)| is the lower case version of the first
% character.
% Then we test the second character.
% If there is none, we append the lower case |^^@| to |\lst@temp|.
-% Otherwise we say that |^^A|=chr(1) is the lower case version of the second
+% Otherwise we say that |^^A|=|chr(1)| is the lower case version of the second
% character and we test the next argument, and so on.
% \begin{macrocode}
\ifx#2\relax
@@ -6703,7 +6711,7 @@
\lst@next}
\endgroup
% \end{macrocode}
-% This |\endgroup| restores the catcodes of chr(0)--chr(8), but not the
+% This |\endgroup| restores the catcodes of |chr(0)|--|chr(8)|, but not the
% catcodes of the characters inside |\lst@MakeActive@| since they are already
% read.
%
@@ -14552,7 +14560,7 @@
\fi
\lsthk@InitVars \lsthk@InitVarsBOL
% \end{macrocode}
-% The end of line character chr(13)=|^^M| controls the processing, see the
+% The end of line character |chr(13)|=|^^M| controls the processing, see the
% definition of |\lst@MProcessListing| below.
% The argument |#1| is either |\relax| or |\lstenv@backslash|.
% \begin{macrocode}
@@ -14904,36 +14912,35 @@
% \subsubsection{Processing inline listings}\label{uProcessingInline}
%
% \begin{macro}{\lstinline}
-% In addition to |\lsthk@PreSet|, we use |boxpos=b| and flexiblecolumns.
-% I've inserted |\leavevmode| after bug report from \lsthelper{Michael~Weber}
-% {1999/12/16}{wrong spacing in list environments}. \lsthelper{Olivier~Lecarme}
-% {2001/07/30}{inconsistent `break' when \lstinline is used inside caption}
-% reported a problem which has gone after removing |\let| |\lst@newlines|
-% |\@empty| (now |\lst@newlines| is a counter!). Unfortunately I don't know
-% the reason for inserting this code some time ago! At the end of the macro we
-% check the delimiter.
-% \begin{macrocode}
-\newcommand\lstinline[1][]{%
- \leavevmode\bgroup % \hbox\bgroup --> \bgroup
- \def\lst@boxpos{b}%
- \lsthk@PreSet\lstset{flexiblecolumns,#1}%
- \lsthk@TextStyle
- \@ifnextchar\bgroup{%
-% \end{macrocode}
-% \lsthelper{Luc~Van~Eycken}{2014/01/22}{\rcmdname\lstinline{} in alignments}
-% reported, that the experimental implementation of |\lstinline| with
-% braces instead of characters surrounding the source code resulted in an
-% error if used in a tabular environment. He found that this error comes
-% from the master counter (cf. appendix D (Dirty Tricks), item 5. (Brace
-% hacks), of the TeXbook (p. 385-386)). Adding the following line at this
-% point
+% In addition to |\lsthk@PreSet|, we use |boxpos=b| and
+% flexiblecolumns. I've inserted |\leavevmode| after bug report from
+% \lsthelper{Michael~Weber} {1999/12/16}{wrong spacing in list
+% environments}. \lsthelper{Olivier~Lecarme} {2001/07/30}{inconsistent
+% `break' when \lstinline is used inside caption} reported a problem
+% which has gone after removing |\let| |\lst@newlines| |\@empty| (now
+% |\lst@newlines| is a counter!). Unfortunately I don't know the reason
+% for inserting this code some time ago! At the end of the macro we
+% check the delimiter.\footnote{This is text of the original author
+% Carsten Heinz.}
+%
+% Then came an experimental version which allowed braces, but
+% \lsthelper{Luc~Van~Eycken}{2014/01/22}{\rcmdname\lstinline{} in
+% alignments} reported, that the experimental implementation of
+% |\lstinline| with braces instead of characters surrounding the source
+% code resulted in an error if used in a tabular environment.
+%
+% He found that this error comes from the master counter (cf. appendix
+% D (Dirty Tricks), item 5. (Brace hacks), of the TeXbook
+% (p. 385-386)). Adding the following line after testing the next
+% character (line no. 7 in the following outcommented snippet)
%\begin{verbatim}
-% \ifnum`{=0}\fi%
+%\ifnum`{=0}\fi%
%\end{verbatim}
-% remedies the wrong behaviour. But \lsthelper{Qing~Lee}{2014/06/28}{-}
-% pointed out, that this breaks code like the one showed in
-% \ref{uListingsArguments} on \pageref{uListingsArguments} and proposed
-% another solution which in turn broke the code needed by Luc:
+% remedies the wrong behaviour. But \lsthelper{Qing~Lee}{2014/06/28}{-}
+% pointed out, that this breaks code like the one shown in section
+% \ref{uListingsArguments} on page \pageref{uListingsArguments} and
+% proposed another solution which in turn broke the code provided by
+% Luc:
%\begin{verbatim}
% \renewcommand\lstinline[1][]{%
% \leavevmode\bgroup % \hbox\bgroup --> \bgroup
@@ -14944,20 +14951,45 @@
% \@ifnextchar\bgroup{%
% \ifnum`{=\z@}\fi%
% \afterassignment\lst@InlineG \let\@let@token}{%
-% \ifnum`{=\z@}\fi\lstinline@}}
+% \ifnum`{=\z@}\fi\lstinline@}%
+%}
%\end{verbatim}
-% So finally the old code comes back and the people, who need a
-% |\lstinline| with braces, should use the workaround from section
-% \ref{uListingsArguments} on page \pageref{uListingsArguments}.
+% So finally the old code came back and the people, who needed a
+% |\lstinline| with braces, should use the workaround from section
+% \ref{uListingsArguments} on page \pageref{uListingsArguments}.
+%
+% This long outstanding deficiency is now repaired by
+% \lsthelper{user5028841}{2024/05/05}{Regarding the Listings package}
+% who provided a solution by using special characters as begin and end
+% of a group:
+% \begin{macrocode}
+\edef\lst@temp{\the\catcode`\^^@}
+\catcode`\^^@=1
+\newcommand\lstinline[1][]{%
+ \leavevmode\bgroup % \hbox\bgroup --> \bgroup
+ \def\lst@boxpos{b}%
+ \lsthk@PreSet\lstset{flexiblecolumns,#1}%
+ \lsthk@TextStyle
+ \@ifnextchar\bgroup{%
+ \afterassignment\lst@InlineG \romannumeral`^^@\iffalse}\fi
+ \let\@let@token}%
+ \lstinline@}
+% \end{macrocode}
+% Here we restore the previous catcode of |\^^@|:
+% \begin{macrocode}
+\catcode`\^^@=\lst@temp
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\lst@inline@}
+% This is the standard method after processing the optional arguments
+% of |\lstinline|.
% \begin{macrocode}
- \afterassignment\lst@InlineG \let\@let@token}%
- \lstinline@}
\def\lstinline@#1{%
- \lst@Init\relax
- \lst@IfNextCharActive{\lst@InlineM#1}{\lst@InlineJ#1}}
-\lst@AddToHook{TextStyle}{}% init
+ \lst@Init\relax
+ \lst@IfNextCharActive{\lst@InlineM#1}{\lst@InlineJ#1}}
% \end{macrocode}
% \begin{macrocode}
+\lst@AddToHook{TextStyle}{}% init
\lst@AddToHook{SelectCharTable}{\lst@inlinechars}
\global\let\lst@inlinechars\@empty
% \end{macrocode}
@@ -14965,56 +14997,68 @@
%
% \begin{macro}{\lst@InlineM}
% \begin{macro}{\lst@InlineJ}
-% treat the cases of `normal' inlines and inline listings inside an argument.
-% In the first case the given character ends the inline listing and EOL within
-% such a listing immediately ends it and produces an error message.
+% treat the cases of `normal' inlines and inline listings inside an
+% argument. In the first case the given character ends the inline
+% listing and EOL within such a listing immediately ends it and
+% produces an error message.
% \begin{macrocode}
-\def\lst@InlineM#1{\gdef\lst@inlinechars{%
+\def\lst@InlineM#1{%
+ \gdef\lst@inlinechars{%
\lst@Def{`#1}{\lst@DeInit\egroup\global\let\lst@inlinechars\@empty}%
\lst@Def{13}{\lst@DeInit\egroup \global\let\lst@inlinechars\@empty
- \PackageError{Listings}{lstinline ended by EOL}\@ehc}}%
- \lst@inlinechars}
+ \PackageError{Listings}{lstinline ended by EOL}\@ehc}}%
+ \lst@inlinechars}
% \end{macrocode}
% In the other case we get all characters up to |#1|, make these characters
% active, execute (typeset) them and end the listing (all via temporary macro).
% That's all about it.
% \begin{macrocode}
\def\lst@InlineJ#1{%
- \def\lst@temp##1#1{%
- \let\lst@arg\@empty \lst@InsideConvert{##1}\lst@arg
- \lst@DeInit\egroup}%
- \lst@temp}
+ \def\lst@temp##1#1{%
+ \let\lst@arg\@empty \lst@InsideConvert{##1}\lst@arg
+ \lst@DeInit\egroup}%
+ \lst@temp}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\lst@InlineG}
-% is experimental.
+% is experimental.
% \begin{macrocode}
\def\lst@InlineG{%
- \lst@Init\relax
- \lst@IfNextCharActive{\lst@InlineM\}}%
- {\let\lst@arg\@empty \lst@InlineGJ}}
+ \lst@Init\relax
+ \lst@IfNextCharActive{\lst@InlineM\}}{%
+ \let\lst@arg\@empty \lst@InlineGJ}}
+% \end{macrocode}
+% This is the point for closing the group:
+% \begin{macrocode}
+\edef\lst@temp{\the\catcode`\^^@}
+\catcode`\^^@=2
\def\lst@InlineGJ{\futurelet\@let@token\lst@InlineGJTest}
\def\lst@InlineGJTest{%
- \ifx\@let@token\egroup
- \afterassignment\lst@InlineGJEnd
- \expandafter\let\expandafter\@let@token
+ \ifx\@let@token\egroup
+ \iffalse{\fi\romannumeral`^^@
+ \afterassignment\lst@InlineGJEnd
+ \expandafter\let\expandafter\@let@token
+ \else
+ \ifx\@let@token\@sptoken
+ \let\lst@next\lst@InlineGJReadSp
\else
- \ifx\@let@token\@sptoken
- \let\lst@next\lst@InlineGJReadSp
- \else
- \let\lst@next\lst@InlineGJRead
- \fi
- \expandafter\lst@next
+ \let\lst@next\lst@InlineGJRead
+ \fi
+ \expandafter\lst@next
\fi}
+% \end{macrocode}
+% As before: restore the previous catcode of |\^^@|:
+% \begin{macrocode}
+\catcode`\^^@=\lst@temp
\def\lst@InlineGJEnd{\lst@arg\lst@DeInit\egroup}
\def\lst@InlineGJRead#1{%
- \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
- \lst@InlineGJ}
+ \lccode`\~=`#1\lowercase{\lst@lAddTo\lst@arg~}%
+ \lst@InlineGJ}
\def\lst@InlineGJReadSp#1{%
- \lccode`\~=`\ \lowercase{\lst@lAddTo\lst@arg~}%
- \lst@InlineGJ#1}
+ \lccode`\~=`\ \lowercase{\lst@lAddTo\lst@arg~}%
+ \lst@InlineGJ#1}
% \end{macrocode}
% \end{macro}
%
@@ -15313,7 +15357,7 @@
%
% \begin{macro}{\lst@MSkipToFirst}
% We just look whether to drop more lines or to leave the mode which restores
-% the definition of chr(13) and chr(10).
+% the definition of |chr(13)| and |chr(10)|.
% \begin{macrocode}
\def\lst@MSkipToFirst{%
\global\advance\lst@lineno\@ne
@@ -15391,7 +15435,7 @@
% \end{macrocode}
% We must append an active backslash and the `end string' to |\lst@arg|. So all
% (in fact most) other processing won't notice that the code has been inside
-% an argument. But the EOL character is chr(10)=|^^J| now and not chr(13).
+% an argument. But the EOL character is |chr(10)|=|^^J| now and not |chr(13)|.
% \begin{macrocode}
\begingroup \lccode`\~=`\\\lowercase{%
\gdef\lstenv@ProcessJ@{%
diff --git a/macros/latex/contrib/listings/listings.pdf b/macros/latex/contrib/listings/listings.pdf
index 41c366106a..b4bfc0d79e 100644
--- a/macros/latex/contrib/listings/listings.pdf
+++ b/macros/latex/contrib/listings/listings.pdf
Binary files differ
diff --git a/macros/latex/contrib/listings/lstdrvrs.dtx b/macros/latex/contrib/listings/lstdrvrs.dtx
index 56c2a92642..8541b7a0b9 100644
--- a/macros/latex/contrib/listings/lstdrvrs.dtx
+++ b/macros/latex/contrib/listings/lstdrvrs.dtx
@@ -1,6 +1,6 @@
% \iffalse
%
-% Time-stamp: <2024-03-12 09:33:03 ax006ho>
+% Time-stamp: <2024-05-25 06:23:16 ax006ho>
%
%<*driver>
\documentclass{ltxdoc}
@@ -33,7 +33,7 @@
% \title{Language, Style and Format drivers\\ for \textsf{Listings}\\
% {\large by Carsten Heinz and individual authors:}}
% \author{\InputIfFileExists{lstdrvrs.tmp}{}{}}
-% \date{2024/03/11\enspace\enspace Version 1.10a\ \box\abstractbox}
+% \date{2024/05/25\enspace\enspace Version 1.10b\ \box\abstractbox}
%
% \ifhyper
% \hypersetup{pdftitle={Language, Style and Format drivers for the
@@ -138,7 +138,7 @@
% \endgroup
% We mainly define default dialects.
% \begin{macrocode}
-\ProvidesFile{listings.cfg}[2024/03/11 1.10a listings configuration]
+\ProvidesFile{listings.cfg}[2024/05/25 1.10b listings configuration]
\def\lstlanguagefiles
{lstlang0.sty,lstlang1.sty,lstlang2.sty,lstlang3.sty}
\lstset{defaultdialect=[R/3 6.10]ABAP,
@@ -154,6 +154,7 @@
defaultdialect=[11.0]Mathematica,
defaultdialect=[OMG]OCL,
defaultdialect=[Standard]Pascal,
+ defaultdialect=[2]Python,
defaultdialect=[67]Simula,
defaultdialect=[plain]TeX,
defaultdialect=[97]VRML}
@@ -186,7 +187,7 @@
%<+lua-prf>\ProvidesFile{listings-lua.prf}
%<+python-prf>\ProvidesFile{listings-python.prf}
%<+rexx-prf>\ProvidesFile{listings-rexx.prf}
-%<-config> [2024/03/11 1.10a listings language file]
+%<-config> [2024/05/25 1.10b listings language file]
% \end{macrocode}
%
%
@@ -7819,7 +7820,8 @@ morecomment=[l]!%
%
% In August 2013
% \lstthanks{Alexis~Dimitriadis}{A.Dimitriadis@uu.nl}{2013/08/15} reworked
-% the definition by supplying the builtins.
+% the definition by supplying the builtins. The current version is based on
+% \url{https://docs.python.org/2/reference/lexical_analysis.html#identifiers}.
% \begingroup
% \begin{macrocode}
%<*lang1>
@@ -7828,17 +7830,22 @@ morecomment=[l]!%
%%
%% Python definition (c) 1998 Michael Weber
%% Additional definitions (2013) Alexis Dimitriadis
+%% small corrections based on
+%% https://docs.python.org/2/reference/lexical_analysis.html#identifiers
%%
-\lst@definelanguage{Python}{%
- morekeywords={access, and, break, class, continue, def, del, elif, else,%
- except, exec, finally, for, from, global, if, import, in, is, lambda,%
- not, or, pass, print, raise, return, try, while},%
+\lst@definelanguage[2]{Python}{%
+ morekeywords={and, as, assert, break, class, continue, def, del, elif,%
+ else, except, exec, finally, for, from, global, if, import, in, is,%
+ lambda, not, or, pass, print, raise, return, try, while, with, yield},%
% \end{macrocode}
-% Python has a long list of builtin-in functions
+% Python has a long list of builtin-in functions (altogether 76 entries
+% plus 5 special ones)
% (\url{http://docs.python.org/2/library/functions.html}) and it is a good
-% idea to make them visible in printed code
+% idea to make them visible in printed code.
% \begin{macrocode}
- % Built-ins
+ % Built-ins according to
+ % http://docs.python.org/2/library/functions.html,
+ % the last five entries are known as advanced or not essential
morekeywords=[2]{abs, all, any, basestring, bin, bool, bytearray,%
callable, chr, classmethod, cmp, compile, complex, delattr, dict, dir,%
divmod, enumerate, eval, execfile, file, filter, float, format,%
@@ -7847,43 +7854,96 @@ morecomment=[l]!%
memoryview, min, next, object, oct, open, ord, pow, property, range,%
raw_input, reduce, reload, repr, reversed, round, set, setattr, slice,%
sorted, staticmethod, str, sum, super, tuple, type, unichr, unicode,%
- vars, xrange, zip, apply, buffer, coerce, intern},%
+ vars, xrange, zip, __import__, apply, buffer, coerce, intern},%
sensitive=true,%
morecomment=[l]\#,%
+ morestring=[s]{'''}{'''},% used for documentation text
+ % (multiline strings)
+ morestring=[s]{"""}{"""},% added by Philipp Matthias Hahn
morestring=[b]',%
- morestring=[b]",%
-% \end{macrocode}
-% According to PEP (Python Enhancement Proposals) comment should be
-% distinguished from documentation strings, so we define
-% \begin{macrocode}
- morecomment=[s]{'''}{'''},% used for documentation text
- % (mulitiline strings)
- morecomment=[s]{"""}{"""},% added by Philipp Matthias Hahn
-% \end{macrocode}
-% \lsthelper{J\"urgen Dietel}{j.dietel@rz.rwth-aachen}{2015/05/05}{} provided
-% an example with a wrong representation of documentation strings, so the
-% two lines above got changed from |morestring| $\rightarrow$ |morecomment|.
-%
-% Python now supports so called \emph{raw strings} and also Unicode
-% strings. Here is the definition of these strings:
-% \begin{macrocode}
- morestring=[s]{r'}{'},% `raw' strings
- morestring=[s]{r"}{"},%
- morestring=[s]{r'''}{'''},%
- morestring=[s]{r"""}{"""},%
- morestring=[s]{u'}{'},% unicode strings
- morestring=[s]{u"}{"},%
- morestring=[s]{u'''}{'''},%
- morestring=[s]{u"""}{"""}%
-}%
+ morestring=[b]"%
+}
% \end{macrocode}
% \lsthelper{Philipp Matthias Hahn}{pmhahn@titan.lahn.de}{2002/04/18}{}
-% added the third comment. \lsthelper{eRreuR}{rogspr@newdeal.ch}{2002/05/28}
-% {probl\`eme avec "listings" et le langage Python} found a bug using Python
-% and \lsthelper{Nicolas Markey}{markey@lsv.ens-cachan.fr}{2002/05/29}
+% added the third comment above.
+% \lsthelper{eRreuR}{rogspr@newdeal.ch}{2002/05/28} {probl\`eme avec
+% "listings" et le langage Python} found a bug using Python and
+% \lsthelper{Nicolas Markey}{markey@lsv.ens-cachan.fr}{2002/05/29}
% {listings and Python} informed me about the corresponding thread on
% \texttt{fr.comp.text.tex} and provided the fix---adding \texttt{[b]} to
% both \texttt{morestring} declarations.
+%
+% \lsthelper{J\"urgen Dietel}{j.dietel@rz.rwth-aachen}{2015/05/05}{}
+% provided an example with a wrong representation of documentation strings,
+% so the two lines added by Philipp Matthias Hahn got changed from
+% |morestring| $\rightarrow$ |morecomment|.\footnote{According to PEP
+% (Python Enhancement Proposals---\url{https://peps.python.org/pep-0257/})
+% comment should be distinguished from documentation strings.}
+%
+% Python 3.0 was released in December 2008 and brought with it a number of
+% new features. \lsthelper{Naoki Sean
+% Pross}{npross@student.ethz.ch}{2024/05/25}{Python 3 syntax support for
+% the listings LaTeX package} provided the lists of new keywords and
+% built-in functions as well as the support for special strings.
+% \begin{macrocode}
+\lst@definelanguage[3]{Python}[2]{Python}{%
+ % keywords
+ deletekeywords={exec, print},
+ morekeywords={False, None, True, async, await, nonlocal,
+% \end{macrocode}
+% Python knows so called soft keywords:
+% \begin{macrocode}
+ match, case},
+% \end{macrocode}
+% The list of built-in functions has changed considerably (only 71 entries,
+% no special ones):
+% \begin{macrocode}
+ % built-in functions
+ deletekeywords=[2]{apply, basestring, buffer, cmp, coerce, execfile, %
+ file, intern, long, raw_input, reduce, reload, unichr, unicode, xrange},
+ morekeywords=[2]{aiter, anext, ascii, breakpoint, bytes, exec},
+% \end{macrocode}
+% Python now supports special strings like \emph{raw strings}, Unicode
+% strings, and some more. Here is the definition of these strings:
+% \begin{macrocode}
+ % `raw' strings
+ morestring=[s]{r'}{'},
+ morestring=[s]{r"}{"},
+ morestring=[s]{r'''}{'''},
+ morestring=[s]{r"""}{"""},
+ morestring=[s]{R'}{'},
+ morestring=[s]{R"}{"},
+ morestring=[s]{R'''}{'''},
+ morestring=[s]{R"""}{"""},
+ % Unicode strings
+ morestring=[s]{u'}{'},
+ morestring=[s]{u"}{"},
+ morestring=[s]{u'''}{'''},
+ morestring=[s]{u"""}{"""},
+ morestring=[s]{U'}{'},
+ morestring=[s]{U"}{"},
+ morestring=[s]{U'''}{'''},
+ morestring=[s]{U"""}{"""},
+ % Format strings
+ morestring=[s]{f'}{'},
+ morestring=[s]{f"}{"},
+ morestring=[s]{f'''}{'''},
+ morestring=[s]{f"""}{"""},
+ morestring=[s]{F'}{'},
+ morestring=[s]{F"}{"},
+ morestring=[s]{F'''}{'''},
+ morestring=[s]{F"""}{"""},
+ % Byte literals
+ morestring=[s]{b'}{'},
+ morestring=[s]{b"}{"},
+ morestring=[s]{b'''}{'''},
+ morestring=[s]{b"""}{"""},
+ morestring=[s]{B'}{'},
+ morestring=[s]{B"}{"},
+ morestring=[s]{B'''}{'''},
+ morestring=[s]{B"""}{"""},
+}%
+% \end{macrocode}
% \begin{macrocode}
%</lang1>
% \end{macrocode}
@@ -7903,6 +7963,8 @@ morecomment=[l]!%
%% Actual colors from idlelib/config-highlight.def
%% --> corrected to ``web-safe''
+%% Unimplemented IDLE syntax: function/class names being
+%% defined should be blue
%% strings = #00aa00 / 0,170,0 (a darker green)
%% builtins = #900090 / 144,0,144 (purple-ish)
%% keywords = #FF7700 / 255,119,0 (quite close to plain `orange')
@@ -7958,6 +8020,7 @@ morecomment=[l]!%
procedure,pull,push,queue,return,say,select,signal,then,%
to,trace,when},%
sensitive=false,%
+ morecomment=[l]{--},%
morecomment=[n]{/*}{*/},%
morestring=[d]{'},%
morestring=[d]{"},%
@@ -7999,7 +8062,6 @@ morecomment=[l]!%
sensitive=false,%
morestring=[d]",%
morestring=[d]',%
- morecomment=[s]{/*}{*/},%
}[keywords,comments,strings]
% \end{macrocode}
% \begin{macrocode}
@@ -8026,7 +8088,7 @@ morecomment=[l]!%
::options, ::requires, ::resource, ::routine,%
forward, guard, local, loop, raise, strict,%
},%
- alsoletter={:},%
+ alsoletter={:}
}[keywords,comments,strings]
% \end{macrocode}
% \begin{macrocode}
@@ -8042,38 +8104,22 @@ morecomment=[l]!%
%<*rexx-prf>
% \end{macrocode}
% \begin{macrocode}
-\usepackage{xcolor}
-\usepackage{textcomp}
-
-%% Actual colors from idlelib/config-highlight.def
-%% --> corrected to ``web-safe''
-%% strings = #00aa00 / 0,170,0 (a darker green)
-%% builtins = #900090 / 144,0,144 (purple-ish)
-%% keywords = #FF7700 / 255,119,0 (quite close to plain `orange')
-%\definecolor{IDLEorange}{RGB}{255,119,0} % pretty close to real orange
-%\definecolor{IDLEpurple}{RGB}{144,0,144}
-%\definecolor{IDLEgreen}{RGB}{0,170,0}
-%\definecolor{IDLEred}{RGB}{221,0,0}
-%% Corrected to ``web-safe''
-%\definecolor{orange2}{RGB}{255,102,0}
-\definecolor{purple2}{RGB}{153,0,153} % there's actually no standard purple
-\definecolor{green2}{RGB}{0,153,0} % a darker green
-%\definecolor{red2}{RGB}{221,0,0}
+\usepackage{xcolor} % needed for colors like yellow!10
+\usepackage{textcomp} % needed for upquote
-% Except for green and purple, the other colors are pretty good in standard
-% hue
-\lstdefinestyle{python-idle-code}{%
- language=Python, % the language
- basicstyle=\normalsize\ttfamily, % size of the fonts for the code
- % Color settings to match IDLE style
- keywordstyle=\color{orange}, % core keywords
- keywordstyle={[2]\color{purple2}}, % built-ins
- stringstyle=\color{green2},%
- commentstyle=\color{red},%
+\lstdefinestyle{rexx-colored}{%
+ language=oorexx, % the language
+ backgroundcolor=\color{yellow!10},
+ basicstyle=\normalsize\ttfamily, % size of the fonts for
+ % the code
+ % Color settings to match JHf's preferred style
+ keywordstyle=\color{blue}, % core keywords
+ keywordstyle={[2]\color{cyan}}, % built-ins
+ keywordstyle={[3]\color{olive}}, % special keywords
+ stringstyle=\color{teal},%
+ commentstyle=\color{orange},%
upquote=true, % requires textcomp
}
-% Unimplemented IDLE syntax: function/class names being defined should be
-% blue
% \end{macrocode}
% This code is provided in the file |listings-rexx.prf|, see section
% 2.4.1 (Preferences) of the \packagename{listings} documentation.
diff --git a/macros/latex/contrib/listings/lstdrvrs.pdf b/macros/latex/contrib/listings/lstdrvrs.pdf
index e5ded0321c..0315d2cad2 100644
--- a/macros/latex/contrib/listings/lstdrvrs.pdf
+++ b/macros/latex/contrib/listings/lstdrvrs.pdf
Binary files differ
diff --git a/macros/latex/contrib/litesolution/README.md b/macros/latex/contrib/litesolution/README.md
index 36b84425dc..f597d5fb09 100644
--- a/macros/latex/contrib/litesolution/README.md
+++ b/macros/latex/contrib/litesolution/README.md
@@ -1,17 +1,19 @@
-# The `LiteSolution` package
+# The `LiteSolution` class
-This template provides a fresh design for typesetting solutions of midterm or final exam, textbooks and other exercises.
+The LiteSolution class is designed for typesetting solutions of problems in exams, textbooks, etc.
-**Welcome to pull requests
-[here](https://github.com/xiamyphys/litesolution).**
+**Welcome to pull requests [here](https://github.com/xiamyphys/litesolution/pulls).**
## License
-This work may be distributed and/or modified under the conditions of the
-[LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
-either version 1.3c of this license or (at your option) any later version.
+This work may be distributed and/or modified under the conditions of the [LaTeX Project Public License](http://www.latex-project.org/lppl.txt), either version 1.3c of this license or (at your option) any later version.
This work has the LPPL maintenance status `maintained`.
-The Current Maintainer of this work is
-[Mingyu Hsia](https://www.ctan.org/author/xia-my). \ No newline at end of file
+The Current Maintainer of this work is [Mingyu Hsia](https://www.ctan.org/author/xia-my).
+
+## Derivative Works
+
+- [notebeamer](https://ctan.org/pkg/notebeamer): Package provides macros for inputting slides on note papers quickly.
+
+- [fadingimage](https://ctan.org/pkg/fadingimage): Package provides macros for inputting full width picture at the edges of pages quickly.
diff --git a/macros/latex/contrib/litesolution/doc/figure/universe.pdf b/macros/latex/contrib/litesolution/doc/figure/universe.pdf
index 7795e2b843..6ebe5201dc 100644
--- a/macros/latex/contrib/litesolution/doc/figure/universe.pdf
+++ b/macros/latex/contrib/litesolution/doc/figure/universe.pdf
Binary files differ
diff --git a/macros/latex/contrib/litesolution/doc/figure/universe.tex b/macros/latex/contrib/litesolution/doc/figure/universe.tex
index 3f432e5421..f2fa69eaab 100644
--- a/macros/latex/contrib/litesolution/doc/figure/universe.tex
+++ b/macros/latex/contrib/litesolution/doc/figure/universe.tex
@@ -1,14 +1,14 @@
\documentclass[svgnames,tikz]{standalone}
-\usepackage{xcolor}\let\Bbbk\relax
+\usepackage{xcolor}
\usepackage{newtxtext,mtpro2,cancel,physics2,xfrac}
\usephysicsmodule{ab.legacy}
\usetikzlibrary{tikzmark}
-\tikzset{every node/.style={align=center,MidnightBlue!30},
- every path/.style={MidnightBlue!30,line cap=round}}
+\tikzset{every node/.style={align=center,DarkSlateGray!30},
+ every path/.style={DarkSlateGray!30,line cap=round}}
\begin{document}\tikz{
- \node [above right] at (0,0) {$\color{MidnightBlue!30}
+ \node [above right] at (0,0) {$\color{DarkSlateGray!30}
\tikzmarknode a\Psi=\displaystyle\tikzmarknode b\int
\tikzmarknode c{\mathrm e}^{
\sfrac{\tikzmarknode d{\mathrm i}}{\tikzmarknode e\hbar}
@@ -40,5 +40,5 @@
node [scale=.45,above] {\footnotesize $\varphi$ - $\psi$ interaction\\Yukawa};
\draw ([yshift=-1ex] l.south) coordinate (L) --++ (0,-.3)
node [scale=.45,below] {Higgs\\\footnotesize Boson};
- \foreach \x in {A,B,...,L}\fill [MidnightBlue!30] (\x) circle (.025);}
+ \foreach \x in {A,B,...,L}\fill [DarkSlateGray!30] (\x) circle (.025);}
\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/litesolution/doc/litesolution.pdf b/macros/latex/contrib/litesolution/doc/litesolution.pdf
index 725a19a8d6..8d9efb2ba3 100644
--- a/macros/latex/contrib/litesolution/doc/litesolution.pdf
+++ b/macros/latex/contrib/litesolution/doc/litesolution.pdf
Binary files differ
diff --git a/macros/latex/contrib/litesolution/doc/litesolution.tex b/macros/latex/contrib/litesolution/doc/litesolution.tex
index 3a1212f47e..678e4cd4aa 100644
--- a/macros/latex/contrib/litesolution/doc/litesolution.tex
+++ b/macros/latex/contrib/litesolution/doc/litesolution.tex
@@ -1,27 +1,28 @@
-\documentclass[ans,mtpro2]{litesolution}
+\documentclass[mtpro2,twoside,openany]{litesolution}
\usepackage[listings]{tcolorbox}
-\usepackage{fancyvrb}
-
\lstset{language=[LaTeX]TeX,basicstyle=\small\ttfamily,breaklines=true,columns=flexible}
+
\title{\sffamily The \pkg{LiteSolution} Class}
\subtitle{\sffamily\scshape Hangzhou Dianzi University}
-\bioinfo{\scshape\sffamily Mingyu Hsia, \href{mailto:xiamyphys@gmail.com}{\ttfamily xiamyphys@gmail.com} | \today, Version 2.1c}
-\cover[checkerboard]{schrodinger}\coverhead[5]{universe}
+\bioinfo{Mingyu Hsia (\mailto{xiamyphys@hdu.edu.cn})\quad|\quad\today\quad|\quad Version 2.2b}
+\cover[checkerboard]{schrodinger}\coverhead[3]{universe}
\begin{document}
-\maketitle[MidnightBlue]
-\chapterimage{\UPFadingImage[trim={0 {.9\paperheight} 0 0},clip]{Beautiful-realities}}
-\chapter{An Introduction to The \pkg{LiteSolution} Class}
+\maketitle[DarkSlateGray]
+\frontmatter\tableofcontents\mainmatter
+\chapterimage{\UPFadingImage*[trim={0 {.9\paperheight} 0 0},clip]{Beautiful-realities}}
+
+\chapter{Introduction to the \pkg{LiteSolution} Class}
-\section{Introduction}
+\section{Preface}
-This is the document for the \pkg{litesolution} class, which provides a lite design for typesetting solutions of exams, textbooks or other exercises.
+This is the document for the \pkg{LiteSolution} class, which is designed for typesetting solutions of problems in exams, textbooks, etc.
-Welcome to feedback bugs or ideas via email \href{mailto:xiamyphys@gmail.com}{\ttfamily xiamyphys@gmail.com} or \href{https://github.com/xiamyphys/litesolution}{GitHub}.
+Welcome to feedback bugs or ideas via email \href{mailto:xiamyphys@hdu.edu.cn}{\ttfamily xiamyphys@hdu.edu.cn} or \href{https://github.com/xiamyphys/litesolution}{GitHub}.
-\subsection{Installing \pkg{litesolution} and loading it}
+\subsection{Installing \pkg{LiteSolution} and loading it}
Simply download \verb|litesolution.cls| file from \href{https://github.com/xiamyphys/litesolution}{GitHub} or \href{https://ctan.org/pkg/litesolution}{CTAN} and save it under your working directory. However, I strongly suggest to use terminal to install and update all packages to the latest version
@@ -43,36 +44,40 @@ The test environments are macOS + Mac\hologo{TeX} 2024 / Overleaf / Ubuntu 22.04
\subsection{The \mode{answer} option}
-The \mode{ans} and \mode{noans} modes can show or hide contents in \cmd{solution} environment and \cmd{ans} command.
+The \mode{hideanswer} mode can hide contents in \cmd{solution} environment and \cmd{ans} command.
-\subsection{The \mode{counter} option}
+\subsection{The \mode{math} option}
-The \mode{separate} and \mode{continuous} modes can make the page number between chapters be reset or continuous.
+The \mode{mtpro2}, \mode{newtx} and \mode{newtxsf} modes can format the font of formulas in the document. Please check if mtpro2 font has been installed on your computer correctly before using \mode{mtpro2} mode.
-\subsection{The \mode{math} option}
+\section{Related Packages}
+\begin{description}
+ \item[Package \pkg{notebeamer}] provides macros for inputting slides on note papers quickly.
+ \item[Package \pkg{fadingimage}] provides macros for inputting full width picture at the edges of pages quickly.
+\end{description}
-The \mode{mtpro2} and \mode{newtx} modes can format the font of formulas in the document. Please check if mtpro2 font has been installed on your computer correctly before using \mode{mtpro2} mode.
+\chapter{Settings \& Usages of this Class}
\section{Cover Configurations}
\subsection{The cover page configurations}
\begin{verbatim}
- \title{<content>} \subtitle{<content>}
- \bioinfo{<content>} \cover[<pattern>]{<image>}
- \coverhead[<angle>]{<image>} \coverhead*[<angle>]{<content>}
+ \title{<content>} \subtitle{<content>}
+ \bioinfo{<content>} \cover[<pattern>]{<image>}
+ \coverhead[<angle>]{<image>} \coverhead*[<angle>]{<content>}
- \begin{document} \maketitle[<color>]
+ \begin{document} \maketitle[<color>]
\end{verbatim}
\begin{verbatim}
- \title{\sffamily The \pkg{litesolution} Class}
+ \title{\sffamily The \pkg{LiteSolution} Class}
\subtitle{\sffamily\scshape Hangzhou Dianzi University}
- \bioinfo{\scshape\sffamily Mingyu Hsia, \href{mailto:xiamyphys@gmail.com}
- {\ttfamily xiamyphys@gmail.com} | \today, Version 2.1a}
- \cover[checkerboard]{schrodinger} \coverhead[5]{universe}
+ \bioinfo{Mingyu Hsia (\mailto{xiamyphys@hdu.edu.cn})
+ \quad|\quad\today\quad|\quad Version 2.2b}
+ \cover[checkerboard]{schrodinger} \coverhead[5]{universe}
- \begin{document} \maketitle[Midnightblue]
+ \begin{document} \maketitle[Midnightblue]
\end{verbatim}
\subsection{The chapter head configurations}
@@ -83,6 +88,32 @@ The \mode{mtpro2} and \mode{newtx} modes can format the font of formulas in the
This command can assign the format of the image at every chapters begin and you can adjust the format of the image with the \pkg{fadingimage} package.
+\section{Preset Packages}
+
+This template has preset many packages. The following packages are the common ones
+
+\begin{table}[htbp]
+ \centering\small
+ \begin{tabular}{l l l l l l l l}
+ \toprule
+ \pkg{amsthm} & \pkg{amssymb} & \pkg{bm} & \pkg{booktabs} &
+ \pkg{cancel} & \pkg{caption} & \pkg{circuitikz} & \pkg{datetime} \\
+ \midrule
+ \pkg{derivative} & \pkg{diagbox} & \pkg{esvect} & \pkg{extarrows} &
+ \pkg{fadingimage} & \pkg{fancyhdr} & \pkg{fixdif} & \pkg{fontawesome5} \\
+ \midrule
+ \pkg{geometry} & \pkg{graphics} & \pkg{graphicx} & \pkg{hyperref} &
+ \pkg{indentfirst} & \pkg{lipsum} & \pkg{mathtools} & \pkg{multicol} \\
+ \midrule
+ \pkg{multirow} & \pkg{nicematrix} & \pkg{notebeamer} & \pkg{paracol} &
+ \pkg{pgfplots} & \pkg{physics2} & \pkg{qrcode} & \pkg{refstyle} \\
+ \midrule
+ \pkg{setspace} & \pkg{siunitx} & \pkg{tabularx} & \pkg{tasks} &
+ \pkg{wallpaper} & \pkg{xcolor} & \pkg{xeCJK} & \pkg{xfrac} \\
+ \bottomrule
+ \end{tabular}
+\end{table}
+
\section{Preset Commands}
\subsection{The \cmd{ans} command}
@@ -91,7 +122,7 @@ This command can assign the format of the image at every chapters begin and you
\ans {<contents>}
\end{verbatim}
-This command can underline the answer, and if mode \mode{noans} is enabled, the answer will be hidden.
+This command can underline the answer, and if mode \mode{noans} is enabled the answer will be hidden.
\subsection{The \cmd{solute} command}
@@ -105,7 +136,7 @@ This command can create a fixable answer box when the mode \mode{noans} is enabl
\begin{verbatim}
\def\i{\mathrm i} \def\e{\mathrm e} \def\T{\mathsf T}
- \let\leq\leqslant \let\geq\geqslant
+ \let\leq\leqslant \let\geq\geqslant \let\vec\vv
\end{verbatim}
\section{Preset \pkg{amsthm} Environments}
@@ -113,7 +144,7 @@ This command can create a fixable answer box when the mode \mode{noans} is enabl
\subsection{The \cmd{problem} environment}
\begin{tcblisting}{sidebyside,colback=DarkGreen!5,colframe=DarkGreen!80}
-\begin{problem}\leavevmode
+\begin{problem}[<Keywords>]\leavevmode
\begin{tasks}(2)
\task Choice A \task[\true] Choice B
\task Choice C \task Choice D
@@ -139,42 +170,14 @@ This command can create a fixable answer box when the mode \mode{noans} is enabl
\end{tcblisting}
\end{minipage}
-\subsection{Equation test}
-
-\[\i\hbar\partial_t\psi(\mathbf x,t)=-(\i\hbar c\bm\alpha\cdot\bm\nabla+\beta mc^2)\psi(\mathbf x,t)\]
-
-\section{Preset packages}
-
-This template has preset many packages. The following packages are the common ones
-
-\begin{table}[htbp]
- \centering
- \begin{tabular}{l l l l l l l l}
- \toprule
- \pkg{amsthm} & \pkg{bm} & \pkg{booktabs} & \pkg{cancel} & \pkg{caption} & \pkg{circuitikz} & \pkg{datetime} & \pkg{derivative}\\
- \midrule
- \pkg{diagbox} & \pkg{esvect} & \pkg{extarrows} & \pkg{fancyhdr} & \pkg{fixdif} & \pkg{fontawesome5} & \pkg{geometry} & \pkg{indentfirst}\\
- \midrule
- \pkg{lipsum} & \pkg{multicol} & \pkg{multirow} & \pkg{nicematrix} & \pkg{paracol} & \pkg{pgfplots} & \pkg{physics2} & \pkg{refstyle} \\
- \midrule
- \pkg{setspace} & \pkg{siunitx} & \pkg{tabularx} & \pkg{tasks} & \pkg{wallpaper} & \pkg{xcolor} & \pkg{xeCJK} & \pkg{xfrac}\\
- \bottomrule
- \end{tabular}
-\end{table}
-
-\section{Related packages}
-
-\subsection{The \pkg{notebeamer} package}
-
-This package provides an easy way to input slides on note papers quickly for making annotations.
-
-\subsection{The \pkg{fadingimage} package}
-
-This package provides three commands for adding fading full width picture at the top or bottom of a page.
+\section{Equation test}
-\clearpage\appendix\def\thesection{Appendix}
+\[\begin{cases}
+ \i\hbar\partial_t\psi(\mathbf x,t)=\ab(-\frac{\hbar^2}{2m}\bm\nabla^2+V)\\
+ \i\hbar\partial_t\psi(\mathbf x,t)=-(\i\hbar c\bm\alpha\cdot\bm\nabla+\beta mc^2)\psi(\mathbf x,t)
+\end{cases}\]
-\section{Original code for the cover head}
+\section*{Original Code for the Cover Head}
\setstretch{1.15}
\lstinputlisting{figure/universe.tex}
diff --git a/macros/latex/contrib/litesolution/tex/litesolution.cls b/macros/latex/contrib/litesolution/tex/litesolution.cls
index 5cd81c3155..0f59d89630 100644
--- a/macros/latex/contrib/litesolution/tex/litesolution.cls
+++ b/macros/latex/contrib/litesolution/tex/litesolution.cls
@@ -1,5 +1,5 @@
%% ***********************************************************
-%% Copyright 2024 by Mingyu Hsia <xiamyphys@gmail.com> *
+%% Copyright 2024 by Mingyu Hsia <xiamyphys@hdu.edu.cn> *
%% *
%% This work may be distributed and/or modified under *
%% the conditions of the LaTeX Project Public License *
@@ -19,35 +19,27 @@
%% ***********************************************************
% !Mode:: "TeX:UTF-8"
\NeedsTeXFormat{LaTeX2e}
+\PassOptionsToPackage{no-math}{fontspec}
\PassOptionsToPackage{svgnames}{xcolor}
-\ProvidesClass{litesolution}[2024/04/20 v2.1c LiteSolution document class]
+\ProvidesClass{litesolution}[2024/05/07 v2.2b LiteSolution document class]
\RequirePackage{kvoptions}
\RequirePackage{etoolbox}
\SetupKeyvalOptions{family=LITE, prefix=LITE@, setkeys=\kvsetkeys}
\def\ekv#1{\kvsetkeys{LITE}{#1}}
-\DeclareStringOption[ans]{answer}
-\DeclareVoidOption{ans}{\ekv{answer=ans}}
-\DeclareVoidOption{noans}{\ekv{answer=noans}}
+\DeclareStringOption{answer}
+\DeclareVoidOption{hideanswer}{\ekv{answer=hideanswer}}
\DeclareStringOption[newtx]{math}
\DeclareVoidOption{newtx}{\ekv{math=newtx}}
+\DeclareVoidOption{newtxsf}{\ekv{math=newtxsf}}
\DeclareVoidOption{mtpro2}{\ekv{math=mtpro2}}
-\DeclareStringOption[separate]{counter}
-\DeclareVoidOption{separate}{\ekv{counter=separate}}
-\DeclareVoidOption{continuous}{\ekv{counter=continuous}}
-
\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{book}}
\ProcessKeyvalOptions*\relax
-\LoadClass[letterpaper,11pt,openany]{book}
+\LoadClass[letterpaper,11pt]{book}
-\RequirePackage{setspace,datetime,caption,booktabs,multicol,diagbox,paracol,enumitem}
-\RequirePackage[notelinecolor=MidnightBlue,notemargin=.75in]{notebeamer}
-\RequirePackage[nokeyprefix]{refstyle}
-\newref{fig}{name={\sffamily\bfseries Figure~}}
-\newref{tab}{name={\sffamily\bfseries Table~}}
-\geometry{margin=1in}
+\RequirePackage{setspace,datetime,caption,booktabs,multicol,diagbox,paracol}
\linespread{1.3}
\ddmmyyyydate
\captionsetup{labelsep=period,labelfont={bf,sf},font=small}
@@ -56,8 +48,15 @@
\AtBeginEnvironment{paracol}{\nointerlineskip}
\AfterEndEnvironment{paracol}{\nointerlineskip}
\columnratio{.64}
+\RequirePackage[inline]{enumitem}
\setlist[enumerate]{itemsep=.5ex}
\setlist[itemize]{itemsep=.5ex}
+\RequirePackage[notelinecolor=MidnightBlue,notemargin=.75in]{notebeamer}
+\geometry{margin=1in}
+\RequirePackage[nokeyprefix]{refstyle}
+\newref{eq}{refcmd=(\ref{#1}),name={\sffamily eq.~},Name={\sffamily Eq.~}}
+\newref{fig}{name={\sffamily fig.~},Name={\sffamily Fig.~}}
+\newref{tab}{name={\sffamily tab.~},Name={\sffamily Tab.~}}
\RequirePackage{graphics,graphicx,wallpaper,pagecolor}
\graphicspath{{./figure/}{./figures/}{./image/}{./images/}{./graphics/}{./graphic/}{./pictures/}{./picture/}}
@@ -70,19 +69,30 @@
\fi
\ifdefstring{\LITE@math}{mtpro2}{%
- \RequirePackage{amssymb}
- \let\Bbbk\relax
\RequirePackage[mtpscr,mtpccal,mtpfrak]{mtpro2}
+ \let\Bbbk\relax
\RequirePackage[mono=false]{libertine}
}{\relax}
-
\ifdefstring{\LITE@math}{newtx}{%
\RequirePackage[libertine,mono=false]{newtx}
+ \let\Bbbk\relax
+}{\relax}
+\ifdefstring{\LITE@math}{newtxsf}{%
+ \RequirePackage{newtxsf,mathrsfs}
+ \RequirePackage[mono=false]{libertine}
}{\relax}
\let\openbox\relax\def\hmmax{0}\def\bmmax{0}
-\RequirePackage{amsthm,physics2,bm,fixdif,derivative,cancel,extarrows,siunitx,xfrac,nicematrix}
+\RequirePackage{amsthm,amssymb,mathtools,physics2,bm,fixdif,derivative,cancel,extarrows,siunitx,xfrac,nicematrix}
+\renewcommand\qedsymbol{$\color{gray}\blacksquare$}
\usephysicsmodule{ab,braket,diagmat,doubleprod,xmat,ab.legacy,op.legacy}
\RequirePackage[e]{esvect}
+\let\vec\vv
+\renewcommand*\env@cases[1][.84]{%
+ \let\@ifnextchar\new@ifnextchar
+ \left\lbrace
+ \def\arraystretch{#1}%
+ \array{@{}l@{\quad}l@{}}%
+}
\AtBeginDocument{%
\def\i{\mathrm i}\def\e{\mathrm e}\def\T{\mathsf T}
\let\leq\leqslant\let\geq\geqslant
@@ -91,6 +101,7 @@
}
\RequirePackage[hidelinks]{hyperref}
+\def\mailto#1{\href{mailto:#1}{\ttfamily #1}}
\RequirePackage{fontawesome5}
\AddToHook{cmd/faIcon/before}{%
\begingroup\fontsize{\fpeval{\f@size*.8}}{0}\selectfont
@@ -98,9 +109,9 @@
\AddToHook{cmd/faIcon/after}{\endgroup}
\RequirePackage{circuitikz,pgfplots,fadingimage}
-\usetikzlibrary{arrows,tikzmark,patterns,calc,fadings,angles,quotes,intersections}
+\usetikzlibrary{arrows,tikzmark,patterns,calc,angles,quotes,intersections}
\tikzset{>=stealth',
-every picture/.append style={%
+ every picture/.append style={%
line join=round,line cap=round,thick
}}
\pgfplotsset{compat=1.8}
@@ -124,31 +135,25 @@ every picture/.append style={%
\def\subtitle#1{\gdef\@subtitle{#1}}
\def\bioinfo#1{\gdef\@bioinfo{#1}}
-\NewDocumentCommand\coverhead{ s O{0} m }{
- \IfBooleanTF{#1}{
- \gdef\s@coverheadrotate{#2}
- \gdef\s@coverhead{#3}}{
- \gdef\@coverheadrotate{#2}
- \gdef\@coverhead{#3}
- }}
+\NewDocumentCommand\coverhead{ O{0} m }{
+ \gdef\@coverheadrotate{#1}\gdef\@coverhead{#2}
+}
\NewDocumentCommand\cover{ o m }{
\IfValueT{#1}{\gdef\@coverpattern{#1}}
\gdef\@cover{#2}}
\RenewDocumentCommand\maketitle{O{MidnightBlue}}{
- \newgeometry{margin=0in}\newpagecolor{#1!10}
+ \begin{titlepage}
+ \newgeometry{margin=0in}\newpagecolor{#1!15}
\tikz[remember picture,overlay]{
\ifcsname @coverhead\endcsname
- \node[rotate=\@coverheadrotate] at ($(current page.center)+(0,.35*\paperheight)$) {\includegraphics[width=\paperwidth]{\@coverhead}};
- \fi
- \ifcsname s@coverhead\endcsname
- \node[scale=2,color=#1!30,rotate=\s@coverheadrotate] at ($(current page.center)+(0,.35*\paperheight)$) {\s@coverhead};
+ \node [rotate=\@coverheadrotate] at ($(current page.center)+(0,.35*\paperheight)$) {\includegraphics[width=\paperwidth]{\@coverhead}};
\fi
\fill [white,opacity=.5] ($(current page.south west)+(.2*\paperwidth,.6*\paperheight)$) rectangle (current page.south east);
\fill [white,opacity=.5] ($(current page.south west)+(.3*\paperwidth,.7*\paperheight)$) rectangle (current page.south east);
\ifcsname @cover\endcsname
\node [opacity=.5] at ($(current page.south west)+(.65*\paperwidth,.3*\paperheight)$) {\includegraphics[height=.3\paperheight]{\@cover}};
\ifcsname @coverpattern\endcsname
- \fill [pattern=\@coverpattern,pattern color=#1!10!white!50!white!50] ($(current page.south west)+(.3*\paperwidth,0)$) rectangle ++ (.7*\paperwidth,.6\paperheight);
+ \fill [pattern=\@coverpattern,pattern color=#1!15!white!25] ($(current page.south west)+(.3*\paperwidth,0)$) rectangle ++ (.7*\paperwidth,.6\paperheight);
\fi\fi
\node [darkgray] at ($(current page.south west)+(.65*\paperwidth,.65*\paperheight)$) {\Huge\bfseries\@title};
\ifcsname @subtitle\endcsname
@@ -156,65 +161,114 @@ every picture/.append style={%
\fi
\ifcsname @bioinfo\endcsname
\node [gray,opacity=.4] at ($(current page.south)+(.15*\paperwidth,.075*\paperheight)$) {\large\@bioinfo};
- \fi}\restoregeometry\restorepagecolor
+ \fi}
+ \end{titlepage}
+ \restoregeometry\restorepagecolor
+ \if@twoside
+ \clearpage%
+ \newpagecolor{#1!15!white!50}
+ \thispagestyle{empty}%
+ \null\clearpage
+ \fi\restorepagecolor
}
+\RequirePackage{tocloft}
+\setlength{\cftbeforetoctitleskip}{6\p@}
+\setlength{\cftaftertoctitleskip}{24\p@}
+\setlength{\cftbeforesecskip}{3\p@}
+\def\contentsname{\sffamily\scshape\hfill Contents\hfill}
+\setcounter{tocdepth}{1}
+
+\let\@chapapptmp\@chapapp
+\def\@chapapp{\textsc{\@chapapptmp}}
\def\chapterimage#1{\gdef\@chapterimage{#1}}
+\def\HUGE{\@setfontsize\HUGE{30}{40}}
\def\@makechapterhead#1{%
+ \def\thesection{\arabic{chapter}.\arabic{section}}
+ \def\theproblem{\thechapter.\arabic{problem}}
+ \vspace*{-36\p@}{%
+ \parindent \z@ \raggedright \normalfont
+ \ifcsname @chapterimage\endcsname
+ \@chapterimage
+ \else\leavevmode
+ \fi
+ \ifnum \c@secnumdepth >\m@ne
+ \if@mainmatter
+ \parbox{6em}
+ {\centering\HUGE\normalfont\bfseries\textcolor{darkgray}\thechapter\vskip4\p@\normalsize\bfseries\textcolor{darkgray}{\bfseries\sffamily\@chapapp}}%
+ \fi
+ \fi
+ \interlinepenalty\@M\hspace*{3ex}
+ \huge\bfseries #1\par\nobreak
+ \vskip 36\p@
+}}
+\def\@makeschapterhead#1{%
+ \def\thesection{\arabic{section}}
+ \def\theproblem{\arabic{problem}}
\setcounter{section}{0}
\setcounter{problem}{0}
- \setcounter{page}{1}{\centering
+ {\centering
\ifcsname @chapterimage\endcsname
\@chapterimage
- \fi\leavevmode\vskip-42\p@
+ \fi\vskip-40\p@
\parindent \z@ \normalfont
\interlinepenalty\@M
\huge \bfseries #1\par\nobreak
- \vskip 26\p@}}
-
-\def\mailto#1{\href{mailto:#1}{\ttfamily #1}}
-\def\thesection{\arabic{section}}
-\def\ans#1{\underline{~#1~}}
-\AddToHook{cmd/section/before}{\setcounter{problem}{0}}
+ \vskip 28\p@}}
+\let\cleardoublepage=\clearpage
+\renewcommand*{\cleardoublepage}{\clearpage\if@twoside \ifodd\c@page\else
+\ifnum \thechapter=0
+ \vspace*{\fill}
+ {\centering\itshape\Large This page was intentionally left blank.\par}
+ \vspace{\fill}
+\else
+ \clearpage%
+ \thispagestyle{empty}%
+ \null\clearpage
+\fi
+\thispagestyle{empty}\newpage
+\if@twocolumn\hbox{}\newpage\fi\fi\fi}
\RequirePackage{fancyhdr}
\pagestyle{fancy}
\let\oldheadrule\headrule
\renewcommand{\headrule}{{\color{gray}\oldheadrule}}
- \renewcommand{\headrulewidth}{1pt}\cfoot{}
- \fancyhead[OL]{\textsc{\color{darkgray}\nouppercase\leftmark}}
- \fancyhead[OR]{\color{darkgray}\sffamily\thepage}
- \fancyhead[ER]{\textsc{\color{darkgray}\nouppercase\rightmark}}
- \fancyhead[EL]{\color{darkgray}\sffamily\thepage}
+ \renewcommand{\headrulewidth}{1pt}
+ \if@twoside\cfoot{}
+ \fancyhead[OL]{\color{darkgray}\nouppercase\leftmark}
+ \fancyhead[OR]{\color{darkgray}\sffamily\thepage}
+ \fancyhead[ER]{\color{darkgray}\nouppercase\rightmark}
+ \fancyhead[EL]{\color{darkgray}\sffamily\thepage}
+ \else
+ \fancyhead[L]{\color{darkgray}\nouppercase\leftmark}
+ \fancyhead[R]{\color{darkgray}\nouppercase\rightmark}
+ \cfoot{\color{darkgray}\sffamily\thepage}
+ \fi
\setlength{\headheight}{14pt}
+\theoremstyle{definition}
+\newtheorem{problem}{\color{DarkGreen}\faIcon{pen-square}~\textsc{\textsf{Problem}}}[chapter]
+\newtheorem*{solution}{\color{MidnightBlue}\faIcon{check-square}~\textsc{\textsf{Solution}}}
+\newtheorem*{scratch}{\color{MidnightBlue}\faIcon{check-square}~\textsc{\textsf{Scratch}}}
+\newtheorem*{note}{\color{DarkRed}\faIcon{info-circle}~\textsc{\textsf{Note}}}
\RequirePackage{comment}
-\ifdefstring{\LITE@answer}{ans}{%
- \def\ans#1{\underline{~#1~}}
- \def\s@solute#1{\relax}\def\@solute#1{\relax}
- \AtBeginDocument{%
- \excludecomment{draft}
- \let\enddraft\relax}
- \def\true{%
- \addtocounter{task}{1}%
- \faIcon{check-circle}}
-}{\relax}
-
-\ifdefstring{\LITE@answer}{noans}{%
+\ifdefstring{\LITE@answer}{hideanswer}{%
\def\ans#1{\underline{\phantom{#1}}}
\def\choiceans#1{\phantom{#1}}
- \def\s@solute#1{\begin{draft}#1\end{draft}}
- \def\@solute#1{\begin{draft}\leavevmode\vspace*{#1ex}\end{draft}}
+ \def\s@solute#1{\begin{scratch}#1\end{scratch}}
+ \def\@solute#1{\begin{scratch}\leavevmode\vspace*{#1ex}\end{scratch}}
\AtBeginDocument{%
\excludecomment{solution}\excludecomment{note}
\let\endsolution\relax\let\endnote\relax}
\def\true{\addtocounter{task}{1}\thetask}
-}{\relax}
-\def\solute{\@ifstar\s@solute\@solute}
-
-\theoremstyle{definition}
-\newtheorem{problem}{\scshape\sffamily\color{DarkGreen}\faIcon{pen-square}~\scshape Problem}[chapter]
-\def\theproblem{\arabic{problem}}
-\newtheorem*{solution}{\scshape\sffamily\color{MidnightBlue}\faIcon{check-square}~\scshape Solution}
-\newtheorem*{draft}{\scshape\sffamily\color{MidnightBlue}\faIcon{check-square}~\scshape Solution}
-\newtheorem*{note}{\scshape\sffamily\color{DarkRed}\faIcon{info-circle}~\scshape Note} \ No newline at end of file
+}{
+ \def\ans#1{\underline{~#1~}}
+ \def\s@solute#1{\relax}\def\@solute#1{\relax}
+ \AtBeginDocument{%
+ \excludecomment{scratch}
+ \let\endscratch\relax}
+ \def\true{\addtocounter{task}{1}\faIcon{check-circle}}
+}
+\DeclareRobustCommand\solute{\@ifstar\s@solute\@solute}
+%%
+%% End of file `litesolution.cls'.
diff --git a/macros/latex/contrib/mathgreeks/README.md b/macros/latex/contrib/mathgreeks/README.md
new file mode 100644
index 0000000000..971fa77dc7
--- /dev/null
+++ b/macros/latex/contrib/mathgreeks/README.md
@@ -0,0 +1,30 @@
+# Math Greek letters - The mathgreeks package
+
+
+## Presentation
+
+The purpose of this package is to provide access to numerous Greek letter fonts
+for math mode, without altering other mathematical characters and symbols
+and without loading whole extensions that provide these fonts.
+Moreover, the chosen font or shape can be changed dynamically throughout the document.
+
+
+## Installation
+
+- run LaTeX on mathgreeks.ins, you obtain the file mathgreeks.sty;
+- if then you run LuaLaTeX on mathgreeks.dtx you get the file mathgreeks.pdf which is also in the archive;
+- if you run pdfLaTex on mathgreeks.dtx you get a shorter version of this pdf file without the examples using fontspec or unicode-math;
+- put the files mathgreeks.sty and mathgreeks.pdf in your TeX Directory Structure.
+
+
+## Author
+
+Antoine Missier
+
+Email: antoine.missier@ac-toulouse.fr
+
+
+## License
+
+Released under the LaTeX Project Public License v1.3 or later.
+See http://www.latex-project.org/lppl.txt
diff --git a/macros/latex/contrib/mathgreeks/mathgreeks.dtx b/macros/latex/contrib/mathgreeks/mathgreeks.dtx
new file mode 100644
index 0000000000..1290c1a7fd
--- /dev/null
+++ b/macros/latex/contrib/mathgreeks/mathgreeks.dtx
@@ -0,0 +1,1330 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2024 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{mathgreeks.dtx}
+%</driver>
+%<*package>
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{mathgreeks}
+ [2024/05/07 v1.2 .dtx Math Greek letters]
+%</package>
+%<*driver>
+\documentclass[11pt]{article}
+%\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[english]{babel}
+\usepackage{doc}
+\usepackage{geometry}
+\usepackage[mathdesign=Charter,otherfonts]{mathgreeks}
+\usepackage{sectsty}
+\usepackage{xcolor}
+\usepackage{spacingtricks}
+\usepackage{metalogo}
+%\usepackage{supertabular} % incompatible with tabls
+\usepackage{tabls}
+\usepackage{multirow}
+\usepackage{ifluatex}
+\ifluatex
+ \usepackage{unicode-math}
+ \setmainfont{XCharter}
+\else
+ \usepackage{charter}
+\fi
+\geometry{scale=0.73,vmarginratio=3:4,heightrounded}
+\MakeShortVerb{"}
+\definecolor{darkbrown}{rgb}{0.5,0.1,0.1}
+\allsectionsfont{\color{darkbrown}}
+\newcommand\bs{\textbackslash}
+\DisableCrossrefs
+%\CodelineIndex
+%\RecordChanges
+\OnlyDescription
+\usepackage{hyperref}
+\title{The \textsf{mathgreeks} package}
+\author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
+\date{\filedate, \fileversion}
+\hypersetup{%
+ colorlinks,
+ linkcolor=blue,
+ citecolor=red,
+ pdftitle={mathgreeks},
+ pdfsubject={LaTeX package},
+ pdfauthor={Antoine Missier}
+}
+
+\begin{document}
+\DocInput{mathgreeks.dtx}
+%\PrintChanges
+%\PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{1061}
+%
+% \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}{2024/04/30}{Initial version}
+% \changes{v1.1}{2024/05/04}{Adding the libsans option; a few changes in the doc}
+% \changes{v1.2}{2024/05/07}{A clarification in the documentation about the option shape=it}
+%
+% \GetFileInfo{mathgreeks.sty}
+%
+% \maketitle
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% The purpose of this package is to provide access to numerous Greek letter fonts
+% for math mode, without altering other mathematical characters and symbols
+% and without loading whole extensions that provide these fonts.
+%
+% The commands "\italpha", "\itbeta"\ldots\ produce the italic forms of the chosen font,
+% and "\upalpha", "\upbeta" \ldots\ produce the upright forms.
+% Style options allow choosing between italic or upright forms for the basic commands
+% "\alpha", "\beta"\ldots
+% Only letters whose glyph differs from the corresponding Roman letter
+% will be defined this way.
+% Therefore, the package does not provide a command "\omicron",
+% whose letter is identical to the Roman `o', and only a few uppercase letters are defined:
+% "\Gamma", "\Delta", "\Theta"\ldots
+%
+% \medskip
+% An ISO recommendation, rarely followed, is to typeset uppercase
+% Greek letters in italic shape, as for other variables~\cite{ICTNS}.
+% This is automatically achieved, for some particular fonts, with packages
+% such as \textsf{fixmath} by Walter Schmidt~\cite{FIXM},
+% \mbox{\textsf{isomath}} by Günter Milde~\cite{ISOM}
+% or \textsf{pm-isomath} by Claudio Beccari~\cite{PMISO} and optionally with some others
+% (such as \textsf{mathpazo} or \textsf{mathptmx} with the option \texttt{slantedGreek}).
+% When running through \LuaLaTeX\ or \XeLaTeX\ you can also get this result
+% with the option \mbox{\texttt{math-style=ISO}} provided
+% by the \textsf{unicode-math} package~\cite{UNIC}.
+%
+% \pagebreak ^^A To get the same page breaking when compiling with pdfLaTeX
+% Furthermore there are several packages that provide the uppercase Greek letters
+% in italic and have also options to typeset the lowercase Greek
+% letters in upright shape.
+% Notably, let us mention
+% \mbox{\textsf{mathdesign}}~\cite{DESIGN},
+% \mbox{\textsf{kpfonts}}~\cite{KPF},
+% \mbox{\textsf{fourier}}~\cite{FOUR}, but also
+% \mbox{\textsf{pxgreeks}} (using \textsf{pxfonts}~\cite{PX}), \mbox{\textsf{txgreeks}}
+% (using \textsf{txfonts}~\cite{TX}),
+% \mbox{\textsf{libertinust1math}}~\cite{LIB}, \mbox{\textsf{libgreek}}, etc.
+% A special mention goes to \textsf{lgrmath} of Jean-François Burnol~\cite{LGR}
+% which allows the use of any Greek LGR-encoded font in math mode,
+% an idea taken up in \textsf{mathgreeks}.
+% Also note \textsf{newtxmath}~\cite{NTX} which has several font options.
+% For upright lowercase letters, we have the nice \textsf{upgreek}~\cite{GREEK} package.
+%
+% \medskip
+% The interest of \textsf{mathgreeks} lies in being able to choose the Greek letters font
+% from one of these packages or from a TrueType or OpenType font installed on your computer.
+% The package sets Greek letters in the desired font and shape
+% and enables to change font or shape dynamically within the document.
+%
+% \section{Options and settings}
+%
+% \subsection{Package options}
+%
+% When calling the package, there are three types of options:
+% \begin{itemize}
+% \item Font options,
+% \item Shape options (the style),
+% \item Additional options.
+% \end{itemize}
+% These options use the `\texttt{key=value}' mechanism.
+% When a default value is set, the key can be used without specifying a value
+% (which will then be the default value).
+% Some keys represent booleans with the default value being `\texttt{true}'.
+%
+% \bigskip
+% The first table, in two parts, presents the different keys corresponding to font options,
+% the list of possible values (complete when it is reduced).
+% The default value is indicated in bold, the second part consist in boolean options.
+% Results are presented in section~\ref{examples}.
+%
+% \begin{table}[h]
+% \begin{center}\ttfamily
+% \begin{tabular}{ll}
+% \hline
+% \vstrut{2ex}\normalfont{Option} & \normalfont{Values} \\
+% \hline
+% lgrmath & Alegreya-LF, Cochineal-LF, \textbf{fcm}\ldots \\
+% fontspec & FreeSerif, \textbf{GFS Didot}, Cambria\ldots \\
+% unicode-math & \textbf{Latin Modern Math}, STIX Two Math\ldots \\
+% upgreek & Euler, \textbf{Symbol}, Symbolsmallscale \\
+% mathdesign & Utopia, Garamond, \textbf{Charter} \\
+% kpfonts & \textbf{normal}, light \\
+% \hline
+% \end{tabular}
+% \hspace{1cm}
+% \begin{tabular}{l}
+% \hline
+% \vstrut{2ex}\normalfont{Booleans} \\
+% \hline
+% fourier \\
+% pxfonts \\
+% txfonts \\
+% libertinus \\
+% concrete \\
+% cmbright \\
+% \hline
+% \end{tabular}
+% \caption{\normalfont{font options}\label{table:font}}
+% \end{center}
+% \end{table}
+%
+% \vspace{-1\baselineskip}
+% The \texttt{fontspec} and \texttt{unicode-math} options require loading
+% the corresponding packages, and these can only work when running through
+% \LuaLaTeX\ (or \XeLaTeX).
+% The \texttt{fontspec} option allows for the use of most TrueType or OpenType
+% fonts installed on your computer, those that have Greek letters.
+% Although the \textsf{unicode-math} package loads the \textsf{fontspec} package,
+% the fonts usable with one of these options are not necessarily usable with the other;
+% \texttt{fontspec} has a large number of possible values.
+%
+% When calling "\boldmath" (outside the math environment), you get the letters in bold face,
+% but the command "\mathbf" doesn't work here.
+%
+% \bigskip
+% The second table below presents the shape options. If the shape option
+% is not specified, the italic shape is chosen by default, meaning that the commands
+% "\alpha", "\beta", \ldots, "\Delta", "\Gamma"\ldots\ will produce the same result
+% as the corresponding "\it"\meta{letter} commands.
+%
+% \begin{table}[h]
+% \begin{center}
+% \begin{tabular}{ll}
+% \hline
+% \vstrut{2ex}\normalfont{Option} & \normalfont{Description} \\
+% \hline
+% \texttt{greekup} & lowercase letters in upright shape \\
+% \texttt{Greekup} & uppercase letters in upright shape \\
+% \texttt{TeX} & lowercase=italic, uppercase=upright \\
+% \texttt{ISO} & lowercase=italic, uppercase=italic \\
+% \texttt{upright} & lowercase=upright, uppercase=upright \\
+% \texttt{style} & possible values: \texttt{TeX}, \texttt{ISO}, \texttt{upright} \\
+% \hline
+% \end{tabular}
+% \caption{shape options\label{table:shape}}
+% \end{center}
+% \end{table}
+%
+% \vspace{-1\baselineskip}
+% \begin{itemize}
+% \item Except for \texttt{style}, all these options are booleans.
+% \item The \texttt{Greekup} option est initialized to \texttt{true} (corresponding
+% to the \texttt{TeX} style).
+% \item The \texttt{style=ISO} option produces the same result as the simple
+% \texttt{ISO} option, and the same applies to the other two styles
+% (\texttt{TeX}, \texttt{upright}).
+% \item To get lowercase letters in upright shape and uppercase letters in italic,
+% activate \begin{center}\texttt{greekup=true,Greekup=false}.\end{center}
+% \end{itemize}
+%
+% \bigskip
+% The following list presents the additional options, which are also booleans:
+% \begin{description}
+% \item[\texttt{savegreeks}] Saves the letters corresponding to the original commands
+% "\alpha", "\beta"\ldots so that they remain accessible through the commands
+% "\backalpha", "\backbeta"\ldots
+% \item[\texttt{otherfonts}] Allows dynamic font switching (see next section)
+% for later use of \texttt{lgrmath}, \texttt{fourier}, \texttt{libertinus}
+% or \texttt{upgreek}.
+% \item[\texttt{libsans}] This is a special option that works only with \texttt{libertinus}
+% to produce a sanserif font.
+% \item[\texttt{lowercase}] This option is initialized to \texttt{true};
+% \texttt{lowercase=false} allows keeping the original lowercase Greek letters
+% without redefining the commands "\alpha", "\beta"\ldots
+% \item[\texttt{uppercase}] This option is initialized to \texttt{true};
+% \texttt{uppercase=false} allows keeping the original uppercase Greek letters
+% without redefining the commands "\Gamma", "\Delta"\ldots
+% \end{description}
+%
+% \subsection{Dynamic settings commands}
+%
+% There are two commands for dynamic settings:
+% \begin{description}
+% \item[] "\setmathgreeks"
+% This command takes a mandatory parameter which is a list of
+% `\texttt{key=value}' settings among the shape options presented
+% in table~\ref{table:shape} (the other options are not usable in this command).
+% This allows modifying these settings in the body of the document,
+% with a global effect, or local if the command is called in an environment
+% or a group (delimited by braces).
+%
+% \item[] "\mathgreeksfont"
+% This command allows modifying the font of Greek letters throughout the document,
+% with a global or local effect.
+% The possible options fall into two categories:
+% \begin{center}
+% \texttt{fontspec}, \texttt{unicode-math}, \\
+% \texttt{enc}, \texttt{fam}, \texttt{series}, \texttt{shape}.
+% \end{center}
+% The \texttt{fontspec} and \texttt{unicode-math} options are identical
+% to those in table~\ref{table:font}. In that case, the shape is set by "\setmathgreeks"
+% (before or after).
+% The other previous font options (\texttt{lgrmath}, \texttt{mathdesign},
+% \texttt{fourier}, etc.)\@ are not usable in "\mathgreeksfont".
+% However, these fonts can be obtained by specifying the encoding (option \texttt{enc}),
+% family (option \texttt{fam}), series and shape: the New Font Selection Scheme (NFSS).
+% The series defines the `boldness' and has a default value: \texttt{series=m} (medium).
+% For the shape, the default value is \texttt{shape=it};
+% \texttt{enc} and \texttt{fam} have no default value.
+% For example,
+% \begin{center}
+% "\mathgreeksfont{enc=OML,fam=mdbch,shape=n}"
+% \end{center}
+% will produce upright letters from the Charter font provided by \textsf{mathdesign}.
+% For each font option seen previously,
+% the following examples (section~\ref{examples}) indicates
+% the values to give to \texttt{enc}, \texttt{fam}, and \texttt{shape}.
+% The font definition by NFSS attributes will not produce specific commands for italics
+% "\it"\meta{letter} or for upright letters "\up"\meta{letter}.
+% Only the commands "\alpha", "\beta"\ldots will be redefined according to the
+% selected shape.
+%
+% When using the \texttt{fontspec} or \texttt{unicode-math} option,
+% these NFSS options have no effect.
+%
+% Notice that the encoding obtained by the package font options is faster, moreover
+% the command "\boldmath" doesn't work anymore
+% when changing the font with \texttt{enc}, \texttt{fam} and \texttt{shape},
+% but you can obtain the boldface
+% letters with \texttt{series=b}, or \texttt{series=bx} (bold extended).
+%
+% \end{description}
+%
+% \section{Examples} \label{examples}
+% \begin{description}
+% \item[] "\greektable"
+% The following examples are produced with the "\greektable" command.
+% This command generates a table with two rows: the first contains the lowercase letters
+% obtained with "\alpha", \ldots, "\omega", and the second contains variants
+% "\varepsilon", "\vartheta"\ldots\ of certain letters as well as the uppercase letters
+% obtained with "\Gamma", "\Delta", \ldots, "\Omega"
+% (for those who differ from their Latin equivalent).
+% \end{description}
+%
+% \subsection{PostScript font options}
+%
+% The \texttt{upgreek} option, as its name suggests, produces only upright letters,
+% and the \texttt{Euler} font does not have the variants "\varrho" and "\varsigma".
+% The \texttt{Symbolsmallscale} font is identical to Symbol but reduced in size by 90\,\%;
+% \texttt{Symbol} and \texttt{Symbolsmallscale} have no bold version.
+% ^^A\texttt{mathdesign=Garamond} yields a virtual font that may not always work.
+% For several fonts, the upright shape is obtained with the attribute \texttt{shape=it}
+% and not \texttt{shape=n}.
+%
+% \newlength\legendwidth
+% \setlength\legendwidth{3.2cm}
+% \newcommand*\doublerows[1]{\multirow{2}{\legendwidth}[-1.5ex]{\bfseries#1}}
+
+% \begin{center}
+% \begin{tabular}{|l|@{}c@{}|c@{$\;$}c@{\:}c|}
+% \hline
+% \makebox[\legendwidth][l]{\textbf{upgreek=...}} & \makebox[8.4cm]{Result}
+% & \makebox[1cm]{enc} & \makebox[1cm]{fam} & shape \\
+% \hline
+% \textbf{Symbol}
+% & \mathgreeksfont{enc=U,fam=psy,shape=n}\greektable
+% & U & psy & n \\
+% \hline
+% \textbf{Symbolsmallscale}
+% & \mathgreeksfont{enc=U,fam=fsy,shape=n} \greektable
+% & U & fsy & n \\
+% \hline
+% \textbf{Euler}
+% & \mathgreeksfont{enc=U,fam=eur,shape=n} \greektable
+% & U & eur & n \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \begin{center}
+% \begin{tabular}{|l|@{}c@{}|c@{$\;$}c@{}c|}
+% \hline
+% \textbf{mathdesign=...} & \makebox[8.4cm]{Result} & enc & fam & shape \\
+% \hline
+% \doublerows{Utopia}
+% & \mathgreeksfont{enc=OML,fam=mdput} \greektable
+% & OML & mdput & it \\
+% & \mathgreeksfont{enc=OML,fam=mdput,shape=n} \greektable
+% & OML & mdput & n \\
+% \hline
+% \doublerows{Garamond}
+% & \mathgreeksfont{enc=OML,fam=mdugm} \greektable
+% & OML & mdugm & it \\
+% & \mathgreeksfont{enc=OML,fam=mdugm,shape=n} \greektable
+% & OML & mdugm & n \\
+% \hline
+% \doublerows{Charter}
+% & \mathgreeksfont{enc=OML,fam=mdbch} \greektable
+% & OML & mdbch & it \\
+% & \mathgreeksfont{enc=OML,fam=mdbch,shape=n} \greektable
+% & OML & mdbch & n \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \begin{center}
+% \begin{tabular}{|l|@{}c@{}|c@{$\;$}c@{}c|}
+% \hline
+% \textbf{kpfonts=...} & \makebox[8.4cm]{Result} & enc & fam & shape \\
+% \hline
+% \doublerows{normal}
+% & \mathgreeksfont{enc=OML,fam=jkp} \greektable
+% & OML & jkp & it \\
+% & \mathgreeksfont{enc=U,fam=jkpmia} \greektable
+% & U & jkpmia & it \\
+% \hline
+% \doublerows{light}
+% & \mathgreeksfont{enc=OML,fam=jkpl} \greektable
+% & OML & jkpl & it \\
+% & \mathgreeksfont{enc=U,fam=jkplmia} \greektable
+% & U & jkplmia & it \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \begin{center}
+% \begin{tabular}{|l|@{}c@{}|c@{$\;$}c@{}c|}
+% \hline
+% Boolean options & \makebox[8.2cm]{Result} & enc & fam & shape \\
+% \hline
+% \doublerows{fourier}
+% & \mathgreeksfont{enc=FML,fam=futmi} \greektable
+% & FML & futmi & it \\
+% & \mathgreeksfont{enc=FML,fam=futm} \greektable
+% & FML & futm & it \\
+% \hline
+% % \doublerows{pxfonts}
+% & \mathgreeksfont{enc=OML,fam=pxmi} \greektable
+% & OML & pxmi & it \\
+% & \mathgreeksfont{enc=U,fam=pxmia} \greektable
+% & U & pxmia & it \\
+% \hline
+% \doublerows{txfonts}
+% & \mathgreeksfont{enc=OML,fam=txmi} \greektable
+% & OML & txmi & it \\
+% & \mathgreeksfont{enc=U,fam=txmia} \greektable
+% & U & txmia & it \\
+% \hline
+% \doublerows{libertinus}
+% & \mathgreeksfont{enc=LS1,fam=libertinust1math} \greektable
+% & LS1 & * & it \\
+% & \mathgreeksfont{enc=LS1,fam=libertinust1math,shape=n} \greektable
+% & LS1 & * & n \\
+% \hline
+% \textbf{concrete}
+% & \mathgreeksfont{enc=OML,fam=ccm} \greektable
+% & OML & ccl & it \\
+% \hline
+% \textbf{cmbright}
+% & \mathgreeksfont{enc=OML,fam=cmbrm} \greektable
+% & OML & cmbrm & it \\
+% \hline
+% \end{tabular}
+% \end{center}
+% \emph{* The asterisks for the} \textbf{libertinus} \emph{family corresponds to}
+% \textnormal{`libertinust1math'} \emph{a name too long to appear in this table.
+% Activating the} \texttt{libsans} \emph{package option yields a sanserif font.}
+%
+% \subsection{The \texttt{lgrmath} option}
+%
+% The \texttt{lgrmath} option, inspired by the eponymous package of J.F. Burnol,
+% has a large number of possible values. We present here only a few.
+% The documentation of the \textsf{lgrmath} package~\cite{LGR} explains how
+% to list the fonts available on your distribution with the LGR encoding.
+% One can also consult with profit the documentation of \textsf{cb-fonts}\cite{CB},
+% the Greek fonts of Claudio Beccari.
+%
+% With the \texttt{lgrmath} option, the alternative commands for the variants
+% produce the same glyphs as those of the normal letters except for "\varsigma".
+% However, the "\varsigma" $\varsigma$ often substitutes for the usual "\sigma" $\sigma$
+% when using dynamic font changes through "\mathgreeksfont" with \texttt{enc=LGR}.
+%
+% We have not presented here the third column previously indicating the values for
+% \texttt{enc}, \texttt{fam}, and \texttt{shape} because, for this entire section,
+% we have \texttt{enc=LGR}, \texttt{fam=\meta{font-name}}, the name of the font presented,
+% and \texttt{shape=it}, for the italic shape, or \texttt{shape=n}, for the upright shape.
+% Example:
+% \begin{center}
+% "\mathgreeksfont{enc=LGR,fam=Alegreya-LF,shape=n}"
+% \end{center}
+%
+%\setlength\legendwidth{4cm}
+% \newcommand\lgrtbl[1]{%
+% \doublerows{#1}
+% & \mathgreeksfont{enc=LGR,fam=#1} \greektable \\
+% & \mathgreeksfont{enc=LGR,fam=#1,shape=n} \greektable \\
+% \hline
+% }
+%
+% \begin{center}
+% \begin{tabular}{|l|c|}
+% \hline
+% \textbf{lgrmath=...} & Result \\
+% \hline
+% \lgrtbl{Alegreya-LF}
+% \lgrtbl{Cochineal-LF}
+% \lgrtbl{LibertinusSerif-LF}
+% \lgrtbl{LibertinusSans-LF}
+% \lgrtbl{NotoSerif-LF}
+% \lgrtbl{droidserif}
+% \lgrtbl{fcm}
+% \lgrtbl{gentium}
+% \lgrtbl{lmss}
+% \end{tabular}
+% \end{center}
+%
+% \ifluatex
+% \subsection{The \texttt{fontspec} option}
+%
+% Most TrueType or OpenType fonts can be used here.
+% ^^A Needs the \textsf{fontspec} package and must be run through \LuaLaTeX\ or \XeLaTeX.
+% Some of the fonts below are non free, and some do not have all the variants,
+% for example Arial, Palatino Linotype, Times New Roman.
+%
+% \newcommand\fontspectbl[2][fontspec]{%
+% \doublerows{#2}
+% & \mathgreeksfont{#1=#2}
+% \setmathgreeks{style=ISO} \greektable \\
+% & \mathgreeksfont{fontspec=#2}
+% \setmathgreeks{style=upright} \greektable \\
+% \hline
+% }
+%
+% \begin{center}
+% \begin{tabular}{|l|c|}
+% \hline
+% \textbf{fontspec=...} & Result \\
+% \hline
+% \fontspectbl{DejaVu Serif}
+% \fontspectbl{DejaVu Sans}
+% \fontspectbl{FreeSerif}
+% \fontspectbl{FreeSans}
+% \fontspectbl{GFS Artemisia}
+% \fontspectbl{GFS Didot}
+% \fontspectbl{Liberation Serif}
+% \fontspectbl{Liberation Sans}
+% \end{tabular}
+% \end{center}
+%
+% \begin{center}
+% \begin{tabular}{|l|c|}
+% \hline
+% \textbf{fontspec=...} & Result \\
+% \hline
+% \fontspectbl{Linux Libertine O}
+% ^^A\fontspectbl{Linux Biolinum O}
+% \fontspectbl{Arial}
+% \fontspectbl{Cambria}
+% \fontspectbl{Palatino Linotype}
+% \fontspectbl{Times New Roman}
+% \end{tabular}
+% \end{center}
+%
+%
+% \subsection{The \texttt{unicode-math} option}
+%
+% \begin{center}
+% \begin{tabular}{|l|c|}
+% \hline
+% \textbf{unicode-math=...} & Result \\
+% \hline
+% \fontspectbl[unicode-math]{Latin Modern Math}
+% \fontspectbl[unicode-math]{STIX Two Math}
+% \fontspectbl[unicode-math]{Fira Math}
+% \end{tabular}
+% \end{center}
+%
+% \else
+% \typeout{This is a short version of the documentation.
+% Use LuaLaTeX to get the complete version}
+% \fi
+%
+% \StopEventually{
+% \begin{thebibliography}{20}
+% \begin{raggedright}
+% \bibitem{ICTNS} \emph{On the Use of Italic and up Fonts for Symbols in Scientific Text},
+% I.M.~Mills and W.V.~Metanomski, ICTNS (Interdivisional Committee
+% on Terminology, Nomenclature and Symbols), dec 1999,
+% \url{https://old.iupac.org/standing/idcns/italic-roman_dec99.pdf}.
+% \bibitem{UNIC} \emph{Experimental Unicode mathematical typesetting:
+% The \textsf{unicode-math} package}, Will Robertson, Philipp Stephani, Joseph Wright,
+% Khaled Hosny, and others, CTAN, v0.8r 2023/08/13.
+% \bibitem{FSPEC} \emph{The \textsf{fontspec} package -- Font selection for \XeLaTeX\
+% and \LuaLaTeX}, Will Robertson, CTAN, v2.9b 2024/04/27.
+% \bibitem{FIXM} \emph{The \textsf{fixmath} package for \LaTeXe}, Walter Schmidt,
+% CTAN, v0.9 2000/04/11.
+% \bibitem{ISOM} \emph{\textsf{isomath} -- Mathematical style for science and technology},
+% Günter Milde, CTAN, v0.6.1 2012/09/04.
+% \bibitem{PMISO} \emph{\textsf{PM-ISOmath}, The Poor Man ISO math bundle},
+% the \textsf{pm-isomath} package by Claudio Beccari, CTAN, v1.2.00 2021/08/04.
+% \bibitem{GREEK} \emph{The \textsf{upgreek} package for \LaTeXe}, Walter Schmidt,
+% CTAN, v2.0 2003/02/12.
+% \bibitem{DESIGN} \emph{The \textsf{mathdesign} package},
+% Paul Pichaureau, CTAN, v2.31 2013/08/29.
+% \bibitem{KPF} \emph{\textsf{Kp-Fonts} -- The Johannes Kepler project},
+% Christophe Caignaert, CTAN, v3.34 20/09/2022.
+% \bibitem{FOUR} \textsf{Fourier-GUT\hspace{-0.1em}\emph{enberg}},
+% Michel Bovani, CTAN, v1.3 2005/01/30.
+% \bibitem{PX} \emph{\textsf{PX Fonts} -- Palatino-like fonts in support of mathematics},
+% Young Ryu, CTAN, 2000/12/14.
+% \bibitem{TX} \emph{\textsf{TX Fonts} -- Times-like fonts in support of mathematics},
+% Young Ryu, CTAN, 2000/12/15.
+% \bibitem{CB} \emph{The CB Greek fonts}, Claudio Beccari, CTAN, 2008/01/01.
+% \bibitem{PXG} \emph{The \textsf{pxgreeks} package}, Jean-François Burnol,
+% CTAN v1.0 2011/03/16.
+% \bibitem{TXG} \emph{The \textsf{txgreeks} package}, Jean-François Burnol,
+% CTAN v1.0 2011/03/16.
+% \bibitem{LIBG} \emph{The \textsf{libgreek} package}, Jean-François Burnol,
+% CTAN v1.1 2022/11/11.
+% \bibitem{LGR} \emph{The \textsf{lgrmath} package}, Jean-François B., CTAN, v1.0 2022/11/16.
+% \bibitem{NTX} \emph{New TX font package}, Michael Sharpe, CTAN, v1.735 2024/03/01.
+% \bibitem{LIB} \emph{The LibertinusT1 Math Package}, Michael Sharpe, CTAN,
+% v2.0.4 2024/01/14.
+% \bibitem{CHEM} \emph{\textsf{chemgreek} -- Upright Greek letters in chemistry},
+% Clemens Niederberger, CTAN, v1.1a 2020/01/16.
+% \end{raggedright}
+% \end{thebibliography}
+% }
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+\RequirePackage{kvoptions}
+%\SetupKeyvalOptions{family=mgr} % mathgreeks by default
+
+\DeclareStringOption{lgrmath}[fcm]
+\newif\ifmathgreeks@lgrmath
+\AddToKeyvalOption*{lgrmath}{\mathgreeks@lgrmathtrue}
+\DeclareStringOption{fontspec}[GFS Didot]
+\newif\ifmathgreeks@fontspec
+\AddToKeyvalOption*{fontspec}{\mathgreeks@fontspectrue}
+\newif\ifmathgreeks@unicodemath
+\define@key{mathgreeks}{unicode-math}[Latin Modern Math]{
+ \newcommand*{\mathgreeks@unicodemath}{#1}
+ \mathgreeks@unicodemathtrue}
+\DeclareStringOption{upgreek}[Symbol]
+\newif\ifmathgreeks@upgreek
+\AddToKeyvalOption*{upgreek}{\mathgreeks@upgreektrue
+ \mathgreeks@Greekuptrue\mathgreeks@greekuptrue}
+\DeclareStringOption{mathdesign}[Charter]
+\newif\ifmathgreeks@mathdesign
+\AddToKeyvalOption*{mathdesign}{\mathgreeks@mathdesigntrue}
+\DeclareBoolOption{fourier}% false by default
+\DeclareStringOption{kpfonts}[normal]
+\newif\ifmathgreeks@kpfonts
+\AddToKeyvalOption*{kpfonts}{\mathgreeks@kpfontstrue}
+\DeclareBoolOption{pxfonts}
+\DeclareBoolOption{txfonts}
+\DeclareBoolOption{libertinus}
+\DeclareBoolOption{concrete}
+\DeclareBoolOption{cmbright}
+
+\DeclareBoolOption{savegreeks}
+\DeclareBoolOption{otherfonts}
+\DeclareBoolOption{libsans}
+\DeclareBoolOption[true]{lowercase}
+\DeclareBoolOption[true]{uppercase}
+
+% dynamic options
+\DeclareBoolOption[true]{Greekup}
+\DeclareBoolOption{greekup}
+\DeclareBoolOption{upright}
+\AddToKeyvalOption*{upright}{\mathgreeks@Greekuptrue
+ \mathgreeks@greekuptrue}
+\DeclareBoolOption{ISO}
+\AddToKeyvalOption*{ISO}{\mathgreeks@Greekupfalse
+ \mathgreeks@greekupfalse}
+\DeclareBoolOption{TeX}
+\AddToKeyvalOption*{TeX}{\mathgreeks@Greekuptrue
+ \mathgreeks@greekupfalse}
+\DeclareStringOption{style}
+\AddToKeyvalOption*{style}{\setkeys{mathgreeks}{\mathgreeks@style}}
+
+\DeclareDefaultOption{\PackageError{mathgreeks}{%
+ Option key `\CurrentOptionKey' undefined}{}}
+\ProcessLocalKeyvalOptions* % \setkeys is done here
+
+\RequirePackage{etoolbox} % provides \AtEndPreamble
+
+\newif\ifkp@upRm % from kpgonts, bugs if after \ifmathgreeks@kpfonts
+\newif\iflibus@sansmath % from libertinust1math
+\newif\ifmathgreeks@Symbol % for codes definition
+\newif\ifmathgreeks@itgreek % for fonts without upright shape
+\newif\ifmathgreeks@font % if font option at package call
+\mathgreeks@fonttrue
+
+
+%%%%%%%%%%%%%%%% INITIAL SETTINGS %%%%%%%%%%%%%%%
+
+\ifmathgreeks@otherfonts
+ \DeclareFontEncoding{LGR}{}{}
+ \DeclareFontEncoding{FML}{}{}
+ \DeclareFontSubstitution{FML}{futm}{m}{it}
+ \ifmathgreeks@libsans \libus@sansmathtrue\fi % taken up at encoding time
+ \DeclareFontEncoding{LS1}{}{}
+ \DeclareFontSubstitution{LS1}{libertinust1math}{m}{n}
+
+ % from the upgreek package
+ \DeclareFontFamily{U}{eur}{\skewchar\font'177}
+ \DeclareFontShape{U}{eur}{m}{n}{%
+ <-6> eurm5 <6-8> eurm7 <8-> eurm10}{}
+ \DeclareFontShape{U}{eur}{b}{n}{%
+ <-6> eurb5 <6-8> eurb7 <8-> eurb10}{}
+ \DeclareFontFamily{U}{fsy}{}
+ \DeclareFontShape{U}{fsy}{m}{n}{<->s*[.9]psyr}{}
+
+\fi
+
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{lgrmath}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{fontspec}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{unicodemath}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{upgreek}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{mathdesign}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{fourier}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{kpfonts}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{pxfonts}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{txfonts}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{savegreeks}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{otherfonts}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{libsans}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{lowercase}
+\DisableKeyvalOption[action=warning,package=mathgreeks]{mathgreeks}{uppercase}
+
+
+\AtEndPreamble{\AtBeginDocument{
+ \@ifundefined{text}{\RequirePackage{amstext}}{}
+
+ \ifmathgreeks@lgrmath
+ \DeclareFontEncoding{LGR}{}{}
+ \DeclareSymbolFont{mgr@it}{LGR}{\mathgreeks@lgrmath}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{LGR}{\mathgreeks@lgrmath}{b}{it}
+ \DeclareSymbolFont{mgr@up}{LGR}{\mathgreeks@lgrmath}{m}{n}
+ \SetSymbolFont{mgr@up}{bold}{LGR}{\mathgreeks@lgrmath}{b}{n}
+
+ \else\ifmathgreeks@fontspec
+ \@ifpackageloaded{fontspec}{}{
+ \PackageError{mathgreeks}{`fontspec' or `unicodemath'
+ options need the fontspec package\MessageBreak
+ which must be run with LuaLaTeX or XeLaTeX}{}
+ }
+ \newfontfamily\MathGreeksFont{\mathgreeks@fontspec}%
+ [NFSSFamily=mgru]
+ \DeclareSymbolFont{mgr@it}{TU}{mgru}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{TU}{mgru}{b}{it}
+ \DeclareSymbolFont{mgr@up}{TU}{mgru}{m}{n}
+ \SetSymbolFont{mgr@it}{bold}{TU}{mgru}{b}{n}
+
+ \else\ifmathgreeks@unicodemath
+ \@ifpackageloaded{unicode-math}{}{
+ \PackageError{mathgreeks}{`unicodemath' option needs
+ the unicode-math package\MessageBreak
+ which must be run with LuaLaTeX or XeLaTeX}{}
+ }
+ \setmathfont{\mathgreeks@unicodemath}[range=it/{greek,Greek}]
+ \setmathfont{\mathgreeks@unicodemath}[range=up/{greek,Greek}]
+ \mathgreeks@fontspectrue % for \mgr@CodeGreeks
+ \let\mgr@UnicodeGreek\mgr@UnicodemathGreek
+
+ \else\ifmathgreeks@upgreek
+ \ifdefstring{\mathgreeks@upgreek}{Euler}{
+ \DeclareFontFamily{U}{eur}{\skewchar\font'177}
+ \DeclareFontShape{U}{eur}{m}{n}{%
+ <-6> eurm5 <6-8> eurm7 <8-> eurm10}{}
+ \DeclareFontShape{U}{eur}{b}{n}{%
+ <-6> eurb5 <6-8> eurb7 <8-> eurb10}{}
+ \DeclareSymbolFont{mgr@up}{U}{eur}{m}{n}
+ \SetSymbolFont{mgr@up}{bold}{U}{eur}{b}{n}
+ }{
+ \ifdefstring{\mathgreeks@upgreek}{Symbol}{
+ \DeclareSymbolFont{mgr@up}{U}{psy}{m}{n} % no bold face
+ \mathgreeks@Symboltrue
+ }{
+ \ifdefstring{\mathgreeks@upgreek}{Symbolsmallscale}{
+ \DeclareFontFamily{U}{fsy}{}
+ \DeclareFontShape{U}{fsy}{m}{n}{<->s*[.9]psyr}{}
+ \DeclareSymbolFont{mgr@up}{U}{fsy}{m}{n}
+ \mathgreeks@Symboltrue
+ }{
+ \PackageError{mathgreeks}{Invalid value
+ `\mathgreeks@upgreek' with `upgreek' key}{With `upgreek'
+ possible values are: Euler, Symbol, Symbolsmallscale.}
+ }}}
+
+ \else\ifmathgreeks@mathdesign
+ \ifdefstring{\mathgreeks@mathdesign}{Utopia}{
+ \DeclareSymbolFont{mgr@it}{OML}{mdput}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{mdput}{b}{it}
+ \DeclareSymbolFont{mgr@up}{OML}{mdput}{m}{n}
+ \SetSymbolFont{mgr@up}{bold}{OML}{mdput}{b}{n}
+ }{
+ \ifdefstring{\mathgreeks@mathdesign}{Garamond}{
+ \DeclareSymbolFont{mgr@it}{OML}{mdugm}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{mdugm}{b}{it}
+ \DeclareSymbolFont{mgr@up}{OML}{mdugm}{m}{n}
+ \SetSymbolFont{mgr@up}{bold}{OML}{mdugm}{b}{n}
+ }{
+ \ifdefstring{\mathgreeks@mathdesign}{Charter}{
+ \DeclareSymbolFont{mgr@it}{OML}{mdbch}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{mdbch}{b}{it}
+ \DeclareSymbolFont{mgr@up}{OML}{mdbch}{m}{n}
+ \SetSymbolFont{mgr@up}{bold}{OML}{mdbch}{b}{n}
+ }{
+ \PackageError{mathgreeks}{Invalid value
+ `\mathgreeks@mathdesign' with `mathdesign' key}{With
+ `mathdesign' possible values are:
+ Utopia, Garamond, Charter.}
+ }}}
+
+ \else\ifmathgreeks@fourier
+ \DeclareFontEncoding{FML}{}{}
+ \DeclareFontSubstitution{FML}{futm}{m}{it}
+ \DeclareSymbolFont{mgr@it}{FML}{futmi}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{FML}{futmi}{b}{it}
+ \DeclareSymbolFont{mgr@up}{FML}{futm}{m}{it}
+ \SetSymbolFont{mgr@up}{bold}{FML}{futm}{b}{it}
+
+ \else\ifmathgreeks@kpfonts
+ \ifdefstring{\mathgreeks@kpfonts}{normal}{
+ \DeclareSymbolFont{mgr@it}{OML}{jkp}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{jkp}{bx}{it}
+ \DeclareSymbolFont{mgr@up}{U}{jkpmia}{m}{it}
+ \SetSymbolFont{mgr@up}{bold}{U}{jkpmia}{bx}{it}
+ }{
+ \ifdefstring{\mathgreeks@kpfonts}{light}{
+ \DeclareSymbolFont{mgr@it}{OML}{jkpl}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{jkpl}{bx}{it}
+ \DeclareSymbolFont{mgr@up}{U}{jkplmia}{m}{it}
+ \SetSymbolFont{mgr@up}{bold}{U}{jkplmia}{bx}{it}
+ }{
+ \PackageError{mathgreeks}{Invalid value
+ `\mathgreeks@kpfonts' with `kpfonts' key}{With
+ `kpfonts' possible values are: normal, light.}
+ }}
+
+ \else\ifmathgreeks@pxfonts % no font option specified
+ \DeclareSymbolFont{mgr@it}{OML}{pxmi}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{pxmi}{bx}{it}
+ \DeclareSymbolFont{mgr@up}{U}{pxmia}{m}{it}
+ \SetSymbolFont{mgr@up}{bold}{U}{pxmia}{bx}{it}
+
+ \else\ifmathgreeks@txfonts
+ \DeclareSymbolFont{mgr@it}{OML}{txmi}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{txmi}{bx}{it}
+ \DeclareSymbolFont{mgr@up}{U}{txmia}{m}{it}
+ \SetSymbolFont{mgr@up}{bold}{U}{txmia}{bx}{it}
+
+ \else\ifmathgreeks@libertinus
+ \ifmathgreeks@libsans \libus@sansmathtrue\fi
+ \DeclareFontEncoding{LS1}{}{}
+ \DeclareFontSubstitution{LS1}{libertinust1math}{m}{n}
+ \DeclareSymbolFont{mgr@it}{LS1}{libertinust1math}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{LS1}{libertinust1math}{m}{it}
+ \DeclareSymbolFont{mgr@up}{LS1}{libertinust1math}{m}{n}
+ \SetSymbolFont{mgr@up}{bold}{LS1}{libertinust1math}{m}{n}
+
+ \else\ifmathgreeks@concrete
+ \DeclareSymbolFont{mgr@it}{OML}{ccm}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{ccm}{b}{it}
+ \mathgreeks@itgreektrue
+
+ \else\ifmathgreeks@cmbright
+ \DeclareSymbolFont{mgr@it}{OML}{cmbrm}{m}{it}
+ \SetSymbolFont{mgr@it}{bold}{OML}{cmbrm}{b}{it}
+ \mathgreeks@itgreektrue
+
+ \else
+ \PackageWarningNoLine{mathgreeks}{No font option specified}
+ \mathgreeks@fontfalse
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+
+ \ifmathgreeks@savegreeks \SaveGreeks \fi
+
+ \ifmathgreeks@font
+ \ifmathgreeks@upgreek
+ \mathgreeks@Greekuptrue \mathgreeks@greekuptrue
+ \PackageWarningNoLine{mathgreeks}{Commands \string \italpha,
+ \string\itbeta... \MessageBreak
+ not available with the `upgreek' option}
+ \else
+ \mgr@CodeGreeks{it}
+ \fi
+ \ifmathgreeks@itgreek
+ \mathgreeks@Greekupfalse \mathgreeks@greekupfalse
+ \PackageWarningNoLine{mathgreeks}{Commands \string \upalpha,
+ \string\upbeta... \MessageBreak
+ not available with `concrete' or 'cmbright}
+ \else
+ \mgr@CodeGreeks{up}
+ \fi
+ \mgr@DefaultGreeks
+ \fi
+}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%% MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\def\re@DeclareMathSymbol#1#2#3#4{% from kpfonts, pxfonts, txfonts
+ \let#1=\undefined
+ \DeclareMathSymbol{#1}{#2}{#3}{#4}}
+
+%\def\re@DeclareMathSymbol#1#2#3#4{% from newtxmath
+%\if\relax\noexpand#1\let#1=\undefined \fi
+%\DeclareMathSymbol{#1}{#2}{#3}{#4}}
+
+\newcommand{\mgr@CodeGreek}[3]{% #1 = it or up
+ \expandafter\re@DeclareMathSymbol\csname#1#2\endcsname%
+ {\mathalpha}{mgr@#1}{#3} % perhaps \mathord is better
+}
+
+\newcommand{\mgr@UnicodeGreek}[3]{%
+ \expandafter\Umathchardef\csname#1#2\endcsname="7 % mathalpha
+ \csname symmgr@#1\endcsname #3
+}
+
+\def\mgr@UnicodemathGreek#1#2#3{\unskip
+ \expandafter\DeclareRobustCommand\csname#1#2\endcsname
+ {\csname sym#1\endcsname{\symbol{#3}}}\ignorespaces
+}
+
+\newcommand{\mgr@CodeGreeks}[1]{% #1 = it or up
+ \ifmathgreeks@lgrmath % LGR encoding
+ \mgr@CodeGreek{#1}{Gamma}{71}
+ \mgr@CodeGreek{#1}{Delta}{68}
+ \mgr@CodeGreek{#1}{Theta}{74}
+ \mgr@CodeGreek{#1}{Lambda}{76}
+ \mgr@CodeGreek{#1}{Xi}{88}
+ \mgr@CodeGreek{#1}{Pi}{80}
+ \mgr@CodeGreek{#1}{Sigma}{83}
+ \mgr@CodeGreek{#1}{Upsilon}{85}
+ \mgr@CodeGreek{#1}{Phi}{70}
+ \mgr@CodeGreek{#1}{Psi}{89}
+ \mgr@CodeGreek{#1}{Omega}{87}
+ \mgr@CodeGreek{#1}{alpha}{97}
+ \mgr@CodeGreek{#1}{beta}{98}
+ \mgr@CodeGreek{#1}{gamma}{103}
+ \mgr@CodeGreek{#1}{delta}{100}
+ \mgr@CodeGreek{#1}{epsilon}{101}
+ \mgr@CodeGreek{#1}{zeta}{122}
+ \mgr@CodeGreek{#1}{eta}{104}
+ \mgr@CodeGreek{#1}{theta}{106}
+ \mgr@CodeGreek{#1}{iota}{105}
+ \mgr@CodeGreek{#1}{kappa}{107}
+ \mgr@CodeGreek{#1}{lambda}{108}
+ \mgr@CodeGreek{#1}{mu}{109}
+ \mgr@CodeGreek{#1}{nu}{110}
+ \mgr@CodeGreek{#1}{xi}{120}
+ \mgr@CodeGreek{#1}{pi}{112}
+ \mgr@CodeGreek{#1}{rho}{114}
+ \mgr@CodeGreek{#1}{sigma}{115}
+ \mgr@CodeGreek{#1}{tau}{116}
+ \mgr@CodeGreek{#1}{upsilon}{117}
+ \mgr@CodeGreek{#1}{phi}{102}
+ \mgr@CodeGreek{#1}{chi}{113}
+ \mgr@CodeGreek{#1}{psi}{121}
+ \mgr@CodeGreek{#1}{omega}{119}
+ \mgr@CodeGreek{#1}{varepsilon}{101} % = epsilon
+ \mgr@CodeGreek{#1}{vartheta}{106} % = theta
+ \mgr@CodeGreek{#1}{varpi}{112} % = pi
+ \mgr@CodeGreek{#1}{varrho}{114} % = rho
+ \mgr@CodeGreek{#1}{varsigma}{99}
+ \mgr@CodeGreek{#1}{varphi}{102} % = phi
+ \else\ifmathgreeks@fontspec % unicode encoding
+ \mgr@UnicodeGreek{#1}{Gamma}{"0393}
+ \mgr@UnicodeGreek{#1}{Delta}{"0394}
+ \mgr@UnicodeGreek{#1}{Theta}{"0398}
+ \mgr@UnicodeGreek{#1}{Lambda}{"039B}
+ \mgr@UnicodeGreek{#1}{Xi}{"039E}
+ \mgr@UnicodeGreek{#1}{Pi}{"03A0}
+ \mgr@UnicodeGreek{#1}{Sigma}{"03A3}
+ \mgr@UnicodeGreek{#1}{Upsilon}{"03A5}
+ \mgr@UnicodeGreek{#1}{Phi}{"03A6}
+ \mgr@UnicodeGreek{#1}{Psi}{"03A8}
+ \mgr@UnicodeGreek{#1}{Omega}{"03A9}
+ \mgr@UnicodeGreek{#1}{alpha}{"03B1}
+ \mgr@UnicodeGreek{#1}{beta}{"03B2}
+ \mgr@UnicodeGreek{#1}{gamma}{"03B3}
+ \mgr@UnicodeGreek{#1}{delta}{"03B4}
+ \mgr@UnicodeGreek{#1}{epsilon}{"03B5}
+ \mgr@UnicodeGreek{#1}{zeta}{"03B6}
+ \mgr@UnicodeGreek{#1}{eta}{"03B7}
+ \mgr@UnicodeGreek{#1}{theta}{"03B8}
+ \mgr@UnicodeGreek{#1}{iota}{"03B9}
+ \mgr@UnicodeGreek{#1}{kappa}{"03BA}
+ \mgr@UnicodeGreek{#1}{lambda}{"03BB}
+ \mgr@UnicodeGreek{#1}{mu}{"03BC}
+ \mgr@UnicodeGreek{#1}{nu}{"03BD}
+ \mgr@UnicodeGreek{#1}{xi}{"03BE} % not omicron
+ \mgr@UnicodeGreek{#1}{pi}{"03C0}
+ \mgr@UnicodeGreek{#1}{rho}{"03C1}
+ \mgr@UnicodeGreek{#1}{sigma}{"03C3}
+ \mgr@UnicodeGreek{#1}{tau}{"03C4}
+ \mgr@UnicodeGreek{#1}{upsilon}{"03C5}
+ \mgr@UnicodeGreek{#1}{phi}{"03C6}
+ \mgr@UnicodeGreek{#1}{chi}{"03C7}
+ \mgr@UnicodeGreek{#1}{psi}{"03C8}
+ \mgr@UnicodeGreek{#1}{omega}{"03C9}
+ \mgr@UnicodeGreek{#1}{varepsilon}{"03F5}
+ \mgr@UnicodeGreek{#1}{vartheta}{"03D1}
+ \mgr@UnicodeGreek{#1}{varpi}{"03D6}
+ \mgr@UnicodeGreek{#1}{varrho}{"03F1}
+ \mgr@UnicodeGreek{#1}{varsigma}{"03C2}
+ \mgr@UnicodeGreek{#1}{varphi}{"03D5}
+ \else\ifmathgreeks@Symbol % Symbol encoding
+ \mgr@CodeGreek{#1}{Gamma}{`G}
+ \mgr@CodeGreek{#1}{Delta}{`D}
+ \mgr@CodeGreek{#1}{Theta}{`Q}
+ \mgr@CodeGreek{#1}{Lambda}{`L}
+ \mgr@CodeGreek{#1}{Xi}{`X}
+ \mgr@CodeGreek{#1}{Pi}{`P}
+ \mgr@CodeGreek{#1}{Sigma}{`S}
+ \mgr@CodeGreek{#1}{Upsilon}{`U}
+ \mgr@CodeGreek{#1}{Phi}{`F}
+ \mgr@CodeGreek{#1}{Psi}{`Y}
+ \mgr@CodeGreek{#1}{Omega}{`W}
+ \mgr@CodeGreek{#1}{alpha}{`a}
+ \mgr@CodeGreek{#1}{beta}{`b}
+ \mgr@CodeGreek{#1}{gamma}{`g}
+ \mgr@CodeGreek{#1}{delta}{`d}
+ \mgr@CodeGreek{#1}{epsilon}{`e}
+ \mgr@CodeGreek{#1}{zeta}{`z}
+ \mgr@CodeGreek{#1}{eta}{`h}
+ \mgr@CodeGreek{#1}{theta}{`q}
+ \mgr@CodeGreek{#1}{iota}{`i}
+ \mgr@CodeGreek{#1}{kappa}{`k}
+ \mgr@CodeGreek{#1}{lambda}{`l}
+ \mgr@CodeGreek{#1}{mu}{`m}
+ \mgr@CodeGreek{#1}{nu}{`n}
+ \mgr@CodeGreek{#1}{xi}{`x}
+ \mgr@CodeGreek{#1}{pi}{`p}
+ \mgr@CodeGreek{#1}{rho}{`r}
+ \mgr@CodeGreek{#1}{sigma}{`s}
+ \mgr@CodeGreek{#1}{tau}{`t}
+ \mgr@CodeGreek{#1}{upsilon}{`u}
+ \mgr@CodeGreek{#1}{phi}{`f}
+ \mgr@CodeGreek{#1}{chi}{`c}
+ \mgr@CodeGreek{#1}{psi}{`y}
+ \mgr@CodeGreek{#1}{omega}{`w}
+ \mgr@CodeGreek{#1}{varepsilon}{`u} % = epsilon
+ \mgr@CodeGreek{#1}{vartheta}{`J}
+ \mgr@CodeGreek{#1}{varpi}{`v}
+ \mgr@CodeGreek{#1}{varrho}{`r} % = rho
+ \mgr@CodeGreek{#1}{varsigma}{`s} % = sigma
+ \mgr@CodeGreek{#1}{varphi}{`j}
+ \else % OML (or U) encoding
+ \mgr@CodeGreek{#1}{Gamma}{"00}
+ \mgr@CodeGreek{#1}{Delta}{"01}
+ \mgr@CodeGreek{#1}{Theta}{"02}
+ \mgr@CodeGreek{#1}{Lambda}{"03}
+ \mgr@CodeGreek{#1}{Xi}{"04}
+ \mgr@CodeGreek{#1}{Pi}{"05}
+ \mgr@CodeGreek{#1}{Sigma}{"06}
+ \mgr@CodeGreek{#1}{Upsilon}{"07}
+ \mgr@CodeGreek{#1}{Phi}{"08}
+ \mgr@CodeGreek{#1}{Psi}{"09}
+ \mgr@CodeGreek{#1}{Omega}{"0A}
+ \mgr@CodeGreek{#1}{alpha}{"0B}
+ \mgr@CodeGreek{#1}{beta}{"0C}
+ \mgr@CodeGreek{#1}{gamma}{"0D}
+ \mgr@CodeGreek{#1}{delta}{"0E}
+ \mgr@CodeGreek{#1}{epsilon}{"0F}
+ \mgr@CodeGreek{#1}{zeta}{"10}
+ \mgr@CodeGreek{#1}{eta}{"11}
+ \mgr@CodeGreek{#1}{theta}{"12}
+ \mgr@CodeGreek{#1}{iota}{"13}
+ \mgr@CodeGreek{#1}{kappa}{"14}
+ \mgr@CodeGreek{#1}{lambda}{"15}
+ \mgr@CodeGreek{#1}{mu}{"16}
+ \mgr@CodeGreek{#1}{nu}{"17}
+ \mgr@CodeGreek{#1}{xi}{"18}
+ \mgr@CodeGreek{#1}{pi}{"19}
+ \mgr@CodeGreek{#1}{rho}{"1A}
+ \mgr@CodeGreek{#1}{sigma}{"1B}
+ \mgr@CodeGreek{#1}{tau}{"1C}
+ \mgr@CodeGreek{#1}{upsilon}{"1D}
+ \mgr@CodeGreek{#1}{phi}{"1E}
+ \mgr@CodeGreek{#1}{chi}{"1F}
+ \mgr@CodeGreek{#1}{psi}{"20}
+ \mgr@CodeGreek{#1}{omega}{"21}
+ \mgr@CodeGreek{#1}{varepsilon}{"22}
+ \mgr@CodeGreek{#1}{vartheta}{"23}
+ \mgr@CodeGreek{#1}{varpi}{"24}
+ \mgr@CodeGreek{#1}{varrho}{"25}
+ \mgr@CodeGreek{#1}{varsigma}{"26}
+ \mgr@CodeGreek{#1}{varphi}{"27}
+ %\mgr@CodeGreek{#1}{varkappa}{"FE}
+ \fi\fi\fi
+}
+
+\newcommand\mgr@DefaultGreeks{%
+ \ifmathgreeks@uppercase
+ \ifmathgreeks@Greekup
+ \let\Gamma\upGamma
+ \let\Delta\upDelta
+ \let\Theta\upTheta
+ \let\Lambda\upLambda
+ \let\Xi\upXi
+ \let\Pi\upPi
+ \let\Sigma\upSigma
+ \let\Upsilon\upUpsilon
+ \let\Phi\upPhi
+ \let\Psi\upPsi
+ \let\Omega\upOmega
+ \else
+ \let\Gamma\itGamma
+ \let\Delta\itDelta
+ \let\Theta\itTheta
+ \let\Lambda\itLambda
+ \let\Xi\itXi
+ \let\Pi\itPi
+ \let\Sigma\itSigma
+ \let\Upsilon\itUpsilon
+ \let\Phi\itPhi
+ \let\Psi\itPsi
+ \let\Omega\itOmega
+ \fi\fi
+ \ifmathgreeks@lowercase
+ \ifmathgreeks@greekup
+ \let\alpha\upalpha
+ \let\beta\upbeta
+ \let\gamma\upgamma
+ \let\delta\updelta
+ \let\epsilon\upepsilon
+ \let\zeta\upzeta
+ \let\eta\upeta
+ \let\theta\uptheta
+ \let\iota\upiota
+ \let\kappa\upkappa
+ \let\lambda\uplambda
+ \let\mu\upmu
+ \let\nu\upnu
+ \let\xi\upxi
+ \let\pi\uppi
+ \let\rho\uprho
+ \let\sigma\upsigma
+ \let\tau\uptau
+ \let\upsilon\upupsilon
+ \let\phi\upphi
+ \let\chi\upchi
+ \let\psi\uppsi
+ \let\omega\upomega
+ \let\varepsilon\upvarepsilon
+ \let\vartheta\upvartheta
+ \let\varpi\upvarpi
+ \let\varrho\upvarrho
+ \let\varsigma\upvarsigma
+ \let\varphi\upvarphi
+ \else
+ \let\alpha\italpha
+ \let\beta\itbeta
+ \let\gamma\itgamma
+ \let\delta\itdelta
+ \let\epsilon\itepsilon
+ \let\zeta\itzeta
+ \let\eta\iteta
+ \let\theta\ittheta
+ \let\iota\itiota
+ \let\kappa\itkappa
+ \let\lambda\itlambda
+ \let\mu\itmu
+ \let\nu\itnu
+ \let\xi\itxi
+ \let\pi\itpi
+ \let\rho\itrho
+ \let\sigma\itsigma
+ \let\tau\ittau
+ \let\upsilon\itupsilon
+ \let\phi\itphi
+ \let\chi\itchi
+ \let\psi\itpsi
+ \let\omega\itomega
+ \let\varepsilon\itvarepsilon
+ \let\vartheta\itvartheta
+ \let\varpi\itvarpi
+ \let\varrho\itvarrho
+ \let\varsigma\itvarsigma
+ \let\varphi\itvarphi
+ \fi\fi
+}
+
+\providecommand\SaveGreeks{%
+ \let\backGamma\Gamma
+ \let\backDelta\Delta
+ \let\backTheta\Theta
+ \let\backLambda\Lambda
+ \let\backXi\Xi
+ \let\backPi\Pi
+ \let\backSigma\Sigma
+ \let\backUpsilon\Upsilon
+ \let\backPhi\Phi
+ \let\backPsi\Psi
+ \let\backOmega\Omega
+ \let\backalpha\alpha
+ \let\backbeta\beta
+ \let\backgamma\gamma
+ \let\backdelta\delta
+ \let\backepsilon\epsilon
+ \let\backzeta\zeta
+ \let\backeta\eta
+ \let\backtheta\theta
+ \let\backiota\iota
+ \let\backkappa\kappa
+ \let\backlambda\lambda
+ \let\backmu\mu
+ \let\backnu\nu
+ \let\backxi\xi
+ \let\backpi\pi
+ \let\backrho\rho
+ \let\backsigma\sigma
+ \let\backtau\tau
+ \let\backupsilon\upsilon
+ \let\backphi\phi
+ \let\backchi\chi
+ \let\backpsi\psi
+ \let\backomega\omega
+ \let\backvarepsilon\varepsilon
+ \let\backvartheta\vartheta
+ \let\backvarpi\varpi
+ \let\backvarrtho\varrho
+ \let\backvarsigma\varsigma
+ \let\backvarphi\varphi
+}
+
+
+%%%%%%%%%%%%%% Macros for changing font dynamically %%%%%%%%%%%%%
+
+\def\setmathgreeks#1{\setkeys{mathgreeks}{#1}\unskip
+ \ifmathgreeks@upgreek
+ \mathgreeks@Greekuptrue
+ \mathgreeks@greekuptrue
+ \PackageWarning{mathgreeks}{Style is set to `upright'
+ \MessageBreak with the `upgreek' option}
+ \fi
+ \mgr@DefaultGreeks\ignorespaces
+}
+
+\newif\ifmgrfont@unicodemath
+\define@key{mgrfont}{unicode-math}[Latin Modern Math]{%
+ \def\mgrfont@unicodemath{#1}\mgrfont@unicodemathtrue}
+\newif\ifmgrfont@fontspec
+\define@key{mgrfont}{fontspec}[GFS Didot]{%
+ \def\mgrfont@fontspec{#1}\mgrfont@fontspectrue}
+\define@key{mgrfont}{enc}{\def\mgrfont@enc{#1}}
+\define@key{mgrfont}{fam}{\def\mgrfont@fam{#1}}
+\newcommand*\mgrfont@series{m} % default value
+\define@key{mgrfont}{series}{\renewcommand*\mgrfont@series{#1}}
+\newcommand*\mgrfont@shape{it} % default value
+\define@key{mgrfont}{shape}{\renewcommand*\mgrfont@shape{#1}}
+
+\def\mathgreeksfont#1{%
+ \mgrfont@unicodemathfalse
+ \mgrfont@fontspecfalse
+ \renewcommand*\mgrfont@series{m}
+ \renewcommand*\mgrfont@shape{it}
+ \mathgreeks@lgrmathfalse
+ \mathgreeks@fontspecfalse
+ \mathgreeks@Symbolfalse
+ \mathgreeks@upgreekfalse
+ \setkeys{mgrfont}{#1}
+ \ifmgrfont@unicodemath
+ \setmathfont{\mgrfont@unicodemath}[range=it/{greek,Greek}]
+ \setmathfont{\mgrfont@unicodemath}[range=up/{greek,Greek}]
+ \let\mgr@UnicodeGreek\mgr@UnicodemathGreek
+ \mathgreeks@fontspectrue % for \mgr@CodeGreeks
+ \mgr@CodeGreeks{it}
+ \mgr@CodeGreeks{up}
+ \mgr@DefaultGreeks
+ \else\ifmgrfont@fontspec
+ \let\MathGreeksFont\relax
+ \newfontfamily\MathGreeksFont{\mgrfont@fontspec}
+ \let\mgr@UnicodeGreek\mgr@NewUnicodeGreek
+ \mathgreeks@fontspectrue
+ \mgr@CodeGreeks{it}
+ \mgr@CodeGreeks{up}
+ \mgr@DefaultGreeks
+ \else
+ \let\mgr@CodeGreek\mgr@NewCodeGreek
+ \ifdefstring{\mgrfont@enc}{LGR}{
+ \mathgreeks@lgrmathtrue
+ }{
+ \ifdefstring{\mgrfont@fam}{psy}{
+ \mathgreeks@Symboltrue
+ }{
+ \ifdefstring{\mgrfont@fam}{fsy}{
+ \mathgreeks@Symboltrue
+ }{
+ }}}
+ \mgr@CodeGreeks{}
+ \fi\fi
+}
+
+\def\mgr@NewCodeGreek#1#2#3{\unskip
+ \expandafter\DeclareRobustCommand\csname#1#2\endcsname
+ {\mathalpha{\text{\usefont{\mgrfont@enc}{\mgrfont@fam}
+ {\mgrfont@series}{\mgrfont@shape}\symbol{#3}}
+ }}\ignorespaces
+}
+
+\def\mgr@NewUnicodeGreek#1#2#3{\unskip % only with fontspec
+ \expandafter\DeclareRobustCommand\csname#1#2\endcsname
+ {\mathalpha{\text{\csname#1shape\endcsname%
+ \MathGreeksFont\symbol{#3}}
+ }}\ignorespaces
+}
+
+\providecommand\greektable{
+ $\begin{array}{c}
+ \begin{array}{*{23}{@{\;}c}@{\;}}
+ \alpha & \beta & \gamma & \delta & \epsilon & \zeta & \eta &
+ \theta & \iota & \kappa & \lambda & \mu & \nu & \xi & \pi &
+ \rho & \sigma & \tau & \upsilon & \phi & \chi & \psi & \omega
+ \end{array}
+ \\
+ \begin{array}{*{18}{@{\;}c}@{\;}}
+ \varepsilon & \vartheta & \varpi & \varrho & \varsigma & \varphi
+ & | &
+ \Gamma & \Delta & \Theta & \Lambda & \Xi & \Pi & \Sigma &
+ \Upsilon & \Phi & \Psi & \Omega
+ \end{array}
+ \end{array}$
+}
+
+% \end{macrocode}
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/mathgreeks/mathgreeks.ins b/macros/latex/contrib/mathgreeks/mathgreeks.ins
new file mode 100644
index 0000000000..e7e74d9458
--- /dev/null
+++ b/macros/latex/contrib/mathgreeks/mathgreeks.ins
@@ -0,0 +1,56 @@
+%%
+%% Copyright (C) 2024 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/mathgreeks}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2024 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{mathgreeks.sty}{\from{mathgreeks.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{* mathgreeks.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* mathgreeks.dtx through LuaLaTeX *}
+\Msg{* (or LaTeX for a shorter version of the doc). *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/macros/latex/contrib/mathgreeks/mathgreeks.pdf b/macros/latex/contrib/mathgreeks/mathgreeks.pdf
new file mode 100644
index 0000000000..5addc4ecb1
--- /dev/null
+++ b/macros/latex/contrib/mathgreeks/mathgreeks.pdf
Binary files differ
diff --git a/macros/latex/contrib/mismath/README.md b/macros/latex/contrib/mismath/README.md
index 2ebf631307..9cafc74719 100644
--- a/macros/latex/contrib/mismath/README.md
+++ b/macros/latex/contrib/mismath/README.md
@@ -5,17 +5,19 @@
The package provides some mathematical macros to typeset:
- mathematical constants e, i, pi in upright shape (automatically) as recommended by ISO 80000-2,
-- vectors with nice arrows and adjusted norm (and tensors),
+- vectors with nice arrows and adjusted norm,
+- tensors in sans serif bold italic shape (ISO recommendation),
- some standard operator names,
+- several commands with useful aliases,
- improved spacings in mathematical formulas,
- systems of equations and small matrices,
-- displaymath in double columns for lengthy calculations.
+- displaymath in double columns for lengthy calculations with short expressions.
## Installation
- run LaTeX on mismath.ins, you obtain the file mismath.sty,
-- if then you run XeLaTeX or LuaLaTeX on mismath.dtx you get the file mismath.pdf which is also in the archive,
+- if then you run pdfLaTeX on mismath.dtx you get the file mismath.pdf which is also in the archive,
- put the files mismath.sty and mismath.pdf in your TeX Directory Structure.
diff --git a/macros/latex/contrib/mismath/mismath.dtx b/macros/latex/contrib/mismath/mismath.dtx
index 88793e7e9e..f3fd2168bc 100644
--- a/macros/latex/contrib/mismath/mismath.dtx
+++ b/macros/latex/contrib/mismath/mismath.dtx
@@ -20,16 +20,16 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{mismath}
- [2024/02/29 v2.12 .dtx Miscellaneous mathematical macros]
+ [2024/05/04 v3.0 .dtx Miscellaneous mathematical macros]
%</package>
%<*driver>
\documentclass{ltxdoc}
-%\usepackage[utf8]{inputenc} % running through XeLaTeX
+\usepackage[utf8]{inputenc} % run through XeLaTeX
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
-\usepackage{fontspec}
+%\usepackage{fontspec}
\usepackage{fourier} % in case of font change, modify 2.1 (3rd §)
-\usepackage[ibrackets,decimalcomma]{mismath}
+\usepackage[ibrackets,decimalcomma,otherReIm]{mismath}
%\usepackage{amssymb} % unnecessary with fourier
\usepackage{multicol}
\usepackage{sectsty}
@@ -40,33 +40,37 @@
\definecolor{darkbrown}{rgb}{0.5,0.1,0.1}
\allsectionsfont{\color{darkbrown}}
-% The following commands provides several shapes of pi
-% the maximum number of authorized math fonts is reached
+
+% The following commands provide several shapes for pi
\DeclareFontEncoding{LGR}{}{}
-\DeclareSymbolFont{lgrlmr}{LGR}{lmr}{m}{n}
-\DeclareMathSymbol{\pilmr}{\mathalpha}{lgrlmr}{112}
-\DeclareSymbolFont{lgrAlegreya}{LGR}{Alegreya-LF}{m}{n}
-\DeclareMathSymbol{\piAlegreya}{\mathalpha}{lgrAlegreya}{112}
-\DeclareSymbolFont{lgrCochineal}{LGR}{Cochineal-LF}{m}{n}
-\DeclareMathSymbol{\piCochineal}{\mathalpha}{lgrCochineal}{112}
-\pinumber[upgreek=Euler]
-\DeclareSymbolFont{upgreekSymbol}{U}{psy}{m}{n}
-\DeclareMathSymbol{\piSymbol}{\mathord}{upgreekSymbol}{`p}
-\DeclareSymbolFont{mdCharter}{OML}{mdbch}{m}{n}
-\DeclareMathSymbol{\piCharter}{\mathord}{mdCharter}{"19}
-\DeclareSymbolFont{kp}{U}{jkpmia}{m}{it}
-\DeclareMathSymbol{\pikp}{\mathord}{kp}{"19}
-\DeclareSymbolFont{px}{U}{pxmia}{m}{it}
-\DeclareMathSymbol{\pipx}{\mathord}{px}{"19}
-\DeclareSymbolFont{tx}{U}{txmia}{m}{it}
-\DeclareMathSymbol{\pitx}{\mathord}{tx}{"19}
-% For showing original \i and \j in text mode:
-\DeclareTextFontCommand{\extrafont}{\fontfamily{lmr}\selectfont}
+\def\pilmr{\text{\usefont{LGR}{lmr}{m}{n}\symbol{112}}}
+\def\piAlegreya{\text{\usefont{LGR}{Alegreya-LF}{m}{n}\symbol{112}}}
+\def\piCochineal{\text{\usefont{LGR}{Cochineal-LF}{m}{n}\symbol{112}}}
+\def\piLibSerif{\text{\usefont{LGR}{LibertinusSerif-LF}{m}{n}\symbol{112}}}
+\def\piLibSans{\text{\usefont{LGR}{LibertinusSans-LF}{m}{n}\symbol{112}}}
+\def\pilmss{\text{\usefont{LGR}{lmss}{m}{n}\symbol{112}}}
+\def\pigentium{\text{\usefont{LGR}{gentium}{m}{n}\symbol{112}}}
+\def\pilato{\text{\usefont{LGR}{lato-LF}{m}{n}\symbol{112}}}
+\DeclareFontFamily{U}{eur}{\skewchar\font'177}
+\DeclareFontShape{U}{eur}{m}{n}{%
+ <-6> eurm5 <6-8> eurm7 <8-> eurm10}{}
+\def\piEuler{\text{\usefont{U}{eur}{m}{n}\symbol{"19}}}
+\def\piSymbol{\text{\usefont{U}{psy}{m}{n}\symbol{`p}}}
+\def\piCharter{\text{\usefont{OML}{mdbch}{m}{n}\symbol{"19}}}
+\def\pikp{\text{\usefont{U}{jkpmia}{m}{it}\symbol{"19}}}
+\pinumber[otherpi] % fourier
+\def\pipx{\text{\usefont{U}{pxmia}{m}{it}\symbol{"19}}}
+\def\pitx{\text{\usefont{U}{txmia}{m}{it}\symbol{"19}}}
+
+% Next command is used for showing original Latin Modern \i and \j in text mode:
+%\DeclareTextFontCommand{\extrafont}{\fontfamily{lmr}\selectfont} % useless with fourier
\DisableCrossrefs
%\CodelineIndex
%\RecordChanges
+
\usepackage{hyperref}
+\let\C\relax % "\C already defined" with hyperref when compiling with xelatex or lualatex
\hypersetup{%
colorlinks,
linkcolor=blue,
@@ -83,7 +87,7 @@
%</driver>
% \fi
%
-% \CheckSum{831}
+% \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
@@ -159,8 +163,8 @@
% (and LGR encoding pi by default), it is no longer compatible with the older,
% - paren command has been removed,
% - hvect and hlbar have been slightly modified (phantom t instead of phantom h),
-% - several changes in documentation,
-% - now using the Charter font (with the package mathdesign)}
+% - several changes in the documentation,
+% - now using the Charter font in the doc (with the package mathdesign)}
%
% \changes{v2.1}{2022/12/26}{
% - Improved management of square brackets with the ibrackets package,
@@ -225,26 +229,41 @@
%
% \changes{v2.12}{2024/02/29}{
% - The xparse package has been removed by mistake in v2.11,
-% this may cause some compatibility problems with unicode-math;
+% this may cause some compatibility problems;
% it is loaded again by mismath
% - Improvements to make pinumber work perfectly with unicode-math
% - Small corrections in the doc}
%
+% \changes{v3.0}{2024/03/15}{
+% - Rewriting of the pinumber command including the pifonts macro
+% - Presenting other lgrmath values for pinumber in the doc
+% - The \C macro is now in AtBeginDocument
+% - amsmath isn't loaded anymore because mathtools loads it
+% - Bug fix with options decimalcomma and ibrackets
+% - New option 'nofunction' to lighten the package loading
+% - Addition of coker and Res in standard operator names
+% - New option 'classicReIm' to deactivate Im and Re redefinition
+% - New option 'otherReIm' to provide an alternative writing with cmsy font
+% - Removal of the PEupright command
+% - Additional space in the lfrac macro increased from \: (5mu) to 7mu
+% - New optional parameter for adjusting the space in lfrac
+% - Changing the vphantom in hvect, hvec and lbar from `t' to `A', looks better}
+%
% \GetFileInfo{mismath.sty}
%
% \title{Miscellaneous mathematical macros \\The \textsf{mismath} package\thanks{This document
% corresponds to \textsf{mismath}~\fileversion, dated \filedate.
% Thanks to François Bastouil for initial help in English translation.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{February 29, 2024}
+% \date{May 04, 2024}
%
% \maketitle
% \tableofcontents
%
% \section{Introduction}
%
-% According to the International Standards ISO~31-0:1992 to ISO~31-13:1992
-% (superseded by ISO~80000-2:2009), mathematical \emph{constants} $\e$, $\i$, $\otherpi$
+% According to the International Standards ISO~31-0:1992 to ISO~31-13:1992
+% (superseded by ISO~80000-2:2009), mathematical \emph{constants} $\e$, $\i$, $\pi$
% should be typeset in roman (upright shape) and not in italic like
% variables (see~\cite{TYPMA}~\cite{NIST}~\cite{SI}~\cite{ICTNS}).
% This package provides some tools to achieve this automatically.
@@ -262,14 +281,15 @@
% or worse $\left\Vert \vect{AB} \right\Vert$ (when using |\left|\ldots |\right|).
%
% \smallskip
-% The package also offers other macros for:
+% The package also offers other macros to typeset:
% \begin{itemize}
-% \item tensors,
-% \item some common operator names,
-% \item a few useful aliases,
-% \item enhancing spacing in mathematical formulas,
+% \item tensors in sans serif bold italic shape
+% (ISO recommendation~\cite{TYPMA}~\cite{NIST}~\cite{SI}),
+% \item some standard operator names,
+% \item several commands with useful aliases,
+% \item improved spacings in mathematical formulas,
% \item systems of equations and small matrices,
-% \item displaymath in double columns for lengthy calculations.
+% \item displaymath in double columns for lengthy calculations with short expressions.
% \end{itemize}
%
% To avoid compatibility issues,
@@ -282,36 +302,38 @@
%
% \medskip
% \DescribeEnv{\oarg{options}}
-% The \textsf{mismath} package loads the \textsf{amsmath} package~\cite{AMS}
-% without any options.
-% If you want to use \textsf{amsmath} with specific options (refer to its documentation),
-% you can include these options when calling \textsf{mismath}, or
-% you can load \textsf{amsmath}
-% with the desired options before loading \textsf{mismath}.
-% \emph{When using the package \textsf{unicode-math}~\cite{UNIC}, \textsf{mismath}
-% must be loaded before \textsf{unicode-math}}, just like \textsf{amsmath}.
+% The \textsf{mismath} package loads the \textsf{mathtools}
+% \footnote{The \textsf{mathtools} package offers numerous helpful macros and improvements
+% of the \textsf{amsmath} package.}
+% package by Morten Høgholm and Lars Madsen~\cite{TOOL} which in turn loads
+% the \textsf{amsmath} package~\cite{AMS}.
+% If you want to use \mbox{\textsf{amsmath}} or \textsf{mathtools} with specific options,
+% you can include these options as options of \mbox{\textsf{mismath}}, or
+% you can load \textsf{amsmath} or \textsf{mathtools}
+% with the desired options before loading \mbox{\textsf{mismath}}.
+% When using the package \textsf{unicode-math}~\cite{UNIC}, \textsf{mismath}
+% should be loaded before \textsf{unicode-math}, just like \textsf{amsmath}.
%
% \medskip
-% In addition \textsf{mismath} loads the \textsf{mathtools} package
-% by Morten Høgholm and Lars Madsen~\cite{TOOL}.
-% This package offers numerous helpful macros and improvements of the \textsf{amsmath} package.
-%
-% \medskip
-% A recommendation, although rarely followed, is to typeset uppercase
+% An ISO recommendation, although rarely followed, is to typeset uppercase
% Greek letters in italic shape,
-% similar to other variables~\cite{ICTNS}. This can be automatically achieved,
+% as for other variables~\cite{ICTNS}. This is automatically achieved,
% for some particular fonts, with packages
% such as \textsf{fixmath} by Walter Schmidt~\cite{FIXM},
% \mbox{\textsf{isomath}} by Günter Milde~\cite{ISOM}
% or \textsf{pm-isomath} by Claudio Beccari~\cite{PMISO} and optionally with many others
% (such as \textsf{mathpazo} or \textsf{mathptmx} with the option \texttt{slantedGreek}).
+% When running through \LuaLaTeX\ or \XeLaTeX\ you can also get this result
+% with the option \mbox{\texttt{math-style=ISO}} provided
+% by the \textsf{unicode-math} package.
+% We also have the new \mbox{\textsf{mathgreeks}} package~\cite{MGREEK} which offers
+% a wide range of fonts and different settings with Greek letters.
% However this feature is not implemented here due to a conflicting rule in France,
% where all capital letters in mathematics
% are required to be typeset in upright shape
% \footnote{The \textsf{frenchmath} package~\cite{FR}
% ensures to follow the recommended French rules.}.
-% When running through \LuaLaTeX\ or \XeLaTeX\ you can also get this result by
-% setting the option \mbox{\texttt{math-style=ISO}} in the \textsf{unicode-math} package.
+% The user is free to choose loading one of these packages or not.
%
%
% \section{Usage}
@@ -338,12 +360,12 @@
%
% \medskip
% \DescribeMacro{\e} \DescribeMacro{\i} \DescribeMacro{\j}
-% To avoid cluttering a document that contains many occurrences of Euler's number (e)
-% or imaginary numbers (i) with |\mathup{e}| or |\mathup{i}|,
-% the package provides the |\e| command for Euler’s number
+% To avoid cluttering a document that contains many occurrences of Euler's number $\e$,
+% or imaginary number $\i$, with |\mathup{e}| or |\mathup{i}|,
+% the package provides the |\e| command for Euler's number
% and |\i| or |\j| for imaginary numbers.
% Let us notice that |\i| and |\j| already exist in LaTeX. In LR (left-to-right) mode,
-% they produce \mbox{`\extrafont{\i,\ \j}'} without the dot,
+% they produce \mbox{`\i,\ \j'} without the dot,
% allowing you to place accents on them.
% However, in mathematical mode, they produce the warning
% ``\texttt{LaTeX Warning: Command \string \i\space invalid in math mode on input line}
@@ -355,19 +377,21 @@
% \DescribeMacro{\MathUp}
% Indeed, typing a lot of backslashes for constants like $\e$, $\i$, or $\j$
% in a document with numerous formulas can become tiresome.
-% To alleviate this, the package proposes a powerful solution
+% To alleviate this, the package proposes another solution
% with the macro |\MathUp|\marg{char}.
% For example, when |\MathUp{e}| is called, any subsequent occurrence of $\e$
% will automatically be set in roman (upright shape),
% without the need to type |\e| explicitly. The effect of this macro
% can be either global or local, depending on whether it is used outside or inside an
% environment or braces.
-% Furthermore, you can call this macro in the preamble to apply the change
-% from the beginning of the document. This powerful feature allows you
-% to bring a document up to the standards effortlessly.
+% Furthermore, you can also call this macro in the preamble, then the change will apply
+% from the beginning of the document. This powerful command allows you
+% to bring a document up to the standards effortlessly and without changing anything
+% in your mathematical formulas.
% In fact, |\MathUp| can be applied to any valid single character,
-% offering flexibility for various use cases (another use of it with probability
-% will be presented in section \ref{operators}).
+% offering flexibility for various use cases
+% \footnote{Another use of it with probability
+% will be presented in section \ref{operators}.}.
%
% \medskip
% \DescribeMacro{\MathIt}
@@ -387,37 +411,47 @@
% In |\MathNumbers|, the comma separator between letters can be modified
% or removed as needed. In fact, this macro only affects the letters e, i, or j;
% it has no effect on other characters.
-% On the other hand, |\MathNormal| can be utilized for probability as well
-% (refer to section \ref{operators}), and it accepts any comma-separated list of arguments.
+% On the other hand, |\MathNormal| accepts any comma-separated list of arguments.
% This means you can apply the normal italic math mode typesetting to various letters
% at once using |\MathNormal|.
+%
+% \medskip
+% \DescribeMacro{\enumber}\DescribeMacro{\inumber}\DescribeMacro{\jnumber}
+% These three commands, used until version 2.2 but only functioning within the preamble,
+% serve now as aliases for the commands |\MathUp{e}|, |\MathUp{i}| or |\MathUp{j}|,
+% so they can be used anywhere
+% in the document or preamble and has an inverse switches with |\MathIt|.
%
% \medskip
% \DescribeMacro{\pinumber[\meta{option}]}
-% The mathematical constant $\otherpi$ should also be typeset in upright shape
+% The constant $\pi$ should also be typeset in upright shape
% (see~\cite{TYPMA}, \cite{NIST}, \cite{ICTNS}), which is different from italicized $\itpi$.
% However, this recommendation is even less commonly followed compared to the one
% concerning $\e$ and $\i$~\cite{TYPMA}.
-% The |\pinumber| command replaces the italic $\itpi$ with an upright $\otherpi$
-% each time |\pi| is called. It functions in two different ways.
+% Thanks to the |\pinumber| command, the italic $\itpi$ will be replaced
+% with an upright $\pi$
+% each time |\pi| is called. Thus |\pinumber| makes your document compliant with standards
+% without changing the source code of your mathematical formulas.
+% It functions in two different ways.
%
% \begin{enumerate}
-% \item You can install a Greek letters package that provides the glyphs in upright shape.
+% \item You can load a Greek letters package that provides the glyphs in upright shape.
% There are many available.
% Notably, let us mention \textsf{upgreek}~\cite{GREEK},
% \mbox{\textsf{mathdesign}}~\cite{DESIGN},
% \mbox{\textsf{kpfonts}}~\cite{KPF},
-% \mbox{\textsf{fourier}}~\cite{FOUR} (used in the present document),
-% \mbox{\textsf{libertinust1math}},
-% \mbox{\textsf{pxgreeks}} (using \textsf{pxfonts}), \mbox{\textsf{txgreeks}}
-% (using \textsf{txfonts})
+% \mbox{\textsf{fourier}}~\cite{FOUR} (used in the present document), but also
+% \mbox{\textsf{pxgreeks}} (using \textsf{pxfonts}~\cite{PX}), \mbox{\textsf{txgreeks}}
+% (using \textsf{txfonts}~\cite{TX})
% \footnote{When using \textsf{pxgreeks} or \textsf{txgreeks},
% they should be loaded \emph{after} \textsf{mismath} to avoid an error
% due to conflict with the existing macros \texttt{\string\iint}, \texttt{\string\iiint},
% \texttt{\string\iiiint}, \texttt{\string\idotsint} in \textsf{amsmath}.},
-% \textsf{libgreek}, etc.
+% \mbox{\textsf{libertinust1math}}~\cite{LIB}, \textsf{libgreek}, etc.
% A special mention goes to \textsf{lgrmath} of Jean-François Burnol~\cite{LGR}
-% which allows the use of any Greek LGR-encoded font in math mode.
+% which allows the use of any Greek LGR-encoded font in math mode,
+% an idea taken up in \textsf{mathgreeks}~\cite{MGREEK}.
+% Also note \textsf{newtxmath}~\cite{NTX} which has several font options.
% These packages provide commands like |\uppi| (\textsf{upgreek}),
% |\piup| (\textsf{mathdesign}, \textsf{kpfonts}, \textsf{lgrmath}),
% |\otherpi| (\textsf{fourier}), etc.
@@ -425,101 +459,122 @@
% letters in upright shape by default, but this in not our goal here.}
%
% In this case, |\pinumber| must be called in the preamble
-% with the name of the command (without the backslash) giving access to the upright pi
-% (piup, uppi, otherpi \ldots) as the argument for the optional parameter.
+% with an optional argument being the name of the command, \emph{without the backslash},
+% giving access to the upright pi:
+% piup, uppi, otherpi\ldots
% However, installing such a Greek letters package will modify
% all the other Greek letter glyphs.
% ^^A even if, except for pi, they will be in italics.
%
-% By using the preliminary code |\MathNumbers{ei}\pinumber[otherpi]|
-% (assuming the \textsf{fourier} package is loaded)
+% By calling in the preamble |\MathNumbers{ei}\pinumber[otherpi]|
+% (assuming the \textsf{fourier} package is loaded),
% you can achieve the following result:
% \begin{center}
-% |$e^{i\pi} = -1$| \quad yields \quad $\e^{\i\otherpi}=-1$.
+% |$e^{i\pi} = -1$| \quad yields \quad $\e^{\i\pi}=-1$.
% \end{center}
%
% \item Without installing a package, it is possible to change only the glyph of pi
-% without altering the original glyphs for the other Greek letters,
-% which are typically in italics.
-% ^^A The original pi will still be accessible with |\itpi|.
+% without altering the other Greek letters,
+% which are typically in italics.
%
% In this case, |\pinumber| must be called in the preamble with an optional argument
% of the \texttt{key=value} type. The key name corresponds to a package
% providing the same glyph.
-% When a key is given without a value, |\pinumber| will choose a default value
-% specified below (depending on the key) .
% The following table summarizes the available options.
+% When a key is given without a value, |\pinumber| will choose a default value
+% specified in the following text (depending on the key).
%
% \begin{center}
% \setlength{\extrarowheight}{1pt}
% \begin{tabular}{>{\ttfamily}l>{$}c<{$}}
% \hline
-% \normalfont Option & \mbox{Result} \\
+% {\normalfont Option} lgrmath=... & \mbox{Result} \\
% \hline
-% lgrmath=lmr & \pilmr \\
-% lgrmath=Alegreya-LF & \piAlegreya \\
-% lgrmath=Cochineal-LF & \piCochineal \\
-% lgrmath=\ldots & \ldots\\
-% upgreek=Euler & \pi \\
-% upgreek=Symbol & \piSymbol \\
+% Alegreya-LF & \piAlegreya \\
+% Cochineal-LF & \piCochineal \\
+% LibertinusSerif-LF & \piLibSerif \\
+% LibertinusSans-LF & \piLibSans \\
+% lmr & \pilmr \\
+% lmss & \pilmss \\
+% gentium & \pigentium\\
+% lato-LF & \pilato \\
% \hline
% \end{tabular}
-% \qquad
+% \qquad
% \begin{tabular}{>{\ttfamily}l>{$}c<{$}}
% \hline
-% \normalfont Option & \mbox{Result} \\
+% \normalfont Other options & \mbox{Result} \\
% \hline
+% fontspec=\ldots & \ldots \\
+% upgreek=Euler & \piEuler \\
+% upgreek=Symbol & \piSymbol \\
% mathdesign & \piCharter \\
% kpfonts & \pikp \\
-% fourier & \otherpi\\
+% fourier & \pi\\
% pxfonts & \pipx \\
% txfonts & \pitx \\
-% & \\
% \hline
% \end{tabular}
% \end{center}
%
+% \medskip
% \begin{itemize}
+%
% \item With the \texttt{lgrmath} key, we actually have numerous possibilities
-% for values (any Greek letters math fonts in LGR encoding).
+% for values (any Greek letters math font in LGR encoding).
% The documentation of the \textsf{lgrmath}
% package explains how to check an visualize all available fonts on your distribution.
-% We have only presented three of them. The default value is \texttt{lmr}.
+% We have only presented seven of them. The default value is \texttt{lmr}.
+% Other interesting values are \texttt{NotoSerif-LF}, \texttt{Clara-TLF},
+% \texttt{droidserif}, \texttt{fct}, \texttt{llcmss}.
%
+% \item When |\pinumber| is called without an argument in the preamble,
+% it corresponds to the option \texttt{lgrmath=lmr}.
+% This $\pilmr$ character is well-suited
+% for use with the Latin Modern font family
+% \footnote{It will look the same as the one provided by \texttt{lgrmath=cmr} or by
+% Günter Milde's \textsf{textalpha} package~\cite{ALPHA}.}.
+%
+% \item With the \texttt{fontspec} key, there are also many possible values,
+% corresponding to the TrueType or OpenType fonts installed on your system
+% (works with \LuaLaTeX\ or \XeLaTeX).
+% See the \textsf{mathgreeks} documentation for examples.
+
% \item With the \texttt{upgreek} key, the default value is \texttt{Symbol}.
% There is a third possible value, \texttt{Symbolsmallscale},
% which provides the same character as \texttt{Symbol} but reduced in size by 10\,\%.
%
% \item With the \texttt{mathdesign} key, there are actually 3 possible values:
-% \texttt{Utopia}, \texttt{Garamond}, or \texttt{Charter} (default value),
-% but the glyphs obtained for pi look very similar.
+% \texttt{Utopia}, \texttt{Garamond} or \texttt{Charter} (the default value),
+% but the glyphs obtained for pi look quite similar.
%
% \item With the \texttt{kpfonts} key, we have two possible values:
% \texttt{normal} (default) and \texttt{light}. The option \texttt{kpfonts=light}
% provides a slightly less bold character.
%
-% \item The keys \texttt{fourier} (based on Utopia), \texttt{pxfonts} (based on Palatino)
-% and \texttt{txfonts} (based on Times)
+% \item The last keys, \texttt{fourier} (based on Utopia), \texttt{pxfonts}
+% (based on Palatino),
+% \texttt{txfonts} (based on Times)
% are booleans whose default value is \texttt{true} (when called).
+% The \texttt{txfonts} option yields the same glyph than \texttt{lgrmath=txr}.
%
-% \item When |\pinumber| is called without an argument in the preamble,
-% it corresponds to the option \texttt{lgrmath=lmr}.
-% This $\pilmr$ character is particularly well-suited
-% for use with the default Computer Modern or Latin Modern font family
-% \footnote{It will look the same as the one provided by
-% Günter Milde's \textsf{textalpha} package~\cite{ALPHA}.}.
% \end{itemize}
% \end{enumerate}
%
% The \textsf{unicode-math} package~\cite{UNIC} provides |\uppi|, and you can use
-% |\pinumber[uppi]| to produce automatic upright pi, but, with \textsf{unicode-math},
-% it can be quite complicated
-% to make some other Greek letters packages work.
-% In any case, such a package must be loaded after \textsf{unicode-math} and in
-% |\AtBeginDocument|.
-% However, \textsf{unicode-math} supports |\pinumber| very well with the
-% previous \texttt{key=value} options, by calling |\pinumber[option]| after
-% \mbox{\textsf{unicode-math}}.
+% |\pinumber[uppi]| to produce automatic upright pi in the selected math font,
+% but |\pinumber[uppi]| must be called \emph{after} \mbox{\textsf{unicode-math}},
+% and a math font must have been explicitly chosen with |\setmathfont|.
+% You can also use the \texttt{fontspec} key option to obtain pi in any font
+% that is supported by \mbox{\textsf{unicode-math}} \eg
+% |\pinumber[fontspec=STIX Two Math]|.
+%
+% For other fonts, it can be quite complicated to make Greek letters packages
+% work with \textsf{unicode-math}. In any case, such a package must be loaded
+% after \textsf{unicode-math} and in |\AtBeginDocument|.
+% However, |\pinumber| supports \textsf{unicode-math} very well with any previous
+% \texttt{key=value} option, by calling |\pinumber|\oarg{option}
+% after \textsf{unicode-math}.
%
% \medskip
% \DescribeMacro{\itpi}
@@ -555,7 +610,7 @@
% If you wish to use a different type of arrow, you must call \textsf{esvect}
% with the appropriate option \emph{before} loading \textsf{mismath}.
% For example, using |\usepackage[d]{esvect}|
-% will provide the arrows produced by default in~\cite{VECT}.
+% will provide the same arrows that are used by default in~\cite{VECT}.
%
% \medskip
% \DescribeMacro{\boldvect}
@@ -567,11 +622,11 @@
% \begin{minipage}{8cm}
% \begin{verbatim}
%\[ \boldvect \vect{v}
-% =\lambda\vect{e}_x+\mu\vect{e}_y. \]
+% =\lambda\vect{e}_x+\mu\vect{e}_y \]
% \end{verbatim}
% \end{minipage}
% \begin{minipage}{4cm}\vspace{-2ex}
-% $\boldvect \vect{v}=\lambda\vect{e}_x +\mu\vect{e}_y$.
+% $\boldvect \vect{v}=\lambda\vect{e}_x +\mu\vect{e}_y$
% \end{minipage}
%
% \DescribeMacro{\boldvectcommand}
@@ -586,9 +641,12 @@
% \textsf{unicode-math} provides the |\symbfit| command.
% To use an alternative command instead of |\boldsymbol| in \textsf{mismath},
% redefine |\boldvectcommand|,
-% for instance after loading \textsf{fixmath}:
-% \begin{center} |\renewcommand\boldvectcommand{\mathbold}|. \end{center}
+% for instance after loading \textsf{fixmath}:
+%
+% \medskip
+% \centeredline{|\renewcommand\boldvectcommand{\mathbold}|}
%
+% \medskip
% According to ISO rules, symbols for matrices are also in bold italic.
% Therefore you can use the same |\boldvect| command or create another alias.
%
@@ -604,28 +662,31 @@
% \DescribeMacro{\hvect}
% When vectors with arrows are typeset side by side,
% the arrows can be set up slightly higher using |\hvect|
-% (which places a vertical phantom box containing ``$t$'')
+% (which places a vertical phantom box containing `$A$')
% to avoid inelegant effects. For example, writing
% \begin{itemize}
-% \item $\vect{AB}=\hvect{u}+ \vect{AC}$, obtained with |\hvect{u}|,
-% is better than $\vect{AB}=\vect{u}+ \vect{AC}$;
+% \item $\vect{AB}=\hvect{u} + \vect{AC}$, obtained with |\hvect{u}|,
+% looks better than $\vect{AB}=\vect{u}+ \vect{AC}$;
% \item $\hvect{a} \cdot \vect{b}=0$, obtained with |\hvect{a}|,
-% is better thant $\vect{a} \cdot \vect{b}=0$.
+% looks better than $\vect{a} \cdot \vect{b}=0$.
% \end{itemize}
-% This adjustment ensures a more visually pleasing appearance when vectors
-% with arrows are combined in an equation.
+% This adjustment ensures a nicer appearance when vectors
+% with arrows are combined in an equation
+% \footnote{For a fine tuning you can also use the \texttt{\string\vstrut} or
+% \texttt{\string\cstrut} macros from the \textsf{spacingtricks} package~\cite{SPA}.}.
% The |\boldvect| and |\arrowvect| switches have the same effect on |\hvect|
% as they do on |\vect|.
%
% \DescribeMacro{\hvec}
% In a similar way, |\hvec| raises the little arrow produced by
-% the \LaTeX\ command |\vec|, to the height of the letter ``$t$''
-% (but |\boldvect| have no effect here):
+% the \LaTeX\ command |\vec|, to the height of the letter `$A$'
+% (but |\boldvect| have no effect on |\vec| nor |\hvec|):
% \begin{itemize}
% \item $\mathcal{P}=\vec{f}\cdot\hvec{v}$, obtained with |\hvec{v}|,
-% is better than $\mathcal{P}=\vec{f}\cdot\vec{v}$.
+% seems better than $\mathcal{P}=\vec{f}\cdot\vec{v}$;
+% ^^A (the result of |\vec| with \textsf{fourier} may be bad with high letters, \eg $\vec{h}$)
% \item $\vec{f} =m \hvec{a}$, obtained with |\hvec{a}|,
-% is better than $\vec{f} =m \vec{a}$.
+% seems better than $\vec{f} =m \vec{a}$.
% \end{itemize}
%
% \DescribeMacro{\norm}
@@ -639,11 +700,11 @@
% instead of $\Vert\vec{h}\Vert$ or $\left\Vert \vec{h} \right\Vert$.
% Let's notice that the height of the bars don't adjust to content,
% but however to context: main text, subscripts or exponents,
-% \eg $\e^{\norm{\vec{h}}}$.
+% \eg $X^{\norm{\vec{h}}}$.
% This macro is useful only for arguments of special height, such as $\vec{h}$ or $\vect{AB}$
% and may give bad results in other situations.
%
-% \pagebreak
+% \medskip
% \DescribeMacro{\mathbfsfit}\DescribeMacro{\tensor}
% For tensors symbols, ISO rules recommend using
% sans serif bold italic, but there
@@ -651,7 +712,7 @@
% However, the \mbox{\textsf{mismath}} package defines this alphabet
% (assuming the font encoding and package you use permits it)
% and provides the macro |\mathbfsfit| or its alias |\tensor|.
-% By using |\tensor{T}| you can produce $\tensor{T}$.
+% By writing |\tensor{S}\otimes\tensor{T}|, you get $\tensor{S}\otimes\tensor{T}$.
%
% \subsection{Standard operator names}\label{operators}
%
@@ -681,12 +742,12 @@
% \[m\frac{\di^2x}{\di t^2}+h\frac{\di x}{\di t}+kx=0\]
% \end{minipage}
%
-% This command can also represent \emph{distance} (hence its name):
-% \[\lambda\di(A, \mathcal{F})+\mu\di(B, \mathcal{H}).\]
+% The command |\di| can also represent the \emph{distance}, hence its name:
+% \[\di(u, \cmmathcal{H}) = \frac{\abs{\langle u,v\rangle}}{\lVert v \rVert}.\]
%
% \DescribeMacro{\P} \DescribeMacro{\E}
% To refer to probability
-% \footnote{\LaTeX\ provides also \texttt{\string Pr} which gives $\Pr$.}
+% \footnote{\LaTeX\ provides also \texttt{\string \Pr} which gives $\Pr$.}
% and expectation the proper use is to typeset the capital letters $\P$, $\E$
% in roman just like any standard function identifier.
% This can be achieved with |\P| and |\E| commands.
@@ -698,43 +759,45 @@
%
% \medskip
% \DescribeMacro{\V}
-% Variance is generally denoted by $\var$ or $\Var$ (see table below),
+% Variance is generally denoted by $\var$ or $\Var$ (see the following table),
% but some authors prefer to use $\V$, which can be produced using |\V|.
%
-% \medskip
+% \pagebreak
% \DescribeMacro{\MathProba}\DescribeMacro{\MathNormal}
% As for $\e$, $\i$ or $\j$, you can use |\MathUp{P}|, |\MathUp{E}|
% or |\MathUp{V}| to avoid typing many |\P|, |\E| or |\V|.
% However you can also achieve this in a single command with |\MathProba|,
-% for example |\MathProba{P,E}|. We get the inverse toggle with
+% for example |\MathProba{PE}|. We get the inverse toggle with
% |\MathIt| for any individual letter or |\MathNormal| for a list.
%
% \medskip
% \DescribeMacro{\probastyle}
-% Some authors use ``blackboard bold'' font to represent probability, expectation
+% Some authors use ``outline'' font shape to represent probability, expectation
% and variance: $\mathbb{P}, \mathbb{E}, \mathbb{V}$.
% The |\probastyle| macro sets the appearance of |\P|, |\E| and |\V|.
% For instance |\renewcommand\probastyle{\mathbb}|
% \footnote{The effect of this redefinition is global or local to the container environment
% in which it is used.}
-% brings the previous ``double-struck'' letters.
-% The |\mathbb| command comes from \textsf{amsfonts} package
-% (loaded by \textsf{amssymb} but also available standalone)
-% which needs to be called in the preamble.
+% brings the double-struck letters.
+% The |\mathbb| command is provided by \textsf{amsfonts} package
+% (which needs to be called in the preamble), but also by other complete math font
+% packages such as \textsf{mathdesign}, \textsf{kpfonts}, \textsf{fourier},
+% \textsf{unicode-math}\ldots
+% \hypertarget{nofunction}{}
%
% \medskip
% The following standard operator names are defined in \textsf{mismath}:
% \begin{center}
% \begin{tabular}{rlrlrl}
-% |\adj| & $\adj$ \qquad\mbox{} & |\erf| & $\erf$ \qquad\mbox{} & |\Re| & $\Re$ \\
-% |\Aut| & $\Aut$ & |\grad| & $\grad$ & |\rot| & $\rot$ \\
-% |\codim| & $\codim$ & |\id| & $\id$ & |\sgn| & $\sgn$ \\
-% |\Conv| & $\Conv$ & |\Id| & $\Id$ & |\sinc| & $\sinc$ \\
-% |\cov| & $\cov$ & |\im| & $\im$ & |\spa| & $\spa$ \\
-% |\Cov| & $\Cov$ & |\Im| & $\Im$ & |\tr| & $\tr$ \\
-% |\curl| & $\curl$ & |\lb| & $\lb$ & |\var| & $\var$ \\
-% |\divg| & $\divg$ & |\lcm| & $ \lcm$ & |\Var| & $\Var$ \\
-% |\End| & $\End$ & |\rank| & $\rank$ & |\Zu| & $\Zu$
+% |\adj| & $\adj$ \qquad\mbox{} & |\End| & $\End$ \qquad\mbox{} & |\Res| & $\Res$ \\
+% |\Aut| & $\Aut$ & |\erf| & $\erf$ & |\rot| & $\rot$ \\
+% |\codim| & $\codim$ & |\grad| & $\grad$ & |\sgn| & $\sgn$ \\
+% |\coker| & $\coker$ & |\id| & $\id$ & |\sinc| & $\sinc$ \\
+% |\Conv| & $\Conv$ & |\Id| & $\Id$ & |\spa| & $\spa$ \\
+% |\Cov| & $\Cov$ & |\im| & $\im$ & |\tr| & $\tr$ \\
+% |\cov| & $\cov$ & |\lb| & $\lb$ & |\var| & $\var$ \\
+% |\curl| & $\curl$ & |\lcm| & $ \lcm$ & |\Var| & $\Var$ \\
+% |\divg| & $\divg$ & |\rank| & $\rank$ & |\Zu| & $\Zu$
% \end{tabular}
% \end{center}
%
@@ -745,26 +808,15 @@
% For the variance, the covariance and the identity function,
% two notations are proposed, with or without a first capital letter,
% because both are very common.
-% On the other hand, `$\im$' stands for the image of a linear transformation
-% (like `$\ker$' for the kernel)
-% whereas `$\Im$' is the imaginary part of a complex number.
% Please note that |\div| already exists ($\div$) and |\span| is a \TeX\ primitive;
% they haven't been redefined. Therefore the provided macros are called |\divg| (divergence)
% and |\spa| (span of a set of vectors).
% Furthermore |\Z| is used to denote the set of integers (see \ref{aliases}),
-% which is why we used |\Zu|,
+% which is why we propose |\Zu|,
% to designate the center of a group: $\Zu(G)$ (from German Zentrum).
%
-%\medskip
-% \DescribeMacro{\oldRe} \DescribeMacro{\oldIm}
-% The |\Re| and |\Im| macros already existed to refer to real and imaginary part
-% of a complex number, producing outdated symbols $\oldRe$ and $\oldIm$.
-% However, they have been redefined according to current usage,
-% as mentioned in the above table. Nevertheless,
-% it is still possible to obtain the old symbols with |\oldRe| and |\oldIm|.
-%
% \medskip
-% The package \textsf{mismath} also provides some (inverse) circular or hyperbolic functions,
+% The \textsf{mismath} package also provides some (inverse) circular or hyperbolic functions,
% that are missing in \LaTeX:
% \begin{center}
% \begin{tabular}{rlrlrl}
@@ -773,21 +825,44 @@
% |\sech| & $\sech$ & |\arcosh| & $\arcosh$ & |\arsech| & $\arsech$ \\
% |\csch| & $\csch$ & |\artanh| & $\artanh$ & |\arcsch| & $\arcsch$
% \end{tabular}
-% \end{center}
+% \end{center}
+%
+% \DescribeMacro{[nofunction]}
+% Some may find that the definition of all these operators and functions is not useful
+% for their needs. So, the above definitions (on this page)
+% can be disabled with the \texttt{nofunction} option.
+% \hypertarget{classicReIm}{}
+%
+% \medskip
+% \DescribeMacro{\Re} \DescribeMacro{\Im}
+% The |\Re| and |\Im| macros refer to real and imaginary part
+% of a complex number. They have been redefined to produce $\mathup{Re}$ and $\mathup{Im}$,
+% in place of outdated symbols $\oldRe$ and $\oldIm$.
+% Nevertheless, it is still possible to obtain the old symbols
+% with |\oldRe| and |\oldIm|.
+%
+% \medskip
+% \DescribeMacro{[otherReIm]}
+% An alternative notation $\Re$, $\Im$ is provided by invoking the \texttt{otherReIm}
+% package option,
+% \DescribeMacro{[classicReIm]}
+% whereas the \texttt{classicReIm} option deactivates these redefinitions.
%
% \DescribeMacro{\bigO} \DescribeMacro{\bigo} \DescribeMacro{\lito}
-% Asymptotic comparison operators (in Landau notation) are obtained with
-% |\bigO| or |\bigo| and |\lito| commands:
-% \[ n^2+\bigO(n\log n) \txt{or} n^2+\bigo(n\log n)\txt{and} \e^x=1+x+\lito(x^2).\]
+% Asymptotic comparison operators (in Bachmann-Landau notation) are obtained with
+% |\bigO| or |\bigo| and |\lito| commands. The first one uses
+% the |\cmmathcal| alphabet and the last two compose the letters `O' and `o' in
+% roman, as for any operator:
+% \[ n^2+\bigO(n\log n) \txt{or} n^2+\bigo(n\log n)\txt{and}
+% \e^x=1+x+\frac{x^2}{2}+\lito\bigl(x^2\bigr).\]
%
% \subsection{A few useful aliases} \label{aliases}
%
-% \onlymathC
% In the tradition of Bourbaki and D.~Knuth, proper use requires
% that classic sets of numbers are typeset in bold roman:
% $\R, \C, \Z, \N, \Q$,
-% whereas ``double-barred'' or ``openwork'' letters
-% ($\mathbb{R}, \mathbb{C}, \mathbb{Z}, \ldots$)
+% whereas double-struck letters
+% ($\mathbb{R}, \mathbb{C}, \mathbb{Z}, \mathbb{N}, \mathbb{Q}$)
% are reserved for writing at the blackboard~\cite{LSHORT}.
% Similarly, to designate a field we use $\F$ or $\K$ (Körper in German).
% We obtain these symbols with the following macros:
@@ -795,23 +870,22 @@
% |\R|, |\C|, |\Z|, |\N|, |\Q|, |\F|, |\K|.
% \end{center}
%
-% \medskip
+% \smallskip
% \DescribeMacro{\mathset}
% The |\mathset| command enables you 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,
-% you can simply place |\renewcommand\mathset{\mathbb}| where you want,
-% for instance in the preamble after loading the \textsf{amsfonts} package
-% (which provides the ``blackboard bold'' typeface,
-% also loaded by \textsf{amssymb}).
+% By default, |\mathset| is an alias for |\mathbf|, but if you prefer outline letters,
+% you can simply use |\renewcommand\mathset{\mathbb}| (with local effect when
+% inside an environment or a pair of curly braces).
%
% \smallskip
% \DescribeMacro{\onlymathC}
% The macro |\onlymathC| is designed for cases when |\C| is already defined,
-% but only in text mode (usually when loading the Russian language with \textsf{babel}
-% or \textsf{polyglossia}). The macro preserves the original definition for text mode
+% but only in text mode (usually with the Russian language). Then you get the message:
+% ``\texttt{Command \string\C\space invalid in math mode}''.
+% This macro preserves the original definition for text mode
% and allows you to use |\C| for the complex number set in math mode.
-% For this purpose, simply call |\onlymathC| once in the preamble or anywhere in the document.
+% Simply call |\onlymathC| once in the preamble or anywhere in the document.
%
% \medskip
% \DescribeMacro{\ds}
@@ -844,11 +918,11 @@
% \DescribeMacro{\lbar} \DescribeMacro{\hlbar}
% Large bars over expressions are obtained with |\overline|
% or its alias |\lbar|, to get for instance $\lbar{z_1z_2}$.
-% Similar to vectors, you can raise the bar (from the height of ``$h$'') with
+% Similar to vectors, you can raise the bar (from the height of `$A$') with
% the |\hlbar| command, to correct uneven bars heights.
% \begin{center}
% $\lbar{z+z'}=\hlbar{z}+\lbar{z'}$, obtained with |\hlbar{z}|,
-% is better than $\lbar{z+z'}=\lbar{z}+\lbar{z'}$.
+% looks better than $\lbar{z+z'}=\lbar{z}+\lbar{z'}$.
% \end{center}
%
% \DescribeMacro{\eqdef} \DescribeMacro{\eqdef*}
@@ -918,36 +992,36 @@
% (ordinary symbol) and leaving less space around than |\times|:
% \begin{center}
% $\lambda+\alpha \mul b-\beta \mul c$, obtained with |\mul|,
-% is better than $\lambda+\alpha \times b-\beta \times c$.
+% looks better than $\lambda+\alpha \times b-\beta \times c$.
% \end{center}
%
% When using |\mul| before a function name or around a |\left...\right| structure,
% the space may be too large on one side of |\mul|.
-% To ensure the same amount of space on both sides of |\mul|,
+% To ensure the same amount of space on both sides,
% you can use thin negative spaces |\!|
% or enclose the function or structure with braces:
% \begin{center}
-% $x\mul{\sin x}$, obtained with |x\mul{\sin x}|, is slightly better than $x\mul\sin x$.\\[1ex]
+% $x\mul{\sin x}$, obtained with |x\mul{\sin x}|, is slightly better than $x\mul\sin x$;\\[1ex]
% |$\sin\!{\left( \frac{\pi}{3} \right)} \mul 2$|\\
-% gives $\sin\!{\left(\frac{\pi}{3}\right)}\mul 2$, which is better than
+% yields $\sin\!{\left(\frac{\pi}{3}\right)}\mul 2$, which looks better than
% $\sin\left(\frac{\pi}{3}\right)\mul 2$.
% \end{center}
-% The thin negative space after the function name is not relative to |\mul|,
-% but is due to the fact that spaces around a |\left...\right| structure
-% are bigger than those produced by single parenthesis |(...)|.
+% The negative thin space after the function name is not related to |\mul|,
+% but to the ``excessive'' spaces around the |\left... \right| structure.
%
% \medskip
% \DescribeMacro{\pow}
% In the same way, when typesetting an exponent after a closing \emph{big}
% parenthesis produced by |\right)|,
% the exponent appears to be a little to far from the parenthesis.
-% To address this issue, the |\pow|\marg{expr}\marg{pow} command is provided, which sets
-% \meta{expr} between parentheses and adjusts the positioning of the exponent \meta{pow}
-% slightly closer to the right parenthesis
-% \footnote{This macro gives bad results with normal-sized parenthesis.}.
+% To address this issue, the |\pow|\marg{expr}\marg{pow} command is provided
+% \footnote{This macro gives bad results with \emph{normal-sized} parenthesis.},
+% which sets the positioning of the exponent \meta{pow}
+% slightly closer to the right parenthesis.
% Compare:
-% \[ \e^a \sim\pow{1+\frac{a}{n}}{n} \txt{which may be better than}
-% \e^a \sim\left(1+\frac{a}{n}\right)^{n}.\]
+% \[ \e^a =\lim_{n \to +\infty}\pow{1+\frac{a}{n}}{n}
+% \txt{obtained with \texttt{\string \pow}, rather than}
+% \e^a =\lim_{n \to +\infty}\left(1+\frac{a}{n}\right)^{n}.\]
%
% \DescribeMacro{\abs}
% The correct typesetting of absolute value (or modular for a complex number) is achieved
@@ -964,16 +1038,18 @@
% \DescribeMacro{\lfrac}
% The |\lfrac| macro behaves like |\frac|
% but with thicker spaces around the arguments,
-% making the corresponding fraction bar slightly longer:\\[2ex]
-% \begin{minipage}{8cm}
-% \begin{verbatim}
-%\[ \lbar{Z} =
-% \lfrac{\lbar{z_1-z_2}}{\lbar{z_1+z_2}} \]
-% \end{verbatim}
-% \end{minipage}
-% \begin{minipage}{4cm}\vspace{-3ex}
-% \[ \lbar{Z} = \lfrac{\lbar{z_1-z_2}}{\lbar{z_1+z_2}} \]
-% \end{minipage}
+% making the corresponding fraction bar slightly longer. See the following examples:
+% \[ \lbar{Z} = \lfrac{\lbar{z_1-z_2}}{\lbar{z_1+z_2}} \qquad
+% u(x)= \lfrac{\frac{1-2x}{5}}{x^2+1} \qquad
+% y'+xy=\lfrac[4mu]{1}{\sqrt{x}}
+% \]
+%
+% This macro has an optional parameter |\lfrac|\oarg{space}\marg{num}\marg{denom}
+% to adjust the length of the fraction bar. The optional \meta{space} argument must be given
+% in \emph{math units} (\texttt{mu});
+% the default value is \texttt{7mu} (equivalent to |\:\,|),
+% \texttt{4mu} in the last example.
+% \hypertarget{ibrackets}{}
%
% \medskip
% \DescribeMacro{[ibrackets]}
@@ -984,17 +1060,14 @@
% To address this issue, we have redefined the brackets in the \textsf{ibrackets}
% package~\cite{BRACKET}.
% This one can be optionally
-% \footnote{This functionality is optional because there is a conflict
-% when using another command for open intervals with square brackets defined by
-% \texttt{\string \DeclarePairedDelimiter} from \textsf{mathtools}~\cite{TOOL}.}
% loaded by \textsf{mismath} using the \texttt{ibrackets} package option.
% Thus |$x\in ]-\pi,0[ \cup ]2\pi,3\pi[$|
% \begin{align*}
% \mbox{yields \ }
-% x\in ]-\otherpi, 0[ \cup ]2\otherpi, 3\otherpi[ & \mbox{\ with \textsf{ibrackets}}, \\
+% x\in ]-\pi, 0[ \cup ]2\pi, 3\pi[ & \mbox{\ with \textsf{ibrackets}}, \\
% \mbox{instead of \ }
-% x\in \mathclose{]}-\otherpi, 0 \mathopen{[} \cup
-% \mathclose{]} 2\otherpi, 3\otherpi \mathopen{[}
+% x\in \mathclose{]}-\pi, 0 \mathopen{[} \cup
+% \mathclose{]} 2\pi, 3\pi \mathopen{[}
% &\mbox{\ without \textsf{ibrackets}}.
% \end{align*}
%
@@ -1017,10 +1090,15 @@
% For instance |$[a,b] +[c,d]$| yields $[a,b] +[c,d]$
% but |$[a,b]+ [c,d]$| yields $[a, b]+ [c, d]$.
%
-% Besides, there are other approaches, for example the |\interval| macro
+% \medskip
+% Note that there are other ways to proceed,
+% for example with |\interval|,
% from the \textsf{interval} package~\cite{INT},
-% or |\DeclarePairedDelimiters| from the \textsf{mathtools} package~\cite{TOOL}
-% (but this command is incompatible with \textsf{ibrackets}).
+% or with |\DeclarePairedDelimiter|
+% \footnote{You cannot use \texttt{\string\DeclarePairedDelimiter} with square brackets
+% when \textsf{ibrackets} is loaded.}
+% from \mbox{\textsf{mathtools}}~\cite{TOOL}.
+% \hypertarget{decimalcomma}{}
%
% \medskip
%\DescribeMacro{[decimalcomma]}
@@ -1040,11 +1118,10 @@
% in particular when running through Lua\LaTeX, using \textsf{unicode-math}
% and calling |\setmathfont|.
% Therefore we propose the \textsf{decimalcomma} package~\cite{DEC},
-% functionally identical to that of \textsf{ncccomma} but with lighter code
-% and without the aforementioned incompatibility.
+% functionally identical to that of \textsf{ncccomma} but
+% without the aforementioned incompatibility.
% It can be loaded by \textsf{mismath} using the \texttt{decimalcomma}
-% package option\footnote{\texttt{ibrackets} and \texttt{decimalcomma} are the only
-% options specific to the \textsf{mismath} package.}.
+% package option.
%
% \subsection{Environments for systems of equations and small matrices}
%
@@ -1159,7 +1236,8 @@
%
% \DescribeEnv{mathcols}
% The \texttt{mathcols} environment allows you to arrange
-% ``long'' calculations in double columns, separated with a central rule,
+% lengthy calculations with short expressions across two columns
+% separated by a vertical line,
% as shown in the following example.
% However, to use this feature, the \textsf{multicol} package must be loaded in the preamble.
% The \texttt{mathcols} environment activates mathematical mode
@@ -1194,96 +1272,85 @@
% \end{verbatim}
%
% \vspace{-4ex}
-% \subsection{Old commands}
-%
-% Here is a summary table of old commands that were used until version 2.2.
-% These commands are still functional and will be maintained for the time being,
-% but a warning message indicates the new alternative.
-% They used to work only in the preamble, affecting the entire document globally,
-% and lacked an inverse switch.
-% These old commands can now be replaced by the more
-% versatile and powerful |\MathUp| macro, which can be used anywhere
-% in the document or preamble and has an inverse switch |\MathIt|.
-%
-% \begin{center}
+% \subsection{Summary of the package options}
+%
+% The following table summarizes the possible package options.
+% You can add to them any option you want to pass to \textsf{amsmath} or \textsf{mathtools}.
+% The hyperlinks (in blue) redirect to the paragraphs in the documentation
+% where these options are described.
+% \begin{center}
% \setlength{\extrarowheight}{1pt}
-% \begin{tabular}{ll}
+% \begin{tabular}{>{\ttfamily}ll}
% \hline
-% Old command & New alternative \\
+% \normalfont Option & \mbox{Effect} \\
% \hline
-% |\enumber| & |\MathUp{e}| \\
-% |\inumber| & |\MathUp{i}| \\
-% |\jnumber| & |\MathUp{j}| \\
-% |\PEupright| & |\MathProba{PE}| \\
+% \hyperlink{nofunction}{nofunction} & don't load some additional function definitions \\
+% \hyperlink{classicReIm}{otherReIm} & typesets |\Re| and |\Im| as $\Re$ and $\Im$ \\
+% \hyperlink{classicReIm}{classicReIm} & preserves |\Re| and |\Im| as $\oldRe$ and $\oldIm$ \\
+% \hyperlink{ibrackets}{ibrackets} & loads the \textsf{ibrackets} package\\
+% \hyperlink{decimalcomma}{decimalcomma} & loads the \textsf{decimalcomma} package \\
% \hline
% \end{tabular}
% \end{center}
-%
-% \medskip
-% You can also utilize |\MathNumbers| instead of |\MathUp| with an argument containing
-% all the constants you want to be typeset in roman (among `e, i, j').
-%
-% Additionally you can include V in the argument of |\MathProba| to refer to variance,
-% (or even use |\MathUp{P}\MathUp{E}|).
-%
-% \medskip
-% In version 2.3 we attempted to replace these old commands
-% with package options based on keyval. However, we found that this method was
-% less efficient and have decided to abandon it.
-% As a result, the command |\mismathset| is now obsolete.
-% Additionally, the command, |\paren|, which was used before version 2.0,
-% is no longer supported.
-%
% \StopEventually{}
% \section{Implementation}
%
% We load certain packages conditionally to avoid 'option clash' errors in cases
% where these packages have been previously loaded with other options.
+% The \textsf{amsmath} package is loaded by \textsf{mathtools}.
% \begin{macrocode}
\newif\ifmm@ibrackets % initialized to false
-\newif\ifmm@decimalcomma
\DeclareOption{ibrackets}{\mm@ibracketstrue}
+\newif\ifmm@decimalcomma
\DeclareOption{decimalcomma}{\mm@decimalcommatrue}
-\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{amsmath}}
+\newif\ifmm@nofunction
+\DeclareOption{nofunction}{\mm@nofunctiontrue}
+\newif\ifmm@otherReIm
+\DeclareOption{otherReIm}{\mm@otherReImtrue}
+\newif\ifmm@classicReIm
+\DeclareOption{classicReIm}{\mm@classicReImtrue}
+\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{mathtools}}
\ProcessOptions \relax
-\@ifpackageloaded{amsmath}{}{\RequirePackage{amsmath}}
+%\@ifpackageloaded{amsmath}{}{\RequirePackage{amsmath}}
\@ifpackageloaded{mathtools}{}{\RequirePackage{mathtools}}
\@ifpackageloaded{esvect}{}{\RequirePackage[b]{esvect}}
\RequirePackage{ifthen}
\RequirePackage{xparse} % provides \NewDocumentCommand, now in LaTeX3
-\RequirePackage{xspace}
+\RequirePackage{xspace} % for \iif command
\RequirePackage{iftex}
\RequirePackage{etoolbox} % provides \AtEndPreamble
-\RequirePackage{xkeyval}
+\RequirePackage{xkeyval} % for \pinumber options
% \end{macrocode}
%
% The package \textsf{unicode-math} causes some compatibility issues
-% with the options \texttt{ibrackets} or \texttt{decimalcomma}: the respective packages
+% with \textsf{ibrackets} and \textsf{decimalcomma}: theses packages
% must be loaded \emph{after} \textsf{unicode-math},
-% but \textsf{mismath} (like \textsf{amsmath}) must be loaded \emph{before}
+% but \textsf{mismath} (like \textsf{amsmath}) should be loaded \emph{before}
% \textsf{unicode-math}.
-% And to complicate matters, \textsf{unicode-math} defines all its commands
+% And to complicate matters, \mbox{\textsf{unicode-math}} defines all its commands
% by |\AtBeginDocument|.
-% Therefore we used the command |\AtBeginDocument| within
-% |\AtEndPreamble| (from the \textsf{etoolbox} package).
+% Therefore we used the command |\AtEndPreamble|, from the \textsf{etoolbox} package,
+% which makes the job (because both \textsf{ibrackets} and \textsf{decimalcomma}
+% work also in |\AtBeginDocument|).
%
% Moreover the command |\mathbfsfit| (used for tensors) is already defined
% in \textsf{unicode-math} and will not be redefined if \textsf{unicode-math}
% is loaded.
% \begin{macrocode}
+\@ifpackageloaded{unicode-math}{
+ \PackageWarningNoLine{mismath}{The package unicode-math\MessageBreak
+ should be loaded after mismath}
+}{}
\newif\ifmm@unicodemath
\newif\ifmm@multicol
\AtEndPreamble{% necessary to work with unicode-math
- \@ifpackageloaded{multicol}{\mm@multicoltrue}{\mm@multicolfalse}
+ \ifmm@decimalcomma\RequirePackage{decimalcomma}\fi
+ \ifmm@ibrackets\RequirePackage{ibrackets}\fi
+ \@ifpackageloaded{multicol}{\mm@multicoltrue}{}
\@ifpackageloaded{unicode-math}{\mm@unicodemathtrue}{
- \mm@unicodemathfalse
\DeclareMathAlphabet{\mathbfsfit}{\encodingdefault}%
{\sfdefault}{bx}{it}}
- \AtBeginDocument{% necessary to work with unicode-math
- \ifmm@ibrackets\RequirePackage{ibrackets}\fi
- \ifmm@decimalcomma\RequirePackage{decimalcomma}\fi
- }
}
% \end{macrocode}
@@ -1299,7 +1366,6 @@
% \end{macrocode}
%
-% \medskip
% \DescribeMacro{\mm@warning} \DescribeMacro{\mm@macro} \DescribeMacro{\mm@operator}
% The next three internal macros serve as meta commands for
% conditionally defining macros while providing a warning message if the macro already exists.
@@ -1307,8 +1373,8 @@
% \medskip
% \begin{macrocode}
\newcommand\mm@warning[1]{
- \PackageWarningNoLine{mismath}{
- Command \bslash #1 already exist and will not be redefined}
+ \PackageWarningNoLine{mismath}{Command \bslash #1 already exist
+ \MessageBreak and will not be redefined}
}
\newcommand\mm@macro[2]{
\@ifundefined{#1}{
@@ -1336,7 +1402,7 @@
% \begin{macrocode}
\@ifundefined{mathup}{
\providecommand*{\mathup}[1]{{\operatorfont #1}}
- }{\mm@warning{mathup} } % also in kpfonts (and unicode-math)
+ }{\mm@warning{mathup} } % also in kpfonts and unicode-math
\mm@macro{e}{\mathup{e}}
\AtBeginDocument{\let\oldi\i \let\oldj\j
\renewcommand{\i}{\TextOrMath{\oldi}{\mathup{i}}}
@@ -1443,11 +1509,8 @@
% and may not have a straightforward solution.
%
% \medskip
-% In addition to |\MathUp| and |\MathIt|, we also offer the following two commands
-% to set a group of letters in roman typeface: one for for mathematical constants,
-% among `e, i, j', and the other for probability operators, among or `P, E, V'.
-%
-% \medskip
+% In addition to |\MathUp| and |\MathIt|, we also offer the following command
+% to set a group of letters, among `e, i, j', in roman typeface.
% \begin{macrocode}
\newcommand*\MathNumbers[1]{%
\in@{e}{#1} \ifin@ \MathUp{e} \fi
@@ -1455,12 +1518,6 @@
\in@{j}{#1} \ifin@ \MathUp{j} \fi
}
-\newcommand*\MathProba[1]{%
- \in@{P}{#1} \ifin@ \MathUp{P} \fi
- \in@{E}{#1} \ifin@ \MathUp{E} \fi
- \in@{V}{#1} \ifin@ \MathUp{V} \fi
-}
-
% \end{macrocode}
% \DescribeMacro{\apply}
% With the inverse switch |\MathNormal|, you can apply the normal (italic) style
@@ -1471,7 +1528,7 @@
% I discovered this powerfull macro on \texttt{iterate190.rssing.com} by searching for
% ``TeX How to iterate over a comma separated list''.
% The answer was posted under the pseudonym `wipet' on 2021/02/26.
-% Let its author, Petr Ol\v sák, be thanked.
+% Let its author, Petr Ol\v{s}ák, be thanked.
% This macro allows to accomplish tasks that
% usual loop instructions like |\@for| or |\foreach| cannot achieve due to
% errors like ``!~Improper alphabetic constant''.
@@ -1496,44 +1553,24 @@
% They were intended to set some letters in upright shape
% in math mode, but only worked in the preamble.
% This is now managed by the more powerful |\MathUp| command, and
-% the old commands are maintained for compatibility reasons.
+% the old commands are maintained but as alias for |\MathUp|.
% \medskip
%
% \begin{macrocode}
-\newcommand{\enumber}{%
- \PackageWarning{mismath}{Old command \string\enumber\space
- is used. \MessageBreak
- It can be replaced by \string\MathUp{e}}
- \MathUp{e}
-}
-\newcommand{\inumber}{%
- \PackageWarning{mismath}{Old command \string\inumber\space
- is used. \MessageBreak
- It can be replaced by \string\MathUp{i}}
- \MathUp{i}
-}
-\newcommand{\jnumber}{
- \PackageWarning{mismath}{Old command \string\jnumber\space
- is used. \MessageBreak
- It can be replaced by \string\MathUp{j}}
- \MathUp{j}
-}
-\newcommand{\PEupright}{
- \PackageWarning{mismath}{Old command \string\PEupright\space
- is used. \MessageBreak
- It can be replaced by \string\MathProba{PE}}
- \MathUp{P}\MathUp{E}
-}
+\newcommand{\enumber}{\MathUp{e}}
+\newcommand{\inumber}{\MathUp{i}}
+\newcommand{\jnumber}{\MathUp{j}}
% \end{macrocode}
%
-% Obtaining an upright Greek letter $\otherpi$ must be handled differently.
+% Obtaining an upright Greek letter $\pi$ must be handled differently.
% The switches are called |\pinumber| and |\pinormal|
% and can be used anywhere in the document.
%
% But |\pinumber| must be called first in the preamble with an optional argument.
% This argument can be a valid command name that produces an upright pi letter
% (after having loading an appropriate package).
+% Compatibility with \textsf{unicode-math} is a bit tricky!
% When given without an argument in the preamble,
% |\pinumber| uses an LGR font encoding called \texttt{lmr}.
% A new feature (v2.11) is to use |\pinumber| with a keyval option to
@@ -1541,129 +1578,130 @@
% a whole package, thus without altering the other (italic) Greek letters.
% We achieve this with |\DeclareSymbolFont| and |\DeclareMathSymbol|.
% We just have to know the ``name'' of the desired symbol font.
-% Compatibility with \textsf{unicode-math} is a bit tricky!
%
% \medskip
% \begin{macrocode}
\newif\ifmm@lgr
-\define@cmdkey{pinumber}[mm@]{lgrmath}[lmr]{\mm@lgrtrue}
+\define@cmdkey{pifonts}[mm@]{lgrmath}[lmr]{\mm@lgrtrue}
\newif\ifmm@upgreek
-\define@choicekey{pinumber}{upgreek}[\mm@upgreek@option]%
- {Euler,Symbol,Symbolsmallscale}[Symbol]{\mm@upgreektrue}
+\define@choicekey{pifonts}{upgreek}[\mm@upgreek@option]%
+ {Euler,Symbol,Symbolsmallscale}[Symbol]{\mm@upgreektrue}
\newif\ifmm@mathdesign
-\define@choicekey{pinumber}{mathdesign}[\mm@mathdesign@option]%
- {Utopia,Garamond,Charter}[Charter]{\mm@mathdesigntrue}
+\define@choicekey{pifonts}{mathdesign}[\mm@mathdesign@option]%
+ {Utopia,Garamond,Charter}[Charter]{\mm@mathdesigntrue}
\newif\ifmm@kpfonts
-\define@choicekey{pinumber}{kpfonts}[\mm@kp@option]%
- {normal,light}[normal]{\mm@kpfontstrue}
-\define@boolkey{pinumber}[mm@]{fourier}[true]{}
-\define@boolkey{pinumber}[mm@]{pxfonts}[true]{}
-\define@boolkey{pinumber}[mm@]{txfonts}[true]{}
+\define@choicekey{pifonts}{kpfonts}[\mm@kp@option]%
+ {normal,light}[normal]{\mm@kpfontstrue}
+\define@boolkeys{pifonts}[mm@]{fourier,pxfonts,txfonts}[true]
+\newif\ifmm@fontspec
+\define@cmdkey{pifonts}[mm@]{fontspec}[GFS Didot]{\mm@fontspectrue}
-\newcommand*\pinumber[1][]{%
- \ifthenelse{\equal{#1}{}}{% no argument given
- \ifx\@onlypreamble\@notprerr % not in preamble
- \@ifundefined{savedpi}{
- \PackageWarning{mismath}{%
- \string\pinumber\space
- must be used in the preamble first}
- }{\let\pi\savedpi}
- \else % in the preamble
- \AtBeginDocument{\let\itpi\pi}% must be here with unicode-math
- \AtEndPreamble{\AtBeginDocument{
- %\let\itpi\pi
- \let\pi\relax
- \DeclareFontEncoding{LGR}{}{}
- \DeclareSymbolFont{mm@grup}{LGR}{lmr}{m}{n}
- \DeclareMathSymbol{\pi}\mathalpha{mm@grup}{"70}
- \let\savedpi\pi
- }}
- \fi
- }{% command name or keyval options, necessarily in the preamble
- \AtBeginDocument{\let\itpi\pi}% must be here with unicode-math
- \AtEndPreamble{\AtBeginDocument{
- \@ifundefined{#1}{%
- \setkeys{pinumber}{#1}
- \let\pi\relax
- \ifmm@lgr
- \DeclareFontEncoding{LGR}{}{}
- \DeclareSymbolFont{mm@grup}{LGR}{\mm@lgrmath}{m}{n}
- % may work with bold (b) instead of m
- \DeclareMathSymbol{\pi}{\mathalpha}{mm@grup}{112}
-
- \else\ifmm@upgreek
- \ifdefstring{\mm@upgreek@option}{Euler}{
+\newcommand*\pifonts[1]{%
+ \setkeys{pifonts}{#1}
+ \let\pi\relax
+
+ \ifmm@lgr
+ \DeclareFontEncoding{LGR}{}{}
+ \DeclareSymbolFont{mmupgr}{LGR}{\mm@lgrmath}{m}{n}
+ % may work with bold (b) instead of m
+ \DeclareMathSymbol{\pi}{\mathord}{mmupgr}{112}
+
+ \else\ifmm@fontspec
+ \@ifpackageloaded{fontspec}{}{
+ \PackageError{mismath}{\string\pinumber\space with
+ the `fontspec' option\MessageBreak
+ needs the fontspec package,\MessageBreak
+ which must be run with LuaLaTeX or XeLaTeX}{}
+ }
+ \newfontfamily\mismathgreekfont{\mm@fontspec}[NFSSFamily=mgr]
+ \DeclareSymbolFont{mmupgr}{TU}{mgr}{m}{n}
+ \Umathchardef\pi="7 \symmmupgr "03C0
+
+ \else\ifmm@upgreek
+ \ifdefstring{\mm@upgreek@option}{Euler}{
\DeclareFontFamily{U}{eur}{\skewchar\font'177}
\DeclareFontShape{U}{eur}{m}{n}{%
<-6> eurm5 <6-8> eurm7 <8-> eurm10}{}
- \DeclareFontShape{U}{eur}{b}{n}{%
- <-6> eurb5 <6-8> eurb7 <8-> eurb10}{}
- \DeclareSymbolFont{mm@grup}{U}{eur}{m}{n}
- \DeclareMathSymbol{\pi}{\mathord}{mm@grup}{"19} % 25
- }{
- \ifdefstring{\mm@upgreek@option}{Symbol}{
- \DeclareSymbolFont{mm@grup}{U}{psy}{m}{n}
- \DeclareMathSymbol{\pi}{\mathord}{mm@grup}{`p}
- }{
- \ifdefstring{\mm@upgreek@option}{Symbolsmallscale}{
+ \DeclareSymbolFont{mmupgr}{U}{eur}{m}{n}
+ \DeclareMathSymbol{\pi}{\mathord}{mmupgr}{"19}
+ }{
+ \ifdefstring{\mm@upgreek@option}{Symbol}{
+ \DeclareSymbolFont{mmupgr}{U}{psy}{m}{n}
+ \DeclareMathSymbol{\pi}{\mathord}{mmupgr}{`p}
+ }{
+ \ifdefstring{\mm@upgreek@option}{Symbolsmallscale}{
\DeclareFontFamily{U}{fsy}{}
\DeclareFontShape{U}{fsy}{m}{n}{<->s*[.9]psyr}{}
- \DeclareSymbolFont{mm@grup}{U}{fsy}{m}{n}
- \DeclareMathSymbol{\pi}{\mathord}{mm@grup}{`p}
- }{}}}
+ \DeclareSymbolFont{mmupgr}{U}{fsy}{m}{n}
+ \DeclareMathSymbol{\pi}{\mathord}{mmupgr}{`p}
+ }{}}}
- \else\ifmm@mathdesign
- \ifdefstring{\mm@mathdesign@option}{Utopia}{
- \DeclareSymbolFont{mm@grup}{OML}{mdput}{m}{n}
- }{
- \ifdefstring{\mm@mathdesign@option}{Garamond}{
- \DeclareSymbolFont{mm@grup}{OML}{mdugm}{m}{n}
- }{
- \ifdefstring{\mm@mathdesign@option}{Charter}{
- \DeclareSymbolFont{mm@grup}{OML}{mdbch}{m}{n}
- }{}}}
+ \else\ifmm@mathdesign
+ \ifdefstring{\mm@mathdesign@option}{Utopia}{
+ \DeclareSymbolFont{mmupgr}{OML}{mdput}{m}{n}
+ }{
+ \ifdefstring{\mm@mathdesign@option}{Garamond}{
+ \DeclareSymbolFont{mmupgr}{OML}{mdugm}{m}{n}
+ }{
+ \ifdefstring{\mm@mathdesign@option}{Charter}{
+ \DeclareSymbolFont{mmupgr}{OML}{mdbch}{m}{n}
+ }{}}}
- \else\ifmm@fourier
- \DeclareFontEncoding{FML}{}{}
- \DeclareSymbolFont{mm@grup}{FML}{futm}{m}{it}
-
- \else\ifmm@kpfonts
- \ifdefstring{\mm@kp@option}{normal}{
- \DeclareSymbolFont{mm@grup}{U}{jkpmia}{m}{it}
- }{
- \ifdefstring{\mm@kp@option}{light}{
- \DeclareSymbolFont{mm@grup}{U}{jkplmia}{m}{it}
- }}
-
- \else\ifmm@pxfonts
- \DeclareSymbolFont{mm@grup}{U}{pxmia}{m}{it}
-
- \else\ifmm@txfonts
- \DeclareSymbolFont{mm@grup}{U}{txmia}{m}{it}
- \fi\fi\fi\fi\fi
-
- \DeclareMathSymbol{\pi}{\mathord}{mm@grup}{"19}
- \fi\fi
-
- \let\savedpi\pi
+ \else\ifmm@fourier
+ \DeclareFontEncoding{FML}{}{}
+ \DeclareSymbolFont{mmupgr}{FML}{futm}{m}{it}
+
+ \else\ifmm@kpfonts
+ \ifdefstring{\mm@kp@option}{normal}{
+ \DeclareSymbolFont{mmupgr}{U}{jkpmia}{m}{it}
}{
- \ifmm@unicodemath
- \ifthenelse{\equal{#1}{uppi}}{
- \AtBeginDocument{%
- \let\pi\relax
- \def\pi{\symup{\symbol{"003C0}}}
- \let\itpi\relax
- \def\itpi{\symit{\symbol{"003C0}}} % or "1D70B
- }
- }{\renewcommand{\pi}{\csname #1\endcsname}}
- \else
- \renewcommand{\pi}{\csname #1\endcsname}
- \fi
-
- \let\savedpi\pi
- }
- }}
- }
+ \ifdefstring{\mm@kp@option}{light}{
+ \DeclareSymbolFont{mmupgr}{U}{jkplmia}{m}{it}
+ }{}}
+
+ \else\ifmm@pxfonts
+ \DeclareSymbolFont{mmupgr}{U}{pxmia}{m}{it}
+
+ \else\ifmm@txfonts
+ \DeclareSymbolFont{mmupgr}{U}{txmia}{m}{it}
+
+ \fi\fi\fi\fi\fi
+ \DeclareMathSymbol{\pi}{\mathord}{mmupgr}{"19}
+ \fi\fi\fi
+}
+
+\newcommand*\pinumber[1][]{%
+ \ifthenelse{\equal{#1}{}}{% no argument given
+ \ifx\@onlypreamble\@notprerr % not in preamble
+ \@ifundefined{savedpi}{
+ \PackageWarning{mismath}{%
+ \string\pinumber\space
+ must be used in the preamble first}
+ }{\let\pi\savedpi}
+ \else % in the preamble
+ \AtBeginDocument{
+ \let\itpi\pi
+ \pifonts{lgrmath}
+ \let\savedpi\pi
+ }
+ \fi
+ }{% command name or keyval options, necessarily in the preamble
+ \AtBeginDocument{% must be here with unicode-math
+ \let\itpi\pi
+ \@ifundefined{#1}{%
+ \pifonts{#1}
+ }{
+ \ifmm@unicodemath
+ \ifthenelse{\equal{#1}{uppi}}{% or "1D70B
+ \renewcommand\pi{\symup{\symbol{"03C0}}}
+ \renewcommand\itpi{\symit{\symbol{"03C0}}}
+ }{\renewcommand{\pi}{\csname #1\endcsname}}
+ \else
+ \renewcommand{\pi}{\csname #1\endcsname}
+ \fi
+ }
+ \let\savedpi\pi}
+ }
}
\newcommand{\pinormal}{%
@@ -1683,8 +1721,29 @@
}
% \end{macrocode}
+% When |\pinumber|\oarg{keyval} has been called, you can also get
+% some other mathematical constants using Greek letters,
+% \eg $\othergamma$, the Euler-Mascheroni constant:
+% \begin{verbatim}
+% \let\gamma\relax
+% \DeclareMathSymbol{\gamma}{\mathord}{mmupgr}{"0D}
+% \end{verbatim}
+% \vspace{-2ex}
+% If \textsf{unicode-math} is used, you must put these commands in
+% |\AtBeginDocument|.
+% The hexadecimal code |"0D| depends on the option passed to |\pinumber|
+% in the preamble (see the command |\pifonts| above and search in package docs). \\
+% And to get the golden ratio $\othervarphi$:
+% \begin{verbatim}
+% \let\phi\relax
+% \DeclareMathSymbol{\varphi}{\mathord}{mmupgr}{"27}
+% \end{verbatim}
+% \vspace{-2ex}
+% To preserve the original $\gamma$ or $\varphi$,
+% you can define |\upgamma| or |\upvarphi| instead.
%
-% And now the commands for vectors (and tensors).
+% \medskip
+% And now the commands for vectors and tensors.
% \medskip
% \begin{macrocode}
\newboolean{arrowvect}
@@ -1693,9 +1752,9 @@
\newcommand{\boldvect}{\setboolean{arrowvect}{false}}
\newcommand{\boldvectcommand}{\boldsymbol} % from amsbsy package
\mm@macro{vect}{\ifthenelse{\boolean{arrowvect}}{
- \vv}{\boldvectcommand}} % doesn't work well with \if... \fi
-\newcommand*{\hvect}[1]{\vect{\vphantom{t}#1}}
-\newcommand*{\hvec}[1]{\vec{\vphantom{t}#1}}
+ \vv}{\boldvectcommand}} % doesn't work well with \if... \fi
+\newcommand*{\hvect}[1]{\vect{\vphantom{A}#1}}
+\newcommand*{\hvec}[1]{\vec{\vphantom{A}#1}}
\newcommand*{\@norm}[1]{
\mbox{\raisebox{1.75pt}{\small$\bigl\Vert$}} #1
@@ -1715,9 +1774,7 @@
\newcommand{\tensor}{\mathbfsfit} % isomath uses \mathsfbfit
% \end{macrocode}
-%
-% Classic identifiers are presented below.
-% \medskip
+
% \begin{macrocode}
\mm@macro{di}{\mathop{}\!\mathup{d}}
\newcommand\probastyle{}
@@ -1726,62 +1783,121 @@
\mm@macro{E}{\operatorname{\probastyle{E}}}
\mm@macro{V}{\operatorname{\probastyle{V}}}
-\mm@operator{\adj}{adj}
-\mm@operator{\Aut}{Aut}
-\mm@operator{\codim}{codim}
-\mm@operator{\Conv}{Conv}
-\mm@operator{\cov}{cov}
-\mm@operator{\Cov}{Cov}
-\mm@macro{curl}{\operatorname{\vect{\mathup{curl}}}}
-\mm@operator[divg]{\divg}{div}
-\mm@operator{\End}{End}
+\newcommand*\MathProba[1]{%
+ \in@{P}{#1} \ifin@ \MathUp{P} \fi
+ \in@{E}{#1} \ifin@ \MathUp{E} \fi
+ \in@{V}{#1} \ifin@ \MathUp{V} \fi
+}
-\mm@operator{\erf}{erf}
-\mm@macro{grad}{\operatorname{\vect{\mathup{grad}}}}
-\mm@operator{\id}{id} % mathop or mathord?
-\mm@operator{\Id}{Id}
-\mm@operator{\im}{im}
-\let\oldIm\Im \renewcommand{\Im}{\operatorname{Im}}
-\mm@operator{\lb}{lb}
-\mm@operator{\lcm}{lcm}
+% \end{macrocode}
+% Classic identifiers are presented below. They will be defined only
+% if the option \texttt{nofunction} has not been activated.
+% \medskip
+% \begin{macrocode}
+\ifmm@nofunction\else
+ \mm@operator{\adj}{adj}
+ \mm@operator{\Aut}{Aut}
+ \mm@operator{\codim}{codim}
+ \mm@operator{\coker}{coker}
+ \mm@operator{\Conv}{Conv}
+ \mm@operator{\cov}{cov}
+ \mm@operator{\Cov}{Cov}
+ \mm@macro{curl}{\operatorname{\vect{\mathup{curl}}}}
+ \mm@operator[divg]{\divg}{div}
+
+ \mm@operator{\End}{End}
+ \mm@operator{\erf}{erf}
+ \mm@macro{grad}{\operatorname{\vect{\mathup{grad}}}}
+ \mm@operator{\id}{id} % mathop or mathord?
+ \mm@operator{\Id}{Id}
+ \mm@operator{\im}{im}
+ \mm@operator{\lb}{lb}
+ \mm@operator{\lcm}{lcm}
+ \mm@operator{\rank}{rank}
+
+ \mm@operator{\Res}{Res}
+ \mm@macro{rot}{\operatorname{\vect{\mathup{rot}}}}
+ \mm@operator{\sgn}{sgn}
+ \mm@operator{\sinc}{sinc}
+ \mm@operator[spa]{\spa}{span}
+ \mm@operator{\tr}{tr}
+ \mm@operator{\var}{var}
+ \mm@operator{\Var}{Var}
+ \mm@operator[Zu]{\Zu}{Z}
+
+ \mm@operator{\arccot}{arccot}
+ \mm@operator{\sech}{sech}
+ \mm@operator{\csch}{csch}
+ \mm@operator{\arsinh}{arsinh}
+ \mm@operator{\arcosh}{arcosh}
+ \mm@operator{\artanh}{artanh}
+ \mm@operator{\arcoth}{arcoth}
+ \mm@operator{\arsech}{arsech}
+ \mm@operator{\arcsch}{arcsch}
+\fi
-\mm@operator{\rank}{rank}
-\let\oldRe\Re \renewcommand{\Re}{\operatorname{Re}}
-\mm@macro{rot}{\operatorname{\vect{\mathup{rot}}}}
-\mm@operator{\sgn}{sgn}
-\mm@operator{\sinc}{sinc}
-\mm@operator[spa]{\spa}{span}
-\mm@operator{\tr}{tr}
-\mm@operator{\var}{var}
-\mm@operator{\Var}{Var}
-\mm@operator[Zu]{\Zu}{Z}
+% \end{macrocode}
+%
+% The |\mathcal| alphabet, from the original Computer Modern font family,
+% is used here to produce $\Re$, $\Im$ and $\bigO$.
+% Several font packages redefines this alphabet producing glyphs that may seem less
+% suitable for the commands below.
+% We have therefore retained the original |\cmmathcal| math alphabet,
+% which can be used for other letters.
+% If \textsf{unicode-math} is called, it will redefine the commands |\Re| and |\Im|
+% in |\AtBeginDocument|, hence the use of `|\AtEndPreamble{\AtBeginDocument{|'
+% to ensure that the \textsf{mismath} redefinition occur after the actions
+% of \textsf{unicode-math}.
+%
+% \begin{macrocode}
+\DeclareFontFamily{U}{cmsy}{\skewchar\font48 }
+\DeclareFontShape{U}{cmsy}{m}{n}{% from mathalpha
+ <-5.5> cmsy5%
+ <5.5-6.5> cmsy6%
+ <6.5-7.5> cmsy7%
+ <7.5-8.5> cmsy8%
+ <8.5-9.5> cmsy9%
+ <9.5-> cmsy10}{}
+\DeclareMathAlphabet{\cmmathcal}{U}{cmsy}{m}{n}
-\mm@operator{\arccot}{arccot}
-\mm@operator{\sech}{sech}
-\mm@operator{\csch}{csch}
-\mm@operator{\arsinh}{arsinh}
-\mm@operator{\arcosh}{arcosh}
-\mm@operator{\artanh}{artanh}
-\mm@operator{\arcoth}{arcoth}
-\mm@operator{\arsech}{arsech}
-\mm@operator{\arcsch}{arcsch}
+\AtEndPreamble{\AtBeginDocument{
+ \ifmm@classicReIm\else
+ \let\oldRe\Re
+ \let\oldIm\Im
+ \ifmm@otherReIm
+ \renewcommand{\Re}{\cmmathcal{R}\mathit{e}}
+ \renewcommand{\Im}{\cmmathcal{I}\mathit{m}}
+ \else
+ \renewcommand{\Re}{\operatorname{Re}}
+ \renewcommand{\Im}{\operatorname{Im}}
+ \fi\fi
+}}
-\mm@operator[bigO]{\bigO}{\mathcal{O}}
+\mm@operator[bigO]{\bigO}{\cmmathcal{O}}
\mm@operator[bigo]{\bigo}{O}
\mm@operator[lito]{\lito}{o}
% \end{macrocode}
% And finally we present the remaining macros.
%
-% With Cyrillic languages, the command |\C| may already be defined (only for text mode).
-% Thus, it will not be redefined by \textsf{mismath}. However, one may still want
-% to use our |\C| macro only for math mode without interfering the definition of
-% the text |\C|, therefore the |\onlymathC| macro.
+% With Cyrillic languages, the command |\C| may already be defined but only for text mode.
+% Thus, it will not be redefined by \textsf{mismath}. However, when activating
+% |\onlymathC|, you can to use our |\C| macro only for math mode,
+% without interfering the definition of the text |\C| that is already defined.
+%
+% When using \XeTeX\ or \LuaTeX\ engines with the \textsf{hyperref} package,
+% |\C| will be already defined and
+% you get the message "\texttt{Command \string\C\space unavailable in encoding TU}".
+% Therefore |\onlymathC| is automatically called in that case.
% \medskip
% \begin{macrocode}
\mm@macro{mathset}{\mathbf}
\mm@macro{R}{\mathset{R}}
-\mm@macro{C}{\mathset{C}}
+\AtBeginDocument{
+ \@ifpackageloaded{hyperref}%
+ {\iftutex\onlymathC\fi}% LuaTex or XeTeX engines
+ {\mm@macro{C}{\mathset{C}}}
+}
\providecommand\onlymathC{\let\oldC\C
\renewcommand{\C}{\TextOrMath{\oldC}{\mathset{C}}} }
\mm@macro{N}{\mathset{N}}
@@ -1799,7 +1915,7 @@
\mm@macro{lbar}{\overline}
\@ifundefined{hlbar}{
- \providecommand*{\hlbar}[1]{\overline{\vphantom{t}#1}}}{
+ \providecommand*{\hlbar}[1]{\overline{\vphantom{A}#1}}}{
\mm@warning{hlbar} }
\newcommand\@eqdef{\stackrel{\mathup{def}}{=}}
\newcommand\@@eqdef{\stackrel{\mathrm{\Delta}}{=}}
@@ -1827,7 +1943,8 @@
\providecommand*{\abs}[1]{\left\vert#1\right\vert} }{
\mm@warning{abs} }
\@ifundefined{lfrac}{
- \providecommand*{\lfrac}[2]{\frac{\;#1\;}{\;#2\;}} }{
+ \providecommand*{\lfrac}[3][7mu]{%
+ \frac{\mkern#1#2\mkern#1}{\mkern#1#3\mkern#1}} }{
\mm@warning{lfrac} }
\newcommand{\systemstretch}{1.2}
@@ -1850,8 +1967,8 @@
\begin{math}\begin{aligned}\displaystyle
\else
\PackageError{mismath}{The mathcols environment
- needs the multicol package}{Add the package multicol
- to your preamble.}
+ needs the multicol package}{Call the package multicol
+ in your preamble.}
\fi
}{%
\end{aligned}\end{math} \hfill\mbox{}
@@ -1864,7 +1981,7 @@
}
% \end{macrocode}
%
-% \begin{thebibliography}{28}
+% \begin{thebibliography}{34}
% \begin{raggedright}
% \bibitem{TYPMA} \emph{Typesetting mathematics for science and technology according
% to ISO 31/XI}, Claudio Beccari, TUGboat Volume 18 (1997), No.~1.
@@ -1880,31 +1997,43 @@
% \url{https://old.iupac.org/standing/idcns/italic-roman_dec99.pdf}.
% \bibitem{VECT} \emph{\textsf{esvect} -- Typesetting vectors with beautiful
% arrow with \LaTeXe}, Eddie Saudrais, CTAN, v1.3 2013/07/11.
+% \bibitem{TOOL} \emph{The \textsf{mathtools} package}, Morten Høgholm, Lars Madsen, CTAN,
+% v1.29 2022/06/29.
% \bibitem{AMS} \emph{\textsf{amsmath} -- \AmS\ mathmatical facilities for \LaTeX},
% Frank Mittelbach, Rainer Schöpf, Michael Downes, Davis M.~Jones, David Carlisle,
% CTAN, v2.17n 2022/04/08.
% \bibitem{UNIC} \emph{Experimental Unicode mathematical typesetting:
% The \textsf{unicode-math} package}, Will Robertson, Philipp Stephani, Joseph Wright,
% Khaled Hosny, and others, CTAN, v0.8r 2023/08/13.
-% \bibitem{TOOL} \emph{The \textsf{mathtools} package}, Morten Høgholm, Lars Madsen, CTAN,
-% v1.29 2022/06/29.
% \bibitem{FIXM} \emph{The \textsf{fixmath} package for \LaTeXe}, Walter Schmidt,
% CTAN, v0.9 2000/04/11.
% \bibitem{ISOM} \emph{\textsf{isomath} -- Mathematical style for science and technology},
% Günter Milde, CTAN, v0.6.1 2012/09/04.
% \bibitem{PMISO} \emph{\textsf{PM-ISOmath}, The Poor Man ISO math bundle},
% the \textsf{pm-isomath} package by Claudio Beccari, CTAN, v1.2.00 2021/08/04.
+% \bibitem{MGREEK} \emph{The \textsf{mathgreeks} package}, Antoine Missier, CTAN,
+% v1.1 2024/05/04.
% \bibitem{GREEK} \emph{The \textsf{upgreek} package for \LaTeXe}, Walter Schmidt,
% CTAN, v2.0 2003/02/12.
% \bibitem{DESIGN} \emph{The \textsf{mathdesign} package},
% Paul Pichaureau, CTAN, v2.31 2013/08/29.
-% \bibitem{ALPHA} \emph{The \textsf{textalpha} package}
-% (part of the \textsf{greek-fontenc} bundle), Günter Milde, CTAN, v2.1 14/06/2022.
% \bibitem{KPF} \emph{\textsf{Kp-Fonts} -- The Johannes Kepler project},
% Christophe Caignaert, CTAN, v3.34 20/09/2022.
% \bibitem{FOUR} \textsf{Fourier-GUT\hspace{-0.1em}\emph{enberg}},
-% Michel Bovani, CTAN, v1.3 30/01/2005.
+% Michel Bovani, CTAN, v1.3 2005/01/30.
+% \bibitem{PX} \emph{\textsf{PX Fonts} -- Palatino-like fonts in support of mathematics},
+% Young Ryu, CTAN, 2000/12/14.
+% \bibitem{TX} \emph{\textsf{TX Fonts} -- Times-like fonts in support of mathematics},
+% Young Ryu, CTAN, 2000/12/15.
+% \bibitem{LIB} \emph{The LibertinusT1 Math Package}, Michael Sharpe, CTAN, v2.0.4 2024/01/14.
% \bibitem{LGR} \emph{The \textsf{lgrmath} package}, Jean-François B., CTAN, v1.0 2022/11/16.
+% \bibitem{NTX} \emph{New TX font package}, Micahel Sharpe, CTAN, v1.735 2024/03/01.
+% \bibitem{ALPHA} \emph{The \textsf{textalpha} package}
+% (part of the \textsf{greek-fontenc} bundle), Günter Milde, CTAN, v2.1 2022/06/14.
+% \bibitem{SPA} \emph{The \textsf{spacingtricks} package}, Antoine Missier, CTAN,
+% v1.8 2023/12/06.
+% \bibitem{BRACKET} \emph{Intelligent brackets -- The \textsf{ibrackets} package},
+% Antoine Missier, CTAN, v1.2, 2023/07/26.
% \bibitem{INT} \emph{The \textsf{interval} package}, Lars Madsen, CTAN,
% v0.4 2019/03/06.
% \bibitem{ICOMMA} \emph{The \textsf{icomma} package for \LaTeXe},
@@ -1918,9 +2047,7 @@
% \bibitem{SPAL} \emph{The \textsf{spalign} package}, Joseph Rabinoff, CTAN, 2016/10/05.
% \bibitem{NMATX} \emph{The package \textsf{nicematrix}}, François Pantigny, CTAN,
% v6.14 2023/02/18.
-% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}, Antoine Missier, CTAN, v2.10 2024/02/25.
-% \bibitem{BRACKET} \emph{Intelligent brackets -- The \textsf{ibrackets} package},
-% Antoine Missier, CTAN, v1.2, 2023/07/26.
+% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}, Antoine Missier, CTAN, v3.0 2024/05/04.
% \bibitem{LSHORT} \emph{The Not So Short Introduction to \LaTeXe},
% the \textsf{lshort} package by
% Tobias Oetiker, Hubert Partl, Irene Hyna and Elisabeth Schlegl, CTAN, v6.4 2021/04/09.
diff --git a/macros/latex/contrib/mismath/mismath.ins b/macros/latex/contrib/mismath/mismath.ins
index b57ee6b828..5a39f8da29 100644
--- a/macros/latex/contrib/mismath/mismath.ins
+++ b/macros/latex/contrib/mismath/mismath.ins
@@ -46,7 +46,7 @@ and version 1.3 or later is part of all distributions of LaTeX version
\Msg{* mismath.sty *}
\Msg{* *}
\Msg{* To produce the documentation run the file mismath.dtx *}
-\Msg{* through XeLaTeX or LuaLaTeX. *}
+\Msg{* through LaTeX. *}
\Msg{* *}
\Msg{* Happy TeXing! *}
\Msg{* *}
diff --git a/macros/latex/contrib/mismath/mismath.pdf b/macros/latex/contrib/mismath/mismath.pdf
index 5b97173faa..fd41e6702c 100644
--- a/macros/latex/contrib/mismath/mismath.pdf
+++ b/macros/latex/contrib/mismath/mismath.pdf
Binary files differ
diff --git a/macros/latex/contrib/msu-thesis/README.md b/macros/latex/contrib/msu-thesis/README.md
index 31d83c056a..8e706e6de9 100644
--- a/macros/latex/contrib/msu-thesis/README.md
+++ b/macros/latex/contrib/msu-thesis/README.md
@@ -1,4 +1,4 @@
-# MSU Thesis Class Version 4.2 2024/02/18
+# MSU Thesis Class Version 4.2b 2024/05/16
Copyright 2011-2024 by Alan Munn <amunn@msu.edu>
@@ -9,6 +9,13 @@ Submission of Master's Theses and Dissertations (January 2023).
The class is based on the `memoir` document class, and therefore inherits
all of the functionality of that class.
+# TeX distribution requirements
+
+The `msu-thesis` class requires an up-to-date TeX distribution, 2022 release or later.
+
+# Engine requirements
+
+The `msu-thesis` class works with all LaTeX engines (pdfLaTeX, XeLaTeX, LuaLaTeX).
# Update on new formatting requirements (Fall 2022)
@@ -30,7 +37,7 @@ Please [read the documentation!](https://amunn.github.io/msu-thesis/)
## Installation:
-The `msu-thesis` class is part of both TeXLive and MikTeX, so you should either already have it or should be able to install it with your package manager.
+The `msu-thesis` class is part of both TeXLive and MikTeX, so you should either already have it or should be able to install it with your package manager if you have an up-to-date distribution.
If you wish to install it locally, follow the directions below:
@@ -42,9 +49,16 @@ Put `msu-thesis.tex`, `msu-thesis.pdf` and the `samples` folder into
`<local texmf>/doc/latex/msu-thesis`
+Alternatively, you can simply put a copy of `msu-thesis.cls` in the same folder as your thesis source file.
+
The samples folder contains two thesis test-files and
a template.
+## Overleaf users
+
+If you are using Overleaf, you should upload a copy of `msu-thesis.cls` to your project. It *must* have exactly this name to be found. Click on the Menu icon and make sure to choose the latest version of TeX Live for compilation.
+
+
This package 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
diff --git a/macros/latex/contrib/msu-thesis/docs/msu-thesis.tex b/macros/latex/contrib/msu-thesis/docs/msu-thesis.tex
index 01ca59e7ad..7ea3b12edf 100644
--- a/macros/latex/contrib/msu-thesis/docs/msu-thesis.tex
+++ b/macros/latex/contrib/msu-thesis/docs/msu-thesis.tex
@@ -2,8 +2,8 @@
\documentclass[11pt]{article}
-\def\msuversion{4.2}
-\def\msudate{2024/02/18}
+\def\msuversion{4.2b}
+\def\msudate{2024/05/16}
\title{\textbf{Using the MSU Thesis Class}}
\author{\textbf{Alan Munn}\\Department of Linguistics, Languages, and Cultures\\Michigan State University\\\texttt{\href{mailto:amunn@msu.edu}{amunn@msu.edu}}}
\date{Version \msuversion\\\msudate}
@@ -59,8 +59,12 @@
\abstract{\noindent\begin{quote} This is a class file for MSU theses and dissertations. It is based on the \pkg{memoir}\ class, and therefore supports all of the functionality of that class. It should generate a document which meets all the basic formatting requirements laid out by the \href{https://grad.msu.edu/etd/formatting-guide}{Formatting Guide For Submission of Master’s Theses and Doctoral Dissertations}\ (January, 2023) produced by the Graduate School, including requirements for margins, titlepage, page numbering, section titles, sub- and superscript sizes etc.\end{quote}}
\section{Introduction}
Formatting a dissertation according to a University's thesis requirements is not always a simple task in \LaTeX, especially since the requirements are generally aimed at MSWord users. Furthermore, most of the work of formatting a document is supposed to be done by the document class itself, and not by the individual user. Fortunately, Michigan State University's thesis requirements are for the most part sane, (even if the thesis office itself isn’t) and fairly straightforward. The present class file is designed to further make the process easier for \LaTeX\ users, by doing all the heavy lifting for you, so that you can focus on the content and not the formatting.
-\section{Background}
+\section{Background and requirements}
The MSU Thesis Class is based on the \pkg{memoir}\ document class. The \pkg{memoir}\ class is an extensive class that incorporates the functionality of many other packages into it. The class is extensively documented, and the documentation (\pkg{memman.pdf}) should be available with any \TeX\ distribution. I strongly recommend that you familiarize yourself with \pkg{memoir}\ as you use the present class.
+\subsection{TeX distribution requirements}
+The \pkg{msu-thesis}\ class requires a reasonably up-to-date TeX distribution, 2022 or later.
+\subsection{Engine requirements}
+The class may be used with any LaTeX engine: pdfLaTeX, XeLaTeX, or LuaLaTeX.
\section{Class Options}
In addition to any options passed to the \pkg{memoir}\ class (e.g. |oldfontcommands|; see Section \ref{sec:fonts}, font size), the \pkg{msu-thesis}\ class takes six options: one to specify the type of degree, (see Table~\ref{degrees}), one to enable landscape page numbering, two to enable per-chapter bibliographies and appendices, two to make small adjustments to Table of Contents. If no degree option is specified, a Ph.D. dissertation is assumed.
\begin{table}[htpb]
@@ -189,16 +193,25 @@ The \pkg{memoir}\ class provides commands for single and double spacing (|\Singl
The \pkg{memoir}\ class replicates the functionality of many independent packages, so if you are transferring \LaTeX\ source from other documents using the \pkg{article}\ class, you may encounter some warnings or errors. The \pkg{memoir}\ documentation has substantial information about the packages it emulates, and the packages for which it provides equivalent functionality. See Chap. 18 Sec. 24 of the \pkg{memoir}\ manual for details. Quoting from the manual:
\begin{quote} At the time of writing the emulated packages are: {\sffamily abstract, appendix, booktabs, ccaption, chngcntr, crop, enumerate, epigraph, ifmtarg, ifpdf, index, makeidx, moreverb, needspace, newfile, nextpage, pagenote, patchcmd, parskip, setspace, shortvrb, showidx, titleref, tocbibind, tocloft, verbatim, and verse.} As well as the emulated packages memoir provides functions equivalent to those in the following packages, although the class does not prevent you from using them: {\sffamily fancyhdr, framed, geometry, sidecap, subfigure, and titlesec.}\\\hfill{\normalfont\emph{The Memoir Class} 10th impression, 2015, p.345}
\end{quote}
-\subsection{Captions}
-\subsubsection{Caption delimiter}\label{captiondelim}
-Because the thesis office doesn't understand anything about punctuation, it requires the colon that would appear in a caption to also appear in the contents lists. Since they don't care about the colon itself, but just consistency I've removed colons from the captions entirely, since leaving it in makes the contents lists look really stupid. But in case you or your advisor want the colon in captions, you can add the colon back in by adding |\renewcommand{\msucaptiondelim}{:\space}| to your preamble, and the class will make sure the Lists of Tables and Figures match in formatting. If you have other floating objects with captions (e.g., algorithms, listings) you may need to change their delimiter too (see below). How you do this may depend on the particular packages you are using.
-
+\subsection{Table of Contents issues}
\subsubsection{Simplified vs. full contents}
The thesis guide suggests that you use a simplified table of contents that lists only chapter levels, but that you are welcome to use a more detailed table of contents if you wish. As with most, if not all of the “design” decisions made by the thesis office, this one makes very little typographic sense, and so I have left the default TOC level to be 1, i.e., chapters and sections will be listed in the TOC. If you wish to use the simplified contents format that just lists chapters, add the following to your preamble:
\begin{quote}
|\setcounter{msutocdepth}{0}|
\end{quote}
+\subsubsection{Ensuring the minimum number of leader dots}
+If your chapter titles are very long, they sometimes fail to put any leader dots before the page number in the Table of Contents. The thesis office requires a minimum of three dots of leaders for any TOC line. You can solve this problem by putting a line break into the TOC entry title. To do this, use the optional argument of the corresponding |\chapter| or |\section| etc. command. Note that the line break needs to be preceded by |\protect|.
+
+%\begin{quote}
+\begin{lstlisting}[frame=none,xleftmargin=2.5em]
+\chapter[Long chapter title that will\protect\\ break at this point]
+ {Long chapter title that will break at this point}
+\end{lstlisting}
+%\end{quote}
+\subsection{Captions}
+\subsubsection{Caption delimiter}\label{captiondelim}
+Because the thesis office doesn't understand anything about punctuation, it requires the colon that would appear in a caption to also appear in the contents lists. Since they don't care about the colon itself, but just consistency I've removed colons from the captions entirely, since leaving it in makes the contents lists look really stupid. But in case you or your advisor want the colon in captions, you can add the colon back in by adding |\renewcommand{\msucaptiondelim}{:\space}| to your preamble, and the class will make sure the Lists of Tables and Figures match in formatting. If you have other floating objects with captions (e.g., algorithms, listings) you may need to change their delimiter too (see below). How you do this may depend on the particular packages you are using.
\subsubsection{New lists and floats}
Note that the thesis office no longer seems to \emph{require} lists of anything other than the main table of contents. This is another odd decision on their part. If do include a List of Tables and List of Figures and need to add other lists, you can follow the directions here. Note that lists of algorithms require special treatment. See §\ref{algorithms}.
@@ -273,11 +286,13 @@ If you have changed the |\msucaptiondelimeter| to use a colon (see \ref{captiond
The first method removes the colon from the word Algorithm in the List of Algorithms:
\begin{quote}
+\begin{minipage}{\linewidth}
\begin{lstlisting}
% Use this code after loading any algorithm package and the float package
% This removes the colon after the word Algorithm in the List of Algorithms
\renewcommand*{\cftalgorithmaftersnum}{}
\end{lstlisting}
+\end{minipage}
\end{quote}
The second method adds a colon to the word Algorithm in the captions of the algorithms
@@ -394,6 +409,8 @@ Despite there being no explicit formatting requirements for Chapter headings (ot
\end{itemize}
\subsection{Master’s Theses}
Master’s theses are sometimes relatively short, and you may think that you can just have |\section| commands with no chapters. This will \emph{not} work. The class is designed to use chapters (and as far as I can tell, the Graduate School also expects chapters).
+\subsection{Overleaf users}
+If you're using Overleaf, it's usually best to upload a copy of the class to your project. Please remember that the file \emph{must} be called |msu-thesis.cls|. Naming it something different will cause it not to be found, and an older version will be loaded. Additionally, since Overleaf preserves the TeX Live year that you first opened the project, it's a good idea to change to the most recent TeX Live year that the site offers. You can do this by clicking on the Menu icon in the editor and then selecting the most recent TeX Live version.
\section{Bugs and redistribution}
\subsection{Current version}
@@ -444,11 +461,11 @@ to Wolfgang Sternefeld for supplying the \pkg{linguex}\ spacing fix code, Leo Li
landscape page numbering code, which greatly simplified my original version. Thanks to
Florent Chervet for early \pkg{hyperref} code (up until v.3.6), and Ulrike Fischer for the
current \pkg{hyperref} code. Thanks to David Carlisle for helping me understand a ridiculous spacing problem.
-Thanks also to the following students who have reported
+Thanks also to the following people who have reported
problems over the years: Irina Agafonova, Ali Al-jiboory, Abubakr Ayesh, Julian Blank,
Nathan Brugnone, Dmitriy Bryndin, Greg Christian, Kyle Crayne, Ciaron Hamilton, Matt Husband, Changkuk
Jung, Claire Kopenhafer, Adam Liter, Vanessa Maldonado, Andriana Manousidaki, Ben Miller, William Muir, Eureka
-Pai, Alicia Parrish, Neil ver Planck, Taha Posos, Nick Rekuski, Giacomo Romanini, William Sands, Adam
+Pai, Alicia Parrish, Victoria Parrish, Neil ver Planck, Taha Posos, Nick Rekuski, Giacomo Romanini, William Sands, Adam
Soliman, Mookyong Son, Erik Stitt, Fanurs C.E. Teh, Eremey Valetov, Matthew Vincent, Michael Wojcik, Stephen Yowono, Atacan Yücesoy, Ali
Zare, and Yisu Zhou. A special thank you to Non Thongprong who graciously provided a copy
of his entire thesis which allowed me to debug some especially subtle spacing
diff --git a/macros/latex/contrib/msu-thesis/msu-thesis.cls b/macros/latex/contrib/msu-thesis/msu-thesis.cls
index c73d4be4d0..f873f7a964 100644
--- a/macros/latex/contrib/msu-thesis/msu-thesis.cls
+++ b/macros/latex/contrib/msu-thesis/msu-thesis.cls
@@ -192,12 +192,26 @@
% Version 4.1h 2023/10/07 Changed option processing code
% Version 4.1i 2023/12/02 Fixed spurious blank page with biblatex bibliography
% Version 4.2 2024/02/18 Changed spacing for sections to address complaints about adjacent sectioning commands
+% Version 4.2b 2024/05/16 Added version check for l3kernel.
% Report bugs/problems/questions to <amunn@msu.edu>
%
-\def\msu@version{4.2}
-\def\msu@date{2024/02/18}
+\def\msu@version{4.2b}
+\def\msu@date{2024/05/16}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{msu-thesis}[\msu@date\space Michigan State University Thesis Class version \msu@version]
+\@ifundefined{ExplLoaderFileDate}
+ {\RequirePackage{expl3}}
+ {}
+\@ifl@t@r\ExplLoaderFileDate{2022-06-01}
+ {}
+ {%
+ \ClassError{msu-thesis}{Support package expl3 too old}
+ {%
+ You need to update your TeX distribution: 'l3kernel' of 2022-06-01 or later is required.\MessageBreak
+ Loading msu-thesis will abort!%
+ }%
+ \endinput
+ }%
\DeclareKeys[msu-thesis]
{
PhD.code = {\gdef\msu@degree{Doctor of Philosophy}},
diff --git a/macros/latex/contrib/msu-thesis/msu-thesis.pdf b/macros/latex/contrib/msu-thesis/msu-thesis.pdf
index 533ec424b9..89f49a4d54 100644
--- a/macros/latex/contrib/msu-thesis/msu-thesis.pdf
+++ b/macros/latex/contrib/msu-thesis/msu-thesis.pdf
Binary files differ
diff --git a/macros/latex/contrib/nmbib/Makefile b/macros/latex/contrib/nmbib/Makefile
index 4b59427e24..4f4135521a 100644
--- a/macros/latex/contrib/nmbib/Makefile
+++ b/macros/latex/contrib/nmbib/Makefile
@@ -7,7 +7,7 @@
#
PACKAGE=nmbib
-SAMPLES = nmsample.tex
+SAMPLES = nmbib-sample.tex
PERLSCRIPTS = nmbibtex.pl
@@ -62,9 +62,9 @@ distclean: veryclean
# Archive for the distribution. Includes typeset documentation
#
archive: all clean
- tar -czvf $(PACKAGE).tgz -C .. --exclude '*~' --exclude '*.tgz' --exclude CVS $(PACKAGE)
+ COPYFILE_DISABLE=1 tar -C .. -czvf ../$(PACKAGE).tgz --exclude '*~' --exclude '*.tgz' --exclude '*.zip' --exclude CVS --exclude '.git*' $(PACKAGE); mv ../$(PACKAGE).tgz .
zip: all clean
${MAKE} $(PACKAGE).sty
$(RM) *.log
- zip -r $(PACKAGE).zip * -x '*~' -x '*.tgz' -x '*.zip' -x CVS -x 'CVS/*' \ No newline at end of file
+ zip -r $(PACKAGE).zip * -x '*~' -x '*.tgz' -x '*.zip' -x CVS -x 'CVS/*'
diff --git a/macros/latex/contrib/nmbib/README b/macros/latex/contrib/nmbib/README
index 833fa7992e..00a3fe6b5d 100644
--- a/macros/latex/contrib/nmbib/README
+++ b/macros/latex/contrib/nmbib/README
@@ -9,4 +9,6 @@ provides other improvments.
Changes:
+ v1.05. nmsample is renamed to nmbib-sample to avoid TeXLive name clash
+
v1.04 An embarrassing typo corrected. \ No newline at end of file
diff --git a/macros/latex/contrib/nmbib/nmsample.pdf b/macros/latex/contrib/nmbib/nmbib-sample.pdf
index bfcf4824b5..cb3c42b895 100644
--- a/macros/latex/contrib/nmbib/nmsample.pdf
+++ b/macros/latex/contrib/nmbib/nmbib-sample.pdf
Binary files differ
diff --git a/macros/latex/contrib/nmbib/nmsample.tex b/macros/latex/contrib/nmbib/nmbib-sample.tex
index 56ff2a807a..56ff2a807a 100644
--- a/macros/latex/contrib/nmbib/nmsample.tex
+++ b/macros/latex/contrib/nmbib/nmbib-sample.tex
diff --git a/macros/latex/contrib/nmbib/nmbib.dtx b/macros/latex/contrib/nmbib/nmbib.dtx
index 24647ae06f..f84fc00877 100644
--- a/macros/latex/contrib/nmbib/nmbib.dtx
+++ b/macros/latex/contrib/nmbib/nmbib.dtx
@@ -1,7 +1,7 @@
% \iffalse
% $Id: nmbib.dtx,v 1.21 2015/07/27 20:22:45 boris Exp $
%
-%% Copyright 2015, Michael Cohen <mcohen@u-aizu.ac.jp>
+%% Copyright 2015-2024, Michael Cohen <mcohen@u-aizu.ac.jp>
%% and Boris Veytsman <borisv@lk.net>
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
@@ -59,7 +59,7 @@
% \changes{v1.00}{2014/01/23}{Preliminary release}
% \changes{v1.03}{2015/07/25}{Added day field in the chrono bst}
%
-% \title{New Multibibliography Package\thanks{\copyright 2015 Michael
+% \title{New Multibibliography Package\thanks{\copyright 2015--2024 Michael
% Cohen and Boris Veytsman}}
% \author{Boris Veytsman\thanks{borisv@lk.net}
% \and Michael Cohen\thanks{mcohen@u-aizu.ac.jp}}
diff --git a/macros/latex/contrib/nmbib/nmbib.pdf b/macros/latex/contrib/nmbib/nmbib.pdf
index ba4aeed009..2258288207 100644
--- a/macros/latex/contrib/nmbib/nmbib.pdf
+++ b/macros/latex/contrib/nmbib/nmbib.pdf
Binary files differ
diff --git a/macros/latex/contrib/nmbib/nmbibtex.1 b/macros/latex/contrib/nmbib/nmbibtex.1
index bb7bb38f4b..d96236dde8 100644
--- a/macros/latex/contrib/nmbib/nmbibtex.1
+++ b/macros/latex/contrib/nmbib/nmbibtex.1
@@ -1,4 +1,5 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07)
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -15,141 +16,71 @@
.ft R
.fi
..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. \*(C+ will
-.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
+. ds C`
+. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" If the F register is >0, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. de IX
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
+.rr rF
.\" ========================================================================
.\"
.IX Title "NMBIBTEX 1"
-.TH NMBIBTEX 1 "2015-04-25" "perl v5.10.1" "User Contributed Perl Documentation"
+.TH NMBIBTEX 1 2015-04-26 "perl v5.38.2" "User Contributed Perl Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
-.SH "NAME"
+.SH NAME
nmbibtex \- a program to compile bibliographies for the package nmbib
-.SH "SYNOPSIS"
+.SH SYNOPSIS
.IX Header "SYNOPSIS"
-nmbibtex \fI\s-1OPTIONS\s0\fR \fI\s-1FILE\s0\fR
-.SH "DESCRIPTION"
+nmbibtex \fIOPTIONS\fR \fIFILE\fR
+.SH DESCRIPTION
.IX Header "DESCRIPTION"
-nmbibtex calls \fIbibtex\fR\|(1) for all aux files produced by the package
+nmbibtex calls \fBbibtex\fR\|(1) for all aux files produced by the package
nmbib
-.SH "OPTIONS"
+.SH OPTIONS
.IX Header "OPTIONS"
-.IP "\fB\-h\fR" 4
+.IP \fB\-h\fR 4
.IX Item "-h"
Print the help information and exit
.IP "\fB\-min\-crossrefs\fR \fInumber\fR" 4
.IX Item "-min-crossrefs number"
-Send the option \f(CW\*(C`\-min\-crossref=NUMBER\*(C'\fR to \fIbibtex\fR\|(1)
-.IP "\fB\-terse\fR" 4
+Send the option \f(CW\*(C`\-min\-crossref=NUMBER\*(C'\fR to \fBbibtex\fR\|(1)
+.IP \fB\-terse\fR 4
.IX Item "-terse"
-Send the option \f(CW\*(C`\-terse\*(C'\fR to \fIbibtex\fR\|(1)
-.IP "\fB\-v\fR" 4
+Send the option \f(CW\*(C`\-terse\*(C'\fR to \fBbibtex\fR\|(1)
+.IP \fB\-v\fR 4
.IX Item "-v"
Print the copyright information and exit
.SH "AUTHORS AND LICENSE"
diff --git a/macros/latex/contrib/notebeamer/README.md b/macros/latex/contrib/notebeamer/README.md
index 70e97e633b..5f8a8393b9 100644
--- a/macros/latex/contrib/notebeamer/README.md
+++ b/macros/latex/contrib/notebeamer/README.md
@@ -1,22 +1,19 @@
-# The `NoteBeamer` document
+# The `notebeamer` package
-This template provides an easy way to input Beamers on note papers and make notebook quickly. It's optimized for Goodnotes' default paper size and there won’t have difference between papers.
+This package provides macros for inputting slides on note papers quickly.
-Modules of `NoteBeamer` provide the following supports:
-
-- Draft module to compile quickly;
-- Lighter or darker colors of the cover page;
-
-**Welcome to pull requests
-[here](https://github.com/xiamyphys/NoteBeamer).**
+**Welcome to pull requests [here](https://github.com/xiamyphys/notebeamer/pulls).**
## License
-This work may be distributed and/or modified under the conditions of the
-[LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
-either version 1.3c of this license or (at your option) any later version.
+This work may be distributed and/or modified under the conditions of the [LaTeX Project Public License](http://www.latex-project.org/lppl.txt), either version 1.3c of this license or (at your option) any later version.
This work has the LPPL maintenance status `maintained`.
-The Current Maintainer of this work is
-[Mingyu Xia](https://www.ctan.org/author/xia-my). \ No newline at end of file
+The Current Maintainer of this work is [Mingyu Hsia](https://www.ctan.org/author/xia-my).
+
+## Derivative Works
+
+- [fadingimage](https://ctan.org/pkg/fadingimage): Package provides macros for inputting full width picture at the edges of pages quickly.
+
+- [litesolution](https://ctan.org/pkg/litesolution): Class designed for typesetting solutions of problems in exams, textbooks, etc.
diff --git a/macros/latex/contrib/notebeamer/doc/notebeamer.pdf b/macros/latex/contrib/notebeamer/doc/notebeamer.pdf
index 804e18b158..6a882ce051 100644
--- a/macros/latex/contrib/notebeamer/doc/notebeamer.pdf
+++ b/macros/latex/contrib/notebeamer/doc/notebeamer.pdf
Binary files differ
diff --git a/macros/latex/contrib/notebeamer/doc/notebeamer.tex b/macros/latex/contrib/notebeamer/doc/notebeamer.tex
index 79f518807f..c0e59b9287 100644
--- a/macros/latex/contrib/notebeamer/doc/notebeamer.tex
+++ b/macros/latex/contrib/notebeamer/doc/notebeamer.tex
@@ -1,6 +1,7 @@
\documentclass[11pt,svgnames]{article}
\usepackage[notelinecolor=MidnightBlue,notemargin=.75in]{notebeamer}
-\usepackage{geometry,titlesec,authblk,hyperref,hologo,pgfpages,lipsum}
+\usepackage{indentfirst,titlesec,authblk,hyperref,hologo,pgfpages,lipsum}
+\geometry{margin=1in}
\titleformat*{\section}{\bfseries\large}
\titleformat*{\subsection}{\bfseries\normalsize}
\hologoFontSetup{general=\sffamily}
@@ -14,9 +15,9 @@
\def\cmd#1{\textcolor{MidnightBlue}{\texttt{\string#1}}}
\title{\bfseries The \pkg{notebeamer} Package}
-\author{Mingyu Hsia, \href{mailto:xiamyphys@gmail.com}{\ttfamily xiamyphys@gmail.com}}
+\author{Mingyu Hsia, \href{mailto:xiamyphys@hdu.edu.cn}{\ttfamily xiamyphys@hdu.edu.cn}}
\affil{Hangzhou Dianzi University}
-\date{\today\quad Version 3.0a\thanks{\url{https://github.com/xiamyphys/notebeamer}}}
+\date{\today\quad Version 3.0b\thanks{\url{https://github.com/xiamyphys/notebeamer}}}
\begin{document}
\maketitle
@@ -25,13 +26,13 @@
This is the document for the \pkg{notebeamer} package, which provides an easy way to input slides on notepages quickly for making annotations.
-Welcome to feedback bugs or ideas via email \href{mailto:xiamyphys@gmail.com}{\ttfamily xiamyphys@gmail.com} or \href{https://github.com/xiamyphys/fadingimage}{GitHub}.
+Welcome to feedback bugs or ideas via email \href{mailto:xiamyphys@hdu.edu.cn}{\ttfamily xiamyphys@hdu.edu.cn} or \href{https://github.com/xiamyphys/notebeamer}{GitHub}.
\end{abstract}
\section{Installing \pkg{notebeamer} and loading it}
-Simply download \verb|notebeamer.cls| file from \href{https://github.com/xiamyphys/notebeamer}{GitHub} or \href{https://ctan.org/pkg/fadingimage}{CTAN} and save it under your working directory. However, I strongly suggest to use terminal to install and update all packages to the latest version
+Simply download \verb|notebeamer.cls| file from \href{https://github.com/xiamyphys/notebeamer}{GitHub} or \href{https://ctan.org/pkg/notebeamer}{CTAN} and save it under your working directory. However, I strongly suggest to use terminal to install and update all packages to the latest version
\begin{verbatim}
sudo tlmgr update --self --all
@@ -111,9 +112,15 @@ The \cmd{newnotepage} command can create empty notepage(s). If a star (*) is add
This commands will create notepages that were inserted images on the left sidnumber of slides per page and the last two variables can set the start page and end page of the PDF file you want to insert that assigned by the command \cmd{notechap}.
\appendix
-\section{The \pkg{litesolution} class}
+\section{Related packages}
-This class provides a lite design for typesetting solutions of exams, textbooks or other exercises. The \pkg{notebeamer} package is contained in the \pkg{litesolution} class now.
+\subsection{The \pkg{fadingimage} package}
+
+This package provides macros for inputting full width picture at the edges of pages quickly.
+
+\subsection{The \pkg{litesolution} class}
+
+This class is designed for typesetting solutions of problems in exams, textbooks, etc. The \pkg{notebeamer} package is contained in the \pkg{litesolution} class now.
\clearpage
\pgfpagesuselayout{4 on 1}[letterpaper]
diff --git a/macros/latex/contrib/notebeamer/tex/notebeamer.sty b/macros/latex/contrib/notebeamer/tex/notebeamer.sty
index 84e06bf49a..86189cb513 100644
--- a/macros/latex/contrib/notebeamer/tex/notebeamer.sty
+++ b/macros/latex/contrib/notebeamer/tex/notebeamer.sty
@@ -1,5 +1,5 @@
%% ***********************************************************
-%% Copyright 2024 by Mingyu Hsia <xiamyphys@gmail.com> *
+%% Copyright 2024 by Mingyu Hsia <xiamyphys@hdu.edu.cn> *
%% *
%% This work may be distributed and/or modified under *
%% the conditions of the LaTeX Project Public License *
@@ -21,7 +21,7 @@
%% ***********************************************************
% !Mode:: "TeX:UTF-8"
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
-\ProvidesPackage{notebeamer}[2024/04/19 v3.0a notebeamer package]
+\ProvidesPackage{notebeamer}[2024/05/06 v3.0b Package provides macros for inputting slides on note papers quickly.]
\RequirePackage{xkeyval}
\DeclareOptionX{notelinecolor}{\gdef\@notelinecolor{#1}}
@@ -157,4 +157,4 @@
\loop
\unless\ifnum\tmpnum>#3 \@fourbeamer{\valnum0}{\valnum1}{\valnum2}{\valnum3}
\advance\tmpnum by4
- \repeat\fi} \ No newline at end of file
+ \repeat\fi}
diff --git a/macros/latex/contrib/osda/README.md b/macros/latex/contrib/osda/README.md
index 03de404407..07396d51d5 100644
--- a/macros/latex/contrib/osda/README.md
+++ b/macros/latex/contrib/osda/README.md
@@ -28,7 +28,7 @@ above.
```
\usepackage[
- 2023,
+ 2024,
cc-by,
pages={1}{6},
url=https://osda.ws/r/aaVHo,
@@ -59,7 +59,7 @@ pdflatex osda.dtx
## License information
-Copyright 2023 by Christian Krieg (christian@osda.ws)
+Copyright 2023-2024 by Christian Krieg (christian@osda.ws)
This work (excluding the OSDA logo) may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3 of this
diff --git a/macros/latex/contrib/osda/example.png b/macros/latex/contrib/osda/example.png
index 4f8b01b361..2b1a2f49b1 100644
--- a/macros/latex/contrib/osda/example.png
+++ b/macros/latex/contrib/osda/example.png
Binary files differ
diff --git a/macros/latex/contrib/osda/osda.dtx b/macros/latex/contrib/osda/osda.dtx
index b0ad170e90..7406112206 100644
--- a/macros/latex/contrib/osda/osda.dtx
+++ b/macros/latex/contrib/osda/osda.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
% osda.ins
-% Copyright 2023 by Christian Krieg (christian@osda.ws)
+% Copyright 2023-2024 by Christian Krieg (christian@osda.ws)
%
% This work (excluding the OSDA logo) may be distributed and/or modified under
% the conditions of the LaTeX Project Public License, either version 1.3 of this
@@ -29,7 +29,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{osda}
%<*package>
- [2023/04/03 v1.2.0 OSDA copyright notice generator]
+ [2024/05/01 v1.4.0 OSDA copyright notice generator]
%</package>
%
%<*driver>
@@ -52,7 +52,7 @@
moredelim=**[is][\ttfamily\bfseries\color{red}]{(*}{*)},
}
\usepackage[
- 2023,
+ 2024,
cc-by,
pages={1}{6},
url=https://osda.ws/r/0slLz,
@@ -93,6 +93,11 @@
% \changes{v1.0.0}{2023/03/30}{Initial version}
% \changes{v1.1.0}{2023/04/03}{Adding 'auto' option}
% \changes{v1.2.0}{2023/04/03}{Updating README}
+% \changes{v1.3.0}{2023/04/04}{
+% Adding presets for the years 2019 and 2020,
+% adding inline OSDA logo
+% }
+% \changes{v1.4.0}{2024/05/01}{Adding preset for 2020}
%
% \GetFileInfo{osda.sty}
%
@@ -107,7 +112,7 @@
% \author{Christian Krieg\\ Workshop on Open-Source Design Automation (OSDA) \\
% \texttt{christian@osda.ws}
% }
-% \date{April 03, 2023}
+% \date{May 01, 2024}
%
% \newcommand{\Example}{\vspace{1em}\noindent\textbf{Example:}\vspace{1em}}
%
@@ -139,7 +144,7 @@
% \begin{lstlisting}[gobble=6,float=tb,label=lst:usage-example,caption={An
% example for the most-frequent use case to use this package}]
% \usepackage[
-% 2023,
+% 2024,
% cc-by,
% pages={1}{6},
% url=https://osda.ws/r/0slLz,
@@ -190,7 +195,7 @@
% setting package options}]
% \usepackage[auto=false]{osda}
% \osdaset{
-% 2023,
+% 2024,
% cc-by,
% pages={1}{6},
% url=https://osda.ws/r/0slLz,
@@ -237,10 +242,13 @@
% example is given in \Cref{lst:option-year}.
%
% \begin{lstlisting}[gobble=6, label=lst:option-year, caption={Setting all
-% workshop-related options for the year 2023}]
-% \osdaset{2023}
+% workshop-related options for the year 2024}]
+% \osdaset{2024}
% \end{lstlisting}
%
+% Currently, presets for the following years are available:
+% |2024|, |2023|, |2020|, |2019|
+%
% \subsection{Paper license}
%
% \DescribeMacro{cc-by}
@@ -436,6 +444,36 @@
% \end{tabular}
% \end{table}
%
+% \section{Useful commands}
+%
+% \subsection{Inline logo}
+%
+% \DescribeMacro{\osda}
+% This command prints the OSDA logo inline as shown in the following examples at
+% different font sizes (\Cref{lst:inline-logo}):
+%
+% \begin{lstlisting}[gobble=6, label=lst:inline-logo, caption={Inline OSDA logo}]
+% Hello there, \osda{} is the place to be
+%
+% {\large I agree, \osda{} is the place to be!}
+%
+% {\small I agree, \osda{} is the place to be!}
+%
+% {\Huge I agree, \osda{} is the place to be!}
+%
+% {\tiny I agree, \osda{} is the place to be!}
+% \end{lstlisting}
+%
+% Hello there, \osda{} is the place to be
+%
+% {\large I agree, \osda{} is the place to be!}
+%
+% {\small I agree, \osda{} is the place to be!}
+%
+% {\Huge I agree, \osda{} is the place to be!}
+%
+% {\tiny I agree, \osda{} is the place to be!}
+%
%
% \StopEventually{}
%
@@ -560,6 +598,19 @@
%
% Default values for specific editions of OSDA
%
+ 2024/.style={
+ proceedings/title = Proceedings of the 4th Workshop on Open-Source Design Automation (OSDA),
+ workshop/counter = 4th,
+ workshop/longname = Workshop on Open-Source Design Automation,
+ workshop/acronym = OSDA,
+ location/city = Valencia,
+ location/country = Spain,
+ date/month = March,
+ date/day = 25,
+ date/year = 2024,
+ hostconference/longname = {Design, Automation, and Test in Europe Conference},
+ hostconference/acronym = DATE,
+ },
2023/.style={
proceedings/title = Proceedings of the 3rd Workshop on Open-Source Design Automation (OSDA),
workshop/counter = 3rd,
@@ -573,6 +624,32 @@
hostconference/longname = {Design, Automation, and Test in Europe Conference},
hostconference/acronym = DATE,
},
+ 2020/.style={
+ proceedings/title = Proceedings of the 2nd Workshop on Open-Source Design Automation (OSDA),
+ workshop/counter = 2nd,
+ workshop/longname = Workshop on Open-Source Design Automation,
+ workshop/acronym = OSDA,
+ location/city = Grenoble,
+ location/country = France,
+ date/month = March,
+ date/day = 13,
+ date/year = 2020,
+ hostconference/longname = {Design, Automation, and Test in Europe Conference},
+ hostconference/acronym = DATE,
+ },
+ 2019/.style={
+ proceedings/title = Proceedings of the 1st Workshop on Open-Source Design Automation (OSDA),
+ workshop/counter = 1st,
+ workshop/longname = Workshop on Open-Source Design Automation,
+ workshop/acronym = OSDA,
+ location/city = Florence,
+ location/country = Italy,
+ date/month = March,
+ date/day = 29,
+ date/year = 2019,
+ hostconference/longname = {Design, Automation, and Test in Europe Conference},
+ hostconference/acronym = DATE,
+ },
%
% Licenses
%
@@ -737,6 +814,24 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\osda}
+%%
+%% |\osda|
+%%
+%% This command prints the OSDA logo inline at a height of 1ex
+%%
+%% Usage:
+%%
+%% |\osda{}|
+%%
+% \begin{macrocode}
+%
+\newcommand{\osda}{\raisebox{.6\baselineskip}{\osdalogo{.7\baselineskip}}}
+%
+% \end{macrocode}
+% \end{macro}
+%
+%
% \begin{macro}{\osdanotice}
%%
%% |\osdanotice|
diff --git a/macros/latex/contrib/osda/osda.ins b/macros/latex/contrib/osda/osda.ins
index a76841c47b..21524ff0ac 100644
--- a/macros/latex/contrib/osda/osda.ins
+++ b/macros/latex/contrib/osda/osda.ins
@@ -1,5 +1,5 @@
%% osda.ins
-%% Copyright 2023 by Christian Krieg <christian@osda.ws>
+%% Copyright 2023-2024 by Christian Krieg <christian@osda.ws>
%%
%% This work (excluding the OSDA logo) may be distributed and/or modified under
%% the conditions of the LaTeX Project Public License, either version 1.3
@@ -29,7 +29,7 @@
This is a generated file.
-Copyright (C) 2023 by Christian Krieg <christian@osda.ws>
+Copyright (C) 2023-2024 by Christian Krieg <christian@osda.ws>
This work (excluding the OSDA logo) may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/osda/osda.pdf b/macros/latex/contrib/osda/osda.pdf
index 51bdfa0b02..5399ddcda0 100644
--- a/macros/latex/contrib/osda/osda.pdf
+++ b/macros/latex/contrib/osda/osda.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md b/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md
index b8bbe05c30..9536e081a4 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md
+++ b/macros/latex/contrib/pdfmanagement-testphase/CHANGELOG.md
@@ -4,8 +4,15 @@ first release 0.95a, 2021-02-23 will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
this project uses date-based 'snapshot' version identifiers.
+## [2024-05-23]
+### Fixed
+ - l3pdfmeta: adapted wtpdf declaration uri to corrected version.
+ - colorlinks=false no longer resets pdfborder (issue #69)
+ - added support to omit CidSet with luatex
+
## [2024-04-09]
+Version: 2024-04-09, 0.96h
### Fixed
- structure destinations for boxed destinations
diff --git a/macros/latex/contrib/pdfmanagement-testphase/README.md b/macros/latex/contrib/pdfmanagement-testphase/README.md
index 136f8e6c7c..e3c9c1be02 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/README.md
+++ b/macros/latex/contrib/pdfmanagement-testphase/README.md
@@ -1,6 +1,6 @@
# LaTeX PDF management testphase bundle
-Version: 0.96h, 2024-04-09
+Version: 0.96i, 2024-05-23
This package is used during a test phase to load the new PDF management code
of LaTeX.
diff --git a/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty
index b11df8acf7..08170653e8 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/color-ltx.sty
@@ -24,7 +24,7 @@
%% This file has the LPPL maintenance status "maintained".
%%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesPackage{color-ltx}[2024-04-09 v0.96h
+\ProvidesPackage{color-ltx}[2024-05-23 v0.96i
Standard LaTeX Color (patched for l3color, part of pdfmanagement-testphase, original version 2022/01/06 v1.3d) (DPC)]
\edef\Gin@codes{%
\catcode`\noexpand\^^A\the\catcode`\^^A\relax
diff --git a/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty
index 19d5375f7e..95a0b0a612 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty
@@ -19,7 +19,7 @@
%
% for those people who are interested.
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
-\ProvidesExplPackage{colorspace-patches-tmp-ltx}{2024-04-09}{0.96h}
+\ProvidesExplPackage{colorspace-patches-tmp-ltx}{2024-05-23}{0.96i}
{temporay patches to for the colorspace package to test pdfresource management ... UF}
% colorspace can define more models, that l3color can't yet handle.
diff --git a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx
index d6595449fe..9a8ee06546 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.dtx
@@ -82,7 +82,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -486,7 +486,8 @@
% would arise it would possible to change this.
% \subsection{Changed behaviour}
% \begin{description}
-% \item[colorlinks] |colorlinks| will as before disable the |pdfborder|, but it is possible
+% \item[colorlinks] |colorlinks| or |colorlinks=true| will as before disable the |pdfborder|
+% (|colorlinks=false| will leave the |pdfborder| untouched), but it is possible
% to use the key in the document at any time, or to reenable the border if wanted.
% Internally |colorlinks| \& friends will no longer define/undefine
% |\Hy@colorlink|, but instead use the hooks provided by the \pkg{l3pdfannot} package.
@@ -964,7 +965,7 @@
%<@@=hyp>
% \end{macrocode}
% \begin{macrocode}
-\ProvidesFile{hgeneric-testphase.def}[2024-04-09 v0.96h %
+\ProvidesFile{hgeneric-testphase.def}[2024-05-23 v0.96i %
generic Hyperref driver for the LaTeX PDF management testphase bundle]
\RequirePackage{etoolbox} %why?
@@ -2652,7 +2653,8 @@
% \begin{macrocode}
\keys_define:nn { hyp }
{
- ,colorlinks .meta:n =
+ ,colorlinks .choice:
+ ,colorlinks / true .meta:n =
{
,pdfborder={0~0~0}
,pdfborderstyle=
@@ -2662,6 +2664,14 @@
,colormenu =#1
,colorfile =#1
}
+ ,colorlinks / false .meta:n =
+ {
+ ,colorurl =#1
+ ,colorlink =#1
+ ,colorrun =#1
+ ,colormenu =#1
+ ,colorfile =#1
+ }
,colorlinks .default:n = {true}
}
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf
index 8861d8b53f..3ff91e5445 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/hyperref-generic.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx
index 75e944cf82..f655a84c26 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.dtx
@@ -45,7 +45,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
%
@@ -56,27 +56,27 @@
% \begin{macrocode}
%<drivers>\ProvidesExplFile
%<*dvipdfmx>
- {l3backend-testphase-dvipdfmx.def}{2024-04-09}{}
+ {l3backend-testphase-dvipdfmx.def}{2024-05-23}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: dvipdfmx}
%</dvipdfmx>
%<*dvips>
- {l3backend-testphase-dvips.def}{2024-04-09}{}
+ {l3backend-testphase-dvips.def}{2024-05-23}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: dvips}
%</dvips>
%<*dvisvgm>
- {l3backend-testphase-dvisvgm.def}{2024-04-09}{}
+ {l3backend-testphase-dvisvgm.def}{2024-05-23}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: dvisvgm}
%</dvisvgm>
%<*luatex>
- {l3backend-testphase-luatex.def}{2024-04-09}{}
+ {l3backend-testphase-luatex.def}{2024-05-23}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (LuaTeX)}
%</luatex>
%<*pdftex>
- {l3backend-testphase-pdftex.def}{2024-04-09}{}
+ {l3backend-testphase-pdftex.def}{2024-05-23}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (pdfTeX)}
%</pdftex>
%<*xdvipdfmx>
- {l3backend-testphase-xetex.def}{2024-04-09}{}
+ {l3backend-testphase-xetex.def}{2024-05-23}{}
{LaTeX~PDF~management~testphase~bundle~backend~support: XeTeX}
%</xdvipdfmx>
% \end{macrocode}
@@ -2528,6 +2528,23 @@
% \end{macrocode}
% \end{macro}
%
+% With luatex it is for some standards also necessary to suppress the CidSet
+% entry in the fonts (with xetex there seem to be no problem.
+% \begin{macro}{\@@_backend_omit_cidset:n}
+% The option to omit /Charset exists already for quite some time for the two
+% engines.
+% \begin{macrocode}
+%<*xdvipdfmx|dvipdfmx|dvips|dvisvgm|pdftex>
+\cs_new_protected:Npn \@@_backend_omit_cidset:n #1 {} %#1 number
+%</xdvipdfmx|dvipdfmx|dvips|dvisvgm|pdftex>
+%<*luatex>
+\cs_new_protected:Npn \@@_backend_omit_cidset:n #1 %#1 number
+ {
+ \tex_pdfvariable:D omitcidset = #1 \scan_stop:
+ }
+%</luatex>
+% \end{macrocode}
+% \end{macro}
%
% \subsection{lua code for lualatex}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf
index c4e96784b0..09b998ff81 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3backend-testphase.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx
index 4b04b4308b..ef02e9cf5a 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -432,7 +432,7 @@
% \begin{macrocode}
%<@@=pdfannot>
%<*header>
-\ProvidesExplPackage{l3pdfannot}{2024-04-09}{0.96h}
+\ProvidesExplPackage{l3pdfannot}{2024-05-23}{0.96i}
{PDF-annotations}
\RequirePackage{l3pdfdict}
%</header>
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf
index a64cceab21..1000505030 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfannot.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx
index 82d0979a02..514595e41c 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -208,7 +208,7 @@
% \begin{macrocode}
%<@@=pdfdict>
%<*header>
-\ProvidesExplPackage{l3pdfdict}{2024-04-09}{0.96h}
+\ProvidesExplPackage{l3pdfdict}{2024-05-23}{0.96i}
{Tools for PDF dictionaries (LaTeX PDF management testphase bundle)}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf
index d47028ee51..555a105c9a 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfdict.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx
index 6093a6d442..f4d71c50e8 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf
index 81bb3eab72..34fe45aec2 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-action.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx
index 534959fcaf..7f702d2934 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.dtx
@@ -64,7 +64,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf
index e680f95935..3ce7e4651f 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-checkbox.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx
index 2a114768be..e645449393 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf
index 3456e45f32..f2fe192ac0 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-choice.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx
index 47c3e95df1..b030de3323 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.dtx
@@ -55,7 +55,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
index e84df48b53..fc5114da30 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx
index 899042413a..8e16ebb596 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.dtx
@@ -83,7 +83,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
index 51804d8c3e..d182341cca 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx
index bb61dd44e7..0e3fe0c92d 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf
index 5c9d33c98a..c1968b575e 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield-textfield.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx
index 8b11e57558..c888fab7c4 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.dtx
@@ -69,7 +69,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -972,7 +972,7 @@
%<*package>
%<@@=pdffield>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesExplPackage{l3pdffield-testphase}{2024-04-09}{0.96h}%
+\ProvidesExplPackage{l3pdffield-testphase}{2024-05-23}{0.96i}%
{form fields}
% \end{macrocode}
% \subsection{hyperref specific command}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf
index 906a58d2b0..914e4d07b3 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffield.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx
index 65ac4c35fb..205dcfd7ba 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -398,7 +398,7 @@
%
% \begin{macrocode}
%<*header>
-\ProvidesExplPackage{l3pdffile}{2024-04-09}{0.96h}
+\ProvidesExplPackage{l3pdffile}{2024-05-23}{0.96i}
{embedding and referencing files in PDF---LaTeX PDF management testphase bundle}
\RequirePackage{l3pdftools} %temporarly!!
%</header>
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf
index 375d8bba15..3cd861c557 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdffile.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx
index 138b7760fc..9213e670f7 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.dtx
@@ -57,7 +57,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -632,7 +632,7 @@
%<@@=pdfmanagement>
%<*header>
%
-\ProvidesExplPackage{l3pdfmanagement}{2024-04-09}{0.96h}
+\ProvidesExplPackage{l3pdfmanagement}{2024-05-23}{0.96i}
{Management of core PDF dictionaries (LaTeX PDF management testphase bundle)}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf
index 8c02b7fbc4..59b1627594 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmanagement.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx
index bcdda4fbde..ff5483ca69 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -627,7 +627,7 @@
% \begin{macrocode}
%<@@=pdfmeta>
%<*header>
-\ProvidesExplPackage{l3pdfmeta}{2024-04-09}{0.96h}
+\ProvidesExplPackage{l3pdfmeta}{2024-05-23}{0.96i}
{PDF-Standards---LaTeX PDF management testphase bundle}
%</header>
% \end{macrocode}
@@ -2991,14 +2991,14 @@
\cs_new_protected:Npn \@@_xmp_wtpdf_reuse_declaration:
{
\pdfmeta_xmp_add_declaration:eeenn
- {http://pdfa.org/declarations\c_hash_str wtpdf-reuse1.0}
+ {http://pdfa.org/declarations/wtpdf\c_hash_str reuse1.0}
{LaTeX~Project}
{\@@_xmp_iso_today:}{}{}
}
\cs_new_protected:Npn \@@_xmp_wtpdf_accessibility_declaration:
{
\pdfmeta_xmp_add_declaration:ennnn
- {http://pdfa.org/declarations\c_hash_str wtpdf-accessibility1.0}
+ {http://pdfa.org/declarations/wtpdf\c_hash_str accessibility1.0}
{LaTeX~Project}
{\@@_xmp_iso_today:}{}{}
}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf
index 31abe3cc77..e9aedc14cf 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfmeta.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx
index d440373372..cc0f14d81b 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -155,10 +155,14 @@
% command is \emph{used}, but only at \emph{shipout}.
% This requires new engines which
% allow to use the keyword \texttt{shipout} with the primitive
-% \cs{special} and \cs{pdfliteral}. The content of \meta{dictionary content}
-% is added in the stream.
+% \cs{special} and \cs{pdfliteral}. Also differently to \cs{pdf_bdc:ee}
+% the content of \meta{dictionary content} is added inline in the stream
+% with most engines (not on the dvips + ps2pdf route).
+% This means that this command can also be used if such an inline dictionary is preferred.
+%
+% The command requires current engines and
+% is not defined if an too old engine is detected!
%
-% The command requires current engines and is not defined if an to old engine is detected!
% \end{function}
%
% \begin{function}[added = 2020-07-03]
@@ -231,7 +235,7 @@
%
% \begin{macrocode}
%<*header>
-\ProvidesExplPackage{l3pdftools}{2024-04-09}{0.96h}
+\ProvidesExplPackage{l3pdftools}{2024-05-23}{0.96i}
{candidate commands for l3pdf---LaTeX PDF management testphase bundle}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf
index 4dca8de6ec..8710b7d376 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdftools.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx
index c135d90f88..d567f42cb2 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -132,7 +132,7 @@
% \begin{macrocode}
%<@@=pdf>
%<*header>
-\ProvidesExplPackage{l3pdfxform}{2024-04-09}{0.96h}
+\ProvidesExplPackage{l3pdfxform}{2024-05-23}{0.96i}
{command to create xforms (beta)---LaTeX PDF management testphase bundle}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf
index 5871db8203..3e4df1cbe1 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/l3pdfxform.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx
index e51d8ea205..b6d1b2f45b 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.dtx
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -220,7 +220,7 @@
% \begin{macrocode}
%<@@=pdfmanagement>
%<*header>
-\ProvidesExplPackage{ltdocinit}{2024-04-09}{0.96h}
+\ProvidesExplPackage{ltdocinit}{2024-05-23}{0.96i}
{Initialize document metadata}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf
index 9778c2647f..e4c849da16 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/ltdocinit.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx
index 61853b0d5b..6bd57345df 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.dtx
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -63,7 +63,7 @@
% |debug={firstaidoff={name1,name2,...},...}|.
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{pdfmanagement-firstaid}{2024-04-09}{0.96h}
+\ProvidesExplPackage{pdfmanagement-firstaid}{2024-05-23}{0.96i}
{LaTeX PDF management testphase bundle / firstaid-patches}
%<@@=pdfmanagement>
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
index 7d4b656e9a..39a84280bc 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx
index eec73f1105..6dc445b7ff 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.dtx
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Version 0.96h, released 2024-04-09}
+% \date{Version 0.96i, released 2024-05-23}
%
% \maketitle
% \begin{documentation}
@@ -394,7 +394,7 @@
% \begin{macrocode}
%<@@=pdf>
%<*package>
-\ProvidesExplPackage{pdfmanagement-testphase}{2024-04-09}{0.96h}
+\ProvidesExplPackage{pdfmanagement-testphase}{2024-05-23}{0.96i}
{LaTeX PDF management testphase bundle}
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
\IfFormatAtLeastTF{2020-10-01}{}{
@@ -422,7 +422,7 @@
% to allow to set it in the document.
% \begin{macrocode}
%<*header>
-\ProvidesExplFile{pdfmanagement-testphase.ltx}{2024-04-09}{0.96h}
+\ProvidesExplFile{pdfmanagement-testphase.ltx}{2024-05-23}{0.96i}
{PDF~management~code~(testphase)}
% \end{macrocode}
% We define a boolean for the new delayed shipout. This is temporary. At some
diff --git a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf
index d8204141ca..3c816a8e5c 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf
+++ b/macros/latex/contrib/pdfmanagement-testphase/pdfmanagement-testphase.pdf
Binary files differ
diff --git a/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty b/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty
index 6b553f8519..cc220aa313 100644
--- a/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty
+++ b/macros/latex/contrib/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty
@@ -1,6 +1,6 @@
%% LaTeX2e file `xcolor-patches-tmp-ltx.sty'
%%
-\ProvidesPackage{xcolor-patches-tmp-ltx}[2024-04-09 v0.96h patch xcolor for l3color]
+\ProvidesPackage{xcolor-patches-tmp-ltx}[2024-05-23 v0.96i patch xcolor for l3color]
\@ifundefined{color_set:nn}{\RequirePackage{l3color}}{}
\ExplSyntaxOn
diff --git a/macros/latex/contrib/ppt-slides/README.md b/macros/latex/contrib/ppt-slides/README.md
index f1f92da99d..d742b04bb0 100644
--- a/macros/latex/contrib/ppt-slides/README.md
+++ b/macros/latex/contrib/ppt-slides/README.md
@@ -1,3 +1,5 @@
+# LaTeX Slidedeck à la PPT
+
[![make](https://github.com/yegor256/ppt-slides/actions/workflows/l3build.yml/badge.svg)](https://github.com/yegor256/ppt-slides/actions/workflows/l3build.yml)
[![CTAN](https://img.shields.io/ctan/v/ppt-slides)](https://ctan.org/pkg/ppt-slides)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/yegor256/ppt-slides/blob/master/LICENSE.txt)
@@ -8,7 +10,8 @@ but more precise, uniform, and visually strict.
Check [this series of lectures](https://github.com/yegor256/ssd16)
fully designed with the use of this package.
-First, [install it](https://en.wikibooks.org/wiki/LaTeX/Installing_Extra_Packages)
+First,
+[install it](https://en.wikibooks.org/wiki/LaTeX/Installing_Extra_Packages)
from [CTAN](https://ctan.org/pkg/ppt-slides)
and then use in preamble:
@@ -25,7 +28,9 @@ and then use in preamble:
\end{document}
```
-Otherwise, you can download [`ppt-slides.sty`](https://yegor256.github.io/ppt-slides/ppt-slides.sty) and add to your project.
+Otherwise, you can download
+[`ppt-slides.sty`](https://yegor256.github.io/ppt-slides/ppt-slides.sty)
+and add to your project.
If you want to contribute yourself, make a fork, then create a branch,
then run `l3build ctan` in the root directory.
diff --git a/macros/latex/contrib/ppt-slides/ppt-slides.dtx b/macros/latex/contrib/ppt-slides/ppt-slides.dtx
index e0618f0a8d..0509442173 100644
--- a/macros/latex/contrib/ppt-slides/ppt-slides.dtx
+++ b/macros/latex/contrib/ppt-slides/ppt-slides.dtx
@@ -50,7 +50,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{ppt-slides}
%<*package>
-[2024-01-23 0.3.2 Slide Decks a la Power Point]
+[2024-05-02 0.3.3 Slide Decks a la Power Point]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -610,7 +610,7 @@
}%
}%
&%
- ``#3''%
+ ``#3{}''%
\def\param{#4}%
\ifx\param\empty\else%
\par\vspace*{1em}%
diff --git a/macros/latex/contrib/ppt-slides/ppt-slides.pdf b/macros/latex/contrib/ppt-slides/ppt-slides.pdf
index 95c1024bff..39b45d9a9a 100644
--- a/macros/latex/contrib/ppt-slides/ppt-slides.pdf
+++ b/macros/latex/contrib/ppt-slides/ppt-slides.pdf
Binary files differ
diff --git a/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf b/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf
index d71cc56e94..dcd5987717 100644
--- a/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf
+++ b/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/profcollege/latex/PfCArbreChiffre.tex b/macros/latex/contrib/profcollege/latex/PfCArbreChiffre.tex
new file mode 100644
index 0000000000..f724c16fda
--- /dev/null
+++ b/macros/latex/contrib/profcollege/latex/PfCArbreChiffre.tex
@@ -0,0 +1,200 @@
+%%%
+% ArbreChiffre
+%%%
+% https://tex.stackexchange.com/questions/112975/how-to-print-the-permutation-of-s-u-v-a-t-with-latex
+
+\def\recurse#1#2#3#4\endmarker{%
+ \dopermute{#1#3}#2#4\endmarker
+ \ifx\relax#4\relax\else % add a \par before \else if there are more than 8 items
+ \recurse{#1}{#2#3}#4\endmarker
+ \fi}
+\def\dopermute#1#2#3\endmarker{%
+ \ifx\relax#3\relax
+ #1#2,%
+ \else
+ \dopermute{#1#2}#3\endmarker
+ \recurse{#1}{#2}#3\endmarker
+ \fi}
+
+\newcommand*\permute[1]{\dopermute{}#1\endmarker}
+
+\newtoks\toklistepermute%
+
+\def\UpdatetoksArbre#1\nil{\addtotok\toklistepermute{"#1",}}%
+
+\setKVdefault[ArbreChiffre]{Fixe=false,EcartV=0.5}%
+\defKV[ArbreChiffre]{Chiffre=\setKV[ArbreChiffre]{Fixe}}%
+
+\NewDocumentCommand\ArbreChiffre{om}{%
+ \useKVdefault[ArbreChiffre]%
+ \setKV[ArbreChiffre]{#1}%
+ \toklistepermute{}%
+ \xdef\Foo{\permute{#2}}%
+ \setsepchar{,}\ignoreemptyitems%
+ \readlist\ListePermutations{\Foo}%
+ \reademptyitems%
+ %
+ \foreachitem\compteur\in\ListePermutations{\expandafter\UpdatetoksArbre\compteur\nil}%
+ \BuildArbreChiffre{\the\toklistepermute}%
+}%
+
+\NewDocumentCommand\BuildArbreChiffre{m}{%
+ \ifluatex
+ \mplibforcehmode
+ \mplibnumbersystem{double}
+ \begin{mplibcode}
+ boolean Fixe;
+ Fixe=\useKV[ArbreChiffre]{Fixe};
+ string NombreFixe;
+ if Fixe:
+ NombreFixe=\useKV[ArbreChiffre]{Chiffre};
+ else:
+ NombreFixe="-1";
+ fi;
+
+ string LesPermu[];
+
+ vardef LongueurArbre(text t)=
+ ec:=0;
+ for p_=t:
+ LesPermu[ec]=p_;
+ longA:=length p_;
+ ec:=ec+1;
+ endfor;
+ enddef;
+
+ LongueurArbre(#1);
+
+ ecartV=\useKV[ArbreChiffre]{EcartV}*1cm;
+ ecartH=1cm;
+
+ k:=longA;
+
+ vardef Factorielle(expr nb)=
+ save Fact;
+ numeric Fact;
+ if nb<2:
+ Fact=1;
+ else:
+ Fact=nb;
+ for m=nb-1 downto 2:
+ Fact:=Fact*m;
+ endfor;
+ fi;
+ Fact
+ enddef;
+
+ pair A[][];%1 colonne 2 ligne
+
+ vardef Lecture(text t)=
+ for p_=t:
+ n:=n+1;
+ if Fixe:
+ if k>2:
+ if (n mod Factorielle(k-1))=1:
+ A[k][decalv]=pointdepart+(0,ecartV*decalv*Factorielle(k-1));
+ if NombreFixe=substring(0,1) of p_:
+ label(TEX(substring(longA-k,longA-k+1) of p_),A[k][decalv]);
+ fi;
+ decalv:=decalv-1;
+ fi;
+ else:
+ A[k][decalv]=pointdepart+(0,ecartV*decalv);
+ if NombreFixe=substring(0,1) of p_:
+ label(TEX(substring(longA-k,longA-k+1) of p_),A[k][decalv]);
+ fi;
+ decalv:=decalv-1;
+ fi;
+ else:%Pas Fixe
+ if k>2:
+ if (n mod Factorielle(k-1))=1:
+ A[k][decalv]=pointdepart+(0,ecartV*decalv*Factorielle(k-1));
+ label(TEX(substring(longA-k,longA-k+1) of p_),A[k][decalv]);
+ decalv:=decalv-1;
+ fi;
+ else:
+ A[k][decalv]=pointdepart+(0,ecartV*decalv);
+ label(TEX(substring(longA-k,longA-k+1) of p_),A[k][decalv]);
+ decalv:=decalv-1;
+ fi;
+ fi;
+ endfor;
+ enddef;
+
+ pair pointdepart;
+ pointdepart=(0,0);
+
+ forever:
+ n:=0;
+ decalv:=0;
+ Lecture(#1);
+ k:=k-1;
+ if k>1:
+ if k>2:
+ pointdepart:=if k mod 2=0:pointdepart+(ecartH,1.5*Factorielle(k-1)*ecartV); else:pointdepart+(ecartH,Factorielle(k-1)*ecartV); fi;
+ else:
+ pointdepart:=if k mod 2=0:pointdepart+(ecartH,Factorielle(k-1)*ecartV-0.5*ecartV); else:pointdepart+(ecartH,Factorielle(k-1)*ecartV+0.5*ecartV); fi;
+ fi;
+ else:
+ pointdepart:=pointdepart+(ecartH,0);
+ fi;
+ exitif k=0;
+ endfor;
+
+% drawoptions(withcolor red);
+ if Fixe:
+ for k=longA downto 3:
+ for l=0 downto (-Factorielle(longA)/Factorielle(k-1))+1:
+ if (substring(0,1) of LesPermu[abs(l)*Factorielle(k-1)+1])=NombreFixe:
+ for p=0 upto k-2:
+ drawarrow (A[k][l]--A[k-1][(k-1)*l-p]) cutbefore cercles(A[k][l],2mm) cutafter cercles(A[k-1][(k-1)*l-p],2mm);
+ endfor;
+ fi;
+ endfor;
+ endfor;
+ else:
+ for k=longA downto 3:
+ for l=0 downto (-Factorielle(longA)/Factorielle(k-1))+1:
+ for p=0 upto k-2:
+ drawarrow (A[k][l]--A[k-1][(k-1)*l-p]) cutbefore cercles(A[k][l],2mm) cutafter cercles(A[k-1][(k-1)*l-p],2mm);
+ endfor;
+ endfor;
+ endfor;
+ fi;
+% drawoptions();
+
+ % affichage du dernier cran.
+ for k=2 downto 2:
+ l:=1;
+ for p_=#1:
+ l:=l-1;
+ if Fixe:
+ if substring(0,1) of p_=NombreFixe:
+drawarrow (A[k][l]--A[k-1][l]) cutbefore cercles(A[k][l],2mm) cutafter cercles(A[k-1][l],2mm);
+ fi;
+ else:
+ drawarrow (A[k][l]--A[k-1][l]) cutbefore cercles(A[k][l],2mm) cutafter cercles(A[k-1][l],2mm);
+ fi;
+ endfor;
+ endfor;
+
+ %Affichage final du nombre
+ l:=1;
+ for p_=#1:
+ l:=l-1;
+ A[0][l]-A[1][l]=(ecartH,0);
+ if Fixe:
+ if substring(0,1) of p_=NombreFixe:
+ label.rt(TEX("\num{"&p_&"}"),A[0][l]);
+ drawarrow (A[1][l]--A[0][l]) cutbefore cercles(A[1][l],2mm) dashed evenly;
+ fi;
+ else:
+ label.rt(TEX("\num{"&p_&"}"),A[0][l]);
+ drawarrow (A[1][l]--A[0][l]) cutbefore cercles(A[1][l],2mm) dashed evenly;
+ fi;
+ endfor;
+
+ \end{mplibcode}
+ \mplibnumbersystem{scaled}
+ \fi
+}% \ No newline at end of file
diff --git a/macros/latex/contrib/profcollege/latex/PfCCartesJeux.tex b/macros/latex/contrib/profcollege/latex/PfCCartesJeux.tex
index bf9b9e0cde..1e2075d91a 100644
--- a/macros/latex/contrib/profcollege/latex/PfCCartesJeux.tex
+++ b/macros/latex/contrib/profcollege/latex/PfCCartesJeux.tex
@@ -417,11 +417,16 @@
\ifboolKV[Cards]{Jointes}{\setlength{\largeurcards}{\largeurcarte}}{}%
\ifboolKV[Cards]{Jointes}{\setlength{\hauteurcards}{\hauteurcarte}}{}%
% décalage entre les cartes ou pas
- \ifnum\PfCNbCartesLarg>1\relax
- \setlength{\margeh}{\fpeval{(\paperwidth-\PfCNbCartesLarg*\largeurcards)/(\PfCNbCartesLarg-1)}pt}%
+ \ifnum\PfCNbCartesLarg>2\relax
+ \setlength{\margeh}{\fpeval{(\paperwidth-\PfCNbCartesLarg*\largeurcards)/(\PfCNbCartesLarg-1)}pt}%
+ % \setlength{\margeh}{0pt}
+ \else
+ \setlength{\margeh}{\fpeval{(\paperwidth-\PfCNbCartesLarg*\largeurcards)/(\PfCNbCartesLarg+1)}pt}%
\fi
- \ifnum\PfCNbCartesHaut>1\relax
+ \ifnum\PfCNbCartesHaut>2\relax
\setlength{\margev}{\fpeval{(\paperheight-\PfCNbCartesHaut*\hauteurcards)/(\PfCNbCartesHaut-1)}pt}%
+ \else
+ \setlength{\margev}{\fpeval{(\paperheight-\PfCNbCartesHaut*\hauteurcards)/(\PfCNbCartesHaut+1)}pt}%
\fi
%
\setlength{\hauteurtitre}{\fpeval{\useKV[Cards]{HauteurTheme}}pt}%
diff --git a/macros/latex/contrib/profcollege/latex/PfCEcrireunQCM.tex b/macros/latex/contrib/profcollege/latex/PfCEcrireunQCM.tex
index 3d7a324b73..6fc7a94593 100644
--- a/macros/latex/contrib/profcollege/latex/PfCEcrireunQCM.tex
+++ b/macros/latex/contrib/profcollege/latex/PfCEcrireunQCM.tex
@@ -12,7 +12,7 @@
\setcounter{TotalQCMSeul}{0}%
\setcounter{TotalQCMSeulSol}{0}%
%
-\setKVdefault[QCMSeul]{Melange=false,Solution=false,EnColonne=false}%
+\setKVdefault[QCMSeul]{Melange=false,Solution=false,EnColonne=false,LabelLettre=false}%
\defKV[QCMSeul]{Colonnes=\setKV[QCMSeul]{EnColonne}}%
%
\NewDocumentCommand\PfCQCMSChoixLabelSol{m}{%
@@ -71,7 +71,11 @@
% On écrit
\ListeQCM[1]%
\ifboolKV[QCMSeul]{EnColonne}{\begin{multicols}{\useKV[QCMSeul]{Colonnes}}}{}%
- \begin{itemize}[label=$\square$]
+ \ifboolKV[QCMSeul]{LabelLettre}{
+ \begin{enumerate}[label=\Alph{*}/]
+ }{
+ \begin{enumerate}[label=$\square$]
+ }
\xintFor* ##1 in{\xintSeq{2}{\fpeval{\ListeQCMlen-1}}}\do{%
\xdef\Titi{\ListeEnumerate[\fpeval{##1-1}]}
\ifboolKV[QCMSeul]{Solution}{%
@@ -80,7 +84,7 @@
\item \ListeQCM[\fpeval{\Titi+1}]
}%
}%
- \end{itemize}
+ \end{enumerate}
\ifboolKV[QCMSeul]{EnColonne}{\end{multicols}}{}%
}%
%
diff --git a/macros/latex/contrib/profcollege/latex/PfCPatronPaves.tex b/macros/latex/contrib/profcollege/latex/PfCPatronPaves.tex
index 2be0a20bd0..dfbd3a5d23 100644
--- a/macros/latex/contrib/profcollege/latex/PfCPatronPaves.tex
+++ b/macros/latex/contrib/profcollege/latex/PfCPatronPaves.tex
@@ -1,3 +1,6 @@
+%%%
+% Patrons de pavés droits et cubes
+%%%
\setKVdefault[ClesPatron]{Cube,Arete=1cm,ListeCouleurs={white},Pave=false,Largeur=2cm,Hauteur=1.5cm,Profondeur=1cm,Codes=false}%
\defKV[ClesPatron]{Traces=\setKV[ClesPatron]{Codes}}%
@@ -27,6 +30,149 @@
}%
}%
+\setsepchar{,}\ignoreemptyitems
+\readlist*\ListePatronsCube{%
+ {ooxo,xxxx,ooxo},%
+ {oxoo,xxxx,xooo},%
+ {ooxo,xxxx,oxoo},%
+ {ooox,xxxx,xooo},%
+ {ooox,xxxx,oxoo},%
+ {xxxoo,ooxxx},%
+ {xxoo,oxxo,ooxx},%
+ {xxoo,oxxx,ooox},%
+ {xxoo,oxxx,ooxo},%
+ {ooox,xxxx,ooox},%
+ {ooxo,xxxo,ooxx}%
+}%
+\readlist*\ListePatronsCubeCouleurs{%
+ {LightSteelBlue,Crimson,Yellow,Crimson,Yellow,LightSteelBlue},%
+ {LightSteelBlue,Crimson,Yellow,Crimson,Yellow,LightSteelBlue},%
+ {LightSteelBlue,Crimson,Yellow,Crimson,Yellow,LightSteelBlue},%
+ {LightSteelBlue,Crimson,Yellow,Crimson,Yellow,LightSteelBlue},%
+ {LightSteelBlue,Crimson,Yellow,Crimson,Yellow,LightSteelBlue},%
+ {LightSteelBlue,Crimson,LightSteelBlue,Yellow,Crimson,Yellow},%
+ {LightSteelBlue,Crimson,Yellow,LightSteelBlue,Crimson,Yellow},%
+ {LightSteelBlue,Crimson,Yellow,LightSteelBlue,Yellow,Crimson},%
+ {LightSteelBlue,Crimson,Yellow,LightSteelBlue,Yellow,Crimson},%
+ {LightSteelBlue,Crimson,Yellow,Crimson,Yellow,LightSteelBlue},%
+ {LightSteelBlue,Crimson,Yellow,Crimson,LightSteelBlue,Yellow}%
+}%
+
+\readlist*\ListePatronsPave{%
+ {hlpl,lopo,hopo,lopo},%
+ {hlpo,loph,hopo,lopo},%
+ {hlpo,lopo,hopl,lopo},%
+ {hlpo,lopo,hopo,loph},%
+ {hopo,lhph,hopo,lopo},%
+ {hopo,lhpo,hopl,lopo},%
+ {hopo,lhpo,hopo,lopl},%
+ {hopo,lopo,hlpl,lopo},%
+ {hopo,lopo,hlpo,loph},%
+ {hopo,lopo,hopo,lhph},%10
+ {plhl,loho,poho,loho},%
+ {plho,loho,pohl,loho},%
+ {plho,loho,pohl,loho},%
+ {plho,loho,poho,lohp},%
+ {poho,lphp,poho,loho},%
+ {poho,lpho,pohl,loho},%
+ {poho,lpho,poho,lohp},%
+ {poho,loho,plhl,loho},%
+ {poho,loho,plho,lohp},%
+ {poho,loho,poho,lphp},%
+ {phlh,holo,polo,holo},%
+ {phlo,holp,polo,holo},%
+ {phlo,holo,polh,holo},%
+ {phlo,holo,polo,holp},%
+ {polo,hplp,polo,holo},%
+ {polo,hplo,polh,holo},%
+ {polo,hplo,polo,holp},%
+ {polo,holo,phlh,holo},%
+ {polo,holo,phlo,holp},%
+ {polo,holo,polo,hplp},%
+ {hlpo,lopo,hopl,pool},%
+ {hopo,lhpo,hopl,pool},%
+ {hopo,lopo,hlph,pool},%
+ {lhpo,hopo,loph,pooh},%
+ {lopo,hlpo,loph,pooh},%
+ {lopo,hopo,lhoh,pooh},%
+ {plho,loho,pohl,hool},%
+ {poho,lpho,pohl,hool},%
+ {poho,loho,plhl,hool},%
+ {lpho,poho,lohp,hoop},%
+ {loho,plho,lohp,hoop},%
+ {loho,poho,lphp,hoop},%
+ {phlo,holo,polh,looh},%
+ {polo,hplo,polh,looh},%
+ {polo,holo,phlh,looh},%
+ {hplo,polo,holp,loop},%
+ {holo,phlo,holp,loop},%
+ {holo,polo,hplp,loop},%
+ {hpo,lpo,hpl,pol,hol},%
+ {lpo,hpo,lph,poh,loh},%
+ {pho,plo,phl,hol,pol},%
+ {hpoo,lpho,pohl,hool},%
+ {lpoo,hplo,polh,looh},%
+ {phoo,lhpo,hopl,pool}
+}
+
+\readlist*\ListePatronsPaveCouleurs{%
+ {Orange,Crimson,Orange,LightGreen,Crimson,LightGreen},
+ {Orange,Crimson,LightGreen,Orange,Crimson,LightGreen},
+ {Orange,Crimson,LightGreen,Crimson,Orange,LightGreen},
+ {Orange,Crimson,LightGreen,Crimson,LightGreen,Orange},
+ {Crimson,Orange,LightGreen,Orange,Crimson,LightGreen},
+ {Crimson,Orange,LightGreen,Crimson,Orange,LightGreen},
+ {Crimson,Orange,LightGreen,Crimson,LightGreen,Orange},
+ {Crimson,LightGreen,Orange,Crimson,Orange,LightGreen},
+ {Crimson,LightGreen,Orange,Crimson,LightGreen,Orange},
+ {Crimson,LightGreen,Crimson,Orange,LightGreen,Orange},%10
+ {LightGreen,Crimson,LightGreen,Orange,Crimson,Orange},%
+ {LightGreen,Crimson,Orange,LightGreen,Crimson,Orange},%
+ {LightGreen,Crimson,Orange,Crimson,LightGreen,Orange},%
+ {LightGreen,Crimson,Orange,Crimson,Orange,LightGreen},%
+ {Crimson,LightGreen,Orange,LightGreen,Crimson,Orange},%
+ {Crimson,LightGreen,Orange,Crimson,LightGreen,Orange},%
+ {Crimson,LightGreen,Orange,Crimson,Orange,LightGreen},%
+ {Crimson,Orange,LightGreen,Crimson,LightGreen,Orange},%
+ {Crimson,Orange,LightGreen,Crimson,Orange,LightGreen},%
+ {Crimson,Orange,Crimson,LightGreen,Orange,LightGreen},%20
+ {Crimson,LightGreen,Crimson,Orange,LightGreen,Orange},%
+ {Crimson,LightGreen,Orange,LightGreen,Crimson,Orange},%
+ {Crimson,LightGreen,Orange,LightGreen,Crimson,Orange},%
+ {Crimson,LightGreen,Orange,LightGreen,Orange,Crimson},%
+ {LightGreen,Crimson,Orange,Crimson,LightGreen,Orange},%
+ {LightGreen,Crimson,Orange,LightGreen,Crimson,Orange},%
+ {LightGreen,Crimson,Orange,LightGreen,Orange,Crimson},%
+ {LightGreen,Orange,Crimson,LightGreen,Crimson,Orange},%
+ {LightGreen,Orange,Crimson,LightGreen,Orange,Crimson},%
+ {LightGreen,Orange,LightGreen,Crimson,Orange,Crimson},%30
+ {Orange,Crimson,LightGreen,Crimson,Orange,LightGreen},%
+ {Crimson,Orange,LightGreen,Crimson,Orange,LightGreen},%
+ {Crimson,LightGreen,Orange,Crimson,Orange,LightGreen},%
+ {Orange,LightGreen,Crimson,LightGreen,Orange,Crimson},%
+ {LightGreen,Orange,Crimson,LightGreen,Orange,Crimson},%
+ {LightGreen,Crimson,Orange,LightGreen,Orange,Crimson},%
+ {LightGreen,Crimson,Orange,Crimson,LightGreen,Orange},%
+ {Crimson,LightGreen,Orange,Crimson,LightGreen,Orange},%
+ {Crimson,Orange,LightGreen,Crimson,LightGreen,Orange},%
+ {LightGreen,Orange,Crimson,Orange,LightGreen,Crimson},%40
+ {Orange,LightGreen,Crimson,Orange,LightGreen,Crimson},%
+ {Orange,Crimson,LightGreen,Orange,LightGreen,Crimson},%
+ {Crimson,LightGreen,Orange,LightGreen,Crimson,Orange},%
+ {LightGreen,Crimson,Orange,LightGreen,Crimson,Orange},%
+ {LightGreen,Orange,Crimson,LightGreen,Crimson,Orange},%
+ {Crimson,Orange,LightGreen,Orange,Crimson,LightGreen},%
+ {Orange,Crimson,LightGreen,Orange,Crimson,LightGreen},%
+ {Orange,LightGreen,Crimson,Orange,Crimson,LightGreen},%
+ {Crimson,LightGreen,Crimson,Orange,LightGreen,Orange},%
+ {LightGreen,Crimson,LightGreen,Orange,Crimson,Orange},%50
+ {Crimson,Orange,Crimson,LightGreen,Orange,LightGreen},%
+ {Crimson,LightGreen,Orange,Crimson,LightGreen,Orange},%
+ {LightGreen,Crimson,Orange,LightGreen,Crimson,Orange},%
+ {Crimson,Orange,LightGreen,Crimson,Orange,LightGreen}%
+}%
+\reademptyitems
+
\def\MPPatronCubeCode{%
Arete=\useKV[ClesPatron]{Arete};
%
@@ -126,13 +272,35 @@
boolean Codes;
Codes=\useKV[ClesPatron]{Codes};
numeric DecalCol[];
+ %
vardef LectureLargeur(text t)=
for p_=t:
Long:=length p_;
endfor;
for k=1 upto Long-1:
for p_=t:
- if substring(k,k+1) of p_="l":
+ if substring(k,k+1) of p_="o":
+ if k=1:
+ if (substring(0,1) of p_="h") and (substring(1,2) of p_="p"):
+ DecalCol[k]:=Largeur;
+ fi;
+ if (substring(0,1) of p_="h") and (substring(1,2) of p_="l"):
+ DecalCol[k]:=Profondeur;
+ fi;
+ if (substring(0,1) of p_="p") and (substring(1,2) of p_="h"):
+ DecalCol[k]:=Largeur;
+ fi;
+ if (substring(0,1) of p_="p") and (substring(1,2) of p_="l"):
+ DecalCol[k]:=Hauteur;
+ fi;
+ if (substring(0,1) of p_="l") and (substring(1,2) of p_="h"):
+ DecalCol[k]:=Profondeur;
+ fi;
+ if (substring(0,1) of p_="l") and (substring(1,2) of p_="p"):
+ DecalCol[k]:=Hauteur;
+ fi;
+ fi;
+ elseif substring(k,k+1) of p_="l":
DecalCol[k]:=Largeur;
elseif substring(k,k+1) of p_="h":
DecalCol[k]:=Hauteur;
@@ -142,6 +310,7 @@
endfor;
endfor;
enddef;
+ %
vardef Patron(text t)=
path PathPave;
nblignes:=-1;
@@ -159,7 +328,11 @@
fi;
nblignes:=nblignes-YEchelle;
for k=1 upto Long-1:
- if substring(k,k+1) of p_="l":
+ if substring(k,k+1) of p_="o":
+ if k=1:
+ PathPave:=(unitsquare scaled 0);
+ fi;
+ elseif substring(k,k+1) of p_="l":
nbcol:=nbcol+1;
PathPave:=(unitsquare xscaled Largeur yscaled YEchelle) shifted ((nbcolonnes,nblignes));
nbfaces:=nbfaces+1;
diff --git a/macros/latex/contrib/profcollege/latex/PfCVisualisationMulDeci.tex b/macros/latex/contrib/profcollege/latex/PfCVisualisationMulDeci.tex
new file mode 100644
index 0000000000..54a1a079cc
--- /dev/null
+++ b/macros/latex/contrib/profcollege/latex/PfCVisualisationMulDeci.tex
@@ -0,0 +1,135 @@
+%%%
+% Visualisation Multiplication Décimaux
+%%%
+\setKVdefault[VisMulDec]{Couleur=Orange,CouleurUnite=DarkGreen,Dixiemes=false,Unite=2}%
+
+\newtoks\toksvismuldec%
+\def\UpdatetoksVisMulDec#1\nil{\addtotok\toksvismuldec{"#1",#1,}}%
+
+\NewDocumentCommand\VisualisationMulDecimaux{om}{%
+ \useKVdefault[VisMulDec]%
+ \setKV[VisMulDec]{#1}%
+ \setsepchar{x}\ignoreemptyitems%
+ \readlist*\PfCVisMulDec{#2}%
+ \toksvismuldec{}%
+ \foreachitem\compteur\in\PfCVisMulDec{\expandafter\UpdatetoksVisMulDec\compteur\nil}%
+ \BuildVisMulDec{\the\toksvismuldec}%
+ \reademptyitems%
+}%
+
+\NewDocumentCommand\BuildVisMulDec{m}{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+ string Nombres[];
+ numeric Decimaux[];
+ color Coul[];
+ boolean Dixiemes;
+
+ Unite=\useKV[VisMulDec]{Unite}*cm;
+ Coul1=\useKV[VisMulDec]{Couleur};
+ Coul2=\useKV[VisMulDec]{CouleurUnite};
+ Coul3=0.7[Coul2,white];
+
+ Dixiemes=\useKV[VisMulDec]{Dixiemes};
+
+ vardef RecupererDonnees(text t)=
+ nbs:=0;
+ nbd:=0;
+ for p_=t:
+ if string p_:
+ nbs:=nbs+1;
+ Nombres[nbs]=p_;
+ else:
+ nbd:=nbd+1;
+ Decimaux[nbd]=p_;
+ fi;
+ endfor;
+ enddef;
+
+ RecupererDonnees(#1);
+
+ pair A,B,C,D;
+ A=(0,0);
+ B-A=Unite*(Decimaux[1],0);
+ D-A=Unite*(0,Decimaux[2]);
+ C-D=B-A;
+ fill polygone(A,Unite*(1,0),Unite*(1,1),Unite*(0,1)) withcolor Coul3;
+ drawoptions(withcolor Coul1);
+ pasx=0.1;
+ pasy=0.1;
+ if (Dixiemes and ((Decimaux[1]*10) mod 10=0)):
+ pasy:=1;
+ fi;
+ if (Dixiemes and ((Decimaux[2]*10) mod 10=0)):
+ pasx:=1;
+ fi;
+ for k=0 step pasx until Decimaux[1]:
+ trace (A--(Unite*(0,Decimaux[2]))) shifted(k*Unite*(1,0));
+ endfor;
+ for k=0 step pasy until Decimaux[2]:
+ trace (A--(Unite*(Decimaux[1],0))) shifted(k*Unite*(0,1));
+ endfor;
+ drawoptions(withpen pencircle scaled 1.2 withcolor Coul2);
+ for k=0 upto Decimaux[1]:
+ trace (A--(Unite*(0,Decimaux[2]))) shifted(k*Unite*(1,0));
+ endfor;
+ for k=0 upto Decimaux[2]:
+ trace (A--(Unite*(Decimaux[1],0))) shifted(k*Unite*(0,1));
+ endfor;
+ drawoptions();
+ trace cotation(A,B,-5mm,-3mm,TEX("\num{"&Nombres[1]&"}"));
+ trace cotation(A,D,5mm,5mm,TEX("\num{"&Nombres[2]&"}") rotated -90);
+ \end{mplibcode}
+ \else
+ \begin{mpost}[mpsettings={string Nombres[];numeric Decimaux[];color Coul[];boolean Dixiemes;Unite=\useKV[VisMulDec]{Unite}*cm;Coul1=\useKV[VisMulDec]{Couleur};Coul2=\useKV[VisMulDec]{CouleurUnite};Coul3=0.7[Coul2,white];Dixiemes=\useKV[VisMulDec]{Dixiemes};}]
+ vardef RecupererDonnees(text t)=
+ nbs:=0;
+ nbd:=0;
+ for p_=t:
+ if string p_:
+ nbs:=nbs+1;
+ Nombres[nbs]=p_;
+ else:
+ nbd:=nbd+1;
+ Decimaux[nbd]=p_;
+ fi;
+ endfor;
+ enddef;
+
+ RecupererDonnees(#1);
+
+ pair A,B,C,D;
+ A=(0,0);
+ B-A=Unite*(Decimaux[1],0);
+ D-A=Unite*(0,Decimaux[2]);
+ C-D=B-A;
+ fill polygone(A,Unite*(1,0),Unite*(1,1),Unite*(0,1)) withcolor Coul3;
+ drawoptions(withcolor Coul1);
+ pasx=0.1;
+ pasy=0.1;
+ if (Dixiemes and ((Decimaux[1]*10) mod 10=0)):
+ pasy:=1;
+ fi;
+ if (Dixiemes and ((Decimaux[2]*10) mod 10=0)):
+ pasx:=1;
+ fi;
+ for k=0 step pasx until Decimaux[1]:
+ trace (A--(Unite*(0,Decimaux[2]))) shifted(k*Unite*(1,0));
+ endfor;
+ for k=0 step pasy until Decimaux[2]:
+ trace (A--(Unite*(Decimaux[1],0))) shifted(k*Unite*(0,1));
+ endfor;
+ drawoptions(withpen pencircle scaled 1.2 withcolor Coul2);
+ for k=0 upto Decimaux[1]:
+ trace (A--(Unite*(0,Decimaux[2]))) shifted(k*Unite*(1,0));
+ endfor;
+ for k=0 upto Decimaux[2]:
+ trace (A--(Unite*(Decimaux[1],0))) shifted(k*Unite*(0,1));
+ endfor;
+ drawoptions();
+ trace cotation(A,B,-5mm,-3mm,LATEX("\num{"&Nombres[1]&"}"));
+ trace cotation(A,D,5mm,5mm,LATEX("\num{"&Nombres[2]&"}") rotated -90);
+ \end{mpost}
+ \fi
+}% \ No newline at end of file
diff --git a/macros/latex/contrib/profcollege/latex/PfCVueCubes.tex b/macros/latex/contrib/profcollege/latex/PfCVueCubes.tex
index 5f284e051e..9365b7e621 100644
--- a/macros/latex/contrib/profcollege/latex/PfCVueCubes.tex
+++ b/macros/latex/contrib/profcollege/latex/PfCVueCubes.tex
@@ -1,30 +1,105 @@
%%%
% Vue Cubes
%%%
-\setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false,Seul=false}
+\setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false,Seul=false,Perso=false,EclateX=0,EclateZ=0,EclateY=0}
\newtoks\toklisteVueCube%
\def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}%
+\def\UpdatetoksEmpilementPerso#1\nil{\addtotok\toklisteVueCube{"#1",}}%
\NewDocumentCommand\VueCubes{o m}{%
\useKVdefault[VueCubes]%
- \setKV[VueCubes]{#1}
- \ifboolKV[VueCubes]{Solution}{%
- \BuildVueCubesSolution%
+ \setKV[VueCubes]{#1}%
+ \toklisteVueCube{}%
+ \ifboolKV[VueCubes]{Perso}{%
+ \setsepchar[*]{,*/}\ignoreemptyitems%
+ \readlist*\ListeCouches{#2}%
+ \reademptyitems%
+ \foreachitem\compteur\in\ListeCouches{%
+ \foreachitem\compteurdeux\in\ListeCouches[\compteurcnt]{%
+ \expandafter\UpdatetoksEmpilementPerso\compteurdeux\nil%
+ }%
+ }%
+ \BuildMPEmpilementPerso{\the\toklisteVueCube}{\ListeCoucheslen}{\listlen\ListeCouches[1]}%
}{%
- \ifboolKV[VueCubes]{Creation}{%Le nombre de données doit être compatible avec le "volume du pavé droit"
- \ignoreemptyitems%
- \readlist*\PfCListeHauteursCubes{#2}%
- \reademptyitems%
- \toklisteVueCube{}%
- \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}%
- \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}%
+ \ifboolKV[VueCubes]{Solution}{%
+ \BuildVueCubesSolution%
}{%
- \BuildVueCubes{\useKV[VueCubes]{Angle}}{}%
+ \ifboolKV[VueCubes]{Creation}{%Le nombre de données doit être compatible avec le "volume du pavé droit"
+ \ignoreemptyitems%
+ \readlist*\PfCListeHauteursCubes{#2}%
+ \reademptyitems%
+ \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}%
+ \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}%
+ }{%
+ \BuildVueCubes{\useKV[VueCubes]{Angle}}{}%
+ }%
}%
}%
}%
+\NewDocumentCommand{\BuildMPEmpilementPerso}{mmm}{%
+ \ifluatex
+ \mplibforcehmode
+ \begin{mplibcode}
+ nbcouches=#2;
+ nblignes:=#3;
+
+ input PfCSolid;
+
+ intensite:=1.5;
+
+ Ferme[0]:=false;
+ outcolor:=\useKV[VueCubes]{CouleurCube};%
+ incolor:=white;
+ nb:=1;subh:=1;
+ creux:=true;
+
+ Phi := \useKV[VueCubes]{Angle};
+ Echelle:=\useKV[VueCubes]{Echelle};
+ EclateX:=\useKV[VueCubes]{EclateX};
+ EclateY:=\useKV[VueCubes]{EclateY};
+ EclateZ:=\useKV[VueCubes]{EclateZ};
+
+ string LesSymboles[];
+ string LesLignes[][];
+
+ TotalObj:=0;
+
+ vardef CreationSolide(text t)=
+ n:=0;
+ for p_=t:
+ n:=n+1;
+ LesSymboles[n]=p_;
+ endfor;
+ for l=nbcouches downto 1:
+ for k=nblignes downto 1:
+ LesLignes[l][k]=LesSymboles[(nbcouches-l)*nblignes+(nblignes-k+1)];
+ endfor;
+ endfor;
+ for l=nbcouches downto 1:
+ for k=nblignes downto 1:
+ for m=0 upto (length(LesLignes[l][k])-1):
+ if (substring((m,m+1)) of LesLignes[l][k])="x":
+ TotalObj:=incr TotalObj;
+ TR:=(Echelle*(nblignes-k)+Echelle*(nblignes-k)*EclateX,Echelle*(m+m*EclateY),Echelle*l-Echelle*(nbcouches-l)*EclateZ);
+ ObjetDeplacement[TotalObj](0);
+ fi;
+ endfor;
+ endfor;
+ endfor;
+ enddef;
+
+ Initialisation(2500,Phi,20,50);
+ Objetcube0("a="&decimal(Echelle));
+
+ CreationSolide(#1);
+ nbobj:=TotalObj;
+ DessineFusion;
+ \end{mplibcode}
+ \fi
+}
+
\NewDocumentCommand\BuildVueCubes{m m}{%
\ifluatex
\mplibforcehmode
diff --git a/macros/latex/contrib/profcollege/latex/ProfCollege.sty b/macros/latex/contrib/profcollege/latex/ProfCollege.sty
index 7c1bad8c3d..ca3b52ba9a 100644
--- a/macros/latex/contrib/profcollege/latex/ProfCollege.sty
+++ b/macros/latex/contrib/profcollege/latex/ProfCollege.sty
@@ -2,9 +2,9 @@
% licence : Released under the LaTeX Project Public License v1.3c
% or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}%
-\def\filedate{2024/04/26}%
+\def\filedate{2024/05/18}%
\let\PfCfiledate\filedate%
-\def\fileversion{0.99-A-d}%
+\def\fileversion{0.99-A-f}%
\let\PfCfileversion\fileversion%
\ProvidesPackage{ProfCollege}[\filedate\space v\fileversion\space Aide pour utiliser LaTeX au college]%
@@ -165,18 +165,6 @@
\def\bla{}%JCC :) Pour les tests sur arguments vides
-%% Colorer en mode mathématique. \color ne gère pas les espaces propres au mode mathématique. Donc besoin de changer
-% https://tex.stackexchange.com/questions/21598/how-to-color-math-symbols
-%\makeatletter%
-%\def\mathcolor#1#{\@mathcolor{#1}}%
-%\def\@mathcolor#1#2#3{%
-% \protect\leavevmode%
-% \begingroup%
-% \color#1{#2}#3%
-% \endgroup%
-%}%
-%\makeatother%
-
% Pb ProfCollege<->Chinois soulev\'e par Denis
% Solution by egreg :)
\newcommand\getstrut[1]{%
@@ -326,20 +314,11 @@
\IfNoValueTF{#1}{\Dotfill}{\makebox[#1]{\Dotfill}}%
}%
-%\NewDocumentCommand\Lignespointilles{m}{%
-% \xintifboolexpr{\fpeval{#1}>1}{%
-% \xintFor* ##1 in {\xintSeq {1}{\fpeval{#1}}}\do{%
-% \pointilles\par%
-% }%
-% }{}%
-%}%
-
\NewDocumentCommand\PfCNbLignesRestantes{}{%
\edef\measurepage{\dimexpr\pagegoal-\pagetotal\relax}%
- \xintifboolexpr{\fpeval{\the\measurepage}>\fpeval{\the\textheight}}{
-% Toto
- \edef\measurepage{\dimexpr\textheight\relax}
- }{}
+ \xintifboolexpr{\fpeval{\the\measurepage}>\fpeval{\the\textheight}}{%
+ \edef\measurepage{\dimexpr\textheight\relax}%
+ }{}%
\xdef\PfCResteLignes{\fpeval{trunc((\the\measurepage)/(\baselineskip),0)}}%
}%
@@ -509,16 +488,76 @@
\day=\the\PfCrappeljour\relax%
}
-\newcommand\MelangeLettres[2]{%
+\NewDocumentCommand\MelangeLettres{smm}{%
% #2 Nombre d'éléments à conserver
+ % #3 Nom de la commande qui reçoit la liste.
\setsepchar{,}\ignoreemptyitems%
\readlist*\ListeInter{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,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}%
\xdef\faa{}% Liste construite
\xdef\fii{}% Liste détruite
- \xintFor* ##1 in {\xintSeq{1}{#1}}\do{%
+ \IfBooleanTF{#1}{%
+ \xintFor* ##1 in {\xintSeq{1}{#2}}\do{%
+ \xintifboolexpr{\ListeInterlen>1}{%
+ \xdef\Alea{\fpeval{randint(\ListeInterlen)}}%
+ \xdef\faa{\faa\ListeInter[\Alea],}%
+ \xdef\fii{}%
+ \xintFor* ##2 in {\xintSeq{1}{\ListeInterlen}}\do{%
+ \xintifboolexpr{##2 == \Alea}{%
+ }{%
+ \xdef\fii{\fii \ListeInter[##2],}%
+ }%
+ }%
+ }{%
+ \xdef\faa{\faa\ListeInter[1]}%
+ }%
+ \readlist*\ListeInter{\fii}%
+ }%
+ }{%
+ \xintFor* ##1 in {\xintSeq{1}{#2}}\do{%
+ \xintifboolexpr{\ListeInterlen>1}{%
+ \xdef\Alea{\fpeval{randint(\ListeInterlen)}}%
+ \xdef\faa{\faa\ListeInter[\Alea]}%
+ \xdef\fii{}%
+ \xintFor* ##2 in {\xintSeq{1}{\ListeInterlen}}\do{%
+ \xintifboolexpr{##2 == \Alea}{%
+ }{%
+ \xdef\fii{\fii \ListeInter[##2],}%
+ }%
+ }%
+ }{%
+ \xdef\faa{\faa\ListeInter[1]}%
+ }%
+ \readlist*\ListeInter{\fii}%
+ }%
+ }%
+ \xdef#3{\faa}%
+}%
+
+\NewDocumentCommand\MelangeListe{smm}{%
+ \IfBooleanTF{#1}{%
+ %Si on cherche un seul élément, on peut l'utiliser directement
+ \MelangeListeOne{#2}{#3}%
+ }{%
+ \MelangeListeNoOne{#2}{#3}%
+ }%
+}
+
+\NewDocumentCommand\MelangeListeOne{mm}{%
+ % #1 Liste à mélanger
+ % #2 Nombre d'éléments à conserver
+ \setsepchar{,}\ignoreemptyitems%
+ \readlist*\ListeInter{#1}%
+ \xdef\faa{}% Liste construite
+ \xdef\fii{}% Liste détruite
+ % on crée les #2 premieres solutions.
+ \xintFor* ##1 in {\xintSeq{1}{#2}}\do{%
\xintifboolexpr{\ListeInterlen>1}{%
\xdef\Alea{\fpeval{randint(\ListeInterlen)}}%
- \xdef\faa{\faa\ListeInter[\Alea]}%
+ \ifnum\fpeval{##1}=1\relax
+ \xdef\faa{\ListeInter[\Alea]}%
+ \else
+ \xdef\faa{\faa,\ListeInter[\Alea]}%
+ \fi
\xdef\fii{}%
\xintFor* ##2 in {\xintSeq{1}{\ListeInterlen}}\do{%
\xintifboolexpr{##2 == \Alea}{%
@@ -527,14 +566,14 @@
}%
}%
}{%
- \xdef\faa{\faa\ListeInter[1]}%
+ \xdef\faa{\faa,\ListeInter[1]}%
}%
\readlist*\ListeInter{\fii}%
}%
- \xdef#2{\faa}%
+ \reademptyitems%
}%
-\newcommand\MelangeListe[2]{%
+\NewDocumentCommand\MelangeListeNoOne{mm}{%
% #1 Liste à mélanger
% #2 Nombre d'éléments à conserver
\setsepchar{,}\ignoreemptyitems%
@@ -787,6 +826,8 @@
\def\PfCSymbolTimes{\times}%
\def\PfCSymbolDiv{\div}%
+\input{PfCVisualisationMulDeci}
+\input{PfCArbreChiffre}
\input{PfCAssemblagesSolides}
\input{PfCTicketCaisse}
\input{PfCRecyclage}
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
index b2c61b2f61..000537a0d4 100644
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
+++ b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
deleted file mode 100644
index 34da7d98f8..0000000000
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
+++ /dev/null
@@ -1,314 +0,0 @@
-% !TeX TXS-program:compile = txs:///arara
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: pythontex: {rerun: always}
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
-
-\documentclass[a4paper,french,11pt]{article}
-\def\PLversion{3.03d}
-\def\PLdate{20 avril 2024}
-\usepackage{amsfonts}
-\usepackage{ProfLycee}
-\useproflyclib{piton,minted,pythontex,ecritures,espace}
-\usepackage[math-style=french]{fourier-otf}
-\usepackage{mathrsfs}%pour mathscr
-\usepackage{awesomebox}
-\usepackage[lua]{tkz-euclide}
-\usepackage{tkz-tab}
-\tikzstyle{every picture}+=[remember picture]
-\usetikzlibrary{hobby}
-\usepackage[group-minimum-digits=4]{siunitx}
-\sisetup{locale=FR}
-\usepackage{enumitem}
-\usepackage{fancyvrb}
-\usepackage{fancyhdr}
-\usepackage{tabularray}
-\usepackage{multicol}
-\DeclareMathSymbol{;}\mathbin{operators}{'73} %espacement avec ;
-%fancy
-\fancyhf{}
-\renewcommand{\headrulewidth}{0pt}
-\lfoot{\sffamily \small [ProfLycee]}
-\cfoot{\sffamily \small - \thepage{} -}
-\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
-
-\usepackage{graphics}
-\usepackage{hologo}
-\providecommand\tikzlogo{Ti\textit{k}Z}
-\providecommand\TeXLive{\TeX{}Live\xspace}
-\providecommand\PSTricks{\textsf{PSTricks}\xspace}
-\let\pstricks\PSTricks
-\let\TikZ\tikzlogo
-\newcommand\TableauDocumentation{%
- \begin{tblr}{width=\linewidth,colspec={X[c]X[c]X[c]X[c]X[c]X[c]},cells={font=\huge\sffamily}}
- {\LaTeX} & {\hologo{pdfLaTeX}} & {\hologo{LuaLaTeX}} & {\TikZ} & {\TeXLive} & {\hologo{MiKTeX}} \\
- \end{tblr}
-}
-\usepackage{simplekv}
-\usepackage{menukeys}
-\let\tab\relax
-\usepackage{tabto}
-\usepackage{pgf,pgfplots}
-\pgfplotsset{compat=newest,xlabel near ticks,ylabel near ticks}
-\usepackage{listofitems}
-\usepackage{xintexpr}
-\usepackage{codehigh}
-\usepackage{scontents}
-\usepackage{hyperref}
-\urlstyle{same}
-\hypersetup{pdfborder=0 0 0}
-\usepackage{geometry}
-\geometry{margin=1.5cm}
-\usepackage{babel}
-\usepackage{newverbs}
-
-\input{ProfLycee-doc-macropreamb.tex}
-
-\input{ProfLycee-doc-pagegarde.tex}
-
-\newpage
-
-\phantomsection
-\hypertarget{matoc}{}
-
-\tableofcontents
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Introduction}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-introduction.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Liste des commandes}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-listecommandes.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Écritures mathématiques}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-ecritures.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Outils pour l'analyse}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-outilsanalyse.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Outils graphiques}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-outilsgraphiques.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Présentation de codes}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-prescodes.tex}
-
-\pagebreak
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Outils pour la géométrie}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-outilsgeom.tex}
-
-\pagebreak
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Outils pour la géométrie analytique}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-outilsgeomanalyt.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Outils pour les statistiques}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-stats.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Outils pour les probabilités}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-probas.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Outils pour l'arithmétique}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-arithm.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Écritures, simplifications}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-simplif.tex}
-
-\pagebreak
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Jeux et récréations}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-jeuxrecreat.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Compétences en lycée}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-competences.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Examens}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-exams.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Projets, en test}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-projets.tex}
-
-\newpage
-
-\phantom{t}\par\vfill\par
-\begin{PART}
- \begin{center}
- \Huge\MakeUppercase{Historique}
- \end{center}
-\end{PART}
-\par\vfill\par\phantom{t}
-
-\newpage
-
-\input{ProfLycee-doc-historique.tex}
-
-\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.pdf b/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.pdf
index f8e331e0a6..5e6698109f 100644
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.pdf
+++ b/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.tex b/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.tex
deleted file mode 100644
index 03648eea0c..0000000000
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pyluatex.tex
+++ /dev/null
@@ -1,427 +0,0 @@
-% !TeX TXS-program:compile = txs:///arara
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode}
-% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
-
-\documentclass[french,a4paper,10pt]{article}
-\def\PLver{3.03c}
-\usepackage[margin=1.5cm]{geometry}
-\usepackage{ProfLycee}
-\useproflyclib{piton}
-\usepackage[executable=python,ignoreerrors]{pyluatex}
-\usepackage{babel}
-\sisetup{locale=FR,output-decimal-marker={,},group-minimum-digits=4}
-\usepackage{codehigh}
-
-\begin{document}
-
-\part*{ProfLycee (\PLver), Piton et Pyluatex}
-
-\section{Code \og Piton \fg{}, indépendant de Pyluatex}
-
-\subsection{Préambule basique}
-
-{\small \begin{codehigh}
-\documentclass[french,a4paper,10pt]{article}
-\usepackage{ProfLycee}
-\useproflyclib{piton} % lua
-\end{codehigh}}
-
-\subsection{Exemples}
-
-{\small \begin{codehigh}
-%Sortie par défaut
-\begin{CodePiton}{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-\end{codehigh}}
-
-\begin{CodePiton}{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-
-{\small \begin{codehigh}
-%Sortie avec style Classique, Largeur=10cm
-\begin{CodePiton}[Largeur=10cm]{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-\end{codehigh}}
-
-\begin{CodePiton}[Largeur=10cm]{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-
-\pagebreak
-
-{\small \begin{codehigh}
-%Sortie avec Style=Moderne, Sans Titre, Largeur=10cm, centré
-\begin{CodePiton}[Style=Moderne,Largeur=10cm,BarreTitre=false,Alignement=center]{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-\end{codehigh}}
-
-\begin{CodePiton}[Style=Moderne,Largeur=10cm,BarreTitre=false,Alignement=center]{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-
-{\small \begin{codehigh}
-%Sortie avec Style=Classique, Largeur=0.5\linewidth, aligné à droite, sans Cadre, avec Filigrane
-\begin{CodePiton}%
- [Largeur=0.5\linewidth,Cadre=false,Alignement=flush right,Filigrane,Titre={Script}]{}
-#environnement piton avec numéros de ligne, pleine largeur, style moderne
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-\end{codehigh}}
-
-\begin{CodePiton}[Largeur=0.5\linewidth,Cadre=false,Alignement=flush right,Filigrane,Titre={Script}]{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-
-{\small \begin{codehigh}
-%Sortie Moderne, Largeur=11cm, avec Filigrane, aligné à gauche, sans ligne
-\begin{CodePiton}[Style=Moderne,Largeur=11cm,Filigrane,Alignement=flush left,Lignes=false]{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-\end{codehigh}}
-
-\begin{CodePiton}[Style=Moderne,Largeur=11cm,Filigrane,Alignement=flush left,Lignes=false]{}
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{CodePiton}
-
-\pagebreak
-
-\section{Console \og Piton \fg{}, dépendant de Pyluatex}
-
-\subsection{Préambule, avec le package pyluatex}
-
-{\small \begin{codehigh}
-\documentclass[french,a4paper,10pt]{article}
-\usepackage{ProfLycee}
-\useproflyclib{piton}
-\usepackage[executable=python]{pyluatex} % lua + shell-escape
-\end{codehigh}}
-
-\subsection{Commande}
-
-{\small \begin{codehigh}
-\begin{ConsolePiton}[Options piton]<Clés>{Options tcbox}
-...
-...
-\end{ConsolePiton}
-\end{codehigh}}
-
-\medskip
-
-Les clés, à placer entre \texttt{<...>}, sont :
-
-\begin{itemize}
- \item \textbf{\textsf{$\langle$Logo$\rangle$}} pour afficher un petit logo dans les \textit{titres} de la console REPL ; \hfill{}défaut : \textbf{\textsf{$\langle$true$\rangle$}}
- \item \textbf{\textsf{$\langle$Largeur$\rangle$}} pour spécifier la largeur de la console REPL ; \hfill{}défaut : \textbf{\textsf{$\langle$\textbackslash{}linewidth$\rangle$}}
- \item \textbf{\textsf{$\langle$Alignement$\rangle$}} pour spécifier l'alignement de la console REPL.\hfill{}défaut : \textbf{\textsf{$\langle$flush left$\rangle$}}
-\end{itemize}
-
-\subsection{Exemples}
-
-{\small \begin{codehigh}
-%Déclaration d'une fonction python + librairie random pour utilisation ultérieure
-\begin{python}
-from random import randint
-
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{python}
-\end{codehigh}}
-
-\begin{python}
-from random import randint
-
-def valeur_absolue(x) :
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0 :
- return x
- else:
- return -x
-\end{python}
-
-{\small \begin{codehigh}
-\begin{ConsolePiton}{}
-1+1
-2**10
-valeur_absolue(-3)
-valeur_absolue(0)
-valeur_absolue(5)
-print(f"La valeur absolue de 5 est {valeur_absolue(5)}")
-print(f"La valeur absolue de -4 est {valeur_absolue(-4)}")
-\end{ConsolePiton}
-\end{codehigh}}
-
-\begin{ConsolePiton}{}
-1+1
-2**10
-valeur_absolue(-3)
-valeur_absolue(0)
-valeur_absolue(5)
-print(f"La valeur absolue de 5 est {valeur_absolue(5)}")
-print(f"La valeur absolue de -4 est {valeur_absolue(-4)}")
-\end{ConsolePiton}
-
-\pagebreak
-
-{\small \begin{codehigh}
-\begin{ConsolePiton}<Largeur=11cm,Alignement=center,Logo=false>{}
-1+1
-2**10
-valeur_absolue(-3)
-valeur_absolue(0)
-valeur_absolue(5)
-print(f"La valeur absolue de 5 est {valeur_absolue(5)}")
-print(f"La valeur absolue de -4 est {valeur_absolue(-4)}")
-liste = [randint(1,20) for i in range(10)]
-print(liste)
-print(max(liste), min(liste), sum(liste))
-\end{ConsolePiton}
-\end{codehigh}}
-
-\begin{ConsolePiton}<Largeur=11cm,Alignement=center,Logo=false>{}
-1+1
-2**10
-valeur_absolue(-3)
-valeur_absolue(0)
-valeur_absolue(5)
-print(f"La valeur absolue de 5 est {valeur_absolue(5)}")
-print(f"La valeur absolue de -4 est {valeur_absolue(-4)}")
-liste = [randint(1,20) for i in range(10)]
-print(liste)
-print(max(liste), min(liste), sum(liste))
-\end{ConsolePiton}
-
-{\small \begin{codehigh}
-\begin{ConsolePiton}<Largeur=10cm,Alignement=center>{}
-[i**2 for i in range(50)]
-\end{ConsolePiton}
-\end{codehigh}}
-
-\begin{ConsolePiton}<Largeur=10cm,Alignement=center>{}
-[i**2 for i in range(50)]
-\end{ConsolePiton}
-
-\pagebreak
-
-\section{Présentation, et exécution, comme avec Thonny}
-
-\subsection{Préambule, avec le package pyluatex}
-
-{\small \begin{codehigh}
-\documentclass[french,a4paper,10pt]{article}
-\usepackage{ProfLycee}
-\useproflyclib{piton}
-\usepackage[executable=python]{pyluatex} % lua + shell-escape
-\end{codehigh}}
-
-\subsection{Commandes}
-
-{\small \begin{codehigh}
-\begin{PitonThonnyEditor}<clé>[options tcbox]{largeur}
-...
-\end{PitonThonnyEditor}
-\end{codehigh}}
-
-\medskip
-
-La clé, à placer entre \texttt{<...>}, est :
-
-\begin{itemize}
- \item la clé \textbf{\textsf{$\langle$Gobble$\rangle$}} pour spécifier des options liées au \textsf{gobble}, parmi \textbf{\textsf{$\langle$nb/auto$\rangle$}} ;
-
- \hfill{}à adapter en fonction des situations (!)
- \item la clé \textbf{\textsf{$\langle$NomFichier$\rangle$}} pour afficher le nom du fichier dans le cartouche \textit{éditeur}.
-
- \hfill{}défaut : \textbf{\textsf{$\langle$script.py$\rangle$}}
-\end{itemize}
-
-{\small \begin{codehigh}
-\begin{PitonThonnyConsole}<clés>[options tcbox]{largeur}
-...
-\end{PitonThonnyConsole}
-\end{codehigh}}
-
-\medskip
-
-Les clés, à placer entre \texttt{<...>}, sont :
-
-\begin{itemize}
- \item la clé \textbf{\textsf{$\langle$NomConsole$\rangle$}} pour afficher le nom de la \textit{console} ; \hfill{}défaut \textbf{\textsf{$\langle$console$\rangle$}}
- \item la clé \textbf{\textsf{$\langle$IntroConsole$\rangle$}} pour afficher le message d'accueil de la console.
-\end{itemize}
-
-\subsection{Exemples}
-
-{\small\begin{codehigh}
-\begin{python}
-from math import gcd
-
-def est_duffy(n) :
- nb_div, somme_div = 0, 0
- for i in range(1, n+1) :
- if n % i == 0 :
- nb_div += 1
- somme_div += i
- if gcd(somme_div, n) == 1 :
- return True
- else :
- return False
-
-\end{python}
-\end{codehigh}}
-
-{\small\begin{codehigh}
-\begin{PitonThonnyEditor}<NomFichier=tpcapytale.py>{12cm}
-#PROJET CAPYTALE
-from math import gcd
-
-def est_duffy(n) :
- nb_div = 0
- somme_div = 0
- for i in range(1, n+1) :
- if n % i == 0 :
- nb_div += 1
- somme_div += i
- if gcd(somme_div, n) == 1 :
- return True
- else :
- return False
-\end{PitonThonnyEditor}
-\end{codehigh}}
-
-\begin{PitonThonnyEditor}<NomFichier=tpcapytale.py>{12cm}
-#PROJET CAPYTALE
-from math import gcd
-
-def est_duffy(n) :
- nb_div = 0
- somme_div = 0
- for i in range(1, n+1) :
- if n % i == 0 :
- nb_div += 1
- somme_div += i
- if gcd(somme_div, n) == 1 :
- return True
- else :
- return False
-\end{PitonThonnyEditor}
-
-{\small\begin{codehigh}
-\begin{PitonThonnyConsole}<IntroConsole={python 3.8.10}>{12cm}
-#Run tpcapytale.py
-est_duffy(6)
-est_duffy(13)
-est_duffy(265)
-
-from random import randint
-nb = randint(1,100000)
-nb, est_duffy(nb)
-\end{PitonThonnyConsole}
-\end{codehigh}}
-
-\begin{python}
-from math import gcd
-
-def est_duffy(n) :
- nb_div, somme_div = 0, 0
- for i in range(1, n+1) :
- if n % i == 0 :
- nb_div += 1
- somme_div += i
- if gcd(somme_div, n) == 1 :
- return True
- else :
- return False
-
-\end{python}
-\begin{PitonThonnyConsole}<IntroConsole={python 3.8.10}>{12cm}
-#Run tpcapytale.py
-est_duffy(6)
-est_duffy(13)
-est_duffy(265)
-
-from random import randint
-nb = randint(1,100000)
-nb, est_duffy(nb)
-\end{PitonThonnyConsole}
-
-{\small\begin{codehigh}
-\begin{PitonThonnyConsole}{8cm}
-[i**2 for i in range(50)]
-\end{PitonThonnyConsole}
-\end{codehigh}}
-
-\begin{PitonThonnyConsole}{8cm}
-[i**2 for i in range(50)]
-\end{PitonThonnyConsole}
-
-\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pythontex.tex b/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pythontex.tex
deleted file mode 100644
index e418300cae..0000000000
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-exemples-pythontex.tex
+++ /dev/null
@@ -1,242 +0,0 @@
-% !TeX TXS-program:compile = txs:///arara
-% arara: lualatex: {shell: no, synctex: yes, interaction: batchmode}
-% arara: pythontex: {rerun: always} if found('pytxcode', 'PYTHONTEX#py')
-% arara: lualatex: {shell: no, synctex: yes, interaction: batchmode} if found('pytxcode', 'PYTHONTEX#py')
-% arara: lualatex: {shell: no, synctex: yes, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
-
-\documentclass[french,a4paper,10pt]{article}
-\def\PLver{2.7.5}
-\usepackage[margin=1.5cm]{geometry}
-\usepackage{ProfLycee}
-\useproflyclib{pythontex}
-\usepackage{babel}
-\sisetup{locale=FR,output-decimal-marker={,},group-minimum-digits=4}
-\usepackage{codehigh}
-
-\begin{document}
-
-\part*{ProfLycee (\PLver), Pythontex}
-
-\section{Code \og Pythontex \fg{}}
-
-\subsection{Préambule basique}
-
-{\small \begin{codehigh}
-\documentclass[french,a4paper,10pt]{article}
-\usepackage{ProfLycee}
-\useproflyclib{pythontex} % compilation spécifique
-\end{codehigh}}
-
-\subsection{Exemples}
-
-{\small \begin{codehigh}
-%Sortie par défaut
-\begin{CodePythontex}{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-\end{CodePythontex}
-\end{codehigh}}
-
-\begin{CodePythontex}{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-
-#bla
-#bla
-#bla
-\end{CodePythontex}
-
-{\small \begin{codehigh}
-%Sortie avec Style=Classique, Largeur=10cm, centré
-\begin{CodePythontexAlt}[Largeur=10cm,Centre,PremLigne=10]{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-\end{CodePythontexAlt}
-\end{codehigh}}
-
-\begin{CodePythontexAlt}[Largeur=10cm,Centre,PremLigne=10]{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-
-#bla
-#bla
-#bla
-\end{CodePythontexAlt}
-
-\pagebreak
-
-{\small \begin{codehigh}
-%Sortie avec Style=Classique, Largeur=10cm
-\begin{CodePythontexAlt}[Largeur=10cm]{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-\end{CodePythontexAlt}
-\end{codehigh}}
-
-\begin{CodePythontexAlt}[Largeur=10cm]{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-\end{CodePythontexAlt}
-
-{\small \begin{codehigh}
-%Sortie avec Style=Classique, Largeur=0.5\linewidth, centré, sans numéro
-\begin{CodePythontexAlt}[Largeur=0.5\linewidth,Centre,Lignes=false]{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-\end{CodePythontexAlt}
-\end{codehigh}}
-
-\begin{CodePythontexAlt}[Largeur=0.5\linewidth,Centre,Lignes=false]{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-\end{CodePythontexAlt}
-
-{\small \begin{codehigh}
-%Sortie Moderne, Largeur=11cm, sans ligne
-\begin{CodePythontex}[Largeur=11cm,Lignes=false]{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-\end{CodePythontex}
-\end{codehigh}}
-
-\begin{CodePythontex}[Largeur=11cm,Lignes=false]{}
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-\end{CodePythontex}
-
-\pagebreak
-
-\section{Console \og Pythontex \fg{}}
-
-{\small \begin{codehigh}
-%Déclaration d'une fonction python + librairie random pour utilisation ultérieure
-\begin{pyconcode}
-from random import randint
-
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-
-\end{pyconcode}
-\end{codehigh}}
-
-\begin{pyconcode}
-from random import randint
-
-def valeur_absolue(x):
- "Renvoie la valeur absolue de x"
- #le petit test qui va bien
- if x > 0:
- return x
- else:
- return -x
-
-\end{pyconcode}
-
-{\small \begin{codehigh}
-\begin{ConsolePythontex}{}
-1+1
-2**10
-valeur_absolue(-3)
-valeur_absolue(0)
-valeur_absolue(5)
-print(f"La valeur absolue de 5 est {valeur_absolue(5)}")
-print(f"La valeur absolue de -4 est {valeur_absolue(-4)}")
-\end{ConsolePythontex}
-\end{codehigh}}
-
-\begin{ConsolePythontex}{}
-1+1
-2**10
-valeur_absolue(-3)
-valeur_absolue(0)
-valeur_absolue(5)
-print(f"La valeur absolue de 5 est {valeur_absolue(5)}")
-print(f"La valeur absolue de -4 est {valeur_absolue(-4)}")
-\end{ConsolePythontex}
-
-\pagebreak
-
-{\small \begin{codehigh}
-\begin{ConsolePythontex}[Largeur=12cm,Centre]{}
-1+1
-2**10
-valeur_absolue(-3)
-valeur_absolue(0)
-valeur_absolue(5)
-print(f"La valeur absolue de 5 est {valeur_absolue(5)}")
-print(f"La valeur absolue de -4 est {valeur_absolue(-4)}")
-liste = [randint(1,20) for i in range(10)]
-print(liste)
-print(max(liste), min(liste), sum(liste))
-\end{ConsolePythontex}
-\end{codehigh}}
-
-\begin{ConsolePythontex}[Largeur=12cm,Centre]{}
-1+1
-2**10
-valeur_absolue(-3)
-valeur_absolue(0)
-valeur_absolue(5)
-print(f"La valeur absolue de 5 est {valeur_absolue(5)}")
-print(f"La valeur absolue de -4 est {valeur_absolue(-4)}")
-liste = [randint(1,20) for i in range(10)]
-print(liste)
-print(max(liste), min(liste), sum(liste))
-\end{ConsolePythontex}
-
-\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/proflycee/tex/ProfLycee.sty b/macros/latex/contrib/proflycee/tex/ProfLycee.sty
index 25a212e65a..f622238309 100644
--- a/macros/latex/contrib/proflycee/tex/ProfLycee.sty
+++ b/macros/latex/contrib/proflycee/tex/ProfLycee.sty
@@ -3,7 +3,9 @@
% or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{ProfLycee}[2024/04/20 3.03d Aide pour l'utilisation de LaTeX en lycee]
+\ProvidesPackage{ProfLycee}[2024/05/09 3.04b Aide pour l'utilisation de LaTeX en lycee]
+% 3.04b Travail sur la loi binomiale + Ajout de clés pour les environnements graphiques
+% 3.04a Améliorations de la partie graphiques tikz (intégrales, axes) + Factorielle
% 3.03d Page de garde type BAC
% 3.03c Correction du fonctionnement gobble avec piton + compatibilité luamplib PfC
% 3.03b Compétences Maths Lycées + \pflnum pour num+xint :-) + correction de bugs (div eucl)
diff --git a/macros/latex/contrib/proflycee/tex/proflycee-tools-aleatoire.tex b/macros/latex/contrib/proflycee/tex/proflycee-tools-aleatoire.tex
index 19d13ab932..4d4a50eca3 100644
--- a/macros/latex/contrib/proflycee/tex/proflycee-tools-aleatoire.tex
+++ b/macros/latex/contrib/proflycee/tex/proflycee-tools-aleatoire.tex
@@ -85,8 +85,18 @@
\newcommand\NbAlea[4][0]{%entier ou décimal
\xintifboolexpr{#1 == 0}%
- {\xdef#4{\fpeval{randint(#2,#3)}}}%
- {\xdef#4{\fpeval{round(randint(#2,#3)+rand(),#1)}}}%
+ {%
+ \xdef#4{\fpeval{randint(#2,#3)}}%
+ }%
+ {%
+ \xintifboolexpr{(#3-#2) == 1}%
+ {%
+ \xdef#4{\fpeval{round(#2+rand(),#1)}}%
+ }%
+ {%
+ \xdef#4{\fpeval{round(randint(#2,#3)+rand(),#1)}}%
+ }%
+ }%
}
\newcommand\VarNbAlea[2]{%
\xdef#1{\fpeval{#2}}%
diff --git a/macros/latex/contrib/proflycee/tex/proflycee-tools-analyse.tex b/macros/latex/contrib/proflycee/tex/proflycee-tools-analyse.tex
index 5e1f246ab3..ade88434c2 100644
--- a/macros/latex/contrib/proflycee/tex/proflycee-tools-analyse.tex
+++ b/macros/latex/contrib/proflycee/tex/proflycee-tools-analyse.tex
@@ -574,6 +574,36 @@
}%
}
+%===intégrale 'brute'
+\NewDocumentCommand\CalcIntegrale{ s O{} D<>{50} m m m }{%
+ \xintdeffloatfunc varfct(x) := #4 ;%
+ \def\TmpNmU{\xinteval{(#3)-1}}%
+ \def\TmpRes{\xintfloateval{(#6-#5)/(6*(#3))*(2*add(varfct(#5+i*(#6-#5)/(#3)),i=1..\TmpNmU)+varfct(#5)+varfct(#6)+4*add(varfct(#5+(i+0.5)*(#6-#5)/(#3)), i=0..\TmpNmU))}}%
+ \IfStrEq{#2}{}%
+ {%
+ \IfBooleanTF{#1}{\num{\TmpRes}}{\TmpRes}%
+ }%
+ {%
+ \IfBooleanTF{#1}{\num{\xintfloateval{round(\TmpRes,#2)}}}{\xintfloateval{round(\TmpRes,#2)}}%
+ }%
+ \relax
+}
+
+%===intégrale 'brute'
+\NewDocumentCommand\ValeurMoyenneIntg{ s O{} D<>{50} m m m }{%
+ \xintdeffloatfunc varfct(x) := #4 ;%
+ \def\TmpNmU{\xinteval{(#3)-1}}%
+ \def\TmpRes{\xintfloateval{(1)/(6*(#3))*(2*add(varfct(#5+i*(#6-#5)/(#3)),i=1..\TmpNmU)+varfct(#5)+varfct(#6)+4*add(varfct(#5+(i+0.5)*(#6-#5)/(#3)), i=0..\TmpNmU))}}%
+ \IfStrEq{#2}{}%
+ {%
+ \IfBooleanTF{#1}{\num{\TmpRes}}{\TmpRes}%
+ }%
+ {%
+ \IfBooleanTF{#1}{\num{\xintfloateval{round(\TmpRes,#2)}}}{\xintfloateval{round(\TmpRes,#2)}}%
+ }%
+ \relax
+}
+
%==intégrale tikz==
\defKV[methodeintegrtkz]{%
diff --git a/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex b/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex
index db3f2bc8ac..a021fea937 100644
--- a/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex
+++ b/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex
@@ -1512,4 +1512,394 @@
{}%
}
+%====FACTORIELLE
+\defKV[calcfactorielle]{ChSignif=\def\factochfsign{#1},Sens=\def\factochfsens{#1}}
+\setKVdefault[calcfactorielle]{%
+ Complet=false,%
+ Enonce=false,%
+ Partiel=false,%
+ Grand=false,%
+ ChSignif=9,%
+ Espace=\mkern1.5mu\relax,%
+ Sens=m
+}
+
+\NewDocumentCommand\Factorielle{ s O{} m }{%
+ \restoreKV[calcfactorielle]%
+ \setKV[calcfactorielle]{#2}%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \xdef\tmpres{\xintfloateval[\factochfsign]{factorial(#3)}}%
+ }%
+ {%
+ \xdef\tmpres{\xinteval{factorial(#3)}}%
+ }%
+ \ensuremath{%
+ \ifboolKV[calcfactorielle]{Enonce}%
+ {%
+ \IfBooleanTF{#1}{#3\useKV[calcfactorielle]{Espace}!}{\num{#3}\useKV[calcfactorielle]{Espace}!}=
+ }%
+ {}%
+ \ifboolKV[calcfactorielle]{Partiel}%
+ {%
+ \IfBooleanTF{#1}%
+ {%
+ \IfStrEqCase{\factochfsens}{%
+ {m}{1 \times 2 \times \ldots \times \xinteval{#3-1} \times #3 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ {d}{#3 \times \xinteval{#3-1} \times \ldots \times 2 \times 1 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ }%
+ }%
+ {%
+ \IfStrEqCase{\factochfsens}{%
+ {m}{1 \times 2 \times \ldots \times \num{\xinteval{#3-1}} \times \num{#3} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ {d}{\num{#3} \times \num{\xinteval{#3-1}} \times \ldots \times 2 \times 1 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ }%
+ }%
+ }%
+ {}%
+ \ifboolKV[calcfactorielle]{Complet}%
+ {%
+ \IfBooleanTF{#1}%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ 1 \xintFor* ##1 in {\xintSeq{2}{#3}}\do{\times ##1} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{2}}\do{##1 \times} 1 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ }%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ 1 \xintFor* ##1 in {\xintSeq{2}{#3}}\do{\times \num{##1}} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{2}}\do{\num{##1} \times} 1 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ }%
+ }%
+ {}%
+ \IfBooleanTF{#1}%
+ {%
+ \tmpres%
+ }%
+ {%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \num[scientific-notation=true]{\tmpres}%
+ }%
+ {%
+ \num{\tmpres}%
+ }%
+ }%
+ }%
+}
+
+\NewDocumentCommand\Primorielle{ s O{} m }{%
+ \restoreKV[calcfactorielle]%
+ \setKV[calcfactorielle]{#2}%
+ \def\tmpres{1}%
+ \xintFor* ##1 in {\xintSeq{1}{#3}}\do{%
+ \pgfmathisprime{##1}\ifnum\pgfmathresult=1\xdef\tmpres{\xinteval{\tmpres*##1}}\fi%
+ }%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \xdef\tmpres{\xintfloateval[\factochfsign]{\tmpres}}%
+ }%
+ {}%
+ \ensuremath{%
+ \ifboolKV[calcfactorielle]{Enonce}%
+ {%
+ \IfBooleanTF{#1}{#3\#}{\num{#3}\#}=
+ }%
+ {}%
+ \ifboolKV[calcfactorielle]{Complet}%
+ {%
+ \IfBooleanTF{#1}%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ 2 \xintFor* ##1 in {\xintSeq{3}{#3}}\do{\pgfmathisprime{##1}\ifnum\pgfmathresult=1\times##1\fi} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{3}}\do{\pgfmathisprime{##1}\ifnum\pgfmathresult=1##1\times\fi} 2 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ }%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ 2 \xintFor* ##1 in {\xintSeq{3}{#3}}\do{\pgfmathisprime{##1}\ifnum\pgfmathresult=1\times\num{##1}\fi} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{3}}\do{\pgfmathisprime{##1}\ifnum\pgfmathresult=1\num{##1}\times\fi} 2 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ }%
+ }%
+ {}%
+ \IfBooleanTF{#1}%
+ {%
+ \tmpres%
+ }%
+ {%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \num[scientific-notation=true]{\tmpres}%
+ }%
+ {%
+ \num{\tmpres}%
+ }%
+ }%
+ }%
+}
+
+\NewDocumentCommand\DoubleFactorielle{ s O{} m }{%
+ \restoreKV[calcfactorielle]%
+ \setKV[calcfactorielle]{#2}%
+ \def\tmpres{1}%
+ \xintFor* ##1 in {\xintSeq{1}{#3}}\do{%
+ \xintifboolexpr{\xintiiOdd{#3} == \xintiiOdd{##1} 'or' \xintiiEven{#3} == \xintiiEven{##1}}%
+ {%
+ \xdef\tmpres{\xinteval{\tmpres*##1}}%
+ }%
+ {}%
+ }%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \xdef\tmpres{\xintfloateval[\factochfsign]{\tmpres}}%
+ }%
+ {}%
+ \ensuremath{%
+ \ifboolKV[calcfactorielle]{Enonce}%
+ {%
+ \IfBooleanTF{#1}{#3\useKV[calcfactorielle]{Espace}!!}{\num{#3}\useKV[calcfactorielle]{Espace}!!}=
+ }%
+ {}%
+ \ifboolKV[calcfactorielle]{Complet}%
+ {%
+ \IfBooleanTF{#1}%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ \xintifboolexpr{\xintiiOdd{#3} == 1}%
+ {%
+ 1 \xintFor* ##1 in {\xintSeq{3}{#3}}\do{%
+ \xintifboolexpr{\xintiiOdd{##1} == 1}{\times##1}{}%
+ }%
+ }%
+ {%
+ 2 \xintFor* ##1 in {\xintSeq{3}{#3}}\do{%
+ \xintifboolexpr{\xintiiOdd{##1} != 1}{\times##1}{}%
+ }%
+ }%
+ \ifboolKV[calcfactorielle]{Grand}{\approx}{=}%
+ }%
+ {%
+ \xintifboolexpr{\xintiiOdd{#3} == 1}%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{3}}\do{%
+ \xintifboolexpr{\xintiiOdd{##1} == 1}{##1\times}{}%
+ }1%
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{3}}\do{%
+ \xintifboolexpr{\xintiiOdd{##1} != 1}{##1\times}{}%
+ }2%
+ }%
+ \ifboolKV[calcfactorielle]{Grand}{\approx}{=}%
+ }%
+ }%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ \xintifboolexpr{\xintiiOdd{#3} == 1}%
+ {%
+ 1 \xintFor* ##1 in {\xintSeq{3}{#3}}\do{%
+ \xintifboolexpr{\xintiiOdd{##1} == 1}{\times\num{##1}}{}%
+ }%
+ }%
+ {%
+ 2 \xintFor* ##1 in {\xintSeq{3}{#3}}\do{%
+ \xintifboolexpr{\xintiiOdd{##1} != 1}{\times\num{##1}}{}%
+ }%
+ }%
+ \ifboolKV[calcfactorielle]{Grand}{\approx}{=}%
+ }%
+ {%
+ \xintifboolexpr{\xintiiOdd{#3} == 1}%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{3}}\do{%
+ \xintifboolexpr{\xintiiOdd{##1} == 1}{\num{##1}\times}{}%
+ }1%
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{3}}\do{%
+ \xintifboolexpr{\xintiiOdd{##1} != 1}{\num{##1}\times}{}%
+ }2%
+ }%
+ \ifboolKV[calcfactorielle]{Grand}{\approx}{=}%
+ }%
+ }%
+ }%
+ {}%
+ \IfBooleanTF{#1}%
+ {%
+ \tmpres%
+ }%
+ {%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \num[scientific-notation=true]{\tmpres}%
+ }%
+ {%
+ \num{\tmpres}%
+ }%
+ }%
+ }%
+}
+
+\NewDocumentCommand\HyperFactorielle{ s O{} m }{%
+ \restoreKV[calcfactorielle]%
+ \setKV[calcfactorielle]{#2}%
+ \def\tmpres{1}%
+ \xintFor* ##1 in {\xintSeq{2}{#3}}\do{\xdef\tmpres{\xinteval{\tmpres*(##1)^(##1)}}}%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \xdef\tmpres{\xintfloateval[\factochfsign]{\tmpres}}%
+ }%
+ {}%
+ \ensuremath{%
+ \ifboolKV[calcfactorielle]{Enonce}%
+ {%
+ \IfBooleanTF{#1}{\text{H}(#3)}{\text{H}(\rm{#3})}=
+ }%
+ {}%
+ \ifboolKV[calcfactorielle]{Partiel}%
+ {%
+ \IfBooleanTF{#1}%
+ {%
+ \IfStrEqCase{\factochfsens}{%
+ {m}{1^1 \times 2^2 \times \ldots \times \xinteval{#3-1}^{\xinteval{#3-1}} \times #3^{#3} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ {d}{#3^{#3} \times \xinteval{#3-1}^{\xinteval{#3-1}} \times \ldots \times 2^2 \times 1^1 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ }%
+ }%
+ {%
+ \IfStrEqCase{\factochfsens}{%
+ {m}{1 \times 2 \times \ldots \times \num{\xinteval{#3-1}}^{\num{\xinteval{#3-1}}} \times \num{#3}^{\num{#3}} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ {d}{\num{#3}^{\num{#3}} \times \num{\xinteval{#3-1}}^{\num{\xinteval{#3-1}}} \times \ldots \times 2^2 \times 1^1 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ }%
+ }%
+ }%
+ {}%
+ \ifboolKV[calcfactorielle]{Complet}%
+ {%
+ \IfBooleanTF{#1}%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ 1^1 \xintFor* ##1 in {\xintSeq{2}{#3}}\do{\times ##1^{##1}} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{2}}\do{##1^{##1} \times} 1^1 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ }%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ 1^1 \xintFor* ##1 in {\xintSeq{2}{#3}}\do{\times \num{##1}^{\num{##1}}} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{2}}\do{\num{##1}^{\num{##1}} \times} 1^1 \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ }%
+ }%
+ {}%
+ \IfBooleanTF{#1}%
+ {%
+ \tmpres%
+ }%
+ {%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \num[scientific-notation=true]{\tmpres}%
+ }%
+ {%
+ \num{\tmpres}%
+ }%
+ }%
+ }%
+}
+
+\NewDocumentCommand\SuperFactorielle{ s O{} m }{%
+ \restoreKV[calcfactorielle]%
+ \setKV[calcfactorielle]{#2}%
+ \def\tmpres{1}%
+ \xintFor* ##1 in {\xintSeq{2}{#3}}\do{\xdef\tmpres{\xinteval{\tmpres*factorial(##1)}}}%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \xdef\tmpres{\xintfloateval[\factochfsign]{\tmpres}}%
+ }%
+ {}%
+ \ensuremath{%
+ \ifboolKV[calcfactorielle]{Enonce}%
+ {%
+ \IfBooleanTF{#1}{\text{sf}(#3)}{\text{sf}(\num{#3})}=
+ }%
+ {}%
+ \ifboolKV[calcfactorielle]{Partiel}%
+ {%
+ \IfBooleanTF{#1}%
+ {%
+ \IfStrEqCase{\factochfsens}{%
+ {m}{1\useKV[calcfactorielle]{Espace}! \times 2\useKV[calcfactorielle]{Espace}! \times \ldots \times \xinteval{#3-1}\useKV[calcfactorielle]{Espace}! \times #3\useKV[calcfactorielle]{Espace}! \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ {d}{#3\useKV[calcfactorielle]{Espace}! \times \xinteval{#3-1}\useKV[calcfactorielle]{Espace}! \times \ldots \times 2\useKV[calcfactorielle]{Espace}! \times 1\useKV[calcfactorielle]{Espace}! \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ }%
+ }%
+ {%
+ \IfStrEqCase{\factochfsens}{%
+ {m}{1\useKV[calcfactorielle]{Espace}! \times 2\useKV[calcfactorielle]{Espace}! \times \ldots \times \num{\xinteval{#3-1}}\useKV[calcfactorielle]{Espace}! \times \num{#3}\useKV[calcfactorielle]{Espace}! \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ {d}{\num{#3}\useKV[calcfactorielle]{Espace}! \times \num{\xinteval{#3-1}}\useKV[calcfactorielle]{Espace}! \times \ldots \times 2\useKV[calcfactorielle]{Espace}! \times 1\useKV[calcfactorielle]{Espace}! \ifboolKV[calcfactorielle]{Grand}{\approx}{=}}%
+ }%
+ }%
+ }%
+ {}%
+ \ifboolKV[calcfactorielle]{Complet}%
+ {%
+ \IfBooleanTF{#1}%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ 1\useKV[calcfactorielle]{Espace}! \xintFor* ##1 in {\xintSeq{2}{#3}}\do{\times ##1\useKV[calcfactorielle]{Espace}!} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{2}}\do{##1\useKV[calcfactorielle]{Espace}! \times} 1\useKV[calcfactorielle]{Espace}! \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ }%
+ {%
+ \IfStrEq{\factochfsens}{m}%
+ {%
+ 1\useKV[calcfactorielle]{Espace}! \xintFor* ##1 in {\xintSeq{2}{#3}}\do{\times \num{##1}\useKV[calcfactorielle]{Espace}!} \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ {%
+ \xintFor* ##1 in {\xintSeq{#3}{2}}\do{\num{##1}\useKV[calcfactorielle]{Espace}! \times} 1\useKV[calcfactorielle]{Espace}! \ifboolKV[calcfactorielle]{Grand}{\approx}{=}
+ }%
+ }%
+ }%
+ {}%
+ \IfBooleanTF{#1}%
+ {%
+ \tmpres%
+ }%
+ {%
+ \ifboolKV[calcfactorielle]{Grand}%
+ {%
+ \num[scientific-notation=true]{\tmpres}%
+ }%
+ {%
+ \num{\tmpres}%
+ }%
+ }%
+ }%
+}
+
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex b/macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex
index 22775038e7..74a3e827ed 100644
--- a/macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex
+++ b/macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex
@@ -36,7 +36,7 @@
}
\NewDocumentCommand\PtsDiscontinuite{ O{} m }{%
- \useKVdefault[ptdiscont]
+ \restoreKV[ptdiscont]
\setKV[ptdiscont]{#1}%
\setsepchar[.]{§./}%
\readlist*\SPLlisteDiscont{#2}%
@@ -101,7 +101,7 @@
%1=liste
%2=num point début
%3=num point fin
- \useKVdefault[genspline]%
+ \restoreKV[genspline]%
\setKV[genspline]{#1}%
\setsepchar[.]{§./}%
\readlist*\SPLlistepoints{#2}%
@@ -156,7 +156,7 @@
\NewDocumentCommand\SplineTikz{ O{} m }{%
%\newcommand\SplineTikz[2][]{%
- \useKVdefault[spline]
+ \restoreKV[spline]
\setKV[spline]{#1}% on paramètres les nouvelles clés et on les simplifie
%on lit la liste des points/nbderivés et on stocke dans \listepoints
\setsepchar[.]{§./}%
@@ -219,7 +219,7 @@
}
\newcommand\TangenteTikz[2][]{%
- \useKVdefault[tgte]%
+ \restoreKV[tgte]%
\setKV[tgte]{#1}% on paramètres les nouvelles clés et on les simplifie
\setsepchar[.]{§./}%
\readlist*\TGTlistepoints{#2}%
@@ -308,26 +308,36 @@
}
\DeclareDocumentCommand\AxexTikz{ O{} m }{%
- \useKVdefault[PLaxextkz]
+ \restoreKV[PLaxextkz]
\setKV[PLaxextkz]{#1}% on paramètres les nouvelles clés et on les simplifie
%récupération des tickwidth H/B
\IfSubStr{\axextickwidth}{/}
{\StrCut{\axextickwidth}{/}{\axextickwidthA}{\axextickwidthB}}
{\def\axextickwidthA{\axextickwidth}\def\axextickwidthB{\axextickwidth}}
+ %====test====
+ \IfEq{#2}{auto}%
+ {%
+ \xdef\tmprangexvalues{\xintfloateval{seq(i,i=\xmin..[\xgrille]..\xmax)}}\StrDel{\tmprangexvalues}{ }[\tmprangexvalues]%
+ \setKV[PLaxextkz]{Trigo=false}%
+ }%
+ {%
+ \xdef\tmprangexvalues{#2}%
+ }%
+ %====fintest=
%en fonction de Trigo ou non
\ifboolKV[PLaxextkz]{Trigo}
- {
- \foreach \x in {#2}{%
+ {%
+ \foreach \x in \tmprangexvalues {%
\draw[line width=\axexwidth] ({\x-\axexOx},{\axextickwidthA}) -- ({\x-\axexOx},{-\axextickwidthB})%
\ifboolKV[PLaxextkz]{AffGrad}%on affiche les graduations
{%
node[\axexposlabel,font=\axexfont] {\ifboolKV[PLaxextkz]{Dfrac}{$\AffAngleRadian*{\x}$}{$\AffAngleRadian{\x}$}}
}%
{}%
- ;}
- }
- {
- \foreach \x in {#2}{%
+ ;}%
+ }%
+ {%
+ \foreach \x in \tmprangexvalues {%
\draw[line width=\axexwidth] ({\x-\axexOx},{\axextickwidthA}) -- ({\x-\axexOx},{-\axextickwidthB})%
\ifboolKV[PLaxextkz]{AffGrad}%on affiche les graduations
{%
@@ -336,16 +346,16 @@
{\ifboolKV[PLaxextkz]{Annee}%
{\num[group-digits=none]{\x}}%
{\num[text-family-to-math=true,text-series-to-math=true]{\x}}%
- }
- }
+ }%
+ }%
{\xintifboolexpr{\x==\axexOx}{}{node[\axexposlabel,font=\axexfont] {\ifboolKV[PLaxextkz]{Annee}%
{\num[group-digits=none]{\x}}%
{\num[text-family-to-math=true,text-series-to-math=true]{\x}}%
- }
- }
- }
- }
- {}
+ }%
+ }%
+ }%
+ }%
+ {}%
;}
}
@@ -371,26 +381,36 @@
}
\DeclareDocumentCommand\AxeyTikz{ O{} m }{%
- \useKVdefault[PLaxeytkz]
+ \restoreKV[PLaxeytkz]
\setKV[PLaxeytkz]{#1}% on paramètres les nouvelles clés et on les simplifie
\IfSubStr{\axeytickwidth}{/}
- {\StrCut{\axeytickwidth}{/}{\axeytickwidthA}{\axeytickwidthB}}
- {\def\axeytickwidthA{\axeytickwidth}\def\axeytickwidthB{\axeytickwidth}}
+ {\StrCut{\axeytickwidth}{/}{\axeytickwidthA}{\axeytickwidthB}}
+ {\def\axeytickwidthA{\axeytickwidth}\def\axeytickwidthB{\axeytickwidth}}
+ %====test====
+ \IfEq{#2}{auto}%
+ {%
+ \xdef\tmprangeyvalues{\xintfloateval{seq(i,i=\ymin..[\ygrille]..\ymax)}}\StrDel{\tmprangeyvalues}{ }[\tmprangeyvalues]%
+ }%
+ {%
+ \xdef\tmprangeyvalues{#2}%
+ }%
+ %====fintest=
+
\ifboolKV[PLaxeytkz]{Frac}%
{%
\ifboolKV[PLaxeytkz]{AffGrad}%on affiche les graduations
{%
- \foreach \y in {#2}
+ \foreach \y in \tmprangeyvalues
{\draw[line width=\axeywidth] ({\axeytickwidthA},{\y-\axeyOy}) -- ({-\axeytickwidthB},{\y-\axeyOy}) %
\xintifboolexpr{\y==\axeyOy}{}{node[\axeyposlabel,font=\axeyfont] {\ConversionFraction{\y}}} ;}
}%
{%
- \foreach \y in {#2}
+ \foreach \y in \tmprangeyvalues
{\draw[line width=\axeywidth] ({\axeytickwidthA},{\y-\axeyOy}) -- ({-\axeytickwidthB},{\y-\axeyOy}) ;}
}%
}%
{%
- \foreach \y in {#2}{%
+ \foreach \y in \tmprangeyvalues {%
\draw[line width=\axeywidth] ({\axeytickwidthA},{\y-\axeyOy}) -- ({-\axeytickwidthB},{\y-\axeyOy})%
\ifboolKV[PLaxeytkz]{AffGrad}%on affiche les graduations
{%
@@ -414,6 +434,12 @@
}%
}
+%axesOxoy
+\DeclareDocumentCommand\AxexyTikz{ O{} O{} m m }{%
+ \AxexTikz[#1]{#3}
+ \AxeyTikz[#2]{#4}
+}
+
%axes
\defKV[PLaxestkz]{%
Epaisseur=\def\axeswidth{#1},%
@@ -444,7 +470,7 @@
}
\DeclareDocumentCommand\AxesTikz{ O{} }{%
- \useKVdefault[PLaxestkz]
+ \restoreKV[PLaxestkz]
\setKV[PLaxestkz]{#1}%
%les petits élargissements
\IfSubStr{\axeselargx}{/}
@@ -490,7 +516,7 @@
}
\DeclareDocumentCommand\OrigineTikz{ O{} }{%
- \useKVdefault[PLaxesorig]%
+ \restoreKV[PLaxesorig]%
\setKV[PLaxesorig]{#1}%
\draw (0,0) node[\axesorpos=\axesordecal,font=\axesorfont] {\axesorval} ;
}
@@ -498,11 +524,12 @@
%grilles
\setKVdefault[PLgrillestkz]{%
Affp=true,%
- Affs=true
+ Affs=true,%
+ Dernier=false
}
\DeclareDocumentCommand\GrilleTikz{ O{} O{thin,lightgray} O{ultra thin,lightgray} }{%
- \useKVdefault[PLgrillestkz]
+ \restoreKV[PLgrillestkz]
\setKV[PLgrillestkz]{#1}%
\ifboolKV[PLgrillestkz]{Affs}
{\draw[xstep=\xgrilles,ystep=\ygrilles,#3] ({\xmin-\axexOx},{\ymin-\axeyOy}) grid ({\xmax-\axexOx},{\ymax-\axeyOy});}
@@ -510,6 +537,12 @@
\ifboolKV[PLgrillestkz]{Affp}
{\draw[xstep=\xgrille,ystep=\ygrille,#2] ({\xmin-\axexOx},{\ymin-\axeyOy}) grid ({\xmax-\axexOx},{\ymax-\axeyOy});}
{}
+ \ifboolKV[PLgrillestkz]{Dernier}
+ {%
+ \draw[#2] ({\xmin-\axexOx},{\ymax-\axeyOy}) -- ({\xmax-\axexOx},{\ymax-\axeyOy});%
+ \draw[#2] ({\xmax-\axexOx},{\ymin-\axeyOy}) -- ({\xmax-\axexOx},{\ymax-\axeyOy});%
+ }
+ {}
}
%point(s) avec changement origines
@@ -526,7 +559,7 @@
}
\newcommand\PLnuagepoints[2][]{%
- \useKVdefault[PLpts]
+ \restoreKV[PLpts]
\setKV[PLpts]{#1}%
\setsepchar{§}%
\readlist\listepointsaffiches{#2}
@@ -546,7 +579,7 @@
}
\newcommand\NuagePointsTikz[3][]{%
- \useKVdefault[PLpts]
+ \restoreKV[PLpts]
\setKV[PLpts]{#1}% on paramètres les nouvelles clés et on les simplifie
\def\xliste{#2}
\def\yliste{#3}
@@ -597,7 +630,7 @@
}
\newcommand\PointMoyenTikz[1][]{%
- \useKVdefault[PLptmoy]
+ \restoreKV[PLptmoy]
\setKV[PLptmoy]{#1}% on paramètres les nouvelles clés et on les simplifie
\IfStrEq{\ptmoystyle}{o}%
{
@@ -648,7 +681,7 @@
}
\DeclareDocumentCommand\FenetreSimpleTikz{ O{} D(){} D<>{} m D<>{} m }{%
- \useKVdefault[PLsimplewindow]%
+ \restoreKV[PLsimplewindow]%
\setKV[PLsimplewindow]{#1}% on paramètres les nouvelles clés et on les simplifie
\ifboolKV[PLsimplewindow]{Grille}%
{\GrilleTikz}%
@@ -664,6 +697,10 @@
\tikzset{declare function={#1(\x)=#2;}}
}
+\NewDocumentCommand\DeclareFonctionTikzXint{ O{f} m }{%nom_fonction+langage xint
+ \xintdeffloatfunc #1(x) := #2 ;%
+}
+
%====INTERVALLES TIKZ
\usetikzlibrary{decorations.pathmorphing,decorations.pathreplacing}
@@ -821,4 +858,92 @@
\end{scope}%
}
+%====Intégrale TikZ
+\defKV[IntegrDomainTikz]{%
+ Epaisseur=\def\intgdomtikzthick{#1},%
+ Couleurs=\def\intgdomtikzcolors{#1},%
+ Style=\def\intgdomtikzstyle{#1},%
+ Opacite=\def\intgdomtikzopac{#1},%
+ Samples=\def\intgdomtikzsamples{#1},%
+ Hachures=\def\intgdomtikzhatch{#1},%
+ Type=\def\intgdomtikztype{#1},%
+ Pas=\def\intgdomtikzstep{#1},%
+ Jonction=\def\intgdomtikzjoin{#1}
+}
+\setKVdefault[IntegrDomainTikz]{%
+ Epaisseur=1pt,%
+ Couleurs={gray/teal},%
+ Style=remplissage,%
+ Opacite=0.5,%
+ Samples=250,%
+ Hachures={north west lines},%
+ Type=dessous,%
+ Pas=0.1,%
+ Jonction=bevel
+}
+
+\NewDocumentCommand\IntegraleTikz{ O{} D<>{} m O{0} m m }{%
+ %1 = clés
+ %2 = options particulières tikz
+ %3 = fonction, en tikz
+ %4 = fonction n°2 éventuelle
+ %de #5 à #6
+ \restoreKV[IntegrDomainTikz]% revenir au valeurs par défaut
+ \setKV[IntegrDomainTikz]{#1}% lit les arguments optionnels
+ \StrCut{\intgdomtikzcolors}{/}{\intgcolbord}{\intcolhach}%
+ \IfStrEq{\intgcolbord}{}{\xdef\intgcolbord{none}}{}%
+ \IfStrEq{\intgdomtikzstyle}{hachures}%
+ {%
+ \tikzset{integraletikzstyle/.style={line width=\intgdomtikzthick,draw=\intgcolbord,pattern=\intgdomtikzhatch,pattern color=\intcolhach,line join=\intgdomtikzjoin}}
+ }%
+ {}%
+ \IfStrEq{\intgdomtikzstyle}{remplissage}%
+ {%
+ \tikzset{integraletikzstyle/.style={line width=\intgdomtikzthick,draw=\intgcolbord,fill=\intcolhach,fill opacity=\intgdomtikzopac,line join=\intgdomtikzjoin}}
+ }%
+ {}%
+ \IfStrEq{\intgdomtikztype}{dessous}%
+ {%
+ \draw[integraletikzstyle,#2] (#5,0) -- plot[samples=\intgdomtikzsamples,domain=#5:#6] (\x,{#3}) --(#6,0) -- cycle ;
+ }%
+ {}%
+ \IfStrEq{\intgdomtikztype}{entre}%
+ {%
+ \draw[integraletikzstyle,#2] plot[samples=\intgdomtikzsamples,domain=#5:#6] (\x,{#3}) -- plot[samples=\intgdomtikzsamples,domain=#6:#5] (\x,{#4}) -- cycle ;
+ }%
+ {}%
+}
+
+\NewDocumentCommand\IntegraleTikzXint{ O{} D<>{} m O{0} m m }{%
+ %1 = clés
+ %2 = options particulières tikz
+ %3 = fonction, en tikz
+ %4 = fonction n°2 éventuelle
+ %de #5 à #6
+ \restoreKV[IntegrDomainTikz]% revenir au valeurs par défaut
+ \setKV[IntegrDomainTikz]{#1}% lit les arguments optionnels
+ \StrCut{\intgdomtikzcolors}{/}{\intgcolbord}{\intcolhach}%
+ \IfStrEq{\intgcolbord}{}{\xdef\intgcolbord{none}}{}%
+ \IfStrEq{\intgdomtikzstyle}{hachures}%
+ {%
+ \tikzset{integraletikzstyle/.style={line width=\intgdomtikzthick,draw=\intgcolbord,pattern=\intgdomtikzhatch,pattern color=\intcolhach,line join=\intgdomtikzjoin}}
+ }%
+ {}%
+ \IfStrEq{\intgdomtikzstyle}{remplissage}%
+ {%
+ \tikzset{integraletikzstyle/.style={line width=\intgdomtikzthick,draw=\intgcolbord,fill=\intcolhach,fill opacity=\intgdomtikzopac,line join=\intgdomtikzjoin}}
+ }%
+ {}%
+ \IfStrEq{\intgdomtikztype}{dessous}%
+ {%
+ \draw[integraletikzstyle,#2] (#5,0) -- plot[smooth] coordinates {\xintthecoords\xintfloatexpr seq((x,#3),x=#5..[\intgdomtikzstep]..#6)\relax} -- (#6,0) -- cycle ;
+ }%
+ {}%
+ \IfStrEq{\intgdomtikztype}{entre}%
+ {%
+ \draw[integraletikzstyle,#2] plot[smooth] coordinates {\xintthecoords\xintfloatexpr seq((x,#3),x=#5..[\intgdomtikzstep]..#6)\relax} -- plot[smooth] coordinates {\xintthecoords\xintfloatexpr seq((x,#4),x=#6..[-\intgdomtikzstep]..#5)\relax} -- cycle ;
+ }%
+ {}%
+}
+
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/proflycee/tex/proflycee-tools-probas.tex b/macros/latex/contrib/proflycee/tex/proflycee-tools-probas.tex
index e817af767e..92cff33772 100644
--- a/macros/latex/contrib/proflycee/tex/proflycee-tools-probas.tex
+++ b/macros/latex/contrib/proflycee/tex/proflycee-tools-probas.tex
@@ -1041,4 +1041,187 @@
}%
}
+%===BINOMIALE
+\defKV[HistoBinom]{%
+ Largeur=\def\GraphBinomLarg{#1},%
+ Hauteur=\def\GraphBinomHaut{#1},%
+ PasX=\def\GraphBinomPasX{#1},%
+ PasY=\def\GraphBinomPasY{#1},%
+ Plage=\def\GraphBinomPlage{#1},%
+ CouleurPlage=\def\GraphBimomColPlage{#1},%
+ Epaisseur=\def\GraphBinomThick{#1},%
+ ClipX=\def\GraphBinomXminmax{#1},%
+ Police=\def\GraphBinomFonte{#1},%
+ CouleurNormale=\def\GraphBinomColNorm{#1}
+}
+\setKVdefault[HistoBinom]{%
+ Largeur=10,%
+ Hauteur=5,%
+ PasX=5,%
+ PasY=0.01,%
+ Plage={},%
+ CouleurPlage=teal!50,%
+ Epaisseur=0.8pt,
+ ClipX={},%
+ Police=\normalfont\normalsize,%
+ AffNormale=false,%
+ CouleurNormale=red
+}
+
+\NewDocumentCommand\HistogrammeBinomiale{ O{} D<>{} m m }{%
+ \restoreKV[HistoBinom]%
+ \setKV[HistoBinom]{#1}
+ \def\GraphBinomN{#3}%
+ \def\GraphBinomP{#4}%
+ \IfStrEq{\GraphBinomXminmax}{}%
+ {%
+ \xdef\GraphBinomXmin{0}%
+ \xdef\GraphBinomXmax{\GraphBinomN}%
+ }%
+ {%
+ \StrCut{\GraphBinomXminmax}{-}{\GraphBinomXmin}{\GraphBinomXmax}%
+ \IfStrEq{\GraphBinomXmin}{*}{\xdef\GraphBinomXmin{0}}{}%
+ \IfStrEq{\GraphBinomXmax}{*}{\xdef\GraphBinomXmax{\GraphBinomN}}{}%
+ }%
+ \IfStrEq{\GraphBinomPlage}{}%
+ {}%
+ {%
+ \StrCut{\GraphBinomPlage}{-}{\GraphBinomColorMin}{\GraphBinomColorMax}%
+ \IfStrEq{\GraphBinomColorMin}{*}{\xdef\GraphBinomColorMin{\GraphBinomXmin}}{}%
+ \IfStrEq{\GraphBinomColorMax}{*}{\xdef\GraphBinomColorMax{\GraphBinomXmax}}{}%
+ }%
+ %test d'unités
+ \xdef\GraphBinomXunit{\xintfloateval{round((\GraphBinomLarg)/(\GraphBinomXmax-\GraphBinomXmin+1),3)}}%
+ \xdef\grphbinommedA{\xintfloateval{trunc(\GraphBinomN*\GraphBinomP,0)}}%
+ \xdef\grphbinommedB{\xintfloateval{\grphbinommedA+1}}%
+ \xdef\GraphBinomYmaxA{\xintfloateval{binomial(\GraphBinomN,\grphbinommedA)*(\GraphBinomP)^(\grphbinommedA)*(1-(\GraphBinomP))^((\GraphBinomN)-(\grphbinommedA))}}%
+ \xdef\GraphBinomYmaxB{\xintfloateval{binomial(\GraphBinomN,\grphbinommedB)*(\GraphBinomP)^(\grphbinommedB)*(1-(\GraphBinomP))^((\GraphBinomN)-(\grphbinommedB))}}%
+ \xdef\GraphBinomMaxY{\xintfloateval{1.1*max(\GraphBinomYmaxA,\GraphBinomYmaxB)}}%
+ \xdef\GraphBinomNbPrecision{\xinteval{abs(ilog10(\GraphBinomMaxY))+1}}%
+ \xdef\GraphBinomYunit{\xintfloateval{round((\GraphBinomHaut)/(max(\GraphBinomYmaxA,\GraphBinomYmaxB)),3)}}%
+ \begin{tikzpicture}[x=\GraphBinomXunit cm,y=\GraphBinomYunit cm,#2]
+ %coloriage éventuel
+ \IfStrEq{\GraphBinomPlage}{}%
+ {}%
+ {%
+ \xintFor* ##1 in {\xintSeq{\GraphBinomColorMin}{\GraphBinomColorMax}}\do{%
+ \xdef\tmpYYY{\xintfloateval{binomial(\GraphBinomN,##1)*(\GraphBinomP)^(##1)*(1-(\GraphBinomP))^((\GraphBinomN)-(##1))}}%
+ \draw[draw=none,fill=\GraphBimomColPlage,fill opacity=0.5] ({##1-0.5},0) rectangle++ (1,{\tmpYYY}) ;
+ }%
+ }%
+ %axes
+ \draw[line width=\GraphBinomThick,->,>=latex] ({\GraphBinomXmin-0.5},0)--({\GraphBinomXmax+1},0) ;
+ \draw[line width=\GraphBinomThick,->,>=latex] ({\GraphBinomXmin-0.5},0)--({\GraphBinomXmin-0.5},{1.1*(\GraphBinomHaut)/(\GraphBinomYunit)}) ;
+ \foreach \x in {\GraphBinomXmin,\inteval{\GraphBinomXmin+\GraphBinomPasX},...,\GraphBinomXmax}{%
+ \draw[line width=\GraphBinomThick] (\x,2pt)--++(0,-4pt) node[below,font=\GraphBinomFonte] {\num{\x}} ;
+ }%
+ \xdef\GraphBinomNbPrecisionAxeY{\xinteval{abs(ilog10(\GraphBinomPasY))+1}}%
+ \foreach \y in {0,\GraphBinomPasY,...,\GraphBinomMaxY}{%
+ \draw[line width=\GraphBinomThick] ($({\GraphBinomXmin-0.5},\y)+(2pt,0)$)--++(-4pt,0) node[left,font=\GraphBinomFonte] {\num{\xintfloateval{round(\y,\GraphBinomNbPrecisionAxeY)}}} ;
+ }%
+ %tracé
+ \xintFor* ##1 in {\xintSeq{\GraphBinomXmin}{\GraphBinomXmax}}\do{%
+ \xdef\tmpYYY{\xintfloateval{binomial(\GraphBinomN,##1)*(\GraphBinomP)^(##1)*(1-(\GraphBinomP))^((\GraphBinomN)-(##1))}}%
+ \draw[line width=\GraphBinomThick] ({##1-0.5},0) rectangle++ (1,{\tmpYYY}) ;
+ }
+ \ifboolKV[HistoBinom]{AffNormale}%
+ {%
+ \xdef\MinNormHistoBinom{\xintfloateval{{\GraphBinomXmin-0.5}}}%
+ \xdef\MaxNormHistoBinom{\xintfloateval{{\GraphBinomXmax+0.5}}}%
+ \TraceLoiNormale*[line width={1.25*\GraphBinomThick},\GraphBinomColNorm]<\MinNormHistoBinom..[0.1]..\MaxNormHistoBinom>{#3}{#4}
+ }%
+ {}%
+ \end{tikzpicture}
+}
+
+\NewDocumentEnvironment{HistoBinomiale}{ O{} D<>{} m m }%
+{%
+ \restoreKV[HistoBinom]%
+ \setKV[HistoBinom]{#1}
+ \def\GraphBinomN{#3}%
+ \def\GraphBinomP{#4}%
+ \IfStrEq{\GraphBinomXminmax}{}%
+ {%
+ \xdef\GraphBinomXmin{0}%
+ \xdef\GraphBinomXmax{\GraphBinomN}%
+ }%
+ {%
+ \StrCut{\GraphBinomXminmax}{-}{\GraphBinomXmin}{\GraphBinomXmax}%
+ \IfStrEq{\GraphBinomXmin}{*}{\xdef\GraphBinomXmin{0}}{}%
+ \IfStrEq{\GraphBinomXmax}{*}{\xdef\GraphBinomXmax{\GraphBinomN}}{}%
+ }%
+ \IfStrEq{\GraphBinomPlage}{}%
+ {}%
+ {%
+ \StrCut{\GraphBinomPlage}{-}{\GraphBinomColorMin}{\GraphBinomColorMax}%
+ \IfStrEq{\GraphBinomColorMin}{*}{\xdef\GraphBinomColorMin{\GraphBinomXmin}}{}%
+ \IfStrEq{\GraphBinomColorMax}{*}{\xdef\GraphBinomColorMax{\GraphBinomXmax}}{}%
+ }%
+ %test d'unités
+ \xdef\GraphBinomXunit{\xintfloateval{round((\GraphBinomLarg)/(\GraphBinomXmax-\GraphBinomXmin+1),3)}}%
+ \xdef\grphbinommedA{\xintfloateval{trunc(\GraphBinomN*\GraphBinomP,0)}}%
+ \xdef\grphbinommedB{\xintfloateval{\grphbinommedA+1}}%
+ \xdef\GraphBinomYmaxA{\xintfloateval{binomial(\GraphBinomN,\grphbinommedA)*(\GraphBinomP)^(\grphbinommedA)*(1-(\GraphBinomP))^((\GraphBinomN)-(\grphbinommedA))}}%
+ \xdef\GraphBinomYmaxB{\xintfloateval{binomial(\GraphBinomN,\grphbinommedB)*(\GraphBinomP)^(\grphbinommedB)*(1-(\GraphBinomP))^((\GraphBinomN)-(\grphbinommedB))}}%
+ \xdef\GraphBinomMaxY{\xintfloateval{1.1*max(\GraphBinomYmaxA,\GraphBinomYmaxB)}}%
+ \xdef\GraphBinomNbPrecision{\xinteval{abs(ilog10(\GraphBinomMaxY))+1}}%
+ \xdef\GraphBinomYunit{\xintfloateval{round((\GraphBinomHaut)/(max(\GraphBinomYmaxA,\GraphBinomYmaxB)),3)}}%
+ \begin{tikzpicture}[x=\GraphBinomXunit cm,y=\GraphBinomYunit cm,#2]
+ %coloriage éventuel
+ \IfStrEq{\GraphBinomPlage}{}%
+ {}%
+ {%
+ \xintFor* ##1 in {\xintSeq{\GraphBinomColorMin}{\GraphBinomColorMax}}\do{%
+ \xdef\tmpYYY{\xintfloateval{binomial(\GraphBinomN,##1)*(\GraphBinomP)^(##1)*(1-(\GraphBinomP))^((\GraphBinomN)-(##1))}}%
+ \draw[draw=none,fill=\GraphBimomColPlage,fill opacity=0.5] ({##1-0.5},0) rectangle++ (1,{\tmpYYY}) ;
+ }%
+ }%
+ %axes
+ \draw[line width=\GraphBinomThick,->,>=latex] ({\GraphBinomXmin-0.5},0)--({\GraphBinomXmax+1},0) ;
+ \draw[line width=\GraphBinomThick,->,>=latex] ({\GraphBinomXmin-0.5},0)--({\GraphBinomXmin-0.5},{1.1*(\GraphBinomHaut)/(\GraphBinomYunit)}) ;
+ \foreach \x in {\GraphBinomXmin,\inteval{\GraphBinomXmin+\GraphBinomPasX},...,\GraphBinomXmax}{%
+ \draw[line width=\GraphBinomThick] (\x,2pt)--++(0,-4pt) node[below,font=\GraphBinomFonte] {\num{\x}} ;
+ }%
+ \xdef\GraphBinomNbPrecisionAxeY{\xinteval{abs(ilog10(\GraphBinomPasY))+1}}%
+ \foreach \y in {0,\GraphBinomPasY,...,\GraphBinomMaxY}{%
+ \draw[line width=\GraphBinomThick] ($({\GraphBinomXmin-0.5},\y)+(2pt,0)$)--++(-4pt,0) node[left,font=\GraphBinomFonte] {\num{\xintfloateval{round(\y,\GraphBinomNbPrecisionAxeY)}}} ;
+ }%
+ %tracé
+ \xintFor* ##1 in {\xintSeq{\GraphBinomXmin}{\GraphBinomXmax}}\do{%
+ \xdef\tmpYYY{\xintfloateval{binomial(\GraphBinomN,##1)*(\GraphBinomP)^(##1)*(1-(\GraphBinomP))^((\GraphBinomN)-(##1))}}%
+ \draw[line width=\GraphBinomThick] ({##1-0.5},0) rectangle++ (1,{\tmpYYY}) ;
+ }
+ %loi normale ?
+ \ifboolKV[HistoBinom]{AffNormale}%
+ {%
+ \xdef\MinNormHistoBinom{\xintfloateval{{\GraphBinomXmin-0.5}}}%
+ \xdef\MaxNormHistoBinom{\xintfloateval{{\GraphBinomXmax+0.5}}}%
+ \TraceLoiNormale*[line width={1.25*\GraphBinomThick},\GraphBinomColNorm]<\MinNormHistoBinom..[0.1]..\MaxNormHistoBinom>{#3}{#4}
+ }%
+ {}%
+ }%
+ {%
+ \end{tikzpicture}
+}
+
+\xintdeffloatfunc fctreploinorm(x,mu,sigma):=1/(sigma*sqrt(2*Pi))*exp(-1/2*((x-mu)/sigma)^2);
+
+\NewDocumentCommand\TraceLoiNormale{ s O{} D<>{} m m }{%
+ \IfBooleanTF{#1}%
+ {%
+ \draw[#2] plot[smooth] coordinates {%
+ \xintthecoords\xintfloatexpr
+ seq((x,fctreploinorm(x,#4*#5,sqrt(#4*#5*(1-#5)))),x=#3)
+ \relax
+ };
+ }%
+ {%
+ \draw[#2] plot[smooth] coordinates {%
+ \xintthecoords\xintfloatexpr
+ seq((x,fctreploinorm(x,#4,#5)),x=#3)
+ \relax
+ };
+ }%
+}
+
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/profmaquette/doc/ProfMaquette-doc.pdf b/macros/latex/contrib/profmaquette/doc/ProfMaquette-doc.pdf
index 552ebfe62c..655d73fe6e 100644
--- a/macros/latex/contrib/profmaquette/doc/ProfMaquette-doc.pdf
+++ b/macros/latex/contrib/profmaquette/doc/ProfMaquette-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty b/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
index 9d2e501a04..9aa462bb76 100644
--- a/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
+++ b/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
@@ -2,9 +2,9 @@
% licence : Released under the LaTeX Project Public License v1.3c
% or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}%
-\def\filedate{2024/04/25}%
+\def\filedate{2024/05/02}%
\let\PfMfiledate\filedate%
-\def\fileversion{0.92}%
+\def\fileversion{0.94}%
\let\PfMfileversion\fileversion%
\ProvidesPackage{ProfMaquette}[\filedate\space v\fileversion\space Maquettage de documents]%
@@ -37,15 +37,16 @@
\makeatletter
\gdef\PfMFontSize{\@ptsize}
+%\gdef\PfMFontSize{\f@size}
\makeatother
%définition des clés
\RequirePackage{simplekv}%
-\setKVdefault[Boulot]{Dys=false,Taille=14,Cours=false,Base=false,BaseHTML=false,CAN=false,Fiche=false,DM=false,DS=false,IE=false,Kholle=false,RecapBrevet=false,PdT=false,Parcours=false,Contrat=false,FdR=false,ParcoursPerso=false,OlympiadesAPMEP=false,CorrigeInverse=false,CorrigeSeul=false,CorrigeApres=false,CorrigeFin=false,CorrigeAll=false,Brevet=false,BaremeComplet=false,BaremeGlobal=false,CorrectionColonnes=false,Epaisseur=0pt,VersSolution=false,Small=false,Footnotesize=false,Scriptsize=false,AllDirect=false,AllPouce=false}%Les deux derniers pour essayer de mettre tous les exercices d'un même fichier en mode Reponse, en mode Indice. Pas implanté, pas testé
+\setKVdefault[Boulot]{Dys=false,Taille=14,Cours=false,Base=false,BaseHTML=false,CAN=false,Fiche=false,DM=false,DS=false,IE=false,Kholle=false,RecapBrevet=false,PdT=false,Parcours=false,Contrat=false,FdR=false,ParcoursPerso=false,OlympiadesAPMEP=false,CorrigeInverse=false,CorrigeSeul=false,CorrigeApres=false,CorrigeFin=false,CorrigeAll=false,Brevet=false,BaremeComplet=false,BaremeGlobal=false,CorrectionColonnes=false,Epaisseur=0pt,VersSolution=false,AvecEntrainement=false,Small=false,Footnotesize=false,Scriptsize=false,AllDirect=false,AllPouce=false}%Les deux derniers pour essayer de mettre tous les exercices d'un même fichier en mode Reponse, en mode Indice. Pas implanté, pas testé
\defKV[Boulot]{Colonnes=\setKV[Boulot]{CorrectionColonnes}}%
\setKVdefault[Cours]{Couleur=Crimson,Theme=Trace écrite,NomExercice=Exercice}%
\setKVdefault[DM]{Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname}%
\setKVdefault[DS]{Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname,Calculatrice=false,Sujet=A}%
-\setKVdefault[Fiche]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}%
+\setKVdefault[Fiche]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice,}%
\setKVdefault[PdT]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}%
\setKVdefault[FdR]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}%
\setKVdefault[Parcours]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice,Vertical=false}%
@@ -57,7 +58,7 @@
\setKVdefault[Kholle]{Sujet=1,Numero=1,Date=15,Niveau=TSI-1,Code=\jobname,Lieu=Lycée
du Hainaut (Valenciennes),NomEleve=Albert Einstein,CR=false}%
\setKVdefault[CAN]{Date=\today,Niveau=6,Duree=9,CoefQ=0.4,CoefR=0.35,CoefJ=0.1}%
-\setKVdefault[ClesExercices]{NbQuestions=1,PasTitre=false,AffichageSource=false,BaremeTotal,BaremeDetaille=false,MotPoint=point,AffichageTitre=false,Calculatrice=true,Oral=false,Difficulte=0,AffichageCompetence=false,PasCorrige=false,Direct=false,Pouce=false,Parcours=false,Contrat=false,FdR=false,Routes=false,Stops=false,Background=white,Cadre=gray!50,Numerote,Ligne=false,Doublespacing=false,Onehalfspacing=false,Cadres=false,TitreSol=false,NonUtilise=false,Profile=false}%
+\setKVdefault[ClesExercices]{NbQuestions=1,PasTitre=false,AffichageSource=false,BaremeTotal,BaremeDetaille=false,MotPoint=point,AffichageTitre=false,Calculatrice=true,Oral=false,Difficulte=0,AffichageCompetence=false,PasCorrige=false,Direct=false,Pouce=false,Parcours=false,Contrat=false,FdR=false,Routes=false,Stops=false,Background=white,Cadre=gray!50,Numerote,Ligne=false,Doublespacing=false,Onehalfspacing=false,Cadres=false,TitreSol=false,NonUtilise=false,Profile=false,PasEntrainement=false}%
\defKV[ClesExercices]{TitreSolution=\setKV[ClesExercices]{TitreSol}}%
\defKV[ClesExercices]{Source=\setKV[ClesExercices]{AffichageSource}}%
\defKV[ClesExercices]{Titre=\setKV[ClesExercices]{AffichageTitre}}%
@@ -140,6 +141,8 @@
\setcounter{PfMExo}{0}%
\newcounter{PfMExoSol}%Pour repérer les valeurs aléatoires construites automatiquement dans la solution
\setcounter{PfMExoSol}{0}%
+\newcounter{PfMExoEntrai}%Pour repérer les entrainements
+\setcounter{PfMExoEntrai}{0}%
\newcounter{PfMCorrigeParcoursPerso}%affichage des solutions ou pas dans le cadre d'un parcours perso
\setcounter{PfMCorrigeParcoursPerso}{0}%
\newcounter{PfMSOS}%Numéro des SOS dans les parcours fléchés
@@ -238,6 +241,15 @@
\repeat
}%
+% On bloque la graine de fabrication des nombres aléatoires.
+\ExplSyntaxOn
+\cs_new_eq:NN \PfMGraineAlea \sys_gset_rand_seed:n
+\ExplSyntaxOff
+
+\ExplSyntaxOn
+\cs_new_eq:NN \PfMChoisisGraineAlea \int_rand:n
+\ExplSyntaxOff
+
%% Gestion de l'affichage ou pas des item (Pour élèves PAP) par exemple
% Code by egreg : https://tex.stackexchange.com/questions/627250/hide-specific-item-in-a-list
\ExplSyntaxOn
@@ -894,7 +906,7 @@
\]%
}%
%
-%%%%
+%
%%% Définitions des environnements pour la correction
\makeatletter
\newwrite\verbatim@out
@@ -1039,6 +1051,7 @@
}%
\def\PfMTexteDuCorrige{Corrigé de l'exercice}
+\def\PfMTexteDeLEntrainement{Automatisme(s) lié(s) à l'exercice}
\NewDocumentCommand\PfMAffichageCorrige{}{%
\ifboolKV[Boulot]{CAN}{%
@@ -1061,6 +1074,43 @@
}%
}%
}%
+
+\NewDocumentEnvironment{Entrainement}{}{}{}%
+
+\makeatletter
+\def\EntrainementWrite{%
+ \@bsphack%
+ \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.qrc"%
+ \let\do\@makeother\dospecials%
+ \catcode`\^^M\active%
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out{\the\verbatim@line}}%
+ \verbatim@start}%
+\def\endEntrainementWrite{\immediate\closeout\verbatim@out\@esphack}%
+
+\let\Entrainement\EntrainementWrite\let\endEntrainement\endEntrainementWrite%
+\makeatother
+
+\NewDocumentCommand\PfMAffichageEntrainement{}{%
+ \clearpage
+ \TikzAutomatismes
+ \setcounter{PfMExoEntrai}{0}%
+ \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{%
+ \refstepcounter{PfMExoEntrai}%
+ \IfFileExists{\jobname-Ex##1.qrc}{%
+ \begin{center}
+ \label{pageentrai-\thePfMMaquette-\thePfMExoEntrai}%
+ \textbf{\PfMTexteDeLEntrainement\ifnum\thePfMExo=1\relax\else~\ref{page-\thePfMMaquette-##1}\fi}\par\nopagebreak\input{\jobname-Ex##1.qrc}\end{center}}{}%
+ }%
+}%
+
+\NewDocumentCommand\TikzAutomatismes{}{%
+ \begin{tcolorbox}
+ \begin{center}
+ \Large\sffamily Automatismes%
+ \end{center}
+ \end{tcolorbox}%
+}%
%%%%%%%% BAREME %%%%%%%%%%%
%% Bareme
\newlength{\brouillon}
@@ -1194,7 +1244,18 @@
\node[%
fill=tcbcolback,%
anchor=center,%
- ] at (frame.east){\hyperref[pagesol-\thePfMMaquette-\thePfMExo]{\faKey}};%
+ ] at ($(frame.north east)!0.25!(frame.south east)$){\hyperref[pagesol-\thePfMMaquette-\thePfMExo]{\faKey}};%
+ }%
+ }{}%
+}%
+
+\NewDocumentCommand{\PfMLienVersEntrainement}{}{%
+ \ifboolKV[Boulot]{AvecEntrainement}{%
+ \ifboolKV[ClesExercices]{PasEntrainement}{}{%
+ \node[%
+ fill=tcbcolback,%
+ anchor=center,rotate=45%
+ ] at ($(frame.north east)!0.75!(frame.south east)$){\hyperref[pageentrai-\thePfMMaquette-\thePfMExo]{\faDumbbell}};%
}%
}{}%
}%
@@ -1553,6 +1614,8 @@
\PfMAffichageSource%
%
\PfMLienVersSolution%
+ %
+ \PfMLienVersEntrainement%
}%
}%
}%
@@ -1871,7 +1934,7 @@
\setsepchar{,}%
\readlist*\ListePetitsObjets{bonbons,billes,biscuits,gommes,clous,vis,cahiers,trousses}%
\readlist*\ListeFruits{pommes,poires,abricots,cerises,fraises,framboises,noix,pêches,nectarines,myrtilles,oranges,mandarines,kiwis}%
-\readlist*\ListeVariables{a,b,c,m,n,p,r,s,t,x,y,z}%
+\readlist*\ListeVariables{a,b,c,\ell,m,n,p,r,s,t,x,y,z}%
\makeatletter
\def\ExoCANWrite{%
@@ -2025,6 +2088,8 @@
\PfMAffichageSource%
%
\PfMLienVersSolution%
+ %
+ \PfMLienVersEntrainement%
}%
}%
}%
@@ -2318,8 +2383,6 @@
\refstepcounter{PfMSection}%
\PfMChoixCorrection%
\refstepcounter{PfMExo}%
- % \setbox\PfMBoxSauvegarde{#3\unskip\unpenalty\unpenalty}
-% \setbox\PfMBoxSauvegarde=\vbox{#3}
\ifboolKV[Boulot]{CorrigeSeul}{}{%
\PfMChoixTitreSolution%
\PfMChoixHideItemSolution%
@@ -3001,6 +3064,8 @@
\PfMAffichageSource%
% Lien vers la solution
\PfMLienVersSolution
+ % Lien vers les entrainements
+ \PfMLienVersEntrainement
}%
}%
}%
@@ -3092,6 +3157,8 @@
\PfMAffichageSource%
%
\PfMLienVersSolution%
+ %
+ \PfMLienVersEntrainement%
}%
}%
}%
@@ -3296,14 +3363,15 @@
}{%
\ifnum\thePfMMaquette=1\relax%
\else%
- \ifnum\PfMFontSize=0\relax%
- \fontsize{10}{\fpeval{1.2*10}}%
- \else\ifnum\PfMFontSize=1\relax%
- \fontsize{11}{\fpeval{1.2*11}}%
- \else%
- \fontsize{12}{\fpeval{1.2*12}}%
- \fi%
- \fi%
+ %\ifnum\PfMFontSize=0\relax%
+ % \fontsize{10}{\fpeval{1.2*10}}%
+ %\else\ifnum\PfMFontSize=1\relax%
+ % \fontsize{11}{\fpeval{1.2*11}}%
+ % \else%
+ % \fontsize{12}{\fpeval{1.2*12}}%
+ % \fi%
+ %\fi%
+ \fontsize{\fpeval{10+\PfMFontSize}}{\fpeval{1.2*(10+\PfMFontSize)}}%
\selectfont%
\renewcommand{\JustifyingParindent}{\parindent}
\justifying%
@@ -3335,6 +3403,7 @@
\fi%
\PfMBasculeDys%
\setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
+ \PfMChangerTailleCorrection%
}%
\NewDocumentCommand\PfMAffichageCorrectionColonnes{}{%
@@ -3343,6 +3412,12 @@
\ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
}%
+\NewDocumentCommand\PfMAffichageEntrainementColonnes{}{%
+ \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
+ \PfMAffichageEntrainement%
+ \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
+}%
+
%%%%%%%%%%%%%%% Debut Maquette %%%%%%%
% Environnement englobant le tout.
\makeatletter
@@ -3358,7 +3433,7 @@
\stepcounter{PfMMaquette}%
% options de boulot
\IfHookExistsTF{env/Maquette/after}{\RemoveFromHook{env/Maquette/after}[*]}{}%
- \IfHookExistsTF{env/exercice/after}{\RemoveFromHook{env/exercice/after}[*]}{}%
+ %\IfHookExistsTF{env/exercice/after}{\RemoveFromHook{env/exercice/after}[*]}{}%
% \AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}%
\useKVdefault[Boulot]%
\setKV[Boulot]{#1}%
@@ -3377,18 +3452,6 @@
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \clearpage
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
-% \TikzOlympiadesAPMEPCor{#2}%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes%
}%
}{}%
@@ -3396,14 +3459,15 @@
\ifboolKV[Boulot]{CAN}{%
\setKV[CAN]{#2}%
%\ifboolKV[Boulot]{CorrigeSeul}{}{\TikzCAN}%
- \PfMChangerTailleCorrection%
\setcounter{PfMCNNumQ}{0}%
\setlength{\PfMLargeurQuestion}{\useKV[CAN]{CoefQ}\linewidth}\setlength{\PfMLargeurReponse}{\useKV[CAN]{CoefR}\linewidth}\setlength{\PfMLargeurJury}{\useKV[CAN]{CoefJ}\linewidth}%
\let\exercice\ExoCANWrite\let\endexercice\endExoCANWrite%
\AddToHook{env/exercice/begin}{\setcounter{PfMAlea}{0}}%
\AddToHook{env/Maquette/end}{%
+ \xdef\PfMAncienneGraine{\PfMChoisisGraineAlea{123456789}}
\xdef\PfMCANTotalExo{\thePfMExo}%
\setbox\PfMSauvegardeBox\vbox{%
+ \PfMGraineAlea{\thePfMMaquette}
\setcounter{PfMExo}{0}%
\renewcommand{\arraystretch}{2}%
\begin{longtable}{|c|m{\PfMLargeurQuestion}|>{\centering\arraybackslash}m{\PfMLargeurReponse}|m{\PfMLargeurJury}|}%
@@ -3423,12 +3487,41 @@
\TikzCANCor{#2}%
\PfMAffichageCorrectionColonnes%
\clearpage
+ \normalsize%
\TikzCAN%
- \usebox{\PfMSauvegardeBox}%
- }{%
- \TikzCAN%
- \usebox{\PfMSauvegardeBox}%
- \ifboolKV[Boulot]{CorrigeFin}{\ifboolKV[Boulot]{CorrigeInverse}{}{\clearpage
+ \PfMGraineAlea{\thePfMMaquette}%
+ \setcounter{PfMCNNumQ}{0}%
+ \setcounter{PfMExo}{0}%
+ \renewcommand{\arraystretch}{2}%
+ \begin{longtable}{|c|m{\PfMLargeurQuestion}|>{\centering\arraybackslash}m{\PfMLargeurReponse}|m{\PfMLargeurJury}|}%
+ \hhline{~---}%
+ \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering Question&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\%
+ \hline%
+ \endhead%
+ \xintFor* ##1 in {\xintSeq{1}{\PfMCANTotalExo}}\do{%
+ \refstepcounter{PfMCNNumQ}\ttfamily{\thePfMCNNumQ}\label{TestCAN-\thePfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ex##1.can}&\CNReponse&\\
+ \hline%
+ }%
+ \end{longtable}%
+ \renewcommand{\arraystretch}{1}%
+ }{%
+ \PfMGraineAlea{\PfMAncienneGraine}%
+ \TikzCAN%
+ \setcounter{PfMCNNumQ}{0}%
+ \setcounter{PfMExo}{0}%
+ \renewcommand{\arraystretch}{2}%
+ \begin{longtable}{|c|m{\PfMLargeurQuestion}|>{\centering\arraybackslash}m{\PfMLargeurReponse}|m{\PfMLargeurJury}|}%
+ \hhline{~---}%
+ \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering Question&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\%
+ \hline%
+ \endhead%
+ \xintFor* ##1 in {\xintSeq{1}{\PfMCANTotalExo}}\do{%
+ \refstepcounter{PfMCNNumQ}\ttfamily{\thePfMCNNumQ}\label{TestCAN-\thePfMCNNumQ}&\Complement{}\stepcounter{PfMExo}\setcounter{PfMAlea}{0}\input{\jobname-Ex##1.can}&\CNReponse&\\
+ \hline%
+ }%
+ \end{longtable}%
+ \renewcommand{\arraystretch}{1}%
+ \ifboolKV[Boulot]{CorrigeFin}{\ifboolKV[Boulot]{CorrigeInverse}{}{\clearpage
\PfMPrepareCorrection{#1}%
\TikzCANCor{#2}%
\PfMAffichageCorrectionColonnes%
@@ -3436,56 +3529,39 @@
}{}
}
}%
-% \ifboolKV[Boulot]{CorrigeFin}{%
-% \AddToHook{env/Maquette/after}[Correction]{%
-% \PfMPrepareCorrection{#1}%
-% \TikzCANCor{#2}%
-% \PfMAffichageCorrectionColonnes%
-% }%
-% }{}%
}{%
\ifboolKV[Boulot]{FdR}{%
- \ifboolKV[Boulot]{CorrigeSeul}{}{%
- \setKV[FdR]{#2}\TikzFdR%
- }
- \let\exercice\exerciceFdR\let\endexercice\endexerciceFdR%
+ \ifboolKV[Boulot]{CorrigeSeul}{}{%
+ \setKV[FdR]{#2}\TikzFdR%
+ }
+ \let\exercice\exerciceFdR\let\endexercice\endexerciceFdR%
+ \ifboolKV[Boulot]{AvecEntrainement}{%
+ \AddToHook{env/Maquette/end}[Haltere]{%
+ \PfMAffichageEntrainementColonnes%
+ }%
+ }{}%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzFdRCor{#2}%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes
}%
}{}%
}{%
\ifboolKV[Boulot]{Contrat}{%
- \ifboolKV[Boulot]{CorrigeSeul}{}{%
- \setKV[Contrat]{#2}\TikzContrat%
- }
- \let\exercice\exerciceContrat\let\endexercice\endexerciceContrat%
+ \ifboolKV[Boulot]{CorrigeSeul}{}{%
+ \setKV[Contrat]{#2}\TikzContrat%
+ }
+ \let\exercice\exerciceContrat\let\endexercice\endexerciceContrat%
+ \ifboolKV[Boulot]{AvecEntrainement}{%
+ \AddToHook{env/Maquette/end}[Haltere]{%
+ \PfMAffichageEntrainementColonnes%
+ }%
+ }{}%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzContratCor{#2}%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes%
}%
}{}%
@@ -3497,17 +3573,7 @@
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzFicheCor{#2}%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes
}%
}{}%
@@ -3519,17 +3585,7 @@
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzRecapBrevetCor{#2}%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes%
}%
}{}%
@@ -3545,24 +3601,19 @@
}%
}{%
\ifboolKV[Boulot]{Parcours}{%
- \ifboolKV[Boulot]{CorrigeSeul}{}{%
- \setKV[Parcours]{#2}\TikzParcours%
- }
- \let\exercice\exerciceParcours\let\endexercice\endexerciceParcours%
+ \ifboolKV[Boulot]{CorrigeSeul}{}{%
+ \setKV[Parcours]{#2}\TikzParcours%
+ }
+ \let\exercice\exerciceParcours\let\endexercice\endexerciceParcours%
+ \ifboolKV[Boulot]{AvecEntrainement}{%
+ \AddToHook{env/Maquette/end}[Haltere]{%
+ \PfMAffichageEntrainementColonnes%
+ }%
+ }{}%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzParcoursCor{#2}
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes
}%
}{}%
@@ -3575,17 +3626,7 @@
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzPdTCor{#2}%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes%
}%
}{}%
@@ -3595,17 +3636,9 @@
\setKV[DM]{#2}\TikzDM%
}
\let\exercice\exerciceDM\let\endexercice\endexerciceDM%
-% \let\Exercice\exercice\let\endExercice\endexercice%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzDMCor{#2}%
\PfMAffichageCorrectionColonnes%
}%
@@ -3617,18 +3650,15 @@
\TikzFiche%
}%
\let\exercice\exerciceFiche\let\endexercice\endexerciceFiche%
- %\let\Exercice\exercice\let\endExercice\endexercice
+ \ifboolKV[Boulot]{AvecEntrainement}{%
+ \AddToHook{env/Maquette/end}[Haltere]{%
+ \PfMAffichageEntrainementColonnes%
+ }%
+ }{}%
\ifboolKV[Boulot]{CorrigeFin}{%
\ifboolKV[Boulot]{CorrigeAll}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}%
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzFicheCor{#2}%
\ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
\xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{%
@@ -3680,17 +3710,7 @@
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzDSCor{#2}%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes%
}%
}{}%
@@ -3703,17 +3723,7 @@
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\PfMPrepareCorrection{#1}
-% \useKVdefault[Boulot]%
-% \setKV[Boulot]{#1}%
-% \if@Dyslexie
-% \setKV[Boulot]{Dys}
-% \fi
-% \PfMBasculeDys%
-% \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzIECor{#2}%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-% \PfMAffichageCorrige%
-% \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
\PfMAffichageCorrectionColonnes
}%
}{}%
diff --git a/macros/latex/contrib/reledmac/doc-include/migrate-mac.dtx b/macros/latex/contrib/reledmac/doc-include/migrate-mac.dtx
index 12594049c6..fc3427bf80 100644
--- a/macros/latex/contrib/reledmac/doc-include/migrate-mac.dtx
+++ b/macros/latex/contrib/reledmac/doc-include/migrate-mac.dtx
@@ -246,7 +246,7 @@
% \cs{ledsubsection} & \cs{eledsubsection} \\
% \cs{ledsubsubsection} & \cs{eledsubsubsection} \\
% \cs{noeledsec} & Package option \verb+noeledsec+ \\
-% \cs{noendnotes} & Package option \verb+noendnotes+ \\
+% \cs{noendnotes} & Package option \verb+noend+ \\
% \cs{pageparbreak} & \cs{ledpb} \\
% \end{longtable}
%
diff --git a/macros/latex/contrib/reledmac/doc-more/page-typesetting-columns.pdf b/macros/latex/contrib/reledmac/doc-more/page-typesetting-columns.pdf
index 18605ab2db..1ae91515fb 100644
--- a/macros/latex/contrib/reledmac/doc-more/page-typesetting-columns.pdf
+++ b/macros/latex/contrib/reledmac/doc-more/page-typesetting-columns.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/1-criticalendnotes.pdf b/macros/latex/contrib/reledmac/examples/1-criticalendnotes.pdf
index 9c77ee92d8..58f1d6981d 100644
--- a/macros/latex/contrib/reledmac/examples/1-criticalendnotes.pdf
+++ b/macros/latex/contrib/reledmac/examples/1-criticalendnotes.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/1-criticalnotes.pdf b/macros/latex/contrib/reledmac/examples/1-criticalnotes.pdf
index e25e9f9fd2..ea2f749d32 100644
--- a/macros/latex/contrib/reledmac/examples/1-criticalnotes.pdf
+++ b/macros/latex/contrib/reledmac/examples/1-criticalnotes.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/1-sidenotes.pdf b/macros/latex/contrib/reledmac/examples/1-sidenotes.pdf
index 22b5bd2729..2d7130fcb9 100644
--- a/macros/latex/contrib/reledmac/examples/1-sidenotes.pdf
+++ b/macros/latex/contrib/reledmac/examples/1-sidenotes.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/1-tabular.pdf b/macros/latex/contrib/reledmac/examples/1-tabular.pdf
index 2e09c62414..d7a945978b 100644
--- a/macros/latex/contrib/reledmac/examples/1-tabular.pdf
+++ b/macros/latex/contrib/reledmac/examples/1-tabular.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/1-verses-doublenumbering.pdf b/macros/latex/contrib/reledmac/examples/1-verses-doublenumbering.pdf
index f4641e8ed2..75b679b50d 100644
--- a/macros/latex/contrib/reledmac/examples/1-verses-doublenumbering.pdf
+++ b/macros/latex/contrib/reledmac/examples/1-verses-doublenumbering.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/1-verses.pdf b/macros/latex/contrib/reledmac/examples/1-verses.pdf
index 345486a466..e1d1b6af19 100644
--- a/macros/latex/contrib/reledmac/examples/1-verses.pdf
+++ b/macros/latex/contrib/reledmac/examples/1-verses.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-antilabe.pdf b/macros/latex/contrib/reledmac/examples/2-antilabe.pdf
index 725b561e91..f7b843c631 100644
--- a/macros/latex/contrib/reledmac/examples/2-antilabe.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-antilabe.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-cross_referencing.pdf b/macros/latex/contrib/reledmac/examples/2-cross_referencing.pdf
index bb84710a9b..1c53f875a0 100644
--- a/macros/latex/contrib/reledmac/examples/2-cross_referencing.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-cross_referencing.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-footnote_spacing.pdf b/macros/latex/contrib/reledmac/examples/2-footnote_spacing.pdf
index b1fb90d576..c9e6daca45 100644
--- a/macros/latex/contrib/reledmac/examples/2-footnote_spacing.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-footnote_spacing.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-glossaries.pdf b/macros/latex/contrib/reledmac/examples/2-glossaries.pdf
index bc1cc26fa3..f702632cf3 100644
--- a/macros/latex/contrib/reledmac/examples/2-glossaries.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-glossaries.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-indexing.pdf b/macros/latex/contrib/reledmac/examples/2-indexing.pdf
index bd9a1ac760..ca3b90abcc 100644
--- a/macros/latex/contrib/reledmac/examples/2-indexing.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-indexing.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-lemma_disambigution.pdf b/macros/latex/contrib/reledmac/examples/2-lemma_disambigution.pdf
index 785306eb4c..95a09523d9 100644
--- a/macros/latex/contrib/reledmac/examples/2-lemma_disambigution.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-lemma_disambigution.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-line_numbers_in_header.pdf b/macros/latex/contrib/reledmac/examples/2-line_numbers_in_header.pdf
index 20a2c5d6a8..0021b1cbd3 100644
--- a/macros/latex/contrib/reledmac/examples/2-line_numbers_in_header.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-line_numbers_in_header.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-linespacing.pdf b/macros/latex/contrib/reledmac/examples/2-linespacing.pdf
index 4d32ac79ca..67424c3e0c 100644
--- a/macros/latex/contrib/reledmac/examples/2-linespacing.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-linespacing.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-manuscript-apparatus.pdf b/macros/latex/contrib/reledmac/examples/2-manuscript-apparatus.pdf
index 4deece32c7..362ff7012a 100644
--- a/macros/latex/contrib/reledmac/examples/2-manuscript-apparatus.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-manuscript-apparatus.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-notes-width.pdf b/macros/latex/contrib/reledmac/examples/2-notes-width.pdf
index be687afa88..0fe795532a 100644
--- a/macros/latex/contrib/reledmac/examples/2-notes-width.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-notes-width.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-one_series_per_pstart.pdf b/macros/latex/contrib/reledmac/examples/2-one_series_per_pstart.pdf
index 9e5b0624aa..ad48933ba2 100644
--- a/macros/latex/contrib/reledmac/examples/2-one_series_per_pstart.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-one_series_per_pstart.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-performances.pdf b/macros/latex/contrib/reledmac/examples/2-performances.pdf
index 822f29af7e..e68f4f3b49 100644
--- a/macros/latex/contrib/reledmac/examples/2-performances.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-performances.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-reledmac-right-to-left.pdf b/macros/latex/contrib/reledmac/examples/2-reledmac-right-to-left.pdf
index fdf1ad93f5..ed0755c95b 100644
--- a/macros/latex/contrib/reledmac/examples/2-reledmac-right-to-left.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-reledmac-right-to-left.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-subdivision-number-in-header.pdf b/macros/latex/contrib/reledmac/examples/2-subdivision-number-in-header.pdf
index 1a079d07da..a0e92d1b90 100644
--- a/macros/latex/contrib/reledmac/examples/2-subdivision-number-in-header.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-subdivision-number-in-header.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-titles_in_line_numbering_with_notes.pdf b/macros/latex/contrib/reledmac/examples/2-titles_in_line_numbering_with_notes.pdf
index 16d3cc7f02..22f3ac9ed3 100644
--- a/macros/latex/contrib/reledmac/examples/2-titles_in_line_numbering_with_notes.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-titles_in_line_numbering_with_notes.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/2-titles_not_in_line_numbering.pdf b/macros/latex/contrib/reledmac/examples/2-titles_not_in_line_numbering.pdf
index 1021f61ecb..6edc466546 100644
--- a/macros/latex/contrib/reledmac/examples/2-titles_not_in_line_numbering.pdf
+++ b/macros/latex/contrib/reledmac/examples/2-titles_not_in_line_numbering.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_columns_different_languages.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_columns_different_languages.pdf
index d9ca46f8e5..ae6daea2f3 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_columns_different_languages.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_columns_different_languages.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_mwe.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_mwe.pdf
index d62f7e46a6..65e77b6045 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_mwe.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_mwe.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_pages_different_languages_lualatex.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_pages_different_languages_lualatex.pdf
index 79e086308e..7864905fc5 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_pages_different_languages_lualatex.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_pages_different_languages_lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_same_page_number_in_both_side.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_same_page_number_in_both_side.pdf
index e5aaa63498..147ece9039 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_same_page_number_in_both_side.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_same_page_number_in_both_side.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted-nomax.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted-nomax.pdf
index 9b95c6bfdd..bc2e485aa7 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted-nomax.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted-nomax.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted.pdf
index 18d3b9814b..a53aafd365 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_advancedshifted.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_default.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_default.pdf
index 333e6b906a..b873ef2634 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_default.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_default.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax-shifted.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax-shifted.pdf
index f908766e8f..4437bcd188 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax-shifted.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax-shifted.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax.pdf
index 0635fef82c..0c36cb9564 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nomax.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nosync.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nosync.pdf
index c4936a579f..073be3c769 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nosync.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_nosync.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_shifted.pdf b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_shifted.pdf
index 687871bf30..7a13994ca4 100644
--- a/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_shifted.pdf
+++ b/macros/latex/contrib/reledmac/examples/3-reledpar_sync_setting_shifted.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column-continuous-numbering.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column-continuous-numbering.pdf
index 6436851359..5dbce10161 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column-continuous-numbering.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column-continuous-numbering.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column.pdf
index 125c76967c..4c574e496b 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_column_mix_with_not_column.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_columns_alignment.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_columns_alignment.pdf
index 36a70b5322..012bb74b4e 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_columns_alignment.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_columns_alignment.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_columns_titles_in_line_numbering_with_notes.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_columns_titles_in_line_numbering_with_notes.pdf
index 4d07ca87f3..fc67986e5a 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_columns_titles_in_line_numbering_with_notes.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_columns_titles_in_line_numbering_with_notes.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_inside-outside-columns.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_inside-outside-columns.pdf
index 610ba2241f..58d08bf3bd 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_inside-outside-columns.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_inside-outside-columns.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_one_series_per_pstart.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_one_series_per_pstart.pdf
index be6f88912c..36f6321386 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_one_series_per_pstart.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_one_series_per_pstart.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_pages_long_notes.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_pages_long_notes.pdf
index 89396d832c..db1ccbc5a7 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_pages_long_notes.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_pages_long_notes.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_pages_notes_leftpage.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_pages_notes_leftpage.pdf
index e62fa711ad..d71f06d80e 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_pages_notes_leftpage.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_pages_notes_leftpage.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_pages_paragraph_separator_between.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_pages_paragraph_separator_between.pdf
index d1eec4642f..c6186efd4d 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_pages_paragraph_separator_between.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_pages_paragraph_separator_between.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_pages_titles_in_line_numbering_with_notes.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_pages_titles_in_line_numbering_with_notes.pdf
index 1bc32688b6..a36ab701dd 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_pages_titles_in_line_numbering_with_notes.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_pages_titles_in_line_numbering_with_notes.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_titles_not_in_line_numbering.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_titles_not_in_line_numbering.pdf
index 90675794b5..33338d8f63 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_titles_not_in_line_numbering.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_titles_not_in_line_numbering.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/examples/4-reledpar_verse_text_between.pdf b/macros/latex/contrib/reledmac/examples/4-reledpar_verse_text_between.pdf
index 21c417fdaa..c8200f5ff5 100644
--- a/macros/latex/contrib/reledmac/examples/4-reledpar_verse_text_between.pdf
+++ b/macros/latex/contrib/reledmac/examples/4-reledpar_verse_text_between.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/migration.pdf b/macros/latex/contrib/reledmac/migration.pdf
index 3bb51a2f91..50d46b721e 100644
--- a/macros/latex/contrib/reledmac/migration.pdf
+++ b/macros/latex/contrib/reledmac/migration.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/reledmac.dtx b/macros/latex/contrib/reledmac/reledmac.dtx
index 2bce791494..2109ca38b5 100644
--- a/macros/latex/contrib/reledmac/reledmac.dtx
+++ b/macros/latex/contrib/reledmac/reledmac.dtx
@@ -602,6 +602,9 @@
% \changes{v2.39.7}{2023/08/21}{Again fix with hyperref, footnote and tabular environment}
% \changes{v2.40.0}{2023/09/30}{Add\protect\cs{Xonlyonerule} and \protect\cs{onlyoneruleX} hooks}
% \changes{v2.40.0}{2023/09/30}{Add\protect\option{onlyonerule} option}
+% \changes{v2.40.1}{2024/05/11}{Reset \protect\cs{parfillskip} after paragraphed and columned footnote}
+% \changes{v2.40.1}{2024/05/11}{Fix bug when using \protect\cs{edlabel} in \protect\env{edtabular} and related}
+% \changes{v2.40.1}{2024/05/11}{Dealing with direction in \protect\cs{footnoteXtxt} when using LuaLaTeX}
% Typeset scholarly editions with \LaTeX\thanks{This file (\dtxfilename)
% has version number \fileversion, last revised \filedate.}}
%
@@ -4528,7 +4531,7 @@
% \begin{macrocode}
%<*code>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{reledmac}[2023/08/21 v2.39.7 typesetting critical editions]%
+\ProvidesPackage{reledmac}[2024/05/11 v2.40.1 typesetting critical editions]%
% \end{macrocode}
%
% \subsection{Loading packages}
@@ -10872,6 +10875,7 @@
% \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 process parallel pages in \protect\package{eledpar}, in order to allow notes to flow from left to right pages and \emph{vice-versa}.
+% \item\cs{parfillskip} for ending of paragraph.
% 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
@@ -10883,8 +10887,12 @@
\unless\ifl@dprintingpages%
\floatingpenalty=\@MM%
\fi%
- \splittopskip=\ht\strutbox \splitmaxdepth=\dp\strutbox
- \leftskip=\z@skip \rightskip=\z@skip}
+ \splittopskip=\ht\strutbox%
+ \splitmaxdepth=\dp\strutbox%
+ \leftskip=\z@skip%
+ \rightskip=\z@skip%
+ \parfillskip=0pt plus 1fil%
+}
% \end{macrocode}
% \end{macro}
@@ -11169,6 +11177,7 @@
% Read \reff{width2columns} for the general description of the problem.
% \begin{macrocode}
\leftskip0pt \rightskip0pt
+ \parfillskip=0pt plus 1fil
\ifl@dpairing\else%
\hsize=\old@hsize%
\fi%
@@ -11349,6 +11358,7 @@
\let\bidi@RTL@everypar\@empty%
\noindent\leavevmode%
\let\bidi@RTL@everypar\old@bidi@RTL@everypar%
+ \parfillskip=0pt plus 1fil%
}%
% \end{macrocode}
% \end{macro}
@@ -13917,6 +13927,7 @@
}%
\leftskip=\z@
\rightskip=\z@
+ \parfillskip=0pt plus 1fil
\setparindentX{#1}%
\vskip\skip\@nameuse{footins#1}%
\setnoteswidthliketwocolumnsX@{#1}%
@@ -15589,6 +15600,10 @@
}%
\expandafter\newcommand\csname footnote#1text\endcsname[2][]{%
\begingroup%
+ \ifluatex%
+ \xdef\footnote@luatextextdir{\the\textdir}%
+ \xdef\footnote@luatexpardir{\the\pardir}%
+ \fi%
\csuse{vfootnote#1}{#1}{\expandonce{##2}}{##1}%
\endgroup%
}%
@@ -19897,8 +19912,8 @@
\listxadd{\@msdata@list}{%
\@msd@options@iffullpage%
\ifluatex%
- \csxdef{footnote@luatextextdir}{\the\textdir}%
- \csxdef{footnote@luatexpardir}{\the\pardir}%
+ \xdef\footnote@luatextextdir{\the\textdir}%
+ \xdef\footnote@luatexpardir{\the\pardir}%
\fi%
\csdef{@this@crossref@start}{\add@msd@c:start:msdata}%
\csdef{@this@crossref@end}{\add@msd@c:end:msdata}%
@@ -20457,12 +20472,12 @@
% \begin{macro}{\restore@edlabel}
% We need to be able to modify and restore the \protect\cs{edlabel} macro.
% \begin{macrocode}
+\let\original@edlabel\edlabel%
\newcommand{\disable@edlabel}{%
- \let\old@edlabel\edlabel%
\let\edlabel\@gobble%
}%
\newcommand{\restore@edlabel}{%
- \let\edlabel\old@edlabel%
+ \let\edlabel\original@edlabel%
}%
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/reledmac/reledmac.pdf b/macros/latex/contrib/reledmac/reledmac.pdf
index fcc8c9d698..bc1f8b20f9 100644
--- a/macros/latex/contrib/reledmac/reledmac.pdf
+++ b/macros/latex/contrib/reledmac/reledmac.pdf
Binary files differ
diff --git a/macros/latex/contrib/reledmac/reledpar.dtx b/macros/latex/contrib/reledmac/reledpar.dtx
index 9040bb3630..aff1d03da1 100644
--- a/macros/latex/contrib/reledmac/reledpar.dtx
+++ b/macros/latex/contrib/reledmac/reledpar.dtx
@@ -347,7 +347,7 @@
% \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.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}
% \changes{v2.25.2}{2021/09/27}{Fix incompatibility with \protect\package{babel} v3.61}
% \changes{v2.25.3}{2022/04/22}{Fix incompatibility with \protect\package{polyglossia} v1.55}
@@ -1410,7 +1410,7 @@
% \begin{macrocode}
%<*code>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{reledpar}[2024/02/26 v2.25.6 reledmac extension for parallel texts]%
+\ProvidesPackage{reledpar}[2024/05/11 v2.25.6a reledmac extension for parallel texts]%
% \end{macrocode}
% \subsection{Package's requirement}
diff --git a/macros/latex/contrib/reledmac/reledpar.pdf b/macros/latex/contrib/reledmac/reledpar.pdf
index 787452ce62..84a3fd4ec0 100644
--- a/macros/latex/contrib/reledmac/reledpar.pdf
+++ b/macros/latex/contrib/reledmac/reledpar.pdf
Binary files differ
diff --git a/macros/latex/contrib/rigidnotation/README.md b/macros/latex/contrib/rigidnotation/README.md
new file mode 100644
index 0000000000..06e65991d9
--- /dev/null
+++ b/macros/latex/contrib/rigidnotation/README.md
@@ -0,0 +1,31 @@
+# The rigidnotation LaTeX package
+This package provides LaTeX macros to easily and concisely typeset vectors and matrices in a flexible way such as to follow the RIGID notation convention. The package enables the user to define custom commands that can then be used in any math-mode environment to efficiently and rigorously typeset the notational elements commonly used in robotics research (and many other fields) for position vectors, rotation matrices, pose matrices, etc.
+
+## Documentation
+This package is [available on CTAN](https://ctan.org/pkg/rigidnotation), and a PDF manual is accessible here.
+
+## Local Installation
+If you want to install the package manually on your local computer, you can follow the steps outlined below.
+1. Run `kpsewhich -var-value TEXMFHOME` to get the path to your TeX package home.
+Assuming that your TeX package home is `$TEXHOME`,
+2. Run `mkdir -p $TEXHOME/tex/latex/rigidnotation/` to create a directory for this package.
+3. Run `tex rigidnotation.ins` to generate the `rigidnotation.sty` macro file.
+3. Run `cp rigidnotation.sty $TEXHOME/tex/latex/rigidnotation/` to install the package.
+3. Run `pdflatex -interaction=nonstopmode rigidnotation.dtx` to build the documentation.
+5. Run `texhash $TEXHOME` to update the LaTeX package tree.
+
+## Requirements
+This package depends on [mathtools](https://ctan.org/pkg/mathtools) and [xparse](https://ctan.org/pkg/xparse) packages, both of which are widely used.
+
+## License
+Copyright (C) 2024 Philippe Nadeau
+
+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. \ No newline at end of file
diff --git a/macros/latex/contrib/rigidnotation/rigidnotation.dtx b/macros/latex/contrib/rigidnotation/rigidnotation.dtx
new file mode 100644
index 0000000000..565ac2bb50
--- /dev/null
+++ b/macros/latex/contrib/rigidnotation/rigidnotation.dtx
@@ -0,0 +1,507 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2024 Philippe Nadeau
+% --------------------------------
+%
+% 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.
+%
+% \fi
+%
+% \iffalse
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{rigidnotation}[2024/05/13 1.0.0 Rigid Notation]
+%
+%<*driver>
+\documentclass{ltxdoc}
+% This package is required to build its own documentation!
+\usepackage{rigidnotation}
+\NewRigidNotation{Vel}{v}
+\NewRigidNotation{Acc}{a}
+\setlength{\fboxsep}{0pt}
+\setlength{\fboxrule}{0.1pt}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+\DocInput{rigidnotation.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \def\oargument#1{\texttt{[\meta{#1}]}}
+% \def\margument#1{\texttt{\{\meta{#1}\}}}
+%
+%
+% \changes{v1.0}{2024-05-13}{Initial version}
+%
+% \GetFileInfo{rigidnotation.sty}
+%
+% \DoNotIndex{}
+%
+% \title{The \textsf{rigidnotation} package\thanks{This document
+% corresponds to \textsf{rigidnotation}~\fileversion,
+% dated \filedate.}}
+% \author{Philippe Nadeau \\ \texttt{philippe.nadeau [at] robotics.utias.utoronto.ca}}
+% \date{\filedate}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package provides \LaTeX\ macros to easily and concisely typeset vectors and matrices in a flexible way such as to follow the RIGID notation convention. The package enables the user to define custom commands that can then be used in any math-mode environment to efficiently and rigorously typeset the notational elements commonly used in robotics research (and many other fields) for position vectors, rotation matrices, pose matrices, etc.
+% \end{abstract}
+%
+% \section{Introduction}
+% A useful typesetting system should reduce to a minimum the number of keystrokes required by the user while enabling a flexible usage of the system and cater to various needs. This is the philosophy behind this package.
+%
+% This package makes it easy to typeset vectors and matrices following the RIGID convention, which is compliant with the \textit{ISO 800000 Standard on Quantities and Units}. To do so, this package defines a \textit{command factory} that can be used to concisely generate multiple commands, each one dedicated to a user-defined quantity (e.g. position vector, velocity vector, rotation matrix). The user can then call the generated commands within math-mode environments to typeset a concise representation of the quantity.
+%
+% For instance, |\Pos[\dot]{s}{b}{w}\Tran| produces
+% \begin{equation*}
+% \resizebox{1cm}{!}{$\Pos[\dot]{s}{b}{w}\Tran$}
+% \end{equation*}
+% which very concisely represents the time-derivative of the transposed position vector of subject $s$ with respect to basis $b$ when expressed in coordinate system $w$. When typing the keystrokes, the user can think: \textit{position of $s$ with respect to $b$ expressed in $w$, transposed}. Except for the accent, the order in which the elements are typed respects the order in which they can be spoken, making it easier to remember the order of the arguments.
+%
+% The \textit{subject} of a quantity is the elements to which the quantity pertains (e.g. the orientation of the subject, the velocity of the subject). The \textit{basis} is the element relative to which the quantity is observed/measured/defined (e.g. the velocity of the car/subject relative to the train/basis). A vector quantity is commonly pictured as an arrow pointing from the basis to the subject. To facilitate computations, quantities are \textit{expressed} in a \textit{coordinate system} such that they can be represented as a set of numbers. Sometime it makes sense to specify only a subset of the four elements: quantity, subject, basis, and coordinate system. This package allows the user to specify only the necessary elements. A \textit{concise mode} can also be enabled such that when the basis and coordinate system are the same, only the basis is denoted.
+%
+% \section{Usage}
+% The typical usage of the package involves defining quantities of interest in the preamble, like
+% \begin{verbatim}
+% \usepackage{rigidnotation}
+% \NewRigidNotation{Vel}{v} % Velocity
+% \NewRigidNotation{Acc}{a} % Acceleration
+% % Whether the concise notation is desired
+% \SetConciseNotation{\BooleanTrue}
+% \end{verbatim}
+% in which quantities representing velocities and accelerations are defined. Then, in any math-mode environment, variations of the following commands can be used:
+% \begin{verbatim}
+% \begin{equation*}
+% 1:\Vel \quad
+% 2:\Vel[\hat] \quad
+% 3:\Vel[\ddot]{s} \quad
+% 4:\SetConciseNotation \Vel{s}{b}{b} \quad
+% 5:\Vel{s}{b}{c} \quad
+% 6:\UnsetConciseNotation \Vel{s}{b}{b} \quad
+% 7:\Acc{s}{b}\Tran \quad
+% 8:\Acc{s}{b}^2 \quad
+% 9:\Rot{s}{b}\Inv \quad
+% \end{equation*}
+% \end{verbatim}
+% to produce
+% \begin{equation*}
+% 1:\Vel \quad
+% 2:\Vel[\hat] \quad
+% 3:\Vel[\ddot]{s} \quad
+% 4:\SetConciseNotation \Vel{s}{b}{b} \quad
+% 5:\Vel{s}{b}{c} \quad
+% 6:\UnsetConciseNotation \Vel{s}{b}{b} \quad
+% 7:\Acc{W}{b}\Tran \quad
+% 8:\Acc{W}{b}^2 \quad
+% 9:\Rot{W}{b}\Inv
+% \end{equation*}
+% where the concise notation was enabled for items 4 and 5 but disabled for element 6 (notice the difference). Also note that command |\Rot| was used even though it was not defined in the preamble. This is because the package comes with a few pre-defined quantities: |\Pos|, |\Rot|, and |\Pose|.
+%
+% \subsection{Commands}
+% In the following, arguments surrounded by square brackets are optional while those surrounded by curly brackets are mandatory like \oargument{optional} and \margument{mandatory} respectively.
+%
+% \vspace{5mm}\DescribeMacro{\NewRigidNotation}
+% \hspace{-6.5mm} \textbf{Arguments}:
+% \begin{enumerate}
+% \item \margument{name}: Name of the command to create.
+% \item \margument{symbol}: Symbol used to represent the quantity.
+% \end{enumerate}
+% \textbf{Description}:\\
+% Define a new command that can be used to typeset a physical or mathematical quantity according to the RIGID convention.
+% For instance, |\NewRigidNotation{Pos}{p}| can be used to create a new command |\Pos| for typesetting position vectors, with the |p| symbol being used to represent the quantity. After it has been defined, the new command can be used with the following arguments:
+% \begin{enumerate}
+% \item \oargument{accent}: Command to put an accent over the letter (e.g. |\hat|).
+% \item \oargument{subject}: The symbol of the \textit{subject} (e.g. vector endpoint).
+% \item \oargument{basis}: The symbol of the \textit{basis} (e.g. vector origin).
+% \item \oargument{coord}: Symbol for the coordinate system potentially used.
+% \end{enumerate}
+% Hence, this is a kind of meta-command or command factory: |\NewRigidNotation| creates a new command that can be used with arguments.
+%For instance, calling |\NewRigidNotation{Pos}{p}| defines a new command |\Pos| that can be used with zero or more arguments, as in |\Pos[\dot]{a}{b}{c}|, in which |a| is the subject symbol, |b| is the basis symbol, |c| is the coordinate system, and a dot ($\cdot$) will be placed above the |p| in the notation, producing $\Pos[\dot]{a}{b}{c}$.
+%
+% \vspace{5mm}\DescribeMacro{\SetConciseNotation}
+% \hspace{-6.5mm} \textbf{Arguments}:
+% \begin{enumerate}
+% \item \oargument{bool}: Either |\BooleanTrue| or |\BooleanFalse|.
+% \end{enumerate}
+% \textbf{Description}:\\
+% Sets whether to use the concise notation that omits to state the coordinate system when the basis and coordinate systems are the same. Calling |\SetConciseNotation| with no argument will enable the concise notation, which is the same as |\SetConciseNotation{\BooleanTrue}|. Note that, although the argument is optional, curly brackets are used.
+% Also note that the concise notation can be enabled/disabled multiple times throughout the document.
+%
+% \vspace{5mm}\DescribeMacro{\UnsetConciseNotation}
+% \hspace{-6.5mm} \textbf{Arguments}: None.\\
+% \textbf{Description}:\\
+% Informs the package that the concise notation should not be used. This is equivalent to |\SetConciseNotation{\BooleanFalse}| and is the default behaviour.
+%
+% \vspace{5mm}\DescribeMacro{\Tran}
+% \hspace{-6.5mm} Macro that typesets a $\cdot^\mathsf{T}$ in the right super-script position to denote the transpose\
+% as in $\Pos{a}{b}{c}\Tran$.
+%
+% \vspace{5mm}\DescribeMacro{\Inv}
+% \hspace{-6.5mm} Macro that typesets a $\cdot^{-1}$ in the right super-script position to denote the inverse\
+% as in $\Pos{a}{b}{c}\Inv$.
+%
+% \vspace{5mm}\DescribeMacro{\Herm}
+% \hspace{-6.5mm} Macro that typesets a $\cdot^\mathsf{H}$ in the right super-script position to denote the Hermitian\
+% as in $\Rot{a}{b}\Herm$.
+%
+% \vspace{5mm}\DescribeMacro{\Conj}
+% \hspace{-6.5mm} Macro that typesets a $\cdot^\ast$ in the right super-script position to denote the complex conjugate\
+% as in $\Pos\Conj$.
+%
+% \MaybeStop{}
+%
+% \section{Implementation}
+%
+% \begin{macro}{\SetConciseNotation}
+% Defines whether the concise notation is used or not.
+% When used the concise notation will ommit mentionning
+% the reference frame when the source and reference are the same.
+%
+% To use the concise notation, either call |\SetConciseNotation|
+% with no argument or with |\SetConciseNotation{\BooleanTrue}|.
+% \begin{macrocode}
+\usepackage{xparse}
+\usepackage{mathtools}
+
+%This box is used to measure the width of the post-script
+\newsavebox{\RN@postbox}
+\newlength{\RN@postboxwd}
+\newsavebox{\RN@expbox}
+\newlength{\RN@expboxwd}
+%Spacing before and after the symbol
+\def\RN@prespace{0.08em}
+\def\RN@postspace{0.23em}
+
+\NewDocumentCommand{\SetConciseNotation}{g}
+{
+ \newif\IfRN@C
+ \IfNoValueTF{#1}
+ {
+ \RN@Ctrue
+ }
+ {
+ \IfBooleanTF{#1}
+ {
+ \RN@Ctrue
+ }
+ {
+ \RN@Cfalse
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UnsetConciseNotation}
+% Disables the concise notation.
+% This is equivalent to |\SetConciseNotation{\BooleanFalse}|.
+% \begin{macrocode}
+\def\UnsetConciseNotation{\SetConciseNotation{\BooleanFalse}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\RN@makecmd}
+% \textbf{Arguments}:
+% \begin{enumerate}
+% \item \oargument{accent}: Command to put an accent over the letter (e.g. |\hat|).
+% \item \margument{qty}: Symbol for the quantity to represent.
+% \item \oargument{subject}: The symbol of the \textit{subject} (e.g. vector endpoint).
+% \item \oargument{basis}: The symbol of the \textit{basis} (e.g. vector origin).
+% \item \oargument{coord}: Symbol for the coordinate system potentially used.
+% \end{enumerate}
+% \textbf{Description}:\\
+% Defines a typesetting command from arguments. Main typesetting routine that should not be needed by the end-user. Instead, the end-user should use |\NewRigidNotation| to define typesetting commands. If the basis and coordinate system are the same, the coordinate system is omitted when the |RN@C| keyword is set.
+% \begin{macrocode}
+\NewDocumentCommand{\RN@makecmd}{omggg}
+{
+ \IfNoValueTF{#1}{\def\RN@symb{\boldsymbol{#2}}}{\def\RN@symb{#1{\boldsymbol{#2}}}}
+ \IfNoValueTF{#3}
+ {%subject is not specified
+ \IfNoValueTF{#4}
+ {%basis is not specified
+ \IfNoValueTF{#5}
+ {%subject, basis and coordinate system are not specified
+ \RN@symb
+ }
+ {%subject and basis are not specified, coordinate system is specified
+ \hspace{\RN@prespace}
+ \prescript{#5}{}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ }
+ }
+ {%basis is specified
+ \IfNoValueTF{#5}%
+ {%basis is specified, subject and coordinate system are not specified
+ \hspace{\RN@prespace}
+ \prescript{}{#4}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ }
+ {%basis and coordinate system are specified, subject is not specified
+ \IfEq{#4}{#5}
+ {
+ \IfRN@C
+ {%basis and coordinate system are the same and RN@C is set
+ \hspace{\RN@prespace}
+ \prescript{}{#4}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ }
+ {
+ \hspace{\RN@prespace}
+ \prescript{#5}{#4}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ }
+ }
+ {
+ \hspace{\RN@prespace}
+ \prescript{#5}{#4}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ }
+ }
+ }
+ %If there is no subject, no space is needed on the right of the symbol
+ \setlength{\RN@postboxwd}{0pt}
+ }
+ {%subject is specified
+ \IfNoValueTF{#4}
+ {%basis is not specified
+ \IfNoValueTF{#5}
+ {%subject is specified, basis and coordinate system are not specified
+ \RN@symb
+ \hspace{-\RN@postspace}
+ \prescript{}{#3}{}
+ }
+ {%basis is not specified, subject and coordinate system are specified
+ \hspace{\RN@prespace}
+ \prescript{#5}{}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ \hspace{-\RN@postspace}
+ \prescript{}{#3}{}
+ }
+ }
+ {%basis is specified
+ \IfNoValueTF{#5}
+ {%subject and basis are specified, coordinate system is not specified
+ \hspace{\RN@prespace}
+ \prescript{}{#4}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ \hspace{-\RN@postspace}
+ \prescript{}{#3}{}
+ }
+ {%subject, basis, and coordinate system are specified
+ \def\RN@argfour{#4}
+ \def\RN@argfive{#5}
+ \ifx\RN@argfour\RN@argfive
+ {
+ \IfRN@C
+ {%basis and coordinate system are the same and RN@C is set
+ \hspace{\RN@prespace}
+ \prescript{}{#4}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ \hspace{-\RN@postspace}
+ \prescript{}{#3}{}
+ }
+ \else
+ {
+ \hspace{\RN@prespace}
+ \prescript{#5}{#4}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ \hspace{-\RN@postspace}
+ \prescript{}{#3}{}
+ }
+ \fi
+ }
+ \else
+ {
+ \hspace{\RN@prespace}
+ \prescript{#5}{#4}{
+ \hspace{-\RN@prespace}
+ \RN@symb
+ }
+ \hspace{-\RN@postspace}
+ \prescript{}{#3}{}
+ }
+ \fi
+ }
+ }
+ %If there is a subject, we need to know the width
+ %of the symbol to bring the exponent closer
+ \sbox{\RN@postbox}{$#3$}
+ \setlength{\RN@postboxwd}{\wd\RN@postbox}
+ }
+ %If the following command is an exponent-type command,
+ %we bring it closer to the symbol.
+ %The next line has to be the last of the macro
+ \@ifnextchar^{\hspace{\RN@postspace}\hspace{-\RN@postboxwd}}{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\NewRigidNotation}
+% \textbf{Arguments}:
+% \begin{enumerate}
+% \item \margument{cmd}: New command name.
+% \item \margument{sym}: Symbol for the quantity to represent.
+% \end{enumerate}
+% \textbf{Description}:
+% Defines a new command that can be used to typeset the given symbol using the RIGID convention.
+% This essentially expands |\NewRigidNotation{cmd}{sym}| into |\NewDocumentCommand{cmd}{oggg}{\RN@makecmd[#1]{sym}{#2}{#3}{#4}}| such that |\cmd| can be used afterward with up to four arguments.
+% \begin{macrocode}
+\NewDocumentCommand{\NewRigidNotation}{mm}%
+{%
+ \expandafter\NewDocumentCommand\csname #1\endcsname{oggg}%
+ {%
+ \expandafter\csname RN@makecmd\endcsname[##1]{#2}{##2}{##3}{##4}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Tran}
+% Macro that typesets a $\mathsf{T}$ in the right super-script position, closer to the quantity than normal, and with a smaller font size.
+% \begin{macrocode}
+\def\Tran{%
+ \sbox{\RN@expbox}{${\scriptscriptstyle\mathsf{T}}$}%
+ \setlength{\RN@expboxwd}{\wd\RN@expbox}%
+ \ifnum \RN@postboxwd>0%
+ \hspace{\RN@postspace}%
+ \hspace{-\RN@postboxwd}%
+ \ifnum \RN@postboxwd>\RN@expboxwd%
+ \mathmakebox[\RN@postboxwd][l]{%
+ {}^{\scriptscriptstyle\mathsf{T}}%
+ }%
+ \else%
+ \mathmakebox[\RN@expboxwd][l]{%
+ {}^{\scriptscriptstyle\mathsf{T}}%
+ }%
+ \fi%
+ \else%
+ ^{\scriptscriptstyle\mathsf{T}}%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Inv}
+% Macro that typesets a $\mathsf{-1}$ in the right super-script position, closer to the quantity than normal, and with a smaller font size.
+% \begin{macrocode}
+\def\Inv{%
+ \sbox{\RN@expbox}{${\scriptscriptstyle{-1}}$}%
+ \setlength{\RN@expboxwd}{\wd\RN@expbox}%
+ \ifnum \RN@postboxwd>0%
+ \hspace{\RN@postspace}%
+ \hspace{-\RN@postboxwd}%
+ \ifnum \RN@postboxwd>\RN@expboxwd%
+ \mathmakebox[\RN@postboxwd][l]{%
+ {}^{\scriptscriptstyle{-1}}%
+ }%
+ \else%
+ \mathmakebox[\RN@expboxwd][l]{%
+ {}^{\scriptscriptstyle{-1}}%
+ }%
+ \fi%
+ \else%
+ ^{\scriptscriptstyle{-1}}%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Herm}
+% Macro that typesets a $\mathsf{H}$ in the right super-script position, closer to the quantity than normal, and with a smaller font size.
+% \begin{macrocode}
+\def\Herm{%
+ \sbox{\RN@expbox}{${\scriptscriptstyle\mathsf{H}}$}%
+ \setlength{\RN@expboxwd}{\wd\RN@expbox}%
+ \ifnum \RN@postboxwd>0%
+ \hspace{\RN@postspace}%
+ \hspace{-\RN@postboxwd}%
+ \ifnum \RN@postboxwd>\RN@expboxwd%
+ \mathmakebox[\RN@postboxwd][l]{%
+ {}^{\scriptscriptstyle\mathsf{H}}%
+ }%
+ \else%
+ \mathmakebox[\RN@expboxwd][l]{%
+ {}^{\scriptscriptstyle\mathsf{H}}%
+ }%
+ \fi%
+ \else%
+ ^{\scriptscriptstyle\mathsf{H}}%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Conj}
+% Macro that typesets a $\ast$ in the right super-script position, closer to the quantity than normal, and with a smaller font size.
+% \begin{macrocode}
+\def\Conj{%
+ \sbox{\RN@expbox}{${\scriptscriptstyle\ast}$}%
+ \setlength{\RN@expboxwd}{\wd\RN@expbox}%
+ \ifnum \RN@postboxwd>0%
+ \hspace{\RN@postspace}%
+ \hspace{-\RN@postboxwd}%
+ \ifnum \RN@postboxwd>\RN@expboxwd%
+ \mathmakebox[\RN@postboxwd][l]{%
+ {}^{\scriptscriptstyle\ast}%
+ }%
+ \else%
+ \mathmakebox[\RN@expboxwd][l]{%
+ {}^{\scriptscriptstyle\ast}%
+ }%
+ \fi%
+ \else%
+ ^{\scriptscriptstyle\ast}%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{Default settings}
+% By default, the following commonly used commands are provided. They are used to typeset position vectors, rotation matrices and pose matrices respectively. By default, the concise notation is disabled.
+% \begin{macrocode}
+\NewRigidNotation{Pos}{p}
+\NewRigidNotation{Rot}{R}
+\NewRigidNotation{Pose}{T}
+\UnsetConciseNotation
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/rigidnotation/rigidnotation.ins b/macros/latex/contrib/rigidnotation/rigidnotation.ins
new file mode 100644
index 0000000000..2330745216
--- /dev/null
+++ b/macros/latex/contrib/rigidnotation/rigidnotation.ins
@@ -0,0 +1,41 @@
+%%
+%% Copyright (C) 2024 Philippe Nadeau
+%%
+%% 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.
+%%
+\input docstrip.tex
+\keepsilent
+\usedir{tex/latex/rigidnotation}
+\preamble
+This is a generated file.
+Copyright (C) 2024 Philippe Nadeau
+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.
+\endpreamble
+\generate{\file{rigidnotation.sty}{\from{rigidnotation.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 rigidnotation.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file rigidnotation.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+\endbatchfile \ No newline at end of file
diff --git a/macros/latex/contrib/rigidnotation/rigidnotation.pdf b/macros/latex/contrib/rigidnotation/rigidnotation.pdf
new file mode 100644
index 0000000000..e22454cc13
--- /dev/null
+++ b/macros/latex/contrib/rigidnotation/rigidnotation.pdf
Binary files differ
diff --git a/macros/latex/contrib/rpgicons/LICENSE b/macros/latex/contrib/rpgicons/LICENSE
new file mode 100644
index 0000000000..4db9b5af29
--- /dev/null
+++ b/macros/latex/contrib/rpgicons/LICENSE
@@ -0,0 +1,415 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. 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.
+
+2. 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.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+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.
+
+4. 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.
+
+5. 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.
+
+6. 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. 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.
+
+ b. 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.
+
+ c. 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.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. 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;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. 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 6, above, are met with
+regard to the Derived Work.
+
+8. 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 4, above.
+
+9. 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.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. 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 6 above, concerning changes from the Work.
+
+11. 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.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. 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.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. 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 comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. 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.
+
+ 4. If you make an `intention announcement' as described in 2b. 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.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+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.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `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 GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+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.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% 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.
+
+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 `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ 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.
diff --git a/macros/latex/contrib/rpgicons/README.md b/macros/latex/contrib/rpgicons/README.md
new file mode 100644
index 0000000000..e889b70b03
--- /dev/null
+++ b/macros/latex/contrib/rpgicons/README.md
@@ -0,0 +1,30 @@
+![Version 1.8.3](https://img.shields.io/badge/version-1.8.3-blue)
+
+<img width="200" alt="rpgicons-example" src="https://github.com/jasperhabicht/rpgicons/assets/6378801/81a1d0aa-7a4f-4f83-bbdc-3bc3332023b2" />
+
+# The `rpgicons` package
+
+This package provides a set of high-quality icons for use in notes for tabletop role-playing games.
+The icons are meant to be used in the body text, but they can also be used in other contexts such
+as graphics or diagrams. The package comes in two variants, one based on the `l3draw` package and one
+based on PGF/Ti*k*Z.
+
+As of version 1.4.0, an `l3draw` variant of the `rpgicons` package exists which is loaded by default.
+The `l3draw` package does not provide the same variety of styles as Ti*k*Z does.
+
+The PGF veriant of the `rpgicons` package provides the icons as Ti*k*Z shapes. Since the commands to
+typeset the icons use `tikzpicture` environments, these commands should not be used inside another
+`tikzpicture`. However, because the package defines the icons as Ti*k*Z shapes, it is possible to
+use the icons in `tikzpicture` environments directly. Apart from that, as of version 1.1.0, the
+package provides a way to define custom commands to typeset the icons as boxed material which is
+safe to use in a tikzpicture context. As of version 1.3.1, the package provides an additional way
+to use the icons as Ti*k*Z pics.
+
+The `rpgicons` package is installed by copying the relevant `.sty` file into the working or `texmf`
+directory. The package is loaded by calling `\usepackage{rpgicons}` in the preamble of the document.
+To load the PGF variant, the package can be loaded with the option `pgf`. The `l3draw` variant is
+loaded per default. The PGF or `l3draw` variants can be loaded directly via
+`\usepackage{rpgicons-pgf}` or`\usepackage{rpgicons-l3}`.
+
+This package including all files is subject to the LPPL 1.3c license.
+Copyright 2024 Jasper Habicht (mail(at)jasperhabicht.de).
diff --git a/macros/latex/contrib/rpgicons/rpgicons-doc.pdf b/macros/latex/contrib/rpgicons/rpgicons-doc.pdf
new file mode 100644
index 0000000000..7fa0c036d7
--- /dev/null
+++ b/macros/latex/contrib/rpgicons/rpgicons-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/rpgicons/rpgicons-doc.tex b/macros/latex/contrib/rpgicons/rpgicons-doc.tex
new file mode 100644
index 0000000000..7eef59a1a4
--- /dev/null
+++ b/macros/latex/contrib/rpgicons/rpgicons-doc.tex
@@ -0,0 +1,868 @@
+% File: rpgicons-doc.tex
+% Copyright 2024 Jasper Habicht (mail(at)jasperhabicht.de).
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License version 1.3c,
+% available at http://www.latex-project.org/lppl/.
+%
+% This file is part of the `rpgicons' package (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+\documentclass[a4paper]{article}
+\def\rpgiconsfileversion{1.8.3}
+\def\rpgiconsfiledate{15 May 2024}
+
+\usepackage[T1]{fontenc}
+\usepackage{Alegreya}
+\usepackage{AlegreyaSans}
+\usepackage{FiraMono}
+
+\usepackage{geometry, longtable, booktabs, tcolorbox, hyperref}
+\geometry{margin=25mm, left=45mm}
+
+\usepackage{fancyhdr}
+\pagestyle{fancy}
+\fancyhf{}
+\renewcommand{\headrulewidth}{0pt}
+\fancyfoot[R]{\thepage}
+
+\linespread{1.1}\selectfont
+\addtolength{\skip\footins}{1em plus 5pt}
+\makeatletter
+\renewcommand*{\thefootnote}{\fnsymbol{footnote}}
+\renewcommand{\@makefntext}[1]{%
+ \noindent\hbox to 0.75em{\normalfont\@thefnmark\hss}~#1%
+}
+\makeatother
+
+\tcbuselibrary{listings}
+\lstdefinestyle{rpgiconsdocmacro}{
+ basicstyle=\small\ttfamily,
+ literate=*{<}{{{\color{black!50}\guilsinglleft}}}1
+ {>}{{{\color{black!50}\guilsinglright}}}1,
+ keywords={},
+ moredelim=[is][\bfseries]{|}{|},
+ moredelim=[is][\color{black!50}]{!}{!},
+}
+\lstdefinestyle{rpgiconsdoccodeexample}{
+ basicstyle=\small\ttfamily,
+ keywords={},
+}
+
+\hypersetup{colorlinks}
+
+\ExplSyntaxOn
+\int_new:N \l_rpgicons_doc_change_int
+\NewDocumentCommand{\changes}{ m m m }{
+ \int_incr:N \l_rpgicons_doc_change_int
+ \prop_new:c { l_rpgicons_doc_change_
+ \int_to_roman:n { \l_rpgicons_doc_change_int } _prop }
+ \prop_put:cnn { l_rpgicons_doc_change_
+ \int_to_roman:n { \l_rpgicons_doc_change_int } _prop } { version } {#1}
+ \prop_put:cnn { l_rpgicons_doc_change_
+ \int_to_roman:n { \l_rpgicons_doc_change_int } _prop } { date } {#2}
+ \prop_put:cnn { l_rpgicons_doc_change_
+ \int_to_roman:n { \l_rpgicons_doc_change_int } _prop } { changes } {#3}
+}
+\NewDocumentCommand{\printchanges}{ }{
+ \section{Changes}
+ \begin{description}
+ \int_step_inline:nn { \l_rpgicons_doc_change_int } {
+ \item[
+ \prop_item:cn { l_rpgicons_doc_change_
+ \int_to_roman:n { ##1 } _prop } { version } ]
+ ( \prop_item:cn { l_rpgicons_doc_change_
+ \int_to_roman:n { ##1 } _prop } { date } ) \\
+ \prop_item:cn { l_rpgicons_doc_change_
+ \int_to_roman:n { ##1 } _prop } { changes }
+ }
+ \end{description}
+}
+
+\tl_new:N \l_rpgicons_doc_doctitle_tl
+\NewExpandableDocumentCommand{\makedoctitle}{ o m o m m o m }{
+ \hypersetup{
+ pdfauthor={#5},
+ pdftitle={\IfValueTF{#1}{#1}{#2}},
+ pdfsubject={\IfValueTF{#3}{#3}{#4}}
+ }
+ \tl_set:Nn \l_rpgicons_doc_doctitle_tl {
+ \group_begin:
+ \tcbset{
+ title ~ style ~ hook/.style={
+ boxrule=2pt,
+ fontupper=\huge\ttfamily
+ }
+ }
+ \setlength{\parindent}{0pt}\sffamily
+ \Huge{\bfseries #2}\par\bigskip
+ \Large #4\par\bigskip
+ \large #5
+ \IfValueT{#6}{
+ \,\footnote{#6}\par\bigskip
+ }
+ #7\par\bigskip
+ \rule{\textwidth}{.08em}
+ \group_end:
+ }
+}
+
+\NewExpandableDocumentCommand{\printdoctitle}{ }{
+ \tl_use:N \l_rpgicons_doc_doctitle_tl
+}
+\ExplSyntaxOff
+
+\tcbset{
+ size=small,
+ arc=2.5pt,
+ outer arc=2.5pt,
+ colframe=black!10,
+ colback=black!10,
+ title style hook/.style={}
+}
+
+\NewTCBListing{macrodef}{ }{
+ listing only,
+ listing style={rpgiconsdocmacro},
+ grow to left by=2cm,
+ boxrule=0pt,
+ after={\par\smallskip\noindent}
+}
+
+\NewTCBListing{codeexample}{ }{
+ text side listing,
+ lefthand width=4.5cm,
+ listing style={rpgiconsdoccodeexample},
+ after={\par\smallskip\noindent}
+}
+
+\NewTotalTCBox{\macro}{ O{} v }{
+ verbatim,
+ size=tight,
+ arc=1pt,
+ outer arc=1pt,
+ top=0.5pt,
+ bottom=0.5pt,
+ left=2pt,
+ right=2pt,
+ boxrule=0pt,
+ colframe=black!10,
+ colback=black!10,
+ fontupper=\small\ttfamily,
+ #1
+}{\vphantom{/g}\lstinline^#2^}
+
+\NewTotalTCBox{\titlemacro}{ s O{} m }{
+ verbatim,
+ size=tight,
+ arc=1pt,
+ outer arc=1pt,
+ top=0.5pt,
+ bottom=0.5pt,
+ left=2pt,
+ right=2pt,
+ boxrule=0pt,
+ colframe=black!10,
+ colback=black!10,
+ fontupper=\small\ttfamily,
+ title style hook,
+ #2
+}{\vphantom{/g}\IfBooleanT{#1}{\textbackslash}#3}
+
+\usepackage{rpgicons-l3}
+\usepackage[pics]{rpgicons-pgf}
+
+\ExplSyntaxOn
+\clist_new:N \l_rpgicons_doc_logo_icons_clist
+\clist_new:N \l_rpgicons_doc_logo_colors_clist
+\cs_generate_variant:Nn { \color_set:nnn } { nne }
+
+\clist_set:Nn \l_rpgicons_doc_logo_colors_clist {
+ 264653 , 287271 , 2a9d8f , e9c46a , f4a261 , e76f51
+}
+\int_step_inline:nn { \clist_count:N \l_rpgicons_doc_logo_colors_clist } {
+ \color_set:nne { rpgiconslogo \int_to_roman:n { #1 } } { HTML } {
+ \clist_item:Nn \l_rpgicons_doc_logo_colors_clist { #1 }
+ }
+}
+\clist_set:Nn \l_rpgicons_doc_logo_icons_clist {
+ twentyside , charisma , armor , buff , ranged , proficiency
+}
+
+\NewDocumentCommand{\rpgiconslogo}{ O{1} }{
+ \draw_begin:
+ \draw_transform_scale:n { #1 }
+ \int_step_inline:nn { \clist_count:N \l_rpgicons_doc_logo_icons_clist } {
+ \hcoffin_set:Nn \l_tmpa_coffin {
+ \draw_suspend_begin:
+ \RPGIconsAbility[negative]{
+ \clist_item:Nn \l_rpgicons_doc_logo_icons_clist { ##1 }
+ }[color=rpgiconslogo \int_to_roman:n { ##1 } ]
+ \draw_suspend_end:
+ }
+ \draw_scope_begin:
+ \draw_transform_shift:n {
+ % fix bug in older l3draw version
+ \cs_if_exist:NTF \__draw_transform_shift:nnnn {
+ \draw_point_polar:nn { 0.33cm } { 60 * ##1 + 10 }
+ } {
+ \draw_point_transform:n { \draw_point_polar:nn { 0.33cm } { 60 * ##1 + 10 } }
+ }
+ }
+ \draw_coffin_use:Nnn \l_tmpa_coffin { hc } { vc }
+ \draw_scope_end:
+ }
+ \draw_end:
+}
+\ExplSyntaxOff
+
+\NewDocumentEnvironment{rpgiconsiconlist}{ }{
+ \begin{longtable}{ @{} p{20em} p{5em} p{\dimexpr\linewidth-25em-4\tabcolsep} @{} }
+ \toprule
+ \textbf{Command} & \textbf{Icon} & \textbf{Shape} \\
+ \midrule\endhead
+}{
+ \bottomrule
+ \end{longtable}
+}
+
+\makedoctitle
+ [The rpgicons package]
+ {The \titlemacro{rpgicons} package}
+ {A set of high-quality icons for use in notes for tabletop role-playing games}
+ {Jasper Habicht}[E-mail: \href{mailto:mail@jasperhabicht.de}{mail@jasperhabicht.de}. I am grateful to Joseph Wright who fixes bugs at an astonishing speed and to all other contributors to this package.]
+ {Version \rpgiconsfileversion, released on \rpgiconsfiledate}
+
+\changes{v1.1.0}{2023/08/15}{First public release.}
+\changes{v1.1.1}{2023/11/15}{Fudge dice icon added.}
+\changes{v1.1.2}{2023/11/16}{Bug fixed that caused wrong spacing when using dice icons without quantifier.}
+\changes{v1.2.0}{2023/11/20}{Corrections in the manual. Icons for six-sided dice with one to nine pips, plus sign and minus sign added.}
+%\changes{v1.2.1}{2023/11/20}{Documentation of lengths for spacing added.}
+%\changes{v1.2.2}{2023/11/21}{Corrections in the manual.}
+\changes{v1.3.0}{2023/11/21}{Option to set background color added. Renamed global option.}
+\changes{v1.3.1}{2024/02/18}{Correction of initializing code. Correction of default value of after sep. Addition of pics.}
+%\changes{v1.3.2}{2024/02/19}{Reformatting of the manual.}
+%\changes{v1.3.4}{2024/02/20}{Minor corrections of some shapes.}
+\changes{v1.4.0}{2024/02/21}{L3 variant added.}
+\changes{v1.4.1}{2024/02/21}{Corrections in L3 variant.}
+\changes{v1.4.2}{2024/02/21}{Alternative set of commands in L3 variant defined.}
+\changes{v1.4.3}{2024/02/22}{Added option to L3 variant to enable upward compatibility.}
+\changes{v1.4.4}{2024/02/24}{Added styles for every instance of command or shape, correction of recent \titlemacro{l3draw} code.}
+\changes{v1.5.0}{2024/02/25}{Alternative set of commands defined, added support of styles in pics.}
+\changes{v1.5.1}{2024/02/28}{Addition of opacity to L3 variant.}
+\changes{v1.5.2}{2024/02/29}{Unification of scaling, minor corrections.}
+\changes{v1.5.3}{2024/03/03}{Optimisation of code in L3 variant.}
+\changes{v1.5.4}{2024/03/06}{Correction of baseline settings in L3 variant, added accessibililty support for L3 variant.}
+%\changes{v1.5.5}{2024/03/07}{Optimsation of accessibililty support for L3 variant.}
+\changes{v1.6.0}{2024/03/15}{Four attribute icons added, minor correction of styles.}
+\changes{v1.6.1}{2024/03/16}{Unified size of negative attribute icon.}
+\changes{v1.7.0}{2024/03/16}{Macro for easy typesetting using roll dice syntax added in L3 variant, compatibility mode updated.}
+\changes{v1.8.0}{2024/03/24}{Unified wrapper to load either package variant.}
+\changes{v1.8.2}{2024/04/28}{Roll dice syntax for PGF variant.}
+\changes{v1.8.3}{2024/05/15}{Minor compatibility fix. Example of how to use pics added to ducumentation.}
+
+\begin{document}
+
+\vspace*{-1cm}
+\noindent\rpgiconslogo[4]
+
+\bigskip
+
+\printdoctitle
+
+\bigskip
+
+\section{Introduction}
+
+The \macro{rpgicons} package provides a set of high-quality icons for use in notes for tabletop role-playing games. The icons are meant to be used in the body text, but they can also be used in other contexts such as graphics or diagrams.
+
+The package comes in two variants, a L3 variant based on the \macro{l3draw} package which is loaded per default and a PGF variant based on PGF/Ti\emph{k}Z.
+
+\section{Loading the package}
+
+To install the package, copy the relevant package files \macro{rpgicons.sty}, \macro{rpgicons-l3.sty} and \macro{rpgicons-pgf.sty} into the working directory or into the \macro{texmf} directory. After the package has been installed, the \macro{rpgicons} package is loaded by calling \macro{\usepackage{rpgicons}} in the preamble of the document.
+
+\begin{macrodef}l3\end{macrodef}
+The L3 variant of the package is loaded by default. To load it explicitly, the package can be loaded using the option \macro{l3}. Alternatively, \macro{\usepackage{rpgicons-l3}} can be called instead.
+
+\begin{macrodef}pgf\end{macrodef}
+To load the PGF variant of the package the package needs to be loaded with the option \macro{pgf}. Alternatively, \macro{\usepackage{rpgicons-pgf}} can be called instead.
+
+\subsection{Dependencies}
+
+The L3 variant of the package loads the \macro{l3draw} package. If the package is loaded with the \macro{opacity} option to enable transparency, the \macro{l3opacity} package is also loaded.
+
+The PGF variant of the package loads the \macro{tikz} package which in turn loads the \macro{xcolor} package. To make use of specific options these packages provide, you need to load the packages with the relevant options beforehand or use, such as \macro{\PassOptionsToPackage{svgnames}{xcolor}}.
+
+\section{Main user commands}
+
+Regardless of the variant of the package, a set of user commands is always available. These are described in the following. Depending on the use of the L3 or the PGF variant, certain specific commands or options are available that are explained in the following sections in further detail.
+
+Because of the way the package defines the icons, every of the below described user commands can actually be used together with every shape. However, the combinations of shapes and commands as described in the following subsections are preferable.
+
+\subsection[Command \textbackslash die]{Command \titlemacro*{die}}
+
+\begin{macrodef}
+|\die|[<style>]{<shape>}[<options>]{<integer>}
+\end{macrodef}
+The command \macro{\die} prints an icon to depict a die with a certain number of sides. Two special icons exist for a two-sided die (which would be equivalent to a coin) and for a hundred-sided die (which typically comes in the shape of a sphere). There is also a special icon for a fudge die.
+
+For the six-sided die, nine additional shapes exists representing the values one to nine as pips. Also, additional shapes exist representing the plus or minus side of a fudge die.
+
+The command takes two mandatory commands, the first of which describes the shape (see the lists below) and the second can take an integer that is placed in front of the shape. For example, \macro{\die{eightside}{2}} results in \die{eightside}{2} (meaning two eight-sided dice are rolled).
+
+The command also takes two optional arguments, the second of which can take additional options to style the icon. The options affect the shape, not the integer when it is printed before the icon. These options differ depending on the package variant. See the relevant sections below.
+
+The first optional argument can take the value \macro{normal} or \macro{large}, \macro{normal} being the default value. With \macro{large} given as argument, the icon is drawn larger and the additional integer is printed inside of the shape instead of before it. As an example, \macro{\die[large]{eightside}{2}} results in \die[large]{eightside}{2}. Note that the integer will always be printed on top of the shape, even if the shape does not have an open center as in the case of the \macro{fudge} shapes or the shapes featuring pips.
+
+\begin{rpgiconsiconlist}
+\macro{\die}
+ & \die{twoside}{} & \macro{twoside} \\
+ & \die{fourside}{} & \macro{fourside} \\
+ & \die{sixside}{} & \macro{sixside} \\
+ & \die{eightside}{} & \macro{eightside} \\
+ & \die{tenside}{} & \macro{tenside} \\
+ & \die{twelveside}{} & \macro{twelveside} \\
+ & \die{twentyside}{} & \macro{twentyside} \\
+ & \die{hundredside}{} & \macro{hundredside} \\
+ & \die{fudge}{} & \macro{fudge} \\
+ & \die{sixside one}{} & \macro{sixside one} \\
+ & \die{sixside two}{} & \macro{sixside two} \\
+ & \die{sixside three}{} & \macro{sixside three} \\
+ & \die{sixside four}{} & \macro{sixside four} \\
+ & \die{sixside five}{} & \macro{sixside five} \\
+ & \die{sixside six}{} & \macro{sixside six} \\
+ & \die{sixside seven}{} & \macro{sixside seven} \\
+ & \die{sixside eight}{} & \macro{sixside eight} \\
+ & \die{sixside nine}{} & \macro{sixside nine} \\
+ & \die{fudge plus}{} & \macro{fudge plus} \\
+ & \die{fudge minus}{} & \macro{fudge minus} \\
+\end{rpgiconsiconlist}
+
+\subsection[Commands \textbackslash ability and \textbackslash saving]{Commands \titlemacro*{ability} and \titlemacro*{saving}}
+
+\begin{macrodef}
+|\ability|[<style>]{<shape>}[<options>]
+\end{macrodef}
+The command \macro{\ability} prints icons depicting an ability of a character. The abilities are represented by animal-like shapes. The relevant shape should be given as mandatory argument to the command. The second optional argument can take additional options to style the icon.
+
+The first optional argument can take the value \macro{positive} or \macro{negative}, \macro{positive} being the default value. With \macro{negative} given as argument, the icon is drawn negative inside a circle. As an example, \macro{\ability[negative]{charisma}} results in \ability[negative]{charisma}.
+
+\begin{macrodef}
+|\saving|[<style>]{<shape>}[<options>]
+\end{macrodef}
+The command \macro{\saving} prints the icons that can be typeset using the \macro{\ability} command inside a small shield. It can take the same values for the mandatory argument as the \macro{\ability} command. The optional argument can take additional options to style the icon.
+
+The first optional argument can take the value \macro{normal} or \macro{empty}, \macro{normal} being the default value. With \macro{empty} given as argument, the icon inside the shield is not printed. In this case, the mandatory argument can be left empty. As an example, \macro{\saving[empty]{}} results in \saving[empty]{}.
+
+\begin{rpgiconsiconlist}
+\macro{\ability}
+ & \ability{strength} & \macro{strength} \\
+ & \ability{dexterity} & \macro{dexterity} \\
+ & \ability{dexterity alt} & \macro{dexterity alt} \\
+ & \ability{constitution} & \macro{constitution} \\
+ & \ability{intelligence} & \macro{intelligence} \\
+ & \ability{wisdom} & \macro{wisdom} \\
+ & \ability{charisma} & \macro{charisma} \\
+ & \ability{resilience} & \macro{resilience} \\
+ & \ability{sanity} & \macro{sanity} \\
+ & \ability{perception} & \macro{perception} \\
+ & \ability{luck} & \macro{luck} \\
+ & \ability{armor} & \macro{armor} \\
+ & \ability{proficiency} & \macro{proficiency} \\
+\midrule
+\macro{\saving}
+ & \saving{strength} & \macro{strength} \\
+ & \saving{dexterity} & \macro{dexterity} \\
+ & \saving{dexterity alt} & \macro{dexterity alt} \\
+ & \saving{constitution} & \macro{constitution} \\
+ & \saving{intelligence} & \macro{intelligence} \\
+ & \saving{wisdom} & \macro{wisdom} \\
+ & \saving{charisma} & \macro{charisma} \\
+ & \saving{resilience} & \macro{resilience} \\
+ & \saving{sanity} & \macro{sanity} \\
+ & \saving{perception} & \macro{perception} \\
+ & \saving{luck} & \macro{luck} \\
+ & \saving{armor} & \macro{armor} \\
+ & \saving{proficiency} & \macro{proficiency} \\
+\end{rpgiconsiconlist}
+
+\subsection[Command \textbackslash spell]{Command \titlemacro*{spell}}
+
+\begin{macrodef}
+|\spell|{<shape>}[<options>]
+\end{macrodef}
+The command \macro{\spell} prints icons depicting the effect of a spell or how it is to be effected. The optional argument can take additional options to style the icon.
+
+\begin{rpgiconsiconlist}
+\macro{\spell}
+ & \spell{linear} & \macro{linear} \\
+ & \spell{conic} & \macro{conic} \\
+ & \spell{quadratic} & \macro{quadratic} \\
+ & \spell{cubic} & \macro{cubic} \\
+ & \spell{spheric} & \macro{spheric} \\
+ & \spell{cylindric} & \macro{cylindric} \\
+ & \spell{verbal} & \macro{verbal} \\
+ & \spell{somatic} & \macro{somatic} \\
+ & \spell{material} & \macro{material} \\
+ & \spell{focus} & \macro{focus} \\
+\end{rpgiconsiconlist}
+
+\subsection[Command \textbackslash spellschool]{Command \titlemacro*{spellschool}}
+
+\begin{macrodef}
+|\spellschool|[<style>]{<shape>}[<options>]
+\end{macrodef}
+The command \macro{\spellschool} prints icons that represent the school a spell belongs to. The second optional argument can take additional options to style the icon.
+
+The first optional argument can take the value \macro{negative} or \macro{positive}, \macro{negative} being the default value. Per default the icon is drawn in white inside a filled escutcheon. With \macro{positive} given as argument, the icon as well as the escutcheon are drawn in the currently selected color. As an example, \macro{\spellschool[positive]{evocation}} results in \spellschool[positive]{evocation}.
+
+\begin{rpgiconsiconlist}
+\macro{\spellschool}
+ & \spellschool{abjuration} & \macro{abjuration} \\
+ & \spellschool{conjuration} & \macro{conjuration} \\
+ & \spellschool{divination} & \macro{divination} \\
+ & \spellschool{enchantment} & \macro{enchantment} \\
+ & \spellschool{evocation} & \macro{evocation} \\
+ & \spellschool{illusion} & \macro{illusion} \\
+ & \spellschool{necromancy} & \macro{necromancy} \\
+ & \spellschool{transmutation} & \macro{transmutation} \\
+\end{rpgiconsiconlist}
+
+\subsection[Commands \textbackslash damage, \textbackslash attack, and \textbackslash condition]{Commands \titlemacro*{damage}, \titlemacro*{attack}, and \titlemacro*{condition}}
+
+\begin{macrodef}
+|\damage|{<shape>}[<options>]
+\end{macrodef}
+The command \macro{\damage} prints icons depicting the damage of an attack. The icon is printed inside a circle. The optional argument can take additional options to style the icon.
+
+\begin{macrodef}
+|\attack|{<shape>}[<options>]
+\end{macrodef}
+The command \macro{\attack} prints icons depicting the kind of an attack. The optional argument can take additional options to style the icon.
+
+\begin{macrodef}
+|\condition|{<shape>}[<options>]
+\end{macrodef}
+The command \macro{\condition} prints icons depicting a condition of a character. The optional argument can take additional options to style the icon.
+
+\begin{rpgiconsiconlist}
+\macro{\damage}
+ & \damage{acid} & \macro{acid} \\
+ & \damage{bludgeoning} & \macro{bludgeoning} \\
+ & \damage{cold} & \macro{cold} \\
+ & \damage{fire} & \macro{fire} \\
+ & \damage{force} & \macro{force} \\
+ & \damage{lightning} & \macro{lightning} \\
+ & \damage{necrotic} & \macro{necrotic} \\
+ & \damage{piercing} & \macro{piercing} \\
+ & \damage{poison} & \macro{poison} \\
+ & \damage{psychic} & \macro{psychic} \\
+ & \damage{radiant} & \macro{radiant} \\
+ & \damage{slashing} & \macro{slashing} \\
+ & \damage{thunder} & \macro{thunder} \\
+ & \damage{healing} & \macro{healing} \\
+\midrule
+\macro{\attack}
+ & \attack{melee} & \macro{melee} \\
+ & \attack{ranged} & \macro{ranged} \\
+ & \attack{magic} & \macro{magic} \\
+ & \attack{singlehanded} & \macro{singlehanded} \\
+ & \attack{doublehanded} & \macro{doublehanded} \\
+\midrule
+\macro{\condition}
+ & \condition{buff} & \macro{buff} \\
+ & \condition{blinded} & \macro{blinded} \\
+ & \condition{charmed} & \macro{charmed} \\
+ & \condition{deafened} & \macro{deafened} \\
+ & \condition{exhausted} & \macro{exhausted} \\
+ & \condition{frightened} & \macro{frightened} \\
+ & \condition{grappled} & \macro{grappled} \\
+ & \condition{incapacitated} & \macro{incapacitated} \\
+ & \condition{invisible} & \macro{invisible} \\
+ & \condition{paralyzed} & \macro{paralyzed} \\
+ & \condition{petrified} & \macro{petrified} \\
+ & \condition{poisoned} & \macro{poisoned} \\
+ & \condition{prone} & \macro{prone} \\
+ & \condition{restrained} & \macro{restrained} \\
+ & \condition{stunned} & \macro{stunned} \\
+ & \condition{unconscious} & \macro{unconscious} \\
+ & \condition{hearing} & \macro{hearing} \\
+ & \condition{seeing} & \macro{seeing} \\
+\end{rpgiconsiconlist}
+
+% l3 variant
+
+\section{Specifics of the L3 package variant}
+
+The L3 variant of the package that uses the \macro{l3draw} package is loaded by default or explicitly by either calling \macro{\usepackage[l3]{rpgicons}} or \macro{\usepackage{rpgicons-l3}} in the preamble of the document after having installed the files \macro{rpgicons.sty} and \macro{rpgicons-l3.sty}. The \macro{l3draw} package is an experimental package that provides only basic drawing functionality. The L3 variant thus only supports a certain set of option for styling the icons.
+
+The L3 variant of the package does not load the \macro{xcolor} package, but makes use of the \macro{l3color} module which uses a similar syntax like the \macro{xcolor} package, but color definitions made using the \macro{l3color} module are not directly usable via commands provided by the \macro{xcolor} package. Therefore, setting a color using the \macro{\color} macro provided by the \macro{xcolor} package won't affect the color of the icons.
+
+\begin{macrodef}compat\end{macrodef}
+The \macro{l3draw} package is experimental and subject to ongoing updates. Loading the L3 variant of the package with the option \macro{compat} will use macro definitions that have been available since the last major TeX Live release as replacement for certain functions that only became available in the most recent versions of the \macro{l3draw} and related packages.
+
+\label{macro:opacity}
+\begin{macrodef}opacity\end{macrodef}
+With the \macro{opacity} option, the L3 variant of the package supports transparency using the functionality of the \macro{l3opacity} package. Since transparency requires the management of certain PDF settings, it is necessary to call \macro{\DocumentMetadata{}} before loading a \macro{\documentclass}. The \macro{l3opacity} package is experimental.
+
+\subsection{Icon commands}
+
+\begin{macrodef}
+|\RPGIconsUseIcon|[<options>][<integer>]{<shape>}
+|\RPGIconsUseIcon*|[<options>][<integer>]{<shape>}
+\end{macrodef}
+\macro{\RPGIconsUseIcon} is the primary command to typeset icons using the L3 variant of the package. The commands \macro{\die}, \macro{\ability}, \macro{\saving}, \macro{\spell}, \macro{\spellschool}, \macro{\damage}, \macro{\attack} and \macro{\condition} are based on this command.
+
+The \macro{\RPGIconsUseIcon} command has a starred version and two optional arguments as well as one mandatory argument. The mandatory argument holds the shape of the icon. The second optional argument can be used to add an integer when used with shapes for dice.
+
+The starred version of the command is used to fill a frame with color instead of drawing its outline. Frames can be put around the shape via the relevant \macro{frame} option.
+
+\begin{macrodef}
+|\RPGIconsDie|[<style>]{<shape>}[<options>]{<integer>}
+|\RPGIconsAbiliy|[<style>]{<shape>}[<options>]
+|\RPGIconsSaving|[<style>]{<shape>}[<options>]
+|\RPGIconsSpell|{<shape>}[<options>]
+|\RPGIconsSpellschool|[<style>]{<shape>}[<options>]
+|\RPGIconsDamage|{<shape>}[<options>]
+|\RPGIconsAttack|{<shape>}[<options>]
+|\RPGIconsCondition|{<shape>}[<options>]
+\end{macrodef}
+The L3 variant of the package defines a set of commands on which the user commands \macro{\die}, \macro{\ability}, \macro{\saving}, \macro{\spell}, \macro{\spellschool}, \macro{\damage}, \macro{\attack} and \macro{\condition} are based. This set of commands can be used in cases where another package defines one of these user commands. These user commands are exact copies of this set of commands.
+
+\subsection{Icon options}
+
+\begin{macrodef}
+frame
+stroke
+fill
+text
+color
+background
+stroke opacity
+fill opacity
+text opacity
+opacity
+background opacity
+line width
+scale
+scale inner
+rotate
+\end{macrodef}
+The \macro{\RPGIconsUseIcon} command and the commands \macro{\die}, \macro{\ability}, \macro{\saving}, \macro{\spell}, \macro{\spellschool}, \macro{\damage}, \macro{\attack} and \macro{\condition} can be used with certain options that each consist of a key-value pair and can be combined. When used with the \macro{\RPGIconsUseIcon} command or the other commands based on this command, these options should be used directly without wrapping them inside the \macro{style} option.
+
+For example, \macro{\die{eightside}[color=blue, line width=0.8pt]{2}} would result in \die{eightside}[color=blue, line width=0.8pt]{2}.
+
+With the \macro{frame} option, one of four different frames can be selected that are drawn around the shape of the icon. The values \macro{ability} and \macro{damage} draw a circle around the shape. The value \macro{saving} draws a rounded shield and the value \macro{spellschool} draws an angular shield around the shape. The commands \macro{\ability}, \macro{\saving}, \macro{\spellschool} and \macro{\damage} make use of the relevant frame.
+
+Some icons can be used with a negative color scheme where the icon is drawn negatively inside a filled shape. Per default, the icons are drawn in white in such cases, but it might be desirable that the icons are in the same color as the background. To this end, the \macro{background} option sets the color of the shape when it is printed over a filled frame which can be achieved by setting the \macro{negative} option for the \macro{\ability} or the \macro{\spellschool} command or using the starred version of the \macro{\RPGIconsUseIcon} command.
+
+The \macro{color} option sets the color of strokes, fills and text in general while the \macro{stroke} option, the \macro{fill} option and the \macro{text} option set the color only for strokes, fills or text respectively. Similarly, the \macro{opacity} macro sets the opacity generally, while the options \macro{stroke opacity}, \macro{fill opacity} and \macro{text opacity} allow for setting the opacity of strokes, fill and text separately. The opacity styles are only available when loading the package with the \macro{opacity} option (see the \hyperref{macro:opacity}{description above}). The \macro{line width} sets the line width for strokes. Using the \macro{scale} and \macro{rotate} options, the shape can be scaled and rotated.
+
+The \macro{scale inner} option can be used to change the scaling of the icon when placed inside a frame when using the \macro{\ability}, \macro{\saving}, \macro{\spellschool} and \macro{\damage} macros. The default value is 0.675.
+
+\begin{macrodef}
+accessible
+accessible = basic
+accessible = full
+accessible = false
+\end{macrodef}
+Using the \macro{accessible} option with no value or the value \macro{basic}, a replacement text to the relevant icon can be added which can be copied to the clipboard. The value \macro{full} additionally places an \macro{\Alt} mark in the PDF which means that the shape of the relevant icon is read by screen readers. For this to work, is necessary to call \macro{\DocumentMetadata{}} before loading a \macro{\documentclass}, preferably with tagging enabled to make use of the \macro{accessible} option. The value \macro{full} can be used to disable the function explicitly. Note that depending on the compiler and PDF viewer, there might be line breaks or no spaces before and after the replacement text.
+
+\begin{macrodef}
+every die
+every ability
+every saving
+every spell
+every spellschool
+every damage
+every attack
+every condition
+every <shape>
+\end{macrodef}
+Styles following the pattern \macro{rpg icons/every} followed by a space and the name of the command or the shape can be used to apply styles to every instance of this command or shape. For example, \macro{\rpgiconsset{every die={color={red}}}} can be used to draw in red all icons created using the \macro{\die} command. Calling \macro{\rpgiconsset{every charisma={color={red}}}} will draw every instance of the \macro{charisma} shape in red.
+
+\subsection{Setting options globally}
+
+\begin{macrodef}
+|\rpgiconsset|
+\end{macrodef}
+Apart from setting the options to the commands directly, it is also possible to set them globally using the \macro{\rpgiconsset} command. Globally set options are overridden by options that are selected directly.
+
+\begin{codeexample}
+\rpgiconsset{
+ color=blue
+}
+
+\ability{charisma}
+\ability{charisma}[color=red]
+\ability{charisma}
+\end{codeexample}
+
+\begin{macrodef}
+before sep
+after sep
+baseline
+\end{macrodef}
+The spacing before and after the icons can be set using the options \macro{before sep} and \macro{after sep}. The option \macro{baseline} can be used to adjust the baseline of the icons. These options can also be applied to the icon commands directly.
+
+\begin{codeexample}
+Roll\die{eightside}{}a die!
+
+\rpgiconsset{
+ before sep={1cm}
+}
+Roll\die{eightside}{}a die!
+\end{codeexample}
+
+\subsection{Roll dice syntax}\label{sec:roll-dice-syntax}
+
+\begin{macrodef}
+|\roll|{<roll syntax>}
+|\RPGIconsRoll|{<roll syntax>}
+\end{macrodef}
+The \macro{\roll} macro can be used to quickly typeset dice rolls with the relevant icons using the established dice rolling syntax. This syntax consists of a sequence of dice and numbers concatenated by mathematical operators (plus, minus or times). Typically, the letter \macro{d} is used to denote a die with a certain number of sides. For example \macro{d6} denotes a six-sided die. A number can be added to specify the number of such dice that are rolled together. The letter to denote the die can be changed using the option \macro{roll syntax}.
+
+For example, \macro{2d6 + 3d4 - 1} means ``roll two six-sided dice and three four-sided dice and subtract one from the result''. The command \macro{\roll{2d6 + 3d4 - 1}} results in \roll{2d6 + 3d4 - 1}.
+
+The die notations \macro{d2}, \macro{d4}, \macro{d6}, \macro{d8}, \macro{d10}, \macro{d12}, \macro{d20} and \macro{d100} are defined. To denote a fudge die, \macro{dF} can be used. To denote that the lowest or highest die should be removed from the result, the letters \macro{L} and \macro{H} can be used. The syntax \macro{2d6 x 2} or \macro{2d6 * 2} can be used to denote several rolls with the same set of dice.
+
+If the \macro{rpgicons} package is to be loaded together with some other package that defines the command \macro{\roll}, the command \macro{\RPGIconsRoll} can be used. This alternative command is an exact copy of the \macro{\roll} command.
+
+\begin{macrodef}
+roll syntax
+\end{macrodef}
+The option \macro{roll syntax} can be used to change the character that denotes a die in the dice rolling syntax. Multiple characters can be given using a comma separated list. The default setting is \macro{d,D} which allows notations such as \macro{2d6} or \macro{2D6}.
+
+With \macro{\rpgiconsset{roll syntax={w,W}}}, for example, notations such as \macro{2w6} or \macro{2W6} could be used.
+
+% PGF variant
+
+\RenewCommandCopy\die\rpgiconsdie
+\RenewCommandCopy\ability\rpgiconsability
+
+\section{Specifics of the PGF package variant}
+
+The PGF variant of the package is loaded by either calling \macro{\usepackage[pgf]{rpgicons}} or \macro{\usepackage{rpgicons-pgf}} in the preamble of the document after having installed the files \macro{rpgicons.sty} and \macro{rpgicons-pgf.sty}.
+
+Since the commands to typeset the icons with the PGF variant of the package use \macro{tikzpicture} environments, these commands should not be used inside another \macro{tikzpicture}. However, because the package defines the icons as Ti\emph{k}Z shapes, it is possible to use the icons in \macro{tikzpicture} environments directly.
+
+Apart from that, the PGF variant of the package provides a way to define custom commands to typeset the icons as boxed material which is safe to use in a \macro{tikzpicture} context. Furthermore, the icons can be used as Ti\emph{k}Z pics.
+
+Once loaded, the PGF variant of the package defines a set of node shapes that can be used inside a \macro{tikzpicture} environment.
+
+\begin{macrodef}pics\end{macrodef}
+The PGF variant of the package provides the option \macro{pics}. If the package is loaded with this option, every icon is also available as Ti\emph{k}Z pic. On the use of pics, see section \ref{sec:pics} below.
+
+\subsection{Icon commands}
+
+\begin{macrodef}
+|\rpgiconsdie|[<style>]{<shape>}[<options>]{<integer>}
+|\rpgiconsability|[<style>]{<shape>}[<options>]
+|\rpgiconssaving|[<style>]{<shape>}[<options>]
+|\rpgiconsspell|{<shape>}[<options>]
+|\rpgiconsspellschool|[<style>]{<shape>}[<options>]
+|\rpgiconsdamage|{<shape>}[<options>]
+|\rpgiconsattack|{<shape>}[<options>]
+|\rpgiconscondition|{<shape>}[<options>]
+\end{macrodef}
+The PGF variant of the package defines a set of commands on which the user commands \macro{\die}, \macro{\ability}, \macro{\saving}, \macro{\spell}, \macro{\spellschool}, \macro{\damage}, \macro{\attack} and \macro{\condition} are based. This set of commands can be used in cases where another package defines one of these user commands. These user commands are exact copies of this set of commands.
+
+\subsection{Icon styles}
+
+Using the PGF variant of the package, all icons can by styled using arbitrary Ti\emph{k}Z styles in general. As an example, \macro{\die{eightside}[blue, thick]{2}} results in \die{eightside}[blue, thick]{2}.
+
+\begin{macrodef}
+!rpg icons/!every die
+!rpg icons/!every ability
+!rpg icons/!every saving
+!rpg icons/!every spell
+!rpg icons/!every spellschool
+!rpg icons/!every damage
+!rpg icons/!every attack
+!rpg icons/!every condition
+!rpg icons/!every <shape>
+\end{macrodef}
+Using Ti\emph{k}Z styles, all instances of a certain command or a certain shape can be styled at once. These styles all follow the pattern \macro{rpg icons/every} followed by a space and the name of the command or the shape. For example, \macro{\tikzset{rpg icons/every die/.append style={red}}} can be used to draw in red all icons created using the \macro{\die} command. To draw every instace of the \macro{charisma} shape in red, \macro{\tikzset{rpg icons/every charisma/.append style={red}}} can be used.
+
+\subsection{Setting styles lobally}
+
+\begin{macrodef}rpg icons\end{macrodef}
+All icons share the Ti\emph{k}Z style \macro{rpg icons} that has no options per default but can be used to style all icons at once. For example, if \macro{\tikzset{rpg icons/.append style={draw=red}}} is placed at the beginning of the document, all icons will be drawn in red. Per default, the icons are drawn in the color of the surrounding text.
+
+Note that it may be necessary to add the Ti\emph{k}Z option \macro{transform shape} when applying transformations to the icons, because the icons are realised as Ti\emph{k}Z nodes which are not affected by some transformations per default.
+
+\begin{macrodef}!rpg icons/!background color\end{macrodef}
+Some icons can be used with a negative color scheme where the icon is drawn negatively inside a filled shape. Per default, the icons are drawn in white in such cases, but it might be desirable that the icons are in the same color as the background. To this end, the color can be changed using the Ti\emph{k}Z option \macro{rpg icons/background color} in the following way:
+
+\begin{codeexample}
+\colorbox{blue!50}{%
+ \ability[negative]{charisma}
+ [scale=2, transform shape]%
+}
+
+\tikzset{
+ rpg icons/background color={blue!50}
+}
+\colorbox{blue!50}{%
+ \ability[negative]{charisma}
+ [scale=2, transform shape]%
+}
+\end{codeexample}
+This feature can, of course, also be used to change the color of the icon independently from the color of the background.
+
+\begin{macrodef}
+!rpg icons/!before sep
+!rpg icons/!after sep
+!rpg icons/!baseline
+\end{macrodef}
+The Ti\emph{k}Z options \macro{rpg icons/before sep} and \macro{rpg icons/after sep} are used to define the width of the space that is added before and after the icons respectively. The default value of both lengths is 0.05\,em. For example, setting the space before icons to 1\,cm can be achieved as follows:
+
+\begin{codeexample}
+Roll\die{eightside}{}a die!
+
+\tikzset{
+ rpg icons/before sep={1cm}
+}
+Roll\die{eightside}{}a die!
+\end{codeexample}
+
+The option \macro{baseline} can be used to adjust the baseline of the icons. A larger value for the baseline will shift the icon downwards relative to the baseline of the surrounding text. The default value of the baseline is \textminus 3.5\,pt.
+
+\subsection{Direct use of shapes}
+
+Because the icons are defined as Ti\emph{k}Z shapes, they can directly be applied to Ti\emph{k}Z nodes. However, the shapes don't have a shape border and no anchors except for the \macro{center} anchor that sits exactly in the center of the shape. Therefore, if nodes with these shapes are connected using edges, the \macro{center} anchor will be used to connect the nodes. If nodes with these shapes are being positioned, only the \macro{center} anchor is available. Text content of these nodes is simply printed on top of the center of the node. Compare the following example.
+
+\begin{codeexample}
+\begin{tikzpicture}
+ \node[eightside, blue, thick]
+ at (0,0) (A) {A};
+ \node[charisma] at (2,0) (B) {B};
+ \draw[red] (A) -- (B);
+\end{tikzpicture}
+\end{codeexample}
+
+\subsection{Boxing of icons}
+
+Because the icons cannot simply be used inside \macro{tikzpicture} environments, the PGF variant of the package provides a workaround to place icons inside of boxes for later use. Icons that are boxed this way can safely used inside \macro{tikzpicture} environments. This might be necessary, if an icon should be used in inline text that sits inside a node.
+
+\begin{macrodef}|\provideprotectedrpgicon|{<command>}[<style>]{<shape>}[<options>]{<box name>}\end{macrodef}
+The command \macro{\provideprotectedrpgicon} creates a box containing the icon that would be created using one of the regular commands this package provides.
+
+\macro{\provideprotectedrpgicon{die}[large]{eightside}[blue, thick]{mybox}}, for example, stores the icon of an eight-sided die with the relevant style and Ti\emph{k}Z options in a new box named \macro{mybox}. Note that no integer can be added to the \macro{die} command in this context.
+
+\provideprotectedrpgicon{die}[large]{eightside}[blue, thick]{mybox}
+
+\begin{macrodef}|\useprotectedrpgicon|{<box name>}\end{macrodef}
+Using the command \macro{\useprotectedrpgicon}, the previously defined box can be used to place the relevant icon. With the above definition, \macro{\useprotectedrpgicon{mybox}} would result in \useprotectedrpgicon{mybox}.
+
+Having created a boxed icon, it is safe to use it, for example, inside a Ti\emph{k}Z node:
+
+\begin{codeexample}
+\begin{tikzpicture}
+ \node[circle, draw, align=center] {
+ \useprotectedrpgicon{mybox} \\
+ Roll a die!
+ };
+\end{tikzpicture}
+\end{codeexample}
+
+
+\subsection{Icons as pics}\label{sec:pics}
+
+If the PGF variant of the package is loaded with the option \macro{pics}, every icon is also available as Ti\emph{k}Z pic. The names of the pic always start with \macro{rpg icons} followed by a space and the name of the relevant icon (see the lists above). For abilities, savings, spellschools and damages, additional pics exists where the name has the suffixes \macro{ability}, \macro{saving}, \macro{spellschool}, and \macro{damage} respectively.
+
+The icon is embedded as a node in the pic which has the name \macro{-node}. Thus, it is possible to name the pic and refer to the node inside. Due to the fact that the icon is a node, the option `transform shape` has to be used if transformations on the pic are to affect the node as well. It is easily possible to apply styles to the node using the Ti\emph{k}Z option \macro{every node} as shown in the following example.
+
+\begin{codeexample}
+\begin{tikzpicture}
+ \pic[
+ transform shape,
+ scale=2,
+ fill=blue,
+ draw=red,
+ every node/.append style={
+ white,
+ thick
+ }
+ ] (p) {rpg icons charisma ability};
+ \draw[red] (p-node) -- +(2,0);
+\end{tikzpicture}
+\end{codeexample}
+
+\begin{macrodef}
+!rpg icons/!create pic from shape
+!rpg icons/!create pic from ability shape
+!rpg icons/!create pic from saving shape
+!rpg icons/!create pic from spellschool shape
+!rpg icons/!create pic from damage shape
+!rpg icons/!create every style
+\end{macrodef}
+The PGF variant of the package defines five Ti\emph{k}Z keys that are used to create pics using the relevant node shapes. Another key is defined to create keys that can be used to style all instances of a command or shape. In normal circumstances, it is not necessary to use these keys. They are mentioned here only for reference.
+
+The following example shows how to create the drawing on the first page of this documentation using Ti\emph{k}Z pics. We need to call \macro{rpg icons/create pic from ability shape} for the shapes \macro{twentyside}, \macro{buff} and \macro{ranged}, because per default no pics are defined for these shapes in combination with ability. Note the use of \macro{\space} to ensure correct use of spaces in the pic name as spaces are gobbled after commands in TeX.
+
+\begin{codeexample}
+\tikzset{
+ rpg icons/%
+ create pic from ability shape/%
+ .list={
+ twentyside,
+ buff,
+ ranged
+ },
+ rpg icons/every ability/.style={
+ ultra thick,
+ draw=white,
+ line join=round,
+ line cap=round
+ }
+}
+
+\begin{tikzpicture}[scale=4]
+ \foreach \x/\c [count=\i] in {
+ twentyside/264653,
+ charisma/287271,
+ armor/2a9d8f,
+ buff/e9c46a,
+ ranged/f4a261,
+ proficiency/e76f51
+ } {
+ \definecolor{color}{HTML}{\c}
+ \pic[fill=color, transform shape]
+ at ({60*\i+10}:{0.33cm})
+ {rpg icons \x\space ability};
+ }
+\end{tikzpicture}
+\end{codeexample}
+
+\subsection{Roll dice syntax}
+
+\begin{macrodef}
+|\roll|{<roll syntax>}
+|\rpgiconsroll|{<roll syntax>}
+\end{macrodef}
+The \macro{\roll} macro can be used to quickly typeset dice rolls with the relevant icons using the established dice rolling syntax. This syntax consists of a sequence of dice and numbers concatenated by mathematical operators (plus, minus or times). Typically, the letter \macro{d} is used to denote a die with a certain number of sides. For example \macro{d6} denotes a six-sided die. A number can be added to specify the number of such dice that are rolled together. The letter to denote the die can be changed using the Ti\emph{k}Z style \macro{rpg icons/roll syntax}.
+
+For example, \macro{2d6 + 3d4 - 1} means ``roll two six-sided dice and three four-sided dice and subtract one from the result''. The command \macro{\roll{2d6 + 3d4 - 1}} results in \roll{2d6 + 3d4 - 1}.
+
+The die notations \macro{d2}, \macro{d4}, \macro{d6}, \macro{d8}, \macro{d10}, \macro{d12}, \macro{d20} and \macro{d100} are defined. To denote a fudge die, \macro{dF} can be used. To denote that the lowest or highest die should be removed from the result, the letters \macro{L} and \macro{H} can be used. The syntax \macro{2d6 x 2} or \macro{2d6 * 2} can be used to denote several rolls with the same set of dice.
+
+If the \macro{rpgicons} package is to be loaded together with some other package that defines the command \macro{\roll}, the command \macro{\rpgiconsroll} can be used. This alternative command is an exact copy of the \macro{\roll} command.
+
+\begin{macrodef}
+!rpg icons/!roll syntax
+\end{macrodef}
+The Ti\emph{k}Z style \macro{rpg icons/roll syntax} can be used to change the character that denotes a die in the dice rolling syntax. Multiple characters can be given using a comma separated list. The default setting is \macro{d,D} which allows notations such as \macro{2d6} or \macro{2D6}.
+
+With \macro{\tikzset{rpg icons/roll syntax={w,W}}}, for example, notations such as \macro{2w6} or \macro{2W6} could be used.
+
+% =====
+
+\printchanges
+
+\end{document}
+
+%% End of file `rpgicons-doc.tex`.
diff --git a/macros/latex/contrib/rpgicons/rpgicons-l3.sty b/macros/latex/contrib/rpgicons/rpgicons-l3.sty
new file mode 100644
index 0000000000..3103502bf3
--- /dev/null
+++ b/macros/latex/contrib/rpgicons/rpgicons-l3.sty
@@ -0,0 +1,2025 @@
+% File: rpgicons-l3.sty
+% Copyright 2024 Jasper Habicht (mail(at)jasperhabicht.de).
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License version 1.3c,
+% available at http://www.latex-project.org/lppl/.
+%
+% This file is part of the `rpgicons' package (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+\ProvidesExplPackage {rpgicons-l3} {2024-05-15} {1.8.3}
+ {rpg Icons Package (l3 Variant)}
+
+\bool_new:N \l__rpgicons_unicode_mode_bool
+\sys_if_engine_luatex:T {
+ \bool_set_true:N \l__rpgicons_unicode_mode_bool
+}
+\sys_if_engine_xetex:T {
+ \bool_set_true:N \l__rpgicons_unicode_mode_bool
+}
+
+\bool_new:N \l__rpgicons_compat_mode_bool
+\bool_new:N \l__rpgicons_use_opacity_bool
+\keys_define:nn { rpgicons / package ~ options } {
+ compat .bool_set:N = \l__rpgicons_compat_mode_bool ,
+ compat .default:n = { true } ,
+ opacity .bool_set:N = \l__rpgicons_use_opacity_bool ,
+ opacity .default:n = { true } ,
+}
+\ProcessKeyOptions [ rpgicons / package ~ options ]
+
+\msg_new:nnn { rpgicons } { documentmetadata-missing } {
+ \msg_warning_text:n { dnicons } \iow_newline:
+ In ~ order ~ to ~ use ~ opacity, ~ \token_to_str:N \DocumentMetadata \c_space_tl must ~ be ~ set.
+}
+\msg_new:nnn { rpgicons } { opacity-option-missing } {
+ \msg_warning_text:n { dnicons } \iow_newline:
+ In ~ order ~ to ~ use ~ opacity, ~ the ~ package ~ must ~ be ~ loaded ~ with ~ the ~ `opacity' ~ option.
+}
+\msg_new:nnn { rpgicons } { l3draw-old } {
+ \msg_warning_text:n { dnicons } \iow_newline:
+ The ~ version ~ of ~ the ~ `l3draw' ~ package ~ is ~ older ~ than ~ 2024-03-14. ~
+ Consider ~ using ~ the ~ `compat' ~ option.
+}
+
+\bool_if:NT \l__rpgicons_use_opacity_bool {
+ \IfDocumentMetadataTF { } {
+ \msg_error:nn { rpgicons } { documentmetadata-missing }
+ }
+ \RequirePackage { l3opacity }
+ \bool_if:NT \l__rpgicons_compat_mode_bool {
+ % l3opacity fix
+ \tl_set:Nn \l__opacity_backend_fill_tl { 1 }
+ \tl_set:Nn \l__opacity_backend_stroke_tl { 1 }
+ }
+}
+
+\RequirePackage { l3draw }
+
+\IfPackageAtLeastTF { l3draw } { 2024/03/14 } { } {
+ \bool_if:NF \l__rpgicons_compat_mode_bool {
+ \msg_warning:nn { rpgicons } { l3draw-old }
+ }
+}
+
+% DICE
+
+\cs_new:Npn \rpgicons_draw_shape_twoside: {
+ \draw_path_ellipse:nnn { 0cm , 0cm } { 0cm , .25cm } { .425cm , 0cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_fourside: {
+ \draw_path_moveto:n { 0cm , .35cm }
+ \draw_path_lineto:n { .433cm , -.4cm }
+ \draw_path_lineto:n { -.433cm , -.4cm }
+ \draw_path_close:
+}
+
+\cs_new:Npn \rpgicons_draw_shape_sixside: {
+ \bool_if:NTF \l__rpgicons_compat_mode_bool {
+ % l3draw rectangle fix
+ \draw_path_moveto:n { -.4cm , -.4cm }
+ \draw_path_lineto:n { -.4cm , .4cm }
+ \draw_path_lineto:n { .4cm , .4cm }
+ \draw_path_lineto:n { .4cm , -.4cm }
+ \draw_path_close:
+ } {
+ \draw_path_rectangle_corners:nn { -.4cm , -.4cm } { .4cm , .4cm }
+ }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_eightside: {
+ \draw_path_moveto:n { 0cm , .5cm }
+ \draw_path_lineto:n { .433cm , .25cm }
+ \draw_path_lineto:n { .433cm , -.25cm }
+ \draw_path_lineto:n { 0cm , -.5cm }
+ \draw_path_lineto:n { -.433cm , -.25cm }
+ \draw_path_lineto:n { -.433cm , .25cm }
+ \draw_path_close:
+ \draw_path_lineto:n { .433cm , -.25cm }
+ \draw_path_lineto:n { -.433cm , -.25cm }
+ \draw_path_close:
+}
+
+\cs_new:Npn \rpgicons_draw_shape_tenside: {
+ \draw_path_moveto:n { 0cm , .5cm }
+ \draw_path_lineto:n { .475cm , .1cm }
+ \draw_path_lineto:n { .475cm , -.1cm }
+ \draw_path_lineto:n { 0cm , -.5cm }
+ \draw_path_lineto:n { -.475cm , -.1cm }
+ \draw_path_lineto:n { -.475cm , .1cm }
+ \draw_path_close:
+ \draw_path_lineto:n { .294cm , -.154cm }
+ \draw_path_lineto:n { 0cm , -.3cm }
+ \draw_path_lineto:n { -.294cm , -.154cm }
+ \draw_path_close:
+ \draw_path_moveto:n { .294cm , -.154cm }
+ \draw_path_lineto:n { .475cm , -.1cm }
+ \draw_path_moveto:n { -.475cm , -.1cm }
+ \draw_path_lineto:n { -.294cm , -.154cm }
+ \draw_path_moveto:n { 0cm , -.5cm }
+ \draw_path_lineto:n { 0cm , -.3cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_twelveside: {
+ \draw_path_moveto:n { 0cm , .5cm }
+ \draw_path_lineto:n { 0.294cm , .405cm }
+ \draw_path_lineto:n { .475cm , .173cm }
+ \draw_path_lineto:n { .475cm , -.173cm }
+ \draw_path_lineto:n { .294cm , -.405cm }
+ \draw_path_lineto:n { 0cm , -.5cm }
+ \draw_path_lineto:n { -.294cm , -.405cm }
+ \draw_path_lineto:n { -.475cm , -.173cm }
+ \draw_path_lineto:n { -.475cm , .173cm }
+ \draw_path_lineto:n { -.294cm , .405cm }
+ \draw_path_close:
+ \draw_path_moveto:n { 0cm , .349cm }
+ \draw_path_lineto:n { .332cm , .108cm }
+ \draw_path_lineto:n { .205cm , -.282cm }
+ \draw_path_lineto:n { -.205cm , -.282cm }
+ \draw_path_lineto:n { -.332cm , .108cm }
+ \draw_path_close:
+ \draw_path_lineto:n { 0cm , .5cm }
+ \draw_path_moveto:n { .475cm , .173cm }
+ \draw_path_lineto:n { .332cm , .108cm }
+ \draw_path_moveto:n { .294cm , -.405cm }
+ \draw_path_lineto:n { .205cm , -.282cm }
+ \draw_path_moveto:n { -.294cm , -.405cm }
+ \draw_path_lineto:n { -.205cm , -.282cm }
+ \draw_path_moveto:n { -.475cm , .173cm }
+ \draw_path_lineto:n { -.332cm , .108cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_twentyside: {
+ \draw_path_moveto:n { 0cm , .5cm }
+ \draw_path_lineto:n { .454cm , .262cm }
+ \draw_path_lineto:n { .454cm , -.262cm }
+ \draw_path_lineto:n { 0cm , -.5cm }
+ \draw_path_lineto:n { -.454cm , -.262cm }
+ \draw_path_lineto:n { -.454cm , .262cm }
+ \draw_path_close:
+ \draw_path_moveto:n { 0cm , .292cm }
+ \draw_path_lineto:n { .253cm , -.146cm }
+ \draw_path_lineto:n { -.253cm , -.146cm }
+ \draw_path_close:
+ \draw_path_lineto:n { .454cm , .262cm }
+ \draw_path_lineto:n { .253cm , -.146cm }
+ \draw_path_lineto:n { 0cm , -.5cm }
+ \draw_path_lineto:n { -.253cm , -.146cm }
+ \draw_path_lineto:n { -.454cm , .262cm }
+ \draw_path_close:
+ \draw_path_lineto:n { 0cm , .5cm }
+ \draw_path_moveto:n { .454cm , -.262cm }
+ \draw_path_lineto:n { .253cm , -.146cm }
+ \draw_path_moveto:n { -.454cm , -.262cm }
+ \draw_path_lineto:n { -.253cm , -.146cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_hundredside: {
+ \draw_path_circle:nn { 0cm, 0cm } { .425cm }
+ \draw_path_moveto:n { .425cm , 0cm }
+ \draw_path_arc:nnnn { 180 } { 50 } { -.425cm } { -.2cm }
+ \draw_path_moveto:n { 0cm , -.425cm }
+ \draw_path_arc:nnnn { 270 } { 140 } { -.2cm } { .425cm }
+}
+
+\clist_new:N \l_rpgnicons_pips_clist
+\fp_new:N \l_rpgnicons_pips_coordx_fp
+\fp_new:N \l_rpgnicons_pips_coordy_fp
+\cs_new:Npn \rpgicons_draw_shape_sixside_pips:n #1 {
+ \str_case:nn {#1} {
+ { one } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { 0cm , 0cm }
+ } }
+ { two } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { -.2cm , .2cm } , { .2cm , -.2cm }
+ } }
+ { three } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { -.2cm , .2cm } , { 0cm , 0cm } , { .2cm , -.2cm }
+ } }
+ { four } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { -.2cm , .2cm } , { .2cm , .2cm } ,
+ { -.2cm , -.2cm } , { .2cm , -.2cm }
+ } }
+ { five } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { -.2cm , .2cm } , { .2cm , .2cm } ,
+ { 0cm , 0cm } ,
+ { -.2cm , -.2cm } , { .2cm , -.2cm }
+ } }
+ { six } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { -.2cm , .2cm } , { .2cm , .2cm } ,
+ { -.2cm , 0cm } , { .2cm , 0cm } ,
+ { -.2cm , -.2cm } , { .2cm , -.2cm }
+ } }
+ { seven } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { -.2cm , .2cm } , { .2cm , .2cm } ,
+ { -.2cm , 0cm } , { 0cm , 0cm } , { .2cm , 0cm } ,
+ { -.2cm , -.2cm } , { .2cm , -.2cm }
+ } }
+ { eight } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { -.2cm , .2cm } , { 0cm , .2cm } , { .2cm , .2cm } ,
+ { -.2cm , 0cm } , { .2cm , 0cm } ,
+ { -.2cm , -.2cm } , { 0cm , -.2cm } , { .2cm , -.2cm }
+ } }
+ { nine } { \clist_set:Nn \l_rpgnicons_pips_clist {
+ { -.2cm , .2cm } , { 0cm , .2cm } , { .2cm , .2cm } ,
+ { -.2cm , 0cm } , { 0cm , 0cm } , { .2cm , 0cm } ,
+ { -.2cm , -.2cm } , { 0cm , -.2cm } , { .2cm , -.2cm }
+ } }
+ }
+ \clist_map_inline:Nn \l_rpgnicons_pips_clist {
+ \fp_set:Nn \l_rpgnicons_pips_coordx_fp { \clist_item:nn {##1} { 1 } }
+ \fp_set:Nn \l_rpgnicons_pips_coordy_fp { \clist_item:nn {##1} { 2 } }
+ \draw_path_circle:nn { \l_rpgnicons_pips_coordx_fp , \l_rpgnicons_pips_coordy_fp } { 2pt }
+ }
+ \draw_path_use_clear:n { fill }
+ \rpgicons_draw_shape_sixside:
+}
+
+\cs_new:Npn \rpgicons_draw_shape_fudge: {
+ \rpgicons_draw_shape_sixside:
+ \draw_path_moveto:n { -.15cm , .1cm }
+ \draw_path_lineto:n { .15cm , .1cm }
+ \draw_path_moveto:n { 0cm , .25cm }
+ \draw_path_lineto:n { 0cm , -.05cm }
+ \draw_path_moveto:n { -.15cm , -.2cm }
+ \draw_path_lineto:n { .15cm , -.2cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_fudge_plus: {
+ \rpgicons_draw_shape_sixside:
+ \draw_path_moveto:n { 0cm , .15cm }
+ \draw_path_lineto:n { 0cm , -.15cm }
+ \draw_path_moveto:n { -.15cm , 0cm }
+ \draw_path_lineto:n { .15cm , 0cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_fudge_minus: {
+ \rpgicons_draw_shape_sixside:
+ \draw_path_moveto:n { -.15cm , 0cm }
+ \draw_path_lineto:n { .15cm , 0cm }
+}
+
+% ABILITIES
+
+\cs_new:Npn \rpgicons_draw_shape_strength: {
+ \draw_path_moveto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .425cm } { 90 } ) }
+ \draw_path_arc:nnn { 90 } { 60 } { .425cm }
+ \draw_path_arc:nnn { 200 } { -40 } { .1cm }
+ \draw_path_moveto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .425cm } { 45 } ) }
+ \draw_path_arc:nnn { 45 } { -20 } { .425cm }
+ \draw_path_arc:nnn { -50 } { -80 } { .35cm }
+ \draw_path_moveto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .425cm } { 90 } ) }
+ \draw_path_arc:nnn { 90 } { 120 } { .425cm }
+ \draw_path_arc:nnn { -20 } { 220 } { .1cm }
+ \draw_path_moveto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .425cm } { 135 } ) }
+ \draw_path_arc:nnn { 135 } { 200 } { .425cm }
+ \draw_path_arc:nnn { 230 } { 260 } { .35cm }
+ \draw_path_moveto:n { -.2cm , -.025cm }
+ \draw_path_lineto:n { -.1cm , -.05cm }
+ \draw_path_lineto:n { -.125cm , -.325cm }
+ \draw_path_arc:nnnn { 180 } { 360 } { .125cm } { .1cm }
+ \draw_path_lineto:n { .1cm , -.05cm }
+ \draw_path_lineto:n { .2cm , -.025cm }
+ \draw_path_moveto:n { 0cm , -.3cm }
+ \draw_path_arc:nnn { 90 } { 70 } { .1cm }
+ \draw_path_moveto:n { 0cm , -.3cm }
+ \draw_path_arc:nnn { 90 } { 110 } { .1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_constitution: {
+ \draw_path_moveto:n { 0cm , .25cm }
+ \draw_path_lineto:n { .125cm , .25cm }
+ \draw_path_arc:nnn { -90 } { -30 } { .325cm }
+ \draw_path_arc:nnn { 0 } { -80 } { .3cm }
+ \draw_path_moveto:n { 0cm , .25cm }
+ \draw_path_lineto:n { -.125cm , .25cm }
+ \draw_path_arc:nnn { 270 } { 210 } { .325cm }
+ \draw_path_arc:nnn { 180 } { 260 } { .3cm }
+ \draw_path_moveto:n { .325cm , .1cm }
+ \draw_path_lineto:n { .425cm , .075cm }
+ \draw_path_arc:nnnn { 0 } { -90 } { .175cm } { .1cm }
+ \draw_path_lineto:n { .2cm , -.15cm }
+ \draw_path_moveto:n { -.325cm , .1cm }
+ \draw_path_lineto:n { -.425cm , .075cm }
+ \draw_path_arc:nnnn { 180 } { 270 } { .175cm } { .1cm }
+ \draw_path_lineto:n { -.2cm , -.15cm }
+ \draw_path_moveto:n { -.15cm , -.225cm }
+ \draw_path_arc:nnn { 90 } { 270 } { .1cm }
+ \draw_path_lineto:n { .15cm , -.425cm }
+ \draw_path_arc:nnn { -90 } { 90 } { .1cm }
+ \draw_path_moveto:n { -.125cm , -.35cm }
+ \draw_path_arc:nnn { -90 } { 0 } { .05cm }
+ \draw_path_moveto:n { .125cm , -.35cm }
+ \draw_path_arc:nnn { 90 } { 0 } { -.05cm }
+ \draw_path_moveto:n { -.125cm , -.025cm }
+ \draw_path_lineto:n { -.075cm , -.05cm }
+ \draw_path_lineto:n { -.075cm , -.1cm }
+ \draw_path_moveto:n { .125cm , -.025cm }
+ \draw_path_lineto:n { .075cm , -.05cm }
+ \draw_path_lineto:n { .075cm , -.1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_wisdom: {
+ \draw_path_moveto:n { 0cm , .175cm }
+ \draw_path_arc:nnn { 60 } { 90 } { .425cm }
+ \draw_path_arc:nnn { 270 } { 240 } { .425cm }
+ \draw_path_moveto:n { 0cm , .175cm }
+ \draw_path_arc:nnn { 120 } { 90 } { .425cm }
+ \draw_path_arc:nnn { 270 } { 300 } { .425cm }
+ \draw_path_circle:nn { -.175cm , 0cm } { .075cm }
+ \draw_path_circle:nn { .175cm , 0cm } { .075cm }
+ \draw_path_moveto:n { .075cm , -.125cm }
+ \draw_path_lineto:n { 0cm , -.325cm }
+ \draw_path_lineto:n { -.075cm , -.125cm }
+ \draw_path_moveto:n { -.375cm , .125cm }
+ \draw_path_arc:nnn { 150 } { 270 } { .25cm }
+ \draw_path_moveto:n { .375cm , .125cm }
+ \draw_path_arc:nnn { 30 } { -90 } { .25cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_charisma: {
+ \draw_path_moveto:n { 0cm , .15cm }
+ \draw_path_arc:nnnn { 270 } { 190 } { .15cm } { .1cm }
+ \draw_path_arc:nnnn { 10 } { 90 } { .175cm } { .225cm }
+ \draw_path_arc:nnnn { 40 } { 0 } { .125cm } { .175cm }
+ \draw_path_moveto:n { 0cm , .15cm }
+ \draw_path_arc:nnnn { 270 } { 350 } { .15cm } { .1cm }
+ \draw_path_arc:nnnn { 170 } { 90 } { .175cm } { .225cm }
+ \draw_path_arc:nnnn { 140 } { 180 } { .125cm } { .175cm }
+ \draw_path_moveto:n { -.2cm , .125cm }
+ \draw_path_arc:nnnn { 0 } { 90 } { .175cm } { .1cm }
+ \draw_path_arc:nnnn { 180 } { 270 } { .15cm } { .2cm }
+ \draw_path_lineto:n { -.25cm , -.05cm }
+ \draw_path_arc:nnn { 40 } { 0 } { .45cm }
+ \draw_path_lineto:n { 0cm , -.425cm }
+ \draw_path_moveto:n { .2cm , .125cm }
+ \draw_path_arc:nnnn { 180 } { 90 } { .175cm } { .1cm }
+ \draw_path_arc:nnnn { 0 } { -90 } { .15cm } { .2cm }
+ \draw_path_lineto:n { .25cm , -.05cm }
+ \draw_path_arc:nnn { 140 } { 180 } { .45cm }
+ \draw_path_lineto:n { 0cm , -.425cm }
+ \draw_path_moveto:n { -.05cm , -.275cm }
+ \draw_path_arc:nnn { -30 } { 60 } { .05cm }
+ \draw_path_moveto:n { .05cm , -.275cm }
+ \draw_path_arc:nnn { 210 } { 120 } { .05cm }
+ \draw_path_moveto:n { -.125cm , -.05cm }
+ \draw_path_lineto:n { -.05cm , -.075cm }
+ \draw_path_moveto:n { .125cm , -.05cm }
+ \draw_path_lineto:n { .05cm , -.075cm }
+ \draw_path_moveto:n { -.35cm , -.05cm }
+ \draw_path_lineto:n { -.425cm , -.05cm }
+ \draw_path_arc:nnn { 30 } { -30 } { .15cm }
+ \draw_path_arc:nnn { 80 } { 10 } { .15cm }
+ \draw_path_lineto:n { -.25cm , -.275cm }
+ \draw_path_moveto:n { .35cm , -.05cm }
+ \draw_path_lineto:n { .425cm , -.05cm }
+ \draw_path_arc:nnn { 150 } { 210 } { .15cm }
+ \draw_path_arc:nnn { 100 } { 170 } { .15cm }
+ \draw_path_lineto:n { .25cm , -.275cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_dexterity: {
+ \draw_path_moveto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .425cm } { 90 } ) }
+ \draw_path_arc:nnn { 90 } { 65 } { .425cm }
+ \draw_path_arc:nnnn { 200 } { 90 } { .1cm } { .075cm }
+ \draw_path_arc:nnnn { 90 } { -30 } { .1cm } { .075cm }
+ \draw_path_moveto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .425cm } { 45 } ) }
+ \draw_path_arc:nnnn { 45 } { -20 } { .425cm } { .35cm }
+ \draw_path_arc:nnn { 110 } { 160 } { .175cm }
+ \draw_path_moveto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .425cm } { 90 } ) }
+ \draw_path_arc:nnn { 90 } { 115 } { .425cm }
+ \draw_path_arc:nnnn { -20 } { 90 } { .1cm } { .075cm }
+ \draw_path_arc:nnnn { 90 } { 220 } { .1cm } { .075cm }
+ \draw_path_moveto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .425cm } { 135 } ) }
+ \draw_path_arc:nnnn { 135 } { 200 } { .425cm } { .35cm }
+ \draw_path_arc:nnn { 70 } { 20 } { .175cm }
+ \draw_path_moveto:n { -.075cm , -.175cm }
+ \draw_path_arc:nnnn { 180 } { 360 } { .075cm } { .05cm }
+ \draw_path_moveto:n { 0cm , -.225cm }
+ \draw_path_lineto:n { 0cm , -.25cm }
+ \draw_path_moveto:n { -.2cm , .025cm }
+ \draw_path_lineto:n { -.075cm , 0cm }
+ \draw_path_lineto:n { -.125cm , -.075cm }
+ \draw_path_moveto:n { .125cm , -.075cm }
+ \draw_path_lineto:n { .075cm , 0cm }
+ \draw_path_lineto:n { .2cm , .025cm }
+ \draw_path_moveto:n { 0cm , -.25cm }
+ \draw_path_arc:nnnn { 360 } { 140 } { .1cm } { .075cm }
+ \draw_path_moveto:n { 0cm , -.25cm }
+ \draw_path_arc:nnnn { 180 } { 400 } { .1cm } { .075cm }
+ \draw_path_moveto:n { -.1cm , -.325cm }
+ \draw_path_lineto:n { -.1cm , -.375cm }
+ \draw_path_arc:nnnn { 180 } { 360 } { .1cm } { .05cm }
+ \draw_path_lineto:n { .1cm , -.325cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_dexterity_alt: {
+ \draw_path_moveto:n { ( 0cm , -.15cm ) + ( \draw_point_polar:nn { .425cm } { 90 } ) }
+ \draw_path_arc:nnn { 90 } { 75 } { .425cm }
+ \draw_path_moveto:n { ( 0cm , -.15cm ) + ( \draw_point_polar:nn { .425cm } { 90 } ) }
+ \draw_path_arc:nnn { 90 } { 105 } { .425cm }
+ \draw_path_moveto:n { .125cm , .175cm }
+ \draw_path_lineto:n { .375cm , .425cm }
+ \draw_path_arc:nnn { 30 } { -20 } { .25cm }
+ \draw_path_lineto:n { ( 0cm , -.1cm ) + ( \draw_point_polar:nn { .425cm } { 30 } ) }
+ \draw_path_arc:nnnn { 30 } { -45 } { .425cm } { .35cm }
+ \draw_path_moveto:n { -.125cm , .175cm }
+ \draw_path_lineto:n { -.375cm , .425cm }
+ \draw_path_arc:nnn { 150 } { 200 } { .25cm }
+ \draw_path_lineto:n { ( 0cm , -.1cm ) + ( \draw_point_polar:nn { .425cm } { 150 } ) }
+ \draw_path_arc:nnnn { 150 } { 225 } { .425cm } { .35cm }
+ \draw_path_moveto:n { .075cm , -.075cm }
+ \draw_path_arc:nnnn { 170 } { 90 } { .15cm } { .05cm }
+ \draw_path_moveto:n { -.075cm , -.075cm }
+ \draw_path_arc:nnnn { 10 } { 90 } { .15cm } { .05cm }
+ \draw_path_moveto:n { 0cm , -.275cm }
+ \draw_path_arc:nnnn { 0 } { 90 } { .075cm } { .05cm }
+ \draw_path_moveto:n { 0cm , -.275cm }
+ \draw_path_arc:nnnn { 180 } { 90 } { .075cm } { .05cm }
+ \draw_path_moveto:n { 0cm , -.275cm }
+ \draw_path_arc:nnnn { 360 } { 180 } { .1cm } { .075cm }
+ \draw_path_moveto:n { 0cm , -.275cm }
+ \draw_path_arc:nnnn { 180 } { 360 } { .1cm } { .075cm }
+ \draw_path_moveto:n { -.1cm , -.35cm }
+ \draw_path_lineto:n { -.1cm , -.375cm }
+ \draw_path_arc:nnnn { 180 } { 360 } { .1cm } { .05cm }
+ \draw_path_lineto:n { .1cm , -.35cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_intelligence: {
+ \draw_path_moveto:n { ( 0cm , -.2cm ) + ( \draw_point_polar:nn { .425cm } { 90 } ) }
+ \draw_path_arc:nnn { 90 } { 60 } { .25cm }
+ \draw_path_lineto:n { ( 0cm , -.1cm ) + ( \draw_point_polar:nn { .6cm } { 60 } ) }
+ \draw_path_arc:nnn { 40 } { -2.5 } { .425cm }
+ \draw_path_moveto:n { ( 0cm , -.2cm ) + ( \draw_point_polar:nn { .425cm } { 90 } ) }
+ \draw_path_arc:nnn { 90 } { 120 } { .25cm }
+ \draw_path_lineto:n { ( 0cm , -.1cm ) + ( \draw_point_polar:nn { .6cm } { 120 } ) }
+ \draw_path_arc:nnn { 140 } { 182.5 } { .425cm }
+ \draw_path_moveto:n { ( 0cm , -.2cm ) + ( \draw_point_polar:nn { .425cm } { 45 } ) }
+ \draw_path_arc:nnn { 45 } { 0 } { .425cm }
+ \draw_path_lineto:n { .2cm , -.275cm }
+ \draw_path_moveto:n { ( 0cm , -.2cm ) + ( \draw_point_polar:nn { .425cm } { 135 } ) }
+ \draw_path_arc:nnn { 135 } { 180 } { .425cm }
+ \draw_path_lineto:n { -.2cm , -.275cm }
+ \draw_path_moveto:n { -.2cm , -.075cm }
+ \draw_path_lineto:n { -.1cm , -.1cm }
+ \draw_path_lineto:n { -.075cm , -.375cm }
+ \draw_path_arc:nnnn { 180 } { 360 } { .075cm } { .05cm }
+ \draw_path_lineto:n { .1cm , -.1cm }
+ \draw_path_lineto:n { .2cm , -.075cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_resilience: {
+ \draw_path_moveto:n { ( -.425cm , -.475cm ) + ( \draw_point_polar:nn { .5cm } { 65 } ) }
+ \draw_path_arc:nnn { 65 } { 90 } { .5cm }
+ \draw_path_lineto:n { ( 0cm , -.075cm ) + ( \draw_point_polar:nn { .55cm } { 135 } ) }
+ \draw_path_arc:nnn { 135 } { 45 } { .55cm }
+ \draw_path_lineto:n { .425cm , .025cm }
+ \draw_path_arc:nnn { 90 } { 115 } { .5cm }
+ \draw_path_moveto:n { .2cm , .3cm }
+ \draw_path_lineto:n { .125cm , .275cm }
+ \draw_path_lineto:n { .2cm , .15cm }
+ \draw_path_moveto:n { .125cm , .075cm }
+ \draw_path_lineto:n { .05cm , .05cm }
+ \draw_path_moveto:n { .15cm , -.1cm }
+ \draw_path_arc:nnn { 200 } { 230 } { .4cm }
+ \draw_path_moveto:n { -.2cm , .3cm }
+ \draw_path_lineto:n { -.125cm , .275cm }
+ \draw_path_lineto:n { -.2cm , .15cm }
+ \draw_path_moveto:n { -.125cm , .075cm }
+ \draw_path_lineto:n { -.05cm , .05cm }
+ \draw_path_moveto:n { -.15cm , -.1cm }
+ \draw_path_arc:nnn { 340 } { 310 } { .4cm }
+ \draw_path_moveto:n { -.065cm , -.075cm }
+ \draw_path_lineto:n { -.045cm , -.425cm }
+ \draw_path_lineto:n { .045cm , -.425cm }
+ \draw_path_lineto:n { .065cm , -.075cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_sanity: {
+ \draw_path_moveto:n { ( -.125cm + .175cm * sind(30) , .425cm - .175cm * cosd(30) ) +
+ ( \draw_point_polar:nn { .175cm } { 210 } ) }
+ \draw_path_arc:nnn { 210 } { 120 } { .175cm }
+ \draw_path_lineto:n { \draw_point_polar:nn { .25cm } { 110 } }
+ \draw_path_arc:nnn { 110 } { 70 } { .25cm }
+ \draw_path_lineto:n { .125cm , .425cm }
+ \draw_path_arc:nnn { 420 } { 330 } { .175cm }
+ \draw_path_moveto:n { .25cm , .1cm }
+ \draw_path_arc:nnn { 390 } { 305 } { .15cm }
+ \draw_path_moveto:n { -.25cm , .1cm }
+ \draw_path_arc:nnn { 150 } { 235 } { .15cm }
+ \draw_path_moveto:n { -.15cm , .075cm }
+ \draw_path_lineto:n { -.1cm , .05cm }
+ \draw_path_lineto:n { -.1cm , .025cm }
+ \draw_path_moveto:n { .15cm , .075cm }
+ \draw_path_lineto:n { .1cm , .05cm }
+ \draw_path_lineto:n { .1cm , .025cm }
+ \draw_path_moveto:n { ( -.55cm , -.35cm ) + ( \draw_point_polar:nnn { .125cm } { .075cm} { 135 } ) +
+ ( \draw_point_polar:nn { .55cm } { 20 } ) }
+ \draw_path_arc:nnn { 380 } { 360 } { .55cm }
+ \draw_path_arc:nnnn { 135 } { 405 } { .125cm } { .075cm }
+ \draw_path_arc:nnn { 180 } { 160 } { .55cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_perception: {
+ \draw_path_moveto:n { ( 0cm , .35cm ) + ( \draw_point_polar:nn { .125cm } { 150 } ) }
+ \draw_path_arc:nnn { 150 } { 390 } { .125cm }
+ \draw_path_moveto:n { -.3cm , .425cm }
+ \draw_path_arc:nnnn { 180 } { 360 } { .3cm } { .2cm }
+ \draw_path_moveto:n { ( 0cm , .425cm ) + ( \draw_point_polar:nnn { .3cm } { .2cm } { 330 } ) }
+ \draw_path_arc:nnnn { 270 } { 350 } { .15cm } { .1cm }
+ \draw_path_moveto:n { ( 0cm , .425cm ) + ( \draw_point_polar:nnn { .3cm } { .2cm } { 210 } ) }
+ \draw_path_arc:nnnn { 270 } { 190 } { .15cm } { .1cm }
+ \draw_path_moveto:n { -.2cm , .15cm }
+ \draw_path_lineto:n { -.375cm , .125cm }
+ \draw_path_arc:nnn { 210 } { 250 } { .225cm }
+ \draw_path_moveto:n { .2cm , .15cm }
+ \draw_path_lineto:n { .375cm , .125cm }
+ \draw_path_arc:nnn { 330 } { 290 } { .225cm }
+ \draw_path_moveto:n { -.15cm , 0cm }
+ \draw_path_lineto:n { -.075cm , -.025cm }
+ \draw_path_lineto:n { -.075cm , -.05cm }
+ \draw_path_moveto:n { .15cm , 0cm }
+ \draw_path_lineto:n { .075cm , -.025cm }
+ \draw_path_lineto:n { .075cm , -.05cm }
+ \draw_path_moveto:n { ( -.075cm , ( -.35cm + .075cm * ( 2 + sqrt(3) ) ) ) +
+ ( \draw_point_polar:nnn { .1cm } { .075cm } { 195 } ) }
+ \draw_path_lineto:n { ( 0cm , -.35cm ) + ( \draw_point_polar:nnn { .1cm } { .075cm } { 195 } ) }
+ \draw_path_arc:nnnn { 195 } { 345 } { .1cm } { .075cm }
+ \draw_path_lineto:n { ( .075cm , ( -.35cm + .075cm * ( 2 + sqrt(3) ) ) ) +
+ ( \draw_point_polar:nnn { .1cm } { .075cm } { 345 } ) }
+ \draw_path_moveto:n { .025cm , -.325cm }
+ \draw_path_arc:nnn { 0 } { 180 } { .025cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_luck: {
+ \draw_path_moveto:n { .1cm , .15cm }
+ \draw_path_lineto:n { .1cm , -.05cm }
+ \draw_path_arc:nnn { -75 } { -15 } { .425cm }
+ \draw_path_arc:nnn { 40 } { 85 } { .425cm }
+ \draw_path_moveto:n { -.1cm , .15cm }
+ \draw_path_lineto:n { -.1cm , -.05cm }
+ \draw_path_arc:nnn { -105 } { -165 } { .425cm }
+ \draw_path_arc:nnn { 140 } { 95 } { .425cm }
+ \draw_path_moveto:n { ( 0cm , -.05cm ) + ( \draw_point_polar:nn { .425cm } { 15 } ) }
+ \draw_path_arc:nnnn { 15 } { -55 } { .425cm } { .3cm }
+ \draw_path_moveto:n { ( 0cm , -.05cm ) + ( \draw_point_polar:nn { .425cm } { 165 } ) }
+ \draw_path_arc:nnnn { 165 } { 235 } { .425cm } { .3cm }
+ \draw_path_moveto:n { 0cm , -.175cm }
+ \draw_path_arc:nnnn { 90 } { 250 } { .175cm } { .125cm }
+ \draw_path_lineto:n { -.05cm , -.325cm }
+ \draw_path_moveto:n { 0cm , -.175cm }
+ \draw_path_arc:nnnn { 90 } { -70 } { .175cm } { .125cm }
+ \draw_path_lineto:n { .05cm , -.325cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_armor: {
+ \draw_path_moveto:n { -.25cm , -.425cm }
+ \draw_path_lineto:n { .25cm , -.425cm }
+ \draw_path_lineto:n { .2cm , -.225cm }
+ \draw_path_lineto:n { .25cm , .125cm }
+ \draw_path_lineto:n { .425cm , .125cm }
+ \draw_path_arc:nnn { 0 } { 90 } { .3cm }
+ \draw_path_lineto:n { .125cm , .35cm }
+ \draw_path_arc:nnn { 360 } { 180 } { .125cm }
+ \draw_path_lineto:n { -.125cm , .425cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .3cm }
+ \draw_path_lineto:n { -.25cm , .125cm }
+ \draw_path_lineto:n { -.2cm , -.225cm }
+ \draw_path_close:
+ \draw_path_moveto:n { .125cm , .425cm }
+ \draw_path_lineto:n { .125cm , .25cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .125cm }
+ \draw_path_moveto:n { -.125cm , .425cm }
+ \draw_path_lineto:n { -.125cm , .25cm }
+ \draw_path_arc:nnn { 360 } { 270 } { .125cm }
+ \draw_path_moveto:n { 0cm , .225cm }
+ \draw_path_lineto:n { 0cm , -.275cm }
+ \draw_path_moveto:n { -.2cm , -.225cm }
+ \draw_path_lineto:n { 0cm , -.275cm }
+ \draw_path_lineto:n { .2cm , -.225cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_proficiency: {
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 90 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 126 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 162 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 198 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 234 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 270 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 306 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 342 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 18 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 54 } }
+ \draw_path_close:
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 270 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 270 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 342 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 342 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 54 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 54 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm } { 126 }}
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 126 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 198 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 198 } }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_linear: {
+ \draw_path_circle:nn { -.4cm , 0cm } { 2pt }
+ \draw_path_use_clear:n { fill }
+ \draw_path_moveto:n { -.4cm , 0cm }
+ \draw_path_lineto:n { .4cm , 0cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_conic: {
+ \draw_path_circle:nn { -.425cm , 0cm } { 2pt }
+ \draw_path_use_clear:n { fill }
+ \draw_path_ellipse:nnn { .2125cm , 0cm } { .2cm , 0cm } { 0cm , .425cm }
+ \draw_path_moveto:n { .2125cm - .2cm * sin( asin( .2cm / .6375cm ) ) ,
+ -.425cm * cos( asin( .2cm / ( .6375cm ) ) ) }
+ \draw_path_lineto:n { -.425cm , 0cm }
+ \draw_path_lineto:n { .2125cm - .2cm * sin( asin( .2cm / .6375cm ) ) ,
+ .425cm * cos( asin( .2cm / ( .6375cm ) ) ) }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_quadratic: {
+ \draw_path_circle:nn { 0cm , 0cm } { 2pt }
+ \draw_path_use_clear:n { fill }
+ \bool_if:NTF \l__rpgicons_compat_mode_bool {
+ % l3draw rectangle fix
+ \draw_path_moveto:n { -.4cm , -.4cm }
+ \draw_path_lineto:n { -.4cm , .4cm }
+ \draw_path_lineto:n { .4cm , .4cm }
+ \draw_path_lineto:n { .4cm , -.4cm }
+ \draw_path_close:
+ } {
+ \draw_path_rectangle_corners:nn { -.4cm , -.4cm } { .4cm , .4cm }
+ }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_cubic: {
+ \draw_path_circle:nn { .1125cm , -.1125cm } { 2pt }
+ \draw_path_use_clear:n { fill }
+ \draw_path_moveto:n { -.425cm , .425cm }
+ \draw_path_lineto:n { -.425cm , -.2cm }
+ \draw_path_lineto:n { -.2cm , -.425cm }
+ \draw_path_lineto:n { .425cm , -.425cm }
+ \draw_path_lineto:n { .425cm , .2cm }
+ \draw_path_lineto:n { .2cm , .425cm }
+ \draw_path_close:
+ \draw_path_lineto:n { -.2cm , .2cm }
+ \draw_path_lineto:n { -.2cm , -.425cm }
+ \draw_path_moveto:n { -.2cm , .2cm }
+ \draw_path_lineto:n { .425cm , .2cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_spheric: {
+ \draw_path_circle:nn { 0cm , 0cm } { 2pt }
+ \draw_path_use_clear:n { fill }
+ \draw_path_circle:nn { 0cm , 0cm } { .425cm }
+ \draw_path_moveto:n { .425cm , 0cm }
+ \draw_path_arc:nnnn { 180 } { 50 } { -.425cm } { -.2cm }
+ \draw_path_moveto:n { 0cm , -.425cm }
+ \draw_path_arc:nnnn { 270 } { 140 } { -.2cm } { .425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_cylindric: {
+ \draw_path_circle:nn { 0cm , -.2125cm } { 2pt }
+ \draw_path_use_clear:n { fill }
+ \draw_path_ellipse:nnn { 0cm , .2125cm } { 0cm , .2cm } { .425cm , 0cm }
+ \draw_path_moveto:n { -.425cm , .2125cm }
+ \draw_path_lineto:n { -.425cm , -.2125cm }
+ \draw_path_arc:nnnn { 0 } { 180 } { -.425cm } { -.2cm }
+ \draw_path_lineto:n { .425cm , .2125cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_verbal: {
+ \draw_path_moveto:n { -.35cm , 0cm }
+ \draw_path_arc:nnn { 180 } { -115 } { .35cm }
+ \draw_path_lineto:n { -.4cm , -.4cm }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm } { 215 } }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_somatic: {
+ \draw_path_moveto:n { -.425cm , 0cm }
+ \draw_path_arc:nnnn { 0 } { 270 } { -.425cm } { -.2cm }
+ \draw_path_moveto:n { 0cm , -.425cm }
+ \draw_path_arc:nnnn { 90 } { 360 } { -.2cm } { -.425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_material: {
+ \draw_path_moveto:n { -.4cm , .2cm }
+ \draw_path_lineto:n { -.4cm , -.2cm }
+ \draw_path_lineto:n { 0cm , -.4cm }
+ \draw_path_lineto:n { .4cm , -.2cm }
+ \draw_path_lineto:n { .4cm , .2cm }
+ \draw_path_lineto:n { 0cm , .4cm }
+ \draw_path_close:
+ \draw_path_lineto:n { 0cm , 0cm }
+ \draw_path_lineto:n { .4cm , .2cm }
+ \draw_path_moveto:n { 0cm , 0cm }
+ \draw_path_lineto:n { 0cm , -.4cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_focus: {
+ \draw_path_circle:nn { 0cm , 0cm } { .35cm }
+ \draw_path_moveto:n { -.15cm , 0 }
+ \draw_path_lineto:n { -.425cm , 0 }
+ \draw_path_moveto:n { .15cm , 0 }
+ \draw_path_lineto:n { .425cm , 0 }
+ \draw_path_moveto:n { 0cm , -.15cm }
+ \draw_path_lineto:n { 0cm , -.425cm }
+ \draw_path_moveto:n { 0cm , .15cm }
+ \draw_path_lineto:n { 0cm , .425cm }
+}
+
+% SPELLSCHOOLS
+
+\cs_new:Npn \rpgicons_draw_shape_abjuration: {
+ \draw_path_moveto:n { 0cm , .025cm }
+ \draw_path_arc:nnnn { 270 } { 390 } { .275cm } { .175cm }
+ \draw_path_arc:nnn { 210 } { 120 } { .095cm }
+ \draw_path_moveto:n { 0cm , .025cm }
+ \draw_path_arc:nnnn { 270 } { 150 } { .275cm } { .175cm }
+ \draw_path_arc:nnn { -30 } { 60 } { .095cm }
+ \draw_path_moveto:n { 0cm , .25cm }
+ \draw_path_lineto:n { 0cm , -.425cm }
+ \draw_path_moveto:n { -.25cm , -.125cm }
+ \draw_path_lineto:n { .25cm , -.125cm }
+ \draw_path_moveto:n { -.25cm , -.3cm }
+ \draw_path_lineto:n { .25cm , -.3cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_conjuration: {
+ \draw_path_moveto:n { -.425cm , .425cm }
+ \draw_path_lineto:n { 0cm , -.425cm }
+ \draw_path_lineto:n { .425cm , .425cm }
+ \draw_path_moveto:n { -.225cm , .05cm }
+ \draw_path_lineto:n { .225cm , .05cm }
+ \draw_path_moveto:n { 0cm , -.15cm }
+ \draw_path_arc:nnn { 110 } { 70 } { .5cm }
+ \draw_path_moveto:n { 0cm , -.15cm }
+ \draw_path_arc:nnn { 110 } { 70 } { -.5cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_divination: {
+ \draw_path_moveto:n { -.35cm , -.175cm }
+ \draw_path_arc:nnnn { 180 } { 0 } { .15cm } { -.25cm }
+ \draw_path_arc:nnn { 180 } { 90 } { .4cm }
+ \draw_path_moveto:n { -.05cm , -.175cm }
+ \draw_path_lineto:n { -.05cm , 0cm }
+ \draw_path_arc:nnn { 180 } { 90 } { .4cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_enchantment: {
+ \draw_path_moveto:n { -.2cm , -.425cm }
+ \draw_path_lineto:n { -.2cm , .425cm }
+ \draw_path_moveto:n { -.425cm , .175cm }
+ \draw_path_lineto:n { .025cm , .175cm }
+ \draw_path_moveto:n { -.2cm , -.225cm }
+ \draw_path_arc:nnnn { 180 } { 0 } { .1cm } { .2cm }
+ \draw_path_arc:nnnn { 180 } { 0 } { .1cm } { .2cm }
+ \draw_path_arc:nnnn { 180 } { 0 } { .1cm } { -.2cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_evocation: {
+ \draw_path_ellipse:nnn { 0cm , 0cm } { .325cm , 0cm } { 0cm , .225cm }
+ \draw_path_moveto:n { 0cm , .425cm }
+ \draw_path_lineto:n { 0cm , -.425cm }
+ \draw_path_moveto:n { -.425cm , 0cm }
+ \draw_path_lineto:n { .425cm , 0cm }
+ \draw_path_moveto:n { \draw_point_polar:nnn { 30 } { .325cm } { .225cm } }
+ \draw_path_lineto:n { \draw_point_polar:nn { 30 } { .4cm} }
+ \draw_path_moveto:n { \draw_point_polar:nnn { 60 } { .325cm } { .225cm } }
+ \draw_path_lineto:n { \draw_point_polar:nn { 60 } { .4cm} }
+ \draw_path_moveto:n { \draw_point_polar:nnn { 120 } { .325cm } { .225cm } }
+ \draw_path_lineto:n { \draw_point_polar:nn { 120 } { .4cm} }
+ \draw_path_moveto:n { \draw_point_polar:nnn { 150 } { .325cm } { .225cm } }
+ \draw_path_lineto:n { \draw_point_polar:nn { 150 } { .4cm} }
+ \draw_path_moveto:n { \draw_point_polar:nnn { 210 } { .325cm } { .225cm } }
+ \draw_path_lineto:n { \draw_point_polar:nn { 210 } { .4cm} }
+ \draw_path_moveto:n { \draw_point_polar:nnn { 240 } { .325cm } { .225cm } }
+ \draw_path_lineto:n { \draw_point_polar:nn { 240 } { .4cm} }
+ \draw_path_moveto:n { \draw_point_polar:nnn { 300 } { .325cm } { .225cm } }
+ \draw_path_lineto:n { \draw_point_polar:nn { 300 } { .4cm} }
+ \draw_path_moveto:n { \draw_point_polar:nnn { 330 } { .325cm } { .225cm } }
+ \draw_path_lineto:n { \draw_point_polar:nn { 330 } { .4cm} }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_illusion: {
+ \draw_path_moveto:n { 0cm , .225cm }
+ \draw_path_arc:nnn { 90 } { 30 } { .45cm }
+ \draw_path_arc:nnn { 330 } { 210 } { .45cm }
+ \draw_path_arc:nnn { 150 } { 90 } { .45cm }
+ \draw_path_moveto:n { ( 0cm , .225cm ) + ( \draw_point_polar:nn { .45cm } { 270 } ) }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 270 } }
+ \draw_path_moveto:n { ( 0cm , .225cm ) + ( \draw_point_polar:nn { .45cm } { 240 } ) }
+ \draw_path_lineto:n { \draw_point_polar:nn { .4cm} { 225 } }
+ \draw_path_moveto:n { ( 0cm , .225cm ) + ( \draw_point_polar:nn { .45cm } { 300 } ) }
+ \draw_path_lineto:n { \draw_point_polar:nn { .4cm} { 315 } }
+ \draw_path_moveto:n { 0cm , .225cm }
+ \draw_path_circle:nn { 0cm , .075cm } { .15cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_necromancy: {
+ \draw_path_moveto:n { \draw_point_polar:nn { .25cm} { 210 } }
+ \draw_path_arc:nnn { 210 } { -30 } { .25cm }
+ \draw_path_arc:nnn { 150 } { 390 } { .1cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .25cm} { 210 } }
+ \draw_path_arc:nnn { 390 } { 150 } { .1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_transmutation: {
+ \draw_path_moveto:n { -.25cm , .35cm }
+ \draw_path_lineto:n { -.25cm , -.35cm }
+ \draw_path_moveto:n { 0cm , .35cm }
+ \draw_path_lineto:n { 0cm , -.35cm }
+ \draw_path_moveto:n { -.425cm , .35cm }
+ \draw_path_lineto:n { .15cm , .35cm }
+ \draw_path_arc:nnn { 90 } { -45 } { .1cm }
+ \draw_path_arc:nnn { 135 } { 360 } { .1cm }
+}
+
+% DAMAGES
+
+\cs_new:Npn \rpgicons_draw_shape_acid: {
+ \draw_path_moveto:n { ( -.175cm , .05cm ) + ( \draw_point_polar:nn { .175 } { -20 } ) }
+ \draw_path_arc:nnn { -20 } { 200 } { -.175cm }
+ \draw_path_lineto:n { 0cm , .425cm }
+ \draw_path_close:
+ \draw_path_moveto:n {
+ \draw_point_intersect_lines:nnnn
+ { ( 0cm , -.175cm ) + ( \draw_point_polar:nn { -.25cm } { 20 } ) }
+ { ( 0cm , -.175cm ) + ( \draw_point_polar:nn { -.25cm } { 160 } ) }
+ { -.425cm , -.425cm } { -.425cm , .425cm }
+ }
+ \draw_path_lineto:n { ( 0cm , -.175cm ) + ( \draw_point_polar:nn { -.25cm } { 20 } ) }
+ \draw_path_arc:nnn { 20 } { 160 } { -.25cm }
+ \draw_path_lineto:n {
+ \draw_point_intersect_lines:nnnn
+ { ( 0cm , -.175cm ) + ( \draw_point_polar:nn { -.25cm } { 20 } ) }
+ { ( 0cm , -.175cm ) + ( \draw_point_polar:nn { -.25cm } { 160 } ) }
+ { .425cm , -.425cm } { .425cm , .425cm }
+ }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_bludgeoning: {
+ \draw_path_moveto:n { -.2cm , .225cm }
+ \draw_path_lineto:n { 0cm , .425cm }
+ \draw_path_lineto:n { .425cm , 0cm }
+ \draw_path_lineto:n { .225cm , -.2cm }
+ \draw_path_close:
+ \draw_path_moveto:n { .05cm , -.025cm }
+ \draw_path_lineto:n { -.35cm , -.425cm }
+ \draw_path_lineto:n { -.425cm , -.35cm }
+ \draw_path_lineto:n { -.025cm , .05cm }
+ \draw_path_moveto:n { .2375cm , .1875cm }
+ \draw_path_arc:nnn { 135 } { 315 } { -.05cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_cold: {
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 90 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 270 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 110 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .25cm} { 90 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 70 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 250 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .25cm} { 270 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 290 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 30 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 210 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 50 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .25cm} { 30 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 10 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 190 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .25cm} { 210 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 230 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 150 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 330 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 130 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .25cm} { 150 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 170 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .35cm} { 310 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .25cm} { 330 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 350 } }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_fire: {
+ \draw_path_moveto:n { .15cm , -.425cm }
+ \draw_path_arc:nnnn { -60 } { 0 } { .45cm } { .375cm }
+ \draw_path_curveto:nnn { .375cm , .15cm } { .15cm , .375cm } { -.05cm , .425cm }
+ \draw_path_moveto:n { -.15cm , -.425cm }
+ \draw_path_arc:nnnn { 240 } { 135 } { .45cm } { .35cm }
+ \draw_path_curveto:nnn { -.15cm , .2cm } { 0cm , .25cm } { -.05cm , .425cm }
+ \draw_path_moveto:n { .075cm , -.3cm }
+ \draw_path_curveto:nnn { .2cm , -.2cm } { .2cm , -.05cm } { .05cm , .1cm }
+ \draw_path_moveto:n { -.075cm , -.3cm }
+ \draw_path_arc:nnnn { 220 } { 150 } { .35cm } { .2cm }
+ \draw_path_curveto:nnn { 0cm , -.2cm } { .05cm , -.1cm } { .05cm , .1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_force: {
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 90 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 120 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 150 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 180 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 210 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 240 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 270 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 300 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 330 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 0 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 30 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .15cm} { 60 } }
+ \draw_path_close:
+}
+
+\cs_new:Npn \rpgicons_draw_shape_lightning: {
+ \draw_path_moveto:n { 0cm , .425cm }
+ \draw_path_lineto:n { -.25cm , -.15cm }
+ \draw_path_lineto:n { .25cm , .15cm }
+ \draw_path_lineto:n { 0cm , -.425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_necrotic: {
+ \draw_path_moveto:n { -.35cm , -.425cm }
+ \draw_path_lineto:n { -.35cm , .075cm }
+ \draw_path_arc:nnn { 180 } { 0 } { .35cm }
+ \draw_path_lineto:n { .35cm , -.425cm }
+ \draw_path_close:
+ \draw_path_moveto:n { 0cm , -.2cm }
+ \draw_path_lineto:n { 0cm , .25cm }
+ \draw_path_moveto:n { -.15cm , .1cm }
+ \draw_path_lineto:n { .15cm , .1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_piercing: {
+ \draw_path_moveto:n { -.425cm , .075cm }
+ \draw_path_lineto:n { .3cm , .075cm }
+ \draw_path_lineto:n { .425cm , 0cm }
+ \draw_path_lineto:n { .3cm , -.075cm }
+ \draw_path_lineto:n { -.425cm , -.075cm }
+ \draw_path_moveto:n { .25cm , .2cm }
+ \draw_path_lineto:n { -.05cm , .35cm }
+ \draw_path_moveto:n { .25cm , -.2cm }
+ \draw_path_lineto:n { -.05cm , -.35cm }
+ \draw_path_moveto:n { .425cm , .15cm }
+ \draw_path_lineto:n { .25cm , .425cm }
+ \draw_path_moveto:n { .425cm , -.15cm }
+ \draw_path_lineto:n { .25cm , -.425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_poison: {
+ \draw_path_moveto:n { ( 0cm , .175cm ) + ( \draw_point_polar:nn { .25cm } { -40 } ) }
+ \draw_path_arc:nnn { -40 } { 220 } { .25cm }
+ \draw_path_lineto:n { -.15cm , -.1cm }
+ \draw_path_lineto:n { .15cm , -.1cm }
+ \draw_path_close:
+ \draw_path_circle:nn { -.1cm , .15cm } { .05cm }
+ \draw_path_circle:nn { .1cm , .15cm } { .05cm }
+ \draw_path_moveto:n { .425cm , -.2cm }
+ \draw_path_lineto:n { -.425cm , -.425cm }
+ \draw_path_moveto:n { -.425cm , -.2cm }
+ \draw_path_lineto:n { .425cm , -.425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_psychic: {
+ \draw_path_moveto:n { .075cm , .4cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .425cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .375cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .325cm }
+ \draw_path_arc:nnn { 0 } { 90 } { .275cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .225cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .175cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .125cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_radiant: {
+ \draw_path_circle:nn { 0cm , 0cm } { .225cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 15 } }
+ \draw_path_arc:nnn { 15 } { 45 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 75 } }
+ \draw_path_arc:nnn { 75 } { 105 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 135 } }
+ \draw_path_arc:nnn { 135 } { 165 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 195 } }
+ \draw_path_arc:nnn { 195 } { 225 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 255 } }
+ \draw_path_arc:nnn { 255 } { 285 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 315 } }
+ \draw_path_arc:nnn { 315 } { 345 } { .425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_slashing: {
+ \draw_path_moveto:n { -.15cm , .225cm }
+ \draw_path_lineto:n { -.275cm , .35cm }
+ \draw_path_arc:nnn { 0 } { 240 } { .075cm }
+ \draw_path_lineto:n { -.35cm , .275cm }
+ \draw_path_lineto:n { -.225cm , .15cm }
+ \draw_path_lineto:n { -.425cm , -.05cm }
+ \draw_path_lineto:n { -.35cm , -.125cm }
+ \draw_path_lineto:n { .125cm , .35cm }
+ \draw_path_lineto:n { .05cm , .425cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.2cm , .025cm }
+ \draw_path_lineto:n { .225cm , -.425cm }
+ \draw_path_lineto:n { .425cm , -.425cm }
+ \draw_path_lineto:n { .425cm , -.225cm }
+ \draw_path_lineto:n { -.025cm , .2cm }
+ \draw_path_moveto:n { .325cm , -.325cm }
+ \draw_path_lineto:n { 0cm , 0cm }
+ \draw_path_moveto:n { .425cm , .3cm }
+ \draw_path_lineto:n { .425cm , 0cm }
+ \draw_path_moveto:n { .275cm , .425cm }
+ \draw_path_lineto:n { .275cm , .1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_thunder: {
+ \draw_path_moveto:n { .225cm , -.075cm }
+ \draw_path_arc:nnn { -90 } { 120 } { .2cm }
+ \draw_path_arc:nnn { 30 } { 180 } { .225cm }
+ \draw_path_lineto:n { -.3cm , .125cm + cosd( 30 ) * .2cm - sind( 30 ) * .225cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .125cm }
+ \draw_path_lineto:n { -.425cm , .05cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .125cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.1cm , -.225cm }
+ \draw_path_arc:nnn { 240 } { 300 } { .3cm }
+ \draw_path_moveto:n { -.2cm , -.35cm }
+ \draw_path_arc:nnn { 240 } { 300 } { .5cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_healing: {
+ \draw_path_moveto:n { 0cm , .125cm }
+ \draw_path_arc:nnn { 0 } { 225 } { .2cm }
+ \draw_path_lineto:n { 0cm , -.375cm }
+ \draw_path_moveto:n { 0cm , .125cm }
+ \draw_path_arc:nnn { 180 } { -45 } { .2cm }
+ \draw_path_lineto:n { 0cm , -.375cm }
+}
+
+% ATTACKS
+
+\cs_new:Npn \rpgicons_draw_shape_melee: {
+ \draw_path_moveto:n { -.15cm , -.225cm }
+ \draw_path_lineto:n { -.275cm , -.35cm }
+ \draw_path_arc:nnn { 360 } { 90 } { .075cm }
+ \draw_path_lineto:n { -.35cm , -.275cm }
+ \draw_path_lineto:n { -.225cm , -.15cm }
+ \draw_path_lineto:n { -.425cm , .05cm }
+ \draw_path_lineto:n { -.35cm , .125cm }
+ \draw_path_lineto:n { .125cm , -.35cm }
+ \draw_path_lineto:n { .05cm , -.425cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.2cm , -.025cm }
+ \draw_path_lineto:n { .225cm , .425cm }
+ \draw_path_lineto:n { .425cm , .425cm }
+ \draw_path_lineto:n { .425cm , .225cm }
+ \draw_path_lineto:n { -.025cm , -.2cm }
+ \draw_path_moveto:n { .325cm , .325cm }
+ \draw_path_lineto:n { 0cm , 0cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_ranged: {
+ \draw_path_moveto:n { 0cm , 0cm }
+ \draw_path_lineto:n { 0cm , -.225cm }
+ \draw_path_arc:nnn { 0 } { -30 } { .4cm }
+ \draw_path_arc:nnn { -45 } { 0 } { .6cm }
+ \draw_path_moveto:n { 0cm , 0cm }
+ \draw_path_lineto:n { 0cm , .225cm }
+ \draw_path_arc:nnn { 0 } { 30 } { .4cm }
+ \draw_path_arc:nnn { 45 } { 0 } { .6cm }
+ \draw_path_moveto:n { -.425cm , 0cm }
+ \draw_path_lineto:n { .425cm , 0cm }
+ \draw_path_moveto:n { .275cm , .1cm }
+ \draw_path_lineto:n { .425cm , 0cm }
+ \draw_path_lineto:n { .275cm , -.1cm }
+ \draw_path_moveto:n { ( -.4cm , -.225cm ) + ( \draw_point_polar:nn { .4cm } { -20 } ) }
+ \draw_path_lineto:n { -.425cm , 0cm }
+ \draw_path_lineto:n { ( -.4cm , .225cm ) + ( \draw_point_polar:nn { .4cm } { 20 } ) }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_magic: {
+ \draw_path_moveto:n { -.225cm , -.425cm }
+ \draw_path_lineto:n { -.425cm , -.225cm }
+ \draw_path_lineto:n { -.3cm , -.1cm }
+ \draw_path_lineto:n { -.3cm , .125cm }
+ \draw_path_lineto:n { 0cm , .425cm }
+ \draw_path_arc:nnn { 405 } { 315 } { .1cm }
+ \draw_path_lineto:n { -.15cm , .1cm }
+ \draw_path_lineto:n { -.15cm , -.05cm }
+ \draw_path_arc:nnn { 180 } { 360 } { .05cm }
+ \draw_path_lineto:n { -.05cm , 0cm }
+ \draw_path_arc:nnn { 180 } { 90 } { .1cm }
+ \draw_path_lineto:n { .05cm , -.1cm }
+ \draw_path_arc:nnn { 360 } { 315 } { .125cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.225cm , -.25cm }
+ \draw_path_lineto:n { -.325cm , -.15cm }
+ \draw_path_moveto:n { .2cm , .2cm }
+ \draw_path_arc:nnn { 180 } { 360 } { .1cm }
+ \draw_path_arc:nnn { 0 } { 45 } { .1cm }
+ \draw_path_arc:nnn { 225 } { 180 } { .2cm }
+ \draw_path_circle:nn { .3cm , -.075cm } { .075cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_singlehanded: {
+ \draw_path_moveto:n { -.25cm , -.425cm }
+ \draw_path_lineto:n { .025cm , -.425cm }
+ \draw_path_lineto:n { .325cm , -.125cm }
+ \draw_path_arc:nnn { 45 } { 135 } { .1cm }
+ \draw_path_lineto:n { 0cm , -.275cm }
+ \draw_path_lineto:n { -.15cm , -.275cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .05cm }
+ \draw_path_lineto:n { -.1cm , -.175cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .1cm }
+ \draw_path_lineto:n { -.2cm , -.075cm }
+ \draw_path_arc:nnn { 90 } { 135 } { .125cm }
+ \draw_path_lineto:n { -.425cm , -.25cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_doublehanded: {
+ \draw_path_moveto:n { -.25cm , -.425cm }
+ \draw_path_lineto:n { .025cm , -.425cm }
+ \draw_path_lineto:n { .325cm , -.125cm }
+ \draw_path_arc:nnn { 45 } { 135 } { .1cm }
+ \draw_path_lineto:n { 0cm , -.275cm }
+ \draw_path_lineto:n { -.15cm , -.275cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .05cm }
+ \draw_path_lineto:n { -.1cm , -.175cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .1cm }
+ \draw_path_lineto:n { -.2cm , -.075cm }
+ \draw_path_arc:nnn { 90 } { 135 } { .125cm }
+ \draw_path_lineto:n { -.425cm , -.25cm }
+ \draw_path_moveto:n { .25cm , .425cm }
+ \draw_path_lineto:n { -.025cm , .425cm }
+ \draw_path_lineto:n { -.325cm , .125cm }
+ \draw_path_arc:nnn { 225 } { 315 } { .1cm }
+ \draw_path_lineto:n { 0cm , .275cm }
+ \draw_path_lineto:n { .15cm , .275cm }
+ \draw_path_arc:nnn { 450 } { 270 } { .05cm }
+ \draw_path_lineto:n { .1cm , .175cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .1cm }
+ \draw_path_lineto:n { .2cm , .075cm }
+ \draw_path_arc:nnn { 270 } { 315 } { .125cm }
+ \draw_path_lineto:n { .425cm , .25cm }
+}
+
+% CONDITIONS
+
+\cs_new:Npn \rpgicons_draw_shape_buff: {
+ \draw_path_moveto:n { -.425cm , -.225cm }
+ \draw_path_lineto:n { -.225cm , -.425cm }
+ \draw_path_lineto:n { -.1cm , -.3cm }
+ \draw_path_lineto:n { .125cm , -.3cm }
+ \draw_path_lineto:n { .425cm , 0cm }
+ \draw_path_arc:nnn { 45 } { 135 } { .1cm }
+ \draw_path_lineto:n { .1cm , -.15cm }
+ \draw_path_lineto:n { -.05cm , -.15cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .05cm }
+ \draw_path_lineto:n { 0cm , -.05cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .1cm }
+ \draw_path_lineto:n { -.1cm , .05cm }
+ \draw_path_arc:nnn { 90 } { 135 } { .125cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.25cm , -.225cm }
+ \draw_path_lineto:n { -.15cm , -.325cm }
+ \draw_path_moveto:n { 0cm , .425cm }
+ \draw_path_lineto:n { .25cm , .425cm }
+ \draw_path_lineto:n { .25cm , .275cm }
+ \draw_path_arc:nnn { 360 } { 180 } { .125cm }
+ \draw_path_close:
+
+}
+
+\cs_new:Npn \rpgicons_draw_shape_blinded: {
+ \draw_path_moveto:n { 0cm , .225cm }
+ \draw_path_arc:nnn { 90 } { 30 } { .45cm }
+ \draw_path_arc:nnn { 330 } { 210 } { .45cm }
+ \draw_path_arc:nnn { 150 } { 90 } { .45cm }
+ \draw_path_moveto:n { 0cm , .225cm }
+ \draw_path_circle:nn { 0cm , 0cm } { .15cm }
+ \draw_path_moveto:n { -.425cm , -.425cm }
+ \draw_path_lineto:n { -.25cm , -.25cm }
+ \draw_path_moveto:n { 0cm , 0cm }
+ \draw_path_lineto:n { .425cm , .425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_charmed: {
+ \draw_path_circle:nn { 0cm , 0cm } { .425cm }
+ \draw_path_moveto:n { -.175cm , -.1cm }
+ \draw_path_arc:nnn { 180 } { 360 } { .175cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.175cm , .15cm }
+ \draw_path_arc:nnn { 0 } { 225 } { .0625cm }
+ \draw_path_lineto:n { -.175cm , 0cm }
+ \draw_path_moveto:n { -.175cm , .15cm }
+ \draw_path_arc:nnn { 180 } { -45 } { .0625cm }
+ \draw_path_lineto:n { -.175cm , 0cm }
+ \draw_path_moveto:n { .175cm , .15cm }
+ \draw_path_arc:nnn { 0 } { 225 } { .0625cm }
+ \draw_path_lineto:n { .175cm , 0cm }
+ \draw_path_moveto:n { .175cm , .15cm }
+ \draw_path_arc:nnn { 180 } { -45 } { .0625cm }
+ \draw_path_lineto:n { .175cm , 0cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_deafened: {
+ \draw_path_moveto:n { -.175cm , -.275cm }
+ \draw_path_arc:nnn { 180 } { 360 } { .15cm }
+ \draw_path_lineto:n { .125cm , -.225cm }
+ \draw_path_arc:nnn { 180 } { 135 } { .25cm }
+ \draw_path_arc:nnn { 315 } { 360 } { .25cm }
+ \draw_path_arc:nnn { 0 } { 180 } { .275cm }
+ \draw_path_moveto:n { -.15cm , -.1cm }
+ \draw_path_arc:nnn { -90 } { 90 } { .075cm }
+ \draw_path_lineto:n { -.15cm , .125cm }
+ \draw_path_arc:nnn { 180 } { 45 } { .15cm }
+ \draw_path_moveto:n { -.425cm , -.425cm }
+ \draw_path_lineto:n { -.2cm , -.2cm }
+ \draw_path_moveto:n { 0cm , 0cm }
+ \draw_path_lineto:n { .425cm , .425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_exhausted: {
+ \draw_path_circle:nn { 0cm , 0cm } { .425cm }
+ \draw_path_moveto:n { -.175cm , -.225cm }
+ \draw_path_arc:nnn { 180 } { 0 } { .175cm }
+ \draw_path_close:
+ \draw_path_moveto:n { .275cm , .15cm }
+ \draw_path_arc:nnn { 180 } { 0 } { -.1cm }
+ \draw_path_moveto:n { -.075cm , .15cm }
+ \draw_path_arc:nnn { 180 } { 0 } { -.1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_frightened: {
+ \draw_path_circle:nn { 0cm , 0cm } { .425cm }
+ \draw_path_moveto:n { -.175cm , -.225cm }
+ \draw_path_arc:nnn { 180 } { 0 } { .175cm }
+ \draw_path_close:
+ \draw_path_circle:nn { -.175cm , .125cm } { .075cm }
+ \draw_path_circle:nn { .175cm , .125cm } { .075cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_grappled: {
+ \draw_path_moveto:n { -.25cm , .3cm }
+ \draw_path_arc:nnn { 90 } { -90 } { .075cm }
+ \draw_path_lineto:n { -.35cm , .15cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .075cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.2cm , .15cm }
+ \draw_path_arc:nnn { 90 } { -90 } { .075cm }
+ \draw_path_lineto:n { -.35cm , 0cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .075cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.2cm , 0cm }
+ \draw_path_arc:nnn { 90 } { -90 } { .075cm }
+ \draw_path_lineto:n { -.35cm , -.15cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .075cm }
+ \draw_path_close:
+ \draw_path_moveto:n { -.2cm , -.15cm }
+ \draw_path_arc:nnn { 90 } { -90 } { .075cm }
+ \draw_path_lineto:n { -.3cm , -.3cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .075cm }
+ \draw_path_close:
+ \draw_path_moveto:n { .425cm , .05cm }
+ \draw_path_arc:nnn { 0 } { 90 } { .25cm }
+ \draw_path_lineto:n { -.05cm , .3cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .15cm }
+ \draw_path_lineto:n { .175cm , .15cm }
+ \draw_path_lineto:n { .175cm , -.425cm }
+ \draw_path_moveto:n { .175cm , -.275cm }
+ \draw_path_lineto:n { .425cm , -.275cm }
+ \draw_path_moveto:n { .175cm , .3cm }
+ \draw_path_lineto:n { .175cm , .425cm }
+ \draw_path_moveto:n { -.3cm , .3cm }
+ \draw_path_lineto:n { -.3cm , .425cm }
+ \draw_path_moveto:n { -.3cm , -.3cm }
+ \draw_path_lineto:n { -.3cm , -.425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_incapacitated: {
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 30 } }
+ \draw_path_arc:nnn { 270 } { 210 } { .425cm }
+ \draw_path_lineto:n { \draw_point_polar:nn { -.425cm} { 90 } }
+ \draw_path_arc:nnn { 30 } { 90 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 90 } }
+ \draw_path_arc:nnn { 330 } { 270 } { .425cm }
+ \draw_path_lineto:n { \draw_point_polar:nn { -.425cm} { 150 } }
+ \draw_path_arc:nnn { 90 } { 150 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 150 } }
+ \draw_path_arc:nnn { 30 } { -30 } { .425cm }
+ \draw_path_lineto:n { \draw_point_polar:nn { -.425cm} { 210 } }
+ \draw_path_arc:nnn { 150 } { 210 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .25cm} { 30 } }
+ \draw_path_arc:nnn { 270 } { 210 } { .25cm }
+ \draw_path_arc:nnn { 330 } { 270 } { .25cm }
+ \draw_path_arc:nnn { 30 } { -30 } { .25cm }
+ \draw_path_arc:nnn { 90 } { 30 } { .25cm }
+ \draw_path_arc:nnn { 150 } { 90 } { .25cm }
+ \draw_path_arc:nnn { 210 } { 150 } { .25cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_invisible: {
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { -15 } }
+ \draw_path_arc:nnn { -15 } { 15 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 30 } }
+ \draw_path_arc:nnn { 30 } { 60 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 75 } }
+ \draw_path_arc:nnn { 75 } { 105 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 120 } }
+ \draw_path_arc:nnn { 120 } { 150 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 165 } }
+ \draw_path_arc:nnn { 165 } { 195 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 210 } }
+ \draw_path_arc:nnn { 210 } { 240 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 255 } }
+ \draw_path_arc:nnn { 255 } { 285 } { .425cm }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 300 } }
+ \draw_path_arc:nnn { 300 } { 330 } { .425cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_paralyzed: {
+ \draw_path_circle:nn { 0cm , 0cm } { .425cm }
+ \draw_path_moveto:n { -.175cm , -.225cm }
+ \draw_path_arc:nnn { 180 } { 0 } { .175cm }
+ \draw_path_close:
+ \draw_path_moveto:n { .25cm , .2cm }
+ \draw_path_lineto:n { .1cm , .05cm }
+ \draw_path_moveto:n { .25cm , .05cm }
+ \draw_path_lineto:n { .1cm , .2cm }
+ \draw_path_moveto:n { -.25cm , .2cm }
+ \draw_path_lineto:n { -.1cm , .05cm }
+ \draw_path_moveto:n { -.25cm , .05cm }
+ \draw_path_lineto:n { -.1cm , .2cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_petrified: {
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 45 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 100 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 135 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 190 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 230 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 250 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 300 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .425cm} { 350 } }
+ \draw_path_close:
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 135 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 130 } }
+ \draw_path_lineto:n { -.25cm , .075cm }
+ \draw_path_lineto:n { \draw_point_polar:nn { .2cm} { 220 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .325cm} { 240 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 300 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .3cm} { 330 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .225cm} { 350 } }
+ \draw_path_moveto:n { \draw_point_polar:nn { .425cm} { 45 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .3cm} { 60 } }
+ \draw_path_lineto:n { \draw_point_polar:nn { .35cm} { 130 } }
+ \draw_path_moveto:n { -.15cm , -.175cm }
+ \draw_path_lineto:n { .075cm , -.15cm }
+ \draw_path_lineto:n { .125cm , -.2cm }
+ \draw_path_moveto:n { -.25cm , .075cm }
+ \draw_path_lineto:n { -.1cm , .1cm }
+ \draw_path_moveto:n { .25cm , .075cm }
+ \draw_path_lineto:n { .1cm , .1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_poisoned: {
+ \draw_path_circle:nn { 0cm , 0cm } { .425cm }
+ \draw_path_moveto:n { -.15cm , -.2cm }
+ \draw_path_lineto:n { -.075cm , -.125cm }
+ \draw_path_lineto:n { 0cm , -.2cm }
+ \draw_path_lineto:n { .075cm , -.125cm }
+ \draw_path_lineto:n { .15cm , -.2cm }
+ \draw_path_moveto:n { .25cm , .175cm }
+ \draw_path_lineto:n { .1cm , .1cm }
+ \draw_path_lineto:n { .25cm , .025cm }
+ \draw_path_moveto:n { -.25cm , .175cm }
+ \draw_path_lineto:n { -.1cm , .1cm }
+ \draw_path_lineto:n { -.25cm , .025cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_prone: {
+ \draw_path_circle:nn { .2cm , -.125cm } { .125cm }
+ \draw_path_moveto:n { -.425cm , 0cm }
+ \draw_path_lineto:n { -.15cm , 0cm }
+ \draw_path_arc:nnn { 90 } { -90 } { .125cm }
+ \draw_path_lineto:n { -.425cm , -.25cm }
+ \draw_path_moveto:n { .225cm , .15cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .1cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .1cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .1cm }
+ \draw_path_arc:nnn { 0 } { 90 } { .1cm }
+ \draw_path_moveto:n { 0cm , .25cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .1cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .1cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .1cm }
+ \draw_path_arc:nnn { 0 } { 90 } { .1cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_restrained: {
+ \draw_path_moveto:n { -.075cm , -.225cm }
+ \draw_path_lineto:n { -.075cm , .225cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .125cm }
+ \draw_path_lineto:n { -.2cm , 0cm }
+ \draw_path_arc:nnn { 270 } { 180 } { .1cm }
+ \draw_path_lineto:n { -.3cm , .3cm }
+ \draw_path_arc:nnn { 0 } { 90 } { .125cm }
+ \draw_path_lineto:n { -.425cm , -.075cm }
+ \draw_path_arc:nnn { 180 } { 235 } { .1cm }
+ \draw_path_lineto:n { -.3cm , -.225cm }
+ \draw_path_moveto:n { .075cm , -.225cm }
+ \draw_path_lineto:n { .075cm , .225cm }
+ \draw_path_arc:nnn { 90 } { 0 } { .125cm }
+ \draw_path_lineto:n { .2cm , 0cm }
+ \draw_path_arc:nnn { -90 } { 0 } { .1cm }
+ \draw_path_lineto:n { .3cm , .3cm }
+ \draw_path_arc:nnn { 180 } { 90 } { .125cm }
+ \draw_path_lineto:n { .425cm , -.075cm }
+ \draw_path_arc:nnn { 360 } { 330 } { .1cm }
+ \draw_path_lineto:n { .3cm , -.225cm }
+ \draw_path_moveto:n { .35cm , -.225cm }
+ \draw_path_arc:nnn { 90 } { -90 } { .05cm }
+ \draw_path_lineto:n { -.35cm , -.325cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .05cm }
+ \draw_path_close:
+ \draw_path_moveto:n { .35cm , -.325cm }
+ \draw_path_arc:nnn { 90 } { -90 } { .05cm }
+ \draw_path_lineto:n { -.35cm , -.425cm }
+ \draw_path_arc:nnn { 270 } { 90 } { .05cm }
+ \draw_path_close:
+}
+
+\cs_new:Npn \rpgicons_draw_shape_stunned: {
+ \draw_path_circle:nn { 0cm , 0cm } { .425cm }
+ \draw_path_ellipse:nnn { 0cm , -.175cm } { 0cm , .1cm } { .175cm , 0cm }
+ \draw_path_moveto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 90 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 126 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 162 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 198 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 234 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 270 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 306 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 342 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 18 } ) }
+ \draw_path_lineto:n { ( -.175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 54 } ) }
+ \draw_path_close:
+ \draw_path_moveto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 90 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 126 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 162 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 198 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 234 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 270 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 306 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 342 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .125cm } { 18 } ) }
+ \draw_path_lineto:n { ( .175cm , .125cm ) + ( \draw_point_polar:nn { .05cm } { 54 } ) }
+ \draw_path_close:
+}
+
+\cs_new:Npn \rpgicons_draw_shape_unconscious: {
+ \draw_path_moveto:n { 0cm , .15cm }
+ \draw_path_arc:nnnn { 90 } { -30 } { .425cm } { .15cm }
+ \draw_path_moveto:n { 0cm , -.15cm }
+ \draw_path_arc:nnnn { 270 } { 150 } { .425cm } { .15cm }
+ \draw_path_moveto:n { -.35cm , .15cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .125cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .125cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .125cm }
+ \draw_path_arc:nnn { 0 } { 90 } { .125cm }
+ \draw_path_moveto:n { .1cm , -.15cm }
+ \draw_path_arc:nnn { 270 } { 360 } { .125cm }
+ \draw_path_arc:nnn { 180 } { 270 } { .125cm }
+ \draw_path_arc:nnn { 90 } { 180 } { .125cm }
+ \draw_path_arc:nnn { 0 } { 90 } { .125cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_hearing: {
+ \draw_path_moveto:n { -.175cm , -.275cm }
+ \draw_path_arc:nnn { 180 } { 360 } { .15cm }
+ \draw_path_lineto:n { .125cm , -.225cm }
+ \draw_path_arc:nnn { 180 } { 135 } { .25cm }
+ \draw_path_arc:nnn { 315 } { 360 } { .25cm }
+ \draw_path_arc:nnn { 0 } { 180 } { .275cm }
+ \draw_path_moveto:n { -.15cm , -.1cm }
+ \draw_path_arc:nnn { -90 } { 90 } { .075cm }
+ \draw_path_lineto:n { -.15cm , .125cm }
+ \draw_path_arc:nnn { 180 } { 45 } { .15cm }
+}
+
+\cs_new:Npn \rpgicons_draw_shape_seeing: {
+ \draw_path_moveto:n { 0cm , .225cm }
+ \draw_path_arc:nnn { 90 } { 30 } { .45cm }
+ \draw_path_arc:nnn { 330 } { 210 } { .45cm }
+ \draw_path_arc:nnn { 150 } { 90 } { .45cm }
+ \draw_path_moveto:n { 0cm , .225cm }
+ \draw_path_circle:nn { 0cm , 0cm } { .15cm }
+}
+
+% FRAMES
+
+\cs_new:Npn \rpgicons_draw_frame_ability: {
+ \draw_path_circle:nn { 0cm , 0cm } { .45cm }
+}
+
+\cs_new:Npn \rpgicons_draw_frame_saving: {
+ \draw_path_moveto:n { -.45cm, . 45cm }
+ \draw_path_lineto:n { .45cm , .45cm }
+ \draw_path_lineto:n { .45cm , -.05cm }
+ \draw_path_arc:nnn { 360 } { 180 } { .45cm }
+ \draw_path_close:
+}
+
+\cs_new:Npn \rpgicons_draw_frame_spellschool: {
+ \draw_path_moveto:n { -.475cm, . 35cm }
+ \draw_path_lineto:n { -.35cm , .475cm }
+ \draw_path_lineto:n { .35cm , .475cm }
+ \draw_path_lineto:n { .475cm , .35cm }
+ \draw_path_lineto:n { .425cm , -.375cm }
+ \draw_path_lineto:n { 0cm , -.475cm }
+ \draw_path_lineto:n { -.425cm , -.375cm }
+ \draw_path_close:
+}
+
+\cs_new:Npn \rpgicons_draw_frame_damage: {
+ \draw_path_circle:nn { 0cm , 0cm } { .45cm }
+}
+
+% USER COMMANDS
+
+\NewDocumentCommand { \rpgiconsset } { m } {
+ \keys_set:nn { rpgicons / local ~ options } {#1}
+}
+
+\dim_new:N \l_rpgicons_icon_before_sep_dim
+\dim_new:N \l_rpgicons_icon_after_sep_dim
+\dim_new:N \l_rpgicons_icon_baseline_dim
+\dim_new:N \l_rpgicons_icon_linewidth_dim
+
+\tl_new:N \l_rpgicons_icon_frame_tl
+\tl_new:N \l_rpgicons_icon_color_stroke_tl
+\tl_new:N \l_rpgicons_icon_color_fill_tl
+\tl_new:N \l_rpgicons_icon_color_text_tl
+\tl_new:N \l_rpgicons_icon_color_background_tl
+
+\fp_new:N \l_rpgicons_icon_opacity_stroke_fp
+\fp_set:Nn \l_rpgicons_icon_opacity_stroke_fp { 1.0 }
+\fp_new:N \l_rpgicons_icon_opacity_fill_fp
+\fp_set:Nn \l_rpgicons_icon_opacity_fill_fp { 1.0 }
+\fp_new:N \l_rpgicons_icon_opacity_text_fp
+\fp_set:Nn \l_rpgicons_icon_opacity_text_fp { 1.0 }
+\fp_new:N \l_rpgicons_icon_opacity_background_fp
+\fp_set:Nn \l_rpgicons_icon_opacity_background_fp { 1.0 }
+
+\fp_new:N \l_rpgicons_icon_transform_scale_fp
+\fp_new:N \l_rpgicons_icon_transform_scale_inner_fp
+\fp_new:N \l_rpgicons_icon_transform_rotate_fp
+
+\bool_new:N \l_rpgicons_icon_accessible_basic_bool
+\bool_new:N \l_rpgicons_icon_accessible_full_bool
+
+\cs_generate_variant:Nn \color_select:n { V }
+\cs_generate_variant:Nn \color_stroke:n { V }
+\cs_generate_variant:Nn \color_fill:n { V }
+
+\bool_new:N \l__rpgicons_opacity_warning_bool
+\cs_new:Npn \__rpgicons_opacity_check: {
+ \bool_lazy_and:nnT {
+ \bool_not_p:n { \l__rpgicons_opacity_warning_bool }
+ } {
+ \bool_not_p:n { \l__rpgicons_use_opacity_bool }
+ } {
+ \msg_warning:nn { rpgicons } { opacity-option-missing }
+ \bool_set_true:N \l__rpgicons_opacity_warning_bool
+ }
+}
+\cs_new:Npn \__rpgicons_accessible_check: {
+ \IfDocumentMetadataTF { } {
+ \msg_error:nn { rpgicons } { documentmetadata-missing }
+ }
+}
+
+\cs_generate_variant:Nn \bool_set:Nn { Ne }
+\keys_define:nn { rpgicons / local ~ options } {
+ before ~ sep .groups:n = { extra } ,
+ before ~ sep .dim_set:N = \l_rpgicons_icon_before_sep_dim ,
+ before ~ sep .initial:n = { 0.05em } ,
+ after ~ sep .groups:n = { extra } ,
+ after ~ sep .dim_set:N = \l_rpgicons_icon_after_sep_dim ,
+ after ~ sep .initial:n = { 0.05em } ,
+ accessible .choice: ,
+ accessible / false .code:n = {
+ \bool_set_false:N \l_rpgicons_icon_accessible_basic_bool
+ \bool_set_false:N \l_rpgicons_icon_accessible_full_bool
+ } ,
+ accessible / basic .code:n = {
+ \bool_set_true:N \l_rpgicons_icon_accessible_basic_bool
+ \bool_set_false:N \l_rpgicons_icon_accessible_full_bool
+ } ,
+ accessible / full .code:n = {
+ \bool_set_true:N \l_rpgicons_icon_accessible_basic_bool
+ \bool_set_true:N \l_rpgicons_icon_accessible_full_bool
+ } ,
+ accessible .default:n = { basic } ,
+ baseline .dim_set:N = \l_rpgicons_icon_baseline_dim ,
+ baseline .initial:n = { -3.5pt } ,
+ frame .tl_set:N = \l_rpgicons_icon_frame_tl ,
+ frame .initial:n = { } ,
+ stroke .tl_set:N = \l_rpgicons_icon_color_stroke_tl ,
+ stroke .initial:n = { . } ,
+ fill .tl_set:N = \l_rpgicons_icon_color_fill_tl ,
+ fill .initial:n = { . } ,
+ text .tl_set:N = \l_rpgicons_icon_color_text_tl ,
+ text .initial:n = { . } ,
+ color .code:n = {
+ \tl_set:Nn \l_rpgicons_icon_color_stroke_tl {#1}
+ \tl_set:Nn \l_rpgicons_icon_color_fill_tl {#1}
+ \tl_set:Nn \l_rpgicons_icon_color_text_tl {#1}
+ } ,
+ background .tl_set:N = \l_rpgicons_icon_color_background_tl ,
+ background .initial:n = { white } ,
+ stroke ~ opacity .code:n = {
+ \__rpgicons_opacity_check:
+ \fp_set:Nn \l_rpgicons_icon_opacity_stroke_fp {#1}
+ } ,
+ fill ~ opacity .code:n = {
+ \__rpgicons_opacity_check:
+ \fp_set:Nn \l_rpgicons_icon_opacity_fill_fp {#1}
+ } ,
+ text ~ opacity .code:n = {
+ \__rpgicons_opacity_check:
+ \fp_set:Nn \l_rpgicons_icon_opacity_text_fp {#1}
+ } ,
+ opacity .code:n = {
+ \__rpgicons_opacity_check:
+ \fp_set:Nn \l_rpgicons_icon_opacity_stroke_fp {#1}
+ \fp_set:Nn \l_rpgicons_icon_opacity_fill_fp {#1}
+ \fp_set:Nn \l_rpgicons_icon_opacity_text_fp {#1}
+ } ,
+ background ~ opacity .code:n = {
+ \__rpgicons_opacity_check:
+ \fp_set:Nn \l_rpgicons_icon_opacity_background_fp {#1}
+ } ,
+ line ~ width .dim_set:N = \l_rpgicons_icon_linewidth_dim ,
+ line ~ width .initial:n = { \l_draw_default_linewidth_dim } ,
+ scale .fp_set:N = \l_rpgicons_icon_transform_scale_fp ,
+ scale .initial:n = { 1.0 } ,
+ scale ~ inner .fp_set:N = \l_rpgicons_icon_transform_scale_inner_fp ,
+ scale ~ inner .initial:n = { 0.675 } ,
+ rotate .fp_set:N = \l_rpgicons_icon_transform_rotate_fp ,
+ rotate .initial:n = { 0.0 } ,
+}
+
+\clist_const:Nn \c__rpgicons_types_clist {
+ die , ability , saving , spell , spellschool , damage , attack , condition
+}
+
+\str_new:N \l__rpgicons_icon_shape_name_str
+\clist_map_inline:Nn \c__rpgicons_types_clist {
+ \str_set:Nn \l__rpgicons_icon_shape_name_str {#1}
+ \str_replace_all:Nnn \l__rpgicons_icon_shape_name_str { ~ } { _ }
+ \clist_new:c { l_rpgicons_types_every_ \l__rpgicons_icon_shape_name_str _style_clist }
+ \keys_define:nn { rpgicons / local ~ options } {
+ every ~ #1 .code:n = {
+ \clist_set:cn {
+ l_rpgicons_types_every_ \l__rpgicons_icon_shape_name_str _style_clist
+ } {##1}
+ }
+ }
+}
+
+\clist_const:Nn \c__rpgicons_shapes_clist {
+ twoside , fourside , sixside , eightside , tenside , twelveside , twentyside , hundredside ,
+ fudge , sixside ~ one , sixside ~ two , sixside ~ three, sixside ~ four, sixside ~ five ,
+ sixside ~ six , sixside ~ seven, sixside ~ eight, sixside ~ nine, fudge ~ plus, fudge ~ minus ,
+ strength , dexterity , dexterity ~ alt , constitution , intelligence , wisdom , charisma ,
+ resilience , sanity , perception , luck , armor , proficiency ,
+ linear , conic , quadratic , cubic , spheric , cylindric , verbal , somatic , material , focus ,
+ abjuration , conjuration , divination , enchantment , evocation , illusion , necromancy , transmutation ,
+ acid , bludgeoning , cold , fire , force , lightning , necrotic , piercing , poison , psychic ,
+ radiant , slashing , thunder , healing ,
+ melee , ranged , magic , singlehanded , doublehanded ,
+ buff , blinded , charmed , deafened , exhausted , frightened , grappled , incapacitated , invisible ,
+ paralyzed , petrified , poisoned , prone , restrained , stunned , unconscious , hearing , seeing
+}
+
+\clist_map_inline:Nn \c__rpgicons_shapes_clist {
+ \str_set:Nn \l__rpgicons_icon_shape_name_str {#1}
+ \str_replace_all:Nnn \l__rpgicons_icon_shape_name_str { ~ } { _ }
+ \clist_new:c { l_rpgicons_shapes_every_ \l__rpgicons_icon_shape_name_str _style_clist }
+ \keys_define:nn { rpgicons / local ~ options } {
+ every ~ #1 .code:n = {
+ \clist_set:cn {
+ l_rpgicons_shapes_every_ \l__rpgicons_icon_shape_name_str _style_clist
+ } {##1}
+ }
+ }
+}
+
+\seq_new:N \l__rpgicons_icon_shape_name_parts_seq
+\coffin_new:N \l__rpgicons_icon_accessible_coffin
+\coffin_new:N \l__rpgicons_icon_label_coffin
+\bool_if:NT \l__rpgicons_compat_mode_bool {
+ % l3keys cs name fix
+ \cs_generate_variant:Nn \keys_set:nn { ne }
+ \cs_generate_variant:Nn \str_set:Nn { Ne }
+ \cs_generate_variant:Nn \seq_set_split:Nnn { Nee }
+}
+\prg_generate_conditional_variant:Nnn \clist_if_in:nn { ne } { T , TF }
+\cs_generate_variant:Nn \hcoffin_set:Nn { Ne }
+\cs_generate_variant:Nn \keys_set_groups:nnn { nne }
+\cs_generate_variant:Nn \keys_set_exclude_groups:nnn { nne }
+\NewDocumentCommand \RPGIconsUseIcon { s O{} o m } {
+ \bool_if:NT \l_rpgicons_icon_accessible_full_bool {
+ \__rpgicons_accessible_check:
+ \pdf_bdc:nn { Span } { /Alt ~ ( #4 ) }
+ }
+ \draw_begin:
+ \draw_cap_round:
+ \draw_join_round:
+ \bool_if:NTF \l__rpgicons_compat_mode_bool {
+ % l3keys cs name fix
+ \keys_set:ne { rpgicons / local ~ options } {#2}
+ } {
+ \keys_set_exclude_groups:nne { rpgicons / local ~ options } { extra } {#2}
+ }
+ \str_set:Ne \l__rpgicons_icon_shape_name_str {#4}
+ \str_replace_all:Nnn \l__rpgicons_icon_shape_name_str { ~ } { _ }
+ \str_if_empty:NF \l__rpgicons_icon_shape_name_str {
+ \clist_if_exist:cT { l_rpgicons_shapes_every_ \l__rpgicons_icon_shape_name_str _style_clist } {
+ \keys_set:ne { rpgicons / local ~ options } {
+ \clist_use:cn { l_rpgicons_shapes_every_ \l__rpgicons_icon_shape_name_str _style_clist } { , }
+ }
+ }
+ }
+ \color_stroke:V { \l_rpgicons_icon_color_stroke_tl }
+ \color_fill:V { \l_rpgicons_icon_color_fill_tl }
+ \bool_if:NT \l__rpgicons_use_opacity_bool {
+ \opacity_stroke:n { \l_rpgicons_icon_opacity_stroke_fp }
+ \opacity_fill:n { \l_rpgicons_icon_opacity_fill_fp }
+ }
+ \draw_linewidth:n { \l_rpgicons_icon_linewidth_dim }
+ \draw_transform_scale:n { \l_rpgicons_icon_transform_scale_fp }
+ \draw_transform_rotate:n { \l_rpgicons_icon_transform_rotate_fp }
+ \draw_baseline:n { \l_rpgicons_icon_baseline_dim }
+ \bool_if:NT \l_rpgicons_icon_accessible_basic_bool {
+ \draw_scope_begin:
+ \bool_if:NTF \l__rpgicons_compat_mode_bool {
+ % l3draw rectangle fix
+ % l3draw bounding box workaround
+ \draw_path_moveto:n { -.5cm , .5cm }
+ \draw_path_lineto:n { -.5cm , .5cm }
+ \draw_path_lineto:n { .5cm , .5cm }
+ \draw_path_lineto:n { .5cm , .5cm }
+ \draw_path_close:
+ \draw_path_use_clear:n { clip }
+ } {
+ \draw_path_rectangle_corners:nn
+ { -.5cm , .5cm }
+ { .5cm , .5cm }
+ \draw_path_use_clear:n { clip }
+ }
+ \bool_if:NTF \l_rpgicons_icon_accessible_full_bool {
+ \hcoffin_set:Nn \l__rpgicons_icon_accessible_coffin { \pdffakespace #4 \pdffakespace }
+ } {
+ \hcoffin_set:Nn \l__rpgicons_icon_accessible_coffin {#4}
+ }
+ \coffin_resize:Nnn \l__rpgicons_icon_accessible_coffin { 1cm } { 1cm }
+ \draw_coffin_use:Nnnn \l__rpgicons_icon_accessible_coffin { hc } { vc } { 0cm , 0cm }
+ \draw_scope_end:
+ }
+ \bool_if:NTF \l__rpgicons_compat_mode_bool {
+ % l3draw rectangle fix
+ % l3draw bounding box workaround
+ \draw_path_moveto:n { -.5cm , -.5cm - \l_rpgicons_icon_linewidth_dim / 2 }
+ \draw_path_lineto:n { -.5cm , .5cm + \l_rpgicons_icon_linewidth_dim / 2 }
+ \draw_path_lineto:n { .5cm , .5cm + \l_rpgicons_icon_linewidth_dim / 2 }
+ \draw_path_lineto:n { .5cm , -.5cm - \l_rpgicons_icon_linewidth_dim / 2 }
+ \draw_path_close:
+ \draw_path_use_clear:n { clip }
+ } {
+ \draw_path_rectangle_corners:nn
+ { -.5cm , -.5cm - \l_rpgicons_icon_linewidth_dim / 2 }
+ { .5cm , .5cm + \l_rpgicons_icon_linewidth_dim / 2 }
+ \draw_path_replace_bb:
+ \bool_set_false:N \l_draw_bb_update_bool
+ }
+ \draw_scope_begin:
+ \clist_if_in:neT { ability , saving , spellschool , damage } { \l_rpgicons_icon_frame_tl } {
+ \use:c { rpgicons_draw_frame_ \l_rpgicons_icon_frame_tl : }
+ \IfBooleanTF {#1} {
+ \draw_path_use_clear:n { fill }
+ \color_select:V { \l_rpgicons_icon_color_background_tl }
+ \bool_if:NT \l__rpgicons_use_opacity_bool {
+ \opacity_select:n { \l_rpgicons_icon_opacity_background_fp }
+ }
+ } {
+ \draw_path_use_clear:n { stroke }
+ }
+ \draw_transform_scale:n { \l_rpgicons_icon_transform_scale_inner_fp }
+ }
+ \clist_if_in:neTF { sixside ~ one , sixside ~ two , sixside ~ three , sixside ~ four ,
+ sixside ~ five , sixside ~ six , sixside ~ seven , sixside ~ eight , sixside ~ nine } {#4} {
+ \seq_set_split:Nee \l__rpgicons_icon_shape_name_parts_seq
+ { \c_underscore_str } { \l__rpgicons_icon_shape_name_str }
+ \exp_args:Ne \rpgicons_draw_shape_sixside_pips:n {
+ \seq_item:Nn \l__rpgicons_icon_shape_name_parts_seq { 2 }
+ }
+ } {
+ \use:c { rpgicons_draw_shape_ \l__rpgicons_icon_shape_name_str : }
+ }
+ \draw_path_use_clear:n { stroke }
+ \IfValueT {#3} {
+ \draw_scope_begin:
+ \color_select:V { \l_rpgicons_icon_color_text_tl }
+ \bool_if:NT \l__rpgicons_use_opacity_bool {
+ \opacity_select:n { \l_rpgicons_icon_opacity_text_fp }
+ }
+ \hcoffin_set:Ne \l__rpgicons_icon_label_coffin {#3}
+ \draw_coffin_use:Nnn \l__rpgicons_icon_label_coffin { hc } { vc }
+ \draw_scope_end:
+ }
+ \draw_scope_end:
+ \draw_end:
+ \bool_if:NT \l_rpgicons_icon_accessible_full_bool {
+ \pdf_emc:
+ }
+}
+
+\str_new:N \l__rpgicons_icon_integer_str
+\cs_generate_variant:Nn \str_if_eq:nnTF { ne }
+\NewDocumentCommand { \RPGIconsDie } { O{normal} m O{} m } {
+ \group_begin:
+ \keys_set_groups:nne { rpgicons / local ~ options } { extra } {#3}
+ \keys_set:ne { rpgicons / local ~ options } { \clist_use:Nn \l_rpgicons_types_every_die_style_clist { , } }
+ \str_set:Ne \l__rpgicons_icon_integer_str {#4}
+ \hspace { \l_rpgicons_icon_before_sep_dim }
+ \str_if_eq:neTF { large } {#1} {
+ \RPGIconsUseIcon[scale=.675, #3][#4]{#2}
+ } {
+ \str_if_empty:NF \l__rpgicons_icon_integer_str { \str_use:N \l__rpgicons_icon_integer_str \, }
+ \RPGIconsUseIcon[scale=.333, #3]{#2}
+ }
+ \hspace { \l_rpgicons_icon_after_sep_dim }
+ \group_end:
+}
+\cs_if_exist:NF \die { \cs_new_eq:NN \die \RPGIconsDie }
+
+\NewDocumentCommand { \RPGIconsAbility } { O{positive} m O{} } {
+ \group_begin:
+ \keys_set_groups:nne { rpgicons / local ~ options } { extra } {#3}
+ \keys_set:ne { rpgicons / local ~ options } { \clist_use:Nn \l_rpgicons_types_every_ability_style_clist { , } }
+ \hspace { \l_rpgicons_icon_before_sep_dim }
+ \str_if_eq:neTF { negative } {#1} {
+ \RPGIconsUseIcon*[frame=ability, scale=.333, #3]{#2}
+ } {
+ \RPGIconsUseIcon[scale=.333, #3]{#2}
+ }
+ \hspace { \l_rpgicons_icon_after_sep_dim }
+ \group_end:
+}
+\cs_if_exist:NF \ability { \cs_new_eq:NN \ability \RPGIconsAbility }
+
+\NewDocumentCommand { \RPGIconsSaving } { O{} m O{} } {
+ \group_begin:
+ \keys_set_groups:nne { rpgicons / local ~ options } { extra } {#3}
+ \keys_set:ne { rpgicons / local ~ options } { \clist_use:Nn \l_rpgicons_types_every_saving_style_clist { , } }
+ \hspace { \l_rpgicons_icon_before_sep_dim }
+ \str_if_eq:neTF { empty } {#1} {
+ \RPGIconsUseIcon[frame=saving, scale=.333, #3]{}
+ } {
+ \RPGIconsUseIcon[frame=saving, scale=.333, #3]{#2}
+ }
+ \hspace { \l_rpgicons_icon_after_sep_dim }
+ \group_end:
+}
+\cs_if_exist:NF \saving { \cs_new_eq:NN \saving \RPGIconsSaving }
+
+\NewDocumentCommand { \RPGIconsSpell } { m O{} } {
+ \group_begin:
+ \keys_set_groups:nne { rpgicons / local ~ options } { extra } {#2}
+ \keys_set:ne { rpgicons / local ~ options } { \clist_use:Nn \l_rpgicons_types_every_spell_style_clist { , } }
+ \hspace { \l_rpgicons_icon_before_sep_dim }
+ \RPGIconsUseIcon[scale=.333, #2]{#1}
+ \hspace { \l_rpgicons_icon_after_sep_dim }
+ \group_end:
+}
+\cs_if_exist:NF \spell { \cs_new_eq:NN \spell \RPGIconsSpell }
+
+\NewDocumentCommand { \RPGIconsSpellschool } { O{positive} m O{} } {
+ \group_begin:
+ \keys_set_groups:nne { rpgicons / local ~ options } { extra } {#3}
+ \keys_set:ne { rpgicons / local ~ options } { \clist_use:Nn \l_rpgicons_types_every_spellschool_style_clist { , } }
+ \hspace { \l_rpgicons_icon_before_sep_dim }
+ \str_if_eq:neTF { negative } {#1} {
+ \RPGIconsUseIcon*[frame=spellschool, scale=.333, #3]{#2}
+ } {
+ \RPGIconsUseIcon[frame=spellschool, scale=.333, #3]{#2}
+ }
+ \hspace { \l_rpgicons_icon_after_sep_dim }
+ \group_end:
+}
+\cs_if_exist:NF \spellschool { \cs_new_eq:NN \spellschool \RPGIconsSpellschool }
+
+\NewDocumentCommand { \RPGIconsDamage } { m O{} } {
+ \group_begin:
+ \keys_set_groups:nne { rpgicons / local ~ options } { extra } {#2}
+ \keys_set:ne { rpgicons / local ~ options } { \clist_use:Nn \l_rpgicons_types_every_damage_style_clist { , } }
+ \hspace { \l_rpgicons_icon_before_sep_dim }
+ \RPGIconsUseIcon[frame=damage, scale=.333, #2]{#1}
+ \hspace { \l_rpgicons_icon_after_sep_dim }
+ \group_end:
+}
+\cs_if_exist:NF \damage { \cs_new_eq:NN \damage \RPGIconsDamage }
+
+\NewDocumentCommand { \RPGIconsAttack } { m O{} } {
+ \group_begin:
+ \keys_set_groups:nne { rpgicons / local ~ options } { extra } {#2}
+ \keys_set:ne { rpgicons / local ~ options } { \clist_use:Nn \l_rpgicons_types_every_attack_style_clist { , } }
+ \hspace { \l_rpgicons_icon_before_sep_dim }
+ \RPGIconsUseIcon[scale=.333, #2]{#1}
+ \hspace { \l_rpgicons_icon_after_sep_dim }
+ \group_end:
+}
+\cs_if_exist:NF \attack { \cs_new_eq:NN \attack \RPGIconsAttack }
+
+\NewDocumentCommand { \RPGIconsCondition } { m O{} } {
+ \group_begin:
+ \keys_set_groups:nne { rpgicons / local ~ options } { extra } {#2}
+ \keys_set:ne { rpgicons / local ~ options } { \clist_use:Nn \l_rpgicons_types_every_condition_style_clist { , } }
+ \hspace { \l_rpgicons_icon_before_sep_dim }
+ \RPGIconsUseIcon[scale=.333, #2]{#1}
+ \hspace { \l_rpgicons_icon_after_sep_dim }
+ \group_end:
+}
+\cs_if_exist:NF \condition { \cs_new_eq:NN \condition \RPGIconsCondition }
+
+% ROLL SYNTAX
+
+\regex_new:N \l__rpgicons_roll_syntax_die_regex
+\cs_generate_variant:Nn \regex_set:Nn { Ne }
+\cs_new:Npn \rpgicons_roll_syntax_die_set:n #1 {
+ \regex_set:Ne \l__rpgicons_roll_syntax_die_regex { [ \clist_use:nn {#1} { } ] }
+}
+
+\keys_define:nn { rpgicons / local ~ options } {
+ roll ~ syntax .code:n = { \rpgicons_roll_syntax_die_set:n {#1} } ,
+ roll ~ syntax .initial:n = { d , D } ,
+}
+
+\cs_new:Npn \rpgicons_roll_syntax_convert:n #1 {
+ \str_case:nnF {#1} {
+ { 2 } { twoside }
+ { 4 } { fourside }
+ { 6 } { sixside }
+ { 8 } { eightside }
+ { 10 } { tenside }
+ { 12 } { twelveside }
+ { 20 } { twentyside }
+ { 100 } { hundredside }
+ { F } { fudge }
+ }
+ {#1}
+}
+
+\seq_new:N \l__rpgicons_roll_syntax_seq
+\tl_new:N \l__rpgicons_roll_syntax_part_tl
+\regex_new:N \l__rpgicons_roll_syntax_split_regex
+\regex_new:N \l__rpgicons_roll_syntax_plusminus_regex
+\regex_new:N \l__rpgicons_roll_syntax_times_regex
+\bool_if:NTF \l__rpgicons_unicode_mode_bool {
+ \regex_set:Nn \l__rpgicons_roll_syntax_split_regex { \s*([\+\-\x{2212}x\*\x{00D7}])\s* }
+ \regex_set:Nn \l__rpgicons_roll_syntax_plusminus_regex { \A([\+\-\x{2212}])\Z }
+ \regex_set:Nn \l__rpgicons_roll_syntax_times_regex { \A([x\*\x{00D7}])\Z }
+} {
+ \regex_set:Nn \l__rpgicons_roll_syntax_split_regex { \s*([\+\-x\*\x{00D7}])\s* }
+ \regex_set:Nn \l__rpgicons_roll_syntax_plusminus_regex { \A([\+\-])\Z }
+ \regex_set:Nn \l__rpgicons_roll_syntax_times_regex { \A([x\*\x{00D7}])\Z }
+}
+\regex_new:N \l__rpgicons_roll_syntax_dice_regex
+\cs_new:Npn \rpgicons_roll_syntax_parse:n #1 {
+ \regex_set:Nn \l__rpgicons_roll_syntax_dice_regex { \A(\d*)\ur{l__rpgicons_roll_syntax_die_regex}([F\d]+)\Z }
+ \regex_split:NnN \l__rpgicons_roll_syntax_split_regex {#1} \l__rpgicons_roll_syntax_seq
+ \seq_map_inline:Nn \l__rpgicons_roll_syntax_seq {
+ \tl_set:Ne \l__rpgicons_roll_syntax_part_tl {##1}
+ \regex_replace_case_once:nNTF {
+ { \l__rpgicons_roll_syntax_plusminus_regex } { \c{,} $\1$ \c{,} }
+ { \l__rpgicons_roll_syntax_times_regex } { \c{,} $\c{times}$ \c{,} }
+ { \l__rpgicons_roll_syntax_dice_regex }
+ { \c{ RPGIconsDie } { \c{ rpgicons_roll_syntax_convert:n } { \2 } } { \1 } }
+ } \l__rpgicons_roll_syntax_part_tl
+ { \tl_use:N \l__rpgicons_roll_syntax_part_tl }
+ { \tl_use:N \l__rpgicons_roll_syntax_part_tl }
+ }
+}
+
+\NewDocumentCommand{\RPGIconsRoll}{ m }{
+ \rpgicons_roll_syntax_parse:n {#1}
+}
+\cs_if_exist:NF \roll { \cs_new_eq:NN \roll \RPGIconsRoll }
+
+% EOF \ No newline at end of file
diff --git a/macros/latex/contrib/rpgicons/rpgicons-pgf.sty b/macros/latex/contrib/rpgicons/rpgicons-pgf.sty
new file mode 100644
index 0000000000..0e0c037187
--- /dev/null
+++ b/macros/latex/contrib/rpgicons/rpgicons-pgf.sty
@@ -0,0 +1,2596 @@
+% File: rpgicons-pgf.sty
+% Copyright 2024 Jasper Habicht (mail(at)jasperhabicht.de).
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License version 1.3c,
+% available at http://www.latex-project.org/lppl/.
+%
+% This file is part of the `rpgicons' package (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{rpgicons-pgf}[2024-05-15 rpg Icons Package (PGF Variant) (1.8.3)]
+
+% provide pics option
+\newif\ifrpgicons@pics\rpgicons@picsfalse
+\DeclareOption{pics}{\rpgicons@picstrue}
+\ProcessOptions\relax
+
+\RequirePackage{tikz}
+\newlength{\rpgicons@beforesep}
+\newlength{\rpgicons@aftersep}
+\newlength{\rpgicons@baseline}
+
+\def\rpgicons@allshapes{%
+ twoside, fourside, sixside, eightside, tenside, twelveside, twentyside, hundredside,
+ fudge, sixside one, sixside two, sixside three, sixside four, sixside five,
+ sixside six, sixside seven, sixside eight, sixside nine, fudge plus, fudge minus,
+ strength, dexterity, dexterity alt, constitution, intelligence, wisdom, charisma,
+ resilience, sanity, perception, luck, armor, proficiency,
+ linear, conic, quadratic, cubic, spheric, cylindric, verbal, somatic, material, focus,
+ abjuration, conjuration, divination, enchantment, evocation, illusion, necromancy, transmutation,
+ acid, bludgeoning, cold, fire, force, lightning, necrotic, piercing, poison, psychic,
+ radiant, slashing, thunder, healing,
+ melee, ranged, magic, singlehanded, doublehanded,
+ buff, blinded, charmed, deafened, exhausted, frightened, grappled, incapacitated, invisible,
+ paralyzed, petrified, poisoned, prone, restrained, stunned, unconscious, hearing, seeing%
+}
+
+\tikzset{
+ rpg icons/background color/.code={
+ \colorlet{rpgicons@bg}{#1}
+ },
+ rpg icons/background color={white},
+ rpg icons/before sep/.code={
+ \setlength{\rpgicons@beforesep}{#1}
+ },
+ rpg icons/before sep={.05em},
+ rpg icons/after sep/.code={
+ \setlength{\rpgicons@aftersep}{#1}
+ },
+ rpg icons/after sep={.05em},
+ rpg icons/baseline/.code={
+ \setlength{\rpgicons@baseline}{#1}
+ },
+ rpg icons/baseline={-3.5pt},
+ rpg icons/.style={},
+ rpg icons/.append style={
+ every node/.style={
+ line cap=round,
+ line join=round
+ }
+ },
+ %
+ rpg icons/every die/.style={},
+ rpg icons/every ability/.style={},
+ rpg icons/every saving/.style={},
+ rpg icons/every spell/.style={},
+ rpg icons/every spellschool/.style={},
+ rpg icons/every damage/.style={},
+ rpg icons/every attack/.style={},
+ rpg icons/every condition/.style={},
+ %
+ rpg icons/create every style/.code={
+ \tikzset{
+ rpg icons/every #1/.style={}
+ }
+ },
+ rpg icons/create every style/.list/.expanded={%
+ \rpgicons@allshapes%
+ }
+}
+
+% make tikz icons usable inside tikz environments
+\NewDocumentCommand{\provideprotectedrpgicon}{ m o m O{} m }{%
+ \expandafter\newsavebox\csname rpgicons@protectbox@#5\endcsname%
+ \expandafter\savebox\csname rpgicons@protectbox@#5\endcsname{%
+ \IfValueTF{#2}{%
+ \csname #1\endcsname[#2]{#3}[#4]{}%
+ }{%
+ \csname #1\endcsname{#3}[#4]{}%
+ }%
+ }%
+}
+
+\NewDocumentCommand{\useprotectedrpgicon}{ m }{%
+ \expandafter\usebox\csname rpgicons@protectbox@#1\endcsname%
+}
+
+% DICE
+
+% disc
+\pgfdeclareshape{twoside}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathellipse{\pgfpointorigin}{\pgfpoint{0cm}{.25cm}}{\pgfpoint{.425cm}{0cm}}
+ \pgfusepath{draw} % draw ellipse
+ }
+}
+
+% tetrahedron
+\pgfdeclareshape{fourside}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.35cm}}
+ \pgfpathlineto{\pgfpoint{.433cm}{-.4cm}}
+ \pgfpathlineto{\pgfpoint{-.433cm}{-.4cm}}
+ \pgfpathclose
+ \pgfusepath{draw} % draw triangle
+ }
+}
+
+% cube
+\pgfdeclareshape{sixside}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ }
+}
+
+% octahedron
+\pgfdeclareshape{eightside}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.5cm}}
+ \pgfpathlineto{\pgfpoint{.433cm}{.25cm}}
+ \pgfpathlineto{\pgfpoint{.433cm}{-.25cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.5cm}}
+ \pgfpathlineto{\pgfpoint{-.433cm}{-.25cm}}
+ \pgfpathlineto{\pgfpoint{-.433cm}{.25cm}}
+ \pgfpathclose
+ \pgfpathlineto{\pgfpoint{.433cm}{-.25cm}}
+ \pgfpathlineto{\pgfpoint{-.433cm}{-.25cm}}
+ \pgfpathclose
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% decahedron
+\pgfdeclareshape{tenside}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.5cm}}
+ \pgfpathlineto{\pgfpoint{.475cm}{.1cm}}
+ \pgfpathlineto{\pgfpoint{.475cm}{-.1cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.5cm}}
+ \pgfpathlineto{\pgfpoint{-.475cm}{-.1cm}}
+ \pgfpathlineto{\pgfpoint{-.475cm}{.1cm}}
+ \pgfpathclose
+ \pgfpathlineto{\pgfpoint{.294cm}{-.154cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.3cm}}
+ \pgfpathlineto{\pgfpoint{-.294cm}{-.154cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{.294cm}{-.154cm}}
+ \pgfpathlineto{\pgfpoint{.475cm}{-.1cm}}
+ \pgfpathmoveto{\pgfpoint{-.475cm}{-.1cm}}
+ \pgfpathlineto{\pgfpoint{-.294cm}{-.154cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.5cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.3cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% dodecahedron
+\pgfdeclareshape{twelveside}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.5cm}}
+ \pgfpathlineto{\pgfpoint{0.294cm}{.405cm}}
+ \pgfpathlineto{\pgfpoint{.475cm}{.173cm}}
+ \pgfpathlineto{\pgfpoint{.475cm}{-.173cm}}
+ \pgfpathlineto{\pgfpoint{.294cm}{-.405cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.5cm}}
+ \pgfpathlineto{\pgfpoint{-.294cm}{-.405cm}}
+ \pgfpathlineto{\pgfpoint{-.475cm}{-.173cm}}
+ \pgfpathlineto{\pgfpoint{-.475cm}{.173cm}}
+ \pgfpathlineto{\pgfpoint{-.294cm}{.405cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{0cm}{.349cm}}
+ \pgfpathlineto{\pgfpoint{.332cm}{.108cm}}
+ \pgfpathlineto{\pgfpoint{.205cm}{-.282cm}}
+ \pgfpathlineto{\pgfpoint{-.205cm}{-.282cm}}
+ \pgfpathlineto{\pgfpoint{-.332cm}{.108cm}}
+ \pgfpathclose
+ \pgfpathlineto{\pgfpoint{0cm}{.5cm}}
+ \pgfpathmoveto{\pgfpoint{.475cm}{.173cm}}
+ \pgfpathlineto{\pgfpoint{.332cm}{.108cm}}
+ \pgfpathmoveto{\pgfpoint{.294cm}{-.405cm}}
+ \pgfpathlineto{\pgfpoint{.205cm}{-.282cm}}
+ \pgfpathmoveto{\pgfpoint{-.294cm}{-.405cm}}
+ \pgfpathlineto{\pgfpoint{-.205cm}{-.282cm}}
+ \pgfpathmoveto{\pgfpoint{-.475cm}{.173cm}}
+ \pgfpathlineto{\pgfpoint{-.332cm}{.108cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% icosahedron
+\pgfdeclareshape{twentyside}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.5cm}}
+ \pgfpathlineto{\pgfpoint{.454cm}{.262cm}}
+ \pgfpathlineto{\pgfpoint{.454cm}{-.262cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.5cm}}
+ \pgfpathlineto{\pgfpoint{-.454cm}{-.262cm}}
+ \pgfpathlineto{\pgfpoint{-.454cm}{.262cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{0cm}{.292cm}}
+ \pgfpathlineto{\pgfpoint{.253cm}{-.146cm}}
+ \pgfpathlineto{\pgfpoint{-.253cm}{-.146cm}}
+ \pgfpathclose
+ \pgfpathlineto{\pgfpoint{.454cm}{.262cm}}
+ \pgfpathlineto{\pgfpoint{.253cm}{-.146cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.5cm}}
+ \pgfpathlineto{\pgfpoint{-.253cm}{-.146cm}}
+ \pgfpathlineto{\pgfpoint{-.454cm}{.262cm}}
+ \pgfpathclose
+ \pgfpathlineto{\pgfpoint{0cm}{.5cm}}
+ \pgfpathmoveto{\pgfpoint{.454cm}{-.262cm}}
+ \pgfpathlineto{\pgfpoint{.253cm}{-.146cm}}
+ \pgfpathmoveto{\pgfpoint{-.454cm}{-.262cm}}
+ \pgfpathlineto{\pgfpoint{-.253cm}{-.146cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% sphere
+\pgfdeclareshape{hundredside}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpointorigin}{.425cm}
+ \pgfpathmoveto{\pgfpoint{.425cm}{0cm}}
+ \pgfpatharc{180}{50}{-.425cm and -.2cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpatharc{270}{140}{-.2cm and .425cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% cube (one)
+\pgfdeclareshape{sixside one}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ 0cm/0cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (two)
+\pgfdeclareshape{sixside two}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ .2cm/-.2cm, -.2cm/.2cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (three)
+\pgfdeclareshape{sixside three}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ .2cm/-.2cm, 0cm/0cm, -.2cm/.2cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (four)
+\pgfdeclareshape{sixside four}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ -.2cm/.2cm, .2cm/.2cm,
+ -.2cm/-.2cm, .2cm/-.2cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (five)
+\pgfdeclareshape{sixside five}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ -.2cm/.2cm, .2cm/.2cm,
+ 0cm/0cm,
+ -.2cm/-.2cm, .2cm/-.2cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (six)
+\pgfdeclareshape{sixside six}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ -.2cm/.2cm, .2cm/.2cm,
+ -.2cm/0cm, .2cm/0cm,
+ -.2cm/-.2cm, .2cm/-.2cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (seven)
+\pgfdeclareshape{sixside seven}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ -.2cm/.2cm, .2cm/.2cm,
+ -.2cm/0cm, 0cm/0cm, .2cm/0cm,
+ -.2cm/-.2cm, .2cm/-.2cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (eight)
+\pgfdeclareshape{sixside eight}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ -.2cm/.2cm, 0cm/.2cm, .2cm/.2cm,
+ -.2cm/0cm, .2cm/0cm,
+ -.2cm/-.2cm, 0cm/-.2cm, .2cm/-.2cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (nine)
+\pgfdeclareshape{sixside nine}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \foreach \x/\y in {
+ -.2cm/.2cm, 0cm/.2cm, .2cm/.2cm,
+ -.2cm/0cm, 0cm/0cm, .2cm/0cm,
+ -.2cm/-.2cm, 0cm/-.2cm, .2cm/-.2cm
+ } {
+ \pgfpathcircle{\pgfpoint{\x}{\y}}{2pt}
+ }
+ \pgfusepath{fill}
+ }
+}
+
+% cube (fudge)
+\pgfdeclareshape{fudge}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \pgfpathmoveto{\pgfpoint{-.15cm}{.1cm}}
+ \pgfpathlineto{\pgfpoint{.15cm}{.1cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{.25cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.05cm}}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{.15cm}{-.2cm}}
+ \pgfusepath{draw}
+ }
+}
+
+% cube (fudge plus)
+\pgfdeclareshape{fudge plus}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \pgfpathmoveto{\pgfpoint{0cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.15cm}}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.15cm}{0cm}}
+ \pgfusepath{draw}
+ }
+}
+
+% cube (fudge)
+\pgfdeclareshape{fudge minus}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw rectangle
+ \pgfpathmoveto{\pgfpoint{-.15cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.15cm}{0cm}}
+ \pgfusepath{draw}
+ }
+}
+
+\ExplSyntaxOn
+\NewDocumentCommand{\rpgicons@ifEmptyF}{ m m }{
+ \tl_if_empty:nF { #1 } { #2 }
+}
+\ExplSyntaxOff
+
+\NewDocumentCommand{\rpgiconsdie}{ O{normal} m O{} m }{%
+ \edef\rpgicons@diceiconnrmlrg{#1}%
+ \edef\rpgicons@diceiconlrg{large}%
+ \ifx\rpgicons@diceiconnrmlrg\rpgicons@diceiconlrg%
+ \def\rpgicons@diceiconfg{fglrg}\else%
+ \def\rpgicons@diceiconfg{fgnrm}\fi%
+ \ifx\rpgicons@diceiconnrmlrg\rpgicons@diceiconlrg\else\rpgicons@ifEmptyF{#4}{#4\,}\fi%
+ \hspace{\rpgicons@beforesep}%
+ \tikz[rpg icons, rpg icons/every die, rpg icons/every #2,
+ baseline=\rpgicons@baseline, fgnrm/.style={scale=.333}, fglrg/.style={scale=.675}, #3] {
+ \node[#2, \rpgicons@diceiconfg, font={\footnotesize}] (0cm,0cm)
+ {\ifx\rpgicons@diceiconnrmlrg\rpgicons@diceiconlrg\textbf{#4}\fi};
+ \path[draw=none, \rpgicons@diceiconfg] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ }%
+ \hspace{\rpgicons@aftersep}%
+}
+\@ifundefined{die}{\NewCommandCopy\die\rpgiconsdie}{}
+
+% ABILITIES
+
+% strength
+\pgfdeclareshape{strength}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{90}{.425cm}}}
+ \pgfpatharc{90}{60}{.425cm}
+ \pgfpatharc{200}{-40}{.1cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{45}{.425cm}}}
+ \pgfpatharc{45}{-20}{.425cm}
+ \pgfpatharc{-50}{-80}{.35cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{90}{.425cm}}}
+ \pgfpatharc{90}{120}{.425cm}
+ \pgfpatharc{-20}{220}{.1cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{135}{.425cm}}}
+ \pgfpatharc{135}{200}{.425cm}
+ \pgfpatharc{230}{260}{.35cm}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{-.025cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{-.125cm}{-.325cm}}
+ \pgfpatharc{180}{360}{.125cm and .1cm}
+ \pgfpathlineto{\pgfpoint{.1cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{.2cm}{-.025cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.3cm}}
+ \pgfpatharc{90}{70}{.1cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.3cm}}
+ \pgfpatharc{90}{110}{.1cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% dexterity
+\pgfdeclareshape{dexterity}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{90}{.425cm}}}
+ \pgfpatharc{90}{65}{.425cm}
+ \pgfpatharc{200}{90}{.1cm and .075cm}
+ \pgfpatharc{90}{-30}{.1cm and .075cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{45}{.425cm}}}
+ \pgfpatharc{45}{-20}{.425cm and .35cm}
+ \pgfpatharc{110}{160}{.175cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{90}{.425cm}}}
+ \pgfpatharc{90}{115}{.425cm}
+ \pgfpatharc{-20}{90}{.1cm and .075cm}
+ \pgfpatharc{90}{220}{.1cm and .075cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{135}{.425cm}}}
+ \pgfpatharc{135}{200}{.425cm and .35cm}
+ \pgfpatharc{70}{20}{.175cm}
+ \pgfpathmoveto{\pgfpoint{-.075cm}{-.175cm}}
+ \pgfpatharc{180}{360}{.075cm and .05cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.225cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.25cm}}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{.025cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{-.125cm}{-.075cm}}
+ \pgfpathmoveto{\pgfpoint{.125cm}{-.075cm}}
+ \pgfpathlineto{\pgfpoint{.075cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.2cm}{.025cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.25cm}}
+ \pgfpatharc{360}{140}{.1cm and .075cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.25cm}}
+ \pgfpatharc{180}{400}{.1cm and .075cm}
+ \pgfpathmoveto{\pgfpoint{-.1cm}{-.325cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{-.375cm}}
+ \pgfpatharc{180}{360}{.1cm and .05cm}
+ \pgfpathlineto{\pgfpoint{.1cm}{-.325cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% dexterity alt
+\pgfdeclareshape{dexterity alt}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.15cm}}{\pgfpointpolar{90}{.425cm}}}
+ \pgfpatharc{90}{75}{.425cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.15cm}}{\pgfpointpolar{90}{.425cm}}}
+ \pgfpatharc{90}{105}{.425cm}
+ \pgfpathmoveto{\pgfpoint{.125cm}{.175cm}}
+ \pgfpathlineto{\pgfpoint{.375cm}{.425cm}}
+ \pgfpatharc{30}{-20}{.25cm}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{0cm}{-.1cm}}{\pgfpointpolar{30}{.425cm}}}
+ \pgfpatharc{30}{-45}{.425cm and .35cm}
+ \pgfpathmoveto{\pgfpoint{-.125cm}{.175cm}}
+ \pgfpathlineto{\pgfpoint{-.375cm}{.425cm}}
+ \pgfpatharc{150}{200}{.25cm}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{0cm}{-.1cm}}{\pgfpointpolar{150}{.425cm}}}
+ \pgfpatharc{150}{225}{.425cm and .35cm}
+ \pgfpathmoveto{\pgfpoint{.075cm}{-.075cm}}
+ \pgfpatharc{170}{90}{.15cm and .05cm}
+ \pgfpathmoveto{\pgfpoint{-.075cm}{-.075cm}}
+ \pgfpatharc{10}{90}{.15cm and .05cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.275cm}}
+ \pgfpatharc{0}{90}{.075cm and .05cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.275cm}}
+ \pgfpatharc{180}{90}{.075cm and .05cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.275cm}}
+ \pgfpatharc{360}{180}{.1cm and .075cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.275cm}}
+ \pgfpatharc{180}{360}{.1cm and .075cm}
+ \pgfpathmoveto{\pgfpoint{-.1cm}{-.35cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{-.375cm}}
+ \pgfpatharc{180}{360}{.1cm and .05cm}
+ \pgfpathlineto{\pgfpoint{.1cm}{-.35cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% constitution
+\pgfdeclareshape{constitution}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.25cm}}
+ \pgfpathlineto{\pgfpoint{.125cm}{.25cm}}
+ \pgfpatharc{-90}{-30}{.325cm}
+ \pgfpatharc{0}{-80}{.3cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.25cm}}
+ \pgfpathlineto{\pgfpoint{-.125cm}{.25cm}}
+ \pgfpatharc{270}{210}{.325cm}
+ \pgfpatharc{180}{260}{.3cm}
+ \pgfpathmoveto{\pgfpoint{.325cm}{.1cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{.075cm}}
+ \pgfpatharc{0}{-90}{.175cm and .1cm}
+ \pgfpathlineto{\pgfpoint{.2cm}{-.15cm}}
+ \pgfpathmoveto{\pgfpoint{-.325cm}{.1cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{.075cm}}
+ \pgfpatharc{180}{270}{.175cm and .1cm}
+ \pgfpathlineto{\pgfpoint{-.2cm}{-.15cm}}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.225cm}}
+ \pgfpatharc{90}{270}{.1cm}
+ \pgfpathlineto{\pgfpoint{.15cm}{-.425cm}}
+ \pgfpatharc{-90}{90}{.1cm}
+ \pgfpathmoveto{\pgfpoint{-.125cm}{-.35cm}}
+ \pgfpatharc{-90}{0}{.05cm}
+ \pgfpathmoveto{\pgfpoint{.125cm}{-.35cm}}
+ \pgfpatharc{90}{0}{-.05cm}
+ \pgfpathmoveto{\pgfpoint{-.125cm}{-.025cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{-.1cm}}
+ \pgfpathmoveto{\pgfpoint{.125cm}{-.025cm}}
+ \pgfpathlineto{\pgfpoint{.075cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{.075cm}{-.1cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% intelligence
+\pgfdeclareshape{intelligence}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.2cm}}{\pgfpointpolar{90}{.425cm}}}
+ \pgfpatharc{90}{60}{.25cm}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{0cm}{-.1cm}}{\pgfpointpolar{60}{.6cm}}}
+ \pgfpatharc{40}{-2.5}{.425cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.2cm}}{\pgfpointpolar{90}{.425cm}}}
+ \pgfpatharc{90}{120}{.25cm}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{0cm}{-.1cm}}{\pgfpointpolar{120}{.6cm}}}
+ \pgfpatharc{140}{182.5}{.425cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.2cm}}{\pgfpointpolar{45}{.425cm}}}
+ \pgfpatharc{45}{0}{.425cm}
+ \pgfpathlineto{\pgfpoint{.2cm}{-.275cm}}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.2cm}}{\pgfpointpolar{135}{.425cm}}}
+ \pgfpatharc{135}{180}{.425cm}
+ \pgfpathlineto{\pgfpoint{-.2cm}{-.275cm}}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{-.075cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{-.1cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{-.375cm}}
+ \pgfpatharc{180}{360}{.075cm and .05cm}
+ \pgfpathlineto{\pgfpoint{.1cm}{-.1cm}}
+ \pgfpathlineto{\pgfpoint{.2cm}{-.075cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% wisdom
+\pgfdeclareshape{wisdom}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.175cm}}
+ \pgfpatharc{60}{90}{.425cm}
+ \pgfpatharc{270}{240}{.425cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.175cm}}
+ \pgfpatharc{120}{90}{.425cm}
+ \pgfpatharc{270}{300}{.425cm}
+ \pgfpathcircle{\pgfpoint{-.175cm}{0cm}}{.075cm}
+ \pgfpathcircle{\pgfpoint{.175cm}{0cm}}{.075cm}
+ \pgfpathmoveto{\pgfpoint{.075cm}{-.125cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.325cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{-.125cm}}
+ \pgfpathmoveto{\pgfpoint{-.375cm}{.125cm}}
+ \pgfpatharc{150}{270}{.25cm}
+ \pgfpathmoveto{\pgfpoint{.375cm}{.125cm}}
+ \pgfpatharc{30}{-90}{.25cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% charisma
+\pgfdeclareshape{charisma}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.15cm}}
+ \pgfpatharc{270}{190}{.15cm and .1cm}
+ \pgfpatharc{10}{90}{.175cm and .225cm}
+ \pgfpatharc{40}{0}{.125cm and .175cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.15cm}}
+ \pgfpatharc{270}{350}{.15cm and .1cm}
+ \pgfpatharc{170}{90}{.175cm and .225cm}
+ \pgfpatharc{140}{180}{.125cm and .175cm}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{.125cm}}
+ \pgfpatharc{0}{90}{.175cm and .1cm}
+ \pgfpatharc{180}{270}{.15cm and .2cm}
+ \pgfpathlineto{\pgfpoint{-.25cm}{-.05cm}}
+ \pgfpatharc{40}{0}{.45cm}
+ \pgfpathlineto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpathmoveto{\pgfpoint{.2cm}{.125cm}}
+ \pgfpatharc{180}{90}{.175cm and .1cm}
+ \pgfpatharc{0}{-90}{.15cm and .2cm}
+ \pgfpathlineto{\pgfpoint{.25cm}{-.05cm}}
+ \pgfpatharc{140}{180}{.45cm}
+ \pgfpathlineto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.05cm}{-.275cm}}
+ \pgfpatharc{-30}{60}{.05cm}
+ \pgfpathmoveto{\pgfpoint{.05cm}{-.275cm}}
+ \pgfpatharc{210}{120}{.05cm}
+ \pgfpathmoveto{\pgfpoint{-.125cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{-.05cm}{-.075cm}}
+ \pgfpathmoveto{\pgfpoint{.125cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{.05cm}{-.075cm}}
+ \pgfpathmoveto{\pgfpoint{-.35cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.05cm}}
+ \pgfpatharc{30}{-30}{.15cm}
+ \pgfpatharc{80}{10}{.15cm}
+ \pgfpathlineto{\pgfpoint{-.25cm}{-.275cm}}
+ \pgfpathmoveto{\pgfpoint{.35cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{-.05cm}}
+ \pgfpatharc{150}{210}{.15cm}
+ \pgfpatharc{100}{170}{.15cm}
+ \pgfpathlineto{\pgfpoint{.25cm}{-.275cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% resilience
+\pgfdeclareshape{resilience}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{-.425cm}{-.475cm}}{\pgfpointpolar{65}{.5cm}}}
+ \pgfpatharc{65}{90}{.5cm}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{0cm}{-.075cm}}{\pgfpointpolar{135}{.55cm}}}
+ \pgfpatharc{135}{45}{.55cm}
+ \pgfpathlineto{\pgfpoint{.425cm}{.025cm}}
+ \pgfpatharc{90}{115}{.5cm}
+ \pgfpathmoveto{\pgfpoint{.2cm}{.3cm}}
+ \pgfpathlineto{\pgfpoint{.125cm}{.275cm}}
+ \pgfpathlineto{\pgfpoint{.2cm}{.15cm}}
+ \pgfpathmoveto{\pgfpoint{.125cm}{.075cm}}
+ \pgfpathlineto{\pgfpoint{.05cm}{.05cm}}
+ \pgfpathmoveto{\pgfpoint{.15cm}{-.1cm}}
+ \pgfpatharc{200}{230}{.4cm}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{.3cm}}
+ \pgfpathlineto{\pgfpoint{-.125cm}{.275cm}}
+ \pgfpathlineto{\pgfpoint{-.2cm}{.15cm}}
+ \pgfpathmoveto{\pgfpoint{-.125cm}{.075cm}}
+ \pgfpathlineto{\pgfpoint{-.05cm}{.05cm}}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.1cm}}
+ \pgfpatharc{340}{310}{.4cm}
+ \pgfpathmoveto{\pgfpoint{-.065cm}{-.075cm}}
+ \pgfpathlineto{\pgfpoint{-.045cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.045cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.065cm}{-.075cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% sanity
+\pgfdeclareshape{sanity}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{-.125cm + .175cm * sin(30)}{.425cm - .175cm * cos(30)}}
+ {\pgfpointpolar{210}{.175cm}}}
+ \pgfpatharc{210}{120}{.175cm}
+ \pgfpathlineto{\pgfpointpolar{110}{.25cm}}
+ \pgfpatharc{110}{70}{.25cm}
+ \pgfpathlineto{\pgfpoint{.125cm}{.425cm}}
+ \pgfpatharc{420}{330}{.175cm}
+ \pgfpathmoveto{\pgfpoint{.25cm}{.1cm}}
+ \pgfpatharc{390}{305}{.15cm}
+ \pgfpathmoveto{\pgfpoint{-.25cm}{.1cm}}
+ \pgfpatharc{150}{235}{.15cm}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{.075cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{.05cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{.025cm}}
+ \pgfpathmoveto{\pgfpoint{.15cm}{.075cm}}
+ \pgfpathlineto{\pgfpoint{.1cm}{.05cm}}
+ \pgfpathlineto{\pgfpoint{.1cm}{.025cm}}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{-.55cm}{-.35cm}}
+ {\pgfpointadd{\pgfpointpolar{135}{.125cm and .075cm}}{\pgfpointpolar{20}{.55cm}}}}
+ \pgfpatharc{380}{360}{.55cm}
+ \pgfpatharc{135}{405}{.125cm and .075cm}
+ \pgfpatharc{180}{160}{.55cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% perception
+\pgfdeclareshape{perception}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{.35cm}}{\pgfpointpolar{150}{.125cm}}}
+ \pgfpatharc{150}{390}{.125cm}
+ \pgfpathmoveto{\pgfpoint{-.3cm}{.425cm}}
+ \pgfpatharc{180}{360}{.3cm and .2cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{.425cm}}{\pgfpointpolar{330}{.3cm and .2cm}}}
+ \pgfpatharc{270}{350}{.15cm and .1cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{.425cm}}{\pgfpointpolar{210}{.3cm and .2cm}}}
+ \pgfpatharc{270}{190}{.15cm and .1cm}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{-.375cm}{.125cm}}
+ \pgfpatharc{210}{250}{.225cm}
+ \pgfpathmoveto{\pgfpoint{.2cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{.375cm}{.125cm}}
+ \pgfpatharc{330}{290}{.225cm}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{-.025cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{-.05cm}}
+ \pgfpathmoveto{\pgfpoint{.15cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.075cm}{-.025cm}}
+ \pgfpathlineto{\pgfpoint{.075cm}{-.05cm}}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{-.075cm}{-.35cm + .075cm * ( 2 + sqrt(3) )}}
+ {\pgfpointpolar{195}{.1cm and .075cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{0cm}{-.35cm}}{\pgfpointpolar{195}{.1cm and .075cm}}}
+ \pgfpatharc{195}{345}{.1cm and .075cm}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.075cm}{-.35cm + .075cm * ( 2 + sqrt(3) )}}
+ {\pgfpointpolar{345}{.1cm and .075cm}}}
+ \pgfpathmoveto{\pgfpoint{.025cm}{-.325cm}}
+ \pgfpatharc{0}{180}{.025cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% luck
+\pgfdeclareshape{luck}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{.1cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{.1cm}{-.05cm}}
+ \pgfpatharc{-75}{-15}{.425cm}
+ \pgfpatharc{40}{85}{.425cm}
+ \pgfpathmoveto{\pgfpoint{-.1cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{-.05cm}}
+ \pgfpatharc{-105}{-165}{.425cm}
+ \pgfpatharc{140}{95}{.425cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.05cm}}{\pgfpointpolar{15}{.425cm}}}
+ \pgfpatharc{15}{-55}{.425cm and .3cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{-.05cm}}{\pgfpointpolar{165}{.425cm}}}
+ \pgfpatharc{165}{235}{.425cm and .3cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.175cm}}
+ \pgfpatharc{90}{250}{.175cm and .125cm}
+ \pgfpathlineto{\pgfpoint{-.05cm}{-.325cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.175cm}}
+ \pgfpatharc{90}{-70}{.175cm and .125cm}
+ \pgfpathlineto{\pgfpoint{.05cm}{-.325cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% armor
+\pgfdeclareshape{armor}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.25cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.25cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.2cm}{-.225cm}}
+ \pgfpathlineto{\pgfpoint{.25cm}{.125cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{.125cm}}
+ \pgfpatharc{0}{90}{.3cm}
+ \pgfpathlineto{\pgfpoint{.125cm}{.35cm}}
+ \pgfpatharc{360}{180}{.125cm}
+ \pgfpathlineto{\pgfpoint{-.125cm}{.425cm}}
+ \pgfpatharc{90}{180}{.3cm}
+ \pgfpathlineto{\pgfpoint{-.25cm}{.125cm}}
+ \pgfpathlineto{\pgfpoint{-.2cm}{-.225cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{.125cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{.125cm}{.25cm}}
+ \pgfpatharc{180}{270}{.125cm}
+ \pgfpathmoveto{\pgfpoint{-.125cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{-.125cm}{.25cm}}
+ \pgfpatharc{360}{270}{.125cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.225cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.275cm}}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{-.225cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.275cm}}
+ \pgfpathlineto{\pgfpoint{.2cm}{-.225cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% proficiency
+\pgfdeclareshape{proficiency}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointpolar{90}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{126}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{162}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{198}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{234}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{270}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{306}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{342}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{18}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{54}{.15cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpointpolar{270}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{270}{.425cm}}
+ \pgfpathmoveto{\pgfpointpolar{342}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{342}{.425cm}}
+ \pgfpathmoveto{\pgfpointpolar{54}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{54}{.425cm}}
+ \pgfpathmoveto{\pgfpointpolar{126}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{126}{.425cm}}
+ \pgfpathmoveto{\pgfpointpolar{198}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{198}{.425cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+\NewDocumentCommand{\rpgiconsability}{ O{positive} m O{} }{%
+ \edef\rpgicons@abilityiconposneg{#1}%
+ \edef\rpgicons@abilityiconneg{negative}%
+ \ifx\rpgicons@abilityiconposneg\rpgicons@abilityiconneg%
+ \def\rpgicons@abilityiconfg{fgneg}\else%
+ \def\rpgicons@abilityiconfg{fgpos}\fi%
+ \hspace{\rpgicons@beforesep}%
+ \tikz[rpg icons, rpg icons/every ability, rpg icons/every #2,
+ baseline=\rpgicons@baseline, fgpos/.style={draw}, fgneg/.style={draw=rpgicons@bg, line width=.6pt}, #3] {
+ \ifx\rpgicons@abilityiconposneg\rpgicons@abilityiconneg%
+ \path[scale=.333, fill] (0cm,0cm) circle[radius=.45cm];
+ \node[#2, \rpgicons@abilityiconfg, scale=.225] (0cm,0cm) {};
+ \else
+ \node[#2, \rpgicons@abilityiconfg, scale=.333] (0cm,0cm) {};
+ \fi%
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ }%
+ \hspace{\rpgicons@aftersep}%
+}
+\@ifundefined{ability}{\NewCommandCopy\ability\rpgiconsability}{}
+
+\NewDocumentCommand{\rpgiconssaving}{ O{normal} m O{} }{%
+ \edef\rpgicons@abilityiconnrmemp{#1}%
+ \edef\rpgicons@abilityiconemp{empty}%
+ \ifx\rpgicons@abilityiconnrmemp\rpgicons@abilityiconemp%
+ \def\rpgicons@savingstyle{}\else%
+ \def\rpgicons@savingstyle{rpg icons/every #2}\fi%
+ \hspace{\rpgicons@beforesep}%
+ \tikz[rpg icons, rpg icons/every saving, \rpgicons@savingstyle,
+ baseline=\rpgicons@baseline, #3] {
+ \path[draw, scale=.333] (-.45cm,.45cm) -- (.45cm,.45cm) -- (.45cm,-.05cm)
+ arc[start angle=360, end angle=180, radius=.45cm] -- cycle;
+ \ifx\rpgicons@abilityiconnrmemp\rpgicons@abilityiconemp\else%
+ \node[#2, draw,scale=.225] (0cm,0cm) {};
+ \fi%
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ }%
+ \hspace{\rpgicons@aftersep}%
+}
+\@ifundefined{saving}{\NewCommandCopy\saving\rpgiconssaving}{}
+
+% SPELLS
+
+% line
+\pgfdeclareshape{linear}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.4cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.4cm}{0cm}}
+ \pgfusepath{draw} % draw shape
+ \pgfpathcircle{\pgfpoint{-.4cm}{0cm}}{2pt}
+ \pgfusepath{fill} % draw origin
+ }
+}
+
+% cone
+\pgfdeclareshape{conic}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \def\rx{.425cm}
+ \def\ry{.2cm}
+ \def\z{(.425cm+.2125cm)}
+ \pgfpathellipse{\pgfpoint{\z-.425cm}{0cm}}{\pgfpoint{\ry}{0cm}}{\pgfpoint{0cm}{\rx}}
+ \pgfmathparse{asin(\ry/\z)}
+ \let\angle\pgfmathresult
+ \pgfmathparse{-\rx*cos(\angle)}
+ \let\coordya\pgfmathresult
+ \pgfmathparse{\rx*cos(\angle)}
+ \let\coordyb\pgfmathresult
+ \pgfmathparse{\z-\ry*sin(\angle)}
+ \let\coordx\pgfmathresult
+ \pgfpathmoveto{\pgfpoint{\coordx-.425cm}{\coordya}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{\coordx-.425cm}{\coordyb}}
+ \pgfusepath{draw} % draw shape
+ \pgfpathcircle{\pgfpoint{-.425cm}{0cm}}{2pt}
+ \pgfusepath{fill} % draw origin
+ }
+}
+
+% square
+\pgfdeclareshape{quadratic}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathrectanglecorners{\pgfpoint{.4cm}{.4cm}}{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfusepath{draw} % draw shape
+ \pgfpathcircle{\pgfpointorigin}{2pt}
+ \pgfusepath{fill} % draw origin
+ }
+}
+
+% cube
+\pgfdeclareshape{cubic}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.425cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{-.2cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{.2cm}}
+ \pgfpathlineto{\pgfpoint{.2cm}{.425cm}}
+ \pgfpathclose
+ \pgfpathlineto{\pgfpoint{-.2cm}{.2cm}}
+ \pgfpathlineto{\pgfpoint{-.2cm}{-.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{.2cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{.2cm}}
+ \pgfusepath{draw} % draw shape
+ \pgfpathcircle{\pgfpoint{.1125cm}{-.1125cm}}{2pt}
+ \pgfusepath{fill} % draw origin
+ }
+}
+
+% sphere
+\pgfdeclareshape{spheric}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpointorigin}{.425cm}
+ \pgfpathmoveto{\pgfpoint{.425cm}{0cm}}
+ \pgfpatharc{180}{50}{-.425cm and -.2cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpatharc{270}{140}{-.2cm and .425cm}
+ \pgfusepath{draw} % draw shape
+ \pgfpathcircle{\pgfpointorigin}{2pt}
+ \pgfusepath{fill} % draw origin
+ }
+}
+
+% cylinder
+\pgfdeclareshape{cylindric}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathellipse{\pgfpoint{0cm}{.2125cm}}{\pgfpoint{0cm}{.2cm}}{\pgfpoint{.425cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{.2125cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.2125cm}}
+ \pgfpatharc{0}{180}{-.425cm and -.2cm}
+ \pgfpathlineto{\pgfpoint{.425cm}{.2125cm}}
+ \pgfusepath{draw} % draw shape
+ \pgfpathcircle{\pgfpoint{0cm}{-.2125cm}}{2pt}
+ \pgfusepath{fill} % draw origin
+ }
+}
+
+% verbal
+\pgfdeclareshape{verbal}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.35cm}{0cm}}
+ \pgfpatharc{180}{-115}{.35cm}
+ \pgfpathlineto{\pgfpoint{-.4cm}{-.4cm}}
+ \pgfpathlineto{\pgfpointpolar{215}{.35cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% somatic
+\pgfdeclareshape{somatic}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.425cm}{0cm}}
+ \pgfpatharc{0}{270}{-.425cm and -.2cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpatharc{90}{360}{-.2cm and -.425cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% material
+\pgfdeclareshape{material}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.4cm}{.2cm}}
+ \pgfpathlineto{\pgfpoint{-.4cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.4cm}}
+ \pgfpathlineto{\pgfpoint{.4cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{.4cm}{.2cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{.4cm}}
+ \pgfpathclose
+ \pgfpathlineto{\pgfpoint{0cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.4cm}{.2cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.4cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% focus
+\pgfdeclareshape{focus}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpointorigin}{.35cm}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{.15cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.15cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{.425cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+\NewDocumentCommand{\rpgiconsspell}{ m O{} }{%
+ \hspace{\rpgicons@beforesep}%
+ \tikz[rpg icons, rpg icons/every spell, rpg icons/every #1,
+ baseline=\rpgicons@baseline, #2] {
+ \node[#1, draw,scale=.333] (0cm,0cm) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ }%
+ \hspace{\rpgicons@aftersep}%
+}
+\@ifundefined{spell}{\NewCommandCopy\spell\rpgiconsspell}{}
+
+% SPELLSCHOOLS
+
+% abjuration
+\pgfdeclareshape{abjuration}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.025cm}}
+ \pgfpatharc{270}{390}{.275cm and .175cm}
+ \pgfpatharc{210}{120}{.095cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.025cm}}
+ \pgfpatharc{270}{150}{.275cm and .175cm}
+ \pgfpatharc{-30}{60}{.095cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.25cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.25cm}{-.125cm}}
+ \pgfpathlineto{\pgfpoint{.25cm}{-.125cm}}
+ \pgfpathmoveto{\pgfpoint{-.25cm}{-.3cm}}
+ \pgfpathlineto{\pgfpoint{.25cm}{-.3cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% conjuration
+\pgfdeclareshape{conjuration}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.425cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.225cm}{.05cm}}
+ \pgfpathlineto{\pgfpoint{.225cm}{.05cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.15cm}}
+ \pgfpatharc{110}{70}{.5cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.15cm}}
+ \pgfpatharc{110}{70}{-.5cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% divination
+\pgfdeclareshape{divination}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.35cm}{-.175cm}}
+ \pgfpatharc{180}{0}{.15cm and -.25cm}
+ \pgfpatharc{180}{90}{.4cm}
+ \pgfpathmoveto{\pgfpoint{-.05cm}{-.175cm}}
+ \pgfpathlineto{\pgfpoint{-.05cm}{0cm}}
+ \pgfpatharc{180}{90}{.4cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% enchantment
+\pgfdeclareshape{enchantment}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.2cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{-.2cm}{.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{.175cm}}
+ \pgfpathlineto{\pgfpoint{.025cm}{.175cm}}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{-.225cm}}
+ \pgfpatharc{180}{0}{.1cm and .2cm}
+ \pgfpatharc{180}{0}{.1cm and .2cm}
+ \pgfpatharc{180}{0}{.1cm and -.2cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% evocation
+\pgfdeclareshape{evocation}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathellipse{\pgfpointorigin}{\pgfpoint{.325cm}{0cm}}{\pgfpoint{0cm}{.225cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{0cm}}
+ \pgfpathmoveto{\pgfpointpolar{30}{.325cm and .225cm}}
+ \pgfpathlineto{\pgfpointpolar{30}{.4cm}}
+ \pgfpathmoveto{\pgfpointpolar{60}{.325cm and .225cm}}
+ \pgfpathlineto{\pgfpointpolar{60}{.4cm}}
+ \pgfpathmoveto{\pgfpointpolar{120}{.325cm and .225cm}}
+ \pgfpathlineto{\pgfpointpolar{120}{.4cm}}
+ \pgfpathmoveto{\pgfpointpolar{150}{.325cm and .225cm}}
+ \pgfpathlineto{\pgfpointpolar{150}{.4cm}}
+ \pgfpathmoveto{\pgfpointpolar{210}{.325cm and .225cm}}
+ \pgfpathlineto{\pgfpointpolar{210}{.4cm}}
+ \pgfpathmoveto{\pgfpointpolar{240}{.325cm and .225cm}}
+ \pgfpathlineto{\pgfpointpolar{240}{.4cm}}
+ \pgfpathmoveto{\pgfpointpolar{300}{.325cm and .225cm}}
+ \pgfpathlineto{\pgfpointpolar{300}{.4cm}}
+ \pgfpathmoveto{\pgfpointpolar{330}{.325cm and .225cm}}
+ \pgfpathlineto{\pgfpointpolar{330}{.4cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% illusion
+\pgfdeclareshape{illusion}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.225cm}}
+ \pgfpatharc{90}{30}{.45cm}
+ \pgfpatharc{330}{210}{.45cm}
+ \pgfpatharc{150}{90}{.45cm}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{.225cm}}{\pgfpointpolar{270}{.45cm}}}
+ \pgfpathlineto{\pgfpointpolar{270}{.35cm}}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{.225cm}}{\pgfpointpolar{240}{.45cm}}}
+ \pgfpathlineto{\pgfpointpolar{225}{.4cm}}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{.225cm}}{\pgfpointpolar{300}{.45cm}}}
+ \pgfpathlineto{\pgfpointpolar{315}{.4cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{.225cm}}
+ \pgfpathcircle{\pgfpoint{0cm}{.075cm}}{.15cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% necromancy
+\pgfdeclareshape{necromancy}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointpolar{210}{.25cm}}
+ \pgfpatharc{210}{-30}{.25cm}
+ \pgfpatharc{150}{390}{.1cm}
+ \pgfpathmoveto{\pgfpointpolar{210}{.25cm}}
+ \pgfpatharc{390}{150}{.1cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% transmutation
+\pgfdeclareshape{transmutation}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.25cm}{.35cm}}
+ \pgfpathlineto{\pgfpoint{-.25cm}{-.35cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{.35cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.35cm}}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{.35cm}}
+ \pgfpathlineto{\pgfpoint{.15cm}{.35cm}}
+ \pgfpatharc{90}{-45}{.1cm}
+ \pgfpatharc{135}{360}{.1cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+\NewDocumentCommand{\rpgiconsspellschool}{ O{negative} m O{} }{%
+ \edef\rpgicons@spellschooliconposneg{#1}%
+ \edef\rpgicons@spellschooliconpos{positive}%
+ \ifx\rpgicons@spellschooliconposneg\rpgicons@spellschooliconpos%
+ \def\rpgicons@spellschooliconfg{fgneg}\else%
+ \def\rpgicons@spellschooliconfg{fgpos}\fi%
+ \ifx\rpgicons@spellschooliconposneg\rpgicons@spellschooliconpos%
+ \def\rpgicons@spellschooliconbg{bgneg}\else%
+ \def\rpgicons@spellschooliconbg{bgpos}\fi%
+ \hspace{\rpgicons@beforesep}%
+ \tikz[rpg icons, rpg icons/every spellschool, rpg icons/every #2,
+ baseline=\rpgicons@baseline, fgpos/.style={draw=rpgicons@bg, line width=.6pt}, fgneg/.style={draw},
+ bgpos/.style={fill}, bgneg/.style={draw}, #3] {
+ \path[scale=.333, \rpgicons@spellschooliconbg] (-.475cm,.35cm)
+ -- (-.35cm,.475cm) -- (.35cm,.475cm) -- (.475cm,.35cm) -- (.425cm,-.375cm) -- (0cm,-.475cm) -- (-.425cm,-.375cm) -- cycle;
+ \node[#2, scale=.225, \rpgicons@spellschooliconfg] (0cm,0cm) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425,.425) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ }%
+ \hspace{\rpgicons@aftersep}%
+}
+\@ifundefined{spellschool}{\NewCommandCopy\spellschool\rpgiconsspellschool}{}
+
+% DAMAGES
+
+% acid
+\pgfdeclareshape{acid}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{-.175cm}{.05cm}}{\pgfpointpolar{-20}{.175}}}
+ \pgfpatharc{-20}{200}{-.175cm}
+ \pgfpathlineto{\pgfpoint{0cm}{.425cm}}
+ \pgfpathclose
+ \newdimen\rpgicons@py
+ \pgfextracty{\rpgicons@py}{\pgfpointadd{\pgfpoint{0cm}{-.175cm}}{\pgfpointpolar{20}{-.25cm}}}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{\rpgicons@py}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{0cm}{-.175cm}}{\pgfpointpolar{20}{-.25cm}}}
+ \pgfpatharc{20}{160}{-.25cm}
+ \pgfpathlineto{\pgfpoint{.425cm}{\rpgicons@py}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% bludgeoning
+\pgfdeclareshape{bludgeoning}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.2cm}{.225cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.225cm}{-.2cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{.05cm}{-.025cm}}
+ \pgfpathlineto{\pgfpoint{-.35cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.35cm}}
+ \pgfpathlineto{\pgfpoint{-.025cm}{.05cm}}
+ \pgfpathmoveto{\pgfpoint{.2375cm}{.1875cm}}
+ \pgfpatharc{135}{315}{-.05cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% cold
+\pgfdeclareshape{cold}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointpolar{90}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{270}{.425cm}}
+ \pgfpathmoveto{\pgfpointpolar{110}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{90}{.25cm}}
+ \pgfpathlineto{\pgfpointpolar{70}{.35cm}}
+ \pgfpathmoveto{\pgfpointpolar{250}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{270}{.25cm}}
+ \pgfpathlineto{\pgfpointpolar{290}{.35cm}}
+ \pgfpathmoveto{\pgfpointpolar{30}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{210}{.425cm}}
+ \pgfpathmoveto{\pgfpointpolar{50}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{30}{.25cm}}
+ \pgfpathlineto{\pgfpointpolar{10}{.35cm}}
+ \pgfpathmoveto{\pgfpointpolar{190}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{210}{.25cm}}
+ \pgfpathlineto{\pgfpointpolar{230}{.35cm}}
+ \pgfpathmoveto{\pgfpointpolar{150}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{330}{.425cm}}
+ \pgfpathmoveto{\pgfpointpolar{130}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{150}{.25cm}}
+ \pgfpathlineto{\pgfpointpolar{170}{.35cm}}
+ \pgfpathmoveto{\pgfpointpolar{310}{.35cm}}
+ \pgfpathlineto{\pgfpointpolar{330}{.25cm}}
+ \pgfpathlineto{\pgfpointpolar{350}{.35cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% fire
+\pgfdeclareshape{fire}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{.15cm}{-.425cm}}
+ \pgfpatharc{-60}{0}{.45cm and .375cm}
+ \pgfpathcurveto{\pgfpoint{.375cm}{.15cm}}{\pgfpoint{.15cm}{.375cm}}{\pgfpoint{-.05cm}{.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.425cm}}
+ \pgfpatharc{240}{135}{.45cm and .35cm}
+ \pgfpathcurveto{\pgfpoint{-.15cm}{.2cm}}{\pgfpoint{0cm}{.25cm}}{\pgfpoint{-.05cm}{.425cm}}
+ \pgfpathmoveto{\pgfpoint{.075cm}{-.3cm}}
+ \pgfpathcurveto{\pgfpoint{.2cm}{-.2cm}}{\pgfpoint{.2cm}{-.05cm}}{\pgfpoint{.05cm}{.1cm}}
+ \pgfpathmoveto{\pgfpoint{-.075cm}{-.3cm}}
+ \pgfpatharc{220}{150}{.35cm and .2cm}
+ \pgfpathcurveto{\pgfpoint{0cm}{-.2cm}}{\pgfpoint{.05cm}{-.1cm}}{\pgfpoint{.05cm}{.1cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% force
+\pgfdeclareshape{force}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointpolar{90}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{120}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{150}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{180}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{210}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{240}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{270}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{300}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{330}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{0}{.15cm}}
+ \pgfpathlineto{\pgfpointpolar{30}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{60}{.15cm}}
+ \pgfpathclose
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% lightning
+\pgfdeclareshape{lightning}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{-.25cm}{-.15cm}}
+ \pgfpathlineto{\pgfpoint{.25cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.425cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% necrotic
+\pgfdeclareshape{necrotic}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.35cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{-.35cm}{.075cm}}
+ \pgfpatharc{180}{0}{.35cm}
+ \pgfpathlineto{\pgfpoint{.35cm}{-.425cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{0cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{.25cm}}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{.1cm}}
+ \pgfpathlineto{\pgfpoint{.15cm}{.1cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% piercing
+\pgfdeclareshape{piercing}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.425cm}{.075cm}}
+ \pgfpathlineto{\pgfpoint{.3cm}{.075cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.3cm}{-.075cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.075cm}}
+ \pgfpathmoveto{\pgfpoint{.25cm}{.2cm}}
+ \pgfpathlineto{\pgfpoint{-.05cm}{.35cm}}
+ \pgfpathmoveto{\pgfpoint{.25cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{-.05cm}{-.35cm}}
+ \pgfpathmoveto{\pgfpoint{.425cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{.25cm}{.425cm}}
+ \pgfpathmoveto{\pgfpoint{.425cm}{-.15cm}}
+ \pgfpathlineto{\pgfpoint{.25cm}{-.425cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% poison
+\pgfdeclareshape{poison}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{0cm}{.175cm}}{\pgfpointpolar{-40}{.25cm}}}
+ \pgfpatharc{-40}{220}{.25cm}
+ \pgfpathlineto{\pgfpoint{-.15cm}{-.1cm}}
+ \pgfpathlineto{\pgfpoint{.15cm}{-.1cm}}
+ \pgfpathclose
+ \pgfpathcircle{\pgfpoint{-.1cm}{.15cm}}{.05cm}
+ \pgfpathcircle{\pgfpoint{.1cm}{.15cm}}{.05cm}
+ \pgfpathmoveto{\pgfpoint{.425cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{-.425cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% psychic
+\pgfdeclareshape{psychic}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{.075cm}{.4cm}}
+ \pgfpatharc{90}{180}{.425cm}
+ \pgfpatharc{180}{270}{.375cm}
+ \pgfpatharc{270}{360}{.325cm}
+ \pgfpatharc{0}{90}{.275cm}
+ \pgfpatharc{90}{180}{.225cm}
+ \pgfpatharc{180}{270}{.175cm}
+ \pgfpatharc{270}{360}{.125cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% radiant
+\pgfdeclareshape{radiant}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpointorigin}{.225cm}
+ \pgfpathmoveto{\pgfpointpolar{15}{.425cm}}
+ \pgfpatharc{15}{45}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{75}{.425cm}}
+ \pgfpatharc{75}{105}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{135}{.425cm}}
+ \pgfpatharc{135}{165}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{195}{.425cm}}
+ \pgfpatharc{195}{225}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{255}{.425cm}}
+ \pgfpatharc{255}{285}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{315}{.425cm}}
+ \pgfpatharc{315}{345}{.425cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% slashing
+\pgfdeclareshape{slashing}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.15cm}{.225cm}}
+ \pgfpathlineto{\pgfpoint{-.275cm}{.35cm}}
+ \pgfpatharc{0}{240}{.075cm}
+ \pgfpathlineto{\pgfpoint{-.35cm}{.275cm}}
+ \pgfpathlineto{\pgfpoint{-.225cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.05cm}}
+ \pgfpathlineto{\pgfpoint{-.35cm}{-.125cm}}
+ \pgfpathlineto{\pgfpoint{.125cm}{.35cm}}
+ \pgfpathlineto{\pgfpoint{.05cm}{.425cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.2cm}{.025cm}}
+ \pgfpathlineto{\pgfpoint{.225cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{-.425cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{-.225cm}}
+ \pgfpathlineto{\pgfpoint{-.025cm}{.2cm}}
+ \pgfpathmoveto{\pgfpoint{.325cm}{-.325cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{.425cm}{.3cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{.275cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{.275cm}{.1cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% thunder
+\pgfdeclareshape{thunder}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{.225cm}{-.075cm}}
+ \pgfpatharc{-90}{120}{.2cm}
+ \pgfpatharc{30}{180}{.225cm}
+ \newdimen\rpgicons@qy
+ \pgfmathparse{.125cm+cos(30)*.2cm-sin(30)*.225cm}
+ \rpgicons@qy=\pgfmathresult pt
+ \pgfpathlineto{\pgfpoint{-.3cm}{\rpgicons@qy}}
+ \pgfpatharc{90}{180}{.125cm}
+ \pgfpathlineto{\pgfpoint{-.425cm}{.05cm}}
+ \pgfpatharc{180}{270}{.125cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.1cm}{-.225cm}}
+ \pgfpatharc{240}{300}{.3cm}
+ \pgfpathmoveto{\pgfpoint{-.2cm}{-.35cm}}
+ \pgfpatharc{240}{300}{.5cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% healing
+\pgfdeclareshape{healing}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.125cm}}
+ \pgfpatharc{0}{225}{.2cm}
+ \pgfpathlineto{\pgfpoint{0cm}{-.375cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{.125cm}}
+ \pgfpatharc{180}{-45}{.2cm}
+ \pgfpathlineto{\pgfpoint{0cm}{-.375cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+\NewDocumentCommand{\rpgiconsdamage}{ m O{} }{%
+ \hspace{\rpgicons@beforesep}%
+ \tikz[rpg icons, rpg icons/every damage, rpg icons/every #1,
+ baseline=\rpgicons@baseline, #2] {
+ \path[draw, scale=.333] (0cm,0cm) circle[radius=.5cm];
+ \node[#1, draw, scale=.225] (0cm,0cm) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ }%
+ \hspace{\rpgicons@aftersep}%
+}
+\@ifundefined{damage}{\NewCommandCopy\damage\rpgiconsdamage}{}
+
+% ATTACKS
+
+% melee
+\pgfdeclareshape{melee}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.225cm}}
+ \pgfpathlineto{\pgfpoint{-.275cm}{-.35cm}}
+ \pgfpatharc{360}{90}{.075cm}
+ \pgfpathlineto{\pgfpoint{-.35cm}{-.275cm}}
+ \pgfpathlineto{\pgfpoint{-.225cm}{-.15cm}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{.05cm}}
+ \pgfpathlineto{\pgfpoint{-.35cm}{.125cm}}
+ \pgfpathlineto{\pgfpoint{.125cm}{-.35cm}}
+ \pgfpathlineto{\pgfpoint{.05cm}{-.425cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.2cm}{-.025cm}}
+ \pgfpathlineto{\pgfpoint{.225cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{.425cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{.225cm}}
+ \pgfpathlineto{\pgfpoint{-.025cm}{-.2cm}}
+ \pgfpathmoveto{\pgfpoint{.325cm}{.325cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{0cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% ranged
+\pgfdeclareshape{ranged}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.225cm}}
+ \pgfpatharc{0}{-30}{.4cm}
+ \pgfpatharc{-45}{0}{.6cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{.225cm}}
+ \pgfpatharc{0}{30}{.4cm}
+ \pgfpatharc{45}{0}{.6cm}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{.275cm}{.1cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{.275cm}{-.1cm}}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{-.4cm}{-.225cm}}{\pgfpointpolar{-20}{.4cm}}}
+ \pgfpathlineto{\pgfpoint{-.425cm}{0cm}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.4cm}{.225cm}}{\pgfpointpolar{20}{.4cm}}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% magic
+\pgfdeclareshape{magic}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.225cm}{-.425cm}}
+ \pgflineto{\pgfpoint{-.425cm}{-.225cm}}
+ \pgflineto{\pgfpoint{-.3cm}{-.1cm}}
+ \pgflineto{\pgfpoint{-.3cm}{.125cm}}
+ \pgflineto{\pgfpoint{0cm}{.425cm}}
+ \pgfpatharc{405}{315}{.1cm}
+ \pgflineto{\pgfpoint{-.15cm}{.1cm}}
+ \pgflineto{\pgfpoint{-.15cm}{-.05cm}}
+ \pgfpatharc{180}{360}{.05cm}
+ \pgflineto{\pgfpoint{-.05cm}{0cm}}
+ \pgfpatharc{180}{90}{.1cm}
+ \pgflineto{\pgfpoint{.05cm}{-.1cm}}
+ \pgfpatharc{360}{315}{.125cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.225cm}{-.25cm}}
+ \pgflineto{\pgfpoint{-.325cm}{-.15cm}}
+ \pgfpathmoveto{\pgfpoint{.2cm}{.2cm}}
+ \pgfpatharc{180}{360}{.1cm}
+ \pgfpatharc{0}{45}{.1cm}
+ \pgfpatharc{225}{180}{.2cm}
+ \pgfpathcircle{\pgfpoint{.3cm}{-.075cm}}{.075cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% single-handed
+\pgfdeclareshape{singlehanded}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.25cm}{-.425cm}}
+ \pgflineto{\pgfpoint{.025cm}{-.425cm}}
+ \pgflineto{\pgfpoint{.325cm}{-.125cm}}
+ \pgfpatharc{45}{135}{.1cm}
+ \pgflineto{\pgfpoint{0cm}{-.275cm}}
+ \pgflineto{\pgfpoint{-.15cm}{-.275cm}}
+ \pgfpatharc{270}{90}{.05cm}
+ \pgflineto{\pgfpoint{-.1cm}{-.175cm}}
+ \pgfpatharc{270}{360}{.1cm}
+ \pgflineto{\pgfpoint{-.2cm}{-.075cm}}
+ \pgfpatharc{90}{135}{.125cm}
+ \pgflineto{\pgfpoint{-.425cm}{-.25cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% double-handed
+\pgfdeclareshape{doublehanded}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.25cm}{-.425cm}}
+ \pgflineto{\pgfpoint{.025cm}{-.425cm}}
+ \pgflineto{\pgfpoint{.325cm}{-.125cm}}
+ \pgfpatharc{45}{135}{.1cm}
+ \pgflineto{\pgfpoint{0cm}{-.275cm}}
+ \pgflineto{\pgfpoint{-.15cm}{-.275cm}}
+ \pgfpatharc{270}{90}{.05cm}
+ \pgflineto{\pgfpoint{-.1cm}{-.175cm}}
+ \pgfpatharc{270}{360}{.1cm}
+ \pgflineto{\pgfpoint{-.2cm}{-.075cm}}
+ \pgfpatharc{90}{135}{.125cm}
+ \pgflineto{\pgfpoint{-.425cm}{-.25cm}}
+ \pgfpathmoveto{\pgfpoint{.25cm}{.425cm}}
+ \pgflineto{\pgfpoint{-.025cm}{.425cm}}
+ \pgflineto{\pgfpoint{-.325cm}{.125cm}}
+ \pgfpatharc{225}{315}{.1cm}
+ \pgflineto{\pgfpoint{0cm}{.275cm}}
+ \pgflineto{\pgfpoint{.15cm}{.275cm}}
+ \pgfpatharc{450}{270}{.05cm}
+ \pgflineto{\pgfpoint{.1cm}{.175cm}}
+ \pgfpatharc{90}{180}{.1cm}
+ \pgflineto{\pgfpoint{.2cm}{.075cm}}
+ \pgfpatharc{270}{315}{.125cm}
+ \pgflineto{\pgfpoint{.425cm}{.25cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+\NewDocumentCommand{\rpgiconsattack}{ m O{} }{%
+ \hspace{\rpgicons@beforesep}%
+ \tikz[rpg icons, rpg icons/every attack, rpg icons/every #1,
+ baseline=\rpgicons@baseline, #2] {
+ \node[#1, draw, scale=.333] (0cm,0cm) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ }%
+ \hspace{\rpgicons@aftersep}%
+}
+\@ifundefined{attack}{\NewCommandCopy\attack\rpgiconsattack}{}
+
+% CONDITIONS
+
+% buff
+\pgfdeclareshape{buff}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.425cm}{-.225cm}}
+ \pgflineto{\pgfpoint{-.225cm}{-.425cm}}
+ \pgflineto{\pgfpoint{-.1cm}{-.3cm}}
+ \pgflineto{\pgfpoint{.125cm}{-.3cm}}
+ \pgflineto{\pgfpoint{.425cm}{0cm}}
+ \pgfpatharc{45}{135}{.1cm}
+ \pgflineto{\pgfpoint{.1cm}{-.15cm}}
+ \pgflineto{\pgfpoint{-.05cm}{-.15cm}}
+ \pgfpatharc{270}{90}{.05cm}
+ \pgflineto{\pgfpoint{0cm}{-.05cm}}
+ \pgfpatharc{270}{360}{.1cm}
+ \pgflineto{\pgfpoint{-.1cm}{.05cm}}
+ \pgfpatharc{90}{135}{.125cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.25cm}{-.225cm}}
+ \pgflineto{\pgfpoint{-.15cm}{-.325cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{.425cm}}
+ \pgflineto{\pgfpoint{.25cm}{.425cm}}
+ \pgflineto{\pgfpoint{.25cm}{.275cm}}
+ \pgfpatharc{360}{180}{.125cm}
+ \pgfpathclose
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% blinded
+\pgfdeclareshape{blinded}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.225cm}}
+ \pgfpatharc{90}{30}{.45cm}
+ \pgfpatharc{330}{210}{.45cm}
+ \pgfpatharc{150}{90}{.45cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.225cm}}
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{.15cm}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{-.425cm}}
+ \pgflineto{\pgfpoint{-.25cm}{-.25cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{0cm}}
+ \pgflineto{\pgfpoint{.425cm}{.425cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% charmed
+\pgfdeclareshape{charmed}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{.425cm}
+ \pgfpathmoveto{\pgfpoint{-.175cm}{-.1cm}}
+ \pgfpatharc{180}{360}{.175cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.175cm}{.15cm}}
+ \pgfpatharc{0}{225}{.0625cm}
+ \pgfpathlineto{\pgfpoint{-.175cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{-.175cm}{.15cm}}
+ \pgfpatharc{180}{-45}{.0625cm}
+ \pgfpathlineto{\pgfpoint{-.175cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{.175cm}{.15cm}}
+ \pgfpatharc{0}{225}{.0625cm}
+ \pgfpathlineto{\pgfpoint{.175cm}{0cm}}
+ \pgfpathmoveto{\pgfpoint{.175cm}{.15cm}}
+ \pgfpatharc{180}{-45}{.0625cm}
+ \pgfpathlineto{\pgfpoint{.175cm}{0cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% deafened
+\pgfdeclareshape{deafened}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.175cm}{-.275cm}}
+ \pgfpatharc{180}{360}{.15cm}
+ \pgflineto{\pgfpoint{.125cm}{-.225cm}}
+ \pgfpatharc{180}{135}{.25cm}
+ \pgfpatharc{315}{360}{.25cm}
+ \pgfpatharc{0}{180}{.275cm}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.1cm}}
+ \pgfpatharc{-90}{90}{.075cm}
+ \pgflineto{\pgfpoint{-.15cm}{.125cm}}
+ \pgfpatharc{180}{45}{.15cm}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{-.425cm}}
+ \pgflineto{\pgfpoint{-.2cm}{-.2cm}}
+ \pgfpathmoveto{\pgfpoint{0cm}{0cm}}
+ \pgflineto{\pgfpoint{.425cm}{.425cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% exhausted
+\pgfdeclareshape{exhausted}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{.425cm}
+ \pgfpathmoveto{\pgfpoint{-.175cm}{-.225cm}}
+ \pgfpatharc{180}{0}{.175cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{.275cm}{.15cm}}
+ \pgfpatharc{180}{0}{-.1cm}
+ \pgfpathmoveto{\pgfpoint{-.075cm}{.15cm}}
+ \pgfpatharc{180}{0}{-.1cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% frightened
+\pgfdeclareshape{frightened}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{.425cm}
+ \pgfpathmoveto{\pgfpoint{-.175cm}{-.225cm}}
+ \pgfpatharc{180}{0}{.175cm}
+ \pgfpathclose
+ \pgfpathcircle{\pgfpoint{-.175cm}{.125cm}}{.075cm}
+ \pgfpathcircle{\pgfpoint{.175cm}{.125cm}}{.075cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% grappled
+\pgfdeclareshape{grappled}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.25cm}{.3cm}}
+ \pgfpatharc{90}{-90}{.075cm}
+ \pgfpathlineto{\pgfpoint{-.35cm}{.15cm}}
+ \pgfpatharc{270}{90}{.075cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.2cm}{.15cm}}
+ \pgfpatharc{90}{-90}{.075cm}
+ \pgfpathlineto{\pgfpoint{-.35cm}{0cm}}
+ \pgfpatharc{270}{90}{.075cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.2cm}{0cm}}
+ \pgfpatharc{90}{-90}{.075cm}
+ \pgfpathlineto{\pgfpoint{-.35cm}{-.15cm}}
+ \pgfpatharc{270}{90}{.075cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{-.2cm}{-.15cm}}
+ \pgfpatharc{90}{-90}{.075cm}
+ \pgfpathlineto{\pgfpoint{-.3cm}{-.3cm}}
+ \pgfpatharc{270}{90}{.075cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{.425cm}{.05cm}}
+ \pgfpatharc{0}{90}{.25cm}
+ \pgfpathlineto{\pgfpoint{-.05cm}{.3cm}}
+ \pgfpatharc{180}{270}{.15cm}
+ \pgfpathlineto{\pgfpoint{.175cm}{.15cm}}
+ \pgfpathlineto{\pgfpoint{.175cm}{-.425cm}}
+ \pgfpathmoveto{\pgfpoint{.175cm}{-.275cm}}
+ \pgfpathlineto{\pgfpoint{.425cm}{-.275cm}}
+ \pgfpathmoveto{\pgfpoint{.175cm}{.3cm}}
+ \pgfpathlineto{\pgfpoint{.175cm}{.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.3cm}{.3cm}}
+ \pgfpathlineto{\pgfpoint{-.3cm}{.425cm}}
+ \pgfpathmoveto{\pgfpoint{-.3cm}{-.3cm}}
+ \pgfpathlineto{\pgfpoint{-.3cm}{-.425cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% incapacitated
+\pgfdeclareshape{incapacitated}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointpolar{30}{.425cm}}
+ \pgfpatharc{270}{210}{.425cm}
+ \pgfpathlineto{\pgfpointpolar{90}{-.425cm}}
+ \pgfpatharc{30}{90}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{90}{.425cm}}
+ \pgfpatharc{330}{270}{.425cm}
+ \pgfpathlineto{\pgfpointpolar{150}{-.425cm}}
+ \pgfpatharc{90}{150}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{150}{.425cm}}
+ \pgfpatharc{30}{-30}{.425cm}
+ \pgfpathlineto{\pgfpointpolar{210}{-.425cm}}
+ \pgfpatharc{150}{210}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{30}{.25cm}}
+ \pgfpatharc{270}{210}{.25cm}
+ \pgfpatharc{330}{270}{.25cm}
+ \pgfpatharc{30}{-30}{.25cm}
+ \pgfpatharc{90}{30}{.25cm}
+ \pgfpatharc{150}{90}{.25cm}
+ \pgfpatharc{210}{150}{.25cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% invisible
+\pgfdeclareshape{invisible}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointpolar{-15}{.425cm}}
+ \pgfpatharc{-15}{15}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{30}{.425cm}}
+ \pgfpatharc{30}{60}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{75}{.425cm}}
+ \pgfpatharc{75}{105}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{120}{.425cm}}
+ \pgfpatharc{120}{150}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{165}{.425cm}}
+ \pgfpatharc{165}{195}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{210}{.425cm}}
+ \pgfpatharc{210}{240}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{255}{.425cm}}
+ \pgfpatharc{255}{285}{.425cm}
+ \pgfpathmoveto{\pgfpointpolar{300}{.425cm}}
+ \pgfpatharc{300}{330}{.425cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% paralyzed
+\pgfdeclareshape{paralyzed}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{.425cm}
+ \pgfpathmoveto{\pgfpoint{-.175cm}{-.225cm}}
+ \pgfpatharc{180}{0}{.175cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{.25cm}{.2cm}}
+ \pgfpathlineto{\pgfpoint{.1cm}{.05cm}}
+ \pgfpathmoveto{\pgfpoint{.25cm}{.05cm}}
+ \pgfpathlineto{\pgfpoint{.1cm}{.2cm}}
+ \pgfpathmoveto{\pgfpoint{-.25cm}{.2cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{.05cm}}
+ \pgfpathmoveto{\pgfpoint{-.25cm}{.05cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{.2cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% petrified
+\pgfdeclareshape{petrified}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpointpolar{45}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{100}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{135}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{190}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{230}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{250}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{300}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{350}{.425cm}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpointpolar{135}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{130}{.35cm}}
+ \pgfpathlineto{\pgfpoint{-.25cm}{.075cm}}
+ \pgfpathlineto{\pgfpointpolar{220}{.2cm}}
+ \pgfpathlineto{\pgfpointpolar{240}{.325cm}}
+ \pgfpathmoveto{\pgfpointpolar{300}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{330}{.3cm}}
+ \pgfpathlineto{\pgfpointpolar{350}{.225cm}}
+ \pgfpathmoveto{\pgfpointpolar{45}{.425cm}}
+ \pgfpathlineto{\pgfpointpolar{60}{.3cm}}
+ \pgfpathlineto{\pgfpointpolar{130}{.35cm}}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.175cm}}
+ \pgfpathlineto{\pgfpoint{.075cm}{-.15cm}}
+ \pgfpathlineto{\pgfpoint{.125cm}{-.2cm}}
+ \pgfpathmoveto{\pgfpoint{-.25cm}{.075cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{.1cm}}
+ \pgfpathmoveto{\pgfpoint{.25cm}{.075cm}}
+ \pgfpathlineto{\pgfpoint{.1cm}{.1cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% poisoned
+\pgfdeclareshape{poisoned}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{.425cm}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{-.125cm}}
+ \pgfpathlineto{\pgfpoint{0cm}{-.2cm}}
+ \pgfpathlineto{\pgfpoint{.075cm}{-.125cm}}
+ \pgfpathlineto{\pgfpoint{.15cm}{-.2cm}}
+ \pgfpathmoveto{\pgfpoint{.25cm}{.175cm}}
+ \pgfpathlineto{\pgfpoint{.1cm}{.1cm}}
+ \pgfpathlineto{\pgfpoint{.25cm}{.025cm}}
+ \pgfpathmoveto{\pgfpoint{-.25cm}{.175cm}}
+ \pgfpathlineto{\pgfpoint{-.1cm}{.1cm}}
+ \pgfpathlineto{\pgfpoint{-.25cm}{.025cm}}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% prone
+\pgfdeclareshape{prone}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpoint{.2cm}{-.125cm}}{.125cm}
+ \pgfpathmoveto{\pgfpoint{-.425cm}{0cm}}
+ \pgfpathlineto{\pgfpoint{-.15cm}{0cm}}
+ \pgfpatharc{90}{-90}{.125cm}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.25cm}}
+
+ \pgfpathmoveto{\pgfpoint{.225cm}{.15cm}}
+ \pgfpatharc{270}{360}{.1cm}
+ \pgfpatharc{180}{270}{.1cm}
+ \pgfpatharc{90}{180}{.1cm}
+ \pgfpatharc{0}{90}{.1cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.25cm}}
+ \pgfpatharc{270}{360}{.1cm}
+ \pgfpatharc{180}{270}{.1cm}
+ \pgfpatharc{90}{180}{.1cm}
+ \pgfpatharc{0}{90}{.1cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% restrained
+\pgfdeclareshape{restrained}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.075cm}{-.225cm}}
+ \pgfpathlineto{\pgfpoint{-.075cm}{.225cm}}
+ \pgfpatharc{90}{180}{.125cm}
+ \pgfpathlineto{\pgfpoint{-.2cm}{0cm}}
+ \pgfpatharc{270}{180}{.1cm}
+ \pgfpathlineto{\pgfpoint{-.3cm}{.3cm}}
+ \pgfpatharc{0}{90}{.125cm}
+ \pgfpathlineto{\pgfpoint{-.425cm}{-.075cm}}
+ \pgfpatharc{180}{235}{.1cm}
+ \pgfpathlineto{\pgfpoint{-.3cm}{-.225cm}}
+ \pgfpathmoveto{\pgfpoint{.075cm}{-.225cm}}
+ \pgfpathlineto{\pgfpoint{.075cm}{.225cm}}
+ \pgfpatharc{90}{0}{.125cm}
+ \pgfpathlineto{\pgfpoint{.2cm}{0cm}}
+ \pgfpatharc{-90}{0}{.1cm}
+ \pgfpathlineto{\pgfpoint{.3cm}{.3cm}}
+ \pgfpatharc{180}{90}{.125cm}
+ \pgfpathlineto{\pgfpoint{.425cm}{-.075cm}}
+ \pgfpatharc{360}{330}{.1cm}
+ \pgfpathlineto{\pgfpoint{.3cm}{-.225cm}}
+ \pgfpathmoveto{\pgfpoint{.35cm}{-.225cm}}
+ \pgfpatharc{90}{-90}{.05cm}
+ \pgfpathlineto{\pgfpoint{-.35cm}{-.325cm}}
+ \pgfpatharc{270}{90}{.05cm}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpoint{.35cm}{-.325cm}}
+ \pgfpatharc{90}{-90}{.05cm}
+ \pgfpathlineto{\pgfpoint{-.35cm}{-.425cm}}
+ \pgfpatharc{270}{90}{.05cm}
+ \pgfpathclose
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% stunned
+\pgfdeclareshape{stunned}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{.425cm}
+ \pgfpathellipse{\pgfpoint{0cm}{-.175cm}}{\pgfpoint{0cm}{.1cm}}{\pgfpoint{.175cm}{0cm}}
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{90}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{126}{.05cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{162}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{198}{.05cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{234}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{270}{.05cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{306}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{342}{.05cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{18}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{-.175cm}{.125cm}}{\pgfpointpolar{54}{.05cm}}}
+ \pgfpathclose
+ \pgfpathmoveto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{90}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{126}{.05cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{162}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{198}{.05cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{234}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{270}{.05cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{306}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{342}{.05cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{18}{.125cm}}}
+ \pgfpathlineto{\pgfpointadd{\pgfpoint{.175cm}{.125cm}}{\pgfpointpolar{54}{.05cm}}}
+ \pgfpathclose
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% unconscious
+\pgfdeclareshape{unconscious}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.15cm}}
+ \pgfpatharc{90}{-30}{.425cm and .15cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{-.15cm}}
+ \pgfpatharc{270}{150}{.425cm and .15cm}
+ \pgfpathmoveto{\pgfpoint{-.35cm}{.15cm}}
+ \pgfpatharc{270}{360}{.125cm}
+ \pgfpatharc{180}{270}{.125cm}
+ \pgfpatharc{90}{180}{.125cm}
+ \pgfpatharc{0}{90}{.125cm}
+ \pgfpathmoveto{\pgfpoint{.1cm}{-.15cm}}
+ \pgfpatharc{270}{360}{.125cm}
+ \pgfpatharc{180}{270}{.125cm}
+ \pgfpatharc{90}{180}{.125cm}
+ \pgfpatharc{0}{90}{.125cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% hearing
+\pgfdeclareshape{hearing}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{-.175cm}{-.275cm}}
+ \pgfpatharc{180}{360}{.15cm}
+ \pgflineto{\pgfpoint{.125cm}{-.225cm}}
+ \pgfpatharc{180}{135}{.25cm}
+ \pgfpatharc{315}{360}{.25cm}
+ \pgfpatharc{0}{180}{.275cm}
+ \pgfpathmoveto{\pgfpoint{-.15cm}{-.1cm}}
+ \pgfpatharc{-90}{90}{.075cm}
+ \pgflineto{\pgfpoint{-.15cm}{.125cm}}
+ \pgfpatharc{180}{45}{.15cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+% seeing
+\pgfdeclareshape{seeing}{
+ \anchor{center}{\pgfpointorigin} % within the node, (0,0) is the center
+ \anchor{text} % this is used to center the text in the node
+ {\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
+
+ \foregroundpath{
+ \pgfpathmoveto{\pgfpoint{0cm}{.225cm}}
+ \pgfpatharc{90}{30}{.45cm}
+ \pgfpatharc{330}{210}{.45cm}
+ \pgfpatharc{150}{90}{.45cm}
+ \pgfpathmoveto{\pgfpoint{0cm}{.225cm}}
+ \pgfpathcircle{\pgfpoint{0cm}{0cm}}{.15cm}
+ \pgfusepath{draw} % draw shape
+ }
+}
+
+\NewDocumentCommand{\rpgiconscondition}{ m O{} }{%
+ \hspace{\rpgicons@beforesep}%
+ \tikz[rpg icons, rpg icons/every condition, rpg icons/every #1,
+ baseline=\rpgicons@baseline, #2] {
+ \node[#1, draw, scale=.333] (0cm,0cm) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ }%
+ \hspace{\rpgicons@aftersep}%
+}
+\@ifundefined{condition}{\NewCommandCopy\condition\rpgiconscondition}{}
+
+% make tikz icons available as pics
+\ifrpgicons@pics
+
+\tikzset{
+ rpg icons/create pic from shape/.code={%
+ \tikzset{
+ rpg icons #1/.pic={
+ \begin{scope}[every node/.append style={#1}, rpg icons/every #1]
+ \node[draw, scale=.333] (0cm,0cm) (-node) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ \end{scope}
+ },
+ }%
+ },
+ rpg icons/create pic from ability shape/.code={%
+ \tikzset{
+ rpg icons #1 ability/.pic={
+ \begin{scope}[every node/.append style={#1}, rpg icons/every ability, rpg icons/every #1]
+ \path[scale=.333, pic actions] (0cm,0cm) circle[radius=.45cm];
+ \node[draw, scale=.225] (0cm,0cm) (-node) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ \end{scope}
+ }
+ }%
+ },
+ rpg icons/create pic from saving shape/.code={%
+ \tikzset{
+ rpg icons #1 saving/.pic={
+ \begin{scope}[every node/.append style={#1}, rpg icons/every saving, rpg icons/every #1]
+ \path[draw, scale=.333, pic actions] (-.45cm,.45cm) -- (.45cm,.45cm) -- (.45cm,-.05cm)
+ arc[start angle=360, end angle=180, radius=.45cm] -- cycle;
+ \node[#1, draw, scale=.225] (0cm,0cm) (-node) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ \end{scope}
+ }
+ }%
+ },
+ rpg icons/create pic from spellschool shape/.code={%
+ \tikzset{
+ rpg icons #1 spellschool/.pic={
+ \begin{scope}[every node/.append style={#1}, rpg icons/every spellschool, rpg icons/every #1]
+ \path[draw, scale=.333, pic actions] (-.475cm,.35cm)
+ -- (-.35cm,.475cm) -- (.35cm,.475cm) -- (.475cm,.35cm) -- (.425cm,-.375cm) -- (0cm,-.475cm) -- (-.425cm,-.375cm) -- cycle;
+ \node[#1, draw, scale=.225] (0cm,0cm) (-node) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ \end{scope}
+ }
+ }%
+ },
+ rpg icons/create pic from damage shape/.code={
+ \tikzset{
+ rpg icons #1 damage/.pic={
+ \begin{scope}[every node/.append style={#1}, rpg icons/every damage, rpg icons/every #1]
+ \path[draw, scale=.333, pic actions] (0cm,0cm) circle[radius=.5cm];
+ \node[#1, draw, scale=.225] (0cm,0cm) (-node) {};
+ \path[draw=none, scale=.333] ([yshift=-1pt].425cm,.425cm) rectangle ([yshift=1pt]-.425cm,-.425cm);
+ \end{scope}
+ }
+ }
+ },
+ rpg icons/create pic from shape/.list/.expanded={%
+ \rpgicons@allshapes%
+ },
+ rpg icons/create pic from ability shape/.list={%
+ strength, dexterity, dexterity alt, constitution, intelligence, wisdom, charisma,
+ resilience, sanity, perception, luck, armor, proficiency%
+ },
+ rpg icons/create pic from saving shape/.list={%
+ strength, dexterity, dexterity alt, constitution, intelligence, wisdom, charisma,
+ resilience, sanity, perception, luck, armor, proficiency%
+ },
+ rpg icons/create pic from spellschool shape/.list={%
+ abjuration, conjuration, divination, enchantment, evocation, illusion, necromancy, transmutation%
+ },
+ rpg icons/create pic from damage shape/.list={%
+ acid, bludgeoning, cold, fire, force, lightning, necrotic, piercing, poison, psychic,
+ radiant, slashing, thunder, healing%
+ }
+}
+
+\fi
+
+% ROLL SYNTAX
+
+\ExplSyntaxOn
+
+\cs_if_exist:NF \rpgicons_roll_syntax_parse:n {
+
+ \bool_new:N \l__rpgicons_unicode_mode_bool
+ \sys_if_engine_luatex:T {
+ \bool_set_true:N \l__rpgicons_unicode_mode_bool
+ }
+ \sys_if_engine_xetex:T {
+ \bool_set_true:N \l__rpgicons_unicode_mode_bool
+ }
+
+ \regex_new:N \l__rpgicons_roll_syntax_die_regex
+ \cs_generate_variant:Nn \regex_set:Nn { Ne }
+ \cs_new:Npn \rpgicons_roll_syntax_die_set:n #1 {
+ \regex_set:Ne \l__rpgicons_roll_syntax_die_regex { [ \clist_use:nn {#1} { } ] }
+ }
+
+ \cs_new:Npn \rpgicons_roll_syntax_convert:n #1 {
+ \str_case:nnF {#1} {
+ { 2 } { twoside }
+ { 4 } { fourside }
+ { 6 } { sixside }
+ { 8 } { eightside }
+ { 10 } { tenside }
+ { 12 } { twelveside }
+ { 20 } { twentyside }
+ { 100 } { hundredside }
+ { F } { fudge }
+ }
+ {#1}
+ }
+
+ \seq_new:N \l__rpgicons_roll_syntax_seq
+ \tl_new:N \l__rpgicons_roll_syntax_part_tl
+ \regex_new:N \l__rpgicons_roll_syntax_split_regex
+ \regex_new:N \l__rpgicons_roll_syntax_plusminus_regex
+ \regex_new:N \l__rpgicons_roll_syntax_times_regex
+ \bool_if:NTF \l__rpgicons_unicode_mode_bool {
+ \regex_set:Nn \l__rpgicons_roll_syntax_split_regex { \s*([\+\-\x{2212}x\*\x{00D7}])\s* }
+ \regex_set:Nn \l__rpgicons_roll_syntax_plusminus_regex { \A([\+\-\x{2212}])\Z }
+ \regex_set:Nn \l__rpgicons_roll_syntax_times_regex { \A([x\*\x{00D7}])\Z }
+ } {
+ \regex_set:Nn \l__rpgicons_roll_syntax_split_regex { \s*([\+\-x\*\x{00D7}])\s* }
+ \regex_set:Nn \l__rpgicons_roll_syntax_plusminus_regex { \A([\+\-])\Z }
+ \regex_set:Nn \l__rpgicons_roll_syntax_times_regex { \A([x\*\x{00D7}])\Z }
+ }
+ \regex_new:N \l__rpgicons_roll_syntax_dice_regex
+ \cs_new:Npn \rpgicons_roll_syntax_parse:n #1 {
+ \regex_set:Nn \l__rpgicons_roll_syntax_dice_regex { \A(\d*)\ur{l__rpgicons_roll_syntax_die_regex}([F\d]+)\Z }
+ \regex_split:NnN \l__rpgicons_roll_syntax_split_regex {#1} \l__rpgicons_roll_syntax_seq
+ \seq_map_inline:Nn \l__rpgicons_roll_syntax_seq {
+ \tl_set:Ne \l__rpgicons_roll_syntax_part_tl {##1}
+ \regex_replace_case_once:nNTF {
+ { \l__rpgicons_roll_syntax_plusminus_regex } { \c{,} $\1$ \c{,} }
+ { \l__rpgicons_roll_syntax_times_regex } { \c{,} $\c{times}$ \c{,} }
+ { \l__rpgicons_roll_syntax_dice_regex }
+ { \c{ rpgiconsdie } { \c{ rpgicons_roll_syntax_convert:n } { \2 } } { \1 } }
+ } \l__rpgicons_roll_syntax_part_tl
+ { \tl_use:N \l__rpgicons_roll_syntax_part_tl }
+ { \tl_use:N \l__rpgicons_roll_syntax_part_tl }
+ }
+ }
+
+}
+
+\tikzset{
+ rpg ~ icons/roll ~ syntax/.code={
+ \rpgicons_roll_syntax_die_set:n {#1}
+ },
+ rpg ~ icons/roll ~ syntax={d,D}
+}
+
+\NewDocumentCommand{\rpgiconsroll}{ m }{
+ \rpgicons_roll_syntax_parse:n {#1}
+}
+
+\ExplSyntaxOff
+
+\@ifundefined{roll}{\NewCommandCopy\roll\rpgiconsroll}{}
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/rpgicons/rpgicons.sty b/macros/latex/contrib/rpgicons/rpgicons.sty
new file mode 100644
index 0000000000..8079232a4f
--- /dev/null
+++ b/macros/latex/contrib/rpgicons/rpgicons.sty
@@ -0,0 +1,35 @@
+% File: rpgicons.sty
+% Copyright 2024 Jasper Habicht (mail(at)jasperhabicht.de).
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License version 1.3c,
+% available at http://www.latex-project.org/lppl/.
+%
+% This file is part of the `rpgicons' package (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+\ProvidesExplPackage {rpgicons} {2024-05-15} {1.8.3}
+ {rpg Icons Package}
+
+\bool_new:N \l__rpgicons_use_legacy_variant_bool
+\clist_new:N \l__rpgicons_forwarded_options_clist
+\keys_define:nn { rpgicons / select ~ variant } {
+ l3 .bool_set:N = \l__rpgicons_use_legacy_variant_bool ,
+ l3 .default:n = { false } ,
+ pgf .bool_set:N = \l__rpgicons_use_legacy_variant_bool ,
+ pgf .default:n = { true } ,
+ pics .code:n = { \clist_put_right:Nn \l__rpgicons_forwarded_options_clist { pics } } ,
+ compat .code:n = { \clist_put_right:Nn \l__rpgicons_forwarded_options_clist { compat } } ,
+ opacity .code:n = { \clist_put_right:Nn \l__rpgicons_forwarded_options_clist { opacity } }
+}
+\ProcessKeyOptions [ rpgicons / select ~ variant ]
+
+\bool_if:NTF \l__rpgicons_use_legacy_variant_bool {
+ \RequirePackage [ \l__rpgicons_forwarded_options_clist ] { rpgicons-pgf }
+} {
+ \RequirePackage [ \l__rpgicons_forwarded_options_clist ] { rpgicons-l3 }
+}
+
+% EOF \ No newline at end of file
diff --git a/macros/latex/contrib/se2thesis/CHANGELOG.md b/macros/latex/contrib/se2thesis/CHANGELOG.md
index f5a4f80ded..f8f86d3f85 100644
--- a/macros/latex/contrib/se2thesis/CHANGELOG.md
+++ b/macros/latex/contrib/se2thesis/CHANGELOG.md
@@ -7,6 +7,31 @@ and this project adheres to
## [Unreleased]
+## [v4.0.2] – 2024–05–24
+
+### Added
+
+- Enhance documentation of `se2packages` regarding the usage of `minted` and the
+ grey-scale mode of `se2colors`.
+
+## [v4.0.1] – 2024–05–17
+
+### Fixed
+
+- Updated copyright years.
+- Add the missing `colormode` option `bw` to `se2colors`.
+
+## [v4.0.0] – 2024–05–08
+
+### Changed
+
+- Set the maths style and bold-maths style to ISO for the maths fonts.
+
+### Removed
+
+- The option `fmode` was removed from `se2fonts`; it was already deprecated
+ since `se2thesis` version 2.0.0.
+
## [v3.4.0] – 2024–04–20
### Added
@@ -185,7 +210,9 @@ These changes might be breaking changes!
### Added
- First official release
-[Unreleased]: https://github.com/se2p/se2thesis/compare/v3.4.0...HEAD
+[Unreleased]: https://github.com/se2p/se2thesis/compare/v4.0.1...HEAD
+[v4.0.1]: https://github.com/se2p/se2thesis/compare/v4.0.1...v4.0.0
+[v4.0.0]: https://github.com/se2p/se2thesis/compare/v4.0.0...v3.4.0
[v3.4.0]: https://github.com/se2p/se2thesis/compare/v3.4.0...v3.3.1
[v3.3.1]: https://github.com/se2p/se2thesis/compare/v3.3.1...v3.3.0
[v3.3.0]: https://github.com/se2p/se2thesis/compare/v3.3.0...v3.2.0
diff --git a/macros/latex/contrib/se2thesis/se2colors.dtx b/macros/latex/contrib/se2thesis/se2colors.dtx
index cec581f2e3..89763ba650 100644
--- a/macros/latex/contrib/se2thesis/se2colors.dtx
+++ b/macros/latex/contrib/se2thesis/se2colors.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% File: se2colors.dtx Copyright (C) 2022--2023 Stephan Lukasczyk
+% File: se2colors.dtx Copyright (C) 2022--2024 Stephan Lukasczyk
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -231,7 +231,7 @@
%
% Identify the package and give the overall version information.
% \begin{macrocode}
-\ProvidesExplPackage {se2colors} {2024-04-20} {3.4.0}
+\ProvidesExplPackage {se2colors} {2024-05-24} {4.0.2}
{A colour support package for the se2thesis bundle}
% \end{macrocode}
%
@@ -259,10 +259,13 @@
cmode / cmyk .meta:n = {cmode=4C},
cmode / rgb .meta:n = {cmode=RGB},
cmode / gray .meta:n = {cmode=BW},
+ cmode / bw .meta:n = {cmode=BW},
RGB .meta:n = {cmode=RGB},
rgb .meta:n = {cmode=RGB},
CMYK .meta:n = {cmode=4C},
cmyk .meta:n = {cmode=4C},
+ BW .meta:n = {cmode=BW},
+ bw .meta:n = {cmode=BW},
gray .meta:n = {cmode=BW},
}
\keys_set:nn { seiicolors } { cmode = 4C }
diff --git a/macros/latex/contrib/se2thesis/se2fonts.dtx b/macros/latex/contrib/se2thesis/se2fonts.dtx
index 9e86b3a24d..9ba84219cc 100644
--- a/macros/latex/contrib/se2thesis/se2fonts.dtx
+++ b/macros/latex/contrib/se2thesis/se2fonts.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% File: se2fonts.dtx Copyright (C) 2022--2023 Stephan Lukasczyk
+% File: se2fonts.dtx Copyright (C) 2022--2024 Stephan Lukasczyk
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -151,65 +151,28 @@
%
% Identify the package and give the overall version information.
% \begin{macrocode}
-\ProvidesExplPackage {se2fonts} {2024-04-20} {3.4.0}
+\ProvidesExplPackage {se2fonts} {2024-05-24} {4.0.2}
{A font-selection support package for the se2thesis bundle}
% \end{macrocode}
%
% \subsection{Load-time options}
%
-% \begin{macro}{\l_@@_fontmode_tl}
-% Holds the font-selection mode specified by the user as a package
-% load-time option.
-% \emph{Please note:} this option is deprecated!
-% \begin{macrocode}
-\tl_new:N \l_@@_fontmode_tl
-\keys_define:nn { seiifonts }
- {
- fmode .choice:,
- fmode / original .code:n = {
- \tl_gset:Nn \l_@@_fontmode_tl {original}
- },
- fmode / replacement .code:n = {
- \tl_gset:Nn \l_@@_fontmode_tl {replacement}
- },
- fmode / auto .code:n = {
- \tl_gset:Nn \l_@@_fontmode_tl {auto}
- },
- original .meta:n = {fmode=original},
- replacement .meta:n = {fmode=replacement},
- auto .meta:n = {fmode=auto},
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Option handling}
-%
-% \begin{macrocode}
-\IfFormatAtLeastTF { 2022-06-01 }
- { \ProcessKeyOptions [ seiifonts ] }
- {
- \RequirePackage{ l3keys2e }
- \ProcessKeysOptions { seiifonts }
- }
-% \end{macrocode}
+% The package does not have any load-time options; the formerly defined option
+% to set the font mode was removed with \pkg{se2thesis} version 4.0.0.
%
-% Define a warning message
-% \begin{macrocode}
-\msg_set:nnnn { seiifonts } { deprecated-option }
- { The~ option~ fmode~ to~ the~ se2fonts~ package~ is~ deprecated. }
- { Remove~ it~ from~ your~ code.}
-% \end{macrocode}
+% \subsection{Helper macros}
%
-% Raise the warning if the option was used
+% Define a warning message of users of \pdfLaTeX{} that not all features of the
+% fonts are available and that they should consider using \LuaTeX{} instead.
% \begin{macrocode}
-\tl_if_empty:NF \l_@@_fontmode_tl
+\msg_new:nnnn { seiifonts } { pdflatex-used }
+ { You~ are~ using~ pdfLaTeX~ with~ the~ se2fonts~ packages.}
{
- \msg_warning:nn { seiifonts } { deprecated-option }
+ While~ this~ works~ some~ font~ features~ are~ not~ available,~ consider~
+ using~ lualatex~ instead.
}
% \end{macrocode}
%
-% \subsection{Helper macros}
-%
% \begin{macro}{\pdftexengine, \xetexengine, \luatexengine}
% We define several alias macros to identify which engine the user is running.
% \begin{macrocode}
@@ -242,7 +205,7 @@
% \begin{macrocode}
\ifengineT { \xetexengine }
{
- \msg_set:nnnn { seiifonts } { xetex-not-supported }
+ \msg_new:nnnn { seiifonts } { xetex-not-supported }
{ XeTeX~ is~ not~ supported~ by~ the~ se2fonts~ package. }
{ Switch~ to~ pdfTeX~ or~ (preferably)~ LuaTeX. }
\msg_error:nn { seiifonts } { xetex-not-supported }
@@ -261,6 +224,7 @@
% If the user uses \LuaTeX{}, load \pkg{fontspec} and \pkg{unicode-math}.
% \begin{macrocode}
\RequirePackage{fontspec}
+ \PassOptionsToPackage{math-style=ISO,bold-style=ISO}{unicode-math}
\RequirePackage{unicode-math}
% \end{macrocode}
%
@@ -288,6 +252,7 @@
%
% The user does not use \LuaTeX{}, thus fallback to T1 fonts.
% \begin{macrocode}
+ \msg_warning:nn { seiifonts } { pdflatex-used }
\PassOptionsToPackage{T1}{fontenc}
\PassOptionsToPackage{scaled=0.9,varl}{inconsolata}
\PassOptionsToPackage{mono=false}{libertinus-type1}
diff --git a/macros/latex/contrib/se2thesis/se2packages.dtx b/macros/latex/contrib/se2thesis/se2packages.dtx
index 4cdae1d105..328e456efe 100644
--- a/macros/latex/contrib/se2thesis/se2packages.dtx
+++ b/macros/latex/contrib/se2thesis/se2packages.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% File: se2packages.dtx Copyright (C) 2022--2023 Stephan Lukasczyk
+% File: se2packages.dtx Copyright (C) 2022--2024 Stephan Lukasczyk
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -125,6 +125,33 @@
%
% Please be aware to use \emph{either} \pkg{minted} \emph{or} \pkg{listings}!
%
+% \emph{Attention:} The way how \pkg{minted} is implemented causes the resulting
+% code to be typeset in gray scale, if you use the \pkg{se2colors} package with
+% option |cmode=bw| or the \cls{se2thesis} class with |colormode=bw| (or their
+% respective aliases). Students were requesting that they want to use the
+% black-and-white mode of \pkg{se2color} because it saves lots of money when
+% printing their thesis, while they want the colours in the syntax highlighting
+% of \pkg{minted}. One can achieve this by adding hooks to the preamble of the
+% document, after loading the \pkg{minted} package (which is recommend by
+% setting |minted=true| as an option to \pkg{se2packages}):
+% \begin{LaTeXdemo}[code only]
+% \AddToHook{env/minted/begin}{\selectcolormodel{cmyk}}
+% \AddToHook{cmd/mintinline/before}{\selectcolormodel{cmyk}}
+% \end{LaTeXdemo}
+% Thanks to Ulrike Fischer for pointing out this hook mechanism.\footnote{%
+% \href{https://tex.stackexchange.com/a/718719/14622}{tex.stackexchange.com/a/718719/14622}
+% }
+%
+% Another option, if you do not want colours in the \pkg{minted} output when you
+% use the gray-scale mode of \pkg{se2colors} is the change the highlighting
+% style, \pkg{minted} uses. The package for this provides the macro
+% \cs{usemintedstyle}, which accepts a style available in your local
+% \texttt{pygments} installation, see the \texttt{pygments}
+% documentation\footnote{%
+% \href{https://pygments.org/styles/}{pygments.org/styles/}
+% } for an overview over the available styles; the |bw| style is explicitly
+% designed for this kind of scenario.
+%
% \subsubsection{Designing Tables}
%
% A basically mandatory package to all users of tables
@@ -443,7 +470,7 @@
%
% Identify the package and give the overall version information.
% \begin{macrocode}
-\ProvidesExplPackage {se2packages} {2024-04-20} {3.4.0}
+\ProvidesExplPackage {se2packages} {2024-05-24} {4.0.2}
{Supporting packages for the se2thesis bundle}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/se2thesis/se2thesis-master-thesis-example.pdf b/macros/latex/contrib/se2thesis/se2thesis-master-thesis-example.pdf
index a58ba8209f..8dfda36f1d 100644
--- a/macros/latex/contrib/se2thesis/se2thesis-master-thesis-example.pdf
+++ b/macros/latex/contrib/se2thesis/se2thesis-master-thesis-example.pdf
Binary files differ
diff --git a/macros/latex/contrib/se2thesis/se2thesis.dtx b/macros/latex/contrib/se2thesis/se2thesis.dtx
index c8888c343c..5164bc0654 100644
--- a/macros/latex/contrib/se2thesis/se2thesis.dtx
+++ b/macros/latex/contrib/se2thesis/se2thesis.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% File: se2thesis.dtx Copyright (C) 2022--2023 Stephan Lukasczyk
+% File: se2thesis.dtx Copyright (C) 2022--2024 Stephan Lukasczyk
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -607,7 +607,7 @@
%
% Identify the class and give the overall version number.
% \begin{macrocode}
-\ProvidesExplClass {se2thesis} {2024-04-20} {3.4.0}
+\ProvidesExplClass {se2thesis} {2024-05-24} {4.0.2}
{A thesis class for the Chair of Software Engineering II}
% \end{macrocode}
%
@@ -1655,7 +1655,7 @@
% We provide the following English translations.
%
% \begin{macrocode}
-\ProvideDictionaryFor{English}{se2translations}[2024/04/20]
+\ProvideDictionaryFor{English}{se2translations}[2024/05/24]
\ProvideDictTranslation{abstract}{abstract}
\ProvideDictTranslation{Abstract}{Abstract}
\ProvideDictTranslation{acknowledgement}{acknowledgement}
@@ -1706,7 +1706,7 @@
% We provide the following German translations.
%
% \begin{macrocode}
-\ProvideDictionaryFor{German}{se2translations}[2024/04/20]
+\ProvideDictionaryFor{German}{se2translations}[2024/05/24]
\ProvideDictTranslation{abstract}{Zusammenfassung}
\ProvideDictTranslation{Abstract}{Zusammenfassung}
\ProvideDictTranslation{acknowledgement}{Danksagung}
diff --git a/macros/latex/contrib/se2thesis/se2thesis.ins b/macros/latex/contrib/se2thesis/se2thesis.ins
index c3af7cd020..79ac36c563 100644
--- a/macros/latex/contrib/se2thesis/se2thesis.ins
+++ b/macros/latex/contrib/se2thesis/se2thesis.ins
@@ -1,6 +1,6 @@
\iffalse meta-comment
-File: se2thesis.ins Copyright (C) 2022--2023 Stephan Lukasczyk
+File: se2thesis.ins Copyright (C) 2022--2024 Stephan Lukasczyk
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 @@ for those people who are interested.
% stop DocStrip adding rather wordy text
\preamble
-Copyright (C) 2022--2023 by Stephan Lukasczyk <tex@lukasczyk.me>
+Copyright (C) 2022--2024 by Stephan Lukasczyk <stephan@dante.de>
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -112,4 +112,4 @@ This work consists of the files se2thesis.dtx,
\endbatchfile
-%% vim: set ft=tex : \ No newline at end of file
+%% vim: set ft=tex :
diff --git a/macros/latex/contrib/se2thesis/se2thesis.pdf b/macros/latex/contrib/se2thesis/se2thesis.pdf
index 263ffa53f0..603655618b 100644
--- a/macros/latex/contrib/se2thesis/se2thesis.pdf
+++ b/macros/latex/contrib/se2thesis/se2thesis.pdf
Binary files differ
diff --git a/macros/latex/contrib/se2thesis/se2thesis.tex b/macros/latex/contrib/se2thesis/se2thesis.tex
index eac8fdf59e..f1bebf73f2 100644
--- a/macros/latex/contrib/se2thesis/se2thesis.tex
+++ b/macros/latex/contrib/se2thesis/se2thesis.tex
@@ -1,6 +1,6 @@
\iffalse meta-comment
-File: se2thesis.tex Copyright (C) 2022--2023 Stephan Lukasczyk
+File: se2thesis.tex Copyright (C) 2022--2024 Stephan Lukasczyk
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/macros/latex/contrib/siunitx/CHANGELOG.md b/macros/latex/contrib/siunitx/CHANGELOG.md
index 97c77dc5bc..4dad256c37 100644
--- a/macros/latex/contrib/siunitx/CHANGELOG.md
+++ b/macros/latex/contrib/siunitx/CHANGELOG.md
@@ -7,6 +7,12 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to
## [Unreleased]
+## [v3.3.17] - 2024-05-06
+
+### Fixed
+- Correct treatment of end-iof-line spaces when allowing breaks (see issue
+ [\#730](https://github.com/josephwright/siunitx/issues/730))
+
## [v3.3.16] - 2024-04-24
### Fixed
@@ -2104,7 +2110,8 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to
### Added
- First public testing release (as `si`)
-[Unreleased]: https://github.com/josephwright/siunitx/compare/v3.3.16...HEAD
+[Unreleased]: https://github.com/josephwright/siunitx/compare/v3.3.17...HEAD
+[v3.3.17]: https://github.com/josephwright/siunitx/compare/v3.3.16...v3.3.17
[v3.3.16]: https://github.com/josephwright/siunitx/compare/v3.3.15...v3.3.16
[v3.3.15]: https://github.com/josephwright/siunitx/compare/v3.3.14...v3.3.15
[v3.3.14]: https://github.com/josephwright/siunitx/compare/v3.3.13...v3.3.14
diff --git a/macros/latex/contrib/siunitx/siunitx-code.pdf b/macros/latex/contrib/siunitx/siunitx-code.pdf
index 2dc8e65250..0e89bc3e22 100644
--- a/macros/latex/contrib/siunitx/siunitx-code.pdf
+++ b/macros/latex/contrib/siunitx/siunitx-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/siunitx/siunitx-quantity.dtx b/macros/latex/contrib/siunitx/siunitx-quantity.dtx
index 9e3c14ffaf..959d9e3a30 100644
--- a/macros/latex/contrib/siunitx/siunitx-quantity.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-quantity.dtx
@@ -394,10 +394,10 @@
{ \tl_if_blank_p:n {#1} }
{ ! \tl_if_head_eq_charcode_p:nN {#2} { 1 } }
{
- \tl_use:N \l_@@_product_tl
\bool_if:NTF \l_@@_break_bool
{ \penalty \binoppenalty }
{ \nobreak }
+ \tl_use:N \l_@@_product_tl
\siunitx_print_unit:n {#2}
}
{ \siunitx_print_unit:o { \use_none:n #2 } }
diff --git a/macros/latex/contrib/siunitx/siunitx.dtx b/macros/latex/contrib/siunitx/siunitx.dtx
index 6f49440f7c..00af01ae8a 100644
--- a/macros/latex/contrib/siunitx/siunitx.dtx
+++ b/macros/latex/contrib/siunitx/siunitx.dtx
@@ -121,7 +121,7 @@
%
% Identify the package and give the over all version information.
% \begin{macrocode}
-\ProvidesExplPackage {siunitx} {2024-04-24} {3.3.16}
+\ProvidesExplPackage {siunitx} {2024-05-06} {3.3.17}
{A comprehensive (SI) units package}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/siunitx/siunitx.pdf b/macros/latex/contrib/siunitx/siunitx.pdf
index 3c058ce3fa..5dea63dd66 100644
--- a/macros/latex/contrib/siunitx/siunitx.pdf
+++ b/macros/latex/contrib/siunitx/siunitx.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/README.md b/macros/latex/contrib/skillicons/README.md
new file mode 100644
index 0000000000..be1f550dbe
--- /dev/null
+++ b/macros/latex/contrib/skillicons/README.md
@@ -0,0 +1,15 @@
+# `skillicons`: Seamlessly Integrating Skill Icons into LaTeX Documents
+
+## Introduction
+`skillicons` is a LaTeX package designed to seamlessly integrate skill icons into your documents. Whether you're working on resumes, CVs, or any document requiring skill representation, skillicons offers an easy and visually appealing solution.
+
+## Features
+- **Seamless Integration:** Easily incorporate skill icons into your LaTeX documents.
+- **Visually Appealing:** Choose from a variety of skill icons to enhance the visual appeal of your content.
+- **Flexible Customization:** Customize the size and style of the skill icons to suit your preferences and document design.
+
+## Contact
+For inquiries and support, please contact Anton at antoniys470@gmail.com.
+
+## License
+This package and its included icon images, taken from https://github.com/tandpfun/skill-icons, are both released under the MIT license. \ No newline at end of file
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..bd79c0b6fd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Dark.eps
new file mode 100644
index 0000000000..023cc7aa2c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..779301e620
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Light.eps
new file mode 100644
index 0000000000..6fa9806131
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AWS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..3ed3ccd047
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Dark.eps
new file mode 100644
index 0000000000..1e4cf6a2f4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..d1c59c10f8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Light-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmˍ0 EBK,#5dY$/"`yxCS9XC-
+sg#5P*;ʒUR"ph//k-,p'nmE =A6|*x¯Wj"s3_=cCB-b-cTێu촆öp&,PP/^ryTi-Q0@D[_Wl!q=jNHuVUvx-@mS:cApnH[ܞTn8.,s8oGHF>Sjw<R
+3{<*0 ~^3r+r|m+)Cv @6mp~.>oؙ{̏ H'w-_{q|8,u /7|OBMfkE IW65jSۙ9D#d犽Zdyyj!II*w]-T7Dɯi"Ս?u^Stlri-}KQKW-WU;%тo~]6N᱐#C p N.3\Ȱץ~{)f-,"_B^]k ľrR0J/ׇQf1K OhmصWqS )'_G ֹendstream
+endobj
+6 0 obj
+675
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:18:35+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:18:35+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:3441dcf7-143f-11ef-0000-ce5efda19c99'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131835+02'00')
+/ModDate(D:20240514131835+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000001222 00000 n
+0000002544 00000 n
+0000001163 00000 n
+0000001049 00000 n
+0000000285 00000 n
+0000001030 00000 n
+0000001286 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<85FA3FFEB023C2538065900408CFCA15><85FA3FFEB023C2538065900408CFCA15>]
+>>
+startxref
+2669
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Light.eps
new file mode 100644
index 0000000000..c424f7654a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ableton-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..2741530d87
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Dark.eps
new file mode 100644
index 0000000000..d2f42d8d0f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..06088c166b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Light-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xeR;r0u
+)c yqa-痌g,˲]`msK8rpqBπ|՟"Utju/(:㭠A3=_CfХq2lgHKd6LP~[orKYO:#Ԅ[`:F+v>\_)}Vl @:*@o
+>LdXndVg?>^ ASH#wg[pKR~iP"`~|/: <6M"0n1/F2ҽpÛ#\ endstream
+endobj
+6 0 obj
+294
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:18:37+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:18:37+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:357309f7-143f-11ef-0000-3a31daee34c0'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131837+02'00')
+/ModDate(D:20240514131837+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000841 00000 n
+0000002163 00000 n
+0000000782 00000 n
+0000000668 00000 n
+0000000285 00000 n
+0000000649 00000 n
+0000000905 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<3CBB58E655918350E6D3885F45CB21FE><3CBB58E655918350E6D3885F45CB21FE>]
+>>
+startxref
+2288
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Light.eps
new file mode 100644
index 0000000000..21ea3f8e92
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ActivityPub-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..95860d324b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Dark.eps
new file mode 100644
index 0000000000..8437859a5c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..ce53eb7d64
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Light.eps
new file mode 100644
index 0000000000..ce5f0d7151
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Actix-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Adonis-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Adonis-eps-converted-to.pdf
new file mode 100644
index 0000000000..464db9563e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Adonis-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Adonis.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Adonis.eps
new file mode 100644
index 0000000000..f40105b918
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Adonis.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AfterEffects-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AfterEffects-eps-converted-to.pdf
new file mode 100644
index 0000000000..0ef24be988
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AfterEffects-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AfterEffects.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AfterEffects.eps
new file mode 100644
index 0000000000..c09bcb77a3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AfterEffects.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..0be0b3a5f6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Dark.eps
new file mode 100644
index 0000000000..cf6de055fb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2d82078f94
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Light.eps
new file mode 100644
index 0000000000..4e0c669964
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AiScript-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..70696d537e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Dark-eps-converted-to.pdf
@@ -0,0 +1,76 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xMP;nD1}
+)`~>FoEOdx`~;uSj
+F&&c5/|6r
+P2' G8;d(U\d&)iȀHw" nwlpЏ/Mm
+'$A鏆*2s{4g>]G]ߦDffpLxSDL5걷,k)&Yrk0#uB@z'XsVKendstream
+endobj
+6 0 obj
+218
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:18:44+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:18:44+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:399f2777-143f-11ef-0000-80944cc67489'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131844+02'00')
+/ModDate(D:20240514131844+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000765 00000 n
+0000002087 00000 n
+0000000706 00000 n
+0000000592 00000 n
+0000000285 00000 n
+0000000573 00000 n
+0000000829 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<24F287E7C85A911C415C8B2956CA3B78><24F287E7C85A911C415C8B2956CA3B78>]
+>>
+startxref
+2212
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Dark.eps
new file mode 100644
index 0000000000..7a1909df43
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..26af7050a9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Light.eps
new file mode 100644
index 0000000000..75f91a2d0c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AlpineJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..8ad318f16c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Dark.eps
new file mode 100644
index 0000000000..7fd2fa760c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..8580330d2d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Light.eps
new file mode 100644
index 0000000000..77380d9605
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Anaconda-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..d31c25208e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Dark.eps
new file mode 100644
index 0000000000..afa4064ccc
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a2ea58d41d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Light.eps
new file mode 100644
index 0000000000..3f504bfee5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AndroidStudio-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..6952845019
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Dark-eps-converted-to.pdf
@@ -0,0 +1,76 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmRAn0~ 7Dj=?oVbLfğ:qoY
+Mt,GNv}62rPc>h U2^M޸B`Q
+wGೊ{hg=U,+:-r$ЙP`.er
++ˆ*htHaL Foh+Cr(1@b⋡[
+P"5Ki)I >`dVD1S"?w8EVGha4M+"љ%\^"Bу&?9sQ},o:endstream
+endobj
+6 0 obj
+311
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:18:49+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:18:49+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:3c9a17f7-143f-11ef-0000-1e2579a9a4a0'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131849+02'00')
+/ModDate(D:20240514131849+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000858 00000 n
+0000002180 00000 n
+0000000799 00000 n
+0000000685 00000 n
+0000000285 00000 n
+0000000666 00000 n
+0000000922 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<CCCE37DDD13C6E891BFF55F1F172BD05><CCCE37DDD13C6E891BFF55F1F172BD05>]
+>>
+startxref
+2305
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Dark.eps
new file mode 100644
index 0000000000..66c38620e1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..dfa920a24b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Light-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmRKn0> 3Dj"oQpH1fFgGx6Љ#{ GN؟dl4AjMh
+U2^M޸B`Q
+շmYnUj=󹧷Ea(j3r%#T2?2^,ˆ*ht9 1Q&z+G)o?~*1HHC:v)2h3%)F'XEsAP)A:[Ӛ-i%^>j%>3K^D?9seP W
+endstream
+endobj
+6 0 obj
+311
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:18:50+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:18:50+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:3d32ae77-143f-11ef-0000-007b3e5454a6'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131850+02'00')
+/ModDate(D:20240514131850+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000858 00000 n
+0000002180 00000 n
+0000000799 00000 n
+0000000685 00000 n
+0000000285 00000 n
+0000000666 00000 n
+0000000922 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<7D365C100464CDD231970D1A28D1D7A0><7D365C100464CDD231970D1A28D1D7A0>]
+>>
+startxref
+2305
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Light.eps
new file mode 100644
index 0000000000..0c223b6938
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Angular-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ansible-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ansible-eps-converted-to.pdf
new file mode 100644
index 0000000000..0c6610594b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ansible-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ansible.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ansible.eps
new file mode 100644
index 0000000000..4f60527dbd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ansible.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Apollo-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apollo-eps-converted-to.pdf
new file mode 100644
index 0000000000..332fd848ed
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apollo-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Apollo.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apollo.eps
new file mode 100644
index 0000000000..44d36468d2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apollo.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..39d80b808f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Dark.eps
new file mode 100644
index 0000000000..a55ba8c861
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..5aaeacc664
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Light.eps
new file mode 100644
index 0000000000..f1b5f1100c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Apple-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Appwrite-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Appwrite-eps-converted-to.pdf
new file mode 100644
index 0000000000..6eb4454ea0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Appwrite-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Appwrite.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Appwrite.eps
new file mode 100644
index 0000000000..93717650ac
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Appwrite.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..339308af05
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Dark.eps
new file mode 100644
index 0000000000..57f28ac5ae
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..6a813cd636
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Light.eps
new file mode 100644
index 0000000000..4612eff302
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arch-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Arduino-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arduino-eps-converted-to.pdf
new file mode 100644
index 0000000000..d622427417
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arduino-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Arduino.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arduino.eps
new file mode 100644
index 0000000000..19937a5887
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Arduino.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Astro-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Astro-eps-converted-to.pdf
new file mode 100644
index 0000000000..0166aa3c34
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Astro-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Astro.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Astro.eps
new file mode 100644
index 0000000000..519a257bb6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Astro.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Atom-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Atom-eps-converted-to.pdf
new file mode 100644
index 0000000000..cecc153608
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Atom-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Atom.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Atom.eps
new file mode 100644
index 0000000000..08683f3956
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Atom.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Audition-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Audition-eps-converted-to.pdf
new file mode 100644
index 0000000000..53398f7dcf
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Audition-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Audition.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Audition.eps
new file mode 100644
index 0000000000..8c5773c269
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Audition.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AutoCAD-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AutoCAD-Light.eps
new file mode 100644
index 0000000000..47ace2b612
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AutoCAD-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_AutoCAD_Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_AutoCAD_Dark.eps
new file mode 100644
index 0000000000..08e3f793ee
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_AutoCAD_Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Autocad-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Autocad-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f731a51fa3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Autocad-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Azul-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azul-eps-converted-to.pdf
new file mode 100644
index 0000000000..d40d0458f0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azul-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Azul.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azul.eps
new file mode 100644
index 0000000000..028958b718
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azul.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..94de301f52
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Dark.eps
new file mode 100644
index 0000000000..6958d98de6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..631c3c54e0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Light.eps
new file mode 100644
index 0000000000..0df912d746
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Azure-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..019b2c58b1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Dark.eps
new file mode 100644
index 0000000000..20cb86ac64
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..e82a723385
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Light.eps
new file mode 100644
index 0000000000..3af9153936
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_BSD-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Babel-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Babel-eps-converted-to.pdf
new file mode 100644
index 0000000000..7ad88f8c4a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Babel-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Babel.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Babel.eps
new file mode 100644
index 0000000000..dbf329c592
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Babel.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..223ea5be5d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Dark.eps
new file mode 100644
index 0000000000..d2a66746ec
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..09127c7367
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Light.eps
new file mode 100644
index 0000000000..c2a06ac418
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bash-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..8879a7e7f5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Dark.eps
new file mode 100644
index 0000000000..aa868b583f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..4a109873ae
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Light.eps
new file mode 100644
index 0000000000..61f6224ca1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bevy-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..59d17f3e16
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Dark-eps-converted-to.pdf
@@ -0,0 +1,128 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xTmA Ol}a}d=ǐūf?J-%o J5(~]qѪm9tJ4j 0/@|%W`"j~e<3 Wׯ9\c|.-m5Wk;hSg]t5a2.f:aJ5S)Vh]C̞Z:㫳8\0ZC/M;h1bag>b_*=:bVlؚ@`gxaLDɏ>^Ӄ+(=S`8C& ƒY!amGa`0uOj{nȓ)搅FYBvjm zzT<X>xX'4$b֎1<30fK
+י}16u+4/Mdy W~0=JOxBxߑxNl,89gI
+$\6)xB8bZ RHI ~qdnm~k^V" i mH Rs3'^?(Ƿ,Bkϗ_x~/endstream
+endobj
+6 0 obj
+609
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ColorSpace 11 0 R
+/Pattern 12 0 R
+/Shading 13 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 14 0 R
+>>
+endobj
+7 0 obj
+[/Pattern]
+endobj
+11 0 obj
+<</R7
+7 0 R>>
+endobj
+12 0 obj
+<</R10
+10 0 R>>
+endobj
+10 0 obj
+<</PatternType 2
+/Shading 9 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+13 0 obj
+<</R9
+9 0 R>>
+endobj
+9 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[36404.7
+7003.86
+23538.7
+23660.6]
+/Function 8 0 R
+/Extend [true true]>>endobj
+8 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0
+0.321569
+0.8]
+/C1[0.14902
+0.517647
+1]
+/N 1>>endobj
+14 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:19:12+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:19:12+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:4a4f9d77-143f-11ef-0000-8399616cbad5'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131912+02'00')
+/ModDate(D:20240514131912+02'00')>>endobj
+xref
+0 15
+0000000000 65535 f
+0000001207 00000 n
+0000002956 00000 n
+0000001148 00000 n
+0000000983 00000 n
+0000000285 00000 n
+0000000964 00000 n
+0000001272 00000 n
+0000001601 00000 n
+0000001469 00000 n
+0000001360 00000 n
+0000001298 00000 n
+0000001328 00000 n
+0000001439 00000 n
+0000001697 00000 n
+trailer
+<< /Size 15 /Root 1 0 R /Info 2 0 R
+/ID [<CF06869BD3A4C747B091686D655F0DF9><CF06869BD3A4C747B091686D655F0DF9>]
+>>
+startxref
+3081
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Dark.eps
new file mode 100644
index 0000000000..fa92e1aa9a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a35f66ab73
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Light.eps
new file mode 100644
index 0000000000..a8a8e74a02
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_BitBucket-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..aaaf47b725
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Dark.eps
new file mode 100644
index 0000000000..e7c7eb8ba4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..8167538b0c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Light.eps
new file mode 100644
index 0000000000..65cb158f3b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Blender-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bootstrap-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bootstrap-eps-converted-to.pdf
new file mode 100644
index 0000000000..e7b3fdc03b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bootstrap-eps-converted-to.pdf
@@ -0,0 +1,163 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xR1n0 u
+%)R.:4K 2%eC.PG=*Zދ(V؎BF'<_7H,+2]yLR6#&Y6`_[V0ˣx:? \<xji,R<*UΞ^j.eqcCm#Kˊ`^PT&tV4[W7@S<Z< W 6@B
+Y؄FAg:, XeY%!(^w&`WEz:s70m`g@U@$n<ḍ4
+ACٕpP84b!Ìq߉깯O762NKA\ߗe҅w~RGendstream
+endobj
+6 0 obj
+387
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ColorSpace 14 0 R
+/Pattern 15 0 R
+/Shading 16 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 17 0 R
+>>
+endobj
+7 0 obj
+[/Pattern]
+endobj
+14 0 obj
+<</R7
+7 0 R>>
+endobj
+15 0 obj
+<</R13
+13 0 R/R10
+10 0 R>>
+endobj
+13 0 obj
+<</PatternType 2
+/Shading 12 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+189]>>endobj
+10 0 obj
+<</PatternType 2
+/Shading 9 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+16 0 obj
+<</R12
+12 0 R/R9
+9 0 R>>
+endobj
+12 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[85.793
+68.962
+148.541
+175.084]
+/Function 11 0 R
+/Extend [true true]>>endobj
+9 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[0
+0
+256
+256]
+/Function 8 0 R
+/Extend [true true]>>endobj
+11 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[1
+1
+1]
+/C1[0.945098
+0.898039
+0.988235]
+/N 1>>endobj
+8 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.564706
+0.0745098
+0.996078]
+/C1[0.419608
+0.0666667
+0.956863]
+/N 1>>endobj
+17 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:19:16+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:19:16+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:4cb1f777-143f-11ef-0000-f5f9ee6058a8'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131916+02'00')
+/ModDate(D:20240514131916+02'00')>>endobj
+xref
+0 18
+0000000000 65535 f
+0000000985 00000 n
+0000003066 00000 n
+0000000926 00000 n
+0000000761 00000 n
+0000000285 00000 n
+0000000742 00000 n
+0000001050 00000 n
+0000001689 00000 n
+0000001481 00000 n
+0000001229 00000 n
+0000001593 00000 n
+0000001349 00000 n
+0000001149 00000 n
+0000001076 00000 n
+0000001106 00000 n
+0000001308 00000 n
+0000001807 00000 n
+trailer
+<< /Size 18 /Root 1 0 R /Info 2 0 R
+/ID [<35411FF33D08F624BCAD906AE7BD2CAB><35411FF33D08F624BCAD906AE7BD2CAB>]
+>>
+startxref
+3191
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bootstrap.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bootstrap.eps
new file mode 100644
index 0000000000..0632f17c11
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bootstrap.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..f1cf5ea29e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Dark.eps
new file mode 100644
index 0000000000..6ab2ccb907
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..717c620dc4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Light.eps
new file mode 100644
index 0000000000..238f6cdd30
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Bun-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_C-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_C-eps-converted-to.pdf
new file mode 100644
index 0000000000..f967c3724f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_C-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_C.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_C.eps
new file mode 100644
index 0000000000..0a0dd27a5c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_C.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..14fe49d145
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Dark.eps
new file mode 100644
index 0000000000..69075fafd5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a3da05b276
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Light.eps
new file mode 100644
index 0000000000..4a73c5e31e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CLion-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..ff6e964513
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Dark-eps-converted-to.pdf
@@ -0,0 +1,231 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xR1n0
+@%.:4K` H;%%H`Qs"̱־!QA!Ӣ2g օw Z}OX,3HA[8^x"fw2Gx:(n_QƯ~+ P.%5
+3Ef՚%>exzfu44U朮$$=FX^̶~yoAXMz|!a
+'ȜC G{_AQ.-#4Ky*snwȄ ֌endstream
+endobj
+6 0 obj
+302
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ColorSpace 20 0 R
+/Pattern 21 0 R
+/Shading 22 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 23 0 R
+>>
+endobj
+7 0 obj
+[/Pattern]
+endobj
+20 0 obj
+<</R7
+7 0 R>>
+endobj
+21 0 obj
+<</R19
+19 0 R/R16
+16 0 R/R13
+13 0 R/R10
+10 0 R>>
+endobj
+19 0 obj
+<</PatternType 2
+/Shading 18 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+16 0 obj
+<</PatternType 2
+/Shading 15 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+13 0 obj
+<</PatternType 2
+/Shading 12 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+10 0 obj
+<</PatternType 2
+/Shading 9 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+22 0 obj
+<</R18
+18 0 R/R15
+15 0 R/R12
+12 0 R/R9
+9 0 R>>
+endobj
+18 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[133.963
+173.335
+132.816
+134.914]
+/Function 17 0 R
+/Extend [true true]>>endobj
+15 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[164.929
+206.021
+76.6192
+198.566]
+/Function 14 0 R
+/Extend [true true]>>endobj
+12 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[139.124
+93.0525
+201.629
+198.566]
+/Function 11 0 R
+/Extend [true true]>>endobj
+9 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[78.9132
+164.733
+123.642
+70.115]
+/Function 8 0 R
+/Extend [true true]>>endobj
+17 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.517647
+0.517647
+0.517647]
+/C1[0.823529
+0.823529
+0.823529]
+/N 1>>endobj
+14 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.00392157
+0.639216
+0]
+/C1[0.00392157
+0.87451
+0]
+/N 1>>endobj
+11 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.705882
+0.054902
+0.054902]
+/C1[1
+0.34902
+0.34902]
+/N 1>>endobj
+8 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.0627451
+0.0666667
+0.631373]
+/C1[0.411765
+0.411765
+0.882353]
+/N 1>>endobj
+23 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:19:29+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:19:29+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:54719bf7-143f-11ef-0000-ee84fe6edbe6'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131929+02'00')
+/ModDate(D:20240514131929+02'00')>>endobj
+xref
+0 24
+0000000000 65535 f
+0000000900 00000 n
+0000003709 00000 n
+0000000841 00000 n
+0000000676 00000 n
+0000000285 00000 n
+0000000657 00000 n
+0000000965 00000 n
+0000002332 00000 n
+0000001870 00000 n
+0000001326 00000 n
+0000002224 00000 n
+0000001736 00000 n
+0000001246 00000 n
+0000002118 00000 n
+0000001602 00000 n
+0000001166 00000 n
+0000002001 00000 n
+0000001468 00000 n
+0000001086 00000 n
+0000000991 00000 n
+0000001021 00000 n
+0000001405 00000 n
+0000002450 00000 n
+trailer
+<< /Size 24 /Root 1 0 R /Info 2 0 R
+/ID [<3BFD6999A5CAE584510C174B3483FCEF><3BFD6999A5CAE584510C174B3483FCEF>]
+>>
+startxref
+3834
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Dark.eps
new file mode 100644
index 0000000000..a25bd5b717
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..5d63bf4b8a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Light-eps-converted-to.pdf
@@ -0,0 +1,230 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xQ1nC19'ج]:uhKi$Rڡ/؎۬%=2%8.dq|i2& V|R*3D$83E^@(` o,9ſݻ`
+/vF+E*ZM{i9ywjԲOٽ^8=a,fk\:7s)>j(U-鿴_:-eiqPRws9~
+e)bd>0rO;^wVmZ/#AŒendstream
+endobj
+6 0 obj
+298
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ColorSpace 20 0 R
+/Pattern 21 0 R
+/Shading 22 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 23 0 R
+>>
+endobj
+7 0 obj
+[/Pattern]
+endobj
+20 0 obj
+<</R7
+7 0 R>>
+endobj
+21 0 obj
+<</R19
+19 0 R/R16
+16 0 R/R13
+13 0 R/R10
+10 0 R>>
+endobj
+19 0 obj
+<</PatternType 2
+/Shading 18 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+16 0 obj
+<</PatternType 2
+/Shading 15 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+13 0 obj
+<</PatternType 2
+/Shading 12 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+10 0 obj
+<</PatternType 2
+/Shading 9 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+22 0 obj
+<</R18
+18 0 R/R15
+15 0 R/R12
+12 0 R/R9
+9 0 R>>
+endobj
+18 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[133.963
+173.335
+132.816
+134.914]
+/Function 17 0 R
+/Extend [true true]>>endobj
+15 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[164.929
+206.021
+76.6192
+198.566]
+/Function 14 0 R
+/Extend [true true]>>endobj
+12 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[139.124
+93.0525
+201.629
+198.566]
+/Function 11 0 R
+/Extend [true true]>>endobj
+9 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[78.9132
+164.733
+123.642
+70.115]
+/Function 8 0 R
+/Extend [true true]>>endobj
+17 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.517647
+0.517647
+0.517647]
+/C1[0.823529
+0.823529
+0.823529]
+/N 1>>endobj
+14 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.00392157
+0.639216
+0]
+/C1[0.00392157
+0.87451
+0]
+/N 1>>endobj
+11 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.705882
+0.054902
+0.054902]
+/C1[1
+0.34902
+0.34902]
+/N 1>>endobj
+8 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.0627451
+0.0666667
+0.631373]
+/C1[0.411765
+0.411765
+0.882353]
+/N 1>>endobj
+23 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:19:30+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:19:30+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:550a3277-143f-11ef-0000-7cfd5cee4091'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131930+02'00')
+/ModDate(D:20240514131930+02'00')>>endobj
+xref
+0 24
+0000000000 65535 f
+0000000896 00000 n
+0000003705 00000 n
+0000000837 00000 n
+0000000672 00000 n
+0000000285 00000 n
+0000000653 00000 n
+0000000961 00000 n
+0000002328 00000 n
+0000001866 00000 n
+0000001322 00000 n
+0000002220 00000 n
+0000001732 00000 n
+0000001242 00000 n
+0000002114 00000 n
+0000001598 00000 n
+0000001162 00000 n
+0000001997 00000 n
+0000001464 00000 n
+0000001082 00000 n
+0000000987 00000 n
+0000001017 00000 n
+0000001401 00000 n
+0000002446 00000 n
+trailer
+<< /Size 24 /Root 1 0 R /Info 2 0 R
+/ID [<D4BF8B355F69478F3BBC30EC2E575FAD><D4BF8B355F69478F3BBC30EC2E575FAD>]
+>>
+startxref
+3830
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Light.eps
new file mode 100644
index 0000000000..a8ec9d7f87
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CMake-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CPP-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CPP-eps-converted-to.pdf
new file mode 100644
index 0000000000..32b4aeeaec
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CPP-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CPP.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CPP.eps
new file mode 100644
index 0000000000..8647fd80e8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CPP.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CS-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CS-eps-converted-to.pdf
new file mode 100644
index 0000000000..7a6ed72e18
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CS-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CS.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CS.eps
new file mode 100644
index 0000000000..0dff908bb9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CS.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CSS-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CSS-eps-converted-to.pdf
new file mode 100644
index 0000000000..49cd66a852
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CSS-eps-converted-to.pdf
@@ -0,0 +1,73 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmRIn0 zAJ!{h(iK3D*3_ќ;`YU0ֹ|4֯BlF>Y(Nu
+<2lV,o2;lQwKl8I}v DhƠ8 Ctc5f.]B+p- L#>NB`Qh,j:x!#>t&ڈѓ.cnTe.ЫP'& g*q?ZxBۜ8OMݼ A\G0ÙHhI FIgԆMDbz<^<D )ЪKendstream
+endobj
+6 0 obj
+346
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:19:39+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:19:39+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:5a677cf7-143f-11ef-0000-241dca65b5ff'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131939+02'00')
+/ModDate(D:20240514131939+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000893 00000 n
+0000002215 00000 n
+0000000834 00000 n
+0000000720 00000 n
+0000000285 00000 n
+0000000701 00000 n
+0000000957 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<702C666611DA512AD5D41C80C0426EC3><702C666611DA512AD5D41C80C0426EC3>]
+>>
+startxref
+2340
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CSS.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CSS.eps
new file mode 100644
index 0000000000..0c23591bac
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CSS.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..213ab56da9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Dark.eps
new file mode 100644
index 0000000000..42c763b256
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2814d703b6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Light.eps
new file mode 100644
index 0000000000..4a92994f9a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cassandra-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..28d1e436d5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Dark.eps
new file mode 100644
index 0000000000..3fb9bea0d8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..17c933c579
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Light.eps
new file mode 100644
index 0000000000..cf3cb117ee
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Clojure-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..bf5c420d9e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Dark.eps
new file mode 100644
index 0000000000..64cdd7acf3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..6ed1753646
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Light.eps
new file mode 100644
index 0000000000..aab3ccd5b5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cloudflare-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..54d1e07ea5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Dark.eps
new file mode 100644
index 0000000000..880d98edfd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..25bfe84eea
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Light.eps
new file mode 100644
index 0000000000..3fa6f147a9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CodePen-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..7b52a56d6a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Dark.eps
new file mode 100644
index 0000000000..e5a8d1d3ba
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..ece0551e8c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Light.eps
new file mode 100644
index 0000000000..a1ff33d24e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_CoffeeScript-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..5ad50ef3cc
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Dark.eps
new file mode 100644
index 0000000000..dc532ce469
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..44a8f02ad6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Light.eps
new file mode 100644
index 0000000000..695827f601
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Crystal-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..fc5538aedd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Dark.eps
new file mode 100644
index 0000000000..ecf950895a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a3c8d918d2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Light.eps
new file mode 100644
index 0000000000..acb65ad6af
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Cypress-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..31f0e494aa
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Dark.eps
new file mode 100644
index 0000000000..85d8a43c48
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..b0c5a0e4ac
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Light.eps
new file mode 100644
index 0000000000..25eac5df42
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_D3-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..5ae86bd70f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Dark.eps
new file mode 100644
index 0000000000..03a405ccae
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2cb3815c7e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Light.eps
new file mode 100644
index 0000000000..888f87e2fe
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DENO-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a010428d10
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Dark.eps
new file mode 100644
index 0000000000..d0f06d8e86
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..86e768e790
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Light.eps
new file mode 100644
index 0000000000..c5146260b6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Dart-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..225be906e6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Dark.eps
new file mode 100644
index 0000000000..7e9ec53dc8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f2e3cba83a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Light.eps
new file mode 100644
index 0000000000..67792f353d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Debian-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..bc4a3b41e1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Dark-eps-converted-to.pdf
@@ -0,0 +1,79 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmSK0 ZwA#Q1z[-/:$@ Ě7V&~eOiL]}> zLJP
+Rzu uT$;xRmEm[e<;]eHxd<kH̰I*:
+rЅ
+GQtps!94WragzYJP @nj'٘`
+ע41xf
+H껑rtSjiIffbmľpxpLMobLfngWE4ܨA 9ޫ }xH(6cEd!x* .O|1L@L#ޢ>
+ZŇ} F4ueR81B-Wpkaqu:iH/mI+?]Åh$ٹ9Z{(byFԣؚXb,&E
+䁻z#~hQ~ endstream
+endobj
+6 0 obj
+495
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:19:50+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:19:50+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:60f5f477-143f-11ef-0000-79f8693ac7c4'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514131950+02'00')
+/ModDate(D:20240514131950+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000001042 00000 n
+0000002364 00000 n
+0000000983 00000 n
+0000000869 00000 n
+0000000285 00000 n
+0000000850 00000 n
+0000001106 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<7572255066FF4D6C815BC8F69DD10B7D><7572255066FF4D6C815BC8F69DD10B7D>]
+>>
+startxref
+2489
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Dark.eps
new file mode 100644
index 0000000000..dcec3896cd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..e8e366c5b9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Light.eps
new file mode 100644
index 0000000000..677fea3109
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DevTo-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Discord-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Discord-eps-converted-to.pdf
new file mode 100644
index 0000000000..e773edc3f5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Discord-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Discord.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Discord.eps
new file mode 100644
index 0000000000..eab558bada
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Discord.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordBots-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordBots-eps-converted-to.pdf
new file mode 100644
index 0000000000..628cd578ed
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordBots-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordBots.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordBots.eps
new file mode 100644
index 0000000000..6cf4249a20
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordBots.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a800661526
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Dark.eps
new file mode 100644
index 0000000000..3d7b9fd8f1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..fa2297cc41
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Light.eps
new file mode 100644
index 0000000000..086c0ae492
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DiscordJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Django-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Django-eps-converted-to.pdf
new file mode 100644
index 0000000000..ef29e1b512
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Django-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Django.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Django.eps
new file mode 100644
index 0000000000..21ef360917
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Django.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Docker-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Docker-eps-converted-to.pdf
new file mode 100644
index 0000000000..73ca46c41a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Docker-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Docker.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Docker.eps
new file mode 100644
index 0000000000..f335638f29
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Docker.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DotNet-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DotNet-eps-converted-to.pdf
new file mode 100644
index 0000000000..bdcda04097
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DotNet-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DotNet.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DotNet.eps
new file mode 100644
index 0000000000..1c3320c6cb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DotNet.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..2beb6b1258
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Dark.eps
new file mode 100644
index 0000000000..ed59c7f24e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..4b0b3316f9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Light.eps
new file mode 100644
index 0000000000..8614cda8f2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_DynamoDB-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..bc1a2c027d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Dark.eps
new file mode 100644
index 0000000000..ea929eba04
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..ba4171a223
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Light.eps
new file mode 100644
index 0000000000..57e2220aca
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Eclipse-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..e4ed0026d2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Dark.eps
new file mode 100644
index 0000000000..203f1ca443
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..66a5d7c4e2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Light.eps
new file mode 100644
index 0000000000..5dbd8a027d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elasticsearch-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Electron-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Electron-eps-converted-to.pdf
new file mode 100644
index 0000000000..01e79d8ec3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Electron-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Electron.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Electron.eps
new file mode 100644
index 0000000000..3abd7a9933
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Electron.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..55a6e12c08
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Dark.eps
new file mode 100644
index 0000000000..37c53c6889
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..3938f8b59b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Light.eps
new file mode 100644
index 0000000000..7c64c2d981
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elixir-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..e5bb02417b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Dark.eps
new file mode 100644
index 0000000000..dda654f505
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..e3fae95ec8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Light.eps
new file mode 100644
index 0000000000..aca9f60f42
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Elysia-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Emacs-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emacs-eps-converted-to.pdf
new file mode 100644
index 0000000000..f57f9591b2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emacs-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Emacs.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emacs.eps
new file mode 100644
index 0000000000..a735e6beee
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emacs.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ember-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ember-eps-converted-to.pdf
new file mode 100644
index 0000000000..894e5988c4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ember-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ember.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ember.eps
new file mode 100644
index 0000000000..568da7f7a6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ember.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..b122ce1905
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Dark.eps
new file mode 100644
index 0000000000..fdb615ad23
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..4f16b17ad8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Light.eps
new file mode 100644
index 0000000000..284e6f5337
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Emotion-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..870add3f67
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Dark.eps
new file mode 100644
index 0000000000..c3a34b60cc
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..348e7d82d6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Light.eps
new file mode 100644
index 0000000000..499352a0ee
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ExpressJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_FastAPI-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_FastAPI-eps-converted-to.pdf
new file mode 100644
index 0000000000..413c6eafc2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_FastAPI-eps-converted-to.pdf
@@ -0,0 +1,76 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmPKnD! s
+Nc Ovf1sEG^6 ̄̾<VkA`Tgp~&Ldѵ3KtaO8^0Ε.rY(H
+)ħso}(:IF!$2xa;"r
+L"ڴ*.n.ٖ>Pȵwe6.j.+`:ͦ
+NszE˭GJUlRendstream
+endobj
+6 0 obj
+242
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:14+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:14+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:6f441078-143f-11ef-0000-e14287b0e8e4'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132014+02'00')
+/ModDate(D:20240514132014+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000789 00000 n
+0000002111 00000 n
+0000000730 00000 n
+0000000616 00000 n
+0000000285 00000 n
+0000000597 00000 n
+0000000853 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<F1D42411420636CB49A2CC75D2F6E96D><F1D42411420636CB49A2CC75D2F6E96D>]
+>>
+startxref
+2236
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_FastAPI.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_FastAPI.eps
new file mode 100644
index 0000000000..00f032a151
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_FastAPI.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a2797b8372
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Dark.eps
new file mode 100644
index 0000000000..f9b89c2d70
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..8ceafded39
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Light.eps
new file mode 100644
index 0000000000..de70ece266
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fediverse-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..68605fbe62
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Dark.eps
new file mode 100644
index 0000000000..66bf8641b7
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..73c70362c2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Light.eps
new file mode 100644
index 0000000000..0c37556108
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Figma-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..f2fa720860
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Dark.eps
new file mode 100644
index 0000000000..34449ea0f2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..0a0efc9c9c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Light.eps
new file mode 100644
index 0000000000..2c7b7336c2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Firebase-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..c589f1939b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Dark.eps
new file mode 100644
index 0000000000..15375cd6eb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..97ad40e946
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Light.eps
new file mode 100644
index 0000000000..6d21a3653d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flask-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a78a477bbe
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Dark.eps
new file mode 100644
index 0000000000..dddffbaa65
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f01f851622
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Light-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xuRAn1~ ?o::R۴<3IјOl*tEf|oe)G7zSr.Y*#ɪ=Q@mUO疣wWӈ`0Q*|? @F>ʦ@DZ.yԮ5rA#W. l}|+ApԊ7:c2`9+:gS%d
+%=}g#S͓U/{QNRJ0텷tTS
+shB"B~q<Xs|t8:#@ua@v@?R2SPP9a+g%<'V/YEԵ/آIendstream
+endobj
+6 0 obj
+366
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:24+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:24+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:7539f178-143f-11ef-0000-9e2e53feda12'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132024+02'00')
+/ModDate(D:20240514132024+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000913 00000 n
+0000002235 00000 n
+0000000854 00000 n
+0000000740 00000 n
+0000000285 00000 n
+0000000721 00000 n
+0000000977 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<312F79E0025F1A07DD268F260AF97D24><312F79E0025F1A07DD268F260AF97D24>]
+>>
+startxref
+2360
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Light.eps
new file mode 100644
index 0000000000..4f6f35ab0a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Flutter-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Forth-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Forth-eps-converted-to.pdf
new file mode 100644
index 0000000000..4578d7822e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Forth-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Forth.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Forth.eps
new file mode 100644
index 0000000000..8ac75748c1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Forth.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Fortran-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fortran-eps-converted-to.pdf
new file mode 100644
index 0000000000..f0edfbb570
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fortran-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Fortran.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fortran.eps
new file mode 100644
index 0000000000..a2b0b15443
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Fortran.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..370e6e68cd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Dark.eps
new file mode 100644
index 0000000000..8708c1f258
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..fc5cc1ff18
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Light.eps
new file mode 100644
index 0000000000..533efb6730
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GCP-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..5f15ea1d12
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Dark.eps
new file mode 100644
index 0000000000..7e746f693c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..68e0c8b914
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Light-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xuR;N1 sۉ[*
++l
+N4H>yT1/ׂڱ\ɳ`1kJX(i:uKu2d\}ymDX6(]Yt*7\Y4XgPz/TZIA[ %tj܎+!/>PzN-thIC,lUi>gNm 躥-fNs˽9q[4s|
+<}IՐ->1L-\̺;u,_nW3*</Õ*endstream
+endobj
+6 0 obj
+333
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:50+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:50+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:84b93a78-143f-11ef-0000-57fbd44ff41f'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132050+02'00')
+/ModDate(D:20240514132050+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000880 00000 n
+0000002202 00000 n
+0000000821 00000 n
+0000000707 00000 n
+0000000285 00000 n
+0000000688 00000 n
+0000000944 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<4A731E2407976CCECEE1D27BD2D7097A><4A731E2407976CCECEE1D27BD2D7097A>]
+>>
+startxref
+2327
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Light.eps
new file mode 100644
index 0000000000..df4cd67ea4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GTK-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GameMakerStudio-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GameMakerStudio-eps-converted-to.pdf
new file mode 100644
index 0000000000..af832efb2b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GameMakerStudio-eps-converted-to.pdf
@@ -0,0 +1,72 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmA EP@TsT,ft&UT1VQzSerc2J~ֱ1֣PԳBmA ˩a.ɸ,N.ȀK"n ^!cy{yߛ~sBTm l^~\ } Bl7>Ɇ61JCLݤYGWhf2}D]ZAendstream
+endobj
+6 0 obj
+201
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:27+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:27+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:7703b4f8-143f-11ef-0000-ed51d6ddd3b0'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132027+02'00')
+/ModDate(D:20240514132027+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000748 00000 n
+0000002070 00000 n
+0000000689 00000 n
+0000000575 00000 n
+0000000285 00000 n
+0000000556 00000 n
+0000000812 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<5BC0B5900BFFAAA592C8D75A63FA31C2><5BC0B5900BFFAAA592C8D75A63FA31C2>]
+>>
+startxref
+2195
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GameMakerStudio.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GameMakerStudio.eps
new file mode 100644
index 0000000000..c46db89b0d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GameMakerStudio.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gatsby-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gatsby-eps-converted-to.pdf
new file mode 100644
index 0000000000..dbdf4b7002
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gatsby-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gatsby.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gatsby.eps
new file mode 100644
index 0000000000..b1d0e342a8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gatsby.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..3263f0a408
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Dark.eps
new file mode 100644
index 0000000000..d1072bb82f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..019bcaf158
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Light.eps
new file mode 100644
index 0000000000..825b606704
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gherkin-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Git-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Git-eps-converted-to.pdf
new file mode 100644
index 0000000000..31b0f17e2d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Git-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Git.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Git.eps
new file mode 100644
index 0000000000..7b79d00d71
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Git.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..adf3c15e9f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Dark.eps
new file mode 100644
index 0000000000..26a0f8bc48
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..0a8d61751c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Light.eps
new file mode 100644
index 0000000000..58fb3bbeba
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GitLab-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..60d9a6bf3c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Dark.eps
new file mode 100644
index 0000000000..823e6f1468
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..ea1a6b151c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Light.eps
new file mode 100644
index 0000000000..9416300f89
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Github-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..dd58b2be44
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Dark.eps
new file mode 100644
index 0000000000..383105d17a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..943545b62b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Light.eps
new file mode 100644
index 0000000000..b4713798de
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GithubActions-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..5a73edf6af
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Dark-eps-converted-to.pdf
@@ -0,0 +1,76 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xeSK0>%9^,/WAj߭n_-MAD3cDۿMoԷWCe
+(2Gmڕ8M'd/\! T(dno |U?w_t2$P r8p P0b\'unI3=1.G"@AXl
+CJT<l;Lt
+GE}rb7h&rd9mzRY\b&gcʹ@Ga7.(r<6`J(nPby$^=Y#&E1'e\pud]P[VEYD#sWs(Un^7Ǿ<H.%hRu^V{ݯ
+}endstream
+endobj
+6 0 obj
+387
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:38+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:38+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:7d922c78-143f-11ef-0000-76a43d9e5334'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132038+02'00')
+/ModDate(D:20240514132038+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000934 00000 n
+0000002256 00000 n
+0000000875 00000 n
+0000000761 00000 n
+0000000285 00000 n
+0000000742 00000 n
+0000000998 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<E8AC745464701A8D27AB8E56D3ED5556><E8AC745464701A8D27AB8E56D3ED5556>]
+>>
+startxref
+2381
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Dark.eps
new file mode 100644
index 0000000000..0b2e7a4993
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..67b469b801
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Light-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xeSɍ0 +
+G@``vL%R
+6K*Uu3uΉ!$
+cDA}{4q>_2&(θ2ϐ2O^1T(@2II>*WU *+eK er 7v1Z7p҈@2* wy}j<S8&Ҋls{Ѻ[+ SaL{;L6YZbgcʩ@Ga-(y[J=ý xV2BʯD%}(>֠#Y.&%> £eED8~o(Yp9R@{C$oh;Хcju~Wj:wendstream
+endobj
+6 0 obj
+390
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:39+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:39+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:7e2ac2f8-143f-11ef-0000-179f5761fdda'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132039+02'00')
+/ModDate(D:20240514132039+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000937 00000 n
+0000002259 00000 n
+0000000878 00000 n
+0000000764 00000 n
+0000000285 00000 n
+0000000745 00000 n
+0000001001 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<B9349ED98EDBAF8184CABE03FB27F32B><B9349ED98EDBAF8184CABE03FB27F32B>]
+>>
+startxref
+2384
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Light.eps
new file mode 100644
index 0000000000..fed75bc77f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gmail-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GoLang-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GoLang-eps-converted-to.pdf
new file mode 100644
index 0000000000..1470f0186e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GoLang-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GoLang.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GoLang.eps
new file mode 100644
index 0000000000..adfca0f4e3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GoLang.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..19cc2f10ee
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Dark.eps
new file mode 100644
index 0000000000..20c8c76373
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..b54c140329
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Light.eps
new file mode 100644
index 0000000000..b5349c819b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Godot-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..f2ba1ebdfb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Dark.eps
new file mode 100644
index 0000000000..1711e932a1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..9405eab055
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Light.eps
new file mode 100644
index 0000000000..67bed35597
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gradle-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..9ee9327a3f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Dark.eps
new file mode 100644
index 0000000000..bdc08517c3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..397c5bd764
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Light.eps
new file mode 100644
index 0000000000..93ace20b65
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Grafana-Light.eps
@@ -0,0 +1,216 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.16.0 (https://cairographics.org)
+%%CreationDate: Sun May 12 20:32:59 2024
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 3
+%%BoundingBox: 0 0 192 192
+%%EndComments
+%%BeginProlog
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+ 0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+ {
+ dup
+ type /stringtype eq
+ { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+ } forall
+ currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+ cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+ { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+ /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+ /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+ cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_data_source {
+ CairoDataIndex CairoData length lt
+ { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
+ { () } ifelse
+} def
+/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
+/cairo_image { image cairo_flush_ascii85_file } def
+/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 0 192 192
+%%EndPageSetup
+q 0 0 192 192 rectclip
+1 0 0 -1 0 192 cm q
+0.956863 0.94902 0.929412 rg
+45 0 m 147 0 l 171.93 0 192 20.07 192 45 c 192 147 l 192 171.93 171.93
+192 147 192 c 45 192 l 20.07 192 0 171.93 0 147 c 0 45 l 0 20.07 20.07 0
+ 45 0 c h
+45 0 m f
+q
+165.543 87.34 m 165.277 84.945 165.012 82.012 163.945 78.816 c 163.145
+75.617 161.812 72.156 159.949 68.426 c 158.082 64.695 155.688 60.965 152.754
+ 57.234 c 151.688 55.902 150.355 54.305 148.758 52.973 c 150.891 44.445
+146.094 37.254 146.094 37.254 c 138.102 36.719 132.773 39.648 130.906 41.25
+ c 130.641 41.25 130.375 40.98 129.84 40.715 c 128.512 40.184 127.176 39.648
+ 125.578 39.117 c 123.98 38.586 122.648 38.316 121.051 37.785 c 119.449
+37.52 117.852 37.254 116.52 36.984 c 116.254 36.984 115.988 36.984 115.723
+ 36.984 c 112.258 25.797 102.133 21 102.133 21 c 90.945 28.195 88.812 38.051
+ 88.812 38.051 c 88.812 38.051 88.812 38.316 88.812 38.586 c 88.277 38.852
+ 87.48 38.852 86.945 39.117 c 86.148 39.383 85.348 39.648 84.281 39.918
+c 83.484 40.184 82.684 40.449 81.617 40.98 c 80.02 41.781 78.156 42.582
+76.555 43.379 c 74.957 44.18 73.359 45.246 71.762 46.312 c 71.492 46.312
+ 71.492 46.043 71.492 46.043 c 55.773 40.184 41.922 47.375 41.922 47.375
+ c 40.59 63.895 48.047 74.551 49.648 76.418 c 49.379 77.484 48.848 78.551
+ 48.582 79.613 c 47.516 83.344 46.449 87.34 45.918 91.34 c 45.918 91.871
+ 45.648 92.402 45.648 92.938 c 31.262 100.129 27 114.781 27 114.781 c 38.988
+ 128.637 53.109 129.438 53.109 129.438 c 54.977 132.633 56.84 135.566 59.238
+ 138.496 c 60.305 139.562 61.371 140.895 62.168 141.961 c 57.906 154.48
+62.703 164.871 62.703 164.871 c 76.023 165.406 84.816 159.012 86.68 157.414
+ c 88.012 157.945 89.344 158.211 90.676 158.746 c 94.672 159.809 98.938
+160.344 103.199 160.609 c 104.266 160.609 105.332 160.609 106.398 160.609
+ c 108.262 160.609 l 114.656 169.668 125.578 171 125.578 171 c 133.57 162.742
+ 133.84 154.48 133.84 152.617 c 133.84 152.352 133.84 152.352 133.84 152.352
+ c 133.84 152.082 l 135.438 151.02 137.035 149.688 138.633 148.355 c 141.832
+ 145.422 144.496 142.227 146.895 138.762 c 147.16 138.496 147.426 138.23
+ 147.426 137.695 c 156.484 138.23 162.613 132.102 162.613 132.102 c 161.016
+ 122.777 155.684 118.246 154.621 117.449 c 154.621 117.449 154.621 117.449
+ 154.355 117.449 c 154.355 116.914 154.355 116.383 154.355 115.848 c 154.355
+ 114.781 154.355 113.719 154.355 112.918 c 154.355 111.055 l 154.355 110.785
+ 154.355 110.785 154.355 110.785 c 154.355 109.453 l 154.355 109.188 154.355
+ 108.922 154.355 108.656 c 154.355 108.391 154.355 108.121 154.355 107.855
+ c 154.355 106.258 l 154.086 105.191 154.086 104.125 153.82 103.328 c 152.754
+ 99.332 151.422 95.602 149.293 92.137 c 147.16 88.672 144.762 85.742 141.832
+ 83.078 c 138.898 80.414 135.703 78.551 132.238 76.949 c 128.777 75.352
+125.312 74.551 121.582 74.02 c 119.719 73.754 118.117 73.754 116.254 73.754
+ c 114.391 73.754 l 114.121 73.754 113.855 73.754 113.59 73.754 c 112.789
+ 73.754 111.723 74.02 110.926 74.02 c 107.461 74.551 103.996 75.883 101.066
+ 77.75 c 98.137 79.613 95.473 81.746 93.34 84.145 c 91.211 86.543 89.609
+ 89.473 88.547 92.402 c 87.48 95.336 86.945 98.266 86.68 101.195 c 86.68
+ 101.996 86.68 102.527 86.68 103.328 c 86.68 103.594 86.68 103.594 86.68
+ 103.859 c 86.68 104.391 l 86.68 104.66 86.68 105.191 86.68 105.457 c 86.945
+ 106.789 87.215 108.391 87.48 109.723 c 88.277 112.387 89.609 114.781 90.945
+ 116.914 c 92.543 119.047 94.406 120.645 96.273 121.977 c 98.137 123.309
+ 100.27 124.375 102.398 124.906 c 104.531 125.441 106.398 125.707 108.527
+ 125.707 c 108.793 125.707 109.059 125.707 109.328 125.707 c 109.859 125.707
+ l 110.125 125.707 110.391 125.707 110.391 125.707 c 110.391 125.707 110.391
+ 125.707 110.66 125.707 c 111.191 125.707 l 111.457 125.707 111.723 125.707
+ 111.992 125.707 c 112.258 125.707 112.523 125.707 112.789 125.441 c 113.324
+ 125.441 113.59 125.176 114.121 125.176 c 114.922 124.906 115.723 124.641
+ 116.52 124.109 c 117.32 123.84 117.852 123.309 118.652 122.777 c 118.918
+ 122.777 118.918 122.512 119.184 122.242 c 119.984 121.711 119.984 120.645
+ 119.449 120.113 c 118.918 119.578 118.117 119.312 117.586 119.844 c 117.32
+ 119.844 117.32 120.113 117.055 120.113 c 116.52 120.379 115.988 120.645
+ 115.188 120.91 c 114.656 121.176 113.855 121.176 113.324 121.445 c 113.055
+ 121.445 112.523 121.445 112.258 121.445 c 111.992 121.445 111.992 121.445
+ 111.723 121.445 c 111.457 121.445 111.457 121.445 111.191 121.445 c 110.926
+ 121.445 110.926 121.445 110.66 121.445 c 110.391 121.445 110.125 121.445
+ 110.125 121.445 c 109.594 121.445 l 109.328 121.445 109.328 121.445 109.059
+ 121.445 c 107.461 121.176 106.129 120.91 104.531 120.113 c 102.934 119.578
+ 101.602 118.512 100.266 117.449 c 98.938 116.383 97.871 114.781 97.07 113.449
+ c 96.273 112.117 95.473 110.254 95.207 108.391 c 94.941 107.59 94.941 106.523
+ 94.941 105.723 c 94.941 105.457 94.941 105.191 94.941 104.926 c 94.941
+104.391 l 94.941 103.859 94.941 103.328 95.207 102.793 c 96.004 98.797 97.871
+ 95.066 101.066 91.871 c 101.867 91.07 102.664 90.539 103.465 89.738 c 104.266
+ 89.207 105.332 88.672 106.129 88.141 c 107.195 87.609 108.262 87.34 109.059
+ 87.074 c 110.125 86.809 111.191 86.543 112.258 86.543 c 112.789 86.543
+113.324 86.543 113.855 86.543 c 114.121 86.543 114.121 86.543 114.121 86.543
+ c 115.453 86.543 l 116.52 86.543 117.852 86.809 118.918 87.074 c 121.316
+ 87.609 123.445 88.406 125.578 89.738 c 129.84 92.137 133.305 95.867 135.703
+ 100.129 c 136.77 102.262 137.57 104.66 138.102 107.055 c 138.102 107.59
+ 138.367 108.391 138.367 108.922 c 138.367 109.988 l 138.367 110.254 138.367
+ 110.254 138.367 110.52 c 138.367 110.785 138.367 110.785 138.367 111.055
+ c 138.367 112.117 l 138.367 112.387 138.367 112.918 138.367 113.184 c 138.367
+ 113.984 138.367 114.516 138.102 115.316 c 138.102 115.848 137.836 116.648
+ 137.836 117.18 c 137.836 117.715 137.566 118.512 137.301 119.047 c 137.035
+ 120.379 136.504 121.711 135.969 122.777 c 134.902 125.176 133.57 127.57
+ 131.973 129.969 c 128.777 134.234 124.512 137.961 119.449 140.094 c 117.055
+ 141.16 114.391 141.961 111.723 142.492 c 110.391 142.758 109.059 142.758
+ 107.727 143.023 c 105.863 143.023 l 106.129 143.023 105.863 143.023 105.863
+ 143.023 c 105.062 143.023 104.531 143.023 103.73 143.023 c 100.801 142.758
+ 97.871 142.227 95.207 141.426 c 92.543 140.629 89.609 139.562 87.215 138.23
+ c 82.152 135.566 77.621 131.836 73.891 127.305 c 72.027 125.176 70.43 122.777
+ 69.363 120.113 c 68.031 117.449 66.965 114.781 66.164 112.117 c 65.367
+109.453 64.832 106.523 64.832 103.859 c 64.832 99.863 l 64.832 99.598 64.832
+ 99.062 64.832 98.797 c 64.832 97.465 65.098 95.867 65.098 94.535 c 65.367
+ 93.203 65.633 91.602 65.898 90.273 c 66.164 88.941 66.43 87.34 66.965 86.008
+ c 67.766 83.344 68.828 80.68 69.895 78.016 c 72.293 72.953 75.223 68.426
+ 78.953 64.961 c 79.754 64.16 80.82 63.098 81.883 62.297 c 82.949 61.496
+ 84.016 60.699 85.082 60.164 c 86.148 59.367 87.215 58.832 88.277 58.301
+ c 88.812 58.035 89.344 57.766 89.879 57.5 c 90.145 57.5 90.41 57.234 90.676
+ 57.234 c 90.941 57.234 91.211 56.969 91.477 56.969 c 92.543 56.434 93.875
+ 56.168 94.941 55.637 c 95.207 55.637 95.473 55.371 95.738 55.371 c 96.004
+ 55.371 96.273 55.102 96.539 55.102 c 97.07 54.836 97.871 54.836 98.402
+54.57 c 98.668 54.57 98.938 54.305 99.469 54.305 c 99.734 54.305 100.004
+ 54.305 100.535 54.039 c 100.801 54.039 101.066 54.039 101.602 53.77 c 102.664
+ 53.77 l 102.934 53.77 103.199 53.77 103.73 53.504 c 103.996 53.504 104.531
+ 53.504 104.797 53.238 c 105.062 53.238 105.598 53.238 105.863 53.238 c
+106.129 53.238 106.398 53.238 106.66 53.238 c 107.727 53.238 l 107.996 53.238
+ 108.527 53.238 108.793 53.238 c 109.328 53.238 l 109.328 53.238 109.594
+ 53.238 109.328 53.238 c 109.594 53.238 l 109.859 53.238 110.125 53.238
+110.391 53.238 c 111.723 53.238 112.789 53.238 114.121 53.238 c 116.52 53.238
+ 118.918 53.504 121.316 54.039 c 125.844 54.836 130.109 56.434 134.105 58.301
+ c 138.102 60.164 141.566 62.562 144.496 65.227 c 144.762 65.492 144.762
+ 65.492 145.027 65.762 c 145.293 66.027 145.293 66.027 145.562 66.293 c
+145.828 66.559 146.359 66.824 146.625 67.359 c 146.895 67.891 147.426 67.891
+ 147.691 68.426 c 147.961 68.957 148.492 69.223 148.758 69.488 c 150.09
+70.824 151.156 72.156 152.223 73.754 c 154.355 76.418 156.219 79.348 157.551
+ 82.012 c 157.551 82.277 157.816 82.277 157.816 82.547 c 157.816 82.812
+158.082 82.812 158.082 83.078 c 158.352 83.344 158.352 83.609 158.617 84.145
+ c 158.883 84.41 158.883 84.676 159.148 85.211 c 159.414 85.477 159.414
+85.742 159.684 86.277 c 160.215 87.609 160.75 88.672 161.016 89.738 c 161.547
+ 91.602 162.078 93.203 162.348 94.535 c 162.613 95.066 163.145 95.602 163.68
+ 95.336 c 164.211 95.336 164.746 94.801 164.746 94.266 c 165.809 91.07 165.809
+ 89.207 165.543 87.34 c h
+165.543 87.34 m W n
+[0.75 0 0 0.75 0 0] concat
+/CairoFunction
+ << /FunctionType 2
+ /Domain [ 0 1 ]
+ /C0 [ 1 0.945098 0 ]
+ /C1 [ 0.941176 0.352941 0.156863 ]
+ /N 1
+ >>
+def
+ << /ShadingType 2
+ /ColorSpace /DeviceRGB
+ /Coords [ 129.039001 282.048004 129.039001 50.682999 ]
+ /Extend [ true true ]
+ /Function CairoFunction
+ >>
+shfill
+Q
+Q Q
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..67fa39b6aa
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Dark.eps
new file mode 100644
index 0000000000..07cbbf52bf
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..fe218f00ec
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Light.eps
new file mode 100644
index 0000000000..7313803495
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_GraphQL-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gulp-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gulp-eps-converted-to.pdf
new file mode 100644
index 0000000000..e7901e25c1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gulp-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Gulp.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gulp.eps
new file mode 100644
index 0000000000..fedc87c753
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Gulp.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_HTML-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_HTML-eps-converted-to.pdf
new file mode 100644
index 0000000000..eab5019500
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_HTML-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_HTML.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_HTML.eps
new file mode 100644
index 0000000000..901a94347e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_HTML.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..e9bc3aae68
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Dark.eps
new file mode 100644
index 0000000000..ac40008c2e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..e314e42b5e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Light-eps-converted-to.pdf
@@ -0,0 +1,79 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmMn0 9EN`?c HYE{E
+VH/C>k->J848gA>{*:QPt{AEN<nCĖHVf QR;,yҙ-G
+eo[Y=Ɲb+;#棦:$g,cd%R p>'NC
+(_Ha˼i{N,8sHcIܮ%Gcؙi؝
+[l,I-WȝI
+&Kt*#%H$F
+y\Z(F^Ρ3Abk
+q"# AcT43Ux l7>[^{endstream
+endobj
+6 0 obj
+326
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:53+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:53+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:8682fdf8-143f-11ef-0000-76e1cb2e7131'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132053+02'00')
+/ModDate(D:20240514132053+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000873 00000 n
+0000002195 00000 n
+0000000814 00000 n
+0000000700 00000 n
+0000000285 00000 n
+0000000681 00000 n
+0000000937 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [(IPdt}t\344\261\366+\367\3749#6W)(IPdt}t\344\261\366+\367\3749#6W)]
+>>
+startxref
+2320
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Light.eps
new file mode 100644
index 0000000000..fbde0ac03c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haskell-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..26f90d59d6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Dark.eps
new file mode 100644
index 0000000000..3db64926ee
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..c9ade87817
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Light.eps
new file mode 100644
index 0000000000..3d1005f97c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Haxe-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..ce606b969e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Dark-eps-converted-to.pdf
@@ -0,0 +1,73 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmQK0spwkś/DgF*m9?;o`01B*QR)lI:^+*˜j:Î]am0RsIoN^!7\v0|J$}BUͼ $[Qsx=kc6quB h-%L&ߧe¢C)NSv7v6!<^É
+a^'wQcXGL1w\v67pU8v w4sf.7O6ʞ,endstream
+endobj
+6 0 obj
+295
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:55+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:55+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:87b42af8-143f-11ef-0000-6d133545f7c0'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132055+02'00')
+/ModDate(D:20240514132055+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000842 00000 n
+0000002164 00000 n
+0000000783 00000 n
+0000000669 00000 n
+0000000285 00000 n
+0000000650 00000 n
+0000000906 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<4D9D6751681C62DF093F09BAD50E2915><4D9D6751681C62DF093F09BAD50E2915>]
+>>
+startxref
+2289
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Dark.eps
new file mode 100644
index 0000000000..e9db73c42e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2fe96a9ced
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Light.eps
new file mode 100644
index 0000000000..963ec88e52
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_HaxeFlixel-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Heroku-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Heroku-eps-converted-to.pdf
new file mode 100644
index 0000000000..5f5acd9126
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Heroku-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Heroku.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Heroku.eps
new file mode 100644
index 0000000000..c16edccc77
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Heroku.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..8b45efcdc2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Dark-eps-converted-to.pdf
@@ -0,0 +1,72 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xPKn0>g3DjoQpHZEJ20|VPHg>0ν~}mXi0g!BNeT'd<){x󒙤mF3./Dqc`H4׬*7  Ea0GGC1ˤ `N]-Äm]R'mcje<tdI@_i ʞamw$yCώa?K.=N i#D|]cW6oTendstream
+endobj
+6 0 obj
+276
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:20:58+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:20:58+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:897dee78-143f-11ef-0000-4c97c27f487e'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132058+02'00')
+/ModDate(D:20240514132058+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000823 00000 n
+0000002145 00000 n
+0000000764 00000 n
+0000000650 00000 n
+0000000285 00000 n
+0000000631 00000 n
+0000000887 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<9EB6EE8FFBAFCF4364D9FF7D001F069A><9EB6EE8FFBAFCF4364D9FF7D001F069A>]
+>>
+startxref
+2270
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Dark.eps
new file mode 100644
index 0000000000..bd035dafe9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..4b9ba0a7b9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Light.eps
new file mode 100644
index 0000000000..ecb22ada81
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Hibernate-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..052aae34aa
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Dark.eps
new file mode 100644
index 0000000000..07f6a9ea7d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..baa4bdd7bf
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Light.eps
new file mode 100644
index 0000000000..9c0d6bc9f2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Htmx-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..54f4b6405e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Dark.eps
new file mode 100644
index 0000000000..b53c4d5dae
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..571c3bbf54
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Light.eps
new file mode 100644
index 0000000000..458c40b44b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_IPFS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..c1f637801c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Dark.eps
new file mode 100644
index 0000000000..7921bb4ac6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2f368419b9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Light.eps
new file mode 100644
index 0000000000..393d703955
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Idea-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Illustrator-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Illustrator-eps-converted-to.pdf
new file mode 100644
index 0000000000..24fa530bc1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Illustrator-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Illustrator.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Illustrator.eps
new file mode 100644
index 0000000000..67fb19c944
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Illustrator.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Instagram-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Instagram-eps-converted-to.pdf
new file mode 100644
index 0000000000..7bfcf50ccb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Instagram-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Instagram.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Instagram.eps
new file mode 100644
index 0000000000..096d20f20e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Instagram.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_JQuery-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_JQuery-eps-converted-to.pdf
new file mode 100644
index 0000000000..41e3ecdcc6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_JQuery-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_JQuery.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_JQuery.eps
new file mode 100644
index 0000000000..fdefbab93e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_JQuery.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..d0e3b1ac2b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Dark.eps
new file mode 100644
index 0000000000..e739cbc9b5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a18449a6a3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Light.eps
new file mode 100644
index 0000000000..a9039d52df
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Java-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_JavaScript-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_JavaScript-eps-converted-to.pdf
new file mode 100644
index 0000000000..10d58ab87f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_JavaScript-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_JavaScript.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_JavaScript.eps
new file mode 100644
index 0000000000..5586b1b8b8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_JavaScript.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..50f634e9c0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Dark.eps
new file mode 100644
index 0000000000..2207e20e06
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..4eabce85de
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Light.eps
new file mode 100644
index 0000000000..bd02d01452
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jenkins-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Jest-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jest-eps-converted-to.pdf
new file mode 100644
index 0000000000..bedec64e3c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jest-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Jest.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jest.eps
new file mode 100644
index 0000000000..1e88033a94
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Jest.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..eeca82a19b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Dark.eps
new file mode 100644
index 0000000000..64c09865f3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a6cc9dbabd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Light-eps-converted-to.pdf
@@ -0,0 +1,76 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xeRA0~26}C 5QH <
+6{<JՆ堤ՃS}VQ{"\(}5I$=3!A#@x)@({l<\E23V<%2?RȊa5 (VJ2ѳҒaaXHA'(63[Fv<2
+)(
+72T>[K3FVR= ¤!lrq>¶ș NAAOħ-ms}HA $\>`k@tIաLܢwf5H0ḄQ
+#)ӣpw|8 Tendstream
+endobj
+6 0 obj
+382
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:21:15+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:21:15+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:939fecf8-143f-11ef-0000-c376b529ce8e'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132115+02'00')
+/ModDate(D:20240514132115+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000929 00000 n
+0000002251 00000 n
+0000000870 00000 n
+0000000756 00000 n
+0000000285 00000 n
+0000000737 00000 n
+0000000993 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<8EA2BFE55EAAF86BF3AEF54312CE2DAE><8EA2BFE55EAAF86BF3AEF54312CE2DAE>]
+>>
+startxref
+2376
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Light.eps
new file mode 100644
index 0000000000..ffb8196186
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Julia-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kafka-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kafka-eps-converted-to.pdf
new file mode 100644
index 0000000000..452dddc09f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kafka-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kafka.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kafka.eps
new file mode 100644
index 0000000000..4a598343d8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kafka.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..3f8344e30e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Dark.eps
new file mode 100644
index 0000000000..e90af053d5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..d8bcba195f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Light.eps
new file mode 100644
index 0000000000..4c4e29c9c3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kali-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..e60f034f12
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Dark-eps-converted-to.pdf
@@ -0,0 +1,155 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x
+ @wH4KHBgl8&Fel1wR
+s78OY7`+p4y8B%KT-Y'ԁBCfTI534g
+\wҡ0{[ک@1X"<+<oNOOendstream
+endobj
+6 0 obj
+171
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ColorSpace 13 0 R
+/Pattern 14 0 R
+/Shading 15 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 16 0 R
+>>
+endobj
+7 0 obj
+[/Pattern]
+endobj
+13 0 obj
+<</R7
+7 0 R>>
+endobj
+14 0 obj
+<</R12
+12 0 R>>
+endobj
+12 0 obj
+<</PatternType 2
+/Shading 11 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+15 0 obj
+<</R11
+11 0 R>>
+endobj
+11 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[217.382
+38.6183
+38
+218]
+/Domain[0.00343514
+1]
+/Function 10 0 R
+/Extend [true true]>>endobj
+9 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.780392
+0.0666667
+0.882353]
+/C1[0.498039
+0.321569
+1]
+/N 1>>endobj
+8 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.894118
+0.282353
+0.341176]
+/C1[0.780392
+0.0666667
+0.882353]
+/N 1>>endobj
+10 0 obj
+<</Functions[8 0 R
+9 0 R]
+/FunctionType 3
+/Domain[0.00343514
+1]
+/Bounds[0.4689]
+/Encode[0
+1
+0
+1]>>endobj
+16 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:21:18+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:21:18+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:9569b078-143f-11ef-0000-8d2a55882c66'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132118+02'00')
+/ModDate(D:20240514132118+02'00')>>endobj
+xref
+0 17
+0000000000 65535 f
+0000000769 00000 n
+0000002781 00000 n
+0000000710 00000 n
+0000000545 00000 n
+0000000285 00000 n
+0000000526 00000 n
+0000000834 00000 n
+0000001291 00000 n
+0000001181 00000 n
+0000001408 00000 n
+0000001034 00000 n
+0000000922 00000 n
+0000000860 00000 n
+0000000890 00000 n
+0000001002 00000 n
+0000001522 00000 n
+trailer
+<< /Size 17 /Root 1 0 R /Info 2 0 R
+/ID [<2776B5279556A4B8E9BC0BA0078EDB0D><2776B5279556A4B8E9BC0BA0078EDB0D>]
+>>
+startxref
+2906
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Dark.eps
new file mode 100644
index 0000000000..78c0048811
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..fd452af223
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Light-eps-converted-to.pdf
@@ -0,0 +1,156 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x
+0L.^:'RHB{@ran@DK"\TH9>r
+'
+8qvA%&v>QzM)4[6NI3BxtVs+CTx_?CZ5Pct=q#aƂߺ
+?;Omendstream
+endobj
+6 0 obj
+171
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ColorSpace 13 0 R
+/Pattern 14 0 R
+/Shading 15 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 16 0 R
+>>
+endobj
+7 0 obj
+[/Pattern]
+endobj
+13 0 obj
+<</R7
+7 0 R>>
+endobj
+14 0 obj
+<</R12
+12 0 R>>
+endobj
+12 0 obj
+<</PatternType 2
+/Shading 11 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+15 0 obj
+<</R11
+11 0 R>>
+endobj
+11 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[217.382
+38.6183
+38
+218]
+/Domain[0.00343514
+1]
+/Function 10 0 R
+/Extend [true true]>>endobj
+9 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.780392
+0.0666667
+0.882353]
+/C1[0.498039
+0.321569
+1]
+/N 1>>endobj
+8 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.894118
+0.282353
+0.341176]
+/C1[0.780392
+0.0666667
+0.882353]
+/N 1>>endobj
+10 0 obj
+<</Functions[8 0 R
+9 0 R]
+/FunctionType 3
+/Domain[0.00343514
+1]
+/Bounds[0.4689]
+/Encode[0
+1
+0
+1]>>endobj
+16 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:21:19+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:21:19+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:960246f8-143f-11ef-0000-f3e1c9d2f426'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132119+02'00')
+/ModDate(D:20240514132119+02'00')>>endobj
+xref
+0 17
+0000000000 65535 f
+0000000769 00000 n
+0000002781 00000 n
+0000000710 00000 n
+0000000545 00000 n
+0000000285 00000 n
+0000000526 00000 n
+0000000834 00000 n
+0000001291 00000 n
+0000001181 00000 n
+0000001408 00000 n
+0000001034 00000 n
+0000000922 00000 n
+0000000860 00000 n
+0000000890 00000 n
+0000001002 00000 n
+0000001522 00000 n
+trailer
+<< /Size 17 /Root 1 0 R /Info 2 0 R
+/ID [<5FB8036A790C17F967694E35956BADBB><5FB8036A790C17F967694E35956BADBB>]
+>>
+startxref
+2906
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Light.eps
new file mode 100644
index 0000000000..adf6189107
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kotlin-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..ebad41d459
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Dark.eps
new file mode 100644
index 0000000000..ffb3d4c5c4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..7fbb6ae03f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Light.eps
new file mode 100644
index 0000000000..b666b8b1a6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ktor-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kubernetes-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kubernetes-eps-converted-to.pdf
new file mode 100644
index 0000000000..1d44a2c55e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kubernetes-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Kubernetes.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kubernetes.eps
new file mode 100644
index 0000000000..816a8554e2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Kubernetes.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..7a609f33fd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Dark.eps
new file mode 100644
index 0000000000..30f411d7e8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..6e1f8fb593
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Light.eps
new file mode 100644
index 0000000000..39258a72e4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_LaTeX-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..afb2a1ca66
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Dark.eps
new file mode 100644
index 0000000000..3a374ee954
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Dark.eps
@@ -0,0 +1,8539 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 256 256
+%%HiResBoundingBox: 0.00 0.00 256.00 256.00
+%%Creator: (Zamzar)
+%%LanguageLevel: 2
+%%CreationDate: D:20240513225134Z00'00'
+%%Pages: 1
+%%Copyright: (Zamzar)
+%%EndComments
+%%BeginProlog
+/DSC_OPDFREAD true def
+/SetPageSize false def
+/EPS2Write true def
+currentdict/DSC_OPDFREAD known{
+currentdict/DSC_OPDFREAD get
+}{
+false
+}ifelse
+10 dict begin
+/DSC_OPDFREAD exch def
+/this currentdict def
+/y 720 def
+/ebuf 200 string def
+/prnt{
+36//this/y get moveto//ebuf cvs show
+//this/y 2 copy get 12 sub put
+}bind def
+/newline{
+36//this/y get moveto
+//this/y 2 copy get 12 sub put
+}bind def
+errordict/handleerror
+{systemdict begin
+$error begin
+newerror
+{(%%[ Error handled by opdfread.ps : )print errorname//ebuf cvs print(; OffendingCommand: )
+print/command load//ebuf cvs print( ]%%)= flush
+/newerror false store vmstatus pop pop 0 ne
+{grestoreall
+}if
+errorname(VMerror)ne
+{showpage
+}if
+initgraphics
+0 720 moveto
+errorname(VMerror)eq
+{//this/ehsave known
+{clear//this/ehsave get restore 2 vmreclaim
+}if
+vmstatus exch pop exch pop
+}
+/Courier 12 selectfont
+{
+(ERROR: )//prnt exec errorname//prnt exec
+(OFFENDING COMMAND: )//prnt exec
+/command load//prnt exec
+$error/ostack known{
+(%%[STACK:)=
+(STACK:)//prnt exec
+$error/ostack get aload length{
+//newline exec
+dup mark eq{
+(-mark-)dup = show
+}{
+dup type/nametype eq{
+dup xcheck not{
+(/)show
+(/)print
+}if
+}if
+dup =//ebuf cvs show
+}ifelse
+}repeat
+}if
+}ifelse
+(%%]%)=
+//systemdict/showpage get exec
+quit
+}if
+end
+end
+}bind readonly put
+end
+50 dict begin
+/DefaultSwitch
+{
+dup where{
+pop pop
+}{
+false def
+}ifelse
+}bind def
+/=string 256 string def
+/=only{
+//=string cvs print
+}bind def
+/HexDigits(0123456789ABCDEF)readonly def
+/PrintHex
+{8{
+dup -28 bitshift 15 and//HexDigits exch 1 getinterval//=only exec
+4 bitshift
+}repeat
+pop
+}bind def
+/PDFR_DEBUG DefaultSwitch
+/PDFR_DUMP DefaultSwitch
+/PDFR_STREAM DefaultSwitch
+/TTFDEBUG DefaultSwitch
+/RotatePages DefaultSwitch
+/FitPages DefaultSwitch
+/CenterPages DefaultSwitch
+/SetPageSize DefaultSwitch
+/error
+{
+counttomark 1 sub -1 0{
+index dup type/arraytype eq{==}{=only}ifelse
+}for
+()=
+cleartomark
+....Undefined
+}bind def
+//SetPageSize{
+//RotatePages//FitPages or//CenterPages or{
+mark(/RotatePages, /FitPages and CenterPages are not allowed with /SetPageSize)//error exec
+}if
+}
+{
+//FitPages//CenterPages and{
+mark(CenterPages is not allowed with /FitPages)//error exec
+}if
+}
+ifelse
+/knownget
+{
+2 copy known{
+get true
+}{
+pop pop false
+}ifelse
+}bind def
+/IsUpper
+{dup(A)0 get ge exch(Z)0 get le and
+}bind def
+/cpa2g{
+dup length array
+0 1 2 index length 1 sub{
+dup 3 index exch get cp2g
+3 copy put pop pop
+}for
+exch pop
+}bind def
+/cpd2g{
+dup length dict exch{
+cp2g 2 index 3 1 roll put
+}forall
+}bind def
+/cps2g{
+dup length string copy
+}bind def
+/cp2gprocs
+<</arraytype//cpa2g/dicttype//cpd2g/packedarraytype//cpa2g/stringtype//cps2g >>
+def
+/cp2g{
+dup gcheck not{
+dup//cp2gprocs 1 index type
+2 copy known{
+get currentglobal 3 1 roll true setglobal exec exch setglobal
+1 index wcheck not{readonly}if
+1 index xcheck{cvx}if
+exch pop
+}{
+pop pop
+}ifelse
+}if
+}bind def
+/BlockBuffer 65535 string def
+/PDFReader currentdict def
+/ObjectRegistryMaxLength 50000 def
+/ObjectRegistry 10 dict def
+ObjectRegistry
+begin
+0 ObjectRegistryMaxLength dict def
+end
+/CurrentObject null def
+/DoneDocumentStructure false def
+/GraphicState 20 dict begin
+/InitialTextMatrix matrix def
+/InitialMatrix matrix currentmatrix def
+currentdict end def
+/TempMatrix matrix def
+/GraphicStateStack 20 array def
+/GraphicStateStackPointer 0 def
+/InitialTextMatrixStack 20 array def
+/InitialTextMatrixStackPointer 0 def
+/PDFColorSpaces 50 dict def
+/InstalledFonts 50 dict def
+/MacRomanEncodingInverse null def
+currentglobal false setglobal
+userdict/PDFR_InitialGS gstate put
+userdict/PDFR_Patterns 50 dict put
+userdict/FuncDataReader 10 dict put
+setglobal
+/InitialExtGState 20 dict begin
+/BG2 currentblackgeneration cp2g def
+/UCR2 currentundercolorremoval cp2g def
+/TR2 currentglobal false setglobal[currentcolortransfer]exch setglobal cp2g def
+/HT currenthalftone cp2g def
+currentdict end readonly def
+/InitialGraphicState 20 dict begin
+/FontSize 0 def
+/CharacterSpacing 0 def
+/TextLeading 0 def
+/TextRenderingMode 0 def
+/WordSpacing 0 def
+currentdict end readonly def
+/SimpleColorSpaceNames 15 dict begin
+/DeviceGray true def
+/DeviceRGB true def
+/DeviceCMYK true def
+currentdict end readonly def
+/1_24_bitshift_1_sub 1 24 bitshift 1 sub def
+/ReadFontProcs 10 dict def
+/GetObject
+{
+dup ObjectRegistryMaxLength idiv
+//PDFReader/ObjectRegistry get exch knownget{
+exch knownget
+}{
+pop false
+}ifelse
+}bind def
+/PutObject
+{
+1 index ObjectRegistryMaxLength idiv
+//PDFReader/ObjectRegistry get 1 index knownget{
+exch pop
+3 1 roll put
+}{
+//PDFReader/ObjectRegistry get dup
+begin
+1 index ObjectRegistryMaxLength dict def
+end
+exch get
+3 1 roll put
+}ifelse
+}bind def
+/Register
+{
+1 index GetObject{
+dup xcheck{
+4 3 roll pop
+//PDFR_DEBUG{
+(Have a daemon for )print 2 index ==
+}if
+exec
+}{
+dup null ne{
+mark(The object )4 index(is already defined : )4 index//error exec
+}{
+pop
+}ifelse
+3 2 roll
+exec
+}ifelse
+}{
+3 2 roll
+exec
+}ifelse
+PutObject
+}bind def
+/IsRegistered
+{
+GetObject{
+null ne
+}{
+false
+}ifelse
+}bind def
+/GetRegistered
+{
+dup GetObject not{
+exch mark exch(Object )exch( isn't defined before needed (1).)//error exec
+}if
+dup xcheck{
+exch mark exch(Object )exch( isn't defined before needed (2).)//error exec
+}{
+dup null eq{
+exch mark exch(Object )exch( isn't defined before needed (3).)//error exec
+}if
+exch pop
+}ifelse
+}bind def
+/StandardFontNames<<
+/Times-Roman true
+/Helvetica true
+/Courier true
+/Symbol true
+/Times-Bold true
+/Helvetica-Bold true
+/Courier-Bold true
+/ZapfDingbats true
+/Times-Italic true
+/Helvetica-Oblique true
+/Courier-Oblique true
+/Times-BoldItalic true
+/Helvetica-BoldOblique true
+/Courier-BoldOblique true
+>>def
+/CleanAllResources
+{//PDFR_DEBUG{
+(CleanAllResources beg)=
+}if
+//PDFReader/ObjectRegistry get{
+dup length 0 exch 1 exch 1 sub{
+2 copy get dup xcheck{
+pop pop
+}{
+dup null eq{
+pop pop
+}{
+dup type/dicttype eq{/.Global known}{pop false}ifelse{
+pop
+}{
+//PDFR_DEBUG{
+(Dropping )print dup =
+}if
+1 index exch/DroppedObject put
+}ifelse
+}ifelse
+}ifelse
+}for
+pop
+}forall
+FontDirectory length dict begin
+FontDirectory{
+pop
+dup//StandardFontNames exch known not{
+dup null def
+}if
+pop
+}forall
+currentdict
+end{
+pop
+//PDFR_DEBUG{
+(Undefining font )print dup =
+}if
+undefinefont
+}forall
+//PDFR_DEBUG{
+(CleanAllResources end)=
+}if
+}bind def
+/PrintReference
+{
+//PDFR_DEBUG{
+({ )print
+dup{
+=only( )print
+}forall
+( })=
+}if
+}bind def
+/R
+{
+0 ne{
+exch mark exch(A referred object generation )exch( isn't 0.)//error exec
+}if
+[
+exch//GetRegistered/exec load
+]cvx
+//PrintReference exec
+}bind def
+/IsObjRef
+{
+dup type/arraytype eq{
+dup length 3 eq{
+dup xcheck exch
+dup 0 get type/integertype eq 3 2 roll and exch
+dup 1 get//GetRegistered eq 3 2 roll and exch
+2 get/exec load eq and
+}{
+pop false
+}ifelse
+}{
+pop false
+}ifelse
+}bind def
+/DoNothing
+{
+}def
+/RunTypeDaemon
+{
+dup type/dicttype eq{
+dup/Type//knownget exec{
+//PDFReader/TypeDaemons get exch
+//knownget exec{
+exec
+}if
+}if
+}if
+}bind def
+/obj
+{
+//PDFR_DEBUG{
+(Defining )print 1 index =only( )print dup =only( obj)=
+}if
+0 ne{
+exch mark exch(An object generation )exch( isn't 0.)//error exec
+}if
+}bind def
+/endobj
+{
+//PDFR_DEBUG{
+(endobj )=
+}if
+count 1 eq{
+pop
+}{
+dup type/dicttype eq{
+dup/.endobj_daemon//knownget exec{
+//PDFR_DEBUG{(.endobj_daemon for )print 2 index =}if
+exec
+}if
+}if
+dup type/dicttype eq{dup/ImmediateExec known}{false}ifelse{
+pop pop
+}{
+//PDFR_DEBUG{
+(Storing )print 1 index =
+}if
+//RunTypeDaemon exec
+//DoNothing 3 1 roll//Register exec
+}ifelse
+}ifelse
+}bind def
+/StoreBlock
+{
+//PDFR_DEBUG{
+(StoreBlock )print//PDFReader/BlockCount get =only(, Length = )print dup length =
+}if
+dup length string copy
+//PDFReader/BlockCount get exch
+//PDFReader/CurrentObject get 3 1 roll
+put
+//PDFReader/BlockCount get 1 add
+//PDFReader exch/BlockCount exch put
+}bind def
+/CheckLength
+{dup type/integertype ne{
+mark(Object length isn't an integer.)//error exec
+}if
+}bind def
+/ResolveD
+{
+3 copy pop get
+dup//IsObjRef exec{
+//PDFR_DEBUG{
+(Resolving )print//PrintReference exec
+}if
+exec
+exch exec
+}{
+exch pop
+}ifelse
+dup 4 1 roll
+put
+}bind def
+/ResolveA
+{2 index 2 index get
+dup//IsObjRef exec{
+exec
+exch exec
+3 copy put
+}{
+exch pop
+}ifelse
+exch pop exch pop
+}bind def
+/StoreStream
+{
+dup//PDFReader exch/CurrentObject exch put
+//PDFReader/BlockCount 0 put
+dup/Length//CheckLength//ResolveD exec
+//PDFR_DEBUG{
+(StoreStream Length = )print dup =
+}if
+currentfile exch()/SubFileDecode filter
+{dup//BlockBuffer readstring{
+//StoreBlock exec
+}{
+//StoreBlock exec
+exit
+}ifelse
+}loop
+pop
+//PDFReader/CurrentObject null put
+//PDFR_DEBUG{
+(StoreStream end.)=
+}if
+}bind def
+/MakeStreamDumper
+{
+//PDFR_DEBUG{
+(MakeStreamDumper beg.)=
+}if
+currentglobal exch dup gcheck setglobal
+[exch
+1 dict dup/c 0 put exch
+1024 string
+{readstring pop
+(StreamDumper )print 1 index/c get =string cvs print( )print
+dup length =string cvs print( <)print dup print(>\n)print
+dup length
+3 2 roll
+dup/c get
+3 2 roll
+add/c exch put
+}/exec load
+]
+cvx 0()/SubFileDecode filter
+exch setglobal
+//PDFR_DEBUG{
+(MakeStreamDumper end.)=
+}if
+}bind def
+/ShortFilterNames 15 dict begin
+/AHx/ASCIIHexDecode def
+/A85/ASCII85Decode def
+/LZW/LZWDecode def
+/Fl/FlateDecode def
+/RL/RunLengthDecode def
+/CCF/CCITTFaxDecode def
+/DCT/DCTDecode def
+currentdict end readonly def
+/AppendFilters
+{
+//PDFR_DEBUG{
+(AppendFilters beg.)=
+}if
+dup 3 1 roll
+/Filter//knownget exec{
+dup type/nametype eq{
+dup//ShortFilterNames exch//knownget exec{
+exch pop
+}if
+2 index/DecodeParms//knownget exec{
+exch
+}if
+filter
+}{
+dup 0 exch 1 exch length 1 sub{
+2 copy get
+dup//ShortFilterNames exch//knownget exec{
+exch pop
+}if
+3 1 roll
+4 index/DecodeParms//knownget exec{
+exch get
+}{
+pop null
+}ifelse
+dup null eq{
+pop 3 1 roll filter exch
+}{
+3 1 roll
+4 1 roll filter exch
+}ifelse
+}for
+pop
+}ifelse
+//PDFR_DEBUG//PDFR_DUMP and{
+//MakeStreamDumper exec
+}if
+}if
+exch pop
+//PDFR_DEBUG{
+(AppendFilters end.)=
+}if
+}bind def
+/ExecuteStream
+{
+dup//PDFReader exch/CurrentObject exch put
+dup/Length//CheckLength//ResolveD exec
+//PDFR_DEBUG{
+(ExecuteStream id = )print 2 index =only( Length = )print dup =
+}if
+//PDFReader/InitialGraphicState get
+//PDFReader/GraphicState get copy pop
+//PDFReader/Operators get begin
+currentfile exch()/SubFileDecode filter
+1 index//AppendFilters exec
+cvx mark exch
+exec
+counttomark 0 ne{
+mark(Data left on ostack after an immediate stream execution.)//error exec
+}if
+cleartomark
+end
+//PDFR_DEBUG{
+(ExecuteStream end.)=
+}if
+//PDFReader/CurrentObject null put
+dup/IsPage known{
+dup/Context get/NumCopies//knownget exec{
+1 sub{
+copypage
+}repeat
+}if
+EPS2Write not{showpage}if
+}if
+}bind def
+/stream
+{
+//PDFR_DEBUG{
+1 index =only( stream)=
+}if
+1 index GetObject{
+dup xcheck{
+exec
+1 index null PutObject
+}{
+pop
+}ifelse
+}if
+dup/ImmediateExec known{
+dup/GlobalExec//knownget exec{
+currentglobal 4 1 roll
+setglobal
+//ExecuteStream exec
+3 2 roll setglobal
+}{
+//ExecuteStream exec
+}ifelse
+}{
+//StoreStream exec
+}ifelse
+dup/.CleanResources//knownget exec{
+/All eq{
+//CleanAllResources exec
+}if
+}if
+}bind def
+/HookFont
+{
+//PDFR_DEBUG{
+(Loaded the font )print dup/FontName get =
+}if
+{
+dup/FontFileType get dup/Type1 eq exch/MMType1 eq or{
+dup/FontName get
+//PDFReader/RemoveFontNamePrefix get exec
+findfont
+exit
+}if
+dup/FontFileType get/TrueType eq{
+//PDFReader/MakeType42 get exec
+//PDFR_DEBUG{
+(Font dict <<)=
+dup{
+1 index/sfnts eq{
+exch pop
+(/sfnts [)print
+{
+(-string\()print length//=only exec(\)- )=
+}forall
+(])=
+}{
+exch//=only exec( )print ==
+}ifelse
+}forall
+(>>)=
+}if
+dup/FontName get exch definefont
+exit
+}if
+mark(FontHook has no proc for )2 index/FontFileType get//error exec
+}loop
+/Font exch put
+}bind def
+/endstream
+{
+}bind def
+/xref
+{
+//PDFR_DEBUG{
+(xref)=
+//PDFR_DUMP{
+//PDFReader/ObjectRegistry get ==
+}if
+}if
+end
+count 0 ne{
+mark(Excessive data on estack at the end of the interpretation.)//error exec
+}if
+currentfile 1(%%EOF)/SubFileDecode filter
+flushfile
+cleardictstack
+}bind def
+/ResolveDict
+{dup{
+pop 1 index exch
+//DoNothing//ResolveD exec
+pop
+}forall
+pop
+}bind def
+/SetupPageView
+{
+//PDFR_DEBUG{
+(SetupPageView beg)=
+}if
+//DSC_OPDFREAD not{
+//GraphicState/InitialMatrix get setmatrix
+}if
+/MediaBox get aload pop
+3 index neg 3 index neg translate
+3 -1 roll sub 3 1 roll exch sub exch
+userdict/.HWMargins//knownget exec{
+aload pop
+}{
+currentpagedevice/.HWMargins//knownget exec{
+aload pop
+}{
+0 0 0 0
+}ifelse
+}ifelse
+currentpagedevice/PageSize get aload pop
+3 -1 roll sub 3 1 roll exch sub exch
+exch 3 index sub exch 3 index sub
+//SetPageSize{
+//PDFR_DEBUG{
+(Setting page size to )print 1 index//=only exec( )print dup =
+}if
+pop pop 3 index 3 index 2 copy
+currentglobal false setglobal 3 1 roll
+currentpagedevice dup/PageSize known{
+/PageSize get aload pop
+}{
+0 0
+}ifelse
+round cvi 2 index round cvi eq
+exch round cvi 3 index round cvi eq and
+{
+//PDFR_DEBUG{(PageSize matches request)== flush}if
+pop pop
+}{
+/MediaRequested where{
+//PDFR_DEBUG{(MediaRequested is true, check against new request)== flush}if
+/MediaRequested get aload pop
+round cvi 2 index round cvi eq
+exch round cvi 3 index round cvi eq and
+{
+//PDFR_DEBUG{(MediaRequested same as current request, ignore)== flush}if
+pop pop false
+}{
+//PDFR_DEBUG{(MediaRequested different to current request)== flush}if
+true
+}ifelse
+}{
+//PDFR_DEBUG{(No MediaRequested yet)== flush}if
+true
+}ifelse
+{
+//PDFR_DEBUG{(Setting pagesize)== flush}if
+2 array astore
+dup/MediaRequested exch def
+<< exch/PageSize exch >>setpagedevice
+}if
+}ifelse
+userdict/PDFR_InitialGS gstate put
+setglobal
+}if
+//RotatePages{
+2 copy gt 6 index 6 index gt ne{
+1 index 5 index le 1 index 5 index le and not
+}{
+false
+}ifelse
+}{
+false
+}ifelse
+{//CenterPages{
+//PDFR_DEBUG{
+(Rotating page, and then centering it)==
+}if
+90 rotate
+0 5 index neg translate
+5 index 1 index exch sub 2 div
+2 index 6 index sub 2 div neg
+translate
+}{
+//FitPages{
+1 index 5 index div 1 index 7 index div
+2 copy gt{
+exch
+}if
+pop dup scale
+}if
+90 rotate
+0 5 index neg translate
+}ifelse
+}{
+//CenterPages{
+//PDFR_DEBUG{
+(Ccentering page)==
+}if
+1 index 6 index sub 2 div
+1 index 6 index sub 2 div
+translate
+}{
+//FitPages{
+1 index 6 index div 1 index 6 index div
+2 copy gt{
+exch
+}if
+pop dup scale
+}if
+}ifelse
+}ifelse
+pop pop
+translate
+pop pop
+//PDFR_DEBUG{
+(SetupPageView end)=
+}if
+}bind def
+/PageContentsDaemon
+{
+//PDFR_DEBUG{
+(Executing PageContentsDaemon for )print 2 index =
+}if
+1 index exch/Context exch put
+dup/ImmediateExec true put
+dup/IsPage true put
+SetPageSize{dup/Context get//SetupPageView exec}if
+}bind def
+/FontFileDaemon
+{
+//PDFR_DEBUG{
+(Executing FontFileDaemon for )print 2 index =
+}if
+dup/FontFileType get
+2 index exch
+dup//ReadFontProcs exch//knownget exec{
+exch pop exec
+}{
+mark(FontFile reader for )2 index( isn't implemented yet.)//error exec
+}ifelse
+//PDFR_DEBUG{
+(FontFileDaemon end)=
+}if
+pop
+}bind def
+/FontDescriptorDaemon
+{
+//PDFR_DEBUG{
+(Executing FontDescriptorDaemon for )print 2 index =
+}if
+2 copy/FontResource exch put
+/Subtype get 1 index exch/FontFileType exch put
+}bind def
+/UnPDFEscape{
+dup dup length string cvs
+dup(#)search{
+{
+pop
+(16#--)2 index 0 2 getinterval
+1 index 3 2 getinterval copy pop
+cvi
+0 exch put
+0
+1 index 2 1 index length 2 sub getinterval
+3 copy putinterval
+length
+3 copy exch put
+getinterval
+(#)search not{
+pop exit
+}if
+}loop
+(\0)search pop exch pop exch pop
+cvn
+exch pop
+}{
+pop pop
+}ifelse
+}bind def
+/TypeDaemons<<
+/Page
+{//PDFR_DEBUG{
+(Recognized a page.)=
+}if
+dup/Contents//knownget exec{
+0 get//DoNothing exch
+[
+3 index//PageContentsDaemon/exec load
+]cvx
+//Register exec
+}{
+(fixme: page with no Contents won't be printed.)=
+}ifelse
+}bind
+/FontDescriptor
+{//PDFR_DEBUG{
+(Recognized a font descriptor.)=
+}if
+dup/FontName//knownget exec{
+1 index/FontName 3 -1 roll//UnPDFEscape exec put
+}if
+dup dup/FontFile known{/FontFile}{/FontFile2}ifelse
+//knownget exec{
+0 get//DoNothing exch
+[
+3 index//FontFileDaemon/exec load
+]cvx
+//Register exec
+}{
+(Font descriptor )print 1 index =only( has no FontFile.)=
+}ifelse
+}bind
+/Font
+{//PDFR_DEBUG{
+(Recognized a font resource.)=
+}if
+dup/BaseFont//knownget exec{
+//UnPDFEscape exec 2 copy/BaseFont exch put
+//PDFReader/RemoveFontNamePrefix get exec
+currentglobal exch
+dup/Font resourcestatus{
+pop pop
+//PDFReader/GetInstalledFont get exec pop
+}{
+pop
+}ifelse
+setglobal
+}if
+dup/FontDescriptor//knownget exec{
+0 get
+dup//IsRegistered exec{
+//PDFR_DEBUG{
+(already registered )print dup =
+}if
+pop
+}{
+//DoNothing exch
+[
+3 index//FontDescriptorDaemon/exec load
+]cvx
+//Register exec
+}ifelse
+}if
+}bind
+>>def
+/MakeStreamReader
+{dup
+[
+exch
+//PDFR_DEBUG{
+(Stream proc )
+/print load
+//PDFR_STREAM{
+(<)
+/print load
+}if
+}if
+1 dict dup/i -1 put
+/dup load
+/i
+/get load
+1
+/add load
+/dup load
+3
+1
+/roll load
+/i
+/exch load
+/put load
+//knownget
+/exec load
+/not load
+{()}
+/if load
+//PDFR_DEBUG{
+//PDFR_STREAM{
+/dup load
+/print load
+(>)
+/print load
+}if
+( end of stream proc.\n)
+/print load
+}if
+]cvx
+//PDFR_DEBUG{
+(Stream reader )print dup ==
+}if
+0()/SubFileDecode filter
+exch//AppendFilters exec
+}bind def
+/RunDelayedStream
+{
+//GraphicState/InitialTextMatrix get
+//InitialTextMatrixStack//PDFReader/InitialTextMatrixStackPointer get
+2 copy get null eq{
+2 copy currentglobal true setglobal matrix exch setglobal put
+}if
+get copy pop
+//PDFReader/InitialTextMatrixStackPointer 2 copy get 1 add put
+//MakeStreamReader exec
+mark exch
+cvx exec
+counttomark 0 ne{
+mark(Data left on ostack after a delayed stream execution.)//error exec
+}if
+cleartomark
+//PDFReader/InitialTextMatrixStackPointer 2 copy get 1 sub put
+//InitialTextMatrixStack//PDFReader/InitialTextMatrixStackPointer get get
+//GraphicState/InitialTextMatrix get
+copy pop
+}bind def
+//ReadFontProcs begin
+/Type1
+{//PDFR_DEBUG{
+(ReadFontProcs.Type1)=
+}if
+dup/.endobj_daemon[4 index//HookFont/exec load]cvx put
+dup/ImmediateExec true put
+/GlobalExec true put
+}bind def
+/MMType1//Type1 def
+/TrueType
+{//PDFR_DEBUG{
+(ReadFontProcs.TrueType)=
+}if
+dup/.endobj_daemon[4 index//HookFont/exec load]cvx put
+pop
+}bind def
+end
+/.opdloadttfontdict 50 dict def
+.opdloadttfontdict begin
+/maxstring 65400 def
+end
+/.InsertionSort
+{
+/CompareProc exch def
+/Array exch def
+1 1 Array length 1 sub
+{
+/Ix exch def
+/Value1 Array Ix get def
+/Jx Ix 1 sub def
+{
+Jx 0 lt{
+exit
+}if
+/Value2 Array Jx get def
+Value1 Value2 CompareProc{
+exit
+}if
+Array Jx 1 add Value2 put
+/Jx Jx 1 sub def
+}loop
+Array Jx 1 add Value1 put
+}for
+Array
+}bind def
+/putu16{
+3 copy -8 bitshift put
+exch 1 add exch 16#ff and put
+}bind def
+/putu32{
+3 copy -16 bitshift putu16
+exch 2 add exch 16#ffff and putu16
+}bind def
+/.readtable{
+dup dup 1 and add string
+dup 0 4 -1 roll getinterval
+3 -1 roll exch
+dup()ne{readstring}if pop pop
+}bind def
+/.readbigtable{
+dup maxstring lt{
+.readtable
+}{
+currentuserparams/VMReclaim get -2 vmreclaim
+[4 2 roll{
+dup maxstring le{exit}if
+1 index maxstring string readstring pop 3 1 roll maxstring sub
+}loop .readtable]
+exch vmreclaim
+}ifelse
+}bind def
+/ReadTTF
+{
+.opdloadttfontdict begin
+/TTFontFile exch def
+/TableDir TTFontFile 12 string readstring pop def
+/tables TTFontFile TableDir 4 getu16 16 mul string readstring pop def
+/tabarray tables length 16 idiv array def
+TableDir 0 4 getinterval(ttcf)eq{
+QUIET not{(Can't handle TrueType font Collections.)=}if
+/.loadttfonttables cvx/invalidfont signalerror
+}{
+0 16 tables length 1 sub{
+dup
+tables exch 16 getinterval
+exch 16 div cvi exch
+tabarray 3 1 roll put
+}for
+}ifelse
+tabarray{exch 8 getu32 exch 8 getu32 gt}.InsertionSort pop
+/Read TableDir length tables length add def
+/tabs[
+tabarray{
+dup 8 getu32
+Read sub
+dup 0 gt{
+dup string TTFontFile exch readstring pop pop
+Read add/Read exch def
+}{
+pop
+}ifelse
+12 getu32
+dup Read add
+/Read exch def
+TTFontFile exch .readbigtable
+}forall
+]def
+end
+}bind def
+/GetLocaType
+{
+0 1 tabarray length 1 sub{
+dup tabarray exch get
+0 4 getinterval(head)eq{
+tabs exch get
+50 gets16
+/LocaType exch def
+exit
+}{
+pop
+}ifelse
+}for
+}bind def
+/GetNumGlyphs
+{
+0 1 tabarray length 1 sub{
+dup tabarray exch get
+0 4 getinterval(maxp)eq{
+tabs exch get
+4 getu16
+/NumGlyphs exch def
+exit
+}{
+pop
+}ifelse
+}for
+}bind def
+/StringToLoca
+{
+/LocaIndex exch def
+/StringOffset 0 def
+{
+dup length StringOffset gt{
+dup
+LocaType 1 eq{
+StringOffset getu32
+LocaArray LocaIndex 3 -1 roll put
+/LocaIndex LocaIndex 1 add def
+/StringOffset StringOffset 4 add
+def
+}{
+StringOffset getu16 2 mul
+LocaArray length LocaIndex gt{
+LocaArray LocaIndex 3 -1 roll put
+}{
+pop
+}ifelse
+/LocaIndex LocaIndex 1 add def
+/StringOffset StringOffset 2 add
+def
+}ifelse
+}{
+pop
+LocaIndex
+exit
+}ifelse
+}loop
+}bind def
+/GetSortedLoca
+{
+NumGlyphs 1 add array/LocaArray exch def
+0 1 tabarray length 1 sub{
+dup tabarray exch get
+0 4 getinterval(loca)eq{
+tabs exch get
+exit
+}{
+pop
+}ifelse
+}for
+dup type/stringtype eq{
+0 StringToLoca pop
+}{
+0 exch
+{
+exch StringToLoca
+}forall
+pop
+}ifelse
+LocaArray{gt}.InsertionSort pop
+}bind def
+/GetWorkingString
+{
+WorkString 0
+GlyfArray GlyfStringIndex get
+putinterval
+/WorkBytes GlyfArray GlyfStringIndex get length def
+/GlyfStringIndex GlyfStringIndex 1 add def
+}bind def
+/GetWorkingBytes
+{
+/BytesToRead exch def
+WorkString 0 BytesToRead getinterval
+dup length string copy
+WorkString BytesToRead WorkBytes BytesToRead sub getinterval
+dup length string copy
+WorkString 0 3 -1 roll putinterval
+/WorkBytes WorkBytes BytesToRead sub def
+}bind def
+/GetGlyfBytes
+{
+/ToRead exch def
+WorkBytes 0 eq{
+GetWorkingString
+}if
+WorkBytes ToRead ge{
+ToRead string dup 0
+ToRead GetWorkingBytes putinterval
+}{
+ToRead string
+dup
+0
+WorkString 0 WorkBytes getinterval
+putinterval
+dup
+WorkBytes
+ToRead WorkBytes sub
+GetWorkingString
+GetWorkingBytes
+putinterval
+}ifelse
+}bind def
+/SplitGlyf
+{
+/GlyfArray exch def
+/DestArray GlyfArray length 2 mul array def
+/DestArrayIndex 0 def
+/LastLoca 0 def
+/NextLocaIndex 0 def
+/LastLocaIndex 0 def
+/GlyfStringIndex 0 def
+/WorkString maxstring string def
+/WorkBytes 0 def
+{
+LocaArray NextLocaIndex get
+LastLoca sub maxstring gt
+{
+LocaArray LastLocaIndex get LastLoca sub
+GetGlyfBytes
+DestArray DestArrayIndex 3 -1 roll put
+/DestArrayIndex DestArrayIndex 1 add def
+LocaArray LastLocaIndex get/LastLoca exch def
+}{
+/LastLocaIndex NextLocaIndex def
+/NextLocaIndex NextLocaIndex 1 add def
+NextLocaIndex NumGlyphs gt
+{
+WorkBytes
+GlyfStringIndex GlyfArray length lt{
+GlyfArray GlyfStringIndex get length
+add string dup
+0
+WorkString 0 WorkBytes getinterval
+putinterval
+dup
+WorkBytes
+GetWorkingString
+WorkString 0 WorkBytes getinterval
+putinterval
+}{
+pop
+WorkString 0 WorkBytes getinterval
+}ifelse
+dup length string copy
+DestArray DestArrayIndex 3 -1 roll put
+exit
+}if
+}ifelse
+}loop
+DestArray
+}bind def
+/ProcessTTData
+{
+.opdloadttfontdict begin
+0 1 tabarray length 1 sub{
+/ix exch def
+tabarray ix get
+12 getu32 dup maxstring le{
+dup 4 mod 0 ne{
+4 div cvi 1 add 4 mul string/newstring exch def
+/oldstring tabs ix get def
+newstring 0 oldstring putinterval
+0 1 newstring length oldstring length sub 1 sub{
+newstring exch oldstring length add 0 put
+}for
+tabs ix newstring put
+}{
+pop
+}ifelse
+}{
+dup 4 mod 0 ne{
+dup maxstring idiv maxstring mul sub
+4 idiv 1 add 4 mul string/newstring exch def
+tabs ix get
+dup length 1 sub dup/iy exch def get/oldstring exch def
+newstring 0 oldstring putinterval
+0 1 newstring length oldstring length sub 1 sub{
+newstring exch oldstring length add 0 put
+}for
+tabs ix get iy newstring put
+}{
+pop
+}ifelse
+}ifelse
+}for
+0 1 tabarray length 1 sub{
+dup tabarray exch get
+dup 12 getu32 maxstring gt{
+0 4 getinterval dup(glyf)eq{
+pop
+GetLocaType
+GetNumGlyphs
+GetSortedLoca
+dup tabs exch get
+SplitGlyf
+tabs 3 1 roll put
+}{
+(Warning, table )print print( > 64Kb\n)print
+pop
+}ifelse
+}{
+pop
+pop
+}ifelse
+}for
+end
+}bind def
+/Makesfnts
+{
+.opdloadttfontdict begin
+0
+tabs{
+dup type/stringtype eq{
+pop
+1 add
+}{
+{
+type/stringtype eq{
+1 add
+}if
+}forall
+}ifelse
+}forall
+1 add
+/TTOffset
+TableDir length
+tabarray length 16 mul add
+def
+0
+tabarray{
+exch dup 1 add
+3 1 roll
+dup
+tabs exch get
+dup type/stringtype eq{
+length
+2 index exch
+TTOffset
+dup 3 1 roll add
+/TTOffset exch def
+8 exch putu32
+exch tabarray 3 1 roll
+put
+}{
+0 exch
+{
+dup type/stringtype eq{
+length add
+}{
+pop
+}ifelse
+}forall
+2 index exch
+TTOffset
+dup 3 1 roll add
+/TTOffset exch def
+8 exch putu32
+exch tabarray 3 1 roll
+put
+}ifelse
+}forall
+pop
+array
+dup 0
+TableDir length
+tables length add
+string
+dup 0 TableDir putinterval
+dup 12 tables putinterval
+put
+dup
+/ix 1 def
+tabs{
+dup type/stringtype eq{
+ix exch
+put dup
+/ix ix 1 add def
+}{
+{
+dup type/stringtype eq{
+ix exch put dup
+/ix ix 1 add def
+}{
+pop
+}ifelse
+}forall
+}ifelse
+}forall
+pop
+end
+}bind def
+/MakeType42
+{
+//PDFR_DEBUG{
+(MakeType42 beg)=
+}if
+10 dict begin
+/FontName 1 index/FontName get def
+/FontType 42 def
+/FontMatrix[1 0 0 1 0 0]def
+/FontBBox 1 index/FontBBox get def
+dup/FontResource get
+dup/Encoding known{
+//PDFReader/ObtainEncoding get exec
+/Encoding get
+}{
+pop null
+}ifelse
+/PDFEncoding exch def
+/CharStrings 2 index//PDFReader/MakeTTCharStrings get exec def
+/sfnts 2 index//MakeStreamReader exec
+ReadTTF
+ProcessTTData
+Makesfnts
+def
+/Encoding StandardEncoding def
+/PaintType 0 def
+currentdict end
+//PDFR_DEBUG{
+(MakeType42 end)=
+}if
+}bind def
+/GetInstalledFont
+{
+dup//InstalledFonts exch knownget{
+exch pop
+}{
+dup findfont dup 3 1 roll
+//InstalledFonts 3 1 roll put
+}ifelse
+}bind def
+/RemoveFontNamePrefix
+{//=string cvs true
+0 1 5{
+2 index exch get//IsUpper exec not{
+pop false exit
+}if
+}for
+{(+)search{
+pop pop
+}if
+}if
+cvn
+}bind def
+/CheckFont
+{dup/Type get/Font ne{
+mark(Resource )3 index( must have /Type/Font .)//error exec
+}if
+}bind def
+/CheckEncoding
+{dup type/nametype ne{
+dup/Type get/Encoding ne{
+mark(Resource )3 index( must have /Type/Encoding .)//error exec
+}if
+}if
+}bind def
+/ObtainEncoding
+{dup/Encoding known{
+dup dup/Encoding//CheckEncoding//ResolveD exec
+dup type dup/arraytype eq exch/packedarraytype eq or{
+pop pop
+}{
+dup type/nametype eq{
+/Encoding findresource
+}{
+dup/BaseEncoding//knownget exec not{
+/StandardEncoding
+}if
+/Encoding findresource
+exch
+/Differences//knownget exec{
+exch dup length array copy exch
+0 exch
+{
+dup type/integertype eq{
+exch pop
+}{
+3 copy put pop
+1 add
+}ifelse
+}forall
+pop
+}if
+}ifelse
+/Encoding exch put
+}ifelse
+}{
+dup/Encoding/StandardEncoding/Encoding findresource put
+}ifelse
+}bind def
+/ObtainMetrics
+{dup/Widths//knownget exec{
+1 index/Encoding get
+256 dict
+3 index/Subtype get/TrueType eq{
+1000
+}{
+1
+}ifelse
+4 index/MissingWidth//knownget exec not{
+0
+}if
+5 index/FirstChar//knownget exec not{
+0
+}if
+6 5 roll
+dup 0 exch 1 exch length 1 sub{
+2 copy get
+exch 3 index add
+7 index exch get
+dup dup null ne exch/.notdef ne and{
+6 index 3 1 roll exch
+6 index div
+3 copy pop//knownget exec{
+0 eq
+}{
+true
+}ifelse
+{put
+}{
+pop pop pop
+}ifelse
+}{
+pop pop
+}ifelse
+}for
+pop pop pop pop exch pop
+1 index exch/Metrics exch put
+}{
+dup/MissingWidth//knownget exec{
+256 dict
+2 index/Encoding get{
+dup null ne{
+3 copy 3 2 roll put
+}if
+pop
+}forall
+exch pop
+1 index exch/Metrics exch put
+}if
+}ifelse
+}bind def
+/NotDef
+{
+FontMatrix aload pop pop pop exch pop exch pop
+1 exch div exch
+1 exch div exch
+1 index 0 setcharwidth
+0 setlinewidth
+0 0 moveto
+2 copy rlineto
+1 index 0 rlineto
+neg exch neg exch rlineto
+closepath stroke
+}bind def
+/SaveResourcesToStack
+{
+[
+//PDFReader/OldResources known{
+//PDFReader/OldResources get
+}{
+null
+}ifelse
+//PDFReader/CurrentObject get/Context get/Resources get
+]
+//PDFReader/OldResources 3 -1 roll put
+}bind def
+/RestoreResourcesFromStack
+{
+//PDFReader/OldResources get dup
+0 get//PDFReader/OldResources 3 -1 roll put
+1 get//PDFReader/CurrentObject get/Context get/Resources 3 -1 roll put
+}bind def
+/BuildChar
+{//PDFR_DEBUG{
+(BuildChar )print dup//=only exec( )print
+}if
+exch begin
+Encoding exch get
+//PDFR_DEBUG{
+dup =
+}if
+dup null eq{
+pop//NotDef exec
+}
+{
+CharProcs exch//knownget exec
+{
+currentfont/Font get/Resources//knownget exec{
+exec
+SaveResourcesToStack
+//PDFReader/CurrentObject get/Context get
+/Resources 3 -1 roll put
+//RunDelayedStream exec
+RestoreResourcesFromStack
+}{
+//RunDelayedStream exec
+}ifelse
+}
+{
+//NotDef exec
+}ifelse
+}ifelse
+end
+}bind def
+/printdict
+{(<<)=
+{exch = ==}forall
+(>>)=
+}bind def
+/printfont
+{
+dup{
+exch dup =
+dup/Encoding eq{
+pop =
+}{
+dup/FontInfo eq exch/Private eq or{
+//printdict exec
+}{
+==
+}ifelse
+}ifelse
+}forall
+}bind def
+/ScaleMetrics
+{1 index{
+2 index div
+3 index
+3 1 roll put
+}forall
+pop
+}bind def
+/ResolveAndSetFontAux
+{exch dup
+//PDFReader/CurrentObject get/Context get/Resources get
+/Font//DoNothing//ResolveD exec
+exch//CheckFont//ResolveD exec
+dup/Font//knownget exec{
+exch pop exch pop
+}{
+{
+dup/Subtype get dup dup/Type1 eq exch/TrueType eq or exch/MMType1 eq or{
+exch pop
+dup/BaseFont get
+//RemoveFontNamePrefix exec
+//PDFR_DEBUG{
+(Font )print dup =
+}if
+1 index/FontDescriptor known{
+//PDFR_DEBUG{
+(Font from a font descriptor.)=
+}if
+1 index
+/FontDescriptor//DoNothing//ResolveD exec
+/Font//knownget exec{
+exch pop
+}{
+//PDFR_DEBUG{
+(Font descriptor has no Font resolved.)=
+}if
+//GetInstalledFont exec
+}ifelse
+}{
+//GetInstalledFont exec
+}ifelse
+exch
+dup/Encoding known not{
+1 index/Encoding get 1 index exch/Encoding exch put
+}if
+//ObtainEncoding exec
+//ObtainMetrics exec
+exch
+dup length dict copy
+dup 2 index/Encoding get
+/Encoding exch put
+1 index/Metrics//knownget exec{
+2 index/Subtype get/TrueType ne{
+1 index/FontMatrix get 0 get
+dup 0 eq{
+pop
+1 index/FontMatrix get 1 get
+dup 0 eq{pop 1}if
+}if
+0.001 div
+//ScaleMetrics exec
+}{
+1 index/sfnts known not{
+1 index/FontMatrix get 0 get
+dup 0 eq{
+pop
+1 index/FontMatrix get 1 get
+dup 0 eq{pop 1}if
+}if
+//ScaleMetrics exec
+}if
+}ifelse
+1 index exch/Metrics exch put
+}if
+1 index/BaseFont get
+exch
+dup/FID undef
+dup/UniqueID undef
+definefont
+dup 3 1 roll
+/Font exch put
+exit
+}if
+dup/Subtype get/Type3 eq{
+//ObtainEncoding exec
+2 copy exch/FontName exch put
+dup/CharProcs get//ResolveDict exec
+dup/FontType 3 put
+dup/BuildChar//BuildChar put
+dup dup/Font exch put
+dup 3 1 roll
+definefont
+2 copy ne{
+2 copy/Font exch put
+}if
+exch pop
+exit
+}if
+dup/Subtype get/Type0 eq{
+}if
+dup/Subtype get/CIDFontType0 eq{
+}if
+dup/Subtype get/CIDFontType2 eq{
+}if
+mark(Unknown font type )2 index/Subtype get//error exec
+}loop
+}ifelse
+exch scalefont setfont
+}bind def
+/ResolveAndSetFont
+{
+//ResolveAndSetFontAux exec
+}bind def
+/.knownget
+{2 copy known{
+get true
+}{
+pop pop false
+}ifelse
+}bind def
+/.min
+{2 copy lt{
+exch
+}if
+pop
+}bind def
+/.max
+{2 copy gt{
+exch
+}if
+pop
+}bind def
+/.dicttomark
+{>>
+}bind def
+/getu16{
+2 copy get 8 bitshift 3 1 roll 1 add get add
+}bind def
+/gets16{
+getu16 16#8000 xor 16#8000 sub
+}bind def
+/getu32{
+2 copy getu16 16 bitshift 3 1 roll 2 add getu16 add
+}bind def
+/gets32{
+2 copy gets16 16 bitshift 3 1 roll 2 add getu16 add
+}bind def
+/cmapformats mark
+0{
+6 256 getinterval{}forall 256 packedarray
+}bind
+2{
+/sHK_sz 2 def
+/sH_sz 8 def
+dup 2 getu16/cmapf2_tblen exch def
+dup 4 getu16/cmapf2_lang exch def
+dup 6 256 sHK_sz mul getinterval/sHKs exch def
+0
+0 1 255{
+sHKs exch
+2 mul getu16
+1 index
+1 index
+lt{exch}if pop
+}for
+/sH_len exch def
+dup 6 256 sHK_sz mul add
+cmapf2_tblen 1 index sub getinterval
+/sH_gIA exch def
+/cmapf2_glyph_array 65535 array def
+/.cmapf2_putGID{
+/cmapf2_ch cmapf2_ch_hi 8 bitshift cmapf2_ch_lo add def
+firstCode cmapf2_ch_lo le
+cmapf2_ch_lo firstCode entryCount add lt
+and{
+sH_offset idRangeOffset add
+cmapf2_ch_lo firstCode sub 2 mul
+add 6 add
+sH_gIA exch getu16
+dup 0 gt{
+idDelta add
+cmapf2_glyph_array exch cmapf2_ch exch put
+}{
+pop
+}ifelse
+}{
+}ifelse
+}def
+16#00 1 16#ff{
+/cmapf2_ch_hi exch def
+sHKs cmapf2_ch_hi sHK_sz mul getu16
+/sH_offset exch def
+sH_gIA sH_offset sH_sz getinterval
+dup 0 getu16/firstCode exch def
+dup 2 getu16/entryCount exch def
+dup 4 gets16/idDelta exch def
+dup 6 getu16/idRangeOffset exch def
+pop
+sH_offset 0 eq{
+/cmapf2_ch_lo cmapf2_ch_hi def
+/cmapf2_ch_hi 0 def
+.cmapf2_putGID
+}{
+16#00 1 16#ff{
+/cmapf2_ch_lo exch def
+.cmapf2_putGID
+}for
+}ifelse
+}for
+pop
+0 1 cmapf2_glyph_array length 1 sub{
+dup cmapf2_glyph_array exch get
+null eq{cmapf2_glyph_array exch 0 put}{pop}ifelse
+}for
+cmapf2_glyph_array
+}bind
+4{
+/etab exch def
+/nseg2 etab 6 getu16 def
+14/endc etab 2 index nseg2 getinterval def
+2 add
+nseg2 add/startc etab 2 index nseg2 getinterval def
+nseg2 add/iddelta etab 2 index nseg2 getinterval def
+nseg2 add/idroff etab 2 index nseg2 getinterval def
+pop
+/firstcode startc 0 getu16 16#ff00 and dup 16#f000 ne{pop 0}if def
+/lastcode firstcode def
+/striptopbyte false def
+/putglyph{
+glyphs code 3 -1 roll put/code code 1 add def
+}bind def
+/numcodes 0 def/glyphs 0 0 2 nseg2 3 sub{
+/i2 exch def
+/scode startc i2 getu16 def
+/ecode endc i2 getu16 def
+ecode lastcode gt{
+/lastcode ecode def
+}if
+}for pop
+firstcode 16#f000 ge lastcode firstcode sub 255 le and{
+lastcode 255 and
+/striptopbyte true def
+}{
+lastcode
+}ifelse
+1 add
+array def
+glyphs length 1024 ge{
+.array1024z 0 1024 glyphs length 1023 sub{glyphs exch 2 index putinterval}for
+glyphs dup length 1024 sub 3 -1 roll
+putinterval
+}{
+0 1 glyphs length 1 sub{glyphs exch 0 put}for
+}ifelse
+/numcodes 0 def/code 0 def
+0 2 nseg2 3 sub{
+/i2 exch def
+/scode startc i2 getu16 def
+/ecode endc i2 getu16 def
+numcodes scode firstcode sub
+exch sub 0 .max dup/code exch code exch add def
+ecode scode sub 1 add add numcodes add/numcodes exch def
+/delta iddelta i2 gets16 def
+TTFDEBUG{
+(scode=)print scode =only
+( ecode=)print ecode =only
+( delta=)print delta =only
+( droff=)print idroff i2 getu16 =
+}if
+idroff i2 getu16 dup 0 eq{
+pop scode delta add 65535 and 1 ecode delta add 65535 and
+striptopbyte{
+/code scode 255 and def
+}{
+/code scode def
+}ifelse
+{putglyph}for
+}{
+/gloff exch 14 nseg2 3 mul add 2 add i2 add add def
+striptopbyte{
+/code scode 255 and def
+}{
+/code scode def
+}ifelse
+0 1 ecode scode sub{
+2 mul gloff add etab exch getu16
+dup 0 ne{delta add 65535 and}if putglyph
+}for
+}ifelse
+}for glyphs/glyphs null def
+}bind
+6{
+dup 6 getu16/firstcode exch def dup 8 getu16/ng exch def
+firstcode ng add array
+0 1 firstcode 1 sub{2 copy 0 put pop}for
+dup firstcode ng getinterval
+0 1 ng 1 sub{
+dup 2 mul 10 add 4 index exch getu16 3 copy put pop pop
+}for pop exch pop
+}bind
+.dicttomark readonly def
+/cmaparray{
+dup 0 getu16 cmapformats exch .knownget{
+TTFDEBUG{
+(cmap: format )print 1 index 0 getu16 = flush
+}if exec
+}{
+(Can't handle format )print 0 getu16 = flush
+0 1 255{}for 256 packedarray
+}ifelse
+TTFDEBUG{
+(cmap: length=)print dup length = dup ==
+}if
+}bind def
+/postremap mark
+/Cdot/Cdotaccent
+/Edot/Edotaccent
+/Eoverdot/Edotaccent
+/Gdot/Gdotaccent
+/Ldot/Ldotaccent
+/Zdot/Zdotaccent
+/cdot/cdotaccent
+/edot/edotaccent
+/eoverdot/edotaccent
+/gdot/gdotaccent
+/ldot/ldotaccent
+/zdot/zdotaccent
+.dicttomark readonly def
+/get_from_stringarray
+{1 index type/stringtype eq{
+get
+}{
+exch{
+2 copy length ge{
+length sub
+}{
+exch get exit
+}ifelse
+}forall
+}ifelse
+}bind def
+/getinterval_from_stringarray
+{
+2 index type/stringtype eq{
+getinterval
+}{
+string exch 0
+4 3 roll{
+dup length
+dup 4 index lt{
+3 index exch sub
+exch pop 3 1 roll exch pop
+}{
+dup 3 1 roll
+4 index sub
+5 index length 4 index sub
+2 copy gt{exch}if pop
+dup 3 1 roll
+5 index exch getinterval
+5 index 4 index 3 index
+getinterval
+copy pop
+exch pop add exch pop 0 exch
+dup 3 index length ge{exit}if
+}ifelse
+}forall
+pop pop
+}ifelse
+}bind def
+/string_array_size
+{dup type/stringtype eq{
+length
+}{
+0 exch{length add}forall
+}ifelse
+}bind def
+/postformats mark
+16#00010000{
+pop MacGlyphEncoding
+}
+16#00020000{
+dup dup type/arraytype eq{0 get}if length 36 lt{
+TTFDEBUG{(post format 2.0 invalid.)= flush}if
+pop[]
+}{
+/postglyphs exch def
+/post_first postglyphs dup type/arraytype eq{0 get}if def
+post_first 32 getu16/numglyphs exch def
+/glyphnames numglyphs 2 mul 34 add def
+/postpos glyphnames def
+/total_length postglyphs//string_array_size exec def
+numglyphs array 0 1 numglyphs 1 sub{
+postpos total_length ge{
+1 numglyphs 1 sub{1 index exch/.notdef put}for
+exit
+}if
+postglyphs postpos//get_from_stringarray exec
+postglyphs postpos 1 add 2 index//getinterval_from_stringarray exec cvn
+exch postpos add 1 add/postpos exch def
+2 index 3 1 roll
+put
+}for
+/postnames exch def
+numglyphs array 0 1 numglyphs 1 sub{
+dup 2 mul 34 add postglyphs exch 2//getinterval_from_stringarray exec
+dup 0 get 8 bitshift exch 1 get add dup 258 lt{
+MacGlyphEncoding exch get
+}{
+dup 32768 ge{
+pop/.notdef
+}{
+258 sub dup postnames length ge{
+TTFDEBUG{( *** warning: glyph index past end of 'post' table)= flush}if
+pop
+exit
+}if
+postnames exch get
+postremap 1 index .knownget{exch pop}if
+}ifelse
+}ifelse
+2 index 3 1 roll put
+}for
+}
+ifelse
+}bind
+16#00030000{
+pop[]
+}bind
+.dicttomark readonly def
+/first_post_string
+{
+post dup type/arraytype eq{0 get}if
+}bind def
+/.getpost{
+/glyphencoding post null eq{
+TTFDEBUG{(post missing)= flush}if[]
+}{
+postformats first_post_string 0 getu32 .knownget{
+TTFDEBUG{
+(post: format )print
+first_post_string
+dup 0 getu16 =only(,)print 2 getu16 = flush
+}if
+post exch exec
+}{
+TTFDEBUG{(post: unknown format )print post 0 getu32 = flush}if[]
+}ifelse
+}ifelse def
+}bind def
+/MacRomanEncoding[
+StandardEncoding 0 39 getinterval aload pop
+/quotesingle
+StandardEncoding 40 56 getinterval aload pop
+/grave
+StandardEncoding 97 31 getinterval aload pop
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave
+/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde
+/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
+/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
+/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
+/questiondown/exclamdown/logicalnot/.notdef
+/florin/.notdef/.notdef/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright
+/quoteleft/quoteright/divide/.notdef
+/ydieresis/Ydieresis/fraction/currency
+/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase
+/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex
+/Idieresis/Igrave/Oacute/Ocircumflex
+/.notdef/Ograve/Uacute/Ucircumflex
+/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+]/Encoding defineresource pop
+/TTParser<<
+/Pos 0
+/post null
+>>def
+/readu8
+{read not{
+mark(Insufficient data in the stream.)//error exec
+}if
+}bind def
+/readu16
+{dup//readu8 exec 8 bitshift exch//readu8 exec or
+}bind def
+/reads16
+{//readu16 exec 16#8000 xor 16#8000 sub
+}bind def
+/readu32
+{dup//readu16 exec 16 bitshift exch//readu16 exec or
+}bind def
+/reads32
+{dup//reads16 exec 16 bitshift exch//readu16 exec or
+}bind def
+/SkipToPosition
+{dup//TTParser/Pos get
+exch//TTParser exch/Pos exch put
+sub
+//PDFR_DEBUG{
+(Skipping )print dup//=only exec( bytes.)=
+}if
+dup 0 eq{
+pop pop
+}{
+dup 3 1 roll
+()/SubFileDecode filter
+exch
+{1 index//BlockBuffer readstring pop length
+dup 0 eq{pop exch pop exit}if
+sub
+}loop
+0 ne{
+mark(Insufficient data in the stream for SkipToPosition.)//error exec
+}if
+}ifelse
+}bind def
+/TagBuffer 4 string def
+/ParseTTTableDirectory
+{//PDFR_DEBUG{
+(ParseTTTableDirectory beg)=
+}if
+15 dict begin
+dup//readu32 exec 16#00010000 ne{
+mark(Unknown True Type version.)//error exec
+}if
+dup//readu16 exec/NumTables exch def
+dup//readu16 exec/SearchRange exch def
+dup//readu16 exec/EntrySelector exch def
+dup//readu16 exec/RangeShift exch def
+//PDFR_DEBUG{
+(NumTables = )print NumTables =
+}if
+NumTables{
+dup//TagBuffer readstring not{
+mark(Could not read TT tag.)//error exec
+}if
+cvn
+[2 index//readu32 exec pop
+2 index//readu32 exec
+3 index//readu32 exec
+]
+//PDFR_DEBUG{
+2 copy exch//=only exec( )print ==
+}if
+def
+}repeat
+pop
+//TTParser/Pos 12 NumTables 16 mul add put
+currentdict end
+//PDFR_DEBUG{
+(ParseTTTableDirectory end)=
+}if
+}bind def
+/ParseTTcmap
+{//PDFR_DEBUG{
+(ParseTTcmap beg)=
+}if
+/cmap get aload pop
+3 1 roll
+7 dict begin
+//PDFR_DEBUG{
+(Current position = )print//TTParser/Pos get =
+(cmap position = )print dup =
+}if
+1 index exch//SkipToPosition exec
+//TTParser/Pos get/TablePos exch def
+dup//readu16 exec pop
+dup//readu16 exec/NumEncodings exch def
+//PDFR_DEBUG{
+(NumEncodings = )print NumEncodings =
+}if
+null
+NumEncodings{
+1 index//readu32 exec
+2 index//readu32 exec
+3 array dup 3 2 roll 0 exch put
+2 index null ne{
+dup 0 get 3 index 0 get sub
+3 index exch 1 exch put
+}if
+dup 4 3 roll pop 3 1 roll
+def
+}repeat
+dup 0 get
+4 3 roll exch sub
+1 exch put
+//PDFR_DEBUG{
+currentdict{
+exch dup type/integertype eq{
+//PrintHex exec( )print ==
+}{
+pop pop
+}ifelse
+}forall
+}if
+4 NumEncodings 8 mul add/HeaderLength exch def
+//TTParser/Pos//TTParser/Pos get HeaderLength add put
+0
+NumEncodings{
+16#7FFFFFF null
+currentdict{
+1 index type/integertype eq{
+exch pop dup 0 get
+dup 5 index gt{
+dup 4 index lt{
+4 1 roll
+exch pop exch pop
+}{
+pop pop
+}ifelse
+}{
+pop pop
+}ifelse
+}{
+pop pop
+}ifelse
+}forall
+//PDFR_DEBUG{
+(Obtaining subtable for )print dup ==
+}if
+3 2 roll pop
+3 copy pop
+TablePos add//SkipToPosition exec
+3 copy exch pop 1 get
+//TTParser/Pos//TTParser/Pos get 3 index add put
+string
+readstring not{
+mark(Can't read a cmap subtable.)//error exec
+}if
+2 exch put
+}repeat
+pop pop
+currentdict end
+//PDFR_DEBUG{
+(ParseTTcmap end)=
+}if
+}bind def
+/GetTTEncoding
+{//PDFR_DEBUG{
+(GetTTEncoding beg)=
+}if
+get
+exch pop
+2 get
+10 dict begin
+/TTFDEBUG//PDFR_DEBUG def
+//cmaparray exec
+end
+//PDFR_DEBUG{
+(GetTTEncoding end)=
+dup ==
+}if
+}bind def
+/InverseEncoding
+{
+256 dict begin
+dup length 1 sub -1 0{
+2 copy get
+exch
+1 index currentdict exch//knownget exec{
+dup type/arraytype eq{
+aload length 1 add array astore
+}{
+2 array astore
+}ifelse
+}if
+def
+}for
+pop
+currentdict end
+}bind def
+/GetMacRomanEncodingInverse
+{//PDFReader/MacRomanEncodingInverse get
+dup null eq{
+pop
+MacRomanEncoding//InverseEncoding exec
+dup//PDFReader exch/MacRomanEncodingInverse exch put
+}if
+}bind def
+/PutCharStringSingle
+{
+dup 3 index length lt{
+2 index exch get
+dup 0 ne{
+def
+}{
+pop pop
+}ifelse
+}{
+pop pop
+}ifelse
+}bind def
+/PutCharString
+{1 index type/nametype ne{
+mark(Bad charstring name)//error exec
+}if
+dup type/arraytype eq{
+{
+3 copy//PutCharStringSingle exec
+pop pop
+}forall
+pop
+}{
+//PutCharStringSingle exec
+}ifelse
+}bind def
+/ComposeCharStrings
+{
+//PDFR_DEBUG{
+(ComposeCharStrings beg)=
+}if
+1 index length 1 add dict begin
+/.notdef 0 def
+exch
+//TTParser/post get
+dup null ne{
+exch
+1 index length 1 sub -1 0{
+dup 3 index exch get exch
+dup 0 eq 2 index/.notdef eq or{
+pop pop
+}{
+def
+}ifelse
+}for
+}if
+exch pop exch
+{
+//PutCharString exec
+}forall
+pop
+currentdict end
+//PDFR_DEBUG{
+(ComposeCharStrings end)=
+}if
+}bind def
+/ParseTTpost
+{
+//PDFR_DEBUG{
+(ParseTTpost beg)=
+}if
+/post get aload pop
+3 1 roll
+//PDFR_DEBUG{
+(Current position = )print//TTParser/Pos get =
+(post position = )print dup =
+}if
+1 index exch//SkipToPosition exec
+//TTParser/Pos//TTParser/Pos get 4 index add put
+exch dup 65535 le{
+string
+readstring not{
+mark(Insufficient data in the stream for ParseTTpost.)//error exec
+}if
+}{
+[3 1 roll
+dup 16384 div floor cvi
+exch 1 index 16384 mul
+sub exch
+1 sub 0 1 3 -1 roll
+{
+1 add index
+16384 string readstring not{
+mark(Insufficient data in the stream for ParseTTpost.)//error exec
+}if
+}for
+counttomark -2 roll
+string readstring not{
+mark(Insufficient data in the stream for ParseTTpost.)//error exec
+}if
+]
+}ifelse
+1 dict begin
+/post exch def
+//.getpost exec
+//TTParser/post glyphencoding put
+//PDFR_DEBUG{
+(ParseTTpost end)=
+glyphencoding ==
+}if
+end
+}bind def
+/MakeTTCharStrings
+{//MakeStreamReader exec
+dup dup//ParseTTTableDirectory exec
+//TTParser/post null put
+dup/post//knownget exec{
+0 get
+1 index/cmap get 0 get
+lt{
+2 copy//ParseTTpost exec
+//ParseTTcmap exec
+}{
+2 copy//ParseTTcmap exec
+3 1 roll
+//ParseTTpost exec
+}ifelse
+}{
+//ParseTTcmap exec
+}ifelse
+{
+dup 16#00030001 known{
+//PDFR_DEBUG{
+(Using the TT cmap encoding for Windows Unicode.)=
+}if
+16#00030001//GetTTEncoding exec
+AdobeGlyphList//ComposeCharStrings exec
+exit
+}if
+dup 16#00010000 known{
+//PDFR_DEBUG{
+(Using the TT cmap encoding for Macintosh Roman.)=
+}if
+16#00010000//GetTTEncoding exec
+PDFEncoding dup null eq{
+pop//GetMacRomanEncodingInverse exec
+}{
+//InverseEncoding exec
+}ifelse
+//ComposeCharStrings exec
+exit
+}if
+dup 16#00030000 known{
+//PDFR_DEBUG{
+(Using the TT cmap encoding 3.0 - not sure why Ghostscript writes it since old versions.)=
+}if
+16#00030000//GetTTEncoding exec
+PDFEncoding dup null eq{
+pop//GetMacRomanEncodingInverse exec
+}{
+//InverseEncoding exec
+}ifelse
+//ComposeCharStrings exec
+exit
+}if
+mark(True Type cmap has no useful encodings.)//error exec
+}loop
+//PDFR_DEBUG{
+(CharStrings <<)=
+dup{
+exch
+dup type/nametype eq{
+//=only exec
+}{
+==
+}ifelse
+( )print ==
+}forall
+(>>)=
+}if
+}bind def
+/ScaleVal
+{
+aload pop
+1 index sub
+3 2 roll mul add
+}bind def
+/ScaleArg
+{
+aload pop
+1 index sub
+3 1 roll
+sub exch div
+}bind def
+/ScaleArgN
+{
+dup length 2 sub -2 0{
+2
+2 index 3 1 roll getinterval
+3 2 roll
+exch//ScaleArg exec
+1 index length 2 idiv 1 add 1 roll
+}for
+pop
+}bind def
+/ComputeFunction_10
+{
+//PDFR_DEBUG{
+(ComputeFunction_10 beg )print 1 index//=only exec( stack=)print count =
+}if
+exch
+dup 1 eq{
+pop dup length 1 sub get
+}{
+1 index length 1 sub mul
+dup dup floor sub
+dup 0 eq{
+pop cvi get
+}{
+3 1 roll floor cvi
+2 getinterval
+aload pop
+2 index mul 3 2 roll 1 exch sub 3 2 roll mul add
+}ifelse
+}ifelse
+//PDFR_DEBUG{
+(ComputeFunction_10 end )print dup//=only exec( stack=)print count =
+}if
+}bind def
+/ComputeFunction_n0
+{
+//PDFR_DEBUG{
+(ComputeFunction_n0 beg N=)print dup//=only exec( stack=)print count =
+}if
+dup 0 eq{
+pop
+}{
+dup 2 add -1 roll
+dup 3 index length 1 sub ge{
+pop 1 sub
+exch dup length 1 sub get exch
+//PDFReader/ComputeFunction_n0 get exec
+}{
+dup floor cvi dup
+4 index exch get
+3 index dup
+5 add copy
+6 2 roll
+pop pop pop pop
+1 sub
+//PDFReader/ComputeFunction_n0 get exec
+3 2 roll pop
+exch
+4 3 roll exch
+4 add 2 roll 1 add
+3 2 roll exch get
+exch 1 sub
+//PDFReader/ComputeFunction_n0 get exec
+1 index mul
+3 1 roll
+1 exch sub mul add
+}ifelse
+}ifelse
+//PDFR_DEBUG{
+(ComputeFunction_n0 end )print dup//=only exec( stack=)print count =
+}if
+}bind def
+/FunctionToProc_x01
+{
+dup/Domain get exch
+dup/Data get 0 get exch
+/Size get length
+[4 1 roll
+//PDFR_DEBUG{
+{(function beg, stack =)print count//=only exec(\n)print}/exec load
+5 2 roll
+}if
+dup 1 gt{
+{mark exch
+3 add 2 roll
+//ScaleArgN exec
+counttomark dup
+3 add -2 roll
+pop exch
+//ComputeFunction_n0 exec
+}/exec load
+}{
+pop
+3 1/roll load//ScaleArg/exec load
+/exch load
+//ComputeFunction_10/exec load
+}ifelse
+//PDFR_DEBUG{
+(function end, stack =)/print load/count load//=only/exec load(\n)/print load
+}if
+]cvx
+//PDFR_DEBUG{
+(Made a procedure for the 1-result function :)=
+dup ==
+}if
+}bind def
+/FunctionProcDebugBeg
+{(FunctionProcDebugBeg )print count =
+}bind def
+/FunctionProcDebugEnd
+{(FunctionProcDebugEnd )print count =
+}bind def
+/FunctionToProc_x0n
+{
+PDFR_DEBUG{
+(FunctionToProc_x0n beg m=)print dup =
+}if
+1 index/Size get length exch
+dup 7 mul 2 add array
+PDFR_DEBUG{
+dup 0//FunctionProcDebugBeg put
+}{
+dup 0//DoNothing put
+}ifelse
+dup 1/exec load put
+dup 2 5 index/Domain get put
+2 index 1 eq{
+dup 3//ScaleArg put
+}{
+dup 3//ScaleArgN put
+}ifelse
+dup 4/exec load put
+1 index 1 sub 0 exch 1 exch{
+dup 7 mul 5 add
+1 index 4 index 1 sub ne{
+dup 3 index exch 6 index put 1 add
+dup 3 index exch/copy load put 1 add
+}if
+[
+6 index/Data get 3 index get
+6 index 1 eq{
+//ComputeFunction_10/exec load
+}{
+6 index
+//ComputeFunction_n0/exec load
+}ifelse
+]cvx
+3 index exch 2 index exch put 1 add
+2 index 1 index/exec load put 1 add
+1 index 4 index 1 sub ne{
+2 index 1 index 6 index 1 add put 1 add
+2 index 1 index 1 put 1 add
+2 index 1 index/roll load put
+}if
+pop pop
+}for
+PDFR_DEBUG{
+dup dup length 2 sub//FunctionProcDebugEnd put
+}{
+dup dup length 2 sub//DoNothing put
+}ifelse
+dup dup length 1 sub/exec load put
+cvx exch pop exch pop exch pop
+//PDFR_DEBUG{
+(Made a procedure for the n-argument function :)=
+dup ==
+}if
+PDFR_DEBUG{
+(FunctionToProc_x0n end)=
+}if
+}bind def
+/MakeTableRec
+{
+0
+exec
+}bind def
+/MakeTable
+{//PDFR_DEBUG{
+(MakeTable beg )print count =
+}if
+1 index/Size get exch
+1 sub dup
+3 1 roll
+get
+array
+1 index 0 eq{
+exch pop exch pop
+}{
+dup length 1 sub -1 0{
+3 index 3 index//MakeTableRec exec
+2 index 3 1 roll put
+}for
+exch pop exch pop
+}ifelse
+//PDFR_DEBUG{
+(MakeTable end )print count =
+}if
+}bind def
+//MakeTableRec 0//MakeTable put
+/StoreSample
+{
+1 sub
+dup 0 eq{
+pop
+}{
+-1 1{
+I exch get get
+}for
+}ifelse
+I 0 get 3 2 roll put
+}bind def
+/ReadSample32
+{
+4{
+File read not{
+mark(Insufficient data for function.)//error exec
+}if
+}repeat
+pop
+3 1 roll exch
+256 mul add 256 mul add
+//1_24_bitshift_1_sub div
+}bind def
+/ReadSample
+{
+Buffer BitsLeft BitsPerSample
+{2 copy ge{
+exit
+}if
+3 1 roll
+8 add 3 1 roll
+256 mul File read not{
+mark(Insufficient data for function.)//error exec
+}if
+add
+3 1 roll
+}loop
+sub dup
+2 index exch
+neg bitshift
+2 copy exch bitshift
+4 3 roll exch sub
+/Buffer exch def
+exch/BitsLeft exch def
+Div div
+}bind def
+/ReadSamplesRec
+{0
+exec
+}bind def
+/ReadSamples
+{
+//PDFR_DEBUG{
+(ReadSamples beg )print count =
+}if
+dup 1 eq{
+pop
+0 1 Size 0 get 1 sub{
+I exch 0 exch put
+0 1 M 1 sub{
+dup Range exch 2 mul 2 getinterval
+//PDFR_DEBUG{
+(Will read a sample ... )print
+}if
+BitsPerSample 32 eq{//ReadSample32}{//ReadSample}ifelse
+exec exch//ScaleVal exec
+//PDFR_DEBUG{
+(value=)print dup =
+}if
+exch Table exch get
+Size length//StoreSample exec
+}for
+}for
+}{
+1 sub
+dup Size exch get 0 exch 1 exch 1 sub{
+I exch 2 index exch put
+dup//ReadSamplesRec exec
+}for
+pop
+}ifelse
+//PDFR_DEBUG{
+(ReadSamples end )print count =
+}if
+}bind def
+//ReadSamplesRec 0//ReadSamples put
+/StreamToArray
+{//PDFR_DEBUG{
+(StreamToArray beg )print count =
+}if
+userdict/FuncDataReader get begin
+dup/BitsPerSample get/BitsPerSample exch def
+dup/Size get length/N exch def
+dup/Range get length 2 idiv/M exch def
+1 BitsPerSample bitshift 1 sub/Div exch def
+/BitsLeft 0 def
+/Buffer 0 def
+dup/Size get/Size exch def
+dup/Range get/Range exch def
+/File 1 index//MakeStreamReader exec def
+/I[N{0}repeat]def
+M array
+dup length 1 sub -1 0{
+2 index N//MakeTable exec
+2 index 3 1 roll put
+}for
+/Table exch def
+N//ReadSamples exec
+PDFR_DEBUG{
+(Table = )print Table ==
+}if
+/Data Table put
+end
+//PDFR_DEBUG{
+(StreamToArray end )print count =
+}if
+}bind def
+/FunctionToProc10
+{
+PDFR_DEBUG{
+(FunctionToProc10 beg, Range = )print dup/Range get ==
+}if
+dup/Order//knownget exec{
+1 ne{
+(Underimplemented function Type 0 Order 3.)=
+}if
+}if
+dup//StreamToArray exec
+dup/Range get length dup 2 eq{
+pop//FunctionToProc_x01 exec
+}{
+2 idiv//FunctionToProc_x0n exec
+}ifelse
+PDFR_DEBUG{
+(FunctionToProc10 end)=
+}if
+}bind def
+/FunctionToProc12
+{begin
+currentdict/C0//knownget exec{length 1 eq}{true}ifelse{
+N
+currentdict/C0//knownget exec{
+0 get
+}{
+0
+}ifelse
+currentdict/C1//knownget exec{
+0 get
+}{
+1
+}ifelse
+1 index sub
+[4 1 roll
+{
+4 2 roll
+exp mul add
+}aload pop
+]cvx
+}{
+[
+0 1 C0 length 1 sub{
+N
+C0 2 index get
+C1 3 index get
+4 3 roll pop
+1 index sub
+[/dup load
+5 2 roll
+{
+4 2 roll
+exp mul add
+exch
+}aload pop
+]cvx
+/exec load
+}for
+/pop load
+]cvx
+}ifelse
+end
+//PDFR_DEBUG{
+(FunctionType2Proc : )print dup ==
+}if
+}bind def
+/FunctionToProc14
+{//MakeStreamReader exec cvx exec
+//PDFR_DEBUG{
+(FunctionType4Proc : )print dup ==
+}if
+}bind def
+/FunctionToProc1
+{
+dup/FunctionType get
+{dup 0 eq{
+pop//FunctionToProc10 exec exit
+}if
+dup 2 eq{
+pop//FunctionToProc12 exec exit
+}if
+dup 4 eq{
+pop//FunctionToProc14 exec exit
+}if
+mark exch(Function type )exch( isn't implemented yet.)//error exec
+}loop
+}bind def
+/FunctionToProc20
+{
+PDFR_DEBUG{
+(FunctionToProc20, Range = )print dup/Range get ==
+}if
+dup/Order//knownget exec{
+1 ne{
+(Underimplemented function Type 0 Order 3.)=
+}if
+}if
+dup//StreamToArray exec
+dup/Range get length dup 2 eq{
+pop//FunctionToProc_x01 exec
+}{
+2 idiv//FunctionToProc_x0n exec
+}ifelse
+}bind def
+/FunctionToProc
+{//PDFR_DEBUG{
+(FunctionToProc beg )print count =
+}if
+dup type/dicttype eq{
+dup/Domain get length 2 idiv
+{
+dup 1 eq{
+pop//FunctionToProc1 exec exit
+}if
+dup 2 eq{
+pop//FunctionToProc20 exec exit
+}if
+mark(Functions with many arguments aren't implemented yet.)//error exec
+}loop
+}{
+//PDFR_DEBUG{(Not a function dict, assume already a procedure.)print}if
+}ifelse
+//PDFR_DEBUG{
+(FunctionToProc end )print count =
+}if
+}bind def
+/spotfunctions mark
+/Round{
+abs exch abs 2 copy add 1 le{
+dup mul exch dup mul add 1 exch sub
+}{
+1 sub dup mul exch 1 sub dup mul add 1 sub
+}ifelse
+}
+/Diamond{
+abs exch abs 2 copy add .75 le{
+dup mul exch dup mul add 1 exch sub
+}{
+2 copy add 1.23 le{
+.85 mul add 1 exch sub
+}{
+1 sub dup mul exch 1 sub dup mul add 1 sub
+}ifelse
+}ifelse
+}
+/Ellipse{
+abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt{
+pop dup mul exch .75 div dup mul add 4 div 1 exch sub
+}{
+dup 1 gt{
+pop 1 exch sub dup mul exch 1 exch sub
+.75 div dup mul add 4 div 1 sub
+}{
+.5 exch sub exch pop exch pop
+}ifelse
+}ifelse
+}
+/EllipseA{dup mul .9 mul exch dup mul add 1 exch sub}
+/InvertedEllipseA{dup mul .9 mul exch dup mul add 1 sub}
+/EllipseB{dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub}
+/EllipseC{dup mul .9 mul exch dup mul add 1 exch sub}
+/InvertedEllipseC{dup mul .9 mul exch dup mul add 1 sub}
+/Line{exch pop abs neg}
+/LineX{pop}
+/LineY{exch pop}
+/Square{abs exch abs 2 copy lt{exch}if pop neg}
+/Cross{abs exch abs 2 copy gt{exch}if pop neg}
+/Rhomboid{abs exch abs 0.9 mul add 2 div}
+/DoubleDot{2{360 mul sin 2 div exch}repeat add}
+/InvertedDoubleDot{2{360 mul sin 2 div exch}repeat add neg}
+/SimpleDot{dup mul exch dup mul add 1 exch sub}
+/InvertedSimpleDot{dup mul exch dup mul add 1 sub}
+/CosineDot{180 mul cos exch 180 mul cos add 2 div}
+/Double{exch 2 div exch 2{360 mul sin 2 div exch}repeat add}
+/InvertedDouble{
+exch 2 div exch 2{360 mul sin 2 div exch}repeat add neg
+}
+.dicttomark readonly def
+/CheckColorSpace
+{
+dup type/arraytype ne{
+mark(Resource )3 index( must be an array.)//error exec
+}if
+}bind def
+/SubstitutePDFColorSpaceRec
+{0
+exec
+}bind def
+/SubstitutePDFColorSpace
+{
+{
+dup 0 get/Pattern eq{
+dup length 1 gt{
+dup dup 1//CheckColorSpace//ResolveA exec
+dup type/nametype ne{
+//SubstitutePDFColorSpaceRec exec
+}if
+1 exch put
+}if
+exit
+}if
+dup 0 get/Indexed eq{
+exit
+}if
+dup 0 get/Separation eq{
+dup dup 2//CheckColorSpace//ResolveA exec
+dup type/nametype ne{
+//SubstitutePDFColorSpaceRec exec
+}if
+2 exch put
+exit
+}if
+dup 0 get/CalGray eq{
+1 get
+dup/Gamma//knownget exec{
+[exch[exch/exp load]cvx dup dup]
+1 index exch/DecodeLMN exch put
+}if
+[exch/CIEBasedA exch]
+exit
+}if
+dup 0 get/CalRGB eq{
+1 get
+dup/Matrix//knownget exec{
+1 index exch/MatrixLMN exch put
+}if
+dup/Gamma//knownget exec{
+aload pop
+[exch/exp load]cvx
+3 1 roll
+[exch/exp load]cvx
+3 1 roll
+[exch/exp load]cvx
+3 1 roll
+3 array astore
+1 index exch/DecodeLMN exch put
+}if
+[exch/CIEBasedABC exch]
+exit
+}if
+dup 0 get/Lab eq{
+1 get
+begin
+currentdict/Range//knownget exec{aload pop}{-100 100 -100 100}ifelse
+0 100 6 2 roll 6 array astore
+/RangeABC exch def
+/DecodeABC[{16 add 116 div}bind{500 div}bind{200 div}bind]def
+/MatrixABC[1 1 1 1 0 0 0 0 -1]def
+{dup 6 29 div ge{dup dup mul mul}{4 29 div sub 108 841 div mul}ifelse}
+/DecodeLMN[
+[3 index aload pop WhitePoint 0 get/mul load]cvx
+[4 index aload pop WhitePoint 1 get/mul load]cvx
+[5 index aload pop WhitePoint 2 get/mul load]cvx
+]def pop
+//PDFR_DEBUG{
+(Constructed from Lab <<)=
+currentdict{exch = ==}forall
+(>>)=
+}if
+[/CIEBasedABC currentdict]
+end
+exit
+pop
+}if
+dup 0 get/CIEBasedA eq{exit}if
+dup 0 get/CIEBasedABC eq{exit}if
+mark exch(Unimplemented color space )exch//error exec
+}loop
+}bind def
+//SubstitutePDFColorSpaceRec 0//SubstitutePDFColorSpace put
+/ResolveArrayElement
+{2 copy get
+dup type dup/arraytype eq exch
+/packedarraytype eq or{
+dup length 1 ge exch xcheck and{
+2 copy get
+dup 0 get type/integertype eq
+1 index 1 get type dup/arraytype
+eq exch
+/packedarraytype eq or
+and{
+exec
+2 index 4 1 roll put
+}{
+pop pop
+}ifelse
+}{
+pop
+}ifelse
+}{
+pop pop
+}ifelse
+}bind def
+/ResolveColorSpaceArrayRec
+{0
+exec
+}bind def
+/SetColorSpaceSafe
+{
+PDFR_DEBUG{
+(SetColorSpaceSafe beg)=
+}if
+currentcolorspace dup type/arraytype eq{
+1 index type/arraytype eq{
+dup length 2 index length eq{
+false exch
+dup length 0 exch 1 exch 1 sub{
+dup
+4 index exch get exch
+2 index exch get
+ne{
+exch pop true exch exit
+}if
+}for
+pop
+{
+setcolorspace
+}{
+pop
+}ifelse
+}{
+pop setcolorspace
+}ifelse
+}{
+pop setcolorspace
+}ifelse
+}{
+pop setcolorspace
+}ifelse
+PDFR_DEBUG{
+(SetColorSpaceSafe end)=
+}if
+}bind def
+/ResolveColorSpaceArray
+{
+//PDFR_DEBUG{
+(ResolveColorSpaceArray beg )print dup ==
+}if
+dup 0 get/Indexed eq{
+1//ResolveArrayElement exec
+dup dup 1 get
+dup type/arraytype eq{
+//SubstitutePDFColorSpace exec
+//ResolveColorSpaceArrayRec exec
+1 exch put
+}{
+pop pop
+}ifelse
+}if
+dup 0 get/Separation eq{
+dup dup 1 get UnPDFEscape 1 exch put
+3//ResolveArrayElement exec
+dup 3 get//FunctionToProc exec
+2 copy 3 exch put
+pop
+}if
+dup 0 get/Pattern eq{
+dup length 1 gt{
+dup 1 get dup type/arraytype eq{
+ResolveColorSpaceArray
+1 index 1 3 -1 roll put
+}{
+pop
+}ifelse
+}if
+}if
+PDFR_DEBUG{
+(Construcrted color space :)=
+dup ==
+}if
+//PDFR_DEBUG{
+(ResolveColorSpaceArray end )print dup ==
+}if
+}bind def
+//ResolveColorSpaceArrayRec 0//ResolveColorSpaceArray put
+/ResolveColorSpace
+{
+//PDFR_DEBUG{
+(ResolveColorSpace beg )print dup =
+}if
+dup//SimpleColorSpaceNames exch known not{
+dup//PDFColorSpaces exch//knownget exec{
+exch pop
+//PDFR_DEBUG{
+(ResolveColorSpace known )=
+}if
+}{
+dup
+//PDFReader/CurrentObject get/Context get/Resources get
+/ColorSpace//DoNothing//ResolveD exec
+exch//CheckColorSpace//ResolveD exec
+dup type/arraytype eq{
+//SubstitutePDFColorSpace exec
+//ResolveColorSpaceArray exec
+dup//PDFColorSpaces 4 2 roll put
+}if
+}ifelse
+}if
+//PDFR_DEBUG{
+(ResolveColorSpace end )print dup ==
+}if
+}bind def
+/CheckPattern
+{
+dup/PatternType//knownget exec{
+dup 1 ne{
+mark(Resource )4 index( is a shading, which can't be handled at level 2. )//error exec
+}if
+pop
+}if
+dup/Type knownget{
+/Pattern ne{
+mark(Resource )4 index( must have /Type/Pattern .)//error exec
+}if
+}if
+}bind def
+/PaintProc
+{/Context get
+//RunDelayedStream exec
+}bind def
+/ResolvePattern
+{
+dup
+userdict/PDFR_Patterns get
+exch//knownget exec{
+exch pop
+}{
+dup
+//PDFReader/CurrentObject get/Context get/Resources get
+/Pattern//DoNothing//ResolveD exec
+exch//CheckPattern//ResolveD exec
+dup dup/Context exch put
+dup/Resources//DoNothing//ResolveD exec pop
+dup/PaintProc//PaintProc put
+gsave userdict/PDFR_InitialGS get setgstate
+currentglobal exch false setglobal
+dup/Matrix get
+makepattern
+exch setglobal
+grestore
+dup userdict/PDFR_Patterns get
+4 2 roll
+put
+}ifelse
+}bind def
+/SetColor
+{//PDFR_DEBUG{
+(SetColor beg)=
+}if
+currentcolorspace dup type/nametype eq{
+pop setcolor
+}{
+0 get/Pattern eq{
+//ResolvePattern exec setpattern
+}{
+setcolor
+}ifelse
+}ifelse
+//PDFR_DEBUG{
+(SetColor end)=
+}if
+}bind def
+/ImageKeys 15 dict begin
+/BPC/BitsPerComponent def
+/CS/ColorSpace def
+/D/Decode def
+/DP/DecodeParms def
+/F/Filter def
+/H/Height def
+/IM/ImageMask def
+/I/Interpolate def
+/W/Width def
+currentdict end readonly def
+/ImageValues 15 dict begin
+/G/DeviceGray def
+/RGB/DeviceRGB def
+/CMYK/DeviceCMYK def
+/I/Indexed def
+/AHx/ASCIIHexDecode def
+/A85/ASCII85Decode def
+/LZW/LZWDecode def
+/Fl/FlateDecode def
+/RL/RunLengthDecode def
+/CCF/CCITTFaxDecode def
+/DCT/DCTDecode def
+currentdict end readonly def
+/GetColorSpaceRange
+{2 index/ColorSpace get
+dup type/arraytype eq{
+1 get
+}if
+exch//knownget exec{
+exch pop
+}if
+}bind def
+/DecodeArrays 15 dict begin
+/DeviceGray{[0 1]}def
+/DeviceRGB{[0 1 0 1 0 1]}def
+/DeviceCMYK{[0 1 0 1 0 1 0 1]}def
+/Indexed{
+dup/BitsPerComponent get 1 exch bitshift 1 sub[exch 0 exch]
+}def
+/Separation{[0 1]}def
+/CIEBasedA{[0 1]/RangeA//GetColorSpaceRange exec}def
+/CIEBasedABC{[0 1 0 1 0 1]/RangeABC//GetColorSpaceRange exec}def
+currentdict end readonly def
+/Substitute
+{1 index//knownget exec{
+exch pop
+}if
+}bind def
+/DebugImagePrinting
+{
+//PDFR_DEBUG{
+(Image :)=
+dup{exch//=only exec( )print ==
+}forall
+}if
+}bind def
+/CompleteImage
+{
+dup/ColorSpace known{
+dup/ColorSpace//CheckColorSpace//ResolveD exec pop
+}if
+dup/Decode known not{
+dup/ColorSpace//knownget exec{
+dup type/arraytype eq{
+0 get
+}if
+//DecodeArrays exch get exec
+}{
+[0 1]
+}ifelse
+1 index exch/Decode exch put
+}if
+dup/ImageMatrix[2 index/Width get 0 0 5 index/Height get neg
+0 7 index/Height get]put
+//DebugImagePrinting exec
+}bind def
+/CompleteInlineImage
+{
+//PDFR_DEBUG{
+(CompleteInlineImage beg)=
+}if
+dup/ImageType known not{
+dup/ImageType 1 put
+}if
+dup length dict exch{
+exch//ImageKeys//Substitute exec
+dup/Filter eq{
+exch//ImageValues//Substitute exec exch
+}if
+dup/ColorSpace eq{
+exch
+dup//ImageValues exch//knownget exec{
+exch pop
+}{
+//ResolveColorSpace exec
+}ifelse
+exch
+}if
+exch
+2 index 3 1 roll put
+}forall
+//CompleteImage exec
+dup/DataSource 2 copy get
+2 index//AppendFilters exec put
+//PDFR_DEBUG{
+(CompleteInlineImage end)=
+}if
+}bind def
+/CompleteOutlineImage
+{
+currentglobal exch dup gcheck setglobal
+//PDFR_DEBUG{
+(CompleteOutlineImage beg)=
+}if
+dup dup//MakeStreamReader exec/DataSource exch put
+dup/ImageType known not{
+//CompleteImage exec
+dup/ImageType 1 put
+dup/ColorSpace known{
+dup/ColorSpace//CheckColorSpace//ResolveD exec
+dup type/arraytype eq{
+//ResolveColorSpaceArray exec
+//SubstitutePDFColorSpace exec
+1 index exch/ColorSpace exch put
+}{
+pop
+}ifelse
+}if
+}if
+//PDFR_DEBUG{
+(CompleteOutlineImage end)=
+}if
+exch setglobal
+}bind def
+/DoImage
+{
+//PDFR_DEBUG{
+(DoImage beg)=
+}if
+gsave
+dup/ColorSpace//knownget exec{setcolorspace}if
+dup/ImageMask//knownget exec not{false}if
+{imagemask}{image}ifelse
+grestore
+//PDFR_DEBUG{
+(DoImage end)=
+}if
+}bind def
+/GSave
+{
+gsave
+//PDFReader/GraphicStateStackPointer get
+dup//GraphicStateStack exch get null eq{
+dup//GraphicStateStack exch//InitialGraphicState length dict put
+}if
+dup//GraphicStateStack exch get
+//GraphicState exch copy pop
+1 add//PDFReader exch/GraphicStateStackPointer exch put
+}bind def
+/GRestore
+{
+grestore
+//PDFReader/GraphicStateStackPointer get
+1 sub dup
+//PDFReader exch/GraphicStateStackPointer exch put
+//GraphicStateStack exch get
+//GraphicState copy pop
+}bind def
+/SetFont
+{dup//GraphicState exch/FontSize exch put
+//ResolveAndSetFont exec
+//GraphicState/FontMatrixNonHV currentfont/FontMatrix get 1 get 0 ne put
+}bind def
+/ShowText
+{//GraphicState/TextRenderingMode get 0 eq{
+//GraphicState/WordSpacing get 0
+32
+//GraphicState/CharacterSpacing get 0
+6 5 roll
+//GraphicState/FontMatrixNonHV get{
+[
+7 -2 roll pop
+5 -2 roll pop
+5 -1 roll
+{
+exch
+pop
+3 index add
+exch 2 index eq{3 index add}if
+4 1 roll
+}
+currentfont/FontMatrix get 0 get 0 ne{
+1 1 index length 1 sub getinterval cvx
+}if
+5 index
+cshow
+pop pop pop]
+xshow
+}{
+awidthshow
+}ifelse
+}{
+//GraphicState/CharacterSpacing get 0 eq
+//GraphicState/FontMatrixNonHV get not and
+//GraphicState/WordSpacing get 0 eq and{
+true charpath
+}{
+{
+exch
+pop 0
+currentpoint 5 4 roll
+( )dup 0 3 index put true charpath
+5 1 roll
+moveto rmoveto
+//GraphicState/CharacterSpacing get 0 rmoveto
+32 eq{
+//GraphicState/WordSpacing get 0 rmoveto
+}if
+}
+//GraphicState/FontMatrixNonHV get dup not exch{
+pop currentfont/FontMatrix get 0 get 0 ne
+}if{
+1 1 index length 1 sub getinterval cvx
+}if
+exch cshow
+}ifelse
+}ifelse
+}bind def
+/ShowTextBeg
+{//GraphicState/TextRenderingMode get 0 ne{
+currentpoint newpath moveto
+}if
+}bind def
+/ShowTextEnd
+{//GraphicState/TextRenderingMode get
+{dup 1 eq{
+stroke exit
+}if
+dup 2 eq{
+gsave fill grestore stroke exit
+}if
+dup 3 eq{
+currentpoint newpath moveto
+}if
+dup 4 eq{
+gsave fill grestore clip exit
+}if
+dup 5 eq{
+gsave stroke grestore clip exit
+}if
+dup 6 eq{
+gsave fill grestore gsave stroke grestore fill exit
+}if
+dup 7 eq{
+clip exit
+}if
+exit
+}loop
+pop
+}bind def
+/ShowTextWithGlyphPositioning
+{//ShowTextBeg exec
+{dup type/stringtype eq{
+//ShowText exec
+}{
+neg 1000 div//GraphicState/FontSize get mul 0 rmoveto
+}ifelse
+}forall
+//ShowTextEnd exec
+}bind def
+/CheckFont
+{dup/Type get/ExtGState ne{
+mark(Resource )3 index( must have /Type/ExtGState.)//error exec
+}if
+}bind def
+/SetTransfer
+{
+//PDFR_DEBUG{(SetTransfer beg )print count =}if
+dup type/arraytype eq 1 index xcheck not and{
+0 4 getinterval aload pop
+setcolortransfer
+}{
+settransfer
+}ifelse
+//PDFR_DEBUG{(SetTransfer end )print count =}if
+}bind def
+/CheckExtGState
+{dup/Type get/ExtGState ne{
+mark(Resource )3 index( must have /Type/ExtGState.)//error exec
+}if
+}bind def
+/CheckHalftone
+{dup/HalftoneType known not{
+mark(Resource )3 index( must have /HalftoneType.)//error exec
+}if
+}bind def
+/ResolveFunction
+{
+//PDFR_DEBUG{(ResolveFunction beg )print dup = count =}if
+2 copy get//IsObjRef exec{
+2 copy//DoNothing//ResolveD exec
+3 copy put pop
+}if
+2 copy get dup type/arraytype eq exch xcheck and not{
+2 copy get
+dup type/arraytype eq 1 index xcheck not and{
+dup length 1 sub -1 0{
+2 copy//DoNothing ResolveA
+dup/Identity eq{
+pop 2 copy{}put
+}{
+//FunctionToProc exec
+3 copy put pop
+}ifelse
+pop
+}for
+}{
+dup/Default eq{
+}{
+dup/Identity eq{
+pop{}
+}{dup type/nametype eq{
+//spotfunctions exch get
+}{
+//FunctionToProc exec
+}ifelse
+}ifelse
+}ifelse
+}ifelse
+3 copy put
+exch pop
+}{
+1 index exch get
+}ifelse
+//PDFR_DEBUG{(ResolveFunction end )print dup == count =}if
+}bind def
+/ResolveFunctionSafe
+{2 copy known{
+//ResolveFunction exec
+}if
+pop
+}bind def
+/CreateHalftoneThresholds
+{
+dup/Thresholds known not{
+dup/HalftoneType get 10 eq{
+dup dup//MakeStreamReader exec
+/Thresholds exch put
+}if
+dup/HalftoneType get dup 3 eq exch 6 eq or{
+dup dup//MakeStreamReader exec
+//BlockBuffer readstring pop
+dup length
+dup 0 eq{
+mark(Could not read Thresholds)//error exec
+}if
+string copy/Thresholds exch put
+dup/HalftoneType 3 put
+}if
+}if
+}bind def
+/SetExtGState
+{
+//PDFReader/CurrentObject get/Context get/Resources get
+/ExtGState//DoNothing//ResolveD exec
+exch//CheckExtGState//ResolveD exec
+dup/LW//knownget exec{
+setlinewidth
+}if
+dup/LC//knownget exec{
+setlinecap
+}if
+dup/LJ//knownget exec{
+setlinejoin
+}if
+dup/ML//knownget exec{
+setmeterlimit
+}if
+dup/D//knownget exec{
+setdash
+}if
+dup/RI//knownget exec{
+mark(Unimplemented ExtGState.RI)//error exec
+}if
+dup/OP//knownget exec{
+setoverprint
+}if
+dup/op//knownget exec{
+setoverprint
+}if
+dup/OPM//knownget exec{
+mark(Unimplemented ExtGState.OPM)//error exec
+}if
+dup/Font//knownget exec{
+mark(Unimplemented ExtGState.Font)//error exec
+}if
+dup/BG known{
+/BG//ResolveFunction exec
+setblackgeneration
+}if
+dup/BG2 known{
+/BG2//ResolveFunction exec
+dup/Default eq{
+//InitialExtGState/BG2 get
+}if
+setblackgeneration
+}if
+dup/UCR known{
+/UCR//ResolveFunction exec
+setundercolorremoval
+}if
+dup/UCR2 known{
+/UCR2//ResolveFunction exec
+dup/Default eq{
+//InitialExtGState/UCR2 get
+}if
+setundercolorremoval
+}if
+dup/TR known{
+/TR//ResolveFunction exec
+//SetTransfer exec
+}if
+dup/TR2 known{
+/TR2//ResolveFunction exec
+dup/Default eq{
+pop//InitialExtGState/TR2 get
+aload pop setcolortransfer
+}{
+//SetTransfer exec
+}ifelse
+}if
+dup/HT//knownget exec{
+dup/Default eq{
+pop//InitialExtGState/HT get
+sethalftone
+}{
+//PDFR_DEBUG{(Ht beg)=}if
+pop dup/HT//CheckHalftone//ResolveD exec
+/SpotFunction//ResolveFunctionSafe exec
+/TransferFunction//ResolveFunctionSafe exec
+null exch
+dup/HalftoneType get dup 5 eq exch dup 4 eq exch 2 eq or or{
+dup{
+dup//IsObjRef exec{
+pop
+1 index exch//CheckHalftone ResolveD
+}if
+dup type/dicttype eq{
+dup/SpotFunction//ResolveFunctionSafe exec
+/TransferFunction//ResolveFunctionSafe exec
+//CreateHalftoneThresholds exec
+dup/HalftoneType get 5 gt{
+4 3 roll pop
+dup 4 1 roll
+}if
+}if
+pop pop
+}forall
+}if
+//CreateHalftoneThresholds exec
+//PDFR_DEBUG{
+(HT:)=
+dup{
+1 index/Default eq{
+(Default <<)=
+exch pop
+{exch = ==}forall
+(>>)=
+}{
+exch = ==
+}ifelse
+}forall
+(HT end)= flush
+}if
+exch dup null ne{
+(Warning: Ignoring a halftone with a Level 3 component halftone Type )print dup/HalftoneType get =
+pop pop
+}{
+pop
+dup/HalftoneType get 5 gt{
+(Warning: Ignoring a Level 3 halftone Type )print dup/HalftoneType get =
+pop
+}{
+sethalftone
+}ifelse
+}ifelse
+//PDFR_DEBUG{(HT set)= flush}if
+}ifelse
+}if
+dup/FL//knownget exec{
+setflattness
+}if
+dup/SM//knownget exec{
+setsmoothness
+}if
+dup/SA//knownget exec{
+setstrokeadjust
+}if
+dup/BM//knownget exec{
+mark(Unimplemented ExtGState.BM)//error exec
+}if
+dup/SMask//knownget exec{
+mark(Unimplemented ExtGState.SMask)//error exec
+}if
+dup/CA//knownget exec{
+mark(Unimplemented ExtGState.CA)//error exec
+}if
+dup/ca//knownget exec{
+mark(Unimplemented ExtGState.ca)//error exec
+}if
+dup/AIS//knownget exec{
+mark(Unimplemented ExtGState.AIS)//error exec
+}if
+dup/TK//knownget exec{
+mark(Unimplemented ExtGState.TK)//error exec
+}if
+pop
+}bind def
+/CheckXObject
+{dup/Subtype get dup/Image ne exch dup/Form ne exch/PS ne and and{
+mark(Resource )3 index( must have /Subtype /Image or /Form or /PS.)//error exec
+}if
+}bind def
+/DoXObject
+{
+//PDFReader/CurrentObject get/Context get/Resources get
+/XObject//DoNothing//ResolveD exec
+exch//CheckXObject//ResolveD exec
+dup/Subtype get
+dup/Image eq{
+pop
+//CompleteOutlineImage exec
+//DoImage exec
+}{
+dup/PS eq{
+PDFR_DEBUG{
+(Executing a PS Xobject)=
+}if
+pop
+//RunDelayedStream exec
+}{
+dup/Form eq{
+pop
+PDFR_DEBUG{
+(Executing a Form XObject)=
+}if
+//PDFReader/CurrentObject get exch
+dup//PDFReader exch<< exch/Context exch >>/CurrentObject exch put
+dup/Matrix get concat
+dup/BBox get aload pop exch 3 index sub exch 2 index sub rectclip
+//RunDelayedStream exec
+//PDFReader exch/CurrentObject exch put
+}{
+mark exch(unimplemented XObject type )exch//error exec
+}ifelse
+}ifelse
+}ifelse
+}bind def
+/Operators 50 dict begin
+/q{//GSave exec}bind def
+/Q{//GRestore exec}bind def
+/cm{//TempMatrix astore concat}bind def
+/i{1 .min setflat}bind def
+/J/setlinecap load def
+/d/setdash load def
+/j/setlinejoin load def
+/w/setlinewidth load def
+/M/setmiterlimit load def
+/gs{SetExtGState}bind def
+/g/setgray load def
+/rg/setrgbcolor load def
+/k/setcmykcolor load def
+/cs{//ResolveColorSpace exec//SetColorSpaceSafe exec
+}bind def
+/sc/setcolor load def
+/scn{//SetColor exec}bind def
+/G/setgray load def
+/RG/setrgbcolor load def
+/K/setcmykcolor load def
+/CS//cs def
+/ri{SetColorRenderingIntent}bind def
+/SC/setcolor load def
+/SCN{//SetColor exec}bind def
+/m/moveto load def
+/l/lineto load def
+/c/curveto load def
+/v{currentpoint 6 2 roll curveto}bind def
+/y{2 copy curveto}bind def
+/re{
+4 2 roll moveto exch dup 0 rlineto 0 3 -1 roll rlineto neg 0 rlineto
+closepath
+}def
+/h/closepath load def
+/n/newpath load def
+/S/stroke load def
+/s{closepath stroke}bind def
+/f/fill load def
+/f*/eofill load def
+/B{gsave fill grestore stroke}bind def
+/b{closepath gsave fill grestore stroke}bind def
+/B*{gsave eofill grestore stroke}bind def
+/b*{closepath gsave eofill grestore stroke}bind def
+/W/clip load def
+/W*/eoclip load def
+/sh{
+ResolveShading
+dup/Background known{
+gsave
+dup/ColorSpace get setcolorspace
+dup/Background get aload pop setcolor
+pathbbox
+2 index sub exch 3 index sub exch
+rectfill
+grestore
+}if
+shfill
+}bind def
+/Do{//DoXObject exec}bind def
+/BI{currentglobal false setglobal<<}bind def
+/ID{>>
+dup/DataSource currentfile
+2 index/F//knownget exec{
+/A85 eq{
+0(~>)/SubFileDecode filter
+}if
+}if
+put
+//CompleteInlineImage exec
+exch setglobal
+//DoImage exec
+}bind def
+/EI{}bind def
+/BT{gsave//GraphicState/InitialTextMatrix get currentmatrix pop}bind def
+/ET{grestore}bind def
+/Tc{//GraphicState exch/CharacterSpacing exch put}bind def
+/TL{//GraphicState exch/TextLeading exch put}bind def
+/Tr{//GraphicState exch/TextRenderingMode exch put}bind def
+/Ts{
+mark(Unimplemented SetTextRise)//error exec
+}bind def
+/Tw{//GraphicState exch/WordSpacing exch put}bind def
+/Tz{
+mark(Unimplemented SetHorizontalTextScaling)//error exec
+}bind def
+/Td{translate 0 0 moveto}bind def
+/TD{dup neg//TL exec//Td exec}bind def
+/Tm{//GraphicState/InitialTextMatrix get setmatrix
+//TempMatrix astore concat
+0 0 moveto}bind def
+/T*{0//GraphicState/TextLeading get neg//Td exec}bind def
+/Tj{//ShowTextBeg exec//ShowText exec//ShowTextEnd exec}bind def
+/'{//T* exec//ShowText exec//ShowTextEnd exec}bind def
+/"{3 2 roll//Tw exec exch//Tc exec//' exec}bind def
+/TJ//ShowTextWithGlyphPositioning def
+/Tf//SetFont def
+/d0/setcharwidth load def
+/d1/setcachedevice load def
+/BDC{pop pop}bind def
+/BMC{pop}bind def
+/EMC{}bind def
+/BX{BeginCompatibilitySection}bind def
+/EX{EndCompatibilitySection}bind def
+/DP{DefineMarkedContentPointWithPropertyList}bind def
+/MP{DefineMarkedContentPoint}bind def
+/PS{cvx exec}bind def
+currentdict end def
+//PDFR_STREAM{
+//Operators length dict begin
+//Operators{
+exch dup
+[exch//=only/exec load
+( )/print load
+8 7 roll
+dup type/arraytype eq{
+/exec load
+}if
+( )/print load
+]cvx
+def
+}forall
+currentdict end/Operators exch def
+}if
+/.registerencoding
+{pop pop
+}bind def
+/.defineencoding
+{def
+}bind def
+/.findencoding
+{load
+}bind def
+/currentglobal where
+{pop currentglobal{setglobal}true setglobal}
+{{}}
+ifelse
+/MacRomanEncoding
+StandardEncoding 0 39 getinterval aload pop
+/quotesingle
+StandardEncoding 40 56 getinterval aload pop
+/grave
+StandardEncoding 97 31 getinterval aload pop
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave
+/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde
+/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
+/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
+/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
+/questiondown/exclamdown/logicalnot/.notdef
+/florin/.notdef/.notdef/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright
+/quoteleft/quoteright/divide/.notdef
+/ydieresis/Ydieresis/fraction/currency
+/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase
+/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex
+/Idieresis/Igrave/Oacute/Ocircumflex
+/.notdef/Ograve/Uacute/Ucircumflex
+/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+256 packedarray
+5 1 index .registerencoding
+.defineencoding
+exec
+/AdobeGlyphList mark
+/A 16#0041
+/AE 16#00c6
+/AEacute 16#01fc
+/AEmacron 16#01e2
+/AEsmall 16#f7e6
+/Aacute 16#00c1
+/Aacutesmall 16#f7e1
+/Abreve 16#0102
+/Abreveacute 16#1eae
+/Abrevecyrillic 16#04d0
+/Abrevedotbelow 16#1eb6
+/Abrevegrave 16#1eb0
+/Abrevehookabove 16#1eb2
+/Abrevetilde 16#1eb4
+/Acaron 16#01cd
+/Acircle 16#24b6
+/Acircumflex 16#00c2
+/Acircumflexacute 16#1ea4
+/Acircumflexdotbelow 16#1eac
+/Acircumflexgrave 16#1ea6
+/Acircumflexhookabove 16#1ea8
+/Acircumflexsmall 16#f7e2
+/Acircumflextilde 16#1eaa
+/Acute 16#f6c9
+/Acutesmall 16#f7b4
+/Acyrillic 16#0410
+/Adblgrave 16#0200
+/Adieresis 16#00c4
+/Adieresiscyrillic 16#04d2
+/Adieresismacron 16#01de
+/Adieresissmall 16#f7e4
+/Adotbelow 16#1ea0
+/Adotmacron 16#01e0
+/Agrave 16#00c0
+/Agravesmall 16#f7e0
+/Ahookabove 16#1ea2
+/Aiecyrillic 16#04d4
+/Ainvertedbreve 16#0202
+/Alpha 16#0391
+/Alphatonos 16#0386
+/Amacron 16#0100
+/Amonospace 16#ff21
+/Aogonek 16#0104
+/Aring 16#00c5
+/Aringacute 16#01fa
+/Aringbelow 16#1e00
+/Aringsmall 16#f7e5
+/Asmall 16#f761
+/Atilde 16#00c3
+/Atildesmall 16#f7e3
+/Aybarmenian 16#0531
+/B 16#0042
+/Bcircle 16#24b7
+/Bdotaccent 16#1e02
+/Bdotbelow 16#1e04
+/Becyrillic 16#0411
+/Benarmenian 16#0532
+/Beta 16#0392
+/Bhook 16#0181
+/Blinebelow 16#1e06
+/Bmonospace 16#ff22
+/Brevesmall 16#f6f4
+/Bsmall 16#f762
+/Btopbar 16#0182
+/C 16#0043
+/Caarmenian 16#053e
+/Cacute 16#0106
+/Caron 16#f6ca
+/Caronsmall 16#f6f5
+/Ccaron 16#010c
+/Ccedilla 16#00c7
+/Ccedillaacute 16#1e08
+/Ccedillasmall 16#f7e7
+/Ccircle 16#24b8
+/Ccircumflex 16#0108
+/Cdot 16#010a
+/Cdotaccent 16#010a
+/Cedillasmall 16#f7b8
+/Chaarmenian 16#0549
+/Cheabkhasiancyrillic 16#04bc
+/Checyrillic 16#0427
+/Chedescenderabkhasiancyrillic 16#04be
+/Chedescendercyrillic 16#04b6
+/Chedieresiscyrillic 16#04f4
+/Cheharmenian 16#0543
+/Chekhakassiancyrillic 16#04cb
+/Cheverticalstrokecyrillic 16#04b8
+/Chi 16#03a7
+/Chook 16#0187
+/Circumflexsmall 16#f6f6
+/Cmonospace 16#ff23
+/Coarmenian 16#0551
+/Csmall 16#f763
+/D 16#0044
+/DZ 16#01f1
+/DZcaron 16#01c4
+/Daarmenian 16#0534
+/Dafrican 16#0189
+/Dcaron 16#010e
+/Dcedilla 16#1e10
+/Dcircle 16#24b9
+/Dcircumflexbelow 16#1e12
+/Dcroat 16#0110
+/Ddotaccent 16#1e0a
+/Ddotbelow 16#1e0c
+/Decyrillic 16#0414
+/Deicoptic 16#03ee
+/Delta 16#2206
+/Deltagreek 16#0394
+/Dhook 16#018a
+/Dieresis 16#f6cb
+/DieresisAcute 16#f6cc
+/DieresisGrave 16#f6cd
+/Dieresissmall 16#f7a8
+/Digammagreek 16#03dc
+/Djecyrillic 16#0402
+/Dlinebelow 16#1e0e
+/Dmonospace 16#ff24
+/Dotaccentsmall 16#f6f7
+/Dslash 16#0110
+/Dsmall 16#f764
+/Dtopbar 16#018b
+/Dz 16#01f2
+/Dzcaron 16#01c5
+/Dzeabkhasiancyrillic 16#04e0
+/Dzecyrillic 16#0405
+/Dzhecyrillic 16#040f
+/E 16#0045
+/Eacute 16#00c9
+/Eacutesmall 16#f7e9
+/Ebreve 16#0114
+/Ecaron 16#011a
+/Ecedillabreve 16#1e1c
+/Echarmenian 16#0535
+/Ecircle 16#24ba
+/Ecircumflex 16#00ca
+/Ecircumflexacute 16#1ebe
+/Ecircumflexbelow 16#1e18
+/Ecircumflexdotbelow 16#1ec6
+/Ecircumflexgrave 16#1ec0
+/Ecircumflexhookabove 16#1ec2
+/Ecircumflexsmall 16#f7ea
+/Ecircumflextilde 16#1ec4
+/Ecyrillic 16#0404
+/Edblgrave 16#0204
+/Edieresis 16#00cb
+/Edieresissmall 16#f7eb
+/Edot 16#0116
+/Edotaccent 16#0116
+/Edotbelow 16#1eb8
+/Efcyrillic 16#0424
+/Egrave 16#00c8
+/Egravesmall 16#f7e8
+/Eharmenian 16#0537
+/Ehookabove 16#1eba
+/Eightroman 16#2167
+/Einvertedbreve 16#0206
+/Eiotifiedcyrillic 16#0464
+/Elcyrillic 16#041b
+/Elevenroman 16#216a
+/Emacron 16#0112
+/Emacronacute 16#1e16
+/Emacrongrave 16#1e14
+/Emcyrillic 16#041c
+/Emonospace 16#ff25
+/Encyrillic 16#041d
+/Endescendercyrillic 16#04a2
+/Eng 16#014a
+/Enghecyrillic 16#04a4
+/Enhookcyrillic 16#04c7
+/Eogonek 16#0118
+/Eopen 16#0190
+/Epsilon 16#0395
+/Epsilontonos 16#0388
+/Ercyrillic 16#0420
+/Ereversed 16#018e
+/Ereversedcyrillic 16#042d
+/Escyrillic 16#0421
+/Esdescendercyrillic 16#04aa
+/Esh 16#01a9
+/Esmall 16#f765
+/Eta 16#0397
+/Etarmenian 16#0538
+/Etatonos 16#0389
+/Eth 16#00d0
+/Ethsmall 16#f7f0
+/Etilde 16#1ebc
+/Etildebelow 16#1e1a
+/Euro 16#20ac
+/Ezh 16#01b7
+/Ezhcaron 16#01ee
+/Ezhreversed 16#01b8
+/F 16#0046
+/Fcircle 16#24bb
+/Fdotaccent 16#1e1e
+/Feharmenian 16#0556
+/Feicoptic 16#03e4
+/Fhook 16#0191
+/Fitacyrillic 16#0472
+/Fiveroman 16#2164
+/Fmonospace 16#ff26
+/Fourroman 16#2163
+/Fsmall 16#f766
+/G 16#0047
+/GBsquare 16#3387
+/Gacute 16#01f4
+/Gamma 16#0393
+/Gammaafrican 16#0194
+/Gangiacoptic 16#03ea
+/Gbreve 16#011e
+/Gcaron 16#01e6
+/Gcedilla 16#0122
+/Gcircle 16#24bc
+/Gcircumflex 16#011c
+/Gcommaaccent 16#0122
+/Gdot 16#0120
+/Gdotaccent 16#0120
+/Gecyrillic 16#0413
+/Ghadarmenian 16#0542
+/Ghemiddlehookcyrillic 16#0494
+/Ghestrokecyrillic 16#0492
+/Gheupturncyrillic 16#0490
+/Ghook 16#0193
+/Gimarmenian 16#0533
+/Gjecyrillic 16#0403
+/Gmacron 16#1e20
+/Gmonospace 16#ff27
+/Grave 16#f6ce
+/Gravesmall 16#f760
+/Gsmall 16#f767
+/Gsmallhook 16#029b
+/Gstroke 16#01e4
+/H 16#0048
+/H18533 16#25cf
+/H18543 16#25aa
+/H18551 16#25ab
+/H22073 16#25a1
+/HPsquare 16#33cb
+/Haabkhasiancyrillic 16#04a8
+/Hadescendercyrillic 16#04b2
+/Hardsigncyrillic 16#042a
+/Hbar 16#0126
+/Hbrevebelow 16#1e2a
+/Hcedilla 16#1e28
+/Hcircle 16#24bd
+/Hcircumflex 16#0124
+/Hdieresis 16#1e26
+/Hdotaccent 16#1e22
+/Hdotbelow 16#1e24
+/Hmonospace 16#ff28
+/Hoarmenian 16#0540
+/Horicoptic 16#03e8
+/Hsmall 16#f768
+/Hungarumlaut 16#f6cf
+/Hungarumlautsmall 16#f6f8
+/Hzsquare 16#3390
+/I 16#0049
+/IAcyrillic 16#042f
+/IJ 16#0132
+/IUcyrillic 16#042e
+/Iacute 16#00cd
+/Iacutesmall 16#f7ed
+/Ibreve 16#012c
+/Icaron 16#01cf
+/Icircle 16#24be
+/Icircumflex 16#00ce
+/Icircumflexsmall 16#f7ee
+/Icyrillic 16#0406
+/Idblgrave 16#0208
+/Idieresis 16#00cf
+/Idieresisacute 16#1e2e
+/Idieresiscyrillic 16#04e4
+/Idieresissmall 16#f7ef
+/Idot 16#0130
+/Idotaccent 16#0130
+/Idotbelow 16#1eca
+/Iebrevecyrillic 16#04d6
+/Iecyrillic 16#0415
+/Ifraktur 16#2111
+/Igrave 16#00cc
+/Igravesmall 16#f7ec
+/Ihookabove 16#1ec8
+/Iicyrillic 16#0418
+/Iinvertedbreve 16#020a
+/Iishortcyrillic 16#0419
+/Imacron 16#012a
+/Imacroncyrillic 16#04e2
+/Imonospace 16#ff29
+/Iniarmenian 16#053b
+/Iocyrillic 16#0401
+/Iogonek 16#012e
+/Iota 16#0399
+/Iotaafrican 16#0196
+/Iotadieresis 16#03aa
+/Iotatonos 16#038a
+/Ismall 16#f769
+/Istroke 16#0197
+/Itilde 16#0128
+/Itildebelow 16#1e2c
+/Izhitsacyrillic 16#0474
+/Izhitsadblgravecyrillic 16#0476
+/J 16#004a
+/Jaarmenian 16#0541
+/Jcircle 16#24bf
+/Jcircumflex 16#0134
+/Jecyrillic 16#0408
+/Jheharmenian 16#054b
+/Jmonospace 16#ff2a
+/Jsmall 16#f76a
+/K 16#004b
+/KBsquare 16#3385
+/KKsquare 16#33cd
+/Kabashkircyrillic 16#04a0
+/Kacute 16#1e30
+/Kacyrillic 16#041a
+/Kadescendercyrillic 16#049a
+/Kahookcyrillic 16#04c3
+/Kappa 16#039a
+/Kastrokecyrillic 16#049e
+/Kaverticalstrokecyrillic 16#049c
+/Kcaron 16#01e8
+/Kcedilla 16#0136
+/Kcircle 16#24c0
+/Kcommaaccent 16#0136
+/Kdotbelow 16#1e32
+/Keharmenian 16#0554
+/Kenarmenian 16#053f
+/Khacyrillic 16#0425
+/Kheicoptic 16#03e6
+/Khook 16#0198
+/Kjecyrillic 16#040c
+/Klinebelow 16#1e34
+/Kmonospace 16#ff2b
+/Koppacyrillic 16#0480
+/Koppagreek 16#03de
+/Ksicyrillic 16#046e
+/Ksmall 16#f76b
+/L 16#004c
+/LJ 16#01c7
+/LL 16#f6bf
+/Lacute 16#0139
+/Lambda 16#039b
+/Lcaron 16#013d
+/Lcedilla 16#013b
+/Lcircle 16#24c1
+/Lcircumflexbelow 16#1e3c
+/Lcommaaccent 16#013b
+/Ldot 16#013f
+/Ldotaccent 16#013f
+/Ldotbelow 16#1e36
+/Ldotbelowmacron 16#1e38
+/Liwnarmenian 16#053c
+/Lj 16#01c8
+/Ljecyrillic 16#0409
+/Llinebelow 16#1e3a
+/Lmonospace 16#ff2c
+/Lslash 16#0141
+/Lslashsmall 16#f6f9
+/Lsmall 16#f76c
+/M 16#004d
+/MBsquare 16#3386
+/Macron 16#f6d0
+/Macronsmall 16#f7af
+/Macute 16#1e3e
+/Mcircle 16#24c2
+/Mdotaccent 16#1e40
+/Mdotbelow 16#1e42
+/Menarmenian 16#0544
+/Mmonospace 16#ff2d
+/Msmall 16#f76d
+/Mturned 16#019c
+/Mu 16#039c
+/N 16#004e
+/NJ 16#01ca
+/Nacute 16#0143
+/Ncaron 16#0147
+/Ncedilla 16#0145
+/Ncircle 16#24c3
+/Ncircumflexbelow 16#1e4a
+/Ncommaaccent 16#0145
+/Ndotaccent 16#1e44
+/Ndotbelow 16#1e46
+/Nhookleft 16#019d
+/Nineroman 16#2168
+/Nj 16#01cb
+/Njecyrillic 16#040a
+/Nlinebelow 16#1e48
+/Nmonospace 16#ff2e
+/Nowarmenian 16#0546
+/Nsmall 16#f76e
+/Ntilde 16#00d1
+/Ntildesmall 16#f7f1
+/Nu 16#039d
+/O 16#004f
+/OE 16#0152
+/OEsmall 16#f6fa
+/Oacute 16#00d3
+/Oacutesmall 16#f7f3
+/Obarredcyrillic 16#04e8
+/Obarreddieresiscyrillic 16#04ea
+/Obreve 16#014e
+/Ocaron 16#01d1
+/Ocenteredtilde 16#019f
+/Ocircle 16#24c4
+/Ocircumflex 16#00d4
+/Ocircumflexacute 16#1ed0
+/Ocircumflexdotbelow 16#1ed8
+/Ocircumflexgrave 16#1ed2
+/Ocircumflexhookabove 16#1ed4
+/Ocircumflexsmall 16#f7f4
+/Ocircumflextilde 16#1ed6
+/Ocyrillic 16#041e
+/Odblacute 16#0150
+/Odblgrave 16#020c
+/Odieresis 16#00d6
+/Odieresiscyrillic 16#04e6
+/Odieresissmall 16#f7f6
+/Odotbelow 16#1ecc
+/Ogoneksmall 16#f6fb
+/Ograve 16#00d2
+/Ogravesmall 16#f7f2
+/Oharmenian 16#0555
+/Ohm 16#2126
+/Ohookabove 16#1ece
+/Ohorn 16#01a0
+/Ohornacute 16#1eda
+/Ohorndotbelow 16#1ee2
+/Ohorngrave 16#1edc
+/Ohornhookabove 16#1ede
+/Ohorntilde 16#1ee0
+/Ohungarumlaut 16#0150
+/Oi 16#01a2
+/Oinvertedbreve 16#020e
+/Omacron 16#014c
+/Omacronacute 16#1e52
+/Omacrongrave 16#1e50
+/Omega 16#2126
+/Omegacyrillic 16#0460
+/Omegagreek 16#03a9
+/Omegaroundcyrillic 16#047a
+/Omegatitlocyrillic 16#047c
+/Omegatonos 16#038f
+/Omicron 16#039f
+/Omicrontonos 16#038c
+/Omonospace 16#ff2f
+/Oneroman 16#2160
+/Oogonek 16#01ea
+/Oogonekmacron 16#01ec
+/Oopen 16#0186
+/Oslash 16#00d8
+/Oslashacute 16#01fe
+/Oslashsmall 16#f7f8
+/Osmall 16#f76f
+/Ostrokeacute 16#01fe
+/Otcyrillic 16#047e
+/Otilde 16#00d5
+/Otildeacute 16#1e4c
+/Otildedieresis 16#1e4e
+/Otildesmall 16#f7f5
+/P 16#0050
+/Pacute 16#1e54
+/Pcircle 16#24c5
+/Pdotaccent 16#1e56
+/Pecyrillic 16#041f
+/Peharmenian 16#054a
+/Pemiddlehookcyrillic 16#04a6
+/Phi 16#03a6
+/Phook 16#01a4
+/Pi 16#03a0
+/Piwrarmenian 16#0553
+/Pmonospace 16#ff30
+/Psi 16#03a8
+/Psicyrillic 16#0470
+/Psmall 16#f770
+/Q 16#0051
+/Qcircle 16#24c6
+/Qmonospace 16#ff31
+/Qsmall 16#f771
+/R 16#0052
+/Raarmenian 16#054c
+/Racute 16#0154
+/Rcaron 16#0158
+/Rcedilla 16#0156
+/Rcircle 16#24c7
+/Rcommaaccent 16#0156
+/Rdblgrave 16#0210
+/Rdotaccent 16#1e58
+/Rdotbelow 16#1e5a
+/Rdotbelowmacron 16#1e5c
+/Reharmenian 16#0550
+/Rfraktur 16#211c
+/Rho 16#03a1
+/Ringsmall 16#f6fc
+/Rinvertedbreve 16#0212
+/Rlinebelow 16#1e5e
+/Rmonospace 16#ff32
+/Rsmall 16#f772
+/Rsmallinverted 16#0281
+/Rsmallinvertedsuperior 16#02b6
+/S 16#0053
+/SF010000 16#250c
+/SF020000 16#2514
+/SF030000 16#2510
+/SF040000 16#2518
+/SF050000 16#253c
+/SF060000 16#252c
+/SF070000 16#2534
+/SF080000 16#251c
+/SF090000 16#2524
+/SF100000 16#2500
+/SF110000 16#2502
+/SF190000 16#2561
+/SF200000 16#2562
+/SF210000 16#2556
+/SF220000 16#2555
+/SF230000 16#2563
+/SF240000 16#2551
+/SF250000 16#2557
+/SF260000 16#255d
+/SF270000 16#255c
+/SF280000 16#255b
+/SF360000 16#255e
+/SF370000 16#255f
+/SF380000 16#255a
+/SF390000 16#2554
+/SF400000 16#2569
+/SF410000 16#2566
+/SF420000 16#2560
+/SF430000 16#2550
+/SF440000 16#256c
+/SF450000 16#2567
+/SF460000 16#2568
+/SF470000 16#2564
+/SF480000 16#2565
+/SF490000 16#2559
+/SF500000 16#2558
+/SF510000 16#2552
+/SF520000 16#2553
+/SF530000 16#256b
+/SF540000 16#256a
+/Sacute 16#015a
+/Sacutedotaccent 16#1e64
+/Sampigreek 16#03e0
+/Scaron 16#0160
+/Scarondotaccent 16#1e66
+/Scaronsmall 16#f6fd
+/Scedilla 16#015e
+/Schwa 16#018f
+/Schwacyrillic 16#04d8
+/Schwadieresiscyrillic 16#04da
+/Scircle 16#24c8
+/Scircumflex 16#015c
+/Scommaaccent 16#0218
+/Sdotaccent 16#1e60
+/Sdotbelow 16#1e62
+/Sdotbelowdotaccent 16#1e68
+/Seharmenian 16#054d
+/Sevenroman 16#2166
+/Shaarmenian 16#0547
+/Shacyrillic 16#0428
+/Shchacyrillic 16#0429
+/Sheicoptic 16#03e2
+/Shhacyrillic 16#04ba
+/Shimacoptic 16#03ec
+/Sigma 16#03a3
+/Sixroman 16#2165
+/Smonospace 16#ff33
+/Softsigncyrillic 16#042c
+/Ssmall 16#f773
+/Stigmagreek 16#03da
+/T 16#0054
+/Tau 16#03a4
+/Tbar 16#0166
+/Tcaron 16#0164
+/Tcedilla 16#0162
+/Tcircle 16#24c9
+/Tcircumflexbelow 16#1e70
+/Tcommaaccent 16#0162
+/Tdotaccent 16#1e6a
+/Tdotbelow 16#1e6c
+/Tecyrillic 16#0422
+/Tedescendercyrillic 16#04ac
+/Tenroman 16#2169
+/Tetsecyrillic 16#04b4
+/Theta 16#0398
+/Thook 16#01ac
+/Thorn 16#00de
+/Thornsmall 16#f7fe
+/Threeroman 16#2162
+/Tildesmall 16#f6fe
+/Tiwnarmenian 16#054f
+/Tlinebelow 16#1e6e
+/Tmonospace 16#ff34
+/Toarmenian 16#0539
+/Tonefive 16#01bc
+/Tonesix 16#0184
+/Tonetwo 16#01a7
+/Tretroflexhook 16#01ae
+/Tsecyrillic 16#0426
+/Tshecyrillic 16#040b
+/Tsmall 16#f774
+/Twelveroman 16#216b
+/Tworoman 16#2161
+/U 16#0055
+/Uacute 16#00da
+/Uacutesmall 16#f7fa
+/Ubreve 16#016c
+/Ucaron 16#01d3
+/Ucircle 16#24ca
+/Ucircumflex 16#00db
+/Ucircumflexbelow 16#1e76
+/Ucircumflexsmall 16#f7fb
+/Ucyrillic 16#0423
+/Udblacute 16#0170
+/Udblgrave 16#0214
+/Udieresis 16#00dc
+/Udieresisacute 16#01d7
+/Udieresisbelow 16#1e72
+/Udieresiscaron 16#01d9
+/Udieresiscyrillic 16#04f0
+/Udieresisgrave 16#01db
+/Udieresismacron 16#01d5
+/Udieresissmall 16#f7fc
+/Udotbelow 16#1ee4
+/Ugrave 16#00d9
+/Ugravesmall 16#f7f9
+/Uhookabove 16#1ee6
+/Uhorn 16#01af
+/Uhornacute 16#1ee8
+/Uhorndotbelow 16#1ef0
+/Uhorngrave 16#1eea
+/Uhornhookabove 16#1eec
+/Uhorntilde 16#1eee
+/Uhungarumlaut 16#0170
+/Uhungarumlautcyrillic 16#04f2
+/Uinvertedbreve 16#0216
+/Ukcyrillic 16#0478
+/Umacron 16#016a
+/Umacroncyrillic 16#04ee
+/Umacrondieresis 16#1e7a
+/Umonospace 16#ff35
+/Uogonek 16#0172
+/Upsilon 16#03a5
+/Upsilon1 16#03d2
+/Upsilonacutehooksymbolgreek 16#03d3
+/Upsilonafrican 16#01b1
+/Upsilondieresis 16#03ab
+/Upsilondieresishooksymbolgreek 16#03d4
+/Upsilonhooksymbol 16#03d2
+/Upsilontonos 16#038e
+/Uring 16#016e
+/Ushortcyrillic 16#040e
+/Usmall 16#f775
+/Ustraightcyrillic 16#04ae
+/Ustraightstrokecyrillic 16#04b0
+/Utilde 16#0168
+/Utildeacute 16#1e78
+/Utildebelow 16#1e74
+/V 16#0056
+/Vcircle 16#24cb
+/Vdotbelow 16#1e7e
+/Vecyrillic 16#0412
+/Vewarmenian 16#054e
+/Vhook 16#01b2
+/Vmonospace 16#ff36
+/Voarmenian 16#0548
+/Vsmall 16#f776
+/Vtilde 16#1e7c
+/W 16#0057
+/Wacute 16#1e82
+/Wcircle 16#24cc
+/Wcircumflex 16#0174
+/Wdieresis 16#1e84
+/Wdotaccent 16#1e86
+/Wdotbelow 16#1e88
+/Wgrave 16#1e80
+/Wmonospace 16#ff37
+/Wsmall 16#f777
+/X 16#0058
+/Xcircle 16#24cd
+/Xdieresis 16#1e8c
+/Xdotaccent 16#1e8a
+/Xeharmenian 16#053d
+/Xi 16#039e
+/Xmonospace 16#ff38
+/Xsmall 16#f778
+/Y 16#0059
+/Yacute 16#00dd
+/Yacutesmall 16#f7fd
+/Yatcyrillic 16#0462
+/Ycircle 16#24ce
+/Ycircumflex 16#0176
+/Ydieresis 16#0178
+/Ydieresissmall 16#f7ff
+/Ydotaccent 16#1e8e
+/Ydotbelow 16#1ef4
+/Yericyrillic 16#042b
+/Yerudieresiscyrillic 16#04f8
+/Ygrave 16#1ef2
+/Yhook 16#01b3
+/Yhookabove 16#1ef6
+/Yiarmenian 16#0545
+/Yicyrillic 16#0407
+/Yiwnarmenian 16#0552
+/Ymonospace 16#ff39
+/Ysmall 16#f779
+/Ytilde 16#1ef8
+/Yusbigcyrillic 16#046a
+/Yusbigiotifiedcyrillic 16#046c
+/Yuslittlecyrillic 16#0466
+/Yuslittleiotifiedcyrillic 16#0468
+/Z 16#005a
+/Zaarmenian 16#0536
+/Zacute 16#0179
+/Zcaron 16#017d
+/Zcaronsmall 16#f6ff
+/Zcircle 16#24cf
+/Zcircumflex 16#1e90
+/Zdot 16#017b
+/Zdotaccent 16#017b
+/Zdotbelow 16#1e92
+/Zecyrillic 16#0417
+/Zedescendercyrillic 16#0498
+/Zedieresiscyrillic 16#04de
+/Zeta 16#0396
+/Zhearmenian 16#053a
+/Zhebrevecyrillic 16#04c1
+/Zhecyrillic 16#0416
+/Zhedescendercyrillic 16#0496
+/Zhedieresiscyrillic 16#04dc
+/Zlinebelow 16#1e94
+/Zmonospace 16#ff3a
+/Zsmall 16#f77a
+/Zstroke 16#01b5
+/a 16#0061
+/aabengali 16#0986
+/aacute 16#00e1
+/aadeva 16#0906
+/aagujarati 16#0a86
+/aagurmukhi 16#0a06
+/aamatragurmukhi 16#0a3e
+/aarusquare 16#3303
+/aavowelsignbengali 16#09be
+/aavowelsigndeva 16#093e
+/aavowelsigngujarati 16#0abe
+/abbreviationmarkarmenian 16#055f
+/abbreviationsigndeva 16#0970
+/abengali 16#0985
+/abopomofo 16#311a
+/abreve 16#0103
+/abreveacute 16#1eaf
+/abrevecyrillic 16#04d1
+/abrevedotbelow 16#1eb7
+/abrevegrave 16#1eb1
+/abrevehookabove 16#1eb3
+/abrevetilde 16#1eb5
+/acaron 16#01ce
+/acircle 16#24d0
+/acircumflex 16#00e2
+/acircumflexacute 16#1ea5
+/acircumflexdotbelow 16#1ead
+/acircumflexgrave 16#1ea7
+/acircumflexhookabove 16#1ea9
+/acircumflextilde 16#1eab
+/acute 16#00b4
+/acutebelowcmb 16#0317
+/acutecmb 16#0301
+/acutecomb 16#0301
+/acutedeva 16#0954
+/acutelowmod 16#02cf
+/acutetonecmb 16#0341
+/acyrillic 16#0430
+/adblgrave 16#0201
+/addakgurmukhi 16#0a71
+/adeva 16#0905
+/adieresis 16#00e4
+/adieresiscyrillic 16#04d3
+/adieresismacron 16#01df
+/adotbelow 16#1ea1
+/adotmacron 16#01e1
+/ae 16#00e6
+/aeacute 16#01fd
+/aekorean 16#3150
+/aemacron 16#01e3
+/afii00208 16#2015
+/afii08941 16#20a4
+/afii10017 16#0410
+/afii10018 16#0411
+/afii10019 16#0412
+/afii10020 16#0413
+/afii10021 16#0414
+/afii10022 16#0415
+/afii10023 16#0401
+/afii10024 16#0416
+/afii10025 16#0417
+/afii10026 16#0418
+/afii10027 16#0419
+/afii10028 16#041a
+/afii10029 16#041b
+/afii10030 16#041c
+/afii10031 16#041d
+/afii10032 16#041e
+/afii10033 16#041f
+/afii10034 16#0420
+/afii10035 16#0421
+/afii10036 16#0422
+/afii10037 16#0423
+/afii10038 16#0424
+/afii10039 16#0425
+/afii10040 16#0426
+/afii10041 16#0427
+/afii10042 16#0428
+/afii10043 16#0429
+/afii10044 16#042a
+/afii10045 16#042b
+/afii10046 16#042c
+/afii10047 16#042d
+/afii10048 16#042e
+/afii10049 16#042f
+/afii10050 16#0490
+/afii10051 16#0402
+/afii10052 16#0403
+/afii10053 16#0404
+/afii10054 16#0405
+/afii10055 16#0406
+/afii10056 16#0407
+/afii10057 16#0408
+/afii10058 16#0409
+/afii10059 16#040a
+/afii10060 16#040b
+/afii10061 16#040c
+/afii10062 16#040e
+/afii10063 16#f6c4
+/afii10064 16#f6c5
+/afii10065 16#0430
+/afii10066 16#0431
+/afii10067 16#0432
+/afii10068 16#0433
+/afii10069 16#0434
+/afii10070 16#0435
+/afii10071 16#0451
+/afii10072 16#0436
+/afii10073 16#0437
+/afii10074 16#0438
+/afii10075 16#0439
+/afii10076 16#043a
+/afii10077 16#043b
+/afii10078 16#043c
+/afii10079 16#043d
+/afii10080 16#043e
+/afii10081 16#043f
+/afii10082 16#0440
+/afii10083 16#0441
+/afii10084 16#0442
+/afii10085 16#0443
+/afii10086 16#0444
+/afii10087 16#0445
+/afii10088 16#0446
+/afii10089 16#0447
+/afii10090 16#0448
+/afii10091 16#0449
+/afii10092 16#044a
+/afii10093 16#044b
+/afii10094 16#044c
+/afii10095 16#044d
+/afii10096 16#044e
+/afii10097 16#044f
+/afii10098 16#0491
+/afii10099 16#0452
+/afii10100 16#0453
+/afii10101 16#0454
+/afii10102 16#0455
+/afii10103 16#0456
+/afii10104 16#0457
+/afii10105 16#0458
+/afii10106 16#0459
+/afii10107 16#045a
+/afii10108 16#045b
+/afii10109 16#045c
+/afii10110 16#045e
+/afii10145 16#040f
+/afii10146 16#0462
+/afii10147 16#0472
+/afii10148 16#0474
+/afii10192 16#f6c6
+/afii10193 16#045f
+/afii10194 16#0463
+/afii10195 16#0473
+/afii10196 16#0475
+/afii10831 16#f6c7
+/afii10832 16#f6c8
+/afii10846 16#04d9
+/afii299 16#200e
+/afii300 16#200f
+/afii301 16#200d
+/afii57381 16#066a
+/afii57388 16#060c
+/afii57392 16#0660
+/afii57393 16#0661
+/afii57394 16#0662
+/afii57395 16#0663
+/afii57396 16#0664
+/afii57397 16#0665
+/afii57398 16#0666
+/afii57399 16#0667
+/afii57400 16#0668
+/afii57401 16#0669
+/afii57403 16#061b
+/afii57407 16#061f
+/afii57409 16#0621
+/afii57410 16#0622
+/afii57411 16#0623
+/afii57412 16#0624
+/afii57413 16#0625
+/afii57414 16#0626
+/afii57415 16#0627
+/afii57416 16#0628
+/afii57417 16#0629
+/afii57418 16#062a
+/afii57419 16#062b
+/afii57420 16#062c
+/afii57421 16#062d
+/afii57422 16#062e
+/afii57423 16#062f
+/afii57424 16#0630
+/afii57425 16#0631
+/afii57426 16#0632
+/afii57427 16#0633
+/afii57428 16#0634
+/afii57429 16#0635
+/afii57430 16#0636
+/afii57431 16#0637
+/afii57432 16#0638
+/afii57433 16#0639
+/afii57434 16#063a
+/afii57440 16#0640
+/afii57441 16#0641
+/afii57442 16#0642
+/afii57443 16#0643
+/afii57444 16#0644
+/afii57445 16#0645
+/afii57446 16#0646
+/afii57448 16#0648
+/afii57449 16#0649
+/afii57450 16#064a
+/afii57451 16#064b
+/afii57452 16#064c
+/afii57453 16#064d
+/afii57454 16#064e
+/afii57455 16#064f
+/afii57456 16#0650
+/afii57457 16#0651
+/afii57458 16#0652
+/afii57470 16#0647
+/afii57505 16#06a4
+/afii57506 16#067e
+/afii57507 16#0686
+/afii57508 16#0698
+/afii57509 16#06af
+/afii57511 16#0679
+/afii57512 16#0688
+/afii57513 16#0691
+/afii57514 16#06ba
+/afii57519 16#06d2
+/afii57534 16#06d5
+/afii57636 16#20aa
+/afii57645 16#05be
+/afii57658 16#05c3
+/afii57664 16#05d0
+/afii57665 16#05d1
+/afii57666 16#05d2
+/afii57667 16#05d3
+/afii57668 16#05d4
+/afii57669 16#05d5
+/afii57670 16#05d6
+/afii57671 16#05d7
+/afii57672 16#05d8
+/afii57673 16#05d9
+/afii57674 16#05da
+/afii57675 16#05db
+/afii57676 16#05dc
+/afii57677 16#05dd
+/afii57678 16#05de
+/afii57679 16#05df
+/afii57680 16#05e0
+/afii57681 16#05e1
+/afii57682 16#05e2
+/afii57683 16#05e3
+/afii57684 16#05e4
+/afii57685 16#05e5
+/afii57686 16#05e6
+/afii57687 16#05e7
+/afii57688 16#05e8
+/afii57689 16#05e9
+/afii57690 16#05ea
+/afii57694 16#fb2a
+/afii57695 16#fb2b
+/afii57700 16#fb4b
+/afii57705 16#fb1f
+/afii57716 16#05f0
+/afii57717 16#05f1
+/afii57718 16#05f2
+/afii57723 16#fb35
+/afii57793 16#05b4
+/afii57794 16#05b5
+/afii57795 16#05b6
+/afii57796 16#05bb
+/afii57797 16#05b8
+/afii57798 16#05b7
+/afii57799 16#05b0
+/afii57800 16#05b2
+/afii57801 16#05b1
+/afii57802 16#05b3
+/afii57803 16#05c2
+/afii57804 16#05c1
+/afii57806 16#05b9
+/afii57807 16#05bc
+/afii57839 16#05bd
+/afii57841 16#05bf
+/afii57842 16#05c0
+/afii57929 16#02bc
+/afii61248 16#2105
+/afii61289 16#2113
+/afii61352 16#2116
+/afii61573 16#202c
+/afii61574 16#202d
+/afii61575 16#202e
+/afii61664 16#200c
+/afii63167 16#066d
+/afii64937 16#02bd
+/agrave 16#00e0
+/agujarati 16#0a85
+/agurmukhi 16#0a05
+/ahiragana 16#3042
+/ahookabove 16#1ea3
+/aibengali 16#0990
+/aibopomofo 16#311e
+/aideva 16#0910
+/aiecyrillic 16#04d5
+/aigujarati 16#0a90
+/aigurmukhi 16#0a10
+/aimatragurmukhi 16#0a48
+/ainarabic 16#0639
+/ainfinalarabic 16#feca
+/aininitialarabic 16#fecb
+/ainmedialarabic 16#fecc
+/ainvertedbreve 16#0203
+/aivowelsignbengali 16#09c8
+/aivowelsigndeva 16#0948
+/aivowelsigngujarati 16#0ac8
+/akatakana 16#30a2
+/akatakanahalfwidth 16#ff71
+/akorean 16#314f
+/alef 16#05d0
+/alefarabic 16#0627
+/alefdageshhebrew 16#fb30
+/aleffinalarabic 16#fe8e
+/alefhamzaabovearabic 16#0623
+/alefhamzaabovefinalarabic 16#fe84
+/alefhamzabelowarabic 16#0625
+/alefhamzabelowfinalarabic 16#fe88
+/alefhebrew 16#05d0
+/aleflamedhebrew 16#fb4f
+/alefmaddaabovearabic 16#0622
+/alefmaddaabovefinalarabic 16#fe82
+/alefmaksuraarabic 16#0649
+/alefmaksurafinalarabic 16#fef0
+/alefmaksurainitialarabic 16#fef3
+/alefmaksuramedialarabic 16#fef4
+/alefpatahhebrew 16#fb2e
+/alefqamatshebrew 16#fb2f
+/aleph 16#2135
+/allequal 16#224c
+/alpha 16#03b1
+/alphatonos 16#03ac
+/amacron 16#0101
+/amonospace 16#ff41
+/ampersand 16#0026
+/ampersandmonospace 16#ff06
+/ampersandsmall 16#f726
+/amsquare 16#33c2
+/anbopomofo 16#3122
+/angbopomofo 16#3124
+/angkhankhuthai 16#0e5a
+/angle 16#2220
+/anglebracketleft 16#3008
+/anglebracketleftvertical 16#fe3f
+/anglebracketright 16#3009
+/anglebracketrightvertical 16#fe40
+/angleleft 16#2329
+/angleright 16#232a
+/angstrom 16#212b
+/anoteleia 16#0387
+/anudattadeva 16#0952
+/anusvarabengali 16#0982
+/anusvaradeva 16#0902
+/anusvaragujarati 16#0a82
+/aogonek 16#0105
+/apaatosquare 16#3300
+/aparen 16#249c
+/apostrophearmenian 16#055a
+/apostrophemod 16#02bc
+/apple 16#f8ff
+/approaches 16#2250
+/approxequal 16#2248
+/approxequalorimage 16#2252
+/approximatelyequal 16#2245
+/araeaekorean 16#318e
+/araeakorean 16#318d
+/arc 16#2312
+/arighthalfring 16#1e9a
+/aring 16#00e5
+/aringacute 16#01fb
+/aringbelow 16#1e01
+/arrowboth 16#2194
+/arrowdashdown 16#21e3
+/arrowdashleft 16#21e0
+/arrowdashright 16#21e2
+/arrowdashup 16#21e1
+/arrowdblboth 16#21d4
+/arrowdbldown 16#21d3
+/arrowdblleft 16#21d0
+/arrowdblright 16#21d2
+/arrowdblup 16#21d1
+/arrowdown 16#2193
+/arrowdownleft 16#2199
+/arrowdownright 16#2198
+/arrowdownwhite 16#21e9
+/arrowheaddownmod 16#02c5
+/arrowheadleftmod 16#02c2
+/arrowheadrightmod 16#02c3
+/arrowheadupmod 16#02c4
+/arrowhorizex 16#f8e7
+/arrowleft 16#2190
+/arrowleftdbl 16#21d0
+/arrowleftdblstroke 16#21cd
+/arrowleftoverright 16#21c6
+/arrowleftwhite 16#21e6
+/arrowright 16#2192
+/arrowrightdblstroke 16#21cf
+/arrowrightheavy 16#279e
+/arrowrightoverleft 16#21c4
+/arrowrightwhite 16#21e8
+/arrowtableft 16#21e4
+/arrowtabright 16#21e5
+/arrowup 16#2191
+/arrowupdn 16#2195
+/arrowupdnbse 16#21a8
+/arrowupdownbase 16#21a8
+/arrowupleft 16#2196
+/arrowupleftofdown 16#21c5
+/arrowupright 16#2197
+/arrowupwhite 16#21e7
+/arrowvertex 16#f8e6
+/asciicircum 16#005e
+/asciicircummonospace 16#ff3e
+/asciitilde 16#007e
+/asciitildemonospace 16#ff5e
+/ascript 16#0251
+/ascriptturned 16#0252
+/asmallhiragana 16#3041
+/asmallkatakana 16#30a1
+/asmallkatakanahalfwidth 16#ff67
+/asterisk 16#002a
+/asteriskaltonearabic 16#066d
+/asteriskarabic 16#066d
+/asteriskmath 16#2217
+/asteriskmonospace 16#ff0a
+/asterisksmall 16#fe61
+/asterism 16#2042
+/asuperior 16#f6e9
+/asymptoticallyequal 16#2243
+/at 16#0040
+/atilde 16#00e3
+/atmonospace 16#ff20
+/atsmall 16#fe6b
+/aturned 16#0250
+/aubengali 16#0994
+/aubopomofo 16#3120
+/audeva 16#0914
+/augujarati 16#0a94
+/augurmukhi 16#0a14
+/aulengthmarkbengali 16#09d7
+/aumatragurmukhi 16#0a4c
+/auvowelsignbengali 16#09cc
+/auvowelsigndeva 16#094c
+/auvowelsigngujarati 16#0acc
+/avagrahadeva 16#093d
+/aybarmenian 16#0561
+/ayin 16#05e2
+/ayinaltonehebrew 16#fb20
+/ayinhebrew 16#05e2
+/b 16#0062
+/babengali 16#09ac
+/backslash 16#005c
+/backslashmonospace 16#ff3c
+/badeva 16#092c
+/bagujarati 16#0aac
+/bagurmukhi 16#0a2c
+/bahiragana 16#3070
+/bahtthai 16#0e3f
+/bakatakana 16#30d0
+/bar 16#007c
+/barmonospace 16#ff5c
+/bbopomofo 16#3105
+/bcircle 16#24d1
+/bdotaccent 16#1e03
+/bdotbelow 16#1e05
+/beamedsixteenthnotes 16#266c
+/because 16#2235
+/becyrillic 16#0431
+/beharabic 16#0628
+/behfinalarabic 16#fe90
+/behinitialarabic 16#fe91
+/behiragana 16#3079
+/behmedialarabic 16#fe92
+/behmeeminitialarabic 16#fc9f
+/behmeemisolatedarabic 16#fc08
+/behnoonfinalarabic 16#fc6d
+/bekatakana 16#30d9
+/benarmenian 16#0562
+/bet 16#05d1
+/beta 16#03b2
+/betasymbolgreek 16#03d0
+/betdagesh 16#fb31
+/betdageshhebrew 16#fb31
+/bethebrew 16#05d1
+/betrafehebrew 16#fb4c
+/bhabengali 16#09ad
+/bhadeva 16#092d
+/bhagujarati 16#0aad
+/bhagurmukhi 16#0a2d
+/bhook 16#0253
+/bihiragana 16#3073
+/bikatakana 16#30d3
+/bilabialclick 16#0298
+/bindigurmukhi 16#0a02
+/birusquare 16#3331
+/blackcircle 16#25cf
+/blackdiamond 16#25c6
+/blackdownpointingtriangle 16#25bc
+/blackleftpointingpointer 16#25c4
+/blackleftpointingtriangle 16#25c0
+/blacklenticularbracketleft 16#3010
+/blacklenticularbracketleftvertical 16#fe3b
+/blacklenticularbracketright 16#3011
+/blacklenticularbracketrightvertical 16#fe3c
+/blacklowerlefttriangle 16#25e3
+/blacklowerrighttriangle 16#25e2
+/blackrectangle 16#25ac
+/blackrightpointingpointer 16#25ba
+/blackrightpointingtriangle 16#25b6
+/blacksmallsquare 16#25aa
+/blacksmilingface 16#263b
+/blacksquare 16#25a0
+/blackstar 16#2605
+/blackupperlefttriangle 16#25e4
+/blackupperrighttriangle 16#25e5
+/blackuppointingsmalltriangle 16#25b4
+/blackuppointingtriangle 16#25b2
+/blank 16#2423
+/blinebelow 16#1e07
+/block 16#2588
+/bmonospace 16#ff42
+/bobaimaithai 16#0e1a
+/bohiragana 16#307c
+/bokatakana 16#30dc
+/bparen 16#249d
+/bqsquare 16#33c3
+/braceex 16#f8f4
+/braceleft 16#007b
+/braceleftbt 16#f8f3
+/braceleftmid 16#f8f2
+/braceleftmonospace 16#ff5b
+/braceleftsmall 16#fe5b
+/bracelefttp 16#f8f1
+/braceleftvertical 16#fe37
+/braceright 16#007d
+/bracerightbt 16#f8fe
+/bracerightmid 16#f8fd
+/bracerightmonospace 16#ff5d
+/bracerightsmall 16#fe5c
+/bracerighttp 16#f8fc
+/bracerightvertical 16#fe38
+/bracketleft 16#005b
+/bracketleftbt 16#f8f0
+/bracketleftex 16#f8ef
+/bracketleftmonospace 16#ff3b
+/bracketlefttp 16#f8ee
+/bracketright 16#005d
+/bracketrightbt 16#f8fb
+/bracketrightex 16#f8fa
+/bracketrightmonospace 16#ff3d
+/bracketrighttp 16#f8f9
+/breve 16#02d8
+/brevebelowcmb 16#032e
+/brevecmb 16#0306
+/breveinvertedbelowcmb 16#032f
+/breveinvertedcmb 16#0311
+/breveinverteddoublecmb 16#0361
+/bridgebelowcmb 16#032a
+/bridgeinvertedbelowcmb 16#033a
+/brokenbar 16#00a6
+/bstroke 16#0180
+/bsuperior 16#f6ea
+/btopbar 16#0183
+/buhiragana 16#3076
+/bukatakana 16#30d6
+/bullet 16#2022
+/bulletinverse 16#25d8
+/bulletoperator 16#2219
+/bullseye 16#25ce
+/c 16#0063
+/caarmenian 16#056e
+/cabengali 16#099a
+/cacute 16#0107
+/cadeva 16#091a
+/cagujarati 16#0a9a
+/cagurmukhi 16#0a1a
+/calsquare 16#3388
+/candrabindubengali 16#0981
+/candrabinducmb 16#0310
+/candrabindudeva 16#0901
+/candrabindugujarati 16#0a81
+/capslock 16#21ea
+/careof 16#2105
+/caron 16#02c7
+/caronbelowcmb 16#032c
+/caroncmb 16#030c
+/carriagereturn 16#21b5
+/cbopomofo 16#3118
+/ccaron 16#010d
+/ccedilla 16#00e7
+/ccedillaacute 16#1e09
+/ccircle 16#24d2
+/ccircumflex 16#0109
+/ccurl 16#0255
+/cdot 16#010b
+/cdotaccent 16#010b
+/cdsquare 16#33c5
+/cedilla 16#00b8
+/cedillacmb 16#0327
+/cent 16#00a2
+/centigrade 16#2103
+/centinferior 16#f6df
+/centmonospace 16#ffe0
+/centoldstyle 16#f7a2
+/centsuperior 16#f6e0
+/chaarmenian 16#0579
+/chabengali 16#099b
+/chadeva 16#091b
+/chagujarati 16#0a9b
+/chagurmukhi 16#0a1b
+/chbopomofo 16#3114
+/cheabkhasiancyrillic 16#04bd
+/checkmark 16#2713
+/checyrillic 16#0447
+/chedescenderabkhasiancyrillic 16#04bf
+/chedescendercyrillic 16#04b7
+/chedieresiscyrillic 16#04f5
+/cheharmenian 16#0573
+/chekhakassiancyrillic 16#04cc
+/cheverticalstrokecyrillic 16#04b9
+/chi 16#03c7
+/chieuchacirclekorean 16#3277
+/chieuchaparenkorean 16#3217
+/chieuchcirclekorean 16#3269
+/chieuchkorean 16#314a
+/chieuchparenkorean 16#3209
+/chochangthai 16#0e0a
+/chochanthai 16#0e08
+/chochingthai 16#0e09
+/chochoethai 16#0e0c
+/chook 16#0188
+/cieucacirclekorean 16#3276
+/cieucaparenkorean 16#3216
+/cieuccirclekorean 16#3268
+/cieuckorean 16#3148
+/cieucparenkorean 16#3208
+/cieucuparenkorean 16#321c
+/circle 16#25cb
+/circlemultiply 16#2297
+/circleot 16#2299
+/circleplus 16#2295
+/circlepostalmark 16#3036
+/circlewithlefthalfblack 16#25d0
+/circlewithrighthalfblack 16#25d1
+/circumflex 16#02c6
+/circumflexbelowcmb 16#032d
+/circumflexcmb 16#0302
+/clear 16#2327
+/clickalveolar 16#01c2
+/clickdental 16#01c0
+/clicklateral 16#01c1
+/clickretroflex 16#01c3
+/club 16#2663
+/clubsuitblack 16#2663
+/clubsuitwhite 16#2667
+/cmcubedsquare 16#33a4
+/cmonospace 16#ff43
+/cmsquaredsquare 16#33a0
+/coarmenian 16#0581
+/colon 16#003a
+/colonmonetary 16#20a1
+/colonmonospace 16#ff1a
+/colonsign 16#20a1
+/colonsmall 16#fe55
+/colontriangularhalfmod 16#02d1
+/colontriangularmod 16#02d0
+/comma 16#002c
+/commaabovecmb 16#0313
+/commaaboverightcmb 16#0315
+/commaaccent 16#f6c3
+/commaarabic 16#060c
+/commaarmenian 16#055d
+/commainferior 16#f6e1
+/commamonospace 16#ff0c
+/commareversedabovecmb 16#0314
+/commareversedmod 16#02bd
+/commasmall 16#fe50
+/commasuperior 16#f6e2
+/commaturnedabovecmb 16#0312
+/commaturnedmod 16#02bb
+/compass 16#263c
+/congruent 16#2245
+/contourintegral 16#222e
+/control 16#2303
+/controlACK 16#0006
+/controlBEL 16#0007
+/controlBS 16#0008
+/controlCAN 16#0018
+/controlCR 16#000d
+/controlDC1 16#0011
+/controlDC2 16#0012
+/controlDC3 16#0013
+/controlDC4 16#0014
+/controlDEL 16#007f
+/controlDLE 16#0010
+/controlEM 16#0019
+/controlENQ 16#0005
+/controlEOT 16#0004
+/controlESC 16#001b
+/controlETB 16#0017
+/controlETX 16#0003
+/controlFF 16#000c
+/controlFS 16#001c
+/controlGS 16#001d
+/controlHT 16#0009
+/controlLF 16#000a
+/controlNAK 16#0015
+/controlRS 16#001e
+/controlSI 16#000f
+/controlSO 16#000e
+/controlSOT 16#0002
+/controlSTX 16#0001
+/controlSUB 16#001a
+/controlSYN 16#0016
+/controlUS 16#001f
+/controlVT 16#000b
+/copyright 16#00a9
+/copyrightsans 16#f8e9
+/copyrightserif 16#f6d9
+/cornerbracketleft 16#300c
+/cornerbracketlefthalfwidth 16#ff62
+/cornerbracketleftvertical 16#fe41
+/cornerbracketright 16#300d
+/cornerbracketrighthalfwidth 16#ff63
+/cornerbracketrightvertical 16#fe42
+/corporationsquare 16#337f
+/cosquare 16#33c7
+/coverkgsquare 16#33c6
+/cparen 16#249e
+/cruzeiro 16#20a2
+/cstretched 16#0297
+/curlyand 16#22cf
+/curlyor 16#22ce
+/currency 16#00a4
+/cyrBreve 16#f6d1
+/cyrFlex 16#f6d2
+/cyrbreve 16#f6d4
+/cyrflex 16#f6d5
+/d 16#0064
+/daarmenian 16#0564
+/dabengali 16#09a6
+/dadarabic 16#0636
+/dadeva 16#0926
+/dadfinalarabic 16#febe
+/dadinitialarabic 16#febf
+/dadmedialarabic 16#fec0
+/dagesh 16#05bc
+/dageshhebrew 16#05bc
+/dagger 16#2020
+/daggerdbl 16#2021
+/dagujarati 16#0aa6
+/dagurmukhi 16#0a26
+/dahiragana 16#3060
+/dakatakana 16#30c0
+/dalarabic 16#062f
+/dalet 16#05d3
+/daletdagesh 16#fb33
+/daletdageshhebrew 16#fb33
+/dalethebrew 16#05d3
+/dalfinalarabic 16#feaa
+/dammaarabic 16#064f
+/dammalowarabic 16#064f
+/dammatanaltonearabic 16#064c
+/dammatanarabic 16#064c
+/danda 16#0964
+/dargahebrew 16#05a7
+/dargalefthebrew 16#05a7
+/dasiapneumatacyrilliccmb 16#0485
+/dblGrave 16#f6d3
+/dblanglebracketleft 16#300a
+/dblanglebracketleftvertical 16#fe3d
+/dblanglebracketright 16#300b
+/dblanglebracketrightvertical 16#fe3e
+/dblarchinvertedbelowcmb 16#032b
+/dblarrowleft 16#21d4
+/dblarrowright 16#21d2
+/dbldanda 16#0965
+/dblgrave 16#f6d6
+/dblgravecmb 16#030f
+/dblintegral 16#222c
+/dbllowline 16#2017
+/dbllowlinecmb 16#0333
+/dbloverlinecmb 16#033f
+/dblprimemod 16#02ba
+/dblverticalbar 16#2016
+/dblverticallineabovecmb 16#030e
+/dbopomofo 16#3109
+/dbsquare 16#33c8
+/dcaron 16#010f
+/dcedilla 16#1e11
+/dcircle 16#24d3
+/dcircumflexbelow 16#1e13
+/dcroat 16#0111
+/ddabengali 16#09a1
+/ddadeva 16#0921
+/ddagujarati 16#0aa1
+/ddagurmukhi 16#0a21
+/ddalarabic 16#0688
+/ddalfinalarabic 16#fb89
+/dddhadeva 16#095c
+/ddhabengali 16#09a2
+/ddhadeva 16#0922
+/ddhagujarati 16#0aa2
+/ddhagurmukhi 16#0a22
+/ddotaccent 16#1e0b
+/ddotbelow 16#1e0d
+/decimalseparatorarabic 16#066b
+/decimalseparatorpersian 16#066b
+/decyrillic 16#0434
+/degree 16#00b0
+/dehihebrew 16#05ad
+/dehiragana 16#3067
+/deicoptic 16#03ef
+/dekatakana 16#30c7
+/deleteleft 16#232b
+/deleteright 16#2326
+/delta 16#03b4
+/deltaturned 16#018d
+/denominatorminusonenumeratorbengali 16#09f8
+/dezh 16#02a4
+/dhabengali 16#09a7
+/dhadeva 16#0927
+/dhagujarati 16#0aa7
+/dhagurmukhi 16#0a27
+/dhook 16#0257
+/dialytikatonos 16#0385
+/dialytikatonoscmb 16#0344
+/diamond 16#2666
+/diamondsuitwhite 16#2662
+/dieresis 16#00a8
+/dieresisacute 16#f6d7
+/dieresisbelowcmb 16#0324
+/dieresiscmb 16#0308
+/dieresisgrave 16#f6d8
+/dieresistonos 16#0385
+/dihiragana 16#3062
+/dikatakana 16#30c2
+/dittomark 16#3003
+/divide 16#00f7
+/divides 16#2223
+/divisionslash 16#2215
+/djecyrillic 16#0452
+/dkshade 16#2593
+/dlinebelow 16#1e0f
+/dlsquare 16#3397
+/dmacron 16#0111
+/dmonospace 16#ff44
+/dnblock 16#2584
+/dochadathai 16#0e0e
+/dodekthai 16#0e14
+/dohiragana 16#3069
+/dokatakana 16#30c9
+/dollar 16#0024
+/dollarinferior 16#f6e3
+/dollarmonospace 16#ff04
+/dollaroldstyle 16#f724
+/dollarsmall 16#fe69
+/dollarsuperior 16#f6e4
+/dong 16#20ab
+/dorusquare 16#3326
+/dotaccent 16#02d9
+/dotaccentcmb 16#0307
+/dotbelowcmb 16#0323
+/dotbelowcomb 16#0323
+/dotkatakana 16#30fb
+/dotlessi 16#0131
+/dotlessj 16#f6be
+/dotlessjstrokehook 16#0284
+/dotmath 16#22c5
+/dottedcircle 16#25cc
+/doubleyodpatah 16#fb1f
+/doubleyodpatahhebrew 16#fb1f
+/downtackbelowcmb 16#031e
+/downtackmod 16#02d5
+/dparen 16#249f
+/dsuperior 16#f6eb
+/dtail 16#0256
+/dtopbar 16#018c
+/duhiragana 16#3065
+/dukatakana 16#30c5
+/dz 16#01f3
+/dzaltone 16#02a3
+/dzcaron 16#01c6
+/dzcurl 16#02a5
+/dzeabkhasiancyrillic 16#04e1
+/dzecyrillic 16#0455
+/dzhecyrillic 16#045f
+/e 16#0065
+/eacute 16#00e9
+/earth 16#2641
+/ebengali 16#098f
+/ebopomofo 16#311c
+/ebreve 16#0115
+/ecandradeva 16#090d
+/ecandragujarati 16#0a8d
+/ecandravowelsigndeva 16#0945
+/ecandravowelsigngujarati 16#0ac5
+/ecaron 16#011b
+/ecedillabreve 16#1e1d
+/echarmenian 16#0565
+/echyiwnarmenian 16#0587
+/ecircle 16#24d4
+/ecircumflex 16#00ea
+/ecircumflexacute 16#1ebf
+/ecircumflexbelow 16#1e19
+/ecircumflexdotbelow 16#1ec7
+/ecircumflexgrave 16#1ec1
+/ecircumflexhookabove 16#1ec3
+/ecircumflextilde 16#1ec5
+/ecyrillic 16#0454
+/edblgrave 16#0205
+/edeva 16#090f
+/edieresis 16#00eb
+/edot 16#0117
+/edotaccent 16#0117
+/edotbelow 16#1eb9
+/eegurmukhi 16#0a0f
+/eematragurmukhi 16#0a47
+/efcyrillic 16#0444
+/egrave 16#00e8
+/egujarati 16#0a8f
+/eharmenian 16#0567
+/ehbopomofo 16#311d
+/ehiragana 16#3048
+/ehookabove 16#1ebb
+/eibopomofo 16#311f
+/eight 16#0038
+/eightarabic 16#0668
+/eightbengali 16#09ee
+/eightcircle 16#2467
+/eightcircleinversesansserif 16#2791
+/eightdeva 16#096e
+/eighteencircle 16#2471
+/eighteenparen 16#2485
+/eighteenperiod 16#2499
+/eightgujarati 16#0aee
+/eightgurmukhi 16#0a6e
+/eighthackarabic 16#0668
+/eighthangzhou 16#3028
+/eighthnotebeamed 16#266b
+/eightideographicparen 16#3227
+/eightinferior 16#2088
+/eightmonospace 16#ff18
+/eightoldstyle 16#f738
+/eightparen 16#247b
+/eightperiod 16#248f
+/eightpersian 16#06f8
+/eightroman 16#2177
+/eightsuperior 16#2078
+/eightthai 16#0e58
+/einvertedbreve 16#0207
+/eiotifiedcyrillic 16#0465
+/ekatakana 16#30a8
+/ekatakanahalfwidth 16#ff74
+/ekonkargurmukhi 16#0a74
+/ekorean 16#3154
+/elcyrillic 16#043b
+/element 16#2208
+/elevencircle 16#246a
+/elevenparen 16#247e
+/elevenperiod 16#2492
+/elevenroman 16#217a
+/ellipsis 16#2026
+/ellipsisvertical 16#22ee
+/emacron 16#0113
+/emacronacute 16#1e17
+/emacrongrave 16#1e15
+/emcyrillic 16#043c
+/emdash 16#2014
+/emdashvertical 16#fe31
+/emonospace 16#ff45
+/emphasismarkarmenian 16#055b
+/emptyset 16#2205
+/enbopomofo 16#3123
+/encyrillic 16#043d
+/endash 16#2013
+/endashvertical 16#fe32
+/endescendercyrillic 16#04a3
+/eng 16#014b
+/engbopomofo 16#3125
+/enghecyrillic 16#04a5
+/enhookcyrillic 16#04c8
+/enspace 16#2002
+/eogonek 16#0119
+/eokorean 16#3153
+/eopen 16#025b
+/eopenclosed 16#029a
+/eopenreversed 16#025c
+/eopenreversedclosed 16#025e
+/eopenreversedhook 16#025d
+/eparen 16#24a0
+/epsilon 16#03b5
+/epsilontonos 16#03ad
+/equal 16#003d
+/equalmonospace 16#ff1d
+/equalsmall 16#fe66
+/equalsuperior 16#207c
+/equivalence 16#2261
+/erbopomofo 16#3126
+/ercyrillic 16#0440
+/ereversed 16#0258
+/ereversedcyrillic 16#044d
+/escyrillic 16#0441
+/esdescendercyrillic 16#04ab
+/esh 16#0283
+/eshcurl 16#0286
+/eshortdeva 16#090e
+/eshortvowelsigndeva 16#0946
+/eshreversedloop 16#01aa
+/eshsquatreversed 16#0285
+/esmallhiragana 16#3047
+/esmallkatakana 16#30a7
+/esmallkatakanahalfwidth 16#ff6a
+/estimated 16#212e
+/esuperior 16#f6ec
+/eta 16#03b7
+/etarmenian 16#0568
+/etatonos 16#03ae
+/eth 16#00f0
+/etilde 16#1ebd
+/etildebelow 16#1e1b
+/etnahtafoukhhebrew 16#0591
+/etnahtafoukhlefthebrew 16#0591
+/etnahtahebrew 16#0591
+/etnahtalefthebrew 16#0591
+/eturned 16#01dd
+/eukorean 16#3161
+/euro 16#20ac
+/evowelsignbengali 16#09c7
+/evowelsigndeva 16#0947
+/evowelsigngujarati 16#0ac7
+/exclam 16#0021
+/exclamarmenian 16#055c
+/exclamdbl 16#203c
+/exclamdown 16#00a1
+/exclamdownsmall 16#f7a1
+/exclammonospace 16#ff01
+/exclamsmall 16#f721
+/existential 16#2203
+/ezh 16#0292
+/ezhcaron 16#01ef
+/ezhcurl 16#0293
+/ezhreversed 16#01b9
+/ezhtail 16#01ba
+/f 16#0066
+/fadeva 16#095e
+/fagurmukhi 16#0a5e
+/fahrenheit 16#2109
+/fathaarabic 16#064e
+/fathalowarabic 16#064e
+/fathatanarabic 16#064b
+/fbopomofo 16#3108
+/fcircle 16#24d5
+/fdotaccent 16#1e1f
+/feharabic 16#0641
+/feharmenian 16#0586
+/fehfinalarabic 16#fed2
+/fehinitialarabic 16#fed3
+/fehmedialarabic 16#fed4
+/feicoptic 16#03e5
+/female 16#2640
+/ff 16#fb00
+/ffi 16#fb03
+/ffl 16#fb04
+/fi 16#fb01
+/fifteencircle 16#246e
+/fifteenparen 16#2482
+/fifteenperiod 16#2496
+/figuredash 16#2012
+/filledbox 16#25a0
+/filledrect 16#25ac
+/finalkaf 16#05da
+/finalkafdagesh 16#fb3a
+/finalkafdageshhebrew 16#fb3a
+/finalkafhebrew 16#05da
+/finalmem 16#05dd
+/finalmemhebrew 16#05dd
+/finalnun 16#05df
+/finalnunhebrew 16#05df
+/finalpe 16#05e3
+/finalpehebrew 16#05e3
+/finaltsadi 16#05e5
+/finaltsadihebrew 16#05e5
+/firsttonechinese 16#02c9
+/fisheye 16#25c9
+/fitacyrillic 16#0473
+/five 16#0035
+/fivearabic 16#0665
+/fivebengali 16#09eb
+/fivecircle 16#2464
+/fivecircleinversesansserif 16#278e
+/fivedeva 16#096b
+/fiveeighths 16#215d
+/fivegujarati 16#0aeb
+/fivegurmukhi 16#0a6b
+/fivehackarabic 16#0665
+/fivehangzhou 16#3025
+/fiveideographicparen 16#3224
+/fiveinferior 16#2085
+/fivemonospace 16#ff15
+/fiveoldstyle 16#f735
+/fiveparen 16#2478
+/fiveperiod 16#248c
+/fivepersian 16#06f5
+/fiveroman 16#2174
+/fivesuperior 16#2075
+/fivethai 16#0e55
+/fl 16#fb02
+/florin 16#0192
+/fmonospace 16#ff46
+/fmsquare 16#3399
+/fofanthai 16#0e1f
+/fofathai 16#0e1d
+/fongmanthai 16#0e4f
+/forall 16#2200
+/four 16#0034
+/fourarabic 16#0664
+/fourbengali 16#09ea
+/fourcircle 16#2463
+/fourcircleinversesansserif 16#278d
+/fourdeva 16#096a
+/fourgujarati 16#0aea
+/fourgurmukhi 16#0a6a
+/fourhackarabic 16#0664
+/fourhangzhou 16#3024
+/fourideographicparen 16#3223
+/fourinferior 16#2084
+/fourmonospace 16#ff14
+/fournumeratorbengali 16#09f7
+/fouroldstyle 16#f734
+/fourparen 16#2477
+/fourperiod 16#248b
+/fourpersian 16#06f4
+/fourroman 16#2173
+/foursuperior 16#2074
+/fourteencircle 16#246d
+/fourteenparen 16#2481
+/fourteenperiod 16#2495
+/fourthai 16#0e54
+/fourthtonechinese 16#02cb
+/fparen 16#24a1
+/fraction 16#2044
+/franc 16#20a3
+/g 16#0067
+/gabengali 16#0997
+/gacute 16#01f5
+/gadeva 16#0917
+/gafarabic 16#06af
+/gaffinalarabic 16#fb93
+/gafinitialarabic 16#fb94
+/gafmedialarabic 16#fb95
+/gagujarati 16#0a97
+/gagurmukhi 16#0a17
+/gahiragana 16#304c
+/gakatakana 16#30ac
+/gamma 16#03b3
+/gammalatinsmall 16#0263
+/gammasuperior 16#02e0
+/gangiacoptic 16#03eb
+/gbopomofo 16#310d
+/gbreve 16#011f
+/gcaron 16#01e7
+/gcedilla 16#0123
+/gcircle 16#24d6
+/gcircumflex 16#011d
+/gcommaaccent 16#0123
+/gdot 16#0121
+/gdotaccent 16#0121
+/gecyrillic 16#0433
+/gehiragana 16#3052
+/gekatakana 16#30b2
+/geometricallyequal 16#2251
+/gereshaccenthebrew 16#059c
+/gereshhebrew 16#05f3
+/gereshmuqdamhebrew 16#059d
+/germandbls 16#00df
+/gershayimaccenthebrew 16#059e
+/gershayimhebrew 16#05f4
+/getamark 16#3013
+/ghabengali 16#0998
+/ghadarmenian 16#0572
+/ghadeva 16#0918
+/ghagujarati 16#0a98
+/ghagurmukhi 16#0a18
+/ghainarabic 16#063a
+/ghainfinalarabic 16#fece
+/ghaininitialarabic 16#fecf
+/ghainmedialarabic 16#fed0
+/ghemiddlehookcyrillic 16#0495
+/ghestrokecyrillic 16#0493
+/gheupturncyrillic 16#0491
+/ghhadeva 16#095a
+/ghhagurmukhi 16#0a5a
+/ghook 16#0260
+/ghzsquare 16#3393
+/gihiragana 16#304e
+/gikatakana 16#30ae
+/gimarmenian 16#0563
+/gimel 16#05d2
+/gimeldagesh 16#fb32
+/gimeldageshhebrew 16#fb32
+/gimelhebrew 16#05d2
+/gjecyrillic 16#0453
+/glottalinvertedstroke 16#01be
+/glottalstop 16#0294
+/glottalstopinverted 16#0296
+/glottalstopmod 16#02c0
+/glottalstopreversed 16#0295
+/glottalstopreversedmod 16#02c1
+/glottalstopreversedsuperior 16#02e4
+/glottalstopstroke 16#02a1
+/glottalstopstrokereversed 16#02a2
+/gmacron 16#1e21
+/gmonospace 16#ff47
+/gohiragana 16#3054
+/gokatakana 16#30b4
+/gparen 16#24a2
+/gpasquare 16#33ac
+/gradient 16#2207
+/grave 16#0060
+/gravebelowcmb 16#0316
+/gravecmb 16#0300
+/gravecomb 16#0300
+/gravedeva 16#0953
+/gravelowmod 16#02ce
+/gravemonospace 16#ff40
+/gravetonecmb 16#0340
+/greater 16#003e
+/greaterequal 16#2265
+/greaterequalorless 16#22db
+/greatermonospace 16#ff1e
+/greaterorequivalent 16#2273
+/greaterorless 16#2277
+/greateroverequal 16#2267
+/greatersmall 16#fe65
+/gscript 16#0261
+/gstroke 16#01e5
+/guhiragana 16#3050
+/guillemotleft 16#00ab
+/guillemotright 16#00bb
+/guilsinglleft 16#2039
+/guilsinglright 16#203a
+/gukatakana 16#30b0
+/guramusquare 16#3318
+/gysquare 16#33c9
+/h 16#0068
+/haabkhasiancyrillic 16#04a9
+/haaltonearabic 16#06c1
+/habengali 16#09b9
+/hadescendercyrillic 16#04b3
+/hadeva 16#0939
+/hagujarati 16#0ab9
+/hagurmukhi 16#0a39
+/haharabic 16#062d
+/hahfinalarabic 16#fea2
+/hahinitialarabic 16#fea3
+/hahiragana 16#306f
+/hahmedialarabic 16#fea4
+/haitusquare 16#332a
+/hakatakana 16#30cf
+/hakatakanahalfwidth 16#ff8a
+/halantgurmukhi 16#0a4d
+/hamzaarabic 16#0621
+/hamzalowarabic 16#0621
+/hangulfiller 16#3164
+/hardsigncyrillic 16#044a
+/harpoonleftbarbup 16#21bc
+/harpoonrightbarbup 16#21c0
+/hasquare 16#33ca
+/hatafpatah 16#05b2
+/hatafpatah16 16#05b2
+/hatafpatah23 16#05b2
+/hatafpatah2f 16#05b2
+/hatafpatahhebrew 16#05b2
+/hatafpatahnarrowhebrew 16#05b2
+/hatafpatahquarterhebrew 16#05b2
+/hatafpatahwidehebrew 16#05b2
+/hatafqamats 16#05b3
+/hatafqamats1b 16#05b3
+/hatafqamats28 16#05b3
+/hatafqamats34 16#05b3
+/hatafqamatshebrew 16#05b3
+/hatafqamatsnarrowhebrew 16#05b3
+/hatafqamatsquarterhebrew 16#05b3
+/hatafqamatswidehebrew 16#05b3
+/hatafsegol 16#05b1
+/hatafsegol17 16#05b1
+/hatafsegol24 16#05b1
+/hatafsegol30 16#05b1
+/hatafsegolhebrew 16#05b1
+/hatafsegolnarrowhebrew 16#05b1
+/hatafsegolquarterhebrew 16#05b1
+/hatafsegolwidehebrew 16#05b1
+/hbar 16#0127
+/hbopomofo 16#310f
+/hbrevebelow 16#1e2b
+/hcedilla 16#1e29
+/hcircle 16#24d7
+/hcircumflex 16#0125
+/hdieresis 16#1e27
+/hdotaccent 16#1e23
+/hdotbelow 16#1e25
+/he 16#05d4
+/heart 16#2665
+/heartsuitblack 16#2665
+/heartsuitwhite 16#2661
+/hedagesh 16#fb34
+/hedageshhebrew 16#fb34
+/hehaltonearabic 16#06c1
+/heharabic 16#0647
+/hehebrew 16#05d4
+/hehfinalaltonearabic 16#fba7
+/hehfinalalttwoarabic 16#feea
+/hehfinalarabic 16#feea
+/hehhamzaabovefinalarabic 16#fba5
+/hehhamzaaboveisolatedarabic 16#fba4
+/hehinitialaltonearabic 16#fba8
+/hehinitialarabic 16#feeb
+/hehiragana 16#3078
+/hehmedialaltonearabic 16#fba9
+/hehmedialarabic 16#feec
+/heiseierasquare 16#337b
+/hekatakana 16#30d8
+/hekatakanahalfwidth 16#ff8d
+/hekutaarusquare 16#3336
+/henghook 16#0267
+/herutusquare 16#3339
+/het 16#05d7
+/hethebrew 16#05d7
+/hhook 16#0266
+/hhooksuperior 16#02b1
+/hieuhacirclekorean 16#327b
+/hieuhaparenkorean 16#321b
+/hieuhcirclekorean 16#326d
+/hieuhkorean 16#314e
+/hieuhparenkorean 16#320d
+/hihiragana 16#3072
+/hikatakana 16#30d2
+/hikatakanahalfwidth 16#ff8b
+/hiriq 16#05b4
+/hiriq14 16#05b4
+/hiriq21 16#05b4
+/hiriq2d 16#05b4
+/hiriqhebrew 16#05b4
+/hiriqnarrowhebrew 16#05b4
+/hiriqquarterhebrew 16#05b4
+/hiriqwidehebrew 16#05b4
+/hlinebelow 16#1e96
+/hmonospace 16#ff48
+/hoarmenian 16#0570
+/hohipthai 16#0e2b
+/hohiragana 16#307b
+/hokatakana 16#30db
+/hokatakanahalfwidth 16#ff8e
+/holam 16#05b9
+/holam19 16#05b9
+/holam26 16#05b9
+/holam32 16#05b9
+/holamhebrew 16#05b9
+/holamnarrowhebrew 16#05b9
+/holamquarterhebrew 16#05b9
+/holamwidehebrew 16#05b9
+/honokhukthai 16#0e2e
+/hookabovecomb 16#0309
+/hookcmb 16#0309
+/hookpalatalizedbelowcmb 16#0321
+/hookretroflexbelowcmb 16#0322
+/hoonsquare 16#3342
+/horicoptic 16#03e9
+/horizontalbar 16#2015
+/horncmb 16#031b
+/hotsprings 16#2668
+/house 16#2302
+/hparen 16#24a3
+/hsuperior 16#02b0
+/hturned 16#0265
+/huhiragana 16#3075
+/huiitosquare 16#3333
+/hukatakana 16#30d5
+/hukatakanahalfwidth 16#ff8c
+/hungarumlaut 16#02dd
+/hungarumlautcmb 16#030b
+/hv 16#0195
+/hyphen 16#002d
+/hypheninferior 16#f6e5
+/hyphenmonospace 16#ff0d
+/hyphensmall 16#fe63
+/hyphensuperior 16#f6e6
+/hyphentwo 16#2010
+/i 16#0069
+/iacute 16#00ed
+/iacyrillic 16#044f
+/ibengali 16#0987
+/ibopomofo 16#3127
+/ibreve 16#012d
+/icaron 16#01d0
+/icircle 16#24d8
+/icircumflex 16#00ee
+/icyrillic 16#0456
+/idblgrave 16#0209
+/ideographearthcircle 16#328f
+/ideographfirecircle 16#328b
+/ideographicallianceparen 16#323f
+/ideographiccallparen 16#323a
+/ideographiccentrecircle 16#32a5
+/ideographicclose 16#3006
+/ideographiccomma 16#3001
+/ideographiccommaleft 16#ff64
+/ideographiccongratulationparen 16#3237
+/ideographiccorrectcircle 16#32a3
+/ideographicearthparen 16#322f
+/ideographicenterpriseparen 16#323d
+/ideographicexcellentcircle 16#329d
+/ideographicfestivalparen 16#3240
+/ideographicfinancialcircle 16#3296
+/ideographicfinancialparen 16#3236
+/ideographicfireparen 16#322b
+/ideographichaveparen 16#3232
+/ideographichighcircle 16#32a4
+/ideographiciterationmark 16#3005
+/ideographiclaborcircle 16#3298
+/ideographiclaborparen 16#3238
+/ideographicleftcircle 16#32a7
+/ideographiclowcircle 16#32a6
+/ideographicmedicinecircle 16#32a9
+/ideographicmetalparen 16#322e
+/ideographicmoonparen 16#322a
+/ideographicnameparen 16#3234
+/ideographicperiod 16#3002
+/ideographicprintcircle 16#329e
+/ideographicreachparen 16#3243
+/ideographicrepresentparen 16#3239
+/ideographicresourceparen 16#323e
+/ideographicrightcircle 16#32a8
+/ideographicsecretcircle 16#3299
+/ideographicselfparen 16#3242
+/ideographicsocietyparen 16#3233
+/ideographicspace 16#3000
+/ideographicspecialparen 16#3235
+/ideographicstockparen 16#3231
+/ideographicstudyparen 16#323b
+/ideographicsunparen 16#3230
+/ideographicsuperviseparen 16#323c
+/ideographicwaterparen 16#322c
+/ideographicwoodparen 16#322d
+/ideographiczero 16#3007
+/ideographmetalcircle 16#328e
+/ideographmooncircle 16#328a
+/ideographnamecircle 16#3294
+/ideographsuncircle 16#3290
+/ideographwatercircle 16#328c
+/ideographwoodcircle 16#328d
+/ideva 16#0907
+/idieresis 16#00ef
+/idieresisacute 16#1e2f
+/idieresiscyrillic 16#04e5
+/idotbelow 16#1ecb
+/iebrevecyrillic 16#04d7
+/iecyrillic 16#0435
+/ieungacirclekorean 16#3275
+/ieungaparenkorean 16#3215
+/ieungcirclekorean 16#3267
+/ieungkorean 16#3147
+/ieungparenkorean 16#3207
+/igrave 16#00ec
+/igujarati 16#0a87
+/igurmukhi 16#0a07
+/ihiragana 16#3044
+/ihookabove 16#1ec9
+/iibengali 16#0988
+/iicyrillic 16#0438
+/iideva 16#0908
+/iigujarati 16#0a88
+/iigurmukhi 16#0a08
+/iimatragurmukhi 16#0a40
+/iinvertedbreve 16#020b
+/iishortcyrillic 16#0439
+/iivowelsignbengali 16#09c0
+/iivowelsigndeva 16#0940
+/iivowelsigngujarati 16#0ac0
+/ij 16#0133
+/ikatakana 16#30a4
+/ikatakanahalfwidth 16#ff72
+/ikorean 16#3163
+/ilde 16#02dc
+/iluyhebrew 16#05ac
+/imacron 16#012b
+/imacroncyrillic 16#04e3
+/imageorapproximatelyequal 16#2253
+/imatragurmukhi 16#0a3f
+/imonospace 16#ff49
+/increment 16#2206
+/infinity 16#221e
+/iniarmenian 16#056b
+/integral 16#222b
+/integralbottom 16#2321
+/integralbt 16#2321
+/integralex 16#f8f5
+/integraltop 16#2320
+/integraltp 16#2320
+/intersection 16#2229
+/intisquare 16#3305
+/invbullet 16#25d8
+/invcircle 16#25d9
+/invsmileface 16#263b
+/iocyrillic 16#0451
+/iogonek 16#012f
+/iota 16#03b9
+/iotadieresis 16#03ca
+/iotadieresistonos 16#0390
+/iotalatin 16#0269
+/iotatonos 16#03af
+/iparen 16#24a4
+/irigurmukhi 16#0a72
+/ismallhiragana 16#3043
+/ismallkatakana 16#30a3
+/ismallkatakanahalfwidth 16#ff68
+/issharbengali 16#09fa
+/istroke 16#0268
+/isuperior 16#f6ed
+/iterationhiragana 16#309d
+/iterationkatakana 16#30fd
+/itilde 16#0129
+/itildebelow 16#1e2d
+/iubopomofo 16#3129
+/iucyrillic 16#044e
+/ivowelsignbengali 16#09bf
+/ivowelsigndeva 16#093f
+/ivowelsigngujarati 16#0abf
+/izhitsacyrillic 16#0475
+/izhitsadblgravecyrillic 16#0477
+/j 16#006a
+/jaarmenian 16#0571
+/jabengali 16#099c
+/jadeva 16#091c
+/jagujarati 16#0a9c
+/jagurmukhi 16#0a1c
+/jbopomofo 16#3110
+/jcaron 16#01f0
+/jcircle 16#24d9
+/jcircumflex 16#0135
+/jcrossedtail 16#029d
+/jdotlessstroke 16#025f
+/jecyrillic 16#0458
+/jeemarabic 16#062c
+/jeemfinalarabic 16#fe9e
+/jeeminitialarabic 16#fe9f
+/jeemmedialarabic 16#fea0
+/jeharabic 16#0698
+/jehfinalarabic 16#fb8b
+/jhabengali 16#099d
+/jhadeva 16#091d
+/jhagujarati 16#0a9d
+/jhagurmukhi 16#0a1d
+/jheharmenian 16#057b
+/jis 16#3004
+/jmonospace 16#ff4a
+/jparen 16#24a5
+/jsuperior 16#02b2
+/k 16#006b
+/kabashkircyrillic 16#04a1
+/kabengali 16#0995
+/kacute 16#1e31
+/kacyrillic 16#043a
+/kadescendercyrillic 16#049b
+/kadeva 16#0915
+/kaf 16#05db
+/kafarabic 16#0643
+/kafdagesh 16#fb3b
+/kafdageshhebrew 16#fb3b
+/kaffinalarabic 16#feda
+/kafhebrew 16#05db
+/kafinitialarabic 16#fedb
+/kafmedialarabic 16#fedc
+/kafrafehebrew 16#fb4d
+/kagujarati 16#0a95
+/kagurmukhi 16#0a15
+/kahiragana 16#304b
+/kahookcyrillic 16#04c4
+/kakatakana 16#30ab
+/kakatakanahalfwidth 16#ff76
+/kappa 16#03ba
+/kappasymbolgreek 16#03f0
+/kapyeounmieumkorean 16#3171
+/kapyeounphieuphkorean 16#3184
+/kapyeounpieupkorean 16#3178
+/kapyeounssangpieupkorean 16#3179
+/karoriisquare 16#330d
+/kashidaautoarabic 16#0640
+/kashidaautonosidebearingarabic 16#0640
+/kasmallkatakana 16#30f5
+/kasquare 16#3384
+/kasraarabic 16#0650
+/kasratanarabic 16#064d
+/kastrokecyrillic 16#049f
+/katahiraprolongmarkhalfwidth 16#ff70
+/kaverticalstrokecyrillic 16#049d
+/kbopomofo 16#310e
+/kcalsquare 16#3389
+/kcaron 16#01e9
+/kcedilla 16#0137
+/kcircle 16#24da
+/kcommaaccent 16#0137
+/kdotbelow 16#1e33
+/keharmenian 16#0584
+/kehiragana 16#3051
+/kekatakana 16#30b1
+/kekatakanahalfwidth 16#ff79
+/kenarmenian 16#056f
+/kesmallkatakana 16#30f6
+/kgreenlandic 16#0138
+/khabengali 16#0996
+/khacyrillic 16#0445
+/khadeva 16#0916
+/khagujarati 16#0a96
+/khagurmukhi 16#0a16
+/khaharabic 16#062e
+/khahfinalarabic 16#fea6
+/khahinitialarabic 16#fea7
+/khahmedialarabic 16#fea8
+/kheicoptic 16#03e7
+/khhadeva 16#0959
+/khhagurmukhi 16#0a59
+/khieukhacirclekorean 16#3278
+/khieukhaparenkorean 16#3218
+/khieukhcirclekorean 16#326a
+/khieukhkorean 16#314b
+/khieukhparenkorean 16#320a
+/khokhaithai 16#0e02
+/khokhonthai 16#0e05
+/khokhuatthai 16#0e03
+/khokhwaithai 16#0e04
+/khomutthai 16#0e5b
+/khook 16#0199
+/khorakhangthai 16#0e06
+/khzsquare 16#3391
+/kihiragana 16#304d
+/kikatakana 16#30ad
+/kikatakanahalfwidth 16#ff77
+/kiroguramusquare 16#3315
+/kiromeetorusquare 16#3316
+/kirosquare 16#3314
+/kiyeokacirclekorean 16#326e
+/kiyeokaparenkorean 16#320e
+/kiyeokcirclekorean 16#3260
+/kiyeokkorean 16#3131
+/kiyeokparenkorean 16#3200
+/kiyeoksioskorean 16#3133
+/kjecyrillic 16#045c
+/klinebelow 16#1e35
+/klsquare 16#3398
+/kmcubedsquare 16#33a6
+/kmonospace 16#ff4b
+/kmsquaredsquare 16#33a2
+/kohiragana 16#3053
+/kohmsquare 16#33c0
+/kokaithai 16#0e01
+/kokatakana 16#30b3
+/kokatakanahalfwidth 16#ff7a
+/kooposquare 16#331e
+/koppacyrillic 16#0481
+/koreanstandardsymbol 16#327f
+/koroniscmb 16#0343
+/kparen 16#24a6
+/kpasquare 16#33aa
+/ksicyrillic 16#046f
+/ktsquare 16#33cf
+/kturned 16#029e
+/kuhiragana 16#304f
+/kukatakana 16#30af
+/kukatakanahalfwidth 16#ff78
+/kvsquare 16#33b8
+/kwsquare 16#33be
+/l 16#006c
+/labengali 16#09b2
+/lacute 16#013a
+/ladeva 16#0932
+/lagujarati 16#0ab2
+/lagurmukhi 16#0a32
+/lakkhangyaothai 16#0e45
+/lamaleffinalarabic 16#fefc
+/lamalefhamzaabovefinalarabic 16#fef8
+/lamalefhamzaaboveisolatedarabic 16#fef7
+/lamalefhamzabelowfinalarabic 16#fefa
+/lamalefhamzabelowisolatedarabic 16#fef9
+/lamalefisolatedarabic 16#fefb
+/lamalefmaddaabovefinalarabic 16#fef6
+/lamalefmaddaaboveisolatedarabic 16#fef5
+/lamarabic 16#0644
+/lambda 16#03bb
+/lambdastroke 16#019b
+/lamed 16#05dc
+/lameddagesh 16#fb3c
+/lameddageshhebrew 16#fb3c
+/lamedhebrew 16#05dc
+/lamfinalarabic 16#fede
+/lamhahinitialarabic 16#fcca
+/laminitialarabic 16#fedf
+/lamjeeminitialarabic 16#fcc9
+/lamkhahinitialarabic 16#fccb
+/lamlamhehisolatedarabic 16#fdf2
+/lammedialarabic 16#fee0
+/lammeemhahinitialarabic 16#fd88
+/lammeeminitialarabic 16#fccc
+/largecircle 16#25ef
+/lbar 16#019a
+/lbelt 16#026c
+/lbopomofo 16#310c
+/lcaron 16#013e
+/lcedilla 16#013c
+/lcircle 16#24db
+/lcircumflexbelow 16#1e3d
+/lcommaaccent 16#013c
+/ldot 16#0140
+/ldotaccent 16#0140
+/ldotbelow 16#1e37
+/ldotbelowmacron 16#1e39
+/leftangleabovecmb 16#031a
+/lefttackbelowcmb 16#0318
+/less 16#003c
+/lessequal 16#2264
+/lessequalorgreater 16#22da
+/lessmonospace 16#ff1c
+/lessorequivalent 16#2272
+/lessorgreater 16#2276
+/lessoverequal 16#2266
+/lesssmall 16#fe64
+/lezh 16#026e
+/lfblock 16#258c
+/lhookretroflex 16#026d
+/lira 16#20a4
+/liwnarmenian 16#056c
+/lj 16#01c9
+/ljecyrillic 16#0459
+/ll 16#f6c0
+/lladeva 16#0933
+/llagujarati 16#0ab3
+/llinebelow 16#1e3b
+/llladeva 16#0934
+/llvocalicbengali 16#09e1
+/llvocalicdeva 16#0961
+/llvocalicvowelsignbengali 16#09e3
+/llvocalicvowelsigndeva 16#0963
+/lmiddletilde 16#026b
+/lmonospace 16#ff4c
+/lmsquare 16#33d0
+/lochulathai 16#0e2c
+/logicaland 16#2227
+/logicalnot 16#00ac
+/logicalnotreversed 16#2310
+/logicalor 16#2228
+/lolingthai 16#0e25
+/longs 16#017f
+/lowlinecenterline 16#fe4e
+/lowlinecmb 16#0332
+/lowlinedashed 16#fe4d
+/lozenge 16#25ca
+/lparen 16#24a7
+/lslash 16#0142
+/lsquare 16#2113
+/lsuperior 16#f6ee
+/ltshade 16#2591
+/luthai 16#0e26
+/lvocalicbengali 16#098c
+/lvocalicdeva 16#090c
+/lvocalicvowelsignbengali 16#09e2
+/lvocalicvowelsigndeva 16#0962
+/lxsquare 16#33d3
+/m 16#006d
+/mabengali 16#09ae
+/macron 16#00af
+/macronbelowcmb 16#0331
+/macroncmb 16#0304
+/macronlowmod 16#02cd
+/macronmonospace 16#ffe3
+/macute 16#1e3f
+/madeva 16#092e
+/magujarati 16#0aae
+/magurmukhi 16#0a2e
+/mahapakhhebrew 16#05a4
+/mahapakhlefthebrew 16#05a4
+/mahiragana 16#307e
+/maichattawalowleftthai 16#f895
+/maichattawalowrightthai 16#f894
+/maichattawathai 16#0e4b
+/maichattawaupperleftthai 16#f893
+/maieklowleftthai 16#f88c
+/maieklowrightthai 16#f88b
+/maiekthai 16#0e48
+/maiekupperleftthai 16#f88a
+/maihanakatleftthai 16#f884
+/maihanakatthai 16#0e31
+/maitaikhuleftthai 16#f889
+/maitaikhuthai 16#0e47
+/maitholowleftthai 16#f88f
+/maitholowrightthai 16#f88e
+/maithothai 16#0e49
+/maithoupperleftthai 16#f88d
+/maitrilowleftthai 16#f892
+/maitrilowrightthai 16#f891
+/maitrithai 16#0e4a
+/maitriupperleftthai 16#f890
+/maiyamokthai 16#0e46
+/makatakana 16#30de
+/makatakanahalfwidth 16#ff8f
+/male 16#2642
+/mansyonsquare 16#3347
+/maqafhebrew 16#05be
+/mars 16#2642
+/masoracirclehebrew 16#05af
+/masquare 16#3383
+/mbopomofo 16#3107
+/mbsquare 16#33d4
+/mcircle 16#24dc
+/mcubedsquare 16#33a5
+/mdotaccent 16#1e41
+/mdotbelow 16#1e43
+/meemarabic 16#0645
+/meemfinalarabic 16#fee2
+/meeminitialarabic 16#fee3
+/meemmedialarabic 16#fee4
+/meemmeeminitialarabic 16#fcd1
+/meemmeemisolatedarabic 16#fc48
+/meetorusquare 16#334d
+/mehiragana 16#3081
+/meizierasquare 16#337e
+/mekatakana 16#30e1
+/mekatakanahalfwidth 16#ff92
+/mem 16#05de
+/memdagesh 16#fb3e
+/memdageshhebrew 16#fb3e
+/memhebrew 16#05de
+/menarmenian 16#0574
+/merkhahebrew 16#05a5
+/merkhakefulahebrew 16#05a6
+/merkhakefulalefthebrew 16#05a6
+/merkhalefthebrew 16#05a5
+/mhook 16#0271
+/mhzsquare 16#3392
+/middledotkatakanahalfwidth 16#ff65
+/middot 16#00b7
+/mieumacirclekorean 16#3272
+/mieumaparenkorean 16#3212
+/mieumcirclekorean 16#3264
+/mieumkorean 16#3141
+/mieumpansioskorean 16#3170
+/mieumparenkorean 16#3204
+/mieumpieupkorean 16#316e
+/mieumsioskorean 16#316f
+/mihiragana 16#307f
+/mikatakana 16#30df
+/mikatakanahalfwidth 16#ff90
+/minus 16#2212
+/minusbelowcmb 16#0320
+/minuscircle 16#2296
+/minusmod 16#02d7
+/minusplus 16#2213
+/minute 16#2032
+/miribaarusquare 16#334a
+/mirisquare 16#3349
+/mlonglegturned 16#0270
+/mlsquare 16#3396
+/mmcubedsquare 16#33a3
+/mmonospace 16#ff4d
+/mmsquaredsquare 16#339f
+/mohiragana 16#3082
+/mohmsquare 16#33c1
+/mokatakana 16#30e2
+/mokatakanahalfwidth 16#ff93
+/molsquare 16#33d6
+/momathai 16#0e21
+/moverssquare 16#33a7
+/moverssquaredsquare 16#33a8
+/mparen 16#24a8
+/mpasquare 16#33ab
+/mssquare 16#33b3
+/msuperior 16#f6ef
+/mturned 16#026f
+/mu 16#00b5
+/mu1 16#00b5
+/muasquare 16#3382
+/muchgreater 16#226b
+/muchless 16#226a
+/mufsquare 16#338c
+/mugreek 16#03bc
+/mugsquare 16#338d
+/muhiragana 16#3080
+/mukatakana 16#30e0
+/mukatakanahalfwidth 16#ff91
+/mulsquare 16#3395
+/multiply 16#00d7
+/mumsquare 16#339b
+/munahhebrew 16#05a3
+/munahlefthebrew 16#05a3
+/musicalnote 16#266a
+/musicalnotedbl 16#266b
+/musicflatsign 16#266d
+/musicsharpsign 16#266f
+/mussquare 16#33b2
+/muvsquare 16#33b6
+/muwsquare 16#33bc
+/mvmegasquare 16#33b9
+/mvsquare 16#33b7
+/mwmegasquare 16#33bf
+/mwsquare 16#33bd
+/n 16#006e
+/nabengali 16#09a8
+/nabla 16#2207
+/nacute 16#0144
+/nadeva 16#0928
+/nagujarati 16#0aa8
+/nagurmukhi 16#0a28
+/nahiragana 16#306a
+/nakatakana 16#30ca
+/nakatakanahalfwidth 16#ff85
+/napostrophe 16#0149
+/nasquare 16#3381
+/nbopomofo 16#310b
+/nbspace 16#00a0
+/ncaron 16#0148
+/ncedilla 16#0146
+/ncircle 16#24dd
+/ncircumflexbelow 16#1e4b
+/ncommaaccent 16#0146
+/ndotaccent 16#1e45
+/ndotbelow 16#1e47
+/nehiragana 16#306d
+/nekatakana 16#30cd
+/nekatakanahalfwidth 16#ff88
+/newsheqelsign 16#20aa
+/nfsquare 16#338b
+/ngabengali 16#0999
+/ngadeva 16#0919
+/ngagujarati 16#0a99
+/ngagurmukhi 16#0a19
+/ngonguthai 16#0e07
+/nhiragana 16#3093
+/nhookleft 16#0272
+/nhookretroflex 16#0273
+/nieunacirclekorean 16#326f
+/nieunaparenkorean 16#320f
+/nieuncieuckorean 16#3135
+/nieuncirclekorean 16#3261
+/nieunhieuhkorean 16#3136
+/nieunkorean 16#3134
+/nieunpansioskorean 16#3168
+/nieunparenkorean 16#3201
+/nieunsioskorean 16#3167
+/nieuntikeutkorean 16#3166
+/nihiragana 16#306b
+/nikatakana 16#30cb
+/nikatakanahalfwidth 16#ff86
+/nikhahitleftthai 16#f899
+/nikhahitthai 16#0e4d
+/nine 16#0039
+/ninearabic 16#0669
+/ninebengali 16#09ef
+/ninecircle 16#2468
+/ninecircleinversesansserif 16#2792
+/ninedeva 16#096f
+/ninegujarati 16#0aef
+/ninegurmukhi 16#0a6f
+/ninehackarabic 16#0669
+/ninehangzhou 16#3029
+/nineideographicparen 16#3228
+/nineinferior 16#2089
+/ninemonospace 16#ff19
+/nineoldstyle 16#f739
+/nineparen 16#247c
+/nineperiod 16#2490
+/ninepersian 16#06f9
+/nineroman 16#2178
+/ninesuperior 16#2079
+/nineteencircle 16#2472
+/nineteenparen 16#2486
+/nineteenperiod 16#249a
+/ninethai 16#0e59
+/nj 16#01cc
+/njecyrillic 16#045a
+/nkatakana 16#30f3
+/nkatakanahalfwidth 16#ff9d
+/nlegrightlong 16#019e
+/nlinebelow 16#1e49
+/nmonospace 16#ff4e
+/nmsquare 16#339a
+/nnabengali 16#09a3
+/nnadeva 16#0923
+/nnagujarati 16#0aa3
+/nnagurmukhi 16#0a23
+/nnnadeva 16#0929
+/nohiragana 16#306e
+/nokatakana 16#30ce
+/nokatakanahalfwidth 16#ff89
+/nonbreakingspace 16#00a0
+/nonenthai 16#0e13
+/nonuthai 16#0e19
+/noonarabic 16#0646
+/noonfinalarabic 16#fee6
+/noonghunnaarabic 16#06ba
+/noonghunnafinalarabic 16#fb9f
+/nooninitialarabic 16#fee7
+/noonjeeminitialarabic 16#fcd2
+/noonjeemisolatedarabic 16#fc4b
+/noonmedialarabic 16#fee8
+/noonmeeminitialarabic 16#fcd5
+/noonmeemisolatedarabic 16#fc4e
+/noonnoonfinalarabic 16#fc8d
+/notcontains 16#220c
+/notelement 16#2209
+/notelementof 16#2209
+/notequal 16#2260
+/notgreater 16#226f
+/notgreaternorequal 16#2271
+/notgreaternorless 16#2279
+/notidentical 16#2262
+/notless 16#226e
+/notlessnorequal 16#2270
+/notparallel 16#2226
+/notprecedes 16#2280
+/notsubset 16#2284
+/notsucceeds 16#2281
+/notsuperset 16#2285
+/nowarmenian 16#0576
+/nparen 16#24a9
+/nssquare 16#33b1
+/nsuperior 16#207f
+/ntilde 16#00f1
+/nu 16#03bd
+/nuhiragana 16#306c
+/nukatakana 16#30cc
+/nukatakanahalfwidth 16#ff87
+/nuktabengali 16#09bc
+/nuktadeva 16#093c
+/nuktagujarati 16#0abc
+/nuktagurmukhi 16#0a3c
+/numbersign 16#0023
+/numbersignmonospace 16#ff03
+/numbersignsmall 16#fe5f
+/numeralsigngreek 16#0374
+/numeralsignlowergreek 16#0375
+/numero 16#2116
+/nun 16#05e0
+/nundagesh 16#fb40
+/nundageshhebrew 16#fb40
+/nunhebrew 16#05e0
+/nvsquare 16#33b5
+/nwsquare 16#33bb
+/nyabengali 16#099e
+/nyadeva 16#091e
+/nyagujarati 16#0a9e
+/nyagurmukhi 16#0a1e
+/o 16#006f
+/oacute 16#00f3
+/oangthai 16#0e2d
+/obarred 16#0275
+/obarredcyrillic 16#04e9
+/obarreddieresiscyrillic 16#04eb
+/obengali 16#0993
+/obopomofo 16#311b
+/obreve 16#014f
+/ocandradeva 16#0911
+/ocandragujarati 16#0a91
+/ocandravowelsigndeva 16#0949
+/ocandravowelsigngujarati 16#0ac9
+/ocaron 16#01d2
+/ocircle 16#24de
+/ocircumflex 16#00f4
+/ocircumflexacute 16#1ed1
+/ocircumflexdotbelow 16#1ed9
+/ocircumflexgrave 16#1ed3
+/ocircumflexhookabove 16#1ed5
+/ocircumflextilde 16#1ed7
+/ocyrillic 16#043e
+/odblacute 16#0151
+/odblgrave 16#020d
+/odeva 16#0913
+/odieresis 16#00f6
+/odieresiscyrillic 16#04e7
+/odotbelow 16#1ecd
+/oe 16#0153
+/oekorean 16#315a
+/ogonek 16#02db
+/ogonekcmb 16#0328
+/ograve 16#00f2
+/ogujarati 16#0a93
+/oharmenian 16#0585
+/ohiragana 16#304a
+/ohookabove 16#1ecf
+/ohorn 16#01a1
+/ohornacute 16#1edb
+/ohorndotbelow 16#1ee3
+/ohorngrave 16#1edd
+/ohornhookabove 16#1edf
+/ohorntilde 16#1ee1
+/ohungarumlaut 16#0151
+/oi 16#01a3
+/oinvertedbreve 16#020f
+/okatakana 16#30aa
+/okatakanahalfwidth 16#ff75
+/okorean 16#3157
+/olehebrew 16#05ab
+/omacron 16#014d
+/omacronacute 16#1e53
+/omacrongrave 16#1e51
+/omdeva 16#0950
+/omega 16#03c9
+/omega1 16#03d6
+/omegacyrillic 16#0461
+/omegalatinclosed 16#0277
+/omegaroundcyrillic 16#047b
+/omegatitlocyrillic 16#047d
+/omegatonos 16#03ce
+/omgujarati 16#0ad0
+/omicron 16#03bf
+/omicrontonos 16#03cc
+/omonospace 16#ff4f
+/one 16#0031
+/onearabic 16#0661
+/onebengali 16#09e7
+/onecircle 16#2460
+/onecircleinversesansserif 16#278a
+/onedeva 16#0967
+/onedotenleader 16#2024
+/oneeighth 16#215b
+/onefitted 16#f6dc
+/onegujarati 16#0ae7
+/onegurmukhi 16#0a67
+/onehackarabic 16#0661
+/onehalf 16#00bd
+/onehangzhou 16#3021
+/oneideographicparen 16#3220
+/oneinferior 16#2081
+/onemonospace 16#ff11
+/onenumeratorbengali 16#09f4
+/oneoldstyle 16#f731
+/oneparen 16#2474
+/oneperiod 16#2488
+/onepersian 16#06f1
+/onequarter 16#00bc
+/oneroman 16#2170
+/onesuperior 16#00b9
+/onethai 16#0e51
+/onethird 16#2153
+/oogonek 16#01eb
+/oogonekmacron 16#01ed
+/oogurmukhi 16#0a13
+/oomatragurmukhi 16#0a4b
+/oopen 16#0254
+/oparen 16#24aa
+/openbullet 16#25e6
+/option 16#2325
+/ordfeminine 16#00aa
+/ordmasculine 16#00ba
+/orthogonal 16#221f
+/oshortdeva 16#0912
+/oshortvowelsigndeva 16#094a
+/oslash 16#00f8
+/oslashacute 16#01ff
+/osmallhiragana 16#3049
+/osmallkatakana 16#30a9
+/osmallkatakanahalfwidth 16#ff6b
+/ostrokeacute 16#01ff
+/osuperior 16#f6f0
+/otcyrillic 16#047f
+/otilde 16#00f5
+/otildeacute 16#1e4d
+/otildedieresis 16#1e4f
+/oubopomofo 16#3121
+/overline 16#203e
+/overlinecenterline 16#fe4a
+/overlinecmb 16#0305
+/overlinedashed 16#fe49
+/overlinedblwavy 16#fe4c
+/overlinewavy 16#fe4b
+/overscore 16#00af
+/ovowelsignbengali 16#09cb
+/ovowelsigndeva 16#094b
+/ovowelsigngujarati 16#0acb
+/p 16#0070
+/paampssquare 16#3380
+/paasentosquare 16#332b
+/pabengali 16#09aa
+/pacute 16#1e55
+/padeva 16#092a
+/pagedown 16#21df
+/pageup 16#21de
+/pagujarati 16#0aaa
+/pagurmukhi 16#0a2a
+/pahiragana 16#3071
+/paiyannoithai 16#0e2f
+/pakatakana 16#30d1
+/palatalizationcyrilliccmb 16#0484
+/palochkacyrillic 16#04c0
+/pansioskorean 16#317f
+/paragraph 16#00b6
+/parallel 16#2225
+/parenleft 16#0028
+/parenleftaltonearabic 16#fd3e
+/parenleftbt 16#f8ed
+/parenleftex 16#f8ec
+/parenleftinferior 16#208d
+/parenleftmonospace 16#ff08
+/parenleftsmall 16#fe59
+/parenleftsuperior 16#207d
+/parenlefttp 16#f8eb
+/parenleftvertical 16#fe35
+/parenright 16#0029
+/parenrightaltonearabic 16#fd3f
+/parenrightbt 16#f8f8
+/parenrightex 16#f8f7
+/parenrightinferior 16#208e
+/parenrightmonospace 16#ff09
+/parenrightsmall 16#fe5a
+/parenrightsuperior 16#207e
+/parenrighttp 16#f8f6
+/parenrightvertical 16#fe36
+/partialdiff 16#2202
+/paseqhebrew 16#05c0
+/pashtahebrew 16#0599
+/pasquare 16#33a9
+/patah 16#05b7
+/patah11 16#05b7
+/patah1d 16#05b7
+/patah2a 16#05b7
+/patahhebrew 16#05b7
+/patahnarrowhebrew 16#05b7
+/patahquarterhebrew 16#05b7
+/patahwidehebrew 16#05b7
+/pazerhebrew 16#05a1
+/pbopomofo 16#3106
+/pcircle 16#24df
+/pdotaccent 16#1e57
+/pe 16#05e4
+/pecyrillic 16#043f
+/pedagesh 16#fb44
+/pedageshhebrew 16#fb44
+/peezisquare 16#333b
+/pefinaldageshhebrew 16#fb43
+/peharabic 16#067e
+/peharmenian 16#057a
+/pehebrew 16#05e4
+/pehfinalarabic 16#fb57
+/pehinitialarabic 16#fb58
+/pehiragana 16#307a
+/pehmedialarabic 16#fb59
+/pekatakana 16#30da
+/pemiddlehookcyrillic 16#04a7
+/perafehebrew 16#fb4e
+/percent 16#0025
+/percentarabic 16#066a
+/percentmonospace 16#ff05
+/percentsmall 16#fe6a
+/period 16#002e
+/periodarmenian 16#0589
+/periodcentered 16#00b7
+/periodhalfwidth 16#ff61
+/periodinferior 16#f6e7
+/periodmonospace 16#ff0e
+/periodsmall 16#fe52
+/periodsuperior 16#f6e8
+/perispomenigreekcmb 16#0342
+/perpendicular 16#22a5
+/perthousand 16#2030
+/peseta 16#20a7
+/pfsquare 16#338a
+/phabengali 16#09ab
+/phadeva 16#092b
+/phagujarati 16#0aab
+/phagurmukhi 16#0a2b
+/phi 16#03c6
+/phi1 16#03d5
+/phieuphacirclekorean 16#327a
+/phieuphaparenkorean 16#321a
+/phieuphcirclekorean 16#326c
+/phieuphkorean 16#314d
+/phieuphparenkorean 16#320c
+/philatin 16#0278
+/phinthuthai 16#0e3a
+/phisymbolgreek 16#03d5
+/phook 16#01a5
+/phophanthai 16#0e1e
+/phophungthai 16#0e1c
+/phosamphaothai 16#0e20
+/pi 16#03c0
+/pieupacirclekorean 16#3273
+/pieupaparenkorean 16#3213
+/pieupcieuckorean 16#3176
+/pieupcirclekorean 16#3265
+/pieupkiyeokkorean 16#3172
+/pieupkorean 16#3142
+/pieupparenkorean 16#3205
+/pieupsioskiyeokkorean 16#3174
+/pieupsioskorean 16#3144
+/pieupsiostikeutkorean 16#3175
+/pieupthieuthkorean 16#3177
+/pieuptikeutkorean 16#3173
+/pihiragana 16#3074
+/pikatakana 16#30d4
+/pisymbolgreek 16#03d6
+/piwrarmenian 16#0583
+/plus 16#002b
+/plusbelowcmb 16#031f
+/pluscircle 16#2295
+/plusminus 16#00b1
+/plusmod 16#02d6
+/plusmonospace 16#ff0b
+/plussmall 16#fe62
+/plussuperior 16#207a
+/pmonospace 16#ff50
+/pmsquare 16#33d8
+/pohiragana 16#307d
+/pointingindexdownwhite 16#261f
+/pointingindexleftwhite 16#261c
+/pointingindexrightwhite 16#261e
+/pointingindexupwhite 16#261d
+/pokatakana 16#30dd
+/poplathai 16#0e1b
+/postalmark 16#3012
+/postalmarkface 16#3020
+/pparen 16#24ab
+/precedes 16#227a
+/prescription 16#211e
+/primemod 16#02b9
+/primereversed 16#2035
+/product 16#220f
+/projective 16#2305
+/prolongedkana 16#30fc
+/propellor 16#2318
+/propersubset 16#2282
+/propersuperset 16#2283
+/proportion 16#2237
+/proportional 16#221d
+/psi 16#03c8
+/psicyrillic 16#0471
+/psilipneumatacyrilliccmb 16#0486
+/pssquare 16#33b0
+/puhiragana 16#3077
+/pukatakana 16#30d7
+/pvsquare 16#33b4
+/pwsquare 16#33ba
+/q 16#0071
+/qadeva 16#0958
+/qadmahebrew 16#05a8
+/qafarabic 16#0642
+/qaffinalarabic 16#fed6
+/qafinitialarabic 16#fed7
+/qafmedialarabic 16#fed8
+/qamats 16#05b8
+/qamats10 16#05b8
+/qamats1a 16#05b8
+/qamats1c 16#05b8
+/qamats27 16#05b8
+/qamats29 16#05b8
+/qamats33 16#05b8
+/qamatsde 16#05b8
+/qamatshebrew 16#05b8
+/qamatsnarrowhebrew 16#05b8
+/qamatsqatanhebrew 16#05b8
+/qamatsqatannarrowhebrew 16#05b8
+/qamatsqatanquarterhebrew 16#05b8
+/qamatsqatanwidehebrew 16#05b8
+/qamatsquarterhebrew 16#05b8
+/qamatswidehebrew 16#05b8
+/qarneyparahebrew 16#059f
+/qbopomofo 16#3111
+/qcircle 16#24e0
+/qhook 16#02a0
+/qmonospace 16#ff51
+/qof 16#05e7
+/qofdagesh 16#fb47
+/qofdageshhebrew 16#fb47
+/qofhebrew 16#05e7
+/qparen 16#24ac
+/quarternote 16#2669
+/qubuts 16#05bb
+/qubuts18 16#05bb
+/qubuts25 16#05bb
+/qubuts31 16#05bb
+/qubutshebrew 16#05bb
+/qubutsnarrowhebrew 16#05bb
+/qubutsquarterhebrew 16#05bb
+/qubutswidehebrew 16#05bb
+/question 16#003f
+/questionarabic 16#061f
+/questionarmenian 16#055e
+/questiondown 16#00bf
+/questiondownsmall 16#f7bf
+/questiongreek 16#037e
+/questionmonospace 16#ff1f
+/questionsmall 16#f73f
+/quotedbl 16#0022
+/quotedblbase 16#201e
+/quotedblleft 16#201c
+/quotedblmonospace 16#ff02
+/quotedblprime 16#301e
+/quotedblprimereversed 16#301d
+/quotedblright 16#201d
+/quoteleft 16#2018
+/quoteleftreversed 16#201b
+/quotereversed 16#201b
+/quoteright 16#2019
+/quoterightn 16#0149
+/quotesinglbase 16#201a
+/quotesingle 16#0027
+/quotesinglemonospace 16#ff07
+/r 16#0072
+/raarmenian 16#057c
+/rabengali 16#09b0
+/racute 16#0155
+/radeva 16#0930
+/radical 16#221a
+/radicalex 16#f8e5
+/radoverssquare 16#33ae
+/radoverssquaredsquare 16#33af
+/radsquare 16#33ad
+/rafe 16#05bf
+/rafehebrew 16#05bf
+/ragujarati 16#0ab0
+/ragurmukhi 16#0a30
+/rahiragana 16#3089
+/rakatakana 16#30e9
+/rakatakanahalfwidth 16#ff97
+/ralowerdiagonalbengali 16#09f1
+/ramiddlediagonalbengali 16#09f0
+/ramshorn 16#0264
+/ratio 16#2236
+/rbopomofo 16#3116
+/rcaron 16#0159
+/rcedilla 16#0157
+/rcircle 16#24e1
+/rcommaaccent 16#0157
+/rdblgrave 16#0211
+/rdotaccent 16#1e59
+/rdotbelow 16#1e5b
+/rdotbelowmacron 16#1e5d
+/referencemark 16#203b
+/reflexsubset 16#2286
+/reflexsuperset 16#2287
+/registered 16#00ae
+/registersans 16#f8e8
+/registerserif 16#f6da
+/reharabic 16#0631
+/reharmenian 16#0580
+/rehfinalarabic 16#feae
+/rehiragana 16#308c
+/rekatakana 16#30ec
+/rekatakanahalfwidth 16#ff9a
+/resh 16#05e8
+/reshdageshhebrew 16#fb48
+/reshhebrew 16#05e8
+/reversedtilde 16#223d
+/reviahebrew 16#0597
+/reviamugrashhebrew 16#0597
+/revlogicalnot 16#2310
+/rfishhook 16#027e
+/rfishhookreversed 16#027f
+/rhabengali 16#09dd
+/rhadeva 16#095d
+/rho 16#03c1
+/rhook 16#027d
+/rhookturned 16#027b
+/rhookturnedsuperior 16#02b5
+/rhosymbolgreek 16#03f1
+/rhotichookmod 16#02de
+/rieulacirclekorean 16#3271
+/rieulaparenkorean 16#3211
+/rieulcirclekorean 16#3263
+/rieulhieuhkorean 16#3140
+/rieulkiyeokkorean 16#313a
+/rieulkiyeoksioskorean 16#3169
+/rieulkorean 16#3139
+/rieulmieumkorean 16#313b
+/rieulpansioskorean 16#316c
+/rieulparenkorean 16#3203
+/rieulphieuphkorean 16#313f
+/rieulpieupkorean 16#313c
+/rieulpieupsioskorean 16#316b
+/rieulsioskorean 16#313d
+/rieulthieuthkorean 16#313e
+/rieultikeutkorean 16#316a
+/rieulyeorinhieuhkorean 16#316d
+/rightangle 16#221f
+/righttackbelowcmb 16#0319
+/righttriangle 16#22bf
+/rihiragana 16#308a
+/rikatakana 16#30ea
+/rikatakanahalfwidth 16#ff98
+/ring 16#02da
+/ringbelowcmb 16#0325
+/ringcmb 16#030a
+/ringhalfleft 16#02bf
+/ringhalfleftarmenian 16#0559
+/ringhalfleftbelowcmb 16#031c
+/ringhalfleftcentered 16#02d3
+/ringhalfright 16#02be
+/ringhalfrightbelowcmb 16#0339
+/ringhalfrightcentered 16#02d2
+/rinvertedbreve 16#0213
+/rittorusquare 16#3351
+/rlinebelow 16#1e5f
+/rlongleg 16#027c
+/rlonglegturned 16#027a
+/rmonospace 16#ff52
+/rohiragana 16#308d
+/rokatakana 16#30ed
+/rokatakanahalfwidth 16#ff9b
+/roruathai 16#0e23
+/rparen 16#24ad
+/rrabengali 16#09dc
+/rradeva 16#0931
+/rragurmukhi 16#0a5c
+/rreharabic 16#0691
+/rrehfinalarabic 16#fb8d
+/rrvocalicbengali 16#09e0
+/rrvocalicdeva 16#0960
+/rrvocalicgujarati 16#0ae0
+/rrvocalicvowelsignbengali 16#09c4
+/rrvocalicvowelsigndeva 16#0944
+/rrvocalicvowelsigngujarati 16#0ac4
+/rsuperior 16#f6f1
+/rtblock 16#2590
+/rturned 16#0279
+/rturnedsuperior 16#02b4
+/ruhiragana 16#308b
+/rukatakana 16#30eb
+/rukatakanahalfwidth 16#ff99
+/rupeemarkbengali 16#09f2
+/rupeesignbengali 16#09f3
+/rupiah 16#f6dd
+/ruthai 16#0e24
+/rvocalicbengali 16#098b
+/rvocalicdeva 16#090b
+/rvocalicgujarati 16#0a8b
+/rvocalicvowelsignbengali 16#09c3
+/rvocalicvowelsigndeva 16#0943
+/rvocalicvowelsigngujarati 16#0ac3
+/s 16#0073
+/sabengali 16#09b8
+/sacute 16#015b
+/sacutedotaccent 16#1e65
+/sadarabic 16#0635
+/sadeva 16#0938
+/sadfinalarabic 16#feba
+/sadinitialarabic 16#febb
+/sadmedialarabic 16#febc
+/sagujarati 16#0ab8
+/sagurmukhi 16#0a38
+/sahiragana 16#3055
+/sakatakana 16#30b5
+/sakatakanahalfwidth 16#ff7b
+/sallallahoualayhewasallamarabic 16#fdfa
+/samekh 16#05e1
+/samekhdagesh 16#fb41
+/samekhdageshhebrew 16#fb41
+/samekhhebrew 16#05e1
+/saraaathai 16#0e32
+/saraaethai 16#0e41
+/saraaimaimalaithai 16#0e44
+/saraaimaimuanthai 16#0e43
+/saraamthai 16#0e33
+/saraathai 16#0e30
+/saraethai 16#0e40
+/saraiileftthai 16#f886
+/saraiithai 16#0e35
+/saraileftthai 16#f885
+/saraithai 16#0e34
+/saraothai 16#0e42
+/saraueeleftthai 16#f888
+/saraueethai 16#0e37
+/saraueleftthai 16#f887
+/sarauethai 16#0e36
+/sarauthai 16#0e38
+/sarauuthai 16#0e39
+/sbopomofo 16#3119
+/scaron 16#0161
+/scarondotaccent 16#1e67
+/scedilla 16#015f
+/schwa 16#0259
+/schwacyrillic 16#04d9
+/schwadieresiscyrillic 16#04db
+/schwahook 16#025a
+/scircle 16#24e2
+/scircumflex 16#015d
+/scommaaccent 16#0219
+/sdotaccent 16#1e61
+/sdotbelow 16#1e63
+/sdotbelowdotaccent 16#1e69
+/seagullbelowcmb 16#033c
+/second 16#2033
+/secondtonechinese 16#02ca
+/section 16#00a7
+/seenarabic 16#0633
+/seenfinalarabic 16#feb2
+/seeninitialarabic 16#feb3
+/seenmedialarabic 16#feb4
+/segol 16#05b6
+/segol13 16#05b6
+/segol1f 16#05b6
+/segol2c 16#05b6
+/segolhebrew 16#05b6
+/segolnarrowhebrew 16#05b6
+/segolquarterhebrew 16#05b6
+/segoltahebrew 16#0592
+/segolwidehebrew 16#05b6
+/seharmenian 16#057d
+/sehiragana 16#305b
+/sekatakana 16#30bb
+/sekatakanahalfwidth 16#ff7e
+/semicolon 16#003b
+/semicolonarabic 16#061b
+/semicolonmonospace 16#ff1b
+/semicolonsmall 16#fe54
+/semivoicedmarkkana 16#309c
+/semivoicedmarkkanahalfwidth 16#ff9f
+/sentisquare 16#3322
+/sentosquare 16#3323
+/seven 16#0037
+/sevenarabic 16#0667
+/sevenbengali 16#09ed
+/sevencircle 16#2466
+/sevencircleinversesansserif 16#2790
+/sevendeva 16#096d
+/seveneighths 16#215e
+/sevengujarati 16#0aed
+/sevengurmukhi 16#0a6d
+/sevenhackarabic 16#0667
+/sevenhangzhou 16#3027
+/sevenideographicparen 16#3226
+/seveninferior 16#2087
+/sevenmonospace 16#ff17
+/sevenoldstyle 16#f737
+/sevenparen 16#247a
+/sevenperiod 16#248e
+/sevenpersian 16#06f7
+/sevenroman 16#2176
+/sevensuperior 16#2077
+/seventeencircle 16#2470
+/seventeenparen 16#2484
+/seventeenperiod 16#2498
+/seventhai 16#0e57
+/sfthyphen 16#00ad
+/shaarmenian 16#0577
+/shabengali 16#09b6
+/shacyrillic 16#0448
+/shaddaarabic 16#0651
+/shaddadammaarabic 16#fc61
+/shaddadammatanarabic 16#fc5e
+/shaddafathaarabic 16#fc60
+/shaddakasraarabic 16#fc62
+/shaddakasratanarabic 16#fc5f
+/shade 16#2592
+/shadedark 16#2593
+/shadelight 16#2591
+/shademedium 16#2592
+/shadeva 16#0936
+/shagujarati 16#0ab6
+/shagurmukhi 16#0a36
+/shalshelethebrew 16#0593
+/shbopomofo 16#3115
+/shchacyrillic 16#0449
+/sheenarabic 16#0634
+/sheenfinalarabic 16#feb6
+/sheeninitialarabic 16#feb7
+/sheenmedialarabic 16#feb8
+/sheicoptic 16#03e3
+/sheqel 16#20aa
+/sheqelhebrew 16#20aa
+/sheva 16#05b0
+/sheva115 16#05b0
+/sheva15 16#05b0
+/sheva22 16#05b0
+/sheva2e 16#05b0
+/shevahebrew 16#05b0
+/shevanarrowhebrew 16#05b0
+/shevaquarterhebrew 16#05b0
+/shevawidehebrew 16#05b0
+/shhacyrillic 16#04bb
+/shimacoptic 16#03ed
+/shin 16#05e9
+/shindagesh 16#fb49
+/shindageshhebrew 16#fb49
+/shindageshshindot 16#fb2c
+/shindageshshindothebrew 16#fb2c
+/shindageshsindot 16#fb2d
+/shindageshsindothebrew 16#fb2d
+/shindothebrew 16#05c1
+/shinhebrew 16#05e9
+/shinshindot 16#fb2a
+/shinshindothebrew 16#fb2a
+/shinsindot 16#fb2b
+/shinsindothebrew 16#fb2b
+/shook 16#0282
+/sigma 16#03c3
+/sigma1 16#03c2
+/sigmafinal 16#03c2
+/sigmalunatesymbolgreek 16#03f2
+/sihiragana 16#3057
+/sikatakana 16#30b7
+/sikatakanahalfwidth 16#ff7c
+/siluqhebrew 16#05bd
+/siluqlefthebrew 16#05bd
+/similar 16#223c
+/sindothebrew 16#05c2
+/siosacirclekorean 16#3274
+/siosaparenkorean 16#3214
+/sioscieuckorean 16#317e
+/sioscirclekorean 16#3266
+/sioskiyeokkorean 16#317a
+/sioskorean 16#3145
+/siosnieunkorean 16#317b
+/siosparenkorean 16#3206
+/siospieupkorean 16#317d
+/siostikeutkorean 16#317c
+/six 16#0036
+/sixarabic 16#0666
+/sixbengali 16#09ec
+/sixcircle 16#2465
+/sixcircleinversesansserif 16#278f
+/sixdeva 16#096c
+/sixgujarati 16#0aec
+/sixgurmukhi 16#0a6c
+/sixhackarabic 16#0666
+/sixhangzhou 16#3026
+/sixideographicparen 16#3225
+/sixinferior 16#2086
+/sixmonospace 16#ff16
+/sixoldstyle 16#f736
+/sixparen 16#2479
+/sixperiod 16#248d
+/sixpersian 16#06f6
+/sixroman 16#2175
+/sixsuperior 16#2076
+/sixteencircle 16#246f
+/sixteencurrencydenominatorbengali 16#09f9
+/sixteenparen 16#2483
+/sixteenperiod 16#2497
+/sixthai 16#0e56
+/slash 16#002f
+/slashmonospace 16#ff0f
+/slong 16#017f
+/slongdotaccent 16#1e9b
+/smileface 16#263a
+/smonospace 16#ff53
+/sofpasuqhebrew 16#05c3
+/softhyphen 16#00ad
+/softsigncyrillic 16#044c
+/sohiragana 16#305d
+/sokatakana 16#30bd
+/sokatakanahalfwidth 16#ff7f
+/soliduslongoverlaycmb 16#0338
+/solidusshortoverlaycmb 16#0337
+/sorusithai 16#0e29
+/sosalathai 16#0e28
+/sosothai 16#0e0b
+/sosuathai 16#0e2a
+/space 16#0020
+/spacehackarabic 16#0020
+/spade 16#2660
+/spadesuitblack 16#2660
+/spadesuitwhite 16#2664
+/sparen 16#24ae
+/squarebelowcmb 16#033b
+/squarecc 16#33c4
+/squarecm 16#339d
+/squarediagonalcrosshatchfill 16#25a9
+/squarehorizontalfill 16#25a4
+/squarekg 16#338f
+/squarekm 16#339e
+/squarekmcapital 16#33ce
+/squareln 16#33d1
+/squarelog 16#33d2
+/squaremg 16#338e
+/squaremil 16#33d5
+/squaremm 16#339c
+/squaremsquared 16#33a1
+/squareorthogonalcrosshatchfill 16#25a6
+/squareupperlefttolowerrightfill 16#25a7
+/squareupperrighttolowerleftfill 16#25a8
+/squareverticalfill 16#25a5
+/squarewhitewithsmallblack 16#25a3
+/srsquare 16#33db
+/ssabengali 16#09b7
+/ssadeva 16#0937
+/ssagujarati 16#0ab7
+/ssangcieuckorean 16#3149
+/ssanghieuhkorean 16#3185
+/ssangieungkorean 16#3180
+/ssangkiyeokkorean 16#3132
+/ssangnieunkorean 16#3165
+/ssangpieupkorean 16#3143
+/ssangsioskorean 16#3146
+/ssangtikeutkorean 16#3138
+/ssuperior 16#f6f2
+/sterling 16#00a3
+/sterlingmonospace 16#ffe1
+/strokelongoverlaycmb 16#0336
+/strokeshortoverlaycmb 16#0335
+/subset 16#2282
+/subsetnotequal 16#228a
+/subsetorequal 16#2286
+/succeeds 16#227b
+/suchthat 16#220b
+/suhiragana 16#3059
+/sukatakana 16#30b9
+/sukatakanahalfwidth 16#ff7d
+/sukunarabic 16#0652
+/summation 16#2211
+/sun 16#263c
+/superset 16#2283
+/supersetnotequal 16#228b
+/supersetorequal 16#2287
+/svsquare 16#33dc
+/syouwaerasquare 16#337c
+/t 16#0074
+/tabengali 16#09a4
+/tackdown 16#22a4
+/tackleft 16#22a3
+/tadeva 16#0924
+/tagujarati 16#0aa4
+/tagurmukhi 16#0a24
+/taharabic 16#0637
+/tahfinalarabic 16#fec2
+/tahinitialarabic 16#fec3
+/tahiragana 16#305f
+/tahmedialarabic 16#fec4
+/taisyouerasquare 16#337d
+/takatakana 16#30bf
+/takatakanahalfwidth 16#ff80
+/tatweelarabic 16#0640
+/tau 16#03c4
+/tav 16#05ea
+/tavdages 16#fb4a
+/tavdagesh 16#fb4a
+/tavdageshhebrew 16#fb4a
+/tavhebrew 16#05ea
+/tbar 16#0167
+/tbopomofo 16#310a
+/tcaron 16#0165
+/tccurl 16#02a8
+/tcedilla 16#0163
+/tcheharabic 16#0686
+/tchehfinalarabic 16#fb7b
+/tchehinitialarabic 16#fb7c
+/tchehmedialarabic 16#fb7d
+/tcircle 16#24e3
+/tcircumflexbelow 16#1e71
+/tcommaaccent 16#0163
+/tdieresis 16#1e97
+/tdotaccent 16#1e6b
+/tdotbelow 16#1e6d
+/tecyrillic 16#0442
+/tedescendercyrillic 16#04ad
+/teharabic 16#062a
+/tehfinalarabic 16#fe96
+/tehhahinitialarabic 16#fca2
+/tehhahisolatedarabic 16#fc0c
+/tehinitialarabic 16#fe97
+/tehiragana 16#3066
+/tehjeeminitialarabic 16#fca1
+/tehjeemisolatedarabic 16#fc0b
+/tehmarbutaarabic 16#0629
+/tehmarbutafinalarabic 16#fe94
+/tehmedialarabic 16#fe98
+/tehmeeminitialarabic 16#fca4
+/tehmeemisolatedarabic 16#fc0e
+/tehnoonfinalarabic 16#fc73
+/tekatakana 16#30c6
+/tekatakanahalfwidth 16#ff83
+/telephone 16#2121
+/telephoneblack 16#260e
+/telishagedolahebrew 16#05a0
+/telishaqetanahebrew 16#05a9
+/tencircle 16#2469
+/tenideographicparen 16#3229
+/tenparen 16#247d
+/tenperiod 16#2491
+/tenroman 16#2179
+/tesh 16#02a7
+/tet 16#05d8
+/tetdagesh 16#fb38
+/tetdageshhebrew 16#fb38
+/tethebrew 16#05d8
+/tetsecyrillic 16#04b5
+/tevirhebrew 16#059b
+/tevirlefthebrew 16#059b
+/thabengali 16#09a5
+/thadeva 16#0925
+/thagujarati 16#0aa5
+/thagurmukhi 16#0a25
+/thalarabic 16#0630
+/thalfinalarabic 16#feac
+/thanthakhatlowleftthai 16#f898
+/thanthakhatlowrightthai 16#f897
+/thanthakhatthai 16#0e4c
+/thanthakhatupperleftthai 16#f896
+/theharabic 16#062b
+/thehfinalarabic 16#fe9a
+/thehinitialarabic 16#fe9b
+/thehmedialarabic 16#fe9c
+/thereexists 16#2203
+/therefore 16#2234
+/theta 16#03b8
+/theta1 16#03d1
+/thetasymbolgreek 16#03d1
+/thieuthacirclekorean 16#3279
+/thieuthaparenkorean 16#3219
+/thieuthcirclekorean 16#326b
+/thieuthkorean 16#314c
+/thieuthparenkorean 16#320b
+/thirteencircle 16#246c
+/thirteenparen 16#2480
+/thirteenperiod 16#2494
+/thonangmonthothai 16#0e11
+/thook 16#01ad
+/thophuthaothai 16#0e12
+/thorn 16#00fe
+/thothahanthai 16#0e17
+/thothanthai 16#0e10
+/thothongthai 16#0e18
+/thothungthai 16#0e16
+/thousandcyrillic 16#0482
+/thousandsseparatorarabic 16#066c
+/thousandsseparatorpersian 16#066c
+/three 16#0033
+/threearabic 16#0663
+/threebengali 16#09e9
+/threecircle 16#2462
+/threecircleinversesansserif 16#278c
+/threedeva 16#0969
+/threeeighths 16#215c
+/threegujarati 16#0ae9
+/threegurmukhi 16#0a69
+/threehackarabic 16#0663
+/threehangzhou 16#3023
+/threeideographicparen 16#3222
+/threeinferior 16#2083
+/threemonospace 16#ff13
+/threenumeratorbengali 16#09f6
+/threeoldstyle 16#f733
+/threeparen 16#2476
+/threeperiod 16#248a
+/threepersian 16#06f3
+/threequarters 16#00be
+/threequartersemdash 16#f6de
+/threeroman 16#2172
+/threesuperior 16#00b3
+/threethai 16#0e53
+/thzsquare 16#3394
+/tihiragana 16#3061
+/tikatakana 16#30c1
+/tikatakanahalfwidth 16#ff81
+/tikeutacirclekorean 16#3270
+/tikeutaparenkorean 16#3210
+/tikeutcirclekorean 16#3262
+/tikeutkorean 16#3137
+/tikeutparenkorean 16#3202
+/tilde 16#02dc
+/tildebelowcmb 16#0330
+/tildecmb 16#0303
+/tildecomb 16#0303
+/tildedoublecmb 16#0360
+/tildeoperator 16#223c
+/tildeoverlaycmb 16#0334
+/tildeverticalcmb 16#033e
+/timescircle 16#2297
+/tipehahebrew 16#0596
+/tipehalefthebrew 16#0596
+/tippigurmukhi 16#0a70
+/titlocyrilliccmb 16#0483
+/tiwnarmenian 16#057f
+/tlinebelow 16#1e6f
+/tmonospace 16#ff54
+/toarmenian 16#0569
+/tohiragana 16#3068
+/tokatakana 16#30c8
+/tokatakanahalfwidth 16#ff84
+/tonebarextrahighmod 16#02e5
+/tonebarextralowmod 16#02e9
+/tonebarhighmod 16#02e6
+/tonebarlowmod 16#02e8
+/tonebarmidmod 16#02e7
+/tonefive 16#01bd
+/tonesix 16#0185
+/tonetwo 16#01a8
+/tonos 16#0384
+/tonsquare 16#3327
+/topatakthai 16#0e0f
+/tortoiseshellbracketleft 16#3014
+/tortoiseshellbracketleftsmall 16#fe5d
+/tortoiseshellbracketleftvertical 16#fe39
+/tortoiseshellbracketright 16#3015
+/tortoiseshellbracketrightsmall 16#fe5e
+/tortoiseshellbracketrightvertical 16#fe3a
+/totaothai 16#0e15
+/tpalatalhook 16#01ab
+/tparen 16#24af
+/trademark 16#2122
+/trademarksans 16#f8ea
+/trademarkserif 16#f6db
+/tretroflexhook 16#0288
+/triagdn 16#25bc
+/triaglf 16#25c4
+/triagrt 16#25ba
+/triagup 16#25b2
+/ts 16#02a6
+/tsadi 16#05e6
+/tsadidagesh 16#fb46
+/tsadidageshhebrew 16#fb46
+/tsadihebrew 16#05e6
+/tsecyrillic 16#0446
+/tsere 16#05b5
+/tsere12 16#05b5
+/tsere1e 16#05b5
+/tsere2b 16#05b5
+/tserehebrew 16#05b5
+/tserenarrowhebrew 16#05b5
+/tserequarterhebrew 16#05b5
+/tserewidehebrew 16#05b5
+/tshecyrillic 16#045b
+/tsuperior 16#f6f3
+/ttabengali 16#099f
+/ttadeva 16#091f
+/ttagujarati 16#0a9f
+/ttagurmukhi 16#0a1f
+/tteharabic 16#0679
+/ttehfinalarabic 16#fb67
+/ttehinitialarabic 16#fb68
+/ttehmedialarabic 16#fb69
+/tthabengali 16#09a0
+/tthadeva 16#0920
+/tthagujarati 16#0aa0
+/tthagurmukhi 16#0a20
+/tturned 16#0287
+/tuhiragana 16#3064
+/tukatakana 16#30c4
+/tukatakanahalfwidth 16#ff82
+/tusmallhiragana 16#3063
+/tusmallkatakana 16#30c3
+/tusmallkatakanahalfwidth 16#ff6f
+/twelvecircle 16#246b
+/twelveparen 16#247f
+/twelveperiod 16#2493
+/twelveroman 16#217b
+/twentycircle 16#2473
+/twentyhangzhou 16#5344
+/twentyparen 16#2487
+/twentyperiod 16#249b
+/two 16#0032
+/twoarabic 16#0662
+/twobengali 16#09e8
+/twocircle 16#2461
+/twocircleinversesansserif 16#278b
+/twodeva 16#0968
+/twodotenleader 16#2025
+/twodotleader 16#2025
+/twodotleadervertical 16#fe30
+/twogujarati 16#0ae8
+/twogurmukhi 16#0a68
+/twohackarabic 16#0662
+/twohangzhou 16#3022
+/twoideographicparen 16#3221
+/twoinferior 16#2082
+/twomonospace 16#ff12
+/twonumeratorbengali 16#09f5
+/twooldstyle 16#f732
+/twoparen 16#2475
+/twoperiod 16#2489
+/twopersian 16#06f2
+/tworoman 16#2171
+/twostroke 16#01bb
+/twosuperior 16#00b2
+/twothai 16#0e52
+/twothirds 16#2154
+/u 16#0075
+/uacute 16#00fa
+/ubar 16#0289
+/ubengali 16#0989
+/ubopomofo 16#3128
+/ubreve 16#016d
+/ucaron 16#01d4
+/ucircle 16#24e4
+/ucircumflex 16#00fb
+/ucircumflexbelow 16#1e77
+/ucyrillic 16#0443
+/udattadeva 16#0951
+/udblacute 16#0171
+/udblgrave 16#0215
+/udeva 16#0909
+/udieresis 16#00fc
+/udieresisacute 16#01d8
+/udieresisbelow 16#1e73
+/udieresiscaron 16#01da
+/udieresiscyrillic 16#04f1
+/udieresisgrave 16#01dc
+/udieresismacron 16#01d6
+/udotbelow 16#1ee5
+/ugrave 16#00f9
+/ugujarati 16#0a89
+/ugurmukhi 16#0a09
+/uhiragana 16#3046
+/uhookabove 16#1ee7
+/uhorn 16#01b0
+/uhornacute 16#1ee9
+/uhorndotbelow 16#1ef1
+/uhorngrave 16#1eeb
+/uhornhookabove 16#1eed
+/uhorntilde 16#1eef
+/uhungarumlaut 16#0171
+/uhungarumlautcyrillic 16#04f3
+/uinvertedbreve 16#0217
+/ukatakana 16#30a6
+/ukatakanahalfwidth 16#ff73
+/ukcyrillic 16#0479
+/ukorean 16#315c
+/umacron 16#016b
+/umacroncyrillic 16#04ef
+/umacrondieresis 16#1e7b
+/umatragurmukhi 16#0a41
+/umonospace 16#ff55
+/underscore 16#005f
+/underscoredbl 16#2017
+/underscoremonospace 16#ff3f
+/underscorevertical 16#fe33
+/underscorewavy 16#fe4f
+/union 16#222a
+/universal 16#2200
+/uogonek 16#0173
+/uparen 16#24b0
+/upblock 16#2580
+/upperdothebrew 16#05c4
+/upsilon 16#03c5
+/upsilondieresis 16#03cb
+/upsilondieresistonos 16#03b0
+/upsilonlatin 16#028a
+/upsilontonos 16#03cd
+/uptackbelowcmb 16#031d
+/uptackmod 16#02d4
+/uragurmukhi 16#0a73
+/uring 16#016f
+/ushortcyrillic 16#045e
+/usmallhiragana 16#3045
+/usmallkatakana 16#30a5
+/usmallkatakanahalfwidth 16#ff69
+/ustraightcyrillic 16#04af
+/ustraightstrokecyrillic 16#04b1
+/utilde 16#0169
+/utildeacute 16#1e79
+/utildebelow 16#1e75
+/uubengali 16#098a
+/uudeva 16#090a
+/uugujarati 16#0a8a
+/uugurmukhi 16#0a0a
+/uumatragurmukhi 16#0a42
+/uuvowelsignbengali 16#09c2
+/uuvowelsigndeva 16#0942
+/uuvowelsigngujarati 16#0ac2
+/uvowelsignbengali 16#09c1
+/uvowelsigndeva 16#0941
+/uvowelsigngujarati 16#0ac1
+/v 16#0076
+/vadeva 16#0935
+/vagujarati 16#0ab5
+/vagurmukhi 16#0a35
+/vakatakana 16#30f7
+/vav 16#05d5
+/vavdagesh 16#fb35
+/vavdagesh65 16#fb35
+/vavdageshhebrew 16#fb35
+/vavhebrew 16#05d5
+/vavholam 16#fb4b
+/vavholamhebrew 16#fb4b
+/vavvavhebrew 16#05f0
+/vavyodhebrew 16#05f1
+/vcircle 16#24e5
+/vdotbelow 16#1e7f
+/vecyrillic 16#0432
+/veharabic 16#06a4
+/vehfinalarabic 16#fb6b
+/vehinitialarabic 16#fb6c
+/vehmedialarabic 16#fb6d
+/vekatakana 16#30f9
+/venus 16#2640
+/verticalbar 16#007c
+/verticallineabovecmb 16#030d
+/verticallinebelowcmb 16#0329
+/verticallinelowmod 16#02cc
+/verticallinemod 16#02c8
+/vewarmenian 16#057e
+/vhook 16#028b
+/vikatakana 16#30f8
+/viramabengali 16#09cd
+/viramadeva 16#094d
+/viramagujarati 16#0acd
+/visargabengali 16#0983
+/visargadeva 16#0903
+/visargagujarati 16#0a83
+/vmonospace 16#ff56
+/voarmenian 16#0578
+/voicediterationhiragana 16#309e
+/voicediterationkatakana 16#30fe
+/voicedmarkkana 16#309b
+/voicedmarkkanahalfwidth 16#ff9e
+/vokatakana 16#30fa
+/vparen 16#24b1
+/vtilde 16#1e7d
+/vturned 16#028c
+/vuhiragana 16#3094
+/vukatakana 16#30f4
+/w 16#0077
+/wacute 16#1e83
+/waekorean 16#3159
+/wahiragana 16#308f
+/wakatakana 16#30ef
+/wakatakanahalfwidth 16#ff9c
+/wakorean 16#3158
+/wasmallhiragana 16#308e
+/wasmallkatakana 16#30ee
+/wattosquare 16#3357
+/wavedash 16#301c
+/wavyunderscorevertical 16#fe34
+/wawarabic 16#0648
+/wawfinalarabic 16#feee
+/wawhamzaabovearabic 16#0624
+/wawhamzaabovefinalarabic 16#fe86
+/wbsquare 16#33dd
+/wcircle 16#24e6
+/wcircumflex 16#0175
+/wdieresis 16#1e85
+/wdotaccent 16#1e87
+/wdotbelow 16#1e89
+/wehiragana 16#3091
+/weierstrass 16#2118
+/wekatakana 16#30f1
+/wekorean 16#315e
+/weokorean 16#315d
+/wgrave 16#1e81
+/whitebullet 16#25e6
+/whitecircle 16#25cb
+/whitecircleinverse 16#25d9
+/whitecornerbracketleft 16#300e
+/whitecornerbracketleftvertical 16#fe43
+/whitecornerbracketright 16#300f
+/whitecornerbracketrightvertical 16#fe44
+/whitediamond 16#25c7
+/whitediamondcontainingblacksmalldiamond 16#25c8
+/whitedownpointingsmalltriangle 16#25bf
+/whitedownpointingtriangle 16#25bd
+/whiteleftpointingsmalltriangle 16#25c3
+/whiteleftpointingtriangle 16#25c1
+/whitelenticularbracketleft 16#3016
+/whitelenticularbracketright 16#3017
+/whiterightpointingsmalltriangle 16#25b9
+/whiterightpointingtriangle 16#25b7
+/whitesmallsquare 16#25ab
+/whitesmilingface 16#263a
+/whitesquare 16#25a1
+/whitestar 16#2606
+/whitetelephone 16#260f
+/whitetortoiseshellbracketleft 16#3018
+/whitetortoiseshellbracketright 16#3019
+/whiteuppointingsmalltriangle 16#25b5
+/whiteuppointingtriangle 16#25b3
+/wihiragana 16#3090
+/wikatakana 16#30f0
+/wikorean 16#315f
+/wmonospace 16#ff57
+/wohiragana 16#3092
+/wokatakana 16#30f2
+/wokatakanahalfwidth 16#ff66
+/won 16#20a9
+/wonmonospace 16#ffe6
+/wowaenthai 16#0e27
+/wparen 16#24b2
+/wring 16#1e98
+/wsuperior 16#02b7
+/wturned 16#028d
+/wynn 16#01bf
+/x 16#0078
+/xabovecmb 16#033d
+/xbopomofo 16#3112
+/xcircle 16#24e7
+/xdieresis 16#1e8d
+/xdotaccent 16#1e8b
+/xeharmenian 16#056d
+/xi 16#03be
+/xmonospace 16#ff58
+/xparen 16#24b3
+/xsuperior 16#02e3
+/y 16#0079
+/yaadosquare 16#334e
+/yabengali 16#09af
+/yacute 16#00fd
+/yadeva 16#092f
+/yaekorean 16#3152
+/yagujarati 16#0aaf
+/yagurmukhi 16#0a2f
+/yahiragana 16#3084
+/yakatakana 16#30e4
+/yakatakanahalfwidth 16#ff94
+/yakorean 16#3151
+/yamakkanthai 16#0e4e
+/yasmallhiragana 16#3083
+/yasmallkatakana 16#30e3
+/yasmallkatakanahalfwidth 16#ff6c
+/yatcyrillic 16#0463
+/ycircle 16#24e8
+/ycircumflex 16#0177
+/ydieresis 16#00ff
+/ydotaccent 16#1e8f
+/ydotbelow 16#1ef5
+/yeharabic 16#064a
+/yehbarreearabic 16#06d2
+/yehbarreefinalarabic 16#fbaf
+/yehfinalarabic 16#fef2
+/yehhamzaabovearabic 16#0626
+/yehhamzaabovefinalarabic 16#fe8a
+/yehhamzaaboveinitialarabic 16#fe8b
+/yehhamzaabovemedialarabic 16#fe8c
+/yehinitialarabic 16#fef3
+/yehmedialarabic 16#fef4
+/yehmeeminitialarabic 16#fcdd
+/yehmeemisolatedarabic 16#fc58
+/yehnoonfinalarabic 16#fc94
+/yehthreedotsbelowarabic 16#06d1
+/yekorean 16#3156
+/yen 16#00a5
+/yenmonospace 16#ffe5
+/yeokorean 16#3155
+/yeorinhieuhkorean 16#3186
+/yerahbenyomohebrew 16#05aa
+/yerahbenyomolefthebrew 16#05aa
+/yericyrillic 16#044b
+/yerudieresiscyrillic 16#04f9
+/yesieungkorean 16#3181
+/yesieungpansioskorean 16#3183
+/yesieungsioskorean 16#3182
+/yetivhebrew 16#059a
+/ygrave 16#1ef3
+/yhook 16#01b4
+/yhookabove 16#1ef7
+/yiarmenian 16#0575
+/yicyrillic 16#0457
+/yikorean 16#3162
+/yinyang 16#262f
+/yiwnarmenian 16#0582
+/ymonospace 16#ff59
+/yod 16#05d9
+/yoddagesh 16#fb39
+/yoddageshhebrew 16#fb39
+/yodhebrew 16#05d9
+/yodyodhebrew 16#05f2
+/yodyodpatahhebrew 16#fb1f
+/yohiragana 16#3088
+/yoikorean 16#3189
+/yokatakana 16#30e8
+/yokatakanahalfwidth 16#ff96
+/yokorean 16#315b
+/yosmallhiragana 16#3087
+/yosmallkatakana 16#30e7
+/yosmallkatakanahalfwidth 16#ff6e
+/yotgreek 16#03f3
+/yoyaekorean 16#3188
+/yoyakorean 16#3187
+/yoyakthai 16#0e22
+/yoyingthai 16#0e0d
+/yparen 16#24b4
+/ypogegrammeni 16#037a
+/ypogegrammenigreekcmb 16#0345
+/yr 16#01a6
+/yring 16#1e99
+/ysuperior 16#02b8
+/ytilde 16#1ef9
+/yturned 16#028e
+/yuhiragana 16#3086
+/yuikorean 16#318c
+/yukatakana 16#30e6
+/yukatakanahalfwidth 16#ff95
+/yukorean 16#3160
+/yusbigcyrillic 16#046b
+/yusbigiotifiedcyrillic 16#046d
+/yuslittlecyrillic 16#0467
+/yuslittleiotifiedcyrillic 16#0469
+/yusmallhiragana 16#3085
+/yusmallkatakana 16#30e5
+/yusmallkatakanahalfwidth 16#ff6d
+/yuyekorean 16#318b
+/yuyeokorean 16#318a
+/yyabengali 16#09df
+/yyadeva 16#095f
+/z 16#007a
+/zaarmenian 16#0566
+/zacute 16#017a
+/zadeva 16#095b
+/zagurmukhi 16#0a5b
+/zaharabic 16#0638
+/zahfinalarabic 16#fec6
+/zahinitialarabic 16#fec7
+/zahiragana 16#3056
+/zahmedialarabic 16#fec8
+/zainarabic 16#0632
+/zainfinalarabic 16#feb0
+/zakatakana 16#30b6
+/zaqefgadolhebrew 16#0595
+/zaqefqatanhebrew 16#0594
+/zarqahebrew 16#0598
+/zayin 16#05d6
+/zayindagesh 16#fb36
+/zayindageshhebrew 16#fb36
+/zayinhebrew 16#05d6
+/zbopomofo 16#3117
+/zcaron 16#017e
+/zcircle 16#24e9
+/zcircumflex 16#1e91
+/zcurl 16#0291
+/zdot 16#017c
+/zdotaccent 16#017c
+/zdotbelow 16#1e93
+/zecyrillic 16#0437
+/zedescendercyrillic 16#0499
+/zedieresiscyrillic 16#04df
+/zehiragana 16#305c
+/zekatakana 16#30bc
+/zero 16#0030
+/zeroarabic 16#0660
+/zerobengali 16#09e6
+/zerodeva 16#0966
+/zerogujarati 16#0ae6
+/zerogurmukhi 16#0a66
+/zerohackarabic 16#0660
+/zeroinferior 16#2080
+/zeromonospace 16#ff10
+/zerooldstyle 16#f730
+/zeropersian 16#06f0
+/zerosuperior 16#2070
+/zerothai 16#0e50
+/zerowidthjoiner 16#feff
+/zerowidthnonjoiner 16#200c
+/zerowidthspace 16#200b
+/zeta 16#03b6
+/zhbopomofo 16#3113
+/zhearmenian 16#056a
+/zhebrevecyrillic 16#04c2
+/zhecyrillic 16#0436
+/zhedescendercyrillic 16#0497
+/zhedieresiscyrillic 16#04dd
+/zihiragana 16#3058
+/zikatakana 16#30b8
+/zinorhebrew 16#05ae
+/zlinebelow 16#1e95
+/zmonospace 16#ff5a
+/zohiragana 16#305e
+/zokatakana 16#30be
+/zparen 16#24b5
+/zretroflexhook 16#0290
+/zstroke 16#01b6
+/zuhiragana 16#305a
+/zukatakana 16#30ba
+.dicttomark readonly def
+/currentglobal where
+{pop currentglobal{setglobal}true setglobal}
+{{}}
+ifelse
+/MacRomanEncoding .findencoding
+/MacGlyphEncoding
+/.notdef/.null/CR
+4 index 32 95 getinterval aload pop
+99 index 128 45 getinterval aload pop
+/notequal/AE
+/Oslash/infinity/plusminus/lessequal/greaterequal
+/yen/mu1/partialdiff/summation/product
+/pi/integral/ordfeminine/ordmasculine/Ohm
+/ae/oslash/questiondown/exclamdown/logicalnot
+/radical/florin/approxequal/increment/guillemotleft
+/guillemotright/ellipsis/nbspace
+174 index 203 12 getinterval aload pop
+/lozenge
+187 index 216 24 getinterval aload pop
+/applelogo
+212 index 241 7 getinterval aload pop
+/overscore
+220 index 249 7 getinterval aload pop
+/Lslash/lslash/Scaron/scaron
+/Zcaron/zcaron/brokenbar/Eth/eth
+/Yacute/yacute/Thorn/thorn/minus
+/multiply/onesuperior/twosuperior/threesuperior/onehalf
+/onequarter/threequarters/franc/Gbreve/gbreve
+/Idotaccent/Scedilla/scedilla/Cacute/cacute
+/Ccaron/ccaron/dmacron
+260 -1 roll pop
+258 packedarray
+7 1 index .registerencoding
+.defineencoding
+exec
+
+%%BeginResource: file (PDF object obj_1)
+1 0 obj
+<<>>endobj
+%%EndResource
+%%EndProlog
+%begin_xml_code
+/pdfmark where {pop true} {false} ifelse
+/currentdistillerparams where {pop currentdistillerparams
+/CoreDistVersion get 5000 ge } {false} ifelse
+and not {userdict /pdfmark /cleartomark load put} if
+[/NamespacePush pdfmark
+[/_objdef {exiftool_metadata_stream} /type /stream /OBJ pdfmark
+[{exiftool_metadata_stream} 2 dict begin /Type /Metadata def
+ /Subtype /XML def currentdict end /PUT pdfmark
+/MetadataString 2943 string def % exact length of metadata
+/TempString 100 string def
+/ConsumeMetadata {
+currentfile TempString readline pop pop
+currentfile MetadataString readstring pop pop
+} bind def
+ConsumeMetadata
+%begin_xml_packet: 2943
+<?xpacket begin='' 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:dc='http://purl.org/dc/elements/1.1/'>
+ <dc:creator>
+ <rdf:Seq>
+ <rdf:li>Zamzar</rdf:li>
+ </rdf:Seq>
+ </dc:creator>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ <pdf:Producer>Zamzar</pdf:Producer>
+ </rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end='w'?>
+%end_xml_packet
+[{exiftool_metadata_stream} MetadataString /PUT pdfmark
+[/Document 1 dict begin
+ /Metadata {exiftool_metadata_stream} def currentdict end /BDC pdfmark
+[/NamespacePop pdfmark
+%end_xml_code
+%%Page: 1 1
+%%BeginPageSetup
+4 0 obj
+<</Type/Page/MediaBox [0 0 256 256]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+%%EndPageSetup
+/pagesave save def
+5 0 obj
+<</Length 3978>>stream
+q 0.1 0 0 0.1 0 0 cm
+0.141113 0.160889 0.219727 RG
+0.141113 0.160889 0.219727 rg
+600 2560 m
+1960 2560 l
+2291.37 2560 2560 2291.37 2560 1960 c
+2560 600 l
+2560 268.629 2291.37 0 1960 0 c
+600 0 l
+268.629 0 0 268.629 0 600 c
+0 1960 l
+0 2291.37 268.629 2560 600 2560 c
+h
+600 2560 m
+f
+1 0.176514 0.125488 RG
+1 0.176514 0.125488 rg
+2158.48 1776.87 m
+2159.1 1774.41 2159.45 1771.91 2159.45 1769.41 c
+2159.45 1377.38 l
+2159.45 1372.38 2158.13 1367.42 2155.66 1363.09 c
+2153.16 1358.71 2149.57 1355.12 2145.27 1352.62 c
+1820.82 1163.2 l
+1820.82 787.73 l
+1820.82 777.539 1815.47 768.09 1806.72 762.93 c
+1129.45 367.582 l
+1127.89 366.719 1126.21 366.129 1124.53 365.512 c
+1123.87 365.309 1123.28 364.922 1122.62 364.73 c
+1117.89 363.48 1112.89 363.48 1108.16 364.73 c
+1107.38 364.961 1106.68 365.391 1105.94 365.66 c
+1104.41 366.211 1102.77 366.719 1101.29 367.582 c
+424.18 762.93 l
+419.84 765.469 416.289 769.059 413.789 773.398 c
+411.328 777.77 410 782.699 410 787.73 c
+410 1963.71 l
+410 1966.29 410.352 1968.79 410.98 1971.21 c
+411.211 1972.03 411.68 1972.77 411.988 1973.59 c
+412.5 1975.12 413.012 1976.64 413.789 1978.05 c
+414.301 1978.98 415.078 1979.73 415.699 1980.59 c
+416.52 1981.72 417.27 1982.89 418.199 1983.91 c
+419.02 1984.73 420.078 1985.31 420.98 1986.05 c
+422.031 1986.91 422.93 1987.81 424.102 1988.52 c
+424.141 1988.52 l
+762.699 2186.17 l
+766.988 2188.67 771.879 2190 776.801 2190 c
+781.762 2190 786.602 2188.67 790.898 2186.17 c
+1129.49 1988.52 l
+1129.57 1988.52 l
+1130.66 1987.77 1131.64 1986.91 1132.66 1986.09 c
+1133.55 1985.35 1134.61 1984.73 1135.39 1983.95 c
+1136.41 1982.89 1137.11 1981.72 1137.93 1980.59 c
+1138.55 1979.73 1139.34 1978.98 1139.84 1978.05 c
+1140.66 1976.6 1141.09 1975.12 1141.68 1973.59 c
+1141.95 1972.77 1142.46 1972.03 1142.66 1971.17 c
+1143.32 1968.75 1143.63 1966.25 1143.63 1963.71 c
+1143.63 1229.22 l
+1425.78 1393.95 l
+1425.78 1769.41 l
+1425.78 1771.91 1426.13 1774.45 1426.8 1776.87 c
+1427.03 1777.73 1427.46 1778.48 1427.77 1779.3 c
+1428.32 1780.78 1428.83 1782.34 1429.61 1783.71 c
+1430.12 1784.65 1430.9 1785.39 1431.48 1786.25 c
+1432.34 1787.38 1433.05 1788.59 1434.02 1789.57 c
+1434.84 1790.39 1435.86 1791.02 1436.8 1791.72 c
+1437.85 1792.58 1438.75 1793.52 1439.88 1794.18 c
+1439.92 1794.18 l
+1778.55 1991.87 l
+1782.81 1994.37 1787.7 1995.7 1792.66 1995.7 c
+1797.58 1995.7 1802.46 1994.37 1806.72 1991.87 c
+2145.31 1794.18 l
+2146.52 1793.48 2147.42 1792.58 2148.48 1791.76 c
+2149.38 1791.05 2150.39 1790.39 2151.21 1789.61 c
+2152.19 1788.59 2152.89 1787.38 2153.75 1786.25 c
+2154.38 1785.39 2155.16 1784.65 2155.63 1783.71 c
+2156.45 1782.34 2156.91 1780.78 2157.46 1779.3 c
+2157.77 1778.48 2158.24 1777.73 2158.48 1776.87 c
+h
+2103.01 1393.95 m
+2103.01 1719.92 l
+1984.49 1650.74 l
+1820.82 1555.2 l
+1820.82 1229.22 l
+2103.05 1393.95 l
+h
+1764.41 804.301 m
+1764.41 1130.47 l
+1603.4 1037.23 l
+1143.59 771.129 l
+1143.59 441.871 l
+h
+466.449 1914.22 m
+466.449 804.301 l
+1087.19 441.91 l
+1087.19 771.09 l
+762.891 957.191 l
+762.66 957.34 l
+761.559 957.969 760.629 958.91 759.609 959.691 c
+758.75 960.391 757.699 960.98 756.949 961.762 c
+756.879 961.871 l
+755.941 962.77 755.309 963.871 754.531 964.879 c
+753.828 965.82 753.012 966.641 752.422 967.66 c
+752.379 967.77 l
+751.762 968.828 751.371 970.121 750.898 971.328 c
+750.43 972.379 749.84 973.398 749.57 974.531 c
+749.57 974.609 l
+749.219 975.941 749.141 977.379 749.02 978.789 c
+748.871 979.84 748.59 980.898 748.59 981.988 c
+748.59 1749.49 l
+584.922 1845.12 l
+466.449 1914.18 l
+h
+776.84 2128.36 m
+494.73 1963.71 l
+776.762 1799.06 l
+1058.83 1963.75 l
+776.762 2128.36 l
+h
+923.551 1100.74 m
+1087.23 1196.29 l
+1087.23 1914.22 l
+968.711 1845.08 l
+805.039 1749.49 l
+805.039 1031.52 l
+h
+1792.66 1934.06 m
+1510.55 1769.41 l
+1792.66 1604.73 l
+2074.69 1769.41 l
+h
+1764.41 1555.2 m
+1600.7 1650.74 l
+1482.23 1719.92 l
+1482.23 1393.95 l
+1645.9 1298.4 l
+1764.41 1229.22 l
+h
+1115.35 820.59 m
+1529.1 1060.12 l
+1735.9 1179.8 l
+1454.06 1344.37 l
+1129.53 1154.88 l
+833.75 982.23 l
+h
+1115.35 820.59 m
+f*
+Q
+
+endstream
+endobj
+pagesave restore
+%%PageTrailer
+%%Trailer
+end
+[/EMC pdfmark
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..77e8015dbf
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Light.eps
new file mode 100644
index 0000000000..e28929c234
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Laravel-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..adcb0f32ab
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Dark.eps
new file mode 100644
index 0000000000..622a2bdaa9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..52cd862397
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Light.eps
new file mode 100644
index 0000000000..604deb2626
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Less-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_LinkedIn-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_LinkedIn-eps-converted-to.pdf
new file mode 100644
index 0000000000..b662d5068a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_LinkedIn-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_LinkedIn.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_LinkedIn.eps
new file mode 100644
index 0000000000..3d0a3ba129
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_LinkedIn.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..9b8da50e74
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Dark.eps
new file mode 100644
index 0000000000..8e12fb13b9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..b743629e8f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Light.eps
new file mode 100644
index 0000000000..9c9faa38fe
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Linux-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..3d3dd669c6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Dark.eps
new file mode 100644
index 0000000000..c4b9d9c34d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..d7b878dcc8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Light-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x]͍0T
+,!L51(Ja?;`q^?{ _upj$ 6YV9qJVҩRE*[
+
+8/ħʿ] {~ @:QNe)w0iTT:iV%v[s.#"K0mm=S:Ż¹ Pz+sfش/c&W=[L~tx;:zendstream
+endobj
+6 0 obj
+246
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:21:32+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:21:32+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:9dc1eb78-143f-11ef-0000-5632226cfd5e'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132132+02'00')
+/ModDate(D:20240514132132+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000793 00000 n
+0000002115 00000 n
+0000000734 00000 n
+0000000620 00000 n
+0000000285 00000 n
+0000000601 00000 n
+0000000857 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<9203CEF1D1528CA3E940A0A89F56E81C><9203CEF1D1528CA3E940A0A89F56E81C>]
+>>
+startxref
+2240
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Light.eps
new file mode 100644
index 0000000000..0bc062c09f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lit-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..4685664ddb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Dark.eps
new file mode 100644
index 0000000000..c386135a8e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..ffc5257c89
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Light.eps
new file mode 100644
index 0000000000..6bc7fcc410
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Lua-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..c569905a7b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Dark.eps
new file mode 100644
index 0000000000..69e1cd5b88
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..c1082ceb3e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Light.eps
new file mode 100644
index 0000000000..dc8d193222
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Markdown-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..26cd9381e5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Dark.eps
new file mode 100644
index 0000000000..5ed1596d6e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..c2bedc92e2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Light.eps
new file mode 100644
index 0000000000..325ed446d6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mastodon-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..d56f904fdb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Dark.eps
new file mode 100644
index 0000000000..a0efb06f41
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..48e35d9b1a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Light.eps
new file mode 100644
index 0000000000..d416815de5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MaterialUI-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..19f92d133c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Dark.eps
new file mode 100644
index 0000000000..6d88a75469
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..7953361a65
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Light.eps
new file mode 100644
index 0000000000..625df0bce9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Matlab-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..bd06834ce7
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Dark.eps
new file mode 100644
index 0000000000..4c0aacf92d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f2666a3ef8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Light.eps
new file mode 100644
index 0000000000..7f5aeeb912
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Maven-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..6e83fa7d7f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Dark.eps
new file mode 100644
index 0000000000..d50aea63e1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..105f2affe5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Light.eps
new file mode 100644
index 0000000000..32594ca53d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Mint-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..f419965902
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Dark.eps
new file mode 100644
index 0000000000..efa1e3cd14
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..29d6f134da
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Light.eps
new file mode 100644
index 0000000000..088b301f1c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Misskey-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MongoDB-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_MongoDB-eps-converted-to.pdf
new file mode 100644
index 0000000000..ab43790a3c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MongoDB-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MongoDB.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_MongoDB.eps
new file mode 100644
index 0000000000..31d467e53a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MongoDB.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a2365119c5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Dark.eps
new file mode 100644
index 0000000000..2bc14173e1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..c7dc1f54c9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Light.eps
new file mode 100644
index 0000000000..a5cce12788
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_MySQL-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..150e78faa4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Dark.eps
new file mode 100644
index 0000000000..447fa136cc
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f21c1a81e2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Light.eps
new file mode 100644
index 0000000000..d37c7da953
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NeoVim-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..14e29438f9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Dark.eps
new file mode 100644
index 0000000000..a2da0033d8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..c9ad812087
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Light.eps
new file mode 100644
index 0000000000..95e7647015
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NestJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..2b4bdb05a9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Dark.eps
new file mode 100644
index 0000000000..8a98239efb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..9881993174
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Light.eps
new file mode 100644
index 0000000000..d30c53c614
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Netlify-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..b9d29613e7
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Dark.eps
new file mode 100644
index 0000000000..a2d0ef2f0f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..80d56b44b0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Light.eps
new file mode 100644
index 0000000000..22750d19a9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NextJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nginx-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nginx-eps-converted-to.pdf
new file mode 100644
index 0000000000..ed120287e0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nginx-eps-converted-to.pdf
@@ -0,0 +1,72 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x]RIn0 |!n@Crh(iSMR9p#Aϧǣ%0"2D糩utV|o4kLBI=gr(U\d&)iHZw"3nO9}.}ka#!y&Y*G& d_7ALjȱN)A/qBƎT#6BG;Y{zW{APCAL)`B,!A8?Q0%`qT >^-&T35QN!6zL~k='zyڧL" Q=&8hXҵP{i~~Geendstream
+endobj
+6 0 obj
+343
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:21:58+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:21:58+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:ad413479-143f-11ef-0000-6264b987948e'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132158+02'00')
+/ModDate(D:20240514132158+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000890 00000 n
+0000002212 00000 n
+0000000831 00000 n
+0000000717 00000 n
+0000000285 00000 n
+0000000698 00000 n
+0000000954 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<80111CB5CA82E172B62B2EC0FB161974><80111CB5CA82E172B62B2EC0FB161974>]
+>>
+startxref
+2337
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nginx.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nginx.eps
new file mode 100644
index 0000000000..dc15d72453
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nginx.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..c49c17e74a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Dark.eps
new file mode 100644
index 0000000000..9d62f8b65f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..3220db1934
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Light.eps
new file mode 100644
index 0000000000..0503c3262d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nim-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..b0f277a221
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Dark.eps
new file mode 100644
index 0000000000..c0c3286930
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..004d238308
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Light.eps
new file mode 100644
index 0000000000..b5a8523f65
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Nix-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..72319324a2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Dark.eps
new file mode 100644
index 0000000000..ba1d50e3c2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..c0b8e6033d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Light.eps
new file mode 100644
index 0000000000..0f51d6b856
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NodeJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..6977052452
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Dark.eps
new file mode 100644
index 0000000000..9d1f6496b9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..ca18223ec1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Light.eps
new file mode 100644
index 0000000000..d2155264eb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Notion-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..92f722042c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Dark.eps
new file mode 100644
index 0000000000..c67d371b4f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..82afe8a6b6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Light.eps
new file mode 100644
index 0000000000..d0679a4f87
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Npm-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..24b16f19d4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Dark.eps
new file mode 100644
index 0000000000..24d9bdf215
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..dc0f0e3945
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Light.eps
new file mode 100644
index 0000000000..6671c9f529
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_NuxtJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OCaml-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_OCaml-eps-converted-to.pdf
new file mode 100644
index 0000000000..7ccb9562ea
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OCaml-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OCaml.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_OCaml.eps
new file mode 100644
index 0000000000..18cd354e7d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OCaml.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..8c1df55f55
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Dark.eps
new file mode 100644
index 0000000000..e82467c792
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..423d806bef
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Light.eps
new file mode 100644
index 0000000000..3dae072040
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Obsidian-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..ce0297bf1c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Dark.eps
new file mode 100644
index 0000000000..fd2b37febe
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f61cdf54ad
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Light.eps
new file mode 100644
index 0000000000..099fb4174b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Octave-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..999815acab
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Dark.eps
new file mode 100644
index 0000000000..1563aa00dd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a0d5a9d347
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Light.eps
new file mode 100644
index 0000000000..457e91ec23
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenCV-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenShift-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenShift-eps-converted-to.pdf
new file mode 100644
index 0000000000..d9346b773b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenShift-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenShift.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenShift.eps
new file mode 100644
index 0000000000..829cacddd0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenShift.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a14960e554
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Dark-eps-converted-to.pdf
@@ -0,0 +1,77 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x}SAn1 {)"7,9?tծ X1ь[%j~ֺ-9B8ߟnR:V}
+&u/ YJ=[՗ٔm#j,kܥ2|<BCJt*fV%
+rNl+ ҔIQtk4Yk(Aq"PR$/
+L!66Y7F҃pApE7MNI u(x
+DYƞehd)! 2/QhWdCM#fSpiF {=h~3G1izL;'
+^1DK#Ho7@VckjBY6e7DZa-{6&|c|0/"Dy>k0p>eMendstream
+endobj
+6 0 obj
+417
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:17+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:17+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:b8945ff9-143f-11ef-0000-42db723814c0'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132217+02'00')
+/ModDate(D:20240514132217+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000964 00000 n
+0000002286 00000 n
+0000000905 00000 n
+0000000791 00000 n
+0000000285 00000 n
+0000000772 00000 n
+0000001028 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<6BFBF67C784A0C67ABF4AC57B5DC43EA><6BFBF67C784A0C67ABF4AC57B5DC43EA>]
+>>
+startxref
+2411
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Dark.eps
new file mode 100644
index 0000000000..d7f66b6633
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..249ceea3ab
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Light-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x}R10
+)(y""CY..`3Kq8#Ʌ8HՅ=
+q#N.%?׾3qAM.x=3ձ@i1J)W:3mu#3uwHKP*:Y0ȭ4b8_m<V&iRoW]'Ld[:%!*u
+#JiNf(\QͰ]#?ĀK#w2,ܺ\'ؿE:zOFFŖCl˅ D]fd7\mN<"rȆ?D1oxjw7DˍZ#Z=i[>*kg GR156Lendstream
+endobj
+6 0 obj
+414
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:18+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:18+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:b92cf679-143f-11ef-0000-55eefeaa6718'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132218+02'00')
+/ModDate(D:20240514132218+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000961 00000 n
+0000002283 00000 n
+0000000902 00000 n
+0000000788 00000 n
+0000000285 00000 n
+0000000769 00000 n
+0000001025 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<4B3333D88114217777019C5912217D50><4B3333D88114217777019C5912217D50>]
+>>
+startxref
+2408
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Light.eps
new file mode 100644
index 0000000000..f5f8c43faf
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_OpenStack-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..ed6859ea4c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Dark.eps
new file mode 100644
index 0000000000..403698f999
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f89132bd08
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Light.eps
new file mode 100644
index 0000000000..5650e63ab3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PHP-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Perl-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Perl-eps-converted-to.pdf
new file mode 100644
index 0000000000..bae36ad8ab
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Perl-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Perl.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Perl.eps
new file mode 100644
index 0000000000..038aa1c3b4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Perl.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Photoshop-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Photoshop-eps-converted-to.pdf
new file mode 100644
index 0000000000..ff79dee8f4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Photoshop-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Photoshop.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Photoshop.eps
new file mode 100644
index 0000000000..013fc93d85
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Photoshop.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..456261ac45
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Dark.eps
new file mode 100644
index 0000000000..fadfd3b9ba
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..dd0a918eaa
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Light.eps
new file mode 100644
index 0000000000..557d56dd36
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PhpStorm-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..199a4b60b2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Dark.eps
new file mode 100644
index 0000000000..690785b7b0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..aa320f699a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Light.eps
new file mode 100644
index 0000000000..a2b3994495
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pinia-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a534947504
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Dark.eps
new file mode 100644
index 0000000000..7a63955b42
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..17b23e36ad
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Light.eps
new file mode 100644
index 0000000000..ea684811e1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pkl-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..b910a94312
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Dark.eps
new file mode 100644
index 0000000000..2fea477678
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a54bbf6021
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Light.eps
new file mode 100644
index 0000000000..d4d195a996
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Plan9-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..1e882887bf
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Dark.eps
new file mode 100644
index 0000000000..a01d662273
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..4edc705aed
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Light-eps-converted-to.pdf
@@ -0,0 +1,76 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xUQKn! s "~Fv[_4F}Hc7e~% gIt.˽&^ia(
+5oi><0A0Pt?r+ \V2D^hTrkTzcov1Uapu
+* vy5P[]kl%DCiJ+gk՗nPǠgjR$$fO< /v2m!~
+f(*]iC&
+RwHzmendstream
+endobj
+6 0 obj
+267
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:32+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:32+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:c1853179-143f-11ef-0000-d2a1f615688a'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132232+02'00')
+/ModDate(D:20240514132232+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000814 00000 n
+0000002136 00000 n
+0000000755 00000 n
+0000000641 00000 n
+0000000285 00000 n
+0000000622 00000 n
+0000000878 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<CA601CED247D5BA4CFD18B4F50535480><CA601CED247D5BA4CFD18B4F50535480>]
+>>
+startxref
+2261
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Light.eps
new file mode 100644
index 0000000000..18b19d2c21
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PlanetScale-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..b49c8e5287
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Dark-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x9 E{N f8Ɯ!H'(JE}גcKz&22s@.S)U*^6,WOv21u9ObYv..y(! v<xq`JB6|;ָM
+V)c,"!e:Z e.K}jtUiٛ
+@xaUpa9=sendstream
+endobj
+6 0 obj
+193
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:33+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:33+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:c21dc7f9-143f-11ef-0000-f3e78ec3ceea'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132233+02'00')
+/ModDate(D:20240514132233+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000740 00000 n
+0000002062 00000 n
+0000000681 00000 n
+0000000567 00000 n
+0000000285 00000 n
+0000000548 00000 n
+0000000804 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<CF685D63F20291188B68CEDB92103D0F><CF685D63F20291188B68CEDB92103D0F>]
+>>
+startxref
+2187
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Dark.eps
new file mode 100644
index 0000000000..20b8ed579d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..71ecbd5379
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Light-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x; D{N {h?ERl_(Q>*7`%-q X|5bQN&.GȻX&;j`KDl8l{0X%!>vk\u„Sf,GLGcR&}pS
+*-{SP!ǔ*8-_
+rj{>sendstream
+endobj
+6 0 obj
+194
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:34+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:34+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:c2b65e79-143f-11ef-0000-ab49e726f3b3'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132234+02'00')
+/ModDate(D:20240514132234+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000741 00000 n
+0000002063 00000 n
+0000000682 00000 n
+0000000568 00000 n
+0000000285 00000 n
+0000000549 00000 n
+0000000805 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<FD6D8016CB701F989050C854DFA57B86><FD6D8016CB701F989050C854DFA57B86>]
+>>
+startxref
+2188
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Light.eps
new file mode 100644
index 0000000000..ee37a24a4e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pnpm-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..6ad727aa95
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Dark.eps
new file mode 100644
index 0000000000..31b334e161
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..7a16b5ebea
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Light.eps
new file mode 100644
index 0000000000..94380203e8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PostgreSQL-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Postman-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Postman-eps-converted-to.pdf
new file mode 100644
index 0000000000..fc441be28b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Postman-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Postman.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Postman.eps
new file mode 100644
index 0000000000..21197318b0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Postman.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..ec2fe9f2fa
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Dark.eps
new file mode 100644
index 0000000000..cd7fff3790
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..3022992615
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Light.eps
new file mode 100644
index 0000000000..b160b7c00e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Powershell-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Premiere-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Premiere-eps-converted-to.pdf
new file mode 100644
index 0000000000..add20ad1d1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Premiere-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Premiere.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Premiere.eps
new file mode 100644
index 0000000000..a9e5ce3b9a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Premiere.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Prisma-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Prisma-eps-converted-to.pdf
new file mode 100644
index 0000000000..eb708de0ae
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Prisma-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Prisma.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Prisma.eps
new file mode 100644
index 0000000000..ae7237af6d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Prisma.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..488a480d37
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Dark-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xMAn D>O<8AW]=REh7~q __1y3aI`gISg.)j/"']+:ґp,m\h6mwK ~20mś%Mj//=eXkN<NfY}*JӸ9ɭ){W}ʆL
+e/:,\
+nX3qMÓY 7FXendstream
+endobj
+6 0 obj
+231
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:42+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:42+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:c77b1279-143f-11ef-0000-297ed21add61'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132242+02'00')
+/ModDate(D:20240514132242+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000778 00000 n
+0000002100 00000 n
+0000000719 00000 n
+0000000605 00000 n
+0000000285 00000 n
+0000000586 00000 n
+0000000842 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<205D28A55DF50ECEAA21DE8A1A34E712><205D28A55DF50ECEAA21DE8A1A34E712>]
+>>
+startxref
+2225
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Dark.eps
new file mode 100644
index 0000000000..a6564ba0a4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..8cc9067805
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Light-eps-converted-to.pdf
@@ -0,0 +1,73 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xMAn0E tE#D"Y^&vFQ$d;{2+buJ#UjԙO<e^\ %lw,xOW)6xއ"
+ؖţXҸv(¥SʒF-:z6ʤOocXR.޲EgƎa?#$LL )$ȬJ5Xendstream
+endobj
+6 0 obj
+228
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:43+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:43+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:c813a8f9-143f-11ef-0000-5b9f8bf91f3e'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132243+02'00')
+/ModDate(D:20240514132243+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000775 00000 n
+0000002097 00000 n
+0000000716 00000 n
+0000000602 00000 n
+0000000285 00000 n
+0000000583 00000 n
+0000000839 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<D1E24EB79A1DFF5CF31DE424C51D0B83><D1E24EB79A1DFF5CF31DE424C51D0B83>]
+>>
+startxref
+2222
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Light.eps
new file mode 100644
index 0000000000..7c041c10cb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Processing-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Prometheus-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Prometheus-eps-converted-to.pdf
new file mode 100644
index 0000000000..7d4da67313
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Prometheus-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Prometheus.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Prometheus.eps
new file mode 100644
index 0000000000..cda66e4b0b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Prometheus.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..d6b0d8bffd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Dark.eps
new file mode 100644
index 0000000000..afc1686b8e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..14162be23a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Light.eps
new file mode 100644
index 0000000000..ce96daf3b5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Pug-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..072199629b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Dark.eps
new file mode 100644
index 0000000000..6af9b5c6e2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..78420a03e2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Light.eps
new file mode 100644
index 0000000000..90f40c04db
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyCharm-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..98caa42d81
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Dark.eps
new file mode 100644
index 0000000000..6be51006cb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..76678b9cd6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Light-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xeQKn%1> c,:yJRS"P{}׎-08ncԯ"~P|~ d,ԫL;+܏PV%3II[,,vi\Яך,n)aO}ԴCBC%AJrtiy@h^ ՝R7:C,
+:Ct[,7b8ya *1ΙƑ6@cM9h?*ҲyDf "J C&5qZx<ׯ
+!t λZjCxnd^xrb([, Aa_<gϰ b){?&\endstream
+endobj
+6 0 obj
+374
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:50+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:50+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:cc3fc679-143f-11ef-0000-301f98f61832'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132250+02'00')
+/ModDate(D:20240514132250+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000921 00000 n
+0000002243 00000 n
+0000000862 00000 n
+0000000748 00000 n
+0000000285 00000 n
+0000000729 00000 n
+0000000985 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<BECE75A013B819E010A4EDACBF6FFBCD><BECE75A013B819E010A4EDACBF6FFBCD>]
+>>
+startxref
+2368
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Light.eps
new file mode 100644
index 0000000000..7000f9377a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_PyTorch-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..61b138b419
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Dark.eps
new file mode 100644
index 0000000000..5b3a1e1771
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..60485ba5fc
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Light.eps
new file mode 100644
index 0000000000..178210a911
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Python-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..aaa3a5fd11
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Dark.eps
new file mode 100644
index 0000000000..6ac64f7644
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2e6dbf01f1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Light.eps
new file mode 100644
index 0000000000..72d8bb5b1d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_QT-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..9caf2149d0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Dark.eps
new file mode 100644
index 0000000000..056db29f08
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..68e2371062
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Light.eps
new file mode 100644
index 0000000000..aab97cfd5a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_R-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..2fd186122a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Dark.eps
new file mode 100644
index 0000000000..abccfc2449
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..9788224a94
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Light.eps
new file mode 100644
index 0000000000..ef2e094be5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ROS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..f0ef1356c4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Dark.eps
new file mode 100644
index 0000000000..4decf8b158
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2a11876374
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Light-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmSK1}pa,-/hiW_tan6v`bLzdEx}7U"D 9}d&\vaFaVX(^8;Qj>jQX73 -e&]]3
+#d0-ZC>bi@9JE/?-3էy?0!,Ib"ʨaZCĤ:Td!ð͎pL~3YIj굜V.3g-o /]`dpb5NHi㼦[vVUC}0L.G&趢wl,h].Z|Xi*x끯g="<&`1aL"F=+ƞS\9W&zμz$niDax
+\V;h~k1LKb%r=JR{fsbtJC>ۋendstream
+endobj
+6 0 obj
+493
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:22:56+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:22:56+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:cfd34d79-143f-11ef-0000-d18420bf1de0'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132256+02'00')
+/ModDate(D:20240514132256+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000001040 00000 n
+0000002362 00000 n
+0000000981 00000 n
+0000000867 00000 n
+0000000285 00000 n
+0000000848 00000 n
+0000001104 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<DD9F4AB111CCB2D8A88765E7100C408E><DD9F4AB111CCB2D8A88765E7100C408E>]
+>>
+startxref
+2487
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Light.eps
new file mode 100644
index 0000000000..658deff38f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RabbitMQ-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rails-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rails-eps-converted-to.pdf
new file mode 100644
index 0000000000..c7842e6fb4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rails-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rails.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rails.eps
new file mode 100644
index 0000000000..498410bd4f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rails.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..7eebd49c0f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Dark.eps
new file mode 100644
index 0000000000..daa8e8beca
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..0c96aaabe9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Light.eps
new file mode 100644
index 0000000000..7184ba8c91
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RaspberryPi-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..83a7f9e3fa
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Dark.eps
new file mode 100644
index 0000000000..3c6480924b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f885766199
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Light.eps
new file mode 100644
index 0000000000..0f0b6cfd12
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_React-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..801b4c7825
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Dark.eps
new file mode 100644
index 0000000000..e00bc531fc
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2471bf3bc9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Light.eps
new file mode 100644
index 0000000000..b96465dfc4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ReactiveX-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..6553fdeb20
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Dark.eps
new file mode 100644
index 0000000000..694700980b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..221c4fc06f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Light.eps
new file mode 100644
index 0000000000..a1849795a4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RedHat-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..19d61c1ba7
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Dark.eps
new file mode 100644
index 0000000000..13df8aac4c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..e98ba1420d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Light.eps
new file mode 100644
index 0000000000..0f18c843c6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redis-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Redux-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redux-eps-converted-to.pdf
new file mode 100644
index 0000000000..a8f12e95d5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redux-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Redux.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redux.eps
new file mode 100644
index 0000000000..3738a9bec3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Redux.eps
@@ -0,0 +1,8471 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 256 256
+%%HiResBoundingBox: 0.00 0.00 256.00 256.00
+%%Creator: (Zamzar)
+%%LanguageLevel: 2
+%%CreationDate: D:20240513225524Z00'00'
+%%Pages: 1
+%%Copyright: (Zamzar)
+%%EndComments
+%%BeginProlog
+/DSC_OPDFREAD true def
+/SetPageSize false def
+/EPS2Write true def
+currentdict/DSC_OPDFREAD known{
+currentdict/DSC_OPDFREAD get
+}{
+false
+}ifelse
+10 dict begin
+/DSC_OPDFREAD exch def
+/this currentdict def
+/y 720 def
+/ebuf 200 string def
+/prnt{
+36//this/y get moveto//ebuf cvs show
+//this/y 2 copy get 12 sub put
+}bind def
+/newline{
+36//this/y get moveto
+//this/y 2 copy get 12 sub put
+}bind def
+errordict/handleerror
+{systemdict begin
+$error begin
+newerror
+{(%%[ Error handled by opdfread.ps : )print errorname//ebuf cvs print(; OffendingCommand: )
+print/command load//ebuf cvs print( ]%%)= flush
+/newerror false store vmstatus pop pop 0 ne
+{grestoreall
+}if
+errorname(VMerror)ne
+{showpage
+}if
+initgraphics
+0 720 moveto
+errorname(VMerror)eq
+{//this/ehsave known
+{clear//this/ehsave get restore 2 vmreclaim
+}if
+vmstatus exch pop exch pop
+}
+/Courier 12 selectfont
+{
+(ERROR: )//prnt exec errorname//prnt exec
+(OFFENDING COMMAND: )//prnt exec
+/command load//prnt exec
+$error/ostack known{
+(%%[STACK:)=
+(STACK:)//prnt exec
+$error/ostack get aload length{
+//newline exec
+dup mark eq{
+(-mark-)dup = show
+}{
+dup type/nametype eq{
+dup xcheck not{
+(/)show
+(/)print
+}if
+}if
+dup =//ebuf cvs show
+}ifelse
+}repeat
+}if
+}ifelse
+(%%]%)=
+//systemdict/showpage get exec
+quit
+}if
+end
+end
+}bind readonly put
+end
+50 dict begin
+/DefaultSwitch
+{
+dup where{
+pop pop
+}{
+false def
+}ifelse
+}bind def
+/=string 256 string def
+/=only{
+//=string cvs print
+}bind def
+/HexDigits(0123456789ABCDEF)readonly def
+/PrintHex
+{8{
+dup -28 bitshift 15 and//HexDigits exch 1 getinterval//=only exec
+4 bitshift
+}repeat
+pop
+}bind def
+/PDFR_DEBUG DefaultSwitch
+/PDFR_DUMP DefaultSwitch
+/PDFR_STREAM DefaultSwitch
+/TTFDEBUG DefaultSwitch
+/RotatePages DefaultSwitch
+/FitPages DefaultSwitch
+/CenterPages DefaultSwitch
+/SetPageSize DefaultSwitch
+/error
+{
+counttomark 1 sub -1 0{
+index dup type/arraytype eq{==}{=only}ifelse
+}for
+()=
+cleartomark
+....Undefined
+}bind def
+//SetPageSize{
+//RotatePages//FitPages or//CenterPages or{
+mark(/RotatePages, /FitPages and CenterPages are not allowed with /SetPageSize)//error exec
+}if
+}
+{
+//FitPages//CenterPages and{
+mark(CenterPages is not allowed with /FitPages)//error exec
+}if
+}
+ifelse
+/knownget
+{
+2 copy known{
+get true
+}{
+pop pop false
+}ifelse
+}bind def
+/IsUpper
+{dup(A)0 get ge exch(Z)0 get le and
+}bind def
+/cpa2g{
+dup length array
+0 1 2 index length 1 sub{
+dup 3 index exch get cp2g
+3 copy put pop pop
+}for
+exch pop
+}bind def
+/cpd2g{
+dup length dict exch{
+cp2g 2 index 3 1 roll put
+}forall
+}bind def
+/cps2g{
+dup length string copy
+}bind def
+/cp2gprocs
+<</arraytype//cpa2g/dicttype//cpd2g/packedarraytype//cpa2g/stringtype//cps2g >>
+def
+/cp2g{
+dup gcheck not{
+dup//cp2gprocs 1 index type
+2 copy known{
+get currentglobal 3 1 roll true setglobal exec exch setglobal
+1 index wcheck not{readonly}if
+1 index xcheck{cvx}if
+exch pop
+}{
+pop pop
+}ifelse
+}if
+}bind def
+/BlockBuffer 65535 string def
+/PDFReader currentdict def
+/ObjectRegistryMaxLength 50000 def
+/ObjectRegistry 10 dict def
+ObjectRegistry
+begin
+0 ObjectRegistryMaxLength dict def
+end
+/CurrentObject null def
+/DoneDocumentStructure false def
+/GraphicState 20 dict begin
+/InitialTextMatrix matrix def
+/InitialMatrix matrix currentmatrix def
+currentdict end def
+/TempMatrix matrix def
+/GraphicStateStack 20 array def
+/GraphicStateStackPointer 0 def
+/InitialTextMatrixStack 20 array def
+/InitialTextMatrixStackPointer 0 def
+/PDFColorSpaces 50 dict def
+/InstalledFonts 50 dict def
+/MacRomanEncodingInverse null def
+currentglobal false setglobal
+userdict/PDFR_InitialGS gstate put
+userdict/PDFR_Patterns 50 dict put
+userdict/FuncDataReader 10 dict put
+setglobal
+/InitialExtGState 20 dict begin
+/BG2 currentblackgeneration cp2g def
+/UCR2 currentundercolorremoval cp2g def
+/TR2 currentglobal false setglobal[currentcolortransfer]exch setglobal cp2g def
+/HT currenthalftone cp2g def
+currentdict end readonly def
+/InitialGraphicState 20 dict begin
+/FontSize 0 def
+/CharacterSpacing 0 def
+/TextLeading 0 def
+/TextRenderingMode 0 def
+/WordSpacing 0 def
+currentdict end readonly def
+/SimpleColorSpaceNames 15 dict begin
+/DeviceGray true def
+/DeviceRGB true def
+/DeviceCMYK true def
+currentdict end readonly def
+/1_24_bitshift_1_sub 1 24 bitshift 1 sub def
+/ReadFontProcs 10 dict def
+/GetObject
+{
+dup ObjectRegistryMaxLength idiv
+//PDFReader/ObjectRegistry get exch knownget{
+exch knownget
+}{
+pop false
+}ifelse
+}bind def
+/PutObject
+{
+1 index ObjectRegistryMaxLength idiv
+//PDFReader/ObjectRegistry get 1 index knownget{
+exch pop
+3 1 roll put
+}{
+//PDFReader/ObjectRegistry get dup
+begin
+1 index ObjectRegistryMaxLength dict def
+end
+exch get
+3 1 roll put
+}ifelse
+}bind def
+/Register
+{
+1 index GetObject{
+dup xcheck{
+4 3 roll pop
+//PDFR_DEBUG{
+(Have a daemon for )print 2 index ==
+}if
+exec
+}{
+dup null ne{
+mark(The object )4 index(is already defined : )4 index//error exec
+}{
+pop
+}ifelse
+3 2 roll
+exec
+}ifelse
+}{
+3 2 roll
+exec
+}ifelse
+PutObject
+}bind def
+/IsRegistered
+{
+GetObject{
+null ne
+}{
+false
+}ifelse
+}bind def
+/GetRegistered
+{
+dup GetObject not{
+exch mark exch(Object )exch( isn't defined before needed (1).)//error exec
+}if
+dup xcheck{
+exch mark exch(Object )exch( isn't defined before needed (2).)//error exec
+}{
+dup null eq{
+exch mark exch(Object )exch( isn't defined before needed (3).)//error exec
+}if
+exch pop
+}ifelse
+}bind def
+/StandardFontNames<<
+/Times-Roman true
+/Helvetica true
+/Courier true
+/Symbol true
+/Times-Bold true
+/Helvetica-Bold true
+/Courier-Bold true
+/ZapfDingbats true
+/Times-Italic true
+/Helvetica-Oblique true
+/Courier-Oblique true
+/Times-BoldItalic true
+/Helvetica-BoldOblique true
+/Courier-BoldOblique true
+>>def
+/CleanAllResources
+{//PDFR_DEBUG{
+(CleanAllResources beg)=
+}if
+//PDFReader/ObjectRegistry get{
+dup length 0 exch 1 exch 1 sub{
+2 copy get dup xcheck{
+pop pop
+}{
+dup null eq{
+pop pop
+}{
+dup type/dicttype eq{/.Global known}{pop false}ifelse{
+pop
+}{
+//PDFR_DEBUG{
+(Dropping )print dup =
+}if
+1 index exch/DroppedObject put
+}ifelse
+}ifelse
+}ifelse
+}for
+pop
+}forall
+FontDirectory length dict begin
+FontDirectory{
+pop
+dup//StandardFontNames exch known not{
+dup null def
+}if
+pop
+}forall
+currentdict
+end{
+pop
+//PDFR_DEBUG{
+(Undefining font )print dup =
+}if
+undefinefont
+}forall
+//PDFR_DEBUG{
+(CleanAllResources end)=
+}if
+}bind def
+/PrintReference
+{
+//PDFR_DEBUG{
+({ )print
+dup{
+=only( )print
+}forall
+( })=
+}if
+}bind def
+/R
+{
+0 ne{
+exch mark exch(A referred object generation )exch( isn't 0.)//error exec
+}if
+[
+exch//GetRegistered/exec load
+]cvx
+//PrintReference exec
+}bind def
+/IsObjRef
+{
+dup type/arraytype eq{
+dup length 3 eq{
+dup xcheck exch
+dup 0 get type/integertype eq 3 2 roll and exch
+dup 1 get//GetRegistered eq 3 2 roll and exch
+2 get/exec load eq and
+}{
+pop false
+}ifelse
+}{
+pop false
+}ifelse
+}bind def
+/DoNothing
+{
+}def
+/RunTypeDaemon
+{
+dup type/dicttype eq{
+dup/Type//knownget exec{
+//PDFReader/TypeDaemons get exch
+//knownget exec{
+exec
+}if
+}if
+}if
+}bind def
+/obj
+{
+//PDFR_DEBUG{
+(Defining )print 1 index =only( )print dup =only( obj)=
+}if
+0 ne{
+exch mark exch(An object generation )exch( isn't 0.)//error exec
+}if
+}bind def
+/endobj
+{
+//PDFR_DEBUG{
+(endobj )=
+}if
+count 1 eq{
+pop
+}{
+dup type/dicttype eq{
+dup/.endobj_daemon//knownget exec{
+//PDFR_DEBUG{(.endobj_daemon for )print 2 index =}if
+exec
+}if
+}if
+dup type/dicttype eq{dup/ImmediateExec known}{false}ifelse{
+pop pop
+}{
+//PDFR_DEBUG{
+(Storing )print 1 index =
+}if
+//RunTypeDaemon exec
+//DoNothing 3 1 roll//Register exec
+}ifelse
+}ifelse
+}bind def
+/StoreBlock
+{
+//PDFR_DEBUG{
+(StoreBlock )print//PDFReader/BlockCount get =only(, Length = )print dup length =
+}if
+dup length string copy
+//PDFReader/BlockCount get exch
+//PDFReader/CurrentObject get 3 1 roll
+put
+//PDFReader/BlockCount get 1 add
+//PDFReader exch/BlockCount exch put
+}bind def
+/CheckLength
+{dup type/integertype ne{
+mark(Object length isn't an integer.)//error exec
+}if
+}bind def
+/ResolveD
+{
+3 copy pop get
+dup//IsObjRef exec{
+//PDFR_DEBUG{
+(Resolving )print//PrintReference exec
+}if
+exec
+exch exec
+}{
+exch pop
+}ifelse
+dup 4 1 roll
+put
+}bind def
+/ResolveA
+{2 index 2 index get
+dup//IsObjRef exec{
+exec
+exch exec
+3 copy put
+}{
+exch pop
+}ifelse
+exch pop exch pop
+}bind def
+/StoreStream
+{
+dup//PDFReader exch/CurrentObject exch put
+//PDFReader/BlockCount 0 put
+dup/Length//CheckLength//ResolveD exec
+//PDFR_DEBUG{
+(StoreStream Length = )print dup =
+}if
+currentfile exch()/SubFileDecode filter
+{dup//BlockBuffer readstring{
+//StoreBlock exec
+}{
+//StoreBlock exec
+exit
+}ifelse
+}loop
+pop
+//PDFReader/CurrentObject null put
+//PDFR_DEBUG{
+(StoreStream end.)=
+}if
+}bind def
+/MakeStreamDumper
+{
+//PDFR_DEBUG{
+(MakeStreamDumper beg.)=
+}if
+currentglobal exch dup gcheck setglobal
+[exch
+1 dict dup/c 0 put exch
+1024 string
+{readstring pop
+(StreamDumper )print 1 index/c get =string cvs print( )print
+dup length =string cvs print( <)print dup print(>\n)print
+dup length
+3 2 roll
+dup/c get
+3 2 roll
+add/c exch put
+}/exec load
+]
+cvx 0()/SubFileDecode filter
+exch setglobal
+//PDFR_DEBUG{
+(MakeStreamDumper end.)=
+}if
+}bind def
+/ShortFilterNames 15 dict begin
+/AHx/ASCIIHexDecode def
+/A85/ASCII85Decode def
+/LZW/LZWDecode def
+/Fl/FlateDecode def
+/RL/RunLengthDecode def
+/CCF/CCITTFaxDecode def
+/DCT/DCTDecode def
+currentdict end readonly def
+/AppendFilters
+{
+//PDFR_DEBUG{
+(AppendFilters beg.)=
+}if
+dup 3 1 roll
+/Filter//knownget exec{
+dup type/nametype eq{
+dup//ShortFilterNames exch//knownget exec{
+exch pop
+}if
+2 index/DecodeParms//knownget exec{
+exch
+}if
+filter
+}{
+dup 0 exch 1 exch length 1 sub{
+2 copy get
+dup//ShortFilterNames exch//knownget exec{
+exch pop
+}if
+3 1 roll
+4 index/DecodeParms//knownget exec{
+exch get
+}{
+pop null
+}ifelse
+dup null eq{
+pop 3 1 roll filter exch
+}{
+3 1 roll
+4 1 roll filter exch
+}ifelse
+}for
+pop
+}ifelse
+//PDFR_DEBUG//PDFR_DUMP and{
+//MakeStreamDumper exec
+}if
+}if
+exch pop
+//PDFR_DEBUG{
+(AppendFilters end.)=
+}if
+}bind def
+/ExecuteStream
+{
+dup//PDFReader exch/CurrentObject exch put
+dup/Length//CheckLength//ResolveD exec
+//PDFR_DEBUG{
+(ExecuteStream id = )print 2 index =only( Length = )print dup =
+}if
+//PDFReader/InitialGraphicState get
+//PDFReader/GraphicState get copy pop
+//PDFReader/Operators get begin
+currentfile exch()/SubFileDecode filter
+1 index//AppendFilters exec
+cvx mark exch
+exec
+counttomark 0 ne{
+mark(Data left on ostack after an immediate stream execution.)//error exec
+}if
+cleartomark
+end
+//PDFR_DEBUG{
+(ExecuteStream end.)=
+}if
+//PDFReader/CurrentObject null put
+dup/IsPage known{
+dup/Context get/NumCopies//knownget exec{
+1 sub{
+copypage
+}repeat
+}if
+EPS2Write not{showpage}if
+}if
+}bind def
+/stream
+{
+//PDFR_DEBUG{
+1 index =only( stream)=
+}if
+1 index GetObject{
+dup xcheck{
+exec
+1 index null PutObject
+}{
+pop
+}ifelse
+}if
+dup/ImmediateExec known{
+dup/GlobalExec//knownget exec{
+currentglobal 4 1 roll
+setglobal
+//ExecuteStream exec
+3 2 roll setglobal
+}{
+//ExecuteStream exec
+}ifelse
+}{
+//StoreStream exec
+}ifelse
+dup/.CleanResources//knownget exec{
+/All eq{
+//CleanAllResources exec
+}if
+}if
+}bind def
+/HookFont
+{
+//PDFR_DEBUG{
+(Loaded the font )print dup/FontName get =
+}if
+{
+dup/FontFileType get dup/Type1 eq exch/MMType1 eq or{
+dup/FontName get
+//PDFReader/RemoveFontNamePrefix get exec
+findfont
+exit
+}if
+dup/FontFileType get/TrueType eq{
+//PDFReader/MakeType42 get exec
+//PDFR_DEBUG{
+(Font dict <<)=
+dup{
+1 index/sfnts eq{
+exch pop
+(/sfnts [)print
+{
+(-string\()print length//=only exec(\)- )=
+}forall
+(])=
+}{
+exch//=only exec( )print ==
+}ifelse
+}forall
+(>>)=
+}if
+dup/FontName get exch definefont
+exit
+}if
+mark(FontHook has no proc for )2 index/FontFileType get//error exec
+}loop
+/Font exch put
+}bind def
+/endstream
+{
+}bind def
+/xref
+{
+//PDFR_DEBUG{
+(xref)=
+//PDFR_DUMP{
+//PDFReader/ObjectRegistry get ==
+}if
+}if
+end
+count 0 ne{
+mark(Excessive data on estack at the end of the interpretation.)//error exec
+}if
+currentfile 1(%%EOF)/SubFileDecode filter
+flushfile
+cleardictstack
+}bind def
+/ResolveDict
+{dup{
+pop 1 index exch
+//DoNothing//ResolveD exec
+pop
+}forall
+pop
+}bind def
+/SetupPageView
+{
+//PDFR_DEBUG{
+(SetupPageView beg)=
+}if
+//DSC_OPDFREAD not{
+//GraphicState/InitialMatrix get setmatrix
+}if
+/MediaBox get aload pop
+3 index neg 3 index neg translate
+3 -1 roll sub 3 1 roll exch sub exch
+userdict/.HWMargins//knownget exec{
+aload pop
+}{
+currentpagedevice/.HWMargins//knownget exec{
+aload pop
+}{
+0 0 0 0
+}ifelse
+}ifelse
+currentpagedevice/PageSize get aload pop
+3 -1 roll sub 3 1 roll exch sub exch
+exch 3 index sub exch 3 index sub
+//SetPageSize{
+//PDFR_DEBUG{
+(Setting page size to )print 1 index//=only exec( )print dup =
+}if
+pop pop 3 index 3 index 2 copy
+currentglobal false setglobal 3 1 roll
+currentpagedevice dup/PageSize known{
+/PageSize get aload pop
+}{
+0 0
+}ifelse
+round cvi 2 index round cvi eq
+exch round cvi 3 index round cvi eq and
+{
+//PDFR_DEBUG{(PageSize matches request)== flush}if
+pop pop
+}{
+/MediaRequested where{
+//PDFR_DEBUG{(MediaRequested is true, check against new request)== flush}if
+/MediaRequested get aload pop
+round cvi 2 index round cvi eq
+exch round cvi 3 index round cvi eq and
+{
+//PDFR_DEBUG{(MediaRequested same as current request, ignore)== flush}if
+pop pop false
+}{
+//PDFR_DEBUG{(MediaRequested different to current request)== flush}if
+true
+}ifelse
+}{
+//PDFR_DEBUG{(No MediaRequested yet)== flush}if
+true
+}ifelse
+{
+//PDFR_DEBUG{(Setting pagesize)== flush}if
+2 array astore
+dup/MediaRequested exch def
+<< exch/PageSize exch >>setpagedevice
+}if
+}ifelse
+userdict/PDFR_InitialGS gstate put
+setglobal
+}if
+//RotatePages{
+2 copy gt 6 index 6 index gt ne{
+1 index 5 index le 1 index 5 index le and not
+}{
+false
+}ifelse
+}{
+false
+}ifelse
+{//CenterPages{
+//PDFR_DEBUG{
+(Rotating page, and then centering it)==
+}if
+90 rotate
+0 5 index neg translate
+5 index 1 index exch sub 2 div
+2 index 6 index sub 2 div neg
+translate
+}{
+//FitPages{
+1 index 5 index div 1 index 7 index div
+2 copy gt{
+exch
+}if
+pop dup scale
+}if
+90 rotate
+0 5 index neg translate
+}ifelse
+}{
+//CenterPages{
+//PDFR_DEBUG{
+(Ccentering page)==
+}if
+1 index 6 index sub 2 div
+1 index 6 index sub 2 div
+translate
+}{
+//FitPages{
+1 index 6 index div 1 index 6 index div
+2 copy gt{
+exch
+}if
+pop dup scale
+}if
+}ifelse
+}ifelse
+pop pop
+translate
+pop pop
+//PDFR_DEBUG{
+(SetupPageView end)=
+}if
+}bind def
+/PageContentsDaemon
+{
+//PDFR_DEBUG{
+(Executing PageContentsDaemon for )print 2 index =
+}if
+1 index exch/Context exch put
+dup/ImmediateExec true put
+dup/IsPage true put
+SetPageSize{dup/Context get//SetupPageView exec}if
+}bind def
+/FontFileDaemon
+{
+//PDFR_DEBUG{
+(Executing FontFileDaemon for )print 2 index =
+}if
+dup/FontFileType get
+2 index exch
+dup//ReadFontProcs exch//knownget exec{
+exch pop exec
+}{
+mark(FontFile reader for )2 index( isn't implemented yet.)//error exec
+}ifelse
+//PDFR_DEBUG{
+(FontFileDaemon end)=
+}if
+pop
+}bind def
+/FontDescriptorDaemon
+{
+//PDFR_DEBUG{
+(Executing FontDescriptorDaemon for )print 2 index =
+}if
+2 copy/FontResource exch put
+/Subtype get 1 index exch/FontFileType exch put
+}bind def
+/UnPDFEscape{
+dup dup length string cvs
+dup(#)search{
+{
+pop
+(16#--)2 index 0 2 getinterval
+1 index 3 2 getinterval copy pop
+cvi
+0 exch put
+0
+1 index 2 1 index length 2 sub getinterval
+3 copy putinterval
+length
+3 copy exch put
+getinterval
+(#)search not{
+pop exit
+}if
+}loop
+(\0)search pop exch pop exch pop
+cvn
+exch pop
+}{
+pop pop
+}ifelse
+}bind def
+/TypeDaemons<<
+/Page
+{//PDFR_DEBUG{
+(Recognized a page.)=
+}if
+dup/Contents//knownget exec{
+0 get//DoNothing exch
+[
+3 index//PageContentsDaemon/exec load
+]cvx
+//Register exec
+}{
+(fixme: page with no Contents won't be printed.)=
+}ifelse
+}bind
+/FontDescriptor
+{//PDFR_DEBUG{
+(Recognized a font descriptor.)=
+}if
+dup/FontName//knownget exec{
+1 index/FontName 3 -1 roll//UnPDFEscape exec put
+}if
+dup dup/FontFile known{/FontFile}{/FontFile2}ifelse
+//knownget exec{
+0 get//DoNothing exch
+[
+3 index//FontFileDaemon/exec load
+]cvx
+//Register exec
+}{
+(Font descriptor )print 1 index =only( has no FontFile.)=
+}ifelse
+}bind
+/Font
+{//PDFR_DEBUG{
+(Recognized a font resource.)=
+}if
+dup/BaseFont//knownget exec{
+//UnPDFEscape exec 2 copy/BaseFont exch put
+//PDFReader/RemoveFontNamePrefix get exec
+currentglobal exch
+dup/Font resourcestatus{
+pop pop
+//PDFReader/GetInstalledFont get exec pop
+}{
+pop
+}ifelse
+setglobal
+}if
+dup/FontDescriptor//knownget exec{
+0 get
+dup//IsRegistered exec{
+//PDFR_DEBUG{
+(already registered )print dup =
+}if
+pop
+}{
+//DoNothing exch
+[
+3 index//FontDescriptorDaemon/exec load
+]cvx
+//Register exec
+}ifelse
+}if
+}bind
+>>def
+/MakeStreamReader
+{dup
+[
+exch
+//PDFR_DEBUG{
+(Stream proc )
+/print load
+//PDFR_STREAM{
+(<)
+/print load
+}if
+}if
+1 dict dup/i -1 put
+/dup load
+/i
+/get load
+1
+/add load
+/dup load
+3
+1
+/roll load
+/i
+/exch load
+/put load
+//knownget
+/exec load
+/not load
+{()}
+/if load
+//PDFR_DEBUG{
+//PDFR_STREAM{
+/dup load
+/print load
+(>)
+/print load
+}if
+( end of stream proc.\n)
+/print load
+}if
+]cvx
+//PDFR_DEBUG{
+(Stream reader )print dup ==
+}if
+0()/SubFileDecode filter
+exch//AppendFilters exec
+}bind def
+/RunDelayedStream
+{
+//GraphicState/InitialTextMatrix get
+//InitialTextMatrixStack//PDFReader/InitialTextMatrixStackPointer get
+2 copy get null eq{
+2 copy currentglobal true setglobal matrix exch setglobal put
+}if
+get copy pop
+//PDFReader/InitialTextMatrixStackPointer 2 copy get 1 add put
+//MakeStreamReader exec
+mark exch
+cvx exec
+counttomark 0 ne{
+mark(Data left on ostack after a delayed stream execution.)//error exec
+}if
+cleartomark
+//PDFReader/InitialTextMatrixStackPointer 2 copy get 1 sub put
+//InitialTextMatrixStack//PDFReader/InitialTextMatrixStackPointer get get
+//GraphicState/InitialTextMatrix get
+copy pop
+}bind def
+//ReadFontProcs begin
+/Type1
+{//PDFR_DEBUG{
+(ReadFontProcs.Type1)=
+}if
+dup/.endobj_daemon[4 index//HookFont/exec load]cvx put
+dup/ImmediateExec true put
+/GlobalExec true put
+}bind def
+/MMType1//Type1 def
+/TrueType
+{//PDFR_DEBUG{
+(ReadFontProcs.TrueType)=
+}if
+dup/.endobj_daemon[4 index//HookFont/exec load]cvx put
+pop
+}bind def
+end
+/.opdloadttfontdict 50 dict def
+.opdloadttfontdict begin
+/maxstring 65400 def
+end
+/.InsertionSort
+{
+/CompareProc exch def
+/Array exch def
+1 1 Array length 1 sub
+{
+/Ix exch def
+/Value1 Array Ix get def
+/Jx Ix 1 sub def
+{
+Jx 0 lt{
+exit
+}if
+/Value2 Array Jx get def
+Value1 Value2 CompareProc{
+exit
+}if
+Array Jx 1 add Value2 put
+/Jx Jx 1 sub def
+}loop
+Array Jx 1 add Value1 put
+}for
+Array
+}bind def
+/putu16{
+3 copy -8 bitshift put
+exch 1 add exch 16#ff and put
+}bind def
+/putu32{
+3 copy -16 bitshift putu16
+exch 2 add exch 16#ffff and putu16
+}bind def
+/.readtable{
+dup dup 1 and add string
+dup 0 4 -1 roll getinterval
+3 -1 roll exch
+dup()ne{readstring}if pop pop
+}bind def
+/.readbigtable{
+dup maxstring lt{
+.readtable
+}{
+currentuserparams/VMReclaim get -2 vmreclaim
+[4 2 roll{
+dup maxstring le{exit}if
+1 index maxstring string readstring pop 3 1 roll maxstring sub
+}loop .readtable]
+exch vmreclaim
+}ifelse
+}bind def
+/ReadTTF
+{
+.opdloadttfontdict begin
+/TTFontFile exch def
+/TableDir TTFontFile 12 string readstring pop def
+/tables TTFontFile TableDir 4 getu16 16 mul string readstring pop def
+/tabarray tables length 16 idiv array def
+TableDir 0 4 getinterval(ttcf)eq{
+QUIET not{(Can't handle TrueType font Collections.)=}if
+/.loadttfonttables cvx/invalidfont signalerror
+}{
+0 16 tables length 1 sub{
+dup
+tables exch 16 getinterval
+exch 16 div cvi exch
+tabarray 3 1 roll put
+}for
+}ifelse
+tabarray{exch 8 getu32 exch 8 getu32 gt}.InsertionSort pop
+/Read TableDir length tables length add def
+/tabs[
+tabarray{
+dup 8 getu32
+Read sub
+dup 0 gt{
+dup string TTFontFile exch readstring pop pop
+Read add/Read exch def
+}{
+pop
+}ifelse
+12 getu32
+dup Read add
+/Read exch def
+TTFontFile exch .readbigtable
+}forall
+]def
+end
+}bind def
+/GetLocaType
+{
+0 1 tabarray length 1 sub{
+dup tabarray exch get
+0 4 getinterval(head)eq{
+tabs exch get
+50 gets16
+/LocaType exch def
+exit
+}{
+pop
+}ifelse
+}for
+}bind def
+/GetNumGlyphs
+{
+0 1 tabarray length 1 sub{
+dup tabarray exch get
+0 4 getinterval(maxp)eq{
+tabs exch get
+4 getu16
+/NumGlyphs exch def
+exit
+}{
+pop
+}ifelse
+}for
+}bind def
+/StringToLoca
+{
+/LocaIndex exch def
+/StringOffset 0 def
+{
+dup length StringOffset gt{
+dup
+LocaType 1 eq{
+StringOffset getu32
+LocaArray LocaIndex 3 -1 roll put
+/LocaIndex LocaIndex 1 add def
+/StringOffset StringOffset 4 add
+def
+}{
+StringOffset getu16 2 mul
+LocaArray length LocaIndex gt{
+LocaArray LocaIndex 3 -1 roll put
+}{
+pop
+}ifelse
+/LocaIndex LocaIndex 1 add def
+/StringOffset StringOffset 2 add
+def
+}ifelse
+}{
+pop
+LocaIndex
+exit
+}ifelse
+}loop
+}bind def
+/GetSortedLoca
+{
+NumGlyphs 1 add array/LocaArray exch def
+0 1 tabarray length 1 sub{
+dup tabarray exch get
+0 4 getinterval(loca)eq{
+tabs exch get
+exit
+}{
+pop
+}ifelse
+}for
+dup type/stringtype eq{
+0 StringToLoca pop
+}{
+0 exch
+{
+exch StringToLoca
+}forall
+pop
+}ifelse
+LocaArray{gt}.InsertionSort pop
+}bind def
+/GetWorkingString
+{
+WorkString 0
+GlyfArray GlyfStringIndex get
+putinterval
+/WorkBytes GlyfArray GlyfStringIndex get length def
+/GlyfStringIndex GlyfStringIndex 1 add def
+}bind def
+/GetWorkingBytes
+{
+/BytesToRead exch def
+WorkString 0 BytesToRead getinterval
+dup length string copy
+WorkString BytesToRead WorkBytes BytesToRead sub getinterval
+dup length string copy
+WorkString 0 3 -1 roll putinterval
+/WorkBytes WorkBytes BytesToRead sub def
+}bind def
+/GetGlyfBytes
+{
+/ToRead exch def
+WorkBytes 0 eq{
+GetWorkingString
+}if
+WorkBytes ToRead ge{
+ToRead string dup 0
+ToRead GetWorkingBytes putinterval
+}{
+ToRead string
+dup
+0
+WorkString 0 WorkBytes getinterval
+putinterval
+dup
+WorkBytes
+ToRead WorkBytes sub
+GetWorkingString
+GetWorkingBytes
+putinterval
+}ifelse
+}bind def
+/SplitGlyf
+{
+/GlyfArray exch def
+/DestArray GlyfArray length 2 mul array def
+/DestArrayIndex 0 def
+/LastLoca 0 def
+/NextLocaIndex 0 def
+/LastLocaIndex 0 def
+/GlyfStringIndex 0 def
+/WorkString maxstring string def
+/WorkBytes 0 def
+{
+LocaArray NextLocaIndex get
+LastLoca sub maxstring gt
+{
+LocaArray LastLocaIndex get LastLoca sub
+GetGlyfBytes
+DestArray DestArrayIndex 3 -1 roll put
+/DestArrayIndex DestArrayIndex 1 add def
+LocaArray LastLocaIndex get/LastLoca exch def
+}{
+/LastLocaIndex NextLocaIndex def
+/NextLocaIndex NextLocaIndex 1 add def
+NextLocaIndex NumGlyphs gt
+{
+WorkBytes
+GlyfStringIndex GlyfArray length lt{
+GlyfArray GlyfStringIndex get length
+add string dup
+0
+WorkString 0 WorkBytes getinterval
+putinterval
+dup
+WorkBytes
+GetWorkingString
+WorkString 0 WorkBytes getinterval
+putinterval
+}{
+pop
+WorkString 0 WorkBytes getinterval
+}ifelse
+dup length string copy
+DestArray DestArrayIndex 3 -1 roll put
+exit
+}if
+}ifelse
+}loop
+DestArray
+}bind def
+/ProcessTTData
+{
+.opdloadttfontdict begin
+0 1 tabarray length 1 sub{
+/ix exch def
+tabarray ix get
+12 getu32 dup maxstring le{
+dup 4 mod 0 ne{
+4 div cvi 1 add 4 mul string/newstring exch def
+/oldstring tabs ix get def
+newstring 0 oldstring putinterval
+0 1 newstring length oldstring length sub 1 sub{
+newstring exch oldstring length add 0 put
+}for
+tabs ix newstring put
+}{
+pop
+}ifelse
+}{
+dup 4 mod 0 ne{
+dup maxstring idiv maxstring mul sub
+4 idiv 1 add 4 mul string/newstring exch def
+tabs ix get
+dup length 1 sub dup/iy exch def get/oldstring exch def
+newstring 0 oldstring putinterval
+0 1 newstring length oldstring length sub 1 sub{
+newstring exch oldstring length add 0 put
+}for
+tabs ix get iy newstring put
+}{
+pop
+}ifelse
+}ifelse
+}for
+0 1 tabarray length 1 sub{
+dup tabarray exch get
+dup 12 getu32 maxstring gt{
+0 4 getinterval dup(glyf)eq{
+pop
+GetLocaType
+GetNumGlyphs
+GetSortedLoca
+dup tabs exch get
+SplitGlyf
+tabs 3 1 roll put
+}{
+(Warning, table )print print( > 64Kb\n)print
+pop
+}ifelse
+}{
+pop
+pop
+}ifelse
+}for
+end
+}bind def
+/Makesfnts
+{
+.opdloadttfontdict begin
+0
+tabs{
+dup type/stringtype eq{
+pop
+1 add
+}{
+{
+type/stringtype eq{
+1 add
+}if
+}forall
+}ifelse
+}forall
+1 add
+/TTOffset
+TableDir length
+tabarray length 16 mul add
+def
+0
+tabarray{
+exch dup 1 add
+3 1 roll
+dup
+tabs exch get
+dup type/stringtype eq{
+length
+2 index exch
+TTOffset
+dup 3 1 roll add
+/TTOffset exch def
+8 exch putu32
+exch tabarray 3 1 roll
+put
+}{
+0 exch
+{
+dup type/stringtype eq{
+length add
+}{
+pop
+}ifelse
+}forall
+2 index exch
+TTOffset
+dup 3 1 roll add
+/TTOffset exch def
+8 exch putu32
+exch tabarray 3 1 roll
+put
+}ifelse
+}forall
+pop
+array
+dup 0
+TableDir length
+tables length add
+string
+dup 0 TableDir putinterval
+dup 12 tables putinterval
+put
+dup
+/ix 1 def
+tabs{
+dup type/stringtype eq{
+ix exch
+put dup
+/ix ix 1 add def
+}{
+{
+dup type/stringtype eq{
+ix exch put dup
+/ix ix 1 add def
+}{
+pop
+}ifelse
+}forall
+}ifelse
+}forall
+pop
+end
+}bind def
+/MakeType42
+{
+//PDFR_DEBUG{
+(MakeType42 beg)=
+}if
+10 dict begin
+/FontName 1 index/FontName get def
+/FontType 42 def
+/FontMatrix[1 0 0 1 0 0]def
+/FontBBox 1 index/FontBBox get def
+dup/FontResource get
+dup/Encoding known{
+//PDFReader/ObtainEncoding get exec
+/Encoding get
+}{
+pop null
+}ifelse
+/PDFEncoding exch def
+/CharStrings 2 index//PDFReader/MakeTTCharStrings get exec def
+/sfnts 2 index//MakeStreamReader exec
+ReadTTF
+ProcessTTData
+Makesfnts
+def
+/Encoding StandardEncoding def
+/PaintType 0 def
+currentdict end
+//PDFR_DEBUG{
+(MakeType42 end)=
+}if
+}bind def
+/GetInstalledFont
+{
+dup//InstalledFonts exch knownget{
+exch pop
+}{
+dup findfont dup 3 1 roll
+//InstalledFonts 3 1 roll put
+}ifelse
+}bind def
+/RemoveFontNamePrefix
+{//=string cvs true
+0 1 5{
+2 index exch get//IsUpper exec not{
+pop false exit
+}if
+}for
+{(+)search{
+pop pop
+}if
+}if
+cvn
+}bind def
+/CheckFont
+{dup/Type get/Font ne{
+mark(Resource )3 index( must have /Type/Font .)//error exec
+}if
+}bind def
+/CheckEncoding
+{dup type/nametype ne{
+dup/Type get/Encoding ne{
+mark(Resource )3 index( must have /Type/Encoding .)//error exec
+}if
+}if
+}bind def
+/ObtainEncoding
+{dup/Encoding known{
+dup dup/Encoding//CheckEncoding//ResolveD exec
+dup type dup/arraytype eq exch/packedarraytype eq or{
+pop pop
+}{
+dup type/nametype eq{
+/Encoding findresource
+}{
+dup/BaseEncoding//knownget exec not{
+/StandardEncoding
+}if
+/Encoding findresource
+exch
+/Differences//knownget exec{
+exch dup length array copy exch
+0 exch
+{
+dup type/integertype eq{
+exch pop
+}{
+3 copy put pop
+1 add
+}ifelse
+}forall
+pop
+}if
+}ifelse
+/Encoding exch put
+}ifelse
+}{
+dup/Encoding/StandardEncoding/Encoding findresource put
+}ifelse
+}bind def
+/ObtainMetrics
+{dup/Widths//knownget exec{
+1 index/Encoding get
+256 dict
+3 index/Subtype get/TrueType eq{
+1000
+}{
+1
+}ifelse
+4 index/MissingWidth//knownget exec not{
+0
+}if
+5 index/FirstChar//knownget exec not{
+0
+}if
+6 5 roll
+dup 0 exch 1 exch length 1 sub{
+2 copy get
+exch 3 index add
+7 index exch get
+dup dup null ne exch/.notdef ne and{
+6 index 3 1 roll exch
+6 index div
+3 copy pop//knownget exec{
+0 eq
+}{
+true
+}ifelse
+{put
+}{
+pop pop pop
+}ifelse
+}{
+pop pop
+}ifelse
+}for
+pop pop pop pop exch pop
+1 index exch/Metrics exch put
+}{
+dup/MissingWidth//knownget exec{
+256 dict
+2 index/Encoding get{
+dup null ne{
+3 copy 3 2 roll put
+}if
+pop
+}forall
+exch pop
+1 index exch/Metrics exch put
+}if
+}ifelse
+}bind def
+/NotDef
+{
+FontMatrix aload pop pop pop exch pop exch pop
+1 exch div exch
+1 exch div exch
+1 index 0 setcharwidth
+0 setlinewidth
+0 0 moveto
+2 copy rlineto
+1 index 0 rlineto
+neg exch neg exch rlineto
+closepath stroke
+}bind def
+/SaveResourcesToStack
+{
+[
+//PDFReader/OldResources known{
+//PDFReader/OldResources get
+}{
+null
+}ifelse
+//PDFReader/CurrentObject get/Context get/Resources get
+]
+//PDFReader/OldResources 3 -1 roll put
+}bind def
+/RestoreResourcesFromStack
+{
+//PDFReader/OldResources get dup
+0 get//PDFReader/OldResources 3 -1 roll put
+1 get//PDFReader/CurrentObject get/Context get/Resources 3 -1 roll put
+}bind def
+/BuildChar
+{//PDFR_DEBUG{
+(BuildChar )print dup//=only exec( )print
+}if
+exch begin
+Encoding exch get
+//PDFR_DEBUG{
+dup =
+}if
+dup null eq{
+pop//NotDef exec
+}
+{
+CharProcs exch//knownget exec
+{
+currentfont/Font get/Resources//knownget exec{
+exec
+SaveResourcesToStack
+//PDFReader/CurrentObject get/Context get
+/Resources 3 -1 roll put
+//RunDelayedStream exec
+RestoreResourcesFromStack
+}{
+//RunDelayedStream exec
+}ifelse
+}
+{
+//NotDef exec
+}ifelse
+}ifelse
+end
+}bind def
+/printdict
+{(<<)=
+{exch = ==}forall
+(>>)=
+}bind def
+/printfont
+{
+dup{
+exch dup =
+dup/Encoding eq{
+pop =
+}{
+dup/FontInfo eq exch/Private eq or{
+//printdict exec
+}{
+==
+}ifelse
+}ifelse
+}forall
+}bind def
+/ScaleMetrics
+{1 index{
+2 index div
+3 index
+3 1 roll put
+}forall
+pop
+}bind def
+/ResolveAndSetFontAux
+{exch dup
+//PDFReader/CurrentObject get/Context get/Resources get
+/Font//DoNothing//ResolveD exec
+exch//CheckFont//ResolveD exec
+dup/Font//knownget exec{
+exch pop exch pop
+}{
+{
+dup/Subtype get dup dup/Type1 eq exch/TrueType eq or exch/MMType1 eq or{
+exch pop
+dup/BaseFont get
+//RemoveFontNamePrefix exec
+//PDFR_DEBUG{
+(Font )print dup =
+}if
+1 index/FontDescriptor known{
+//PDFR_DEBUG{
+(Font from a font descriptor.)=
+}if
+1 index
+/FontDescriptor//DoNothing//ResolveD exec
+/Font//knownget exec{
+exch pop
+}{
+//PDFR_DEBUG{
+(Font descriptor has no Font resolved.)=
+}if
+//GetInstalledFont exec
+}ifelse
+}{
+//GetInstalledFont exec
+}ifelse
+exch
+dup/Encoding known not{
+1 index/Encoding get 1 index exch/Encoding exch put
+}if
+//ObtainEncoding exec
+//ObtainMetrics exec
+exch
+dup length dict copy
+dup 2 index/Encoding get
+/Encoding exch put
+1 index/Metrics//knownget exec{
+2 index/Subtype get/TrueType ne{
+1 index/FontMatrix get 0 get
+dup 0 eq{
+pop
+1 index/FontMatrix get 1 get
+dup 0 eq{pop 1}if
+}if
+0.001 div
+//ScaleMetrics exec
+}{
+1 index/sfnts known not{
+1 index/FontMatrix get 0 get
+dup 0 eq{
+pop
+1 index/FontMatrix get 1 get
+dup 0 eq{pop 1}if
+}if
+//ScaleMetrics exec
+}if
+}ifelse
+1 index exch/Metrics exch put
+}if
+1 index/BaseFont get
+exch
+dup/FID undef
+dup/UniqueID undef
+definefont
+dup 3 1 roll
+/Font exch put
+exit
+}if
+dup/Subtype get/Type3 eq{
+//ObtainEncoding exec
+2 copy exch/FontName exch put
+dup/CharProcs get//ResolveDict exec
+dup/FontType 3 put
+dup/BuildChar//BuildChar put
+dup dup/Font exch put
+dup 3 1 roll
+definefont
+2 copy ne{
+2 copy/Font exch put
+}if
+exch pop
+exit
+}if
+dup/Subtype get/Type0 eq{
+}if
+dup/Subtype get/CIDFontType0 eq{
+}if
+dup/Subtype get/CIDFontType2 eq{
+}if
+mark(Unknown font type )2 index/Subtype get//error exec
+}loop
+}ifelse
+exch scalefont setfont
+}bind def
+/ResolveAndSetFont
+{
+//ResolveAndSetFontAux exec
+}bind def
+/.knownget
+{2 copy known{
+get true
+}{
+pop pop false
+}ifelse
+}bind def
+/.min
+{2 copy lt{
+exch
+}if
+pop
+}bind def
+/.max
+{2 copy gt{
+exch
+}if
+pop
+}bind def
+/.dicttomark
+{>>
+}bind def
+/getu16{
+2 copy get 8 bitshift 3 1 roll 1 add get add
+}bind def
+/gets16{
+getu16 16#8000 xor 16#8000 sub
+}bind def
+/getu32{
+2 copy getu16 16 bitshift 3 1 roll 2 add getu16 add
+}bind def
+/gets32{
+2 copy gets16 16 bitshift 3 1 roll 2 add getu16 add
+}bind def
+/cmapformats mark
+0{
+6 256 getinterval{}forall 256 packedarray
+}bind
+2{
+/sHK_sz 2 def
+/sH_sz 8 def
+dup 2 getu16/cmapf2_tblen exch def
+dup 4 getu16/cmapf2_lang exch def
+dup 6 256 sHK_sz mul getinterval/sHKs exch def
+0
+0 1 255{
+sHKs exch
+2 mul getu16
+1 index
+1 index
+lt{exch}if pop
+}for
+/sH_len exch def
+dup 6 256 sHK_sz mul add
+cmapf2_tblen 1 index sub getinterval
+/sH_gIA exch def
+/cmapf2_glyph_array 65535 array def
+/.cmapf2_putGID{
+/cmapf2_ch cmapf2_ch_hi 8 bitshift cmapf2_ch_lo add def
+firstCode cmapf2_ch_lo le
+cmapf2_ch_lo firstCode entryCount add lt
+and{
+sH_offset idRangeOffset add
+cmapf2_ch_lo firstCode sub 2 mul
+add 6 add
+sH_gIA exch getu16
+dup 0 gt{
+idDelta add
+cmapf2_glyph_array exch cmapf2_ch exch put
+}{
+pop
+}ifelse
+}{
+}ifelse
+}def
+16#00 1 16#ff{
+/cmapf2_ch_hi exch def
+sHKs cmapf2_ch_hi sHK_sz mul getu16
+/sH_offset exch def
+sH_gIA sH_offset sH_sz getinterval
+dup 0 getu16/firstCode exch def
+dup 2 getu16/entryCount exch def
+dup 4 gets16/idDelta exch def
+dup 6 getu16/idRangeOffset exch def
+pop
+sH_offset 0 eq{
+/cmapf2_ch_lo cmapf2_ch_hi def
+/cmapf2_ch_hi 0 def
+.cmapf2_putGID
+}{
+16#00 1 16#ff{
+/cmapf2_ch_lo exch def
+.cmapf2_putGID
+}for
+}ifelse
+}for
+pop
+0 1 cmapf2_glyph_array length 1 sub{
+dup cmapf2_glyph_array exch get
+null eq{cmapf2_glyph_array exch 0 put}{pop}ifelse
+}for
+cmapf2_glyph_array
+}bind
+4{
+/etab exch def
+/nseg2 etab 6 getu16 def
+14/endc etab 2 index nseg2 getinterval def
+2 add
+nseg2 add/startc etab 2 index nseg2 getinterval def
+nseg2 add/iddelta etab 2 index nseg2 getinterval def
+nseg2 add/idroff etab 2 index nseg2 getinterval def
+pop
+/firstcode startc 0 getu16 16#ff00 and dup 16#f000 ne{pop 0}if def
+/lastcode firstcode def
+/striptopbyte false def
+/putglyph{
+glyphs code 3 -1 roll put/code code 1 add def
+}bind def
+/numcodes 0 def/glyphs 0 0 2 nseg2 3 sub{
+/i2 exch def
+/scode startc i2 getu16 def
+/ecode endc i2 getu16 def
+ecode lastcode gt{
+/lastcode ecode def
+}if
+}for pop
+firstcode 16#f000 ge lastcode firstcode sub 255 le and{
+lastcode 255 and
+/striptopbyte true def
+}{
+lastcode
+}ifelse
+1 add
+array def
+glyphs length 1024 ge{
+.array1024z 0 1024 glyphs length 1023 sub{glyphs exch 2 index putinterval}for
+glyphs dup length 1024 sub 3 -1 roll
+putinterval
+}{
+0 1 glyphs length 1 sub{glyphs exch 0 put}for
+}ifelse
+/numcodes 0 def/code 0 def
+0 2 nseg2 3 sub{
+/i2 exch def
+/scode startc i2 getu16 def
+/ecode endc i2 getu16 def
+numcodes scode firstcode sub
+exch sub 0 .max dup/code exch code exch add def
+ecode scode sub 1 add add numcodes add/numcodes exch def
+/delta iddelta i2 gets16 def
+TTFDEBUG{
+(scode=)print scode =only
+( ecode=)print ecode =only
+( delta=)print delta =only
+( droff=)print idroff i2 getu16 =
+}if
+idroff i2 getu16 dup 0 eq{
+pop scode delta add 65535 and 1 ecode delta add 65535 and
+striptopbyte{
+/code scode 255 and def
+}{
+/code scode def
+}ifelse
+{putglyph}for
+}{
+/gloff exch 14 nseg2 3 mul add 2 add i2 add add def
+striptopbyte{
+/code scode 255 and def
+}{
+/code scode def
+}ifelse
+0 1 ecode scode sub{
+2 mul gloff add etab exch getu16
+dup 0 ne{delta add 65535 and}if putglyph
+}for
+}ifelse
+}for glyphs/glyphs null def
+}bind
+6{
+dup 6 getu16/firstcode exch def dup 8 getu16/ng exch def
+firstcode ng add array
+0 1 firstcode 1 sub{2 copy 0 put pop}for
+dup firstcode ng getinterval
+0 1 ng 1 sub{
+dup 2 mul 10 add 4 index exch getu16 3 copy put pop pop
+}for pop exch pop
+}bind
+.dicttomark readonly def
+/cmaparray{
+dup 0 getu16 cmapformats exch .knownget{
+TTFDEBUG{
+(cmap: format )print 1 index 0 getu16 = flush
+}if exec
+}{
+(Can't handle format )print 0 getu16 = flush
+0 1 255{}for 256 packedarray
+}ifelse
+TTFDEBUG{
+(cmap: length=)print dup length = dup ==
+}if
+}bind def
+/postremap mark
+/Cdot/Cdotaccent
+/Edot/Edotaccent
+/Eoverdot/Edotaccent
+/Gdot/Gdotaccent
+/Ldot/Ldotaccent
+/Zdot/Zdotaccent
+/cdot/cdotaccent
+/edot/edotaccent
+/eoverdot/edotaccent
+/gdot/gdotaccent
+/ldot/ldotaccent
+/zdot/zdotaccent
+.dicttomark readonly def
+/get_from_stringarray
+{1 index type/stringtype eq{
+get
+}{
+exch{
+2 copy length ge{
+length sub
+}{
+exch get exit
+}ifelse
+}forall
+}ifelse
+}bind def
+/getinterval_from_stringarray
+{
+2 index type/stringtype eq{
+getinterval
+}{
+string exch 0
+4 3 roll{
+dup length
+dup 4 index lt{
+3 index exch sub
+exch pop 3 1 roll exch pop
+}{
+dup 3 1 roll
+4 index sub
+5 index length 4 index sub
+2 copy gt{exch}if pop
+dup 3 1 roll
+5 index exch getinterval
+5 index 4 index 3 index
+getinterval
+copy pop
+exch pop add exch pop 0 exch
+dup 3 index length ge{exit}if
+}ifelse
+}forall
+pop pop
+}ifelse
+}bind def
+/string_array_size
+{dup type/stringtype eq{
+length
+}{
+0 exch{length add}forall
+}ifelse
+}bind def
+/postformats mark
+16#00010000{
+pop MacGlyphEncoding
+}
+16#00020000{
+dup dup type/arraytype eq{0 get}if length 36 lt{
+TTFDEBUG{(post format 2.0 invalid.)= flush}if
+pop[]
+}{
+/postglyphs exch def
+/post_first postglyphs dup type/arraytype eq{0 get}if def
+post_first 32 getu16/numglyphs exch def
+/glyphnames numglyphs 2 mul 34 add def
+/postpos glyphnames def
+/total_length postglyphs//string_array_size exec def
+numglyphs array 0 1 numglyphs 1 sub{
+postpos total_length ge{
+1 numglyphs 1 sub{1 index exch/.notdef put}for
+exit
+}if
+postglyphs postpos//get_from_stringarray exec
+postglyphs postpos 1 add 2 index//getinterval_from_stringarray exec cvn
+exch postpos add 1 add/postpos exch def
+2 index 3 1 roll
+put
+}for
+/postnames exch def
+numglyphs array 0 1 numglyphs 1 sub{
+dup 2 mul 34 add postglyphs exch 2//getinterval_from_stringarray exec
+dup 0 get 8 bitshift exch 1 get add dup 258 lt{
+MacGlyphEncoding exch get
+}{
+dup 32768 ge{
+pop/.notdef
+}{
+258 sub dup postnames length ge{
+TTFDEBUG{( *** warning: glyph index past end of 'post' table)= flush}if
+pop
+exit
+}if
+postnames exch get
+postremap 1 index .knownget{exch pop}if
+}ifelse
+}ifelse
+2 index 3 1 roll put
+}for
+}
+ifelse
+}bind
+16#00030000{
+pop[]
+}bind
+.dicttomark readonly def
+/first_post_string
+{
+post dup type/arraytype eq{0 get}if
+}bind def
+/.getpost{
+/glyphencoding post null eq{
+TTFDEBUG{(post missing)= flush}if[]
+}{
+postformats first_post_string 0 getu32 .knownget{
+TTFDEBUG{
+(post: format )print
+first_post_string
+dup 0 getu16 =only(,)print 2 getu16 = flush
+}if
+post exch exec
+}{
+TTFDEBUG{(post: unknown format )print post 0 getu32 = flush}if[]
+}ifelse
+}ifelse def
+}bind def
+/MacRomanEncoding[
+StandardEncoding 0 39 getinterval aload pop
+/quotesingle
+StandardEncoding 40 56 getinterval aload pop
+/grave
+StandardEncoding 97 31 getinterval aload pop
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave
+/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde
+/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
+/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
+/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
+/questiondown/exclamdown/logicalnot/.notdef
+/florin/.notdef/.notdef/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright
+/quoteleft/quoteright/divide/.notdef
+/ydieresis/Ydieresis/fraction/currency
+/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase
+/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex
+/Idieresis/Igrave/Oacute/Ocircumflex
+/.notdef/Ograve/Uacute/Ucircumflex
+/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+]/Encoding defineresource pop
+/TTParser<<
+/Pos 0
+/post null
+>>def
+/readu8
+{read not{
+mark(Insufficient data in the stream.)//error exec
+}if
+}bind def
+/readu16
+{dup//readu8 exec 8 bitshift exch//readu8 exec or
+}bind def
+/reads16
+{//readu16 exec 16#8000 xor 16#8000 sub
+}bind def
+/readu32
+{dup//readu16 exec 16 bitshift exch//readu16 exec or
+}bind def
+/reads32
+{dup//reads16 exec 16 bitshift exch//readu16 exec or
+}bind def
+/SkipToPosition
+{dup//TTParser/Pos get
+exch//TTParser exch/Pos exch put
+sub
+//PDFR_DEBUG{
+(Skipping )print dup//=only exec( bytes.)=
+}if
+dup 0 eq{
+pop pop
+}{
+dup 3 1 roll
+()/SubFileDecode filter
+exch
+{1 index//BlockBuffer readstring pop length
+dup 0 eq{pop exch pop exit}if
+sub
+}loop
+0 ne{
+mark(Insufficient data in the stream for SkipToPosition.)//error exec
+}if
+}ifelse
+}bind def
+/TagBuffer 4 string def
+/ParseTTTableDirectory
+{//PDFR_DEBUG{
+(ParseTTTableDirectory beg)=
+}if
+15 dict begin
+dup//readu32 exec 16#00010000 ne{
+mark(Unknown True Type version.)//error exec
+}if
+dup//readu16 exec/NumTables exch def
+dup//readu16 exec/SearchRange exch def
+dup//readu16 exec/EntrySelector exch def
+dup//readu16 exec/RangeShift exch def
+//PDFR_DEBUG{
+(NumTables = )print NumTables =
+}if
+NumTables{
+dup//TagBuffer readstring not{
+mark(Could not read TT tag.)//error exec
+}if
+cvn
+[2 index//readu32 exec pop
+2 index//readu32 exec
+3 index//readu32 exec
+]
+//PDFR_DEBUG{
+2 copy exch//=only exec( )print ==
+}if
+def
+}repeat
+pop
+//TTParser/Pos 12 NumTables 16 mul add put
+currentdict end
+//PDFR_DEBUG{
+(ParseTTTableDirectory end)=
+}if
+}bind def
+/ParseTTcmap
+{//PDFR_DEBUG{
+(ParseTTcmap beg)=
+}if
+/cmap get aload pop
+3 1 roll
+7 dict begin
+//PDFR_DEBUG{
+(Current position = )print//TTParser/Pos get =
+(cmap position = )print dup =
+}if
+1 index exch//SkipToPosition exec
+//TTParser/Pos get/TablePos exch def
+dup//readu16 exec pop
+dup//readu16 exec/NumEncodings exch def
+//PDFR_DEBUG{
+(NumEncodings = )print NumEncodings =
+}if
+null
+NumEncodings{
+1 index//readu32 exec
+2 index//readu32 exec
+3 array dup 3 2 roll 0 exch put
+2 index null ne{
+dup 0 get 3 index 0 get sub
+3 index exch 1 exch put
+}if
+dup 4 3 roll pop 3 1 roll
+def
+}repeat
+dup 0 get
+4 3 roll exch sub
+1 exch put
+//PDFR_DEBUG{
+currentdict{
+exch dup type/integertype eq{
+//PrintHex exec( )print ==
+}{
+pop pop
+}ifelse
+}forall
+}if
+4 NumEncodings 8 mul add/HeaderLength exch def
+//TTParser/Pos//TTParser/Pos get HeaderLength add put
+0
+NumEncodings{
+16#7FFFFFF null
+currentdict{
+1 index type/integertype eq{
+exch pop dup 0 get
+dup 5 index gt{
+dup 4 index lt{
+4 1 roll
+exch pop exch pop
+}{
+pop pop
+}ifelse
+}{
+pop pop
+}ifelse
+}{
+pop pop
+}ifelse
+}forall
+//PDFR_DEBUG{
+(Obtaining subtable for )print dup ==
+}if
+3 2 roll pop
+3 copy pop
+TablePos add//SkipToPosition exec
+3 copy exch pop 1 get
+//TTParser/Pos//TTParser/Pos get 3 index add put
+string
+readstring not{
+mark(Can't read a cmap subtable.)//error exec
+}if
+2 exch put
+}repeat
+pop pop
+currentdict end
+//PDFR_DEBUG{
+(ParseTTcmap end)=
+}if
+}bind def
+/GetTTEncoding
+{//PDFR_DEBUG{
+(GetTTEncoding beg)=
+}if
+get
+exch pop
+2 get
+10 dict begin
+/TTFDEBUG//PDFR_DEBUG def
+//cmaparray exec
+end
+//PDFR_DEBUG{
+(GetTTEncoding end)=
+dup ==
+}if
+}bind def
+/InverseEncoding
+{
+256 dict begin
+dup length 1 sub -1 0{
+2 copy get
+exch
+1 index currentdict exch//knownget exec{
+dup type/arraytype eq{
+aload length 1 add array astore
+}{
+2 array astore
+}ifelse
+}if
+def
+}for
+pop
+currentdict end
+}bind def
+/GetMacRomanEncodingInverse
+{//PDFReader/MacRomanEncodingInverse get
+dup null eq{
+pop
+MacRomanEncoding//InverseEncoding exec
+dup//PDFReader exch/MacRomanEncodingInverse exch put
+}if
+}bind def
+/PutCharStringSingle
+{
+dup 3 index length lt{
+2 index exch get
+dup 0 ne{
+def
+}{
+pop pop
+}ifelse
+}{
+pop pop
+}ifelse
+}bind def
+/PutCharString
+{1 index type/nametype ne{
+mark(Bad charstring name)//error exec
+}if
+dup type/arraytype eq{
+{
+3 copy//PutCharStringSingle exec
+pop pop
+}forall
+pop
+}{
+//PutCharStringSingle exec
+}ifelse
+}bind def
+/ComposeCharStrings
+{
+//PDFR_DEBUG{
+(ComposeCharStrings beg)=
+}if
+1 index length 1 add dict begin
+/.notdef 0 def
+exch
+//TTParser/post get
+dup null ne{
+exch
+1 index length 1 sub -1 0{
+dup 3 index exch get exch
+dup 0 eq 2 index/.notdef eq or{
+pop pop
+}{
+def
+}ifelse
+}for
+}if
+exch pop exch
+{
+//PutCharString exec
+}forall
+pop
+currentdict end
+//PDFR_DEBUG{
+(ComposeCharStrings end)=
+}if
+}bind def
+/ParseTTpost
+{
+//PDFR_DEBUG{
+(ParseTTpost beg)=
+}if
+/post get aload pop
+3 1 roll
+//PDFR_DEBUG{
+(Current position = )print//TTParser/Pos get =
+(post position = )print dup =
+}if
+1 index exch//SkipToPosition exec
+//TTParser/Pos//TTParser/Pos get 4 index add put
+exch dup 65535 le{
+string
+readstring not{
+mark(Insufficient data in the stream for ParseTTpost.)//error exec
+}if
+}{
+[3 1 roll
+dup 16384 div floor cvi
+exch 1 index 16384 mul
+sub exch
+1 sub 0 1 3 -1 roll
+{
+1 add index
+16384 string readstring not{
+mark(Insufficient data in the stream for ParseTTpost.)//error exec
+}if
+}for
+counttomark -2 roll
+string readstring not{
+mark(Insufficient data in the stream for ParseTTpost.)//error exec
+}if
+]
+}ifelse
+1 dict begin
+/post exch def
+//.getpost exec
+//TTParser/post glyphencoding put
+//PDFR_DEBUG{
+(ParseTTpost end)=
+glyphencoding ==
+}if
+end
+}bind def
+/MakeTTCharStrings
+{//MakeStreamReader exec
+dup dup//ParseTTTableDirectory exec
+//TTParser/post null put
+dup/post//knownget exec{
+0 get
+1 index/cmap get 0 get
+lt{
+2 copy//ParseTTpost exec
+//ParseTTcmap exec
+}{
+2 copy//ParseTTcmap exec
+3 1 roll
+//ParseTTpost exec
+}ifelse
+}{
+//ParseTTcmap exec
+}ifelse
+{
+dup 16#00030001 known{
+//PDFR_DEBUG{
+(Using the TT cmap encoding for Windows Unicode.)=
+}if
+16#00030001//GetTTEncoding exec
+AdobeGlyphList//ComposeCharStrings exec
+exit
+}if
+dup 16#00010000 known{
+//PDFR_DEBUG{
+(Using the TT cmap encoding for Macintosh Roman.)=
+}if
+16#00010000//GetTTEncoding exec
+PDFEncoding dup null eq{
+pop//GetMacRomanEncodingInverse exec
+}{
+//InverseEncoding exec
+}ifelse
+//ComposeCharStrings exec
+exit
+}if
+dup 16#00030000 known{
+//PDFR_DEBUG{
+(Using the TT cmap encoding 3.0 - not sure why Ghostscript writes it since old versions.)=
+}if
+16#00030000//GetTTEncoding exec
+PDFEncoding dup null eq{
+pop//GetMacRomanEncodingInverse exec
+}{
+//InverseEncoding exec
+}ifelse
+//ComposeCharStrings exec
+exit
+}if
+mark(True Type cmap has no useful encodings.)//error exec
+}loop
+//PDFR_DEBUG{
+(CharStrings <<)=
+dup{
+exch
+dup type/nametype eq{
+//=only exec
+}{
+==
+}ifelse
+( )print ==
+}forall
+(>>)=
+}if
+}bind def
+/ScaleVal
+{
+aload pop
+1 index sub
+3 2 roll mul add
+}bind def
+/ScaleArg
+{
+aload pop
+1 index sub
+3 1 roll
+sub exch div
+}bind def
+/ScaleArgN
+{
+dup length 2 sub -2 0{
+2
+2 index 3 1 roll getinterval
+3 2 roll
+exch//ScaleArg exec
+1 index length 2 idiv 1 add 1 roll
+}for
+pop
+}bind def
+/ComputeFunction_10
+{
+//PDFR_DEBUG{
+(ComputeFunction_10 beg )print 1 index//=only exec( stack=)print count =
+}if
+exch
+dup 1 eq{
+pop dup length 1 sub get
+}{
+1 index length 1 sub mul
+dup dup floor sub
+dup 0 eq{
+pop cvi get
+}{
+3 1 roll floor cvi
+2 getinterval
+aload pop
+2 index mul 3 2 roll 1 exch sub 3 2 roll mul add
+}ifelse
+}ifelse
+//PDFR_DEBUG{
+(ComputeFunction_10 end )print dup//=only exec( stack=)print count =
+}if
+}bind def
+/ComputeFunction_n0
+{
+//PDFR_DEBUG{
+(ComputeFunction_n0 beg N=)print dup//=only exec( stack=)print count =
+}if
+dup 0 eq{
+pop
+}{
+dup 2 add -1 roll
+dup 3 index length 1 sub ge{
+pop 1 sub
+exch dup length 1 sub get exch
+//PDFReader/ComputeFunction_n0 get exec
+}{
+dup floor cvi dup
+4 index exch get
+3 index dup
+5 add copy
+6 2 roll
+pop pop pop pop
+1 sub
+//PDFReader/ComputeFunction_n0 get exec
+3 2 roll pop
+exch
+4 3 roll exch
+4 add 2 roll 1 add
+3 2 roll exch get
+exch 1 sub
+//PDFReader/ComputeFunction_n0 get exec
+1 index mul
+3 1 roll
+1 exch sub mul add
+}ifelse
+}ifelse
+//PDFR_DEBUG{
+(ComputeFunction_n0 end )print dup//=only exec( stack=)print count =
+}if
+}bind def
+/FunctionToProc_x01
+{
+dup/Domain get exch
+dup/Data get 0 get exch
+/Size get length
+[4 1 roll
+//PDFR_DEBUG{
+{(function beg, stack =)print count//=only exec(\n)print}/exec load
+5 2 roll
+}if
+dup 1 gt{
+{mark exch
+3 add 2 roll
+//ScaleArgN exec
+counttomark dup
+3 add -2 roll
+pop exch
+//ComputeFunction_n0 exec
+}/exec load
+}{
+pop
+3 1/roll load//ScaleArg/exec load
+/exch load
+//ComputeFunction_10/exec load
+}ifelse
+//PDFR_DEBUG{
+(function end, stack =)/print load/count load//=only/exec load(\n)/print load
+}if
+]cvx
+//PDFR_DEBUG{
+(Made a procedure for the 1-result function :)=
+dup ==
+}if
+}bind def
+/FunctionProcDebugBeg
+{(FunctionProcDebugBeg )print count =
+}bind def
+/FunctionProcDebugEnd
+{(FunctionProcDebugEnd )print count =
+}bind def
+/FunctionToProc_x0n
+{
+PDFR_DEBUG{
+(FunctionToProc_x0n beg m=)print dup =
+}if
+1 index/Size get length exch
+dup 7 mul 2 add array
+PDFR_DEBUG{
+dup 0//FunctionProcDebugBeg put
+}{
+dup 0//DoNothing put
+}ifelse
+dup 1/exec load put
+dup 2 5 index/Domain get put
+2 index 1 eq{
+dup 3//ScaleArg put
+}{
+dup 3//ScaleArgN put
+}ifelse
+dup 4/exec load put
+1 index 1 sub 0 exch 1 exch{
+dup 7 mul 5 add
+1 index 4 index 1 sub ne{
+dup 3 index exch 6 index put 1 add
+dup 3 index exch/copy load put 1 add
+}if
+[
+6 index/Data get 3 index get
+6 index 1 eq{
+//ComputeFunction_10/exec load
+}{
+6 index
+//ComputeFunction_n0/exec load
+}ifelse
+]cvx
+3 index exch 2 index exch put 1 add
+2 index 1 index/exec load put 1 add
+1 index 4 index 1 sub ne{
+2 index 1 index 6 index 1 add put 1 add
+2 index 1 index 1 put 1 add
+2 index 1 index/roll load put
+}if
+pop pop
+}for
+PDFR_DEBUG{
+dup dup length 2 sub//FunctionProcDebugEnd put
+}{
+dup dup length 2 sub//DoNothing put
+}ifelse
+dup dup length 1 sub/exec load put
+cvx exch pop exch pop exch pop
+//PDFR_DEBUG{
+(Made a procedure for the n-argument function :)=
+dup ==
+}if
+PDFR_DEBUG{
+(FunctionToProc_x0n end)=
+}if
+}bind def
+/MakeTableRec
+{
+0
+exec
+}bind def
+/MakeTable
+{//PDFR_DEBUG{
+(MakeTable beg )print count =
+}if
+1 index/Size get exch
+1 sub dup
+3 1 roll
+get
+array
+1 index 0 eq{
+exch pop exch pop
+}{
+dup length 1 sub -1 0{
+3 index 3 index//MakeTableRec exec
+2 index 3 1 roll put
+}for
+exch pop exch pop
+}ifelse
+//PDFR_DEBUG{
+(MakeTable end )print count =
+}if
+}bind def
+//MakeTableRec 0//MakeTable put
+/StoreSample
+{
+1 sub
+dup 0 eq{
+pop
+}{
+-1 1{
+I exch get get
+}for
+}ifelse
+I 0 get 3 2 roll put
+}bind def
+/ReadSample32
+{
+4{
+File read not{
+mark(Insufficient data for function.)//error exec
+}if
+}repeat
+pop
+3 1 roll exch
+256 mul add 256 mul add
+//1_24_bitshift_1_sub div
+}bind def
+/ReadSample
+{
+Buffer BitsLeft BitsPerSample
+{2 copy ge{
+exit
+}if
+3 1 roll
+8 add 3 1 roll
+256 mul File read not{
+mark(Insufficient data for function.)//error exec
+}if
+add
+3 1 roll
+}loop
+sub dup
+2 index exch
+neg bitshift
+2 copy exch bitshift
+4 3 roll exch sub
+/Buffer exch def
+exch/BitsLeft exch def
+Div div
+}bind def
+/ReadSamplesRec
+{0
+exec
+}bind def
+/ReadSamples
+{
+//PDFR_DEBUG{
+(ReadSamples beg )print count =
+}if
+dup 1 eq{
+pop
+0 1 Size 0 get 1 sub{
+I exch 0 exch put
+0 1 M 1 sub{
+dup Range exch 2 mul 2 getinterval
+//PDFR_DEBUG{
+(Will read a sample ... )print
+}if
+BitsPerSample 32 eq{//ReadSample32}{//ReadSample}ifelse
+exec exch//ScaleVal exec
+//PDFR_DEBUG{
+(value=)print dup =
+}if
+exch Table exch get
+Size length//StoreSample exec
+}for
+}for
+}{
+1 sub
+dup Size exch get 0 exch 1 exch 1 sub{
+I exch 2 index exch put
+dup//ReadSamplesRec exec
+}for
+pop
+}ifelse
+//PDFR_DEBUG{
+(ReadSamples end )print count =
+}if
+}bind def
+//ReadSamplesRec 0//ReadSamples put
+/StreamToArray
+{//PDFR_DEBUG{
+(StreamToArray beg )print count =
+}if
+userdict/FuncDataReader get begin
+dup/BitsPerSample get/BitsPerSample exch def
+dup/Size get length/N exch def
+dup/Range get length 2 idiv/M exch def
+1 BitsPerSample bitshift 1 sub/Div exch def
+/BitsLeft 0 def
+/Buffer 0 def
+dup/Size get/Size exch def
+dup/Range get/Range exch def
+/File 1 index//MakeStreamReader exec def
+/I[N{0}repeat]def
+M array
+dup length 1 sub -1 0{
+2 index N//MakeTable exec
+2 index 3 1 roll put
+}for
+/Table exch def
+N//ReadSamples exec
+PDFR_DEBUG{
+(Table = )print Table ==
+}if
+/Data Table put
+end
+//PDFR_DEBUG{
+(StreamToArray end )print count =
+}if
+}bind def
+/FunctionToProc10
+{
+PDFR_DEBUG{
+(FunctionToProc10 beg, Range = )print dup/Range get ==
+}if
+dup/Order//knownget exec{
+1 ne{
+(Underimplemented function Type 0 Order 3.)=
+}if
+}if
+dup//StreamToArray exec
+dup/Range get length dup 2 eq{
+pop//FunctionToProc_x01 exec
+}{
+2 idiv//FunctionToProc_x0n exec
+}ifelse
+PDFR_DEBUG{
+(FunctionToProc10 end)=
+}if
+}bind def
+/FunctionToProc12
+{begin
+currentdict/C0//knownget exec{length 1 eq}{true}ifelse{
+N
+currentdict/C0//knownget exec{
+0 get
+}{
+0
+}ifelse
+currentdict/C1//knownget exec{
+0 get
+}{
+1
+}ifelse
+1 index sub
+[4 1 roll
+{
+4 2 roll
+exp mul add
+}aload pop
+]cvx
+}{
+[
+0 1 C0 length 1 sub{
+N
+C0 2 index get
+C1 3 index get
+4 3 roll pop
+1 index sub
+[/dup load
+5 2 roll
+{
+4 2 roll
+exp mul add
+exch
+}aload pop
+]cvx
+/exec load
+}for
+/pop load
+]cvx
+}ifelse
+end
+//PDFR_DEBUG{
+(FunctionType2Proc : )print dup ==
+}if
+}bind def
+/FunctionToProc14
+{//MakeStreamReader exec cvx exec
+//PDFR_DEBUG{
+(FunctionType4Proc : )print dup ==
+}if
+}bind def
+/FunctionToProc1
+{
+dup/FunctionType get
+{dup 0 eq{
+pop//FunctionToProc10 exec exit
+}if
+dup 2 eq{
+pop//FunctionToProc12 exec exit
+}if
+dup 4 eq{
+pop//FunctionToProc14 exec exit
+}if
+mark exch(Function type )exch( isn't implemented yet.)//error exec
+}loop
+}bind def
+/FunctionToProc20
+{
+PDFR_DEBUG{
+(FunctionToProc20, Range = )print dup/Range get ==
+}if
+dup/Order//knownget exec{
+1 ne{
+(Underimplemented function Type 0 Order 3.)=
+}if
+}if
+dup//StreamToArray exec
+dup/Range get length dup 2 eq{
+pop//FunctionToProc_x01 exec
+}{
+2 idiv//FunctionToProc_x0n exec
+}ifelse
+}bind def
+/FunctionToProc
+{//PDFR_DEBUG{
+(FunctionToProc beg )print count =
+}if
+dup type/dicttype eq{
+dup/Domain get length 2 idiv
+{
+dup 1 eq{
+pop//FunctionToProc1 exec exit
+}if
+dup 2 eq{
+pop//FunctionToProc20 exec exit
+}if
+mark(Functions with many arguments aren't implemented yet.)//error exec
+}loop
+}{
+//PDFR_DEBUG{(Not a function dict, assume already a procedure.)print}if
+}ifelse
+//PDFR_DEBUG{
+(FunctionToProc end )print count =
+}if
+}bind def
+/spotfunctions mark
+/Round{
+abs exch abs 2 copy add 1 le{
+dup mul exch dup mul add 1 exch sub
+}{
+1 sub dup mul exch 1 sub dup mul add 1 sub
+}ifelse
+}
+/Diamond{
+abs exch abs 2 copy add .75 le{
+dup mul exch dup mul add 1 exch sub
+}{
+2 copy add 1.23 le{
+.85 mul add 1 exch sub
+}{
+1 sub dup mul exch 1 sub dup mul add 1 sub
+}ifelse
+}ifelse
+}
+/Ellipse{
+abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt{
+pop dup mul exch .75 div dup mul add 4 div 1 exch sub
+}{
+dup 1 gt{
+pop 1 exch sub dup mul exch 1 exch sub
+.75 div dup mul add 4 div 1 sub
+}{
+.5 exch sub exch pop exch pop
+}ifelse
+}ifelse
+}
+/EllipseA{dup mul .9 mul exch dup mul add 1 exch sub}
+/InvertedEllipseA{dup mul .9 mul exch dup mul add 1 sub}
+/EllipseB{dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub}
+/EllipseC{dup mul .9 mul exch dup mul add 1 exch sub}
+/InvertedEllipseC{dup mul .9 mul exch dup mul add 1 sub}
+/Line{exch pop abs neg}
+/LineX{pop}
+/LineY{exch pop}
+/Square{abs exch abs 2 copy lt{exch}if pop neg}
+/Cross{abs exch abs 2 copy gt{exch}if pop neg}
+/Rhomboid{abs exch abs 0.9 mul add 2 div}
+/DoubleDot{2{360 mul sin 2 div exch}repeat add}
+/InvertedDoubleDot{2{360 mul sin 2 div exch}repeat add neg}
+/SimpleDot{dup mul exch dup mul add 1 exch sub}
+/InvertedSimpleDot{dup mul exch dup mul add 1 sub}
+/CosineDot{180 mul cos exch 180 mul cos add 2 div}
+/Double{exch 2 div exch 2{360 mul sin 2 div exch}repeat add}
+/InvertedDouble{
+exch 2 div exch 2{360 mul sin 2 div exch}repeat add neg
+}
+.dicttomark readonly def
+/CheckColorSpace
+{
+dup type/arraytype ne{
+mark(Resource )3 index( must be an array.)//error exec
+}if
+}bind def
+/SubstitutePDFColorSpaceRec
+{0
+exec
+}bind def
+/SubstitutePDFColorSpace
+{
+{
+dup 0 get/Pattern eq{
+dup length 1 gt{
+dup dup 1//CheckColorSpace//ResolveA exec
+dup type/nametype ne{
+//SubstitutePDFColorSpaceRec exec
+}if
+1 exch put
+}if
+exit
+}if
+dup 0 get/Indexed eq{
+exit
+}if
+dup 0 get/Separation eq{
+dup dup 2//CheckColorSpace//ResolveA exec
+dup type/nametype ne{
+//SubstitutePDFColorSpaceRec exec
+}if
+2 exch put
+exit
+}if
+dup 0 get/CalGray eq{
+1 get
+dup/Gamma//knownget exec{
+[exch[exch/exp load]cvx dup dup]
+1 index exch/DecodeLMN exch put
+}if
+[exch/CIEBasedA exch]
+exit
+}if
+dup 0 get/CalRGB eq{
+1 get
+dup/Matrix//knownget exec{
+1 index exch/MatrixLMN exch put
+}if
+dup/Gamma//knownget exec{
+aload pop
+[exch/exp load]cvx
+3 1 roll
+[exch/exp load]cvx
+3 1 roll
+[exch/exp load]cvx
+3 1 roll
+3 array astore
+1 index exch/DecodeLMN exch put
+}if
+[exch/CIEBasedABC exch]
+exit
+}if
+dup 0 get/Lab eq{
+1 get
+begin
+currentdict/Range//knownget exec{aload pop}{-100 100 -100 100}ifelse
+0 100 6 2 roll 6 array astore
+/RangeABC exch def
+/DecodeABC[{16 add 116 div}bind{500 div}bind{200 div}bind]def
+/MatrixABC[1 1 1 1 0 0 0 0 -1]def
+{dup 6 29 div ge{dup dup mul mul}{4 29 div sub 108 841 div mul}ifelse}
+/DecodeLMN[
+[3 index aload pop WhitePoint 0 get/mul load]cvx
+[4 index aload pop WhitePoint 1 get/mul load]cvx
+[5 index aload pop WhitePoint 2 get/mul load]cvx
+]def pop
+//PDFR_DEBUG{
+(Constructed from Lab <<)=
+currentdict{exch = ==}forall
+(>>)=
+}if
+[/CIEBasedABC currentdict]
+end
+exit
+pop
+}if
+dup 0 get/CIEBasedA eq{exit}if
+dup 0 get/CIEBasedABC eq{exit}if
+mark exch(Unimplemented color space )exch//error exec
+}loop
+}bind def
+//SubstitutePDFColorSpaceRec 0//SubstitutePDFColorSpace put
+/ResolveArrayElement
+{2 copy get
+dup type dup/arraytype eq exch
+/packedarraytype eq or{
+dup length 1 ge exch xcheck and{
+2 copy get
+dup 0 get type/integertype eq
+1 index 1 get type dup/arraytype
+eq exch
+/packedarraytype eq or
+and{
+exec
+2 index 4 1 roll put
+}{
+pop pop
+}ifelse
+}{
+pop
+}ifelse
+}{
+pop pop
+}ifelse
+}bind def
+/ResolveColorSpaceArrayRec
+{0
+exec
+}bind def
+/SetColorSpaceSafe
+{
+PDFR_DEBUG{
+(SetColorSpaceSafe beg)=
+}if
+currentcolorspace dup type/arraytype eq{
+1 index type/arraytype eq{
+dup length 2 index length eq{
+false exch
+dup length 0 exch 1 exch 1 sub{
+dup
+4 index exch get exch
+2 index exch get
+ne{
+exch pop true exch exit
+}if
+}for
+pop
+{
+setcolorspace
+}{
+pop
+}ifelse
+}{
+pop setcolorspace
+}ifelse
+}{
+pop setcolorspace
+}ifelse
+}{
+pop setcolorspace
+}ifelse
+PDFR_DEBUG{
+(SetColorSpaceSafe end)=
+}if
+}bind def
+/ResolveColorSpaceArray
+{
+//PDFR_DEBUG{
+(ResolveColorSpaceArray beg )print dup ==
+}if
+dup 0 get/Indexed eq{
+1//ResolveArrayElement exec
+dup dup 1 get
+dup type/arraytype eq{
+//SubstitutePDFColorSpace exec
+//ResolveColorSpaceArrayRec exec
+1 exch put
+}{
+pop pop
+}ifelse
+}if
+dup 0 get/Separation eq{
+dup dup 1 get UnPDFEscape 1 exch put
+3//ResolveArrayElement exec
+dup 3 get//FunctionToProc exec
+2 copy 3 exch put
+pop
+}if
+dup 0 get/Pattern eq{
+dup length 1 gt{
+dup 1 get dup type/arraytype eq{
+ResolveColorSpaceArray
+1 index 1 3 -1 roll put
+}{
+pop
+}ifelse
+}if
+}if
+PDFR_DEBUG{
+(Construcrted color space :)=
+dup ==
+}if
+//PDFR_DEBUG{
+(ResolveColorSpaceArray end )print dup ==
+}if
+}bind def
+//ResolveColorSpaceArrayRec 0//ResolveColorSpaceArray put
+/ResolveColorSpace
+{
+//PDFR_DEBUG{
+(ResolveColorSpace beg )print dup =
+}if
+dup//SimpleColorSpaceNames exch known not{
+dup//PDFColorSpaces exch//knownget exec{
+exch pop
+//PDFR_DEBUG{
+(ResolveColorSpace known )=
+}if
+}{
+dup
+//PDFReader/CurrentObject get/Context get/Resources get
+/ColorSpace//DoNothing//ResolveD exec
+exch//CheckColorSpace//ResolveD exec
+dup type/arraytype eq{
+//SubstitutePDFColorSpace exec
+//ResolveColorSpaceArray exec
+dup//PDFColorSpaces 4 2 roll put
+}if
+}ifelse
+}if
+//PDFR_DEBUG{
+(ResolveColorSpace end )print dup ==
+}if
+}bind def
+/CheckPattern
+{
+dup/PatternType//knownget exec{
+dup 1 ne{
+mark(Resource )4 index( is a shading, which can't be handled at level 2. )//error exec
+}if
+pop
+}if
+dup/Type knownget{
+/Pattern ne{
+mark(Resource )4 index( must have /Type/Pattern .)//error exec
+}if
+}if
+}bind def
+/PaintProc
+{/Context get
+//RunDelayedStream exec
+}bind def
+/ResolvePattern
+{
+dup
+userdict/PDFR_Patterns get
+exch//knownget exec{
+exch pop
+}{
+dup
+//PDFReader/CurrentObject get/Context get/Resources get
+/Pattern//DoNothing//ResolveD exec
+exch//CheckPattern//ResolveD exec
+dup dup/Context exch put
+dup/Resources//DoNothing//ResolveD exec pop
+dup/PaintProc//PaintProc put
+gsave userdict/PDFR_InitialGS get setgstate
+currentglobal exch false setglobal
+dup/Matrix get
+makepattern
+exch setglobal
+grestore
+dup userdict/PDFR_Patterns get
+4 2 roll
+put
+}ifelse
+}bind def
+/SetColor
+{//PDFR_DEBUG{
+(SetColor beg)=
+}if
+currentcolorspace dup type/nametype eq{
+pop setcolor
+}{
+0 get/Pattern eq{
+//ResolvePattern exec setpattern
+}{
+setcolor
+}ifelse
+}ifelse
+//PDFR_DEBUG{
+(SetColor end)=
+}if
+}bind def
+/ImageKeys 15 dict begin
+/BPC/BitsPerComponent def
+/CS/ColorSpace def
+/D/Decode def
+/DP/DecodeParms def
+/F/Filter def
+/H/Height def
+/IM/ImageMask def
+/I/Interpolate def
+/W/Width def
+currentdict end readonly def
+/ImageValues 15 dict begin
+/G/DeviceGray def
+/RGB/DeviceRGB def
+/CMYK/DeviceCMYK def
+/I/Indexed def
+/AHx/ASCIIHexDecode def
+/A85/ASCII85Decode def
+/LZW/LZWDecode def
+/Fl/FlateDecode def
+/RL/RunLengthDecode def
+/CCF/CCITTFaxDecode def
+/DCT/DCTDecode def
+currentdict end readonly def
+/GetColorSpaceRange
+{2 index/ColorSpace get
+dup type/arraytype eq{
+1 get
+}if
+exch//knownget exec{
+exch pop
+}if
+}bind def
+/DecodeArrays 15 dict begin
+/DeviceGray{[0 1]}def
+/DeviceRGB{[0 1 0 1 0 1]}def
+/DeviceCMYK{[0 1 0 1 0 1 0 1]}def
+/Indexed{
+dup/BitsPerComponent get 1 exch bitshift 1 sub[exch 0 exch]
+}def
+/Separation{[0 1]}def
+/CIEBasedA{[0 1]/RangeA//GetColorSpaceRange exec}def
+/CIEBasedABC{[0 1 0 1 0 1]/RangeABC//GetColorSpaceRange exec}def
+currentdict end readonly def
+/Substitute
+{1 index//knownget exec{
+exch pop
+}if
+}bind def
+/DebugImagePrinting
+{
+//PDFR_DEBUG{
+(Image :)=
+dup{exch//=only exec( )print ==
+}forall
+}if
+}bind def
+/CompleteImage
+{
+dup/ColorSpace known{
+dup/ColorSpace//CheckColorSpace//ResolveD exec pop
+}if
+dup/Decode known not{
+dup/ColorSpace//knownget exec{
+dup type/arraytype eq{
+0 get
+}if
+//DecodeArrays exch get exec
+}{
+[0 1]
+}ifelse
+1 index exch/Decode exch put
+}if
+dup/ImageMatrix[2 index/Width get 0 0 5 index/Height get neg
+0 7 index/Height get]put
+//DebugImagePrinting exec
+}bind def
+/CompleteInlineImage
+{
+//PDFR_DEBUG{
+(CompleteInlineImage beg)=
+}if
+dup/ImageType known not{
+dup/ImageType 1 put
+}if
+dup length dict exch{
+exch//ImageKeys//Substitute exec
+dup/Filter eq{
+exch//ImageValues//Substitute exec exch
+}if
+dup/ColorSpace eq{
+exch
+dup//ImageValues exch//knownget exec{
+exch pop
+}{
+//ResolveColorSpace exec
+}ifelse
+exch
+}if
+exch
+2 index 3 1 roll put
+}forall
+//CompleteImage exec
+dup/DataSource 2 copy get
+2 index//AppendFilters exec put
+//PDFR_DEBUG{
+(CompleteInlineImage end)=
+}if
+}bind def
+/CompleteOutlineImage
+{
+currentglobal exch dup gcheck setglobal
+//PDFR_DEBUG{
+(CompleteOutlineImage beg)=
+}if
+dup dup//MakeStreamReader exec/DataSource exch put
+dup/ImageType known not{
+//CompleteImage exec
+dup/ImageType 1 put
+dup/ColorSpace known{
+dup/ColorSpace//CheckColorSpace//ResolveD exec
+dup type/arraytype eq{
+//ResolveColorSpaceArray exec
+//SubstitutePDFColorSpace exec
+1 index exch/ColorSpace exch put
+}{
+pop
+}ifelse
+}if
+}if
+//PDFR_DEBUG{
+(CompleteOutlineImage end)=
+}if
+exch setglobal
+}bind def
+/DoImage
+{
+//PDFR_DEBUG{
+(DoImage beg)=
+}if
+gsave
+dup/ColorSpace//knownget exec{setcolorspace}if
+dup/ImageMask//knownget exec not{false}if
+{imagemask}{image}ifelse
+grestore
+//PDFR_DEBUG{
+(DoImage end)=
+}if
+}bind def
+/GSave
+{
+gsave
+//PDFReader/GraphicStateStackPointer get
+dup//GraphicStateStack exch get null eq{
+dup//GraphicStateStack exch//InitialGraphicState length dict put
+}if
+dup//GraphicStateStack exch get
+//GraphicState exch copy pop
+1 add//PDFReader exch/GraphicStateStackPointer exch put
+}bind def
+/GRestore
+{
+grestore
+//PDFReader/GraphicStateStackPointer get
+1 sub dup
+//PDFReader exch/GraphicStateStackPointer exch put
+//GraphicStateStack exch get
+//GraphicState copy pop
+}bind def
+/SetFont
+{dup//GraphicState exch/FontSize exch put
+//ResolveAndSetFont exec
+//GraphicState/FontMatrixNonHV currentfont/FontMatrix get 1 get 0 ne put
+}bind def
+/ShowText
+{//GraphicState/TextRenderingMode get 0 eq{
+//GraphicState/WordSpacing get 0
+32
+//GraphicState/CharacterSpacing get 0
+6 5 roll
+//GraphicState/FontMatrixNonHV get{
+[
+7 -2 roll pop
+5 -2 roll pop
+5 -1 roll
+{
+exch
+pop
+3 index add
+exch 2 index eq{3 index add}if
+4 1 roll
+}
+currentfont/FontMatrix get 0 get 0 ne{
+1 1 index length 1 sub getinterval cvx
+}if
+5 index
+cshow
+pop pop pop]
+xshow
+}{
+awidthshow
+}ifelse
+}{
+//GraphicState/CharacterSpacing get 0 eq
+//GraphicState/FontMatrixNonHV get not and
+//GraphicState/WordSpacing get 0 eq and{
+true charpath
+}{
+{
+exch
+pop 0
+currentpoint 5 4 roll
+( )dup 0 3 index put true charpath
+5 1 roll
+moveto rmoveto
+//GraphicState/CharacterSpacing get 0 rmoveto
+32 eq{
+//GraphicState/WordSpacing get 0 rmoveto
+}if
+}
+//GraphicState/FontMatrixNonHV get dup not exch{
+pop currentfont/FontMatrix get 0 get 0 ne
+}if{
+1 1 index length 1 sub getinterval cvx
+}if
+exch cshow
+}ifelse
+}ifelse
+}bind def
+/ShowTextBeg
+{//GraphicState/TextRenderingMode get 0 ne{
+currentpoint newpath moveto
+}if
+}bind def
+/ShowTextEnd
+{//GraphicState/TextRenderingMode get
+{dup 1 eq{
+stroke exit
+}if
+dup 2 eq{
+gsave fill grestore stroke exit
+}if
+dup 3 eq{
+currentpoint newpath moveto
+}if
+dup 4 eq{
+gsave fill grestore clip exit
+}if
+dup 5 eq{
+gsave stroke grestore clip exit
+}if
+dup 6 eq{
+gsave fill grestore gsave stroke grestore fill exit
+}if
+dup 7 eq{
+clip exit
+}if
+exit
+}loop
+pop
+}bind def
+/ShowTextWithGlyphPositioning
+{//ShowTextBeg exec
+{dup type/stringtype eq{
+//ShowText exec
+}{
+neg 1000 div//GraphicState/FontSize get mul 0 rmoveto
+}ifelse
+}forall
+//ShowTextEnd exec
+}bind def
+/CheckFont
+{dup/Type get/ExtGState ne{
+mark(Resource )3 index( must have /Type/ExtGState.)//error exec
+}if
+}bind def
+/SetTransfer
+{
+//PDFR_DEBUG{(SetTransfer beg )print count =}if
+dup type/arraytype eq 1 index xcheck not and{
+0 4 getinterval aload pop
+setcolortransfer
+}{
+settransfer
+}ifelse
+//PDFR_DEBUG{(SetTransfer end )print count =}if
+}bind def
+/CheckExtGState
+{dup/Type get/ExtGState ne{
+mark(Resource )3 index( must have /Type/ExtGState.)//error exec
+}if
+}bind def
+/CheckHalftone
+{dup/HalftoneType known not{
+mark(Resource )3 index( must have /HalftoneType.)//error exec
+}if
+}bind def
+/ResolveFunction
+{
+//PDFR_DEBUG{(ResolveFunction beg )print dup = count =}if
+2 copy get//IsObjRef exec{
+2 copy//DoNothing//ResolveD exec
+3 copy put pop
+}if
+2 copy get dup type/arraytype eq exch xcheck and not{
+2 copy get
+dup type/arraytype eq 1 index xcheck not and{
+dup length 1 sub -1 0{
+2 copy//DoNothing ResolveA
+dup/Identity eq{
+pop 2 copy{}put
+}{
+//FunctionToProc exec
+3 copy put pop
+}ifelse
+pop
+}for
+}{
+dup/Default eq{
+}{
+dup/Identity eq{
+pop{}
+}{dup type/nametype eq{
+//spotfunctions exch get
+}{
+//FunctionToProc exec
+}ifelse
+}ifelse
+}ifelse
+}ifelse
+3 copy put
+exch pop
+}{
+1 index exch get
+}ifelse
+//PDFR_DEBUG{(ResolveFunction end )print dup == count =}if
+}bind def
+/ResolveFunctionSafe
+{2 copy known{
+//ResolveFunction exec
+}if
+pop
+}bind def
+/CreateHalftoneThresholds
+{
+dup/Thresholds known not{
+dup/HalftoneType get 10 eq{
+dup dup//MakeStreamReader exec
+/Thresholds exch put
+}if
+dup/HalftoneType get dup 3 eq exch 6 eq or{
+dup dup//MakeStreamReader exec
+//BlockBuffer readstring pop
+dup length
+dup 0 eq{
+mark(Could not read Thresholds)//error exec
+}if
+string copy/Thresholds exch put
+dup/HalftoneType 3 put
+}if
+}if
+}bind def
+/SetExtGState
+{
+//PDFReader/CurrentObject get/Context get/Resources get
+/ExtGState//DoNothing//ResolveD exec
+exch//CheckExtGState//ResolveD exec
+dup/LW//knownget exec{
+setlinewidth
+}if
+dup/LC//knownget exec{
+setlinecap
+}if
+dup/LJ//knownget exec{
+setlinejoin
+}if
+dup/ML//knownget exec{
+setmeterlimit
+}if
+dup/D//knownget exec{
+setdash
+}if
+dup/RI//knownget exec{
+mark(Unimplemented ExtGState.RI)//error exec
+}if
+dup/OP//knownget exec{
+setoverprint
+}if
+dup/op//knownget exec{
+setoverprint
+}if
+dup/OPM//knownget exec{
+mark(Unimplemented ExtGState.OPM)//error exec
+}if
+dup/Font//knownget exec{
+mark(Unimplemented ExtGState.Font)//error exec
+}if
+dup/BG known{
+/BG//ResolveFunction exec
+setblackgeneration
+}if
+dup/BG2 known{
+/BG2//ResolveFunction exec
+dup/Default eq{
+//InitialExtGState/BG2 get
+}if
+setblackgeneration
+}if
+dup/UCR known{
+/UCR//ResolveFunction exec
+setundercolorremoval
+}if
+dup/UCR2 known{
+/UCR2//ResolveFunction exec
+dup/Default eq{
+//InitialExtGState/UCR2 get
+}if
+setundercolorremoval
+}if
+dup/TR known{
+/TR//ResolveFunction exec
+//SetTransfer exec
+}if
+dup/TR2 known{
+/TR2//ResolveFunction exec
+dup/Default eq{
+pop//InitialExtGState/TR2 get
+aload pop setcolortransfer
+}{
+//SetTransfer exec
+}ifelse
+}if
+dup/HT//knownget exec{
+dup/Default eq{
+pop//InitialExtGState/HT get
+sethalftone
+}{
+//PDFR_DEBUG{(Ht beg)=}if
+pop dup/HT//CheckHalftone//ResolveD exec
+/SpotFunction//ResolveFunctionSafe exec
+/TransferFunction//ResolveFunctionSafe exec
+null exch
+dup/HalftoneType get dup 5 eq exch dup 4 eq exch 2 eq or or{
+dup{
+dup//IsObjRef exec{
+pop
+1 index exch//CheckHalftone ResolveD
+}if
+dup type/dicttype eq{
+dup/SpotFunction//ResolveFunctionSafe exec
+/TransferFunction//ResolveFunctionSafe exec
+//CreateHalftoneThresholds exec
+dup/HalftoneType get 5 gt{
+4 3 roll pop
+dup 4 1 roll
+}if
+}if
+pop pop
+}forall
+}if
+//CreateHalftoneThresholds exec
+//PDFR_DEBUG{
+(HT:)=
+dup{
+1 index/Default eq{
+(Default <<)=
+exch pop
+{exch = ==}forall
+(>>)=
+}{
+exch = ==
+}ifelse
+}forall
+(HT end)= flush
+}if
+exch dup null ne{
+(Warning: Ignoring a halftone with a Level 3 component halftone Type )print dup/HalftoneType get =
+pop pop
+}{
+pop
+dup/HalftoneType get 5 gt{
+(Warning: Ignoring a Level 3 halftone Type )print dup/HalftoneType get =
+pop
+}{
+sethalftone
+}ifelse
+}ifelse
+//PDFR_DEBUG{(HT set)= flush}if
+}ifelse
+}if
+dup/FL//knownget exec{
+setflattness
+}if
+dup/SM//knownget exec{
+setsmoothness
+}if
+dup/SA//knownget exec{
+setstrokeadjust
+}if
+dup/BM//knownget exec{
+mark(Unimplemented ExtGState.BM)//error exec
+}if
+dup/SMask//knownget exec{
+mark(Unimplemented ExtGState.SMask)//error exec
+}if
+dup/CA//knownget exec{
+mark(Unimplemented ExtGState.CA)//error exec
+}if
+dup/ca//knownget exec{
+mark(Unimplemented ExtGState.ca)//error exec
+}if
+dup/AIS//knownget exec{
+mark(Unimplemented ExtGState.AIS)//error exec
+}if
+dup/TK//knownget exec{
+mark(Unimplemented ExtGState.TK)//error exec
+}if
+pop
+}bind def
+/CheckXObject
+{dup/Subtype get dup/Image ne exch dup/Form ne exch/PS ne and and{
+mark(Resource )3 index( must have /Subtype /Image or /Form or /PS.)//error exec
+}if
+}bind def
+/DoXObject
+{
+//PDFReader/CurrentObject get/Context get/Resources get
+/XObject//DoNothing//ResolveD exec
+exch//CheckXObject//ResolveD exec
+dup/Subtype get
+dup/Image eq{
+pop
+//CompleteOutlineImage exec
+//DoImage exec
+}{
+dup/PS eq{
+PDFR_DEBUG{
+(Executing a PS Xobject)=
+}if
+pop
+//RunDelayedStream exec
+}{
+dup/Form eq{
+pop
+PDFR_DEBUG{
+(Executing a Form XObject)=
+}if
+//PDFReader/CurrentObject get exch
+dup//PDFReader exch<< exch/Context exch >>/CurrentObject exch put
+dup/Matrix get concat
+dup/BBox get aload pop exch 3 index sub exch 2 index sub rectclip
+//RunDelayedStream exec
+//PDFReader exch/CurrentObject exch put
+}{
+mark exch(unimplemented XObject type )exch//error exec
+}ifelse
+}ifelse
+}ifelse
+}bind def
+/Operators 50 dict begin
+/q{//GSave exec}bind def
+/Q{//GRestore exec}bind def
+/cm{//TempMatrix astore concat}bind def
+/i{1 .min setflat}bind def
+/J/setlinecap load def
+/d/setdash load def
+/j/setlinejoin load def
+/w/setlinewidth load def
+/M/setmiterlimit load def
+/gs{SetExtGState}bind def
+/g/setgray load def
+/rg/setrgbcolor load def
+/k/setcmykcolor load def
+/cs{//ResolveColorSpace exec//SetColorSpaceSafe exec
+}bind def
+/sc/setcolor load def
+/scn{//SetColor exec}bind def
+/G/setgray load def
+/RG/setrgbcolor load def
+/K/setcmykcolor load def
+/CS//cs def
+/ri{SetColorRenderingIntent}bind def
+/SC/setcolor load def
+/SCN{//SetColor exec}bind def
+/m/moveto load def
+/l/lineto load def
+/c/curveto load def
+/v{currentpoint 6 2 roll curveto}bind def
+/y{2 copy curveto}bind def
+/re{
+4 2 roll moveto exch dup 0 rlineto 0 3 -1 roll rlineto neg 0 rlineto
+closepath
+}def
+/h/closepath load def
+/n/newpath load def
+/S/stroke load def
+/s{closepath stroke}bind def
+/f/fill load def
+/f*/eofill load def
+/B{gsave fill grestore stroke}bind def
+/b{closepath gsave fill grestore stroke}bind def
+/B*{gsave eofill grestore stroke}bind def
+/b*{closepath gsave eofill grestore stroke}bind def
+/W/clip load def
+/W*/eoclip load def
+/sh{
+ResolveShading
+dup/Background known{
+gsave
+dup/ColorSpace get setcolorspace
+dup/Background get aload pop setcolor
+pathbbox
+2 index sub exch 3 index sub exch
+rectfill
+grestore
+}if
+shfill
+}bind def
+/Do{//DoXObject exec}bind def
+/BI{currentglobal false setglobal<<}bind def
+/ID{>>
+dup/DataSource currentfile
+2 index/F//knownget exec{
+/A85 eq{
+0(~>)/SubFileDecode filter
+}if
+}if
+put
+//CompleteInlineImage exec
+exch setglobal
+//DoImage exec
+}bind def
+/EI{}bind def
+/BT{gsave//GraphicState/InitialTextMatrix get currentmatrix pop}bind def
+/ET{grestore}bind def
+/Tc{//GraphicState exch/CharacterSpacing exch put}bind def
+/TL{//GraphicState exch/TextLeading exch put}bind def
+/Tr{//GraphicState exch/TextRenderingMode exch put}bind def
+/Ts{
+mark(Unimplemented SetTextRise)//error exec
+}bind def
+/Tw{//GraphicState exch/WordSpacing exch put}bind def
+/Tz{
+mark(Unimplemented SetHorizontalTextScaling)//error exec
+}bind def
+/Td{translate 0 0 moveto}bind def
+/TD{dup neg//TL exec//Td exec}bind def
+/Tm{//GraphicState/InitialTextMatrix get setmatrix
+//TempMatrix astore concat
+0 0 moveto}bind def
+/T*{0//GraphicState/TextLeading get neg//Td exec}bind def
+/Tj{//ShowTextBeg exec//ShowText exec//ShowTextEnd exec}bind def
+/'{//T* exec//ShowText exec//ShowTextEnd exec}bind def
+/"{3 2 roll//Tw exec exch//Tc exec//' exec}bind def
+/TJ//ShowTextWithGlyphPositioning def
+/Tf//SetFont def
+/d0/setcharwidth load def
+/d1/setcachedevice load def
+/BDC{pop pop}bind def
+/BMC{pop}bind def
+/EMC{}bind def
+/BX{BeginCompatibilitySection}bind def
+/EX{EndCompatibilitySection}bind def
+/DP{DefineMarkedContentPointWithPropertyList}bind def
+/MP{DefineMarkedContentPoint}bind def
+/PS{cvx exec}bind def
+currentdict end def
+//PDFR_STREAM{
+//Operators length dict begin
+//Operators{
+exch dup
+[exch//=only/exec load
+( )/print load
+8 7 roll
+dup type/arraytype eq{
+/exec load
+}if
+( )/print load
+]cvx
+def
+}forall
+currentdict end/Operators exch def
+}if
+/.registerencoding
+{pop pop
+}bind def
+/.defineencoding
+{def
+}bind def
+/.findencoding
+{load
+}bind def
+/currentglobal where
+{pop currentglobal{setglobal}true setglobal}
+{{}}
+ifelse
+/MacRomanEncoding
+StandardEncoding 0 39 getinterval aload pop
+/quotesingle
+StandardEncoding 40 56 getinterval aload pop
+/grave
+StandardEncoding 97 31 getinterval aload pop
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave
+/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde
+/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
+/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
+/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
+/questiondown/exclamdown/logicalnot/.notdef
+/florin/.notdef/.notdef/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright
+/quoteleft/quoteright/divide/.notdef
+/ydieresis/Ydieresis/fraction/currency
+/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase
+/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex
+/Idieresis/Igrave/Oacute/Ocircumflex
+/.notdef/Ograve/Uacute/Ucircumflex
+/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+256 packedarray
+5 1 index .registerencoding
+.defineencoding
+exec
+/AdobeGlyphList mark
+/A 16#0041
+/AE 16#00c6
+/AEacute 16#01fc
+/AEmacron 16#01e2
+/AEsmall 16#f7e6
+/Aacute 16#00c1
+/Aacutesmall 16#f7e1
+/Abreve 16#0102
+/Abreveacute 16#1eae
+/Abrevecyrillic 16#04d0
+/Abrevedotbelow 16#1eb6
+/Abrevegrave 16#1eb0
+/Abrevehookabove 16#1eb2
+/Abrevetilde 16#1eb4
+/Acaron 16#01cd
+/Acircle 16#24b6
+/Acircumflex 16#00c2
+/Acircumflexacute 16#1ea4
+/Acircumflexdotbelow 16#1eac
+/Acircumflexgrave 16#1ea6
+/Acircumflexhookabove 16#1ea8
+/Acircumflexsmall 16#f7e2
+/Acircumflextilde 16#1eaa
+/Acute 16#f6c9
+/Acutesmall 16#f7b4
+/Acyrillic 16#0410
+/Adblgrave 16#0200
+/Adieresis 16#00c4
+/Adieresiscyrillic 16#04d2
+/Adieresismacron 16#01de
+/Adieresissmall 16#f7e4
+/Adotbelow 16#1ea0
+/Adotmacron 16#01e0
+/Agrave 16#00c0
+/Agravesmall 16#f7e0
+/Ahookabove 16#1ea2
+/Aiecyrillic 16#04d4
+/Ainvertedbreve 16#0202
+/Alpha 16#0391
+/Alphatonos 16#0386
+/Amacron 16#0100
+/Amonospace 16#ff21
+/Aogonek 16#0104
+/Aring 16#00c5
+/Aringacute 16#01fa
+/Aringbelow 16#1e00
+/Aringsmall 16#f7e5
+/Asmall 16#f761
+/Atilde 16#00c3
+/Atildesmall 16#f7e3
+/Aybarmenian 16#0531
+/B 16#0042
+/Bcircle 16#24b7
+/Bdotaccent 16#1e02
+/Bdotbelow 16#1e04
+/Becyrillic 16#0411
+/Benarmenian 16#0532
+/Beta 16#0392
+/Bhook 16#0181
+/Blinebelow 16#1e06
+/Bmonospace 16#ff22
+/Brevesmall 16#f6f4
+/Bsmall 16#f762
+/Btopbar 16#0182
+/C 16#0043
+/Caarmenian 16#053e
+/Cacute 16#0106
+/Caron 16#f6ca
+/Caronsmall 16#f6f5
+/Ccaron 16#010c
+/Ccedilla 16#00c7
+/Ccedillaacute 16#1e08
+/Ccedillasmall 16#f7e7
+/Ccircle 16#24b8
+/Ccircumflex 16#0108
+/Cdot 16#010a
+/Cdotaccent 16#010a
+/Cedillasmall 16#f7b8
+/Chaarmenian 16#0549
+/Cheabkhasiancyrillic 16#04bc
+/Checyrillic 16#0427
+/Chedescenderabkhasiancyrillic 16#04be
+/Chedescendercyrillic 16#04b6
+/Chedieresiscyrillic 16#04f4
+/Cheharmenian 16#0543
+/Chekhakassiancyrillic 16#04cb
+/Cheverticalstrokecyrillic 16#04b8
+/Chi 16#03a7
+/Chook 16#0187
+/Circumflexsmall 16#f6f6
+/Cmonospace 16#ff23
+/Coarmenian 16#0551
+/Csmall 16#f763
+/D 16#0044
+/DZ 16#01f1
+/DZcaron 16#01c4
+/Daarmenian 16#0534
+/Dafrican 16#0189
+/Dcaron 16#010e
+/Dcedilla 16#1e10
+/Dcircle 16#24b9
+/Dcircumflexbelow 16#1e12
+/Dcroat 16#0110
+/Ddotaccent 16#1e0a
+/Ddotbelow 16#1e0c
+/Decyrillic 16#0414
+/Deicoptic 16#03ee
+/Delta 16#2206
+/Deltagreek 16#0394
+/Dhook 16#018a
+/Dieresis 16#f6cb
+/DieresisAcute 16#f6cc
+/DieresisGrave 16#f6cd
+/Dieresissmall 16#f7a8
+/Digammagreek 16#03dc
+/Djecyrillic 16#0402
+/Dlinebelow 16#1e0e
+/Dmonospace 16#ff24
+/Dotaccentsmall 16#f6f7
+/Dslash 16#0110
+/Dsmall 16#f764
+/Dtopbar 16#018b
+/Dz 16#01f2
+/Dzcaron 16#01c5
+/Dzeabkhasiancyrillic 16#04e0
+/Dzecyrillic 16#0405
+/Dzhecyrillic 16#040f
+/E 16#0045
+/Eacute 16#00c9
+/Eacutesmall 16#f7e9
+/Ebreve 16#0114
+/Ecaron 16#011a
+/Ecedillabreve 16#1e1c
+/Echarmenian 16#0535
+/Ecircle 16#24ba
+/Ecircumflex 16#00ca
+/Ecircumflexacute 16#1ebe
+/Ecircumflexbelow 16#1e18
+/Ecircumflexdotbelow 16#1ec6
+/Ecircumflexgrave 16#1ec0
+/Ecircumflexhookabove 16#1ec2
+/Ecircumflexsmall 16#f7ea
+/Ecircumflextilde 16#1ec4
+/Ecyrillic 16#0404
+/Edblgrave 16#0204
+/Edieresis 16#00cb
+/Edieresissmall 16#f7eb
+/Edot 16#0116
+/Edotaccent 16#0116
+/Edotbelow 16#1eb8
+/Efcyrillic 16#0424
+/Egrave 16#00c8
+/Egravesmall 16#f7e8
+/Eharmenian 16#0537
+/Ehookabove 16#1eba
+/Eightroman 16#2167
+/Einvertedbreve 16#0206
+/Eiotifiedcyrillic 16#0464
+/Elcyrillic 16#041b
+/Elevenroman 16#216a
+/Emacron 16#0112
+/Emacronacute 16#1e16
+/Emacrongrave 16#1e14
+/Emcyrillic 16#041c
+/Emonospace 16#ff25
+/Encyrillic 16#041d
+/Endescendercyrillic 16#04a2
+/Eng 16#014a
+/Enghecyrillic 16#04a4
+/Enhookcyrillic 16#04c7
+/Eogonek 16#0118
+/Eopen 16#0190
+/Epsilon 16#0395
+/Epsilontonos 16#0388
+/Ercyrillic 16#0420
+/Ereversed 16#018e
+/Ereversedcyrillic 16#042d
+/Escyrillic 16#0421
+/Esdescendercyrillic 16#04aa
+/Esh 16#01a9
+/Esmall 16#f765
+/Eta 16#0397
+/Etarmenian 16#0538
+/Etatonos 16#0389
+/Eth 16#00d0
+/Ethsmall 16#f7f0
+/Etilde 16#1ebc
+/Etildebelow 16#1e1a
+/Euro 16#20ac
+/Ezh 16#01b7
+/Ezhcaron 16#01ee
+/Ezhreversed 16#01b8
+/F 16#0046
+/Fcircle 16#24bb
+/Fdotaccent 16#1e1e
+/Feharmenian 16#0556
+/Feicoptic 16#03e4
+/Fhook 16#0191
+/Fitacyrillic 16#0472
+/Fiveroman 16#2164
+/Fmonospace 16#ff26
+/Fourroman 16#2163
+/Fsmall 16#f766
+/G 16#0047
+/GBsquare 16#3387
+/Gacute 16#01f4
+/Gamma 16#0393
+/Gammaafrican 16#0194
+/Gangiacoptic 16#03ea
+/Gbreve 16#011e
+/Gcaron 16#01e6
+/Gcedilla 16#0122
+/Gcircle 16#24bc
+/Gcircumflex 16#011c
+/Gcommaaccent 16#0122
+/Gdot 16#0120
+/Gdotaccent 16#0120
+/Gecyrillic 16#0413
+/Ghadarmenian 16#0542
+/Ghemiddlehookcyrillic 16#0494
+/Ghestrokecyrillic 16#0492
+/Gheupturncyrillic 16#0490
+/Ghook 16#0193
+/Gimarmenian 16#0533
+/Gjecyrillic 16#0403
+/Gmacron 16#1e20
+/Gmonospace 16#ff27
+/Grave 16#f6ce
+/Gravesmall 16#f760
+/Gsmall 16#f767
+/Gsmallhook 16#029b
+/Gstroke 16#01e4
+/H 16#0048
+/H18533 16#25cf
+/H18543 16#25aa
+/H18551 16#25ab
+/H22073 16#25a1
+/HPsquare 16#33cb
+/Haabkhasiancyrillic 16#04a8
+/Hadescendercyrillic 16#04b2
+/Hardsigncyrillic 16#042a
+/Hbar 16#0126
+/Hbrevebelow 16#1e2a
+/Hcedilla 16#1e28
+/Hcircle 16#24bd
+/Hcircumflex 16#0124
+/Hdieresis 16#1e26
+/Hdotaccent 16#1e22
+/Hdotbelow 16#1e24
+/Hmonospace 16#ff28
+/Hoarmenian 16#0540
+/Horicoptic 16#03e8
+/Hsmall 16#f768
+/Hungarumlaut 16#f6cf
+/Hungarumlautsmall 16#f6f8
+/Hzsquare 16#3390
+/I 16#0049
+/IAcyrillic 16#042f
+/IJ 16#0132
+/IUcyrillic 16#042e
+/Iacute 16#00cd
+/Iacutesmall 16#f7ed
+/Ibreve 16#012c
+/Icaron 16#01cf
+/Icircle 16#24be
+/Icircumflex 16#00ce
+/Icircumflexsmall 16#f7ee
+/Icyrillic 16#0406
+/Idblgrave 16#0208
+/Idieresis 16#00cf
+/Idieresisacute 16#1e2e
+/Idieresiscyrillic 16#04e4
+/Idieresissmall 16#f7ef
+/Idot 16#0130
+/Idotaccent 16#0130
+/Idotbelow 16#1eca
+/Iebrevecyrillic 16#04d6
+/Iecyrillic 16#0415
+/Ifraktur 16#2111
+/Igrave 16#00cc
+/Igravesmall 16#f7ec
+/Ihookabove 16#1ec8
+/Iicyrillic 16#0418
+/Iinvertedbreve 16#020a
+/Iishortcyrillic 16#0419
+/Imacron 16#012a
+/Imacroncyrillic 16#04e2
+/Imonospace 16#ff29
+/Iniarmenian 16#053b
+/Iocyrillic 16#0401
+/Iogonek 16#012e
+/Iota 16#0399
+/Iotaafrican 16#0196
+/Iotadieresis 16#03aa
+/Iotatonos 16#038a
+/Ismall 16#f769
+/Istroke 16#0197
+/Itilde 16#0128
+/Itildebelow 16#1e2c
+/Izhitsacyrillic 16#0474
+/Izhitsadblgravecyrillic 16#0476
+/J 16#004a
+/Jaarmenian 16#0541
+/Jcircle 16#24bf
+/Jcircumflex 16#0134
+/Jecyrillic 16#0408
+/Jheharmenian 16#054b
+/Jmonospace 16#ff2a
+/Jsmall 16#f76a
+/K 16#004b
+/KBsquare 16#3385
+/KKsquare 16#33cd
+/Kabashkircyrillic 16#04a0
+/Kacute 16#1e30
+/Kacyrillic 16#041a
+/Kadescendercyrillic 16#049a
+/Kahookcyrillic 16#04c3
+/Kappa 16#039a
+/Kastrokecyrillic 16#049e
+/Kaverticalstrokecyrillic 16#049c
+/Kcaron 16#01e8
+/Kcedilla 16#0136
+/Kcircle 16#24c0
+/Kcommaaccent 16#0136
+/Kdotbelow 16#1e32
+/Keharmenian 16#0554
+/Kenarmenian 16#053f
+/Khacyrillic 16#0425
+/Kheicoptic 16#03e6
+/Khook 16#0198
+/Kjecyrillic 16#040c
+/Klinebelow 16#1e34
+/Kmonospace 16#ff2b
+/Koppacyrillic 16#0480
+/Koppagreek 16#03de
+/Ksicyrillic 16#046e
+/Ksmall 16#f76b
+/L 16#004c
+/LJ 16#01c7
+/LL 16#f6bf
+/Lacute 16#0139
+/Lambda 16#039b
+/Lcaron 16#013d
+/Lcedilla 16#013b
+/Lcircle 16#24c1
+/Lcircumflexbelow 16#1e3c
+/Lcommaaccent 16#013b
+/Ldot 16#013f
+/Ldotaccent 16#013f
+/Ldotbelow 16#1e36
+/Ldotbelowmacron 16#1e38
+/Liwnarmenian 16#053c
+/Lj 16#01c8
+/Ljecyrillic 16#0409
+/Llinebelow 16#1e3a
+/Lmonospace 16#ff2c
+/Lslash 16#0141
+/Lslashsmall 16#f6f9
+/Lsmall 16#f76c
+/M 16#004d
+/MBsquare 16#3386
+/Macron 16#f6d0
+/Macronsmall 16#f7af
+/Macute 16#1e3e
+/Mcircle 16#24c2
+/Mdotaccent 16#1e40
+/Mdotbelow 16#1e42
+/Menarmenian 16#0544
+/Mmonospace 16#ff2d
+/Msmall 16#f76d
+/Mturned 16#019c
+/Mu 16#039c
+/N 16#004e
+/NJ 16#01ca
+/Nacute 16#0143
+/Ncaron 16#0147
+/Ncedilla 16#0145
+/Ncircle 16#24c3
+/Ncircumflexbelow 16#1e4a
+/Ncommaaccent 16#0145
+/Ndotaccent 16#1e44
+/Ndotbelow 16#1e46
+/Nhookleft 16#019d
+/Nineroman 16#2168
+/Nj 16#01cb
+/Njecyrillic 16#040a
+/Nlinebelow 16#1e48
+/Nmonospace 16#ff2e
+/Nowarmenian 16#0546
+/Nsmall 16#f76e
+/Ntilde 16#00d1
+/Ntildesmall 16#f7f1
+/Nu 16#039d
+/O 16#004f
+/OE 16#0152
+/OEsmall 16#f6fa
+/Oacute 16#00d3
+/Oacutesmall 16#f7f3
+/Obarredcyrillic 16#04e8
+/Obarreddieresiscyrillic 16#04ea
+/Obreve 16#014e
+/Ocaron 16#01d1
+/Ocenteredtilde 16#019f
+/Ocircle 16#24c4
+/Ocircumflex 16#00d4
+/Ocircumflexacute 16#1ed0
+/Ocircumflexdotbelow 16#1ed8
+/Ocircumflexgrave 16#1ed2
+/Ocircumflexhookabove 16#1ed4
+/Ocircumflexsmall 16#f7f4
+/Ocircumflextilde 16#1ed6
+/Ocyrillic 16#041e
+/Odblacute 16#0150
+/Odblgrave 16#020c
+/Odieresis 16#00d6
+/Odieresiscyrillic 16#04e6
+/Odieresissmall 16#f7f6
+/Odotbelow 16#1ecc
+/Ogoneksmall 16#f6fb
+/Ograve 16#00d2
+/Ogravesmall 16#f7f2
+/Oharmenian 16#0555
+/Ohm 16#2126
+/Ohookabove 16#1ece
+/Ohorn 16#01a0
+/Ohornacute 16#1eda
+/Ohorndotbelow 16#1ee2
+/Ohorngrave 16#1edc
+/Ohornhookabove 16#1ede
+/Ohorntilde 16#1ee0
+/Ohungarumlaut 16#0150
+/Oi 16#01a2
+/Oinvertedbreve 16#020e
+/Omacron 16#014c
+/Omacronacute 16#1e52
+/Omacrongrave 16#1e50
+/Omega 16#2126
+/Omegacyrillic 16#0460
+/Omegagreek 16#03a9
+/Omegaroundcyrillic 16#047a
+/Omegatitlocyrillic 16#047c
+/Omegatonos 16#038f
+/Omicron 16#039f
+/Omicrontonos 16#038c
+/Omonospace 16#ff2f
+/Oneroman 16#2160
+/Oogonek 16#01ea
+/Oogonekmacron 16#01ec
+/Oopen 16#0186
+/Oslash 16#00d8
+/Oslashacute 16#01fe
+/Oslashsmall 16#f7f8
+/Osmall 16#f76f
+/Ostrokeacute 16#01fe
+/Otcyrillic 16#047e
+/Otilde 16#00d5
+/Otildeacute 16#1e4c
+/Otildedieresis 16#1e4e
+/Otildesmall 16#f7f5
+/P 16#0050
+/Pacute 16#1e54
+/Pcircle 16#24c5
+/Pdotaccent 16#1e56
+/Pecyrillic 16#041f
+/Peharmenian 16#054a
+/Pemiddlehookcyrillic 16#04a6
+/Phi 16#03a6
+/Phook 16#01a4
+/Pi 16#03a0
+/Piwrarmenian 16#0553
+/Pmonospace 16#ff30
+/Psi 16#03a8
+/Psicyrillic 16#0470
+/Psmall 16#f770
+/Q 16#0051
+/Qcircle 16#24c6
+/Qmonospace 16#ff31
+/Qsmall 16#f771
+/R 16#0052
+/Raarmenian 16#054c
+/Racute 16#0154
+/Rcaron 16#0158
+/Rcedilla 16#0156
+/Rcircle 16#24c7
+/Rcommaaccent 16#0156
+/Rdblgrave 16#0210
+/Rdotaccent 16#1e58
+/Rdotbelow 16#1e5a
+/Rdotbelowmacron 16#1e5c
+/Reharmenian 16#0550
+/Rfraktur 16#211c
+/Rho 16#03a1
+/Ringsmall 16#f6fc
+/Rinvertedbreve 16#0212
+/Rlinebelow 16#1e5e
+/Rmonospace 16#ff32
+/Rsmall 16#f772
+/Rsmallinverted 16#0281
+/Rsmallinvertedsuperior 16#02b6
+/S 16#0053
+/SF010000 16#250c
+/SF020000 16#2514
+/SF030000 16#2510
+/SF040000 16#2518
+/SF050000 16#253c
+/SF060000 16#252c
+/SF070000 16#2534
+/SF080000 16#251c
+/SF090000 16#2524
+/SF100000 16#2500
+/SF110000 16#2502
+/SF190000 16#2561
+/SF200000 16#2562
+/SF210000 16#2556
+/SF220000 16#2555
+/SF230000 16#2563
+/SF240000 16#2551
+/SF250000 16#2557
+/SF260000 16#255d
+/SF270000 16#255c
+/SF280000 16#255b
+/SF360000 16#255e
+/SF370000 16#255f
+/SF380000 16#255a
+/SF390000 16#2554
+/SF400000 16#2569
+/SF410000 16#2566
+/SF420000 16#2560
+/SF430000 16#2550
+/SF440000 16#256c
+/SF450000 16#2567
+/SF460000 16#2568
+/SF470000 16#2564
+/SF480000 16#2565
+/SF490000 16#2559
+/SF500000 16#2558
+/SF510000 16#2552
+/SF520000 16#2553
+/SF530000 16#256b
+/SF540000 16#256a
+/Sacute 16#015a
+/Sacutedotaccent 16#1e64
+/Sampigreek 16#03e0
+/Scaron 16#0160
+/Scarondotaccent 16#1e66
+/Scaronsmall 16#f6fd
+/Scedilla 16#015e
+/Schwa 16#018f
+/Schwacyrillic 16#04d8
+/Schwadieresiscyrillic 16#04da
+/Scircle 16#24c8
+/Scircumflex 16#015c
+/Scommaaccent 16#0218
+/Sdotaccent 16#1e60
+/Sdotbelow 16#1e62
+/Sdotbelowdotaccent 16#1e68
+/Seharmenian 16#054d
+/Sevenroman 16#2166
+/Shaarmenian 16#0547
+/Shacyrillic 16#0428
+/Shchacyrillic 16#0429
+/Sheicoptic 16#03e2
+/Shhacyrillic 16#04ba
+/Shimacoptic 16#03ec
+/Sigma 16#03a3
+/Sixroman 16#2165
+/Smonospace 16#ff33
+/Softsigncyrillic 16#042c
+/Ssmall 16#f773
+/Stigmagreek 16#03da
+/T 16#0054
+/Tau 16#03a4
+/Tbar 16#0166
+/Tcaron 16#0164
+/Tcedilla 16#0162
+/Tcircle 16#24c9
+/Tcircumflexbelow 16#1e70
+/Tcommaaccent 16#0162
+/Tdotaccent 16#1e6a
+/Tdotbelow 16#1e6c
+/Tecyrillic 16#0422
+/Tedescendercyrillic 16#04ac
+/Tenroman 16#2169
+/Tetsecyrillic 16#04b4
+/Theta 16#0398
+/Thook 16#01ac
+/Thorn 16#00de
+/Thornsmall 16#f7fe
+/Threeroman 16#2162
+/Tildesmall 16#f6fe
+/Tiwnarmenian 16#054f
+/Tlinebelow 16#1e6e
+/Tmonospace 16#ff34
+/Toarmenian 16#0539
+/Tonefive 16#01bc
+/Tonesix 16#0184
+/Tonetwo 16#01a7
+/Tretroflexhook 16#01ae
+/Tsecyrillic 16#0426
+/Tshecyrillic 16#040b
+/Tsmall 16#f774
+/Twelveroman 16#216b
+/Tworoman 16#2161
+/U 16#0055
+/Uacute 16#00da
+/Uacutesmall 16#f7fa
+/Ubreve 16#016c
+/Ucaron 16#01d3
+/Ucircle 16#24ca
+/Ucircumflex 16#00db
+/Ucircumflexbelow 16#1e76
+/Ucircumflexsmall 16#f7fb
+/Ucyrillic 16#0423
+/Udblacute 16#0170
+/Udblgrave 16#0214
+/Udieresis 16#00dc
+/Udieresisacute 16#01d7
+/Udieresisbelow 16#1e72
+/Udieresiscaron 16#01d9
+/Udieresiscyrillic 16#04f0
+/Udieresisgrave 16#01db
+/Udieresismacron 16#01d5
+/Udieresissmall 16#f7fc
+/Udotbelow 16#1ee4
+/Ugrave 16#00d9
+/Ugravesmall 16#f7f9
+/Uhookabove 16#1ee6
+/Uhorn 16#01af
+/Uhornacute 16#1ee8
+/Uhorndotbelow 16#1ef0
+/Uhorngrave 16#1eea
+/Uhornhookabove 16#1eec
+/Uhorntilde 16#1eee
+/Uhungarumlaut 16#0170
+/Uhungarumlautcyrillic 16#04f2
+/Uinvertedbreve 16#0216
+/Ukcyrillic 16#0478
+/Umacron 16#016a
+/Umacroncyrillic 16#04ee
+/Umacrondieresis 16#1e7a
+/Umonospace 16#ff35
+/Uogonek 16#0172
+/Upsilon 16#03a5
+/Upsilon1 16#03d2
+/Upsilonacutehooksymbolgreek 16#03d3
+/Upsilonafrican 16#01b1
+/Upsilondieresis 16#03ab
+/Upsilondieresishooksymbolgreek 16#03d4
+/Upsilonhooksymbol 16#03d2
+/Upsilontonos 16#038e
+/Uring 16#016e
+/Ushortcyrillic 16#040e
+/Usmall 16#f775
+/Ustraightcyrillic 16#04ae
+/Ustraightstrokecyrillic 16#04b0
+/Utilde 16#0168
+/Utildeacute 16#1e78
+/Utildebelow 16#1e74
+/V 16#0056
+/Vcircle 16#24cb
+/Vdotbelow 16#1e7e
+/Vecyrillic 16#0412
+/Vewarmenian 16#054e
+/Vhook 16#01b2
+/Vmonospace 16#ff36
+/Voarmenian 16#0548
+/Vsmall 16#f776
+/Vtilde 16#1e7c
+/W 16#0057
+/Wacute 16#1e82
+/Wcircle 16#24cc
+/Wcircumflex 16#0174
+/Wdieresis 16#1e84
+/Wdotaccent 16#1e86
+/Wdotbelow 16#1e88
+/Wgrave 16#1e80
+/Wmonospace 16#ff37
+/Wsmall 16#f777
+/X 16#0058
+/Xcircle 16#24cd
+/Xdieresis 16#1e8c
+/Xdotaccent 16#1e8a
+/Xeharmenian 16#053d
+/Xi 16#039e
+/Xmonospace 16#ff38
+/Xsmall 16#f778
+/Y 16#0059
+/Yacute 16#00dd
+/Yacutesmall 16#f7fd
+/Yatcyrillic 16#0462
+/Ycircle 16#24ce
+/Ycircumflex 16#0176
+/Ydieresis 16#0178
+/Ydieresissmall 16#f7ff
+/Ydotaccent 16#1e8e
+/Ydotbelow 16#1ef4
+/Yericyrillic 16#042b
+/Yerudieresiscyrillic 16#04f8
+/Ygrave 16#1ef2
+/Yhook 16#01b3
+/Yhookabove 16#1ef6
+/Yiarmenian 16#0545
+/Yicyrillic 16#0407
+/Yiwnarmenian 16#0552
+/Ymonospace 16#ff39
+/Ysmall 16#f779
+/Ytilde 16#1ef8
+/Yusbigcyrillic 16#046a
+/Yusbigiotifiedcyrillic 16#046c
+/Yuslittlecyrillic 16#0466
+/Yuslittleiotifiedcyrillic 16#0468
+/Z 16#005a
+/Zaarmenian 16#0536
+/Zacute 16#0179
+/Zcaron 16#017d
+/Zcaronsmall 16#f6ff
+/Zcircle 16#24cf
+/Zcircumflex 16#1e90
+/Zdot 16#017b
+/Zdotaccent 16#017b
+/Zdotbelow 16#1e92
+/Zecyrillic 16#0417
+/Zedescendercyrillic 16#0498
+/Zedieresiscyrillic 16#04de
+/Zeta 16#0396
+/Zhearmenian 16#053a
+/Zhebrevecyrillic 16#04c1
+/Zhecyrillic 16#0416
+/Zhedescendercyrillic 16#0496
+/Zhedieresiscyrillic 16#04dc
+/Zlinebelow 16#1e94
+/Zmonospace 16#ff3a
+/Zsmall 16#f77a
+/Zstroke 16#01b5
+/a 16#0061
+/aabengali 16#0986
+/aacute 16#00e1
+/aadeva 16#0906
+/aagujarati 16#0a86
+/aagurmukhi 16#0a06
+/aamatragurmukhi 16#0a3e
+/aarusquare 16#3303
+/aavowelsignbengali 16#09be
+/aavowelsigndeva 16#093e
+/aavowelsigngujarati 16#0abe
+/abbreviationmarkarmenian 16#055f
+/abbreviationsigndeva 16#0970
+/abengali 16#0985
+/abopomofo 16#311a
+/abreve 16#0103
+/abreveacute 16#1eaf
+/abrevecyrillic 16#04d1
+/abrevedotbelow 16#1eb7
+/abrevegrave 16#1eb1
+/abrevehookabove 16#1eb3
+/abrevetilde 16#1eb5
+/acaron 16#01ce
+/acircle 16#24d0
+/acircumflex 16#00e2
+/acircumflexacute 16#1ea5
+/acircumflexdotbelow 16#1ead
+/acircumflexgrave 16#1ea7
+/acircumflexhookabove 16#1ea9
+/acircumflextilde 16#1eab
+/acute 16#00b4
+/acutebelowcmb 16#0317
+/acutecmb 16#0301
+/acutecomb 16#0301
+/acutedeva 16#0954
+/acutelowmod 16#02cf
+/acutetonecmb 16#0341
+/acyrillic 16#0430
+/adblgrave 16#0201
+/addakgurmukhi 16#0a71
+/adeva 16#0905
+/adieresis 16#00e4
+/adieresiscyrillic 16#04d3
+/adieresismacron 16#01df
+/adotbelow 16#1ea1
+/adotmacron 16#01e1
+/ae 16#00e6
+/aeacute 16#01fd
+/aekorean 16#3150
+/aemacron 16#01e3
+/afii00208 16#2015
+/afii08941 16#20a4
+/afii10017 16#0410
+/afii10018 16#0411
+/afii10019 16#0412
+/afii10020 16#0413
+/afii10021 16#0414
+/afii10022 16#0415
+/afii10023 16#0401
+/afii10024 16#0416
+/afii10025 16#0417
+/afii10026 16#0418
+/afii10027 16#0419
+/afii10028 16#041a
+/afii10029 16#041b
+/afii10030 16#041c
+/afii10031 16#041d
+/afii10032 16#041e
+/afii10033 16#041f
+/afii10034 16#0420
+/afii10035 16#0421
+/afii10036 16#0422
+/afii10037 16#0423
+/afii10038 16#0424
+/afii10039 16#0425
+/afii10040 16#0426
+/afii10041 16#0427
+/afii10042 16#0428
+/afii10043 16#0429
+/afii10044 16#042a
+/afii10045 16#042b
+/afii10046 16#042c
+/afii10047 16#042d
+/afii10048 16#042e
+/afii10049 16#042f
+/afii10050 16#0490
+/afii10051 16#0402
+/afii10052 16#0403
+/afii10053 16#0404
+/afii10054 16#0405
+/afii10055 16#0406
+/afii10056 16#0407
+/afii10057 16#0408
+/afii10058 16#0409
+/afii10059 16#040a
+/afii10060 16#040b
+/afii10061 16#040c
+/afii10062 16#040e
+/afii10063 16#f6c4
+/afii10064 16#f6c5
+/afii10065 16#0430
+/afii10066 16#0431
+/afii10067 16#0432
+/afii10068 16#0433
+/afii10069 16#0434
+/afii10070 16#0435
+/afii10071 16#0451
+/afii10072 16#0436
+/afii10073 16#0437
+/afii10074 16#0438
+/afii10075 16#0439
+/afii10076 16#043a
+/afii10077 16#043b
+/afii10078 16#043c
+/afii10079 16#043d
+/afii10080 16#043e
+/afii10081 16#043f
+/afii10082 16#0440
+/afii10083 16#0441
+/afii10084 16#0442
+/afii10085 16#0443
+/afii10086 16#0444
+/afii10087 16#0445
+/afii10088 16#0446
+/afii10089 16#0447
+/afii10090 16#0448
+/afii10091 16#0449
+/afii10092 16#044a
+/afii10093 16#044b
+/afii10094 16#044c
+/afii10095 16#044d
+/afii10096 16#044e
+/afii10097 16#044f
+/afii10098 16#0491
+/afii10099 16#0452
+/afii10100 16#0453
+/afii10101 16#0454
+/afii10102 16#0455
+/afii10103 16#0456
+/afii10104 16#0457
+/afii10105 16#0458
+/afii10106 16#0459
+/afii10107 16#045a
+/afii10108 16#045b
+/afii10109 16#045c
+/afii10110 16#045e
+/afii10145 16#040f
+/afii10146 16#0462
+/afii10147 16#0472
+/afii10148 16#0474
+/afii10192 16#f6c6
+/afii10193 16#045f
+/afii10194 16#0463
+/afii10195 16#0473
+/afii10196 16#0475
+/afii10831 16#f6c7
+/afii10832 16#f6c8
+/afii10846 16#04d9
+/afii299 16#200e
+/afii300 16#200f
+/afii301 16#200d
+/afii57381 16#066a
+/afii57388 16#060c
+/afii57392 16#0660
+/afii57393 16#0661
+/afii57394 16#0662
+/afii57395 16#0663
+/afii57396 16#0664
+/afii57397 16#0665
+/afii57398 16#0666
+/afii57399 16#0667
+/afii57400 16#0668
+/afii57401 16#0669
+/afii57403 16#061b
+/afii57407 16#061f
+/afii57409 16#0621
+/afii57410 16#0622
+/afii57411 16#0623
+/afii57412 16#0624
+/afii57413 16#0625
+/afii57414 16#0626
+/afii57415 16#0627
+/afii57416 16#0628
+/afii57417 16#0629
+/afii57418 16#062a
+/afii57419 16#062b
+/afii57420 16#062c
+/afii57421 16#062d
+/afii57422 16#062e
+/afii57423 16#062f
+/afii57424 16#0630
+/afii57425 16#0631
+/afii57426 16#0632
+/afii57427 16#0633
+/afii57428 16#0634
+/afii57429 16#0635
+/afii57430 16#0636
+/afii57431 16#0637
+/afii57432 16#0638
+/afii57433 16#0639
+/afii57434 16#063a
+/afii57440 16#0640
+/afii57441 16#0641
+/afii57442 16#0642
+/afii57443 16#0643
+/afii57444 16#0644
+/afii57445 16#0645
+/afii57446 16#0646
+/afii57448 16#0648
+/afii57449 16#0649
+/afii57450 16#064a
+/afii57451 16#064b
+/afii57452 16#064c
+/afii57453 16#064d
+/afii57454 16#064e
+/afii57455 16#064f
+/afii57456 16#0650
+/afii57457 16#0651
+/afii57458 16#0652
+/afii57470 16#0647
+/afii57505 16#06a4
+/afii57506 16#067e
+/afii57507 16#0686
+/afii57508 16#0698
+/afii57509 16#06af
+/afii57511 16#0679
+/afii57512 16#0688
+/afii57513 16#0691
+/afii57514 16#06ba
+/afii57519 16#06d2
+/afii57534 16#06d5
+/afii57636 16#20aa
+/afii57645 16#05be
+/afii57658 16#05c3
+/afii57664 16#05d0
+/afii57665 16#05d1
+/afii57666 16#05d2
+/afii57667 16#05d3
+/afii57668 16#05d4
+/afii57669 16#05d5
+/afii57670 16#05d6
+/afii57671 16#05d7
+/afii57672 16#05d8
+/afii57673 16#05d9
+/afii57674 16#05da
+/afii57675 16#05db
+/afii57676 16#05dc
+/afii57677 16#05dd
+/afii57678 16#05de
+/afii57679 16#05df
+/afii57680 16#05e0
+/afii57681 16#05e1
+/afii57682 16#05e2
+/afii57683 16#05e3
+/afii57684 16#05e4
+/afii57685 16#05e5
+/afii57686 16#05e6
+/afii57687 16#05e7
+/afii57688 16#05e8
+/afii57689 16#05e9
+/afii57690 16#05ea
+/afii57694 16#fb2a
+/afii57695 16#fb2b
+/afii57700 16#fb4b
+/afii57705 16#fb1f
+/afii57716 16#05f0
+/afii57717 16#05f1
+/afii57718 16#05f2
+/afii57723 16#fb35
+/afii57793 16#05b4
+/afii57794 16#05b5
+/afii57795 16#05b6
+/afii57796 16#05bb
+/afii57797 16#05b8
+/afii57798 16#05b7
+/afii57799 16#05b0
+/afii57800 16#05b2
+/afii57801 16#05b1
+/afii57802 16#05b3
+/afii57803 16#05c2
+/afii57804 16#05c1
+/afii57806 16#05b9
+/afii57807 16#05bc
+/afii57839 16#05bd
+/afii57841 16#05bf
+/afii57842 16#05c0
+/afii57929 16#02bc
+/afii61248 16#2105
+/afii61289 16#2113
+/afii61352 16#2116
+/afii61573 16#202c
+/afii61574 16#202d
+/afii61575 16#202e
+/afii61664 16#200c
+/afii63167 16#066d
+/afii64937 16#02bd
+/agrave 16#00e0
+/agujarati 16#0a85
+/agurmukhi 16#0a05
+/ahiragana 16#3042
+/ahookabove 16#1ea3
+/aibengali 16#0990
+/aibopomofo 16#311e
+/aideva 16#0910
+/aiecyrillic 16#04d5
+/aigujarati 16#0a90
+/aigurmukhi 16#0a10
+/aimatragurmukhi 16#0a48
+/ainarabic 16#0639
+/ainfinalarabic 16#feca
+/aininitialarabic 16#fecb
+/ainmedialarabic 16#fecc
+/ainvertedbreve 16#0203
+/aivowelsignbengali 16#09c8
+/aivowelsigndeva 16#0948
+/aivowelsigngujarati 16#0ac8
+/akatakana 16#30a2
+/akatakanahalfwidth 16#ff71
+/akorean 16#314f
+/alef 16#05d0
+/alefarabic 16#0627
+/alefdageshhebrew 16#fb30
+/aleffinalarabic 16#fe8e
+/alefhamzaabovearabic 16#0623
+/alefhamzaabovefinalarabic 16#fe84
+/alefhamzabelowarabic 16#0625
+/alefhamzabelowfinalarabic 16#fe88
+/alefhebrew 16#05d0
+/aleflamedhebrew 16#fb4f
+/alefmaddaabovearabic 16#0622
+/alefmaddaabovefinalarabic 16#fe82
+/alefmaksuraarabic 16#0649
+/alefmaksurafinalarabic 16#fef0
+/alefmaksurainitialarabic 16#fef3
+/alefmaksuramedialarabic 16#fef4
+/alefpatahhebrew 16#fb2e
+/alefqamatshebrew 16#fb2f
+/aleph 16#2135
+/allequal 16#224c
+/alpha 16#03b1
+/alphatonos 16#03ac
+/amacron 16#0101
+/amonospace 16#ff41
+/ampersand 16#0026
+/ampersandmonospace 16#ff06
+/ampersandsmall 16#f726
+/amsquare 16#33c2
+/anbopomofo 16#3122
+/angbopomofo 16#3124
+/angkhankhuthai 16#0e5a
+/angle 16#2220
+/anglebracketleft 16#3008
+/anglebracketleftvertical 16#fe3f
+/anglebracketright 16#3009
+/anglebracketrightvertical 16#fe40
+/angleleft 16#2329
+/angleright 16#232a
+/angstrom 16#212b
+/anoteleia 16#0387
+/anudattadeva 16#0952
+/anusvarabengali 16#0982
+/anusvaradeva 16#0902
+/anusvaragujarati 16#0a82
+/aogonek 16#0105
+/apaatosquare 16#3300
+/aparen 16#249c
+/apostrophearmenian 16#055a
+/apostrophemod 16#02bc
+/apple 16#f8ff
+/approaches 16#2250
+/approxequal 16#2248
+/approxequalorimage 16#2252
+/approximatelyequal 16#2245
+/araeaekorean 16#318e
+/araeakorean 16#318d
+/arc 16#2312
+/arighthalfring 16#1e9a
+/aring 16#00e5
+/aringacute 16#01fb
+/aringbelow 16#1e01
+/arrowboth 16#2194
+/arrowdashdown 16#21e3
+/arrowdashleft 16#21e0
+/arrowdashright 16#21e2
+/arrowdashup 16#21e1
+/arrowdblboth 16#21d4
+/arrowdbldown 16#21d3
+/arrowdblleft 16#21d0
+/arrowdblright 16#21d2
+/arrowdblup 16#21d1
+/arrowdown 16#2193
+/arrowdownleft 16#2199
+/arrowdownright 16#2198
+/arrowdownwhite 16#21e9
+/arrowheaddownmod 16#02c5
+/arrowheadleftmod 16#02c2
+/arrowheadrightmod 16#02c3
+/arrowheadupmod 16#02c4
+/arrowhorizex 16#f8e7
+/arrowleft 16#2190
+/arrowleftdbl 16#21d0
+/arrowleftdblstroke 16#21cd
+/arrowleftoverright 16#21c6
+/arrowleftwhite 16#21e6
+/arrowright 16#2192
+/arrowrightdblstroke 16#21cf
+/arrowrightheavy 16#279e
+/arrowrightoverleft 16#21c4
+/arrowrightwhite 16#21e8
+/arrowtableft 16#21e4
+/arrowtabright 16#21e5
+/arrowup 16#2191
+/arrowupdn 16#2195
+/arrowupdnbse 16#21a8
+/arrowupdownbase 16#21a8
+/arrowupleft 16#2196
+/arrowupleftofdown 16#21c5
+/arrowupright 16#2197
+/arrowupwhite 16#21e7
+/arrowvertex 16#f8e6
+/asciicircum 16#005e
+/asciicircummonospace 16#ff3e
+/asciitilde 16#007e
+/asciitildemonospace 16#ff5e
+/ascript 16#0251
+/ascriptturned 16#0252
+/asmallhiragana 16#3041
+/asmallkatakana 16#30a1
+/asmallkatakanahalfwidth 16#ff67
+/asterisk 16#002a
+/asteriskaltonearabic 16#066d
+/asteriskarabic 16#066d
+/asteriskmath 16#2217
+/asteriskmonospace 16#ff0a
+/asterisksmall 16#fe61
+/asterism 16#2042
+/asuperior 16#f6e9
+/asymptoticallyequal 16#2243
+/at 16#0040
+/atilde 16#00e3
+/atmonospace 16#ff20
+/atsmall 16#fe6b
+/aturned 16#0250
+/aubengali 16#0994
+/aubopomofo 16#3120
+/audeva 16#0914
+/augujarati 16#0a94
+/augurmukhi 16#0a14
+/aulengthmarkbengali 16#09d7
+/aumatragurmukhi 16#0a4c
+/auvowelsignbengali 16#09cc
+/auvowelsigndeva 16#094c
+/auvowelsigngujarati 16#0acc
+/avagrahadeva 16#093d
+/aybarmenian 16#0561
+/ayin 16#05e2
+/ayinaltonehebrew 16#fb20
+/ayinhebrew 16#05e2
+/b 16#0062
+/babengali 16#09ac
+/backslash 16#005c
+/backslashmonospace 16#ff3c
+/badeva 16#092c
+/bagujarati 16#0aac
+/bagurmukhi 16#0a2c
+/bahiragana 16#3070
+/bahtthai 16#0e3f
+/bakatakana 16#30d0
+/bar 16#007c
+/barmonospace 16#ff5c
+/bbopomofo 16#3105
+/bcircle 16#24d1
+/bdotaccent 16#1e03
+/bdotbelow 16#1e05
+/beamedsixteenthnotes 16#266c
+/because 16#2235
+/becyrillic 16#0431
+/beharabic 16#0628
+/behfinalarabic 16#fe90
+/behinitialarabic 16#fe91
+/behiragana 16#3079
+/behmedialarabic 16#fe92
+/behmeeminitialarabic 16#fc9f
+/behmeemisolatedarabic 16#fc08
+/behnoonfinalarabic 16#fc6d
+/bekatakana 16#30d9
+/benarmenian 16#0562
+/bet 16#05d1
+/beta 16#03b2
+/betasymbolgreek 16#03d0
+/betdagesh 16#fb31
+/betdageshhebrew 16#fb31
+/bethebrew 16#05d1
+/betrafehebrew 16#fb4c
+/bhabengali 16#09ad
+/bhadeva 16#092d
+/bhagujarati 16#0aad
+/bhagurmukhi 16#0a2d
+/bhook 16#0253
+/bihiragana 16#3073
+/bikatakana 16#30d3
+/bilabialclick 16#0298
+/bindigurmukhi 16#0a02
+/birusquare 16#3331
+/blackcircle 16#25cf
+/blackdiamond 16#25c6
+/blackdownpointingtriangle 16#25bc
+/blackleftpointingpointer 16#25c4
+/blackleftpointingtriangle 16#25c0
+/blacklenticularbracketleft 16#3010
+/blacklenticularbracketleftvertical 16#fe3b
+/blacklenticularbracketright 16#3011
+/blacklenticularbracketrightvertical 16#fe3c
+/blacklowerlefttriangle 16#25e3
+/blacklowerrighttriangle 16#25e2
+/blackrectangle 16#25ac
+/blackrightpointingpointer 16#25ba
+/blackrightpointingtriangle 16#25b6
+/blacksmallsquare 16#25aa
+/blacksmilingface 16#263b
+/blacksquare 16#25a0
+/blackstar 16#2605
+/blackupperlefttriangle 16#25e4
+/blackupperrighttriangle 16#25e5
+/blackuppointingsmalltriangle 16#25b4
+/blackuppointingtriangle 16#25b2
+/blank 16#2423
+/blinebelow 16#1e07
+/block 16#2588
+/bmonospace 16#ff42
+/bobaimaithai 16#0e1a
+/bohiragana 16#307c
+/bokatakana 16#30dc
+/bparen 16#249d
+/bqsquare 16#33c3
+/braceex 16#f8f4
+/braceleft 16#007b
+/braceleftbt 16#f8f3
+/braceleftmid 16#f8f2
+/braceleftmonospace 16#ff5b
+/braceleftsmall 16#fe5b
+/bracelefttp 16#f8f1
+/braceleftvertical 16#fe37
+/braceright 16#007d
+/bracerightbt 16#f8fe
+/bracerightmid 16#f8fd
+/bracerightmonospace 16#ff5d
+/bracerightsmall 16#fe5c
+/bracerighttp 16#f8fc
+/bracerightvertical 16#fe38
+/bracketleft 16#005b
+/bracketleftbt 16#f8f0
+/bracketleftex 16#f8ef
+/bracketleftmonospace 16#ff3b
+/bracketlefttp 16#f8ee
+/bracketright 16#005d
+/bracketrightbt 16#f8fb
+/bracketrightex 16#f8fa
+/bracketrightmonospace 16#ff3d
+/bracketrighttp 16#f8f9
+/breve 16#02d8
+/brevebelowcmb 16#032e
+/brevecmb 16#0306
+/breveinvertedbelowcmb 16#032f
+/breveinvertedcmb 16#0311
+/breveinverteddoublecmb 16#0361
+/bridgebelowcmb 16#032a
+/bridgeinvertedbelowcmb 16#033a
+/brokenbar 16#00a6
+/bstroke 16#0180
+/bsuperior 16#f6ea
+/btopbar 16#0183
+/buhiragana 16#3076
+/bukatakana 16#30d6
+/bullet 16#2022
+/bulletinverse 16#25d8
+/bulletoperator 16#2219
+/bullseye 16#25ce
+/c 16#0063
+/caarmenian 16#056e
+/cabengali 16#099a
+/cacute 16#0107
+/cadeva 16#091a
+/cagujarati 16#0a9a
+/cagurmukhi 16#0a1a
+/calsquare 16#3388
+/candrabindubengali 16#0981
+/candrabinducmb 16#0310
+/candrabindudeva 16#0901
+/candrabindugujarati 16#0a81
+/capslock 16#21ea
+/careof 16#2105
+/caron 16#02c7
+/caronbelowcmb 16#032c
+/caroncmb 16#030c
+/carriagereturn 16#21b5
+/cbopomofo 16#3118
+/ccaron 16#010d
+/ccedilla 16#00e7
+/ccedillaacute 16#1e09
+/ccircle 16#24d2
+/ccircumflex 16#0109
+/ccurl 16#0255
+/cdot 16#010b
+/cdotaccent 16#010b
+/cdsquare 16#33c5
+/cedilla 16#00b8
+/cedillacmb 16#0327
+/cent 16#00a2
+/centigrade 16#2103
+/centinferior 16#f6df
+/centmonospace 16#ffe0
+/centoldstyle 16#f7a2
+/centsuperior 16#f6e0
+/chaarmenian 16#0579
+/chabengali 16#099b
+/chadeva 16#091b
+/chagujarati 16#0a9b
+/chagurmukhi 16#0a1b
+/chbopomofo 16#3114
+/cheabkhasiancyrillic 16#04bd
+/checkmark 16#2713
+/checyrillic 16#0447
+/chedescenderabkhasiancyrillic 16#04bf
+/chedescendercyrillic 16#04b7
+/chedieresiscyrillic 16#04f5
+/cheharmenian 16#0573
+/chekhakassiancyrillic 16#04cc
+/cheverticalstrokecyrillic 16#04b9
+/chi 16#03c7
+/chieuchacirclekorean 16#3277
+/chieuchaparenkorean 16#3217
+/chieuchcirclekorean 16#3269
+/chieuchkorean 16#314a
+/chieuchparenkorean 16#3209
+/chochangthai 16#0e0a
+/chochanthai 16#0e08
+/chochingthai 16#0e09
+/chochoethai 16#0e0c
+/chook 16#0188
+/cieucacirclekorean 16#3276
+/cieucaparenkorean 16#3216
+/cieuccirclekorean 16#3268
+/cieuckorean 16#3148
+/cieucparenkorean 16#3208
+/cieucuparenkorean 16#321c
+/circle 16#25cb
+/circlemultiply 16#2297
+/circleot 16#2299
+/circleplus 16#2295
+/circlepostalmark 16#3036
+/circlewithlefthalfblack 16#25d0
+/circlewithrighthalfblack 16#25d1
+/circumflex 16#02c6
+/circumflexbelowcmb 16#032d
+/circumflexcmb 16#0302
+/clear 16#2327
+/clickalveolar 16#01c2
+/clickdental 16#01c0
+/clicklateral 16#01c1
+/clickretroflex 16#01c3
+/club 16#2663
+/clubsuitblack 16#2663
+/clubsuitwhite 16#2667
+/cmcubedsquare 16#33a4
+/cmonospace 16#ff43
+/cmsquaredsquare 16#33a0
+/coarmenian 16#0581
+/colon 16#003a
+/colonmonetary 16#20a1
+/colonmonospace 16#ff1a
+/colonsign 16#20a1
+/colonsmall 16#fe55
+/colontriangularhalfmod 16#02d1
+/colontriangularmod 16#02d0
+/comma 16#002c
+/commaabovecmb 16#0313
+/commaaboverightcmb 16#0315
+/commaaccent 16#f6c3
+/commaarabic 16#060c
+/commaarmenian 16#055d
+/commainferior 16#f6e1
+/commamonospace 16#ff0c
+/commareversedabovecmb 16#0314
+/commareversedmod 16#02bd
+/commasmall 16#fe50
+/commasuperior 16#f6e2
+/commaturnedabovecmb 16#0312
+/commaturnedmod 16#02bb
+/compass 16#263c
+/congruent 16#2245
+/contourintegral 16#222e
+/control 16#2303
+/controlACK 16#0006
+/controlBEL 16#0007
+/controlBS 16#0008
+/controlCAN 16#0018
+/controlCR 16#000d
+/controlDC1 16#0011
+/controlDC2 16#0012
+/controlDC3 16#0013
+/controlDC4 16#0014
+/controlDEL 16#007f
+/controlDLE 16#0010
+/controlEM 16#0019
+/controlENQ 16#0005
+/controlEOT 16#0004
+/controlESC 16#001b
+/controlETB 16#0017
+/controlETX 16#0003
+/controlFF 16#000c
+/controlFS 16#001c
+/controlGS 16#001d
+/controlHT 16#0009
+/controlLF 16#000a
+/controlNAK 16#0015
+/controlRS 16#001e
+/controlSI 16#000f
+/controlSO 16#000e
+/controlSOT 16#0002
+/controlSTX 16#0001
+/controlSUB 16#001a
+/controlSYN 16#0016
+/controlUS 16#001f
+/controlVT 16#000b
+/copyright 16#00a9
+/copyrightsans 16#f8e9
+/copyrightserif 16#f6d9
+/cornerbracketleft 16#300c
+/cornerbracketlefthalfwidth 16#ff62
+/cornerbracketleftvertical 16#fe41
+/cornerbracketright 16#300d
+/cornerbracketrighthalfwidth 16#ff63
+/cornerbracketrightvertical 16#fe42
+/corporationsquare 16#337f
+/cosquare 16#33c7
+/coverkgsquare 16#33c6
+/cparen 16#249e
+/cruzeiro 16#20a2
+/cstretched 16#0297
+/curlyand 16#22cf
+/curlyor 16#22ce
+/currency 16#00a4
+/cyrBreve 16#f6d1
+/cyrFlex 16#f6d2
+/cyrbreve 16#f6d4
+/cyrflex 16#f6d5
+/d 16#0064
+/daarmenian 16#0564
+/dabengali 16#09a6
+/dadarabic 16#0636
+/dadeva 16#0926
+/dadfinalarabic 16#febe
+/dadinitialarabic 16#febf
+/dadmedialarabic 16#fec0
+/dagesh 16#05bc
+/dageshhebrew 16#05bc
+/dagger 16#2020
+/daggerdbl 16#2021
+/dagujarati 16#0aa6
+/dagurmukhi 16#0a26
+/dahiragana 16#3060
+/dakatakana 16#30c0
+/dalarabic 16#062f
+/dalet 16#05d3
+/daletdagesh 16#fb33
+/daletdageshhebrew 16#fb33
+/dalethebrew 16#05d3
+/dalfinalarabic 16#feaa
+/dammaarabic 16#064f
+/dammalowarabic 16#064f
+/dammatanaltonearabic 16#064c
+/dammatanarabic 16#064c
+/danda 16#0964
+/dargahebrew 16#05a7
+/dargalefthebrew 16#05a7
+/dasiapneumatacyrilliccmb 16#0485
+/dblGrave 16#f6d3
+/dblanglebracketleft 16#300a
+/dblanglebracketleftvertical 16#fe3d
+/dblanglebracketright 16#300b
+/dblanglebracketrightvertical 16#fe3e
+/dblarchinvertedbelowcmb 16#032b
+/dblarrowleft 16#21d4
+/dblarrowright 16#21d2
+/dbldanda 16#0965
+/dblgrave 16#f6d6
+/dblgravecmb 16#030f
+/dblintegral 16#222c
+/dbllowline 16#2017
+/dbllowlinecmb 16#0333
+/dbloverlinecmb 16#033f
+/dblprimemod 16#02ba
+/dblverticalbar 16#2016
+/dblverticallineabovecmb 16#030e
+/dbopomofo 16#3109
+/dbsquare 16#33c8
+/dcaron 16#010f
+/dcedilla 16#1e11
+/dcircle 16#24d3
+/dcircumflexbelow 16#1e13
+/dcroat 16#0111
+/ddabengali 16#09a1
+/ddadeva 16#0921
+/ddagujarati 16#0aa1
+/ddagurmukhi 16#0a21
+/ddalarabic 16#0688
+/ddalfinalarabic 16#fb89
+/dddhadeva 16#095c
+/ddhabengali 16#09a2
+/ddhadeva 16#0922
+/ddhagujarati 16#0aa2
+/ddhagurmukhi 16#0a22
+/ddotaccent 16#1e0b
+/ddotbelow 16#1e0d
+/decimalseparatorarabic 16#066b
+/decimalseparatorpersian 16#066b
+/decyrillic 16#0434
+/degree 16#00b0
+/dehihebrew 16#05ad
+/dehiragana 16#3067
+/deicoptic 16#03ef
+/dekatakana 16#30c7
+/deleteleft 16#232b
+/deleteright 16#2326
+/delta 16#03b4
+/deltaturned 16#018d
+/denominatorminusonenumeratorbengali 16#09f8
+/dezh 16#02a4
+/dhabengali 16#09a7
+/dhadeva 16#0927
+/dhagujarati 16#0aa7
+/dhagurmukhi 16#0a27
+/dhook 16#0257
+/dialytikatonos 16#0385
+/dialytikatonoscmb 16#0344
+/diamond 16#2666
+/diamondsuitwhite 16#2662
+/dieresis 16#00a8
+/dieresisacute 16#f6d7
+/dieresisbelowcmb 16#0324
+/dieresiscmb 16#0308
+/dieresisgrave 16#f6d8
+/dieresistonos 16#0385
+/dihiragana 16#3062
+/dikatakana 16#30c2
+/dittomark 16#3003
+/divide 16#00f7
+/divides 16#2223
+/divisionslash 16#2215
+/djecyrillic 16#0452
+/dkshade 16#2593
+/dlinebelow 16#1e0f
+/dlsquare 16#3397
+/dmacron 16#0111
+/dmonospace 16#ff44
+/dnblock 16#2584
+/dochadathai 16#0e0e
+/dodekthai 16#0e14
+/dohiragana 16#3069
+/dokatakana 16#30c9
+/dollar 16#0024
+/dollarinferior 16#f6e3
+/dollarmonospace 16#ff04
+/dollaroldstyle 16#f724
+/dollarsmall 16#fe69
+/dollarsuperior 16#f6e4
+/dong 16#20ab
+/dorusquare 16#3326
+/dotaccent 16#02d9
+/dotaccentcmb 16#0307
+/dotbelowcmb 16#0323
+/dotbelowcomb 16#0323
+/dotkatakana 16#30fb
+/dotlessi 16#0131
+/dotlessj 16#f6be
+/dotlessjstrokehook 16#0284
+/dotmath 16#22c5
+/dottedcircle 16#25cc
+/doubleyodpatah 16#fb1f
+/doubleyodpatahhebrew 16#fb1f
+/downtackbelowcmb 16#031e
+/downtackmod 16#02d5
+/dparen 16#249f
+/dsuperior 16#f6eb
+/dtail 16#0256
+/dtopbar 16#018c
+/duhiragana 16#3065
+/dukatakana 16#30c5
+/dz 16#01f3
+/dzaltone 16#02a3
+/dzcaron 16#01c6
+/dzcurl 16#02a5
+/dzeabkhasiancyrillic 16#04e1
+/dzecyrillic 16#0455
+/dzhecyrillic 16#045f
+/e 16#0065
+/eacute 16#00e9
+/earth 16#2641
+/ebengali 16#098f
+/ebopomofo 16#311c
+/ebreve 16#0115
+/ecandradeva 16#090d
+/ecandragujarati 16#0a8d
+/ecandravowelsigndeva 16#0945
+/ecandravowelsigngujarati 16#0ac5
+/ecaron 16#011b
+/ecedillabreve 16#1e1d
+/echarmenian 16#0565
+/echyiwnarmenian 16#0587
+/ecircle 16#24d4
+/ecircumflex 16#00ea
+/ecircumflexacute 16#1ebf
+/ecircumflexbelow 16#1e19
+/ecircumflexdotbelow 16#1ec7
+/ecircumflexgrave 16#1ec1
+/ecircumflexhookabove 16#1ec3
+/ecircumflextilde 16#1ec5
+/ecyrillic 16#0454
+/edblgrave 16#0205
+/edeva 16#090f
+/edieresis 16#00eb
+/edot 16#0117
+/edotaccent 16#0117
+/edotbelow 16#1eb9
+/eegurmukhi 16#0a0f
+/eematragurmukhi 16#0a47
+/efcyrillic 16#0444
+/egrave 16#00e8
+/egujarati 16#0a8f
+/eharmenian 16#0567
+/ehbopomofo 16#311d
+/ehiragana 16#3048
+/ehookabove 16#1ebb
+/eibopomofo 16#311f
+/eight 16#0038
+/eightarabic 16#0668
+/eightbengali 16#09ee
+/eightcircle 16#2467
+/eightcircleinversesansserif 16#2791
+/eightdeva 16#096e
+/eighteencircle 16#2471
+/eighteenparen 16#2485
+/eighteenperiod 16#2499
+/eightgujarati 16#0aee
+/eightgurmukhi 16#0a6e
+/eighthackarabic 16#0668
+/eighthangzhou 16#3028
+/eighthnotebeamed 16#266b
+/eightideographicparen 16#3227
+/eightinferior 16#2088
+/eightmonospace 16#ff18
+/eightoldstyle 16#f738
+/eightparen 16#247b
+/eightperiod 16#248f
+/eightpersian 16#06f8
+/eightroman 16#2177
+/eightsuperior 16#2078
+/eightthai 16#0e58
+/einvertedbreve 16#0207
+/eiotifiedcyrillic 16#0465
+/ekatakana 16#30a8
+/ekatakanahalfwidth 16#ff74
+/ekonkargurmukhi 16#0a74
+/ekorean 16#3154
+/elcyrillic 16#043b
+/element 16#2208
+/elevencircle 16#246a
+/elevenparen 16#247e
+/elevenperiod 16#2492
+/elevenroman 16#217a
+/ellipsis 16#2026
+/ellipsisvertical 16#22ee
+/emacron 16#0113
+/emacronacute 16#1e17
+/emacrongrave 16#1e15
+/emcyrillic 16#043c
+/emdash 16#2014
+/emdashvertical 16#fe31
+/emonospace 16#ff45
+/emphasismarkarmenian 16#055b
+/emptyset 16#2205
+/enbopomofo 16#3123
+/encyrillic 16#043d
+/endash 16#2013
+/endashvertical 16#fe32
+/endescendercyrillic 16#04a3
+/eng 16#014b
+/engbopomofo 16#3125
+/enghecyrillic 16#04a5
+/enhookcyrillic 16#04c8
+/enspace 16#2002
+/eogonek 16#0119
+/eokorean 16#3153
+/eopen 16#025b
+/eopenclosed 16#029a
+/eopenreversed 16#025c
+/eopenreversedclosed 16#025e
+/eopenreversedhook 16#025d
+/eparen 16#24a0
+/epsilon 16#03b5
+/epsilontonos 16#03ad
+/equal 16#003d
+/equalmonospace 16#ff1d
+/equalsmall 16#fe66
+/equalsuperior 16#207c
+/equivalence 16#2261
+/erbopomofo 16#3126
+/ercyrillic 16#0440
+/ereversed 16#0258
+/ereversedcyrillic 16#044d
+/escyrillic 16#0441
+/esdescendercyrillic 16#04ab
+/esh 16#0283
+/eshcurl 16#0286
+/eshortdeva 16#090e
+/eshortvowelsigndeva 16#0946
+/eshreversedloop 16#01aa
+/eshsquatreversed 16#0285
+/esmallhiragana 16#3047
+/esmallkatakana 16#30a7
+/esmallkatakanahalfwidth 16#ff6a
+/estimated 16#212e
+/esuperior 16#f6ec
+/eta 16#03b7
+/etarmenian 16#0568
+/etatonos 16#03ae
+/eth 16#00f0
+/etilde 16#1ebd
+/etildebelow 16#1e1b
+/etnahtafoukhhebrew 16#0591
+/etnahtafoukhlefthebrew 16#0591
+/etnahtahebrew 16#0591
+/etnahtalefthebrew 16#0591
+/eturned 16#01dd
+/eukorean 16#3161
+/euro 16#20ac
+/evowelsignbengali 16#09c7
+/evowelsigndeva 16#0947
+/evowelsigngujarati 16#0ac7
+/exclam 16#0021
+/exclamarmenian 16#055c
+/exclamdbl 16#203c
+/exclamdown 16#00a1
+/exclamdownsmall 16#f7a1
+/exclammonospace 16#ff01
+/exclamsmall 16#f721
+/existential 16#2203
+/ezh 16#0292
+/ezhcaron 16#01ef
+/ezhcurl 16#0293
+/ezhreversed 16#01b9
+/ezhtail 16#01ba
+/f 16#0066
+/fadeva 16#095e
+/fagurmukhi 16#0a5e
+/fahrenheit 16#2109
+/fathaarabic 16#064e
+/fathalowarabic 16#064e
+/fathatanarabic 16#064b
+/fbopomofo 16#3108
+/fcircle 16#24d5
+/fdotaccent 16#1e1f
+/feharabic 16#0641
+/feharmenian 16#0586
+/fehfinalarabic 16#fed2
+/fehinitialarabic 16#fed3
+/fehmedialarabic 16#fed4
+/feicoptic 16#03e5
+/female 16#2640
+/ff 16#fb00
+/ffi 16#fb03
+/ffl 16#fb04
+/fi 16#fb01
+/fifteencircle 16#246e
+/fifteenparen 16#2482
+/fifteenperiod 16#2496
+/figuredash 16#2012
+/filledbox 16#25a0
+/filledrect 16#25ac
+/finalkaf 16#05da
+/finalkafdagesh 16#fb3a
+/finalkafdageshhebrew 16#fb3a
+/finalkafhebrew 16#05da
+/finalmem 16#05dd
+/finalmemhebrew 16#05dd
+/finalnun 16#05df
+/finalnunhebrew 16#05df
+/finalpe 16#05e3
+/finalpehebrew 16#05e3
+/finaltsadi 16#05e5
+/finaltsadihebrew 16#05e5
+/firsttonechinese 16#02c9
+/fisheye 16#25c9
+/fitacyrillic 16#0473
+/five 16#0035
+/fivearabic 16#0665
+/fivebengali 16#09eb
+/fivecircle 16#2464
+/fivecircleinversesansserif 16#278e
+/fivedeva 16#096b
+/fiveeighths 16#215d
+/fivegujarati 16#0aeb
+/fivegurmukhi 16#0a6b
+/fivehackarabic 16#0665
+/fivehangzhou 16#3025
+/fiveideographicparen 16#3224
+/fiveinferior 16#2085
+/fivemonospace 16#ff15
+/fiveoldstyle 16#f735
+/fiveparen 16#2478
+/fiveperiod 16#248c
+/fivepersian 16#06f5
+/fiveroman 16#2174
+/fivesuperior 16#2075
+/fivethai 16#0e55
+/fl 16#fb02
+/florin 16#0192
+/fmonospace 16#ff46
+/fmsquare 16#3399
+/fofanthai 16#0e1f
+/fofathai 16#0e1d
+/fongmanthai 16#0e4f
+/forall 16#2200
+/four 16#0034
+/fourarabic 16#0664
+/fourbengali 16#09ea
+/fourcircle 16#2463
+/fourcircleinversesansserif 16#278d
+/fourdeva 16#096a
+/fourgujarati 16#0aea
+/fourgurmukhi 16#0a6a
+/fourhackarabic 16#0664
+/fourhangzhou 16#3024
+/fourideographicparen 16#3223
+/fourinferior 16#2084
+/fourmonospace 16#ff14
+/fournumeratorbengali 16#09f7
+/fouroldstyle 16#f734
+/fourparen 16#2477
+/fourperiod 16#248b
+/fourpersian 16#06f4
+/fourroman 16#2173
+/foursuperior 16#2074
+/fourteencircle 16#246d
+/fourteenparen 16#2481
+/fourteenperiod 16#2495
+/fourthai 16#0e54
+/fourthtonechinese 16#02cb
+/fparen 16#24a1
+/fraction 16#2044
+/franc 16#20a3
+/g 16#0067
+/gabengali 16#0997
+/gacute 16#01f5
+/gadeva 16#0917
+/gafarabic 16#06af
+/gaffinalarabic 16#fb93
+/gafinitialarabic 16#fb94
+/gafmedialarabic 16#fb95
+/gagujarati 16#0a97
+/gagurmukhi 16#0a17
+/gahiragana 16#304c
+/gakatakana 16#30ac
+/gamma 16#03b3
+/gammalatinsmall 16#0263
+/gammasuperior 16#02e0
+/gangiacoptic 16#03eb
+/gbopomofo 16#310d
+/gbreve 16#011f
+/gcaron 16#01e7
+/gcedilla 16#0123
+/gcircle 16#24d6
+/gcircumflex 16#011d
+/gcommaaccent 16#0123
+/gdot 16#0121
+/gdotaccent 16#0121
+/gecyrillic 16#0433
+/gehiragana 16#3052
+/gekatakana 16#30b2
+/geometricallyequal 16#2251
+/gereshaccenthebrew 16#059c
+/gereshhebrew 16#05f3
+/gereshmuqdamhebrew 16#059d
+/germandbls 16#00df
+/gershayimaccenthebrew 16#059e
+/gershayimhebrew 16#05f4
+/getamark 16#3013
+/ghabengali 16#0998
+/ghadarmenian 16#0572
+/ghadeva 16#0918
+/ghagujarati 16#0a98
+/ghagurmukhi 16#0a18
+/ghainarabic 16#063a
+/ghainfinalarabic 16#fece
+/ghaininitialarabic 16#fecf
+/ghainmedialarabic 16#fed0
+/ghemiddlehookcyrillic 16#0495
+/ghestrokecyrillic 16#0493
+/gheupturncyrillic 16#0491
+/ghhadeva 16#095a
+/ghhagurmukhi 16#0a5a
+/ghook 16#0260
+/ghzsquare 16#3393
+/gihiragana 16#304e
+/gikatakana 16#30ae
+/gimarmenian 16#0563
+/gimel 16#05d2
+/gimeldagesh 16#fb32
+/gimeldageshhebrew 16#fb32
+/gimelhebrew 16#05d2
+/gjecyrillic 16#0453
+/glottalinvertedstroke 16#01be
+/glottalstop 16#0294
+/glottalstopinverted 16#0296
+/glottalstopmod 16#02c0
+/glottalstopreversed 16#0295
+/glottalstopreversedmod 16#02c1
+/glottalstopreversedsuperior 16#02e4
+/glottalstopstroke 16#02a1
+/glottalstopstrokereversed 16#02a2
+/gmacron 16#1e21
+/gmonospace 16#ff47
+/gohiragana 16#3054
+/gokatakana 16#30b4
+/gparen 16#24a2
+/gpasquare 16#33ac
+/gradient 16#2207
+/grave 16#0060
+/gravebelowcmb 16#0316
+/gravecmb 16#0300
+/gravecomb 16#0300
+/gravedeva 16#0953
+/gravelowmod 16#02ce
+/gravemonospace 16#ff40
+/gravetonecmb 16#0340
+/greater 16#003e
+/greaterequal 16#2265
+/greaterequalorless 16#22db
+/greatermonospace 16#ff1e
+/greaterorequivalent 16#2273
+/greaterorless 16#2277
+/greateroverequal 16#2267
+/greatersmall 16#fe65
+/gscript 16#0261
+/gstroke 16#01e5
+/guhiragana 16#3050
+/guillemotleft 16#00ab
+/guillemotright 16#00bb
+/guilsinglleft 16#2039
+/guilsinglright 16#203a
+/gukatakana 16#30b0
+/guramusquare 16#3318
+/gysquare 16#33c9
+/h 16#0068
+/haabkhasiancyrillic 16#04a9
+/haaltonearabic 16#06c1
+/habengali 16#09b9
+/hadescendercyrillic 16#04b3
+/hadeva 16#0939
+/hagujarati 16#0ab9
+/hagurmukhi 16#0a39
+/haharabic 16#062d
+/hahfinalarabic 16#fea2
+/hahinitialarabic 16#fea3
+/hahiragana 16#306f
+/hahmedialarabic 16#fea4
+/haitusquare 16#332a
+/hakatakana 16#30cf
+/hakatakanahalfwidth 16#ff8a
+/halantgurmukhi 16#0a4d
+/hamzaarabic 16#0621
+/hamzalowarabic 16#0621
+/hangulfiller 16#3164
+/hardsigncyrillic 16#044a
+/harpoonleftbarbup 16#21bc
+/harpoonrightbarbup 16#21c0
+/hasquare 16#33ca
+/hatafpatah 16#05b2
+/hatafpatah16 16#05b2
+/hatafpatah23 16#05b2
+/hatafpatah2f 16#05b2
+/hatafpatahhebrew 16#05b2
+/hatafpatahnarrowhebrew 16#05b2
+/hatafpatahquarterhebrew 16#05b2
+/hatafpatahwidehebrew 16#05b2
+/hatafqamats 16#05b3
+/hatafqamats1b 16#05b3
+/hatafqamats28 16#05b3
+/hatafqamats34 16#05b3
+/hatafqamatshebrew 16#05b3
+/hatafqamatsnarrowhebrew 16#05b3
+/hatafqamatsquarterhebrew 16#05b3
+/hatafqamatswidehebrew 16#05b3
+/hatafsegol 16#05b1
+/hatafsegol17 16#05b1
+/hatafsegol24 16#05b1
+/hatafsegol30 16#05b1
+/hatafsegolhebrew 16#05b1
+/hatafsegolnarrowhebrew 16#05b1
+/hatafsegolquarterhebrew 16#05b1
+/hatafsegolwidehebrew 16#05b1
+/hbar 16#0127
+/hbopomofo 16#310f
+/hbrevebelow 16#1e2b
+/hcedilla 16#1e29
+/hcircle 16#24d7
+/hcircumflex 16#0125
+/hdieresis 16#1e27
+/hdotaccent 16#1e23
+/hdotbelow 16#1e25
+/he 16#05d4
+/heart 16#2665
+/heartsuitblack 16#2665
+/heartsuitwhite 16#2661
+/hedagesh 16#fb34
+/hedageshhebrew 16#fb34
+/hehaltonearabic 16#06c1
+/heharabic 16#0647
+/hehebrew 16#05d4
+/hehfinalaltonearabic 16#fba7
+/hehfinalalttwoarabic 16#feea
+/hehfinalarabic 16#feea
+/hehhamzaabovefinalarabic 16#fba5
+/hehhamzaaboveisolatedarabic 16#fba4
+/hehinitialaltonearabic 16#fba8
+/hehinitialarabic 16#feeb
+/hehiragana 16#3078
+/hehmedialaltonearabic 16#fba9
+/hehmedialarabic 16#feec
+/heiseierasquare 16#337b
+/hekatakana 16#30d8
+/hekatakanahalfwidth 16#ff8d
+/hekutaarusquare 16#3336
+/henghook 16#0267
+/herutusquare 16#3339
+/het 16#05d7
+/hethebrew 16#05d7
+/hhook 16#0266
+/hhooksuperior 16#02b1
+/hieuhacirclekorean 16#327b
+/hieuhaparenkorean 16#321b
+/hieuhcirclekorean 16#326d
+/hieuhkorean 16#314e
+/hieuhparenkorean 16#320d
+/hihiragana 16#3072
+/hikatakana 16#30d2
+/hikatakanahalfwidth 16#ff8b
+/hiriq 16#05b4
+/hiriq14 16#05b4
+/hiriq21 16#05b4
+/hiriq2d 16#05b4
+/hiriqhebrew 16#05b4
+/hiriqnarrowhebrew 16#05b4
+/hiriqquarterhebrew 16#05b4
+/hiriqwidehebrew 16#05b4
+/hlinebelow 16#1e96
+/hmonospace 16#ff48
+/hoarmenian 16#0570
+/hohipthai 16#0e2b
+/hohiragana 16#307b
+/hokatakana 16#30db
+/hokatakanahalfwidth 16#ff8e
+/holam 16#05b9
+/holam19 16#05b9
+/holam26 16#05b9
+/holam32 16#05b9
+/holamhebrew 16#05b9
+/holamnarrowhebrew 16#05b9
+/holamquarterhebrew 16#05b9
+/holamwidehebrew 16#05b9
+/honokhukthai 16#0e2e
+/hookabovecomb 16#0309
+/hookcmb 16#0309
+/hookpalatalizedbelowcmb 16#0321
+/hookretroflexbelowcmb 16#0322
+/hoonsquare 16#3342
+/horicoptic 16#03e9
+/horizontalbar 16#2015
+/horncmb 16#031b
+/hotsprings 16#2668
+/house 16#2302
+/hparen 16#24a3
+/hsuperior 16#02b0
+/hturned 16#0265
+/huhiragana 16#3075
+/huiitosquare 16#3333
+/hukatakana 16#30d5
+/hukatakanahalfwidth 16#ff8c
+/hungarumlaut 16#02dd
+/hungarumlautcmb 16#030b
+/hv 16#0195
+/hyphen 16#002d
+/hypheninferior 16#f6e5
+/hyphenmonospace 16#ff0d
+/hyphensmall 16#fe63
+/hyphensuperior 16#f6e6
+/hyphentwo 16#2010
+/i 16#0069
+/iacute 16#00ed
+/iacyrillic 16#044f
+/ibengali 16#0987
+/ibopomofo 16#3127
+/ibreve 16#012d
+/icaron 16#01d0
+/icircle 16#24d8
+/icircumflex 16#00ee
+/icyrillic 16#0456
+/idblgrave 16#0209
+/ideographearthcircle 16#328f
+/ideographfirecircle 16#328b
+/ideographicallianceparen 16#323f
+/ideographiccallparen 16#323a
+/ideographiccentrecircle 16#32a5
+/ideographicclose 16#3006
+/ideographiccomma 16#3001
+/ideographiccommaleft 16#ff64
+/ideographiccongratulationparen 16#3237
+/ideographiccorrectcircle 16#32a3
+/ideographicearthparen 16#322f
+/ideographicenterpriseparen 16#323d
+/ideographicexcellentcircle 16#329d
+/ideographicfestivalparen 16#3240
+/ideographicfinancialcircle 16#3296
+/ideographicfinancialparen 16#3236
+/ideographicfireparen 16#322b
+/ideographichaveparen 16#3232
+/ideographichighcircle 16#32a4
+/ideographiciterationmark 16#3005
+/ideographiclaborcircle 16#3298
+/ideographiclaborparen 16#3238
+/ideographicleftcircle 16#32a7
+/ideographiclowcircle 16#32a6
+/ideographicmedicinecircle 16#32a9
+/ideographicmetalparen 16#322e
+/ideographicmoonparen 16#322a
+/ideographicnameparen 16#3234
+/ideographicperiod 16#3002
+/ideographicprintcircle 16#329e
+/ideographicreachparen 16#3243
+/ideographicrepresentparen 16#3239
+/ideographicresourceparen 16#323e
+/ideographicrightcircle 16#32a8
+/ideographicsecretcircle 16#3299
+/ideographicselfparen 16#3242
+/ideographicsocietyparen 16#3233
+/ideographicspace 16#3000
+/ideographicspecialparen 16#3235
+/ideographicstockparen 16#3231
+/ideographicstudyparen 16#323b
+/ideographicsunparen 16#3230
+/ideographicsuperviseparen 16#323c
+/ideographicwaterparen 16#322c
+/ideographicwoodparen 16#322d
+/ideographiczero 16#3007
+/ideographmetalcircle 16#328e
+/ideographmooncircle 16#328a
+/ideographnamecircle 16#3294
+/ideographsuncircle 16#3290
+/ideographwatercircle 16#328c
+/ideographwoodcircle 16#328d
+/ideva 16#0907
+/idieresis 16#00ef
+/idieresisacute 16#1e2f
+/idieresiscyrillic 16#04e5
+/idotbelow 16#1ecb
+/iebrevecyrillic 16#04d7
+/iecyrillic 16#0435
+/ieungacirclekorean 16#3275
+/ieungaparenkorean 16#3215
+/ieungcirclekorean 16#3267
+/ieungkorean 16#3147
+/ieungparenkorean 16#3207
+/igrave 16#00ec
+/igujarati 16#0a87
+/igurmukhi 16#0a07
+/ihiragana 16#3044
+/ihookabove 16#1ec9
+/iibengali 16#0988
+/iicyrillic 16#0438
+/iideva 16#0908
+/iigujarati 16#0a88
+/iigurmukhi 16#0a08
+/iimatragurmukhi 16#0a40
+/iinvertedbreve 16#020b
+/iishortcyrillic 16#0439
+/iivowelsignbengali 16#09c0
+/iivowelsigndeva 16#0940
+/iivowelsigngujarati 16#0ac0
+/ij 16#0133
+/ikatakana 16#30a4
+/ikatakanahalfwidth 16#ff72
+/ikorean 16#3163
+/ilde 16#02dc
+/iluyhebrew 16#05ac
+/imacron 16#012b
+/imacroncyrillic 16#04e3
+/imageorapproximatelyequal 16#2253
+/imatragurmukhi 16#0a3f
+/imonospace 16#ff49
+/increment 16#2206
+/infinity 16#221e
+/iniarmenian 16#056b
+/integral 16#222b
+/integralbottom 16#2321
+/integralbt 16#2321
+/integralex 16#f8f5
+/integraltop 16#2320
+/integraltp 16#2320
+/intersection 16#2229
+/intisquare 16#3305
+/invbullet 16#25d8
+/invcircle 16#25d9
+/invsmileface 16#263b
+/iocyrillic 16#0451
+/iogonek 16#012f
+/iota 16#03b9
+/iotadieresis 16#03ca
+/iotadieresistonos 16#0390
+/iotalatin 16#0269
+/iotatonos 16#03af
+/iparen 16#24a4
+/irigurmukhi 16#0a72
+/ismallhiragana 16#3043
+/ismallkatakana 16#30a3
+/ismallkatakanahalfwidth 16#ff68
+/issharbengali 16#09fa
+/istroke 16#0268
+/isuperior 16#f6ed
+/iterationhiragana 16#309d
+/iterationkatakana 16#30fd
+/itilde 16#0129
+/itildebelow 16#1e2d
+/iubopomofo 16#3129
+/iucyrillic 16#044e
+/ivowelsignbengali 16#09bf
+/ivowelsigndeva 16#093f
+/ivowelsigngujarati 16#0abf
+/izhitsacyrillic 16#0475
+/izhitsadblgravecyrillic 16#0477
+/j 16#006a
+/jaarmenian 16#0571
+/jabengali 16#099c
+/jadeva 16#091c
+/jagujarati 16#0a9c
+/jagurmukhi 16#0a1c
+/jbopomofo 16#3110
+/jcaron 16#01f0
+/jcircle 16#24d9
+/jcircumflex 16#0135
+/jcrossedtail 16#029d
+/jdotlessstroke 16#025f
+/jecyrillic 16#0458
+/jeemarabic 16#062c
+/jeemfinalarabic 16#fe9e
+/jeeminitialarabic 16#fe9f
+/jeemmedialarabic 16#fea0
+/jeharabic 16#0698
+/jehfinalarabic 16#fb8b
+/jhabengali 16#099d
+/jhadeva 16#091d
+/jhagujarati 16#0a9d
+/jhagurmukhi 16#0a1d
+/jheharmenian 16#057b
+/jis 16#3004
+/jmonospace 16#ff4a
+/jparen 16#24a5
+/jsuperior 16#02b2
+/k 16#006b
+/kabashkircyrillic 16#04a1
+/kabengali 16#0995
+/kacute 16#1e31
+/kacyrillic 16#043a
+/kadescendercyrillic 16#049b
+/kadeva 16#0915
+/kaf 16#05db
+/kafarabic 16#0643
+/kafdagesh 16#fb3b
+/kafdageshhebrew 16#fb3b
+/kaffinalarabic 16#feda
+/kafhebrew 16#05db
+/kafinitialarabic 16#fedb
+/kafmedialarabic 16#fedc
+/kafrafehebrew 16#fb4d
+/kagujarati 16#0a95
+/kagurmukhi 16#0a15
+/kahiragana 16#304b
+/kahookcyrillic 16#04c4
+/kakatakana 16#30ab
+/kakatakanahalfwidth 16#ff76
+/kappa 16#03ba
+/kappasymbolgreek 16#03f0
+/kapyeounmieumkorean 16#3171
+/kapyeounphieuphkorean 16#3184
+/kapyeounpieupkorean 16#3178
+/kapyeounssangpieupkorean 16#3179
+/karoriisquare 16#330d
+/kashidaautoarabic 16#0640
+/kashidaautonosidebearingarabic 16#0640
+/kasmallkatakana 16#30f5
+/kasquare 16#3384
+/kasraarabic 16#0650
+/kasratanarabic 16#064d
+/kastrokecyrillic 16#049f
+/katahiraprolongmarkhalfwidth 16#ff70
+/kaverticalstrokecyrillic 16#049d
+/kbopomofo 16#310e
+/kcalsquare 16#3389
+/kcaron 16#01e9
+/kcedilla 16#0137
+/kcircle 16#24da
+/kcommaaccent 16#0137
+/kdotbelow 16#1e33
+/keharmenian 16#0584
+/kehiragana 16#3051
+/kekatakana 16#30b1
+/kekatakanahalfwidth 16#ff79
+/kenarmenian 16#056f
+/kesmallkatakana 16#30f6
+/kgreenlandic 16#0138
+/khabengali 16#0996
+/khacyrillic 16#0445
+/khadeva 16#0916
+/khagujarati 16#0a96
+/khagurmukhi 16#0a16
+/khaharabic 16#062e
+/khahfinalarabic 16#fea6
+/khahinitialarabic 16#fea7
+/khahmedialarabic 16#fea8
+/kheicoptic 16#03e7
+/khhadeva 16#0959
+/khhagurmukhi 16#0a59
+/khieukhacirclekorean 16#3278
+/khieukhaparenkorean 16#3218
+/khieukhcirclekorean 16#326a
+/khieukhkorean 16#314b
+/khieukhparenkorean 16#320a
+/khokhaithai 16#0e02
+/khokhonthai 16#0e05
+/khokhuatthai 16#0e03
+/khokhwaithai 16#0e04
+/khomutthai 16#0e5b
+/khook 16#0199
+/khorakhangthai 16#0e06
+/khzsquare 16#3391
+/kihiragana 16#304d
+/kikatakana 16#30ad
+/kikatakanahalfwidth 16#ff77
+/kiroguramusquare 16#3315
+/kiromeetorusquare 16#3316
+/kirosquare 16#3314
+/kiyeokacirclekorean 16#326e
+/kiyeokaparenkorean 16#320e
+/kiyeokcirclekorean 16#3260
+/kiyeokkorean 16#3131
+/kiyeokparenkorean 16#3200
+/kiyeoksioskorean 16#3133
+/kjecyrillic 16#045c
+/klinebelow 16#1e35
+/klsquare 16#3398
+/kmcubedsquare 16#33a6
+/kmonospace 16#ff4b
+/kmsquaredsquare 16#33a2
+/kohiragana 16#3053
+/kohmsquare 16#33c0
+/kokaithai 16#0e01
+/kokatakana 16#30b3
+/kokatakanahalfwidth 16#ff7a
+/kooposquare 16#331e
+/koppacyrillic 16#0481
+/koreanstandardsymbol 16#327f
+/koroniscmb 16#0343
+/kparen 16#24a6
+/kpasquare 16#33aa
+/ksicyrillic 16#046f
+/ktsquare 16#33cf
+/kturned 16#029e
+/kuhiragana 16#304f
+/kukatakana 16#30af
+/kukatakanahalfwidth 16#ff78
+/kvsquare 16#33b8
+/kwsquare 16#33be
+/l 16#006c
+/labengali 16#09b2
+/lacute 16#013a
+/ladeva 16#0932
+/lagujarati 16#0ab2
+/lagurmukhi 16#0a32
+/lakkhangyaothai 16#0e45
+/lamaleffinalarabic 16#fefc
+/lamalefhamzaabovefinalarabic 16#fef8
+/lamalefhamzaaboveisolatedarabic 16#fef7
+/lamalefhamzabelowfinalarabic 16#fefa
+/lamalefhamzabelowisolatedarabic 16#fef9
+/lamalefisolatedarabic 16#fefb
+/lamalefmaddaabovefinalarabic 16#fef6
+/lamalefmaddaaboveisolatedarabic 16#fef5
+/lamarabic 16#0644
+/lambda 16#03bb
+/lambdastroke 16#019b
+/lamed 16#05dc
+/lameddagesh 16#fb3c
+/lameddageshhebrew 16#fb3c
+/lamedhebrew 16#05dc
+/lamfinalarabic 16#fede
+/lamhahinitialarabic 16#fcca
+/laminitialarabic 16#fedf
+/lamjeeminitialarabic 16#fcc9
+/lamkhahinitialarabic 16#fccb
+/lamlamhehisolatedarabic 16#fdf2
+/lammedialarabic 16#fee0
+/lammeemhahinitialarabic 16#fd88
+/lammeeminitialarabic 16#fccc
+/largecircle 16#25ef
+/lbar 16#019a
+/lbelt 16#026c
+/lbopomofo 16#310c
+/lcaron 16#013e
+/lcedilla 16#013c
+/lcircle 16#24db
+/lcircumflexbelow 16#1e3d
+/lcommaaccent 16#013c
+/ldot 16#0140
+/ldotaccent 16#0140
+/ldotbelow 16#1e37
+/ldotbelowmacron 16#1e39
+/leftangleabovecmb 16#031a
+/lefttackbelowcmb 16#0318
+/less 16#003c
+/lessequal 16#2264
+/lessequalorgreater 16#22da
+/lessmonospace 16#ff1c
+/lessorequivalent 16#2272
+/lessorgreater 16#2276
+/lessoverequal 16#2266
+/lesssmall 16#fe64
+/lezh 16#026e
+/lfblock 16#258c
+/lhookretroflex 16#026d
+/lira 16#20a4
+/liwnarmenian 16#056c
+/lj 16#01c9
+/ljecyrillic 16#0459
+/ll 16#f6c0
+/lladeva 16#0933
+/llagujarati 16#0ab3
+/llinebelow 16#1e3b
+/llladeva 16#0934
+/llvocalicbengali 16#09e1
+/llvocalicdeva 16#0961
+/llvocalicvowelsignbengali 16#09e3
+/llvocalicvowelsigndeva 16#0963
+/lmiddletilde 16#026b
+/lmonospace 16#ff4c
+/lmsquare 16#33d0
+/lochulathai 16#0e2c
+/logicaland 16#2227
+/logicalnot 16#00ac
+/logicalnotreversed 16#2310
+/logicalor 16#2228
+/lolingthai 16#0e25
+/longs 16#017f
+/lowlinecenterline 16#fe4e
+/lowlinecmb 16#0332
+/lowlinedashed 16#fe4d
+/lozenge 16#25ca
+/lparen 16#24a7
+/lslash 16#0142
+/lsquare 16#2113
+/lsuperior 16#f6ee
+/ltshade 16#2591
+/luthai 16#0e26
+/lvocalicbengali 16#098c
+/lvocalicdeva 16#090c
+/lvocalicvowelsignbengali 16#09e2
+/lvocalicvowelsigndeva 16#0962
+/lxsquare 16#33d3
+/m 16#006d
+/mabengali 16#09ae
+/macron 16#00af
+/macronbelowcmb 16#0331
+/macroncmb 16#0304
+/macronlowmod 16#02cd
+/macronmonospace 16#ffe3
+/macute 16#1e3f
+/madeva 16#092e
+/magujarati 16#0aae
+/magurmukhi 16#0a2e
+/mahapakhhebrew 16#05a4
+/mahapakhlefthebrew 16#05a4
+/mahiragana 16#307e
+/maichattawalowleftthai 16#f895
+/maichattawalowrightthai 16#f894
+/maichattawathai 16#0e4b
+/maichattawaupperleftthai 16#f893
+/maieklowleftthai 16#f88c
+/maieklowrightthai 16#f88b
+/maiekthai 16#0e48
+/maiekupperleftthai 16#f88a
+/maihanakatleftthai 16#f884
+/maihanakatthai 16#0e31
+/maitaikhuleftthai 16#f889
+/maitaikhuthai 16#0e47
+/maitholowleftthai 16#f88f
+/maitholowrightthai 16#f88e
+/maithothai 16#0e49
+/maithoupperleftthai 16#f88d
+/maitrilowleftthai 16#f892
+/maitrilowrightthai 16#f891
+/maitrithai 16#0e4a
+/maitriupperleftthai 16#f890
+/maiyamokthai 16#0e46
+/makatakana 16#30de
+/makatakanahalfwidth 16#ff8f
+/male 16#2642
+/mansyonsquare 16#3347
+/maqafhebrew 16#05be
+/mars 16#2642
+/masoracirclehebrew 16#05af
+/masquare 16#3383
+/mbopomofo 16#3107
+/mbsquare 16#33d4
+/mcircle 16#24dc
+/mcubedsquare 16#33a5
+/mdotaccent 16#1e41
+/mdotbelow 16#1e43
+/meemarabic 16#0645
+/meemfinalarabic 16#fee2
+/meeminitialarabic 16#fee3
+/meemmedialarabic 16#fee4
+/meemmeeminitialarabic 16#fcd1
+/meemmeemisolatedarabic 16#fc48
+/meetorusquare 16#334d
+/mehiragana 16#3081
+/meizierasquare 16#337e
+/mekatakana 16#30e1
+/mekatakanahalfwidth 16#ff92
+/mem 16#05de
+/memdagesh 16#fb3e
+/memdageshhebrew 16#fb3e
+/memhebrew 16#05de
+/menarmenian 16#0574
+/merkhahebrew 16#05a5
+/merkhakefulahebrew 16#05a6
+/merkhakefulalefthebrew 16#05a6
+/merkhalefthebrew 16#05a5
+/mhook 16#0271
+/mhzsquare 16#3392
+/middledotkatakanahalfwidth 16#ff65
+/middot 16#00b7
+/mieumacirclekorean 16#3272
+/mieumaparenkorean 16#3212
+/mieumcirclekorean 16#3264
+/mieumkorean 16#3141
+/mieumpansioskorean 16#3170
+/mieumparenkorean 16#3204
+/mieumpieupkorean 16#316e
+/mieumsioskorean 16#316f
+/mihiragana 16#307f
+/mikatakana 16#30df
+/mikatakanahalfwidth 16#ff90
+/minus 16#2212
+/minusbelowcmb 16#0320
+/minuscircle 16#2296
+/minusmod 16#02d7
+/minusplus 16#2213
+/minute 16#2032
+/miribaarusquare 16#334a
+/mirisquare 16#3349
+/mlonglegturned 16#0270
+/mlsquare 16#3396
+/mmcubedsquare 16#33a3
+/mmonospace 16#ff4d
+/mmsquaredsquare 16#339f
+/mohiragana 16#3082
+/mohmsquare 16#33c1
+/mokatakana 16#30e2
+/mokatakanahalfwidth 16#ff93
+/molsquare 16#33d6
+/momathai 16#0e21
+/moverssquare 16#33a7
+/moverssquaredsquare 16#33a8
+/mparen 16#24a8
+/mpasquare 16#33ab
+/mssquare 16#33b3
+/msuperior 16#f6ef
+/mturned 16#026f
+/mu 16#00b5
+/mu1 16#00b5
+/muasquare 16#3382
+/muchgreater 16#226b
+/muchless 16#226a
+/mufsquare 16#338c
+/mugreek 16#03bc
+/mugsquare 16#338d
+/muhiragana 16#3080
+/mukatakana 16#30e0
+/mukatakanahalfwidth 16#ff91
+/mulsquare 16#3395
+/multiply 16#00d7
+/mumsquare 16#339b
+/munahhebrew 16#05a3
+/munahlefthebrew 16#05a3
+/musicalnote 16#266a
+/musicalnotedbl 16#266b
+/musicflatsign 16#266d
+/musicsharpsign 16#266f
+/mussquare 16#33b2
+/muvsquare 16#33b6
+/muwsquare 16#33bc
+/mvmegasquare 16#33b9
+/mvsquare 16#33b7
+/mwmegasquare 16#33bf
+/mwsquare 16#33bd
+/n 16#006e
+/nabengali 16#09a8
+/nabla 16#2207
+/nacute 16#0144
+/nadeva 16#0928
+/nagujarati 16#0aa8
+/nagurmukhi 16#0a28
+/nahiragana 16#306a
+/nakatakana 16#30ca
+/nakatakanahalfwidth 16#ff85
+/napostrophe 16#0149
+/nasquare 16#3381
+/nbopomofo 16#310b
+/nbspace 16#00a0
+/ncaron 16#0148
+/ncedilla 16#0146
+/ncircle 16#24dd
+/ncircumflexbelow 16#1e4b
+/ncommaaccent 16#0146
+/ndotaccent 16#1e45
+/ndotbelow 16#1e47
+/nehiragana 16#306d
+/nekatakana 16#30cd
+/nekatakanahalfwidth 16#ff88
+/newsheqelsign 16#20aa
+/nfsquare 16#338b
+/ngabengali 16#0999
+/ngadeva 16#0919
+/ngagujarati 16#0a99
+/ngagurmukhi 16#0a19
+/ngonguthai 16#0e07
+/nhiragana 16#3093
+/nhookleft 16#0272
+/nhookretroflex 16#0273
+/nieunacirclekorean 16#326f
+/nieunaparenkorean 16#320f
+/nieuncieuckorean 16#3135
+/nieuncirclekorean 16#3261
+/nieunhieuhkorean 16#3136
+/nieunkorean 16#3134
+/nieunpansioskorean 16#3168
+/nieunparenkorean 16#3201
+/nieunsioskorean 16#3167
+/nieuntikeutkorean 16#3166
+/nihiragana 16#306b
+/nikatakana 16#30cb
+/nikatakanahalfwidth 16#ff86
+/nikhahitleftthai 16#f899
+/nikhahitthai 16#0e4d
+/nine 16#0039
+/ninearabic 16#0669
+/ninebengali 16#09ef
+/ninecircle 16#2468
+/ninecircleinversesansserif 16#2792
+/ninedeva 16#096f
+/ninegujarati 16#0aef
+/ninegurmukhi 16#0a6f
+/ninehackarabic 16#0669
+/ninehangzhou 16#3029
+/nineideographicparen 16#3228
+/nineinferior 16#2089
+/ninemonospace 16#ff19
+/nineoldstyle 16#f739
+/nineparen 16#247c
+/nineperiod 16#2490
+/ninepersian 16#06f9
+/nineroman 16#2178
+/ninesuperior 16#2079
+/nineteencircle 16#2472
+/nineteenparen 16#2486
+/nineteenperiod 16#249a
+/ninethai 16#0e59
+/nj 16#01cc
+/njecyrillic 16#045a
+/nkatakana 16#30f3
+/nkatakanahalfwidth 16#ff9d
+/nlegrightlong 16#019e
+/nlinebelow 16#1e49
+/nmonospace 16#ff4e
+/nmsquare 16#339a
+/nnabengali 16#09a3
+/nnadeva 16#0923
+/nnagujarati 16#0aa3
+/nnagurmukhi 16#0a23
+/nnnadeva 16#0929
+/nohiragana 16#306e
+/nokatakana 16#30ce
+/nokatakanahalfwidth 16#ff89
+/nonbreakingspace 16#00a0
+/nonenthai 16#0e13
+/nonuthai 16#0e19
+/noonarabic 16#0646
+/noonfinalarabic 16#fee6
+/noonghunnaarabic 16#06ba
+/noonghunnafinalarabic 16#fb9f
+/nooninitialarabic 16#fee7
+/noonjeeminitialarabic 16#fcd2
+/noonjeemisolatedarabic 16#fc4b
+/noonmedialarabic 16#fee8
+/noonmeeminitialarabic 16#fcd5
+/noonmeemisolatedarabic 16#fc4e
+/noonnoonfinalarabic 16#fc8d
+/notcontains 16#220c
+/notelement 16#2209
+/notelementof 16#2209
+/notequal 16#2260
+/notgreater 16#226f
+/notgreaternorequal 16#2271
+/notgreaternorless 16#2279
+/notidentical 16#2262
+/notless 16#226e
+/notlessnorequal 16#2270
+/notparallel 16#2226
+/notprecedes 16#2280
+/notsubset 16#2284
+/notsucceeds 16#2281
+/notsuperset 16#2285
+/nowarmenian 16#0576
+/nparen 16#24a9
+/nssquare 16#33b1
+/nsuperior 16#207f
+/ntilde 16#00f1
+/nu 16#03bd
+/nuhiragana 16#306c
+/nukatakana 16#30cc
+/nukatakanahalfwidth 16#ff87
+/nuktabengali 16#09bc
+/nuktadeva 16#093c
+/nuktagujarati 16#0abc
+/nuktagurmukhi 16#0a3c
+/numbersign 16#0023
+/numbersignmonospace 16#ff03
+/numbersignsmall 16#fe5f
+/numeralsigngreek 16#0374
+/numeralsignlowergreek 16#0375
+/numero 16#2116
+/nun 16#05e0
+/nundagesh 16#fb40
+/nundageshhebrew 16#fb40
+/nunhebrew 16#05e0
+/nvsquare 16#33b5
+/nwsquare 16#33bb
+/nyabengali 16#099e
+/nyadeva 16#091e
+/nyagujarati 16#0a9e
+/nyagurmukhi 16#0a1e
+/o 16#006f
+/oacute 16#00f3
+/oangthai 16#0e2d
+/obarred 16#0275
+/obarredcyrillic 16#04e9
+/obarreddieresiscyrillic 16#04eb
+/obengali 16#0993
+/obopomofo 16#311b
+/obreve 16#014f
+/ocandradeva 16#0911
+/ocandragujarati 16#0a91
+/ocandravowelsigndeva 16#0949
+/ocandravowelsigngujarati 16#0ac9
+/ocaron 16#01d2
+/ocircle 16#24de
+/ocircumflex 16#00f4
+/ocircumflexacute 16#1ed1
+/ocircumflexdotbelow 16#1ed9
+/ocircumflexgrave 16#1ed3
+/ocircumflexhookabove 16#1ed5
+/ocircumflextilde 16#1ed7
+/ocyrillic 16#043e
+/odblacute 16#0151
+/odblgrave 16#020d
+/odeva 16#0913
+/odieresis 16#00f6
+/odieresiscyrillic 16#04e7
+/odotbelow 16#1ecd
+/oe 16#0153
+/oekorean 16#315a
+/ogonek 16#02db
+/ogonekcmb 16#0328
+/ograve 16#00f2
+/ogujarati 16#0a93
+/oharmenian 16#0585
+/ohiragana 16#304a
+/ohookabove 16#1ecf
+/ohorn 16#01a1
+/ohornacute 16#1edb
+/ohorndotbelow 16#1ee3
+/ohorngrave 16#1edd
+/ohornhookabove 16#1edf
+/ohorntilde 16#1ee1
+/ohungarumlaut 16#0151
+/oi 16#01a3
+/oinvertedbreve 16#020f
+/okatakana 16#30aa
+/okatakanahalfwidth 16#ff75
+/okorean 16#3157
+/olehebrew 16#05ab
+/omacron 16#014d
+/omacronacute 16#1e53
+/omacrongrave 16#1e51
+/omdeva 16#0950
+/omega 16#03c9
+/omega1 16#03d6
+/omegacyrillic 16#0461
+/omegalatinclosed 16#0277
+/omegaroundcyrillic 16#047b
+/omegatitlocyrillic 16#047d
+/omegatonos 16#03ce
+/omgujarati 16#0ad0
+/omicron 16#03bf
+/omicrontonos 16#03cc
+/omonospace 16#ff4f
+/one 16#0031
+/onearabic 16#0661
+/onebengali 16#09e7
+/onecircle 16#2460
+/onecircleinversesansserif 16#278a
+/onedeva 16#0967
+/onedotenleader 16#2024
+/oneeighth 16#215b
+/onefitted 16#f6dc
+/onegujarati 16#0ae7
+/onegurmukhi 16#0a67
+/onehackarabic 16#0661
+/onehalf 16#00bd
+/onehangzhou 16#3021
+/oneideographicparen 16#3220
+/oneinferior 16#2081
+/onemonospace 16#ff11
+/onenumeratorbengali 16#09f4
+/oneoldstyle 16#f731
+/oneparen 16#2474
+/oneperiod 16#2488
+/onepersian 16#06f1
+/onequarter 16#00bc
+/oneroman 16#2170
+/onesuperior 16#00b9
+/onethai 16#0e51
+/onethird 16#2153
+/oogonek 16#01eb
+/oogonekmacron 16#01ed
+/oogurmukhi 16#0a13
+/oomatragurmukhi 16#0a4b
+/oopen 16#0254
+/oparen 16#24aa
+/openbullet 16#25e6
+/option 16#2325
+/ordfeminine 16#00aa
+/ordmasculine 16#00ba
+/orthogonal 16#221f
+/oshortdeva 16#0912
+/oshortvowelsigndeva 16#094a
+/oslash 16#00f8
+/oslashacute 16#01ff
+/osmallhiragana 16#3049
+/osmallkatakana 16#30a9
+/osmallkatakanahalfwidth 16#ff6b
+/ostrokeacute 16#01ff
+/osuperior 16#f6f0
+/otcyrillic 16#047f
+/otilde 16#00f5
+/otildeacute 16#1e4d
+/otildedieresis 16#1e4f
+/oubopomofo 16#3121
+/overline 16#203e
+/overlinecenterline 16#fe4a
+/overlinecmb 16#0305
+/overlinedashed 16#fe49
+/overlinedblwavy 16#fe4c
+/overlinewavy 16#fe4b
+/overscore 16#00af
+/ovowelsignbengali 16#09cb
+/ovowelsigndeva 16#094b
+/ovowelsigngujarati 16#0acb
+/p 16#0070
+/paampssquare 16#3380
+/paasentosquare 16#332b
+/pabengali 16#09aa
+/pacute 16#1e55
+/padeva 16#092a
+/pagedown 16#21df
+/pageup 16#21de
+/pagujarati 16#0aaa
+/pagurmukhi 16#0a2a
+/pahiragana 16#3071
+/paiyannoithai 16#0e2f
+/pakatakana 16#30d1
+/palatalizationcyrilliccmb 16#0484
+/palochkacyrillic 16#04c0
+/pansioskorean 16#317f
+/paragraph 16#00b6
+/parallel 16#2225
+/parenleft 16#0028
+/parenleftaltonearabic 16#fd3e
+/parenleftbt 16#f8ed
+/parenleftex 16#f8ec
+/parenleftinferior 16#208d
+/parenleftmonospace 16#ff08
+/parenleftsmall 16#fe59
+/parenleftsuperior 16#207d
+/parenlefttp 16#f8eb
+/parenleftvertical 16#fe35
+/parenright 16#0029
+/parenrightaltonearabic 16#fd3f
+/parenrightbt 16#f8f8
+/parenrightex 16#f8f7
+/parenrightinferior 16#208e
+/parenrightmonospace 16#ff09
+/parenrightsmall 16#fe5a
+/parenrightsuperior 16#207e
+/parenrighttp 16#f8f6
+/parenrightvertical 16#fe36
+/partialdiff 16#2202
+/paseqhebrew 16#05c0
+/pashtahebrew 16#0599
+/pasquare 16#33a9
+/patah 16#05b7
+/patah11 16#05b7
+/patah1d 16#05b7
+/patah2a 16#05b7
+/patahhebrew 16#05b7
+/patahnarrowhebrew 16#05b7
+/patahquarterhebrew 16#05b7
+/patahwidehebrew 16#05b7
+/pazerhebrew 16#05a1
+/pbopomofo 16#3106
+/pcircle 16#24df
+/pdotaccent 16#1e57
+/pe 16#05e4
+/pecyrillic 16#043f
+/pedagesh 16#fb44
+/pedageshhebrew 16#fb44
+/peezisquare 16#333b
+/pefinaldageshhebrew 16#fb43
+/peharabic 16#067e
+/peharmenian 16#057a
+/pehebrew 16#05e4
+/pehfinalarabic 16#fb57
+/pehinitialarabic 16#fb58
+/pehiragana 16#307a
+/pehmedialarabic 16#fb59
+/pekatakana 16#30da
+/pemiddlehookcyrillic 16#04a7
+/perafehebrew 16#fb4e
+/percent 16#0025
+/percentarabic 16#066a
+/percentmonospace 16#ff05
+/percentsmall 16#fe6a
+/period 16#002e
+/periodarmenian 16#0589
+/periodcentered 16#00b7
+/periodhalfwidth 16#ff61
+/periodinferior 16#f6e7
+/periodmonospace 16#ff0e
+/periodsmall 16#fe52
+/periodsuperior 16#f6e8
+/perispomenigreekcmb 16#0342
+/perpendicular 16#22a5
+/perthousand 16#2030
+/peseta 16#20a7
+/pfsquare 16#338a
+/phabengali 16#09ab
+/phadeva 16#092b
+/phagujarati 16#0aab
+/phagurmukhi 16#0a2b
+/phi 16#03c6
+/phi1 16#03d5
+/phieuphacirclekorean 16#327a
+/phieuphaparenkorean 16#321a
+/phieuphcirclekorean 16#326c
+/phieuphkorean 16#314d
+/phieuphparenkorean 16#320c
+/philatin 16#0278
+/phinthuthai 16#0e3a
+/phisymbolgreek 16#03d5
+/phook 16#01a5
+/phophanthai 16#0e1e
+/phophungthai 16#0e1c
+/phosamphaothai 16#0e20
+/pi 16#03c0
+/pieupacirclekorean 16#3273
+/pieupaparenkorean 16#3213
+/pieupcieuckorean 16#3176
+/pieupcirclekorean 16#3265
+/pieupkiyeokkorean 16#3172
+/pieupkorean 16#3142
+/pieupparenkorean 16#3205
+/pieupsioskiyeokkorean 16#3174
+/pieupsioskorean 16#3144
+/pieupsiostikeutkorean 16#3175
+/pieupthieuthkorean 16#3177
+/pieuptikeutkorean 16#3173
+/pihiragana 16#3074
+/pikatakana 16#30d4
+/pisymbolgreek 16#03d6
+/piwrarmenian 16#0583
+/plus 16#002b
+/plusbelowcmb 16#031f
+/pluscircle 16#2295
+/plusminus 16#00b1
+/plusmod 16#02d6
+/plusmonospace 16#ff0b
+/plussmall 16#fe62
+/plussuperior 16#207a
+/pmonospace 16#ff50
+/pmsquare 16#33d8
+/pohiragana 16#307d
+/pointingindexdownwhite 16#261f
+/pointingindexleftwhite 16#261c
+/pointingindexrightwhite 16#261e
+/pointingindexupwhite 16#261d
+/pokatakana 16#30dd
+/poplathai 16#0e1b
+/postalmark 16#3012
+/postalmarkface 16#3020
+/pparen 16#24ab
+/precedes 16#227a
+/prescription 16#211e
+/primemod 16#02b9
+/primereversed 16#2035
+/product 16#220f
+/projective 16#2305
+/prolongedkana 16#30fc
+/propellor 16#2318
+/propersubset 16#2282
+/propersuperset 16#2283
+/proportion 16#2237
+/proportional 16#221d
+/psi 16#03c8
+/psicyrillic 16#0471
+/psilipneumatacyrilliccmb 16#0486
+/pssquare 16#33b0
+/puhiragana 16#3077
+/pukatakana 16#30d7
+/pvsquare 16#33b4
+/pwsquare 16#33ba
+/q 16#0071
+/qadeva 16#0958
+/qadmahebrew 16#05a8
+/qafarabic 16#0642
+/qaffinalarabic 16#fed6
+/qafinitialarabic 16#fed7
+/qafmedialarabic 16#fed8
+/qamats 16#05b8
+/qamats10 16#05b8
+/qamats1a 16#05b8
+/qamats1c 16#05b8
+/qamats27 16#05b8
+/qamats29 16#05b8
+/qamats33 16#05b8
+/qamatsde 16#05b8
+/qamatshebrew 16#05b8
+/qamatsnarrowhebrew 16#05b8
+/qamatsqatanhebrew 16#05b8
+/qamatsqatannarrowhebrew 16#05b8
+/qamatsqatanquarterhebrew 16#05b8
+/qamatsqatanwidehebrew 16#05b8
+/qamatsquarterhebrew 16#05b8
+/qamatswidehebrew 16#05b8
+/qarneyparahebrew 16#059f
+/qbopomofo 16#3111
+/qcircle 16#24e0
+/qhook 16#02a0
+/qmonospace 16#ff51
+/qof 16#05e7
+/qofdagesh 16#fb47
+/qofdageshhebrew 16#fb47
+/qofhebrew 16#05e7
+/qparen 16#24ac
+/quarternote 16#2669
+/qubuts 16#05bb
+/qubuts18 16#05bb
+/qubuts25 16#05bb
+/qubuts31 16#05bb
+/qubutshebrew 16#05bb
+/qubutsnarrowhebrew 16#05bb
+/qubutsquarterhebrew 16#05bb
+/qubutswidehebrew 16#05bb
+/question 16#003f
+/questionarabic 16#061f
+/questionarmenian 16#055e
+/questiondown 16#00bf
+/questiondownsmall 16#f7bf
+/questiongreek 16#037e
+/questionmonospace 16#ff1f
+/questionsmall 16#f73f
+/quotedbl 16#0022
+/quotedblbase 16#201e
+/quotedblleft 16#201c
+/quotedblmonospace 16#ff02
+/quotedblprime 16#301e
+/quotedblprimereversed 16#301d
+/quotedblright 16#201d
+/quoteleft 16#2018
+/quoteleftreversed 16#201b
+/quotereversed 16#201b
+/quoteright 16#2019
+/quoterightn 16#0149
+/quotesinglbase 16#201a
+/quotesingle 16#0027
+/quotesinglemonospace 16#ff07
+/r 16#0072
+/raarmenian 16#057c
+/rabengali 16#09b0
+/racute 16#0155
+/radeva 16#0930
+/radical 16#221a
+/radicalex 16#f8e5
+/radoverssquare 16#33ae
+/radoverssquaredsquare 16#33af
+/radsquare 16#33ad
+/rafe 16#05bf
+/rafehebrew 16#05bf
+/ragujarati 16#0ab0
+/ragurmukhi 16#0a30
+/rahiragana 16#3089
+/rakatakana 16#30e9
+/rakatakanahalfwidth 16#ff97
+/ralowerdiagonalbengali 16#09f1
+/ramiddlediagonalbengali 16#09f0
+/ramshorn 16#0264
+/ratio 16#2236
+/rbopomofo 16#3116
+/rcaron 16#0159
+/rcedilla 16#0157
+/rcircle 16#24e1
+/rcommaaccent 16#0157
+/rdblgrave 16#0211
+/rdotaccent 16#1e59
+/rdotbelow 16#1e5b
+/rdotbelowmacron 16#1e5d
+/referencemark 16#203b
+/reflexsubset 16#2286
+/reflexsuperset 16#2287
+/registered 16#00ae
+/registersans 16#f8e8
+/registerserif 16#f6da
+/reharabic 16#0631
+/reharmenian 16#0580
+/rehfinalarabic 16#feae
+/rehiragana 16#308c
+/rekatakana 16#30ec
+/rekatakanahalfwidth 16#ff9a
+/resh 16#05e8
+/reshdageshhebrew 16#fb48
+/reshhebrew 16#05e8
+/reversedtilde 16#223d
+/reviahebrew 16#0597
+/reviamugrashhebrew 16#0597
+/revlogicalnot 16#2310
+/rfishhook 16#027e
+/rfishhookreversed 16#027f
+/rhabengali 16#09dd
+/rhadeva 16#095d
+/rho 16#03c1
+/rhook 16#027d
+/rhookturned 16#027b
+/rhookturnedsuperior 16#02b5
+/rhosymbolgreek 16#03f1
+/rhotichookmod 16#02de
+/rieulacirclekorean 16#3271
+/rieulaparenkorean 16#3211
+/rieulcirclekorean 16#3263
+/rieulhieuhkorean 16#3140
+/rieulkiyeokkorean 16#313a
+/rieulkiyeoksioskorean 16#3169
+/rieulkorean 16#3139
+/rieulmieumkorean 16#313b
+/rieulpansioskorean 16#316c
+/rieulparenkorean 16#3203
+/rieulphieuphkorean 16#313f
+/rieulpieupkorean 16#313c
+/rieulpieupsioskorean 16#316b
+/rieulsioskorean 16#313d
+/rieulthieuthkorean 16#313e
+/rieultikeutkorean 16#316a
+/rieulyeorinhieuhkorean 16#316d
+/rightangle 16#221f
+/righttackbelowcmb 16#0319
+/righttriangle 16#22bf
+/rihiragana 16#308a
+/rikatakana 16#30ea
+/rikatakanahalfwidth 16#ff98
+/ring 16#02da
+/ringbelowcmb 16#0325
+/ringcmb 16#030a
+/ringhalfleft 16#02bf
+/ringhalfleftarmenian 16#0559
+/ringhalfleftbelowcmb 16#031c
+/ringhalfleftcentered 16#02d3
+/ringhalfright 16#02be
+/ringhalfrightbelowcmb 16#0339
+/ringhalfrightcentered 16#02d2
+/rinvertedbreve 16#0213
+/rittorusquare 16#3351
+/rlinebelow 16#1e5f
+/rlongleg 16#027c
+/rlonglegturned 16#027a
+/rmonospace 16#ff52
+/rohiragana 16#308d
+/rokatakana 16#30ed
+/rokatakanahalfwidth 16#ff9b
+/roruathai 16#0e23
+/rparen 16#24ad
+/rrabengali 16#09dc
+/rradeva 16#0931
+/rragurmukhi 16#0a5c
+/rreharabic 16#0691
+/rrehfinalarabic 16#fb8d
+/rrvocalicbengali 16#09e0
+/rrvocalicdeva 16#0960
+/rrvocalicgujarati 16#0ae0
+/rrvocalicvowelsignbengali 16#09c4
+/rrvocalicvowelsigndeva 16#0944
+/rrvocalicvowelsigngujarati 16#0ac4
+/rsuperior 16#f6f1
+/rtblock 16#2590
+/rturned 16#0279
+/rturnedsuperior 16#02b4
+/ruhiragana 16#308b
+/rukatakana 16#30eb
+/rukatakanahalfwidth 16#ff99
+/rupeemarkbengali 16#09f2
+/rupeesignbengali 16#09f3
+/rupiah 16#f6dd
+/ruthai 16#0e24
+/rvocalicbengali 16#098b
+/rvocalicdeva 16#090b
+/rvocalicgujarati 16#0a8b
+/rvocalicvowelsignbengali 16#09c3
+/rvocalicvowelsigndeva 16#0943
+/rvocalicvowelsigngujarati 16#0ac3
+/s 16#0073
+/sabengali 16#09b8
+/sacute 16#015b
+/sacutedotaccent 16#1e65
+/sadarabic 16#0635
+/sadeva 16#0938
+/sadfinalarabic 16#feba
+/sadinitialarabic 16#febb
+/sadmedialarabic 16#febc
+/sagujarati 16#0ab8
+/sagurmukhi 16#0a38
+/sahiragana 16#3055
+/sakatakana 16#30b5
+/sakatakanahalfwidth 16#ff7b
+/sallallahoualayhewasallamarabic 16#fdfa
+/samekh 16#05e1
+/samekhdagesh 16#fb41
+/samekhdageshhebrew 16#fb41
+/samekhhebrew 16#05e1
+/saraaathai 16#0e32
+/saraaethai 16#0e41
+/saraaimaimalaithai 16#0e44
+/saraaimaimuanthai 16#0e43
+/saraamthai 16#0e33
+/saraathai 16#0e30
+/saraethai 16#0e40
+/saraiileftthai 16#f886
+/saraiithai 16#0e35
+/saraileftthai 16#f885
+/saraithai 16#0e34
+/saraothai 16#0e42
+/saraueeleftthai 16#f888
+/saraueethai 16#0e37
+/saraueleftthai 16#f887
+/sarauethai 16#0e36
+/sarauthai 16#0e38
+/sarauuthai 16#0e39
+/sbopomofo 16#3119
+/scaron 16#0161
+/scarondotaccent 16#1e67
+/scedilla 16#015f
+/schwa 16#0259
+/schwacyrillic 16#04d9
+/schwadieresiscyrillic 16#04db
+/schwahook 16#025a
+/scircle 16#24e2
+/scircumflex 16#015d
+/scommaaccent 16#0219
+/sdotaccent 16#1e61
+/sdotbelow 16#1e63
+/sdotbelowdotaccent 16#1e69
+/seagullbelowcmb 16#033c
+/second 16#2033
+/secondtonechinese 16#02ca
+/section 16#00a7
+/seenarabic 16#0633
+/seenfinalarabic 16#feb2
+/seeninitialarabic 16#feb3
+/seenmedialarabic 16#feb4
+/segol 16#05b6
+/segol13 16#05b6
+/segol1f 16#05b6
+/segol2c 16#05b6
+/segolhebrew 16#05b6
+/segolnarrowhebrew 16#05b6
+/segolquarterhebrew 16#05b6
+/segoltahebrew 16#0592
+/segolwidehebrew 16#05b6
+/seharmenian 16#057d
+/sehiragana 16#305b
+/sekatakana 16#30bb
+/sekatakanahalfwidth 16#ff7e
+/semicolon 16#003b
+/semicolonarabic 16#061b
+/semicolonmonospace 16#ff1b
+/semicolonsmall 16#fe54
+/semivoicedmarkkana 16#309c
+/semivoicedmarkkanahalfwidth 16#ff9f
+/sentisquare 16#3322
+/sentosquare 16#3323
+/seven 16#0037
+/sevenarabic 16#0667
+/sevenbengali 16#09ed
+/sevencircle 16#2466
+/sevencircleinversesansserif 16#2790
+/sevendeva 16#096d
+/seveneighths 16#215e
+/sevengujarati 16#0aed
+/sevengurmukhi 16#0a6d
+/sevenhackarabic 16#0667
+/sevenhangzhou 16#3027
+/sevenideographicparen 16#3226
+/seveninferior 16#2087
+/sevenmonospace 16#ff17
+/sevenoldstyle 16#f737
+/sevenparen 16#247a
+/sevenperiod 16#248e
+/sevenpersian 16#06f7
+/sevenroman 16#2176
+/sevensuperior 16#2077
+/seventeencircle 16#2470
+/seventeenparen 16#2484
+/seventeenperiod 16#2498
+/seventhai 16#0e57
+/sfthyphen 16#00ad
+/shaarmenian 16#0577
+/shabengali 16#09b6
+/shacyrillic 16#0448
+/shaddaarabic 16#0651
+/shaddadammaarabic 16#fc61
+/shaddadammatanarabic 16#fc5e
+/shaddafathaarabic 16#fc60
+/shaddakasraarabic 16#fc62
+/shaddakasratanarabic 16#fc5f
+/shade 16#2592
+/shadedark 16#2593
+/shadelight 16#2591
+/shademedium 16#2592
+/shadeva 16#0936
+/shagujarati 16#0ab6
+/shagurmukhi 16#0a36
+/shalshelethebrew 16#0593
+/shbopomofo 16#3115
+/shchacyrillic 16#0449
+/sheenarabic 16#0634
+/sheenfinalarabic 16#feb6
+/sheeninitialarabic 16#feb7
+/sheenmedialarabic 16#feb8
+/sheicoptic 16#03e3
+/sheqel 16#20aa
+/sheqelhebrew 16#20aa
+/sheva 16#05b0
+/sheva115 16#05b0
+/sheva15 16#05b0
+/sheva22 16#05b0
+/sheva2e 16#05b0
+/shevahebrew 16#05b0
+/shevanarrowhebrew 16#05b0
+/shevaquarterhebrew 16#05b0
+/shevawidehebrew 16#05b0
+/shhacyrillic 16#04bb
+/shimacoptic 16#03ed
+/shin 16#05e9
+/shindagesh 16#fb49
+/shindageshhebrew 16#fb49
+/shindageshshindot 16#fb2c
+/shindageshshindothebrew 16#fb2c
+/shindageshsindot 16#fb2d
+/shindageshsindothebrew 16#fb2d
+/shindothebrew 16#05c1
+/shinhebrew 16#05e9
+/shinshindot 16#fb2a
+/shinshindothebrew 16#fb2a
+/shinsindot 16#fb2b
+/shinsindothebrew 16#fb2b
+/shook 16#0282
+/sigma 16#03c3
+/sigma1 16#03c2
+/sigmafinal 16#03c2
+/sigmalunatesymbolgreek 16#03f2
+/sihiragana 16#3057
+/sikatakana 16#30b7
+/sikatakanahalfwidth 16#ff7c
+/siluqhebrew 16#05bd
+/siluqlefthebrew 16#05bd
+/similar 16#223c
+/sindothebrew 16#05c2
+/siosacirclekorean 16#3274
+/siosaparenkorean 16#3214
+/sioscieuckorean 16#317e
+/sioscirclekorean 16#3266
+/sioskiyeokkorean 16#317a
+/sioskorean 16#3145
+/siosnieunkorean 16#317b
+/siosparenkorean 16#3206
+/siospieupkorean 16#317d
+/siostikeutkorean 16#317c
+/six 16#0036
+/sixarabic 16#0666
+/sixbengali 16#09ec
+/sixcircle 16#2465
+/sixcircleinversesansserif 16#278f
+/sixdeva 16#096c
+/sixgujarati 16#0aec
+/sixgurmukhi 16#0a6c
+/sixhackarabic 16#0666
+/sixhangzhou 16#3026
+/sixideographicparen 16#3225
+/sixinferior 16#2086
+/sixmonospace 16#ff16
+/sixoldstyle 16#f736
+/sixparen 16#2479
+/sixperiod 16#248d
+/sixpersian 16#06f6
+/sixroman 16#2175
+/sixsuperior 16#2076
+/sixteencircle 16#246f
+/sixteencurrencydenominatorbengali 16#09f9
+/sixteenparen 16#2483
+/sixteenperiod 16#2497
+/sixthai 16#0e56
+/slash 16#002f
+/slashmonospace 16#ff0f
+/slong 16#017f
+/slongdotaccent 16#1e9b
+/smileface 16#263a
+/smonospace 16#ff53
+/sofpasuqhebrew 16#05c3
+/softhyphen 16#00ad
+/softsigncyrillic 16#044c
+/sohiragana 16#305d
+/sokatakana 16#30bd
+/sokatakanahalfwidth 16#ff7f
+/soliduslongoverlaycmb 16#0338
+/solidusshortoverlaycmb 16#0337
+/sorusithai 16#0e29
+/sosalathai 16#0e28
+/sosothai 16#0e0b
+/sosuathai 16#0e2a
+/space 16#0020
+/spacehackarabic 16#0020
+/spade 16#2660
+/spadesuitblack 16#2660
+/spadesuitwhite 16#2664
+/sparen 16#24ae
+/squarebelowcmb 16#033b
+/squarecc 16#33c4
+/squarecm 16#339d
+/squarediagonalcrosshatchfill 16#25a9
+/squarehorizontalfill 16#25a4
+/squarekg 16#338f
+/squarekm 16#339e
+/squarekmcapital 16#33ce
+/squareln 16#33d1
+/squarelog 16#33d2
+/squaremg 16#338e
+/squaremil 16#33d5
+/squaremm 16#339c
+/squaremsquared 16#33a1
+/squareorthogonalcrosshatchfill 16#25a6
+/squareupperlefttolowerrightfill 16#25a7
+/squareupperrighttolowerleftfill 16#25a8
+/squareverticalfill 16#25a5
+/squarewhitewithsmallblack 16#25a3
+/srsquare 16#33db
+/ssabengali 16#09b7
+/ssadeva 16#0937
+/ssagujarati 16#0ab7
+/ssangcieuckorean 16#3149
+/ssanghieuhkorean 16#3185
+/ssangieungkorean 16#3180
+/ssangkiyeokkorean 16#3132
+/ssangnieunkorean 16#3165
+/ssangpieupkorean 16#3143
+/ssangsioskorean 16#3146
+/ssangtikeutkorean 16#3138
+/ssuperior 16#f6f2
+/sterling 16#00a3
+/sterlingmonospace 16#ffe1
+/strokelongoverlaycmb 16#0336
+/strokeshortoverlaycmb 16#0335
+/subset 16#2282
+/subsetnotequal 16#228a
+/subsetorequal 16#2286
+/succeeds 16#227b
+/suchthat 16#220b
+/suhiragana 16#3059
+/sukatakana 16#30b9
+/sukatakanahalfwidth 16#ff7d
+/sukunarabic 16#0652
+/summation 16#2211
+/sun 16#263c
+/superset 16#2283
+/supersetnotequal 16#228b
+/supersetorequal 16#2287
+/svsquare 16#33dc
+/syouwaerasquare 16#337c
+/t 16#0074
+/tabengali 16#09a4
+/tackdown 16#22a4
+/tackleft 16#22a3
+/tadeva 16#0924
+/tagujarati 16#0aa4
+/tagurmukhi 16#0a24
+/taharabic 16#0637
+/tahfinalarabic 16#fec2
+/tahinitialarabic 16#fec3
+/tahiragana 16#305f
+/tahmedialarabic 16#fec4
+/taisyouerasquare 16#337d
+/takatakana 16#30bf
+/takatakanahalfwidth 16#ff80
+/tatweelarabic 16#0640
+/tau 16#03c4
+/tav 16#05ea
+/tavdages 16#fb4a
+/tavdagesh 16#fb4a
+/tavdageshhebrew 16#fb4a
+/tavhebrew 16#05ea
+/tbar 16#0167
+/tbopomofo 16#310a
+/tcaron 16#0165
+/tccurl 16#02a8
+/tcedilla 16#0163
+/tcheharabic 16#0686
+/tchehfinalarabic 16#fb7b
+/tchehinitialarabic 16#fb7c
+/tchehmedialarabic 16#fb7d
+/tcircle 16#24e3
+/tcircumflexbelow 16#1e71
+/tcommaaccent 16#0163
+/tdieresis 16#1e97
+/tdotaccent 16#1e6b
+/tdotbelow 16#1e6d
+/tecyrillic 16#0442
+/tedescendercyrillic 16#04ad
+/teharabic 16#062a
+/tehfinalarabic 16#fe96
+/tehhahinitialarabic 16#fca2
+/tehhahisolatedarabic 16#fc0c
+/tehinitialarabic 16#fe97
+/tehiragana 16#3066
+/tehjeeminitialarabic 16#fca1
+/tehjeemisolatedarabic 16#fc0b
+/tehmarbutaarabic 16#0629
+/tehmarbutafinalarabic 16#fe94
+/tehmedialarabic 16#fe98
+/tehmeeminitialarabic 16#fca4
+/tehmeemisolatedarabic 16#fc0e
+/tehnoonfinalarabic 16#fc73
+/tekatakana 16#30c6
+/tekatakanahalfwidth 16#ff83
+/telephone 16#2121
+/telephoneblack 16#260e
+/telishagedolahebrew 16#05a0
+/telishaqetanahebrew 16#05a9
+/tencircle 16#2469
+/tenideographicparen 16#3229
+/tenparen 16#247d
+/tenperiod 16#2491
+/tenroman 16#2179
+/tesh 16#02a7
+/tet 16#05d8
+/tetdagesh 16#fb38
+/tetdageshhebrew 16#fb38
+/tethebrew 16#05d8
+/tetsecyrillic 16#04b5
+/tevirhebrew 16#059b
+/tevirlefthebrew 16#059b
+/thabengali 16#09a5
+/thadeva 16#0925
+/thagujarati 16#0aa5
+/thagurmukhi 16#0a25
+/thalarabic 16#0630
+/thalfinalarabic 16#feac
+/thanthakhatlowleftthai 16#f898
+/thanthakhatlowrightthai 16#f897
+/thanthakhatthai 16#0e4c
+/thanthakhatupperleftthai 16#f896
+/theharabic 16#062b
+/thehfinalarabic 16#fe9a
+/thehinitialarabic 16#fe9b
+/thehmedialarabic 16#fe9c
+/thereexists 16#2203
+/therefore 16#2234
+/theta 16#03b8
+/theta1 16#03d1
+/thetasymbolgreek 16#03d1
+/thieuthacirclekorean 16#3279
+/thieuthaparenkorean 16#3219
+/thieuthcirclekorean 16#326b
+/thieuthkorean 16#314c
+/thieuthparenkorean 16#320b
+/thirteencircle 16#246c
+/thirteenparen 16#2480
+/thirteenperiod 16#2494
+/thonangmonthothai 16#0e11
+/thook 16#01ad
+/thophuthaothai 16#0e12
+/thorn 16#00fe
+/thothahanthai 16#0e17
+/thothanthai 16#0e10
+/thothongthai 16#0e18
+/thothungthai 16#0e16
+/thousandcyrillic 16#0482
+/thousandsseparatorarabic 16#066c
+/thousandsseparatorpersian 16#066c
+/three 16#0033
+/threearabic 16#0663
+/threebengali 16#09e9
+/threecircle 16#2462
+/threecircleinversesansserif 16#278c
+/threedeva 16#0969
+/threeeighths 16#215c
+/threegujarati 16#0ae9
+/threegurmukhi 16#0a69
+/threehackarabic 16#0663
+/threehangzhou 16#3023
+/threeideographicparen 16#3222
+/threeinferior 16#2083
+/threemonospace 16#ff13
+/threenumeratorbengali 16#09f6
+/threeoldstyle 16#f733
+/threeparen 16#2476
+/threeperiod 16#248a
+/threepersian 16#06f3
+/threequarters 16#00be
+/threequartersemdash 16#f6de
+/threeroman 16#2172
+/threesuperior 16#00b3
+/threethai 16#0e53
+/thzsquare 16#3394
+/tihiragana 16#3061
+/tikatakana 16#30c1
+/tikatakanahalfwidth 16#ff81
+/tikeutacirclekorean 16#3270
+/tikeutaparenkorean 16#3210
+/tikeutcirclekorean 16#3262
+/tikeutkorean 16#3137
+/tikeutparenkorean 16#3202
+/tilde 16#02dc
+/tildebelowcmb 16#0330
+/tildecmb 16#0303
+/tildecomb 16#0303
+/tildedoublecmb 16#0360
+/tildeoperator 16#223c
+/tildeoverlaycmb 16#0334
+/tildeverticalcmb 16#033e
+/timescircle 16#2297
+/tipehahebrew 16#0596
+/tipehalefthebrew 16#0596
+/tippigurmukhi 16#0a70
+/titlocyrilliccmb 16#0483
+/tiwnarmenian 16#057f
+/tlinebelow 16#1e6f
+/tmonospace 16#ff54
+/toarmenian 16#0569
+/tohiragana 16#3068
+/tokatakana 16#30c8
+/tokatakanahalfwidth 16#ff84
+/tonebarextrahighmod 16#02e5
+/tonebarextralowmod 16#02e9
+/tonebarhighmod 16#02e6
+/tonebarlowmod 16#02e8
+/tonebarmidmod 16#02e7
+/tonefive 16#01bd
+/tonesix 16#0185
+/tonetwo 16#01a8
+/tonos 16#0384
+/tonsquare 16#3327
+/topatakthai 16#0e0f
+/tortoiseshellbracketleft 16#3014
+/tortoiseshellbracketleftsmall 16#fe5d
+/tortoiseshellbracketleftvertical 16#fe39
+/tortoiseshellbracketright 16#3015
+/tortoiseshellbracketrightsmall 16#fe5e
+/tortoiseshellbracketrightvertical 16#fe3a
+/totaothai 16#0e15
+/tpalatalhook 16#01ab
+/tparen 16#24af
+/trademark 16#2122
+/trademarksans 16#f8ea
+/trademarkserif 16#f6db
+/tretroflexhook 16#0288
+/triagdn 16#25bc
+/triaglf 16#25c4
+/triagrt 16#25ba
+/triagup 16#25b2
+/ts 16#02a6
+/tsadi 16#05e6
+/tsadidagesh 16#fb46
+/tsadidageshhebrew 16#fb46
+/tsadihebrew 16#05e6
+/tsecyrillic 16#0446
+/tsere 16#05b5
+/tsere12 16#05b5
+/tsere1e 16#05b5
+/tsere2b 16#05b5
+/tserehebrew 16#05b5
+/tserenarrowhebrew 16#05b5
+/tserequarterhebrew 16#05b5
+/tserewidehebrew 16#05b5
+/tshecyrillic 16#045b
+/tsuperior 16#f6f3
+/ttabengali 16#099f
+/ttadeva 16#091f
+/ttagujarati 16#0a9f
+/ttagurmukhi 16#0a1f
+/tteharabic 16#0679
+/ttehfinalarabic 16#fb67
+/ttehinitialarabic 16#fb68
+/ttehmedialarabic 16#fb69
+/tthabengali 16#09a0
+/tthadeva 16#0920
+/tthagujarati 16#0aa0
+/tthagurmukhi 16#0a20
+/tturned 16#0287
+/tuhiragana 16#3064
+/tukatakana 16#30c4
+/tukatakanahalfwidth 16#ff82
+/tusmallhiragana 16#3063
+/tusmallkatakana 16#30c3
+/tusmallkatakanahalfwidth 16#ff6f
+/twelvecircle 16#246b
+/twelveparen 16#247f
+/twelveperiod 16#2493
+/twelveroman 16#217b
+/twentycircle 16#2473
+/twentyhangzhou 16#5344
+/twentyparen 16#2487
+/twentyperiod 16#249b
+/two 16#0032
+/twoarabic 16#0662
+/twobengali 16#09e8
+/twocircle 16#2461
+/twocircleinversesansserif 16#278b
+/twodeva 16#0968
+/twodotenleader 16#2025
+/twodotleader 16#2025
+/twodotleadervertical 16#fe30
+/twogujarati 16#0ae8
+/twogurmukhi 16#0a68
+/twohackarabic 16#0662
+/twohangzhou 16#3022
+/twoideographicparen 16#3221
+/twoinferior 16#2082
+/twomonospace 16#ff12
+/twonumeratorbengali 16#09f5
+/twooldstyle 16#f732
+/twoparen 16#2475
+/twoperiod 16#2489
+/twopersian 16#06f2
+/tworoman 16#2171
+/twostroke 16#01bb
+/twosuperior 16#00b2
+/twothai 16#0e52
+/twothirds 16#2154
+/u 16#0075
+/uacute 16#00fa
+/ubar 16#0289
+/ubengali 16#0989
+/ubopomofo 16#3128
+/ubreve 16#016d
+/ucaron 16#01d4
+/ucircle 16#24e4
+/ucircumflex 16#00fb
+/ucircumflexbelow 16#1e77
+/ucyrillic 16#0443
+/udattadeva 16#0951
+/udblacute 16#0171
+/udblgrave 16#0215
+/udeva 16#0909
+/udieresis 16#00fc
+/udieresisacute 16#01d8
+/udieresisbelow 16#1e73
+/udieresiscaron 16#01da
+/udieresiscyrillic 16#04f1
+/udieresisgrave 16#01dc
+/udieresismacron 16#01d6
+/udotbelow 16#1ee5
+/ugrave 16#00f9
+/ugujarati 16#0a89
+/ugurmukhi 16#0a09
+/uhiragana 16#3046
+/uhookabove 16#1ee7
+/uhorn 16#01b0
+/uhornacute 16#1ee9
+/uhorndotbelow 16#1ef1
+/uhorngrave 16#1eeb
+/uhornhookabove 16#1eed
+/uhorntilde 16#1eef
+/uhungarumlaut 16#0171
+/uhungarumlautcyrillic 16#04f3
+/uinvertedbreve 16#0217
+/ukatakana 16#30a6
+/ukatakanahalfwidth 16#ff73
+/ukcyrillic 16#0479
+/ukorean 16#315c
+/umacron 16#016b
+/umacroncyrillic 16#04ef
+/umacrondieresis 16#1e7b
+/umatragurmukhi 16#0a41
+/umonospace 16#ff55
+/underscore 16#005f
+/underscoredbl 16#2017
+/underscoremonospace 16#ff3f
+/underscorevertical 16#fe33
+/underscorewavy 16#fe4f
+/union 16#222a
+/universal 16#2200
+/uogonek 16#0173
+/uparen 16#24b0
+/upblock 16#2580
+/upperdothebrew 16#05c4
+/upsilon 16#03c5
+/upsilondieresis 16#03cb
+/upsilondieresistonos 16#03b0
+/upsilonlatin 16#028a
+/upsilontonos 16#03cd
+/uptackbelowcmb 16#031d
+/uptackmod 16#02d4
+/uragurmukhi 16#0a73
+/uring 16#016f
+/ushortcyrillic 16#045e
+/usmallhiragana 16#3045
+/usmallkatakana 16#30a5
+/usmallkatakanahalfwidth 16#ff69
+/ustraightcyrillic 16#04af
+/ustraightstrokecyrillic 16#04b1
+/utilde 16#0169
+/utildeacute 16#1e79
+/utildebelow 16#1e75
+/uubengali 16#098a
+/uudeva 16#090a
+/uugujarati 16#0a8a
+/uugurmukhi 16#0a0a
+/uumatragurmukhi 16#0a42
+/uuvowelsignbengali 16#09c2
+/uuvowelsigndeva 16#0942
+/uuvowelsigngujarati 16#0ac2
+/uvowelsignbengali 16#09c1
+/uvowelsigndeva 16#0941
+/uvowelsigngujarati 16#0ac1
+/v 16#0076
+/vadeva 16#0935
+/vagujarati 16#0ab5
+/vagurmukhi 16#0a35
+/vakatakana 16#30f7
+/vav 16#05d5
+/vavdagesh 16#fb35
+/vavdagesh65 16#fb35
+/vavdageshhebrew 16#fb35
+/vavhebrew 16#05d5
+/vavholam 16#fb4b
+/vavholamhebrew 16#fb4b
+/vavvavhebrew 16#05f0
+/vavyodhebrew 16#05f1
+/vcircle 16#24e5
+/vdotbelow 16#1e7f
+/vecyrillic 16#0432
+/veharabic 16#06a4
+/vehfinalarabic 16#fb6b
+/vehinitialarabic 16#fb6c
+/vehmedialarabic 16#fb6d
+/vekatakana 16#30f9
+/venus 16#2640
+/verticalbar 16#007c
+/verticallineabovecmb 16#030d
+/verticallinebelowcmb 16#0329
+/verticallinelowmod 16#02cc
+/verticallinemod 16#02c8
+/vewarmenian 16#057e
+/vhook 16#028b
+/vikatakana 16#30f8
+/viramabengali 16#09cd
+/viramadeva 16#094d
+/viramagujarati 16#0acd
+/visargabengali 16#0983
+/visargadeva 16#0903
+/visargagujarati 16#0a83
+/vmonospace 16#ff56
+/voarmenian 16#0578
+/voicediterationhiragana 16#309e
+/voicediterationkatakana 16#30fe
+/voicedmarkkana 16#309b
+/voicedmarkkanahalfwidth 16#ff9e
+/vokatakana 16#30fa
+/vparen 16#24b1
+/vtilde 16#1e7d
+/vturned 16#028c
+/vuhiragana 16#3094
+/vukatakana 16#30f4
+/w 16#0077
+/wacute 16#1e83
+/waekorean 16#3159
+/wahiragana 16#308f
+/wakatakana 16#30ef
+/wakatakanahalfwidth 16#ff9c
+/wakorean 16#3158
+/wasmallhiragana 16#308e
+/wasmallkatakana 16#30ee
+/wattosquare 16#3357
+/wavedash 16#301c
+/wavyunderscorevertical 16#fe34
+/wawarabic 16#0648
+/wawfinalarabic 16#feee
+/wawhamzaabovearabic 16#0624
+/wawhamzaabovefinalarabic 16#fe86
+/wbsquare 16#33dd
+/wcircle 16#24e6
+/wcircumflex 16#0175
+/wdieresis 16#1e85
+/wdotaccent 16#1e87
+/wdotbelow 16#1e89
+/wehiragana 16#3091
+/weierstrass 16#2118
+/wekatakana 16#30f1
+/wekorean 16#315e
+/weokorean 16#315d
+/wgrave 16#1e81
+/whitebullet 16#25e6
+/whitecircle 16#25cb
+/whitecircleinverse 16#25d9
+/whitecornerbracketleft 16#300e
+/whitecornerbracketleftvertical 16#fe43
+/whitecornerbracketright 16#300f
+/whitecornerbracketrightvertical 16#fe44
+/whitediamond 16#25c7
+/whitediamondcontainingblacksmalldiamond 16#25c8
+/whitedownpointingsmalltriangle 16#25bf
+/whitedownpointingtriangle 16#25bd
+/whiteleftpointingsmalltriangle 16#25c3
+/whiteleftpointingtriangle 16#25c1
+/whitelenticularbracketleft 16#3016
+/whitelenticularbracketright 16#3017
+/whiterightpointingsmalltriangle 16#25b9
+/whiterightpointingtriangle 16#25b7
+/whitesmallsquare 16#25ab
+/whitesmilingface 16#263a
+/whitesquare 16#25a1
+/whitestar 16#2606
+/whitetelephone 16#260f
+/whitetortoiseshellbracketleft 16#3018
+/whitetortoiseshellbracketright 16#3019
+/whiteuppointingsmalltriangle 16#25b5
+/whiteuppointingtriangle 16#25b3
+/wihiragana 16#3090
+/wikatakana 16#30f0
+/wikorean 16#315f
+/wmonospace 16#ff57
+/wohiragana 16#3092
+/wokatakana 16#30f2
+/wokatakanahalfwidth 16#ff66
+/won 16#20a9
+/wonmonospace 16#ffe6
+/wowaenthai 16#0e27
+/wparen 16#24b2
+/wring 16#1e98
+/wsuperior 16#02b7
+/wturned 16#028d
+/wynn 16#01bf
+/x 16#0078
+/xabovecmb 16#033d
+/xbopomofo 16#3112
+/xcircle 16#24e7
+/xdieresis 16#1e8d
+/xdotaccent 16#1e8b
+/xeharmenian 16#056d
+/xi 16#03be
+/xmonospace 16#ff58
+/xparen 16#24b3
+/xsuperior 16#02e3
+/y 16#0079
+/yaadosquare 16#334e
+/yabengali 16#09af
+/yacute 16#00fd
+/yadeva 16#092f
+/yaekorean 16#3152
+/yagujarati 16#0aaf
+/yagurmukhi 16#0a2f
+/yahiragana 16#3084
+/yakatakana 16#30e4
+/yakatakanahalfwidth 16#ff94
+/yakorean 16#3151
+/yamakkanthai 16#0e4e
+/yasmallhiragana 16#3083
+/yasmallkatakana 16#30e3
+/yasmallkatakanahalfwidth 16#ff6c
+/yatcyrillic 16#0463
+/ycircle 16#24e8
+/ycircumflex 16#0177
+/ydieresis 16#00ff
+/ydotaccent 16#1e8f
+/ydotbelow 16#1ef5
+/yeharabic 16#064a
+/yehbarreearabic 16#06d2
+/yehbarreefinalarabic 16#fbaf
+/yehfinalarabic 16#fef2
+/yehhamzaabovearabic 16#0626
+/yehhamzaabovefinalarabic 16#fe8a
+/yehhamzaaboveinitialarabic 16#fe8b
+/yehhamzaabovemedialarabic 16#fe8c
+/yehinitialarabic 16#fef3
+/yehmedialarabic 16#fef4
+/yehmeeminitialarabic 16#fcdd
+/yehmeemisolatedarabic 16#fc58
+/yehnoonfinalarabic 16#fc94
+/yehthreedotsbelowarabic 16#06d1
+/yekorean 16#3156
+/yen 16#00a5
+/yenmonospace 16#ffe5
+/yeokorean 16#3155
+/yeorinhieuhkorean 16#3186
+/yerahbenyomohebrew 16#05aa
+/yerahbenyomolefthebrew 16#05aa
+/yericyrillic 16#044b
+/yerudieresiscyrillic 16#04f9
+/yesieungkorean 16#3181
+/yesieungpansioskorean 16#3183
+/yesieungsioskorean 16#3182
+/yetivhebrew 16#059a
+/ygrave 16#1ef3
+/yhook 16#01b4
+/yhookabove 16#1ef7
+/yiarmenian 16#0575
+/yicyrillic 16#0457
+/yikorean 16#3162
+/yinyang 16#262f
+/yiwnarmenian 16#0582
+/ymonospace 16#ff59
+/yod 16#05d9
+/yoddagesh 16#fb39
+/yoddageshhebrew 16#fb39
+/yodhebrew 16#05d9
+/yodyodhebrew 16#05f2
+/yodyodpatahhebrew 16#fb1f
+/yohiragana 16#3088
+/yoikorean 16#3189
+/yokatakana 16#30e8
+/yokatakanahalfwidth 16#ff96
+/yokorean 16#315b
+/yosmallhiragana 16#3087
+/yosmallkatakana 16#30e7
+/yosmallkatakanahalfwidth 16#ff6e
+/yotgreek 16#03f3
+/yoyaekorean 16#3188
+/yoyakorean 16#3187
+/yoyakthai 16#0e22
+/yoyingthai 16#0e0d
+/yparen 16#24b4
+/ypogegrammeni 16#037a
+/ypogegrammenigreekcmb 16#0345
+/yr 16#01a6
+/yring 16#1e99
+/ysuperior 16#02b8
+/ytilde 16#1ef9
+/yturned 16#028e
+/yuhiragana 16#3086
+/yuikorean 16#318c
+/yukatakana 16#30e6
+/yukatakanahalfwidth 16#ff95
+/yukorean 16#3160
+/yusbigcyrillic 16#046b
+/yusbigiotifiedcyrillic 16#046d
+/yuslittlecyrillic 16#0467
+/yuslittleiotifiedcyrillic 16#0469
+/yusmallhiragana 16#3085
+/yusmallkatakana 16#30e5
+/yusmallkatakanahalfwidth 16#ff6d
+/yuyekorean 16#318b
+/yuyeokorean 16#318a
+/yyabengali 16#09df
+/yyadeva 16#095f
+/z 16#007a
+/zaarmenian 16#0566
+/zacute 16#017a
+/zadeva 16#095b
+/zagurmukhi 16#0a5b
+/zaharabic 16#0638
+/zahfinalarabic 16#fec6
+/zahinitialarabic 16#fec7
+/zahiragana 16#3056
+/zahmedialarabic 16#fec8
+/zainarabic 16#0632
+/zainfinalarabic 16#feb0
+/zakatakana 16#30b6
+/zaqefgadolhebrew 16#0595
+/zaqefqatanhebrew 16#0594
+/zarqahebrew 16#0598
+/zayin 16#05d6
+/zayindagesh 16#fb36
+/zayindageshhebrew 16#fb36
+/zayinhebrew 16#05d6
+/zbopomofo 16#3117
+/zcaron 16#017e
+/zcircle 16#24e9
+/zcircumflex 16#1e91
+/zcurl 16#0291
+/zdot 16#017c
+/zdotaccent 16#017c
+/zdotbelow 16#1e93
+/zecyrillic 16#0437
+/zedescendercyrillic 16#0499
+/zedieresiscyrillic 16#04df
+/zehiragana 16#305c
+/zekatakana 16#30bc
+/zero 16#0030
+/zeroarabic 16#0660
+/zerobengali 16#09e6
+/zerodeva 16#0966
+/zerogujarati 16#0ae6
+/zerogurmukhi 16#0a66
+/zerohackarabic 16#0660
+/zeroinferior 16#2080
+/zeromonospace 16#ff10
+/zerooldstyle 16#f730
+/zeropersian 16#06f0
+/zerosuperior 16#2070
+/zerothai 16#0e50
+/zerowidthjoiner 16#feff
+/zerowidthnonjoiner 16#200c
+/zerowidthspace 16#200b
+/zeta 16#03b6
+/zhbopomofo 16#3113
+/zhearmenian 16#056a
+/zhebrevecyrillic 16#04c2
+/zhecyrillic 16#0436
+/zhedescendercyrillic 16#0497
+/zhedieresiscyrillic 16#04dd
+/zihiragana 16#3058
+/zikatakana 16#30b8
+/zinorhebrew 16#05ae
+/zlinebelow 16#1e95
+/zmonospace 16#ff5a
+/zohiragana 16#305e
+/zokatakana 16#30be
+/zparen 16#24b5
+/zretroflexhook 16#0290
+/zstroke 16#01b6
+/zuhiragana 16#305a
+/zukatakana 16#30ba
+.dicttomark readonly def
+/currentglobal where
+{pop currentglobal{setglobal}true setglobal}
+{{}}
+ifelse
+/MacRomanEncoding .findencoding
+/MacGlyphEncoding
+/.notdef/.null/CR
+4 index 32 95 getinterval aload pop
+99 index 128 45 getinterval aload pop
+/notequal/AE
+/Oslash/infinity/plusminus/lessequal/greaterequal
+/yen/mu1/partialdiff/summation/product
+/pi/integral/ordfeminine/ordmasculine/Ohm
+/ae/oslash/questiondown/exclamdown/logicalnot
+/radical/florin/approxequal/increment/guillemotleft
+/guillemotright/ellipsis/nbspace
+174 index 203 12 getinterval aload pop
+/lozenge
+187 index 216 24 getinterval aload pop
+/applelogo
+212 index 241 7 getinterval aload pop
+/overscore
+220 index 249 7 getinterval aload pop
+/Lslash/lslash/Scaron/scaron
+/Zcaron/zcaron/brokenbar/Eth/eth
+/Yacute/yacute/Thorn/thorn/minus
+/multiply/onesuperior/twosuperior/threesuperior/onehalf
+/onequarter/threequarters/franc/Gbreve/gbreve
+/Idotaccent/Scedilla/scedilla/Cacute/cacute
+/Ccaron/ccaron/dmacron
+260 -1 roll pop
+258 packedarray
+7 1 index .registerencoding
+.defineencoding
+exec
+
+%%BeginResource: file (PDF object obj_1)
+1 0 obj
+<<>>endobj
+%%EndResource
+%%EndProlog
+%begin_xml_code
+/pdfmark where {pop true} {false} ifelse
+/currentdistillerparams where {pop currentdistillerparams
+/CoreDistVersion get 5000 ge } {false} ifelse
+and not {userdict /pdfmark /cleartomark load put} if
+[/NamespacePush pdfmark
+[/_objdef {exiftool_metadata_stream} /type /stream /OBJ pdfmark
+[{exiftool_metadata_stream} 2 dict begin /Type /Metadata def
+ /Subtype /XML def currentdict end /PUT pdfmark
+/MetadataString 2943 string def % exact length of metadata
+/TempString 100 string def
+/ConsumeMetadata {
+currentfile TempString readline pop pop
+currentfile MetadataString readstring pop pop
+} bind def
+ConsumeMetadata
+%begin_xml_packet: 2943
+<?xpacket begin='' 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:dc='http://purl.org/dc/elements/1.1/'>
+ <dc:creator>
+ <rdf:Seq>
+ <rdf:li>Zamzar</rdf:li>
+ </rdf:Seq>
+ </dc:creator>
+ </rdf:Description>
+
+ <rdf:Description rdf:about=''
+ xmlns:pdf='http://ns.adobe.com/pdf/1.3/'>
+ <pdf:Producer>Zamzar</pdf:Producer>
+ </rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end='w'?>
+%end_xml_packet
+[{exiftool_metadata_stream} MetadataString /PUT pdfmark
+[/Document 1 dict begin
+ /Metadata {exiftool_metadata_stream} def currentdict end /BDC pdfmark
+[/NamespacePop pdfmark
+%end_xml_code
+%%Page: 1 1
+%%BeginPageSetup
+4 0 obj
+<</Type/Page/MediaBox [0 0 256 256]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+%%EndPageSetup
+/pagesave save def
+5 0 obj
+<</Length 2539>>stream
+q 0.1 0 0 0.1 0 0 cm
+0.462646 0.290283 0.736328 RG
+0.462646 0.290283 0.736328 rg
+600 2560 m
+1960 2560 l
+2291.37 2560 2560 2291.37 2560 1960 c
+2560 600 l
+2560 268.629 2291.37 0 1960 0 c
+600 0 l
+268.629 0 0 268.629 0 600 c
+0 1960 l
+0 2291.37 268.629 2560 600 2560 c
+h
+600 2560 m
+f
+1 1 1 RG
+1 1 1 rg
+1665.78 904.02 m
+1739.61 911.641 1795.59 975.27 1793.05 1051.64 c
+1790.51 1127.97 1726.88 1189.06 1650.51 1189.06 c
+1645.43 1189.06 l
+1566.52 1186.52 1505.47 1120.35 1508.01 1041.45 c
+1510.55 1003.28 1525.82 970.199 1548.71 947.27 c
+1462.19 776.762 1329.84 652.031 1131.33 547.699 c
+996.449 476.449 856.449 450.98 716.48 468.789 c
+601.949 484.059 512.852 534.961 456.879 618.949 c
+375.43 743.672 367.809 878.551 436.52 1013.44 c
+484.879 1110.16 561.211 1181.45 609.57 1217.07 c
+599.41 1250.16 584.141 1306.13 576.48 1346.87 c
+207.461 1079.61 245.629 718.199 357.621 547.699 c
+441.602 420.469 612.109 341.559 800.469 341.559 c
+851.371 341.559 902.27 346.641 953.16 359.371 c
+1278.95 423.012 1525.82 616.41 1665.78 904.02 c
+h
+1665.78 904.02 m
+f
+2113.71 1219.61 m
+1920.31 1446.13 1635.23 1570.82 1309.49 1570.82 c
+1268.75 1570.82 l
+1245.86 1616.64 1197.5 1647.19 1144.06 1647.19 c
+1138.95 1647.19 l
+1060.08 1644.65 998.98 1578.48 1001.52 1499.57 c
+1004.06 1423.2 1067.7 1362.15 1144.06 1362.15 c
+1149.14 1362.15 l
+1205.12 1364.69 1253.48 1400.31 1273.87 1448.67 c
+1319.65 1448.67 l
+1513.09 1448.67 1696.33 1392.66 1861.76 1283.24 c
+1989.02 1199.26 2080.63 1089.8 2131.52 957.461 c
+2174.8 850.59 2172.27 746.211 2126.45 657.148 c
+2055.2 522.27 1935.59 448.441 1777.77 448.441 c
+1675.98 448.441 1579.26 478.98 1528.36 501.871 c
+1500.35 476.449 1449.45 435.699 1413.83 410.27 c
+1523.24 359.371 1635.23 331.371 1742.15 331.371 c
+1986.48 331.371 2167.19 466.25 2235.9 601.129 c
+2309.69 748.75 2304.61 1003.28 2113.71 1219.61 c
+h
+2113.71 1219.61 m
+f
+820.82 860.738 m
+823.359 784.371 886.988 723.32 963.359 723.32 c
+968.441 723.32 l
+1047.34 725.859 1108.44 792.031 1105.86 870.941 c
+1103.32 947.27 1039.69 1008.36 963.359 1008.36 c
+958.238 1008.36 l
+953.16 1008.36 945.551 1008.36 940.43 1005.82 c
+836.09 1178.87 792.809 1367.23 808.09 1570.82 c
+818.281 1723.52 869.18 1855.86 958.238 1965.31 c
+1032.07 2059.49 1174.61 2105.27 1271.29 2107.85 c
+1541.09 2112.93 1655.63 1776.99 1663.24 1642.07 c
+1696.33 1634.45 1752.3 1616.64 1790.51 1603.91 c
+1759.96 2016.21 1505.47 2230 1261.13 2230 c
+1032.07 2230 820.82 2064.57 736.84 1820.23 c
+619.77 1494.45 696.09 1181.45 838.629 934.531 c
+825.898 916.762 818.281 888.75 820.82 860.738 c
+h
+820.82 860.738 m
+f
+Q
+
+endstream
+endobj
+pagesave restore
+%%PageTrailer
+%%Trailer
+end
+[/EMC pdfmark
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..6be7bab239
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Dark.eps
new file mode 100644
index 0000000000..cb9be684b9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..10e2251952
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Light.eps
new file mode 100644
index 0000000000..00f3860754
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Regex-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..1198fa444d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Dark.eps
new file mode 100644
index 0000000000..d04ee78f62
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..9851e833af
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Light-eps-converted-to.pdf
@@ -0,0 +1,103 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+6 0 obj
+<</Length 7 0 R/Filter /FlateDecode>>
+stream
+xU10
+)%RI|?CYR p0!E?2dk_niXL =|M8Pη$օ/K눰K]6/](Cu%-wdKz{4}M(E*ҖU> AudBe µ
+9a%iz2D-Th-J_:ϵT0%4M9k{!pm!蝉]%:p@)<dyzFy 11c1b*y_t8 }̃/+s>X`h"[2$}biNc9WȎj1"*Le(F(Ė
+nn["ӰT맏>SGDNe
+4s{sGM15sd''
+^DN`cЊ;Ǘ'<&GTu%,z4ޞ~+1ȿS_N˗iDMendstream
+endobj
+7 0 obj
+525
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Group 5 0 R
+/Resources<</ProcSet[/PDF]
+/ExtGState 10 0 R
+>>
+/Contents 6 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 11 0 R
+>>
+endobj
+8 0 obj
+<</Type/ExtGState
+/AIS false
+/CA 0.8
+/ca 0.8>>endobj
+9 0 obj
+<</Type/ExtGState
+/AIS false
+/CA 1
+/ca 1>>endobj
+10 0 obj
+<</R9
+9 0 R/R8
+8 0 R>>
+endobj
+5 0 obj
+<</Type/Group
+/S/Transparency
+/I true
+/CS/DeviceRGB>>endobj
+11 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:23:10+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:23:10+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:d82b8879-143f-11ef-0000-824f239479ae'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132310+02'00')
+/ModDate(D:20240514132310+02'00')>>endobj
+xref
+0 12
+0000000000 65535 f
+0000001103 00000 n
+0000002652 00000 n
+0000001044 00000 n
+0000000899 00000 n
+0000001325 00000 n
+0000000285 00000 n
+0000000880 00000 n
+0000001168 00000 n
+0000001229 00000 n
+0000001286 00000 n
+0000001393 00000 n
+trailer
+<< /Size 12 /Root 1 0 R /Info 2 0 R
+/ID [<6904C338649981BA2BA7384F0A7B9916><6904C338649981BA2BA7384F0A7B9916>]
+>>
+startxref
+2777
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Light.eps
new file mode 100644
index 0000000000..619cc276d9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Remix-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..c0c9e67e4e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Dark.eps
new file mode 100644
index 0000000000..12b1a64a90
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..e052b17ec3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Light-eps-converted-to.pdf
@@ -0,0 +1,73 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x]QKn0>e|RyI)q`&?1'Y?;4"ptjPSE׫Ntêp.yxiiW(Em/>xS z>t:U"T{ˠ"SGi\,dbeHLctg`l|),g0
+S=HlOǭpܺP&*BI9$J3iv{~ ڹ/"q! Czz9j7pKp?[x(sP<\+^g[vzpendstream
+endobj
+6 0 obj
+312
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:23:12+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:23:12+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:d95cb579-143f-11ef-0000-07f1bd75a8c2'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132312+02'00')
+/ModDate(D:20240514132312+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000859 00000 n
+0000002181 00000 n
+0000000800 00000 n
+0000000686 00000 n
+0000000285 00000 n
+0000000667 00000 n
+0000000923 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<032D6EA97672D059971706A8DAA8F695><032D6EA97672D059971706A8DAA8F695>]
+>>
+startxref
+2306
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Light.eps
new file mode 100644
index 0000000000..8688da89d1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Replit-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..85124d3585
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Dark.eps
new file mode 100644
index 0000000000..146e5a6e4f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..633ac51f5b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Light.eps
new file mode 100644
index 0000000000..cc49fb19a4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rider-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RobloxStudio-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RobloxStudio-eps-converted-to.pdf
new file mode 100644
index 0000000000..c47e6d833b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RobloxStudio-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RobloxStudio.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RobloxStudio.eps
new file mode 100644
index 0000000000..64eae2e58b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RobloxStudio.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rocket-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rocket-eps-converted-to.pdf
new file mode 100644
index 0000000000..e88a0ebccf
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rocket-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rocket.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rocket.eps
new file mode 100644
index 0000000000..efdbdfd9e4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rocket.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..8e74542e52
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Dark.eps
new file mode 100644
index 0000000000..254aab2f4b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..15cd69d915
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Light.eps
new file mode 100644
index 0000000000..61f272d408
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_RollupJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ruby-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ruby-eps-converted-to.pdf
new file mode 100644
index 0000000000..bc4e866f12
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ruby-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ruby.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ruby.eps
new file mode 100644
index 0000000000..b1c76e5190
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ruby.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rust-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rust-eps-converted-to.pdf
new file mode 100644
index 0000000000..8a7ca66df0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rust-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Rust.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rust.eps
new file mode 100644
index 0000000000..81abbc04e9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Rust.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SQLite-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_SQLite-eps-converted-to.pdf
new file mode 100644
index 0000000000..812cf45e26
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SQLite-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SQLite.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_SQLite.eps
new file mode 100644
index 0000000000..8edefa1d65
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SQLite.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..367fe80a7e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Dark.eps
new file mode 100644
index 0000000000..9808dd6367
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..e53da490b0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Light.eps
new file mode 100644
index 0000000000..90b34d9425
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SVG-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sass-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sass-eps-converted-to.pdf
new file mode 100644
index 0000000000..b8db8d26bb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sass-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sass.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sass.eps
new file mode 100644
index 0000000000..67d1d85b82
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sass.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a7cc8bf70f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Dark.eps
new file mode 100644
index 0000000000..c0849e30e4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..48a4981bfd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Light.eps
new file mode 100644
index 0000000000..1e06e87080
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Scala-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SciKitLearn-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_SciKitLearn-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..ff42a6e3fd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SciKitLearn-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SciKitLearn-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_SciKitLearn-Light.eps
new file mode 100644
index 0000000000..71a983ea4d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SciKitLearn-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ScikitLearn-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ScikitLearn-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..11a592ab88
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ScikitLearn-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ScikitLearn-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ScikitLearn-Dark.eps
new file mode 100644
index 0000000000..7c9d5f2699
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ScikitLearn-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Selenium-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Selenium-eps-converted-to.pdf
new file mode 100644
index 0000000000..09a606c34b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Selenium-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Selenium.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Selenium.eps
new file mode 100644
index 0000000000..17c168a9e8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Selenium.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sentry-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sentry-eps-converted-to.pdf
new file mode 100644
index 0000000000..d0e37bf39b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sentry-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sentry.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sentry.eps
new file mode 100644
index 0000000000..0847a1b81a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sentry.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..edb3c34c03
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Dark.eps
new file mode 100644
index 0000000000..bdeac78a3a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..9863d72cd3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Light.eps
new file mode 100644
index 0000000000..b0773c0d23
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sequelize-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..7a9c033ea4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Dark-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xMRAn!
+^xF߰RR5Ґǎ3S|xgm9
+U[V_7~F@l$dxPہKdv]P=?3oПP}pXڃ6+
+I|gȬ{1ł@|t9HDgQdwM$|>o-*WȰ&bKcȴ#֚pSֆ419u. ,!jy+F-2ar[&L<j,d2udV;*ӧse_>Gendstream
+endobj
+6 0 obj
+333
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:23:31+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:23:31+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:e4afe0fa-143f-11ef-0000-943a03af1aa4'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132331+02'00')
+/ModDate(D:20240514132331+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000880 00000 n
+0000002202 00000 n
+0000000821 00000 n
+0000000707 00000 n
+0000000285 00000 n
+0000000688 00000 n
+0000000944 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<95A3CDDFCA291158EDFD842156423CCB><95A3CDDFCA291158EDFD842156423CCB>]
+>>
+startxref
+2327
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Dark.eps
new file mode 100644
index 0000000000..c3cd4a3b19
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..856b6dbabe
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Light-eps-converted-to.pdf
@@ -0,0 +1,76 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xMRKnC1>2 gv,/:؎TE<AGj|LY_MmtNXA&=˙4nSGu1<O)@+d
+vՈ^P=?to]<ӟo,<eeEw'^@wMcH I$M t]gEb}ߍ'Y־$¶iKx ^&eLR֢#62^{ic,
+i9)O>Dga#1#JJ6٫E
+θ/e
+sfK(r,. D8 endstream
+endobj
+6 0 obj
+336
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:23:32+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:23:32+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:e548777a-143f-11ef-0000-31b2a32af474'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132332+02'00')
+/ModDate(D:20240514132332+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000883 00000 n
+0000002205 00000 n
+0000000824 00000 n
+0000000710 00000 n
+0000000285 00000 n
+0000000691 00000 n
+0000000947 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<B480B036840686F5B82C8F0D28D97ED4><B480B036840686F5B82C8F0D28D97ED4>]
+>>
+startxref
+2330
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Light.eps
new file mode 100644
index 0000000000..d8808388ad
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sketchup-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..b28ab09e4d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Dark.eps
new file mode 100644
index 0000000000..f6b5fa7960
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..d3d1b7a041
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Light.eps
new file mode 100644
index 0000000000..2f441cbb08
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_SolidJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Solidity-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Solidity-eps-converted-to.pdf
new file mode 100644
index 0000000000..ab47e4d8d4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Solidity-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Solidity.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Solidity.eps
new file mode 100644
index 0000000000..e9d92449a1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Solidity.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..b9e438068a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Dark.eps
new file mode 100644
index 0000000000..3bc72585e7
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..7889644463
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Light.eps
new file mode 100644
index 0000000000..93dd2110ab
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Spring-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..fd5e21e8e9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Dark-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmRKNC1 ܿSXşcpϢ, 켔*d<{9h`(D$}gۡ%8H}ANeNM 'eo^3Դ&k]uYr6Zp`e
+
+q=Do\PO p熩 3?P}uG;w Dʹ:jߔZ*V4آB\5 wy MSF`SI"x)o
+ɥcYI<gBYi9R[+\AL?ijǰJEL'T&QoIn-dXuwx*$m7T*v7||Vwendstream
+endobj
+6 0 obj
+357
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:23:38+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:23:38+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:e8dbfe7a-143f-11ef-0000-0f780d513bb5'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132338+02'00')
+/ModDate(D:20240514132338+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000904 00000 n
+0000002226 00000 n
+0000000845 00000 n
+0000000731 00000 n
+0000000285 00000 n
+0000000712 00000 n
+0000000968 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<A25A80DBD46DEDA4F2301C60F64F4719><A25A80DBD46DEDA4F2301C60F64F4719>]
+>>
+startxref
+2351
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Dark.eps
new file mode 100644
index 0000000000..5104ab7754
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..9e389c0b4f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Light.eps
new file mode 100644
index 0000000000..c7a48cdf19
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_StackOverflow-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_StyledComponents-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_StyledComponents-eps-converted-to.pdf
new file mode 100644
index 0000000000..a1b9122ea5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_StyledComponents-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_StyledComponents.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_StyledComponents.eps
new file mode 100644
index 0000000000..e01cd76df0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_StyledComponents.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..d18c2a8f44
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Dark.eps
new file mode 100644
index 0000000000..9de564483d
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..c8fae154ba
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Light.eps
new file mode 100644
index 0000000000..933beef148
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Sublime-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..bb0629d5e8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Dark.eps
new file mode 100644
index 0000000000..f65c3e6260
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..2a871c0ce5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Light.eps
new file mode 100644
index 0000000000..f5c7277bcc
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Supabase-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Svelte-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Svelte-eps-converted-to.pdf
new file mode 100644
index 0000000000..d909379163
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Svelte-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Svelte.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Svelte.eps
new file mode 100644
index 0000000000..66ef95c46e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Svelte.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Swift-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Swift-eps-converted-to.pdf
new file mode 100644
index 0000000000..dd56dbc6e5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Swift-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Swift.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Swift.eps
new file mode 100644
index 0000000000..4e6ecbd011
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Swift.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..f1eeea9e85
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Dark.eps
new file mode 100644
index 0000000000..89a2c5ed78
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..22bfb71804
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Light.eps
new file mode 100644
index 0000000000..8d34e8c67f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Symfony-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..390cf682d6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Dark.eps
new file mode 100644
index 0000000000..052a75c410
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..35e2f6a0c3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Light.eps
new file mode 100644
index 0000000000..67870b1bf5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TailwindCSS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..5ac59dee92
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Dark.eps
new file mode 100644
index 0000000000..aae93613f2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..fc467f2125
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Light.eps
new file mode 100644
index 0000000000..0da3bfc826
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Tauri-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..1c35d335c4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Dark.eps
new file mode 100644
index 0000000000..2108e23620
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..afb76b8b0f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Light.eps
new file mode 100644
index 0000000000..cd561a2c05
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TensorFlow-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..bcf94b9e4b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Dark-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x}Q9n0
+)(>#o0.!e:f֐x@s;FDs&SUZJXBM&t>5,Ca?!I3HAKFܒ߶=@_r[yc5O%
+]&3ui%jLf::tb@fNk&ws*5K1Qkb#9DpGS70~X r'BYVLa9:#h{9*eY+0setubEDz\
+. L}endstream
+endobj
+6 0 obj
+276
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:23:56+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:23:56+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:f396937a-143f-11ef-0000-be8a45fd7cb4'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132356+02'00')
+/ModDate(D:20240514132356+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000823 00000 n
+0000002145 00000 n
+0000000764 00000 n
+0000000650 00000 n
+0000000285 00000 n
+0000000631 00000 n
+0000000887 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<834323B93782F5A89C4868CFFF52FABE><834323B93782F5A89C4868CFFF52FABE>]
+>>
+startxref
+2270
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Dark.eps
new file mode 100644
index 0000000000..c26e0bc0fa
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..06208ed397
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Light.eps
new file mode 100644
index 0000000000..8e480b5d3a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Terraform-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..4b100f87e9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Dark.eps
new file mode 100644
index 0000000000..0fc1157900
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..28814087ca
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Light.eps
new file mode 100644
index 0000000000..dda0237270
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_ThreeJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Twitter-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Twitter-eps-converted-to.pdf
new file mode 100644
index 0000000000..30d63c5c57
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Twitter-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Twitter.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Twitter.eps
new file mode 100644
index 0000000000..7dc30add2a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Twitter.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TypeScript-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_TypeScript-eps-converted-to.pdf
new file mode 100644
index 0000000000..82ec0c81e0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TypeScript-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_TypeScript.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_TypeScript.eps
new file mode 100644
index 0000000000..e9a0d5d366
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_TypeScript.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..efb1d086aa
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Dark.eps
new file mode 100644
index 0000000000..c3f924318b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..5a70c5bec0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Light.eps
new file mode 100644
index 0000000000..3fee331051
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Ubuntu-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..c2136f47e8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Dark.eps
new file mode 100644
index 0000000000..cffafbdfff
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f3e5288a4b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Light.eps
new file mode 100644
index 0000000000..fd05d84dd6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Unity-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_UnrealEngine-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_UnrealEngine-eps-converted-to.pdf
new file mode 100644
index 0000000000..50e76df9c6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_UnrealEngine-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_UnrealEngine.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_UnrealEngine.eps
new file mode 100644
index 0000000000..70e0d16aeb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_UnrealEngine.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..7f3867bcce
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Dark-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xeRA#1~2~ƾ=$L+Hi)omĵ<gAܳf-b".^.:Z)> Q9hN9IzgmD&r v/\}/2,i4zXқBY'ըe% S{*wbu݂-|f B<&>))arVݓK0Sb0
+؃QVȍvsV|ӥe$cy(Z
+dr@SH͍8hNOT(淯bm5smͱtlzmkȲ%:eNorb6
+8o6Ye8t]u\e*q13'&ɾNӊO{ʯ7endstream
+endobj
+6 0 obj
+432
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:24:07+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:24:07+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:fa250afa-143f-11ef-0000-59290eabf130'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132407+02'00')
+/ModDate(D:20240514132407+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000979 00000 n
+0000002301 00000 n
+0000000920 00000 n
+0000000806 00000 n
+0000000285 00000 n
+0000000787 00000 n
+0000001043 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<91E0499E128AAD1504ADFA49A637B856><91E0499E128AAD1504ADFA49A637B856>]
+>>
+startxref
+2426
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Dark.eps
new file mode 100644
index 0000000000..7f3bab5481
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..0422c9e48e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Light.eps
new file mode 100644
index 0000000000..6bcbfd2ecb
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_V-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..99b4b582ec
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Dark.eps
new file mode 100644
index 0000000000..4502bec378
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a75e97298e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Light.eps
new file mode 100644
index 0000000000..f37210eb33
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VIM-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..ce873dcf38
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Dark.eps
new file mode 100644
index 0000000000..8f473b05d2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..7de6e20ac6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Light.eps
new file mode 100644
index 0000000000..41467f19b6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCode-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..0cc803937e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Dark.eps
new file mode 100644
index 0000000000..d5e9168074
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a8157ef0b1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Light.eps
new file mode 100644
index 0000000000..c525809e45
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VSCodium-Light.eps
@@ -0,0 +1,142 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.16.0 (https://cairographics.org)
+%%CreationDate: Sun May 12 20:26:21 2024
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 3
+%%BoundingBox: 0 0 192 192
+%%EndComments
+%%BeginProlog
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+ 0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+ {
+ dup
+ type /stringtype eq
+ { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+ } forall
+ currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+ cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+ { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+ /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+ /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+ cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+/cairo_data_source {
+ CairoDataIndex CairoData length lt
+ { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def }
+ { () } ifelse
+} def
+/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def
+/cairo_image { image cairo_flush_ascii85_file } def
+/cairo_imagemask { imagemask cairo_flush_ascii85_file } def
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 0 192 192
+%%EndPageSetup
+q 0 0 192 192 rectclip
+1 0 0 -1 0 192 cm q
+q
+0 0 192 192 re W n
+ q
+0.956863 0.94902 0.929412 rg
+147 0 m 45 0 l 20.148 0 0 20.148 0 45 c 0 147 l 0 171.852 20.148 192 45
+ 192 c 147 192 l 171.852 192 192 171.852 192 147 c 192 45 l 192 20.148 171.852
+ 0 147 0 c h
+147 0 m f
+Q q
+30 30 131.25 131.25 re W n
+q
+30 30 132 132 re W n
+ q
+q
+93.34 32.984 m 89.594 35.387 88.516 40.367 90.93 44.098 c 104.195 64.645
+ 107.328 80.145 105.969 93.727 c 100.477 119.734 88.543 125.012 78.109 125.012
+ c 67.926 125.012 70.652 108.25 78.309 103.344 c 82.879 100.488 88.73 98.633
+ 93.223 98.633 c 97.676 98.633 101.285 95.035 101.285 90.598 c 101.285 86.156
+ 97.676 82.562 93.223 82.562 c 87.977 82.562 82.828 83.664 78.023 85.539
+ c 79.004 80.906 79.367 75.902 78.098 70.582 c 76.172 62.5 70.625 54.785
+ 60.996 47.301 c 59.309 45.988 57.168 45.402 55.047 45.664 c 52.926 45.926
+ 50.992 47.02 49.68 48.699 c 46.945 52.203 47.578 57.254 51.094 59.98 c
+58.941 66.074 61.531 70.586 62.418 74.301 c 63.305 78.012 62.59 81.996 60.812
+ 87.469 c 58.535 94.848 55.895 101.43 54.738 107.746 c 54.168 110.852 54.121
+ 114.234 53.973 116.938 c 48.324 111.43 46.109 104.16 46.109 93.535 c 46.109
+ 89.094 42.5 85.496 38.051 85.496 c 33.602 85.5 29.996 89.098 29.996 93.535
+ c 29.996 108.047 34.238 121.852 45.613 131.062 c 55.906 140.871 82.086
+137.246 82.086 152.992 c 82.086 157.438 88.594 159.602 93.043 159.602 c
+97.609 159.602 103.352 156.551 103.352 152.992 c 103.352 135.129 122.18
+124.27 153.176 124.316 c 157.629 124.324 161.238 120.727 161.246 116.289
+ c 161.254 111.848 157.652 108.242 153.199 108.234 c 151.082 108.234 149.016
+ 108.305 146.977 108.426 c 150.441 100.277 151.98 91.305 151.66 81.613 c
+ 151.516 77.176 147.789 73.695 143.344 73.84 c 138.891 73.984 135.402 77.703
+ 135.547 82.145 c 135.965 94.832 135.492 106.164 126.035 112.137 c 123.348
+ 113.836 120.223 115.309 117.262 115.309 c 119.562 109.051 121.301 102.441
+ 122.012 95.324 c 122.465 90.777 122.512 85.379 121.996 81.188 c 121.191
+ 74.691 120.219 67.32 122.684 61.773 c 124.902 56.992 129.863 54.988 137.152
+ 54.988 c 141.602 54.984 145.203 51.387 145.207 46.953 c 145.207 42.512
+141.602 38.91 137.152 38.906 c 126.32 38.906 118.113 44.609 113.457 51.496
+ c 111.023 46.297 108.062 40.941 104.48 35.398 c 103.324 33.605 101.504
+32.348 99.414 31.895 c 98.379 31.668 97.312 31.648 96.27 31.836 c 95.227
+ 32.023 94.23 32.414 93.34 32.984 c h
+93.34 32.984 m W n
+[0.75 0 0 0.75 0 0] concat
+/CairoFunction
+ << /FunctionType 2
+ /Domain [ 0 1 ]
+ /C0 [ 0.384314 0.627451 0.917647 ]
+ /C1 [ 0.101961 0.372549 0.705882 ]
+ /N 1
+ >>
+def
+ << /ShadingType 2
+ /ColorSpace /DeviceRGB
+ /Coords [ 39.994598 42.2785 209.164001 205.503006 ]
+ /Extend [ true true ]
+ /Function CairoFunction
+ >>
+shfill
+Q
+ Q
+Q
+ Q
+Q
+Q Q
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vala-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vala-eps-converted-to.pdf
new file mode 100644
index 0000000000..05ca28e0b9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vala-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vala.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vala.eps
new file mode 100644
index 0000000000..ce0b457582
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vala.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a2152f703e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Dark-eps-converted-to.pdf
@@ -0,0 +1,72 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xMK D>Ok0g@JHe#E`_I8#'Mi"[ͭ)TCV2K'yĥˮ$ka4*Kj^H$ `ߠȿ].1h0b+TTthkM;endstream
+endobj
+6 0 obj
+151
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:24:10+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:24:10+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:fbeece7a-143f-11ef-0000-1d8c79741b8c'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132410+02'00')
+/ModDate(D:20240514132410+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000698 00000 n
+0000002020 00000 n
+0000000639 00000 n
+0000000525 00000 n
+0000000285 00000 n
+0000000506 00000 n
+0000000762 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [(wK1\230\363\367hL\0366[NT]m<)(wK1\230\363\367hL\0366[NT]m<)]
+>>
+startxref
+2145
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Dark.eps
new file mode 100644
index 0000000000..87cda9bd20
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..fcc3c27572
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Light-eps-converted-to.pdf
@@ -0,0 +1,72 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xMK0D',Y8fb"E17q88{i:}vsP߇pWNГIE]Wm:HK*/$ X0joP"︻%ϡ7*^1e-X6%9֞vТ<endstream
+endobj
+6 0 obj
+152
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:24:11+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:24:11+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:fc8764fa-143f-11ef-0000-fe54e8c4bfd7'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132411+02'00')
+/ModDate(D:20240514132411+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000699 00000 n
+0000002021 00000 n
+0000000640 00000 n
+0000000526 00000 n
+0000000285 00000 n
+0000000507 00000 n
+0000000763 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<7B159923723AEE961B5276A838D3D643><7B159923723AEE961B5276A838D3D643>]
+>>
+startxref
+2146
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Light.eps
new file mode 100644
index 0000000000..30b6846109
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vercel-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..eb6957d4f1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Dark.eps
new file mode 100644
index 0000000000..a83041c9b4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..28ff46c572
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Light.eps
new file mode 100644
index 0000000000..5efc25a9d4
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VisualStudio-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..4f5a4196c7
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Dark.eps
new file mode 100644
index 0000000000..758ca80203
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..6cb7ad1971
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Light.eps
new file mode 100644
index 0000000000..5206364509
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vite-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..11744779f7
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Dark.eps
new file mode 100644
index 0000000000..fbaa571be2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..9a7273dc93
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Light.eps
new file mode 100644
index 0000000000..66a1b883ec
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vitest-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..cfc244613e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Dark-eps-converted-to.pdf
@@ -0,0 +1,74 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+x]An D>'@gfAi<0'`_1Q[r
+ߐmչU(<c+bV?t͡
+d:SdgYm7=]nᜇ>z>j*cET*[HXlCRҬ#'JTdXk.w"K};|.He)ǒ\=?lq8endstream
+endobj
+6 0 obj
+230
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:24:23+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:24:23+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:03ae72fa-1440-11ef-0000-21425758fbe5'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132423+02'00')
+/ModDate(D:20240514132423+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000777 00000 n
+0000002099 00000 n
+0000000718 00000 n
+0000000604 00000 n
+0000000285 00000 n
+0000000585 00000 n
+0000000841 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<F6092EAD96BD24EBB3316EAADDF7E73D><F6092EAD96BD24EBB3316EAADDF7E73D>]
+>>
+startxref
+2224
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Dark.eps
new file mode 100644
index 0000000000..c9678659d0
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..204fb71613
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Light.eps
new file mode 100644
index 0000000000..e9a2df420e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_VueJS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..c7c592921f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Dark.eps
new file mode 100644
index 0000000000..48d5519a43
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f79e74e8a6
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Light-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xmRKn1>c8FW=@4RM~U4<\+5.ZI‘waT9s⦾mHz ?=nͬD,<f‰2~-c;`Xe*QY޾gΆGj
+ZYfzr$*5h[d)MG.HV)
+֦>_N` xmହ67(͒7{_h#;,zЂa_ 2|+m<*;)u<9z-g,)PO5VNƫbhHcb/
+x7?}endstream
+endobj
+6 0 obj
+359
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:24:26+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:24:26+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:0578367a-1440-11ef-0000-1e8a9c360951'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132426+02'00')
+/ModDate(D:20240514132426+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000906 00000 n
+0000002228 00000 n
+0000000847 00000 n
+0000000733 00000 n
+0000000285 00000 n
+0000000714 00000 n
+0000000970 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<E9CA4BA0BFA7FD7B62E88D84ABD29F4E><E9CA4BA0BFA7FD7B62E88D84ABD29F4E>]
+>>
+startxref
+2353
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Light.eps
new file mode 100644
index 0000000000..16b9255690
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Vuetify-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WebAssembly-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebAssembly-eps-converted-to.pdf
new file mode 100644
index 0000000000..6bd453f8ec
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebAssembly-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WebAssembly.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebAssembly.eps
new file mode 100644
index 0000000000..f01b072ddd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebAssembly.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..8da310a32c
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Dark.eps
new file mode 100644
index 0000000000..7594f767f9
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..fe138e5ce2
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Light.eps
new file mode 100644
index 0000000000..7f015c5846
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WebStorm-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Webflow-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webflow-eps-converted-to.pdf
new file mode 100644
index 0000000000..41e62de024
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webflow-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Webflow.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webflow.eps
new file mode 100644
index 0000000000..45a7148a24
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webflow.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..a1537c4ce5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Dark.eps
new file mode 100644
index 0000000000..991f187932
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..46e9551772
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Light-eps-converted-to.pdf
@@ -0,0 +1,75 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xSKn0>2g34Eh(8]U#M6򷞏g]Ǩ?UWA
+H?uH83KfyHQ`_rW<k7DT99L&6^$H!`4j60
+^4&8V -Wت"F=q-#(ϴ VA
+1"SN#flC=B΅vb|Y3,Zh>fPա rg)+BPAt"G"9mk̛􅼵 nDl>cb#4hr2y5;Ņ r~'wNuߋrɄVY&R6m#UW Fs1W5elpq7'z l.endstream
+endobj
+6 0 obj
+410
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:24:30+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:24:30+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:07da907a-1440-11ef-0000-d94d274f7055'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132430+02'00')
+/ModDate(D:20240514132430+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000957 00000 n
+0000002279 00000 n
+0000000898 00000 n
+0000000784 00000 n
+0000000285 00000 n
+0000000765 00000 n
+0000001021 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<1EC3C47BC79D74DE23ACA81796CC8BAD><1EC3C47BC79D74DE23ACA81796CC8BAD>]
+>>
+startxref
+2404
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Light.eps
new file mode 100644
index 0000000000..ab52df172a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Webpack-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..3b7e46615b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Dark-eps-converted-to.pdf
@@ -0,0 +1,157 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xWMn1>ll|dv1RE]U"OOzÇef^#E|LDuU LroCs\| <+ nz.tvnFn6-pFvi|0v+J6Z#j\iFLVm;c! 5;fe(z yI XikK#$)b>A
+x
+j]X3ڲۅg)Gؚ4VICX!a-<hMfӖAKHs'K_Ǐw{ޒ6d?)P̶g%55uX6 v
+l1TKڂ9@LKX`v^[+9PZ[qH5]d7gFܺ+ģYj1Z%iފs)jCX>7y+i$ďz T!՟wzE4)ԶJ+% IDbdsB.ݙ7r2dsr`R6,tf8ka9j36
+²Td:W%$'57
+~oy^3ؓnl%.dt).}߇iendstream
+endobj
+6 0 obj
+616
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ColorSpace 13 0 R
+/Pattern 14 0 R
+/Shading 15 0 R
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 16 0 R
+>>
+endobj
+7 0 obj
+[/Pattern]
+endobj
+13 0 obj
+<</R7
+7 0 R>>
+endobj
+14 0 obj
+<</R12
+12 0 R>>
+endobj
+12 0 obj
+<</PatternType 2
+/Shading 11 0 R
+/Matrix[0.75
+0
+0
+-0.75
+0
+192]>>endobj
+15 0 obj
+<</R11
+11 0 R>>
+endobj
+11 0 obj
+<</ShadingType 2
+/ColorSpace/DeviceRGB
+/Coords[61.048
+59.274
+168
+228]
+/Domain[0.078
+1]
+/Function 10 0 R
+/Extend [true true]>>endobj
+9 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.254902
+0.635294
+0.937255]
+/C1[0.2
+0.52549
+0.933333]
+/N 1>>endobj
+8 0 obj
+<</FunctionType 2
+/Domain[0
+1]
+/C0[0.329412
+0.784314
+0.945098]
+/C1[0.254902
+0.635294
+0.937255]
+/N 1>>endobj
+10 0 obj
+<</Functions[8 0 R
+9 0 R]
+/FunctionType 3
+/Domain[0.078
+1]
+/Bounds[0.573]
+/Encode[0
+1
+0
+1]>>endobj
+16 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:24:33+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:24:33+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:09a453fa-1440-11ef-0000-d02ea6680009'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132433+02'00')
+/ModDate(D:20240514132433+02'00')>>endobj
+xref
+0 17
+0000000000 65535 f
+0000001214 00000 n
+0000003213 00000 n
+0000001155 00000 n
+0000000990 00000 n
+0000000285 00000 n
+0000000971 00000 n
+0000001279 00000 n
+0000001730 00000 n
+0000001620 00000 n
+0000001846 00000 n
+0000001479 00000 n
+0000001367 00000 n
+0000001305 00000 n
+0000001335 00000 n
+0000001447 00000 n
+0000001954 00000 n
+trailer
+<< /Size 17 /Root 1 0 R /Info 2 0 R
+/ID [<514317BEFF38AC6AEC3604179EF55A15><514317BEFF38AC6AEC3604179EF55A15>]
+>>
+startxref
+3338
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Dark.eps
new file mode 100644
index 0000000000..27b5ac085f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f966384279
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Light.eps
new file mode 100644
index 0000000000..98c00249f8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_WindiCSS-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..f67ee1cc6a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Dark.eps
new file mode 100644
index 0000000000..1c36e00370
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..6f10b2f623
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Light.eps
new file mode 100644
index 0000000000..1d0eab7fcd
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Windows-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Wordpress-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Wordpress-eps-converted-to.pdf
new file mode 100644
index 0000000000..35519b526f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Wordpress-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Wordpress.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Wordpress.eps
new file mode 100644
index 0000000000..7dfe2d91b3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Wordpress.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..fdad5e891b
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Dark.eps
new file mode 100644
index 0000000000..c3cbea81c8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..f1a41333c8
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Light.eps
new file mode 100644
index 0000000000..13809b4ae3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Workers-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_XD-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_XD-eps-converted-to.pdf
new file mode 100644
index 0000000000..f69e7d131e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_XD-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_XD.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_XD.eps
new file mode 100644
index 0000000000..9bebc83e3f
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_XD.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..2bdf20a281
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Dark.eps
new file mode 100644
index 0000000000..519d90aa3a
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..b76fc27957
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Light.eps
new file mode 100644
index 0000000000..9d7047eec1
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yarn-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..c2de19eb9e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Dark.eps
new file mode 100644
index 0000000000..22f2195254
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..b815113a92
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Light-eps-converted-to.pdf
@@ -0,0 +1,78 @@
+%PDF-1.5
+%쏢
+%%Invocation: gswin64c -dDisplayFormat=198788 -dDisplayResolution=120 -q -dSAFER -dNOPAUSE -dBATCH -dCompatibilityLevel=1.5 -sDEVICE=pdfwrite -sOutputFile=? -dPDFSETTINGS#/prepress -dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true
+%%+ -dAutoRotatePages#/None ?
+5 0 obj
+<</Length 6 0 R/Filter /FlateDecode>>
+stream
+xuR1N1 '[$$
+ +G
+&m3cH(yn@hSM,T+tJl;H
+Eȓk
+($ccrFs:3_'<mvvbUr @ZMbBsws6gi茕: puCkf\+撖Г4+W,xnDgxF $=9(F
+]*KjX$~YS,͗Xo((̕A>Xx &c̈́RIDzbf;h[o! SH=M־o|
+26#GxhvYim-zߧU$endstream
+endobj
+6 0 obj
+344
+endobj
+4 0 obj
+<</Type/Page/MediaBox [0 0 192 192]
+/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+>>
+/Contents 5 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+4 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+/Metadata 7 0 R
+>>
+endobj
+7 0 obj
+<</Type/Metadata
+/Subtype/XML/Length 1182>>stream
+<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
+<?adobe-xap-filters esc="CRLF"?>
+<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='XMP toolkit 2.9.1-13, framework 1.6'>
+<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:iX='http://ns.adobe.com/iX/1.0/'>
+<rdf:Description rdf:about="" xmlns:pdf='http://ns.adobe.com/pdf/1.3/' pdf:Producer='GPL Ghostscript 9.56.1'/>
+<rdf:Description rdf:about="" xmlns:xmp='http://ns.adobe.com/xap/1.0/'><xmp:ModifyDate>2024-05-14T13:24:43+02:00</xmp:ModifyDate>
+<xmp:CreateDate>2024-05-14T13:24:43+02:00</xmp:CreateDate>
+<xmp:CreatorTool>UnknownApplication</xmp:CreatorTool></rdf:Description>
+<rdf:Description rdf:about="" xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/' xapMM:DocumentID='uuid:0f9a34fa-1440-11ef-0000-b76360559bed'/>
+<rdf:Description rdf:about="" xmlns:dc='http://purl.org/dc/elements/1.1/' dc:format='application/pdf'><dc:title><rdf:Alt><rdf:li xml:lang='x-default'>Untitled</rdf:li></rdf:Alt></dc:title></rdf:Description>
+</rdf:RDF>
+</x:xmpmeta>
+
+
+<?xpacket end='w'?>
+endstream
+endobj
+2 0 obj
+<</Producer(GPL Ghostscript 9.56.1)
+/CreationDate(D:20240514132443+02'00')
+/ModDate(D:20240514132443+02'00')>>endobj
+xref
+0 8
+0000000000 65535 f
+0000000891 00000 n
+0000002213 00000 n
+0000000832 00000 n
+0000000718 00000 n
+0000000285 00000 n
+0000000699 00000 n
+0000000955 00000 n
+trailer
+<< /Size 8 /Root 1 0 R /Info 2 0 R
+/ID [<208A20709D820EE84DC675EC307CA8F0><208A20709D820EE84DC675EC307CA8F0>]
+>>
+startxref
+2338
+%%EOF
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Light.eps
new file mode 100644
index 0000000000..b6e522f995
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Yew-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Dark-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Dark-eps-converted-to.pdf
new file mode 100644
index 0000000000..07f654ff6e
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Dark-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Dark.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Dark.eps
new file mode 100644
index 0000000000..d9bda50dc3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Dark.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Light-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Light-eps-converted-to.pdf
new file mode 100644
index 0000000000..a77d2420d5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Light-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Light.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Light.eps
new file mode 100644
index 0000000000..f50c1caa70
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_Zig-Light.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_p5js-eps-converted-to.pdf b/macros/latex/contrib/skillicons/skill-icons/skillicons_p5js-eps-converted-to.pdf
new file mode 100644
index 0000000000..58a14b7310
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_p5js-eps-converted-to.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skill-icons/skillicons_p5js.eps b/macros/latex/contrib/skillicons/skill-icons/skillicons_p5js.eps
new file mode 100644
index 0000000000..dfd73b9418
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skill-icons/skillicons_p5js.eps
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skillicons.pdf b/macros/latex/contrib/skillicons/skillicons.pdf
new file mode 100644
index 0000000000..2e4982b700
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skillicons.pdf
Binary files differ
diff --git a/macros/latex/contrib/skillicons/skillicons.sty b/macros/latex/contrib/skillicons/skillicons.sty
new file mode 100644
index 0000000000..cb9d7760c3
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skillicons.sty
@@ -0,0 +1,28 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% A package to bring cute cool and modern icons into your document
+% Maintained by Anton --> AnMnV https://github.com/AnMnv/AnMnv
+%
+% Project repository and bug tracker:
+% https://github.com/AnMnv/latex-skill-icons
+%
+% Released under the MIT License
+% See https://opensource.org/license/mit
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{skillicons}[2024-05-14 version v1.0 A LaTeX package designed to seamlessly integrate skill icons into your documents]
+
+\RequirePackage{graphicx}
+
+
+
+\newcommand{\photosymbol}[2][1]{%
+ \raisebox{\dimexpr 0.5\fontcharht\font`T - 0.5\height - 0.5\fontchardp\font`q}{%
+ \includegraphics[height=\dimexpr#1\fontcharht\font`T+1.5\fontchardp\font`q]{skill-icons/skillicons_#2}%
+ }%
+}
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/skillicons/skillicons.tex b/macros/latex/contrib/skillicons/skillicons.tex
new file mode 100644
index 0000000000..d854e6f3a5
--- /dev/null
+++ b/macros/latex/contrib/skillicons/skillicons.tex
@@ -0,0 +1,584 @@
+\documentclass[12pt]{article}
+\usepackage[left=1.5cm,right=1.5cm,top=1.5cm,bottom=1.5cm,bindingoffset=0cm]{geometry}
+\usepackage{skillicons}
+\usepackage{multicol}
+
+
+\usepackage[dvipsnames]{xcolor}
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\usepackage{anyfontsize}
+\usepackage{sectsty}
+\usepackage{hyperref}
+
+\hypersetup{
+ colorlinks=true,
+ urlcolor=red,
+ allbordercolors=red,
+}
+
+\usepackage[most]{tcolorbox}
+\colorlet{LightLavender}{Lavender!40!}
+\colorlet{LightGreen}{black!15!}
+
+\tcbset{on line,
+ boxsep=4pt, left=0pt,right=0pt,top=0pt,bottom=0pt,
+ colframe=white,colback=LightGreen,
+ highlight math style={enhanced}
+ }
+
+
+%%%%%%%%%%%%%%%%%%
+% -- Loading the code block package:
+\usepackage{listings}
+% -- Basic formatting
+\usepackage[utf8]{inputenc}
+\usepackage[english]{babel}
+\usepackage{times}
+\setlength{\parindent}{8pt}
+\usepackage{indentfirst}
+% -- Defining colors:
+\usepackage[dvipsnames]{xcolor}
+\definecolor{codegreen}{rgb}{0,0.6,0}
+\definecolor{codegray}{rgb}{0.5,0.5,0.5}
+\definecolor{codepurple}{rgb}{0.58,0,0.82}
+\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
+% Definig a custom style:
+\lstdefinestyle{mystyle}{
+ backgroundcolor=\color{backcolour},
+ commentstyle=\color{codepurple},
+ keywordstyle=\color{NavyBlue},
+ numberstyle=\tiny\color{codegray},
+ stringstyle=\color{codepurple},
+ basicstyle=\ttfamily\footnotesize\bfseries,
+ breakatwhitespace=false,
+ breaklines=true,
+ captionpos=t,
+ keepspaces=true,
+ % numbers=left,
+ % numbersep=5pt,
+ showspaces=false,
+ showstringspaces=false,
+ showtabs=false,
+ tabsize=2
+}
+% -- Setting up the custom style:
+\lstset{style=mystyle}
+%%%%%%%%%%%%%%%%%%
+
+\begin{document}
+
+
+\begin{center}
+\fontsize{40}{50} \selectfont {{\tcbox{Icon Skills package}}}\\[1cm] \photosymbol[5]{LaTeX-Dark} \\[1cm]
+
+\Large \href{https://github.com/AnMnv/latex-skill-icons}{https://github.com/AnMnv/latex-skill-icons}\\[1cm]
+
+2024-05-14 version v1.0
+\end{center}
+
+
+
+
+
+
+\vspace*{2cm}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\section*{Introduction}
+Welcome to the documentation for \texttt{skillicons} package, a LaTeX package designed to seamlessly integrate skill icons into your documents. With this package, you can easily enhance your documents by incorporating visually appealing skill indicators, perfect for resumes, CVs, or any document requiring skill representation.
+
+
+
+\section*{Acknowledgements}
+The skill icons used to create a package are sourced from the repository \href{https://github.com/tandpfun/skill-icons}{https://github.com/tandpfun/skill-icons}.
+
+\section*{Setting}
+\begin{enumerate}
+\item Clone \tcbox{\texttt{skillicons.sty}} file and \tcbox{\texttt{skill-icons}} folder from \href{https://github.com/AnMnv/latex-skill-icons}{https://github.com/AnMnv/latex-skill-icons} into your current directory where your \texttt{main.tex} file is.
+\item Paste \tcbox{\texttt{$\backslash$usepackage\{skillicons\}}} in the preambula (before \texttt{$\backslash$begin\{document\}})
+\item You are ready to go!
+\end{enumerate}
+
+\section*{Usage Example}
+
+
+\begin{lstlisting}[language={[latex]TeX}]
+\documentclass[11pt]{report}
+\usepackage{skillicons}
+
+\begin{document}
+\begin{itemize}
+\item[] \photosymbol{JavaScript} I'm proficient in JavaScript.
+\item[] \photosymbol{Python-Dark} Python is one of my core skills.
+\item[] \photosymbol{React-Light} I have experience working with React.
+\item[] \photosymbol{Java-Dark} Java is one of my strong suits.
+\item[] \photosymbol{NodeJS-Light} I'm proficient in Node.js development.
+\item[] \photosymbol{Git} I'm adept at using Git for version control.
+\item[] \photosymbol{MySQL-Dark} SQL is one of the databases languages.
+\item[] \photosymbol{Rust} Rust is a language I've been learning and enjoying lately.
+\end{itemize}
+\end{document}
+\end{lstlisting}
+
+\section*{Result:}
+
+{ \Large
+\begin{itemize}
+\item[] \photosymbol{JavaScript} I'm proficient in JavaScript.
+\item[] \photosymbol{Python-Dark} Python is one of my core skills.
+\item[] \photosymbol{React-Light} I have experience working with React.
+\item[] \photosymbol{Java-Dark} Java is one of my strong suits.
+\item[] \photosymbol{NodeJS-Light} I'm proficient in Node.js development.
+\item[] \photosymbol{Git} I'm adept at using Git for version control.
+\item[] \photosymbol{MySQL-Dark} SQL is one of the databases languages.
+\item[] \photosymbol{Rust} Rust is a language I've been learning and enjoying lately.
+\end{itemize}}
+
+\vspace{0.5cm}
+{\LARGE
+\begin{lstlisting}[language={[latex]TeX}]
+By default \photosymbol{Powershell-Dark} you can \photosymbol[2]{NodeJS-Dark} use icons right \photosymbol[3]{Sublime-Dark} inside text lines \photosymbol[4]{StackOverflow-Dark} with or without scale parameter.
+\end{lstlisting}
+
+By default \photosymbol{Powershell-Dark} you can \photosymbol[2]{NodeJS-Dark} use icons right \photosymbol[3]{Sublime-Dark} inside text lines \photosymbol[4]{StackOverflow-Dark} with or without scale parameter.}
+
+\clearpage
+
+
+
+
+\section*{All available icons}
+\begin{multicols}{3}
+\begin{itemize}
+\item[] \photosymbol[3]{Ableton-Dark} Ableton-Dark
+\item[] \photosymbol[3]{Ableton-Light} Ableton-Light
+\item[] \photosymbol[3]{ActivityPub-Dark} ActivityPub-Dark
+\item[] \photosymbol[3]{ActivityPub-Light} ActivityPub-Light
+\item[] \photosymbol[3]{Actix-Dark} Actix-Dark
+\item[] \photosymbol[3]{Actix-Light} Actix-Light
+\item[] \photosymbol[3]{Adonis} Adonis
+\item[] \photosymbol[3]{AfterEffects} AfterEffects
+\item[] \photosymbol[3]{AiScript-Dark} AiScript-Dark
+\item[] \photosymbol[3]{AiScript-Light} AiScript-Light
+\item[] \photosymbol[3]{AlpineJS-Dark} AlpineJS-Dark
+\item[] \photosymbol[3]{AlpineJS-Light} AlpineJS-Light
+\item[] \photosymbol[3]{Anaconda-Dark} Anaconda-Dark
+\item[] \photosymbol[3]{Anaconda-Light} Anaconda-Light
+\item[] \photosymbol[3]{AndroidStudio-Dark} AndroidStudio-Dark
+\item[] \photosymbol[3]{AndroidStudio-Light} AndroidStudio-Light
+\item[] \photosymbol[3]{Angular-Dark} Angular-Dark
+\item[] \photosymbol[3]{Angular-Light} Angular-Light
+\item[] \photosymbol[3]{Ansible} Ansible
+\item[] \photosymbol[3]{Apollo} Apollo
+\item[] \photosymbol[3]{Apple-Dark} Apple-Dark
+\item[] \photosymbol[3]{Apple-Light} Apple-Light
+\item[] \photosymbol[3]{Appwrite} Appwrite
+\item[] \photosymbol[3]{Arch-Dark} Arch-Dark
+\item[] \photosymbol[3]{Arch-Light} Arch-Light
+\item[] \photosymbol[3]{Arduino} Arduino
+\item[] \photosymbol[3]{Astro} Astro
+\item[] \photosymbol[3]{Atom} Atom
+\item[] \photosymbol[3]{Audition} Audition
+%\item[] \photosymbol[3]{Autocad-Dark} AutoCAD-Dark
+\item[] \photosymbol[3]{Autocad-Light} AutoCAD-Light
+\item[] \photosymbol[3]{AWS-Dark} AWS-Dark
+\item[] \photosymbol[3]{AWS-Light} AWS-Light
+\item[] \photosymbol[3]{Azul} Azul
+\item[] \photosymbol[3]{Azure-Dark} Azure-Dark
+\item[] \photosymbol[3]{Azure-Light} Azure-Light
+\item[] \photosymbol[3]{Babel} Babel
+\item[] \photosymbol[3]{Bash-Dark} Bash-Dark
+\item[] \photosymbol[3]{Bash-Light} Bash-Light
+\item[] \photosymbol[3]{Bevy-Dark} Bevy-Dark
+\item[] \photosymbol[3]{Bevy-Light} Bevy-Light
+\item[] \photosymbol[3]{BitBucket-Dark} BitBucket-Dark
+\item[] \photosymbol[3]{BitBucket-Light} BitBucket-Light
+\item[] \photosymbol[3]{Blender-Dark} Blender-Dark
+\item[] \photosymbol[3]{Blender-Light} Blender-Light
+\item[] \photosymbol[3]{Bootstrap} Bootstrap
+\item[] \photosymbol[3]{BSD-Dark} BSD-Dark
+\item[] \photosymbol[3]{BSD-Light} BSD-Light
+\item[] \photosymbol[3]{Bun-Dark} Bun-Dark
+\item[] \photosymbol[3]{Bun-Light} Bun-Light
+\item[] \photosymbol[3]{C} C
+\item[] \photosymbol[3]{Cassandra-Dark} Cassandra-Dark
+\item[] \photosymbol[3]{Cassandra-Light} Cassandra-Light
+\item[] \photosymbol[3]{CLion-Dark} CLion-Dark
+\item[] \photosymbol[3]{CLion-Light} CLion-Light
+\item[] \photosymbol[3]{Clojure-Dark} Clojure-Dark
+\item[] \photosymbol[3]{Clojure-Light} Clojure-Light
+\item[] \photosymbol[3]{Cloudflare-Dark} Cloudflare-Dark
+\item[] \photosymbol[3]{Cloudflare-Light} Cloudflare-Light
+\item[] \photosymbol[3]{CMake-Dark} CMake-Dark
+\item[] \photosymbol[3]{CMake-Light} CMake-Light
+\item[] \photosymbol[3]{CodePen-Dark} CodePen-Dark
+\item[] \photosymbol[3]{CodePen-Light} CodePen-Light
+\item[] \photosymbol[3]{CoffeeScript-Dark} CoffeeScript-Dark
+\item[] \photosymbol[3]{CoffeeScript-Light} CoffeeScript-Light
+\item[] \photosymbol[3]{CPP} CPP
+\item[] \photosymbol[3]{Crystal-Dark} Crystal-Dark
+\item[] \photosymbol[3]{Crystal-Light} Crystal-Light
+\item[] \photosymbol[3]{CS} CS
+\item[] \photosymbol[3]{CSS} CSS
+\item[] \photosymbol[3]{Cypress-Dark} Cypress-Dark
+\item[] \photosymbol[3]{Cypress-Light} Cypress-Light
+\item[] \photosymbol[3]{D3-Dark} D3-Dark
+\item[] \photosymbol[3]{D3-Light} D3-Light
+\item[] \photosymbol[3]{Dart-Dark} Dart-Dark
+\item[] \photosymbol[3]{Dart-Light} Dart-Light
+\item[] \photosymbol[3]{Debian-Dark} Debian-Dark
+\item[] \photosymbol[3]{Debian-Light} Debian-Light
+\item[] \photosymbol[3]{DENO-Dark} DENO-Dark
+\item[] \photosymbol[3]{DENO-Light} DENO-Light
+\item[] \photosymbol[3]{DevTo-Dark} DevTo-Dark
+\item[] \photosymbol[3]{DevTo-Light} DevTo-Light
+\item[] \photosymbol[3]{Discord} Discord
+\item[] \photosymbol[3]{DiscordBots} DiscordBots
+\item[] \photosymbol[3]{DiscordJS-Dark} DiscordJS-Dark
+\item[] \photosymbol[3]{DiscordJS-Light} DiscordJS-Light
+\item[] \photosymbol[3]{Django} Django
+\item[] \photosymbol[3]{Docker} Docker
+\item[] \photosymbol[3]{DotNet} DotNet
+\item[] \photosymbol[3]{DynamoDB-Dark} DynamoDB-Dark
+\item[] \photosymbol[3]{DynamoDB-Light} DynamoDB-Light
+\item[] \photosymbol[3]{Eclipse-Dark} Eclipse-Dark
+\item[] \photosymbol[3]{Eclipse-Light} Eclipse-Light
+\item[] \photosymbol[3]{Elasticsearch-Dark} Elasticsearch-Dark
+\item[] \photosymbol[3]{Elasticsearch-Light} Elasticsearch-Light
+\item[] \photosymbol[3]{Electron} Electron
+\item[] \photosymbol[3]{Elixir-Dark} Elixir-Dark
+\item[] \photosymbol[3]{Elixir-Light} Elixir-Light
+\item[] \photosymbol[3]{Elysia-Dark} Elysia-Dark
+\item[] \photosymbol[3]{Elysia-Light} Elysia-Light
+\item[] \photosymbol[3]{Emacs} Emacs
+\item[] \photosymbol[3]{Ember} Ember
+\item[] \photosymbol[3]{Emotion-Dark} Emotion-Dark
+\item[] \photosymbol[3]{Emotion-Light} Emotion-Light
+\item[] \photosymbol[3]{ExpressJS-Dark} ExpressJS-Dark
+\item[] \photosymbol[3]{ExpressJS-Light} ExpressJS-Light
+\item[] \photosymbol[3]{FastAPI} FastAPI
+\item[] \photosymbol[3]{Fediverse-Dark} Fediverse-Dark
+\item[] \photosymbol[3]{Fediverse-Light} Fediverse-Light
+\item[] \photosymbol[3]{Figma-Dark} Figma-Dark
+\item[] \photosymbol[3]{Figma-Light} Figma-Light
+\item[] \photosymbol[3]{Firebase-Dark} Firebase-Dark
+\item[] \photosymbol[3]{Firebase-Light} Firebase-Light
+\item[] \photosymbol[3]{Flask-Dark} Flask-Dark
+\item[] \photosymbol[3]{Flask-Light} Flask-Light
+\item[] \photosymbol[3]{Flutter-Dark} Flutter-Dark
+\item[] \photosymbol[3]{Flutter-Light} Flutter-Light
+\item[] \photosymbol[3]{Forth} Forth
+\item[] \photosymbol[3]{Fortran} Fortran
+\item[] \photosymbol[3]{GameMakerStudio} GameMakerStudio
+\item[] \photosymbol[3]{Gatsby} Gatsby
+\item[] \photosymbol[3]{GCP-Dark} GCP-Dark
+\item[] \photosymbol[3]{GCP-Light} GCP-Light
+\item[] \photosymbol[3]{Gherkin-Dark} Gherkin-Dark
+\item[] \photosymbol[3]{Gherkin-Light} Gherkin-Light
+\item[] \photosymbol[3]{Git} Git
+\item[] \photosymbol[3]{Github-Dark} Github-Dark
+\item[] \photosymbol[3]{Github-Light} Github-Light
+\item[] \photosymbol[3]{GithubActions-Dark} GithubActions-Dark
+\item[] \photosymbol[3]{GithubActions-Light} GithubActions-Light
+\item[] \photosymbol[3]{GitLab-Dark} GitLab-Dark
+\item[] \photosymbol[3]{GitLab-Light} GitLab-Light
+\item[] \photosymbol[3]{Gmail-Dark} Gmail-Dark
+\item[] \photosymbol[3]{Gmail-Light} Gmail-Light
+\item[] \photosymbol[3]{Godot-Dark} Godot-Dark
+\item[] \photosymbol[3]{Godot-Light} Godot-Light
+\item[] \photosymbol[3]{GoLang} GoLang
+\item[] \photosymbol[3]{Gradle-Dark} Gradle-Dark
+\item[] \photosymbol[3]{Gradle-Light} Gradle-Light
+\item[] \photosymbol[3]{Grafana-Dark} Grafana-Dark
+\item[] \photosymbol[3]{Grafana-Light} Grafana-Light
+\item[] \photosymbol[3]{GraphQL-Dark} GraphQL-Dark
+\item[] \photosymbol[3]{GraphQL-Light} GraphQL-Light
+\item[] \photosymbol[3]{GTK-Dark} GTK-Dark
+\item[] \photosymbol[3]{GTK-Light} GTK-Light
+\item[] \photosymbol[3]{Gulp} Gulp
+\item[] \photosymbol[3]{Haskell-Dark} Haskell-Dark
+\item[] \photosymbol[3]{Haskell-Light} Haskell-Light
+\item[] \photosymbol[3]{Haxe-Dark} Haxe-Dark
+\item[] \photosymbol[3]{Haxe-Light} Haxe-Light
+\item[] \photosymbol[3]{HaxeFlixel-Dark} HaxeFlixel-Dark
+\item[] \photosymbol[3]{HaxeFlixel-Light} HaxeFlixel-Light
+\item[] \photosymbol[3]{Heroku} Heroku
+\item[] \photosymbol[3]{Hibernate-Dark} Hibernate-Dark
+\item[] \photosymbol[3]{Hibernate-Light} Hibernate-Light
+\item[] \photosymbol[3]{HTML} HTML
+\item[] \photosymbol[3]{Htmx-Dark} Htmx-Dark
+\item[] \photosymbol[3]{Htmx-Light} Htmx-Light
+\item[] \photosymbol[3]{Idea-Dark} Idea-Dark
+\item[] \photosymbol[3]{Idea-Light} Idea-Light
+\item[] \photosymbol[3]{Illustrator} Illustrator
+\item[] \photosymbol[3]{Instagram} Instagram
+\item[] \photosymbol[3]{IPFS-Dark} IPFS-Dark
+\item[] \photosymbol[3]{IPFS-Light} IPFS-Light
+\item[] \photosymbol[3]{Java-Dark} Java-Dark
+\item[] \photosymbol[3]{Java-Light} Java-Light
+\item[] \photosymbol[3]{JavaScript} JavaScript
+\item[] \photosymbol[3]{Jenkins-Dark} Jenkins-Dark
+\item[] \photosymbol[3]{Jenkins-Light} Jenkins-Light
+\item[] \photosymbol[3]{Jest} Jest
+\item[] \photosymbol[3]{JQuery} JQuery
+\item[] \photosymbol[3]{Julia-Dark} Julia-Dark
+\item[] \photosymbol[3]{Julia-Light} Julia-Light
+\item[] \photosymbol[3]{Kafka} Kafka
+\item[] \photosymbol[3]{Kali-Dark} Kali-Dark
+\item[] \photosymbol[3]{Kali-Light} Kali-Light
+\item[] \photosymbol[3]{Kotlin-Dark} Kotlin-Dark
+\item[] \photosymbol[3]{Kotlin-Light} Kotlin-Light
+\item[] \photosymbol[3]{Ktor-Dark} Ktor-Dark
+\item[] \photosymbol[3]{Ktor-Light} Ktor-Light
+\item[] \photosymbol[3]{Kubernetes} Kubernetes
+\item[] \photosymbol[3]{Laravel-Dark} Laravel-Dark
+\item[] \photosymbol[3]{Laravel-Light} Laravel-Light
+\item[] \photosymbol[3]{LaTeX-Dark} LaTeX-Dark
+\item[] \photosymbol[3]{LaTeX-Light} LaTeX-Light
+\item[] \photosymbol[3]{Less-Dark} Less-Dark
+\item[] \photosymbol[3]{Less-Light} Less-Light
+\item[] \photosymbol[3]{LinkedIn} LinkedIn
+\item[] \photosymbol[3]{Linux-Dark} Linux-Dark
+\item[] \photosymbol[3]{Linux-Light} Linux-Light
+\item[] \photosymbol[3]{Lit-Dark} Lit-Dark
+\item[] \photosymbol[3]{Lit-Light} Lit-Light
+\item[] \photosymbol[3]{Lua-Dark} Lua-Dark
+\item[] \photosymbol[3]{Lua-Light} Lua-Light
+\item[] \photosymbol[3]{Markdown-Dark} Markdown-Dark
+\item[] \photosymbol[3]{Markdown-Light} Markdown-Light
+\item[] \photosymbol[3]{Mastodon-Dark} Mastodon-Dark
+\item[] \photosymbol[3]{Mastodon-Light} Mastodon-Light
+\item[] \photosymbol[3]{MaterialUI-Dark} MaterialUI-Dark
+\item[] \photosymbol[3]{MaterialUI-Light} MaterialUI-Light
+\item[] \photosymbol[3]{Matlab-Dark} Matlab-Dark
+\item[] \photosymbol[3]{Matlab-Light} Matlab-Light
+\item[] \photosymbol[3]{Maven-Dark} Maven-Dark
+\item[] \photosymbol[3]{Maven-Light} Maven-Light
+\item[] \photosymbol[3]{Mint-Dark} Mint-Dark
+\item[] \photosymbol[3]{Mint-Light} Mint-Light
+\item[] \photosymbol[3]{Misskey-Dark} Misskey-Dark
+\item[] \photosymbol[3]{Misskey-Light} Misskey-Light
+\item[] \photosymbol[3]{MongoDB} MongoDB
+\item[] \photosymbol[3]{MySQL-Dark} MySQL-Dark
+\item[] \photosymbol[3]{MySQL-Light} MySQL-Light
+\item[] \photosymbol[3]{NeoVim-Dark} NeoVim-Dark
+\item[] \photosymbol[3]{NeoVim-Light} NeoVim-Light
+\item[] \photosymbol[3]{NestJS-Dark} NestJS-Dark
+\item[] \photosymbol[3]{NestJS-Light} NestJS-Light
+\item[] \photosymbol[3]{Netlify-Dark} Netlify-Dark
+\item[] \photosymbol[3]{Netlify-Light} Netlify-Light
+\item[] \photosymbol[3]{NextJS-Dark} NextJS-Dark
+\item[] \photosymbol[3]{NextJS-Light} NextJS-Light
+\item[] \photosymbol[3]{Nginx} Nginx
+\item[] \photosymbol[3]{Nim-Dark} Nim-Dark
+\item[] \photosymbol[3]{Nim-Light} Nim-Light
+\item[] \photosymbol[3]{Nix-Dark} Nix-Dark
+\item[] \photosymbol[3]{Nix-Light} Nix-Light
+\item[] \photosymbol[3]{NodeJS-Dark} NodeJS-Dark
+\item[] \photosymbol[3]{NodeJS-Light} NodeJS-Light
+\item[] \photosymbol[3]{Notion-Dark} Notion-Dark
+\item[] \photosymbol[3]{Notion-Light} Notion-Light
+\item[] \photosymbol[3]{Npm-Dark} Npm-Dark
+\item[] \photosymbol[3]{Npm-Light} Npm-Light
+\item[] \photosymbol[3]{NuxtJS-Dark} NuxtJS-Dark
+\item[] \photosymbol[3]{NuxtJS-Light} NuxtJS-Light
+\item[] \photosymbol[3]{Obsidian-Dark} Obsidian-Dark
+\item[] \photosymbol[3]{Obsidian-Light} Obsidian-Light
+\item[] \photosymbol[3]{OCaml} OCaml
+\item[] \photosymbol[3]{Octave-Dark} Octave-Dark
+\item[] \photosymbol[3]{Octave-Light} Octave-Light
+\item[] \photosymbol[3]{OpenCV-Dark} OpenCV-Dark
+\item[] \photosymbol[3]{OpenCV-Light} OpenCV-Light
+\item[] \photosymbol[3]{OpenShift} OpenShift
+\item[] \photosymbol[3]{OpenStack-Dark} OpenStack-Dark
+\item[] \photosymbol[3]{OpenStack-Light} OpenStack-Light
+\item[] \photosymbol[3]{p5js} p5js
+\item[] \photosymbol[3]{Perl} Perl
+\item[] \photosymbol[3]{Photoshop} Photoshop
+\item[] \photosymbol[3]{PHP-Dark} PHP-Dark
+\item[] \photosymbol[3]{PHP-Light} PHP-Light
+\item[] \photosymbol[3]{PhpStorm-Dark} PhpStorm-Dark
+\item[] \photosymbol[3]{PhpStorm-Light} PhpStorm-Light
+\item[] \photosymbol[3]{Pinia-Dark} Pinia-Dark
+\item[] \photosymbol[3]{Pinia-Light} Pinia-Light
+\item[] \photosymbol[3]{Pkl-Dark} Pkl-Dark
+\item[] \photosymbol[3]{Pkl-Light} Pkl-Light
+\item[] \photosymbol[3]{Plan9-Dark} Plan9-Dark
+\item[] \photosymbol[3]{Plan9-Light} Plan9-Light
+\item[] \photosymbol[3]{PlanetScale-Dark} PlanetScale-Dark
+\item[] \photosymbol[3]{PlanetScale-Light} PlanetScale-Light
+\item[] \photosymbol[3]{Pnpm-Dark} Pnpm-Dark
+\item[] \photosymbol[3]{Pnpm-Light} Pnpm-Light
+\item[] \photosymbol[3]{PostgreSQL-Dark} PostgreSQL-Dark
+\item[] \photosymbol[3]{PostgreSQL-Light} PostgreSQL-Light
+\item[] \photosymbol[3]{Postman} Postman
+\item[] \photosymbol[3]{Powershell-Dark} Powershell-Dark
+\item[] \photosymbol[3]{Powershell-Light} Powershell-Light
+\item[] \photosymbol[3]{Premiere} Premiere
+\item[] \photosymbol[3]{Prisma} Prisma
+\item[] \photosymbol[3]{Processing-Dark} Processing-Dark
+\item[] \photosymbol[3]{Processing-Light} Processing-Light
+\item[] \photosymbol[3]{Prometheus} Prometheus
+\item[] \photosymbol[3]{Pug-Dark} Pug-Dark
+\item[] \photosymbol[3]{Pug-Light} Pug-Light
+\item[] \photosymbol[3]{PyCharm-Dark} PyCharm-Dark
+\item[] \photosymbol[3]{PyCharm-Light} PyCharm-Light
+\item[] \photosymbol[3]{Python-Dark} Python-Dark
+\item[] \photosymbol[3]{Python-Light} Python-Light
+\item[] \photosymbol[3]{PyTorch-Dark} PyTorch-Dark
+\item[] \photosymbol[3]{PyTorch-Light} PyTorch-Light
+\item[] \photosymbol[3]{QT-Dark} QT-Dark
+\item[] \photosymbol[3]{QT-Light} QT-Light
+\item[] \photosymbol[3]{R-Dark} R-Dark
+\item[] \photosymbol[3]{R-Light} R-Light
+\item[] \photosymbol[3]{RabbitMQ-Dark} RabbitMQ-Dark
+\item[] \photosymbol[3]{RabbitMQ-Light} RabbitMQ-Light
+\item[] \photosymbol[3]{Rails} Rails
+\item[] \photosymbol[3]{RaspberryPi-Dark} RaspberryPi-Dark
+\item[] \photosymbol[3]{RaspberryPi-Light} RaspberryPi-Light
+\item[] \photosymbol[3]{React-Dark} React-Dark
+\item[] \photosymbol[3]{React-Light} React-Light
+\item[] \photosymbol[3]{ReactiveX-Dark} ReactiveX-Dark
+\item[] \photosymbol[3]{ReactiveX-Light} ReactiveX-Light
+\item[] \photosymbol[3]{RedHat-Dark} RedHat-Dark
+\item[] \photosymbol[3]{RedHat-Light} RedHat-Light
+\item[] \photosymbol[3]{Redis-Dark} Redis-Dark
+\item[] \photosymbol[3]{Redis-Light} Redis-Light
+\item[] \photosymbol[3]{Redux} Redux
+\item[] \photosymbol[3]{Regex-Dark} Regex-Dark
+\item[] \photosymbol[3]{Regex-Light} Regex-Light
+\item[] \photosymbol[3]{Remix-Dark} Remix-Dark
+\item[] \photosymbol[3]{Remix-Light} Remix-Light
+\item[] \photosymbol[3]{Replit-Dark} Replit-Dark
+\item[] \photosymbol[3]{Replit-Light} Replit-Light
+\item[] \photosymbol[3]{Rider-Dark} Rider-Dark
+\item[] \photosymbol[3]{Rider-Light} Rider-Light
+\item[] \photosymbol[3]{RobloxStudio} RobloxStudio
+\item[] \photosymbol[3]{Rocket} Rocket
+\item[] \photosymbol[3]{RollupJS-Dark} RollupJS-Dark
+\item[] \photosymbol[3]{RollupJS-Light} RollupJS-Light
+\item[] \photosymbol[3]{ROS-Dark} ROS-Dark
+\item[] \photosymbol[3]{ROS-Light} ROS-Light
+\item[] \photosymbol[3]{Ruby} Ruby
+\item[] \photosymbol[3]{Rust} Rust
+\item[] \photosymbol[3]{Sass} Sass
+\item[] \photosymbol[3]{Scala-Dark} Scala-Dark
+\item[] \photosymbol[3]{Scala-Light} Scala-Light
+\item[] \photosymbol[3]{ScikitLearn-Dark} ScikitLearn-Dark
+\item[] \photosymbol[3]{SciKitLearn-Light} SciKitLearn-Light
+\item[] \photosymbol[3]{Selenium} Selenium
+\item[] \photosymbol[3]{Sentry} Sentry
+\item[] \photosymbol[3]{Sequelize-Dark} Sequelize-Dark
+\item[] \photosymbol[3]{Sequelize-Light} Sequelize-Light
+\item[] \photosymbol[3]{Sketchup-Dark} Sketchup-Dark
+\item[] \photosymbol[3]{Sketchup-Light} Sketchup-Light
+\item[] \photosymbol[3]{Solidity} Solidity
+\item[] \photosymbol[3]{SolidJS-Dark} SolidJS-Dark
+\item[] \photosymbol[3]{SolidJS-Light} SolidJS-Light
+\item[] \photosymbol[3]{Spring-Dark} Spring-Dark
+\item[] \photosymbol[3]{Spring-Light} Spring-Light
+\item[] \photosymbol[3]{SQLite} SQLite
+\item[] \photosymbol[3]{StackOverflow-Dark} StackOverflow-Dark
+\item[] \photosymbol[3]{StackOverflow-Light} StackOverflow-Light
+\item[] \photosymbol[3]{StyledComponents} StyledComponents
+\item[] \photosymbol[3]{Sublime-Dark} Sublime-Dark
+\item[] \photosymbol[3]{Sublime-Light} Sublime-Light
+\item[] \photosymbol[3]{Supabase-Dark} Supabase-Dark
+\item[] \photosymbol[3]{Supabase-Light} Supabase-Light
+\item[] \photosymbol[3]{Svelte} Svelte
+\item[] \photosymbol[3]{SVG-Dark} SVG-Dark
+\item[] \photosymbol[3]{SVG-Light} SVG-Light
+\item[] \photosymbol[3]{Swift} Swift
+\item[] \photosymbol[3]{Symfony-Dark} Symfony-Dark
+\item[] \photosymbol[3]{Symfony-Light} Symfony-Light
+\item[] \photosymbol[3]{TailwindCSS-Dark} TailwindCSS-Dark
+\item[] \photosymbol[3]{TailwindCSS-Light} TailwindCSS-Light
+\item[] \photosymbol[3]{Tauri-Dark} Tauri-Dark
+\item[] \photosymbol[3]{Tauri-Light} Tauri-Light
+\item[] \photosymbol[3]{TensorFlow-Dark} TensorFlow-Dark
+\item[] \photosymbol[3]{TensorFlow-Light} TensorFlow-Light
+\item[] \photosymbol[3]{Terraform-Dark} Terraform-Dark
+\item[] \photosymbol[3]{Terraform-Light} Terraform-Light
+\item[] \photosymbol[3]{ThreeJS-Dark} ThreeJS-Dark
+\item[] \photosymbol[3]{ThreeJS-Light} ThreeJS-Light
+\item[] \photosymbol[3]{Twitter} Twitter
+\item[] \photosymbol[3]{TypeScript} TypeScript
+\item[] \photosymbol[3]{Ubuntu-Dark} Ubuntu-Dark
+\item[] \photosymbol[3]{Ubuntu-Light} Ubuntu-Light
+\item[] \photosymbol[3]{Unity-Dark} Unity-Dark
+\item[] \photosymbol[3]{Unity-Light} Unity-Light
+\item[] \photosymbol[3]{UnrealEngine} UnrealEngine
+\item[] \photosymbol[3]{V-Dark} V-Dark
+\item[] \photosymbol[3]{V-Light} V-Light
+\item[] \photosymbol[3]{Vala} Vala
+\item[] \photosymbol[3]{Vercel-Dark} Vercel-Dark
+\item[] \photosymbol[3]{Vercel-Light} Vercel-Light
+\item[] \photosymbol[3]{VIM-Dark} VIM-Dark
+\item[] \photosymbol[3]{VIM-Light} VIM-Light
+\item[] \photosymbol[3]{VisualStudio-Dark} VisualStudio-Dark
+\item[] \photosymbol[3]{VisualStudio-Light} VisualStudio-Light
+\item[] \photosymbol[3]{Vite-Dark} Vite-Dark
+\item[] \photosymbol[3]{Vite-Light} Vite-Light
+\item[] \photosymbol[3]{Vitest-Dark} Vitest-Dark
+\item[] \photosymbol[3]{Vitest-Light} Vitest-Light
+\item[] \photosymbol[3]{VSCode-Dark} VSCode-Dark
+\item[] \photosymbol[3]{VSCode-Light} VSCode-Light
+\item[] \photosymbol[3]{VSCodium-Dark} VSCodium-Dark
+\item[] \photosymbol[3]{VSCodium-Light} VSCodium-Light
+\item[] \photosymbol[3]{VueJS-Dark} VueJS-Dark
+\item[] \photosymbol[3]{VueJS-Light} VueJS-Light
+\item[] \photosymbol[3]{Vuetify-Dark} Vuetify-Dark
+\item[] \photosymbol[3]{Vuetify-Light} Vuetify-Light
+\item[] \photosymbol[3]{WebAssembly} WebAssembly
+\item[] \photosymbol[3]{Webflow} Webflow
+\item[] \photosymbol[3]{Webpack-Dark} Webpack-Dark
+\item[] \photosymbol[3]{Webpack-Light} Webpack-Light
+\item[] \photosymbol[3]{WebStorm-Dark} WebStorm-Dark
+\item[] \photosymbol[3]{WebStorm-Light} WebStorm-Light
+\item[] \photosymbol[3]{WindiCSS-Dark} WindiCSS-Dark
+\item[] \photosymbol[3]{WindiCSS-Light} WindiCSS-Light
+\item[] \photosymbol[3]{Windows-Dark} Windows-Dark
+\item[] \photosymbol[3]{Windows-Light} Windows-Light
+\item[] \photosymbol[3]{Wordpress} Wordpress
+\item[] \photosymbol[3]{Workers-Dark} Workers-Dark
+\item[] \photosymbol[3]{Workers-Light} Workers-Light
+\item[] \photosymbol[3]{XD} XD
+\item[] \photosymbol[3]{Yarn-Dark} Yarn-Dark
+\item[] \photosymbol[3]{Yarn-Light} Yarn-Light
+\item[] \photosymbol[3]{Yew-Dark} Yew-Dark
+\item[] \photosymbol[3]{Yew-Light} Yew-Light
+\item[] \photosymbol[3]{Zig-Dark} Zig-Dark
+\item[] \photosymbol[3]{Zig-Light} Zig-Light
+\end{itemize}
+\end{multicols}
+
+\section*{License}
+This package and its included icon images, taken from \href{https://github.com/tandpfun/skill-icons}{https://github.com/tandpfun/skill-icons}, are released under the \href{https://opensource.org/license/mit}{MIT} license.
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/spbmark/spbmark.pdf b/macros/latex/contrib/spbmark/spbmark.pdf
index c86957a167..8242e5e3bf 100644
--- a/macros/latex/contrib/spbmark/spbmark.pdf
+++ b/macros/latex/contrib/spbmark/spbmark.pdf
Binary files differ
diff --git a/macros/latex/contrib/spbmark/spbmark.sty b/macros/latex/contrib/spbmark/spbmark.sty
index e4c45d13e8..c1ce4837a5 100644
--- a/macros/latex/contrib/spbmark/spbmark.sty
+++ b/macros/latex/contrib/spbmark/spbmark.sty
@@ -9,7 +9,7 @@
% https://creativecommons.org/licenses/by/4.0/legalcode
\NeedsTeXFormat{LaTeX2e}[2018/12/31]
\RequirePackage{xparse,l3keys2e}
-\ProvidesExplPackage{spbmark}{2024/04/24}{1.46f}
+\ProvidesExplPackage{spbmark}{2024/05/19}{1.46j}
{Customize superscripts and subscripts}
\cs_generate_variant:Nn \box_set_ht:Nn { cv }
@@ -18,11 +18,12 @@
\cs_generate_variant:Nn \dim_gset:Nn { Nv }
\cs_generate_variant:Nn \dim_abs:n { V,v }
\cs_generate_variant:Nn \dim_compare:nNnTF { V,v }
-\cs_generate_variant:Nn \msg_warning:nnn { nnV }
\cs_generate_variant:Nn \str_case:nn { x }
\cs_generate_variant:Nn \tl_if_novalue:nF { V }
\cs_generate_variant:Nn \tl_if_blank:nF { v }
+\providecommand{\AfterPreamble}{\AtBeginDocument}
+\AtBeginDocument{\cs_set_eq:NN \AfterPreamble \use:n}
\cs_set_eq:NN \spb@textsuperscript@save \textsuperscript
\cs_set_eq:NN \spb@textsubscript@save \textsubscript
\cs_set_eq:NN \spb@math@super@save \sp
@@ -31,46 +32,78 @@
\cs_new_protected:Npn \spb_define:n { \keys_define:nn { ctex/tools } }
\cs_new_protected:Npn \spb_set:n { \keys_set:nn { ctex/tools } }
\cs_set_eq:NN \spbset \spb_set:n
+
\keys_define:nn { spbmark/option }
{
text .choice:,
- text/true .code:n =
+ text/true .code:n =
{
\cs_set:Npn \textsuperscript { \super[textsp] }
\cs_set:Npn \textsubscript { \sub[textsb] }
},
- text/false .code:n =
+ text/false .code:n =
{
\cs_set:Npn \textsuperscript { \spb@textsuperscript@save }
\cs_set:Npn \textsubscript { \spb@textsubscript@save }
},
- text .default:n = true,
+ text .default:n = true,
math .choice:,
- math/true .code:n =
+ math/true .code:n =
{
\cs_set:Npn \sp { \super[mathsp] }
\cs_set:Npn \sb { \sub[mathsb] }
},
- math/false .code:n =
+ math/false .code:n =
{
\cs_set:Npn \sp { \spb@math@super@save }
\cs_set:Npn \sb { \spb@math@sub@save }
},
- math .default:n = true,
+ math .default:n = true,
foot .choice:,
- foot/true .code:n =
+ foot/true .code:n =
{
\cs_set:Npn \@makefnmark
{ \hbox:n { \fnmarkfont{\super[fnmark]{\@thefnmark}} } }
},
- foot/false .code:n =
+ foot/false .code:n =
{ \cs_set:Npn \@makefnmark { \spb@@makefnmark@save } },
- foot .default:n = true,
- both .meta:n = { text = #1,math = #1 },
- both .default:n = true,
- all .meta:n = { text = #1,math = #1,foot = #1 },
- all .default:n = true
+ foot .default:n = true,
+ both .meta:n = { text = #1,math = #1 },
+ both .default:n = true,
+ all .meta:n = { text = #1,math = #1,foot = #1 },
+ all .default:n = true
+ }
+\char_set_catcode_active:N \~
+\keys_define:nn { spbmark/option }
+ {
+ math* .choice:,
+ math*/true .code:n =
+ {
+ \AfterPreamble
+ {
+ \group_begin:
+ \char_set_lccode:nn { `\~ } { `\^ }
+ \lowercase{\group_end:\cs_set:Npn ~} { \super[mathsp*] }
+ \group_begin:
+ \char_set_lccode:nn { `\~ } { `\_ }
+ \lowercase{\group_end:\cs_set:Npn ~} { \sub[mathsb*] }
+ \char_set_mathcode:nn { `\^ } { "8000 }
+ \char_set_catcode_other:N \^
+ \char_set_catcode_other:N \_
+ }
+ },
+ math*/false .code:n =
+ {
+ \AfterPreamble
+ {
+ \char_set_catcode_math_superscript:N \^
+ \char_set_catcode_math_subscript:N \_
+ \char_set_mathcode:nn { `\^ } { "005E }
+ }
+ },
+ math* .default:n = true
}
+\char_set_catcode_space:N \~
\tl_if_exist:NTF \ftntm@font
{ \tl_set_eq:NN \fnmarkfont \ftntm@font }
{ \tl_set_eq:NN \fnmarkfont \normalfont }
@@ -113,7 +146,7 @@
\cs_new_protected:Npn \spbshortkv #1#2
{ \spb_define:n { #1 .meta:n = {#2} } }
\clist_map_inline:nn
- { textsp,textsb,mathsp,mathsb,fnmark }
+ { textsp,textsb,mathsp,mathsb,mathsp*,mathsb*,fnmark }
{
\defspbstyle{#1}{}
\spbshortkv{#1}{style = #1}
@@ -157,13 +190,13 @@
}
\cs_new:Npn \spb_box_super_move_up_i:n #1
- { \box_move_up:nn {#1} { \box_use:N \l__super_i_inner_box } }
+ { \box_move_up:nn {#1} { \box_use:N \g__super_i_inner_box } }
\cs_new:Npn \spb_box_sub_move_down_i:n #1
- { \box_move_down:nn {#1} { \box_use:N \l__sub_i_inner_box } }
+ { \box_move_down:nn {#1} { \box_use:N \g__sub_i_inner_box } }
\cs_new:Npn \spb_box_super_move_up_ii:n #1
- { \box_move_up:nn {#1} { \box_use:N \l__super_ii_box } }
+ { \box_move_up:nn {#1} { \box_use:N \g__super_ii_box } }
\cs_new:Npn \spb_box_sub_move_down_ii:n #1
- { \box_move_down:nn {#1} { \box_use:N \l__sub_ii_box } }
+ { \box_move_down:nn {#1} { \box_use:N \g__sub_ii_box } }
\cs_new:Npn \spb_box_vmove_i:nn #1
{
\str_case:nn {#1}
@@ -256,28 +289,28 @@
\cs_new_protected:Npn \spb_ht_dp_assign:nnnn #1#2#3#4
{
\tl_if_blank:vF { l__#1_height_#3_tl }
- { \box_set_ht:cv { l__#1_#3#4_box } { l__#1_height_#3_tl } }
+ { \box_set_ht:cv { g__#1_#3#4_box } { l__#1_height_#3_tl } }
\tl_if_blank:vF { l__#1_depth_i_tl }
- { \box_set_dp:cv { l__#2_#3#4_box } { l__#2_depth_#3_tl } }
+ { \box_set_dp:cv { g__#2_#3#4_box } { l__#2_depth_#3_tl } }
}
-\box_new:N \l__super_i_outer_box
-\box_new:N \l__super_i_inner_box
-\box_new:N \l__sub_i_outer_box
-\box_new:N \l__sub_i_inner_box
-\box_new:N \l__super_ii_box
-\box_new:N \l__sub_ii_box
+\box_new:N \g__super_i_outer_box
+\box_new:N \g__super_i_inner_box
+\box_new:N \g__sub_i_outer_box
+\box_new:N \g__sub_i_inner_box
+\box_new:N \g__super_ii_box
+\box_new:N \g__sub_ii_box
\dim_new:N \llastwd
\dim_new:N \clastwd
\dim_new:N \rlastwd
-\tl_set:Nn \superwd { \box_wd:N \l__super_ii_box }
-\tl_set:Nn \subwd { \box_wd:N \l__sub_ii_box }
+\tl_set:Nn \superwd { \box_wd:N \g__super_ii_box }
+\tl_set:Nn \subwd { \box_wd:N \g__sub_ii_box }
\tl_set:Nn \maxwd { \dim_max:VV \superwd \subwd }
-\tl_set:Nn \l__spb_box_super_wd_i_tl { \box_wd:N \l__super_i_inner_box }
-\tl_set:Nn \l__spb_box_sub_wd_i_tl { \box_wd:N \l__sub_i_inner_box }
+\tl_set:Nn \l__spb_box_super_wd_i_tl { \box_wd:N \g__super_i_inner_box }
+\tl_set:Nn \l__spb_box_sub_wd_i_tl { \box_wd:N \g__sub_i_inner_box }
\cs_new:Npn \spb_math_print_store_i:nn #1#2
{
- \hbox_gset:cn { l__#1_i_inner_box }
+ \hbox_gset:cn { g__#1_i_inner_box }
{
\ensuremath
{
@@ -289,7 +322,7 @@
}
\cs_new:Npn \spb_text_print_store_i:nn #1#2
{
- \hbox_gset:cn { l__#1_i_inner_box }
+ \hbox_gset:cn { g__#1_i_inner_box }
{
\use:c { spb@text#1script@save }
{ \tl_use:c { l__spb_#1_cmd_i_tl }{#2} }
@@ -298,16 +331,16 @@
}
\cs_new:Npn \spb_math_print_store_ii:nn #1#2
{
- \hbox_gset:Nn \l__super_ii_box
+ \hbox_gset:Nn \g__super_ii_box
{ \ensuremath{\spb@math@super@save{\l__spb_super_cmd_ii_tl{#1}}} }
- \hbox_gset:Nn \l__sub_ii_box
+ \hbox_gset:Nn \g__sub_ii_box
{ \ensuremath{\spb@math@sub@save{\l__spb_sub_cmd_ii_tl{#2}}} }
}
\cs_new:Npn \spb_text_print_store_ii:nn #1#2
{
- \hbox_gset:Nn \l__super_ii_box
+ \hbox_gset:Nn \g__super_ii_box
{ \spb@textsuperscript@save{\l__spb_super_cmd_ii_tl{#1}} }
- \hbox_gset:Nn \l__sub_ii_box
+ \hbox_gset:Nn \g__sub_ii_box
{ \spb@textsubscript@save{\l__spb_sub_cmd_ii_tl{#2}} }
}
\cs_set_eq:NN \spbifmath \use_ii:nn
@@ -408,7 +441,7 @@
\spb_mode_switch:nnn {#1} {##4} { i }
\spb_content_hbox_set:nn {#1} {##1}
\spb_ht_dp_assign:nnnn {#1} {#1} { i } { _outer }
- \box_use:c { l__#1_i_outer_box }
+ \box_use:c { g__#1_i_outer_box }
\exp_last_unbraced:Nx
\group_end:
{
@@ -422,7 +455,7 @@
{
\dim_gset:Nn \clastwd { (\llastwd + \rlastwd)/2 }
\tl_set:Nn \abs@hmove@i { \dim_abs:v { l__spb_#1_hmove_tl } }
- \hbox_set:cn { l__#1_i_outer_box }
+ \hbox_gset:cn { g__#1_i_outer_box }
{
\dim_compare:vNnTF { l__spb_#1_hmove_tl } < { 0pt }
{
diff --git a/macros/latex/contrib/spbmark/spbmark.tex b/macros/latex/contrib/spbmark/spbmark.tex
index 9bd3057ad4..9d04ea07f9 100644
--- a/macros/latex/contrib/spbmark/spbmark.tex
+++ b/macros/latex/contrib/spbmark/spbmark.tex
@@ -2,13 +2,14 @@
\usepackage{siunitx,setspace,pifont,hologo}
\usepackage[spbmark]{altsubsup}
+\usepackage[margin = 1in,marginparwidth = 0.6in,footskip = 0.5in]{geometry}
\usepackage[noto]{newtxmath}
\setcnltx
{
package = spbmark,
title = the spbmark package,
- version = v1.46f,
- date = 2024/04/24,
+ version = v1.46j,
+ date = 2024/05/19,
authors = Qu Yi,
info = Customize superscript and subscript,
email = toquyi@163.com,
@@ -39,21 +40,23 @@
\newsplitarg{\splitoarg}{[}{]}
\newsplitarg{\splitmarg}{\{}{\}}
\newsplitarg{\splitdarg}{(}{)}
-\newnote{\newtag}[1][New]{\textcolor{red}{\ding{73}\ #1}}
+\newnote{\newtag}[1]{\textcolor{red}{#1}}
\renewcommand{\emph}[1]{\textcolor{red}{#1}}
\renewcommand{\cnltx@write@lastname}{}
\makeatother
\begin{document}
\section{Macro package options}
-The following macro package options will redefine the script commands of the \LaTeX{} kernel. If you do not specify the values of boolean options, they default to \code{true}. These options can also be changed in the preamble area and main body using the global control command \cs{sbpset}.
+The following macro package options will redefine the script commands of the \LaTeX{} kernel. If you do not specify the values of boolean options, they default to \code{true}. These options can also be changed in the preamble area and main body using the global control command \cs{spbset}.
\begin{options}
- \keychoice{text}{true,\fbox{false}}\newtag[Changed]%
- \cs{textsuperscript} and \cs{textsubscript} are equivalent to the \cs{super} and \cs{sub} commands. At this point, you can use the \cs{defspbstyle} command to define the style \code{textsp} and \code{textsb} to change the format of the text superscript and subscript.
- \keychoice{math}{true,\fbox{false}}\newtag[Changed]%
- \cs{sp} and \cs{sb} are equivalent to the \cs{super} and \cs{sub} commands. At this point, you can use the \cs{defspbstyle} command to define the style \code{mathsp} and \code{mathsb} to change the format of the math superscript and subscript.
- \keychoice{foot}{true,\fbox{false}}\newtag[Changed]%
- The format of the footnote mark match the superscript global move and format settings. At this point, you can use the \cs{defspbstyle} command to define the superscript style \code{fnmark} to change the format of the footnote mark.
+ \keychoice{text}{true,\fbox{false}}
+ \cs{textsuperscript} and \cs{textsubscript} are equivalent to the \cs{super} and \cs{sub} commands. The command \cs{defspbstyle} can be used to define the style \code{textsp} and \code{textsb} to change the format of the text superscript and subscript.
+ \keychoice{math}{true,\fbox{false}}
+ \cs{sp} and \cs{sb} are equivalent to the \cs{super} and \cs{sub} commands. The command \cs{defspbstyle} can be used to define the style \code{mathsp} and \code{mathsb} to change the format of the math superscript and subscript.
+ \keychoice{math*}{true,\fbox{false}}\newtag{Exp\\v1.46j}%
+ The \code{\^{}} and \code{\_{}} tokens in the math mode are equivalent to the \cs{super} and \cs{sub} commands. The command \cs{defspbstyle} can be used to define the style \code{mathsp*} and \code{mathsb*} to change the format of the math superscript and subscript.
+ \keychoice{foot}{true,\fbox{false}}
+ The format of the footnote mark match the superscript global move and format settings. \cs{defspbstyle} can be used to define the superscript style \code{fnmark} to change the format of the footnote mark.
\begin{example}[code-only]
\defspbstyle{textsp}{vmove=-1pt,cmd=\bfseries}
\defspbstyle{mathsb}{hmove=0.5em}
@@ -151,7 +154,7 @@ The options common to \meta{kv list} of the three commands are as follows. They
Use the \meta{style name} defined by the \cs{defspbstyle} command to make it work global or local.
\keychoice{mode}{text,math,\fbox{match}}
The mode of superscript or subscript output can be \code{text} or \code{math} mode. The \code{match} option automatically matches output modes according to the current mode.
- \keychoice{thiswd}{auto,\fbox{keep}}\newtag%
+ \keychoice{thiswd}{auto,\fbox{keep}}
Sets how the length of the this marker is handled after this command is used. If it is \code{keep}, the width of the previous marker remains the same. If it is \code{auto}, if the next token is a marker command and the upper or lower position is the \textcolor{red}{opposite} of the this command, the width of the this marker is maintained, otherwise the width automatically returns to \textcolor{red}{zero}.
\begin{example}
\spbset{sbhmove=-\llastwd,sbthiswd=auto,sbcmd=\color{red}}
@@ -160,7 +163,7 @@ The options common to \meta{kv list} of the three commands are as follows. They
3A\sub{bcd}[thiswd=keep]\sub{e}Some texts\sub{e} \\
4A\sub{bcd}\sub{e}Some texts\sub{e}
\end{example}
- \keyval{regex}{regular expression}\newtag%
+ \keyval{regex}{regular expression}
After using the superscript or subscript command, this option is used to determine whether the \textcolor{red}{following} tokens match the \meta{regular expression}. If it does \textcolor{red}{not}, the width of the this marker returns to zero.
\begin{example}[code-only]
\newcommand{\mysp}[2][]{\super[regex=\c{mysb},#1]{#2}}
@@ -205,13 +208,13 @@ The following list of keys control the format both of superscript \emph{or} subs
The distance between the subscript baseline and the previous line.
\keyval{sbdepth}{fixed length}
The distance between the subscript baseline and the next line.
- \keychoice{spthiswd}{auto,\fbox{keep}}\newtag%
+ \keychoice{spthiswd}{auto,\fbox{keep}}
Width processing mode after using this superscript. See Section \ref{sec:user commands} for the meaning of this option.
- \keychoice{sbthiswd}{auto,\fbox{keep}}\newtag%
+ \keychoice{sbthiswd}{auto,\fbox{keep}}
Width processing mode after using this subscript. See Section \ref{sec:user commands} for the meaning of this option.
- \keyval{spregex}{regular expression}\newtag%
+ \keyval{spregex}{regular expression}
After the superscript command is used, the regular expression rules of the following tokens are matched. See Section \ref{sec:user commands} for the meaning of this option.
- \keyval{sbregex}{regular expression}\newtag%
+ \keyval{sbregex}{regular expression}
After the subscript command is used, the regular expression rules of the following tokens are matched. See Section \ref{sec:user commands} for the meaning of this option.
\end{options}
@@ -250,9 +253,12 @@ Here is a list of the three commands, please pay attention to the usage of optio
\subsection{siunitx}
It can also be used with the \pkg*{siunitx} package to output superscript and subscript in the unit:
\begin{example}
- \unit[mode=math]{kg.m/s\super[vmove=-1pt]{2}} \\
- \qty[mode=text]{30}{A\supersub[hmove=1pt,cmd=\color{red}]{b}{c}} \\
- \spbset{sbhmove=2pt}\unit[mode=text]{A\sub{b}}
+ \spbset{spcmd=\spbifmath{}{\color{purple}}}
+ \sisetup{text-superscript-command=\super}
+ 1-\qty[mode=text]{10}{A^2} \\
+ 2-\unit[mode=math]{kg.m/s\super[vmove=-1pt]{2}} \\
+ 3-\qty[mode=text]{30}{A\supersub[hmove=1pt,cmd=\color{blue}]{b}{c}} \\
+ 4-\spbset{sbhmove=2pt}\unit[mode=text]{A\sub{b}}
\end{example}
\subsection{realscripts}
diff --git a/macros/latex/contrib/synthslant/LICENSE b/macros/latex/contrib/synthslant/LICENSE
new file mode 100644
index 0000000000..f8b699e6eb
--- /dev/null
+++ b/macros/latex/contrib/synthslant/LICENSE
@@ -0,0 +1,415 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. 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.
+
+2. 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.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+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.
+
+4. 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.
+
+5. 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.
+
+6. 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. 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.
+
+ b. 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.
+
+ c. 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.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. 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;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. 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 6, above, are met with
+regard to the Derived Work.
+
+8. 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 4, above.
+
+9. 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.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. 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 6 above, concerning changes from the Work.
+
+11. 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.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. 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.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. 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 comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. 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.
+
+ 4. If you make an `intention announcement' as described in 2b. 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.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+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.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `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 GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+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.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% 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.
+
+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 `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ 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.
diff --git a/macros/latex/contrib/synthslant/Makefile b/macros/latex/contrib/synthslant/Makefile
new file mode 100644
index 0000000000..d8de419230
--- /dev/null
+++ b/macros/latex/contrib/synthslant/Makefile
@@ -0,0 +1,302 @@
+### name: Makefile
+### synopsis: Build `synthslant' style file and documentation
+### author: Dr. Christoph L. Spiel
+### GNU make version: 4.3
+
+
+SHELL := /bin/sh
+
+
+BASE64 := base64
+BASE64_FLAGS :=
+
+
+DVIPDFMX := dvipdfmx
+DVIPDFMX_FLAGS :=
+
+
+DVIPS := dvips
+DVIPS_FLAGS := -d1 # debug \special{}
+
+
+LATEX := /usr/bin/env max_print_line=2147483647 pdflatex
+LATEX_FLAGS := -file-line-error -halt-on-error -interaction=nonstopmode
+LATEX_RERUN_TRIGGER := '^Package rerunfilecheck Warning: File [^ ]* has changed'
+LATEX_WARNING := '^LaTeX (|[A-Za-z0-9_]* )Warning:'
+
+
+MAKEINDEX := makeindex
+MAKEINDEX_FLAGS := -q
+
+
+METAPOST := mpost
+METAPOST_FLAGS := -file-line-error -interaction=nonstopmode -tex=latex
+
+
+SPELLCHECK := aspell
+SPELLCHECK_FLAGS := \
+ --add-tex-command='citenum p' --add-tex-command='code p' \
+ --add-tex-command='Cref p' --add-tex-command='cref p' \
+ --add-tex-command='cs p' \
+ --add-tex-command='DescribeEnv p' --add-tex-command='DescribeMacro p' \
+ --add-tex-command='marg p' --add-tex-command='meta p' \
+ --add-tex-command='oarg p' \
+ --lang=en_US --mode=tex
+
+
+SOURCE_FILES := LICENSE Makefile synthslant.dtx synthslant.ins
+
+
+
+.PHONY: all
+all: sty pdf
+
+
+.PHONY: sty
+sty: synthslant.sty
+
+
+.PHONY: pdf
+pdf: doc gauge
+
+
+.PHONY: doc
+doc: synthslant.pdf
+
+
+.PHONY: gauge
+gauge: synthslant-gauge.pdf
+
+
+.PHONY: cpio
+cpio:
+ cd ..; \
+ echo $(addprefix synthslant/,$(SOURCE_FILES)) | \
+ cpio -o | \
+ gzip > "synthslant-$$(date +%Y-%m-%d).cpio.gz"
+
+
+.PHONY: tar
+tar:
+ cd ..; \
+ tar czf "synthslant-$$(date +%Y-%m-%d).tar.gz" \
+ $(addprefix synthslant/,$(SOURCE_FILES))
+
+
+.PHONY: clean
+clean:
+ $(RM) ./*.aux ./*.brf ./*.dvi ./*.glg ./*.glo ./*.gls
+ $(RM) ./*.hd ./*.idx ./*.ilg ./*.ind ./*.loe ./*.lof ./*.log ./*.lot
+ $(RM) ./*.mp ./*.mps ./*.mpx ./*.out ./*.pdf ./*.ps ./*.toc
+ $(RM) mptextmp.* mpxerr.tex
+ $(RM) README README.html RELEASE-HOWTO RELEASE-HOWTO.html
+ $(RM) compare-with-the-gimp.eps compare-with-the-gimp.png
+
+
+.PHONY: mostlyclean
+mostlyclean: clean
+
+
+.PHONY: maintainer-clean
+maintainer-clean: mostlyclean
+ $(RM) ./*.base64 ./*.ist ./*.mp ./*.sty ./*.tex
+
+
+.PHONY: perf
+perf: synthslant-gauge.tex synthslant.sty
+ perf stat --repeat=10 -- $(LATEX) $(LATEX_FLAGS) -interaction batchmode -draftmode $<
+
+
+.PHONY: tool-check
+tool-check:
+ @printf '*** LATEX = "%s"\n' '$(LATEX)'
+ $(LATEX) --version
+ @printf '\n\n*** MAKEINDEX = "%s"\n' '$(MAKEINDEX)'
+ $(MAKEINDEX) < /dev/null
+ @printf '\n\n*** METAPOST = "%s"\n' '$(METAPOST)'
+ $(METAPOST) --version
+ @printf '\n*** BASE64 = "%s"\n' '$(BASE64)'
+ $(BASE64) --version
+ @printf '\n\nTool check passed.\n'
+
+
+.PHONY: spell-check
+spell-check:
+ @sed -e '\#<DISABLE-SPELL-CHECK/>#d' \
+ -e '\#<DISABLE-SPELL-CHECK>#,\#</DISABLE-SPELL-CHECK>#d' < synthslant.dtx | \
+ sed -e 's/^ *%%*//' | \
+ sed -e 's/\\-//g' -e 's/|[^|]*|/ /g' | \
+ $(SPELLCHECK) $(SPELLCHECK_FLAGS) list | \
+ sort | uniq | fmt | sed -e 's/ / /g'
+
+
+.PHONY: update-docs
+update-docs: pdf
+ cp -f synthslant.pdf synthslant-gauge.pdf docs
+
+
+define HELP_SCREEN
+Selected Phony Targets
+----------------------
+all: Make everything there is to make. This is the .DEFAULT_GOAL.
+
+clean: Remove some products.
+
+cpio: In the parent directory create a cpio(1) archive of the
+ project source files whose name is time-stamped.
+
+doc: Build "synthslant.pdf" the Syntslant documentation.
+
+gauge: Build "synthslant-gauge.pdf" the Syntslant gauge and example
+ file.
+
+maintainer-clean: Remove every product file that can be rebuilt even
+ if uncommon tools are necessary.
+
+mostlyclean: Remove some more products than clean:.
+
+pdf: Build doc: and gauge:.
+
+sty: Only extract "synthslant.sty" from "synthslant.dtx". This
+ operation requires LaTeX (-> $(LATEX)) and nothing else.
+
+tar: In the parent directory create a tar(1) file of the project
+ source files whose name is time-stamped.
+
+tool-check: Check whether some of the required tools to build the
+ project are available.
+
+
+Selected Implicit Rules
+-----------------------
+%.dvi %.pdf: %.dtx
+ Run LaTeX or pdfLaTeX (-> $(LATEX)) on dtx source until a
+ fix-point is reached.
+
+%.dvi %.pdf: %.tex
+ Run LaTeX or pdfLaTeX (-> $(LATEX)) on tex file until a
+ fix-point is reached.
+
+%.mx.pdf: %.dvi
+ Convert dvi to pdf via dvipdfmx (-> $(DVIPDFMX)).
+
+%.ps: %.dvi
+ Convert dvi to ps via dvips (-> $(DVIPS)).
+
+
+Some Explicit Rules
+-------------------
+README.html:
+ Convert "README.md" to html. Requires markdown(1).
+
+README: Convert "README.html" to plain text. Requires w3m(1).
+
+endef
+
+.PHONY: help
+help:
+ $(info $(HELP_SCREEN))
+
+
+
+.PRECIOUS: %.mps
+
+
+
+define MAKE_INDEX_AND_GLOSSARY
+sed -e '/@/d' < $*.idx > ,$*.idx; mv ,$*.idx $*.idx; \
+$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s synthslant.ist -t $*.ilg -o $*.ind $*.idx; \
+$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s gglo.ist -t $*.glg -o $*.gls $*.glo
+endef
+
+define GREP_LATEX_WARNINGS
+test -e $*.log && grep -E $(LATEX_WARNING) $*.log | uniq
+endef
+
+%.dvi %.pdf: %.dtx
+ $(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.gls ./$*.glo ./$*.lof ./$*.lot ./$*.toc
+ $(LATEX) $(LATEX_FLAGS) -draftmode $<
+ $(MAKE_INDEX_AND_GLOSSARY)
+ $(LATEX) $(LATEX_FLAGS) $<
+ $(MAKE_INDEX_AND_GLOSSARY)
+ while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \
+ do \
+ $(LATEX) $(LATEX_FLAGS) $<; \
+ $(MAKE_INDEX_AND_GLOSSARY); \
+ done
+ $(GREP_LATEX_WARNINGS)
+
+
+%.dvi: LATEX=latex
+
+
+%.dvi %.pdf: %.tex
+ $(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.lof ./$*.lot ./$*.toc
+ $(LATEX) $(LATEX_FLAGS) -draftmode $<
+ $(LATEX) $(LATEX_FLAGS) $<
+ while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \
+ do \
+ $(LATEX) $(LATEX_FLAGS) $<; \
+ done
+ $(GREP_LATEX_WARNINGS)
+
+
+%.mx.pdf: %.dvi
+ $(DVIPDFMX) $(DVIPDFMX_FLAGS) -o $@ $<
+
+
+%.ps: %.dvi
+ $(DVIPS) $(DVIPS_FLAGS) -o $@ $<
+
+
+%.mps: %.mp
+ $(METAPOST) -s 'outputtemplate="%j.mps"' $(METAPOST_FLAGS) $<
+
+
+%.eps: %.png
+ convert $< -compress lzw eps2:$@
+
+
+%.html: %.md
+ markdown $< > $@
+
+%: %.html
+ w3m -cols 79 $< > $@
+
+
+
+synthslant.sty synthslant.ist synthslant-gauge.tex \
+compare-with-the-gimp.png.base64 shear-transform.mp title.mp: \
+ synthslant.ins synthslant.dtx
+ $(LATEX) $(LATEX_FLAGS) $<
+
+
+synthslant.pdf: \
+ synthslant.dtx \
+ compare-with-the-gimp.png \
+ shear-transform.mps \
+ title.mps \
+ | synthslant.sty
+
+synthslant.dvi: \
+ synthslant.dtx \
+ compare-with-the-gimp.eps \
+ shear-transform.mps \
+ title.mps
+
+
+compare-with-the-gimp.png: compare-with-the-gimp.png.base64
+ $(BASE64) $(BASE64_FLAGS) --decode $< > $@
+
+
+shear-transform.mps: shear-transform.mp
+
+
+title.mps: title.mp
+
+
+## compare-with-the-gimp.png: compare-with-the-gimp.orig.png
+## convert $< -depth 8 -resize 50% -set colorspace Gray -separate -average $@
+##
+## compare-with-the-gimp.png.base64: compare-with-the-gimp.png
+## $(BASE64) $(BASE64_FLAGS) $< > $@
diff --git a/macros/latex/contrib/synthslant/README.md b/macros/latex/contrib/synthslant/README.md
new file mode 100644
index 0000000000..1b1c719189
--- /dev/null
+++ b/macros/latex/contrib/synthslant/README.md
@@ -0,0 +1,64 @@
+# SynthSlant &ndash; Synthetic slanting of glyphs
+
+LaTeX package `synthslant` slants short pieces of text to the right or to the left.
+
+
+## Installation
+
+The minimally necessary files to install synthslant are *synthslant.ins* and *synthslant.dtx*.
+Running LaTeX on *synthslant.ins* in particular produces *synthslant.sty*:
+
+ latex synthslant.ins
+
+After extraction from *synthslant.dtx* place *synthslant.sty* in a directory mentioned in your
+TEXINPUTS paths or copy it into one of the directories for your LaTeX installation's *sty*-files
+and run **mktexlsr** or equivalent.
+
+To build the documentation it is easier to use the GNU *Makefile*:
+
+ make
+
+LuaLaTeX users will want to override the default LaTeX command **pdflatex** with **lualatex** by
+saying
+
+ make LATEX=lualatex
+
+To construct the manual *synthslant.pdf* a working [MetaPost](https://tug.org/metapost.html)
+installation is required. Moreover, besides the usual POSIX utilities
+[**base64**](https://www.gnu.org/software/coreutils/manual/html_node/base64-invocation.html) is
+needed to recover the graphics file stored as printable ASCII characters inside of
+*synthslant.dtx*. Cautious users can run
+
+ make tool-check
+
+ahead to verify that the required utilities are installed and working.
+For an overview over the most important *Makefile* targets use
+
+ make help
+
+
+## Usage
+
+Load the package with the usual incantation
+
+ \usepackage{synthslant}
+
+See Section 2 of the package documentation for available options.
+
+
+## Documentation
+
+The package documentation can be found
+[online](https://cspiel.github.io/synthslant/).
+
+
+## Credits
+
+Synthslant is written by Ch. L. Spiel <cspiel@users.sourceforge.org>.
+
+
+## License
+
+Released under the
+[LaTeX Project Public License v1.3c](https://www.latex-project.org/lppl.txt)
+or later.
diff --git a/macros/latex/contrib/synthslant/RELEASE-HOWTO.md b/macros/latex/contrib/synthslant/RELEASE-HOWTO.md
new file mode 100644
index 0000000000..13435ef66d
--- /dev/null
+++ b/macros/latex/contrib/synthslant/RELEASE-HOWTO.md
@@ -0,0 +1,51 @@
+# How to prepare a new release
+
+... and not make too many mistakes.
+
+
+1. Check that the work-area is clean with respect to **git**-tracked
+ files.
+
+ ``` git status ```
+
+1. Update the date stamp of `\ProvidesPackage`.
+
+1. (Temporarily) Zero the `\overfullrule`s of the documentation and
+ the example files.
+
+1. Thoroughly clean the work-area:
+
+ ```make maintainer-clean```
+
+1. Rebuild:
+
+ ```make```
+
+1. Check that all _*.sty_ and _*.pdf_ files are in good shape.
+
+1. Push the documentation files created in the previous step down into
+ the *docs* directory:
+
+ ```make update-docs```
+
+1. Undo the `\overfullrule` change.
+
+1. Commit the changes:
+
+ ```
+ git add .
+ ```
+
+ and finally
+
+ ```
+ git commit
+ ```
+
+1. Tag the commit with the version string of `\ProvidesPackage`:
+
+ ```git tag v1.23```
+
+1. Push the changes to the public repository:
+
+ ```git push origin master --tags```
diff --git a/macros/latex/contrib/synthslant/docs/index.md b/macros/latex/contrib/synthslant/docs/index.md
new file mode 100644
index 0000000000..c8c312f388
--- /dev/null
+++ b/macros/latex/contrib/synthslant/docs/index.md
@@ -0,0 +1,4 @@
+### Package Documentation
+
+- Comprehensive `synthslant` documentation: [synthslant.pdf](https://cspiel.github.io/synthslant/synthslant.pdf)
+- `synthslant` test and demonstration: [synthslant-gauge.pdf](https://cspiel.github.io/synthslant/synthslant-gauge.pdf)
diff --git a/macros/latex/contrib/synthslant/docs/synthslant-gauge.pdf b/macros/latex/contrib/synthslant/docs/synthslant-gauge.pdf
new file mode 100644
index 0000000000..425e7944ef
--- /dev/null
+++ b/macros/latex/contrib/synthslant/docs/synthslant-gauge.pdf
Binary files differ
diff --git a/macros/latex/contrib/synthslant/docs/synthslant.pdf b/macros/latex/contrib/synthslant/docs/synthslant.pdf
new file mode 100644
index 0000000000..9b034b86c3
--- /dev/null
+++ b/macros/latex/contrib/synthslant/docs/synthslant.pdf
Binary files differ
diff --git a/macros/latex/contrib/synthslant/synthslant.dtx b/macros/latex/contrib/synthslant/synthslant.dtx
new file mode 100644
index 0000000000..f5424cf7fa
--- /dev/null
+++ b/macros/latex/contrib/synthslant/synthslant.dtx
@@ -0,0 +1,5264 @@
+% \iffalse
+%
+% Copyright (C) 2024 by Ch. L. Spiel
+%
+% 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.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+
+\tracingonline=0
+
+%--\OnlyDescription
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+
+
+\PassOptionsToClass{a4paper}{article}
+\PassOptionsToPackage{hyperfootnotes=false}{hyperref}
+\PassOptionsToPackage{charter, scale=1.06}{newtxmath}
+\PassOptionsToPackage{dvipsnames}{xcolor}
+
+\usepackage{amsmath}
+\usepackage{booktabs}
+\usepackage{caption}
+\usepackage{dtk-logos}
+\usepackage{enumitem}
+\usepackage{etoolbox}%--\tracingpatches
+\usepackage{fancyhdr}
+\usepackage[T1]{fontenc}
+\usepackage{fullwidth}
+\usepackage{hypdoc}
+\usepackage{hyphenat}
+\usepackage{mathtools}
+\iftrue
+ \usepackage[letterspace=0, shrink=10, stretch=10, tracking=true]{microtype}
+ \DeclareMicrotypeSet[tracking]{italics}
+ {encoding=*, font={SourceSerifPro-LF/m/it/*}}
+ \UseMicrotypeSet[tracking]{italics}
+ \SetTracking[context=synthnegslant, no ligatures={f}, spacing={10*,,}]
+ {encoding=*, shape=it}{10}
+\else
+ \newcommand*{\textls}[2][]{#2}
+\fi
+\usepackage{needspace}
+\usepackage{ragged2e}
+\usepackage{setspace}
+\usepackage[slant=.18, negslant=-.16]{synthslant}
+\usepackage{titlesec}
+\usepackage{tcolorbox}
+\usepackage{titlesec}\renewcommand*{\bottomtitlespace}{.15\textheight}%nobottomtitles*
+\usepackage{wrapfig}
+\usepackage{xcolor}
+
+
+\usepackage[default, lining, proportional, regular, semibold]{sourceserifpro}
+\usepackage[lining, proportional, regular, semibold]{sourcesanspro}
+\usepackage[lining, regular]{sourcecodepro}
+\usepackage[xcharter]{newtxmath}
+\setstretch{1.04166}% \baselineskip: 12.5pt
+
+
+\makeatletter
+\def\@get@fontclan#1-#2\relax{#1}
+\newcommand*{\fontclan}{\expandafter\@get@fontclan\f@family\relax}
+\makeatother
+
+\newcommand*{\proportionalliningfigures}{\fontfamily{\fontclan-LF}\selectfont}
+\newcommand*{\proportionaloldstylefigures}{\fontfamily{\fontclan-OsF}\selectfont}
+\newcommand*{\tabularliningfigures}{\fontfamily{\fontclan-TLF}\selectfont}
+\newcommand*{\tabularoldstylefigures}{\fontfamily{\fontclan-TOsF}\selectfont}
+
+\newcommand*{\textdenominator}[1]{{\fontfamily{\fontclan-Dnom}\selectfont #1}}
+\newcommand*{\textinferior}[1]{{\fontfamily{\fontclan-Inf}\selectfont #1}}
+\newcommand*{\textnumerator}[1]{{\fontfamily{\fontclan-Numr}\selectfont #1}}
+\newcommand*{\textsuperior}[1]{{\fontfamily{\fontclan-Sup}\selectfont #1}}
+
+\newcommand*{\nativetextfraction}[2]
+ {\mbox{\textnumerator{#1}\textfractionsolidus\textdenominator{#2}}}
+
+\makeatletter
+\renewcommand*{\@makefnmark}{\hbox{\sf\textsuperior{\@thefnmark}}}
+\newenvironment*{tabfigures}
+ {\edef\rmdefault{\fontclan-T\sourceserifpro@figurestyle}\rm\ignorespaces}
+ {\ignorespacesafterend}
+
+\newcommand*{\elseries}{\def\mdseries@rm{el}\def\mdseries@sf{el}\def\mdseries@tt{el}}
+\newcommand*{\textel}[1]{{\elseries\textmd{#1}}}
+\newcommand*{\lseries}{\def\mdseries@rm{l}\def\mdseries@sf{l}\def\mdseries@tt{l}}
+\newcommand*{\textl}[1]{{\lseries\textmd{#1}}}
+%%--\newcommand*{\mdseries}{\def\mdseries@rm{m}\def\mdseries@sf{m}\def\mdseries@tt{m}}
+%%--\newcommand*{\textmd}[1]{{\mdseries\textmd{#1}}}
+\newcommand*{\sbseries}{\def\bfseries@rm{sb}\def\bfseries@sf{sb}\def\bfseries@tt{sb}}
+\newcommand*{\textsb}[1]{{\sbseries\textbf{#1}}}
+\newcommand*{\bseries}{\def\bfseries@rm{b}\def\bfseries@sf{b}\def\bfseries@tt{b}}
+\newcommand*{\textb}[1]{{\bseries\textbf{#1}}}
+\newcommand*{\ebseries}{\def\bfseries@rm{k}\def\bfseries@sf{eb}\def\bfseries@tt{k}}
+\newcommand*{\texteb}[1]{{\ebseries\textbf{#1}}}
+\makeatother
+
+
+\usepackage{cleveref}
+
+
+\expandafter\GetFileInfo\expandafter{\jobname.sty}
+\def\aspdfdate#1/#2/#3\relax{D:#1#2#3}
+\edef\pdffiledate{\expandafter\aspdfdate\filedate\relax}
+
+\hypersetup{
+ citecolor = blue,
+ colorlinks = true,
+ linkcolor = blue,
+ linktocpage = false,
+ pdfauthor={Dr. Christoph L. Spiel},
+ pdfcreationdate={\pdffiledate},
+ pdfkeywords={LaTeX, font, italic, oblique, slant, upright},
+ pdflang=en-US,
+ pdfsubject={Synthetic generation of slanted glyphs in LaTeX},
+ pdftitle={Package synthslant \fileversion},
+ raiselinks = false,
+ urlcolor = [rgb]{0, 0, .5}% = navy
+}
+
+
+\makeatletter
+\renewcommand*{\@dotsep}{10000} % suppress leaders
+\patchcmd{\@dottedtocline}{\normalfont}{\bfseries}{\relax}{\PatchingFailed}
+\makeatother
+
+
+\Crefname{equation}{Equation}{Equations}
+\crefname{equation}{Equ.}{Equs.}
+\creflabelformat{equation}{#2#1#3}
+
+\Crefname{figure}{Figure}{Figures}
+\crefname{figure}{Fig.}{Figs.}
+
+\Crefname{page}{Page}{Pages}
+\crefname{page}{p.}{p.}
+
+\Crefname{section}{Section}{Sections}
+\crefname{section}{Sec.}{Secs.}
+
+\Crefname{table}{Table}{Tables}
+\crefname{table}{Tab.}{Tabs.}
+
+
+\newcommand*{\floatcaptionwidth}{.79\textwidth}
+
+\captionsetup[figure]{font=small, justification=centerlast, labelfont=sc, width=\floatcaptionwidth}
+\captionsetup[table]{font=small, justification=centerlast, labelfont=sc, width=\floatcaptionwidth}
+
+
+\newsavebox{\listlabelbox}
+
+\sbox{\listlabelbox}{---}
+\SetEnumitemKey{noindent}{
+ label={---},
+ labelwidth=\wd\listlabelbox,
+ leftmargin=!
+}
+
+\SetEnumitemKey{nestedinspecialsection}{
+ leftmargin=10pt
+}
+
+\SetEnumitemKey{notopsep}{
+ after=\vskip.8em plus .2em minus .4em,
+ partopsep=0pt,
+ topsep=0pt
+}
+
+
+\newlength{\marginindicatorsep}
+\setlength{\marginindicatorsep}{10pt}
+
+\newcommand*{\marginalizesectionnumber}[1]
+ {\makebox[0pt][r]{#1\hspace{\marginindicatorsep}}}
+
+
+\fancypagestyle{pagenumberonly}{
+ \fancyhead[L]{}
+ \fancyhead[R]{\thepage}
+}
+\pagestyle{fancy}
+\fancyhf{}
+\fancyhead[L]{\rightmark}
+\fancyhead[R]{\textsf{\thepage}}
+\newcommand*{\resetfancyhead}
+ {\fancyhead[L]{\textsf{\textsc{\textls[20]{\nouppercase\rightmark}}}}}
+
+\renewcommand*{\headrulewidth}{0pt}
+\renewcommand*{\sectionmark}[1]
+ {\def\truesectionname{#1}%
+ \markright{\textsf{\marginalizesectionnumber{\thesection}%
+ \textsc{\textls[20]{#1}}}}}
+\renewcommand*{\subsectionmark}[1]
+ {\markright{\textsf{\marginalizesectionnumber{\thesubsection}%
+ \textsc{\textls[20]{\truesectionname:\enspace}}#1}}}
+
+
+\titleformat{\section}[hang]
+ {\sffamily\Large\bfseries}{\marginalizesectionnumber{\thesection}}{0pt}{}
+\titleformat{\subsection}[hang]
+ {\sffamily\large\bfseries}{\marginalizesectionnumber{\thesubsection}}{0pt}{}
+\titleformat{\subsubsection}[hang]
+ {\sffamily\normalsize\bfseries}{\marginalizesectionnumber{\thesubsubsection}}{0pt}{}
+\titleformat{\paragraph}[runin]
+ {\sffamily\normalsize\bfseries}{\theparagraph}{1em}{}
+
+
+\let\footnoterule=\relax% suppress footnote rule
+\interfootnotelinepenalty=10000
+
+\makeatletter
+\renewcommand*{\@makefntext}[1]
+ {\noindent
+ \llap{\let\@textsuperscript=\relax% use "normal" figures for the footnote numbers
+ \let\textsuperior=\relax
+ \@makefnmark
+ \hspace{\marginindicatorsep}}% separate the footnote number and the body
+ #1}
+\makeatother
+
+
+\pretocmd{\DescribeEnv}{\needspace{25pt}}{\relax}{\PrependingFailed}
+\pretocmd{\DescribeMacro}{\needspace{25pt}}{\relax}{\PrependingFailed}
+
+
+\setcounter{IndexColumns}{2}
+
+
+\setlength{\columnsep}{20pt}
+\setlength{\skip\footins}{25pt}
+\setlength{\overfullrule}{3pt}
+
+
+
+\newrobustcmd*{\acronym}[1]{\mbox{\scshape\MakeLowercase{#1}}}
+
+\newcommand*{\application}[1]{\mbox{\sffamily #1}}
+
+\renewcommand*{\arraystretch}{1.12}
+
+\newcommand*{\bibauthor}[1]{\mbox{\textsc{#1}}}
+\newcommand*{\bibtitle}[1]{\textit{#1}}
+\newcommand*{\biburl}[1]{\url{#1}}
+
+\newcommand*{\bottomstrut}{\rule[-.5em]{0pt}{0pt}}
+
+\newenvironment*{codeexample}
+ {\vspace{.5\smallskipamount}
+ \par
+ \centering
+ \begin{minipage}{\linewidth}
+ \ttfamily
+ \begin{tabbing}}
+ {\end{tabbing}
+ \end{minipage}
+ \par
+ \vspace{.5\smallskipamount}}
+
+\makeatletter
+\newcommand*{\citenum}[1]{\@nameuse{b@#1}}
+\makeatother
+
+\def\code#1{\texttt{#1}}
+
+\newrobustcmd*{\command}[1]{\mbox{\textbf{#1}}}
+
+\newcommand*{\degree}{{}^\circ}
+
+\newcommand*{\doublequotes}[1]{\guillemetright\kern-.03333em #1\guillemetleft}
+
+\newcommand*{\dumpmacro}[1]{\texttt{\detokenize\expandafter{#1}}}
+
+\newcommand*{\filesystem}[1]{\mbox{\textit{#1\/}}}
+
+\newcommand*{\filledrectangle}[2]{\rule{#1}{#2}}
+\newcommand*{\filledsquare}[1]{\filledrectangle{#1}{#1}}
+
+\newcommand*{\foreignphrase}[1]{\textsl{#1}}
+
+\makeatletter
+\renewcommand*{\fps@figure}{htbp}
+\renewcommand*{\fps@table}{htbp}
+\makeatother
+
+\newcommand*{\hollowrectangle}[2]
+ {\setlength{\fboxrule}{.5pt}%
+ \setlength{\fboxsep}{0pt}%
+ \framebox{\rule{#1}{0pt}\rule{0pt}{#2}}}
+\newcommand*{\hollowsquare}[1]{\hollowrectangle{#1}{#1}}
+
+\newcommand*{\logmacro}[1]
+ {\ifdef{#1}
+ {\message{^^JDump of macro \string#1 follows.^^J}
+ \message{\detokenize\expandafter{#1}}
+ \message{^^JEnd macro dump.^^J}}
+ {\message{^^JMacro \string#1 is not defined.^^J}}}
+
+\newenvironment*{maxipage}
+ {\fullwidthsetup{leftmargin=-\marginparsep - \marginparwidth,
+ width=\textwidth + \marginparsep + \marginparwidth}%
+ \begin{fullwidth}}
+ {\end{fullwidth}}
+
+\newenvironment*{multilinecodeexample}
+ {\begin{quote}\tt
+ \def\indent{\mbox{}\hspace{25pt}}%
+ \def\pushright{\mbox{}\hfill}%
+ \ignorespaces}
+ {\end{quote}}
+
+\newcommand*{\needtocspace}[1][3]
+ {\addtocontents{toc}{\protect\needspace{#1\baselineskip}}}
+
+\newcommand*{\numberset}[1]{\mathbb{#1}}
+
+\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}}
+\newcommand*{\programname}[1]{\mbox{\textbf{#1}}}
+\newcommand*{\propername}[1]{\mbox{\textsc{#1}}}
+
+\newcommand*{\pstrickslogo}{\mbox{PSTricks}}
+
+\newcommand*{\quarterspace}{\hspace{.25em}}
+
+\newcommand*{\sample}[1]
+ {\setbox0=\hbox{#1}% H: 6.19849pt, /: 7.49817
+ \mbox{\raisebox{\dimexpr -.15em - \dp0}{\tiny$\llcorner$}%
+ \kern-.15em\copy0\kern-.15em
+ \raisebox{\ifdim\ht0>.7em\dimexpr\ht0 - .1em\else .45em\fi}{\tiny$\urcorner$}}}
+
+\newcommand*{\sinceversion}[1]{% modeled after \NewIn of "doc.dtx"
+ \leavevmode
+ \marginpar{\hfill\textcolor{\markercolor}{\sf\proportionaloldstylefigures\scshape #1}}%
+ \ignorespaces
+}
+
+\newcommand*{\singlequotes}[1]{\mbox{\guilsinglright #1\guilsinglleft}}
+
+\definecolor{customred1}{rgb}{.890, .282, .282}%-- https://paletton.com/
+\definecolor{customred2}{rgb}{.831, .110, .110}
+\definecolor{customred3}{rgb}{.686, .043, .043}
+\definecolor{customred4}{rgb}{.569, .000, .000}
+\definecolor{customred5}{rgb}{.420, .000, .000}
+\newcommand*{\specialsectionheading}[1]{\textcolor{\markercolor}{\textit{\textbf{#1}}}}
+\newcommand*{\markercolor}{customred4}
+\newcommand*{\specialsectionmarker}{\color{\markercolor}\filledsquare{5pt}}
+\newcommand*{\specialsectionbegin}
+ {\llap{\raisebox{1pt}{\specialsectionmarker}%
+ \hspace{\marginindicatorsep}}}
+\newcommand*{\specialsectionend}
+ {\ifmmode
+ \specialsectionmarker
+ \else
+ \leavevmode
+ \unskip
+ \penalty9999\mbox{}\nobreak
+ \hfill
+ \quad
+ \mbox{\specialsectionmarker}%
+ \fi}
+\newtoggle{printspecialsectionmarker}
+\NewDocumentEnvironment{specialsection}{m m}
+ {\Needspace{4\baselineskip}%
+ \toggletrue{printspecialsectionmarker}%
+ \begin{list}
+ {\specialsectionheading{#1\ifblank{#2}{}{\textup{\space---\space#2}}}}
+ {\itemindent=0pt
+ \labelwidth=10pt
+ \leftmargin=15pt
+ \listparindent=15pt
+ \parsep=0pt
+ \topsep=\medskipamount}
+ \newcommand*{\specialsectionendhere}
+ {\specialsectionend
+ \global\togglefalse{printspecialsectionmarker}}
+ \item
+ \nointerlineskip
+ \leavevmode\par
+ \noindent}
+ {\iftoggle{printspecialsectionmarker}{\specialsectionend}{\relax}%
+ \end{list}}
+
+ \newenvironment*{caution}[1][]{\begin{specialsection}{Caution}{#1}}{\end{specialsection}}
+ \newenvironment*{example}[1][]{\begin{specialsection}{Example}{#1}}{\end{specialsection}}
+ \newenvironment*{futuredirection}[1][]
+ {\begin{specialsection}{Anticipated Changes \& Possible Extensions}{#1}\small}
+ {\end{specialsection}}
+ \newenvironment*{important}[1][]{\begin{specialsection}{Important}{#1}}{\end{specialsection}}
+ \newenvironment*{note}[1][]{\begin{specialsection}{Note}{#1}}{\end{specialsection}}
+ \newenvironment*{notes}[1][]{\begin{specialsection}{Notes}{#1}}{\end{specialsection}}
+ \newenvironment*{tip}[1][]{\begin{specialsection}{Tip}{#1}}{\end{specialsection}}
+ \newenvironment*{tips}[1][]{\begin{specialsection}{Tips}{#1}}{\end{specialsection}}
+ \newenvironment*{usecase}[1][]{\begin{specialsection}{Use Case}{#1}\small}{\end{specialsection}}
+ \newenvironment*{usecases}[1][]{\begin{specialsection}{Use Cases}{#1}\small}{\end{specialsection}}
+
+\newcommand*{\specialcodesectionheading}[1]{\textcolor{\markercolor}{\textbf{\textit{#1}}}}
+\newenvironment*{specialcodesection}[1]
+ {\Needspace{4\baselineskip}%
+ \begin{tcolorbox}[colback=white, colframe=\markercolor,
+ bottomrule=0pt, leftrule=5pt, rightrule=0pt, toprule=0pt]
+ \sffamily
+ \begin{list}
+ {\specialcodesectionheading{#1}}
+ {\itemindent=0pt
+ \labelwidth=20pt
+ \leftmargin=25pt
+ \listparindent=15pt
+ \parsep=0pt
+ \topsep=\medskipamount}
+ \item
+ \nointerlineskip
+ \leavevmode\par
+ \noindent}
+ {\end{list}
+ \end{tcolorbox}}
+ \newenvironment*{anticipatedchange}
+ {\begin{specialcodesection}{Anticipated Change}}
+ {\end{specialcodesection}}
+ \newenvironment*{implementationnote}
+ {\begin{specialcodesection}{Implementation Note}}
+ {\end{specialcodesection}}
+ \newenvironment*{knownbug}
+ {\begin{specialcodesection}{Known Bug}}
+ {\end{specialcodesection}}
+
+\newenvironment*{suspendshortverb}
+ {\DeleteShortVerb{\|}}
+ {\MakeShortVerb{\|}}
+
+\definecolor{cold-silver}{cmyk}{.08, 0, 0, .18}
+\newenvironment*{synopsis}
+ {\begin{tcolorbox}[boxrule=.25pt, colback=cold-silver]%
+ \phantomsection}
+ {\end{tcolorbox}}
+
+\newcommand*{\synthslantlogo}
+ {{\sf
+ S\hspace{-.06em}\synthslantbox{.15}{y}\hspace{.04em}nth%
+ \hspace{-.02em}%
+ Slant}}
+
+\newenvironment*{tablenotes}
+ {\medskip
+ \centering
+ \begin{minipage}{\floatcaptionwidth}}
+ {\end{minipage}}
+\newcommand*{\tablenotemark}[1]{\smash{\textsuperscript{#1}}}
+
+\newcommand*{\termparbox}[1]{\parbox[t]{\linewidth}{#1\bottomstrut}}
+
+\newcommand*{\thousandsseparator}{\mbox{,}}
+
+\newcommand*{\tikzlogo}{\textrm{Ti\textit{k\/}Z}}
+
+\newcommand*{\topstrut}{\rule{0pt}{1.3em}}
+
+\newcommand*{\transpose}[1]{{#1}^{\text{T}}}
+
+\newlength{\ttellipsisgap}
+\setlength{\ttellipsisgap}{.4em}
+\newcommand*{\ttdots}
+ {\setbox0=\hbox{.}%
+ \wd0=0pt%
+ \copy0\kern\ttellipsisgap
+ \copy0\kern\ttellipsisgap
+ \box0\kern\ttellipsisgap}
+
+\newcommand*{\visualpar}{\textcolor{\markercolor}{\P}\linebreak[1]\enspace}
+
+\newenvironment*{widecodeexample}
+ {\begin{maxipage}
+ \flushright
+ \begin{minipage}{\textwidth}
+ \ttfamily
+ \begin{tabbing}}
+ {\end{tabbing}
+ \end{minipage}
+ \end{maxipage}}
+
+
+\hyphenation{% https://hyphenateit.com/en-us
+}
+
+
+\newcommand*{\librecaslonmapline}
+ {LibreCsln-Italic-osf-t1--base LibreCsln-Italic
+ " -0.12 SlantFont AutoEnc_etzx2kxblronahmbt4swbkr7jb ReEncodeFont "
+ <[lcsln_etzx2k.enc <LibreCsln-Italic.pfb}
+\ifdefined\pdfoutput
+ \ifnum\pdfoutput>0
+ \pdfmapline{=\librecaslonmapline}
+ \else
+ \special{pdf:mapline \librecaslonmapline}
+ \fi
+\else
+ \special{pdf:mapline \librecaslonmapline}
+\fi
+
+
+\begin{document}
+ \DocInput{synthslant.dtx}
+\end{document}
+%</driver>
+%<*index-style>
+actual '='
+heading_prefix "\\pagebreak[3]\\smallskip\n\n{\\sffamily\\bfseries\\large "
+heading_suffix "}\\nopagebreak\n"
+headings_flag 1
+level '>'
+quote '!'
+%</index-style>
+% \fi
+%
+%
+% \DoNotIndex{\-}
+% \DoNotIndex{\begingroup,\bool,\box}
+% \DoNotIndex{\DeclareOptionX,\def,\dim,\dimen,\discretionary,\draw}
+% \DoNotIndex{\edef,\else}
+% \DoNotIndex{\endgroup,\endmicrotypecontext,\endnegslantenvironment,\endslantenvironment}
+% \DoNotIndex{\expandafter,\ExplSyntaxOff,\ExplSyntaxOn}
+% \DoNotIndex{\fi,\font,\fontdimen,\fontspec,\fp}
+% \DoNotIndex{\hbox,\hskip}
+% \DoNotIndex{\ifcase,\ifcsdef,\ifdefined,\ifluatex,\ifmmode,\ifnum,\ifpdftex,\ifx,\itshape}
+% \DoNotIndex{\kern}
+% \DoNotIndex{\l,\let,\llap}
+% \DoNotIndex{\mbox,\microtypecontext}
+% \DoNotIndex{\NeedsTeXFormat}
+% \DoNotIndex{\newbox,\newcommand,\NewDocumentCommand,\NewDocumentEnvironment,\newenvironment,\newrobustcmd}
+% \DoNotIndex{\node,\nolinebreak}
+% \DoNotIndex{\or}
+% \DoNotIndex{\PackageInfo,\PackageWarning,\ProcessOptionsX,\providecommand,\ProvidesPackage}
+% \DoNotIndex{\pdfoutput,\pdfrestore,\pdfsave,\pdfsetmatrix,\pstilt}
+% \DoNotIndex{\relax,\RequirePackage}
+% \DoNotIndex{\sbox,\skip,\space}
+% \DoNotIndex{\tikz}
+% \DoNotIndex{\upshape,\usebox}
+% \DoNotIndex{\wd}
+%
+%
+% \changes{v0.1}{2024-2-12}{Initial version}
+%
+%
+% \pagenumbering{roman}
+%
+% \title{\synthslantlogo{} -- Synthetically Slanted Glyphs}
+% \author{Ch.~L.~Spiel\footnote{\quarterspace\texttt{cspiel@users.sourceforge.org}}}
+% \date{\fileversion\qquad \filedate}
+% \maketitle
+% \thispagestyle{empty}
+%
+%
+% \begingroup
+% \let\small=\normalsize
+% \begin{abstract}
+% \noindent
+% Package~\packagename{synthslant} provides macros to slant arbitrary glyphs in both
+% directions. It can be used to fake a real slanted font for \emph{short} pieces of text
+% and it can generate startling effects, like, for example, upright italics.
+% \end{abstract}
+% \endgroup
+%
+%
+% \iffalse
+%<*title>
+prologues := 3;
+
+string roman_font;
+roman_font := "pplr8r"; % URW Palladio L - Roman
+
+string italics_font;
+italics_font := "pplri8r"; % URW Palladio L - Italic
+
+string sample_text;
+sample_text := "fga";
+
+u := 70;
+
+font_scale := 7;
+
+color light_gray;
+light_gray := .8 white;
+
+color original_color, slanted_color;
+original_color := light_gray;
+slanted_color := black;
+
+pair loc[];
+loc[1] := (0, 0); % roman
+loc[2] := (1.9u, 0); % italics
+loc[3] := (2.03u, 1.1u); % slanted roman
+loc[4] := (-.1u, -1.1u); % upright italics
+
+picture roman;
+roman := thelabel.rt(sample_text infont roman_font scaled font_scale, loc[1]);
+
+picture italics;
+italics := thelabel.rt(sample_text infont italics_font scaled font_scale, loc[2]);
+
+picture slanted_roman;
+slanted_roman := thelabel.rt(sample_text infont roman_font scaled font_scale slanted .2, loc[3]);
+
+picture upright_italics;
+upright_italics := thelabel.rt(sample_text infont italics_font scaled font_scale slanted -.2, loc[4]);
+
+
+beginfig(1);
+ draw roman withcolor original_color;
+ draw italics withcolor original_color;
+ draw slanted_roman withcolor slanted_color;
+ draw upright_italics withcolor slanted_color;
+endfig;
+end
+%</title>
+% \fi
+%
+%
+% \begin{center}
+% \includegraphics{title.mps}
+% \end{center}
+%
+% \vfill
+%
+% \begingroup
+% \footnotesize
+% \noindent
+% This package is copyright \textcopyright~2024 Ch.~L.~Spiel. It may be distributed and/or
+% modified under the conditions of the \LaTeX{} Project Public License \acronym{(LPPL)},
+% either version~1.3c of this license or --~at your option~-- any later version. This work
+% has the \acronym{LPPL} maintenance status \doublequotes{author-maintained}.\par
+% \endgroup
+%
+%
+% \clearpage
+% \thispagestyle{pagenumberonly}
+% \tableofcontents
+%
+% \vspace{\fill}
+%
+% \begingroup
+% \footnotesize
+% \singlespacing
+% \noindent
+% The font samples~\singlequotes{fga} on the title page
+% were generated with the help of \MP{} using \doublequotes{\acronym{URW} Palladio~L}
+% in styles~\singlequotes{roman} and~\singlequotes{italic}.
+% The affine transformations were \code{slanted .2} for the slanted roman and
+% \code{slanted -.2} for the upright italics.\par
+% \endgroup
+%
+%
+% \clearpage
+% \thispagestyle{pagenumberonly}
+% \listoftables
+% \bigskip
+% \listoffigures
+%
+%
+% \clearpage
+% \pagenumbering{arabic}
+% \section{Introduction}\label{sec:introduction}
+%
+% The \packagename{synthslant} package provides a translator (e.\,g.~\LaTeX, \pdfLaTeX, or
+% \LuaLaTeX) independent interface to shearing glyphs. It implements a generic operation where
+% a short piece of text gets slanted forward or backward. Moreover, specialized macros for the
+% two most important use cases are provided, namely slanting an upright font forward and making
+% an italics font upright. Unbeknown to some users, \pdfTeX{} performs a similar operation
+% under the hood: of the 40\thousandsseparator210~map lines in my \filesystem{pdftex.map}
+% currently 1\thousandsseparator236 instruct \pdfTeX{} to artificially slant a font. This
+% means some three percent of the shapes are generated this way.
+%
+% Similar transformations can be achieved by other means. I elaborate on one of the
+% alternatives in \cref{sec:alternative} on \cpageref{sec:alternative}.
+% Package~\packagename{synthslant} however focuses on ease of use and strict locality of the
+% glyph manipulation.
+%
+%
+% \subsection{Appeal for Artificially Slanted Type}\label{sec:appleal-for-artificially-slanted}
+%
+% Artificially slanted type have a bad reputation. Whenever there is an order to round up the
+% usual font suspects synthetically slanted, bolded\footnote{Package~\packagename{amsbsy}
+% defines a \doublequotes{Poor Man's Bold} macro~\cs{pmb} that works by
+% \singlequotes{overprinting}. The authors of \packagename{amsbsy} recommend to prefer
+% package~\packagename{bm} for bold mathematical symbols, though.}, and condensed type along
+% with artificial small-caps swiftly are stuffed into the black Maria.\footnote{See for example
+% Ref.~\citenum{strizver:2014}, p.~97, but compare p.~142 and also
+% Ref.~\citenum{middendorp:2014}, p.~68n, for a more nuanced assessment.} I can retrace this
+% condescension for synthetic bold and condensed variants. They spoil the glyphs' outline
+% because they do not (and cannot) conserve the necessary proportions. For small-caps the
+% problems are somewhat minor and I wonder how far one could get with an
+% \propername{OpenType}~font that supports a \code{size}~axis\index{font>axis>size=\code{size}}
+% as well as an \code{opsz}~axis\index{font>axis>opsz=\code{opsz}} in the necessary ranges to
+% construct convincing small-caps out of the multiple-master font.
+%
+% In my view artificial slanting keeps much of the font's character intact. In fact one
+% accusation of synthetically slanted type is that is creates less contrast than a proper
+% italic~\cite[p.~141]{strizver:2014} to which I object that less contrast can in fact be
+% enough contrast in a particular setting. Moreover, small contrast with respect to the main
+% type is a problem of second order. It does not devalue the shape \foreignphrase{per se} as
+% is true for artificial bold and condensed fonts.
+%
+% What seems to have gotten lost in the discussion is the shapes of true italics that were
+% designed alongside with the roman type. If we have an unbiased look at it --~for example at
+% the title~page of this manual~-- the italic versions of the upright characters are so
+% markedly different that I would like to ask whether they match the upright shape in a strict
+% sense. For the double-storey~\sample{a} becomes single-storey, the start of the loop
+% of~\sample{g} moves from the far left into the middle. Alongside, the aspect ratio of both
+% of the counters change. These defy the common guidelines~\cite[Ch.~6]{stamm:2020} of font
+% pairing. We can make sense of the seeming contradiction by recognizing that the italics
+% shape is not simply slanted, but creates tension in respect to the upright type by a variety
+% of additional design features. A famous quote of \propername{Zuzana Li\v{c}ko} applies once
+% again:
+%
+% \begin{quote}
+% The most popular typefaces are the easiest to read; their popularity has made them
+% disappear from conscious cognition. It becomes impossible to tell if they are easy to read
+% because they are commonly used, or if they are commonly used because they are easy to read.
+% \end{quote}
+%
+%
+% \subsection{Some History}\label{sec:history}
+%
+% Italics accompanying a roman font date back to one of the earliest print shops, namely that
+% of \href{https://it.wikipedia.org/wiki/Aldo_Manuzio}{\propername{Aldus Manutius}} around
+% 1500\:A.\,C\@. Artificially slanted, also known as \singlequotes{oblique}, versions of
+% upright fonts appear in the twentieth century, when type designers and foundries start to
+% save time and money by automatically constructing a slanted version of a given roman
+% type~\cite[p.~68n]{middendorp:2014}. \packagename{Synthslant} closely follows on their
+% steps.
+%
+% Some fonts in current \LaTeX{} distributions offer slanted series right out of the box.
+% \foreignphrase{Eureka!} In particular the oldest (and once upon a time the only) font family
+% shipping with \TeX, \href{https://tug.org/FontCatalogue/cmrfonts.html}{Computer Modern
+% Roman}\index{font>Computer Modern Roman} --~nowadays member of the \acronym{CM}-Super
+% family~-- is available in a deluge of almost thirty shapes. It covers not just slanted roman
+% or slanted smallcaps but also slanted typewriter and somewhat surprisingly upright italics.
+% Furthermore, the \LaTeXe{} font selection scheme provisions \singlequotes{\code{sl}} for
+% slanted shapes and \singlequotes{\code{ui}} for upright italics~\cite{fntguide}. The former
+% is accompanied by the macros~\cs{slshape} and~\cs{textsl}.
+%
+% \begin{wraptable}{r}{.382\textwidth}
+% \renewcommand*{\floatcaptionwidth}{\textwidth}
+% \small
+% \centering
+% \caption[Variable fonts with slant-axis]
+% {A short list of some variable fonts with a slant axis (\code{slnt}).}
+% \label{tab:open-type-slant-feature}
+%
+% \begin{tabular}{@{}l@{}}
+% \toprule
+% Font Name \\
+% \midrule
+% Cairo\index{font>Cairo} \\
+% Commissioner\index{font>Commissioner} \\
+% Geologica\index{font>Geologica} \\
+% Gluten\index{font>Gluten} \\
+% Inter\index{font>Inter} \\
+% Recursive\index{font>Recursive} \\
+% Roboto Flex\index{font>Roboto Flex} \\
+% \bottomrule
+% \end{tabular}
+% \end{wraptable}
+%
+% Refer to \cref{tab:open-type-slant-feature} on the right for a brief list of variable
+% fonts\footnote{See also the \LaTeX~Font Catalogue for
+% \href{https://tug.org/FontCatalogue/opentypefonts.html}%
+% {Fonts with \propername{OpenType} or \propername{TrueType}~Support}
+% and search \href{https://fonts.google.com/}{Google Fonts} for families of
+% \href{https://fonts.google.com/variablefonts?vfaxis=slnt}{variable fonts with a
+% \code{slnt}-axis} or fonts with an \href{https://v-fonts.com/tags/C5}{unusual variation} at
+% \href{https://v-fonts.com/}{Variable Fonts}.} that offer a slant-axis\footnote{The
+% registered axis is called \code{slnt} and it is not to be confused with the
+% \code{ital}~axis.}\index{font>axis>slant=\code{slant}}\index{font>axis>ital=\code{ital}} that
+% can be controlled with \packagename{fontspec}'s\index{package>\packagename{fontspec}}
+% \code{Slant}\footnote{Since \packagename{fontspec} version~2.9a as of 2024/2/13.}~key and
+% \cref{tab:slanted-series-fonts} for a rather incomplete list of fonts that are shipped with
+% slanted shapes. For these fonts \packagename{synthslant} is largely superfluous unless
+% e.\,g.~they also come with an italics shape that is to be typeset upright.
+%
+% \begin{table}
+% \small
+% \centering
+% \caption[Fonts with slanted series]
+% {Selected fonts that come with their own slanted series.~\visualpar{} The table on
+% the left-hand side shows serif fonts, the one on the right-hand side sans-serif
+% fonts.}
+% \label{tab:slanted-series-fonts}
+%
+% \newcommand*{\itshapemark}{\tablenotemark{\dag}}%
+%
+% \begin{tabular}[t]{@{}p{12em}@{}}
+% \toprule
+% Font Name \\
+% \midrule
+% Arvo\index{font>Arvo} \\
+% Computer Modern Roman\index{font>Computer Modern Roman} \\
+% Domitian\index{font>Domitian} \\
+% Droid Serif\index{font>Droid Serif} \\
+% Erewhon\index{font>Erewhon} \\
+% Extended Charter\index{font>Extended Charter} \\
+% \acronym{GFS} Artemisia\index{font>GFS Artemisia=\acronym{GFS} Artemisia} \\
+% \acronym{GFS} Bodoni\index{font>GFS Bodoni=\acronym{GFS} Bodoni} \\
+% \acronym{GFS} Didot\index{font>GFSDidot=\acronym{GFS} Didot} \\
+% \\
+% \bottomrule
+% \end{tabular}
+% \qquad
+% \begin{tabular}[t]{@{}p{12em}@{}}
+% \toprule
+% Font Name \\
+% \midrule
+% Cabin\index{font>Cabin} \\
+% Clear Sans\index{font>Clear Sans} \\
+% Cuprum\index{font>Cuprum} \\
+% Fira Sans\index{font>Fira Sans} \\
+% Gandhi Sans\index{font>Gandhi Sans} \\
+% \acronym{Inria} Sans\index{font>Inria Sans=\acronym{Inria} Sans} \\
+% Lato\index{font>Lato}\itshapemark \\
+% Montserrat\index{font>Montserrat} \\
+% \acronym{PT} Sans\index{font>PT Sans=\acronym{PT} Sans} \\
+% Source Sans Pro\index{font>Source Sans Pro} \\
+% \bottomrule
+% \end{tabular}
+%
+% \begin{tablenotes}
+% \itshapemark\enspace The shape is activated with \cs{itshape}.
+% \end{tablenotes}
+% \end{table}
+%
+% It seems that the original idea of automatically shearing text in \LaTeX{} to simulate a
+% slanted shape goes back to \propername{David Carlisle} who suggested to use the
+% \pdfTeX-primitive \cs{pdfliteral} for shearing~\cite{tex-stackexchange-2013-12-7}. Shortly
+% thereafter \propername{Bruno Le Floch} pointed to another \pdfTeX-primitive, namely
+% \cs{pdfsetmatrix}, available with (in 2013) more recent
+% \pdfTeX~versions~\cite{pdftex}.\footnote{The user-level manipulation of the transformation
+% matrix has been part of the \acronym{PDF}-standard since its initial publication in
+% 1993~\cite[Secs.~3.8 and~3.9]{adobe-pdf-1.0} in the form of operator~\code{cm}
+% (\singlequotes{concat}~-- concatenate matrix to current transformation matrix).~\visualpar{}
+% The primitive~\cs{pdfliteral} was implemented already in the first release of \pdfTeX{}
+% in~1998~\cite{baskerville-pdftex-8-1:1998} and the primitive~\cs{pdfsetmatrix} joined 2007 in
+% \pdfTeX~version~1.40.0~\cite{schroeder:2007}.} With the help of the latter affine
+% transformations of arbitrary content can be coded directly by setting the transformation
+% matrix. A slight variant of his code is used in this package for the \acronym{PDF}- and
+% \packagename{l3draw}\index{package>\packagename{l3draw}}-slant~engines. The implementations
+% for \pstrickslogo, \tikzlogo{}, and \packagename{fontspec}\packagename{fontspec} are trivial
+% as they build upon shear~functions supplied by the respective packages.
+%
+%
+% \subsection{Shear Transformation, Slant, and Angle}\label{sec:shear-transformation}
+%
+% \index{slant>operation}
+% \index{shear>transformation}
+% Mathematically the slant operation is a shear transformation, which can be expressed with the
+% equation
+% \begin{equation}\label{equ:shear-transformation}
+% \begin{pmatrix}
+% x' \\
+% y'
+% \end{pmatrix}
+% =
+% \begin{pmatrix}
+% 1 & \sin\alpha \\
+% 0 & 1
+% \end{pmatrix}
+% \mathbin{}
+% \begin{pmatrix}
+% x \\
+% y
+% \end{pmatrix},
+% \end{equation}
+%
+% \noindent
+% where the vector~\(\transpose{(x, y)}\) is mapped to \(\transpose{(x'\!, y')}\) and both are
+% elements of the two-dimensional drawing plane~\(\numberset{E}^2\)\!. Compare with
+% \Cref{fig:shear-transform}.
+%
+%
+% \iffalse
+%<*shear-transform>
+verbatimtex
+%&latex
+\documentclass{amsart}
+\usepackage[default, lining, proportional, regular, semibold]{sourceserifpro}
+\usepackage[lining, proportional, semibold]{sourcesanspro}
+\usepackage[semibold]{sourcecodepro}
+\usepackage[xcharter]{newtxmath}
+\newcommand*{\numberset}[1]{\mathbb{#1}}
+\newcommand*{\transpose}[1]{{#1}^{\text{T}}}
+\begin{document}
+etex
+
+
+prologues := 3;
+
+
+phi := .618;
+
+u := 80;
+
+
+numeric line_thickness[];
+line_thickness[1] := .25 * 72/25.4;
+line_thickness[2] := .35 * 72/25.4;
+line_thickness[3] := .5 * 72/25.4;
+line_thickness[4] := .7 * 72/25.4;
+
+narrow_width := line_thickness[1];
+medium_width := line_thickness[2];
+wide_width := line_thickness[3];
+
+
+%% / x' \ / 1 slant \ / x \
+%% | | = | | | |
+%% \ y' / \ 0 1 / \ y /
+def slant_point(expr a_point, a_slant) =
+ (xpart a_point + ypart a_point * a_slant, ypart a_point)
+enddef;
+
+
+pair original_rectangle[];
+original_rectangle[1] := (0, 0);
+original_rectangle[2] := (u, 0);
+original_rectangle[3] := (u, phi * u);
+original_rectangle[4] := (0, phi * u);
+
+slant := .2;
+
+pair slanted_rectangle[];
+slanted_rectangle[1] := slant_point(original_rectangle[1], slant);
+slanted_rectangle[2] := slant_point(original_rectangle[2], slant);
+slanted_rectangle[3] := slant_point(original_rectangle[3], slant);
+slanted_rectangle[4] := slant_point(original_rectangle[4], slant);
+
+pair offset[];
+offset[0] := (0, 0);
+offset[1] := (1.75u, 0);
+
+
+beginfig(1);
+ drawarrow (-.2u, 0) + offset[0] -- (1.25u, 0) + offset[0]
+ withpen pencircle scaled narrow_width;
+ drawarrow (0, -.2u) + offset[0] -- (0, u) + offset[0]
+ withpen pencircle scaled narrow_width;
+
+ label.llft(btex \(\numberset{E}^2\) etex, offset[0]);
+ label.llft(btex \(x\) etex, (1.25u, 0) + offset[0] + (0, -2));
+ label.lft(btex \(y\) etex, (0, u) + offset[0]);
+
+ draw original_rectangle[1] + offset[0] --
+ original_rectangle[2] + offset[0] --
+ original_rectangle[3] + offset[0] --
+ original_rectangle[4] + offset[0] --
+ cycle
+ withpen pencircle scaled wide_width;
+ drawdot original_rectangle[4] + offset[0] withpen pencircle scaled 4pt;
+ label.urt(btex \(\transpose{(x, y)}\) etex, original_rectangle[4] + offset[0] + (1, 1));
+
+
+ drawarrow (-.2u, 0) + offset[1] -- (1.25u, 0) + offset[1]
+ withpen pencircle scaled narrow_width;
+ drawarrow (0, -.2u) + offset[1] -- (0, u) + offset[1]
+ withpen pencircle scaled narrow_width;
+
+ label.llft(btex \(\numberset{E}^2\) etex, offset[1]);
+ label.llft(btex \(x\) etex, (1.25u, 0) + offset[1] + (0, -2));
+ label.lft(btex \(y\) etex, (0, u) + offset[1]);
+
+ draw slanted_rectangle[1] + offset[1] --
+ slanted_rectangle[2] + offset[1] --
+ slanted_rectangle[3] + offset[1] --
+ slanted_rectangle[4] + offset[1] --
+ cycle
+ withpen pencircle scaled wide_width;
+ drawdot slanted_rectangle[4] + offset[1] withpen pencircle scaled 4pt;
+ label.urt(btex \(\transpose{(x'\!, y')}\) etex, slanted_rectangle[4] + offset[1] + (3, 1));
+
+
+ pair p;
+ p := slanted_rectangle[1] + offset[1];
+ draw p -- (1.5slanted_rectangle[4] + offset[1])
+ withpen pencircle scaled narrow_width;
+
+ path angle_indicator;
+ angle_indicator := fullcircle scaled 1.6u shifted offset[1];
+ draw angle_indicator
+ cutbefore (p -- (1.5slanted_rectangle[4] + offset[1]))
+ cutafter (offset[1] -- (0, u) + offset[1]);
+ label.rt(btex \(\alpha\) etex, 1.4original_rectangle[4] + offset[1] + (1, 0));
+endfig;
+end
+%</shear-transform>
+% \fi
+%
+%
+% \begin{figure}
+% \centering
+% \includegraphics{shear-transform.mps}
+%
+% \caption[Shear transform]
+% {Shear transform of a rectangle by the angle~\(\alpha\). The left-hand side shows
+% the original figure the right-hand side the one sheared by~\(\alpha\). The
+% \(x\)-axis can be identified with the baseline of the
+% text.}\label{fig:shear-transform}
+% \end{figure}
+%
+%
+% For \(\alpha = 0\) the shear matrix becomes the identity matrix. Throughout of
+% \packagename{synthslant} we work with the \meta{slant} which is \(\sin \alpha\) in
+% \cref{equ:shear-transformation} and avoid converting back and forth to the
+% \index{shear>angle}shear angle~\(\alpha\).\footnote{At least one slant engine currently
+% requires such a conversion, namely~\pstrickslogo. The math is hidden from the user, though.}
+% Some values for orientation: \mbox{\(\sin 5.74\degree \approx .1\)}, \mbox{\(\sin 11.5\degree
+% \approx .2\)}, and \mbox{\(\sin 17.5\degree \approx .3\)}.\footnote{For small
+% angles~\(\lvert\alpha\rvert\) measured in radians the sine is approximately linear: \(\sin
+% \alpha \approx \alpha\).} For real-life serif fonts \meta{slant} is in the range of~\(.1\)
+% to~\(.45\) and a value of~\(.2\) seems to be quite common. My \filesystem{pdftex.map} lists
+% negative \meta{slant} values in the range~\(-.4\) to~\(-.05\) and positive \meta{slant}
+% values in the range~\(.14\) up to~\(.45\). See \Cref{tab:slant-values} on
+% \cpageref{tab:slant-values} for some actual values of serif fonts in \LaTeX.
+%
+%
+% \subsection{Usage Ideas}\label{sec:usage-ideas}
+%
+% Automatic slanting both forward and reverse can be applied in a variety of typographic
+% occasions. Here are some ideas.
+%
+% \begin{enumerate}
+% \item\label{it:no-italics}
+% Generate a slanted serif in the unfortunate situation when a serif font comes without
+% italics such as \singlequotes{\acronym{URW}~Antiqua}\index{font>URW Antiqua=\acronym{URW}
+% Antiqua}.
+%
+% Here, the user is relatively free to choose a \meta{slant}, for there are no italics whose
+% angle must be matched. \packagename{Synthslant}'s default of~.2 should be a good starting
+% point.
+%
+% \item\label{it:upright-italics}
+% Augment a serif font that features an italics shape with upright italics.
+%
+% In nearly all cases it is desirable not to remove all forward-slant of the italics but
+% retain some 1\textdegree{} to~2\textdegree{} of residual angle.
+%
+% \item\label{it:correct-italics-angle}
+% An italics shape that has an excessive slant angle, as
+% e.\,g.~\singlequotes{Libre~Caslon}\index{font>Libre Caslon} may be corrected, i.\,e.,
+% partially un-slanted.
+%
+% In this case, and generally if a font as a whole needs to be corrected, an alternative
+% approach like the one sketched in \cref{sec:alternative} on \cpageref{sec:alternative} may
+% be warranted.
+%
+% \item\label{it:generate-sole-obliques}
+% Generate an oblique sans-serif if a sans-serif font comes without an oblique shape as,
+% e.\,g., \singlequotes{\acronym{URW}~Grotesk}.\index{font>URW Grotesk=\acronym{URW} Grotesk}
+%
+% \item\label{it:generate-extra-obliques}
+% Supply a slanted sans-serif shape for sans-serif fonts with designed, this is \emph{true}
+% obliques as e.\,g.~\singlequotes{Open Sans}.\index{font>Open Sans}
+%
+% \item\label{it:slant-typewriter}
+% Fixed-width --~also called \singlequotes{typewriter} or \singlequotes{teletype}~-- fonts
+% without obliques (Yes, I am looking at you, Inconsolata!)\index{font>Inconsolata} finally
+% get an oblique shape.
+%
+% \item\label{it:slanted-small-caps}
+% Small caps without accompanying italics can be slanted, too.
+%
+% \item\label{it:slant-in-math-mode}
+% As \packagename{synthslant} also works in \TeX's math-mode, it is possible to give
+% math-italics even more of a heeling.
+%
+% \item\label{it:correct-math-script}
+% If the slant of the math script font is at odds with the slant of the usual math italics,
+% it may be possible to apply \packagename{synthslant} on the script symbols for matching
+% angles.
+%
+% \item\label{it:slant-big-math-operators}
+% Big mathematical operators like the sigma can be slanted and others, like the integral
+% sign, can have their inclination adjusted.
+% \end{enumerate}
+%
+% It is possible to obtain slants that run against the reading direction, so called
+% \singlequotes{backslanted} glyphs, but I have rarely seen an
+% \href{https://fontsinuse.com/tags/2044/left-leaning-italics-backslanted}{example} where the
+% typography of a document could benefit from that.
+%
+%
+% \clearpage
+% \section{Package Options}\label{sec:package-options}
+%
+% \begin{synopsis}
+% |\usepackage[|\meta{option}\dots|]{synthslant}|
+% \end{synopsis}
+%
+% This is a list of \meta{option}s that \packagename{synthslant} understands. The package
+% options allow to predefine the forward and backward slant angles as well as the selection of
+% a particular slanting engine.
+%
+% \begingroup
+% \newcommand*{\indexpackageoption}[1]
+% {\index{package option>#1=\code{#1}}\index{#1=\code{#1}~(option)}\ignorespaces}
+% \begin{description}
+% [before={\let\oldmakelabel=\makelabel
+% \renewcommand{\makelabel}[1]
+% {\oldmakelabel{\termparbox{##1}}\phantomsection}},
+% font=\normalfont,
+% style=nextline]
+% \item[|auto|]\label{item:auto}
+% \indexpackageoption{auto}
+% Let the package choose a slant engine. This is the default.
+%
+% For \pdfLaTeX{} package \packagename{synthslant} selects the \acronym{PDF}-engine, for
+% \LuaLaTeX{} the \packagename{fontspec}-engine, and in all other cases the
+% \packagename{l3draw}-layer handles the shear transformation.
+%
+% \item[|disable|]\label{item:disable}
+% \indexpackageoption{disable}
+% Disable slanting completely.
+%
+% \item[|fontspec|]\label{item:fontspec}
+% \indexpackageoption{fontspec}
+% Use \packagename{fontspec}\index{package>\packagename{fontspec}} as slanting
+% back-end.\footnote{Requires \filesystem{fontspec.sty.}}
+%
+% \item[|l3draw|]\label{item:l3draw}
+% \indexpackageoption{l3draw}
+% Select the \singlequotes{draw} layer\index{package>\packagename{l3draw}} of \LaTeXIII{} as
+% base for the slanting engine.\footnote{This option requires \filesystem{l3draw.sty.}}
+%
+% \begin{caution}
+% This engine is experimental and the \singlequotes{draw} layer of \LaTeXIII{} itself is
+% still experimental, too. See \cref{sec:limitations} on \cpageref{sec:limitations} for
+% details.
+% \end{caution}
+%
+% \item[|negslant=|\meta{slant-expr}]\label{item:negslant}
+% \indexpackageoption{negslant}
+% Set the default value for \hyperref[syn:synthnegslant]{\cs{synthnegslant}} \emph{only.}
+% The argument \meta{slant-expr} is a floating-point expression. Note that for this option
+% \meta{slant-expr} must evaluate to a non-positive value.
+%
+% \item[|PDF|, |pdf|]\label{item:pdf}
+% \indexpackageoption{pdf}
+% Select the \acronym{PDF}-slant engine. This requires the document is translated with
+% \pdfLaTeX{} or a compatible program.
+%
+% \item[|posslant=|\meta{slant-expr}]\label{item:posslant}
+% \indexpackageoption{posslant}
+% Set the default value for \hyperref[syn:synthslant]{\cs{synthslant}} \emph{only.} The
+% argument \meta{slant-expr} is a floating-point expression. Note that for this option
+% \meta{slant-expr} must evaluate to a non-negative value.
+%
+% \item[|PS|, |ps|]\label{item:postscript}
+% \index{ps}
+% Use \pstrickslogo\index{package>\packagename{pstricks}} to delegate slanting to the
+% PostScript\index{PostScript} interpreter. Obviously requires \pstrickslogo\footnote{The
+% package actually required is \filesystem{pst-3d.sty.}} and \acronym{DVI}-to-PostScript
+% translation.
+%
+% \begin{caution}
+% This engine is still experimental and produces low-quality output! See
+% \cref{sec:limitations} on \cpageref{sec:limitations} for details.
+% \end{caution}
+%
+% \item[|slant=|\meta{slant-expr}]\label{item:slant}
+% \indexpackageoption{slant}
+% Set the default values for both \hyperref[syn:synthslant]{\cs{synthslant}} and
+% \hyperref[syn:synthnegslant]{\cs{synthnegslant}}, this is, behave as if the two package
+% options \(\code{posslant} = \meta{slant-expr}\) and \(\code{negslant} =
+% -(\meta{slant-expr})\) have been given. The argument \meta{slant-expr} is a floating-point
+% expression.
+%
+% If omitted \packagename{synthslant} assumes \(.2\) and \(-.2\), respectively.
+%
+% \item[|TikZ|, |tikz|]\label{item:tikz}
+% \indexpackageoption{tikz}
+% Use \packagename{TikZ}\index{package>\packagename{TikZ}} for slanting.\footnote{Requires
+% \filesystem{tikz.sty.}}
+%
+% \begin{caution}
+% This engine is still experimental and produces low-quality output! See
+% \cref{sec:limitations} on \cpageref{sec:limitations} for details.
+% \end{caution}
+% \end{description}
+% \endgroup
+%
+% The package options \code{slant}, \code{posslant}, and \code{negslant} all accept
+% floating-point \emph{expressions} as their arguments not just plain floating-point literals.
+% See Ref.~\citenum{latex3-interfaces}, Ch.~29, \doublequotes{The \textsf{l3fp}~module~--
+% Floating points} for a description of the floating-point expression syntax and the available
+% functions.
+%
+%
+% \clearpage
+% \section{Macros and Environments}\label{sec:macros-and-environments}
+%
+% This section describes how to actually apply the functionality of \packagename{synthslant} to
+% some text. If the \meta{slant}~value matching a given font is known this is about it. To
+% figure out an unknown \meta{slant}~value check out \cref{sec:determine-slant}.
+%
+%
+% \subsection{Variable-Like Macros}\label{sec:variables}
+%
+% The amount of slanting forward (positive slant angles) and backward (negative slant angles)
+% is controlled by two macros. They are set during package initialization. However, they can
+% be changed at any time to accommodate for different fonts or special needs.
+%
+% \DescribeMacro{\synthslant}
+% Control the slant applied by \hyperref[syn:textsynthslant]{\cs{textsynthslant}}.
+% This value is non-negative.
+%
+% \begin{synopsis}\label{syn:synthslant}
+% \cs{synthslant}
+% \end{synopsis}
+%
+% To change the slant value to \(.24\) say
+%
+% \begin{codeexample}
+% \cs{renewcommand}*\{\cs{synthslant}\}\{.24\}
+% \end{codeexample}
+%
+% \Cref{tab:slant-values} summarizes some suggested slant values for selected fonts.
+%
+% \begin{table}
+% \small
+% \centering
+% \caption[Suggested slant values]
+% {Suggested slant values for selected \emph{serif} fonts. The \meta{slant} shown in
+% the tables is not necessarily the one closest to the font's italics. Also compare
+% with the left-hand table of \cref{tab:slanted-series-fonts}.}
+% \label{tab:slant-values}
+%
+% \fullwidthsetup{skipabove=0pt, skipbelow=0pt}
+% \begin{maxipage}
+% \begin{minipage}{\textwidth}
+% \flushright
+% \begin{tabfigures}
+% \begin{tabular}[t]{@{}p{9.5em}l@{}}
+% \toprule
+% Font Name & Slant \\
+% \midrule
+% \acronym{ADF} Accanthis\index{font>ADF Accanthis=\acronym{ADF} Accanthis} & .26 \\
+% \acronym{ADF} Baskervald\index{font>ADF Baskervald=\acronym{ADF} Baskervald} & .32 \\
+% \acronym{ADF} Berenis\index{font>ADF Berenis=\acronym{ADF} Berenis} & .2 \\
+% \acronym{ADF} Venturis\index{font>ADF Venturis=\acronym{ADF} Venturis} & .2 \\
+% Alegreya\index{font>Alegreya} & .2 \\
+% Arvo\index{font>Arvo} & .2 \\
+% BaskervilleF\index{font>BaskervilleF} & .2 \\
+% Bera Serif\index{font>Bera Serif} & .2 \\
+% Bitter\index{font>Bitter} & .16 \\
+% Caladea\index{font>Caladea} & .14 \\
+% Clara\index{font>Clara} & .24 \\
+% Cochineal\index{font>Cochineal} & .2 \\
+% Coelacanth\index{font>Coelacanth} & .2 \\
+% Crimson Pro\index{font>Crimson Pro} & .2 \\
+% Crimson Text\index{font>Crimson Text} & .2 \\
+% \bottomrule
+% \end{tabular}%
+% \qquad
+% \begin{tabular}[t]{@{}p{9.5em}l@{}}
+% \toprule
+% Font Name & Slant \\
+% \midrule
+% Day Roman\index{font>Day Roman} & .2 \\
+% \acronym{EB} Garamond\index{font>EB Garamond=\acronym{EB} Garamond} & .3 \\
+% etbb\index{font>etbb} & .2 \\
+% fbb\index{font>fbb} & .2 \\
+% Garamond Expert\index{font>Garamond Expert} & .2 \\
+% Gandhi Serif\index{font>Gandhi Serif} & .2 \\
+% Gentium\index{font>Gentium} & .2 \\
+% Ibarra Real Nova\index{font>Ibarra Real Nova} & .2 \\
+% \acronym{IBM} Plex Serif\index{font>IBM Plex Serif=\acronym{IBM} Plex Serif} & .24 \\
+% \acronym{Inria} Serif\index{font>Inria Serif=\acronym{Inria} Serif} & .2 \\
+% Libertinus Serif\index{font>Libertinus Serif} & .2 \\
+% Libre Baskerville\index{font>Libre Baskerville} & .3 \\
+% Libre Caslon\index{font>Libre Caslon} & .38 \\
+% & \\
+% & \\
+% \bottomrule
+% \end{tabular}%
+% \qquad
+% \begin{tabular}[t]{@{}p{9.5em}l@{}}
+% \toprule
+% Font Name & Slant \\
+% \midrule
+% Merriweather\index{font>Merriweather} & .14 \\
+% MLModern\index{font>MLModern} & .23 \\
+% Noto Serif\index{font>Noto Serif} & .22 \\
+% \acronym{PT} Serif\index{font>PT Serif=\acronym{PT} Serif} & .2 \\
+% Roboto Slab\index{font>Roboto Slab} & .2 \\
+% Quattrocento\index{font>Quattrocento} & .2 \\
+% Source Serif Pro\index{font>Source Serif Pro} & .18 \\
+% Spectral\index{font>Spectral} & .18 \\
+% \acronym{STIX}\index{font>STIX=\acronym{STIX}} & .2 \\
+% \TeX{} Gyre Pagella\index{font>TeX Gyre Pagella=\TeX{} Gyre Pagella} & .16 \\
+% \acronym{TX} Fonts Serif\index{font>TX Fonts Serif=\acronym{TX} Fonts Serif} & .2 \\
+% \acronym{URW} Antiqua\index{font>URW Antiqua=\acronym{URW} Antiqua} & .2 \\
+% \acronym{URW} Nimbus Roman\index{font>URW Nimbus Roman=\acronym{URW} Nimbus Roman} & .2 \\
+% Utopia\index{font>Utopia} & .2 \\
+% & \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{minipage}
+% \end{maxipage}
+% \end{table}
+%
+% \DescribeMacro{\synthnegslant}
+% Control the slant applied by
+% \hyperref[syn:textsynthuprightitalic]{\cs{textsynthuprightitalic}}. This value is
+% non-positive.
+%
+% \begin{synopsis}\label{syn:synthnegslant}
+% \cs{synthnegslant}
+% \end{synopsis}
+%
+%
+% \subsection{Basic Interface}\label{sec:basic-interface}
+%
+% Package \packagename{synthslant} provides two easy-to-use macros for slanting glyphs. For a
+% more flexible and powerful interface, see~\cref{sec:advanced-interface}.
+%
+% \begin{note}
+% The following restrictions and workarounds to get line-breaking and automatic hyphenation
+% working again do \emph{not} apply to the
+% \packagename{fontspec}\index{package>\packagename{fontspec}} back-end.
+% \end{note}
+%
+% \noindent
+% Both macros provide \emph{simplistic} support for slanting hyphenatable
+% words and space-separated phrases for a given \meta{text}. The fundamental shear
+% transformation would produce an single unbreakable horizontal box. So we have added two
+% provisions to re-enable at least some breakability.
+%
+% \begin{enumerate}
+% \item Spaces introduce breakpoint,\index{breakpoint at space} e.\,g.
+% \begin{codeexample}
+% \cs{textsynthslant}\{topological dual space\}
+% \end{codeexample}
+% slants the first word (producing a horizontal box) inserts a space and then slants the
+% second word (producing another horizontal box). \TeX{} sees two (unbreakable) boxes and a
+% discardable space when it comes to linebreaking.
+%
+% \item Discretionary hyphens\index{discretionary hyphen} in the form of \singlequotes{\cs{-}}
+% get propagated. So, we could improve on our above example by saying
+% \begin{codeexample}
+% \cs{textsynthslant}\{topo\cs{-}log\cs{-}i\cs{-}cal dual space\}
+% \end{codeexample}
+% to \singlequotes{recover} hyphenation of the first word.
+% \end{enumerate}
+%
+% \noindent
+% This neither is a complete nor an elegant solution but it will take us quite far.
+%
+% \medskip
+%
+% \DescribeMacro{\textsynthslant}
+% Forward slant some upright glyphs.
+%
+% \begin{synopsis}\label{syn:textsynthslant}
+% \cs{textsynthslant}\marg{text}
+% \end{synopsis}
+%
+% In horizontal mode switch to an upright shape, slant \meta{text} with the slant value stored
+% in \hyperref[syn:synthslant]{\cs{synthslant}} and apply \doublequotes{slant
+% correction}\index{slant>correction} --~the equivalent of italics correction~-- at the
+% right-hand side of~\meta{text}.
+%
+% In math mode just slant \meta{text} with the slant value stored in
+% \hyperref[syn:synthslant]{\cs{synthslant}}.
+%
+% \begin{usecases}
+% If italics seem to be too intrusive in the body we can substitute slanted text for example
+% for foreign phrases like \singlequotes{et.\,al.} and \singlequotes{etc.}:
+%
+% \begin{codeexample}
+% \cs{newcommand*}\=\{\cs{foreignphrase}\}[2][USenglish] \\
+% \>\{\cs{foreignlanguage}\{\#1\}\{\cs{textsynthslant}\{\#2\}\}\}
+% \end{codeexample}
+%
+% \noindent
+% where we show the font modification in conjunction with the
+% \packagename{babel}~macro\index{package>\packagename{babel}}
+% \cs{foreignlanguage}~\cite{package:babel}.~\visualpar
+%
+% In math-mode you cannot have enough fonts, symbols, and most of the gizmos over there! I
+% like to mark up automorphism groups associated with a given group with a slanted-roman
+% typeface, though my macro has a more general name.
+%
+% \begin{codeexample}
+% \cs{newcommand*}\=\{\cs{functionspace}\}[1] \\
+% \>\{\cs{mbox}\{\cs{textsynthslant}\{\#1\}\}\}\specialsectionendhere
+% \end{codeexample}
+% \end{usecases}
+%
+% \DescribeMacro{\textsynthuprightitalic}
+% Backward slant some italics or oblique glyphs.
+%
+% \begin{synopsis}\label{syn:textsynthuprightitalic}
+% \cs{textsynthuprightitalic}\marg{text}
+% \end{synopsis}
+%
+% In horizontal mode switch to an italics shape,
+% slant \meta{text} with the slant value stored in \cs{synthnegslant}.
+%
+% In math mode just un-slant \meta{text} with the slant value stored in \cs{synthnegslant}.
+%
+% \begin{example}
+% To set apart operators in an algebra like, e.\,g., the radical, we could use upright
+% italics
+%
+% \begin{codeexample}
+% \cs{newcommand*}\=\{\cs{algebraoperator}\}[1] \\
+% \>\{\cs{mbox}\{\cs{textsynthuprightitalic}\{\#1\}\}\}
+% \end{codeexample}
+%
+% \noindent
+% and follow up with
+%
+% \begin{codeexample}
+% \cs{DeclareMathOperator}\{\cs{rad}\}\{\cs{algebraoperator}\{rad\}\}
+% \end{codeexample}
+%
+% \noindent
+% where we have assumed that \packagename{amsmath} has been loaded to bring
+% \cs{DeclareMathOperator} into scope.
+% \end{example}
+%
+%
+% \subsection{Advanced Interface}\label{sec:advanced-interface}
+%
+% \DescribeMacro{\synthslantbox}
+% Slant \meta{text} with an amount of \meta{slant} that can be positive, negative or zero.
+%
+% \begin{synopsis}\label{syn:synthslantbox}
+% \cs{synthslantbox}\marg{slant}\marg{text}
+% \end{synopsis}
+%
+% This is the unadorned call to the chosen slanting engine. In particular, neither the values
+% of \hyperref[syn:synthslant]{\cs{synthslant}} nor of
+% \hyperref[syn:synthnegslant]{\cs{synthnegslant}} enter its expansion! No corrections or
+% \TeX-mode adjustments are made.
+%
+% \begin{example}
+% Generate a substitute for a missing solidus character:
+%
+% \begin{codeexample}
+% 12\=\kill
+% \cs{renewcommand*}\{\cs{textfractionsolidus}\}[1] \\
+% \>\{\=\cs{kern}-.125em \\
+% \> \>\cs{raisebox}\=\{.125em\} \\
+% \> \> \>\{\=\cs{smaller} \\
+% \> \> \> \>\cs{synthslantbox}\{.3\}\{\cs{char}`/\}\}\% \\
+% \> \>\cs{kern.1em}\}
+% \end{codeexample}
+%
+% \noindent
+% where the \cs{smaller} macro is from the
+% \packagename{relsize}~package~\cite{package:relsize}.
+% \end{example}
+%
+% The following two environments are responsible for setting up everything before the actual
+% slant or un-slant code runs and what happens after the slant-engine finishes. They can be
+% redefined or patched to meet different users' needs.
+%
+% \DescribeEnv{slantenvironment}
+% Wrapper around \hyperref[syn:synthslantbox]{\cs{synthslantbox}} that is called for every
+% forward-slanting operation with~\hyperref[syn:textsynthslant]{\cs{textsynthslant}}.
+%
+% \begin{synopsis}\label{syn:slantenvironment}
+% \cs{begin}|{slantenvironment}| \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{slantenvironment}|
+% \end{synopsis}
+%
+% Switch to an upright font shape and --~if
+% package~\packagename{microtype}~\cite{package:microtype}\index{package>\packagename{microtype}}
+% has been loaded~-- enter the Microtype-context defined by
+% macro~\hyperref[syn:slantcontext]{\cs{slantcontext}}. At the end add some slant correction,
+% which is the equivalent of italics correction.
+%
+% \begin{usecases}[\doublequotes{Patch Cases}]
+% Left-italics correction.~\visualpar{}
+% Simultaneous left-italics and right-italics correction for a shift-left effect.
+% \end{usecases}
+%
+% \DescribeEnv{negslantenvironment}
+% Wrapper around \hyperref[syn:synthslantbox]{\cs{synthslantbox}} that is called for every
+% backward-slanting operation
+% with~\hyperref[syn:textsynthuprightitalic]{\cs{textsynthuprightitalic}}.
+%
+% \begin{synopsis}\label{syn:negslantenvironment}
+% \cs{begin}|{negslantenvironment}| \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{negslantenvironment}|
+% \end{synopsis}
+%
+% Switch to an italics font shape and --~if
+% package~\packagename{microtype}~\cite{package:microtype} has been loaded~-- enter the
+% Microtype-context defined by macro~\hyperref[syn:negslantcontext]{\cs{negslantcontext}}.
+%
+% \DescribeMacro{\slantcontext}
+% Microtype context used when typesetting slanted text.
+%
+% \begin{synopsis}\label{syn:slantcontext}
+% \cs{slantcontext}
+% \end{synopsis}
+%
+% The expansion of this macro may be empty.
+% The package's default is
+%
+% \begin{codeexample}
+% tracking = synthslant
+% \end{codeexample}
+%
+% \begin{note}
+% The tracking context~\code{synthslant} is \emph{not} defined by \packagename{synthslant}.
+% And \packagename{microtype} ignores undefined contexts.
+% \end{note}
+%
+% \DescribeMacro{\negslantcontext}
+% Microtype context used when typesetting un-slanted text.
+%
+% \begin{synopsis}\label{syn:negslantcontext}
+% \cs{negslantcontext}
+% \end{synopsis}
+%
+% The expansion of this macro may be empty.
+% The package's default is
+%
+% \begin{codeexample}
+% tracking = synthnegslant
+% \end{codeexample}
+%
+% \begin{note}
+% The tracking context~\code{synthnegslant} is \emph{not} defined by
+% \packagename{synthslant}. And \packagename{microtype} ignores undefined contexts.
+% \end{note}
+%
+% \begin{example}
+% Upright italics often look somewhat tight. I like to add some extra tracking to them. So,
+% I simply define the context~\code{synthnegslant}:
+%
+% \begin{codeexample}
+% \cs{SetTracking}\=[context = synthnegslant] \\
+% \>\{encoding = *, shape = it\} \\
+% \>\{10\}\specialsectionendhere
+% \end{codeexample}
+% \end{example}
+%
+% \begin{tip}
+% When the tracking of upright italics is changed
+% it may be advisable
+%
+% \begin{itemize}[notopsep]
+% \item to break ligatures, e.\,g.~\code{no ligatures = \{f\}},
+% \item to adjust the outer kerning, e.\,g.~\code{outer~kerning = \{0, 0\}} and
+% \item to adapt the inter-word spacing, e.\,g.~\code{spacing = \{100,,\}}.
+% \end{itemize}
+%
+% The document \filesystem{synthslant-gauge.tex}, which comes with
+% package~\packagename{synthslant}, has sample texts and tracking variations already set up
+% for experimentation.
+% \end{tip}
+%
+%
+% \clearpage
+% \section{Determining Slant}\label{sec:determine-slant}
+%
+% If a synthetically slanted piece of text needs to match to an existing italics or oblique
+% font the question arises how to determine the slant angle~\(\alpha\) or~\meta{slant}.
+%
+% \begin{note}
+% The slant angles of different glyphs in the same font may slightly differ from each other.
+% We look for a representative \meta{slant}, a kind of average that achieves a visual match
+% with the italics or obliques of the font family.
+% \end{note}
+%
+%
+% \subsection{Direct Measurement}\label{sec:direct-meansurement}
+%
+% Measure the angle of some reference glyphs with a graphics program.
+%
+% \begin{enumerate}[itemsep=.5\itemsep, parsep=.5\parsep]
+% \item Prepare a page with some sample glyphs of the font shape to be matched.
+%
+% \item Render it as PostScript or in~\acronym{PDF}.
+%
+% \item Load the file at a resolution of 1200\,dpi or higher into your favourite graphics
+% editor that supports measuring angles.
+%
+% \item In the graphics editor center the interesting letters and set the zoom to one hundred
+% percent or more.
+%
+% \item Measure some letters and write down the angles.
+%
+% \item Convert the desired angle~\(\alpha\) to a \meta{slant} by calculating \(\sin \alpha\).
+%
+% If no computer is available, the following formula might help:
+% \begin{equation*}
+% \meta{slant} = \sin \alpha \approx \frac{11}{630\degree} \: \alpha,
+% \end{equation*}
+%
+% where \(\alpha\) is given in degrees.
+% \end{enumerate}
+%
+%
+% \subsection{Comparison of Shapes}\label{sec:shape-comparison}
+%
+% Compare some reference glyphs with a differently slanted versions.
+%
+% \begin{enumerate}[itemsep=.5\itemsep, parsep=.5\parsep]
+% \item In file~\filesystem{synthslant-gauge.tex} which comes with the
+% \packagename{synthslant}~package insert the code to load your font-of-interest.
+%
+% \item Render the document as PostScript or as~\acronym{PDF}.
+%
+% \item Load the first page at a resolution of 600\,dpi to~900\,dpi into your favourite
+% graphics editor.
+%
+% \item Cut the italics sample at the top allowing for generous white-space around it as a
+% rectangle
+%
+% \item Paste the rectangle in a new layer called e.\,g.~\singlequotes{sample}.
+%
+% \item On layer \singlequotes{sample} move the rectangle down the list of different slant
+% values until it match best.
+%
+% \item Switch the layer mode of \singlequotes{sample} to \singlequotes{difference} and
+% fine-position the rectangle over the slanted sample. Compare different letters in that
+% way. Change line until the best match is found.
+%
+% \item Read the slant value at the left-hand side of the line. See
+% \Cref{fig:compare-with-the-gimp}.
+% \end{enumerate}
+%
+% \begin{figure}
+% \centering
+% \includegraphics[keepaspectratio=true, width=\linewidth]
+% {compare-with-the-gimp}
+%
+% \caption[Compare slant angles]
+% {Compare italics and slanted samples with \application{The Gimp}.~\visualpar{} For
+% this screendump I loaded the samples on the first page of
+% \filesystem{synthslant-gauge.pdf} at a resolution of~600\,dpi into
+% \application{The Gimp}. The \singlequotes{sample}~layer is aligned to the
+% letter~\singlequotes{t} in the word~\singlequotes{White}. Note that accidentally
+% the letter~\singlequotes{H} of the next word~\singlequotes{Handgloves} confirms
+% the good match.}\label{fig:compare-with-the-gimp}
+% \end{figure}
+%
+%
+% \subsection{Exploring Further}\label{sec:exploring-further}
+%
+% Once a usable slant value has been found it can be fed into \filesystem{synthslant-gauge.tex}
+% and --~after recompiling with the appropriate \LaTeX-engine~-- used to examine the details of
+% the slant operations.
+%
+% Page~2, Sec.~3.1, \singlequotes{Copy}, shows wild mixes of different font shapes, native al
+% well as synthesized ones. Here, the slanted glyphs as well as the upright italics should
+% blend well with the native italics/obliques and the normal font, respectively.
+%
+% Page~3, Sec.~3.2 and following sub-sections, examines the coupling of
+% \packagename{synthslant} with the \TeX-system and some of its extensions. If a slant engine
+% malfunctions, it will become evident on this page.
+%
+%
+% \clearpage
+% \section{Limitations and Known Problems}\label{sec:limitations}
+%
+% Here I list some of the known problems of \packagename{syntslant}. Conceivably there are
+% more.
+%
+% \begin{description}
+% \item[All except \packagename{fontspec}.]
+% \packagename{Syntslant}~manipulations may not survive
+% (pre-)\discretionary{}{}{}processing by \MP.
+%
+% \item[\packagename{l3draw} engine.]\index{package>\packagename{l3draw}}\mbox{}
+% \begin{itemize}
+% \item Depending of the shear direction the \packagename{l3draw} engine may generate some
+% extra positive or negative space at the ends of the text.
+%
+% \item Any box sheared looses its depth; technically \cs{dp} becomes~0pt.
+%
+% \item Markedly slower than the \acronym{PDF}-implementation!
+% \end{itemize}
+%
+% \item[\pstrickslogo{} engine.]\index{package>\packagename{pstricks}}
+% The \pstrickslogo{} engine produces some extra space at the ends of the text.
+%
+% \item[\tikzlogo{} engine.]\index{package>\packagename{tikz}}
+% The \tikzlogo{} engine produces some extra space at the ends of the text.
+% \end{description}
+%
+%
+% \clearpage
+% \section{Alternative Solution}\label{sec:alternative}
+%
+% Here is an alternative to \packagename{synthslant} that I am aware of. It changes the slant
+% of a font as a whole and it is impossible to undo the change within the document.
+%
+%
+% \subsection{Using \pdfTeX}\label{sec:alternative-pdftex}
+%
+% In \pdfTeX{} fonts can be re-mapped in the document preamble with the
+% primitive~\cs{pdfmapline}; see the \pdfTeX{} Reference Manual~\cite[Sec.~6.1]{pdftex} for a
+% description of the syntax. This possibility renders possible to splice in a slanting
+% operation on the fly.
+%
+% Here is a simplified syntax of a font map line, which does not indicate any of the optional
+% parts for better readability:
+%
+% \begin{multilinecodeexample}
+% \meta{tfm-name} \meta{ps-name} \meta{font-flags} \\
+% \pushright "\meta{special}" <\meta{encoding-file} <\meta{font-file}
+% \end{multilinecodeexample}
+%
+% \noindent where
+%
+% \begin{itemize}[notopsep]
+% \item \meta{tfm-name} is the basename of the \TeX{} font-metric file~(\filesystem{*.tfm}),
+%
+% \item \meta{ps-name} is the name the font will acquire inside of \TeX,
+%
+% \item \meta{font-flags} optionally specify some characteristics of the font,
+%
+% \item \meta{special} prescribes font manipulations in the same way as
+% \command{dvips}~\cite[Sec.~6.3]{dvips} does,
+%
+% \item \meta{encoding-file} is the filename~(\filesystem{*.enc}) where the encoding to be used
+% with \meta{font-file} is stored, and
+%
+% \item \meta{font-file} sets the filename of the font's definition. It is given without path
+% but includes an extension, which typically is \filesystem{otf,} \filesystem{pfb,}
+% or~\filesystem{ttf.}
+% \end{itemize}
+%
+% \noindent
+% We are particularly interested in the \meta{special}~part that allows us to slant the whole
+% font with a single instruction.
+%
+% I want to elaborate the example given in \cref{sec:usage-ideas},
+% \cref{it:correct-italics-angle} and generate less-angled italics for
+% Libre~Caslon.\index{font>Libre Caslon} Here is a suitable map line taken from
+% \filesystem{pdftex.map} on my system:
+%
+% \begin{multilinecodeexample}
+% LibreCsln-Italic-osf-t1--base LibreCsln-Italic \\
+% \indent "\textvisiblespace AutoEnc\ttdots\textvisiblespace ReEncodeFont\textvisiblespace" \\
+% \pushright <[lcsln\ttdots.enc <LibreCsln-Italic.pfb
+% \end{multilinecodeexample}
+%
+% \smallskip
+%
+% \noindent
+% which I had to break into three lines to make it fit this page. The
+% \singlequotes{{\ttfamily\ttdots\,}} indicate parts of the identifiers that I left out beyond
+% that. There are in fact four map lines for \code{T1}-encoded Libre~Caslon italics, those for
+% lining figures~\singlequotes{\code{lf}}, oldstyle figures~\singlequotes{\code{osf}}, tabular
+% lining figures~\singlequotes{\code{tlf}}, and tabular oldstyle
+% figures~\singlequotes{\code{osf}}.
+%
+% The slant operation I want to add to the \meta{special}~part has the format:
+%
+% \begin{codeexample}
+% \meta{slant}~SlantFont
+% \end{codeexample}
+%
+% \noindent
+% so for a shear to the left, for example, \(\meta{slant} = -.12\), which means the font gets
+% slanted by~\(-8\degree\) the \meta{special}~part becomes
+%
+% \begin{codeexample}
+% "\textvisiblespace -0.12\textvisiblespace SlantFont\textvisiblespace
+% AutoEnc\ttdots\textvisiblespace ReEncodeFont\textvisiblespace"
+% \end{codeexample}
+%
+% \noindent
+% Finally, I select the modified font e.\,g.~with macro
+%
+% \begin{codeexample}
+% \cs{usefont}\{\meta{encoding}\}\{\meta{family}\}\{\meta{series}\}\{\meta{shape}\}
+% \end{codeexample}
+%
+% \noindent
+% See Ref.~\citenum{latex-unofficial-refman} for details.
+% In our case the call to \cs{usefont} is
+%
+% \begin{codeexample}
+% \char`\\usefont\{T1\}\{LibreCsln-OsF\}\{regular\}\{it\}
+% \end{codeexample}
+%
+% \begin{example}
+% Here is all the talk of above put into action as this very document contains exactly the
+% \cs{pdfmapline} just described.
+%
+% \begin{center}
+% \def\sample{White Handgloves}
+% \begin{tabular}{@{}ll@{}}
+% Uncorrected, original italics & {\usefont{T1}{LibreCsln-LF}{regular}{it}\sample} \\
+% Less angled version & {\usefont{T1}{LibreCsln-OsF}{regular}{it}\sample}
+% \end{tabular}
+% \end{center}
+%
+% \noindent
+% The only trick I have to reveal is that for the \doublequotes{original italics} I used the
+% lining figures~\singlequotes{\code{lf}} version of the font, whereas the \doublequotes{less
+% angled} version shows the oldstyle figures~\singlequotes{\code{osf}} version.
+%
+% The \TeX{} Font Metrics file (\acronym{TFM}) for this particular variant of Libre~Caslon
+% was not touched.
+% \end{example}
+%
+%
+% \subsection{Combining \LaTeX{} and \command{dvipdfmx}}\label{sec:alternative-latex}
+%
+% The alternative when using \LaTeX{} is similar the one elaborated in the previous section.
+% The font mapline gets modified by \cs{special} primitive
+%
+% \begin{codeexample}
+% \cs{special}\{pdf:mapline \meta{font-mapline}\}
+% \end{codeexample}
+%
+% \noindent
+% that forwards the task of re-mapping the font, e.\,g.~to \command{dvipdfmx}. Our running
+% example becomes
+%
+% \begin{multilinecodeexample}
+% \cs{special}\{pdf:mapline \\
+% \indent LibreCsln-Italic-osf-t1--base LibreCsln-Italic \\
+% \indent "\textvisiblespace -0.12\textvisiblespace SlantFont\textvisiblespace
+% AutoEnc\ttdots\textvisiblespace
+% ReEncodeFont\textvisiblespace" \\
+% \pushright <[lcsln\ttdots.enc <LibreCsln-Italic.pfb\}
+% \end{multilinecodeexample}
+%
+% \noindent
+% The mapline contains \command{dvips}~options for special font effects; see
+% Ref.~\citenum{dvips}, Sec.~6.3. Note that there is no \singlequotes{\code{=}}-sign at the
+% beginning of the \code{pdf:mapline} in contrast to \cs{pdfmapline}.
+%
+% The font is activated in the same way as in the \acronym{PDF}-path
+% (\cref{sec:alternative-pdftex}). The further translation of the resulting \acronym{DVI}-file
+% must be performed with an application that is aware of the \cs{special}~primitive as for
+% example~\command{dvipdfmx}~\cite{dvipdfmx} is.
+%
+% \begin{note}
+% Despite the option syntax originates with \command{dvips} it is not able to interpret any
+% \code{\cs{special}\{pdf:mapline \ttdots\}}.
+% \end{note}
+%
+%
+% \clearpage
+% \appendix
+%
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \MaybeStop{
+% \clearpage
+% \phantomsection
+% \resetfancyhead
+% \addcontentsline{toc}{section}{Change History}
+% \PrintChanges
+%
+% \clearpage
+% \phantomsection
+% \addcontentsline{toc}{section}{References}
+% \begin{RaggedRight}
+% \begin{thebibliography}{88}
+% \bibitem{package:relsize}
+% \bibauthor{Arseneau, Donald}.
+% \bibtitle{The \textsf{relsize} package}.
+% 2013,
+% \biburl{https://ctan.org/pkg/relsize}.
+%
+% \bibitem{adobe-pdf-1.0}
+% \bibauthor{Bienz, Tim} and \bibauthor{Richard Cohn}.
+% \bibtitle{Portable Document Format Reference Manual}.
+% Addison-Wesley Publishing Company, Reading/MA,
+% 1993,
+% \biburl{https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/pdfreference1.0.pdf}.
+%
+% \bibitem{package:babel}
+% \bibauthor{Bezos, Javier}.
+% \bibtitle{Package~\packagename{babel}}.
+% 2021,
+% \biburl{https://ctan.org/pkg/babel}.
+% The original author of \packagename{babel} was \bibauthor{J. L. Braams}.
+%
+% \bibitem{tex-stackexchange-2013-12-7}
+% \bibauthor{Carlisle, David}.
+% \bibtitle{Shear Transform a Box}.
+% 2013-12-7,
+% \biburl{https://tex.stackexchange.com/questions/63179/shear-transform-a-box/63188}.
+%
+% \bibitem{dvipdfmx}
+% \bibauthor{Dvipdfmx Project Team,} ed.
+% \bibtitle{\command{dvipdfmx}}.
+% 2020,
+% \biburl{https://ctan.org/pkg/dvipdfmx}.
+%
+% \bibitem{fntguide}
+% \bibauthor{\LaTeXIII{} Project Team,} ed.
+% \bibtitle{\LaTeXe{} font selection}.
+% 2023,
+% \biburl{https://www.latex-project.org/help/documentation/fntguide.pdf}.
+%
+% \bibitem{latex3-interfaces}
+% \bibauthor{\LaTeXIII{} Project,}
+% \bibtitle{The \LaTeXIII{} Interfaces}.
+% 2024,
+% \biburl{https://texdoc.org/serve/interface3/0}.
+%
+% \bibitem{latex-unofficial-refman}
+% \bibauthor{latexref.xyz}.
+% \bibtitle{\LaTeXe: An unofficial reference manual}.
+% 2023,
+% \biburl{https://latexref.xyz/dev/latex2e.pdf}.
+%
+% \bibitem{middendorp:2014}
+% \bibauthor{Middendorp, Jan}.
+% \bibtitle{Shaping Text}.
+% \acronym{BIS}~publishers, Amsterdam,
+% 2014.
+%
+% \bibitem{dvips}
+% \bibauthor{Rokicki, Tomas}.
+% \bibtitle{\command{dvips}}.
+% 2022,
+% \biburl{https://tug.org/texlive/Contents/live/texmf-dist/doc/dvips/dvips.pdf}.
+%
+% \bibitem{package:microtype}
+% \bibauthor{Schlicht, Robert}.
+% \bibtitle{Package~\packagename{microtype}}.
+% 2020,
+% \biburl{https://ctan.org/pkg/microtype}.
+%
+% \bibitem{schroeder:2007}
+% \bibauthor{Schr\"oder, Martin}.
+% \bibtitle{pdftex 1.40}.
+% 2007,
+% \biburl{https://tug.org/mail-archives/pdftex/2007-January/006910.html}.
+%
+% \bibitem{stamm:2020}
+% \bibauthor{Stamm, Philipp}.
+% \bibtitle{Schrifttypen -- Verstehen Kombinieren:
+% Schriftmischung als Reiz in der Typografie}.
+% Birkhäuser, Basel,
+% 2020.
+%
+% \bibitem{strizver:2014}
+% \bibauthor{Strizver, Ilene}.
+% \bibtitle{Type rules!: the designer's guide to professional typography},
+% 4\textsuperior{th}~ed.
+% John Wiley~\& Sons, Hoboken/NJ,
+% 2014.
+%
+% \bibitem{baskerville-pdftex-8-1:1998}
+% \bibauthor{Th\`anh, Han The}.
+% \bibtitle{The \pdfTeX{} user manual}.
+% Baskerville, 8(1), 9--14 (1998),
+% \biburl{http://uk-tug-archive.tug.org/wp-installed-content/uploads/2008/12/81.pdf}.
+%
+% \bibitem{pdftex}
+% \bibauthor{Th\`anh, Han The} et al.
+% \bibtitle{\pdfTeX}.
+% 2023,
+% \biburl{http://mirrors.ctan.org/systems/doc/pdftex/manual/pdftex-a.pdf}.
+% \end{thebibliography}
+% \end{RaggedRight}
+%
+%
+% \clearpage
+% \begin{RaggedRight}
+% \setcounter{IndexColumns}{2}
+% \setlength{\columnsep}{30pt}
+% \label{sec:index}
+% \phantomsection
+% \addcontentsline{toc}{section}{Index}
+% \PrintIndex
+% \end{RaggedRight}
+% }
+%
+%
+% \clearpage
+% \section{Package Code}\label{sec:package-code}
+% \addtocontents{toc}{\begingroup\small}
+% \addtocontents{toc}{\protect\begin{multicols}{2}}
+% \addtocontents{toc}{\protect\raggedcolumns}
+%
+% This is the \doublequotes{Reference Manual} section of the documentation
+% where we describe the package's code
+% and explain its implementation details.
+%
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{synthslant}
+ [2024/05/07 v0.1 Synthetically Slant glyphs]
+
+\RequirePackage{iftex}
+\RequirePackage{xkeyval}
+
+% \end{macrocode}
+%
+%
+% \subsection{Declaration of Default Slants}
+%
+% \begin{macro}{\synthslant}
+% Introduce a reasonable default for the slant. Let the user override it if she knows
+% better.
+%
+% Remember that the slant is not an angle (with respect to the \(y\)-axis), but the sine of
+% it; The value~\(.2\) approximately corresponds to a slant-angle of 12\textdegree\!.
+%
+% \begin{macrocode}
+\providecommand*{\synthslant}{.2}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\synthnegslant}
+% Also introduce a reasonable default for the negative slant, which is used for upright
+% italics.
+%
+% \begin{macrocode}
+\providecommand*{\synthnegslant}{-.2}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Selection of Slant-Engine}
+%
+% We provide several methods to slant glyphs. The actual slanting is delegated to a
+% \singlequotes{slant-engine} which shears the glyphs.
+%
+% \begin{macro}{\synthslant@engine}
+% Default to automatic selection of the slant engine.
+%
+% \begin{macrocode}
+\def\synthslant@engine{-1}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Expose default forward and backward slant values as package options.
+%
+% \begin{macrocode}
+\DeclareOptionX{slant}{%
+ \xdef\synthslant{\fpeval{#1}}%
+ \xdef\synthnegslant{\fpeval{-(#1)}}}
+\DeclareOptionX{negslant}{\xdef\synthnegslant{\fpeval{#1}}}
+\DeclareOptionX{posslant}{\xdef\synthslant{\fpeval{#1}}}
+
+% \end{macrocode}
+%
+% Make slant-engine selection configurable.
+%
+% \begin{macrocode}
+\DeclareOptionX{auto}{\def\synthslant@engine{-1}}
+\DeclareOptionX{PDF}{\def\synthslant@engine{0}}
+\DeclareOptionX{pdf}{\def\synthslant@engine{0}}
+\DeclareOptionX{l3draw}{\def\synthslant@engine{1}}
+\DeclareOptionX{ps}{\def\synthslant@engine{2}}
+\DeclareOptionX{PS}{\def\synthslant@engine{2}}
+\DeclareOptionX{tikz}{\def\synthslant@engine{3}}
+\DeclareOptionX{TikZ}{\def\synthslant@engine{3}}
+\DeclareOptionX{fontspec}{\def\synthslant@engine{4}}
+\DeclareOptionX{disable}{\def\synthslant@engine{10000}}
+
+\ProcessOptionsX\relax
+
+% \end{macrocode}
+%
+% Require sane parameter values.
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+\fp_compare:nNnTF {\synthslant} < {.0}
+ {\PackageError{synthslant}{\string\synthslant\space <\space 0}
+ {Pass\space a\space value\space that\space is\space non-negative.}}
+ {}
+\fp_compare:nNnTF {\synthnegslant} > {.0}
+ {\PackageError{synthslant}{\string\synthnegslant\space >\space 0}
+ {Pass\space a\space value\space that\space is\space non-positive.}}
+ {}
+\ExplSyntaxOff
+
+% \end{macrocode}
+%
+% Announce the positive and negative slant values now that we are sure they are ok. This may
+% be useful information if the user passed a (complicated) floating-point expression and wants
+% to know how \LaTeX{} did evaluate it.
+%
+% \begin{macrocode}
+\PackageInfo{synthslant}{\string\synthslant=\synthslant}
+\PackageInfo{synthslant}{\string\synthnegslant=\synthnegslant}
+
+
+% \end{macrocode}
+%
+%
+% \subsection{Slant Engines}
+%
+% The auto-selection code is pretty trivial. If we identify \pdfTeX{} running we select the
+% \acronym{PDF}-engine, for \LuaLaTeX{} we select the \packagename{fontspec}-engine, and in all
+% other cases we let the \packagename{l3draw}-layer handle the shearing.
+%
+% \begin{macrocode}
+\ifnum\synthslant@engine<0
+ \PackageInfo{synthslant}{auto-selecting slant engine}
+
+ \ifpdftex
+ \ifnum\pdfoutput>0
+ \def\synthslant@engine{0}
+ \else
+ \def\synthslant@engine{1}
+ \fi
+ \else
+ \ifluatex
+ \def\synthslant@engine{4}
+ \else
+ \def\synthslant@engine{1}
+ \fi
+ \fi
+\fi
+
+
+% \end{macrocode}
+%
+%
+% \begin{macro}{\synthslant@shear@box}
+% The various slant engine macros are all subsumed under \cs{synthslant@\-shear@\-box}. So
+% the higher-level code becomes (almost) engine independent.
+% \end{macro}
+%
+%
+% \begin{macro}{\synthslant@engine@name}
+% Sometimes we would like to recover the (printable) name of the selected slant engine.
+%
+% \begin{macrocode}
+\newcommand*{\synthslant@engine@name}{%
+ \ifcase\synthslant@engine
+ PDF%
+ \or% 1
+ l3draw%
+ \or% 2
+ PSTricks%
+ \or% 3
+ TikZ%
+ \or% 4
+ fontspec%
+ \else
+ null-implementation%
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{\acronym{PDF} Slant Engine}
+%
+% The \acronym{PDF}-engine works well and it is the best tested alternative.
+%
+% \begin{macrocode}
+\ifcase\synthslant@engine% 0: PDF
+ \PackageInfo{synthslant}{shearing done by PDF}
+
+ \newbox{\synthslant@box}
+
+% \end{macrocode}
+% \begin{macro}{\synthslant@pdf@shear@box}
+% \begin{macrocode}
+ \newcommand*{\synthslant@pdf@shear@box}[2]{%
+ \mbox{\sbox{\synthslant@box}{#2}%
+ \hskip\wd\synthslant@box
+ \pdfsave
+ \pdfsetmatrix{1 0 #1 1}%
+ \llap{\usebox{\synthslant@box}}%
+ \pdfrestore}%
+ }
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \let\synthslant@shear@box=\synthslant@pdf@shear@box
+% \end{macrocode}
+%
+%
+% \subsubsection{\packagename{l3draw} Slant Engine}
+%
+% Using \LaTeXIII{} may be like cheating on a very high level as the draw subsystem may
+% delegate to the \acronym{PDF}-engine itself. \acronym{LOL!}
+%
+% \begin{macrocode}
+\or% 1: LaTeX3 draw subsystem
+ \PackageInfo{synthslant}{shearing delegated to l3draw}
+
+ \RequirePackage{l3draw}
+
+ \ExplSyntaxOn
+% \end{macrocode}
+% \begin{macro}{\synthslant@latex@shear@box}
+% Slanting implemented with the experimental l3draw subsystem.
+%
+% \begin{anticipatedchange}
+% As soon as the l3kernel offers an x-shear operation (\cs{box\_xshear:Nn}?) we shall ditch
+% this implementation and switch to the one that is tailored to \emph{text} instead of the
+% current one for graphics.
+% \end{anticipatedchange}
+%
+% \begin{macrocode}
+ \NewDocumentCommand{\synthslant@latex@shear@box}{mm}{
+ \hbox_set:Nn \l_tmpa_box {#2}
+ \dim_set:Nn \l_tmpa_dim {\box_wd:N \l_tmpa_box}
+ \dim_set:Nn \l_tmpb_dim {\box_ht:N \l_tmpa_box}
+ \draw_begin:
+ \draw_transform_xslant:n {#1}
+% \end{macrocode}
+%
+% Force the baseline of the payload (\#2) to coincide with the baseline of the surrounding
+% text. This --~of course~-- screws up our bounding box at least vertically.
+%
+% \begin{macrocode}
+ \box_set_dp:Nn \l_tmpa_box {\z@}
+% \end{macrocode}
+%
+% Here comes a fudge because the l3draw bounding boxes are way too loose. For positive
+% slants: shrink the box-width by the box-height times~\meta{slant}. For negative slants:
+% shrink the box-width as for positive slants and in addition shift the payload to the left by
+% the box-height times~\meta{slant}.
+%
+% \begin{macrocode}
+ \fp_compare:nNnTF {#1} >= {.0}
+ {
+ \box_set_wd:Nn \l_tmpa_box {\l_tmpa_dim - #1\l_tmpb_dim}
+ }
+ {
+ \draw_suspend_begin:
+ \kern#1\l_tmpb_dim
+ \draw_suspend_end:
+ \box_set_wd:Nn \l_tmpa_box {\l_tmpa_dim + #1\l_tmpb_dim}
+ }
+% \end{macrocode}
+%
+% Now typeset the box.
+%
+% \begin{macrocode}
+ \draw_box_use:N \l_tmpa_box
+ \draw_end:
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \ExplSyntaxOff
+
+ \let\synthslant@shear@box=\synthslant@latex@shear@box
+% \end{macrocode}
+%
+%
+% \subsubsection{\pstrickslogo{} Slant Engine}
+%
+% Shearing via \pstrickslogo{} works, but exhibits a weird interface.
+%
+% \begin{macrocode}
+\or% 2: PSTricks
+ \PackageInfo{synthslant}
+ {shearing deferred to PostScript via PSTricks}
+
+ \RequirePackage{pst-3d}% \pstilt
+
+% \end{macrocode}
+%
+% Package~\packagename{pstricks} offers \cs{pstilt} and \cs{psTilt} both with typographically
+% sub-optimal outcomes.
+%
+% \begin{macro}{\synthslant@pstricks@shear@box}
+% \begin{macrocode}
+ \newcommand*{\synthslant@pstricks@shear@box}[2]{%
+ \pstilt{\fpeval{57.2958 * acos(#1)}}{#2}%
+ }
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \let\synthslant@shear@box=\synthslant@pstricks@shear@box
+% \end{macrocode}
+%
+%
+% \subsubsection{\tikzlogo{} Slant Engine}
+%
+% The \tikzlogo{} code has not been tested thoroughly yet, but it looks like it could work
+% after some tweaking.
+%
+% \begin{macrocode}
+\or% 3: TikZ
+ \PackageInfo{synthslant}{shearing by TikZ}
+
+ \RequirePackage{tikz}
+
+% \end{macrocode}
+% \begin{macro}{\synthslant@tikz@shear@box}
+% \begin{macrocode}
+ \newcommand*{\synthslant@tikz@shear@box}[2]{%
+ \tikz[baseline = (ANCHOR.base), xslant = #1]
+ \node[inner sep = 0pt, xslant = #1] (ANCHOR) {#2};
+ }
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \let\synthslant@shear@box=\synthslant@tikz@shear@box
+% \end{macrocode}
+%
+%
+% \subsubsection{\packagename{fontspec}}
+%
+% The \packagename{fontspec} works particularly well, but it does not jibe with \pdfTeX.
+%
+% \begin{macrocode}
+\or% 4: fontspec
+ \PackageInfo{synthslant}
+ {use fontspec's artificial font transformations}
+
+ \RequirePackage{fontspec}
+
+ \ExplSyntaxOn
+% \end{macrocode}
+% \begin{macro}{\synthslantbox@fontspect@shear@box}
+% \begin{macrocode}
+ \newcommand*{\synthslantbox@fontspect@shear@box}[2]{
+ \begingroup
+ \expandafter\fontspec[FakeSlant = #1]{\l_fontspec_family_tl}
+ #2
+ \endgroup
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \ExplSyntaxOff
+
+ \let\synthslant@shear@box=\synthslantbox@fontspect@shear@box
+% \end{macrocode}
+%
+%
+% \subsubsection{Null Implementation}
+%
+% The null implementation --~which does exactly what its name implies~-- can be useful for
+% debugging or to get rid of the effect temporarily.
+%
+% \begin{macrocode}
+\else% >=5: Null implementation
+ \PackageWarning{synthslant}{shearing disabled}
+
+% \end{macrocode}
+% \begin{macro}{\synthslant@identity@shear@box}
+% \begin{macrocode}
+ \newcommand*{\synthslant@identity@shear@box}[2]{#2}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \let\synthslant@shear@box=\synthslant@identity@shear@box
+\fi
+
+
+% \end{macrocode}
+%
+%
+% \subsection{Generic Slant Code}
+%
+% Here comes the engine-independent code.
+%
+% \begin{macro}{\synthslant@nolinebreak}
+% The \LaTeXIII{} and \tikzlogo{} engines break lines at \singlequotes{unexpected} points.
+% Here is a duct-tape solution for them that concretes together the adajacent parts.
+%
+% \begin{macrocode}
+\def\synthslant@nolinebreak{%
+ \ifnum\synthslant@engine=1% l3draw
+ \nolinebreak
+ \else
+ \ifnum\synthslant@engine=3% TikZ
+ \nolinebreak
+ \fi
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\synthslantbox@soft@hyphen}
+% Allow for line breaks at hyphenation opportunities~(\singlequotes{\cs{-}}).
+%
+% \begin{macrocode}
+\def\synthslantbox@soft@hyphen#1\-#2\relax{%
+ \synthslant@shear@box{\synthslant@slant@value}{#1}%
+ \ifx\relax#2%
+ \relax
+ \else
+ \synthslant@nolinebreak
+ \discretionary{-}{}{}%
+ \synthslantbox@soft@hyphen#2\relax
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\synthslantbox@hard@hyphen}
+% Allow for line breaks at embedded, explicit hyphens~(\singlequotes{-}).
+%
+% \begin{macrocode}
+\def\synthslantbox@hard@hyphen#1-#2\relax{%
+ \synthslantbox@soft@hyphen#1\-\relax
+ \ifx\relax#2%
+ \relax
+ \else
+ \synthslant@nolinebreak
+ \synthslant@shear@box{\synthslant@slant@value}{-}%
+ \synthslant@nolinebreak
+ \discretionary{}{}{}%
+ \synthslantbox@hard@hyphen#2\relax
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\synthslantbox@space}
+% Allow for line breaks at embedded spaces~(\singlequotes{\textvisiblespace}).
+%
+% \begin{macrocode}
+\def\synthslantbox@space#1 #2\relax{%
+ \synthslantbox@hard@hyphen#1-\relax
+ \ifx\relax#2%
+ \relax
+ \else
+ \space
+ \synthslantbox@space#2\relax
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\synthslantbox}
+% We define two completely different implementations depending on the request for
+% \packagename{fontspec} doing the slanting or any other package.
+%
+% Macro~1: Immediately call the \packagename{fontspec}-specific macro. Bypass the hierarchy
+% needed for the other slant engines.
+%
+% \begin{macrocode}
+\ifnum\synthslant@engine=4% fontspec
+ \newrobustcmd*{\synthslantbox}[2]{%
+ \edef\synthslant@slant@value{#1}% definition for compatibility of both branches
+ \synthslantbox@fontspect@shear@box{\synthslant@slant@value}{#2}%
+ }
+% \end{macrocode}
+%
+% Macro~2: This is the firestarter for the processing of all different kinds breakpoints
+% until we reach unbreakable chunks to be passed on to the selected slant engine.
+%
+% Normally, a user wants to call \cs{text\-synth\-slant} or
+% \cs{text\-synth\-up\-right\-italic}, however \LaTeX~wizards may have other ideas.
+%
+% \begin{macrocode}
+\else
+ \newrobustcmd*{\synthslantbox}[2]{%
+ \edef\synthslant@slant@value{#1}%
+ \expandafter\synthslantbox@space#2 \relax\relax
+ }
+\fi
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\synthslantbox@right@slant@correction}
+% This is a simple yet surprisingly effective heuristic for slant correction on the
+% right-hand side if the slanted text. The value~\cs{synthslant} is \(\sin \alpha\), where
+% \(\alpha\) is the slant angle; see \cref{equ:shear-transformation} on
+% \cpageref{equ:shear-transformation}. Multiplied with the ex-height of the current font,
+% \cs{fontdimen5}, this is a good approximation of the necessary slant correction.
+%
+% \begin{macrocode}
+\newcommand*{\synthslantbox@right@slant@correction}{%
+ \dimen0=\fontdimen5\font
+ \kern\synthslant\dimen0\relax
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\slantcontext}
+% If we have \packagename{microtype} support we enter the context defined by this macro in
+% |slantenvironment|.
+%
+% \begin{macrocode}
+\newcommand*{\slantcontext}{tracking=synthslant}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{slantenvironment}
+% We use this environment as a pair of hooks that are called right before and right after the
+% actual slanting code runs. The default sets up an upright type shape before and adds some
+% italic correction after slanting.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{slantenvironment}{}
+ {\upshape
+ \ifcsdef{microtypecontext}
+ {\expandafter\microtypecontext\expandafter{\slantcontext}}
+ {}}
+ {\ifcsdef{endmicrotypecontext}
+ {\endmicrotypecontext}
+ {}%
+ \synthslantbox@right@slant@correction}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\textsynthslant}
+% User-level macro to slant some text.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\textsynthslant}{m}
+ {\ifmmode
+ \synthslantbox{\synthslant}{#1}%
+ \else
+ {\slantenvironment
+ \synthslantbox{\synthslant}{#1}%
+ \endslantenvironment}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\synthslantbox@right@negslant@correction}
+% We could play the same trick here as in \cs{synthslantbox@right@slant@correction} and use
+% \cs{synthnegslant} instead of \cs{synthslant}. But my experiments show no need for a
+% correction. Anyhow, this macro may be convenient to override someday.
+%
+% \begin{macrocode}
+\newcommand*{\synthslantbox@right@negslant@correction}{}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\negslantcontext}
+% If we have \packagename{microtype} support we enter the context defined by this macro in
+% |negslantenvironment|.
+%
+% \begin{macrocode}
+\newcommand*{\negslantcontext}{tracking=synthnegslant}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{negslantenvironment}
+% We use this environment as a pair of hooks that are called right before and right after the
+% actual un-slanting code runs.
+%
+% The default sets up an italics shape before un-slanting and adds some negative italic
+% correction after un-slanting.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{negslantenvironment}{}
+ {\itshape
+ \ifcsdef{microtypecontext}
+ {\expandafter\microtypecontext\expandafter{\negslantcontext}}
+ {}}
+ {\ifcsdef{endmicrotypecontext}
+ {\endmicrotypecontext}
+ {}%
+ \synthslantbox@right@negslant@correction}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\textsynthuprightitalic}
+% User-level macro to un-slant some italics or oblique text.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\textsynthuprightitalic}{m}
+ {\ifmmode
+ \synthslantbox{\synthnegslant}{#1}%
+ \else
+ {\negslantenvironment
+ \synthslantbox{\synthnegslant}{#1}%
+ \endnegslantenvironment}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \iffalse
+%</package>
+% \fi
+%
+%
+% \addtocontents{toc}{\protect\end{multicols}}
+% \addtocontents{toc}{\endgroup}
+%
+%
+% \Finale
+%
+%
+%
+%
+% \iffalse
+% <DISABLE-SPELL-CHECK>
+%<*compare-with-the-gimp>
+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
+KJ8AAAAASUVORK5CYII=
+%</compare-with-the-gimp>
+% </DISABLE-SPELL-CHECK>
+% \fi
+%
+%
+% \iffalse
+%<*gauge>
+\documentclass[a4paper]{article}
+
+\usepackage{booktabs}
+\usepackage[tracking=alltext, letterspace=0, verbose]{microtype}
+\usepackage{multicol}
+\usepackage{parskip}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% Setup SyntSlant and Load Font
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\usepackage[]{synthslant}% auto/disable; fontspec/l3draw/pdf/ps/tikz
+%--\usepackage[fontspec, posslant = .16, negslant = -.14]{synthslant}
+
+%%
+%% All LaTeX Variants
+%%
+\usepackage[T1]{fontenc}
+%%--\usepackage{ebgaramond}\def\synthslant{.3}\def\synthnegslant{-.27}
+%%--\usepackage{librecaslon}\def\synthslant{.38}\def\synthnegslant{-.33}
+%%--\usepackage{merriweather}\def\synthslant{.14}\def\synthnegslant{-.12}
+\usepackage{mlmodern}\def\synthslant{.23}\def\synthnegslant{-.21}
+%%--\usepackage{spectral}\def\synthslant{.18}\def\synthnegslant{-.15}
+
+%%
+%% Requires e.g. LuaLaTeX
+%%
+%%--\usepackage{CharisSIL}% say: `make LATEX=lualatex gauge'
+
+%%
+%% Preload a reasonable font (triple?) if we work with fontspec
+%% and have not already done so, e.g., by saying `\usepackage{...}'.
+%%
+\ExplSyntaxOn
+\sys_if_engine_luatex:T
+ {
+ \cs_if_exist:NTF \l_fontspec_font
+ {}
+ {
+ \setmainfont{TeX Gyre Pagella}
+ \def\synthslant{.16}
+ \def\synthnegslant{-.14}
+ }
+ }
+\ExplSyntaxOff
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%
+%% End Setup/Load Font
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\renewcommand*{\arraystretch}{1.12}
+
+\newcommand*{\code}[1]{\texttt{#1}}
+
+\newcommand*{\cs}[1]{\texttt{\char`\\#1}}
+
+\newcommand*{\doublealphabet}
+ {ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789}
+\newcommand*{\doublealphabethyp}
+ {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\-%
+ 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\-%
+ 0\-1\-2\-3\-4\-5\-6\-7\-8\-9}
+
+\newcommand*{\fontsample}{aefgiv}
+\newcommand*{\FontSample}{White Handgloves}
+\newcommand*{\FONTSAMPLE}{H\AA{}MB\"URG\'EF\O{}\~N\v{S}}
+
+\newcommand*{\generictextfraction}[2]
+ {\mbox{\raisebox{.4em}[0pt]{\scriptsize #1}%
+ \hspace*{-.1em}\textfractionsolidus\hspace*{-.1em}%
+ \raisebox{-.1em}[0pt][0pt]{\scriptsize #2}}}
+
+\newcommand*{\longfontsample}{The quick brown fox jumps over the lazy dog.}
+
+\newcommand*{\measurewidth}[1]{\setbox0=\hbox{#1}\the\wd0\space}
+
+\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}}
+
+\newcommand*{\showbaseline}{\space\rule{.5em}{.4pt}\space}
+
+\newcommand*{\showboundingbox}[1]{
+ {\setlength{\fboxsep}{0pt}
+ \setlength{\fboxrule}{.4pt}
+ \framebox{#1}}
+}
+
+\let\slbox=\synthslantbox
+
+\makeatletter
+\newcommand*{\thewidthdiffof}[2]
+ {\setbox0=\hbox{#2}
+ \dimen0=\dimexpr\wd0 - #1\relax
+ \strip@pt\dimen0}
+\newcommand*{\thewidthof}[1]
+ {\setbox0=\hbox{#1}
+ \dimen0=\dimexpr\numexpr\dimexpr\wd0 * 10\relax/65536\relax pt / 10\relax
+ \strip@pt\dimen0}
+\makeatother
+
+
+\addtolength{\textheight}{\headheight}
+\addtolength{\textheight}{\headsep}
+\setlength{\headheight}{0pt}
+\setlength{\headsep}{0pt}
+
+\setlength{\overfullrule}{3pt}
+
+
+\pagestyle{plain}
+
+
+\begin{document}
+{\huge\sf\bfseries SyntSlant Calibration Sheet\par\bigskip}
+
+Selected slant engine: \makeatletter\synthslant@engine@name\makeatother.
+Font name: \fontname\font.
+
+
+\section{Shapes of Selected Font}
+
+\begin{center}
+ \begin{tabular}{@{}lllll@{}}
+ \toprule
+ Shape & Code Seq. & L.case & Mixed Case & Uppercase \\
+ \midrule
+ Normal &
+ \cs{normalfont} & {\normalfont\fontsample} & {\normalfont\FontSample} & {\normalfont\FONTSAMPLE} \\
+ Italics &
+ \cs{itshape} & {\itshape\fontsample} & {\itshape\FontSample} & {\itshape\FONTSAMPLE} \\
+ \bottomrule
+ \end{tabular}
+\end{center}
+
+
+\section{Slanted Samples}
+
+\begin{center}
+ \begin{tabular}{@{}llll@{}}
+ \toprule
+ Slant & L.case & Mixed Case & Uppercase \\
+ \midrule
+ .10 & \slbox{.10}{\fontsample} & \slbox{.10}{\FontSample} & \slbox{.10}{\FONTSAMPLE} \\
+ .11 & \slbox{.11}{\fontsample} & \slbox{.11}{\FontSample} & \slbox{.11}{\FONTSAMPLE} \\
+ .12 & \slbox{.12}{\fontsample} & \slbox{.12}{\FontSample} & \slbox{.12}{\FONTSAMPLE} \\
+ .13 & \slbox{.13}{\fontsample} & \slbox{.13}{\FontSample} & \slbox{.13}{\FONTSAMPLE} \\
+ .14 & \slbox{.14}{\fontsample} & \slbox{.14}{\FontSample} & \slbox{.14}{\FONTSAMPLE} \\
+ .15 & \slbox{.15}{\fontsample} & \slbox{.15}{\FontSample} & \slbox{.15}{\FONTSAMPLE} \\
+ .16 & \slbox{.16}{\fontsample} & \slbox{.16}{\FontSample} & \slbox{.16}{\FONTSAMPLE} \\
+ .17 & \slbox{.17}{\fontsample} & \slbox{.17}{\FontSample} & \slbox{.17}{\FONTSAMPLE} \\
+ .18 & \slbox{.18}{\fontsample} & \slbox{.18}{\FontSample} & \slbox{.18}{\FONTSAMPLE} \\
+ .19 & \slbox{.19}{\fontsample} & \slbox{.19}{\FontSample} & \slbox{.19}{\FONTSAMPLE} \\[.25em]
+ .20 & \slbox{.20}{\fontsample} & \slbox{.20}{\FontSample} & \slbox{.20}{\FONTSAMPLE} \\
+ .21 & \slbox{.21}{\fontsample} & \slbox{.21}{\FontSample} & \slbox{.21}{\FONTSAMPLE} \\
+ .22 & \slbox{.22}{\fontsample} & \slbox{.22}{\FontSample} & \slbox{.22}{\FONTSAMPLE} \\
+ .23 & \slbox{.23}{\fontsample} & \slbox{.23}{\FontSample} & \slbox{.23}{\FONTSAMPLE} \\
+ .24 & \slbox{.24}{\fontsample} & \slbox{.24}{\FontSample} & \slbox{.24}{\FONTSAMPLE} \\
+ .25 & \slbox{.25}{\fontsample} & \slbox{.25}{\FontSample} & \slbox{.25}{\FONTSAMPLE} \\
+ .26 & \slbox{.26}{\fontsample} & \slbox{.26}{\FontSample} & \slbox{.26}{\FONTSAMPLE} \\
+ .27 & \slbox{.27}{\fontsample} & \slbox{.27}{\FontSample} & \slbox{.27}{\FONTSAMPLE} \\
+ .28 & \slbox{.28}{\fontsample} & \slbox{.28}{\FontSample} & \slbox{.28}{\FONTSAMPLE} \\
+ .29 & \slbox{.29}{\fontsample} & \slbox{.29}{\FontSample} & \slbox{.29}{\FONTSAMPLE} \\[.25em]
+ .30 & \slbox{.30}{\fontsample} & \slbox{.30}{\FontSample} & \slbox{.30}{\FONTSAMPLE} \\
+ .31 & \slbox{.31}{\fontsample} & \slbox{.31}{\FontSample} & \slbox{.31}{\FONTSAMPLE} \\
+ .32 & \slbox{.32}{\fontsample} & \slbox{.32}{\FontSample} & \slbox{.32}{\FONTSAMPLE} \\
+ .33 & \slbox{.33}{\fontsample} & \slbox{.33}{\FontSample} & \slbox{.33}{\FONTSAMPLE} \\
+ .34 & \slbox{.34}{\fontsample} & \slbox{.34}{\FontSample} & \slbox{.34}{\FONTSAMPLE} \\
+ .35 & \slbox{.35}{\fontsample} & \slbox{.35}{\FontSample} & \slbox{.35}{\FONTSAMPLE} \\
+ .36 & \slbox{.36}{\fontsample} & \slbox{.36}{\FontSample} & \slbox{.36}{\FONTSAMPLE} \\
+ .37 & \slbox{.37}{\fontsample} & \slbox{.37}{\FontSample} & \slbox{.37}{\FONTSAMPLE} \\
+ .38 & \slbox{.38}{\fontsample} & \slbox{.38}{\FontSample} & \slbox{.38}{\FONTSAMPLE} \\
+ .39 & \slbox{.39}{\fontsample} & \slbox{.39}{\FontSample} & \slbox{.39}{\FONTSAMPLE} \\
+ \bottomrule
+ \end{tabular}
+\end{center}
+
+
+\clearpage
+\section{Examples}
+
+\let\r=\textrm
+\let\i=\textit
+\let\u=\textsynthuprightitalic
+\let\y=\textsynthslant
+
+The current slant values are
+\mbox{\cs{synthslant}\:=\:\synthslant} and
+\mbox{\cs{synthnegslant}\:=\:\synthnegslant}.
+
+
+\subsection{Copy}
+
+We mix different shapes to gauge the homogeneity of slant angles and
+overall gray values. Some overfull horizontal boxes are possible even with
+package~\packagename{microtype} being active.
+
+\setlength{\columnsep}{20pt}
+\begin{multicols}{2}\fussy
+ \setlength{\overfullrule}{3pt}
+ \paragraph{Roman/Italics.}\leavevmode
+
+ \r{Grumpy} \i{wizards} \r{make} \i{toxic} \r{brew} \i{for} \r{the} \i{evil} \r{Queen} \i{and} \r{Jack.}
+ \r{One} \i{morning,} \r{when} \i{Gregor} \r{Samsa} \i{woke} \r{from} \i{troubled} \r{dreams,}
+ \r{he} \i{found} \r{himself} \i{transformed} \r{in} \i{his} \r{bed} \i{into} \r{a} \i{horrible} \r{vermin.}
+ \r{He} \i{lay} \r{on} \i{his} \r{armour-like} \i{back,}
+ \r{and} \i{if} \r{he} \i{lifted} \i{his} \r{head}
+ \r{a} \i{little} \r{he} \i{could} \r{see} \i{his} \r{brown} \i{belly,}
+ \r{slightly} \i{domed} \r{and} \i{divided} \r{by} \i{arches} \r{into} \i{stiff} \r{sections.}
+ \r{The} \i{bedding} \r{was} \i{hardly} \r{able} \i{to}
+ \r{cover} \i{it} \r{and} \i{seemed} \r{ready} \i{to} \r{slide} \i{off} \r{any} \i{moment.}
+ \r{His} \i{many} \r{legs,}
+ \r{pitifully} \i{thin} \r{compared} \i{with} \r{the} \i{size} \r{of} \i{the} \r{rest} \i{of} \r{him,}
+ \r{waved} \i{about} \r{helplessly} \i{as} \r{he} \i{looked.}
+
+
+ \paragraph{Roman/Slanted Roman.}\leavevmode
+
+ \r{Grumpy} \y{wizards} \r{make} \y{toxic} \r{brew} \y{for} \r{the} \y{evil} \r{Queen} \y{and} \r{Jack.}
+ \r{One} \y{morn\-ing,} \r{when} \y{Gregor} \r{Samsa} \y{woke} \r{from} \y{trou\-bled} \r{dreams,}
+ \r{he} \y{found} \r{himself} \y{trans\-formed} \r{in} \y{his} \r{bed} \y{into} \r{a} \y{hor\-ri\-ble} \r{vermin.}
+ \r{He} \y{lay} \r{on} \y{his} \r{armour-like} \y{back,}
+ \r{and} \y{if} \r{he} \y{lifted} \y{his} \r{head}
+ \r{a} \y{little} \r{he} \y{could} \r{see} \y{his} \r{brown} \y{belly,}
+ \r{slightly} \y{domed} \r{and} \y{divided} \r{by} \y{arches} \r{into} \y{stiff} \r{sections.}
+ \r{The} \y{bedding} \r{was} \y{hardly} \r{able} \y{to}
+ \r{cover} \y{it} \r{and} \y{seemed} \r{ready} \y{to} \r{slide} \y{off} \r{any} \y{mo\-ment.}
+ \r{His} \y{many} \r{legs,}
+ \r{pitifully} \y{thin} \r{compared} \y{with} \r{the} \y{size} \r{of} \y{the} \r{rest} \y{of} \r{him,}
+ \r{waved} \y{about} \r{helplessly} \y{as} \r{he} \y{looked.}
+
+
+ \paragraph{Italics/Slanted Roman.}\leavevmode
+
+ \i{Grumpy} \y{wizards} \i{make} \y{toxic} \i{brew} \y{for} \i{the} \y{evil} \i{Queen} \y{and} \i{Jack.}
+ \i{One} \y{morn\-ing,} \i{when} \y{Gregor} \i{Samsa} \y{woke} \i{from} \y{trou\-bled} \i{dreams,}
+ \i{he} \y{found} \i{himself} \y{trans\-formed} \i{in} \y{his} \i{bed} \y{into} \i{a} \y{hor\-ri\-ble} \i{vermin.}
+ \i{He} \y{lay} \i{on} \y{his} \i{armour-like} \y{back,}
+ \i{and} \y{if} \i{he} \y{lifted} \y{his} \i{head}
+ \i{a} \y{little} \i{he} \y{could} \i{see} \y{his} \i{brown} \y{belly,}
+ \i{slightly} \y{domed} \i{and} \y{divided} \i{by} \y{arches} \i{into} \y{stiff} \i{sections.}
+ \i{The} \y{bedding} \i{was} \y{hardly} \i{able} \y{to}
+ \i{cover} \y{it} \i{and} \y{seemed} \i{ready} \y{to} \i{slide} \y{off} \i{any} \y{mo\-ment.}
+ \i{His} \y{many} \i{legs,}
+ \i{pitifully} \y{thin} \i{compared} \y{with} \i{the} \y{size} \i{of} \y{the} \i{rest} \y{of} \i{him,}
+ \i{waved} \y{about} \i{helplessly} \y{as} \i{he} \y{looked.}
+
+
+ \paragraph{Roman/Italics/Slanted Roman.}\leavevmode
+
+ \r{Grumpy} \i{wizards} \y{make} \r{toxic} \i{brew} \y{for} \r{the} \i{evil} \y{Queen} \r{and} \i{Jack.}
+ \r{One} \i{morning,} \y{when} \r{Gregor} \i{Samsa} \y{woke} \r{from} \i{troubled} \y{dreams,}
+ \r{he} \i{found} \y{him\-self} \r{transformed} \i{in} \y{his} \r{bed} \i{into} \r{a} \i{horrible} \y{ver\-min.}
+ \r{He} \i{lay} \y{on} \r{his} \i{armour-like} \y{back,}
+ \r{and} \i{if} \y{he} \r{lifted} \i{his} \y{head}
+ \r{a} \i{little} \y{he} \r{could} \i{see} \y{his} \r{brown} \i{belly,}
+ \r{slightly} \i{domed} \y{and} \r{divided} \i{by} \y{arches} \r{into} \i{stiff} \y{sec\-tions.}
+ \r{The} \i{bedding} \y{was} \r{hardly} \i{able} \y{to}
+ \r{cover} \i{it} \y{and} \r{seemed} \i{ready} \y{to} \r{slide} \i{off} \y{any} \r{moment.}
+ \r{His} \i{many} \y{legs,}
+ \r{pitifully} \i{thin} \y{compared} \r{with} \i{the} \y{size} \r{of} \i{the} \y{rest} \r{of} \i{him,}
+ \r{waved} \i{about} \y{helplessly} \r{as} \r{he} \y{looked.}
+
+
+ \paragraph{Roman/Upright Italics.}\leavevmode
+
+ \r{Grumpy} \u{wizards} \r{make} \u{toxic} \r{brew} \u{for} \r{the} \u{evil} \r{Queen} \u{and} \r{Jack.}
+ \r{One} \u{morn\-ing,} \r{when} \u{Gregor} \r{Samsa} \u{woke} \r{from} \u{trou\-bled} \r{dreams,}
+ \r{he} \u{found} \r{himself} \u{trans\-formed} \r{in} \u{his} \r{bed} \u{into} \r{a} \u{hor\-ri\-ble} \r{vermin.}
+ \r{He} \u{lay} \r{on} \u{his} \r{armour-like} \u{back,}
+ \r{and} \u{if} \r{he} \u{lifted} \u{his} \r{head}
+ \r{a} \u{little} \r{he} \u{could} \r{see} \u{his} \r{brown} \u{belly,}
+ \r{slightly} \u{domed} \r{and} \u{divided} \r{by} \u{arches} \r{into} \u{stiff} \r{sections.}
+ \r{The} \u{bedding} \r{was} \u{hardly} \r{able} \u{to}
+ \r{cover} \u{it} \r{and} \u{seemed} \r{ready} \u{to} \r{slide} \u{off} \r{any} \u{mo\-ment.}
+ \r{His} \u{many} \r{legs,}
+ \r{pitifully} \u{thin} \r{compared} \u{with} \r{the} \u{size} \r{of} \u{the} \r{rest} \u{of} \r{him,}
+ \r{waved} \u{about} \r{helplessly} \u{as} \r{he} \u{looked.}
+\end{multicols}
+
+
+\clearpage
+\subsection{Bounding Box}
+
+Thin lines indicate the baseline. All bounding boxes should be very tight. A little piercing
+into the box in the direction of the slant operation is acceptable.
+
+\begin{center}
+ \begin{tabular}{@{}l@{\showbaseline}l@{\showbaseline}l@{\showbaseline}}
+ \cs{textrm} &
+ \showboundingbox{\textrm{\fontsample}} &
+ \showboundingbox{\textrm{\FONTSAMPLE}} \\
+ \cs{textit} &
+ \showboundingbox{\textit{\fontsample}} &
+ \showboundingbox{\textit{\FONTSAMPLE}} \\
+ \cs{synthslantbox}\code{\{\synthslant\}} &
+ \showboundingbox{\synthslantbox{\synthslant}{\fontsample}} &
+ \showboundingbox{\synthslantbox{\synthslant}{\FONTSAMPLE}} \\
+ \cs{synthslantbox}\code{\{\synthnegslant\}} &
+ \showboundingbox{\synthslantbox{\synthnegslant}{\itshape\fontsample}} &
+ \showboundingbox{\synthslantbox{\synthnegslant}{\itshape\FONTSAMPLE}} \\
+ \cs{textsynthslant} &
+ \showboundingbox{\textsynthslant{\fontsample}} &
+ \showboundingbox{\textsynthslant{\FONTSAMPLE}} \\
+ \cs{textsynthuprightitalic} &
+ \showboundingbox{\textsynthuprightitalic{\fontsample}} &
+ \showboundingbox{\textsynthuprightitalic{\FONTSAMPLE}}
+ \end{tabular}
+\end{center}
+
+
+\subsection{Width Change with \cs{synthslantbox}?}
+
+Widths of the alphabet in uppercase and lowercase letter plus the digits. The ``hyp''~version
+contains discretionary hyphens (\cs{-}) between each of the letters or digits. The absolute
+value of all deltas should be much less than 3pt.
+
+\begin{center}
+ \newlength{\abcplain}\settowidth{\abcplain}{\doublealphabet}
+ \newlength{\abchyp}\settowidth{\abchyp}{\doublealphabethyp}
+ \begin{tabular}[t]{@{}lrll@{}}
+ \toprule
+ \cs{upshape} & Slant & Width & Delta \\
+ {} & & pt & pt \\
+ \midrule
+ ABC & --- & \thewidthof{\doublealphabet} & --- \\
+ ABC hyp & --- & \thewidthof{\doublealphabethyp} & --- \\
+ %
+ ABC & 0 &
+ \thewidthof{\synthslantbox{0}{\doublealphabet}} &
+ \thewidthdiffof{\abcplain}{\synthslantbox{0}{\doublealphabet}} \\
+ ABC hyp & 0
+ & \thewidthof{\synthslantbox{0}{\doublealphabethyp}} &
+ \thewidthdiffof{\abchyp}{\synthslantbox{0}{\doublealphabethyp}} \\
+ %
+ ABC & .1 &
+ \thewidthof{\synthslantbox{.1}{\doublealphabet}} &
+ \thewidthdiffof{\abcplain}{\synthslantbox{.1}{\doublealphabet}} \\
+ ABC hyp & .1 &
+ \thewidthof{\synthslantbox{.1}{\doublealphabethyp}} &
+ \thewidthdiffof{\abchyp}{\synthslantbox{.1}{\doublealphabethyp}} \\
+ %
+ ABC & .2 &
+ \thewidthof{\synthslantbox{.2}{\doublealphabet}} &
+ \thewidthdiffof{\abcplain}{\synthslantbox{.2}{\doublealphabet}} \\
+ ABC hyp & .2 &
+ \thewidthof{\synthslantbox{.2}{\doublealphabethyp}} &
+ \thewidthdiffof{\abchyp}{\synthslantbox{.2}{\doublealphabethyp}} \\
+ %
+ ABC & .3 &
+ \thewidthof{\synthslantbox{.3}{\doublealphabet}} &
+ \thewidthdiffof{\abcplain}{\synthslantbox{.3}{\doublealphabet}} \\
+ ABC hyp & .3 &
+ \thewidthof{\synthslantbox{.3}{\doublealphabethyp}} &
+ \thewidthdiffof{\abchyp}{\synthslantbox{.3}{\doublealphabethyp}} \\
+ \bottomrule
+ \end{tabular}
+ \qquad
+ \newlength{\abcplainitalics}\settowidth{\abcplainitalics}{\itshape\doublealphabet}
+ \newlength{\abchypitalics}\settowidth{\abchypitalics}{\itshape\doublealphabethyp}
+ \begin{tabular}[t]{@{}lrll@{}}
+ \toprule
+ \cs{itshape} & Slant & Width & Delta \\
+ {} & & pt & pt \\
+ \midrule
+ ABC & --- & \thewidthof{\itshape\doublealphabet} & --- \\
+ ABC hyp & --- & \thewidthof{\itshape\doublealphabethyp} & --- \\
+ %
+ ABC & 0 &
+ \thewidthof{\synthslantbox{0}{\itshape\doublealphabet}} &
+ \thewidthdiffof{\abcplainitalics}{\synthslantbox{0}{\itshape\doublealphabet}} \\
+ ABC hyp & 0 &
+ \thewidthof{\synthslantbox{0}{\itshape\doublealphabethyp}} &
+ \thewidthdiffof{\abchypitalics}{\synthslantbox{0}{\itshape\doublealphabethyp}} \\
+ %
+ ABC & -.1 &
+ \thewidthof{\synthslantbox{-.1}{\itshape\doublealphabet}} &
+ \thewidthdiffof{\abcplainitalics}{\synthslantbox{-.1}{\itshape\doublealphabet}} \\
+ ABC hyp & -.1 &
+ \thewidthof{\synthslantbox{-.1}{\itshape\doublealphabethyp}} &
+ \thewidthdiffof{\abchypitalics}{\synthslantbox{-.1}{\itshape\doublealphabethyp}} \\
+ %
+ ABC & -.2 &
+ \thewidthof{\synthslantbox{-.2}{\itshape\doublealphabet}} &
+ \thewidthdiffof{\abcplainitalics}{\synthslantbox{-.2}{\itshape\doublealphabet}} \\
+ ABC hyp & -.2 &
+ \thewidthof{\synthslantbox{-.2}{\itshape\doublealphabethyp}} &
+ \thewidthdiffof{\abchypitalics}{\synthslantbox{-.2}{\itshape\doublealphabethyp}} \\
+ %
+ ABC & -.3 &
+ \thewidthof{\synthslantbox{-.3}{\itshape\doublealphabet}} &
+ \thewidthdiffof{\abcplainitalics}{\synthslantbox{-.3}{\itshape\doublealphabet}} \\
+ ABC hyp & -.3 &
+ \thewidthof{\synthslantbox{-.3}{\itshape\doublealphabethyp}} &
+ \thewidthdiffof{\abchypitalics}{\synthslantbox{-.3}{\itshape\doublealphabethyp}} \\
+ \bottomrule
+ \end{tabular}
+\end{center}
+
+
+\subsection{Line-Breaking}
+
+Left: plain text, \\
+right: \code{\cs{textsynthslant}\{Show line-break\cs{-}ing in a sen\cs{-}tence.\}}
+
+\begin{center}
+ \setlength{\overfullrule}{0pt}
+ \begin{minipage}[t]{0pt}Show line-breaking with a sentence.\end{minipage}%
+ \hspace*{100pt}%
+ \begin{minipage}[t]{0pt}\textsynthslant{Show line-break\-ing in a sen\-tence.}\end{minipage}
+\end{center}
+
+
+\subsection{Microtype Enhancements}
+
+\ifdefined\SetTracking
+ Package \packagename{microtype} loaded.
+
+ Test different trackings in the \code{synthnegslant}~context.
+
+ \begin{center}
+ \setlength{\overfullrule}{0pt}
+ \newcommand*{\thinvrule}{\rule{.4pt}{.7em}}
+ \newcommand{\settracking}[2]
+ {\SetTracking[context=synthnegslant,
+ no ligatures={f},
+ outer kerning={0,0},
+ spacing={#2*,,}]
+ {encoding=*, shape=it}
+ {#1}}
+ \newcommand*{\smallextratracking}{20}
+ \newcommand*{\smallextraspacing}{150}
+ \newcommand*{\bigextratracking}{250}
+ \newcommand*{\bigextraspacing}{300}
+ \begin{tabular}{@{}rrll@{}}
+ \toprule
+ Tracking &
+ Spacing &
+ \raisebox{-.5\normalbaselineskip}[0pt][0pt]{Sample} &
+ \raisebox{-.5\normalbaselineskip}[0pt][0pt]{Example sentence} \\
+ {\small\generictextfraction{1}{1000}}\:em & {\small\generictextfraction{dim}{1000}} & & \\
+ \midrule
+ 0 & 0 &
+ \settracking{0}{0}\thinvrule\textsynthuprightitalic{\fontsample}\thinvrule &
+ \settracking{0}{0}\thinvrule\textsynthuprightitalic{\longfontsample}\thinvrule \\
+ \smallextratracking & \smallextraspacing &
+ \settracking{\smallextratracking}{\smallextraspacing}%
+ \thinvrule\textsynthuprightitalic{\fontsample}\thinvrule &
+ \settracking{\smallextratracking}{\smallextraspacing}%
+ \thinvrule\textsynthuprightitalic{\longfontsample}\thinvrule \\
+ \bigextratracking & \bigextraspacing &
+ \settracking{\bigextratracking}{\bigextraspacing}%
+ \thinvrule\textsynthuprightitalic{\fontsample}\thinvrule &
+ \settracking{\bigextratracking}{\bigextraspacing}%
+ \thinvrule\textsynthuprightitalic{\longfontsample}\thinvrule \\
+ \bottomrule
+ \end{tabular}
+ \settracking{0}{0}% reset extra tracking
+ \end{center}
+
+ \noindent All samples are tightly bracketed by thin horizontal rules
+ to reveal possible outer spacing problems.
+\else
+ Package \packagename{microtype} not loaded.
+ No Microtype effects to show.
+\fi
+\end{document}
+%</gauge>
+% \fi
+%
+%
+%
+\endinput
+%
+%
+%
+%%% Local Variables:
+%%% compile-command: "latex synthslant.dtx"
+%%% fill-column: 96
+%%% End:
diff --git a/macros/latex/contrib/synthslant/synthslant.ins b/macros/latex/contrib/synthslant/synthslant.ins
new file mode 100644
index 0000000000..845b4378b1
--- /dev/null
+++ b/macros/latex/contrib/synthslant/synthslant.ins
@@ -0,0 +1,67 @@
+%% Copyright (C) 2024 by Ch. L. Spiel
+%%
+%% 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.
+
+
+\input docstrip
+
+
+\keepsilent
+\askforoverwritefalse
+
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2024 by Ch. L. Spiel
+
+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'.
+
+The Current Maintainer of this work is Ch. L. Spiel.
+
+This work consists of the files synthslant.dtx and synthslant.ins
+and the derived files synthslant.sty, synthslant-gauge.tex,
+shear-transform.mp, and title.mp.
+
+
+\endpreamble
+
+
+\edef\source{\jobname.dtx}
+
+\generate{\file{synthslant.sty}{\from{\source}{package}}
+ \file{synthslant-gauge.tex}{\from{\source}{gauge}}
+ \file{synthslant.ist}{\from{\source}{index-style}}}
+
+
+\nopostamble
+\generate{\file{title.mp}{\from{\source}{title}}}
+\generate{\file{shear-transform.mp}{\from{\source}{shear-transform}}}
+
+
+\nopreamble
+\generate{\file{compare-with-the-gimp.png.base64}{\from{\source}{compare-with-the-gimp}}}
+
+
+\endbatchfile
+
+
+%% Local Variables:
+%% compile-command: "latex synthslant.ins"
+%% mode: latex
+%% End:
diff --git a/macros/latex/contrib/tblr-extras/README.md b/macros/latex/contrib/tblr-extras/README.md
index 4c7dc3ce22..373fedb6a1 100644
--- a/macros/latex/contrib/tblr-extras/README.md
+++ b/macros/latex/contrib/tblr-extras/README.md
@@ -7,12 +7,12 @@ license or (at your option) any later version. The latest version
of this license is in
http://www.latex-project.org/lppl.txt
# Usage
-Just use \usepackage{tblr-extras} after loading tabularray.
-Activate the libraries using \UseTblrLibrary command
+Just use `\usepackage{tblr-extras}` after loading tabularray.
+Activate the libraries using `\UseTblrLibrary` command.
## Caption Library
Use caption package to typeset tabularray tall and long tabulars captions.
-Enable this library with \UseTblrLibrary{caption}
+Enable this library with `\UseTblrLibrary{caption}`
## Babel Library
-Translate contfoot and conthead to current babel language.
-Curremtle only supports ngerman, french and spanish translations.
-Enable this library with \UseTblrLibrary{babel} \ No newline at end of file
+Translate `contfoot` and `conthead` to current `babel`/`polyglossia` language.
+Currently only supports ngerman, french, spanish, russian and ukrainian translations.
+Enable this library with `\UseTblrLibrary{babel}`
diff --git a/macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.pdf b/macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.pdf
index 5f1292e5c7..9262427895 100644
--- a/macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.pdf
+++ b/macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.pdf
Binary files differ
diff --git a/macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.tex b/macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.tex
index f15a58f8c4..308c0e232a 100644
--- a/macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.tex
+++ b/macros/latex/contrib/tblr-extras/tblr-extras-doc-EN.tex
@@ -1,6 +1,6 @@
% -----------------------------------------------------------------------
%%% tblr-extras-doc: Documentation for tblr-extras package.
-%%% Version : 1.0 - 2024-02-10
+%%% Version : 1.1 - 2024-05-13
%%% Copyright : 2024 (c) Manuel E. Merino <manuel.merino.pe@gmail.com>
%%% License : The LaTeX Project Public License 1.3c
% -----------------------------------------------------------------------
@@ -31,7 +31,7 @@
\usepackage{parskip}
\usepackage[hidelinks]{hyperref}
-\newcommand{\Version}{1.0}
+\newcommand{\Version}{1.1}
\NewDocumentCommand{\tblrextras}{}{\textbf{\color{udep}tblr-extras}}
@@ -40,7 +40,7 @@
\centering
\LARGE\textbf{Package \color{udep}tblr-extras}\par
\large Manuel E. Merino\par
- \texttt{v\Version{} - 10/02/2024}\par
+ \texttt{v\Version{} - 13/06/2024}\par
\normalsize Extra libraries for tabularray package.\par
\endgroup
\tableofcontents
@@ -68,7 +68,7 @@
The \tblrextras{} package redefines the \texttt{conthead-text} and \textbf{contfoot-text} for the \texttt{longtblr} environment, using the current babel language.
- Currently only spanish, ngerman and english variants are supported.
+ Currently only spanish, ngerman, russian, ukrainian and french variants are supported.
\section{Bug reports and suggestions}
@@ -78,6 +78,17 @@
The \tblrextras{} package and all its included files are licensed under the LPPL v1.3c or later.
+ \section{Changelog}
+
+ v1.1 - Thanks sgolovan.
+ \begin{itemize}
+ \item Improved the babel library using language hooks.
+ \item Added support for polyglossia package.
+ \item Added ukrainian and russian translations.
+ \end{itemize}
+
+ v1.0 - Initial release.
+
\vfill
\centering
\footnotesize \tblrextras{} -- {\copyright} 2024 Manuel E. Merino. Licensed under LPPL v1.3c.
diff --git a/macros/latex/contrib/tblr-extras/tblr-extras.sty b/macros/latex/contrib/tblr-extras/tblr-extras.sty
index 09cd5ce16c..a6742f4a10 100644
--- a/macros/latex/contrib/tblr-extras/tblr-extras.sty
+++ b/macros/latex/contrib/tblr-extras/tblr-extras.sty
@@ -1,6 +1,6 @@
% -----------------------------------------------------------------------
%%% tblr-extras: Extra libraries for tabularray package.
-%%% Version : 1.0 - 2024-02-10
+%%% Version : 1.1 - 2024-05-13
%%% Copyright : 2024 (c) Manuel E. Merino <manuel.merino.pe@gmail.com>
%%% License : The LaTeX Project Public License 1.3c
% -----------------------------------------------------------------------
@@ -18,7 +18,7 @@
% The Current Maintainer of this work is Manuel E. Merino
% -----------------------------------------------------------------------
\NeedsTeXFormat{LaTeX2e}[2018-04-01]
-\ProvidesPackage{tblr-extras}[2024/02/06 package tblr-extras]
+\ProvidesPackage{tblr-extras}[2024/05/13 package tblr-extras]
\RequirePackage{tabularray}
%% ----------------------------------------------------------------------
%% TblrLibrary caption - Use caption package to typeset tabularray tall
@@ -34,7 +34,7 @@
%% Check if a KomaClass is loaded and issue a warning for caption position setup
\@ifundefined{KOMAClassName}
{}
- {\PackageWarningNoLine{tblr-extras}{KOMAScript class detected. Setup caption position using 'captions=<option>'}}
+ {\PackageWarningNoLine{tblr-extras}{KOMAScript class detected. Setup caption position using 'captions=option'}}
\SetTblrOuter[talltblr,longtblr]{headsep=0pt}
\DefTblrTemplate{firsthead}{default}{%
\addtocounter{table}{-1}%
@@ -54,21 +54,72 @@
\SetTblrTemplate{caption-lot}{empty}
}
%% ----------------------------------------------------------------------
-%% TblrLibrary babel - Translate contfoot and conthead to current babel
-%% language. Supports: ngerman, french and spanish translations.
+%% TblrLibrary babel - Translate contfoot and conthead to current babel/polyglossia
+%% language. Supports: ngerman, french, spanish, russian and ukrainian translations.
+%% Check engine
+\newif\if@unicode@engine
+\ifdefined\luatexversion
+ \@unicode@enginetrue
+\else\ifdefined\XeTeXrevision
+ \@unicode@enginetrue
+\fi\fi
\NewTblrLibrary{babel}
{%
- \RequirePackage{babel,iflang}
- \IfLanguagePatterns{spanish}{%
- \DefTblrTemplate{contfoot-text}{default}{Continúa en la página siguiente}
- \DefTblrTemplate{conthead-text}{default}{(Continuación)}
- }{}
- \IfLanguagePatterns{ngerman}{%
- \DefTblrTemplate{contfoot-text}{default}{Fortsetzung auf der nächsten Seite}
- \DefTblrTemplate{conthead-text}{default}{(Fortsetzung)}
- }{}
- \IfLanguagePatterns{french}{%
- \DefTblrTemplate{contfoot-text}{default}{Suite à la page suivante}
- \DefTblrTemplate{conthead-text}{default}{(Suite)}
- }{}
+ \AddToHook{begindocument/before}{%
+ \@ifpackageloaded{babel}{}{%
+ \@ifpackageloaded{polyglossia}{}{%
+ \RequirePackage{babel}
+ }
+ }
+ \ifdefined\captionsspanish
+ \addto\captionsspanish{%
+ \DefTblrTemplate{contfoot-text}{default}{Continúa en la página siguiente}%
+ \DefTblrTemplate{conthead-text}{default}{(Continuación)}%
+ }
+ \fi
+ \ifdefined\captionsngerman
+ \addto\captionsngerman{%
+ \DefTblrTemplate{contfoot-text}{default}{Fortsetzung auf der nächsten Seite}%
+ \DefTblrTemplate{conthead-text}{default}{(Fortsetzung)}%
+ }
+ \fi
+ \ifdefined\captionsgerman
+ \addto\captionsgerman{%
+ \DefTblrTemplate{contfoot-text}{default}{Fortsetzung auf der nächsten Seite}%
+ \DefTblrTemplate{conthead-text}{default}{(Fortsetzung)}%
+ }
+ \fi
+ \ifdefined\captionsfrench
+ \addto\captionsfrench{%
+ \DefTblrTemplate{contfoot-text}{default}{Suite à la page suivante}%
+ \DefTblrTemplate{conthead-text}{default}{(Suite)}%
+ }
+ \fi
+ \ifdefined\captionsrussian
+ \if@unicode@engine
+ \addto\captionsrussian{%
+ \DefTblrTemplate{contfoot-text}{default}{Продолжение на следующей странице}%
+ \DefTblrTemplate{conthead-text}{default}{(продолжение)}%
+ }
+ \else
+ \addto\captionsrussian{%
+ \DefTblrTemplate{contfoot-text}{default}{\cyr\CYRP\cyrr\cyro\cyrd\cyro\cyrl\cyrzh\cyre\cyrn\cyri\cyre\ \cyrn\cyra\ \cyrs\cyrl\cyre\cyrd\cyru\cyryu\cyrshch\cyre\cyrishrt\ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \DefTblrTemplate{conthead-text}{default}{(\cyr\cyrp\cyrr\cyro\cyrd\cyro\cyrl\cyrzh\cyre\cyrn\cyri\cyre)}%
+ }
+ \fi
+ \fi
+ \ifdefined\captionsukrainian
+ \if@unicode@engine
+ \addto\captionsukrainian{%
+ \DefTblrTemplate{contfoot-text}{default}{Продовження на наступній сторінці}%
+ \DefTblrTemplate{conthead-text}{default}{(продовження)}%
+ }
+ \else
+ \addto\captionsukrainian{%
+ \DefTblrTemplate{contfoot-text}{default}{\cyr\CYRP\cyrr\cyro\cyrd\cyro\cyrv\cyrzh\cyre\cyrn\cyrn\cyrya\ \cyrn\cyra\ \cyrn\cyra\cyrs\cyrt\cyru\cyrp\cyrn\cyrii\cyrishrt\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
+ \DefTblrTemplate{conthead-text}{default}{(\cyr\cyrp\cyrr\cyro\cyrd\cyro\cyrv\cyrzh\cyre\cyrn\cyrn\cyrya)}%
+ }
+ \fi
+ \fi
+ }
}
diff --git a/macros/latex/contrib/thuthesis/CHANGELOG.md b/macros/latex/contrib/thuthesis/CHANGELOG.md
index 9864c944bc..fb293105fc 100644
--- a/macros/latex/contrib/thuthesis/CHANGELOG.md
+++ b/macros/latex/contrib/thuthesis/CHANGELOG.md
@@ -6,6 +6,17 @@
## [Unreleased]
+## [v7.5.1] - 2024-05-20
+
+### Changed
+
+- 更新 `student-id` 选项的处理逻辑,非 `proposal` 类型默认忽略,并增加警告([#945](https://github.com/tuna/thuthesis/issues/945))。
+
+### Fixed
+
+- 修复参考文献 URL 中带有 DOI 时,重复打印 DOI 的问题([#952](https://github.com/tuna/thuthesis/discussions/952))。
+- 修复文档中的部分错别字。
+
## [v7.5.0] - 2024-03-29
### Added
@@ -977,7 +988,8 @@
-[Unreleased]: https://github.com/tuna/thuthesis/compare/v7.5.0...HEAD
+[Unreleased]: https://github.com/tuna/thuthesis/compare/v7.5.1...HEAD
+[v7.5.1]: https://github.com/tuna/thuthesis/compare/v7.5.0...v7.5.1
[v7.5.0]: https://github.com/tuna/thuthesis/compare/v7.4.0...v7.5.0
[v7.4.0]: https://github.com/tuna/thuthesis/compare/v7.3.2...v7.4.0
[v7.3.2]: https://github.com/tuna/thuthesis/compare/v7.3.1...v7.3.2
diff --git a/macros/latex/contrib/thuthesis/thuthesis-author-year.bst b/macros/latex/contrib/thuthesis/thuthesis-author-year.bst
index 9a46a4e461..03d02861f4 100644
--- a/macros/latex/contrib/thuthesis/thuthesis-author-year.bst
+++ b/macros/latex/contrib/thuthesis/thuthesis-author-year.bst
@@ -1314,7 +1314,7 @@ FUNCTION {extract.after.slash}
FUNCTION {format.year}
{ year empty$ not
- { year extract.before.slash extra.label * }
+ { year extra.label * }
{ date empty$ not
{ date extract.before.dash extra.label * }
{ entry.is.electronic not
@@ -1494,7 +1494,7 @@ FUNCTION {format.periodical.year.volume.number}
FUNCTION {check.url}
{ url empty$ not
- { "\url{" url * "}" * 'entry.url :=
+ { url 'entry.url :=
#1 'entry.is.electronic :=
}
{ howpublished empty$ not
@@ -1525,7 +1525,11 @@ FUNCTION {output.url}
{ show.url is.pure.electronic or
entry.url empty$ not and
{ new.block
- entry.url output
+ entry.url #1 #5 substring$ "\url{" =
+ { entry.url }
+ { "\url{" entry.url * "}" * }
+ if$
+ output
}
'skip$
if$
@@ -1545,8 +1549,8 @@ FUNCTION {is.in.url}
{ entry.url empty$
{ #0 }
{ s text.length$ 'len :=
- entry.url text.length$ 'charptr :=
- { entry.url charptr len substring$ s = not
+ entry.url "l" change.case$ text.length$ 'charptr :=
+ { entry.url "l" change.case$ charptr len substring$ s "l" change.case$ = not
charptr #0 >
and
}
@@ -2073,7 +2077,7 @@ FUNCTION {map}
FUNCTION {manual} { monograph }
-FUNCTION {thesis}
+FUNCTION {mastersthesis}
{ "D" set.entry.mark
monograph
}
@@ -2088,9 +2092,7 @@ FUNCTION {online}
electronic
}
-FUNCTION {mastersthesis} { thesis }
-
-FUNCTION {phdthesis} { thesis }
+FUNCTION {phdthesis} { mastersthesis }
FUNCTION {proceedings}
{ "C" set.entry.mark
@@ -2107,13 +2109,11 @@ FUNCTION {standard}
misc
}
-FUNCTION {report}
+FUNCTION {techreport}
{ "R" set.entry.mark
misc
}
-FUNCTION {techreport} { report }
-
FUNCTION {unpublished} { misc }
FUNCTION {default.type} { misc }
diff --git a/macros/latex/contrib/thuthesis/thuthesis-bachelor.bst b/macros/latex/contrib/thuthesis/thuthesis-bachelor.bst
index 67e1f7eeb3..aea8c151bf 100644
--- a/macros/latex/contrib/thuthesis/thuthesis-bachelor.bst
+++ b/macros/latex/contrib/thuthesis/thuthesis-bachelor.bst
@@ -1304,7 +1304,7 @@ FUNCTION {extract.after.slash}
FUNCTION {format.year}
{ year empty$ not
- { year extract.before.slash extra.label * }
+ { year extra.label * }
{ date empty$ not
{ date extract.before.dash extra.label * }
{ entry.is.electronic not
@@ -1484,7 +1484,7 @@ FUNCTION {format.periodical.year.volume.number}
FUNCTION {check.url}
{ url empty$ not
- { "\url{" url * "}" * 'entry.url :=
+ { url 'entry.url :=
#1 'entry.is.electronic :=
}
{ howpublished empty$ not
@@ -1515,7 +1515,11 @@ FUNCTION {output.url}
{ show.url is.pure.electronic or
entry.url empty$ not and
{ new.block
- entry.url output
+ entry.url #1 #5 substring$ "\url{" =
+ { entry.url }
+ { "\url{" entry.url * "}" * }
+ if$
+ output
}
'skip$
if$
@@ -1535,8 +1539,8 @@ FUNCTION {is.in.url}
{ entry.url empty$
{ #0 }
{ s text.length$ 'len :=
- entry.url text.length$ 'charptr :=
- { entry.url charptr len substring$ s = not
+ entry.url "l" change.case$ text.length$ 'charptr :=
+ { entry.url "l" change.case$ charptr len substring$ s "l" change.case$ = not
charptr #0 >
and
}
@@ -2063,7 +2067,7 @@ FUNCTION {map}
FUNCTION {manual} { monograph }
-FUNCTION {thesis}
+FUNCTION {mastersthesis}
{ "D" set.entry.mark
monograph
}
@@ -2078,9 +2082,7 @@ FUNCTION {online}
electronic
}
-FUNCTION {mastersthesis} { thesis }
-
-FUNCTION {phdthesis} { thesis }
+FUNCTION {phdthesis} { mastersthesis }
FUNCTION {proceedings}
{ "C" set.entry.mark
@@ -2097,13 +2099,11 @@ FUNCTION {standard}
misc
}
-FUNCTION {report}
+FUNCTION {techreport}
{ "R" set.entry.mark
misc
}
-FUNCTION {techreport} { report }
-
FUNCTION {unpublished} { misc }
FUNCTION {default.type} { misc }
diff --git a/macros/latex/contrib/thuthesis/thuthesis-example.pdf b/macros/latex/contrib/thuthesis/thuthesis-example.pdf
index 1a4d6b72b0..2c48ce2ef5 100644
--- a/macros/latex/contrib/thuthesis/thuthesis-example.pdf
+++ b/macros/latex/contrib/thuthesis/thuthesis-example.pdf
Binary files differ
diff --git a/macros/latex/contrib/thuthesis/thuthesis-numeric.bst b/macros/latex/contrib/thuthesis/thuthesis-numeric.bst
index b27da61efc..6d24c4465e 100644
--- a/macros/latex/contrib/thuthesis/thuthesis-numeric.bst
+++ b/macros/latex/contrib/thuthesis/thuthesis-numeric.bst
@@ -1304,7 +1304,7 @@ FUNCTION {extract.after.slash}
FUNCTION {format.year}
{ year empty$ not
- { year extract.before.slash extra.label * }
+ { year extra.label * }
{ date empty$ not
{ date extract.before.dash extra.label * }
{ entry.is.electronic not
@@ -1484,7 +1484,7 @@ FUNCTION {format.periodical.year.volume.number}
FUNCTION {check.url}
{ url empty$ not
- { "\url{" url * "}" * 'entry.url :=
+ { url 'entry.url :=
#1 'entry.is.electronic :=
}
{ howpublished empty$ not
@@ -1515,7 +1515,11 @@ FUNCTION {output.url}
{ show.url is.pure.electronic or
entry.url empty$ not and
{ new.block
- entry.url output
+ entry.url #1 #5 substring$ "\url{" =
+ { entry.url }
+ { "\url{" entry.url * "}" * }
+ if$
+ output
}
'skip$
if$
@@ -1535,8 +1539,8 @@ FUNCTION {is.in.url}
{ entry.url empty$
{ #0 }
{ s text.length$ 'len :=
- entry.url text.length$ 'charptr :=
- { entry.url charptr len substring$ s = not
+ entry.url "l" change.case$ text.length$ 'charptr :=
+ { entry.url "l" change.case$ charptr len substring$ s "l" change.case$ = not
charptr #0 >
and
}
@@ -2063,7 +2067,7 @@ FUNCTION {map}
FUNCTION {manual} { monograph }
-FUNCTION {thesis}
+FUNCTION {mastersthesis}
{ "D" set.entry.mark
monograph
}
@@ -2078,9 +2082,7 @@ FUNCTION {online}
electronic
}
-FUNCTION {mastersthesis} { thesis }
-
-FUNCTION {phdthesis} { thesis }
+FUNCTION {phdthesis} { mastersthesis }
FUNCTION {proceedings}
{ "C" set.entry.mark
@@ -2097,13 +2099,11 @@ FUNCTION {standard}
misc
}
-FUNCTION {report}
+FUNCTION {techreport}
{ "R" set.entry.mark
misc
}
-FUNCTION {techreport} { report }
-
FUNCTION {unpublished} { misc }
FUNCTION {default.type} { misc }
diff --git a/macros/latex/contrib/thuthesis/thuthesis.dtx b/macros/latex/contrib/thuthesis/thuthesis.dtx
index 6e25d0cdfb..ea4ac03f22 100644
--- a/macros/latex/contrib/thuthesis/thuthesis.dtx
+++ b/macros/latex/contrib/thuthesis/thuthesis.dtx
@@ -14,7 +14,7 @@
%
% \iffalse
%<*driver>
-\ProvidesFile{thuthesis.dtx}[2024/03/29 7.5.0 Tsinghua University Thesis Template]
+\ProvidesFile{thuthesis.dtx}[2024/05/20 7.5.1 Tsinghua University Thesis Template]
\documentclass{ltxdoc}
\usepackage{dtx-style}
@@ -1243,8 +1243,8 @@
% include-spine = true,
% }
% \end{latex}
-% 打开此选项后,书籍会出现在中文封面后面的第一个空白页。如果有英文封面,则在英文封面之前。
-% 如果需要书籍出现在其他位置,请手工使用 \cs{spine} 生成,不要使用此选项。
+% 打开此选项后,书脊会出现在中文封面后面的第一个空白页。如果有英文封面,则在英文封面之前。
+% 如果需要书脊出现在其他位置,请手工使用 \cs{spine} 生成,不要使用此选项。
%
% \section{致谢}
% \label{sec:thanks}
@@ -1269,7 +1269,7 @@
% \begin{macrocode}
%<cls>\NeedsTeXFormat{LaTeX2e}[2017/04/15]
%<cls>\ProvidesClass{thuthesis}
-%<cls>[2024/03/29 7.5.0 Tsinghua University Thesis Template]
+%<cls>[2024/05/20 7.5.1 Tsinghua University Thesis Template]
% \end{macrocode}
%
% 报错
@@ -1330,7 +1330,7 @@
%<*cls>
\hyphenation{Thu-Thesis}
\def\thuthesis{ThuThesis}
-\def\version{7.5.0}
+\def\version{7.5.1}
\RequirePackage{kvdefinekeys}
\RequirePackage{kvsetkeys}
\RequirePackage{kvoptions}
@@ -4584,14 +4584,15 @@
\restoregeometry
}
\newcommand\thu@set@student@id{%
- \ifthu@thesis@type@proposal
- \ifx\thu@student@id\@empty
- \thusetup{student-id=2000310000}%
+ \ifthu@thesis@type@proposal\else
+ \ifx\thu@student@id\@empty\else
+ \thu@warning{`student-id' in "\protect\thusetup" would be ignored when `thesis-type' is not proposal.}%
\fi
\fi
}
\thu@set@student@id
\thu@option@hook{thesis-type}{\thu@set@student@id}
+\thu@option@hook{student-id}{\thu@set@student@id}
% \end{macrocode}
%
% 涉密信息
@@ -4656,7 +4657,13 @@
\thu@info@item{工程领域}{}{\thu@engineering@field}%
\thu@info@item{申请人}{\thu@name@title}{\thu@author}%
\fi
- \thu@info@item{学号}{}{\thu@student@id}%
+ \ifthu@thesis@type@proposal
+ \ifx\thu@student@id\@empty
+ \thu@warning{Missing option `student-id' in "\protect\thusetup", ID will not appear on cover.}
+ \else
+ \thu@info@item{学号}{}{\thu@student@id}%
+ \fi
+ \fi
\thu@info@item{指导教师}{\thu@name@title}{\thu@supervisor}%
\thu@info@item{副指导教师}{\thu@name@title}{\thu@associate@supervisor}%
\thu@info@item{联合指导教师}{\thu@name@title}{\thu@co@supervisor}%
diff --git a/macros/latex/contrib/thuthesis/thuthesis.pdf b/macros/latex/contrib/thuthesis/thuthesis.pdf
index 9f55312fdd..daa32de045 100644
--- a/macros/latex/contrib/thuthesis/thuthesis.pdf
+++ b/macros/latex/contrib/thuthesis/thuthesis.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-elements/README.md b/macros/latex/contrib/tkz/tkz-elements/README.md
index 1f2043e435..a4d8d90fad 100644
--- a/macros/latex/contrib/tkz/tkz-elements/README.md
+++ b/macros/latex/contrib/tkz/tkz-elements/README.md
@@ -1,12 +1,12 @@
# tkz-elements — for euclidean geometry
-Release 2.20c 2024/03/26
+Release 2.25c 2024/04/28
## Description
-`tkz-elements v.2.20c` is the new version of a library written in lua, allowing to make all the necessary calculations to define the objects of a Euclidean geometry figure. You need to compile with `LuaLaTeX`. With `tkz-elements`, the definitions and calculations are only done with `Lua`.
+`tkz-elements v.2.25c` is the new version of a library written in lua, allowing to make all the necessary calculations to define the objects of a Euclidean geometry figure. You need to compile with `LuaLaTeX`. With `tkz-elements`, the definitions and calculations are only done with `Lua`.
- The main possibility of programmation proposed is oriented "object programming" with object classes like point, line, triangle, circle and ellipse. For the moment, once the calculations are done, it is `tkz-euclide` or `TikZ` which allows the drawings.
+ The main possibility of programmation proposed is oriented "object programming" with object classes like point, line, triangle, circle and ellipse. For the moment, once the calculations are done, it is `tkz-euclide` or `TikZ` which allows the drawings. You can use the option `mini` with `tkz-euclide` to load only the modules required for tracing.
## Licence
@@ -39,7 +39,9 @@ To use the package `tkz-elements`, place the following lines in the preamble of
your LaTeX document:
```
-\usepackage{tkz-euclide,tkz-elements}
+% !TEX TS-program = lualatex
+\usepackage[mini]{tkz-euclide}
+\usepackage{tkz-elements}
\begin{document}
\begin{tkzelements}
your code
@@ -60,27 +62,32 @@ An important example `Golden Arbelos` using the package is on the site. All the
are on the site.
## History
+ - version 2.25c
+ - French documentation at my site: [http://altermundus.fr](http://altermundus.fr)
+ - Added `colinear_at` a new method for the classe `line`
+ - Added `cevian`, `pedal`, `conway_circle`, `conway_points` new methods to the class `triangle`.
+
- version 2.20c
- - Package:
- - Added class matrix; methods are mainly of order 2, sometimes of order 3.
- - Added function solve_quadratic. This function can be used to solve second-degree equations with real or complex numbers.
- - Added method print for the class point. Example z.A : print ()
- - Correction of the macro tkzDN. I deleted a spurious space
- - Modification of vector class attributes. Attributes h and t become head and tail.
- - The mtx attribute is introduced for point and vector.
- z.A.mtx represents the column matrix whose coefficients are the point's coordinates. Same for vectors.
- - Documentation:
- - Rewriting of all texts
- - Correction of example: pentagon
- - Documentation about matrices
+ - Package:
+ - Added class matrix; methods are mainly of order 2, sometimes of order 3.
+ - Added function solve_quadratic. This function can be used to solve second-degree equations with real or complex numbers.
+ - Added method print for the class point. Example z.A : print ()
+ - Correction of the macro tkzDN. I deleted a spurious space
+ - Modification of vector class attributes. Attributes h and t become head and tail.
+ - The mtx attribute is introduced for point and vector.
+ z.A.mtx represents the column matrix whose coefficients are the point's coordinates. Same for vectors.
+ - Documentation:
+ - Rewriting of all texts
+ - Correction of example: pentagon
+ - Documentation about matrices
- version 2.00c
- - class development “vector”
- - added attribute “vec”
- - added “at” and “orthogonal” methods to the class “point”
+ - class development `vector`
+ - added attribute `vec`
+ - added `at` and `orthogonal` methods to the class `point`
- rewriting the function angle\_normalize\_
- - modification of the slope attribute for the “line”, now the result is normalized.
+ - modification of the slope attribute for the `line`, now the result is normalized.
- the angles of a triangle are also normalized
- added function format\_number(number,decimal) sets the number of digits in the decimal part.
- added \tkzDN a macro pour formater les nombres dans la partie TikZ
@@ -115,7 +122,7 @@ are on the site.
- method trilinear (to use trilinear coordinates)
- method barycentric (to use barycentric coordinates)
- Added some functions
- - bisector (a,b,c) altitude (a,b,c) bisector_ext(a,b,c) equilateral (a,b) midpoint (a,b) to avoid creating unnecessary objects.
+ - `bisector (a,b,c)` `altitude (a,b,c)` `bisector_ext(a,b,c)` `equilateral (a,b)` `midpoint (a,b)` to avoid creating unnecessary objects.
- Added new examples and a cheat sheet in the documentation
@@ -133,72 +140,55 @@ are on the site.
- version 1.60c
- added Internal and external tangents common to two circles:
- - function circle : `external_tangent`(C)
- - function circle : `internal_tangent(C)
+ - function circle : `external_tangent(C)`
+ - function circle : `internal_tangent(C)`
- radical_center and radical_circle are also valid for two circles
- - function `radical_center` (C1,C2,C3)
- - function `radical_circle` (C1,C2,C3)
- - function `circles_position` (C1,C2)
- - function `midcircle` (C1,C2) powerful tool for working with inversions
+ - function `radical_center (C1,C2,C3)`
+ - function `radical_circle (C1,C2,C3)`
+ - function `circles_position (C1,C2)`
+ - function `midcircle (C1,C2)` powerful tool for working with inversions
- Bug corrected in midarc now use get_angle instead of get_angle_
- Modification of a triangle attribute `ca` replaces `ac` to designate the line passing through the third and first points
- - The center of symmetry of a parallelogram is named "center" instead of "i".
+ - The center of symmetry of a parallelogram is named "center" instead of `i`.
- Correction documentation
- Correction of examples using the circle:point (k) method, where k is now a real number rather than an angle.
- version 1.50c Correction of the documentation
- - Added "swap" option to create triangles from the "line" object.
- - "iscyclic" is a new method to know if a quadrilateral is inscribable in a circle.
- - Added function "diameter" to create a circle.
- - Added function "swap" to swap two points.
- - Correction method "gold" of object rectangle.
- - Correction method "in_circle_" of object triangle.
- - Correction method "incentral_tr_" of object triangle.
- - Added method "soddy_center" of object triangle.
- - Added option "swap" for method "square" of object line.
- - Added method "report" for object line. Transfer a defined length from a point
- - Added option "swap" to the function "square : side"
+ - Added `swap` option to create triangles from the "line" object.
+ - `iscyclic` is a new method to know if a quadrilateral is inscribable in a circle.
+ - Added function `diameter` to create a circle.
+ - Added function `swap` to swap two points.
+ - Correction method `gold` of object rectangle.
+ - Correction method `in_circle_` of object triangle.
+ - Correction method `incentral_tr_` of object triangle.
+ - Added method `soddy_center` of object triangle.
+ - Added option `swap` for method `square` of object line.
+ - Added method `report` for object line. Transfer a defined length from a point
+ - Added option `swap` to the function "square : side"
- Version 1.40c Restructuring objects
- New version for all transformations. Now, they accept all objects as parameters.
-
- Symmetry_axial has changed its name to reflection.
-
- Added scale to north south etc.. (point object).
-
- Change the "point" method of the objects circle and ellipse. now the parameter is un real t (between 0 and 1) and not an angle
-
- Added the method `check_equilateral` to know if a triangle is equilateral.
-
-
- Added option "indirect" to the method equilateral for a line object.
-
- Correction of the documentation. (Added sections).
-
-
-
-
+ - New version for all transformations. Now, they accept all objects as parameters.
+ - Symmetry_axial has changed its name to reflection.
+ - Added scale to north south etc.. (point object).
+ - Change the "point" method of the objects circle and ellipse. now the parameter is un real t (between 0 and 1) and not an angle
+ - Added the method `check_equilateral` to know if a triangle is equilateral.
+ - Added option "indirect" to the method equilateral for a line object.
+ - Correction of the documentation. (Added sections).
+
- Version 1.20 Memory management: tables are emptied when the tkzelements environment is opened.
- `set_lua_to_tex` has been replaced by `tkzUseLua` to transfer data between the `tkzelements` and `tikzpicture` environments.
-
- New version of `inversion` with respect to a circle method. It selects the correct algorithm based on the object passed as a parameter.
-
- Added an `in_out_disk` method for the `circle` object, which indicates whether or not a point is in the disk. `in_out` is for the circle.
-
- Added two methods: `radical_center (C1,C2,C3)` radical center of three circles.
- `radical_circle (C1,C2,C3)` orthogonal circle of three circles.
-
- Added function `circle : radius` to define a circle with a centre and a radius.
-
- Added methods `normalize` and `normalize_inv` for `line`.
-
- Added methods `translation` and `set_translation` to the `line` object.
-
- Added an example to illustrate combinations of methods and attributes.
+ - `set_lua_to_tex` has been replaced by `tkzUseLua` to transfer data between the `tkzelements` and `tikzpicture` environments.
+ - New version of `inversion` with respect to a circle method. It selects the correct algorithm based on the object passed as a parameter.
+ - Added an `in_out_disk` method for the `circle` object, which indicates whether or not a point is in the disk. `in_out` is for the circle.
+ - Added two methods: `radical_center (C1,C2,C3)` radical center of three circles.
+ `radical_circle (C1,C2,C3)` orthogonal circle of three circles.
+ - Added function `circle : radius` to define a circle with a centre and a radius.
+ - Added methods `normalize` and `normalize_inv` for `line`.
+ - Added methods `translation` and `set_translation` to the `line` object.
+ - Added an example to illustrate combinations of methods and attributes.
- First version 1.00b
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-circle.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-circle.tex
index f84c58d941..7ae96c7ada 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-circle.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-circle.tex
@@ -121,9 +121,9 @@ Three attributes are used (south, west, radius).
\midrule
\textbf{Circles}& &\\
\midrule
-\Imeth{circle}{orthogonal\_from (pt)} & |C = C.OA: orthogonal_from (z.P)| & Refer to (\ref{ssub:altshiller} ; \ref{sub:common_tangent_orthogonality} ; \ref{sub:orthogonal_circles_v1} ; \ref{sub:pencil_v1}) \\
-\Imeth{circle}{orthogonal\_through (pta,ptb)} & |C = C.OA: orthogonal_through (z.z1,z.z2)| & Refer to (\ref{sub:orthogonal_circle_through})\\
-\Imeth{circle}{inversion (...)} & | C.AC: inversion (pt, pts, L or C )|& Refer to \ref{ssub:inversion}, \ref{ssub:inversion_point}, \ref{ssub:inversion_line}, \ref{ssub:inversion_circle}\\
+\Imeth{circle}{orthogonal\_from (pt)} &|C=C.OA:orthogonal_from (z.P)| & Refer to (\ref{ssub:altshiller} ; \ref{sub:common_tangent_orthogonality} ; \ref{sub:orthogonal_circles_v1} ; \ref{sub:pencil_v1}) \\
+\Imeth{circle}{orthogonal\_through (pta,ptb)}&|C=C.OA:orthogonal_through (z.z1,z.z2)| & Refer to (\ref{sub:orthogonal_circle_through})\\
+\Imeth{circle}{inversion (...)} &|C.AC:inversion (pt, pts, L or C)|& Refer to \ref{ssub:inversion}, \ref{ssub:inversion_point}, \ref{ssub:inversion_line}, \ref{ssub:inversion_circle}\\
\Imeth{circle}{midcircle (C)} & |C.inv = C.OA: midcircle (C.EF)| & Refer to \ref{ssub:midcircle} \\
\Imeth{circle}{radical\_circle (C1<,C2>)} & or only (C1) & Refer to \ref{sub:radical_circle}\\
\midrule
@@ -208,7 +208,7 @@ Three attributes are used (south, west, radius).
\begin{minipage}{.5\textwidth}
\begin{Verbatim}
\begin{tkzelements}
- scale = 1.6
+ scale = 1.25
z.A = point: new (1,0)
z.B = point: new (5,2)
z.C = point: new (1.2,2)
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-ellipse.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-ellipse.tex
index 5ea44a57b7..3146f73461 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-ellipse.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-ellipse.tex
@@ -56,23 +56,6 @@ The first attributes are the three points that define the ellipse: : the \Iattr
z.Co = E.covertex
z.Ve = E.vertex
\end{tkzelements}
-\begin{tikzpicture}
- \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
- \tkzGetNodes
- \tkzDrawCircles[teal](C,A)
- \tkzDrawEllipse[red](C,\tkzUseLua{a},\tkzUseLua{b},
- \tkzUseLua{slope})
- \tkzDrawPoints(C,A,B,b,W,S,F1,F2)
- \tkzLabelPoints(C,A,B)
- \tkzDrawLine[add = .5 and .5](A,W)
- \tkzLabelSegment[pos=1.5,above,sloped](A,W){%
- slope = \pgfmathprintnumber{\tkzUseLua{slope}}}
- \tkzLabelPoint[below](S){South}
- \tkzLabelPoint[below left](F1){Focus 1}
- \tkzLabelPoint[below left](F2){Focus 2}
- \tkzLabelPoint[above right](Ve){Vertex ; East}
- \tkzLabelPoint[above right](Co){Covertex ; North}
-\end{tikzpicture}
\end{Verbatim}
\end{minipage}
\begin{minipage}{.5\textwidth}
@@ -96,9 +79,8 @@ The first attributes are the three points that define the ellipse: : the \Iattr
z.Co = E.covertex
z.Ve = E.vertex
\end{tkzelements}
- \hspace*{\fill}
\begin{tikzpicture}
- \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
+\pgfkeys{/pgf/number format/.cd,fixed,precision=2}
\tkzGetNodes
\tkzDrawCircles[teal](C,A)
\tkzDrawEllipse[red](C,\tkzUseLua{a},\tkzUseLua{b},\tkzUseLua{slope})
@@ -113,6 +95,28 @@ The first attributes are the three points that define the ellipse: : the \Iattr
\tkzLabelPoint[above right](Co){Covertex ; North}
\end{tikzpicture}
\end{minipage}
+
+\begin{Verbatim}
+\begin{tikzpicture}
+ \pgfkeys{/pgf/number format/.cd,fixed,precision=2}
+ \tkzGetNodes
+ \tkzDrawCircles[teal](C,A)
+ \tkzDrawEllipse[red](C,\tkzUseLua{a},\tkzUseLua{b},
+ \tkzUseLua{slope})
+ \tkzDrawPoints(C,A,B,b,W,S,F1,F2)
+ \tkzLabelPoints(C,A,B)
+ \tkzDrawLine[add = .5 and .5](A,W)
+ \tkzLabelSegment[pos=1.5,above,sloped](A,W){%
+ slope = \pgfmathprintnumber{\tkzUseLua{slope}}}
+ \tkzLabelPoint[below](S){South}
+ \tkzLabelPoint[below left](F1){Focus 1}
+ \tkzLabelPoint[below left](F2){Focus 2}
+ \tkzLabelPoint[above right](Ve){Vertex ; East}
+ \tkzLabelPoint[above right](Co){Covertex ; North}
+\end{tikzpicture}
+\end{Verbatim}
+
+
% \caption{Class Ellipse}
% subsection attributes_of_an_ellipse (end)
@@ -202,46 +206,7 @@ The function \Igfct{package}{tkzUseLua (variable)} is used to transfer values to
The first two points are the foci of the ellipse, and the third one is the vertex. We can deduce all the other characteristics from these points.
\emph{The function launches the |new| method, defining all the characteristics of the ellipse.}
-\begin{tkzelements}
- scale =1
- z.A = point: new (0 , 0)
- z.B = point: new (5 , 1)
- L.AB = line : new (z.A,z.B)
- z.C = point: new (.8 , 3)
- T.ABC = triangle: new (z.A,z.B,z.C)
- z.N = T.ABC.eulercenter
- z.H = T.ABC.orthocenter
- z.O = T.ABC.circumcenter
- _,_,z.Mc = get_points (T.ABC: medial ())
- L.euler = line: new (z.H,z.O)
- C.circum = circle: new (z.O,z.A)
- C.euler = circle: new (z.N,z.Mc)
- z.i,z.j = intersection (L.euler,C.circum)
- z.I,z.J = intersection (L.euler,C.euler)
- E = ellipse: foci (z.H,z.O,z.I)
- L.AH = line: new (z.A,z.H)
- z.X = intersection (L.AH,C.circum)
- L.XO = line: new (z.X,z.O)
- z.R,z.S = intersection (L.XO,E)
- a,b = E.Rx,E.Ry
- ang = math.deg(E.slope)
-\end{tkzelements}
-\hspace*{\fill}
-\begin{tikzpicture}
-\tkzGetNodes
-\tkzDrawPolygon(A,B,C)
-\tkzDrawCircles[cyan](O,A N,I)
-\tkzDrawSegments(X,R A,X)
-\tkzDrawEllipse[red](N,\tkzUseLua{a},\tkzUseLua{b},\tkzUseLua{ang})
-\tkzDrawLines[add=.2 and .5](I,H)
-\tkzDrawPoints(A,B,C,N,O,X,H,R,S,I)
-\tkzLabelPoints[above](C,X)
-\tkzLabelPoints[above right](N,O)
-\tkzLabelPoints[above left](R)
-\tkzLabelPoints[left](A)
-\tkzLabelPoints[right](B,I,S,H)
-\end{tikzpicture}
-\hspace*{\fill}
+\begin{minipage}{.5\textwidth}
\begin{Verbatim}
\begin{tkzelements}
z.A = point: new (0 , 0)
@@ -267,6 +232,50 @@ The first two points are the foci of the ellipse, and the third one is the verte
ang = math.deg(E.slope)
\end{tkzelements}
\end{Verbatim}
+\end{minipage}
+\begin{minipage}{.5\textwidth}
+ \begin{tkzelements}
+ scale =1
+ z.A = point: new (0 , 0)
+ z.B = point: new (5 , 1)
+ L.AB = line : new (z.A,z.B)
+ z.C = point: new (.8 , 3)
+ T.ABC = triangle: new (z.A,z.B,z.C)
+ z.N = T.ABC.eulercenter
+ z.H = T.ABC.orthocenter
+ z.O = T.ABC.circumcenter
+ _,_,z.Mc = get_points (T.ABC: medial ())
+ L.euler = line: new (z.H,z.O)
+ C.circum = circle: new (z.O,z.A)
+ C.euler = circle: new (z.N,z.Mc)
+ z.i,z.j = intersection (L.euler,C.circum)
+ z.I,z.J = intersection (L.euler,C.euler)
+ E = ellipse: foci (z.H,z.O,z.I)
+ L.AH = line: new (z.A,z.H)
+ z.X = intersection (L.AH,C.circum)
+ L.XO = line: new (z.X,z.O)
+ z.R,z.S = intersection (L.XO,E)
+ a,b = E.Rx,E.Ry
+ ang = math.deg(E.slope)
+ \end{tkzelements}
+ \hspace*{\fill}
+ \begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawPolygon(A,B,C)
+ \tkzDrawCircles[cyan](O,A N,I)
+ \tkzDrawSegments(X,R A,X)
+ \tkzDrawEllipse[red](N,\tkzUseLua{a},\tkzUseLua{b},\tkzUseLua{ang})
+ \tkzDrawLines[add=.2 and .5](I,H)
+ \tkzDrawPoints(A,B,C,N,O,X,H,R,S,I)
+ \tkzLabelPoints[above](C,X)
+ \tkzLabelPoints[above right](N,O)
+ \tkzLabelPoints[above left](R)
+ \tkzLabelPoints[left](A)
+ \tkzLabelPoints[right](B,I,S,H)
+ \end{tikzpicture}
+ \hspace*{\fill}
+\end{minipage}
+
\begin{Verbatim}
\begin{tikzpicture}
\tkzGetNodes
@@ -283,11 +292,7 @@ The first two points are the foci of the ellipse, and the third one is the verte
\tkzLabelPoints[left](A)
\tkzLabelPoints[right](B,I,S,H)
\end{tikzpicture}
-\end{Verbatim}
-
-
-
-
+ \end{Verbatim}
% subsubsection function_tkzname_ellipse__foci (end)
\subsubsection{Method \Imeth{ellipse}{point} and \Imeth{ellipse}{radii}} % (fold)
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-line.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-line.tex
index 741938eb66..435ad9bcc6 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-line.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-line.tex
@@ -181,6 +181,7 @@ Here's the list of methods for the \tkzNameObj{line} object. The results can be
\Imeth{line}{\_north\_pb(d)} &|z.M=L.AB:_north_pb(2)| &|BM=2|; $BM\perp BA$ ; $\overrightarrow{BA},\overrightarrow{BM}$ clockwise \\
\Imeth{line}{\_south\_pb(d)} &|z.M=L.AB:_south_pb(2)| &|BM=2|; $BM\perp BA$ ; $\overrightarrow{AB},\overrightarrow{AM}$ counterclockwise \\
\Imeth{line}{report(d,pt)} &|z.M=L.AB:report(2,z.N)| &|MN=2|; $AB\parallel MN$ ; Refer to ex. (\ref{ssub:method_report})\\
+\Imeth{line}{colinear\_at(pt,k)} &|z.D=L.AB:colinear_at(z.C,2)| &|CD=2AB|; $AB\parallel CD$ ; Refer to ex. (\ref{ssub:method_imeth_line_colinear__at})\\
\midrule
\textbf{Lines} &&\\
\midrule
@@ -229,7 +230,7 @@ Here's the list of methods for the \tkzNameObj{line} object. The results can be
\midrule
\Imeth{line}{circle ()} & |C.AB = L.AB : circle ()| & center pa through pb \\
\Imeth{line}{circle\_swap ()} & |C.BA = L.AB : circle_swap ()|& center pb through pa \\
-\Imeth{line}{apollonius (r)} & |C.apo = L.AB : apollonius (2)|& Ensemble des points tq. |MA/MB = 2| \\
+\Imeth{line}{apollonius (r)} & |C.apo = L.AB : apollonius (2)|& Set of points tq. |MA/MB = 2| \\
\midrule
\textbf{Transformations} &&\\
\midrule
@@ -248,7 +249,7 @@ Here's the list of methods for the \tkzNameObj{line} object. The results can be
\egroup
\end{minipage}
-\subsubsection{Method report} % (fold)
+\subsubsection{Method \Imeth{line}{report}} % (fold)
\label{ssub:method_report}
|report (d,pt)| If the point is absent, the transfer is made from the first point that defines the line.
@@ -289,7 +290,7 @@ z.O = L.AB : report (3)
\end{minipage}
% subsubsection method_report (end)
-\subsubsection{Triangle with two\_angles} % (fold)
+\subsubsection{Method \Imeth{line}{two\_angles} } % (fold)
\label{ssub:triangle_with_two__angles}
The angles are on either side of the given segment
@@ -332,7 +333,7 @@ The angles are on either side of the given segment
\end{minipage}
% subsubsection triangle_with_two__angles (end)
-\subsubsection{Triangle with three given sides} % (fold)
+\subsubsection{Method \Imeth{line}{sss}} % (fold)
\label{ssub:triangle_with_three_given_sides}
In the following example, a small difficulty arises. The given lengths are not affected by scaling, so it's necessary to use the \Igfct{math}{value (r) } function, which will modify the lengths according to the scale.
@@ -498,7 +499,7 @@ The side lengths are proportional to the lengths given in the table. They depend
\end{minipage}
% subsubsection about_triangles (end)
-\subsubsection{Method point }% (fold)
+\subsubsection{Method \Imeth{line}{point} }% (fold)
\label{ssub:method_point}
This method is very useful. It allows you to place a point on the line under consideration.
If |r = 0| then the point is |pa|, if |r = 1| it's |pb|.
@@ -544,9 +545,50 @@ This method exists for all objects except quadrilaterals.
\end{minipage}
% subsubsection method_point (end)
-\subsubsection{Normalize} % (fold)
-\label{ssub:normalize}
+\subsubsection{Method \Imeth{line}{colinear\_at}} % (fold)
+\label{ssub:method_imeth_line_colinear__at}
+If the coefficient is missing then it defaults to $1$ and in the following example we obtain: $CE=AB$ and $(AB)\parallel (CE)$. For point $D$: $CD = .5AB$ and $(AB)\parallel (CD)$.
+\begin{minipage}{.5\textwidth}
+\begin{Verbatim}
+\begin{tkzelements}
+ z.A = point: new (0 , 0)
+ z.B = point: new (4 , 0)
+ z.C = point: new (1 , 3)
+ L.AB = line : new (z.A,z.B)
+ z.D = L.AB : colinear_at (z.C,.5)
+ z.E = L.AB : colinear_at (z.C)
+\end{tkzelements}
+\begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawSegments(A,B C,E)
+ \tkzDrawPoints(A,B,C,D,E)
+ \tkzLabelPoints(A,B,C,D,E)
+\end{tikzpicture}
+\end{Verbatim}
+\end{minipage}
+\begin{minipage}{.5\textwidth}
+\begin{tkzelements}
+ z.A = point: new (0 , 0)
+ z.B = point: new (4 , 0)
+ z.C = point: new (1 , 3)
+ L.AB = line : new (z.A,z.B)
+ z.D = L.AB : colinear_at (z.C,.5)
+ z.E = L.AB : colinear_at (z.C)
+\end{tkzelements}
+\begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawSegments(A,B C,E)
+ \tkzDrawPoints(A,B,C,D,E)
+ \tkzLabelPoints(A,B,C,D,E)
+\end{tikzpicture}
+\end{minipage}
+
+% subsubsection method_imeth_line_colinear__at (end)
+
+
+\subsubsection{Method \Imeth{line}{normalize}} % (fold)
+\label{ssub:normalize}
\begin{minipage}{.4\textwidth}
\begin{Verbatim}
@@ -586,7 +628,7 @@ This method exists for all objects except quadrilaterals.
% subsubsection normalize (end)
-\subsubsection{Barycenter with a line} % (fold)
+\subsubsection{Method \Imeth{line}{barycenter}} % (fold)
\label{ssub:barycenter_with_a_line}
\begin{minipage}{.4\textwidth}
@@ -621,7 +663,7 @@ This method exists for all objects except quadrilaterals.
\end{minipage}
% subsubsection barycenter_with_a_line (end)
-\subsubsection{Example: new line from a defined line} % (fold)
+\subsubsection{method \Imeth{line}{ll\_from}} % (fold)
\label{ssub:new_line_from_a_defined_line}
\begin{minipage}{0.5\textwidth}
\begin{Verbatim}
@@ -673,7 +715,7 @@ _,z.E = get_points ( L.CD: ll_from (z.B))
% subsubsection new_line_from_a_defined_line (end)
-\subsubsection{Example: projection of several points} % (fold)
+\subsubsection{Method \Imeth{line}{projection}} % (fold)
\label{ssub:example_projection_of_several_points}
\begin{minipage}{0.5\textwidth}
\begin{Verbatim}
@@ -788,7 +830,7 @@ z.a,z.b = L.ab.pa,L.ab.pb
% subsubsection example_combination_of_methods (end)
-\subsubsection{Example: translation} % (fold)
+\subsubsection{Method \Imeth{line}{translation}} % (fold)
\label{ssub:example_translation}
\begin{minipage}{0.6\textwidth}
@@ -830,7 +872,7 @@ z.a,z.b = L.ab.pa,L.ab.pb
% subsubsection example_translation (end)
-\subsubsection{Example: distance and projection} % (fold)
+\subsubsection{Method \Imeth{line}{distance}} % (fold)
\label{ssub:example_distance_and_projection}
\begin{minipage}{0.5\textwidth}
@@ -876,7 +918,7 @@ z.a,z.b = L.ab.pa,L.ab.pb
% \caption{Method distance with line object}
% subsubsection example_distance_and_projection (end)
-\subsubsection{Reflection of object} % (fold)
+\subsubsection{Method \Imeth{line}{reflection} of an object} % (fold)
\label{ssub:reflection_of_object}
\begin{minipage}{.5\textwidth}
@@ -924,7 +966,7 @@ z.a,z.b = L.ab.pa,L.ab.pb
% subsubsection reflection_of_object (end)
-\subsection{Apollonius circle MA/MB = k} % (fold)
+\subsection{Method \Imeth{line}{apollonius} Apollonius circle MA/MB = k} % (fold)
\label{sub:apollonius_circle_ma_mb_k}
\begin{Verbatim}
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-point.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-point.tex
index 68c5a73e5a..e404dc763b 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-point.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-point.tex
@@ -605,6 +605,7 @@ Rotate a triangle by an angle of $\pi/6$ around $O$.
\begin{minipage}{.5\textwidth}
\begin{Verbatim}
\begin{tkzelements}
+ scale = .75
z.O = point : new ( -1 , -1 )
z.A = point : new ( 2 , 0 )
z.B = point : new ( 5 , 0 )
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-regular.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-regular.tex
index 2413a97d91..3ec9e777a6 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-regular.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-regular.tex
@@ -81,7 +81,7 @@ z.H = RP.five.proj
\bgroup
\catcode`_=12
\small
-\captionof{table}{Circle methods.}\label{regular:met}
+\captionof{table}{regular\_polygon methods.}\label{regular:met}
\begin{tabular}{ll}
\toprule
\textbf{Methods} & \textbf{Comments} \\
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-triangle.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-triangle.tex
index f54a53f39e..80b711e46f 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-triangle.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-triangle.tex
@@ -202,7 +202,9 @@ Through the Lemoine point draw lines parallel to the triangle's sides. The point
then lie on a circle known as the first Lemoine circle. } \\
\Imeth{triangle}{second\_lemoine\_circle ()} & Refer to example \ref{sub:antiparallel_through_lemoine_point}\\
\Imeth{triangle}{spieker\_circle ()} & The incircle of the medial triangle\\
-
+\Imeth{triangle}{cevian\_circle ()} & Circumscribed circle of a Cevian triangle Refer to (\ref{ssub:method_imeth_triangle_cevian})\\
+\Imeth{triangle}{pedal\_circle ()} & Circumscribed circle of the podar triangle Refer to (\ref{ssub:method_imeth_triangle_pedal})\\
+\Imeth{triangle}{conway\_circle ()} & Circumscribed circle of Conway points Refer to (\ref{ssub:method_imeth_triangle_conway})\\
\bottomrule
\end{tabular}
\end{minipage}
@@ -234,7 +236,8 @@ Remark: If you don't need to use the triangle object several times, you can obta
\Imeth{triangle}{tangential ()} & Triangle formed by the lines tangent to the circumcircle at the vertices\\
\Imeth{triangle}{feuerbach ()} & Triangle formed by the points of tangency of the euler circle with the excircles\\
\Imeth{triangle}{anti () }& Anticomplementary Triangle The given triangle is its medial triangle. \\
-\Imeth{triangle}{cevian (pt)} & Triangle formed with the endpoints of the three cevians with respect to |pt|.\\
+\Imeth{triangle}{cevian (pt)} & Triangle formed with the endpoints of the three cevians with respect to |pt|. refer to (\ref{ssub:method_imeth_triangle_cevian})\\
+\Imeth{triangle}{pedal (pt)} & Triangle formed by projections onto the sides of |pt| Refer to \ref{ssub:method_imeth_triangle_pedal}\\
\Imeth{triangle}{symmedian ()} & Triangle formed with the intersection points of the symmedians. \\
\Imeth{triangle}{euler ()} & Triangle formed with the euler points \\
\midrule
@@ -256,6 +259,171 @@ Remark: If you don't need to use the triangle object several times, you can obta
\egroup
% subsubsection methods_of_the_class_triangle (end)
+
+\subsubsection{Méthodes \Imeth{triangle}{cevian} et \Imeth{triangle}{cevian\_circle}} % (fold)
+\label{ssub:method_imeth_triangle_cevian}
+\begin{minipage}{.5\textwidth}
+\begin{Verbatim}
+\begin{tkzelements}
+ scale = 2
+ z.a = point: new (1,2)
+ z.b = point: new (5,1)
+ z.c = point: new (3,5)
+ T = triangle: new (z.a,z.b,z.c)
+ z.i = T.orthocenter
+ T.cevian = T : cevian (z.i)
+ z.ta,z.tb,z.tc = get_points (T.cevian)
+ C.cev = T : cevian_circle (z.i)
+ z.w = C.cev.center
+\end{tkzelements}
+\begin{tikzpicture}
+\tkzGetNodes
+\tkzDrawPolygons(a,b,c ta,tb,tc)
+\tkzDrawSegments(a,ta b,tb c,tc)
+\tkzDrawPoints(a,b,c,i,ta,tb,tc)
+\tkzLabelPoints(a,b,c,i)
+\tkzDrawCircles(w,ta)
+\end{tikzpicture}
+\end{Verbatim}
+\end{minipage}
+\begin{minipage}{.5\textwidth}
+\begin{tkzelements}
+scale = 2
+z.a = point: new (1,2)
+z.b = point: new (5,1)
+z.c = point: new (3,5)
+T = triangle: new (z.a,z.b,z.c)
+z.i = T.orthocenter
+T.cevian = T : cevian (z.i)
+z.ta,z.tb,z.tc = get_points (T.cevian)
+C.cev = T : cevian_circle (z.i)
+z.w = C.cev.center
+\end{tkzelements}
+\begin{tikzpicture}
+\tkzGetNodes
+\tkzDrawPolygons(a,b,c ta,tb,tc)
+\tkzDrawSegments(a,ta b,tb c,tc)
+\tkzDrawPoints(a,b,c,i,ta,tb,tc)
+\tkzLabelPoints(a,b,c,i)
+\tkzDrawCircles(w,ta)
+\end{tikzpicture}
+\end{minipage}
+% subsubsection method_imeth_triangle_cevian (end)
+
+
+\subsubsection{Méthodes \Imeth{triangle}{pedal} et \Imeth{triangle}{pedal\_circle}} % (fold)
+\label{ssub:method_imeth_triangle_pedal}
+
+\begin{minipage}{.5\textwidth}
+\begin{Verbatim}
+ \begin{tkzelements}
+ z.A = point: new(0,0)
+ z.B = point: new(5,0)
+ z.C = point: new(1.5,3)
+ z.O = point: new (2,1)
+ T.ABC = triangle: new (z.A,z.B,z.C)
+ T.pedal = T.ABC : pedal (z.O)
+ z.E,z.F,z.G = get_points(T.pedal)
+ C.pedal = T.ABC : pedal_circle (z.O)
+ z.w = C.pedal.center
+ z.T = C.pedal.through
+ \end{tkzelements}
+ \begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawPolygon(A,B,C)
+ \tkzDrawPolygon[red](E,F,G)
+ \tkzDrawCircle(w,T)
+ \tkzDrawPoints(A,B,C,E,F,G,O)
+ \tkzLabelPoints(A,B,C,E,F,G)
+ \tkzDrawSegments(O,E O,F O,G)
+ \end{tikzpicture}
+\end{Verbatim}
+\end{minipage}
+\begin{minipage}{.5\textwidth}
+ \begin{tkzelements}
+ z.A = point: new(0,0)
+ z.B = point: new(5,0)
+ z.C = point: new(1.5,3)
+ z.O = point: new (2,1)
+ T.ABC = triangle: new (z.A,z.B,z.C)
+ T.pedal = T.ABC : pedal (z.O)
+ z.E,z.F,z.G = get_points(T.pedal)
+ C.pedal = T.ABC : pedal_circle (z.O)
+ z.w = C.pedal.center
+ z.T = C.pedal.through
+ \end{tkzelements}
+ \begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawPolygon(A,B,C)
+ \tkzDrawPolygon[red](E,F,G)
+ \tkzDrawCircle(w,T)
+ \tkzDrawPoints(A,B,C,E,F,G,O)
+ \tkzLabelPoints(A,B,C,E,F,G)
+ \tkzDrawSegments(O,E O,F O,G)
+ \end{tikzpicture}
+\end{minipage}
+% subsubsection method_imeth_triangle_pedal (end)
+
+\subsubsection{Méthodes \Imeth{triangle}{conway\_points} et \Imeth{triangle}{conway\_circle}} % (fold)
+\label{ssub:method_imeth_triangle_conway}
+
+En géométrie plane, le théorème du cercle de Conway stipule que lorsque les côtés se rencontrant à chaque sommet d'un triangle sont prolongés par la longueur du côté opposé, les six points d'extrémité des trois segments de droite résultants se trouvent sur un cercle dont le centre est le centre d'incidence du triangle.
+
+\begin{minipage}{.5\textwidth}
+ \begin{Verbatim}
+ \begin{tkzelements}
+ z.A = point:new (0,0)
+ z.C = point:new (5,0)
+ z.B = point:new (1,3)
+ T.ABC = triangle : new (z.A,z.B,z.C)
+ C.conway = T.ABC : conway_circle ()
+ z.w,z.t = get_points(C.conway)
+ z.t1,z.t2,z.t3,z.t4,
+ z.t5,z.t6= T.ABC : conway_points ()
+ \end{tkzelements}
+ \hspace*{5cm}
+ \begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawPolygon(A,B,C)
+ \tkzDrawCircles(w,t)
+ \tkzDrawPoints(t1,t2,t3,t4,t5,t6)
+ \tkzLabelPoints(t1,t2,t3,t4,t5,t6)
+ \tkzDrawSegments[dashed](t1,A t2,A t3,B)
+ \tkzDrawSegments[dashed](t4,B t5,C t6,C)
+ \tkzMarkSegments(B,C t1,A t2,A)
+ \tkzMarkSegments[mark=||](A,C t3,B t4,B)
+ \tkzMarkSegments[mark=|||](A,B t5,C t6,C)
+ \end{tikzpicture}
+ \end{Verbatim}
+\end{minipage}
+\begin{minipage}{.5\textwidth}
+ \begin{tkzelements}
+ scale = .5
+ z.A = point:new (0,0)
+ z.C = point:new (5,0)
+ z.B = point:new (1,3)
+ T.ABC = triangle : new (z.A,z.B,z.C)
+ C.conway = T.ABC : conway_circle ()
+ z.w,z.t = get_points(C.conway)
+ z.t1,z.t2,z.t3,
+ z.t4,z.t5,z.t6= T.ABC : conway_points ()
+ \end{tkzelements}
+ \begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawPolygon(A,B,C)
+ \tkzDrawCircles(w,t)
+ \tkzDrawPoints(t1,t2,t3,t4,t5,t6)
+ \tkzLabelPoints(t1,t2,t3,t4,t5,t6)
+ \tkzDrawSegments[dashed](t1,A t2,A t3,B t4,B t5,C t6,C)
+ \tkzMarkSegments(B,C t1,A t2,A)
+ \tkzMarkSegments[mark=||](A,C t3,B t4,B)
+ \tkzMarkSegments[mark=|||](A,B t5,C t6,C)
+ \end{tikzpicture}
+\end{minipage}
+
+% subsubsection methode_imeth_triangle_conway (end)
+
+
\subsubsection{Euler line} % (fold)
\label{ssub:euler_line}
@@ -549,10 +717,61 @@ z.T2 = L.T2.pb
\tkzMarkSegments(B,E B,M B,F)
\end{tikzpicture}
\end{Verbatim}
+% subsection harmonic_division_and_bisector (end)
+
+\subsubsection{Method \Imeth{triangle}{cevan}} % (fold)
+\label{ssub:method_imeth_triangle_cevan}
+
+\begin{minipage}{.5\textwidth}
+ \begin{Verbatim}
+ \begin{tkzelements}
+ scale = 2
+ z.a = point: new (1,2)
+ z.b = point: new (5,1)
+ z.c = point: new (3,5)
+ T = triangle: new (z.a,z.b,z.c)
+ z.i = T.orthocenter
+ T.cevian = T : cevian (z.i)
+ z.ta,z.tb,z.tc = get_points (T.cevian)
+ C.cev = T : cevian_circle (z.i)
+ z.w = C.cev.center
+ \end{tkzelements}
+ \begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawPolygons(a,b,c ta,tb,tc)
+ \tkzDrawSegments(a,ta b,tb c,tc)
+ \tkzDrawPoints(a,b,c,i,ta,tb,tc)
+ \tkzLabelPoints(a,b,c,i)
+ \tkzDrawCircles(w,ta)
+ \end{tikzpicture}
+ \end{Verbatim}
+\end{minipage}
+\begin{minipage}{.5\textwidth}
+ \begin{tkzelements}
+ scale = 2
+ z.a = point: new (1,2)
+ z.b = point: new (5,1)
+ z.c = point: new (3,5)
+ T = triangle: new (z.a,z.b,z.c)
+ z.i = T.orthocenter
+ T.cevian = T : cevian (z.i)
+ z.ta,z.tb,z.tc = get_points (T.cevian)
+ C.cev = T : cevian_circle (z.i)
+ z.w = C.cev.center
+ \end{tkzelements}
+ \begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawPolygons(a,b,c ta,tb,tc)
+ \tkzDrawSegments(a,ta b,tb c,tc)
+ \tkzDrawPoints(a,b,c,i,ta,tb,tc)
+ \tkzLabelPoints(a,b,c,i)
+ \tkzDrawCircles(w,ta)
+ \end{tikzpicture}
+\end{minipage}
+% subsubsection method_imeth_triangle_cevan (end)
-% subsection harmonic_division_and_bisector (end)
% subsection methods_of_the_class_triangle (end)
% section class_triangle (end)
\endinput
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-examples.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-examples.tex
index 1b35c27263..4f46d4a127 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-examples.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-examples.tex
@@ -720,6 +720,7 @@ Same result using the function |T.ABC.ab : apollonius (k) |
\subsection{Orthogonal circle through} % (fold)
\label{sub:orthogonal_circle_through}
+\begin{minipage}{.5\textwidth}
\begin{Verbatim}
\begin{tkzelements}
z.O = point: new (0,1)
@@ -738,8 +739,8 @@ Same result using the function |T.ABC.ab : apollonius (k) |
\tkzLabelPoints[right](O,A,z1,z2,c)
\end{tikzpicture}
\end{Verbatim}
-
-\begin{tkzelements}
+\end{minipage}
+\begin{minipage}{.5\textwidth}\begin{tkzelements}
z.O = point: new (0,1)
z.A = point: new (1,0)
z.z1 = point: new (-1.5,-1.5)
@@ -748,7 +749,6 @@ Same result using the function |T.ABC.ab : apollonius (k) |
C = C.OA: orthogonal_through (z.z1,z.z2)
z.c = C.center
\end{tkzelements}
-
\hspace*{\fill}
\begin{tikzpicture}
\tkzGetNodes
@@ -758,6 +758,7 @@ Same result using the function |T.ABC.ab : apollonius (k) |
\tkzLabelPoints[right](O,A,z1,z2,c)
\end{tikzpicture}
\hspace*{\fill}
+\end{minipage}
% subsection orthogonal_circle_through (end)
\subsection{Divine ratio} % (fold)
@@ -1516,70 +1517,50 @@ z.O_0 = L.AB.mid
\begin{minipage}[t]{.4\textwidth}\vspace{0pt}%
\begin{Verbatim}
\begin{tkzelements}
- scale=.75
- z.A = point: new (0 , 0)
- z.B = point: new (4 , 0)
- z.D = point: new (12,0)
- L.AB = line : new (z.A,z.B)
- z.X = L.AB.north_pa
- L.XB = line : new (z.X,z.B)
- z.E = L.XB.mid
- L.DE = line : new (z.D,z.E)
- L.XA = line : new (z.X,z.A)
- z.F = intersection (L.DE,L.XA)
- L.AE = line : new (z.A,z.E)
- L.BF = line : new (z.B,z.F)
- z.G = intersection (L.AE,L.BF)
- L.XG = line : new (z.X,z.G)
-z.C = intersection (L.XG,L.AB)
+ scale=.75
+ z.A = point: new (0 , 0)
+ z.B = point: new (4 , 0)
+ z.G = point: new (2,2)
+ L.AG = line : new (z.A,z.G)
+ L.AB = line : new (z.A,z.B)
+ z.E = L.AG : colinear_at (z.B,.5)
+ L.GE = line : new (z.G,z.E)
+ z.D = intersection (L.GE,L.AB)
+ z.F = z.B : symmetry (z.E)
+ L.GF = line :new (z.G,z.F)
+ z.C = intersection (L.GF,L.AB)
\end{tkzelements}
\begin{tikzpicture}
- \tkzGetNodes
- \tkzDefPoints{0/0/A,4/0/B}
- \tkzDefPoints{2/2/G}
- \tkzDefLine[parallel=through B,K=.5](A,G) \tkzGetPoint{E}
- \tkzInterLL(G,E)(A,B) \tkzGetPoint{D}
- \tkzDefPointBy[symmetry= center B](E) \tkzGetPoint{F}
- \tkzInterLL(G,F)(A,B) \tkzGetPoint{C}
- \tkzDrawLines(A,D A,G F,E G,F G,D)
- \tkzDrawPoints(A,B,G,E,F,C,D)
- \tkzLabelPoints(A,B,G,E,F,C,D)
- \tkzMarkSegments(F,B B,E)
+ \tkzGetNodes
+ \tkzDrawLines(A,B A,G A,D A,G F,E G,F G,D)
+ \tkzDrawPoints(A,B,G,E,F,C,D)
+ \tkzLabelPoints(A,B,G,E,F,C,D)
+ \tkzMarkSegments(F,B B,E)
\end{tikzpicture}
\end{Verbatim}
\end{minipage}
\begin{minipage}[t]{.6\textwidth}\vspace{0pt}%
\begin{tkzelements}
-scale=.75
-z.A = point: new (0 , 0)
-z.B = point: new (4 , 0)
-z.D = point: new (12,0)
-L.AB = line : new (z.A,z.B)
-z.X = L.AB.north_pa
-L.XB = line : new (z.X,z.B)
-z.E = L.XB.mid
-L.DE = line : new (z.D,z.E)
-L.XA = line : new (z.X,z.A)
-z.F = intersection (L.DE,L.XA)
-L.AE = line : new (z.A,z.E)
-L.BF = line : new (z.B,z.F)
-z.G = intersection (L.AE,L.BF)
-L.XG = line : new (z.X,z.G)
-z.C = intersection (L.XG,L.AB)
+ scale=.75
+ z.A = point: new (0 , 0)
+ z.B = point: new (4 , 0)
+ z.G = point: new (2,2)
+ L.AG = line : new (z.A,z.G)
+ L.AB = line : new (z.A,z.B)
+ z.E = L.AG : colinear_at (z.B,.5)
+ L.GE = line : new (z.G,z.E)
+ z.D = intersection (L.GE,L.AB)
+ z.F = z.B : symmetry (z.E)
+ L.GF = line :new (z.G,z.F)
+ z.C = intersection (L.GF,L.AB)
\end{tkzelements}
\hspace*{\fill}
\begin{tikzpicture}
-\tkzGetNodes
-\tkzDefPoints{0/0/A,4/0/B}
-\tkzDefPoints{2/2/G}
-\tkzDefLine[parallel=through B,K=.5](A,G) \tkzGetPoint{E}
-\tkzInterLL(G,E)(A,B) \tkzGetPoint{D}
-\tkzDefPointBy[symmetry= center B](E) \tkzGetPoint{F}
-\tkzInterLL(G,F)(A,B) \tkzGetPoint{C}
-\tkzDrawLines(A,D A,G F,E G,F G,D)
-\tkzDrawPoints(A,B,G,E,F,C,D)
-\tkzLabelPoints(A,B,G,E,F,C,D)
-\tkzMarkSegments(F,B B,E)
+ \tkzGetNodes
+ \tkzDrawLines(A,B A,G A,D A,G F,E G,F G,D)
+ \tkzDrawPoints(A,B,G,E,F,C,D)
+ \tkzLabelPoints(A,B,G,E,F,C,D)
+ \tkzMarkSegments(F,B B,E)
\end{tikzpicture}
\hspace*{\fill}
\end{minipage}
@@ -1590,22 +1571,22 @@ z.C = intersection (L.XG,L.AB)
\begin{minipage}[t]{.5\textwidth}\vspace{0pt}%
\begin{Verbatim}
\begin{tkzelements}
- scale = .5
- z.A = point: new (0 , 0)
- z.B = point: new (6 , 0)
- z.D = point: new (12 , 0)
- L.AB = line: new (z.A,z.B)
- z.X = L.AB.north_pa
- L.XB = line: new (z.X,z.B)
- z.E = L.XB.mid
- L.ED = line: new (z.E,z.D)
- L.AX = line: new (z.A,z.X)
- L.AE = line: new (z.A,z.E)
- z.F = intersection (L.ED,L.AX)
- L.BF = line: new (z.B,z.F)
- z.G = intersection (L.AE,L.BF)
- L.GX = line: new (z.G,z.X)
- z.C = intersection (L.GX,L.AB)
+scale = .5
+z.A = point: new (0 , 0)
+z.B = point: new (6 , 0)
+z.D = point: new (12 , 0)
+L.AB = line: new (z.A,z.B)
+z.X = L.AB.north_pa
+L.XB = line: new (z.X,z.B)
+z.E = L.XB.mid
+L.ED = line: new (z.E,z.D)
+L.AX = line: new (z.A,z.X)
+L.AE = line: new (z.A,z.E)
+z.F = intersection (L.ED,L.AX)
+L.BF = line: new (z.B,z.F)
+z.G = intersection (L.AE,L.BF)
+L.GX = line: new (z.G,z.X)
+z.C = intersection (L.GX,L.AB)
\end{tkzelements}
\begin{tikzpicture}
\tkzGetNodes
@@ -2015,7 +1996,7 @@ z.H = L.OOp : projection (z.X)
\begin{minipage}[t]{.5\textwidth}\vspace{0pt}%
\begin{Verbatim}
\begin{tkzelements}
- scale = .25
+ scale = .5
z.A = point: new (0,0)
z.B = point: new (6,0)
z.C = point: new (0.8,4)
@@ -2039,7 +2020,8 @@ z.H = L.OOp : projection (z.X)
\end{tikzpicture}
\end{Verbatim}
\end{minipage}
-\begin{minipage}[t]{.5\textwidth}\vspace{0pt}%
+
+
\begin{tkzelements}
scale = .5
z.A = point: new (0,0)
@@ -2066,7 +2048,7 @@ z.H = L.OOp : projection (z.X)
\tkzLabelPoints(A,B,C)
\end{tikzpicture}
\hspace*{\fill}
-\end{minipage}
+
% subsection radical_circle (end)
\subsection{Euler ellipse} % (fold)
@@ -2112,44 +2094,44 @@ _,z.W = intersection (L.ZO,E)
\begin{minipage}{.4\textwidth}
\begin{Verbatim}
\begin{tkzelements}
- scale = 1.3
- z.A = point: new (0 , 0)
- z.B = point: new (5 , 1)
- L.AB = line : new (z.A,z.B)
- z.C = point: new (.8 , 3)
- T.ABC = triangle: new (z.A,z.B,z.C)
- z.N = T.ABC.eulercenter
- z.G = T.ABC.centroid
- z.O = T.ABC.circumcenter
- z.H = T.ABC.orthocenter
+ scale = 1.3
+ z.A = point: new (0 , 0)
+ z.B = point: new (5 , 1)
+ L.AB = line : new (z.A,z.B)
+ z.C = point: new (.8 , 3)
+ T.ABC = triangle: new (z.A,z.B,z.C)
+ z.N = T.ABC.eulercenter
+ z.G = T.ABC.centroid
+ z.O = T.ABC.circumcenter
+ z.H = T.ABC.orthocenter
z.Ma,z.Mb,
- z.Mc = get_points (T.ABC : medial ())
+ z.Mc = get_points(T.ABC:medial ())
z.Ha,z.Hb,
- z.Hc = get_points (T.ABC : orthic ())
+ z.Hc = get_points(T.ABC:orthic ())
z.Ea,z.Eb,
- z.Ec = get_points (T.ABC: extouch())
- L.euler = T.ABC : euler_line ()
- C.circum = T.ABC : circum_circle ()
- C.euler = T.ABC : euler_circle ()
- z.I,z.J = intersection (L.euler,C.euler)
- E = ellipse: foci (z.H,z.O,z.I)
- a = E.Rx
- b = E.Ry
- ang = math.deg(E.slope)
- L.AH = line: new (z.A,z.H)
- L.BH = line: new (z.B,z.H)
- L.CH = line: new (z.C,z.H)
- z.X = intersection (L.AH,C.circum)
- _,z.Y = intersection (L.BH,C.circum)
- _,z.Z = intersection (L.CH,C.circum)
- L.BC = line: new (z.B,z.C)
- L.XO = line: new (z.X,z.O)
- L.YO = line: new (z.Y,z.O)
- L.ZO = line: new (z.Z,z.O)
- z.x = intersection (L.BC,L.XO)
- z.U = intersection (L.XO,E)
- _,z.V = intersection (L.YO,E)
- _,z.W = intersection (L.ZO,E)
+ z.Ec = get_points(T.ABC:extouch())
+ L.euler = T.ABC : euler_line ()
+ C.circum = T.ABC : circum_circle ()
+ C.euler = T.ABC : euler_circle ()
+ z.I,z.J = intersection (L.euler,C.euler)
+ E = ellipse: foci (z.H,z.O,z.I)
+ a = E.Rx
+ b = E.Ry
+ ang = math.deg(E.slope)
+ L.AH = line: new (z.A,z.H)
+ L.BH = line: new (z.B,z.H)
+ L.CH = line: new (z.C,z.H)
+ z.X = intersection (L.AH,C.circum)
+ _,z.Y = intersection (L.BH,C.circum)
+ _,z.Z = intersection (L.CH,C.circum)
+ L.BC = line: new (z.B,z.C)
+ L.XO = line: new (z.X,z.O)
+ L.YO = line: new (z.Y,z.O)
+ L.ZO = line: new (z.Z,z.O)
+ z.x = intersection (L.BC,L.XO)
+ z.U = intersection (L.XO,E)
+ _,z.V = intersection (L.YO,E)
+ _,z.W = intersection (L.ZO,E)
\end{tkzelements}
\end{Verbatim}
\end{minipage}
@@ -2169,7 +2151,6 @@ _,z.W = intersection (L.ZO,E)
\tkzDrawPoints(A,B,C,N,G,H,O,X,Y,Z,Ma,Mb,Mc,Ha,Hb,Hc)
\tkzDrawEllipse[blue](N,\tkzUseLua{a},\tkzUseLua{b},\tkzUseLua{ang})
\end{tikzpicture}
-\hspace*{\fill}
\end{minipage}
\begin{Verbatim}
@@ -3539,24 +3520,24 @@ z.Cp,_ = intersection (L.GD,C.xD)
\begin{minipage}[t]{.5\textwidth}\vspace{0pt}%
\begin{Verbatim}
- \begin{tikzpicture}
- \tkzGetNodes
- \tkzDrawCircles(O,B)
- \tkzDrawCircles[cyan](P,B)
- \tkzDrawCircles[red](w,E)
- \tkzDrawCircles[new](x,F)
- \tkzDrawSegments(A,G E,G C,G)
- \tkzDrawPolygons[new](A,E,C A',E',C')
- \tkzDrawPoints(A,...,G,A',E',C',O,P)
- \begin{scope}[font=\scriptsize]
- \tkzLabelPoints(A,...,F)
- \tkzLabelPoints[above left](G,A',E',C')
- \tkzLabelCircle[left](O,B)(30){$(\beta)$}
- \tkzLabelCircle[below](P,A)(40){$(\gamma)$}
- \tkzLabelCircle[right](w,C)(90){$(\alpha)$}
- \tkzLabelCircle[left](x,B)(-230){$((\delta))$}
- \end{scope}
- \end{tikzpicture}
+\begin{tikzpicture}
+ \tkzGetNodes
+ \tkzDrawCircles(O,B)
+ \tkzDrawCircles[cyan](P,B)
+ \tkzDrawCircles[red](w,E)
+ \tkzDrawCircles[new](x,F)
+ \tkzDrawSegments(A,G E,G C,G)
+ \tkzDrawPolygons[new](A,E,C A',E',C')
+ \tkzDrawPoints(A,...,G,A',E',C',O,P)
+ \begin{scope}[font=\scriptsize]
+ \tkzLabelPoints(A,...,F)
+ \tkzLabelPoints[above left](G,A',E',C')
+ \tkzLabelCircle[left](O,B)(30){$(\beta)$}
+ \tkzLabelCircle[below](P,A)(40){$(\gamma)$}
+ \tkzLabelCircle[right](w,C)(90){$(\alpha)$}
+ \tkzLabelCircle[left](x,B)(-230){$((\delta))$}
+ \end{scope}
+\end{tikzpicture}
\end{Verbatim}
\end{minipage}
\begin{minipage}[t]{.5\textwidth}\vspace{0pt}%
@@ -3639,7 +3620,6 @@ L.TA = C.wE : tangent_at (z.A)
L.TC = C.xE : tangent_at (z.C)
z.I = intersection (L.TA,L.TC)
\end{tkzelements}
-
\hspace*{\fill}
\begin{tikzpicture}
\tkzGetNodes
@@ -3652,6 +3632,7 @@ z.I = intersection (L.TA,L.TC)
\tkzLabelPoints[above right](E,F)
\tkzLabelPoints[below](C)
\end{tikzpicture}
+\hspace*{\fill}
\end{minipage}
% subsection three_tangents (end)
@@ -3802,7 +3783,7 @@ z.B = point: new (5,1)
z.C = point: new (2,3)
T = triangle: new (z.A,z.B,z.C)
z.O = T.circumcenter
-z.o,z.w = get_points (T : first_lemoine_circle ())
+z.o,z.w = get_points(T:first_lemoine_circle())
z.L = T : lemoine_point ()
\end{tkzelements}
\hspace*{\fill}
@@ -3813,7 +3794,6 @@ z.L = T : lemoine_point ()
\tkzLabelPoints(A,B,C,o,w,O,L)
\tkzDrawCircles(o,w O,A)
\end{tikzpicture}
-\hspace*{\fill}
\end{minipage}
% subsection first_lemoine_circle (end)
@@ -4233,61 +4213,10 @@ z.Xip,z.Yip,z.Zip = C.ins : inversion (z.xi,z.yi,z.zi)
\tkzLabelPoints(A,B,C,E,F,G)
\end{tikzpicture}
\end{Verbatim}
-
-
% subsection soddy_circle_with_function (end)
-\subsubsection{Pappus chain} % (fold)
-\label{ssub:pappus_chain}
- Soit le point $D$ appartenant à la droite $(AC)$ tel que
- \[ DB \cdot DA = AC^2\]
- alors $B$ est l'image de $D$ dans l'inversion de centre $A$ et puissance $AC^2$.
- Les demi-cercles de diamètre $[AB]$ et$[AC]$ passent par le pôle $A$. Ils ont pour images les demi-droites $\mathcal{L'}$ et $\mathcal{L}$.
-
-Les cercles de centre $J_i$ et de diamètre $S_iT_i$ ont pour images les cercles de diamètre $S'_iT'_i$.
-
- \pgfmathsetmacro{\xB}{6}%
- \pgfmathsetmacro{\xC}{9}%
- \pgfmathsetmacro{\xD}{(\xC*\xC)/\xB}%
- \pgfmathsetmacro{\xJ}{(\xC+\xD)/2}%
- \pgfmathsetmacro{\r}{\xD-\xJ}%
- \pgfmathsetmacro{\nc}{2}%
-
-\begin{tikzpicture}[scale=1,ultra thin]
- \tkzDefPoints{0/0/A,\xB/0/B,\xC/0/C,\xD/0/D}
- \tkzDefPointBy[rotation = center C angle -90](B) \tkzGetPoint{c}
- \tkzDefPointBy[rotation = center A angle 90](C) \tkzGetPoint{a}
- \tkzDefPointBy[rotation = center D angle -90](C) \tkzGetPoint{d}
- \tkzDrawLines[add=0 and 2.25](C,c)
- \tkzDrawLines[add=0 and 1.5](D,d)
- \tkzDefCircle[diameter](A,C) \tkzDrawSemiCircle(tkzPointResult,C)
- \tkzDefCircle[diameter](A,B) \tkzDrawSemiCircle(tkzPointResult,B)
- \tkzDefCircle[diameter](B,C) \tkzDrawSemiCircle(tkzPointResult,C)
- \tkzDefCircle[diameter](C,D) \tkzDrawSemiCircle(tkzPointResult,D)
- \tkzDrawArc[red](A,C)(a)
- \tkzDrawPoints(A,B,C,D)
- \tkzLabelPoints(A,B,C,D)
- \tkzLabelLine[left,pos=3](C,c){$\mathcal{L}$}
- \tkzLabelLine[right,pos=2.5](D,d){$\mathcal{L'}$}
- \foreach \i in {1,...,\nc}
-{\tkzDefPoint(\xJ,2*\r*\i){J}
- \tkzDefPoint(\xJ,2*\r*\i-\r){H}
- \tkzDefCircleBy[inversion = center A through C](J,H)\tkzGetPoints{J'}{H'}
- \tkzInterLC(A,J)(J,H) \tkzGetPoints{S}{T}
- \tkzDefPointsBy[inversion = center A through C](S,T){S',T'}
- \tkzDrawCircle(J,H)
- \tkzDefCircle[diameter](S',T') \tkzGetPoint{I'}
- \tkzDrawCircle(I',T')
- \tkzDrawLines[dashed,add = 0 and .15](A,T A,S A,H)
- \tkzDrawPoints(J,H,H',S,S',T,T')
- \tkzLabelPoint(J){$J_\i$}
- \tkzLabelPoint(S){$S_\i$}
- \tkzLabelPoint(T){$T_\i$}
- \tkzLabelPoint(H){$H_\i$}
- \tkzLabelPoint(S'){$S'_\i$}
- \tkzLabelPoint(T'){$T'_\i$}
- \tkzLabelPoint(H'){$H'_\i$}}
-\end{tikzpicture}
+\subsection{Pappus chain} % (fold)
+\label{sub:pappus_chain}
\begin{tkzelements}
scale =.75
@@ -4374,7 +4303,7 @@ Les cercles de centre $J_i$ et de diamètre $S_iT_i$ ont pour images les cercles
\end{tikzpicture}
\vfill
\end{minipage}
-% subsubsection pappus_chain (end)
+% subsection pappus_chain (end)
\subsection{Three Circles} % (fold)
\label{sub:three_circles}
@@ -4449,7 +4378,7 @@ z.O_2 = L.CB.mid
C.O0B = circle: new ( z.O_0, z.B)
C.O1C = circle: new ( z.O_1, z.C)
C.O2B = circle: new ( z.O_2, z.B)
-z.M_0 = C.O1C : external_similitude (C.O2B)
+z.M_0 = C.O1C:external_similitude(C.O2B)
L.O0C = line:new(z.O_0,z.C)
T.golden = L.O0C : golden ()
z.L = T.golden.pc
@@ -4488,7 +4417,7 @@ z.D_2,z.E_2,z.F_2,z.G_2 = z.M_0 : homothety (kk,z.D_1,z.E_1,z.F_1,z.G_1)
C.O0B = circle: new ( z.O_0, z.B)
C.O1C = circle: new ( z.O_1, z.C)
C.O2B = circle: new ( z.O_2, z.B)
- z.M_0 = C.O1C : external_similitude (C.O2B)
+ z.M_0 = C.O1C:external_similitude(C.O2B)
L.O0C = line:new(z.O_0,z.C)
T.golden = L.O0C : golden ()
z.L = T.golden.pc
@@ -4514,6 +4443,7 @@ z.D_2,z.E_2,z.F_2,z.G_2 = z.M_0 : homothety (kk,z.D_1,z.E_1,z.F_1,z.G_1)
\end{Verbatim}
\end{minipage}
\begin{minipage}{.5\textwidth}
+ \hfill
\begin{tikzpicture}[scale=.7]
\tkzGetNodes
\tkzDrawPolygon[red](O_2,O_0,I,D,H)
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-main.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-main.tex
index cd967f1af0..55608bb26b 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-main.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-main.tex
@@ -1,7 +1,7 @@
% !TEX TS-program = lualatex
% encoding : utf8
-% Documentation of tkz-elements v2.20c
-% Copyright 2023 Alain Matthes
+% Documentation of tkz-elements v2.25c
+% Copyright 2024 Alain Matthes
% 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.
@@ -21,10 +21,10 @@
headings = small
]{tkz-doc}
\gdef\tkznameofpack{tkz-elements}
-\gdef\tkzversionofpack{2.20c}
+\gdef\tkzversionofpack{2.25c}
\gdef\tkzdateofpack{\today}
\gdef\tkznameofdoc{tkz-elements.pdf}
-\gdef\tkzversionofdoc{2.20c}
+\gdef\tkzversionofdoc{2.25c}
\gdef\tkzdateofdoc{\today}
\gdef\tkzauthorofpack{Alain Matthes}
\gdef\tkzadressofauthor{}
@@ -33,11 +33,12 @@
\gdef\tkzengine{lualatex}
\gdef\tkzurlauthorcom{http://altermundus.fr}
\nameoffile{\tkznameofpack}
+
% -- Packages ---------------------------------------------------
\usepackage[dvipsnames,svgnames]{xcolor}
\usepackage{calc}
\usepackage{tkz-base}
-\usepackage{tkz-euclide}
+\usepackage[mini]{tkz-euclide}
\usepackage{tkz-elements}
\usepackage{pgfornament}
\usetikzlibrary{backgrounds}
@@ -144,6 +145,7 @@ sharp corners
\newcommand*{\IEmacro}[1]{\index{#1_1@\texttt{\textbackslash#1}}\texttt{#1}}
\newcommand*{\tkzimpbf}[1]{\texttt{\textbf{#1}}}
\newcommand*{\tkzEHand}{\textcolor{red}{\lefthand}}
+\newcommand*{\ItkzPopt}[2]{\texttt{#2}\index{#1_3@\texttt{#1: options}!\texttt{#2}}}
%<--------------------------------------------------------------------------->
% settings styles
@@ -181,8 +183,7 @@ sharp corners
This document compiles some notes about \tkzname{\tkznameofpack}, the initial version of a \code{Lua} library designed to perform all the necessary calculations for defining objects in Euclidean geometry figures. Your document must be compiled using Lua\LaTeX.\\
With \pkg{tkz-elements}, definitions and calculations are exclusively conducted using \pkg{Lua}. \\
The primary programming approach offered is oriented towards \code{object programming}, utilizing object classes such as point, line, triangle, circle, and ellipse. Currently, after the calculations are completed, \pkg{tkz-euclide} or \pkg{TikZ} is used for drawing purposes.\\
- I discovered Lua and object-oriented programming while developing this package, so it's highly likely that I've made a few mistakes. If you'd like to contribute to the development of this package or provide advice on how to proceed, please contact me via email. \\
-Please note: English is not my native language, so there may be some errors."
+ I discovered Lua and object-oriented programming while developing this package, so it's highly likely that I've made a few mistakes. If you'd like to contribute to the development of this package or provide advice on how to proceed, please contact me via email.
}
\presentation
@@ -197,8 +198,8 @@ Special thanks to \tkzimp{Wolfgang Büchel} for his invaluable contribution in c
\href{http://mathworld.wolfram.com/about/author.html}{MathWorld}.
\vspace*{12pt}
-\lefthand\ You can find some examples on my site:
-\href{http://altermundus.fr}{altermundus.fr}. \hspace{2cm} under construction!
+\lefthand\ You can find some examples on my site and a french documentation:
+\href{http://altermundus.fr}{altermundus.fr}.
\vfill
Please report typos or any other comments to this documentation to: \href{mailto:al.ma@mac.com}{\textcolor{blue}{Alain Matthes}}.
@@ -248,7 +249,6 @@ Project Public License Distributed from \href{http://www.ctan.org/}{CTAN}\ arch
|r| denotes a real number, |cx| complex number, |d| a positive real number, |n| an integer, |an| an angle, |b| a boolean, |s| a character string, |pt| a point, |t| a table, |m| a matrix, |v| variable, |L| a straight line, |C| a circle, |T| a triangle, |E| an ellipse, |V| a vector,|Q| a quadrilateral, |P| a parallelogram, |R| a rectangle, |S| a square, |RP| a regular polygon, |M| a matrix, |O| an object (pt, L,C,T), . . a list of points or an object, < > optional argument.
\begin{multicols}{3}
-
\fbox{\textbf{point}}\\
\textbf{Attributes} table(\ref{point:att}) \\
|re -> r| \\
@@ -320,7 +320,9 @@ Project Public License Distributed from \href{http://www.ctan.org/}{CTAN}\ arch
|_south_pa (d) -> pt| \\
|_south_pb (d) -> pt| \\
|_east (d) -> pt| \\
-|_west (d) -> pt| \\
+|_west (d) -> pt| \\
+|report (r,pt) -> pt| \\
+|colinear_at (pt,k) -> pt| \\
|translation (...) -> O| \\
|projection (...) -> O| \\
|reflection (...) -> O| \\
@@ -348,7 +350,6 @@ Project Public License Distributed from \href{http://www.ctan.org/}{CTAN}\ arch
|sublime () -> T| \\
|egyptian () -> T| \\
|square (<swap>) -> T| \\
-|report (r,pt) -> T| \\
\\
\fbox{\textbf{triangle}} \\
\textbf{Attributes} table(\ref{triangle:att}) \\
@@ -387,6 +388,7 @@ Project Public License Distributed from \href{http://www.ctan.org/}{CTAN}\ arch
|nine_points () -> pt| \\
|point (t) -> pt| \\
|soddy_center () -> pt| \\
+|conway_points () -> pts| \\
|euler_line () -> L| \\
|symmedian_line (n) -> L| \\
|altitude (n) -> L| \\
@@ -401,6 +403,9 @@ Project Public License Distributed from \href{http://www.ctan.org/}{CTAN}\ arch
|second_lemoine_circle() -> C| \\
|spieker_circle() -> C| \\
|soddy_circle () -> C| \\
+|conway_circle () -> C| \\
+|pedal_circle () -> C| \\
+|cevian_circle () -> C| \\
|orthic() -> T| \\
|medial() -> T| \\
|incentral() -> T| \\
@@ -414,6 +419,7 @@ Project Public License Distributed from \href{http://www.ctan.org/}{CTAN}\ arch
|cevian (pt) -> T| \\
|symmedian () -> T| \\
|euler () -> T| \\
+|pedal (pt) -> T| \\
|projection (pt) -> pt,pt,pt| \\
|parallelogram () -> pt| \\
|area () -> d| \\
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-organization.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-organization.tex
index 13b17d6a5d..1778a7c8fb 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-organization.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-organization.tex
@@ -5,6 +5,7 @@ Here's a sample organization.
The line |% !TEX TS-program = lualatex| ensures that you compile with Lua\LATEX{}. The \code{standalone} class is useful, as all you need to do here is create a figure.
+You can load \tkzname{tkz-euclide} in three different ways. The simplest is |\usepackage[mini]{tkz-euclide}| and you have full access to the package. You also have the option to use the \ItkzPopt{tkz-euclide}{lua} option. This will allow you, if you want to perform calculations outside of \tkzname{\tkznameofpack}, to obtain them using \code{lua}. Finally, the recommended method is to use the \ItkzPopt{tkz-euclide}{mini} option. This allows you to load only the modules necessary for drawing. You can still optionally draw using \TIKZ.
The package \pkg{ifthen} is useful if you need to use some Boolean.
@@ -25,7 +26,7 @@ A third advantage is that the code can be reused.
% Created by Alain Matthes on 2024-01-09.
\documentclass[margin = 12pt]{standalone}
-\usepackage{tkz-euclide}
+\usepackage[mini]{tkz-euclide}
\usepackage{tkz-elements,ifthen}
\begin{document}
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-presentation.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-presentation.tex
index 2687f9debe..f0689fcc74 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-presentation.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-presentation.tex
@@ -148,7 +148,8 @@ C.QA = circle: new ( z.Q, z.A)
z.P_0 = intersection (C.PC,C.AB) -- search for intersections of two circles.
z.P_1 = intersection (C.PC,C.AC) -- idem
_,z.P_2 = intersection (C.QA,C.CB) -- idem
-z.O_3 = triangle: new ( z.P_0, z.P_1, z.P_2).circumcenter -- circumcenter attribute of “triangle”
+z.O_3 = triangle: new ( z.P_0, z.P_1, z.P_2).circumcenter
+ -- circumcenter attribute of “triangle”
\end{tkzelements}
\end{Verbatim}
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-structure.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-structure.tex
index 15b167a793..d1958d4763 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-structure.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-structure.tex
@@ -1,6 +1,6 @@
\section{Structure} % (fold)
\label{sec:structure}
-\tkzNamePack{tkz-elements.sty} loads the \tkzNamePack{luacode} package to create the \tkzNameEnv{tkzelements} environment, which is based on the \tkzNameEnv{luacode} environment.
+\tkzNamePack{tkz-elements} loads the \tkzNamePack{luacode} package to create the \tkzNameEnv{tkzelements} environment, which is based on the \tkzNameEnv{luacode} environment.
Within the \tkzNameEnv{tkzelements} environment, the scale is initialized to 1, and then all values in various tables are cleared.
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transfers.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transfers.tex
index a66f493604..264097e9b8 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transfers.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transfers.tex
@@ -2,7 +2,7 @@
\newpage
\section{Transfers} % (fold)
\label{sec:transfers}
-\subsection{Fom Lua to tkz-euclide or TikZ} % (fold)
+\subsection{From Lua to tkz-euclide or TikZ} % (fold)
\label{sub:fom_lua_to_tkz_euclide_or_tikz}
In this section, we'll explore how to transfer points, Booleans, and numerical values.
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transferts.tex b/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transferts.tex
deleted file mode 100644
index 39d5940e72..0000000000
--- a/macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-transferts.tex
+++ /dev/null
@@ -1,150 +0,0 @@
-
-\newpage
-\section{Transfers} % (fold)
-\label{sec:transfers}
-\subsection{Fom Lua to tkz-euclide or TikZ} % (fold)
-\label{sub:fom_lua_to_tkz_euclide_or_tikz}
-
-In this section, we'll look at how to transfer points, Booleans and numerical values.
-
-\subsubsection{Points transfer} % (fold)
-\label{ssub:points_transfer}
-We use an environment \tkzname{tkzelements} outside an environment \tkzname{tikzpicture} which allows us to carry out all the necessary calculations, then we launch the macro \Imacro{tkzGetNodes} which transforms the affixes of the table \tkzname{z} into \tkzname{Nodes}. It only remains to draw.
-
-Currently the drawing program is either \TIKZ\ or \pkg{tkz-euclide}. You have the possibility to use another package to trace but for that you have to create a macro similar to \tkzcname{tkzGetNodes}. Of course, this package must be able to store the points as does \TIKZ\ or \pkg{tkz-euclide}.
-
-\vspace*{1em}
-
-\begin{mybox}
-\begin{verbatim}
-\def\tkzGetNodes{\directlua{%
- for K,V in pairs(z) do
- local n,sd,ft
- n = string.len(K)
- if n >1 then
- _,_,ft, sd = string.find( K , "(.+)(.)" )
- if sd == "p" then K=ft.."'" end
- _,_,xft, xsd = string.find( ft , "(.+)(.)" )
- if xsd == "p" then K=xft.."'".."'" end
- end
- tex.print("\\coordinate ("..K..") at ("..V.re..","..V.im..") ;\\\\")
-end}
-}
-\end{verbatim}
-\end{mybox}
-See the section In-depth Study \ref{sec:in_depth_study} for an explanation of the previous code.
-
-The environment \tkzNameEnv{tkzelements} allows to use the underscore |_| and the macro \tkzcname{tkzGetNodes} allows to obtain names of nodes containing \tkzname{prime} or \tkzname{double prime}. (see the next example)
-
-\begin{minipage}{0.5\textwidth}
-\begin{verbatim}
-\begin{tkzelements}
- scale = 1.2
- z.o = point: new (0,0)
- z.a_1 = point: new (2,1)
- z.a_2 = point: new (1,2)
- z.ap = z.a_1 + z.a_2
- z.app = z.a_1 - z.a_2
-\end{tkzelements}
-\begin{tikzpicture}
- \tkzGetNodes
- \tkzDrawSegments(o,a_1 o,a_2 o,a' o,a'')
- \tkzDrawSegments[red](a_1,a' a_2,a')
- \tkzDrawSegments[blue](a_1,a'' a_2,a'')
- \tkzDrawPoints(a_1,a_2,a',o,a'')
- \tkzLabelPoints(o,a_1,a_2,a',a'')
-\end{tikzpicture}
-\end{verbatim}
-\end{minipage}
-\begin{minipage}{0.5\textwidth}
-\begin{tkzelements}
- scale = 1.2
- z.o = point: new (0,0)
- z.a_1 = point: new (2,1)
- z.a_2 = point: new (1,2)
- z.ap = z.a_1 + z.a_2
- z.app = z.a_1 - z.a_2
-\end{tkzelements}
-\hspace{\fill}
-\begin{tikzpicture}
- \tkzGetNodes
- \tkzDrawSegments(o,a_1 o,a_2 o,a' o,a'')
- \tkzDrawSegments[red](a_1,a' a_2,a')
- \tkzDrawSegments[blue](a_1,a'' a_2,a'')
- \tkzDrawPoints(a_1,a_2,a',o,a'')
- \tkzLabelPoints(o,a_1,a_2,a',a'')
-\end{tikzpicture}
-\hspace{\fill}
-\end{minipage}%
-
-\newpage
-% subsection fom_lua_to_tkz_euclide_or_tikz (end)
-\subsubsection{Other transfers} % (fold)
-\label{ssub:other_transfers}
-
-Sometimes it's useful to transfer angle, length measurements or boolean. For this purpose, I have created the macro (see \ref{sub:transfer_from_lua_to_tex})
-\IEmacro{tkzUseLua(value)}
-
-\begin{verbatim}
-\begin{tkzelements}
- z.b = point: new (1,1)
- z.a = point: new (4,2)
- z.c = point: new (2,2)
- z.d = point: new (5,2)
- L.ab = line : new (z.a,z.b)
- L.cd = line : new (z.c,z.d)
- det = (z.b-z.a)^(z.d-z.c)
- if det == 0 then bool = true
- else bool = false
- end
- x = intersection (L.ab,L.cd)
-\end{tkzelements}
-
-The intersection of the two lines lies at
- a point whose affix is:\tkzUseLua{x}
-
-\begin{tikzpicture}
- \tkzGetNodes
- \tkzDrawPoints(a,...,d)
- \ifthenelse{\equal{\tkzUseLua{bool}}{true}}{
- \tkzDrawSegments[red](a,b c,d)}{%
- \tkzDrawSegments[blue](a,b c,d)}
- \tkzLabelPoints(a,...,d)
-\end{tikzpicture}
-\end{verbatim}
-
- \begin{tkzelements}
- z.b = point: new (1,1)
- z.a = point: new (4,2)
- z.c = point: new (2,2)
- z.d = point: new (5,1)
- L.ab = line : new (z.a,z.b)
- L.cd = line : new (z.c,z.d)
- det = (z.b-z.a)^(z.d-z.c)
- if det == 0 then bool = true
- else bool = false
- end
- x = intersection (L.ab,L.cd)
- \end{tkzelements}
-
- The intersection of the two lines lies at
- a point whose affix is: \tkzUseLua{x}
-
-\vspace{1em}
-\hspace{\fill}
-\begin{tikzpicture}
- \tkzGetNodes
- \tkzInit[xmin =-1,ymin=-1,xmax=6,ymax=3]
- \tkzGrid\tkzAxeX\tkzAxeY
- \tkzDrawPoints(a,...,d)
- \ifthenelse{\equal{\tkzUseLua{bool}}{true}}{
- \tkzDrawSegments[red](a,b c,d)}{%
- \tkzDrawSegments[blue](a,b c,d)}
- \tkzLabelPoints(a,...,d)
- \end{tikzpicture}
- \hspace{\fill}
-% subsubsection other_transfers (end)
-% subsubsection points_transfer (end)
-% section transferts (end)
-
-\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-elements/doc/tkz-elements.pdf b/macros/latex/contrib/tkz/tkz-elements/doc/tkz-elements.pdf
index 152e50be1e..d42a3a109b 100644
--- a/macros/latex/contrib/tkz/tkz-elements/doc/tkz-elements.pdf
+++ b/macros/latex/contrib/tkz/tkz-elements/doc/tkz-elements.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.pdf b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.pdf
index 373dc1b0bc..6b1998eb80 100644
--- a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.pdf
+++ b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.tex b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.tex
index faa0ef52bb..15046d83a3 100644
--- a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_1.tex
@@ -1,7 +1,7 @@
% !TEX TS-program = lualatex
% Author Alain Matthes 2023
\documentclass{article}
-\usepackage{tkz-euclide}
+\usepackage[mini]{tkz-euclide}
\usepackage{tkz-elements}
\begin{document}
diff --git a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.pdf b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.pdf
index 788e9d0f39..6ff5f444c8 100644
--- a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.pdf
+++ b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.tex b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.tex
index 61a1ea5583..2ee7b4c4d9 100644
--- a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_2.tex
@@ -1,7 +1,7 @@
% !TEX TS-program = lualatex
% Author Alain Matthes 2023
\documentclass{article}
-\usepackage{tkz-euclide}
+\usepackage[mini]{tkz-euclide}
\usepackage{tkz-elements}
\begin{document}
diff --git a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.pdf b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.pdf
index 1873fd5c85..5f1ded6e31 100644
--- a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.pdf
+++ b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.tex b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.tex
index 684475e28e..a95ae05b08 100644
--- a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_3.tex
@@ -1,7 +1,7 @@
% !TEX TS-program = lualatex
% Author Alain Matthes 2023
\documentclass{article}
-\usepackage{tkz-euclide}
+\usepackage[mini]{tkz-euclide}
\usepackage{tkz-elements}
\begin{document}
diff --git a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.pdf b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.pdf
index 5d703157aa..1428fd1d4f 100644
--- a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.pdf
+++ b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.tex b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.tex
index 3242fea11a..5dcf23e1ba 100644
--- a/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.tex
+++ b/macros/latex/contrib/tkz/tkz-elements/examples/tkz-elements-demo_4.tex
@@ -3,7 +3,7 @@
% Copyright (c) 2023 AlterMundus.
\documentclass{standalone}
-\usepackage{tkz-euclide}
+\usepackage[mini]{tkz-euclide}
\usepackage{tkz-elements}
\begin{document}
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz-elements.sty b/macros/latex/contrib/tkz/tkz-elements/latex/tkz-elements.sty
index f7416d8e4f..0a11787d21 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz-elements.sty
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz-elements.sty
@@ -1,5 +1,5 @@
% encoding : utf8
-% tkz-elements.sty v2.20c
+% tkz-elements.sty v2.25c
% Copyright 2024 Alain Matthes
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -11,7 +11,7 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\ProvidesPackage{tkz-elements}[2024/03/25 v2.20c Graphic Object Library]
+\ProvidesPackage{tkz-elements}[2024/04/27 v2.25c Graphic Object Library]
\RequirePackage{luacode}
\directlua{require "tkz_elements_main"}
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_circle.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_circle.lua
index 708e7b7af3..1999b8a073 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_circle.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_circle.lua
@@ -1,6 +1,6 @@
-- tkz_elements-circles.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_class.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_class.lua
index 491d237ac2..b6a1bf7a5a 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_class.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_class.lua
@@ -1,6 +1,6 @@
-- tkz_elements_class.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- from class.lua (Simple Lua Classes from Lua-users wiki)
-- Compatible with Lua 5.1 (not 5.0).
-- http://lua-users.org/wiki/SimpleLuaClasses DavidManura
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_ellipse.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_ellipse.lua
index f20b87a44f..a98cf40a63 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_ellipse.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_ellipse.lua
@@ -1,6 +1,6 @@
-- tkz_elements-ellipses.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_circles.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_circles.lua
index eacd8423a4..40f2a4ebbf 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_circles.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_circles.lua
@@ -1,6 +1,6 @@
-- tkz_elements_functions_circles.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_intersections.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_intersections.lua
index dc44e2ae88..69dcd6ace3 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_intersections.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_intersections.lua
@@ -1,6 +1,6 @@
-- tkz_elements_intersections.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_lines.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_lines.lua
index 2dd8d6467a..401ad46dda 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_lines.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_lines.lua
@@ -1,6 +1,6 @@
-- tkz_elements_functions_lines.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
@@ -150,4 +150,13 @@ function report_ (za,zb,d,pt)
else
return barycenter_({za,1-t},{zb,(t)}) +pt-za
end
-end \ No newline at end of file
+end
+
+function colinear_at_ (za,zb,pt,k)
+ if k == nil
+ then
+ return pt+zb-za
+else
+ return pt+k*(zb-za)
+end
+end
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua
index 9b4e51d295..a71c0f7c27 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua
@@ -1,6 +1,6 @@
-- tkz_elements_functions_maths.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_matrices.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_matrices.lua
index 7d3f475570..4371214047 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_matrices.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_matrices.lua
@@ -1,6 +1,6 @@
-- tkz_elements_functions_matrices.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_points.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_points.lua
index ce04c2d091..f1c4dc5d41 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_points.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_points.lua
@@ -1,6 +1,6 @@
-- tkz_elements_functions_points.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_regular.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_regular.lua
index bd8f7cab5b..5e92b4d598 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_regular.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_regular.lua
@@ -1,6 +1,6 @@
-- tkz_elements_functions_regular.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua
index 2e917db2f1..d4523d1826 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_triangles.lua
@@ -1,6 +1,6 @@
-- tkz_elements_functions_triangles.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_line.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_line.lua
index 68a5ad843b..9304768f31 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_line.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_line.lua
@@ -1,6 +1,6 @@
-- tkz_elements_lines.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
@@ -163,6 +163,15 @@ function line : report (d,pt)
return barycenter_({self.pa,1-t},{self.pb,(t)}) +pt-self.pa
end
end
+
+function line : colinear_at (pt,k)
+ if k == nil
+ then
+ return colinear_at_ (self.pa,self.pb,pt,1)
+ else
+ return colinear_at_ (self.pa,self.pb,pt,k)
+ end
+end
-------------- transformations -------------
function line: translation_pt ( pt )
return translation_ ( self.pb-self.pa,pt )
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_main.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_main.lua
index 3dffb3de46..10ee219519 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_main.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_main.lua
@@ -1,6 +1,6 @@
-- tkz_elements-main.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua
index ed5fa5b1f3..981ac68094 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua
@@ -1,6 +1,6 @@
-- tkz_elements_matrices.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_misc.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_misc.lua
index 6bf04756a6..94c9c555c0 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_misc.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_misc.lua
@@ -1,6 +1,6 @@
-- tkz_elements_functions_maths.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_parallelogram.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_parallelogram.lua
index 99c4344543..fd0a3533a3 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_parallelogram.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_parallelogram.lua
@@ -1,6 +1,6 @@
-- tkz_elements_parallelogram.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_point.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_point.lua
index 5e9d4fcd00..4eb4b549d1 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_point.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_point.lua
@@ -1,6 +1,6 @@
-- tkz_elements_point.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_quadrilateral.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_quadrilateral.lua
index f02c977e08..e77e0af561 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_quadrilateral.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_quadrilateral.lua
@@ -1,6 +1,6 @@
-- tkz_elements_quadrilateral.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_rectangle.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_rectangle.lua
index 7add1b244d..2c07f78399 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_rectangle.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_rectangle.lua
@@ -1,6 +1,6 @@
-- tkz_elements-rectangle.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_regular.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_regular.lua
index cc7a24ff06..0641a858de 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_regular.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_regular.lua
@@ -1,6 +1,6 @@
-- tkz_elements_regular.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_square.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_square.lua
index 7373886efc..1852c0ded4 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_square.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_square.lua
@@ -1,6 +1,6 @@
-- tkz_elements-square.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_triangle.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_triangle.lua
index d3a80bd777..c6dd2c3757 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_triangle.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_triangle.lua
@@ -1,6 +1,6 @@
-- tkz_elements_triangles.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
@@ -140,6 +140,17 @@ end
function triangle : soddy_center ()
return soddy_center_ (self.pa,self.pb,self.pc)
end
+
+function triangle : conway_points ()
+ local a1,a2,b1,b2,c1,c2
+ a1 = report_ (self.pb,self.pa,length(self.pb,self.pc),self.pa)
+ a2 = report_ (self.pc,self.pa,length(self.pb,self.pc),self.pa)
+ b1 = report_ (self.pa,self.pb,length(self.pa,self.pc),self.pb)
+ b2 = report_ (self.pc,self.pb,length(self.pa,self.pc),self.pb)
+ c1 = report_ (self.pb,self.pc,length(self.pb,self.pa),self.pc)
+ c2 = report_ (self.pa,self.pc,length(self.pb,self.pa),self.pc)
+ return a1,a2,b1,b2,c1,c2
+ end
-------------------
-- Result -> line
-------------------
@@ -214,7 +225,7 @@ local a,b,c
end
end
-function triangle: antiparallel(pt,n) -- n =1 swap n=2 2 swap
+function triangle: antiparallel(pt,n) -- n = 1 swap ; n= 2 2 swap
local a,b,c,i,u,v,w
a = self.pa
b = self.pb
@@ -305,6 +316,29 @@ function triangle : soddy_circle ()
s,i = soddy_center_ (self.pa,self.pb,self.pc)
return circle : new ( s , i )
end
+
+function triangle : cevian_circle (p)
+ local pta,ptb,ptc
+ pta,ptb,ptc = cevian_ (self.pa,self.pb,self.pc,p)
+ return circle : new (circum_circle_ (pta,ptb,ptc),pta)
+ end
+
+ function triangle : conway_circle ()
+ local i,t
+ i = in_center_ (self.pa,self.pb,self.pc)
+ t = report_ (self.pb,self.pa,length(self.pb,self.pc),self.pa)
+ return circle : new (i,t)
+ end
+
+function triangle : pedal_circle (pt)
+ local x,y,z,c
+ x = projection_ (self.pb,self.pc,pt)
+ y = projection_ (self.pa,self.pc,pt)
+ z = projection_ (self.pa,self.pb,pt)
+ c = circum_center_ (x,y,z)
+ return circle : new (c,x)
+end
+
-------------------
-- Result -> triangle
-------------------
@@ -361,6 +395,14 @@ end
function triangle: euler ()
return triangle : new (euler_points_ (self.pa,self.pb,self.pc) )
end
+
+function triangle: pedal (pt)
+ local x,y,z
+ x = projection_ (self.pb,self.pc,pt)
+ y = projection_ (self.pa,self.pc,pt)
+ z = projection_ (self.pa,self.pb,pt)
+ return triangle : new (x,y,z)
+end
-------------------
-- Result -> ellipse
-------------------
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_vector.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_vector.lua
index f3f93a0f53..8b26fe4bd3 100644
--- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_vector.lua
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_vector.lua
@@ -1,6 +1,6 @@
-- tkz_elements_vectors.lua
--- date 2024/03/25
--- version 2.20c
+-- date 2024/04/27
+-- version 2.25c
-- Copyright 2024 Alain Matthes
-- This work may be distributed and/or modified under the
-- conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/tkz/tkz-euclide/README.md b/macros/latex/contrib/tkz/tkz-euclide/README.md
index d0bc9ec3e8..a0b514e2b8 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/README.md
+++ b/macros/latex/contrib/tkz/tkz-euclide/README.md
@@ -1,5 +1,5 @@
# tkz-euclide — for euclidean geometry
-Release 5.06c 2024/02/04
+Release 5.10c 2024/04/27
## Description
@@ -9,7 +9,8 @@ It uses a Cartesian coordinate system orthogonormal (unit 1cm)
as well as tools to define the unique coordinates of points and to
manipulate them. The idea is to allow you to follow step by step a construction
that would be done by hand as naturally as possible.
-Now tkz-euclide introduces a "lua" option which allows to do most of the calculations using "lua".
+Now tkz-euclide introduces a `lua` option which allows to do most of the calculations using `lua`.
+A new option mini has been introduced. When one wishes to use tkz-euclide and tkz-elements together, it is recommended to load the package with this option. Thus, tkz-euclide will focus solely on the drawings.
## Licence
@@ -41,18 +42,20 @@ To use the package `tkz-euclide`, place the following lines in the preamble of
your LaTeX document:
```
-\usepackage{tkz-euclide} or \usepackage[lua]{tkz-euclide}
+\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
your code
\end{tikzpicture}
```
+
+This code can be compiled using either `pdflatex` or `lualatex`. In the latter case, the `lua` option allows most calculations to be performed with `lua`. If you do the calculations with `tkz-elements` then you can load `tkz-euclide` with the `mini` option.
If you use the `xcolor` package, load that package before `tkz-euclide` to avoid
package conflicts.
## Documentation
-Documentation for `tkz-euclide` is available on `CTAN`.
+Documentation for `tkz-euclide` is available on `CTAN`. A french version of the documentation is now available on my website [http://altermundus.fr](http://altermundus.fr)
## Examples
@@ -63,6 +66,11 @@ Other examples, in French, are on my site.
## History
+
+- 5.10c
+ - tkz-tool-eu-angles.arc.tex has been extracted from the file tkz-tool-eu-angles.tex
+ - Added `mini` option
+ - Added french documentation on my site (altermundus.fr)
- 5.06c
- Correction of a bug with the macro \tkzLabelAngle and the option “angle”
- Added \tkzSetUpCircle
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-FAQ.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-FAQ.tex
index 97e137007e..d0844abe81 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-FAQ.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-FAQ.tex
@@ -8,7 +8,9 @@
\item Don't forget that since version 4 the unit is obligatorily the "cm" it is thus necessary to withdraw the unit like here \tkzcname{tkzDrawCircle[R](O,3cm)} which becomes \tkzcname{tkzDrawCircle[R](O,3)}. The traditional options of \tkzname{TikZ} keep their units example\tkzname{ below right = 12pt} on the other hand one will write \tkzname{size=1.2} to position an arc in \tkzcname{tkzMarkAngle};
- \item The following error still happens to me from time to time. A point that is created has its name in brackets while a point that is used either as an option or as a parameter has its name in braces. Example \tkzcname{tkzGetPoint(A)} When defining an object, use braces and not brackets, so write: \tkzcname{tkzGetPoint\{A\}};
+ \item The following error still happens to me from time to time. A point that is created has its name in brackets while a point that is used either as an option or as a parameter has its name in braces.
+
+ Example \tkzcname{tkzGetPoint(A)} When defining an object, use braces and not brackets, so write: \tkzcname{tkzGetPoint\{A\}};
\item The changes in obtaining the points of intersection between lines and circles sometimes exchange the solutions, this leads either to a bad figure or to an error.
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-angles.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-angles.tex
index 3ab43bd43e..6ced16c2df 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-angles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-angles.tex
@@ -228,7 +228,8 @@ Here is another version of the construction of a mediator
\tkzCalcLength(A,B) \tkzGetLength{dAB}
\tkzFindSlopeAngle(A,B) \tkzGetAngle{tkzangle}
\begin{scope}[rotate=\tkzangle]
- \tkzSetUpArc[color=gray,line width=0.2pt,/tkzcompass/delta=10]
+ \tkzSetUpArc[color=gray,line width=0.2pt,%
+ /tkzcompass/delta=10]
\tkzDrawArc[R,arc](B,3/4*\dAB)(120,240)
\tkzDrawArc[R,arc](A,3/4*\dAB)(-45,60)
\tkzDrawLine(I,J) \tkzDrawSegment(A,B)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circleby.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circleby.tex
index 7af83e2aa1..fa38fb4cd1 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circleby.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circleby.tex
@@ -96,14 +96,14 @@ options & & examples \\
\subsubsection{\tkzname{Symmetry}}
\begin{tkzexample}[latex=7cm,small]
\begin{tikzpicture}[scale=1]
- \tkzDefPoint(0,0){A} \tkzDefPoint(3,1){B}
+ \tkzDefPoint(3,1){B}
\tkzDefPoint(3,2){C} \tkzDefPoint(4,3){D}
\tkzDefCircleBy[symmetry=center B](C,D)
\tkzGetPoints{C'}{D'}
\tkzDrawPoints[teal](B,C,D,C',D')
\tkzDrawLines[orange](C,C' D,D')
\tkzDrawCircles(C,D C',D')
- \tkzLabelPoints[color=teal](A,C,C')
+ \tkzLabelPoints[color=teal](C,C')
\tkzLabelPoints[color=teal,above](D)
\tkzLabelPoints[color=teal,below](D')
\end{tikzpicture}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circles.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circles.tex
index 2a336d91af..f36f2dd2a7 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-circles.tex
@@ -129,7 +129,8 @@ We want to define an excircle of a triangle relatively to point $C$
\tkzDrawPolygon(A,B,C)
\tkzDrawLines[add=0 and 1.5](C,A C,B)
\tkzDrawSegments(J_c,X_c I,D I,F J_c,Y_c)
- \tkzMarkRightAngles(A,F,I B,D,I J_c,X_c,A J_c,Y_c,B)
+ \tkzMarkRightAngles(A,F,I B,D,I J_c,X_c,A%
+ J_c,Y_c,B)
\tkzDrawPoints(B,C,A,I,D,F,X_c,J_c,Y_c)
\tkzLabelPoints(B,A,J_c,I,D)
\tkzLabelPoints[above](Y_c)
@@ -205,21 +206,22 @@ We verify that this circle passes through the middle of each side.
The incircle of the medial triangle $M_aM_bM_c$ is the Spieker circle:
\begin{tkzexample}[latex=6cm, small]
-\begin{tikzpicture}[scale=1]
+\begin{tikzpicture}[scale=1.25]
\tkzDefPoints{ 0/0/A,4/0/B,0.8/4/C}
- \tkzDefSpcTriangle[medial](A,B,C){M_a,M_b,M_c}
- \tkzDefTriangleCenter[spieker](A,B,C)
- \tkzGetPoint{S_p}
- \tkzDrawPolygon(A,B,C)
- \tkzDrawPolygon[cyan](M_a,M_b,M_c)
- \tkzDrawPoints(B,C,A)
- \tkzDefCircle[spieker](A,B,C)
- \tkzDrawPoints[new](M_a,M_b,M_c,S_p)
- \tkzDrawCircle[new](tkzFirstPointResult,tkzSecondPointResult)
- \tkzLabelPoints[right](M_a)
- \tkzLabelPoints[left](M_b)
- \tkzLabelPoints[below](A,B,M_c,S_p)
- \tkzLabelPoints[above](C)
+ \tkzDefSpcTriangle[medial](A,B,C){M_a,M_b,M_c}
+ \tkzDefTriangleCenter[spieker](A,B,C)
+ \tkzGetPoint{S_p}
+ \tkzDrawPolygon(A,B,C)
+ \tkzDrawPolygon[cyan](M_a,M_b,M_c)
+ \tkzDrawPoints(B,C,A)
+ \tkzDefCircle[spieker](A,B,C)
+ \tkzDrawPoints[new](M_a,M_b,M_c,S_p)
+ \tkzDrawCircle[new](tkzFirstPointResult,%
+ tkzSecondPointResult)
+ \tkzLabelPoints[right](M_a)
+ \tkzLabelPoints[left](M_b)
+ \tkzLabelPoints[below](A,B,M_c,S_p)
+ \tkzLabelPoints[above](C)
\end{tikzpicture}
\end{tkzexample}
@@ -266,7 +268,8 @@ arguments & default & definition \\
Jc,Xc Jc,Yc Jc,Zc
I,Ia I,Ib I,Ic)
\tkzMarkRightAngles[size=.2,fill=gray!15](Ja,Za,B Ja,Xa,B Ja,Ya,C Jb,Yb,C)
-\tkzMarkRightAngles[size=.2,fill=gray!15](Jb,Zb,B Jb,Xb,C Jc,Yc,A Jc,Zc,B Jc,Xc,C I,Ia,B I,Ib,C I,Ic,A)
+\tkzMarkRightAngles[size=.2,fill=gray!15](Jb,Zb,B Jb,Xb,C Jc,Yc,A Jc,Zc,B)
+\tkzMarkRightAngles[size=.2,fill=gray!15](Jc,Xc,C I,Ia,B I,Ib,C I,Ic,A)
\tkzDrawSegments[blue](Jc,C Ja,A Jb,B)
\tkzDrawPoints(A,B,C,Xa,Xb,Xc,Ja,Jb,Jc,Ia,Ib,Ic,Ya,Yb,Yc,Za,Zb,Zc)
\tkzLabelPoints(A,Ya,Yb,Ja,I)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-clipping.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-clipping.tex
index 430c8605cc..a0db97f729 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-clipping.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-clipping.tex
@@ -1,5 +1,7 @@
\section{Controlling Bounding Box}
-From the \tkzimp{PgfManual} :"When you add the clip option, the current path is used for clipping subsequent drawings. Clipping never enlarges the clipping area. Thus, when you clip against a certain path and then clip again against another path, you clip against the intersection of both.
+From the \tkzimp{PgfManual} :
+
+"When you add the clip option, the current path is used for clipping subsequent drawings. Clipping never enlarges the clipping area. Thus, when you clip against a certain path and then clip again against another path, you clip against the intersection of both.
The only way to enlarge the clipping path is to end the {pgfscope} in which the clipping was done. At the end of a {pgfscope} the clipping path that was in force at the beginning of the scope is reinstalled."
@@ -10,7 +12,7 @@ The following command \tkzcname{pgfresetboundingbox} clears a bounding box and e
\subsection{Utility of \tkzcname{tkzInit}}
However, it is sometimes necessary to control the size of what will be displayed.
- To do this, you need to have prepared the bounding box you are going to work in, this is the role of the macro \tkzNameMacro{tkzInit}. For some drawings, it is interesting to fix the extreme values (xmin,xmax,ymin and ymax) and to "clip" the definition rectangle in order to control the size of the figure as well as possible.
+ To do this, you need to have prepared the bounding box you are going to work in, this is the role of the macro \tkzNameMacro{tkzInit}. For some drawings, it is interesting to fix the extreme values (xmin,xmax,ymin and ymax) and to \code{clip} the definition rectangle in order to control the size of the figure as well as possible.
The two macros that are useful for controlling the bounding box:
\begin{itemize}
@@ -39,7 +41,7 @@ options & default & definition \\
\medskip
The role of \tkzcname{tkzInit} is to define a \textcolor{red}{orthogonal} coordinates system and a rectangular part of the plane in which you will place your drawings using Cartesian coordinates.
-This macro allows you to define your working environment as with a calculator. With \tkzname{\tkznameofpack} 4 \tkzcname{xstep} and \tkzcname{ystep} are always 1. Logically it is no longer useful to use \tkzcname{tkzInit}, except for an action like "Clipping Out".
+This macro allows you to define your working environment as with a calculator. With \tkzname{\tkznameofpack} 4 \tkzcname{xstep} and \tkzcname{ystep} are always 1. Logically it is no longer useful to use \tkzcname{tkzInit}, except for an action like \code{Clipping Out}.
\end{NewMacroBox}
@@ -64,7 +66,7 @@ The role of the \tkzname{space} option is to enlarge the visible part of the dra
-The role of this macro is to "clip" the initial rectangle so that only the paths contained in this rectangle are drawn.
+The role of this macro is to \code{clip} the initial rectangle so that only the paths contained in this rectangle are drawn.
\begin{tkzexample}[latex=8cm,small]
\begin{tikzpicture}
@@ -83,7 +85,7 @@ It is possible to add a bit of space
\end{tkzltxexample}
\subsection{\tkzcname{tkzClip} and the option \tkzname{space}}
-This option allows you to add some space around the "clipped" rectangle.
+This option allows you to add some space around the \code{clipped} rectangle.
\begin{tkzexample}[latex=8cm,small]
\begin{tikzpicture}
\tkzInit[xmax=4, ymax=3]
@@ -94,7 +96,7 @@ This option allows you to add some space around the "clipped" rectangle.
\tkzDrawSegment(A,B)
\end{tikzpicture}
\end{tkzexample}
-The dimensions of the "clipped" rectangle are \tkzname{xmin-1}, \tkzname{ymin-1}, \tkzname{xmax+1} and \tkzname{ymax+1}.
+The dimensions of the \code{clipped} rectangle are \tkzname{xmin-1}, \tkzname{ymin-1}, \tkzname{xmax+1} and \tkzname{ymax+1}.
%<--------------------------------------------------------------------------->
% tkzShowBB
@@ -116,7 +118,8 @@ This macro displays the bounding box. A rectangular frame surrounds the bounding
\tkzClipBB
\tkzDefCircle[R](A,5) \tkzGetPoint{a}
\tkzDrawCircle(A,a)
- \tkzShowBB[line width = 4pt,fill=teal!10,opacity=.4]
+ \tkzShowBB[line width = 4pt,fill=teal!10,%
+ opacity=.4]
\end{scope}
\tkzDefCircle[R](A,4) \tkzGetPoint{b}
\tkzDrawCircle[red](A,b)
@@ -207,7 +210,7 @@ options & default & definition \\
\end{tikzpicture}
\end{tkzexample}
-\subsubsection{Example: use of "Clip" for Sangaku in a square}
+\subsubsection{Example: use of \code{Clip} for Sangaku in a square}
\begin{tkzexample}[latex=7cm, small]
\begin{tikzpicture}[scale=.75]
\tkzDefPoint(0,0){A} \tkzDefPoint(8,0){B}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-compass.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-compass.tex
index 088d39f8b0..3c04202262 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-compass.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-compass.tex
@@ -64,7 +64,7 @@ options & default & definition \\
% subsubsection use_tkzcname_tkzcompasss (end)
\begin{tkzexample}[latex=7cm,small]
-\begin{tikzpicture}[scale=.75]
+\begin{tikzpicture}[scale=.6]
\tkzDefPoint(2,2){A} \tkzDefPoint(5,-2){B}
\tkzDefPoint(3,4){C} \tkzDrawPoints(A,B)
\tkzDrawPoint[shape=cross out](C)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-documentation.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-documentation.tex
index a24b7e63b4..b3e889b817 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-documentation.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-documentation.tex
@@ -1,6 +1,6 @@
\section{About this documentation and the examples}
-It is obtained by compiling with "lualatex". I use a class \tkzname{doc.cls} based on \tkzname{scrartcl}.
+It is obtained by compiling with \code{lualatex}. I use a class \tkzname{doc.cls} based on \tkzname{scrartcl}.
Below the list of styles used in the documentation. To understand how to use the styles see the section \ref{custom}
@@ -25,5 +25,4 @@ Below the list of styles used in the documentation. To understand how to use the
Some examples use predefined styles like
-
|\tikzset{new/.style={color=orange,line width=.2pt}} | \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-drawing.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-drawing.tex
index 0017d4390e..d511637968 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-drawing.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-drawing.tex
@@ -85,7 +85,7 @@ options & default & definition \\
\end{tabular}
\medskip
-\tkzHandBomb\ Beware of the final "s", an oversight leads to cascading errors if you try to draw multiple points. The options are the same as for the previous macro.
+\tkzHandBomb\ Beware of the final \code{s}, an oversight leads to cascading errors if you try to draw multiple points. The options are the same as for the previous macro.
\end{NewMacroBox}
\subsubsection{Example}
@@ -283,18 +283,20 @@ I'll let you look at the examples to see what you can do with these styles.
\tkzCalcLength(B,C)\tkzGetLength{BCl}
\tkzCalcLength(A,C)\tkzGetLength{ACl}
\begin{scope}[dim style/.style={dashed,sloped,teal}]
- \tkzDrawSegment[dim={\pgfmathprintnumber\BCl,6pt,
- text=red}](C,B)
- \tkzDrawSegment[dim={\pgfmathprintnumber\ACl,6pt,}](A,C)
- \tkzDrawSegment[dim={\pgfmathprintnumber\ABl,-6pt,}](A,B)
+ \tkzDrawSegment[dim={\pgfmathprintnumber\BCl,6pt,%
+ text=red}](C,B)
+ \tkzDrawSegment[dim={\pgfmathprintnumber\ACl,%
+ 6pt,}](A,C)
+ \tkzDrawSegment[dim={\pgfmathprintnumber\ABl,%
+ -6pt,}](A,B)
\end{scope}
\tkzLabelPoints(A,B) \tkzLabelPoints[above](C)
\end{tikzpicture}
\end{tkzexample}
\subsubsection{Adding dimensions with option \tkzname{dim} part II}
-\begin{tkzexample}[latex=7cm,small]
-\begin{tikzpicture}[scale=.75]
+\begin{tkzexample}[latex=6cm,small]
+\begin{tikzpicture}[scale=.5]
\tkzDefPoints{0/0/O,-2/0/A,2/0/B,
-2/4/C,2/4/D,2/-4/E,-2/-4/F}
\tkzDrawPolygon(C,...,F)
@@ -699,7 +701,7 @@ arguments & example & explanation \\
\toprule
arguments & example & explanation \\
\midrule
-\TAline{\parg{C,a,b,An}}{\parg{C,4,2,45}} {C center 4 and 2 lengths of long axis and small axis} \\
+\TAline{\parg{C,a,b,An}}{\parg{C,4,2,45}} {C center; 4 and 2 lengths of half-axis} \\
& & 45 slope of main axis \\
\bottomrule
\end{tabular}
@@ -708,9 +710,9 @@ arguments & example & explanation \\
Of course, you have to add all the styles of \TIKZ\ for the tracings...
\end{NewMacroBox}
-\subsubsection{Option \tkzname{towards}}
-\begin{tkzexample}[latex=7cm,small]
- \begin{tikzpicture}
+\subsubsection{Example of drawing an ellipse }
+\begin{tkzexample}[latex=6cm,small]
+ \begin{tikzpicture}[scale=.75]
\tkzDefPoint(0,4){C}
\tkzDrawEllipse[blue](C,4,2,45)
\tkzLabelPoints(C)
@@ -879,7 +881,7 @@ This option allows a bit like \tkzcname{tkzCompass} to place an arc and overflow
\subsubsection{Option \tkzname{angles}: example 2}
-\begin{tkzexample}[latex=6cm,small]
+\begin{tkzexample}[latex=7cm,small]
\begin{tikzpicture}
\tkzDefPoint(0,0){O}
\tkzDefPoint(5,0){I}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-elements.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-elements.tex
index 4d01262ccb..ad4db72817 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-elements.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-elements.tex
@@ -2,7 +2,7 @@
To work with my package, you need to have notions of \LATEX\ as well as \TIKZ.
-In this paragraph, we start looking at the "rules" and "symbols" used to create a figure with \tkzname{\tkznameofpack}.
+In this paragraph, we start looking at the \code{rules} and \code{symbols} used to create a figure with \tkzname{\tkznameofpack}.
\subsection{Objects and language}
@@ -15,7 +15,7 @@ The used points are passed as parameters between parentheses while the created p
The code of the figures is placed in an environment \tkzimp{tikzpicture}
-Contrary to \TIKZ, you should not end a macro with ";". We thus lose the important notion which is the \tkzimp{path}. However, it is possible to place some code between the macros \tkzname{\tkznameofpack}.
+Contrary to \TIKZ, you should not end a macro with “;”. We thus lose the important notion which is the \tkzimp{path}. However, it is possible to place some code between the macros \tkzname{\tkznameofpack}.
Among the first category, |\tkzDefPoint| allows you to define fixed points. It will be studied in detail later. Here we will see in detail the macro |\tkzDefTriangle|.
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-examples.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-examples.tex
index e436c406fe..ec8982331b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-examples.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-examples.tex
@@ -955,19 +955,18 @@ From Wikipedia {\emph{In geometry, the Pappus chain is a ring of circles betwee
\end{tikzpicture}%
\begin{tkzexample}[latex=7cm,small]
-\begin{tikzpicture}
- \tkzDefPoints{0/0/O_1,0/1/O_2,0/3/A}
- \tkzDefPoint(15:3){F}
- \tkzInterLC(F,O_1)(O_1,A) \tkzGetSecondPoint{E}
- \tkzDefLine[parallel=through O_2](E,F)
- \tkzGetPoint{x}
- \tkzInterLC(x,O_2)(O_2,A) \tkzGetPoints{D}{C}
- \tkzDrawCircles(O_1,A O_2,A)
- \tkzDrawSegments[new](O_1,A E,F C,D)
- \tkzDrawSegments[purple](A,E A,F)
- \tkzDrawPoints(A,O_1,O_2,E,F,C,D)
- \tkzLabelPoints(A,O_1,O_2,E,F,C,D)
-\end{tikzpicture}
+ \begin{tikzpicture}[scale=.75]
+ \tkzDefPoints{0/0/O_1,0/1/O_2,0/3/A}
+ \tkzDefPoint(15:3){F}
+ \tkzDefPointBy[symmetry=center O_1](F) \tkzGetPoint{E}
+ \tkzDefLine[parallel=through O_2](E,F) \tkzGetPoint{x}
+ \tkzInterLC(x,O_2)(O_2,A) \tkzGetPoints{D}{C}
+ \tkzDrawCircles(O_1,A O_2,A)
+ \tkzDrawSegments[orange](O_1,A E,F C,D)
+ \tkzDrawSegments[purple](A,E A,F)
+ \tkzDrawPoints(A,O_1,O_2,E,F,x,C,D)
+ \tkzLabelPoints(A,O_1,O_2,E,F,x,C,D)
+ \end{tikzpicture}
\end{tkzexample}
$(CD) \parallel (EF)$ $(AO_1)$ is secant to these two lines so
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-filling.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-filling.tex
index c8f1ea14f1..f7fc8883fe 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-filling.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-filling.tex
@@ -41,7 +41,8 @@ You don't need to put \tkzname{radius} because that's the default option. Of cou
\tkzDefMidPoint(A,D) \tkzGetPoint{F}
\tkzDefMidPoint(B,C) \tkzGetPoint{E}
\tkzDefMidPoint(B,D) \tkzGetPoint{Q}
- \tkzDefLine[tangent from = B](F,A) \tkzGetPoints{H}{G}
+ \tkzDefLine[tangent from = B](F,A)
+ \tkzGetPoints{H}{G}
\tkzInterLL(F,G)(C,D) \tkzGetPoint{J}
\tkzInterLL(A,J)(F,E) \tkzGetPoint{K}
\tkzDefPointBy[projection=onto B--A](K)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-intersection.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-intersection.tex
index 1583f91e2b..64bfe6ecfa 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-intersection.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-intersection.tex
@@ -109,7 +109,7 @@ In the following example, the drawing of the circle uses two points and the inte
\subsubsection{Line passing through the center option \tkzname{common}}
This case is special. You cannot compare the angles. In this case, the option \tkzname{near} must be used. \tkzname{tkzFirstPoint} is assigned to the point closest to the first point given for the line. Here we want $A$ to be closest to $Lb$.
-\begin{tkzexample}[latex=7cm,small]
+\begin{tkzexample}[latex=8cm,small]
\begin{tikzpicture}
\tkzDefPoints{% x y name
0 /1 /D,
@@ -170,12 +170,14 @@ As you can see $\widehat{BCO} < \widehat{BEO} $. To tell the truth,$ \widehat{BE
\tkzDefPoint(0,1){J}
\tkzDefPoint(0,0){O}
\foreach \i in {0,-5,-10,...,-90}{
- \tkzDefPoint({2.5*cos(\i*pi/180)},{1+2.5*sin(\i*pi/180)}){P}
+ \tkzDefPoint({2.5*cos(\i*pi/180)},%
+ {1+2.5*sin(\i*pi/180)}){P}
\tkzInterLC[R](P,J)(O,1)\tkzGetPoints{N}{M}
\tkzDrawSegment[color=orange](J,N)
\tkzDrawPoints[red](N)}
\foreach \i in {-90,-95,...,-175,-180}{
- \tkzDefPoint({2.5*cos(\i*pi/180)},{1+2.5*sin(\i*pi/180)}){P}
+ \tkzDefPoint({2.5*cos(\i*pi/180)},%
+ {1+2.5*sin(\i*pi/180)}){P}
\tkzInterLC[R](P,J)(O,1)\tkzGetPoints{N}{M}
\tkzDrawSegment[color=orange](J,M)
\tkzDrawPoints[red](M)}
@@ -212,14 +214,14 @@ $D$ is the point closest to $b$.
\subsubsection{More complex example of a line-circle intersection}
Figure from \url{http://gogeometry.com/problem/p190_tangent_circle}
-\begin{tkzexample}[latex=7cm,small]
+\begin{tkzexample}[latex=6.5cm,small]
\begin{tikzpicture}[scale=.75]
\tkzDefPoint(0,0){A}
\tkzDefPoint(8,0){B}
- \tkzDefMidPoint(A,B) \tkzGetPoint{O}
- \tkzDefMidPoint(O,B) \tkzGetPoint{O'}
- \tkzDefLine[tangent from=A](O',B) \tkzGetFirstPoint{E}
- \tkzInterLC(A,E)(O,B) \tkzGetFirstPoint{D}
+ \tkzDefMidPoint(A,B) \tkzGetPoint{O}
+ \tkzDefMidPoint(O,B) \tkzGetPoint{O'}
+ \tkzDefLine[tangent from=A](O',B)\tkzGetFirstPoint{E}
+ \tkzInterLC(A,E)(O,B) \tkzGetFirstPoint{D}
\tkzDefPointBy[projection=onto A--B](D)
\tkzGetPoint{F}
\tkzDrawCircles(O,B O',B)
@@ -284,7 +286,7 @@ With \tkzname{xfp} and \tkzcname{fpeval}:
\end{tkzexample}
-\subsubsection{Option "with nodes"}
+\subsubsection{Option \code{with nodes}}
\begin{tkzexample}[latex=8cm,small]
\begin{tikzpicture}[scale=.75]
\tkzDefPoints{0/0/A,4/0/B,1/1/D,2/0/E}
@@ -315,7 +317,7 @@ options & default & definition \\
\end{tabular}
\medskip
-This macro defines the intersection point(s) $I$ and $J$ of the two center circles $O$ and $O'$. If the two circles do not have a common point then the macro ends with an error that is not handled. If the centers are $O$ and $O'$ and the intersections are $A$ and $B$ then the angles $\widehat{O,A,O'}$ and $\widehat{O,B,O'}$ are in opposite directions. \tkzname{tkzFirstPoint} is assigned to the point that forms the "clockwise" angle.
+This macro defines the intersection point(s) $I$ and $J$ of the two center circles $O$ and $O'$. If the two circles do not have a common point then the macro ends with an error that is not handled. If the centers are $O$ and $O'$ and the intersections are $A$ and $B$ then the angles $\widehat{O,A,O'}$ and $\widehat{O,B,O'}$ are in opposite directions. \tkzname{tkzFirstPoint} is assigned to the point that forms the \code{clockwise} angle.
\end{NewMacroBox}
\begin{NewMacroBox}{tkzTestInterCC}{\parg{$O,A$}\parg{$O',B$}}%
@@ -346,14 +348,15 @@ So the arguments are two couples which define two circles with a center and a po
\subsubsection{circle-circle intersection with \tkzname{common} point.}
\begin{tkzexample}[latex=7cm,small]
- \begin{tikzpicture}[scale=.5]
- \tkzDefPoints{0/0/O,5/-1/A,2/2/B}
- \tkzDrawPoints(O,A,B)
- \tkzDrawCircles(O,B A,B)
- \tkzInterCC[common=B](O,B)(A,B)\tkzGetFirstPoint{C}
- \tkzDrawPoint(C)
- \tkzLabelPoints[above](O,A,B,C)
- \end{tikzpicture}
+\begin{tikzpicture}[scale=.5]
+ \tkzDefPoints{0/0/O,5/-1/A,2/2/B}
+ \tkzDrawPoints(O,A,B)
+ \tkzDrawCircles(O,B A,B)
+ \tkzInterCC[common=B](O,B)(A,B)
+ \tkzGetFirstPoint{C}
+ \tkzDrawPoint(C)
+ \tkzLabelPoints[above](O,A,B,C)
+\end{tikzpicture}
\end{tkzexample}
\subsubsection{circle-circle intersection order of points.}
@@ -361,9 +364,10 @@ The idea is to compare the angles formed with the first center, a resultant poin
As you can see $\widehat{ODB} < \widehat{OBE} $
-\begin{tkzexample}[latex=7cm,small]
+\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}[scale=.5]
- \pgfkeys{/pgf/number format/.cd,fixed relative,precision=4}
+ \pgfkeys{/pgf/number format/.cd,fixed relative,
+ precision=4}
\tkzDefPoints{0/0/O,5/-1/A,2/2/B,2/-1/C}
\tkzDrawPoints(O,A,B)
\tkzDrawCircles(O,A B,C)
@@ -382,8 +386,6 @@ As you can see $\widehat{ODB} < \widehat{OBE} $
\end{tikzpicture}
\end{tkzexample}
-
-
\subsubsection{Construction of an equilateral triangle.}
$\widehat{A,C,B}$ is a clockwise angle
\begin{tkzexample}[latex=7cm,small]
@@ -410,13 +412,13 @@ $\widehat{A,C,B}$ is a clockwise angle
\begin{tikzpicture}[scale=.6]
\tkzDefPoint(0,0){A}
\tkzDefPoint(3,2){B}
- \tkzInterCC(A,B)(B,A) \tkzGetSecondPoint{D}
- \tkzInterCC(D,B)(B,A) \tkzGetPoints{A}{C}
- \tkzInterCC(D,B)(A,B) \tkzGetPoints{E}{B}
- \tkzInterLC[common=D](C,D)(E,D) \tkzGetFirstPoint{F}
- \tkzInterLL(A,F)(B,C) \tkzGetPoint{O}
- \tkzInterLL(O,D)(A,B) \tkzGetPoint{H}
- \tkzInterLL(O,E)(A,B) \tkzGetPoint{G}
+ \tkzInterCC(A,B)(B,A) \tkzGetSecondPoint{D}
+ \tkzInterCC(D,B)(B,A) \tkzGetPoints{A}{C}
+ \tkzInterCC(D,B)(A,B) \tkzGetPoints{E}{B}
+ \tkzInterLC[common=D](C,D)(E,D)\tkzGetFirstPoint{F}
+ \tkzInterLL(A,F)(B,C) \tkzGetPoint{O}
+ \tkzInterLL(O,D)(A,B) \tkzGetPoint{H}
+ \tkzInterLL(O,E)(A,B) \tkzGetPoint{G}
\tkzDrawCircles(D,E A,B B,A E,A)
\tkzDrawSegments[](O,F O,B O,D O,E)
\tkzDrawPoints(A,...,H)
@@ -425,7 +427,7 @@ $\widehat{A,C,B}$ is a clockwise angle
\end{tikzpicture}
\end{tkzexample}
-\subsubsection{With the option "\tkzimp{with nodes}"}
+\subsubsection{With the option \code{with nodes}}
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}[scale=.5]
\tkzDefPoints{0/0/A,0/5/B,5/0/C}
@@ -449,17 +451,17 @@ $\widehat{A,C,B}$ is a clockwise angle
\subsubsection{Mix of intersections}
\begin{tkzexample}[latex=8cm,small]
-\begin{tikzpicture}[scale = .75]
+\begin{tikzpicture}[scale = .7]
\tkzDefPoint(2,2){A}
\tkzDefPoint(0,0){B}
\tkzDefPoint(-2,2){C}
\tkzDefPoint(0,4){D}
\tkzDefPoint(4,2){E}
\tkzCircumCenter(A,B,C)\tkzGetPoint{O}
- \tkzInterCC[R](O,2)(D,2) \tkzGetPoints{M1}{M2}
+ \tkzInterCC[R](O,2)(D,2)\tkzGetPoints{M1}{M2}
\tkzInterCC(O,A)(D,O) \tkzGetPoints{1}{2}
- \tkzInterLC(A,E)(B,M1) \tkzGetSecondPoint{M3}
- \tkzInterLC(O,C)(M3,D) \tkzGetSecondPoint{L}
+ \tkzInterLC(A,E)(B,M1)\tkzGetSecondPoint{M3}
+ \tkzInterLC(O,C)(M3,D)\tkzGetSecondPoint{L}
\tkzDrawSegments(C,L)
\tkzDrawPoints(A,B,C,D,E,M1,M2,M3,O,L)
\tkzDrawSegments(O,E)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-labelling.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-labelling.tex
index f3c8a0b3da..6fe0133db1 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-labelling.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-labelling.tex
@@ -330,7 +330,7 @@ options & default & definition \\
\end{tabular}
\medskip
-\emph{ We can use the styles from \TIKZ. The label is created and therefore "passed" between braces.}
+\emph{ We can use the styles from \TIKZ. The label is created and therefore \code{passed} between braces.}
\end{NewMacroBox}
\subsubsection{Example}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lines.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lines.tex
index cc4177dd9f..4d42e3d571 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lines.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lines.tex
@@ -25,9 +25,9 @@ arguments & example & explanation \\
\toprule
options & default & definition \\
\TOline{mediator}{}{perpendicular bisector of a line segment}
-\TOline{perpendicular=through\dots}{mediator}{perpendicular to a straight line passing through a point}
+\TOline{perpendicular=through\dots}{mediator}{perpendicular to a line passing through a point}
\TOline{orthogonal=through\dots}{mediator}{see above }
-\TOline{parallel=through\dots}{mediator}{parallel to a straight line passing through a point}
+\TOline{parallel=through\dots}{mediator}{parallel to a line passing through a point}
\TOline{bisector}{mediator}{bisector of an angle defined by three points}
\TOline{bisector out}{mediator}{exterior angle bisector}
\TOline{symmedian}{mediator}{symmedian from a vertex }
@@ -59,7 +59,7 @@ options & default & definition \\
Based on a figure from O. Reboux with pst-eucl by D Rodriguez.
\begin{tkzexample}[latex=7cm,small]
-\begin{tikzpicture}[scale=.6]
+\begin{tikzpicture}[scale=.75]
% necessary
\tkzInit[xmin=-6,ymin=-4,xmax=6,ymax=6]
\tkzClip
@@ -80,7 +80,7 @@ Based on a figure from O. Reboux with pst-eucl by D Rodriguez.
Based on a figure from O. Reboux with pst-eucl by D Rodriguez.
It is not necessary to name the two points that define the mediator.
-\begin{tkzexample}[latex=7cm,small]
+\begin{tkzexample}[latex=8cm,small]
\begin{tikzpicture}[scale=.6]
\tkzInit[xmin=-6,ymin=-4,xmax=6,ymax=6]
\tkzClip
@@ -112,11 +112,13 @@ It is not necessary to name the two points that define the mediator.
Archimedes' Book of Lemmas proposition 1
\begin{tkzexample}[latex=7cm,small]
- \begin{tikzpicture}[scale=.75]
+ \begin{tikzpicture}
\tkzDefPoints{0/0/O_1,0/1/O_2,0/3/A}
\tkzDefPoint(15:3){F}
- \tkzInterLC(F,O_1)(O_1,A) \tkzGetSecondPoint{E}
- \tkzDefLine[parallel=through O_2](E,F) \tkzGetPoint{x}
+ \tkzDefPointBy[symmetry=center O_1](F)
+ \tkzGetPoint{E}
+ \tkzDefLine[parallel=through O_2](E,F)
+ \tkzGetPoint{x}
\tkzInterLC(x,O_2)(O_2,A) \tkzGetPoints{D}{C}
\tkzDrawCircles(O_1,A O_2,A)
\tkzDrawSegments[new](O_1,A E,F C,D)
@@ -169,10 +171,12 @@ Archimedes' Book of Lemmas proposition 1
\subsubsection{ With option \tkzname{euler}} % (fold)
\label{sub:eulerline}
\begin{tkzexample}[latex=7 cm,small]
-\begin{tikzpicture}
+\begin{tikzpicture}[scale=.75]
\tkzDefPoints{0/0/A,6/0/B,0.8/4/C}
-\tkzDefLine[euler](A,B,C) \tkzGetPoints{h}{e}
-\tkzDefTriangleCenter[circum](A,B,C) \tkzGetPoint{o}
+\tkzDefLine[euler](A,B,C)
+\tkzGetPoints{h}{e}
+\tkzDefTriangleCenter[circum](A,B,C)
+\tkzGetPoint{o}
\tkzDrawPolygon[teal](A,B,C)
\tkzDrawPoints[red](A,B,C,h,e,o)
\tkzDrawLine[add= 2 and 2](h,e)
@@ -205,18 +209,22 @@ The tangent is not drawn. With option \tkzname{at}, a point of the tangent is g
\begin{tkzexample}[latex=7cm,small]
\begin{tikzpicture}[scale=1,rotate=-30]
\tkzDefPoints{0/0/Q,0/2/A,6/-1/O}
-\tkzDefLine[tangent from = O](Q,A) \tkzGetPoints{R}{S}
-\tkzInterLC[near](O,Q)(Q,A) \tkzGetPoints{M}{N}
+\tkzDefLine[tangent from = O](Q,A)
+\tkzGetPoints{R}{S}
+\tkzInterLC[near](O,Q)(Q,A)
+\tkzGetPoints{M}{N}
\tkzDrawCircle(Q,M)
\tkzDrawSegments[new,add = 0 and .2](O,R O,S)
\tkzDrawSegments[gray](N,O R,Q S,Q)
\tkzDrawPoints(O,Q,R,S,M,N)
\tkzMarkAngle[gray,-stealth,size=1](O,R,Q)
\tkzFindAngle(O,R,Q) \tkzGetAngle{an}
-\tkzLabelAngle(O,R,Q){$\pgfmathprintnumber{\an}^\circ$}
+\tkzLabelAngle(O,R,Q){%
+ $\pgfmathprintnumber{\an}^\circ$}
\tkzMarkAngle[gray,-stealth,size=1](O,S,Q)
\tkzFindAngle(O,S,Q) \tkzGetAngle{an}
-\tkzLabelAngle(O,S,Q){$\pgfmathprintnumber{\an}^\circ$}
+\tkzLabelAngle(O,S,Q){%
+ $\pgfmathprintnumber{\an}^\circ$}
\tkzLabelPoints(Q,O,M,N,R)
\tkzLabelPoints[above,text=red](S)
\end{tikzpicture}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lua.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lua.tex
index 88a2c293ec..714ce64bc0 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lua.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lua.tex
@@ -1,7 +1,11 @@
\newpage
-\section{Working with lua : option \tkzname{lua}} \label{calc_with_lua}
+\section{Working with lua} \label{calc_with_lua}
-You can now use the "lua" option with \tkzname{\tkznameofpack} version 5.
+\subsubsection{Option \code{lua}} % (fold)
+\label{ssub:option_code_lua}
+
+% subsubsection option_code_lua (end)
+You can now use the \ItkzPopt{tkz-euclide}{lua} option with \tkzname{\tkznameofpack} version 5.
You just have to write in your preamble
|usepackage[lua]{tkz-euclide}|.
@@ -11,12 +15,18 @@ Without the option you can use \tkzname{\tkznameofpack} with the proposed code o
This version is not yet finalized although the documentation you are currently reading has been compiled with this option.
-Some information about the method used and the results obtained. Concerning the method, I considered two possibilities. The first one was simply to replace everywhere I could the calculations made by "xfp" or sometimes by "lua". This is how I went from "fp" to "xfp" and now to "lua". The second and more ambitious possibility would have been to associate to each point a complex number and to make the calculations on the complexes with "lua". Unfortunately for that I have to use libraries for which I don't know the license.
+Some information about the method used and the results obtained. Concerning the method, I considered two possibilities. The first one was simply to replace everywhere I could the calculations made by \code{xfp} or sometimes by \code{lua}. This is how I went from \code{fp} to \code{xfp} and now to \code{lua}. The second and more ambitious possibility would have been to associate to each point a complex number and to make the calculations on the complexes with \code{lua}. Unfortunately for that I have to use libraries for which I don't know the license.
-Otherwise the results are good. This documentation with "LualaTeX" and "xfp" compiles in 47s while with "lua" it takes only 30s for 236 pages.
+Otherwise the results are good. This documentation with \code{LualaTeX} and \code{xfp} compiles in 47s while with \code{lua} it takes only 30s for 236 pages.
-Another document of 61 pages is compiled 16s with "pdflaTeX" and "xfp" and 13s with "LualaTeX" and "xfp".
+Another document of 61 pages is compiled 16s with \code{pdflaTeX} and \code{xfp} and 13s with \code{LualaTeX} and \code{xfp}.
This documentation compiles with |\usepackage{tkz-base}| and |\usepackage[lua]{tkz-euclide}| but I didn't test all the interactions thoroughly.
+\subsubsection{Option \code{mini}} % (fold)
+\label{ssub:option_code_mini}
+
+When you use \tkzNamePack{tkz-elements} solely to determine the points in your figures, it is not necessary to load all the modules of \tkzname{\tkznameofpack}. In this case, by using the \ItkzPopt{tkz-euclide}{mini} option |\usepackage[mini]{tkz-euclide}| , you will only load the modules necessary for the drawings.
+
+% subsubsection option_code_mini (end)
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
index 806d740884..42ce13693b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
@@ -18,13 +18,13 @@
index = totoc,
twoside,
cadre,
- headings = small
+ headings = small,
]{tkz-doc}
\gdef\tkznameofpack{tkz-euclide}
-\gdef\tkzversionofpack{5.06c}
+\gdef\tkzversionofpack{5.10c}
\gdef\tkzdateofpack{\today}
\gdef\tkznameofdoc{doc-tkz-euclide}
-\gdef\tkzversionofdoc{5.06c}
+\gdef\tkzversionofdoc{5.10c}
\gdef\tkzdateofdoc{\today}
\gdef\tkzauthorofpack{Alain Matthes}
\gdef\tkzadressofauthor{}
@@ -110,6 +110,9 @@
\tikzset{new/.style={color=orange,line width=.2pt}}
\AtBeginDocument{\MakeShortVerb{\|}} % link to shortvrb
+\def\code{\texttt}
+\newcommand*{\ItkzPopt}[2]{\texttt{#2}\index{#1_3@\texttt{#1: options}!\texttt{#2}}}
+
\begin{document}
\parindent=0pt
@@ -117,9 +120,10 @@
\clearpage
\defoffile{\lefthand\
-\tkzname{\tkznameofpack} passes in version 5 with the possibility of carrying out part of the calculations using \tkzname{lua}. See the "news" and "lua" sections for more information.\\
-\tkzname{\tkznameofpack} is a set of convenient macros for drawing in a plane (fundamental two-dimensional object) with a Cartesian coordinate system. It handles the most classic situations in Euclidean Geometry. \tkzname{\tkznameofpack} is built on top of PGF and its associated front-end \TIKZ\ and is a (La)TeX-friendly drawing package. The aim is to provide a high-level user interface to build graphics relatively simply. The idea is to allow you to follow step by step a construction that would be done by hand as naturally as possible.\\
-English is not my native language so there might be some errors.
+
+\tkzname{\tkznameofpack} is a set of convenient macros for drawing in a plane (fundamental two-dimensional object) with a Cartesian coordinate system. It handles the most classic situations in Euclidean Geometry. \tkzname{\tkznameofpack} is built on top of PGF and its associated front-end \TIKZ\ and is a (La)TeX-friendly drawing package. The aim is to provide a high-level user interface to build graphics relatively effortlessly. The goal is to guide users through constructing diagrams step by step, mirroring the natural process of manual construction as closely as possible.\\
+Version 5 of \tkzname{\tkznameofpack} includes the option to utilize Lua for performing certain calculations, refer to the \code{news} and \code{lua} sections.\\
+Please note: English is not my native language, so there may be some errors.
}
\presentation
@@ -128,7 +132,13 @@ English is not my native language so there might be some errors.
\lefthand\ Firstly, I would like to thank \textbf{Till Tantau} for the beautiful \LaTeX{} package, namely \href{http://sourceforge.net/projects/pgf/}{\TIKZ}.
\vspace*{12pt}
-\lefthand\ Acknowledgements : I received much valuable advice, remarks, corrections and examples from \tkzimp{Jean-Côme Charpentier}, \tkzimp{Josselin Noirel}, \tkzimp{Manuel Pégourié-Gonnard}, \tkzimp{Franck Pastor}, \tkzimp{David Arnold}, \tkzimp{Ulrike Fischer}, \tkzimp{Stefan Kottwitz}, \tkzimp{Christian Tellechea}, \tkzimp{Nicolas Kisselhoff}, \tkzimp{David Arnold}, \tkzimp{Wolfgang Büchel}, \tkzimp{John Kitzmiller}, \tkzimp{Dimitri Kapetas}, \tkzimp{Gaétan Marris}, \tkzimp{Mark Wibrow}, \tkzimp{Yves Combe} for his work on a protractor, \tkzimp{Paul Gaborit}, \tkzimp{Laurent Van Deik} for all his corrections, remarks and questions and \tkzimp{Muzimuzhi Z} for the code about the option "dim". A big thank you to \tkzimp{Chetan Shirore} and \tkzimp{Dr. Ajit Kumar} because their work on complex numbers in their package \tkzimp{luamaths} helped me a lot.
+\lefthand\ Acknowledgements : I received much valuable advices, remarks, corrections and examples from
+
+\tkzimp{Jean-Côme Charpentier}, \tkzimp{Josselin Noirel}, \tkzimp{Manuel Pégourié-Gonnard}, \tkzimp{Franck Pastor}, \tkzimp{David Arnold},
+
+\tkzimp{Ulrike Fischer}, \tkzimp{Stefan Kottwitz}, \tkzimp{Christian Tellechea}, \tkzimp{Nicolas Kisselhoff}, \tkzimp{David Arnold}, \tkzimp{Wolfgang Büchel},
+
+\tkzimp{John Kitzmiller}, \tkzimp{Dimitri Kapetas}, \tkzimp{Gaétan Marris}, \tkzimp{Mark Wibrow}, \tkzimp{Yves Combe}, \tkzimp{Paul Gaborit}, \tkzimp{Laurent Van Deik} and \tkzimp{Muzimuzhi Z}.
\vspace*{12pt}
\lefthand\ I would also like to thank Eric Weisstein, creator of MathWorld:
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-news.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-news.tex
index 6667d5bcda..9a21f26637 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-news.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-news.tex
@@ -1,218 +1,227 @@
\section*{News and compatibility}
-\subsection{With 5.06 version}
- \begin{itemize}
- \item Correction of a bug with the macro |\tkzLabelAngle| and the option “angle”
- \item Added |\tkzSetUpCircle|
- \item Correction of some typos
- \item Remove some french texts
- \end{itemize}
-
-
-\subsection{With 5.05 version}
-
- Correction of the documentation in Complete but minimal example.
-
-\subsection{With 5.03 version}
+\subsection{With 5.10 version}
\begin{itemize}
+ \item Added french documentation
- \item Correction of a bug in the macro |\tkzDefBarycentricPointTwo| of the file tkz-obj-lua-points-spc.tex ;
-
- \item Add macro |\tkzDrawEllipse|;
-
- \item Deleting macros |\tkzDrawSectorAngles| and |\tkzDrawSectorRwithNodesAngles|.
-\end{itemize}
-
-
-\subsection{With 5.0 version} % (fold)
-
-\begin{itemize}
-
- \item Finally, I added the "lua" option for the package \tkzname{\tkznameofpack}. This allows to do the calculations for the main functions using lua; (see \ref{calc_with_lua}). The syntax is unchanged. Nothing changes for the user;
-
- \item The "xfp" option has become "veclen" see \ref{opt-veclen}.
-
-\end{itemize}
-
-\subsection{With 4.2 version} % (fold)
-\label{sub:with_4_2_version}
-
-Some changes have been made to make the syntax more homogeneous and especially to distinguish the definition and search for coordinates from the rest, i.e. drawing, marking and labelling.
-Now the definition macros are isolated, it will be easier to introduce a phase of coordinate calculations using \tkzimp{Lua}.
-
-Here are some of the changes.
-\vspace{1cm}
- \begin{itemize}\setlength{\itemsep}{10pt}
-
-
-\item I recently discovered a problem when using the "scale" option. When plotting certain figures with certain tools, extensive use of |pgfmathreciprocal| involves small computational errors but can add up and render the figures unfit. Here is how to proceed to avoid these problems:
-\begin{enumerate}
-
- \item On my side I introduced a patch proposed by Muzimuzhi that modifies
-|pgfmathreciprocal|;
-
-\item Another idea proposed by Muzimuzhi is to pass as an option for the |tikzpicture| environment this |/pgf/fpu/install only={reciprocal}| after loading of course the |fpu| library;
-
-\item I have in the methods chosen to define my macros tried to avoid as much as possible the use of |pgfmathreciprocal|;
-
-\item There is still a foolproof method which consists in avoiding the use of |scale = ...|. It's quite easy if, like me, you only work with fixed points fixed at the beginning of your code. The size of your figure depends only on these fixed points so you just have to adapt the coordinates of these.
-\end{enumerate}
-
-\item Now |\tkzDefCircle| gives two points as results: the center of the circle and a point of the circle. When a point of the circle is known, it is enough to use |\tkzGetPoint| or |\tkzGetFirstPoint|
-to get the center, otherwise |\tkzGetPoints| will give you the center and a point of the circle. You can always get the length of the radius with |\tkzGetLength|. I wanted to favor working with nodes and banish the appearance of numbers in the code.
-
-\item In order to isolate the definitions, I deleted or modified certain macros which are: |\tkzDrawLine|, |\tkzDrawTriangle|, |\tkzDrawCircle|, |\tkzDrawSemiCircle| and |\tkzDrawRectangle|;
-
-Thus |\tkzDrawSquare(A,B)| becomes |\tkzDefSquare(A,B)||\tkzGetPoints{C}{D}| then
-
- |\tkzDrawPolygon(A,B,C,D)|;
-
-If you want to draw a circle, you can't do so |\tkzDrawCircle[R](A,1)|. First you have to define the point through which the circle passes, so you have to do
-|\tkzDefCircle[R](A,1)| |\tkzGetPoint{a}| and finally |\tkzDrawCircle(A,a)|. Another possibilty is to define a point on the circle |\tkzDefShiftPoint[A](1,O){a}|;
-
-
-\item The following macros |tkzDefCircleBy[orthogonal through]| and |\tkzDefCircleBy[orthogonal from]| become |tkzDefCircle[orthogonal through]| and |\tkzDefCircle[orthogonal from]| ;
-
-
-\item |\tkzDefLine[euler](A,B,C)| is a macro that allows you to obtain the line of \tkzname{Euler} when possible. |\tkzDefLine[altitude](A,B,C)| is possible again, as well as |\tkzDefLine[tangent at=A](O)| and |\tkzDefLine[tangent from=P](O,A)| which did not works;
-
-
-\item | \tkzDefTangent| is replaced by |\tkzDefLine[tangent from = ...]| or |\tkzDefLine[tangent at = ...]|;
-
-
-\item I added the macro |\tkzPicAngle[tikz options](A,B,C)| for those who prefer to use \TIKZ ;
-
-
-\item The macro |\tkzMarkAngle| has been corrected;
-
-\item The macro linked to the \tkzname{apollonius} option of the |\tkzDefCircle| command has been rewritten;
-
-\item (4.23) The macro |\tkzDrawSemiCircle| has been corrected;
-
-\item
-The order of the arguments of the macro \tkzcname{tkzDefPointOnCircle} has changed: now it is center, angle and point or radius.
-I have added two options for working with radians which are \tkzname{through in rad} and \tkzname{R in rad}.
-
-
-\item I added the option \tkzname{reverse} to the arcs paths. This allows to reverse the path and to reverse if necessary the arrows that would be present.
-
-
-\item I have unified the styles for the labels. There is now only \tkzname{label style} left which is valid for points, segments, lines, circles and angles. I have deleted \tkzname{label seg style} \tkzname{label line style} and \tkzname{label angle style}
-
-\item I added the macro |tkzFillAngles| to use several angles.
-
-\item Correction option \tkzname{return} witk \tkzcname{tkzProtractor}
-
-As a reminder, the following changes have been made previously:
-
- \item |\tkzDrawMedian|, |\tkzDrawBisector|, |\tkzDrawAltitude|, |\tkzDrawMedians|, |\tkzDrawBisectors| and |\tkzDrawAltitudes| do not exist anymore. The creation and drawing separation is not respected so it is preferable to first create the coordinates of these points with |\tkzDefSpcTriangle[median]| and then to choose the ones you are going to draw with |\tkzDrawSegments| or |\tkzDrawLines|;
-
-\item |\tkzDrawTriangle| has been deleted. |\tkzDrawTriangle[equilateral]| was handy but it is better to get the third point with |\tkzDefTriangle[equilateral]| and then draw with |\tkzDrawPolygon|; idem for |\tkzDrawSquare| and |\tkzDrawGoldRectangle|;
-
-
-\item The circle inversion was badly defined so I rewrote the macro. The input arguments are always the center and a point of the circle, the output arguments are the center of the image circle and a point of the image circle or two points of the image line if the antecedent circle passes through the pole of the inversion. If the circle passes the inversion center, the image is a straight line, the validity of the procedure depends on the choice of the point on the antecedent circle;
-
-\item Correct allocation for gold sublime and euclide triangles;
-
-
-\item I added the option " next to" for the intersections LC and CC;
-
-
-\item Correction option isoceles right;
-
-\item (4.22 and 4.23) Correction of the macro |\tkzMarkAngle|;
-
-
-\item |\tkzDefMidArc(O,A,B)| gives the middle of the arc center $O$ from $A$ to $B$;
-
-\item Good news : Some useful tools have been added. They are present on an experimental basis and will undoubtedly need to be improved;
-
-
-\item The options "orthogonal from and through" depend now of \tkzcname{tkzDefCircleBy}
-
-\begin{enumerate}
-
- \item |\tkzDotProduct(A,B,C)| computes the scalar product in an orthogonal reference system of the vectors $\overrightarrow{A,B}$ and $\overrightarrow{A,C}$.
-
- |\tkzDotProduct(A,B,C)=aa'+bb' if vec{AB} =(a,b) and vec{AC} =(a',b')|
-
-
- \item |\tkzPowerCircle(A)(B,C)| power of point $A$ with respect to the circle of center $B$ passing through $C$;
-
-
- \item |\tkzDefRadicalAxis(A,B)(C,D)| Radical axis of two circles of center $A$ and $C$;
-
-
-\item (4.23) The macro |tkzDefRadicalAxis| has been completed
-
- \item Some tests : |\tkzIsOrtho(A,B,C)| and |\tkzIsLinear(A,B,C)| The first indicates whether the lines $(A,B)$ and $(A,C)$ are orthogonal. The second indicates whether the points $A$, $B$ and $C$ are aligned;
-
- |\tkzIsLinear(A,B,C)| if $A$,$B$,$C$ are aligned then |\tkzLineartrue|
- you can use |\iftkzLinear| (idem for |\tkzIsOrtho|);
-
-\item A style for vectors has been added that you can of course modify
-
-|tikzset{vector style/.style={>=Latex,->}}|;
-
-
-\item Now it's possible to add an arrow on a line or a circle with the option |tkz arrow|.
-\end{enumerate}
+ \item Added the \code{mini} option. You can use this option with the \tkzNamePack{tkz-elements} package. Only the modules required for tracing will be loaded. This option is currently only available if you are using \tkzNamePack{tkz-elements}.
\end{itemize}
-% subsection with_4_2_version (end)
-\subsection{Changes with previous versions} % (fold)
-\label{sub:changes_with_previous_versions}
-
-\vspace{1cm}
- \begin{itemize}\setlength{\itemsep}{10pt}
-
-\item I remind you that an important novelty is the recent replacement of the \tkzNamePack{fp} package by \tkzNamePack{xfp}. This is to improve the calculations a little bit more and to make it easier to use;
-
-\item First of all, you don’t have to deal with \TIKZ\ the size of the bounding box. Early versions of \tkzname{\tkznameofpack} did not control the size of the bounding box, The bounding box is now controlled in each macro (hopefully) to avoid the use of \tkzcname{tkzInit} followed by \tkzcname{tkzClip};
-
-\item With \tkzimp{tkz-euclide} loads all objects, so there's no need to place \tkzcname{usetkzobj\{all\}};
-
-\item Added macros for the bounding box: \tkzcname{tkzSaveBB} \tkzcname{tkzClipBB} and so on;
-
-\item Logically most macros accept \TIKZ\ options. So I removed the "duplicate" options when possible thus the "label options" option is removed;
-
-\item The unit is now the cm;
-
-\item |\tkzCalcLength| |\tkzGetLength| gives result in cm;
-
-\item |\tkzMarkArc| and |\tkzLabelArc| are new macros;
-
-\item Now |\tkzClipCircle| and |\tkzClipPolygon| have an option \tkzimp{out}. To use this option you must have a Bounding Box that contains the object on which the Clip action will be performed. This can be done by using an object that encompasses the figure or by using the macro \tkzcname{tkzInit};
-
-
-\item The options \tkzname{end} and \tkzname{start} which allowed to give a label to a straight line are removed. You now have to use the macro \tkzcname{tkzLabelLine};
-
-\item Introduction of the libraries \NameLib{quotes} and \NameLib{angles}; it allows to give a label to a point, even if I am not in favour of this practice;
-
-\item The notion of vector disappears, to draw a vector just pass "->" as an option to \tkzcname{tkzDrawSegment};
-
-
-\item |\tkzDefIntSimilitudeCenter| and |\tkzDefExtSimilitudeCenter| do not exist anymore, now you need to use |\tkzDefSimilitudeCenter[int]| or |\tkzDefSimilitudeCenter[ext]|;
-
-\item |\tkzDefRandPointOn| is replaced by |\tkzGetRandPointOn|;
-
-
-\item An option of the macro \tkzcname{tkzDefTriangle} has changed, in the previous version the option was "euclide" with an "e". Now it's "euclid";
-
-\item Random points are now in \tkzname{\tkznameofpack} and the macro \tkzcname{tkzGetRandPointOn} is replaced by
-
- \tkzcname{tkzDefRandPointOn}. For homogeneity reasons, the points must be retrieved with \tkzcname{tkzGetPoint};
-
-\item New macros have been added : \tkzcname{tkzDrawSemiCircles}, \tkzcname{tkzDrawPolygons}, \tkzcname{tkzDrawTriangles};
-
-
-\item Option "isosceles right" is a new option of the macro \tkzcname{tkzDefTriangle};
-
-\item Appearance of the macro \tkzcname{usetkztool} which allows to load new "tools";
-
-\item The styles can be modified with the help of the following macros : \tkzcname{tkzSetUpPoint}, \tkzcname{tkzSetUpLine}, \tkzcname{tkzSetUpArc}, \tkzcname{tkzSetUpCompass}, \tkzcname{tkzSetUpLabel} and \tkzcname{tkzSetUpStyle}. The last one allows you to create a new style.
-\end{itemize}
-% subsection changes_with_previous_versions (end)
+% \subsection{With 5.06 version}
+% \begin{itemize}
+% \item Correction of a bug with the macro |\tkzLabelAngle| and the option \code{angle}.
+% \item Added |\tkzSetUpCircle|.
+% \item Correction of some typos.
+% \item Remove some french texts.
+% \end{itemize}
+%
+%
+% \subsection{With 5.05 version}
+%
+% Correction of the documentation in Complete but minimal example.
+%
+% \subsection{With 5.03 version}
+%
+% \begin{itemize}
+%
+% \item Correction of a bug in the macro |\tkzDefBarycentricPointTwo| of the file tkz-obj-lua-points-spc.tex.
+%
+% \item Add macro |\tkzDrawEllipse|.
+%
+% \item Deleting macros |\tkzDrawSectorAngles| and |\tkzDrawSectorRwithNodesAngles|.
+% \end{itemize}
+%
+%
+% \subsection{With 5.0 version} % (fold)
+%
+% \begin{itemize}
+%
+% \item Finally, I added the \code{lua} option for the package \tkzname{\tkznameofpack}. This allows to do the calculations for the main functions using lua; (see \ref{calc_with_lua}). The syntax is unchanged. Nothing changes for the user.
+%
+% \item The \code{xfp} option has become \code{veclen} see \ref{opt-veclen}.
+%
+% \end{itemize}
+%
+% \subsection{With 4.2 version} % (fold)
+% \label{sub:with_4_2_version}
+%
+% Some changes have been made to make the syntax more homogeneous and especially to distinguish the definition and search for coordinates from the rest, i.e. drawing, marking and labelling.
+% Now the definition macros are isolated, it will be easier to introduce a phase of coordinate calculations using \tkzimp{Lua}.
+%
+% Here are some of the changes.
+% \vspace{1cm}
+% \begin{itemize}\setlength{\itemsep}{10pt}
+%
+%
+% \item I recently discovered a problem when using the \code{scale} option. When plotting certain figures with certain tools, extensive use of |pgfmathreciprocal| involves small computational errors but can add up and render the figures unfit. Here is how to proceed to avoid these problems:
+% \begin{enumerate}
+%
+% \item On my side I introduced a patch proposed by Muzimuzhi that modifies
+% |pgfmathreciprocal|;
+%
+% \item Another idea proposed by Muzimuzhi is to pass as an option for the |tikzpicture| environment this |/pgf/fpu/install only={reciprocal}| after loading of course the |fpu| library;
+%
+% \item I have in the methods chosen to define my macros tried to avoid as much as possible the use of |pgfmathreciprocal|;
+%
+% \item There is still a foolproof method which consists in avoiding the use of |scale = ...|. It's quite easy if, like me, you only work with fixed points fixed at the beginning of your code. The size of your figure depends only on these fixed points so you just have to adapt the coordinates of these.
+% \end{enumerate}
+%
+% \item Now |\tkzDefCircle| gives two points as results: the center of the circle and a point of the circle. When a point of the circle is known, it is enough to use |\tkzGetPoint| or |\tkzGetFirstPoint|
+% to get the center, otherwise |\tkzGetPoints| will give you the center and a point of the circle. You can always get the length of the radius with |\tkzGetLength|. I wanted to favor working with nodes and banish the appearance of numbers in the code.
+%
+% \item In order to isolate the definitions, I deleted or modified certain macros which are: |\tkzDrawLine|, |\tkzDrawTriangle|, |\tkzDrawCircle|, |\tkzDrawSemiCircle| and |\tkzDrawRectangle|;
+%
+% Thus |\tkzDrawSquare(A,B)| becomes |\tkzDefSquare(A,B)||\tkzGetPoints{C}{D}| then
+%
+% |\tkzDrawPolygon(A,B,C,D)|;
+%
+% If you want to draw a circle, you can't do so |\tkzDrawCircle[R](A,1)|. First you have to define the point through which the circle passes, so you have to do
+% |\tkzDefCircle[R](A,1)| |\tkzGetPoint{a}| and finally |\tkzDrawCircle(A,a)|. Another possibilty is to define a point on the circle |\tkzDefShiftPoint[A](1,O){a}|;
+%
+%
+% \item The following macros |tkzDefCircleBy[orthogonal through]| and |\tkzDefCircleBy[orthogonal from]| become |tkzDefCircle[orthogonal through]| and |\tkzDefCircle[orthogonal from]| ;
+%
+%
+% \item |\tkzDefLine[euler](A,B,C)| is a macro that allows you to obtain the line of \tkzname{Euler} when possible. |\tkzDefLine[altitude](A,B,C)| is possible again, as well as |\tkzDefLine[tangent at=A](O)| and |\tkzDefLine[tangent from=P](O,A)| which did not works;
+%
+%
+% \item | \tkzDefTangent| is replaced by |\tkzDefLine[tangent from = ...]| or |\tkzDefLine[tangent at = ...]|;
+%
+%
+% \item I added the macro |\tkzPicAngle[tikz options](A,B,C)| for those who prefer to use \TIKZ ;
+%
+%
+% \item The macro |\tkzMarkAngle| has been corrected;
+%
+% \item The macro linked to the \tkzname{apollonius} option of the |\tkzDefCircle| command has been rewritten;
+%
+% \item (4.23) The macro |\tkzDrawSemiCircle| has been corrected;
+%
+% \item
+% The order of the arguments of the macro \tkzcname{tkzDefPointOnCircle} has changed: now it is center, angle and point or radius.
+% I have added two options for working with radians which are \tkzname{through in rad} and \tkzname{R in rad}.
+%
+%
+% \item I added the option \tkzname{reverse} to the arcs paths. This allows to reverse the path and to reverse if necessary the arrows that would be present.
+%
+%
+% \item I have unified the styles for the labels. There is now only \tkzname{label style} left which is valid for points, segments, lines, circles and angles. I have deleted \tkzname{label seg style} \tkzname{label line style} and \tkzname{label angle style}
+%
+% \item I added the macro |tkzFillAngles| to use several angles.
+%
+% \item Correction option \tkzname{return} witk \tkzcname{tkzProtractor}
+%
+% As a reminder, the following changes have been made previously:
+%
+% \item |\tkzDrawMedian|, |\tkzDrawBisector|, |\tkzDrawAltitude|, |\tkzDrawMedians|, |\tkzDrawBisectors| and |\tkzDrawAltitudes| do not exist anymore. The creation and drawing separation is not respected so it is preferable to first create the coordinates of these points with |\tkzDefSpcTriangle[median]| and then to choose the ones you are going to draw with |\tkzDrawSegments| or |\tkzDrawLines|;
+%
+% \item |\tkzDrawTriangle| has been deleted. |\tkzDrawTriangle[equilateral]| was handy but it is better to get the third point with |\tkzDefTriangle[equilateral]| and then draw with |\tkzDrawPolygon|; idem for |\tkzDrawSquare| and |\tkzDrawGoldRectangle|;
+%
+%
+% \item The circle inversion was badly defined so I rewrote the macro. The input arguments are always the center and a point of the circle, the output arguments are the center of the image circle and a point of the image circle or two points of the image line if the antecedent circle passes through the pole of the inversion. If the circle passes the inversion center, the image is a straight line, the validity of the procedure depends on the choice of the point on the antecedent circle;
+%
+% \item Correct allocation for gold sublime and euclide triangles;
+%
+%
+% \item I added the option \code{next to} for the intersections LC and CC;
+%
+%
+% \item Correction option isoceles right;
+%
+% \item (4.22 and 4.23) Correction of the macro |\tkzMarkAngle|;
+%
+%
+% \item |\tkzDefMidArc(O,A,B)| gives the middle of the arc center $O$ from $A$ to $B$;
+%
+% \item Good news : Some useful tools have been added. They are present on an experimental basis and will undoubtedly need to be improved;
+%
+%
+% \item The options \code{orthogonal from} and \code{through} depend now of \tkzcname{tkzDefCircleBy}
+%
+% \begin{enumerate}
+%
+% \item |\tkzDotProduct(A,B,C)| computes the scalar product in an orthogonal reference system of the vectors $\overrightarrow{A,B}$ and $\overrightarrow{A,C}$.
+%
+% |\tkzDotProduct(A,B,C)=aa'+bb' if vec{AB} =(a,b) and vec{AC} =(a',b')|
+%
+%
+% \item |\tkzPowerCircle(A)(B,C)| power of point $A$ with respect to the circle of center $B$ passing through $C$;
+%
+%
+% \item |\tkzDefRadicalAxis(A,B)(C,D)| Radical axis of two circles of center $A$ and $C$;
+%
+%
+% \item (4.23) The macro |tkzDefRadicalAxis| has been completed
+%
+% \item Some tests : |\tkzIsOrtho(A,B,C)| and |\tkzIsLinear(A,B,C)| The first indicates whether the lines $(A,B)$ and $(A,C)$ are orthogonal. The second indicates whether the points $A$, $B$ and $C$ are aligned;
+%
+% |\tkzIsLinear(A,B,C)| if $A$,$B$,$C$ are aligned then |\tkzLineartrue|
+% you can use |\iftkzLinear| (idem for |\tkzIsOrtho|);
+%
+% \item A style for vectors has been added that you can of course modify
+%
+% |tikzset{vector style/.style={>=Latex,->}}|;
+%
+%
+% \item Now it's possible to add an arrow on a line or a circle with the option |tkz arrow|.
+% \end{enumerate}
+% \end{itemize}
+%
+% % subsection with_4_2_version (end)
+% \subsection{Changes with previous versions} % (fold)
+% \label{sub:changes_with_previous_versions}
+%
+% \vspace{1cm}
+% \begin{itemize}\setlength{\itemsep}{10pt}
+%
+% \item I remind you that an important novelty is the recent replacement of the \tkzNamePack{fp} package by \tkzNamePack{xfp}. This is to improve the calculations a little bit more and to make it easier to use;
+%
+%
+% \item First of all, you don’t have to deal with \TIKZ\ the size of the bounding box. Early versions of \tkzname{\tkznameofpack} did not control the size of the bounding box, The bounding box is now controlled in each macro (hopefully) to avoid the use of \tkzcname{tkzInit} followed by \tkzcname{tkzClip};
+%
+% \item With \tkzimp{tkz-euclide} loads all objects, so there's no need to place \tkzcname{usetkzobj\{all\}};
+%
+% \item Added macros for the bounding box: \tkzcname{tkzSaveBB} \tkzcname{tkzClipBB} and so on;
+%
+% \item Logically most macros accept \TIKZ\ options. So I removed the \code{duplicate} options when possible thus the \code{label options} option is removed;
+%
+% \item The unit is now the cm;
+%
+% \item |\tkzCalcLength| |\tkzGetLength| gives result in cm;
+%
+% \item |\tkzMarkArc| and |\tkzLabelArc| are new macros;
+%
+% \item Now |\tkzClipCircle| and |\tkzClipPolygon| have an option \tkzimp{out}. To use this option you must have a Bounding Box that contains the object on which the Clip action will be performed. This can be done by using an object that encompasses the figure or by using the macro \tkzcname{tkzInit};
+%
+%
+% \item The options \tkzname{end} and \tkzname{start} which allowed to give a label to a straight line are removed. You now have to use the macro \tkzcname{tkzLabelLine};
+%
+% \item Introduction of the libraries \NameLib{quotes} and \NameLib{angles}; it allows to give a label to a point, even if I am not in favour of this practice;
+%
+% \item The notion of vector disappears, to draw a vector just pass "->" as an option to \tkzcname{tkzDrawSegment};
+%
+%
+% \item |\tkzDefIntSimilitudeCenter| and |\tkzDefExtSimilitudeCenter| do not exist anymore, now you need to use |\tkzDefSimilitudeCenter[int]| or |\tkzDefSimilitudeCenter[ext]|;
+%
+% \item |\tkzDefRandPointOn| is replaced by |\tkzGetRandPointOn|;
+%
+%
+% \item An option of the macro \tkzcname{tkzDefTriangle} has changed, in the previous version the option was \code{euclide} with an \code{e}. Now it's \code{euclid};
+%
+% \item Random points are now in \tkzname{\tkznameofpack} and the macro \tkzcname{tkzGetRandPointOn} is replaced by
+%
+% \tkzcname{tkzDefRandPointOn}. For homogeneity reasons, the points must be retrieved with \tkzcname{tkzGetPoint};
+%
+% \item New macros have been added : \tkzcname{tkzDrawSemiCircles}, \tkzcname{tkzDrawPolygons}, \tkzcname{tkzDrawTriangles};
+%
+%
+% \item Option \code{isosceles right} is a new option of the macro \tkzcname{tkzDefTriangle};
+%
+% \item Appearance of the macro \tkzcname{usetkztool} which allows to load new \code{tools};
+%
+% \item The styles can be modified with the help of the following macros : \tkzcname{tkzSetUpPoint}, \tkzcname{tkzSetUpLine}, \tkzcname{tkzSetUpArc}, \tkzcname{tkzSetUpCompass}, \tkzcname{tkzSetUpLabel} and \tkzcname{tkzSetUpStyle}. The last one allows you to create a new style.
+% \end{itemize}
+% % subsection changes_with_previous_versions (end)
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointby.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointby.tex
index 67e357c625..407d7a3b67 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointby.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointby.tex
@@ -104,7 +104,7 @@ options & & examples \\
\subsubsection{\tkzname{projection}}
\begin{tkzexample}[latex=7cm,small]
-\begin{tikzpicture}[scale=1.5]
+\begin{tikzpicture}[scale=1.25]
\tkzDefPoints{0/0/A,0/4/B}
\tkzDefTriangle[pythagore](B,A) \tkzGetPoint{C}
\tkzDefLine[bisector](B,C,A) \tkzGetPoint{c}
@@ -116,7 +116,7 @@ options & & examples \\
\tkzDrawSegment(C,D)
\tkzDrawCircle(D,A)
\tkzDrawSegment[new](D,G)
- \tkzMarkRightAngle[fill=orange!10,opacity=.4](D,G,B)
+ \tkzMarkRightAngle[fill=orange!10](D,G,B)
\tkzDrawPoints(A,C,F) \tkzLabelPoints(A,C,F)
\tkzDrawPoints(B,D,E,G)
\tkzLabelPoints[above right](B,D,E)
@@ -143,7 +143,7 @@ options & & examples \\
\subsubsection{\tkzname{rotation} }
\begin{tkzexample}[latex=7cm,small]
-\begin{tikzpicture}[scale=0.5]
+\begin{tikzpicture}[scale=0.75]
\tkzDefPoints{0/0/A,5/0/B}
\tkzDrawSegment(A,B)
\tkzDefPointBy[rotation=center A angle 60](B)
@@ -199,6 +199,7 @@ options & & examples \\
Inversion is the process of transforming points to a corresponding set of points known as their inverse points. Two points $P$ and $P'$ are said to be inverses with respect to an inversion circle having inversion center $O$ and inversion radius $k$ if $P'$ is the perpendicular foot of the altitude of $OQP$, where $Q$ is a point on the circle such that $OQ$ is perpendicular to $PQ$.\\
The quantity $k^2$ is known as the circle power (Coxeter 1969, p. 81).
+
(\url{https://mathworld.wolfram.com/Inversion.html})
Some propositions :
@@ -273,7 +274,7 @@ Directly
\subsubsection{\tkzname{inversion of lines} ex 2}
\begin{tkzexample}[latex=6cm,small]
-\begin{tikzpicture}[scale=.5]
+\begin{tikzpicture}[scale=.8]
\tkzDefPoints{0/0/O,3/0/I,3/2/P,3/-2/Q}
\tkzDrawCircle(O,I)
\tkzDefPointBy[projection= onto P--Q](O) \tkzGetPoint{A}
@@ -292,7 +293,7 @@ Directly
\subsubsection{\tkzname{inversion of lines} ex 3}
\begin{tkzexample}[latex=6cm,small]
-\begin{tikzpicture}[scale=.5]
+\begin{tikzpicture}[scale=.8]
\tkzDefPoints{0/0/O,3/0/I,2/1/P,2/-2/Q}
\tkzDrawCircle(O,I)
\tkzDefPointBy[projection= onto P--Q](O) \tkzGetPoint{A}
@@ -311,7 +312,7 @@ Directly
\subsubsection{\tkzname{inversion} of circle and \tkzname{homothety} }
\begin{tkzexample}[latex=7cm,small]
-\begin{tikzpicture}[scale=.75]
+\begin{tikzpicture}[scale=.7]
\tkzDefPoints{0/0/O,3/2/A,2/1/P}
\tkzDefLine[tangent from = O](A,P) \tkzGetPoints{T}{X}
\tkzDefPointsBy[homothety = center O%
@@ -319,7 +320,7 @@ Directly
\tkzInterCC(A,P)(A',P') \tkzGetPoints{C}{D}
\tkzCalcLength(A,P)
\tkzGetLength{rAP}
-\tkzDefPointOnCircle[R= center A angle 190 radius \rAP]
+\tkzDefPointOnCircle[R=center A angle 190 radius \rAP]
\tkzGetPoint{M}
\tkzDefPointBy[inversion = center O through C](M)
\tkzGetPoint{M'}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-points.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-points.tex
index 2741872f8c..c8a45d5ea4 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-points.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-points.tex
@@ -6,7 +6,7 @@ The general idea is to avoid manipulating coordinates and to prefer to use the r
\tkzname{\tkznameofpack} uses macros and vocabulary specific to geometric construction. It is of course possible to use the tools of \TIKZ\ but it seems more logical to me not to mix the different syntaxes.
-A point in \tkzname{\tkznameofpack} is a particular "node" for \TIKZ. In the next section we will see how to define points using coordinates. The style of the points (color and shape) will not be discussed. You will find some indications in some examples; for more information you can read the following section \ref{custom}.
+A point in \tkzname{\tkznameofpack} is a particular \code{node} for \TIKZ. In the next section we will see how to define points using coordinates. The style of the points (color and shape) will not be discussed. You will find some indications in some examples; for more information you can read the following section \ref{custom}.
\section{Definition of a point : \tkzcname{tkzDefPoint} or \tkzcname{tkzDefPoints}}
@@ -36,7 +36,7 @@ A point is defined if it has a name linked to a unique pair of decimal numbers.
\tkzNameMacro{coordinate}, a macro of \TIKZ. It can use \TIKZ-specific options such as \tkzname{shift}. If calculations are required then the \tkzNamePack{xfp} package is chosen. We can use Cartesian or polar coordinates.
-\begin{minipage}[t]{0.45\textwidth}
+\begin{minipage}[t]{0.48\textwidth}
Cartesian coordinates
\begin{tkzexample}[code only,small]
\begin{tikzpicture}[scale=1]
@@ -48,7 +48,7 @@ A point is defined if it has a name linked to a unique pair of decimal numbers.
\tkzDefPoints{0/0/O,1/0/I,0/1/J}
\tkzDefPoint(3,4){A}
\tkzDrawPoints(O,A)
- \tkzLabelPoint[above](A){$A_1 (x_1,y_1)$}
+ \tkzLabelPoint[above](A){$A_1(x_1,y_1)$}
\tkzShowPointCoord[xlabel=$x_1$,
ylabel=$y_1$](A)
\tkzLabelPoints(O,I)
@@ -60,7 +60,7 @@ A point is defined if it has a name linked to a unique pair of decimal numbers.
\begin{minipage}[t]{0.45\textwidth}
Polar coordinates
\begin{tkzexample}[code only,small]
-\begin{tikzpicture}[,scale=1]
+\begin{tikzpicture}[scale=1]
\tkzInit[xmax=5,ymax=5]
\tkzDrawX[>=latex]
\tkzDrawY[>=latex]
@@ -73,7 +73,7 @@ A point is defined if it has a name linked to a unique pair of decimal numbers.
\tkzFillAngle[opacity=.5](I,O,P)
\tkzLabelAngle[pos=1.25](I,O,P){%
$\alpha$}
- \tkzLabelPoint[right](P){$P (\alpha : d )$}
+ \tkzLabelPoint[right](P){$P(\alpha:d)$}
\tkzDrawPoints[shape=cross](I,J)
\tkzLabelPoints(O,I)
\tkzLabelPoints[left](J)
@@ -143,7 +143,7 @@ options & default & definition \\
\subsubsection{Cartesian coordinates }
-\begin{tkzexample}[latex=5cm,small]
+\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzInit[xmax=5,ymax=5] % limits the size of the axes
\tkzDrawX[>=latex]
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointsSpc.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointsSpc.tex
index 15529b33eb..7d0b23f4c9 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointsSpc.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-pointsSpc.tex
@@ -1,6 +1,6 @@
Now that the fixed points are defined, we can with their references using macros from the package or macros that you will create get new points. The calculations may not be apparent but they are usually done by the package.
You may need to use some mathematical constants, here is the list of constants defined by the package.
-You may need to use some mathematical constants, here is the list of constants defined by the package.
+
\section{Auxiliary tools}
\subsection{Constants}
@@ -34,10 +34,10 @@ arguments & default & example \\
\end{tabular}
\end{NewMacroBox}
-Sometimes you need to get two points. It's possible with
+Sometimes you need to get two points. It's possible with
\begin{NewMacroBox}{tkzGetPoints}{\marg{ref1}\marg{ref2}}%
-The result is in \tkzname{tkzPointFirstResult} and \tkzname{tkzPointSecondResult}.
+The result is in \tkzname{tkzPointFirstResult} and \tkzname{tkzPointSecondResult}.
\medskip
\begin{tabular}{lll}%
@@ -51,7 +51,7 @@ arguments & default & example \\
If you need only the first or the second point you can also use :
\begin{NewMacroBox}{tkzGetFirstPoint}{\marg{ref1}}%
-
+
\medskip
\begin{tabular}{lll}%
\toprule
@@ -75,7 +75,7 @@ arguments & default & example \\
Sometimes the results consist of a point and a dimension. You get the point with \tkzcname{tkzGetPoint} and the dimension with \tkzcname{tkzGetLength}.
\begin{NewMacroBox}{tkzGetLength}{\marg{name of a macro}}%
-
+
\medskip
\begin{tabular}{lll}%
\toprule
@@ -112,7 +112,7 @@ Review the use of \tkzcname{tkzDefPoint}.
\begin{tikzpicture}[scale=1]
\tkzDefPoint(2,3){A}
\tkzDefPoint(6,2){B}
- \tkzDefMidPoint(A,B)
+ \tkzDefMidPoint(A,B)
\tkzGetPoint{M}
\tkzDrawSegment(A,B)
\tkzDrawPoints(A,B,M)
@@ -146,7 +146,7 @@ $AB=a$, $BC=b$ and $\dfrac{AC}{AB} = \dfrac{AB}{BC} =\phi$
\begin{tikzpicture}
\tkzDefPoints{0/0/A,6/0/C}
\tkzDefMidPoint(A,C) \tkzGetPoint{I}
- %\tkzDefPointWith[linear,K=\tkzInvPhi](A,C)
+ %\tkzDefPointWith[linear,K=\tkzInvPhi](A,C)
\tkzDefGoldenRatio(A,C) \tkzGetPoint{B}
\tkzDrawSegments(A,C)
\tkzDrawPoints(A,B,C)
@@ -242,30 +242,35 @@ The centers of the two homotheties in which two circles correspond are called ex
arguments & example & explanation \\
\midrule
\TAline{\parg{pt1,pt2}\parg{pt3,pt4}}{$(O,A)(O',B)$} {$r=OA,r'=O'B$}
-\end{tabular}
-
+\end{tabular}
+
\medskip
\begin{tabular}{lll}%
\toprule
-options & default & definition \\
+options & default & definition \\
\midrule
\TOline{ext}{ext}{external center}
\TOline{int}{ext}{internal center}
\end{tabular}
-\end{NewMacroBox}
+\end{NewMacroBox}
\subsubsection{Internal and external with \tkzname{node}}
-\begin{tkzexample}[latex=7cm,small]
-\begin{tikzpicture}[scale=.75]
+\begin{tkzexample}[latex=7.5cm,small]
+\begin{tikzpicture}[scale=.7]
\tkzDefPoints{0/0/O,4/-5/A,3/0/B,5/-5/C}
-\tkzDefSimilitudeCenter[int](O,B)(A,C) \tkzGetPoint{I}
- \tkzDefSimilitudeCenter[ext](O,B)(A,C) \tkzGetPoint{J}
- \tkzDefLine[tangent from = I](O,B) \tkzGetPoints{D}{E}
- \tkzDefLine[tangent from = I](A,C) \tkzGetPoints{D'}{E'}
- \tkzDefLine[tangent from = J](O,B) \tkzGetPoints{F}{G}
- \tkzDefLine[tangent from = J](A,C)
+ \tkzDefSimilitudeCenter[int](O,B)(A,C)
+ \tkzGetPoint{I}
+ \tkzDefSimilitudeCenter[ext](O,B)(A,C)
+ \tkzGetPoint{J}
+ \tkzDefLine[tangent from = I](O,B)
+ \tkzGetPoints{D}{E}
+ \tkzDefLine[tangent from = I](A,C)
+ \tkzGetPoints{D'}{E'}
+ \tkzDefLine[tangent from = J](O,B)
+ \tkzGetPoints{F}{G}
+ \tkzDefLine[tangent from = J](A,C)
\tkzGetPoints{F'}{G'}
- \tkzDrawCircles(O,B A,C)
+ \tkzDrawCircles(O,B A,C)
\tkzDrawSegments[add = .5 and .5,new](D,D' E,E')
\tkzDrawSegments[add= 0 and 0.25,new](J,F J,G)
\tkzDrawPoints(O,A,I,J,D,E,F,G,D',E',F',G')
@@ -304,10 +309,10 @@ You can use \tkzcname{tkzDefBarycentricPoint} to find a homothetic center
\begin{tikzpicture}[rotate=60,scale=.5]
\tkzDefPoints{0/0/A,5/0/C}
\tkzDefGoldenRatio(A,C) \tkzGetPoint{B}
- \tkzDefSimilitudeCenter(A,B)(C,B) \tkzGetPoint{J}
- \tkzDefTangent[from = J](A,B) \tkzGetPoints{F}{G}
- \tkzDefTangent[from = J](C,B) \tkzGetPoints{F'}{G'}
- \tkzDrawCircles(A,B C,B)
+ \tkzDefSimilitudeCenter(A,B)(C,B)\tkzGetPoint{J}
+ \tkzDefTangent[from = J](A,B) \tkzGetPoints{F}{G}
+ \tkzDefTangent[from = J](C,B) \tkzGetPoints{F'}{G'}
+ \tkzDrawCircles(A,B C,B)
\tkzDrawSegments[add= 0 and 0.25,cyan](J,F J,G)
\tkzDrawPoints(A,J,F,G,F',G')
\end{tikzpicture}
@@ -318,15 +323,15 @@ You can use \tkzcname{tkzDefBarycentricPoint} to find a homothetic center
%<---------------------------------------------------------------------->
\begin{NewMacroBox}{tkzDefHarmonic}{\oarg{options}\parg{pt1,pt2,pt3} or \parg{pt1,pt2,k}}%
-
+
\begin{tabular}{lll}%
-options & default & definition \\
+options & default & definition \\
\midrule
\TOline{both}{both}{\parg{A,B,2} we look for C and D such that $(A,B;C,D) = -1$ and CA=2CB }
\TOline{ext}{both}{\parg{A,B,C} we look for D such that $(A,B;C,D) = -1$}
\TOline{int}{both}{\parg{A,B,D} we look for C such that $(A,B;C,D) = -1$}
\end{tabular}
-\end{NewMacroBox}
+\end{NewMacroBox}
\subsubsection{options \tkzname{ext} and \tkzname{int}}
\begin{tkzexample}[vbox,small]
@@ -448,7 +453,7 @@ arguments & default & definition \\
\tkzInterLL(B,Q)(A,P) \tkzGetPoint{S}
\tkzDefMidPoint(P_2',P_1') \tkzGetPoint{o}
\tkzDefPointBy[inversion = center A through D](S) \tkzGetPoint{S'}
- \tkzDrawArc[cyan,delta=0](Q,A)(P_1)
+ \tkzDrawArc[cyan,delta=0](Q,A)(P_1)
\tkzDrawArc[cyan,delta=0](P,P_1)(B)
\tkzDrawSemiCircles[teal](O_1,B O_2,C O_3,B)
\tkzDrawCircles[new](o,P O_4,P_1)
@@ -531,7 +536,7 @@ options & default & examples definition \\
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}[scale=.4]
\tkzDefPoints{0/0/P,5/0/Q,3/2/I}
-\tkzDefCircle[orthogonal from=P](Q,I)
+\tkzDefCircle[orthogonal from=P](Q,I)
\tkzGetFirstPoint{E}
\tkzDrawCircles(P,E Q,E)
\tkzInterCC[common=E](P,E)(Q,E) \tkzGetFirstPoint{F}
@@ -546,18 +551,18 @@ options & default & examples definition \\
\tkzLabelPoints(P,Q,F,C,D)
\tkzLabelPoints[above](E,A)
\end{tikzpicture}
-\end{tkzexample}
-
+\end{tkzexample}
+
\subsubsection{Use of \tkzcname{tkzDefPointOnCircle}}
-\begin{tkzexample}[latex=7cm,small]
+\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
-\tkzDefPoints{0/0/A,4/0/B,0.8/3/C}
+\tkzDefPoints{0/0/A,4/0/B,0.8/3/C}
\tkzDefPointOnCircle[R = center B angle 90 radius 1]
\tkzGetPoint{I}
\tkzDefCircle[circum](A,B,C)
\tkzGetPoints{G}{g}
-\tkzDefPointOnCircle[through = center G angle 30 point g]
+\tkzDefPointOnCircle[through = center G angle 30 point g]
\tkzGetPoint{J}
\tkzDefCircle[R](B,1) \tkzGetPoint{b}
\tkzDrawCircle[teal](B,b)
@@ -620,7 +625,7 @@ options & default & definition \\
\tkzGetPoint{H}
\tkzDefSpcTriangle[orthic,name=H](A,B,C){a,b,c}
\tkzDrawPolygon(A,B,C)
- \tkzDrawSegments[new](A,Ha B,Hb C,Hc)
+ \tkzDrawSegments[new](A,Ha B,Hb C,Hc)
\tkzDrawPoints(A,B,C,H)
\tkzLabelPoint(H){$H$}
\tkzLabelPoints[below](A,B)
@@ -659,16 +664,16 @@ options & default & definition \\
In geometry, the incircle or inscribed circle of a triangle is the largest circle contained in the triangle; it touches (is tangent to) the three sides. The center of the incircle is a triangle center called the triangle's incenter.
The center of the incircle, called the incenter, can be found as the intersection of the three internal angle bisectors. The center of an excircle is the intersection of the internal bisector of one angle (at vertex $A$, for example) and the external bisectors of the other two. The center of this excircle is called the excenter relative to the vertex $A$, or the excenter of $A$. Because the internal bisector of an angle is perpendicular to its external bisector, it follows that the center of the incircle together with the three excircle centers form an orthocentric system.\\
(Article on \href{https://en.wikipedia.org/wiki/Incircle_and_excircles_of_a_triangle}{Wikipedia})
-
+
\medskip
We get the center of the inscribed circle of the triangle. The result is of course in \tkzname{tkzPointResult}. We can retrieve it with \tkzcname{tkzGetPoint}.
-\begin{tkzexample}[latex=8cm,small]
+\begin{tkzexample}[latex=7cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A,6/0/B,0.8/4/C}
-\tkzDefTriangleCenter[in](A,B,C)
+\tkzDefTriangleCenter[in](A,B,C)
\tkzGetPoint{I}
-\tkzDrawLines(A,B B,C C,A)
+\tkzDrawLines(A,B B,C C,A)
\tkzDefCircle[in](A,B,C) \tkzGetPoints{I}{i}
\tkzDrawCircle(I,i)
\tkzDrawPoint[red](I)
@@ -702,11 +707,11 @@ An excircle or escribed circle of the triangle is a circle lying outside the tri
\subsubsection{Option \tkzname{euler}}
This macro allows to obtain the center of the circle of the nine points or euler's circle or Feuerbach's circle. The nine-point circle, also called Euler's circle or the Feuerbach circle, is the circle that passes through the perpendicular feet $H_A$, $H_B$, and $H_C$ dropped from the vertices of any reference triangle $ABC$ on the sides opposite them. Euler showed in 1765 that it also passes through the midpoints $M_A$, $M_B$, $M_C$ of the sides of $ABC$. By Feuerbach's theorem, the nine-point circle also passes through the midpoints $E_A$, $E_B$, and $E_C$ of the segments that join the vertices and the orthocenter $H$. These points are commonly referred to as the Euler points.\\ (\url{https://mathworld.wolfram.com/Nine-PointCircle.html})
-\begin{tkzexample}[latex=5cm,small]
-\begin{tikzpicture}[scale=1,rotate=90]
+\begin{tkzexample}[latex=6cm,small]
+\begin{tikzpicture}[scale=1.2,rotate=90]
\tkzDefPoints{0/0/A,6/0/B,0.8/4/C}
\tkzDefSpcTriangle[medial,name=M](A,B,C){_A,_B,_C}
- \tkzDefTriangleCenter[euler](A,B,C)\tkzGetPoint{N}
+ \tkzDefTriangleCenter[euler](A,B,C)\tkzGetPoint{N}
% I= N nine points
\tkzDefTriangleCenter[ortho](A,B,C)\tkzGetPoint{H}
\tkzDefMidPoint(A,H) \tkzGetPoint{E_A}
@@ -721,7 +726,8 @@ This macro allows to obtain the center of the circle of the nine points or euler
\tkzDrawPoints( H_A,H_B,H_C)
\tkzDrawPoints[green](E_A,E_B,E_C)
\tkzAutoLabelPoints[center=N,
- font=\scriptsize](A,B,C,M_A,M_B,M_C,H_A,H_B,H_C,E_A,E_B,E_C)
+ font=\scriptsize](A,B,C,M_A,M_B,M_C,H_A,H_B,H_C,%
+ E_A,E_B,E_C)
\tkzLabelPoints[font=\scriptsize](H,N)
\tkzMarkSegments[mark=s|,size=3pt,
color=blue,line width=1pt](B,E_B E_B,H)
@@ -732,15 +738,17 @@ This macro allows to obtain the center of the circle of the nine points or euler
\subsubsection{Option \tkzname{symmedian}}
The point of concurrence $K$ of the symmedians, sometimes also called the Lemoine point (in England and France) or the Grebe point (in Germany).\\
-\href{https://mathworld.wolfram.com/SymmedianPoint.html}{Weisstein, Eric W. "Symmedian Point." From MathWorld--A Wolfram Web Resource.}
+\href{https://mathworld.wolfram.com/SymmedianPoint.html}{Weisstein, Eric W. "Symmedian Point." From MathWorld--A Wolfram Web Resource.}
-\begin{tkzexample}[latex=6cm,small]
+\begin{tkzexample}[latex=7cm,small]
\begin{tikzpicture}
\tkzDefPoint(0,0){A}
\tkzDefPoint(5,0){B}
\tkzDefPoint(1,4){C}
- \tkzDefTriangleCenter[symmedian](A,B,C)\tkzGetPoint{K}
- \tkzDefTriangleCenter[median](A,B,C)\tkzGetPoint{G}
+ \tkzDefTriangleCenter[symmedian](A,B,C)
+ \tkzGetPoint{K}
+ \tkzDefTriangleCenter[median](A,B,C)
+ \tkzGetPoint{G}
\tkzDefTriangleCenter[in](A,B,C)\tkzGetPoint{I}
\tkzDefSpcTriangle[centroid,name=M](A,B,C){a,b,c}
\tkzDefSpcTriangle[incentral,name=I](A,B,C){a,b,c}
@@ -762,9 +770,9 @@ The Spieker center is the center $Sp$ of the Spieker circle, i.e., the incenter
\begin{tikzpicture}
\tkzDefPoints{0/0/A,6/0/B,5/5/C}
\tkzDefSpcTriangle[medial](A,B,C){Ma,Mb,Mc}
- \tkzDefTriangleCenter[centroid](A,B,C)
+ \tkzDefTriangleCenter[centroid](A,B,C)
\tkzGetPoint{G}
- \tkzDefTriangleCenter[spieker](A,B,C)
+ \tkzDefTriangleCenter[spieker](A,B,C)
\tkzGetPoint{Sp}
\tkzDrawPolygon[](A,B,C)
\tkzDrawPolygon[new](Ma,Mb,Mc)
@@ -780,13 +788,13 @@ The Spieker center is the center $Sp$ of the Spieker circle, i.e., the incenter
\subsubsection{Option \tkzname{gergonne}}
-The Gergonne Point is the point of concurrency which results from connecting the vertices of a triangle to the opposite points of tangency of the triangle's incircle.
+The Gergonne Point is the point of concurrency which results from connecting the vertices of a triangle to the opposite points of tangency of the triangle's incircle.
(Joseph Gergonne French mathematician )
\begin{tkzexample}[latex=8cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/B,3.6/0/C,2.8/4/A}
-\tkzDefTriangleCenter[gergonne](A,B,C)
+\tkzDefTriangleCenter[gergonne](A,B,C)
\tkzGetPoint{Ge}
\tkzDefSpcTriangle[intouch](A,B,C){C_1,C_2,C_3}
\tkzDefCircle[in](A,B,C) \tkzGetPoints{I}{i}
@@ -809,7 +817,7 @@ Let $Ta$ be the point at which the excircle with center $Ja$ meets the side $BC$
\tkzDefPoints{0/0/A,6/0/B,4/6/C}
\tkzDefSpcTriangle[ex](A,B,C){Ja,Jb,Jc}
\tkzDefSpcTriangle[extouch](A,B,C){Ta,Tb,Tc}
- \tkzDefTriangleCenter[nagel](A,B,C)
+ \tkzDefTriangleCenter[nagel](A,B,C)
\tkzGetPoint{Na}
\tkzDrawPolygon[blue](A,B,C)
\tkzDrawLines[add=0 and 1](A,Ta B,Tb C,Tc)
@@ -829,7 +837,7 @@ Let $Ta$ be the point at which the excircle with center $Ja$ meets the side $BC$
\end{tkzexample}
-\subsubsection{Option \tkzname{mittenpunkt}}
+\subsubsection{Option \tkzname{mittenpunkt}}
The mittenpunkt (also called the middlespoint) of a triangle $ABC$ is the symmedian point of the excentral triangle, i.e., the point of concurrence M of the lines from the excenters through the corresponding triangle side midpoints.\\
\href{https://mathworld.wolfram.com/Mittenpunkt.html}{Weisstein, Eric W. "Mittenpunkt." From MathWorld--A Wolfram Web Resource.}
@@ -841,12 +849,12 @@ The mittenpunkt (also called the middlespoint) of a triangle $ABC$ is the symmed
\tkzDefSpcTriangle[centroid](A,B,C){Ma,Mb,Mc}
\tkzDefSpcTriangle[ex](A,B,C){Ja,Jb,Jc}
\tkzDefSpcTriangle[extouch](A,B,C){Ta,Tb,Tc}
- \tkzDefTriangleCenter[mittenpunkt](A,B,C)
+ \tkzDefTriangleCenter[mittenpunkt](A,B,C)
\tkzGetPoint{Mi}
\tkzDrawPoints[new](Ma,Mb,Mc,Ja,Jb,Jc)
\tkzClipBB
\tkzDrawPolygon[blue](A,B,C)
- \tkzDrawLines[add=0 and 1](Ja,Ma
+ \tkzDrawLines[add=0 and 1](Ja,Ma
Jb,Mb Jc,Mc)
\tkzDrawLines[add=1 and 1](A,B A,C B,C)
\tkzDrawCircles[new](Ja,Ta Jb,Tb Jc,Tc)
@@ -867,9 +875,9 @@ The Gergonne point $Ge$, triangle centroid $G$, and mittenpunkt $M$ are collinea
\begin{tikzpicture}
\tkzDefPoints{0/0/A,2/2/B,8/0/C}
\tkzDefTriangleCenter[gergonne](A,B,C) \tkzGetPoint{Ge}
-\tkzDefTriangleCenter[centroid](A,B,C)
+\tkzDefTriangleCenter[centroid](A,B,C)
\tkzGetPoint{G}
-\tkzDefTriangleCenter[mittenpunkt](A,B,C)
+\tkzDefTriangleCenter[mittenpunkt](A,B,C)
\tkzGetPoint{M}
\tkzDrawLines[add=.25 and .25,teal](A,B A,C B,C)
\tkzDrawLines[add=.25 and .25,new](Ge,M)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-polygons.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-polygons.tex
index 95df8ef060..b5bbbcc91f 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-polygons.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-polygons.tex
@@ -191,8 +191,8 @@ From the number of sides, depending on the options, this macro determines a regu
\toprule
arguments & example & explanation \\
\midrule
-\TAline{\parg{pt1,pt2}}{\parg{O,A}}{with option "center", $O$ is the center of the polygon.}
-\TAline{\parg{pt1,pt2}}{\parg{A,B}}{with option "side", $[AB]$ is a side.}
+\TAline{\parg{pt1,pt2}}{\parg{O,A}}{with option \code{center}, $O$ is the center of the polygon.}
+\TAline{\parg{pt1,pt2}}{\parg{A,B}}{with option \code{side}, $[AB]$ is a side.}
\end{tabular}
\medskip
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-presentation.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-presentation.tex
index 0073d78803..027cb7ea0d 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-presentation.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-presentation.tex
@@ -51,27 +51,27 @@ Here are some comparisons between \tkzname{\TIKZ } and \tkzname{\tkznameofpack}
Explanation :
-The fourth tutorial of the \emph{PgfManual} is about geometric constructions. \emph{T. Tantau} proposes to get the drawing with its beautiful tool Ti\emph{k}Z. Here I propose the same construction with \emph{tkz-elements}. The color of the Ti\emph{k}Z code is orange and that of \emph{tkz-elements} is red.
+The fourth tutorial of the \emph{PgfManual} is about geometric constructions. \emph{T. Tantau} proposes to get the drawing with its beautiful tool Ti\emph{k}Z. Here I propose the same construction with \emph{tkz-elements}. The color of the Ti\emph{k}Z code is green!50!black and that of \emph{tkz-elements} is red.
\medskip
-\hspace*{1cm}\vbox{\color{orange} |\usepackage{tikz}|\\
+\vbox{\color{green!50!black} |\usepackage{tikz}|\\
|\usetikzlibrary{calc,intersections,through,backgrounds}|}
\medskip
-\hspace*{1cm}\vbox{\color{red} |\usepackage{tkz-euclide}|}
+\vbox{\color{red} |\usepackage{tkz-euclide}|}
\medskip
How to get the line AB ? To get this line, we use two fixed points.\\
\medskip
-\hspace*{1cm}\vbox{\color{orange}
+\vbox{\color{green!50!black}
|\coordinate [label=left:$A$] (A) at (0,0);|\\
|\coordinate [label=right:$B$] (B) at (1.25,0.25);|\\
|\draw (A) -- (B);|}
\medskip
-\hspace*{1cm}\vbox{\color{red}
+\vbox{\color{red}
|\tkzDefPoint(0,0){A}|\\
|\tkzDefPoint(1.25,0.25){B}|\\
|\tkzDrawSegment(A,B)|\\
@@ -81,14 +81,14 @@ How to get the line AB ? To get this line, we use two fixed points.\\
We want to draw a circle around the points $A$ and $B$ whose radius is given by the length of the line AB.
\medskip
-\hspace*{1cm}\vbox{\color{orange}
+\vbox{\color{green!50!black}
|\draw let \p1 = ($ (B) - (A) $),|\\
|\n2 = {veclen(\x1,\y1)} in|\\
| (A) circle (\n2)|\\
| (B) circle (\n2);|}
\medskip
-\hspace*{1cm}\vbox{\color{red}
+\vbox{\color{red}
|\tkzDrawCircles(A,B B,A)|
}
@@ -96,27 +96,27 @@ The intersection of the circles $\mathcal{D}$ and $\mathcal{E}$
\medskip
-\hspace*{1cm}\vbox{\color{orange}
+\vbox{\color{green!50!black}
|draw [name path=A--B] (A) -- (B);|\\
|node (D) [name path=D,draw,circle through=(B),label=left:$D$] at (A) {}; |\\
|node (E) [name path=E,draw,circle through=(A),label=right:$E$] at (B) {};|\\
-|path [name intersections={of=D and E, by={[label=above:$C$]C, [label=below:$C'$]C'}}]; |\\
+|path [name intersections={of=D and E, by={[label=above:$C$]C,[label=below:$C'$]C'}}]; |\\
|draw [name path=C--C',red] (C) -- (C');|\\
|path [name intersections={of=A--B and C--C',by=F}];|\\
|node [fill=red,inner sep=1pt,label=-45:$F$] at (F) {};|\\}
\medskip
-\hspace*{1cm}\vbox{\color{red} |\tkzInterCC(A,B)(B,A) \tkzGetPoints{C}{X}|\\}
+\vbox{\color{red} |\tkzInterCC(A,B)(B,A) \tkzGetPoints{C}{X}|\\}
How to draw points :
\medskip
-\hspace*{1cm}\vbox{\color{orange} |\foreach \point in {A,B,C}|\\
+\vbox{\color{green!50!black} |\foreach \point in {A,B,C}|\\
|\fill [black,opacity=.5] (\point) circle (2pt);|\\}
\medskip
-\hspace*{1cm}\vbox{\color{red}| \tkzDrawPoints[fill=gray,opacity=.5](A,B,C)|\\}
+\vbox{\color{red}| \tkzDrawPoints[fill=gray,opacity=.5](A,B,C)|\\}
\subsubsection{Complete code with \pkg{tkz-euclide}}
@@ -124,12 +124,12 @@ We need to define colors
|\colorlet{input}{red!80!black} |\\
|\colorlet{output}{red!70!black}|\\
-|\colorlet{triangle}{orange!40} |
+|\colorlet{triangle}{green!50!black!40} |
\begin{tkzexample}[vbox,small]
\colorlet{input}{red!80!black}
\colorlet{output}{red!70!black}
- \colorlet{triangle}{orange!40}
+ \colorlet{triangle}{green!50!black!40}
\begin{tikzpicture}[scale=1.25,thick,help lines/.style={thin,draw=black!50}]
\tkzDefPoint(0,0){A}
\tkzDefPoint(1.25+rand(),0.25+rand()){B}
@@ -164,7 +164,7 @@ Explanation
In the first part, we need to find the midpoint of the straight line $AB$. With \TIKZ\ we can use the calc library
\medskip
-\hspace*{1cm}\vbox{\color{orange} |\coordinate [label=left:$A$] (A) at (0,0);|\\
+\vbox{\color{green!50!black} |\coordinate [label=left:$A$] (A) at (0,0);|\\
|\coordinate [label=right:$B$] (B) at (1.25,0.25);|\\
|\draw (A) -- (B);|\\
|\node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {};|\\}
@@ -173,40 +173,40 @@ With \pkg{tkz-euclide} we have a macro \tkzcname{tkzDefMidPoint}, we get the poi
\medskip
-\hspace*{1cm}\vbox{\red |\tkzDefPoints{0/0/A,0.75/0.25/B,1/1.5/C}|\\
-|\tkzDefMidPoint(A,B) \tkzGetPoint{X}|}\\
+\vbox{\red |\tkzDefPoints{0/0/A,0.75/0.25/B,1/1.5/C}|\\
+|\tkzDefMidPoint(A,B) \tkzGetPoint{X}|}
\medskip
Then we need to construct a triangle equilateral. It's easy with \pkg{tkz-euclide} . With TikZ you need some effort because you need to use the midpoint $X$ to get the point $D$ with trigonometry calculation.
\medskip
-\hspace*{1cm}\vbox{\color{orange}
+\vbox{\color{green!50!black}
|\node [fill=red,inner sep=1pt,label=below:$X$] (X) at ($ (A)!.5!(B) $) {}; | \\
|\node [fill=red,inner sep=1pt,label=above:$D$] (D) at | \\
|($ (X) ! {sin(60)*2} ! 90:(B) $) {}; | \\
|\draw (A) -- (D) -- (B); | \\
-} \\
+}
\medskip
-\hspace*{1cm}\vbox{\color{red} |\tkzDefTriangle[equilateral](A,B) \tkzGetPoint{D}|}\\
+\vbox{\color{red} |\tkzDefTriangle[equilateral](A,B) \tkzGetPoint{D}|}
We can draw the triangle at the end of the picture with
\medskip
-\hspace*{1cm}\vbox{\color{red} |\tkzDrawPolygon{A,B,C}|}
+\vbox{\color{red} |\tkzDrawPolygon{A,B,C}|}
\medskip
We know how to draw the circle $\mathcal{H}$ around $B$ through $C$ and how to place the points $E$ and $F$
\medskip
-\hspace*{1cm}\vbox{\color{orange}
+\vbox{\color{green!50!black}
|\node (H) [label=135:$H$,draw,circle through=(C)] at (B) {};| \\
|\draw (D) -- ($ (D) ! 3.5 ! (B) $) coordinate [label=below:$F$] (F);| \\
-|\draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E);|} \\
+|\draw (D) -- ($ (D) ! 2.5 ! (A) $) coordinate [label=below:$E$] (E);|}
\medskip
-\hspace*{1cm}\vbox{\color{red} |\tkzDrawCircle(B,C)|\\
+\vbox{\color{red} |\tkzDrawCircle(B,C)|\\
|\tkzDrawLines[add=0 and 2](D,A D,B)|}
\medskip
@@ -216,32 +216,32 @@ Intersecting a Line and a Circle : here we search the intersection of the circle
The infinite straight line $DB$ intercepts the circle but with \TIKZ\ we need to extend the lines $DB$ and that can be done using partway calculations. We get the point $F$ and $BF$ or $DF$ intercepts the circle
\medskip
-\hspace*{1cm}\vbox{\color{orange}| \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {}; | \\
+\vbox{\color{green!50!black}| \node (H) [label=135:$H$,draw,circle through=(C)] at (B) {}; | \\
|\path let \p1 = ($ (B) - (C) $) in| \\
| coordinate [label=left:$G$] (G) at ($ (B) ! veclen(\x1,\y1) ! (F) $); | \\
-|\fill[red,opacity=.5] (G) circle (2pt);|} \\
+|\fill[red,opacity=.5] (G) circle (2pt);|}
\medskip
Like the intersection of two circles, it's easy to find the intersection of a line and a circle with \pkg{tkz-euclide}. We don't need $F$
\medskip
-\hspace*{1cm}\vbox{\color{red} | \tkzInterLC(B,D)(B,C)\tkzGetFirstPoint{G}|}
+\vbox{\color{red} | \tkzInterLC(B,D)(B,C)\tkzGetFirstPoint{G}|}
\medskip
There are no more difficulties. Here the final code with some simplications.
We draw the circle $\mathcal{K}$ with center $D$ and passing through $G$. It intersects the line $AD$ at point $L$. $AL = BC$.
-\hspace*{1cm}\vbox{\color{red} | \tkzDrawCircle(D,G)|}
-\hspace*{1cm}\vbox{\color{red} | \tkzInterLC(D,A)(D,G)\tkzGetSecondPoint{L}|}
+\vbox{\color{red} | \tkzDrawCircle(D,G)|}
+\vbox{\color{red} | \tkzInterLC(D,A)(D,G)\tkzGetSecondPoint{L}|}
\begin{tkzexample}[latex=7cm,small]
\begin{tikzpicture}[scale=1.5]
\tkzDefPoint(0,0){A}
\tkzDefPoint(0.75,0.25){B}
\tkzDefPoint(1,1.5){C}
-\tkzDefTriangle[equilateral](A,B) \tkzGetPoint{D}
-\tkzInterLC[near](D,B)(B,C) \tkzGetSecondPoint{G}
-\tkzInterLC[near](A,D)(D,G) \tkzGetFirstPoint{L}
+\tkzDefTriangle[equilateral](A,B)\tkzGetPoint{D}
+\tkzInterLC[near](D,B)(B,C) \tkzGetSecondPoint{G}
+\tkzInterLC[near](A,D)(D,G) \tkzGetFirstPoint{L}
\tkzDrawCircles(B,C D,G)
\tkzDrawLines[add=0 and 2](D,A D,B)
\tkzDrawSegment(A,B)
@@ -399,7 +399,7 @@ Let's analyze the figure
\[\widehat{BCA}=90^\circ -\alpha/2 \]
\item Finally \[\widehat{CBD}=\alpha=36^\circ \]
- the triangle $CBD$ is a "golden" triangle.
+ the triangle $CBD$ is a \code{golden} triangle.
\end{enumerate}
\vspace*{24pt}
@@ -448,7 +448,7 @@ After building the golden triangle $BCD$, we build the point $A$ by noticing tha
\subsubsection{Part II: two others methods with golden and euclid triangle}
-\tkzname{\tkznameofpack} knows how to define a "golden" or "euclide" triangle. We can define $BCD$ and $BCA$ like gold triangles.
+\tkzname{\tkznameofpack} knows how to define a \code{golden} or \code{euclide} triangle. We can define $BCD$ and $BCA$ like gold triangles.
\begin{center}
@@ -529,7 +529,7 @@ $IB=a$, $AI=1$
\tkzDefMidPoint(A,B) \tkzGetPoint{M}
\tkzDefPointWith[orthogonal](I,M) \tkzGetPoint{H}
\tkzInterLC(I,H)(M,B) \tkzGetFirstPoint{C}
- \tkzDrawSegment[style=orange](I,C)
+ \tkzDrawSegment[style=purple](I,C)
\tkzDrawArc(M,B)(A)
\tkzDrawSegment[dim={$1$,-16pt,}](A,I)
\tkzDrawSegment[dim={$(a-1)/2$,-10pt,}](I,M)
@@ -587,7 +587,7 @@ The following code consists of several parts:
\item The third one includes the different drawings;
\begin{tkzltxexample}[]
- \tkzDrawSegment[style=orange](I,H)
+ \tkzDrawSegment[style=purple](I,H)
\tkzDrawPoints(O,I,A,B,M)
\tkzDrawArc(M,A)(O)
\tkzDrawSegment[dim={$1$,-16pt,}](A,I)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-show.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-show.tex
index e1f84630c8..13f6e06ebf 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-show.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-show.tex
@@ -39,12 +39,14 @@ You have to add, of course, all the styles of \TIKZ\ for tracings\dots
\end{tkzexample}
\subsubsection{Example of \tkzcname{tkzShowLine} and \tkzname{perpendicular}}
-\begin{tkzexample}[latex=5cm,small]
+\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A, 3/2/B, 2/2/C}
-\tkzDefLine[perpendicular=through C,K=-.5](A,B) \tkzGetPoint{c}
+\tkzDefLine[perpendicular=through C,K=-.5](A,B)
+\tkzGetPoint{c}
\tkzShowLine[perpendicular=through C,K=-.5,gap=3](A,B)
-\tkzDefPointBy[projection=onto A--B](c)\tkzGetPoint{h}
+\tkzDefPointBy[projection=onto A--B](c)
+\tkzGetPoint{h}
\tkzMarkRightAngle[fill=lightgray](A,h,C)
\tkzDrawLines[add=.5 and .5](A,B C,c)
\tkzDrawPoints(A,B,C,h,c)
@@ -109,7 +111,7 @@ options & default & definition \\
\subsubsection{Example of the use of \tkzcname{tkzShowTransformation}}
\begin{tkzexample}[latex=6cm,small]
-\begin{tikzpicture}[scale=.6]
+\begin{tikzpicture}[scale=.5]
\tkzDefPoint(0,0){O} \tkzDefPoint(2,-2){A}
\tkzDefPoint(70:4){B} \tkzDrawPoints(A,O,B)
\tkzLabelPoints(A,O,B)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-styles.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-styles.tex
index b81098e5ab..5d1930584e 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-styles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-styles.tex
@@ -381,21 +381,21 @@ This library is used to produce different styles of arrow heads. The next examp
\tkzname{Stealth}, \tkzname{Triangle}, \tkzname{To}, \tkzname{Latex} and \dots which can be combined with \tkzname{reversed}. That's easy to place an arrow at one or two endpoints.
\begin{enumerate}
-\item \tkzname{Triangle} and \tkzname{Ray}
+\item \tkzname{-Triangle} and \tkzname{Segment}
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A,4/0/B}
\tkzDrawSegment[-Triangle](A,B)
\end{tikzpicture}
\end{tkzexample}
-\item \tkzname{Stealth} and \tkzname{Segment}
+\item \tkzname{Stealth-Stealth} and \tkzname{Segment}
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A,4/0/B}
\tkzDrawSegment[Stealth-Stealth](A,B)
\end{tikzpicture}
\end{tkzexample}
-\item \tkzname{Latex} and \tkzname{Line}
+\item \tkzname{Latex-Latex} and \tkzname{Line}
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A,4/0/B}
@@ -403,28 +403,28 @@ This library is used to produce different styles of arrow heads. The next examp
\tkzDrawPoints(A,B)
\end{tikzpicture}
\end{tkzexample}
-\item \tkzname{To} and \tkzname{Segment}
+\item \tkzname{To-To} and \tkzname{Segment}
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A,4/0/B}
\tkzDrawSegment[To-To](A,B)
\end{tikzpicture}
\end{tkzexample}
-\item \tkzname{Latex} and \tkzname{Segment}
+\item \tkzname{Latex-Late} and \tkzname{Segment}
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A,4/0/B}
\tkzDrawSegment[Latex-Latex](A,B)
\end{tikzpicture}
\end{tkzexample}
-\item \tkzname{Latex} and \tkzname{Ray}
+\item \tkzname{Latex-} and \tkzname{Segment}
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A,4/0/B}
\tkzDrawSegment[Latex-](A,B)
\end{tikzpicture}
\end{tkzexample}
-\item \tkzname{Latex} and \tkzname{Several rays}
+\item \tkzname{-Latex} and \tkzname{Segments}
\begin{tkzexample}[latex=6cm,small]
\begin{tikzpicture}
\tkzDefPoints{0/0/A,4/0/B,5/-2/C}
@@ -455,7 +455,7 @@ You can redefine this style.
\subsection{Arrows on middle point of a line segment}
-Arrows on lines are used to indicate that those lines are parallel. It depends on the country, in France we prefer to indicate outside the figure that $(A,B) \parallel (D,C)$. The code is an adaptation of an answer by \tkzname{muzimuzhi Z} on the site \href{https://tex.stackexchange.com/questions/632596/how-to-manage-argument-pattern-keys-and-subways}{tex.stackexchange.com}.
+Arrows on lines are used to indicate that those lines are parallel. It depends on the country, in France we prefer to indicate outside the figure that $(A,B) \parallel (D,C)$. The code is an adaptation of an answer by \tkzname{Muzimuzhi Z} on the site \href{https://tex.stackexchange.com/questions/632596/how-to-manage-argument-pattern-keys-and-subways}{tex.stackexchange.com}.
\medskip
Syntax: \\
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-tools.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-tools.tex
index 1123d86a2f..d51cfbb021 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-tools.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-tools.tex
@@ -329,8 +329,8 @@ arguments & example & explanation \\
\node at (1,-3) {%
$\overrightarrow{PA}\cdot \overrightarrow{PB} =
\overrightarrow{PC}\cdot \overrightarrow{PD}$};
- \node at (1,-4)%
- {$\overrightarrow{PA}\cdot \overrightarrow{PB} =\pab$};
+ \node at (1,-4)%
+ {$\overrightarrow{PA}\cdot \overrightarrow{PB}=\pab$};
\node at (1,-5){%
$\overrightarrow{PC}\cdot \overrightarrow{PD} =\pcd$};
\end{tikzpicture}
@@ -361,9 +361,12 @@ In this example, the radical axis $(EF)$ has been drawn. A point $H$ has been ch
\tkzDrawCircles(A,B C,D)
\tkzDefRadicalAxis(A,B)(C,D) \tkzGetPoints{E}{F}
\tkzDrawLine[add=1 and 2](E,F)
- \tkzDefPointOnLine[pos=1.5](E,F) \tkzGetPoint{H}
- \tkzDefLine[tangent from = H](A,B)\tkzGetPoints{T}{T'}
- \tkzDefLine[tangent from = H](C,D)\tkzGetPoints{S}{S'}
+ \tkzDefPointOnLine[pos=1.5](E,F)
+ \tkzGetPoint{H}
+ \tkzDefLine[tangent from = H](A,B)
+ \tkzGetPoints{T}{T'}
+ \tkzDefLine[tangent from = H](C,D)
+ \tkzGetPoints{S}{S'}
\tkzDrawSegments(H,T H,T' H,S H,S')
\tkzDrawPoints(A,B,C,D,E,F,H,T,T',S,S')
\tkzPowerCircle(H)(A,B) \tkzGetResult{pw}
@@ -415,7 +418,7 @@ arguments & example & explanation \\
\tkzGetPoints{E}{F}
\tkzDrawPoints(A,B,C,D,E,F)
\tkzLabelPoints(A,B,C,D,E,F)
- \tkzDrawLine[add=.5 and 1](E,F)
+ \tkzDrawLine[add=.25 and .5](E,F)
\tkzDrawLine[add=.25 and .25](A,B)
\end{tikzpicture}
\end{tkzexample}
@@ -460,7 +463,7 @@ arguments & example & explanation \\
-\begin{tkzexample}[small,latex=8cm]
+\begin{tkzexample}[small,latex=7cm]
\begin{tikzpicture}[scale=.4]
\tkzDefPoints{0/0/A,5/0/a,7/-1/B,3/-1/b,5/-4/C,2/-4/c}
\tkzDrawCircles(A,a B,b C,c)
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf b/macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
index cbafb94f7a..aeb4428c81 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
index b471338fc8..f4c6c913e2 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
@@ -10,240 +10,10 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tool-eu-angles.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tool-eu-angles.tex}
\makeatletter
-%<--------------------------------------------------------------------------–>
-% tkzSetUpArc
-%<--------------------------------------------------------------------------–>
-\pgfkeys{/tkzsetuparc/.cd,
- color/.store in = \tkz@arc@color,
- line width/.store in = \tkz@arc@lw,
- style/.store in = \tkz@arc@style,
- line width = \tkz@euc@linewidth,
- color = \tkz@euc@linecolor,
- style = \tkz@euc@linestyle,
- /tkzsetuparc/.search also = {/tikz,/tkzcompass},
- }
-\def\tkzSetUpArc{\pgfutil@ifnextchar[{\tkz@SetUpArc}{\tkz@SetUpArc[]}}
-\def\tkz@SetUpArc[#1]{%
-\pgfqkeys{/tkzsetuparc}{#1}
-\tikzset{arc style/.style={color = \tkz@arc@color,
- line width = \tkz@arc@lw,
- style = \tkz@arc@style
- }}
-}% end setup
-%<------------------------------ Arcs -------------------------------------–
-% options : delta
-% \def\tkz@delta{0}
-% \tikzset{arc style/.style={#1}}
-% \pgfkeys{/tikz/.cd,delta/.code={\def\tkz@delta{#1}}}
-\newif\iftkz@reverse
-\gdef\tkz@numa{0}
-\pgfkeys{/tkzdrawarc/.cd,
- type/.is choice,
- type/towards/.code = \def\tkz@numa{0},
- type/rotate/.code = \def\tkz@numa{1},
- type/angles/.code = \def\tkz@numa{2},
- type/R/.code = \def\tkz@numa{3},
- type/R with nodes/.code = \def\tkz@numa{4},
- towards/.style = {type=towards},
- rotate/.style = {type=rotate},
- R/.style = {type=R},
- angles/.style = {type=angles},
- R with nodes/.style = {type=R with nodes},
- diameter/.code = {},
- arc/.code = {},
- size/.code = {},
- mark/.code = {},
- mkpos/.code = {},
- mksize/.code = {},
- mkcolor/.code = {},
- type/.default = towards,
- delta/.store in = \tkz@delta,
- delta = 0,
- reverse/.is if = tkz@reverse,
- reverse/.default = true,
- reverse = false,
- /tkzdrawarc/.search also = {/tikz}
-}
-\def\tkzDrawArc{\pgfutil@ifnextchar[{\tkz@DrawArc}{\tkz@DrawArc[]}}
-\def\tkz@DrawArc[#1](#2,#3)(#4){%
-\begingroup
-\pgfqkeys{/tkzdrawarc}{#1}
-\ifcase\tkz@numa%
- \tkzDrawArcTowards[#1](#2,#3)(#4)
-\or% 1
- \tkzDrawArcRotate[#1](#2,#3)(#4)
-\or% 2
- \tkzDrawArcAngles[#1](#2,#3)(#4)
-\or% 3
- \tkzDrawArcRAngles[#1](#2,#3)(#4)
-\or% 4
- \tkzDrawArcR[#1](#2,#3)(#4)
-\fi
-\endgroup
-}
-%<--------------------------------------------------------------------------–>
-% ARC nodes #2 center #3 first point last point #4
-% delta un peu plus à chaque extrémité
-% example : \tkzDrawArc(A,B)(C)
-%<--------------------------------------------------------------------------–>
-\def\tkzDrawArcTowards{\pgfutil@ifnextchar[{\tkz@DrawArcN}{\tkz@DrawArcN[]}}
-\def\tkz@DrawArcN[#1](#2,#3)(#4){%
-\begingroup
- \tkz@@CalcLengthcm(#2,#3){tkz@radius}
- \tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@FirstAngle}
- \tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@SecondAngle}
- \tkz@DrawArcRAngles[#1](#2,\tkz@radius)(\tkz@FirstAngle,\tkz@SecondAngle)
-\endgroup
-}
-%<--------------------------------------------------------------------------–>
-% nodes #2 center #3 first point rotate #4 with Angle
-% delta un peu plus à chaque extrémité
-% tkzDrawArcRotate(O,A)(60)
-%<--------------------------------------------------------------------------–>
-\def\tkzDrawArcRotate{\pgfutil@ifnextchar[{\tkz@DrawArcRotate}{%
- \tkz@DrawArcRotate[]}}
-\def\tkz@DrawArcRotate[#1](#2,#3)(#4){%
-\begingroup
- \tkz@@CalcLength(#2,#3){tkz@radius}
- \tkzFindSlopeAngle(#2,#3) \tkzGetAngle{tkz@FirstA}
- \pgfmathadd{\tkz@FirstA}{#4}
- \edef\tkz@SecondA{\pgfmathresult}
- \pgfmathgreaterthan{#4}{0}
- \ifdim\pgfmathresult pt=1 pt\relax%
- \tkz@DrawArcRAngles[#1](#2,\tkz@radius pt)(\tkz@FirstA,\tkz@SecondA)
- \else
- \tkz@DrawArcRAngles[#1](#2,\tkz@radius pt)(\tkz@SecondA,\tkz@FirstA)
- \fi
- \endgroup
-}
-%<--------------------------------------------------------------------------–>
-% deux angles
-% \tkzDrawArcAngles(O,A)(0,60)
-%<--------------------------------------------------------------------------–>
-\def\tkzDrawArcAngles{\pgfutil@ifnextchar[{\tkz@DrawArcAngles}{%
- \tkz@DrawArcAngles[]}}
-\def\tkz@DrawArcAngles[#1](#2,#3)(#4,#5){%
-\begingroup
- \tkz@@CalcLength(#2,#3){tkzLengthResult}
- \tkz@DrawArcRAngles[#1](#2,\tkzLengthResult pt)(#4,#5)
-\endgroup
-}
-%<--------------------------------------------------------------------------–>
-% Degree #2 center #4 - #3 radius from #5 (degree) to #6(degree)
-%<--------------------------------------------------------------------------–>
-\def\tkzDrawArcRwithNodes{\pgfutil@ifnextchar[{\tkz@DrawArcRwithNodes}{%
- \tkz@DrawArcRwithNodes[]}}
-\def\tkz@DrawArcRwithNodes[#1](#2,#3,#4)(#5,#6){%
-\begingroup
- \tkz@@CalcLength(#3,#4){tkzLengthResult}
- \tkzFindSlopeAngle(#2,#5)\tkzGetAngle{tkz@FirstAngle}
- \tkzFindSlopeAngle(#2,#6)\tkzGetAngle{tkz@SecondAngle}
- \tkz@DrawArcRAngles[#1](#2,\tkzLengthResult)(\tkz@FirstAngle,\tkz@SecondAngle)
-\endgroup
-}
-%<--------------------------------------------------------------------------–>
-% Nodes R #2 center #3 radius en cm from #4(node) to #5(node)
-% \tkzDrawArcR(O,2)(A,B)
-%<--------------------------------------------------------------------------–>
-\def\tkzDrawArcR{\pgfutil@ifnextchar[{\tkz@DrawArcR}{\tkz@DrawArcR[]}}
-\def\tkz@DrawArcR[#1](#2,#3)(#4,#5){%
-\begingroup
- \tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@FirstAngle}
- \tkzFindSlopeAngle(#2,#5)\tkzGetAngle{tkz@SecondAngle}
- \tkz@DrawArcRAngles[#1](#2,#3)(\tkz@FirstAngle,\tkz@SecondAngle)
-\endgroup
-}
-%<--------------------------------------------------------------------------–>
-%<--------------------------------------------------------------------------–>
-% #1 center #2 radius #4 first angle (degree) #5 second angle (degree)
-% angles 0 .. 180 or -180 .. 0
-%<--------------------------------------------------------------------------–>
-% example : \tkzDrawArc(A,2)(30,90)
-\def\tkzDrawArcRAngles{\pgfutil@ifnextchar[{\tkz@DrawArcRAngles}{%
- \tkz@DrawArcRAngles[]}}
-\def\tkz@DrawArcRAngles[#1](#2,#3)(#4,#5){%
- \begingroup
- \tkzNormalizeAngle(#4,#5)
- \pgfmathsubtract{\tkz@FirstAngle}{\tkz@delta}
- \edef\tkz@FirstAngle{\pgfmathresult}%
- \pgfmathadd{\tkz@SecondAngle}{\tkz@delta}
- \edef\tkz@SecondAngle{\pgfmathresult}
- \iftkz@reverse
- \let\tkztemp\tkz@FirstAngle
- \let\tkz@FirstAngle\tkz@SecondAngle
- \let\tkz@SecondAngle\tkztemp
- \fi
- \draw[shift = {(#2)},arc style,/tkzdrawarc/.cd,#1]%
- (\tkz@FirstAngle:#3) arc (\tkz@FirstAngle:\tkz@SecondAngle:#3);
-\endgroup
-}
-%<--------------------------------------------------------------------------–>
-\pgfkeys{
- /@tkzmarkarc/.cd,
- pos/.store in = \tkz@mkarcpos,
- color/.store in = \tkz@mkcolor,
- mark/.store in = \tkz@markarcseg,
- size/.store in = \tkz@mkarcsize,
- color = teal!20,
- size = 4pt,
- pos = .5,
- mark = none,
- /@tkzmarkarc/.search also={/tikz},
-}
-\def\tkzMarkArc{\pgfutil@ifnextchar[{\tkz@MarkArc}{\tkz@MarkArc[]}}
-\def\tkz@MarkArc[#1](#2,#3,#4){%
-\begingroup
- \pgfqkeys{/@tkzmarkarc}{#1} \def\tkz@mymarkarc{\pgfsetplotmarksize{\tkz@mkarcsize}\pgfuseplotmark{\tkz@markarcseg}}
-\tkz@@CalcLength(#2,#3){tkz@radius}
-\tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@FirstAngle}
-\tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@SecondAngle}
-\tkzNormalizeAngle(\tkz@FirstAngle,\tkz@SecondAngle)
- \pgfmathsubtract{\tkz@FirstAngle}{\tkz@delta}
- \edef\tkz@FirstAngle{\pgfmathresult}%
- \pgfmathadd{\tkz@SecondAngle}{\tkz@delta}
- \edef\tkz@SecondAngle{\pgfmathresult}
-\begin{scope}[decoration={markings,mark=at position \tkz@mkarcpos with {\tkz@mymarkarc}}]
-\path[shift = {(#2)},\tkz@mkcolor,/@tkzmarkarc/.cd,#1,postaction={decorate}]%
-(\tkz@FirstAngle:\tkz@radius pt) arc (\tkz@FirstAngle:\tkz@SecondAngle:\tkz@radius pt);
-\end{scope}
-\endgroup
-}
-
-\def\tkzLabelArc{\pgfutil@ifnextchar[{\tkz@LabelArc}{\tkz@LabelArc[]}}
-\def\tkz@LabelArc[#1](#2,#3,#4)#5{%
-\begingroup
-\pgfqkeys{/@tkzmarkarc}{#1}
-\tkz@@CalcLength(#2,#3){tkz@radius}
-\tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@FirstAngle}
-\tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@SecondAngle}
-\tkzNormalizeAngle(\tkz@FirstAngle,\tkz@SecondAngle)
-\pgfmathsubtract{\tkz@FirstAngle}{\tkz@delta}
-\edef\tkz@FirstAngle{\pgfmathresult}%
-\pgfmathadd{\tkz@SecondAngle}{\tkz@delta}
-\edef\tkz@SecondAngle{\pgfmathresult}
-\begin{scope}[decoration={markings,mark=at position \tkz@mkarcpos with \node{#5};}]
- \path[shift = {(#2)},/@tkzmarkarc/.cd,#1,postaction={decorate}]%
- (\tkz@FirstAngle:\tkz@radius pt) arc (\tkz@FirstAngle:\tkz@SecondAngle:\tkz@radius pt); \end{scope}
-\endgroup
-}
-%<--------------------------------------------------------------------------->
-% tkzDrawArcRAN >
-%<--------------------------------------------------------------------------->
-\def\tkzDrawArcRAN[#1](#2,#3)(#4,#5){%
-\begingroup
- \draw[shift = {(#2)},/tkzdrawarc/.cd,#1] (#4:#3) arc (#4:#5:#3);
-\endgroup
-}
-%<--------------- tkzPathArcRAN ----------------------------------
-\def\tkzPathArcRAN[#1](#2,#3)(#4,#5){%
-\begingroup
- \path[shift = {(#2)},/tkzdrawarc/.cd,#1] (#4:#3) arc (#4:#5:#3);
-\endgroup
-}
%<--------------------------------------------------------------------------->
% Mark an angle modi 3.03 suppression de \tkz@mksize,
%<--------------------------------------------------------------------------->
@@ -276,12 +46,12 @@
%\tikzset{lbstyle/.style = {color=\tkz@mainlinecolor}}
\pgfkeys{/tkzmkangle/.cd,
- arc/.estore in = \tkz@arc,
- size/.store in = \tkz@size,
- mark/.store in = \tkz@markang,
- mkpos/.estore in = \tkz@mkpos,
- mksize/.store in = \tkz@mksize,
- mkcolor/.store in = \tkz@mkcolor,
+ arc/.code = \def\tkz@arc{#1},
+ size/.code = \def\tkz@size{#1},
+ mark/.code = \def\tkz@markang{#1},
+ mkpos/.code = \def\tkz@mkpos{#1},
+ mksize/.code = \def\tkz@mksize{#1},
+ mkcolor/.code = \def\tkz@mkcolor{#1},
arc = l,
size = 1,
mark = none,
@@ -289,7 +59,11 @@
mkcolor = black,
mkpos = 0.5,
/tkzmkangle/.search also={/tikz}
-}
+}
+% utils
+
+%-----------------------------------------------------------------------
+
\def\tkzMarkAngle{\pgfutil@ifnextchar[{\tkz@MarkAngle}{\tkz@MarkAngle[]}}
\def\tkz@MarkAngle[#1](#2,#3,#4){%
\begingroup
@@ -301,8 +75,7 @@
\def\tkz@mymark{\pgfsetplotmarksize{\tkz@mksize}\pgfuseplotmark{\tkz@markang}}
% draw the arcs
\begin{scope}[veclen]
- \begin{scope}[decoration= {markings,
- mark=at position \tkz@mkpos with {\tkz@mymark}}]
+ \begin{scope}[decoration = {markings, mark=at position \tkz@mkpos with {\tkz@mymark}}]
\ifx\tkz@arc\tkz@arcsimple
\tkzDrawArcRAN[#1,fill=none]%
(#3,\tkz@size)(\tkz@FirstAngle,\tkz@SecondAngle)%
@@ -522,17 +295,6 @@
\endgroup
}
%<--------------------------------------------------------------------------->
-% tkzdefMidArc center and two points
-\def\tkzDefMidArc(#1,#2,#3){%
-\begingroup
-\tkz@@CalcLength(#1,#2){tkz@radius}
-\tkzFindSlopeAngle(#1,#2)\tkzGetAngle{tkz@FirstAngle}
-\tkzFindSlopeAngle(#1,#3)\tkzGetAngle{tkz@SecondAngle}
-\tkzNormalizeAngle(\tkz@FirstAngle,\tkz@SecondAngle)
- \path[shift = {(#1)}](\tkz@FirstAngle:\tkz@radius pt) arc
- (\tkz@FirstAngle:\tkz@SecondAngle:\tkz@radius pt) coordinate[midway] (tkzPointResult);
-\endgroup
-}
\makeatother
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-arcs.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-arcs.tex
new file mode 100644
index 0000000000..e93a8a2c49
--- /dev/null
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-arcs.tex
@@ -0,0 +1,262 @@
+% tkz-tool-eu-arcs.tex
+% Copyright 2024 Alain Matthes
+% 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 Alain Matthes.
+
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tool-eu-arcs.tex}
+\makeatletter
+%<--------------------------------------------------------------------------–>
+% tkzSetUpArc
+%<--------------------------------------------------------------------------–>
+\pgfkeys{/tkzsetuparc/.cd,
+ color/.store in = \tkz@arc@color,
+ line width/.store in = \tkz@arc@lw,
+ style/.store in = \tkz@arc@style,
+ line width = \tkz@euc@linewidth,
+ color = \tkz@euc@linecolor,
+ style = \tkz@euc@linestyle,
+ /tkzsetuparc/.search also = {/tikz,/tkzcompass},
+ }
+\def\tkzSetUpArc{\pgfutil@ifnextchar[{\tkz@SetUpArc}{\tkz@SetUpArc[]}}
+\def\tkz@SetUpArc[#1]{%
+\pgfqkeys{/tkzsetuparc}{#1}
+\tikzset{arc style/.style={color = \tkz@arc@color,
+ line width = \tkz@arc@lw,
+ style = \tkz@arc@style
+ }}
+}% end setup
+%<------------------------------ Arcs -------------------------------------–
+% options : delta
+% \def\tkz@delta{0}
+% \tikzset{arc style/.style={#1}}
+% \pgfkeys{/tikz/.cd,delta/.code={\def\tkz@delta{#1}}}
+\newif\iftkz@reverse
+\gdef\tkz@numa{0}
+\pgfkeys{/tkzdrawarc/.cd,
+ type/.is choice,
+ type/towards/.code = \def\tkz@numa{0},
+ type/rotate/.code = \def\tkz@numa{1},
+ type/angles/.code = \def\tkz@numa{2},
+ type/R/.code = \def\tkz@numa{3},
+ type/R with nodes/.code = \def\tkz@numa{4},
+ towards/.style = {type=towards},
+ rotate/.style = {type=rotate},
+ R/.style = {type=R},
+ angles/.style = {type=angles},
+ R with nodes/.style = {type=R with nodes},
+ diameter/.code = {},
+ arc/.code = {},
+ size/.code = {},
+ mark/.code = {},
+ mkpos/.code = {},
+ mksize/.code = {},
+ mkcolor/.code = {},
+ type/.default = towards,
+ delta/.store in = \tkz@delta,
+ delta = 0,
+ reverse/.is if = tkz@reverse,
+ reverse/.default = true,
+ reverse = false,
+ /tkzdrawarc/.search also = {/tikz}
+}
+\def\tkzDrawArc{\pgfutil@ifnextchar[{\tkz@DrawArc}{\tkz@DrawArc[]}}
+\def\tkz@DrawArc[#1](#2,#3)(#4){%
+\begingroup
+\pgfqkeys{/tkzdrawarc}{#1}
+\ifcase\tkz@numa%
+ \tkzDrawArcTowards[#1](#2,#3)(#4)
+\or% 1
+ \tkzDrawArcRotate[#1](#2,#3)(#4)
+\or% 2
+ \tkzDrawArcAngles[#1](#2,#3)(#4)
+\or% 3
+ \tkzDrawArcRAngles[#1](#2,#3)(#4)
+\or% 4
+ \tkzDrawArcR[#1](#2,#3)(#4)
+\fi
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% ARC nodes #2 center #3 first point last point #4
+% delta un peu plus à chaque extrémité
+% example : \tkzDrawArc(A,B)(C)
+%<--------------------------------------------------------------------------–>
+\def\tkzDrawArcTowards{\pgfutil@ifnextchar[{\tkz@DrawArcN}{\tkz@DrawArcN[]}}
+\def\tkz@DrawArcN[#1](#2,#3)(#4){%
+\begingroup
+ \tkz@@CalcLengthcm(#2,#3){tkz@radius}
+ \tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@FirstAngle}
+ \tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@SecondAngle}
+ \tkz@DrawArcRAngles[#1](#2,\tkz@radius)(\tkz@FirstAngle,\tkz@SecondAngle)
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% nodes #2 center #3 first point rotate #4 with Angle
+% delta un peu plus à chaque extrémité
+% tkzDrawArcRotate(O,A)(60)
+%<--------------------------------------------------------------------------–>
+\def\tkzDrawArcRotate{\pgfutil@ifnextchar[{\tkz@DrawArcRotate}{%
+ \tkz@DrawArcRotate[]}}
+\def\tkz@DrawArcRotate[#1](#2,#3)(#4){%
+\begingroup
+ \tkz@@CalcLength(#2,#3){tkz@radius}
+ \tkzFindSlopeAngle(#2,#3) \tkzGetAngle{tkz@FirstA}
+ \pgfmathadd{\tkz@FirstA}{#4}
+ \edef\tkz@SecondA{\pgfmathresult}
+ \pgfmathgreaterthan{#4}{0}
+ \ifdim\pgfmathresult pt=1 pt\relax%
+ \tkz@DrawArcRAngles[#1](#2,\tkz@radius pt)(\tkz@FirstA,\tkz@SecondA)
+ \else
+ \tkz@DrawArcRAngles[#1](#2,\tkz@radius pt)(\tkz@SecondA,\tkz@FirstA)
+ \fi
+ \endgroup
+}
+%<--------------------------------------------------------------------------–>
+% deux angles
+% \tkzDrawArcAngles(O,A)(0,60)
+%<--------------------------------------------------------------------------–>
+\def\tkzDrawArcAngles{\pgfutil@ifnextchar[{\tkz@DrawArcAngles}{%
+ \tkz@DrawArcAngles[]}}
+\def\tkz@DrawArcAngles[#1](#2,#3)(#4,#5){%
+\begingroup
+ \tkz@@CalcLength(#2,#3){tkzLengthResult}
+ \tkz@DrawArcRAngles[#1](#2,\tkzLengthResult pt)(#4,#5)
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% Degree #2 center #4 - #3 radius from #5 (degree) to #6(degree)
+%<--------------------------------------------------------------------------–>
+\def\tkzDrawArcRwithNodes{\pgfutil@ifnextchar[{\tkz@DrawArcRwithNodes}{%
+ \tkz@DrawArcRwithNodes[]}}
+\def\tkz@DrawArcRwithNodes[#1](#2,#3,#4)(#5,#6){%
+\begingroup
+ \tkz@@CalcLength(#3,#4){tkzLengthResult}
+ \tkzFindSlopeAngle(#2,#5)\tkzGetAngle{tkz@FirstAngle}
+ \tkzFindSlopeAngle(#2,#6)\tkzGetAngle{tkz@SecondAngle}
+ \tkz@DrawArcRAngles[#1](#2,\tkzLengthResult)(\tkz@FirstAngle,\tkz@SecondAngle)
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% Nodes R #2 center #3 radius en cm from #4(node) to #5(node)
+% \tkzDrawArcR(O,2)(A,B)
+%<--------------------------------------------------------------------------–>
+\def\tkzDrawArcR{\pgfutil@ifnextchar[{\tkz@DrawArcR}{\tkz@DrawArcR[]}}
+\def\tkz@DrawArcR[#1](#2,#3)(#4,#5){%
+\begingroup
+ \tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@FirstAngle}
+ \tkzFindSlopeAngle(#2,#5)\tkzGetAngle{tkz@SecondAngle}
+ \tkz@DrawArcRAngles[#1](#2,#3)(\tkz@FirstAngle,\tkz@SecondAngle)
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+%<--------------------------------------------------------------------------–>
+% #1 center #2 radius #4 first angle (degree) #5 second angle (degree)
+% angles 0 .. 180 or -180 .. 0
+%<--------------------------------------------------------------------------–>
+% example : \tkzDrawArc(A,2)(30,90)
+\def\tkzDrawArcRAngles{\pgfutil@ifnextchar[{\tkz@DrawArcRAngles}{%
+ \tkz@DrawArcRAngles[]}}
+\def\tkz@DrawArcRAngles[#1](#2,#3)(#4,#5){%
+ \begingroup
+ \tkzNormalizeAngle(#4,#5)
+ \pgfmathsubtract{\tkz@FirstAngle}{\tkz@delta}
+ \edef\tkz@FirstAngle{\pgfmathresult}%
+ \pgfmathadd{\tkz@SecondAngle}{\tkz@delta}
+ \edef\tkz@SecondAngle{\pgfmathresult}
+ \iftkz@reverse
+ \let\tkztemp\tkz@FirstAngle
+ \let\tkz@FirstAngle\tkz@SecondAngle
+ \let\tkz@SecondAngle\tkztemp
+ \fi
+ \draw[shift = {(#2)},arc style,/tkzdrawarc/.cd,#1]%
+ (\tkz@FirstAngle:#3) arc (\tkz@FirstAngle:\tkz@SecondAngle:#3);
+\endgroup
+}
+
+%<--------------------------------------------------------------------------->
+% tkzDrawArcRAN >
+%<--------------------------------------------------------------------------->
+\def\tkzDrawArcRAN[#1](#2,#3)(#4,#5){%
+\begingroup
+ \draw[shift = {(#2)},/tkzdrawarc/.cd,#1] (#4:#3) arc (#4:#5:#3);
+\endgroup
+}
+%<--------------- tkzPathArcRAN ----------------------------------
+\def\tkzPathArcRAN[#1](#2,#3)(#4,#5){%
+\begingroup
+ \path[shift = {(#2)},/tkzdrawarc/.cd,#1] (#4:#3) arc (#4:#5:#3);
+\endgroup
+}
+%<--------------------------------------------------------------------------->
+%% tkzdefMidArc center and two points
+\def\tkzDefMidArc(#1,#2,#3){%
+\begingroup
+\tkz@@CalcLength(#1,#2){tkz@radius}
+\tkzFindSlopeAngle(#1,#2)\tkzGetAngle{tkz@FirstAngle}
+\tkzFindSlopeAngle(#1,#3)\tkzGetAngle{tkz@SecondAngle}
+\tkzNormalizeAngle(\tkz@FirstAngle,\tkz@SecondAngle)
+ \path[shift = {(#1)}](\tkz@FirstAngle:\tkz@radius pt) arc
+ (\tkz@FirstAngle:\tkz@SecondAngle:\tkz@radius pt) coordinate[midway] (tkzPointResult);
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+\pgfkeys{
+ /@tkzmarkarc/.cd,
+ pos/.store in = \tkz@mkarcpos,
+ color/.store in = \tkz@mkcolor,
+ mark/.store in = \tkz@markarcseg,
+ size/.store in = \tkz@mkarcsize,
+ color = teal!20,
+ size = 4pt,
+ pos = .5,
+ mark = none,
+ /@tkzmarkarc/.search also={/tikz},
+}
+\def\tkzMarkArc{\pgfutil@ifnextchar[{\tkz@MarkArc}{\tkz@MarkArc[]}}
+\def\tkz@MarkArc[#1](#2,#3,#4){%
+\begingroup
+ \pgfqkeys{/@tkzmarkarc}{#1} \def\tkz@mymarkarc{\pgfsetplotmarksize{\tkz@mkarcsize}\pgfuseplotmark{\tkz@markarcseg}}
+\tkz@@CalcLength(#2,#3){tkz@radius}
+\tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@FirstAngle}
+\tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@SecondAngle}
+\tkzNormalizeAngle(\tkz@FirstAngle,\tkz@SecondAngle)
+ \pgfmathsubtract{\tkz@FirstAngle}{\tkz@delta}
+ \edef\tkz@FirstAngle{\pgfmathresult}%
+ \pgfmathadd{\tkz@SecondAngle}{\tkz@delta}
+ \edef\tkz@SecondAngle{\pgfmathresult}
+\begin{scope}[decoration={markings,mark=at position \tkz@mkarcpos with {\tkz@mymarkarc}}]
+\path[shift = {(#2)},\tkz@mkcolor,/@tkzmarkarc/.cd,#1,postaction={decorate}]%
+(\tkz@FirstAngle:\tkz@radius pt) arc (\tkz@FirstAngle:\tkz@SecondAngle:\tkz@radius pt);
+\end{scope}
+\endgroup
+}
+
+\def\tkzLabelArc{\pgfutil@ifnextchar[{\tkz@LabelArc}{\tkz@LabelArc[]}}
+\def\tkz@LabelArc[#1](#2,#3,#4)#5{%
+\begingroup
+\pgfqkeys{/@tkzmarkarc}{#1}
+\tkz@@CalcLength(#2,#3){tkz@radius}
+\tkz@@CalcLength(#2,#3){tkz@radius}
+\tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@FirstAngle}
+\tkzFindSlopeAngle(#2,#4)\tkzGetAngle{tkz@SecondAngle}
+\pgfmathsubtract{\tkz@FirstAngle}{\tkz@delta}
+\edef\tkz@FirstAngle{\pgfmathresult}%
+\pgfmathadd{\tkz@SecondAngle}{\tkz@delta}
+\edef\tkz@SecondAngle{\pgfmathresult}
+\begin{scope}[decoration={markings,mark=at position \tkz@mkarcpos with \node{#5};}]
+ \path[shift = {(#2)},/@tkzmarkarc/.cd,#1,postaction={decorate}]%
+ (\tkz@FirstAngle:\tkz@radius pt) arc (\tkz@FirstAngle:\tkz@SecondAngle:\tkz@radius pt); \end{scope}
+\endgroup
+}
+\makeatother
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
index 50d553453f..c88219c490 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-draw-circles.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-draw-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzSetUpCircle
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
index aeb9341da2..dab6568e0a 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-compass.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-compass.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Author Alain Matthes
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-ellipses.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-ellipses.tex
index cdce79b692..0707a99e1f 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-ellipses.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-ellipses.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-draw-ellipses.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-draw-ellipses.tex}
\makeatletter
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
index 8859ca18e9..3b7fe5a547 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-draw-lines.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-draw-lines.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
@@ -51,13 +51,10 @@
% Drawing a line
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
-% \pgfkeys{/tkzdrawl/.cd,
-% /tkzdrawl/.search also={/tikz}
-% }
+
\def\tkzDrawLine{\pgfutil@ifnextchar[{\tkz@DrawLine}{\tkz@DrawLine[]}}
\def\tkz@DrawLine[#1](#2,#3){%
\begingroup
- % \pgfqkeys{/tkzdrawl}{#1}
\draw[line style,#1] (#2) to (#3);
\endgroup
}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
index 6ba7524f73..18b1c06c4b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-draw-eu-points.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-draw-eu-points.tex}
\makeatletter
%<--------------------------------------------------------------------------->
% tkzSetUpPoint définit la forme d'un point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
index 4dbe368630..09f43b9e62 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-polygons.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-polygons.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Polygon
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
index 8d7b6895ec..cfa6a8e144 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-protractor.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-protractor.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% !!! idea from Y. Combe !!!
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
index b925701206..8131adc32b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-sectors.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-sectors.tex}
\makeatletter
%<----------------------- Sectors ------------------------------–>
\gdef\tkz@nums{0}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
index 12656ca974..0959a1f985 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-show.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-show.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% finding specific points in a triangle
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
index 1d272eca37..51cb39590e 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-lib-eu-marks.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-lib-eu-marks.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Création des symboles
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
index 141355abf9..5453dffef5 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-lib-eu-shape.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-lib-eu-shape.tex}
%<--------------------------------------------------------------------------–>
% Création des symboles
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles-by.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles-by.tex
index 497b02eda4..5c403e4454 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles-by.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles-by.tex
@@ -11,8 +11,8 @@
% The Current Maintainer of this work is Alain Matthes.
\def\fileversion{6.00}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 6.00 tkz-obj-eu-circles.tex}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 6.00 tkz-obj-eu-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzCircle center and one point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles.tex
index 7a4b553e29..b356df9a86 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-circles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-lua-circles.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-lua-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzCircle center and one point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-by.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-by.tex
index 57c03deab3..f25621248e 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-by.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-by.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-lua-points-by.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-lua-points-by.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Transformations Géométriques
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-spc.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-spc.tex
index 36d3eeef02..f56b5a6dc1 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-spc.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-spc.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
+\def\fileversion{5.10c}
\def\filedate{2024/01/23}
-\typeout{2024/01/23 5.06c tkz-obj-lua-points-spc.tex}
+\typeout{2024/01/23 5.10c tkz-obj-lua-points-spc.tex}
\makeatletter
%add ExCenter
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-with.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-with.tex
index 87090a2922..f8e31c9afa 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-with.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points-with.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-lua-points-with.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-lua-points-with.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Vectors
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points.tex
index 1b646b4b8e..24a25502fb 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-eu-lua-points.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-lua-points.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-lua-points.tex}
\makeatletter
%<--------------------------------------------------------------------------->
% init def point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
index ef3f5bc487..408b3d6770 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-axesmin}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-axesmin}
\makeatletter
\def\removedot#1.{#1}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
index 59b5da4c15..6e1f648880 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-circles.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzCircle center and one point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
index cdfadca09b..bba6b717e6 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-circles.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzCircle center and one point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
index 2eca974389..aac48de7d8 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-grids.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-grids.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Setup Grid
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
index fdbb6adeb8..12ce8d8753 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-lines.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-lines.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% les lignes
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
index 23662ff719..73b07df71b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-points-by.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-points-by.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Transformations Géométriques
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
index 868e5d83ee..539ff1ff92 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-points-rnd.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-points-rnd.tex}
%<--------------------------------------------------------------------------–>
\makeatletter
%<-------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex
index 3b228a271e..d1baa02a9c 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-el-points.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-el-points.tex}
\makeatletter
%add ExCenter
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
index 9c83ffbcf4..22eead6497 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-points-with.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-points-with.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Vectors
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
index b2bb4a4dda..bf03469a50 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-points.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-points.tex}
\makeatletter
%<--------------------------------------------------------------------------->
% init def point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
index b6c85efce8..609414132d 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-polygons.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-polygons.tex}
% bug in regular polygon side 2020/03/09
\makeatletter
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
index 794a7a2576..17069c39e3 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-triangles.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-triangles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Triangle Equilateral
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg b/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
index a63d72561a..422a86050a 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
@@ -16,9 +16,9 @@
% and save the file in a directory part of your TEXINPUTS environment
% variable.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-euclide.cfg}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-euclide.cfg}
%<------ colors ---------------------------------------–>
\def\tkz@backgroundcolor{white}
\def\tkz@textcolor{black}
@@ -134,6 +134,24 @@ arc style/.style={%
\def\tkz@mk@size{3pt}
\def\tkz@mk@fill{\tkz@otherlinecolor}
%<--------------------------------------------------------------------------–>
+%<------------------------- mark angle -----------------------------------–>
+\def\tkz@euc@mkcolor{\tkz@otherlinecolor}
+\def\tkz@euc@mkarctype{l}
+\def\tkz@euc@mksize{4pt}
+\def\tkz@euc@mkarcsize{1}
+\def\tkz@euc@markang{none}
+\def\tkz@euc@mkstyle{solid}
+\def\tkz@euc@mkpos{.5}
+\tikzset{%
+mark style/.style = {%
+ arc = \tkz@euc@mkarctype,
+ color = \tkz@euc@mkcolor,
+ size = \tkz@euc@mkarcsize,
+ style = \tkz@euc@mkstyle,
+ mark = \tkz@euc@markang,
+ pos = \tkz@euc@mkpos}
+}
+%<--------------------------------------------------------------------------–>
%<------------------------------ styles ---------------------------------–>
\def\tkzSetUpStyle[#1]#2{\tikzset{#2/.style={#1}}}% add 2024
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty b/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
index 21ecad81ea..b88599a7a1 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
@@ -10,14 +10,17 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
%-------------------------------------------------------------------------------
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-euclide.sty}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-euclide.sty}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{tkz-euclide}[ 2024/02/04 5.06c for pure Euclidean Geometry ]
+\ProvidesPackage{tkz-euclide}[ 2024/04/19 5.10c for pure Euclidean Geometry ]
\newif\if@tkzlua
\@tkzluafalse
\DeclareOption{lua}{\@tkzluatrue}
+\newif\if@tkzmini
+\@tkzminifalse
+\DeclareOption{mini}{\@tkzminitrue}
\ProcessOptions\relax
\@ifpackageloaded{tkz-base}{
@@ -162,7 +165,39 @@
\if@tkzlua
\RequirePackage{luacode}
\fi
-
+\if@tkzmini
+\@tkzluatrue
+\RequirePackage{luacode}
+\@ifpackageloaded{tkz-base}{}{%
+% from base
+\input{tkz-tools-eu-base.tex}
+\input{tkz-tools-eu-utilities.tex}
+\input{tkz-tools-eu-BB.tex}
+\input{tkz-obj-eu-grids.tex}
+\input{tkz-lib-eu-marks.tex}
+\input{tkz-tools-eu-text.tex}
+\input{tkz-lib-eu-shape.tex}
+\input{tkz-obj-eu-axesmin.tex}
+\input{tkz-tools-eu-colors.tex}
+\input{tkz-obj-eu-points.tex}
+\input{tkz-draw-eu-points.tex}
+}
+% next from euclide
+\input{tkz-obj-eu-lua-points-by.tex}
+\input{tkz-tools-eu-lua-math.tex}
+\input{tkz-tools-eu-lua-angles.tex}
+% drawings
+\input{tkz-draw-eu-lines.tex}
+\input{tkz-draw-eu-circles.tex}
+\input{tkz-draw-eu-ellipses.tex}
+\input{tkz-draw-eu-polygons.tex}
+\input{tkz-draw-eu-arcs.tex}
+\input{tkz-draw-eu-angles.tex}
+\input{tkz-draw-eu-sectors.tex}
+\input{tkz-draw-eu-compass.tex}
+\input{tkz-draw-eu-show.tex}
+\input{tkz-draw-eu-protractor.tex}
+\else
\@ifpackageloaded{tkz-base}{}{%
% from base
\input{tkz-tools-eu-base.tex}
@@ -211,9 +246,11 @@
\input{tkz-draw-eu-circles.tex}
\input{tkz-draw-eu-ellipses.tex}
\input{tkz-draw-eu-polygons.tex}
+\input{tkz-draw-eu-arcs.tex}
\input{tkz-draw-eu-angles.tex}
\input{tkz-draw-eu-sectors.tex}
\input{tkz-draw-eu-compass.tex}
\input{tkz-draw-eu-show.tex}
\input{tkz-draw-eu-protractor.tex}
+\fi
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-angles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-angles.tex
index 8005ed1933..6f54bb5ca3 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-angles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-angles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-lua-angles.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-lua-angles.tex}
\makeatletter
\def\tkzmathrotatepointaround#1#2#3{%
\pgf@process{%
@@ -75,8 +75,20 @@ token.set_macro("tkz@SecondAngle", angleB)
%<--------------------------------------------------------------------------–>
\def\tkzFindSlopeAngle(#1,#2){%
\begingroup
- \tkzmathanglebetweenpoints{#1}{#2}
- \global\let\tkzAngleResult\pgfmathresult
+\pgfextractx{\pgf@x}{\pgfpointanchor{#1}{center}}%
+\pgfextracty{\pgf@y}{\pgfpointanchor{#1}{center}}%
+\edef\tkzax{\strip@pt\pgf@x}%
+\edef\tkzay{\strip@pt\pgf@y}%
+\pgfextractx{\pgf@x}{\pgfpointanchor{#2}{center}}%
+\pgfextracty{\pgf@y}{\pgfpointanchor{#2}{center}}%
+\edef\tkzbx{\strip@pt\pgf@x}%
+\edef\tkzby{\strip@pt\pgf@y}%
+ % \tkzmathanglebetweenpoints{#1}{#2}
+ % \global\let\tkzAngleResult\pgfmathresult
+\directlua{ local an = math.angle(\tkzax,\tkzay,\tkzbx,\tkzby)
+ token.set_macro("tkzAngleResult", an )
+ }
+ \global\let\tkzAngleResult\tkzAngleResult
\endgroup
}
%<--------------------------------------------------------------------------–>
@@ -98,5 +110,6 @@ token.set_macro("tkz@SecondAngle", angleB)
\def\tkzGetAngle#1{%
\global\expandafter\edef\csname #1\endcsname{\tkzAngleResult}
}
+
\makeatother
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-base.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-base.tex
index 0e68171946..7af53a74b0 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-base.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-base.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-lua-base.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-lua-base.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
\global\let\tkz@tmp@xa\tkz@init@xmin% modif 2016
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-intersections.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-intersections.tex
index 0e700492dc..97f4563f9b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-intersections.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-intersections.tex
@@ -13,9 +13,9 @@
% The Current Maintainer of this work is Alain Matthes.
% utf8 encoding
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-lua-intersections.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-lua-intersections.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% intersection de deux lignes
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-math.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-math.tex
index 18ee85bf6e..7066ee9481 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-math.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-eu-lua-math.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-lua-math.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-lua-math.tex}
\makeatletter
%<-------------------------------------------------------------------------->
%<-------------------------------------------------------------------------->
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
index edefa3295e..883715320e 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-obj-eu-BB.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-obj-eu-BB.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
\def\tkzShowBB{\pgfutil@ifnextchar[{\tkz@ShowBB}{\tkz@ShowBB[]}}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
index 7fd0f81bd5..b47a54f5b8 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-angles.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-angles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
@@ -70,5 +70,10 @@
\def\tkzGetAngle#1{%
\global\expandafter\edef\csname #1\endcsname{\tkzAngleResult}
}
+\def\tkzDet(#1,#2,#3){%
+\tkzFindSlopeAngle(#2,#1)\tkzGetAngle{tkz@FirstAngle}
+\tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@SecondAngle}
+\tkzNormalizeAngle(\tkz@FirstAngle,\tkz@SecondAngle)
+}
\makeatother
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
index 28776e3fd4..fd77dc1f4b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-base.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-base.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
\global\let\tkz@tmp@xa\tkz@init@xmin% modif 2016
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
index 87a897bfcb..d3f0e0c951 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-colors}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-colors}
\makeatletter
%<------ Initialisation of the colors with tkzSetUpColors ----------------->
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
index 4122099f44..489af8baf7 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
@@ -13,9 +13,9 @@
% The Current Maintainer of this work is Alain Matthes.
% utf8 encoding
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-intersections.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-intersections.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% intersection de deux lignes
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
index 73ea0a041a..35821c3282 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-math.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-math.tex}
\makeatletter
%<-------------------------------------------------------------------------->
% \tkzpointnormalised#
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
index ed90c18514..4955910f97 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-utilities.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-utilities.tex}
\makeatletter
%<------------- % chargement des modules ---------------------------------->
\def\tkz@obj@all{angles,arcs,compass,defcircles,deflines,defpoints,defpointsby,defpointsrnd,defpointswith,polygons,protractor,sectors,show,triangles}%
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
index 53b81f7d09..47880e5b45 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-text.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-text.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzText
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
index 7b41fad768..2b7cf5254b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.06c}
-\def\filedate{2024/02/04}
-\typeout{2024/02/04 5.06c tkz-tools-eu-utilities.tex}
+\def\fileversion{5.10c}
+\def\filedate{2024/04/19}
+\typeout{2024/04/19 5.10c tkz-tools-eu-utilities.tex}
\makeatletter
\pgfkeys{/tkzClip/.cd,
space/.store in = {\tkz@CLI@space},
diff --git a/macros/latex/contrib/tuda-ci/README.md b/macros/latex/contrib/tuda-ci/README.md
index f3f8de560e..f7aa6519a1 100644
--- a/macros/latex/contrib/tuda-ci/README.md
+++ b/macros/latex/contrib/tuda-ci/README.md
@@ -2,7 +2,7 @@
Copyright (C) Marei Peischl <marei@peitex.de>, 2018–2024
- tuda-ci v3.37 (2024-04-21)
+ tuda-ci v3.38 (2024-05-07)
***************************************************************************
@@ -358,3 +358,5 @@ leaflets | DEMO-TUDaLeaflet.tex | tudaleaflet.cls
* 3.37 (2024-04-21)
- refactoring the bundle
- small layout adjustments and bugfixes
+ * 3.38 (2024-05-07)
+ - update PhD affidavit
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf
index e59b22b57e..08f3ff90a1 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaAnnouncement.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf
index 0ab6952c8f..90c6f7e9c4 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdf
index dbde310191..9c765b69b3 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaBeamer2023.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf
index 21defaf2a0..4de18237bc 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaExercise.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf
index 25f1ce243c..4c91fe977d 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLeaflet.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf
index ce33e4ba24..d3ff6b21bf 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaLetter.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf
index 1ddf6f90b6..3928a61062 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPhD.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf
index 0986455f21..1f4d8165c2 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPoster.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf
index 02f0788605..089c10109f 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaPub.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf
index 7ed32cae75..b7cb7640ff 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaReport.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf
index fc351f0054..99ec17f31a 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaSciPoster.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf
index 4633b07055..51f92e0df3 100644
--- a/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf
+++ b/macros/latex/contrib/tuda-ci/doc/DEMO-TUDaThesis.pdf
Binary files differ
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex
index 2a2ae6c882..f8f2e3a80e 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaAnnouncement.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaAnnouncement-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaAnnouncement-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex
index f653c25bbb..a11d19f03e 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaBeamer-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaBeamer-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex
index b3bf05ce30..f94c402bfe 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBeamer2023.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaBeamer2023.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaBeamer2023.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib
index b516931fb1..d293b6a339 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaBibliography.bib
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaBibliography.bib' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaBibliography.bib' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex
index f019e9011e..c5aa84e832 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaExercise.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaExercise-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaExercise-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco
index 3046285e53..1d218f7a2d 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaFromaddress.lco
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaFromaddress.lco' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaFromaddress.lco' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex
index 6f0fc6c977..5d0b8aeb96 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLeaflet.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaLeaflet-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaLeaflet-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex
index 6a6ad17e66..bedce9c23f 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaLetter.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaLetter-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaLetter-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex
index a2c4a6c39c..d1742bebfd 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPhD.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaPhD-de.tex' version 3.37 (2024-04-21)
+%% This is file `DEMO-TUDaPhD-de.tex' version 3.38 (2024-05-07)
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex
index 94fcfeae3d..e10f84dd8b 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPoster.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaPoster-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaPoster-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex
index 3c8bb81129..0bf058e1c3 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaPub.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaPub-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaPub-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex
index ee13759914..a3b0e56310 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaReport.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaReport-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaReport-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex
index 7a74831e5d..bd8082039a 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaSciPoster.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaSciPoster-de.tex' version 3.37 (2024-04-21),
+%% This is file `DEMO-TUDaSciPoster-de.tex' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex
index 6d8cdf6110..a646b8fd8a 100644
--- a/macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex
+++ b/macros/latex/contrib/tuda-ci/example/DEMO-TUDaThesis.tex
@@ -1,4 +1,4 @@
-%% This is file `DEMO-TUDaThesis-de.tex' version 3.37 (2024-04-21)
+%% This is file `DEMO-TUDaThesis-de.tex' version 3.38 (2024-05-07)
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty
index 0715afa9d3..67c92a5939 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa.sty
@@ -1,4 +1,4 @@
-%% This is file `beamercolorthemeTUDa.sty' version 3.37 (2024-04-21),
+%% This is file `beamercolorthemeTUDa.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty
index c9b9747fb6..46c7da19c9 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamercolorthemeTUDa2008.sty
@@ -1,4 +1,4 @@
-%% This is file `beamercolorthemeTUDa2008.sty' version 3.37 (2024-04-21)
+%% This is file `beamercolorthemeTUDa2008.sty' version 3.38 (2024-05-07)
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty
index 9b3dd3a619..a245163dc1 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerfontthemeTUDa.sty' version 3.37 (2024-04-21)
+%% This is file `beamerfontthemeTUDa.sty' version 3.38 (2024-05-07)
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty
index 7edc07a3c1..737f759508 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerfontthemeTUDa2008.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerfontthemeTUDa2008.sty' version 3.37 (2024-04-21)
+%% This is file `beamerfontthemeTUDa2008.sty' version 3.38 (2024-05-07)
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty
index 7789e86e6e..6a9072ed6e 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerinnerthemeTUDa.sty' version 3.37 (2024-04-21)
+%% This is file `beamerinnerthemeTUDa.sty' version 3.38 (2024-05-07)
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty
index b8b9d7d4f2..cab08e361c 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2008.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerinnerthemeTUDa2008.sty' version 3.37 (2024-04-21),
+%% This is file `beamerinnerthemeTUDa2008.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty
index ebef3683a6..22d50340c2 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerinnerthemeTUDa2023.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerinnerthemeTUDa2023.sty' version 3.37 (2024-04-21),
+%% This is file `beamerinnerthemeTUDa2023.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty
index 71431e1182..6081832c16 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerouterthemeTUDa.sty' version 3.37 (2024-04-21),
+%% This is file `beamerouterthemeTUDa.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty
index 177a9557d3..70e31eecde 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerouterthemeTUDa2008.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerouterthemeTUDa2008.sty' version 3.37 (2024-04-21),
+%% This is file `beamerouterthemeTUDa2008.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty
index a7ebab5e2b..04fac2c523 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa-mecheng.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerthemeTUDa-mecheng.sty' version 3.37 (2024-04-21),
+%% This is file `beamerthemeTUDa-mecheng.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\ProvidesExplPackage{beamerthemeTUDa-mecheng}{\filedate}{\fileversion}{specific tudabeamer configuration for the department of mechanical engineering}
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty
index 88d58b1fa8..7287a8625e 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerthemeTUDa.sty' version 3.37 (2024-04-21),
+%% This is file `beamerthemeTUDa.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty
index a2c54a4730..684fc16de5 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2008.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerthemeTUDa2008.sty' version 3.37 (2024-04-21),
+%% This is file `beamerthemeTUDa2008.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}[2022/06/01]
\ProvidesPackage{beamerthemeTUDa2008}
[\filedate\space\fileversion\space beamer theme using the Corporate Design of TU Darmstadt Design of 2008]
diff --git a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty
index 417ee0c97c..48e7d697b9 100644
--- a/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty
+++ b/macros/latex/contrib/tuda-ci/tex/beamerthemeTUDa2023.sty
@@ -1,4 +1,4 @@
-%% This is file `beamerthemeTUDa2023.sty' version 3.37 (2024-04-21)
+%% This is file `beamerthemeTUDa2023.sty' version 3.38 (2024-05-07)
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo
index 1ea5a3e716..1978288520 100644
--- a/macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo
+++ b/macros/latex/contrib/tuda-ci/tex/tuda-a0paper.clo
@@ -1,4 +1,4 @@
-%% This is file `tuda-a0paper.clo' version 3.37 (2024-04-21),
+%% This is file `tuda-a0paper.clo' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\ProvidesExplFile{tuda-a0paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a0paper}
\cs_set:Nn \ptxcd_setup_title_sizes: {
\cs_set:Nn \ptxcd_title_fontsize: {{125pt}{165pt}}
diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo
index 5336c146b1..bc63208933 100644
--- a/macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo
+++ b/macros/latex/contrib/tuda-ci/tex/tuda-a1paper.clo
@@ -1,4 +1,4 @@
-%% This is file `tuda-a1paper.clo' version 3.37 (2024-04-21),
+%% This is file `tuda-a1paper.clo' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\ProvidesExplFile{tuda-a1paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a1paper}
\cs_set:Nn \ptxcd_setup_title_sizes: {
\cs_set:Nn \ptxcd_title_fontsize: {{86pt}{120pt}}
diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo
index 120ef18fa4..cda6b6762b 100644
--- a/macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo
+++ b/macros/latex/contrib/tuda-ci/tex/tuda-a2paper.clo
@@ -1,4 +1,4 @@
-%% This is file `tuda-a2paper.clo' version 3.37 (2024-04-21),
+%% This is file `tuda-a2paper.clo' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\ProvidesExplFile{tuda-a2paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a0paper}
\cs_set:Nn \ptxcd_setup_title_sizes: {
\cs_set:Nn \ptxcd_title_fontsize: {{65pt}{82pt}}
diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo
index 9525af7b5f..3633a54584 100644
--- a/macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo
+++ b/macros/latex/contrib/tuda-ci/tex/tuda-a3paper.clo
@@ -1,4 +1,4 @@
-%% This is file `tuda-a3paper.clo' version 3.37 (2024-04-21),
+%% This is file `tuda-a3paper.clo' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\ProvidesExplFile{tuda-a3paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a3paper}
\cs_set:Nn \ptxcd_setup_title_sizes: {
\cs_set:Nn \ptxcd_title_fontsize: {{47pt}{61pt}}
diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo
index 66c909d52f..3618253919 100644
--- a/macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo
+++ b/macros/latex/contrib/tuda-ci/tex/tuda-a4paper.clo
@@ -1,4 +1,4 @@
-%% This is file `tuda-a4paper.clo' version 3.37 (2024-04-21),
+%% This is file `tuda-a4paper.clo' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\ProvidesExplFile{tuda-a4paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a4paper}
\cs_set:Nn \ptxcd_setup_title_sizes: {
\cs_set:Nn \ptxcd_title_fontsize: {{36pt}{47pt}}
diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo b/macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo
index 0587a4ca11..fda679c183 100644
--- a/macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo
+++ b/macros/latex/contrib/tuda-ci/tex/tuda-a5paper.clo
@@ -1,4 +1,4 @@
-%% This is file `tuda-a5paper.clo' version 3.37 (2024-04-21),
+%% This is file `tuda-a5paper.clo' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\ProvidesExplFile{tuda-a5paper.clo}{\filedate}{\fileversion}{tuda-ci~size~adjustments~for~a5paper}
\cs_set:Nn \ptxcd_setup_title_sizes: {
\cs_set:Nn \ptxcd_title_fontsize: {{22pt}{28pt}}
diff --git a/macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty b/macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty
index 42f186ce35..04e7c5712d 100644
--- a/macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty
+++ b/macros/latex/contrib/tuda-ci/tex/tuda-pgfplots.sty
@@ -1,4 +1,4 @@
-%% This is file `tuda-pgfplots.sty' version 3.37 (2024-04-21),
+%% This is file `tuda-pgfplots.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
% Special thanks to: Sebastian Schöps Institut Theorie Elektromagnetischer Felder (TEMF), TU Darmstadt
% The original version of this file has been inspired by the colorscheme in the Metropolis beamer theme by Matthias Vogelgesang https://github.com/matze/mtheme
\ProvidesPackage{tuda-pgfplots}[\filedate\space\fileversion\space tuda-ci pgfplots color schemes]
diff --git a/macros/latex/contrib/tuda-ci/tex/tudabeamer.cls b/macros/latex/contrib/tuda-ci/tex/tudabeamer.cls
index d4d5bddd29..fdf0d8e02f 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudabeamer.cls
+++ b/macros/latex/contrib/tuda-ci/tex/tudabeamer.cls
@@ -1,4 +1,4 @@
-%% This is file `tudabeamer.cls' version 3.37 (2024-04-21),
+%% This is file `tudabeamer.cls' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{tudabeamer}
[\filedate\space\fileversion\space]
diff --git a/macros/latex/contrib/tuda-ci/tex/tudacolors.def b/macros/latex/contrib/tuda-ci/tex/tudacolors.def
index 4311888a04..6a8afea418 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudacolors.def
+++ b/macros/latex/contrib/tuda-ci/tex/tudacolors.def
@@ -1,4 +1,4 @@
-%% This is file `tudacolors.def' version 3.37 (2024-04-21),
+%% This is file `tudacolors.def' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\ProvidesFile{tudacolors.def}
[\filedate\space\fileversion\space Color definitions for tuda-ci]
diff --git a/macros/latex/contrib/tuda-ci/tex/tudacolors.sty b/macros/latex/contrib/tuda-ci/tex/tudacolors.sty
index 3f93095409..137697f261 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudacolors.sty
+++ b/macros/latex/contrib/tuda-ci/tex/tudacolors.sty
@@ -1,4 +1,4 @@
-%% This is file `tudacolors.sty' version 3.37 (2024-04-21),
+%% This is file `tudacolors.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{tudacolors}{\filedate}{\fileversion}{Color definition for TU Darmstadt's tuda-ci bundle}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudaexercise.cls b/macros/latex/contrib/tuda-ci/tex/tudaexercise.cls
index 4e2a0a435d..07afd270c2 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudaexercise.cls
+++ b/macros/latex/contrib/tuda-ci/tex/tudaexercise.cls
@@ -1,4 +1,4 @@
-%% This is file `tudaexercise.cls' version 3.37 (2024-04-21),
+%% This is file `tudaexercise.cls' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplClass{tudaexercise}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudafonts.sty b/macros/latex/contrib/tuda-ci/tex/tudafonts.sty
index 9eb9e3e4b2..6a7873942a 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudafonts.sty
+++ b/macros/latex/contrib/tuda-ci/tex/tudafonts.sty
@@ -1,4 +1,4 @@
-%% This is file `tudafonts.sty' version 3.37 (2024-04-21),
+%% This is file `tudafonts.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{tudafonts}
[\filedate\space\fileversion\space
diff --git a/macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls b/macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls
index b4336cfef9..de3430b507 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls
+++ b/macros/latex/contrib/tuda-ci/tex/tudaleaflet.cls
@@ -1,4 +1,4 @@
-%% This is file `tudaleaflet.cls' version 3.37 (2024-04-21),
+%% This is file `tudaleaflet.cls' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{tudaleaflet}{\filedate}{\fileversion}{Leaflets using the Corporate Design of TU Darmstadt}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudaletter.cls b/macros/latex/contrib/tuda-ci/tex/tudaletter.cls
index e035975c05..15baed6069 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudaletter.cls
+++ b/macros/latex/contrib/tuda-ci/tex/tudaletter.cls
@@ -1,4 +1,4 @@
-%% This is file `tudaletter.cls' version 3.37 (2024-04-21),
+%% This is file `tudaletter.cls' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplClass{tudaletter}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo b/macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo
index a9175b8038..54348ee206 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo
+++ b/macros/latex/contrib/tuda-ci/tex/tudalettersize10pt.clo
@@ -1,4 +1,4 @@
-%% This is file `tudalettersize10pt.clo' version 3.37 (2024-04-21),
+%% This is file `tudalettersize10pt.clo' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg b/macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg
index aacecd020e..83f385b172 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg
+++ b/macros/latex/contrib/tuda-ci/tex/tudamecheng.cfg
@@ -1,4 +1,4 @@
-%% This is file `tudamecheng.cfg' version 3.37 (2024-04-21),
+%% This is file `tudamecheng.cfg' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\RequirePackage{expl3}
\ProvidesExplFile{tudamecheng.cfg}
{\filedate}{\fileversion}{Special Features the department of mechanical engineering of Darmstadt's Corporate Design (tuda-ci)}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudaposter.cls b/macros/latex/contrib/tuda-ci/tex/tudaposter.cls
index aa4fc6fd9d..99b2d2d07d 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudaposter.cls
+++ b/macros/latex/contrib/tuda-ci/tex/tudaposter.cls
@@ -1,4 +1,4 @@
-%% This is file `tudaposter.cls' version 3.37 (2024-04-21),
+%% This is file `tudaposter.cls' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{tudaposter}{\filedate}{\fileversion}{Poster Layouts for the Corporate Design of TU Darmstadt}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudapub.cls b/macros/latex/contrib/tuda-ci/tex/tudapub.cls
index 3b4a762673..a863197f83 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudapub.cls
+++ b/macros/latex/contrib/tuda-ci/tex/tudapub.cls
@@ -1,4 +1,4 @@
-%% This is file `tudapub.cls' version 3.37 (2024-04-21),
+%% This is file `tudapub.cls' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplClass{tudapub}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudarules.sty b/macros/latex/contrib/tuda-ci/tex/tudarules.sty
index fcf7e9f6ac..76dae0e2e7 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudarules.sty
+++ b/macros/latex/contrib/tuda-ci/tex/tudarules.sty
@@ -1,4 +1,4 @@
-%% This is file `tudarules.sty' version 3.37 (2024-04-21),
+%% This is file `tudarules.sty' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{tudarules}{\filedate}{\fileversion}{Creation of colored bars for tuda-ci bundle}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudasciposter.cls b/macros/latex/contrib/tuda-ci/tex/tudasciposter.cls
index 856d0dab2d..e3bda42e20 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudasciposter.cls
+++ b/macros/latex/contrib/tuda-ci/tex/tudasciposter.cls
@@ -1,4 +1,4 @@
-%% This is file `tudasciposter.cls' version 3.37 (2024-04-21),
+%% This is file `tudasciposter.cls' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{tudasciposter}{\filedate}{\fileversion}{Scientific Poster Layout for TU Darmstadt}
diff --git a/macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo b/macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo
index e92dc5ece8..8537d16f7c 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo
+++ b/macros/latex/contrib/tuda-ci/tex/tudasize9pt.clo
@@ -1,4 +1,4 @@
-%% This is file `tudasize9pt.clo' version 3.37 (2024-04-21),
+%% This is file `tudasize9pt.clo' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
diff --git a/macros/latex/contrib/tuda-ci/tex/tudathesis.cfg b/macros/latex/contrib/tuda-ci/tex/tudathesis.cfg
index ffd6ea3ac4..e25ded1a68 100644
--- a/macros/latex/contrib/tuda-ci/tex/tudathesis.cfg
+++ b/macros/latex/contrib/tuda-ci/tex/tudathesis.cfg
@@ -1,4 +1,4 @@
-%% This is file `tudathesis.cfg' version 3.37 (2024-04-21),
+%% This is file `tudathesis.cfg' version 3.38 (2024-05-07),
%% it is part of
%% TUDa-CI -- Corporate Design for TU Darmstadt
%% ----------------------------------------------------------------------------
@@ -25,8 +25,8 @@
%%
%% ============================================================================
%%
-\def\fileversion{3.37}
-\def\filedate{2024-04-21}
+\def\fileversion{3.38}
+\def\filedate{2024-05-07}
\RequirePackage{expl3}
\ProvidesExplFile{tudathesis.cfg}
{\filedate}{\fileversion}{Special Features for publication type 'thesis' using TU Darmstadt's Corporate Design (tuda-ci)}
@@ -667,7 +667,7 @@
Ich versichere hiermit, dass zu einem vorherigen Zeitpunkt noch keine Promotion versucht wurde. In diesem Fall sind nähere Angaben über Zeitpunkt, Hochschule, Dissertationsthema und Ergebnis dieses Versuchs mitzuteilen.
\subsection*{\S\,9 Abs. 1 PromO}
- Ich versichere hiermit, dass die vorliegende Dissertation selbstständig und nur unter Verwendung der angegebenen Quellen verfasst wurde.
+ Ich versichere hiermit, dass die vorliegende Dissertation – abgesehen von den in ihr ausdrücklich genannten Hilfen – selbstständig verfasst wurde und dass die „Grundsätze zur Sicherung guter wissenschaftlicher Praxis an der Technischen Universität Darmstadt“ und die „Leitlinien zum Umgang mit digitalen Forschungsdaten an der TU Darmstadt“ in den jeweils aktuellen Versionen bei der Verfassung der Dissertation beachtet wurden.
\subsection*{\S\,9 Abs. 2 PromO}
Die Arbeit hat bisher noch nicht zu Prüfungszwecken gedient.
diff --git a/macros/latex/contrib/typog/Makefile b/macros/latex/contrib/typog/Makefile
new file mode 100644
index 0000000000..bb3c83ab24
--- /dev/null
+++ b/macros/latex/contrib/typog/Makefile
@@ -0,0 +1,302 @@
+### name: Makefile
+### synopsis: Build `typog' style file, tools, and documentation
+### author: Dr. Christoph L. Spiel
+### GNU make version: 4.3
+
+
+SHELL := /bin/sh
+
+
+LATEX := /usr/bin/env max_print_line=2147483647 pdflatex
+LATEX_FLAGS := -file-line-error -halt-on-error -interaction=nonstopmode
+LATEX_RERUN_TRIGGER := '^Package rerunfilecheck Warning: File [^ ]* has changed'
+LATEX_WARNING := '^LaTeX (|[A-Za-z0-9_]* )Warning:'
+
+MAKEINDEX := makeindex
+MAKEINDEX_FLAGS := -q
+
+
+METAPOST := mpost
+METAPOST_FLAGS := -file-line-error -interaction=nonstopmode -tex=latex
+
+
+PODCHECKER := podchecker
+PODCHECKER_FLAGS := -warnings
+
+
+POD2MAN := pod2man
+POD2MAN_FLAGS := $$(sed -ne 's,\\ProvidesPackage{typog}\[\([0-9][0-9]*/[0-9][0-9]*/[0-9][0-9]*\) *v\([^ ]*\) .*$$,--date=\1 --release=\2,p' < typog.sty)
+
+
+POD2TEXI := pod2texi
+POD2TEXI_FLAGS :=
+
+
+GROFF := groff
+## Codes of serif fonts that work for PDF output
+## BM: URW Bookman L
+## N: URW Century Schoolbook L
+## P: URW Palladio L
+## T: URW Nimbus Roman No9 L
+GROFF_FLAGS := -Tpdf -dpaper=a4 -fP -man -wall
+
+
+SPELLCHECK := aspell
+SPELLCHECK_FLAGS := \
+ --add-tex-command='citenum p' --add-tex-command='code p' \
+ --add-tex-command='Cref p' --add-tex-command='cref p' \
+ --add-tex-command='cs p' \
+ --add-tex-command='DescribeEnv p' --add-tex-command='DescribeMacro p' \
+ --add-tex-command='marg p' --add-tex-command='meta p' \
+ --add-tex-command='oarg p' \
+ --lang=en_US --mode=tex
+
+
+SOURCE_FILES := LICENSE Makefile typog.dtx typog.ins
+
+
+
+.PHONY: all
+all: sty pdf man
+
+
+.PHONY: sty
+sty: typog.sty
+
+
+.PHONY: pdf
+pdf: doc ex nomt
+
+
+.PHONY: doc
+doc: typog.pdf
+
+
+.PHONY: ex
+ex: typog-example.pdf
+
+
+.PHONY: nomt
+nomt: typog-nomt.pdf
+
+
+.PHONY: man
+man: typog-grep.1
+
+
+.PHONY: cpio
+cpio:
+ cd ..; \
+ echo $(addprefix typog/,$(SOURCE_FILES)) | \
+ cpio -o | \
+ gzip > "typog-$$(date +%Y-%m-%d).cpio.gz"
+
+
+.PHONY: tar
+tar:
+ cd ..; \
+ tar czf "typog-$$(date +%Y-%m-%d).tar.gz" $(addprefix typog/,$(SOURCE_FILES))
+
+
+.PHONY: clean
+clean:
+ $(RM) ./*.1 ./*.aux ./*.brf ./*.glg ./*.glo ./*.gls
+ $(RM) ./*.hd ./*.idx ./*.ilg ./*.ind ./*.loe ./*.lof ./*.log ./*.lot
+ $(RM) ./*.mps ./*.mpx ./*.out ./*.pdf ./*.toc
+ $(RM) mptextmp.* mpxerr.tex
+ $(RM) README README.html RELEASE-HOWTO RELEASE-HOWTO.html
+
+
+.PHONY: mostlyclean
+mostlyclean: clean
+
+
+.PHONY: maintainer-clean
+maintainer-clean: mostlyclean
+ $(RM) ./*.ist ./*.mp ./*.pl ./*.pod ./*.sed ./*.sty ./*.tex
+
+
+.PHONY: tool-check
+tool-check:
+ @printf '*** LATEX = "%s"\n' '$(LATEX)'
+ $(LATEX) --version
+ @printf '\n\n*** MAKEINDEX = "%s"\n' '$(MAKEINDEX)'
+ $(MAKEINDEX) < /dev/null
+ @printf '\n\n*** METAPOST = "%s"\n' '$(METAPOST)'
+ $(METAPOST) --version
+ @printf '\n*** POD2MAN = "%s"\n' '$(POD2MAN)'
+ $(POD2MAN) --help > /dev/null
+ @printf '\n\n*** POD2TEXI = "%s"\n' '$(POD2TEXI)'
+ $(POD2TEXI) --version
+ @printf '\n\nTool check passed.\n'
+
+
+.PHONY: spell-check
+spell-check:
+ @sed -e '\#<DISABLE-SPELL-CHECK/>#d' \
+ -e '\#<DISABLE-SPELL-CHECK>#,\#</DISABLE-SPELL-CHECK>#d' < typog.dtx | \
+ sed -e 's/^ *%%*//' | \
+ sed -e 's/\\-//g' -e 's/|[^|]*|/ /g' | \
+ $(SPELLCHECK) $(SPELLCHECK_FLAGS) list | \
+ sort | uniq | fmt | sed -e 's/ / /g'
+
+
+.PHONY: update-docs
+update-docs: doc ex typog-grep.1.pdf
+ cp -f typog.pdf typog-example.pdf typog-grep.1 typog-grep.1.pdf docs
+
+
+define HELP_SCREEN
+Selected Phony Targets
+----------------------
+all: Make everything there is to make. This is the .DEFAULT_GOAL.
+
+clean: Remove some products.
+
+cpio: In the parent directory create a cpio(1) archive of the
+ project source files whose name is time-stamped.
+
+doc: Build "typog.pdf" the Typog documentation.
+
+ex: Build "typog-example.pdf" an example and test file for Typog.
+
+maintainer-clean: Remove every product file that can be rebuilt even
+ if uncommon tools are necessary.
+
+mostlyclean: Remove some more products than clean:.
+
+pdf: Build doc: and gauge:.
+
+sty: Only extract "typog.sty" from "typog.dtx". This
+ operation requires LaTeX (-> $(LATEX)) and nothing else.
+
+tar: In the parent directory create a tar(1) file of the project
+ source files whose name is time-stamped.
+
+tool-check: Check whether some of the required tools to build the
+ project are available.
+
+
+Selected Implicit Rules
+-----------------------
+%.pdf: %.dtx
+ Run LaTeX or pdfLaTeX (-> $(LATEX)) on dtx source until a
+ fix-point is reached.
+
+%.pdf: %.tex
+ Run LaTeX or pdfLaTeX (-> $(LATEX)) on tex file until a
+ fix-point is reached.
+
+%.1: %.pod
+ Create a manual page from plain old documentation format.
+ Requires podchecker (-> $(PODCHECKER)) and pod2man
+ (-> $(POD2MAN)).
+
+%.1.pdf: %.1
+ Convert a manual page into a pdf file. Requires groff
+ (-> $(GROFF)).
+
+
+Some Explicit Rules
+-------------------
+README.html:
+ Convert "README.md" to html. Requires markdown(1).
+
+README: Convert "README.html" to plain text. Requires w3m(1).
+
+endef
+
+.PHONY: help
+help:
+ $(info $(HELP_SCREEN))
+
+
+
+.PRECIOUS: %.mps
+
+
+
+define MAKE_INDEX_AND_GLOSSARY
+sed -e '/@/d' -e 's/{\\ttfamily /{\\ttfamily\\hskip0pt\\relax /' < $*.idx > ,$*.idx; \
+mv ,$*.idx $*.idx; \
+$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s typog.ist -t $*.ilg -o $*.ind $*.idx; \
+$(MAKEINDEX) $(MAKEINDEX_FLAGS) -s gglo.ist -t $*.glg -o $*.gls $*.glo
+endef
+
+define GREP_LATEX_WARNINGS
+test -e $*.log && grep -E $(LATEX_WARNING) $*.log | uniq
+endef
+
+%.pdf: %.dtx
+ $(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.gls ./$*.glo ./$*.lot ./$*.toc
+ $(LATEX) $(LATEX_FLAGS) -draftmode $<
+ $(MAKE_INDEX_AND_GLOSSARY)
+ $(LATEX) $(LATEX_FLAGS) $<
+ $(MAKE_INDEX_AND_GLOSSARY)
+ while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \
+ do \
+ $(LATEX) $(LATEX_FLAGS) $<; \
+ $(MAKE_INDEX_AND_GLOSSARY); \
+ done
+ $(GREP_LATEX_WARNINGS)
+
+
+%.pdf: %.tex
+ $(RM) ./$*.aux ./$*.ind ./$*.idx ./$*.lot ./$*.toc
+ $(LATEX) $(LATEX_FLAGS) -draftmode $<
+ $(LATEX) $(LATEX_FLAGS) $<
+ while test -e $*.log && grep -q $(LATEX_RERUN_TRIGGER) $*.log; \
+ do \
+ $(LATEX) $(LATEX_FLAGS) $<; \
+ done
+ $(GREP_LATEX_WARNINGS)
+
+
+%-1.mps %-2.mps %-3.mps %-4.mps: %.mp
+ $(METAPOST) -s 'outputtemplate="%j-%c.mps"' $(METAPOST_FLAGS) $<
+
+
+%.1: %.pod
+ $(PODCHECKER) $(PODCHECKER_FLAGS) $<
+ $(POD2MAN) $(POD2MAN_FLAGS) $< $@
+
+%.1.pdf: %.1
+ $(GROFF) $(GROFF_FLAGS) ./$< > $@
+
+%.tex: %.pod | teximan2latex.sed
+ $(POD2TEXI) $(POD2TEXI_FLAGS) ./$< | sed -f teximan2latex.sed > $@
+
+
+%.html: %.md
+ markdown $< > $@
+
+%: %.html
+ w3m -cols 79 $< > $@
+
+
+crooked-paragraphs.mp slant-angle.mp smooth-parshapes.mp title.mp \
+teximan2latex.sed \
+typog-grep.pl typog-grep typog-grep.pod \
+typog.sty typog.ist typog-example.tex typog-nomt.tex: \
+ typog.ins typog.dtx
+ $(LATEX) $(LATEX_FLAGS) $<
+ chmod 755 typog-grep.pl
+ ln -sf typog-grep.pl typog-grep
+
+
+crooked-paragraphs-1.mps crooked-paragraphs-2.mps \
+crooked-paragraphs-3.mps crooked-paragraphs-4.mps: crooked-paragraphs.mp
+
+smooth-parshapes-1.mps smooth-parshapes-2.mps smooth-parshapes-3.mps: smooth-parshapes.mp
+
+slant-angle-1.mps: slant-angle.mp
+
+title-1.mps: title.mp
+
+typog.pdf: typog.dtx \
+ crooked-paragraphs-1.mps crooked-paragraphs-2.mps \
+ crooked-paragraphs-3.mps crooked-paragraphs-4.mps \
+ slant-angle-1.mps title-1.mps \
+ smooth-parshapes-1.mps smooth-parshapes-2.mps smooth-parshapes-3.mps \
+ typog-grep.tex \
+ | typog.sty
diff --git a/macros/latex/contrib/typog/README.md b/macros/latex/contrib/typog/README.md
new file mode 100644
index 0000000000..fb55ccb1e1
--- /dev/null
+++ b/macros/latex/contrib/typog/README.md
@@ -0,0 +1,79 @@
+# TypoG &ndash; Typographic Fine-Tuning for LaTeX
+
+LaTeX package `typog` provides macros for (micro-)typographic enhancements;
+it covers a variety of topics:
+
+* Precise hyphenation control
+* Disable/break ligatures
+* Manual italic correction
+* Extra kerning for slash and hyphen
+* Raising selected characters (e.g. hyphen, en-dash, and em-dash)
+* Aligning of the last line of a paragraph
+* Filling of the last line last line of a paragraph
+* Word spacing control
+* [Microtype](https://github.com/schlcht/microtype) front-end
+* Slightly sloppy paragraphs
+* Vertically partially-tied paragraphs
+* Breakable displayed equations
+* Setspace front-end
+* Smooth ragged-right paragraphs
+
+Moreover `typog` provides an environment to flag interesting parts of
+the information deluge typically accumulating in a LaTeX *log*-file
+and an associated tool, **typog-grep**, that selectively retrieves
+these parts.
+
+
+## Installation
+
+The minimally necessary files to install typog are *typog.ins* and *typog.dtx*. Running LaTeX
+on *typog.ins* in particular produces *typog.sty*:
+
+ latex typog.ins
+
+After extraction from *typog.dtx* place *typog.sty* in a directory mentioned in your TEXINPUTS
+paths or copy it into one of the directories for your LaTeX installation's *sty*-files and run
+**mktexlsr** or equivalent.
+
+To build the documentation it is easier to use the GNU *Makefile*:
+
+ make
+
+To construct the manual *typog.pdf* or the usage example *typog-example.pdf* a working
+[MetaPost](https://tug.org/metapost.html) installation and some
+[POD](https://perldoc.perl.org/perlpod) utilities of a [Perl](https://www.perl.org/)
+distribution are required. Cautious users can run
+
+ make tool-check
+
+ahead to verify that the required utilities are installed and working.
+For an overview over the most important *Makefile* targets use
+
+ make help
+
+
+## Usage
+
+Load the package with the usual incantation
+
+ \usepackage{typog}
+
+See Section 2 of the package documentation for available options.
+
+
+## Documentation
+
+The package documentation can be found
+[online](https://cspiel.github.io/typog/).
+
+
+## Credits
+
+Typog is written by Ch. L. Spiel <cspiel@users.sourceforge.org>.
+
+
+## License
+
+Released under the
+[LaTeX Project Public License v1.3c](https://www.latex-project.org/lppl.txt)
+or later.
diff --git a/macros/latex/contrib/typog/RELEASE-HOWTO.md b/macros/latex/contrib/typog/RELEASE-HOWTO.md
new file mode 100644
index 0000000000..13435ef66d
--- /dev/null
+++ b/macros/latex/contrib/typog/RELEASE-HOWTO.md
@@ -0,0 +1,51 @@
+# How to prepare a new release
+
+... and not make too many mistakes.
+
+
+1. Check that the work-area is clean with respect to **git**-tracked
+ files.
+
+ ``` git status ```
+
+1. Update the date stamp of `\ProvidesPackage`.
+
+1. (Temporarily) Zero the `\overfullrule`s of the documentation and
+ the example files.
+
+1. Thoroughly clean the work-area:
+
+ ```make maintainer-clean```
+
+1. Rebuild:
+
+ ```make```
+
+1. Check that all _*.sty_ and _*.pdf_ files are in good shape.
+
+1. Push the documentation files created in the previous step down into
+ the *docs* directory:
+
+ ```make update-docs```
+
+1. Undo the `\overfullrule` change.
+
+1. Commit the changes:
+
+ ```
+ git add .
+ ```
+
+ and finally
+
+ ```
+ git commit
+ ```
+
+1. Tag the commit with the version string of `\ProvidesPackage`:
+
+ ```git tag v1.23```
+
+1. Push the changes to the public repository:
+
+ ```git push origin master --tags```
diff --git a/macros/latex/contrib/typog/docs/index.md b/macros/latex/contrib/typog/docs/index.md
new file mode 100644
index 0000000000..f4dc2e8bd9
--- /dev/null
+++ b/macros/latex/contrib/typog/docs/index.md
@@ -0,0 +1,5 @@
+### Package Documentation
+
+- Comprehensive `typog` documentation: [typog.pdf](https://cspiel.github.io/typog/typog.pdf)
+- `typog` examples and tests: [typog-example.pdf](https://cspiel.github.io/typog/typog-example.pdf)
+- **typog-grep** manual page: [typog-grep.1](https://cspiel.github.io/typog/typog-grep.1) and as PDF: [typog-grep.1.pdf](https://cspiel.github.io/typog/typog-grep.1.pdf)
diff --git a/macros/latex/contrib/typog/docs/typog-example.pdf b/macros/latex/contrib/typog/docs/typog-example.pdf
new file mode 100644
index 0000000000..621ac319d2
--- /dev/null
+++ b/macros/latex/contrib/typog/docs/typog-example.pdf
Binary files differ
diff --git a/macros/latex/contrib/typog/docs/typog-grep.1 b/macros/latex/contrib/typog/docs/typog-grep.1
new file mode 100644
index 0000000000..372c87bc5f
--- /dev/null
+++ b/macros/latex/contrib/typog/docs/typog-grep.1
@@ -0,0 +1,428 @@
+.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "TYPOG-GREP 1"
+.TH TYPOG-GREP 1 "2024-05-07" "perl v5.36.0" "User Contributed Perl Documentation"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.\" Turn off justification.
+.na
+.SH "NAME"
+typog\-grep \- grep for typog\-inspect elements in LaTeX log files
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+.IP "\fBtypog-grep\fR \-a|\-\-all|\-\-any [\fI\s-1OPTION\s0\fR...] \fILOG-FILE\fR..." 4
+.IX Item "typog-grep -a|--all|--any [OPTION...] LOG-FILE..."
+.PD 0
+.IP "\fBtypog-grep\fR [\fI\s-1OPTION\s0\fR...] \fI\s-1REGEXP\s0\fR \fILOG-FILE\fR..." 4
+.IX Item "typog-grep [OPTION...] REGEXP LOG-FILE..."
+.PD
+.PP
+The first form shows all \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR elements in \fILOG-FILE\fR.
+.PP
+The second form shows the contents of \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR elements
+whose \fI\s-1ID\s0\fRs match \fI\s-1REGEXP\s0\fR in \fILOG-FILE\fR.
+.PP
+If no \fILOG-FILE\fR is given read from \fIstdin\fR.
+The filename\ \f(CW\*(C`\-\*(C'\fR is synonymous to \fIstdin\fR.
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+\&\fBtypog-grep\fR is a tailored post-processor for LaTeX log files
+and the \f(CW\*(C`typoginspect\*(C'\fR environment as provided by package\ typog.
+It shares more with the venerable
+\&\fBsgrep\fR <https://www.cs.helsinki.fi/u/jjaakkol/sgrep.html>
+than with \s-1POSIX\s0\ \fBgrep\fR <https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html>.
+.PP
+The LaTeX user brackets her text in
+.PP
+.Vb 3
+\& \ebegin{typoginspect}{ID}
+\& Text and code to investigate
+\& \eend{typoginspect}
+.Ve
+.PP
+where \fI\s-1ID\s0\fR is used to identify one or more bracketed snippets.
+\&\fI\s-1ID\s0\fR does not have to be unique.
+The \fI\s-1REGEXP\s0\fR mechanism makes it easy to select groups of related \fI\s-1ID\s0\fRs
+if they are named accordingly.
+.PP
+In \fILOG-FILE\fR the environment shows up, packed with tracing information, as
+.PP
+.Vb 3
+\& <typog\-inspect id="ID" job="JOB\-NAME" line="LINE\-NUMBER" page="PAGE\-NUMBER">
+\& Trace Data
+\& </typog\-inspect>
+.Ve
+.PP
+where all the capital-letter sequences are meta-variables
+and in particular
+\&\fIJOB-NAME\fR is the expansion of \f(CW\*(C`\ejobname\*(C'\fR,
+\&\fILINE-NUMBER\fR is the LaTeX source file line number
+of the beginning of the \f(CW\*(C`typoginspect\*(C'\fR environment,
+and \fIPAGE-NUMBER\fR is the page where
+the output of \f(CW\*(C`Text\ and\ code\ to\ investigate\*(C'\fR occurs.
+.PP
+\&\fBtypog-grep\fR reveals the contents of \fILOG-FILE\fR
+between \f(CW\*(C`<typog\-inspect id="\f(CIID\f(CW" ...>\*(C'\fR
+and \f(CW\*(C`</typog\-inspect>\*(C'\fR excluding the XML-tags.
+Access the \fIJOB-NAME\fR, \fILINE-NUMBER\fR, and \fIPAGE-NUMBER\fR
+with the commandline options
+\&\fB\-\-job\-name\fR, \fB\-\-line\-number\fR, and \fB\-\-page\-number\fR, respectively.
+Use \fB\-\-id\fR to show the name of the IDs that matched \fI\s-1REGEXP\s0\fR.
+.PP
+\&\f(CW\*(C`typoginspect\*(C'\fR environments can be nested.
+\&\fBtypog-grep\fR respects the nesting,
+i.e., if the \fI\s-1ID\s0\fR of the nested environment does not match \fI\s-1REGEXP\s0\fR
+it will not be included in the program's output.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+The list of options is sorted by the names of the long options.
+.IP "\fB\-a\fR, \fB\-\-all\fR, \fB\-\-any\fR" 4
+.IX Item "-a, --all, --any"
+ID-discovery mode:
+Show all \f(CW\*(C`typog\-inspect\*(C'\fR elements independent of any matching patterns.
+.IP "\fB\-\-color\fR, \fBcolour\fR \fI\s-1WHEN\s0\fR" 4
+.IX Item "--color, colour WHEN"
+Colorize specific log contents for the matching ids.
+The argument\ \fI\s-1WHEN\s0\fR determines when to apply color:
+\&\f(CW\*(C`always\*(C'\fR, \f(CW\*(C`never\*(C'\fR, or\ \f(CW\*(C`auto\*(C'\fR.
+The setting \f(CW\*(C`auto\*(C'\fR checks whether standard output has been redirected.
+This is the default.
+.IP "\fB\-C\fR, \fB\-\-config\fR \fI\s-1KEY\s0\fR=\fI\s-1VALUE\s0\fR[:\fI\s-1KEY\s0\fR=\fI\s-1VALUE\s0\fR[:...]]" 4
+.IX Item "-C, --config KEY=VALUE[:KEY=VALUE[:...]]"
+Set one or more configuration \fI\s-1KEY\s0\fR to \fI\s-1VALUE\s0\fR pairs.
+See Sec.\ \s-1CONFIGURATION\s0 below for a description of all available configuration items.
+Use option \fB\-\-show\-config\fR to display the default configuration.
+.IP "\fB\-\-debug\fR" 4
+.IX Item "--debug"
+Turn on debug output on \fIstderr\fR.
+.IP "\fB\-h\fR, \fB\-\-help\fR" 4
+.IX Item "-h, --help"
+Display brief help then exit.
+.IP "\fB\-i\fR, \fB\-\-[no\-]id\fR" 4
+.IX Item "-i, --[no-]id"
+Print the actual id name that matched \fI\s-1REGEXP\s0\fR.
+Control the appearance of the matching id with configuration item\ \f(CW\*(C`id\-heading\*(C'\fR.
+.IP "\fB\-y\fR, \fB\-\-[no\-]ignore\-case\fR" 4
+.IX Item "-y, --[no-]ignore-case"
+Match ids while ignoring case distinctions in patterns and data.
+.IP "\fB\-j\fR, \fB\-\-[no\-]job\-name\fR" 4
+.IX Item "-j, --[no-]job-name"
+Print the \f(CW\*(C`\ejobname\*(C'\fR that \fBtex\fR associated with the input file.
+.IP "\fB\-n\fR, \fB\-\-[no\-]line\-number\fR" 4
+.IX Item "-n, --[no-]line-number"
+Print the line number where the \f(CW\*(C`typoginspect\*(C'\fR\ environment
+was encountered in the LaTeX source file.
+.IP "\fB\-N\fR, \fB\-\-[no\-]log\-line\-number\fR" 4
+.IX Item "-N, --[no-]log-line-number"
+Print the line number of the \fIlog\fR\-file where the current line was encountered.
+.IP "\fB\-p\fR, \fB\-\-[no\-]page\-number\fR" 4
+.IX Item "-p, --[no-]page-number"
+Print page number where the contents of the \f(CW\*(C`typoginspect\*(C'\fR\ environment
+starts in the typeset document.
+.IP "\fB\-P\fR, \fB\-\-[no\-]pager\fR" 4
+.IX Item "-P, --[no-]pager"
+Redirect output from \fIstdout\fR to the configured pager.
+.IP "\fB\-\-show\-config\fR" 4
+.IX Item "--show-config"
+Show the default configuration and exit.
+.IP "\fB\-V\fR, \fB\-\-version\fR" 4
+.IX Item "-V, --version"
+Show version information and exit.
+.IP "\fB\-w\fR, \fB\-\-[no\-]word\-regexp\fR" 4
+.IX Item "-w, --[no-]word-regexp"
+Match only whole words.
+.SH "CONFIGURATION"
+.IX Header "CONFIGURATION"
+.ie n .IP """id\-format""=\fI\s-1FORMAT\s0\fR" 4
+.el .IP "\f(CWid\-format\fR=\fI\s-1FORMAT\s0\fR" 4
+.IX Item "id-format=FORMAT"
+Control the \fI\s-1FORMAT\s0\fR for printing matching ids in inline-mode,
+where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR.
+Default:\ \f(CW%s:\fR.
+.ie n .IP """id\-heading""=0|1" 4
+.el .IP "\f(CWid\-heading\fR=\f(CW0\fR|\f(CW1\fR" 4
+.IX Item "id-heading=0|1"
+Choose between printing the matching ids with option\ \fB\-\-id\fR:
+Inline\ (\f(CW0\fR) or heading before the matching data (\f(CW1\fR).
+Default:\ \f(CW0\fR.
+.ie n .IP """id\-heading\-format""=\fI\s-1FORMAT\s0\fR" 4
+.el .IP "\f(CWid\-heading\-format\fR=\fI\s-1FORMAT\s0\fR" 4
+.IX Item "id-heading-format=FORMAT"
+Control the \fI\s-1FORMAT\s0\fR for printing matching ids in heading-mode,
+where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR.
+Default:\ \f(CW\*(C`\-\->\ %s\ <\-\-\*(C'\fR.
+.ie n .IP """id\-indent""=\fI\s-1INDENT\s0\fR" 4
+.el .IP "\f(CWid\-indent\fR=\fI\s-1INDENT\s0\fR" 4
+.IX Item "id-indent=INDENT"
+Indentation of nested typog-inspect tags.
+Only used in ``discovery'' mode (first form), i.e., if \fB\-\-all\fR is active.
+Default:\ 8.
+.ie n .IP """id\-max\-length""=\fIMAXIMUM-LENGTH\fR" 4
+.el .IP "\f(CWid\-max\-length\fR=\fIMAXIMUM-LENGTH\fR" 4
+.IX Item "id-max-length=MAXIMUM-LENGTH"
+Set the maximum length of a matching id for printing.
+It a matching id exceeds this length it will be truncated
+and the last three characters (short of \fIMAXIMUM-LENGTH\fR) will be replaced by dots.
+Default:\ 40.
+.ie n .IP """line\-number\-format""=\fI\s-1FORMAT\s0\fR" 4
+.el .IP "\f(CWline\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4
+.IX Item "line-number-format=FORMAT"
+Control the \fI\s-1FORMAT\s0\fR for printing TeX source line numbers,
+where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR.
+Default:\ \f(CW%5d\fR.
+.ie n .IP """log\-line\-number\-format""=\fI\s-1FORMAT\s0\fR" 4
+.el .IP "\f(CWlog\-line\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4
+.IX Item "log-line-number-format=FORMAT"
+Control the \fI\s-1FORMAT\s0\fR for printing log line numbers,
+where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR.
+Default:\ \f(CW%6d\fR.
+.ie n .IP """page\-number\-format""=\fI\s-1FORMAT\s0\fR" 4
+.el .IP "\f(CWpage\-number\-format\fR=\fI\s-1FORMAT\s0\fR" 4
+.IX Item "page-number-format=FORMAT"
+Control the \fI\s-1FORMAT\s0\fR for printing page numbers,
+where \fI\s-1FORMAT\s0\fR is passed to Perl's \f(CW\*(C`printf\*(C'\fR.
+Default:\ \f(CW\*(C`[%3d]\*(C'\fR.
+.ie n .IP """pager""=\fI\s-1PAGER\s0\fR" 4
+.el .IP "\f(CWpager\fR=\fI\s-1PAGER\s0\fR" 4
+.IX Item "pager=PAGER"
+Name of pager application to pipe output into
+if run with option\ \fB\-\-pager\fR.
+Default:\ \f(CW\*(C`less\*(C'\fR.
+.ie n .IP """pager\-flags""=\fI\s-1FLAGS\s0\fR" 4
+.el .IP "\f(CWpager\-flags\fR=\fI\s-1FLAGS\s0\fR" 4
+.IX Item "pager-flags=FLAGS"
+Pass \fI\s-1FLAGS\s0\fR to \fI\s-1PAGER\s0\fR.
+Default:\ \f(CW\*(C`\-\-quit\-if\-one\-screen\*(C'\fR.
+.IP "Color Configuration" 4
+.IX Item "Color Configuration"
+For the syntax of the color specifications consult
+the manual page of Term::ANSIColor(pm).
+.RS 4
+.ie n .IP """file\-header\-color""" 4
+.el .IP "\f(CWfile\-header\-color\fR" 4
+.IX Item "file-header-color"
+Color of the filename header.
+.ie n .IP """fill\-state\-color""" 4
+.el .IP "\f(CWfill\-state\-color\fR" 4
+.IX Item "fill-state-color"
+Color of the messages that report ``Underfull hbox'' or ``Overfull hbox''.
+.ie n .IP """first\-vbox\-color""" 4
+.el .IP "\f(CWfirst\-vbox\-color\fR" 4
+.IX Item "first-vbox-color"
+Color of the first vbox on a page.
+.ie n .IP """font\-spec\-color""" 4
+.el .IP "\f(CWfont\-spec\-color\fR" 4
+.IX Item "font-spec-color"
+Color of font specifications.
+.ie n .IP """horizontal\-break\-candidate\-color""" 4
+.el .IP "\f(CWhorizontal\-break\-candidate\-color\fR" 4
+.IX Item "horizontal-break-candidate-color"
+Color of lines with horizontal-breakpoint candidates\ \f(CW\*(C`@\*(C'\fR.
+.ie n .IP """horizontal\-breakpoint\-color""" 4
+.el .IP "\f(CWhorizontal\-breakpoint\-color\fR" 4
+.IX Item "horizontal-breakpoint-color"
+Color of lines with horizontal breakpoints\ \f(CW\*(C`@@\*(C'\fR.
+.ie n .IP """id\-color""" 4
+.el .IP "\f(CWid\-color\fR" 4
+.IX Item "id-color"
+Color of matching ids when printed inline.
+.ie n .IP """id\-heading\-color""" 4
+.el .IP "\f(CWid\-heading\-color\fR" 4
+.IX Item "id-heading-color"
+Color of matching ids when printed in heading form.
+.ie n .IP """line\-break\-pass\-color""" 4
+.el .IP "\f(CWline\-break\-pass\-color\fR" 4
+.IX Item "line-break-pass-color"
+Color of the lines showing which pass (e.g., \f(CW@firstpass\fR)
+of the line-breaking algorithm is active.
+.ie n .IP """line\-number\-color""" 4
+.el .IP "\f(CWline\-number\-color\fR" 4
+.IX Item "line-number-color"
+Color of TeX-source-file line numbers.
+.ie n .IP """log\-line\-number\-color""" 4
+.el .IP "\f(CWlog\-line\-number\-color\fR" 4
+.IX Item "log-line-number-color"
+Color of log-file line numbers.
+.ie n .IP """math\-color""" 4
+.el .IP "\f(CWmath\-color\fR" 4
+.IX Item "math-color"
+Color used for math expressions including their font specs.
+.ie n .IP """page\-number\-color""" 4
+.el .IP "\f(CWpage\-number\-color\fR" 4
+.IX Item "page-number-color"
+Color of page numbers of the final output.
+.ie n .IP """tightness\-color""" 4
+.el .IP "\f(CWtightness\-color\fR" 4
+.IX Item "tightness-color"
+Color of lines with Tight/Loose hbox reports.
+.ie n .IP """vertical\-breakpoint\-color""" 4
+.el .IP "\f(CWvertical\-breakpoint\-color\fR" 4
+.IX Item "vertical-breakpoint-color"
+Color of possible vertical breakpoints.
+.RE
+.RS 4
+.RE
+.SS "Brief summary of colors and attributes"
+.IX Subsection "Brief summary of colors and attributes"
+.IP "Foreground Color" 4
+.IX Item "Foreground Color"
+\&\f(CW\*(C`black\*(C'\fR, \f(CW\*(C`red\*(C'\fR, \f(CW\*(C`green\*(C'\fR, \f(CW\*(C`yellow\*(C'\fR,
+\&\f(CW\*(C`blue\*(C'\fR, \f(CW\*(C`magenta\*(C'\fR, \f(CW\*(C`cyan\*(C'\fR, \f(CW\*(C`white\*(C'\fR,
+.Sp
+Prefix with \f(CW\*(C`bright_\*(C'\fR for high-intensity or bold foreground.
+.IP "Foreground Grey" 4
+.IX Item "Foreground Grey"
+\&\f(CW\*(C`grey0\*(C'\fR, ..., \f(CW\*(C`grey23\*(C'\fR
+.IP "Background Color" 4
+.IX Item "Background Color"
+\&\f(CW\*(C`on_black\*(C'\fR, \f(CW\*(C`on_red\*(C'\fR, \f(CW\*(C`on_green\*(C'\fR, \f(CW\*(C`on_yellow\*(C'\fR,
+\&\f(CW\*(C`on_blue\*(C'\fR, \f(CW\*(C`on_magenta\*(C'\fR, \f(CW\*(C`on_cyan\*(C'\fR, \f(CW\*(C`on_white\*(C'\fR
+.Sp
+Replace \f(CW\*(C`on_\*(C'\fR with \f(CW\*(C`on_bright_\*(C'\fR for high-intensity or bold background.
+.IP "Background Grey" 4
+.IX Item "Background Grey"
+\&\f(CW\*(C`on_grey0\*(C'\fR, ..., \f(CW\*(C`on_grey23\*(C'\fR
+.IP "Text Attribute" 4
+.IX Item "Text Attribute"
+\&\f(CW\*(C`bold\*(C'\fR, \f(CW\*(C`dark\*(C'\fR, \f(CW\*(C`italic\*(C'\fR, \f(CW\*(C`underline\*(C'\fR, \f(CW\*(C`reverse\*(C'\fR
+.SH "EXIT STATUS"
+.IX Header "EXIT STATUS"
+The exit status is 0 if at least one \fI\s-1ID\s0\fR matched \fI\s-1REGEXP\s0\fR,
+1 if no \fI\s-1ID\s0\fR matched \fI\s-1REGEXP\s0\fR, and 2 if an error occurred.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fBgrep\fR(1), \fBprintf\fR(3), \fBTerm::ANSIColor\fR(pm)
diff --git a/macros/latex/contrib/typog/docs/typog-grep.1.pdf b/macros/latex/contrib/typog/docs/typog-grep.1.pdf
new file mode 100644
index 0000000000..09647860d5
--- /dev/null
+++ b/macros/latex/contrib/typog/docs/typog-grep.1.pdf
Binary files differ
diff --git a/macros/latex/contrib/typog/docs/typog.pdf b/macros/latex/contrib/typog/docs/typog.pdf
new file mode 100644
index 0000000000..9d00685045
--- /dev/null
+++ b/macros/latex/contrib/typog/docs/typog.pdf
Binary files differ
diff --git a/macros/latex/contrib/typog/typog.dtx b/macros/latex/contrib/typog/typog.dtx
new file mode 100644
index 0000000000..0f2176206a
--- /dev/null
+++ b/macros/latex/contrib/typog/typog.dtx
@@ -0,0 +1,9974 @@
+% \iffalse
+%
+% Copyright (C) 2024 by Ch. L. Spiel
+%
+% 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.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+
+\tracingonline=0
+
+%--\OnlyDescription
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+
+
+\PassOptionsToClass{a4paper}{article}
+\PassOptionsToPackage{hyperfootnotes=false}{hyperref}
+\PassOptionsToPackage{charter, scale=1.06}{newtxmath}
+\PassOptionsToPackage{dvipsnames}{xcolor}
+
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{array}
+\usepackage{booktabs}
+\usepackage{caption}
+\usepackage{dtk-logos}
+\usepackage{enumitem}
+\usepackage{etoolbox}%--\tracingpatches
+\usepackage{fancyhdr}
+\usepackage[T1]{fontenc}
+\usepackage{fullwidth}
+\usepackage{hypdoc}
+\usepackage{hyphenat}
+\usepackage[shrink=10, stretch=10]{microtype}
+\usepackage{multirow}
+\usepackage{needspace}
+\usepackage{placeins}
+\usepackage{ragged2e}
+\usepackage{setspace}
+\usepackage{sidecap}
+\usepackage{tabularx}
+\usepackage{tcolorbox}
+\usepackage{titlesec}\renewcommand*{\bottomtitlespace}{.15\textheight}%nobottomtitles*
+\usepackage[debug, raise*=.05em]{typog}
+\usepackage{xcolor}
+
+
+\usepackage[default, lining, proportional, regular, semibold]{sourceserifpro}
+\usepackage[lining, proportional, regular, semibold]{sourcesanspro}
+\usepackage[lining, regular]{sourcecodepro}
+\usepackage[xcharter]{newtxmath}
+\setbaselineskip{12.5pt}
+
+\makeatletter
+\def\@get@fontclan#1-#2\relax{#1}
+\newcommand*{\fontclan}{\expandafter\@get@fontclan\f@family\relax}
+\makeatother
+
+\newcommand*{\proportionalliningfigures}{\fontfamily{\fontclan-LF}\selectfont}
+\newcommand*{\proportionaloldstylefigures}{\fontfamily{\fontclan-OsF}\selectfont}
+\newcommand*{\tabularliningfigures}{\fontfamily{\fontclan-TLF}\selectfont}
+\newcommand*{\tabularoldstylefigures}{\fontfamily{\fontclan-TOsF}\selectfont}
+
+\newcommand*{\textdenominator}[1]{{\fontfamily{\fontclan-Dnom}\selectfont #1}}
+\newcommand*{\textinferior}[1]{{\fontfamily{\fontclan-Inf}\selectfont #1}}
+\newcommand*{\textnumerator}[1]{{\fontfamily{\fontclan-Numr}\selectfont #1}}
+\newcommand*{\textsuperior}[1]{{\fontfamily{\fontclan-Sup}\selectfont #1}}
+
+\newcommand*{\nativetextfraction}[2]
+ {\mbox{\textnumerator{#1}\textfractionsolidus\textdenominator{#2}}}
+
+\makeatletter
+\renewcommand*{\@makefnmark}{\hbox{\sf\textsuperior{\@thefnmark}}}
+\newenvironment*{tabfigures}
+ {\edef\rmdefault{\fontclan-T\sourceserifpro@figurestyle}\rm\ignorespaces}
+ {\ignorespacesafterend}
+
+\newcommand*{\elseries}{\def\mdseries@rm{el}\def\mdseries@sf{el}\def\mdseries@tt{el}}
+\newcommand*{\textel}[1]{{\elseries\textmd{#1}}}
+\newcommand*{\lseries}{\def\mdseries@rm{l}\def\mdseries@sf{l}\def\mdseries@tt{l}}
+\newcommand*{\textl}[1]{{\lseries\textmd{#1}}}
+%%--\newcommand*{\mdseries}{\def\mdseries@rm{m}\def\mdseries@sf{m}\def\mdseries@tt{m}}
+%%--\newcommand*{\textmd}[1]{{\mdseries\textmd{#1}}}
+\newcommand*{\sbseries}{\def\bfseries@rm{sb}\def\bfseries@sf{sb}\def\bfseries@tt{sb}}
+\newcommand*{\textsb}[1]{{\sbseries\textbf{#1}}}
+\newcommand*{\bseries}{\def\bfseries@rm{b}\def\bfseries@sf{b}\def\bfseries@tt{b}}
+\newcommand*{\textb}[1]{{\bseries\textbf{#1}}}
+\newcommand*{\ebseries}{\def\bfseries@rm{k}\def\bfseries@sf{eb}\def\bfseries@tt{k}}
+\newcommand*{\texteb}[1]{{\ebseries\textbf{#1}}}
+\makeatother
+
+
+\usepackage{cleveref}
+
+
+\expandafter\GetFileInfo\expandafter{\jobname.sty}
+\def\aspdfdate#1/#2/#3\relax{D:#1#2#3}
+\edef\pdffiledate{\expandafter\aspdfdate\filedate\relax}
+
+\hypersetup{
+ citecolor = blue,
+ colorlinks = true,
+ linkcolor = blue,
+ linktocpage = false,
+ pdfauthor={Dr. Christoph L. Spiel},
+ pdfcreationdate={\pdffiledate},
+ pdfkeywords={LaTeX, typography, ligature, italic-correction, paragraph justification, baselineskip, sloppy, ragged},
+ pdflang=en-US,
+ pdfsubject={Typographic fine-tuning for LaTeX},
+ pdftitle={Package typog \fileversion},
+ raiselinks = false,
+ urlcolor = [rgb]{0, 0, .5}% = navy
+}
+
+
+\makeatletter
+\renewcommand*{\@dotsep}{10000} % suppress leaders
+\patchcmd{\@dottedtocline}{\normalfont}{\bfseries}{\relax}{\PatchingFailed}
+\makeatother
+
+
+\Crefname{figure}{Figure}{Figures}
+\crefname{figure}{Fig.}{Figs.}
+
+\Crefname{page}{Page}{Pages}
+\crefname{page}{p.}{p.}
+
+\Crefname{section}{Section}{Sections}
+\crefname{section}{Sec.}{Secs.}
+
+\Crefname{table}{Table}{Tables}
+\crefname{table}{Tab.}{Tabs.}
+
+
+\DeclareCaptionJustification{centerlastjustification}{\justify\fussy\lastlinecenteredpar}
+\DeclareCaptionJustification{smoothraggedjustification}%
+ {\renewcommand*{\smoothraggedrightgenerator}{quintuplet}%
+ \setlength{\smoothraggedrightragwidth}{1em}%
+ \smoothraggedrightpar\relax}
+\DeclareCaptionJustification{relaxedjustification}{\justify\slightlysloppy}
+
+\newcommand*{\floatcaptionwidth}{.79\textwidth}
+
+\captionsetup[figure]{font=small, justification=centerlastjustification,
+ labelfont=sc, width=\floatcaptionwidth}
+\captionsetup[table]{font=small, justification=centerlastjustification,
+ labelfont=sc, width=\floatcaptionwidth}
+\captionsetup[SCfigure]{font=small, justification=relaxedjustification,
+ labelfont=sc}
+\captionsetup[SCtable]{font=small, justification=relaxedjustification,
+ labelfont=sc}
+
+
+\newsavebox{\listlabelbox}
+
+\sbox{\listlabelbox}{---}
+\SetEnumitemKey{noindent}{
+ label={---},
+ labelwidth=\wd\listlabelbox,
+ leftmargin=!
+}
+
+
+\SetEnumitemKey{nestedinspecialsection}{
+ leftmargin=10pt
+}
+
+\SetEnumitemKey{notopsep}{
+ after=\vskip.8em plus .2em minus .4em,
+ partopsep=0pt,
+ topsep=0pt
+}
+
+
+\newlength{\marginindicatorsep}
+\setlength{\marginindicatorsep}{10pt}
+
+\newcommand*{\marginalizesectionnumber}[1]
+ {\makebox[0pt][r]{#1\hspace{\marginindicatorsep}}}
+
+
+\fancypagestyle{pagenumberonly}{
+ \fancyhead[L]{}
+ \fancyhead[R]{\thepage}
+}
+\pagestyle{fancy}
+\fancyhf{}
+\fancyhead[L]{\rightmark}
+\fancyhead[R]{\thepage}
+\newcommand*{\resetfancyhead}
+ {\fancyhead[L]{\textsf{\textsc{\textls[20]{\nouppercase\rightmark}}}}}
+
+\renewcommand*{\headrulewidth}{0pt}
+\renewcommand*{\sectionmark}[1]
+ {\def\truesectionname{#1}%
+ \markright{\textsf{\marginalizesectionnumber{\thesection}%
+ \textsc{\textls[20]{#1}}}}}
+\renewcommand*{\subsectionmark}[1]
+ {\markright{\textsf{\marginalizesectionnumber{\thesubsection}%
+ \textsc{\textls[20]{\truesectionname:\enspace}}#1}}}
+
+
+\titleformat{\section}[hang]
+ {\sffamily\Large\bfseries}{\marginalizesectionnumber{\thesection}}{0pt}{}
+\titleformat{\subsection}[hang]
+ {\sffamily\large\bfseries}{\marginalizesectionnumber{\thesubsection}}{0pt}{}
+\titleformat{\subsubsection}[hang]
+ {\sffamily\normalsize\bfseries}{\marginalizesectionnumber{\thesubsubsection}}{0pt}{}
+\titleformat{\paragraph}[runin]
+ {\sffamily\normalsize\bfseries}{\theparagraph}{1em}{}
+
+
+\let\footnoterule=\relax% suppress footnote rule
+
+\makeatletter
+\renewcommand*{\@makefntext}[1]
+ {\noindent
+ \llap{\let\@textsuperscript=\relax% use "normal" figures for the footnote numbers
+ \let\textsuperior=\relax
+ \@makefnmark
+ \hspace{\marginindicatorsep}}% separate the footnote number and the body
+ #1}
+\makeatother
+
+
+\pretocmd{\DescribeEnv}{\needspace{25pt}}{\relax}{\PrependingFailed}
+\pretocmd{\DescribeMacro}{\needspace{25pt}}{\relax}{\PrependingFailed}
+
+
+\setlength{\skip\footins}{25pt}
+\setlength{\overfullrule}{3pt}
+\renewcommand*{\sidecaptionsep}{16pt}
+
+
+
+\newrobustcmd*{\acronym}[1]{\mbox{\scshape\MakeLowercase{#1}}}
+
+\newcommand*{\application}[1]{\mbox{\sffamily #1}}
+
+\renewcommand*{\arraystretch}{1.12}
+
+\newcommand*{\bibauthor}[1]{\mbox{\textsc{#1}}}
+\newcommand*{\bibtitle}[1]{\textit{#1}}
+\newcommand*{\biburl}[1]{\url{#1}}
+
+\newcommand*{\bottomstrut}{\rule[-.5em]{0pt}{0pt}}
+
+\newenvironment*{codeexample}
+ {\vspace{.5\smallskipamount}
+ \par
+ \centering
+ \begin{minipage}{\linewidth}
+ \ttfamily
+ \begin{tabbing}}
+ {\end{tabbing}
+ \end{minipage}
+ \par
+ \vspace{.5\smallskipamount}}
+
+\makeatletter
+\newcommand*{\citenum}[1]{\@nameuse{b@#1}}
+\makeatother
+
+\def\code#1{\texttt{#1}}
+
+\newrobustcmd*{\command}[1]{\mbox{\textbf{#1}}}
+
+\newcommand*{\doublequotes}[1]{\doubleguillemetright\kern-.03333em #1\doubleguillemetleft}
+
+\newcommand*{\dumpmacro}[1]{\texttt{\detokenize\expandafter{#1}}}
+
+\newcommand*{\filesystem}[1]{\mbox{\textit{#1\/}}}
+
+\newcommand*{\filledrectangle}[2]{\rule{#1}{#2}}
+\newcommand*{\filledsquare}[1]{\filledrectangle{#1}{#1}}
+
+\newcommand*{\foreignphrase}[1]{\textsl{#1}}
+
+\newcommand*{\formatskip}[3]{#1\genfrac{}{}{0pt}{}{{+}#2}{{-}#3}}
+
+\makeatletter
+\renewcommand*{\fps@figure}{htbp}
+\renewcommand*{\fps@table}{htbp}
+\makeatother
+
+\newcommand*{\hollowrectangle}[2]
+ {\setlength{\fboxrule}{.5pt}%
+ \setlength{\fboxsep}{0pt}%
+ \framebox{\rule{#1}{0pt}\rule{0pt}{#2}}}
+\newcommand*{\hollowsquare}[1]{\hollowrectangle{#1}{#1}}
+
+
+\makeatletter
+\apptocmd{\index@prologue}
+ {\marginnote{In the Index page ranges are stuck together with
+ \hyperref[syn:figuredash]{\cs{figuredash*}}.}}
+ {\relax}
+ {\AppendingFailed}
+\makeatother
+
+\newcommand*{\logmacro}[1]
+ {\ifdef{#1}
+ {\message{^^JDump of macro \string#1 follows.^^J}
+ \message{\detokenize\expandafter{#1}}
+ \message{^^JEnd macro dump.^^J}}
+ {\message{^^JMacro \string#1 is not defined.^^J}}}
+
+\newcommand*{\marginnoteformat}
+ {\setstretch{1}%\overfullrule=0pt
+ \sffamily
+ \footnotesize
+ \nofontexpansion
+ \slightlysloppy[1]
+ \loosespacing[1]
+ \setlength{\smoothraggedrightragwidth}{1.5em}
+ \def\smoothraggedrightgenerator{quintuplet}%
+ \smoothraggedrightpar}
+\newcommand*{\marginnote}[1]{\marginpar{\marginnoteformat #1}}
+\addtolength{\marginparpush}{3pt}
+\addtolength{\marginparsep}{25pt}
+\addtolength{\marginparwidth}{-20pt}
+\newcommand*{\shiftedmarginnote}[1]
+ {\marginpar{\moveleft \leftmargin
+ \hbox{\parbox{\dimexpr\marginparwidth - \marginparsep}
+ {\marginnoteformat #1}}}}
+
+\newenvironment*{maxipage}
+ {\fullwidthsetup{leftmargin=-\marginparsep - \marginparwidth,
+ width=\textwidth + \marginparsep + \marginparwidth}%
+ \begin{fullwidth}}
+ {\end{fullwidth}}
+
+\newcommand*{\microtyperequiredmarker}
+ {\mbox{\normalfont\packagename{microtype}~req.}}
+
+\newlength{\emreference}
+\AtBeginDocument{\setlength{\emreference}{\fontdimen6\font}}
+\newrobustcmd*{\milliem}[1]
+ {\ifdim #1=0pt
+ #1%
+ \else
+ \nativetextfraction{\the\numexpr\dimexpr (#1) * 1000 / \emreference}{1000}\:em%
+ \fi}
+
+\newcommand*{\needtocspace}[1][3]
+ {\addtocontents{toc}{\protect\needspace{#1\baselineskip}}}
+
+\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}}
+\newcommand*{\programname}[1]{\mbox{\textbf{#1}}}
+\newcommand*{\propername}[1]{\mbox{\textsc{#1}}}
+
+\newcommand*{\quarterspace}{\hspace{.25em}}
+
+\NewDocumentCommand{\sample}{s m}
+ {\setbox0=\hbox{#2}% H: 6.19849pt, /: 7.49817
+ \mbox{\raisebox{\dimexpr -.15em - \dp0}{\tiny$\llcorner$}%
+ \kern-.15em\copy0\kern-.15em
+ \raisebox{\ifdim\ht0>.7em
+ \ifx#1\BooleanTrue
+ .4em
+ \else
+ \dimexpr\ht0 - .1em
+ \fi
+ \else
+ .4em
+ \fi}
+ {\tiny$\urcorner$}}}
+
+\newcommand*{\sectionfinish}
+ {\vfill
+ {\centering
+ \textcolor{customred4}
+ {\filledsquare{5pt}\enspace\filledsquare{5pt}}%
+ \par}%
+ \vfill}
+\let\sectionfinish=\relax
+
+\newcommand*{\sinceversion}[1]{% modeled after \NewIn of "doc.dtx"
+ \leavevmode
+ \marginpar{\hfill\textcolor{\markercolor}{\sf\scshape\proportionaloldstylefigures #1}}%
+ \ignorespaces
+}
+
+\newcommand*{\singlequotes}[1]{\mbox{\singleguillemetright #1\singleguillemetleft}}
+
+\newcommand*{\specialsectionheading}[1]{\textcolor{\markercolor}{\textit{\textbf{#1}}}}
+\definecolor{customred1}{rgb}{.890, .282, .282}%-- https://paletton.com/
+\definecolor{customred2}{rgb}{.831, .110, .110}
+\definecolor{customred3}{rgb}{.686, .043, .043}
+\definecolor{customred4}{rgb}{.569, .000, .000}
+\definecolor{customred5}{rgb}{.420, .000, .000}
+\newcommand*{\markercolor}{customred4}
+\newcommand*{\specialsectionmarker}{\color{\markercolor}\filledsquare{5pt}}
+\newcommand*{\specialsectionbegin}
+ {\llap{\raisebox{1pt}{\specialsectionmarker}%
+ \hspace{\marginindicatorsep}}}
+\newcommand*{\specialsectionend}
+ {\ifmmode
+ \specialsectionmarker
+ \else
+ \leavevmode
+ \unskip
+ \penalty9999\mbox{}\nobreak
+ \hfill
+ \quad
+ \mbox{\specialsectionmarker}%
+ \fi}
+\newtoggle{printspecialsectionmarker}
+\NewDocumentEnvironment{specialsection}{m m}
+ {\Needspace{4\baselineskip}%
+ \toggletrue{printspecialsectionmarker}%
+ \begin{list}
+ {\specialsectionheading{#1\ifblank{#2}{}{\textup{\space---\space#2}}}}
+ {\itemindent=0pt
+ \labelwidth=10pt
+ \leftmargin=15pt
+ \listparindent=15pt
+ \parsep=0pt
+ \topsep=\medskipamount}
+ \newcommand*{\specialsectionendhere}
+ {\specialsectionend
+ \global\togglefalse{printspecialsectionmarker}}
+ \item
+ \nointerlineskip
+ \leavevmode\par
+ \noindent}
+ {\iftoggle{printspecialsectionmarker}{\specialsectionend}{\relax}%
+ \end{list}}
+
+ \newenvironment*{caution}[1][]{\begin{specialsection}{Caution}{#1}}{\end{specialsection}}
+ \newenvironment*{example}[1][]{\begin{specialsection}{Example}{#1}}{\end{specialsection}}
+ \newenvironment*{futuredirection}[1][]
+ {\begin{specialsection}{Anticipated Changes \& Possible Extensions}{#1}\small}
+ {\end{specialsection}}
+ \newenvironment*{important}[1][]{\begin{specialsection}{Important}{#1}}{\end{specialsection}}
+ \newenvironment*{note}[1][]{\begin{specialsection}{Note}{#1}}{\end{specialsection}}
+ \newenvironment*{notes}[1][]{\begin{specialsection}{Notes}{#1}}{\end{specialsection}}
+ \newenvironment*{tip}[1][]{\begin{specialsection}{Tip}{#1}}{\end{specialsection}}
+ \newenvironment*{tips}[1][]{\begin{specialsection}{Tips}{#1}}{\end{specialsection}}
+ \newenvironment*{usecase}[1][]{\begin{specialsection}{Use Case}{#1}\small}{\end{specialsection}}
+ \newenvironment*{usecases}[1][]{\begin{specialsection}{Use Cases}{#1}\small}{\end{specialsection}}
+
+\newcommand*{\specialcodesectionheading}[1]{\textcolor{\markercolor}{\textbf{\textit{#1}}}}
+\newenvironment*{specialcodesection}[1]
+ {\Needspace{4\baselineskip}%
+ \begin{tcolorbox}[colback=white, colframe=\markercolor,
+ bottomrule=0pt, leftrule=5pt, rightrule=0pt, toprule=0pt]
+ \sf\typogsetupsf
+ \begin{list}
+ {\specialcodesectionheading{#1}}
+ {\itemindent=0pt
+ \labelwidth=20pt
+ \leftmargin=25pt
+ \listparindent=15pt
+ \parsep=0pt
+ \topsep=\medskipamount}
+ \item
+ \nointerlineskip
+ \leavevmode\par
+ \noindent}
+ {\end{list}
+ \end{tcolorbox}}
+ \newenvironment*{anticipatedchange}
+ {\begin{specialcodesection}{Anticipated Change}}
+ {\end{specialcodesection}}
+ \newenvironment*{implementationnote}
+ {\begin{specialcodesection}{Implementation Note}}
+ {\end{specialcodesection}}
+ \newenvironment*{knownbug}
+ {\begin{specialcodesection}{Known Bug}}
+ {\end{specialcodesection}}
+
+\newenvironment*{suspendshortverb}
+ {\DeleteShortVerb{\|}}
+ {\MakeShortVerb{\|}}
+
+\definecolor{cold-silver}{cmyk}{.08, 0, 0, .18}
+\newenvironment*{synopsis}
+ {\begin{tcolorbox}[boxrule=.25pt, colback=cold-silver]%
+ \phantomsection}
+ {\end{tcolorbox}}
+
+\newenvironment*{tablenotes}
+ {\medskip
+ \centering
+ \small
+ \begin{minipage}{\floatcaptionwidth}}
+ {\end{minipage}}
+\newcommand*{\tablenotemark}[1]{\smash{\textsuperscript{#1}}}
+
+\newcommand*{\termparbox}[1]{\parbox[t]{\linewidth}{#1\bottomstrut}}
+
+\newcommand*{\thousandsseparator}{\mbox{,}}
+
+\newcommand*{\topstrut}{\rule{0pt}{1.3em}}
+
+\newcommand*{\typogsetuprm}
+ {\typogsetup{raise*=.025em,
+ raisecapitalguillemets=.05em,
+ raiseguillemets=.03333em,
+ raisefiguredash=.05em}}
+\newcommand*{\typogsetupsf}
+ {\typogsetup{raise*=.06667em,
+ raiseguillemets=.05em}}
+
+\newcommand*{\visualpar}{\textcolor{\markercolor}{\P}\linebreak[1]\enspace}
+
+\newenvironment*{whittyquote}
+ {\begin{flushright}
+ \renewcommand*{\propername}[1]{\mbox{##1}}%
+ \sf\typogsetupsf}
+ {\end{flushright}}
+
+\newenvironment*{widecodeexample}
+ {\begin{maxipage}
+ \flushright
+ \begin{minipage}{\textwidth}
+ \ttfamily
+ \begin{tabbing}}
+ {\end{tabbing}
+ \end{minipage}
+ \end{maxipage}}
+
+
+\NewDocElement[macrolike = true,
+ idxtype = dim.,
+ idxgroup = dimensions,
+ printtype = \textit{dimen}]
+ {LaTeXDimen}{ldimen}
+\pretocmd{\DescribeLaTeXDimen}{\needspace{25pt}}{\relax}{\PrependingFailed}
+
+\NewDocElement[macrolike = false,
+ idxtype = enumitem-key,
+ idxgroup = enumitem-keys,
+ printtype = \textit{enumitem key}]
+ {EnumItemKey}{enumitemkey}
+\pretocmd{\DescribeEnumItemKey}{\needspace{25pt}}{\relax}{\PrependingFailed}
+
+
+\hyphenation{% https://hyphenateit.com/en-us
+ Double-guillemet-left
+ Double-guillemet-right
+ Double-quotes
+ Single-guillemet-left
+ Single-guillemet-right
+ Single-quotes
+ adj-demerits
+ allow-break
+ babel-hyphenation
+ base-line-skip
+ break-penalty
+ breakable-display
+ capital-hyphen
+ capital-times
+ cite-dash
+ club-penalties
+ cref-range-conjunction
+ display-break
+ display-widow-penalties
+ double-guillemet-right
+ double-hyphen-demerits
+ double-quotes
+ ex-hyphen-penalty
+ figure-dash
+ guille-met
+ guille-mets
+ inter-display-line-penalty
+ inter-text
+ kerned-hyphen
+ last-line-centered
+ last-line-centered-par
+ last-line-ragged-left
+ last-line-ragged-left-par
+ line-width
+ loose-ness
+ loose-spacing
+ make-at-letter
+ make-at-other
+ mar-gin-al
+ math-italics-correction
+ micro-type
+ narrow-space
+ narrow-space-scale
+ narrow-space-strength
+ number-dash
+ par-box
+ par-indent
+ parfillskip
+ pdf-string-def-Disable-Commands
+ post-display-penalty
+ pre-display-penalty
+ raise-capital-guillemets
+ raise-capital-hyphen
+ raise-capital-times
+ raise-number-dash
+ set-baseline-skip
+ set-baseline-skip-percentage
+ set-font-expand
+ set-font-shrink
+ set-font-stretch
+ set-leading
+ set-leading-percentage
+ short-inter-text
+ single-guillemet-left
+ single-guillemet-right
+ single-quotes
+ slash-kern
+ slightly-sloppy
+ slightly-sloppy-par
+ sloppy-par
+ smooth-ragged-right-fuzz-factor
+ smooth-ragged-right-par
+ smooth-ragged-right-shape-quintuplet
+ smooth-ragged-right-shape-septuplet
+ smooth-ragged-right-shape-triplet
+ space-skip
+ text-italics-correction
+ tight-spacing
+ tracing-boxes
+ tracing-para-graphs
+ tracking-tt-spacing
+ typog-get
+ typog-setup
+ vtie-bot
+ vtie-bot-disp
+ vtie-bot-disp-par
+ vtie-bot-disp-top-par
+ vtie-bot-par
+ vtie-top
+ vtie-top-par
+ wide-space
+ wide-space-scale
+ wide-space-strength
+ widow-penalties
+}
+
+
+\begin{document}
+ \typogsetuprm
+ \DocInput{typog.dtx}
+\end{document}
+%</driver>
+%<*index-style>
+actual '='
+delim_r "\\figuredash*"
+heading_prefix "\\pagebreak[3]\\smallskip\n\n{\\sffamily\\bfseries\\large "
+heading_suffix "}\\nopagebreak\n"
+headings_flag 1
+level '>'
+quote '!'
+%</index-style>
+% \fi
+%
+%
+% \DoNotIndex{\,}
+% \DoNotIndex{\addtolength,\advance,\aftergroup,\allowdisplaybreaks,\arabic}
+% \DoNotIndex{\AtBeginDocument,\autotransfer}
+% \DoNotIndex{\baselineskip}
+% \DoNotIndex{\c,\char,\clubpenalties,\clubpenalty,\count,\cs,\csname}
+% \DoNotIndex{\DeclareRobustCommand,\def,\define@choicekey,\define@key,\detokenize}
+% \DoNotIndex{\dim,\dimen,\dimexpr,\discretionary,\displaywidowpenalties,\displaywidowpenalty}
+% \DoNotIndex{\edef,\else,\emergencystretch,\empty,\endcsname}
+% \DoNotIndex{\endlastlineflushrightpar}
+% \DoNotIndex{\endlastlineraggedleftpar}
+% \DoNotIndex{\endnofontexpand,\endnofontexpansion}
+% \DoNotIndex{\endsmoothraggedrightshapequintuplet}
+% \DoNotIndex{\endsmoothraggedrightshapeseptuplet}
+% \DoNotIndex{\endsmoothraggedrightshapetriplet}
+% \DoNotIndex{\endtypoginspect}
+% \DoNotIndex{\exhyphenpenalty,\expandafter,\ExplSyntaxOff,\ExplSyntaxOn}
+% \DoNotIndex{\fi,\finalhyphendemerits,\font,\fontdimen,\fp,\fussy,\futurelet}
+% \DoNotIndex{\gdef,\global,\glueexpr,\@gobble}
+% \DoNotIndex{\guillemotleft,\guillemotright,\guilsinglleft,\guilsinglright}
+% \DoNotIndex{\hbadness,\hfuzz,\hskip,\hspace}
+% \DoNotIndex{\ignorespaces,\ignorespacesafterend}
+% \DoNotIndex{\if,\IfBooleanT,\IfBooleanTF,\ifcase,\ifdefined,\ifdim,\iffalse,\ifmmode,\ifMT@expansion}
+% \DoNotIndex{\@ifnextchar,\IfNoValueF,\IfNoValueTF,\ifnum}
+% \DoNotIndex{\iftypog@microtype@loadedfalse}
+% \DoNotIndex{\iftypog@microtype@preloadedfalse}
+% \DoNotIndex{\ifvmode,\ifx,\ignorespaces,\inputlineno,\int,\interlinepenalty}
+% \DoNotIndex{\jobname}
+% \DoNotIndex{\kern}
+% \DoNotIndex{\l,\lastlinefit,\lastlineflushrightpar,\lastlineraggedleftpar,\leftmargin,\leftskip,\let}
+% \DoNotIndex{\linepenalty,\linewidth,\@listdepth,\looseness,\lsstyle}
+% \DoNotIndex{\@M,\m@th,\mathbin,\mathord,\maxdimen,\message,\microtypecontext,\microtypesetup}
+% \DoNotIndex{\@minus,\mkern,\m@ne,\mspace,\MT@letterspace@,\MT@MT,\muexpr}
+% \DoNotIndex{\@ne,\NeedsTeXFormat,\NewDocumentCommand,\NewDocumentEnvironment,\newcommand,\newenvironment}
+% \DoNotIndex{\newcounter,\newdimen,\newif,\newlength,\newmuskip}
+% \DoNotIndex{\nobreak,\nofontexpand,\nofontexpansion,\nr,\numexpr}
+% \DoNotIndex{\or,\optarg}
+% \DoNotIndex{\p@,\PackageError,\PackageWarning}
+% \DoNotIndex{\par,\parfillskip,\parindent,\parshape,\pdf@strcmp}
+% \DoNotIndex{\pdfstringdefDisableCommands}
+% \DoNotIndex{\penalty,\@plus,\PopPostHook,\postdisplaypenalty,\predisplaypenalty,\prg}
+% \DoNotIndex{\pretolerance,\protected,\ProvidesPackage,\PushPostHook}
+% \DoNotIndex{\raisebox,\refstepcounter,\relax,\RenewExpandableDocumentCommand,\RequirePackage,\rightskip}
+% \DoNotIndex{\setcounter,\SetEnumitemKey,\SetExpansion,\setkeys,\setlength,\setstretch}
+% \DoNotIndex{\showboxbreadth,\showboxdepth,\skip,\sloppy}
+% \DoNotIndex{\smoothraggedrightpar}
+% \DoNotIndex{\smoothraggedrightshapequintuplet}
+% \DoNotIndex{\smoothraggedrightshapeseptuplet}
+% \DoNotIndex{\smoothraggedrightshapetriplet}
+% \DoNotIndex{\space,\spaceskip,\stepcounter,\@strength,\string}
+% \DoNotIndex{\textemdash,\textendash,\textsf,\textsl,\texttimes,\textwidth,\the,\times,\tl,\tolerance}
+% \DoNotIndex{\tracingnone,\tracingpages,\tracingparagraphs}
+% \DoNotIndex{\typeout,\typoginspect,\typoglogo}
+% \DoNotIndex{\unless}
+% \DoNotIndex{\val,\value,\vbadness,\vfuzz}
+% \DoNotIndex{\widowpenalties,\widowpenalty}
+% \DoNotIndex{\z@,\z@skip}
+%
+%
+% \changes{v0.1}{2024-3-7}{Initial version.}
+%
+%
+% \pagenumbering{roman}
+%
+% \title{\typoglogo{} \capitalendash{} Typographic Fine\rightkernedhyphen*[20]{-120}Tuning}
+% \author{Ch.~L.~Spiel\footnote{\quarterspace\texttt{cspiel@users.sourceforge.org}}}
+% \date{\fileversion\qquad \filedate}
+% \maketitle
+% \thispagestyle{empty}
+%
+% \begingroup
+% \let\small=\normalsize
+% \begin{abstract}
+% \begin{lastlinecenteredpar}
+% \noindent
+% Package~\packagename{typog} provides macros and environments for
+% \mbox{(micro-)\itcorr{2}}\breakpoint typographic enhancements. It also supplies some
+% means to avoid common typographic problems as, for example, orphan or widow lines.
+% Moreover it supplies high-level front-ends for packages~\packagename{microtype} and
+% \packagename{setspace}.
+% \end{lastlinecenteredpar}
+% \end{abstract}
+% \endgroup
+%
+%
+% \iffalse
+%<*title>
+prologues := 3;
+truecorners := 1;
+linecap := butt;
+
+string roman_font;
+roman_font := "pplr8r"; % URW Palladio L - Roman
+
+string italics_font;
+italics_font := "pplri8r"; % URW Palladio L - Italic
+
+picture dash_dotted;
+dash_dotted := dashpattern(on 3 off 3 on 0 off 3);
+
+u := 280;
+
+font_scale := 20;
+
+pair loc[];
+loc[1] := .2[origin, (u, 0)];
+loc[2] := .5[origin, (u, 0)];
+loc[3] := .8[origin, (u, 0)];
+
+pair slant_vector;
+slant_vector := (63, 150);
+
+pair raise_vector[];
+raise_vector[0] := (0, 44);
+raise_vector[1] := (0, 61);
+raise_vector[2] := (0, 54);
+raise_vector[3] := (0, 71);
+
+
+picture letter_V;
+letter_V := thelabel.top("V" infont roman_font scaled font_scale, loc[1]);
+
+picture normal_hyphen;
+normal_hyphen := thelabel.top("-" infont roman_font scaled font_scale, loc[2] + raise_vector[0]);
+
+picture raised_hyphen;
+raised_hyphen := thelabel.top("-" infont roman_font scaled font_scale, loc[2] + raise_vector[1]);
+
+picture letter_A;
+letter_A := thelabel.top("A" infont roman_font scaled font_scale, loc[3]);
+
+
+beginfig(1);
+ draw letter_V;
+ draw normal_hyphen withcolor .9 white;
+ draw raised_hyphen;
+ draw letter_A;
+
+ pickup pencircle scaled .4pt;
+ draw (loc[1] -- loc[1] + slant_vector) shifted (7, 0) dashed evenly;
+ draw (loc[1] -- loc[1] + slant_vector) shifted (27, 0) dashed evenly;
+ draw (loc[1] -- loc[1] + slant_vector) shifted (80, 0) dashed evenly;
+ draw (loc[3] -- loc[3] + slant_vector) shifted (-68, 0) dashed evenly;
+
+ draw .35[origin, (u, 0)] + raise_vector[2] -- .8[origin, (u, 0)] + raise_vector[2]
+ dashed dash_dotted withcolor .6white;
+ draw .35[origin, (u, 0)] + raise_vector[3] -- .8[origin, (u, 0)] + raise_vector[3]
+ dashed dash_dotted;
+endfig;
+end
+%</title>
+% \fi
+%
+%
+% \vspace*{20pt}
+%
+% \begin{center}
+% \includegraphics{title-1.mps}
+% \end{center}
+%
+% \vfill
+%
+% \begin{lastlinecenteredpar}
+% \footnotesize
+% \noindent
+% This package is copyright \textcopyright~2024 Ch.~L.~Spiel. It may be distributed
+% and\kernedslash*or modified under the conditions of the \LaTeX{} Project Public License
+% \acronym{(LPPL)}, either version~1.3c of this license or --~at your option~-- any later
+% version. This work has the \acronym{LPPL} maintenance status
+% \doublequotes{author-maintained}.
+% \end{lastlinecenteredpar}
+%
+%
+% \clearpage
+% \thispagestyle{pagenumberonly}
+% \tableofcontents
+% \vspace{\fill}
+%
+%
+% \thispagestyle{pagenumberonly}
+% \listoftables
+% \phantomsection
+% \addcontentsline{toc}{subsection}{List of Tables}
+% \vspace{\fill}
+%
+%
+% \begingroup
+% \footnotesize
+% \singlespacing
+% \noindent
+% The font sample on the title page was generated with the help of \MP{} using
+% \doublequotes{\acronym{URW} Palladio~L}\index{font>URW Palladio L=\acronym{URW} Palladio
+% L}.
+% \endgroup
+%
+%
+% \clearpage
+% \pagenumbering{arabic}
+% \section{Introduction}\label{sec:introduction}
+%
+% \begin{whittyquote}
+% \doublequotes{Good typography} is the minimum acceptable solution; \\
+% \doublequotes{fine typography} is what we aspire to. \\
+% \capitalemdash*~\propername{Ilene Strizver}
+% \end{whittyquote}
+%
+% \noindent
+% \LaTeX{} is the beginning of good typesetting -- not the end. This package provides some
+% tools for even better looking documents. When applied correctly its effects appear subtle
+% and inconspicuous.
+%
+%
+% \subsection{Overview}\label{sec:overview}
+%
+% Package~\packagename{typog} focuses on (micro-)typographic improvements.
+%
+% \Cref{sec:information} tends to the wish for more information in the typesetting process
+% whether during the draft phase or in the final printed manuscript.\marginnote{Throughout the
+% whole document we indicate actual uses of the package's features in the margin. All these
+% notes are examples themselves as they are typeset with
+% \hyperref[syn:slightlysloppy]{\code{slightlysloppy}},
+% \hyperref[syn:loosespacing]{\code{loosespacing}}, and
+% \hyperref[syn:smoothraggedrightpar]{\code{smoothraggedrightpar}}.~\visualpar The title page
+% has already demonstrated the effect of
+% \hyperref[syn:lastlinecenteredpar]{\code{lastlinecenteredpar}} in justified paragraphs for
+% the abstract and the copyright notice.}
+%
+% \Cref{sec:latex-hyphenation} expands the hyphenation facilities of \LaTeX.
+%
+% \Cref{sec:break-ligatures,sec:manual-italic-correction,sec:extra-kerning,sec:raise-characters}
+% deal with vertically positioning glyphs in a more pleasant way.
+%
+% \Cref{sec:align-last-line,sec:fill-last-line} discuss dearly missed macros for better control
+% of the last line of a paragraph.
+%
+% \Cref{sec:spacing-control} covers the manipulation of the length of a paragraph.
+%
+% \Cref{sec:microtype-frontend} expounds on the \packagename{microtype} front-end: font
+% tracking~(\ref{sec:tracking-control}), font expansion~(\ref{sec:font-expansion-control}), and
+% character protrusion~(\ref{sec:protrusion}).
+%
+% In \cref{sec:sloppy-paragraphs} we address some shortcomings of spacing control with a
+% replacement for the macro~\cs{sloppy} and the related environment~\code{sloppypar}.
+%
+% \Cref{sec:vtie-paragraph} presents several special functions to avoid club or widow lines in
+% a paragraph.
+%
+% As a simple extension of displayed mathematical equations we define a breakable variant in
+% \cref{sec:breakable-display}.
+%
+% \Cref{sec:setspace-frontend} introduces the \packagename{setspace} front-end.
+%
+% In the last part, \cref{sec:smooth-ragged}, we introduce a novel way of generating ragged
+% paragraphs, which still is experimental.
+%
+%
+% \subsection{Prerequisites}\label{sec:packageprerequisites}
+%
+% Package \packagename{typog} requires \eTeX; it relies on the \LaTeXIII{}~interface. Parts of
+% it are based on package~\packagename{microtype}. However, if the respective functionality is
+% not used, \packagename{typog} can be used without \packagename{microtype}. The same holds
+% true for the \packagename{setspace} front-end.
+%
+% The package was tested with \programname{pdfTeX}~3.141592653-2.6-1.40.24 from the
+% TeX~Live distribution of~2022 as shipped by
+% \href{https://packages.debian.org/search?keywords=texlive}{Debian}.
+%
+%
+% \sectionfinish
+% \clearpage
+% \section{Package Options}\label{sec:package-options}
+%
+% Package \packagename{typog} does not override any existing macros or environments when
+% loaded, unless explicitly told by a package option.
+%
+% \begin{synopsis}
+% \begin{tabbing}
+% |\usepackage[|\,\dots|]{microtype}|
+% \=\texttt{\%\space}\textit{Only required for macros and} \\
+% \>\texttt{\%\space}\textit{environments in \cref{sec:microtype-frontend}.} \\
+% \\[-.5em]
+% |\usepackage[|\,\dots|]{setspace}|
+% \=\texttt{\%\space}\textit{Only required for macros in \cref{sec:setspace-frontend}.} \\
+% \\[-.5em]
+% |\usepackage[|\meta{OPTION}\dots|]{typog}|
+% \end{tabbing}
+% \end{synopsis}
+%
+% \index{package options|(}
+% The package \meta{OPTIONs} serve as configuration \meta{key}s, too. This means they can be
+% set with \hyperref[syn:typogsetup]{\code{typogsetup}} and their values can be retrieved with
+% \hyperref[syn:typogget]{\cs{typogget}}. Options that rely on package~\packagename{microtype}
+% are indicated with \doublequotes{\microtyperequiredmarker}.
+%
+% \begin{typogsetup}{}
+% \newcommand*{\indexpackageoption}[1]
+% {\index{package option>#1=\code{#1}}\index{#1=\code{#1}~(option)}\ignorespaces}
+% \begin{description}
+% [before={\let\oldmakelabel=\makelabel
+% \renewcommand{\makelabel}[1]
+% {\oldmakelabel{\termparbox{##1}}\phantomsection}},
+% font=\normalfont,
+% style=nextline,
+% vtietop]
+% \item[|breakpenalty=|\meta{penalty}]\label{item:breakpenalty}
+% \indexpackageoption{penalty}
+% \shiftedmarginnote{This sub-section is typeset with all \packagename{typog}~parameters
+% reset to their defaults by wrapping it in a
+% \hyperref[syn:typogsetup]{\code{typogsetup}}~environment with an empty argument.}
+% Penalty for a line break at various points. Default
+% value:~\the\typogget{breakpenalty}; initialized by the current
+% \cs{exhyphenpenalty}:~\the\exhyphenpenalty.
+%
+% \item[|debug|, |nodebug|]\label{item:debug}
+% \indexpackageoption{debug}
+% \indexpackageoption{nodebug}
+% Write package-specific debug information to the log file. Opposite: |nodebug|. The
+% default is not to log debug information.
+%
+% \item[|ligaturekern=|\meta{dim}]\label{item:ligaturekern}
+% \indexpackageoption{ligaturekern}
+% Set \meta{dim} of the kern that is inserted to split a ligature in
+% macro\hyperref[syn:nolig]{\cs{nolig}}. See
+% \cref{sec:break-ligatures}.\shiftedmarginnote{We access the configuration values with
+% \hyperref[syn:typogget]{\cs{typogget}}.} Default
+% value:~\milliem{\typogget{ligaturekern}}.
+%
+% \item[|mathitalicscorrection=|\meta{dim}]\label{item:mathitalicscorrection}
+% \indexpackageoption{mathitalicscorrection}
+% Italics correction in math mode. See \cref{sec:manual-italic-correction} and also the
+% complementary configuration
+% option~\hyperref[item:textitalicscorrection]{|textitalicscorrection|}. Default
+% value:~\the\typogget{mathitalicscorrection}.\footnote{Note that 1\,mu is
+% \nativetextfraction{1}{18}\,em of the mathematical font's~em.}
+%
+% \item[|raise*=|\meta{dim}]\label{item:raise}
+% \indexpackageoption{raise*}
+% Set the length by which selected characters (dash, hyphen, times, and number dash) are
+% raised. Default value:~0pt.
+%
+% Only the raise amounts for guillemets are unaffected by this option.
+%
+% \item[|raisecapitaldash=|\meta{dim}]\label{item:raisecapitaldash}
+% \indexpackageoption{raisecapitaldash}
+% Set the length that the \cs{textendash} is raised in
+% \hyperref[syn:capitaldash]{\cs{capitaldash}}. See \cref{sec:capital-dash}. Default
+% value:~\milliem{\the\typogget{raisecapitaldash}}.
+%
+% \item[|raisecapitalhyphen=|\meta{dim}]\label{item:raisecapitalhyphen}
+% \indexpackageoption{raisecapitalhyphen}
+% Set the length that the hyphen character~\sample{-} is raised in
+% \hyperref[syn:capitalhyphen]{\cs{capitalhyphen}}. See
+% \cref{sec:capital-hyphen}.\shiftedmarginnote{This description list is protected against
+% breaking items across pages within the first three lines by
+% \hyperref[syn:vtietop]{\code{vtietop}}.} Default
+% value:~\milliem{\the\typogget{raisecapitalhyphen}}.
+%
+% \item[|raisecapitaltimes=|\meta{dim}]\label{item:raisecapitaltimes}
+% \indexpackageoption{raisecapitaltimes}
+% Set the length that the multiplication symbol~\sample{\texttimes} is raised in
+% \hyperref[syn:capitaltimes]{\cs{capitaltimes}}. See \cref{sec:mult-sign}. Default
+% value:~\milliem{\the\typogget{raisecapitaltimes}}.
+%
+% \item[|raisecapitalguillemets=|\meta{dim}]\label{item:raisecapitalguillemets}
+% \indexpackageoption{raisecapitalguillemets}
+% Set the length that single and double guillemets are raised in the uppercase versions of
+% the guillemet macros. See \cref{sec:guillemets}. Default
+% value:~\milliem{\the\typogget{raisecapitalguillemets}}.
+%
+% \item[|raiseguillemets=|\meta{dim}]\label{item:raiseguillemets}
+% \indexpackageoption{raiseguillemets}
+% Set the length that single and double guillemets are raised in the lowercase versions of
+% the guillemet macros. See \cref{sec:guillemets}. Default
+% value:~\milliem{\the\typogget{raiseguillemets}}.
+%
+% \item[|raisefiguredash=|\meta{dim}]\label{item:raisefiguredash}
+% \indexpackageoption{raisefiguredash}
+% Set the length that the \cs{textendash} is raised in
+% \hyperref[syn:figuredash]{\cs{figuredash}}. See \cref{sec:number-dash}. Default
+% value:~\milliem{\the\typogget{raisefiguredash}}.
+%
+% \item[|shrinklimits=\{|\meta{limit-1}, \meta{limit-2}, \meta{limit-3}|\}|\quad\microtyperequiredmarker\label{item:shrinklimits} \\
+% |stretchlimits=\{|\meta{limit-1}, \meta{limit-2}, \meta{limit-3}|\}|\quad\microtyperequiredmarker]\label{item:stretchlimits}
+% \indexpackageoption{shrinklimits}
+% \indexpackageoption{stretchlimits}
+% Set the three limits, given in \nativetextfraction{1}{1000}\,em, of shrinkability and
+% stretchability for the respective levels. They are used in
+% \hyperref[syn:setfontshrink]{\code{setfontshrink}} (|shrinklimits| triple only),
+% \hyperref[syn:setfontstretch]{\code{setfontstretch}} (|stretchlimits| triple only), and
+% \hyperref[syn:setfontexpand]{\code{setfontexpand}} (both triples of limits). See
+% \cref{sec:font-expansion-control}.
+%
+% New \meta{limit-\#} values replace old ones. If one or more limits of the triple should
+% remain unchanged pass a \smash{\sample{*}} instead of a number.
+%
+% \makeatletter
+% Defaults for |shrinklimits| are \mbox{\typog@default@shrink@i, \typog@default@shrink@ii,
+% \typog@default@shrink@iii} and those for |stretchlimits| are
+% \mbox{\typog@default@stretch@i, \typog@default@stretch@ii, \typog@default@stretch@iii}.
+% \makeatother
+%
+% Both options can be used when loading the package and in the document preamble, but
+% \emph{not} in the document body.
+%
+% \item[|slashkern=|\meta{dim}]\label{item:slashkern}
+% \indexpackageoption{slashkern}
+% Set the size of the kerns before and after \hyperref[syn:kernedslash]{\cs{kernedslash}}.
+% See \cref{sec:slash-with-kern}. Default value:~\milliem{\typogget{slashkern}}.
+%
+% \item[|textitalicscorrection=|\meta{dim}]\label{item:textitalicscorrection}
+% \indexpackageoption{textitalicscorrection}
+% Italics correction fallback-value; used if \cs{fontdimen1} is zero. See
+% \cref{sec:manual-italic-correction} on manual italic correction and also the
+% complementary configuration
+% option~\hyperref[item:mathitalicscorrection]{|mathitalicscorrection|}. Default
+% value:~\milliem{\typogget{textitalicscorrection}}.
+%
+% \item[|trackingttspacing=|\code{\{\meta{outer-spacing}\}}\quad\microtyperequiredmarker]\label{item:trackingttspacing}
+% \indexpackageoption{trackingttspacing}
+% Set the outer spacing of all typewriter fonts if used in environment~\code{settracking}
+% as described in \cref{sec:tracking-control}.
+%
+% The argument \meta{outer-spacing} gets passed to \packagename{microtype}'s
+% \cs{SetTracking} option~\code{outer spacing}~\cite[Sec.~5.3]{package:microtype}. If it
+% contains commas, enclose the whole argument in curly braces. Default argument
+% value:~\mbox{\typogget{trackingttspacing}}.
+%
+% The option can be used when loading the package and in the document preamble, but
+% \emph{not} in the document body.
+%
+% By default this option is unset.
+% \end{description}
+% \end{typogsetup}
+% \index{package options|)}
+%
+%
+% \sectionfinish
+% \clearpage
+% \section{Macros and Environments}\label{sec:macros-and-envs}
+%
+% \begin{whittyquote}
+% Easy things should be easy, and \\
+% hard things should be possible. \\
+% \capitalemdash*~\propername{Larry Wall}
+% \end{whittyquote}
+%
+% \noindent
+% This is the \doublequotes{User Manual}~section of the documentation, where we describe all
+% user-relevant macros and environments that are defined in package~\packagename{typog}.
+%
+% We follow the naming convention that every environment whose name ends with \code{\dots par}
+% issues a \cs{par} at its end. Environments with different name suffixes never close
+% with~\cs{par}.
+%
+% \bigskip
+%
+% \noindent
+% \DescribeEnv{typogsetup}
+% Configure\index{configuration}\index{setup} the package with the given \meta{keys}. An empty
+% argument of \code{typogsetup} resets all \meta{keys} to their default values.
+%
+% \begin{synopsis}\label{syn:typogsetup}
+% \cs{begin}|{typogsetup}|\marg{keys}
+% \dots{}
+% \cs{end}|{typogsetup}|
+% \end{synopsis}
+%
+% The package can be (re-)configured\index{reconfigure} at any point with
+% \cs{typogsetup}\marg{keys}, or --~for localized changes~-- as
+%
+% \begin{codeexample}
+% 12\=\kill
+% \cs{begin}|{typogsetup}|\marg{keys} \\
+% \> \dots \\
+% \cs{end}|{typogsetup}|
+% \end{codeexample}
+%
+% \noindent
+% where \meta{keys} have the same format as the package options described in
+% \cref{sec:package-options}.
+%
+% \begin{usecases}
+% \cs{typogsetup} can substitute configuring the package at load-time or serve as an
+% addition.~\visualpar Using the |typogsetup|~environment allows to fine-tune the parameters
+% for a specific use, e.\,g., display-sized text.~\visualpar It even is conceivable that a
+% well-established \packagename{typog}-configuration gets attached to font-changing macros
+% like \cs{rm}, \cs{sf},~etc.
+% \end{usecases}
+%
+%
+% \noindent
+% \DescribeMacro{\typogget}
+% Sometimes the user needs to access internal configuration values of
+% package~\packagename{typog}. This can be done in a safe way without resorting to code that
+% is bracketed by \cs{makeatletter}/\cs{makeatother} with the help of the following macro.
+%
+% \begin{synopsis}\label{syn:typogget}
+% \cs{typogget}\marg{key}
+% \end{synopsis}
+%
+% Retrieve the configuration value that is associated with~\meta{key}. For a list of available
+% \meta{key}s see~\cref{sec:package-options}.
+%
+% \begin{usecase}
+% Raise glyphs by the same amount as configured with \packagename{typog}.
+%
+% \begin{codeexample}
+% 12\=\kill
+% \cs{newcommand*}\{\cs{seesubst}\} \\
+% \> \{\cs{raisebox}\= \{\cs{typogget}\{raisecapitalguillemets\}\}\% \\
+% \> \> \{\cs{rightarrowhead}\}\} \\
+% \cs{renewcommand*}\{\cs{labelitemi}\} \\
+% \> \{\cs{raisebox}\= \{\cs{typogget}\{raisecapitaldash\}\}\{\cs{cdot}\}\}
+% \end{codeexample}
+%
+% The latter only is useful inside of an \code{itemize}~environment of course.
+% \end{usecase}
+%
+%
+% \subsection{Information}\label{sec:information}\index{information}
+%
+% \begin{whittyquote}
+% Never forget: The visual output counts; \\
+% it must always be checked, [\dots]. \\
+% \marginnote{The em-dash at then end of the quote is height-adjusted with
+% \hyperref[syn:capitalemdash]{\cs{capitalemdash*}}.}%
+% \capitalemdash*~\propername{Udo Wermuth}~\cite{wermuth:2017a}
+% \end{whittyquote}
+%
+% \noindent
+% We define some functions for introspection of the typesetting process.
+%
+%
+% \subsubsection{Font Information}\label{sec:font-information}
+% \index{font>information}
+%
+% \DescribeMacro{\fontsizeinfo}
+% Capture the font~size\footnote{We use \cs{fontdimen6}, the em-height as the font
+% size.}\index{font>size} and line~spacing\footnote{The line~spacing simply is
+% \cs{baselineskip}.}\index{line spacing} at the point where \cs{fontsizeinfo} \emph{is called}
+% in macro~\meta{cs-name}. Both dimensions are measured in points~(pt) and the results are
+% rounded to tenths.
+%
+% \begin{synopsis}\label{syn:fontsizeinfo}
+% \cs{fontsizeinfo}\marg{cs-name}
+% \end{synopsis}
+%
+% The call to \cs{fontsizeinfo} introduces a pair of macros to access the stored values. The
+% unstarred version~\cs{cs-name} expands to the lengths including their units (i.\,e.,~pt), the
+% starred version~\cs{cs-name*} omits the units. The separating slash is
+% \hyperref[syn:kernedslash]{\cs{kernedslash}}, which is introduced in
+% \cref{sec:slash-with-kern}.
+%
+% \begin{note}
+% The \cs{baselineskip} can contain a rubber (stretch/shrink) component, however,
+% \cs{fontsizeinfo} will not display these parts.
+% \end{note}
+%
+% \begin{usecases}
+% Colophon.~\visualpar Font test pages.
+% \end{usecases}
+%
+%
+% \subsubsection{Paragraph- and Page-Breaking Trace}\label{sec:paragraph-and-pagebraking-trace}
+%
+% \DescribeEnv{typoginspect}
+% \DescribeEnv{typoginspectpar}
+% The environments |typoginspect| and |typoginspectpar| turn on the tracing of paragraphs and
+% pages; optionally they display the parbox' contents. These environments can assist the user
+% in identifying typographic problems in a quantitative way without getting distracted by
+% unrelated information in the trace or the \filesystem{log}-file.
+%
+% \begin{synopsis}\label{syn:typoginspect}
+% \cs{begin}|{typoginspect}|\oarg{option}\marg{id}
+% \dots{}
+% \cs{end}|{typoginspect}| \\[\smallskipamount]
+% \cs{begin}|{typoginspectpar}|\oarg{option}\marg{id} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{typoginspectpar}|
+% \end{synopsis}
+%
+% The \meta{id} is an arbitrary string that identifies the results in the
+% \filesystem{log}-file. If the mandatory argument is empty, \packagename{typog} constructs a
+% unique value.
+%
+%
+% \paragraph{Option}
+%
+% \begin{description}[style=nextline]
+% \item[|tracingboxes|{[}=\meta{size}{]}]
+% Specify the maximum box breadth and box depth reported in the log. If \meta{size} is
+% omitted the maximum values are assumed; this is similar to the \cs{tracingboxes}
+% macro~\cite[p.~312]{abrahams:2020}.
+% \end{description}
+%
+% \begin{caution}
+% The end-of-trace marker sometimes gets placed too early and the trace seems truncated.
+% \LaTeX{} reliably logs the requested the trace information, but the write operations for
+% trace data and \cs{immediate}\cs{write} which is used to print the end-tag are not
+% synchronized.
+% \end{caution}
+%
+%
+% \paragraph{\LaTeX{} \filesystem{log}-file and trace.}
+% The trace data in the \filesystem{log}-file is bracketed by \acronym{XML}-tags.
+%
+% \begin{widecodeexample}
+% <typog-inspect\textvisiblespace
+% id="\meta{id}"\textvisiblespace
+% job="\meta{jobname}"\textvisiblespace
+% line="\meta{line-number}"\textvisiblespace
+% page="\meta{page-number}"> \\
+% ~~\dots \\
+% </typog-inspect>
+% \end{widecodeexample}
+%
+% \noindent
+% where the \meta{id} is the user-supplied, unique\footnote{It has turned out advantageous to
+% use unique \meta{id}s. However, \meta{id}s are \emph{not required} to be distinct.}
+% identifier of the group, \meta{jobname} is the value of \cs{jobname}, \meta{line-number}
+% records the \cs{inputlineno} of the \cs{begin}~of the group, and \meta{page-number} gets
+% replaced with the current value of the page counter.
+%
+% \begin{itemize}[noindent]
+% \item Any text tool can be used to ferret out the tags. \propername{Emacs} users will find
+% \mbox{\code{(occur \meta{regexp})}} to be useful.
+%
+% \item As long as the tags are not nested \programname{sed} or \programname{perl}
+% extract the information gathered by~|typoginspect|, for example:
+%
+% \begin{codeexample}
+% sed \= -ne '/<typog-inspect\textvisiblespace id="\dots"/,\textbackslash\#</typog-inspect>\#p' \\
+% \> < jobname.log
+% \end{codeexample}
+%
+% or
+%
+% \begin{codeexample}
+% perl \= -ne '\= \$a=0 if /<\textbackslash/typog-inspect>/; \textbackslash \\
+% \>\> print \$\_ if \$a; \textbackslash \\
+% \>\> \$a=1 if /<typog-inspect\textvisiblespace id="\dots"/' \textbackslash \\
+% \> < jobname.log
+% \end{codeexample}
+%
+% \item The companion program~\programname{typog-grep} is tailored to extract the information
+% marked up by |typoginspect| and~|typoginspectpar| even if the environments are nested.
+%
+% We reproduce the complete manual page of \programname{typog-grep} in \Cref{app:typog-grep}.
+% \end{itemize}
+%
+% \begin{tips}
+% \begin{itemize}[nestedinspecialsection, notopsep]
+% \item It may be necessary to run whatever \LaTeX~engine with a larger log-file line length,
+% to prevent wrapped lines. With short lines the wannabe \acronym{XML} opening tags can
+% get wrapped and thus become unrecognizable to dumb postprocessors. To avoid wrapped
+% lines prepend
+%
+% \begin{codeexample}
+% /usr/bin/env max\_print\_line=2147483647
+% \end{codeexample}
+%
+% to the command-line. The value~\(2147483647 = 2^{31} - 1\) effectively disables all line
+% wrapping by \LaTeX.
+%
+% As both \command{pdflatex} and \command{lualatex} support changing their configuration on
+% a by-call basis with option~\code{-cnf-line=\meta{STRING}} an alternative to the above
+% example is to add
+%
+% \begin{codeexample}
+% -cnf-line=max\_print\_line=2147483647
+% \end{codeexample}
+%
+% to the respective command-line.
+%
+% \item If more trace information is needed just add \cs{tracing\dots} calls right after
+% \code{\string\begin\{typoginspect\}}
+% or~\code{\string\begin\{typoginspectpar\}}.\specialsectionendhere
+% \end{itemize}
+% \end{tips}
+%
+%
+% \phantomsection
+% \paragraph{Investigating the badness of a paragraph.}\label{sec:investigating-paragraph-badness}\index{paragraph>badness}
+%
+% It is generally unnecessary to determine the \emph{exact} classification of a paragraph's
+% badness~\cite[p.~97n]{knuth:1986}, though the curious user can switch on logging of
+% \TeX's~line-break information with
+% \cs{tracingparagraphs}|=1|\footnote{Reference~\citenum{wermuth:2016} provides an
+% exceptionally detailed discussion of the output of \cs{tracingparagraphs}.} or simply use
+% the \hyperref[syn:typoginspect]{typoginspect}~environment and check the suffixes
+%
+% \begingroup
+% \centering
+% |@@|\meta{breakpoint-number} |line| \meta{line-number}|.|\meta{suffix}
+% \par
+% \endgroup
+%
+% \noindent
+% of each line in the paragraph, where for \meta{suffix} the following mapping
+% holds~\cite[p.~99]{knuth:1986}:
+% \begin{equation*}
+% 0 \mapsto \text{very loose},\quad
+% 1 \mapsto \text{loose},\quad
+% 2 \mapsto \text{decent, and}\quad
+% 3 \mapsto \text{tight}.
+% \end{equation*}
+%
+% \begin{example}
+% \let\oldsample=\sample
+% \renewcommand*{\sample}[1]{\oldsample{\texttt{#1}}}
+% \par\medskip
+% \noindent
+% |@@17: line 15.1- t=142289 s=93.58414 a=2.86073 -> @@16|
+%
+% \begin{enumerate}[noitemsep]
+% \item The feasible breakpoint~\sample{@@} number~17 in the paragraph leads to
+% \item \sample{line}~15, which is the loose~\sample{.1} last~\sample{-} line of the
+% paragraph.
+% \item Up to this breakpoint the paragraph has picked up total demerits~\sample{t}
+% of~142289.
+% \item The following two values only show up if\/ \(\cs{lastlinefit} \not= 0\):
+% \begin{enumerate}[beginpenalty=10000, nosep]
+% \item The shortfall~\sample{s} and
+% \item glue~\sample{a} or~\sample{g}.\footnote{The author is unaware of any descriptions
+% of \code{s}, \code{a}, or~\code{g}. The interested reader is referred to the source
+% code, e.\,g., \filesystem{pdftex.web}; search for \code{print("\textvisiblespace s=")}.
+% In the weaved documentation the first relevant section is~\S1851.}
+% \end{enumerate}
+% \item The best\footnote{\singlequotes{Best} means the minimum-demerits path in the graph of
+% the feasible breakpoints, which has been constructed for the paragraph.} way to get
+% here, i.\,e., |@@17| is via~\sample{->} breakpoint~\sample{@@}~16.\specialsectionendhere
+% \end{enumerate}
+% \end{example}
+%
+% \begin{note}
+% When package~\packagename{microtype}'s font expansion feature jumps in the reports on
+% \doublequotes{Loose \textbackslash hbox (badness \dots)} and \doublequotes{Tight
+% \textbackslash hbox (badness \dots)} \shiftedmarginnote{All of our guillemets were raised
+% by \milliem{\the\typogget{raiseguillemets}}.} contain the amount of shrinking or expansion
+% as parenthesized values (units are thousandths of the current font's~em) like, e.\,g.,
+%
+% \begin{codeexample}
+% \textbackslash T1/erewhon-LF/m/n/9/@/@ (-13) \dots
+% \end{codeexample}
+%
+% or
+%
+% \begin{codeexample}
+% \textbackslash T1/erewhon-LF/m/n/9/@/@/10ls (+7) \dots
+% \end{codeexample}
+%
+% An \sample{ls} appended to the font name specification indicates that
+% \packagename{microtype}'s letter~spacing feature is active and changed the tracking by that
+% many thousands on an em as indicated before~\sample{ls}.
+% \end{note}
+%
+%
+% \paragraph{Investigating page-breaks.}\index{page break}
+%
+% Use \code{\cs{tracingpages}=1} or the \hyperref[syn:typoginspect]{typoginspect}~environment
+% to switch on tracing of \TeX's page-break
+% information~\cite[p.~112n]{knuth:1986}.\footnote{See also the discussion of the \TeX~output
+% routines by \propername{Solomon}~\cite{solomon:1990}.}
+%
+% The first time vertical material enters a new page, \TeX{} logs
+%
+% \begingroup\tt
+% \centering
+% \%\% goal height=\meta{text-height}, max depth=\meta{max-depth} \\
+% \par
+% \endgroup
+%
+% \noindent
+% where \meta{text-height} is the total height \TeX{} wants to achieve and~\meta{max-depth} is
+% the maximum depth of the hbox in the last line of the page is allowed to have without
+% considering \meta{text-height} to be exceeded. For example:
+%
+% \begingroup\tt
+% \centering
+% \%\% goal height=598.0, max depth=5.0 \\
+% \par
+% \endgroup
+%
+% For every vertical breakpoint \TeX{} records
+%
+% \begingroup\tt
+% \centering
+% \% t=\meta{total-height} g=\meta{goal-height} b=\meta{badness} p=\meta{penalty} c=\meta{cost}
+% \par
+% \endgroup
+%
+% Here, \meta{total-height} and \meta{goal-height} are the current total height of the page and
+% the current goal height to achieve with respect to this vertical breakpoint.
+%
+% The value of \meta{penalty} and \meta{cost} can be infinite, which would be indicated with an
+% asterisk~\sample{\texttt{*}} instead of a numerical value. The best vertical breakpoint
+% found so far on the current page is indicated by a trailing sharp-sign~\sample{\texttt{\#}}.
+%
+% \begin{example}
+% \let\oldsample=\sample
+% \renewcommand*{\sample}[1]{\oldsample{\texttt{#1}}}
+% \begin{widecodeexample}
+% \% t=351.3 plus 11.0 minus 1.0 g=553.9 b=10000 p=-300 c=100000\#
+% \end{widecodeexample}
+%
+% \begin{enumerate}[noitemsep, notopsep]
+% \item At this vertical breakpoint the total page height~\sample{t} is 351.3\,pt. We have
+% picked up glue with 11\,pt~stretchability and~1\,pt~shrinkability along the way.
+%
+% \item The current goal height~\sample{g} is 553.9\,pt. If the initial goal height was
+% 598\,pt we can deduce that some space for other vertical material was subtracted.
+%
+% \item The badness~\sample{b} of this vertical break is horrendous which is expected for the
+% first lines on a page since breaks so early are rightfully considered infinitely bad.
+%
+% \item The penalty~\sample{p} at this point actually is a bonus.
+%
+% \item As the badness is 10000 the cost for a break is calculated
+% to~100000.\specialsectionendhere
+% \end{enumerate}
+% \end{example}
+%
+%
+% \subsection{Hyphenation}\label{sec:latex-hyphenation}
+% \index{hyphenation}
+%
+% \TeX's and thus \LaTeX's hyphenation algorithm is highly sophisticated, yet the document
+% author sometimes lacks convenient macros to solve seemingly trivial typographic tasks. For
+% example, to hyphenate a compound~word connected by a hyphen.
+%
+% \DescribeMacro{\allowhyphenation}
+% \TeX{} inhibits breaks of the component words by default. The following macro rectifies the
+% problem.
+%
+% \begin{synopsis}
+% \cs{allowhyphenation}
+% \end{synopsis}
+%
+% Macro~\cs{allowhyphenation}\index{hyphenation>re-enable automatic} re-enables automatic
+% hyphenation after \TeX{} has turned it off, for example, in the innocuous case of a
+% hyphenated compound.
+%
+% The admittedly simple rules when \TeX{} auto-hyphenates and when not give rise to so many
+% different, yet interesting cases that we devote \cref{tab:hyphens-and-hyphenations} to them.
+% \begingroup
+% \let\textfrac=\nativetextfraction
+% The seemingly special cases shown there are not that uncommon, e.\,g., consider
+% \singlequotes{\mbox{spin-\textfrac{1}{2}}} which is coded as |\mbox{spin-\textfrac{1}{2}}|.
+% A line break between the text and the fraction would garble the term.
+% \endgroup
+%
+% \begin{usecases}
+% All examples from the bottom of \cref{tab:hyphens-and-hyphenations} on
+% \cpageref{tab:hyphens-and-hyphenations}.~\visualpar
+%
+% Fix line breaks of index-entries in a narrow index:
+%
+% \begin{codeexample}
+% Halbgruppe, Transformations\cs{allowhyphenation}\cs{mbox}\{-\}\cs{,}-\nolig*-\nolig*-
+% \end{codeexample}
+%
+% \noindent
+% The first part, \singlequotes{Transformations} is allowed to be hyphenated, but a break
+% after the hyphen is prohibited as it results in a prowling em-dash at the beginning of the
+% next line.~\visualpar
+%
+% Re-enable hyphenation when a macro decays into a \cs{hbox}:
+%
+% \begin{codeexample}
+% Einselement\cs{allowhyphenation}\cs{rlap}\{,\}\cs{footnote}\{\dots\}
+% \end{codeexample}
+%
+% where \cs{rlap} is equivalent to something like
+% \code{\cs{makebox}[0pt]\{\#1\cs{hss}\}}.~\visualpar
+%
+% Use \cs{allowhyphenation} to turn on hyphenation of the first word of a paragraph as,
+% e.\,g., in a narrow index or a \cs{marginpar}:
+%
+% \begin{codeexample}
+% \cs{marginpar}\{\cs{allowhyphenation} Kontakttransformationen\}
+% \end{codeexample}
+%
+% \noindent
+% A common trick to sweet-talk \TeX{} into hyphenating the first word of a paragraph is to
+% put \cs{hskip0pt} in front of it.
+% \end{usecases}
+%
+% \begin{table}\small
+% \centering
+% \caption[Hyphens and automatic hyphenation]
+% {\TeX{} offers plenty of possibilities to hyphenate a compound.~\visualpar We use
+% the sample \singlequotes{hyphenated-compound} to show various code examples and
+% the results that they produce. The parts are automatically hyphenated like this:
+% \singlequotes{hyphenated}~\(\rightarrow\) \singlequotes{hy-phen-ated} and
+% \singlequotes{compound}~\(\rightarrow\) \singlequotes{com-pound}.}
+% \label{tab:hyphens-and-hyphenations}
+%
+% \begin{nofontexpansion}
+% \newcommand*{\zbox}[1]
+% {\hfuzz=\maxdimen
+% \overfullrule=0pt
+% \raisebox{\normalbaselineskip}{\parbox[t]{0pt}{\hspace{0pt}#1}}}
+%
+% \sbox{\listlabelbox}{hyphenated-compound}
+% \begin{tabularx}{\linewidth}{@{}p{12em}l>{\fussy\RaggedRight}X@{}}
+% \toprule
+% \LaTeX-Code & \makebox[\wd\listlabelbox][l]{Result} & Note \\
+% \midrule
+% \code{hyphenated-compound} &
+% \zbox{hyphenated-compound} &
+% Most frequently used code; the hyphen~\sample{\code{-}} expands to
+% \code{\cs{discretionary}\mbox{\{-\}\{\}\{-\}}} rendering the parts un-breakable \\
+%
+% \code{hyphenated\cs{mbox}\{-\}\%}\newline
+% \code{compound} &
+% \zbox{hyphenated\mbox{-}compound} &
+% Suppress hyphenation with the \cs{mbox} in the compound \\
+%
+% \code{\cs{mbox}\{hyphenated-\%}\newline
+% \code{compound\}} &
+% \zbox{\mbox{hyphenated-compound}} &
+% Avoid line break and thus hyphenation \\
+%
+% \midrule
+%
+% \code{hyphenated\cs{hyp}}\newline
+% \code{compound} &
+% \zbox{hyphenated\hyp compound} &
+% Macro~\cs{hyp} defined in package
+% \packagename{hyphenat}~\cite{package:hyphenat} \\
+%
+% \addlinespace
+% \midrule
+%
+% \code{hyphenated\%}\newline
+% \cs{allowhyphenation}\code{-\%}\newline
+% \code{compound} &
+% \zbox{hyphenated\allowhyphenation-compound} &
+% Macro~\cs{allowhyphenation} of package~\packagename{typog}; only unblock
+% hyphenation of the first part \\
+%
+% \code{hyphenated-\%}\newline
+% \cs{allowhyphenation}\newline
+% \code{compound} &
+% \zbox{hyphenated-\allowhyphenation compound} &
+% Macro~\cs{allowhyphenation} of package~\packagename{typog}; only unblock
+% hyphenation of the second part \\
+%
+% \code{hyphenated\%}\newline
+% \cs{allowhyphenation}\newline
+% \cs{mbox}\code{\{-\}\%}\newline
+% \code{compound} &
+% \zbox{hyphenated\allowhyphenation\mbox{-}compound} &
+% Macro~\cs{allowhyphenation} of package~\packagename{typog}; hyphenate first
+% part and keep the original hyphen unbreakable \\
+%
+% \code{hyphenated\%}\newline
+% \cs{allowhyphenation}\code{-\%}\newline
+% \cs{allowhyphenation}\newline
+% \code{compound} &
+% \zbox{hyphenated\allowhyphenation-\allowhyphenation compound} &
+% Macro~\cs{allowhyphenation} of package~\packagename{typog}; hyphenate both
+% parts, similar to \cs{hyp} shown above \\
+%
+% \addlinespace
+% \bottomrule
+% \end{tabularx}
+% \end{nofontexpansion}
+% \end{table}
+%
+% \noindent
+% Whenever using \cs{-}, the short-hand form of \cs{discretionary\{-\}\{\}\{\}}, authors
+% writing in a foreign language should reconsider whether it really beats \cs{hyphenation} or
+% \cs{babelhyphenation}\footnote{\cs{babelhyphenation} is the multi-lingual extension of \TeX's
+% \cs{hyphenation} and it is defined in package~\packagename{babel}~\cite{package:babel}}. in
+% the particular situation. However, sometimes \cs{-} actually \emph{is} the way to go.
+%
+% Let us assume we mark up proper names with
+%
+% \begin{codeexample}
+% \cs{DeclareRobustCommand}*\= \{\cs{propername}\}[1] \\
+% \> \{\cs{mbox}\{\cs{textsc}\{\#1\}\}\}
+% \end{codeexample}
+%
+% \noindent
+% and we want to have hyphenatable \foreignphrase{\doublequotes{\propername{Abel}sche Gruppe}}
+% or \foreignphrase{\doublequotes{\propername{Euklid}ischer Vektorraum}} without dropping the
+% markup. To that end we define commands that insert a hyphenation point at the right place:
+%
+% \begin{codeexample}
+% \cs{newcommand*}\= \{\cs{abelsche}\} \\
+% \> \{\cs{propername}\{Abel\}\cs{-}sche\} \\
+% \cs{newcommand*}\> \{\cs{euklidischer}\} \\
+% \> \{\cs{propername}\{Euklid\}i\cs{-}scher\}
+% \end{codeexample}
+%
+% \noindent
+% which are impossible to encode with \cs{hyphenation} or~\cs{babelhyphenation} as these expect
+% only letters and dashes as their arguments with spaces separating the words.
+%
+% \begin{tip}[Typewriter Fonts]
+% Sometimes it is desired to get a hyphenatable typewriter font. \LaTeX{} suppresses any
+% hyphenation for fonts in \cs{ttfamily} by un-defining their \cs{hyphenchar}s. If these are
+% reassigned, the usual hyphenation occurs again.
+%
+% So, a fictitious macro `\cs{code}' to typeset short pieces of code could look like this:
+%
+% \begin{codeexample}
+% \cs{newcommand*}\= \{\cs{code}\}[1] \\
+% \> \{\{\= \cs{ttfamily} \\
+% \> \> \cs{hyphenchar}\cs{font}=`\cs{-}\cs{relax} \#1\}\}\specialsectionendhere
+% \end{codeexample}
+% \end{tip}
+%
+% \DescribeMacro{\breakpoint}
+% \DescribeMacro{\breakpoint*}
+% The empty discretionary construct~\cite[p.~95]{knuth:1986}, \cs{discretionary\{\}\{\}\{\}},
+% is so helpful that it deserves its own macro --~with a descriptive name.
+%
+% \begin{synopsis}
+% \cs{breakpoint} \\
+% \cs{breakpoint*}
+% \end{synopsis}
+%
+% The starred form inserts an empty discretionary,\index{hyphenation>empty discretionary} which
+% disables automatic hyphenation. The unstarred form inserts an empty discretionary and
+% immediately re-enables automatic hyphenation.
+%
+% The difference between \cs{breakpoint} and the \LaTeX{} macro~\cs{allowbreak} is not only
+% that the former has a starred form, but the penalty associated with \cs{breakpoint} is the
+% current\footnote{At this point in the document
+% \code{\string\exhyphenpenalty=\the\exhyphenpenalty} holds.} \cs{exhyphenpenalty}, whereas
+% \cs{allowbreak} statically assigns a zero~penalty.
+%
+% \begin{usecase}
+% Prefixes that end in a hyphen inside of a pair of parenthesis:
+%
+% \begin{codeexample}
+% \cs{mbox}\{(pre-)\}\cs{breakpoint*} \cs{propername}\{Hilbert\} space\specialsectionendhere
+% \end{codeexample}
+% \end{usecase}
+%
+% \DescribeEnv{hyphenmin}
+% \sinceversion{Since v0.3}
+% Set the values of \cs{lefthyphenmin} and \cs{righthyphenmin} confined to an environment.
+%
+% \begin{synopsis}\label{syn:hyphenmin}
+% \cs{begin}|{hyphenmin}|\oarg{left-hyphen-minimum}\marg{hyphen-minimum} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{hyphenmin}|
+% \end{synopsis}
+%
+% Without optional argument |hyphenmin| sets both \cs{lefthyphenmin} and \cs{righthyphenmin} to
+% \meta{hyphen-minimum}. When called with an optional argument it sets \cs{lefthyphenmin} to
+% \meta{left-hyphen-minimum} and \cs{righthyphenmin} to \meta{hyphen-minimum}.\footnote{The
+% current values for \cs{lefthyphenmin} and \cs{righthyphenmin} in this document
+% are~\the\lefthyphenmin{} and~\the\righthyphenmin, respectively.}
+%
+% \begin{usecase}
+% If the hyphen minimums were \emph{increased} e.\,g.~in the preamble: Reduce the hyphen
+% minimum in the index or other multi-column environments with narrow lines to regain
+% hyphenation possibilities.~\visualpar Use a large \meta{hyphen-minimum} to disable
+% hyphenation.
+% \end{usecase}
+%
+%
+% \subsection{Disable\kernedslash Break Ligatures}\label{sec:break-ligatures}
+% \index{ligature}
+%
+% \DescribeMacro{\nolig*}
+% Break a ligature without introducing a hyphenation opportunity.
+%
+% \begin{synopsis}\label{syn:nolig-star}
+% \cs{nolig*}\oarg{kerning}
+% \end{synopsis}
+%
+% Inserting \cs{nolig*} disables a ligature at the given point by a kern. Set the size of the
+% kern\index{kerning>ligature} with \hyperref[item:ligaturekern]{|ligaturekern|} or override
+% this value with \meta{kerning} as thousandths of the current font's~em.
+%
+% \begin{usecases}
+% \cs{nolig*} can be useful in headings, where additional hyphenation points are
+% unwelcome.~\visualpar In fonts with an overly rich set of ligatures \cs{nolig*} offers a
+% straightforward means to suppress unwanted ligatures at non-hyphenatable
+% positions.~\visualpar Rectify the appearance of a pseudo ligature, i.\,e., two adjacent
+% characters that look like a ligature, but actually are not.
+% \end{usecases}
+%
+% \noindent
+% \DescribeMacro{\nolig}
+% Break a ligature and introduce a hyphenation opportunity.
+%
+% \begin{synopsis}\label{syn:nolig}
+% \cs{nolig}\oarg{kerning}
+% \end{synopsis}
+%
+% Inserting \cs{nolig} disables a ligature at the given point as \cs{nolig*} does \emph{and}
+% introduces a hyphenation opportunity with
+% penalty~\hyperref[item:breakpenalty]{|breakpenalty|}.
+%
+% \begin{important}[\packagename{hyperref} bookmarks]\index{hyperref=\packagename{hyperref} (package)}
+% If a \cs{nolig} --~whether starred or un-starred~-- occurs in an argument that is processed
+% with package~\packagename{hyperref} for inclusion into the document's
+% \acronym{PDF}-bookmarks\index{PDF=\acronym{PDF}}\index{bookmark} an additional argument is
+% necessary to parse the macro. This argument either is \cs{relax} or~the empty
+% group~(\code{\{\}}).
+%
+% \begin{synopsis}
+% \begin{tabbing}
+% \cs{nolig*}\oarg{kerning}\cs{relax}\qquad\= \cs{nolig}\oarg{kerning}\cs{relax} \\
+% \cs{nolig*}\oarg{kerning}\code{\{\}}\> \cs{nolig}\oarg{kerning}\code{\{\}}
+% \end{tabbing}
+% \end{synopsis}
+%
+% The prototypical places where this processing-for-\acronym{PDF}-bookmarks happens are the
+% sectioning macros, e.\,g., \cs{chapter}, \cs{section}, \cs{subsection},~etc.
+%
+% \LaTeX{} will bail out with an error if the extra argument is not passed to \cs{nolig} in
+% these situations.
+%
+% Alternatively use \cs{texorpdfstring}~\cite[Sec.~4.1.2, p.~22]{package:hyperref}.
+% \end{important}
+%
+% \begin{usecases}
+% \cs{nolig} can be used with just about any ligature that needs to be split into its
+% parts.~\visualpar It also has proven beneficial in separating pairs of characters that are
+% kerned to tightly (e.\,g.~the \sample{ij}, as in bi\itcorr{2}jection, which is particularly
+% distractive here, for it occurs at the boundary of two syllables).
+% \end{usecases}
+%
+%
+% \subsection{Manual Italic Correction}\label{sec:manual-italic-correction}\label{italic correction}
+%
+% \DescribeMacro{\itcorr}
+% \DescribeMacro{\itcorr*}
+% The italic correction offered by \TeX{} or \LaTeX{} sometimes needs a helping hand.
+%
+% \begin{synopsis}\label{syn:itcorr}
+% \cs{itcorr}\marg{strength} \\
+% \cs{itcorr*}\marg{strength}
+% \end{synopsis}
+%
+% In text mode macro~\cs{itcorr} inserts a kern whose width is proportional to \cs{fontdim1},
+% which is the font's italic correction. If \cs{fontdim1} happens to be zero (e.\,g.~for an
+% upright font), \cs{itcorr} uses the value set with
+% \hyperref[item:textitalicscorrection]{\code{textitalicscorrection}} instead of \cs{fontdim1}.
+% The starred version always uses
+% \hyperref[item:textitalicscorrection]{\code{textitalicscorrection}}. In math mode
+% macro~\cs{itcorr} uses the value set with
+% \hyperref[item:mathitalicscorrection]{\code{mathitalicscorrection}}\footnote{Separate
+% adjustments may be desirable if the math font's italics have markedly different slants.} in
+% both the starred and the unstarred form.
+%
+% Typical slant angles of serif italics fonts range from 8\textdegree{} to~18\textdegree{} and
+% thus values for |textitalicscorrection| from .14 to~.32. Note: \meta{strength} can be
+% negative and fractional \meta{strength}s are allowed.
+%
+% \begin{usecases}
+% Stronger or weaker correction than |\/|.~\visualpar Correct a non-slanted or non-italicized
+% font.~\visualpar Negative correction at the left-hand side\footnote{Groff has the machinery
+% for left-italic-correction. Its font-metrics files support per glyph
+% left-italic-correction values and users can access them conveniently via~\sample*{\cs{,}}.}
+% of italics, i.\,e., compensate \doublequotes{shift-to-the-right effect} of
+% italics.~\visualpar Positive correction at the left-hand side of italics, e.\,g., an
+% opening parenthesis or square bracket followed by an
+% italic~\sample{\itshape\itcorr{8}f\itcorr{7}} (before:~8, after:~7) or
+% \sample{\itshape\itcorr{4}y\itcorr{1}} (before:~4, after:~1) reaching far to the left below
+% the baseline.
+% \end{usecases}
+%
+%
+% \paragraph{The \meta{strength} parameter explained.}
+%
+% \TeX{} records the slant angle~\(\alpha\) of a font in \cs{fontdim1} as \(\mbox{1\,pt} \times
+% \sin\alpha\). Rephrased the formula means: \emph{How much horizontal space is required for a
+% letter slanted with ~\(\alpha\) that is 1\,pt high?} So, \cs{itcorr}\marg{strength}
+% calculates
+% \begin{displaymath}
+% \meta{strength} \times \mbox{1\,pt} \times \sin\alpha.
+% \end{displaymath}
+%
+% A well-chosen \meta{strength} should be the absolute minimum value which avoids that the
+% glyphs typeset in italics collide with other --~usually non-italics~-- letters or symbols
+% unless this disturbs the consistency of the overall tracking.
+%
+% Correction of the right-hand side and \mbox{\(\alpha > 0\)}: A reasonable first guess of
+% \meta{strength} is the highest point where the rightmost part of the letter would touch a
+% rule angled at \(\alpha\) with respect to the baseline. The correction of the left-hand side
+% and \mbox{\(\alpha > 0\)} considers the lowest \singlequotes{touching} point below the
+% baseline on the left-hand side of the letter. Negative values of \(\alpha\) exchange the
+% reference points.
+%
+% \iffalse
+%<*slantangle>
+prologues := 3;
+truecorners := 1;
+linecap := butt;
+
+input TEX;
+TEXPRE("%&latex" & char(10) & "\documentclass{article}\begin{document}");
+TEXPOST("\end{document}");
+
+string roman_font;
+roman_font := "pplr8r"; % URW Palladio L - Roman
+
+string italics_font;
+italics_font := "pplri8r"; % URW Palladio L - Italic
+
+u := 360;
+
+font_scale := 10;
+
+pair loc[];
+loc[1] := .2[origin, (u, 0)];
+loc[2] := .5[origin, (u, 0)];
+loc[3] := .8[origin, (u, 0)];
+
+picture letter_H;
+letter_H := thelabel.top("H" infont italics_font scaled font_scale, loc[1]);
+
+picture letter_L;
+letter_L := thelabel.top("L" infont italics_font scaled font_scale, loc[2]);
+
+picture letter_a;
+letter_a := thelabel.top("a" infont italics_font scaled font_scale, loc[3]);
+
+path slant_angle;
+slant_angle := lrcorner letter_H + (14, 0) -- lrcorner letter_H + (-6, 0) -- urcorner letter_H + (3.5, 0);
+
+pair base_point;
+base_point := (xpart point 2 of slant_angle, ypart point 0 of slant_angle) ;
+
+pair angle_label;
+angle_label := point 2 of slant_angle + (0, -12);
+
+
+beginfig(1);
+ draw letter_H;
+ draw slant_angle;
+ draw point 2 of slant_angle -- base_point dashed evenly;
+ draw point 1 of slant_angle -- base_point withpen pencircle scaled 2pt;
+
+ label.rt(TEX("$\alpha$"), angle_label);
+
+ draw letter_L;
+ draw slant_angle shifted (xpart lrcorner letter_L - xpart lrcorner letter_H + 2, 0);
+
+ draw letter_a;
+ draw slant_angle shifted (xpart lrcorner letter_a - xpart lrcorner letter_H - 3, 0);
+endfig;
+end
+%</slantangle>
+% \fi
+%
+% \Cref{fig:slant-angle} shows how \meta{strength} and \(\alpha\) are related. Moreover, it
+% demonstrates how intricate italics correction is.
+%
+% \begin{figure}
+% \centering
+% \includegraphics{slant-angle-1.mps}
+% \caption[Some letters of an italics font.]
+% {Some letters of an italics font. We use the capital~\sample{H} to measure the
+% angle~\(\alpha\) between the plumb-line (drawn dashed) and a tangent to the
+% rightmost parts of the glyph. The length of the plumb-line is proportional to
+% \meta{strength} and the short, thick part of the baseline symbolizes the resulting
+% italics correction.~\visualpar The middle example, the capital~\sample{L}, shares
+% \(\alpha\) with \sample{H} but obviously needs a far smaller \meta{strength} or
+% even no correction at all.~\visualpar The \sample{a} at the right-hand side is an
+% example of why \TeX{} allows to assign an italic~correction to each individual
+% character of a font. Not only features the lowercase~\sample{a} a
+% larger~\(\alpha\) --~despite being a member of the same font~-- but its serif adds
+% as much to the width as the slanted stem.\label{fig:slant-angle}}
+% \vspace{-3\baselineskip}
+% \llap{\parbox{\marginparwidth}
+% {\marginnoteformat
+% We center the last lines of each figure and table caption with the help of
+% \hyperref[syn:lastlinecenteredpar]{\code{lastlinecenteredpar}}.}
+% \hspace*{\marginparsep}}
+% \end{figure}
+%
+%
+% \subsection{Apply Extra Kerning}\label{sec:extra-kerning}
+% \index{kerning>extra}
+%
+% Package \packagename{typog} supplies two sets of macros to kern some of the punctuation
+% symbols. One is for forward slashes the other, more extensive one, for hyphens.
+%
+%
+% \subsubsection{Slash}\label{sec:slash-with-kern}
+% \index{kerning>forward slash}
+%
+% \DescribeMacro{\kernedslash}
+% \DescribeMacro{\kernedslash*}
+% Macro~\cs{kernedslash} expands to a forward slash~(\sample{\itcorr{3}\char`/}) with some
+% extra space around it.
+%
+% \begin{synopsis}\label{syn:kernedslash}
+% \cs{kernedslash} \\
+% \cs{kernedslash*}
+% \end{synopsis}
+%
+% The starred form is unbreakable, the non-starred version introduces a break point with
+% penalty~\hyperref[item:breakpenalty]{|breakpenalty|} after the slash. Configure the kerning
+% around the slash with~\hyperref[item:slashkern]{|slashkern|}.
+%
+% If the word following the slash should not be hyphenated append \cs{nobreak} after
+% \cs{kernedslash*}.
+%
+% \begin{usecases}
+% \cs{kernedslash} improves the appearance of pairs of years typeset in lining numerals:
+% \meta{year\textsubscript{1}}/\meta{year\textsubscript{2}}.~\visualpar The macro has proven
+% helpful in many cases where the right hand side of the slash starts with a capital as, for
+% example, \meta{city}/\meta{state-code} (\acronym{US}-specific) or
+% \meta{anything}/\meta{noun} (any language that capitalizes \meta{noun}).
+% \end{usecases}
+%
+%
+% \subsubsection{Hyphen}\label{sec:hyphen-with-kern}
+% \index{kerning>hyphen}
+%
+% \DescribeMacro{\kernedhyphen}
+% \DescribeMacro{\kernedhyphen*}
+% Macros \cs{kernedhyphen*} and \cs{kernedhyphen} expand to a hyphen~(\sample{-}) with given
+% kerning to its left and to its right.
+%
+% \begin{synopsis}\label{syn:kernedhyphen}
+% \cs{kernedhyphen}\oarg{raise}\marg{left-kerning}\marg{right-kerning} \\
+% \cs{kernedhyphen*}\oarg{raise}\marg{left-kerning}\marg{right-kerning}
+% \end{synopsis}
+%
+% Typeset an unbreakable hyphen with \cs{kernedhyphen*} or a breakable hyphen (like \cs{hyp} of
+% package \packagename{hyphenat}~\cite{package:hyphenat}) with \cs{kernedhyphen} and apply some
+% kerning to left and to the right of it. The values \meta{left-kerning} and
+% \meta{right-kerning} are multiplied with one thousandth of the current font's~em to get the
+% size of the kern.
+%
+% The optional argument~\meta{raise}, also given in \nativetextfraction{1}{1000}\,em, allows to
+% adjust the height of the hyphen similar to the macros described in
+% \cref{sec:raise-characters}. In text mode the special argument~\sample{|*|} for \meta{raise}
+% transfers the current value of \hyperref[item:raisecapitalhyphen]{\code{raisecapitalhyphen}}.
+% The default for \meta{raise} is zero.
+%
+% \DescribeMacro{\leftkernedhyphen}
+% \DescribeMacro{\leftkernedhyphen*}
+% \DescribeMacro{\rightkernedhyphen}
+% \DescribeMacro{\rightkernedhyphen*}
+% We also define specialized versions for kerning on the left-hand side or the right-hand side
+% only. These macros work like their two-argument counterparts and set the appropriate other
+% kerning to zero.
+%
+% \begin{synopsis}\label{syn:leftkernedhyphen}\label{syn:rightkernedhyphen}
+% \cs{leftkernedhyphen}\oarg{raise}\marg{left-kerning} \\
+% \cs{leftkernedhyphen*}\oarg{raise}\marg{left-kerning} \\
+% \cs{rightkernedhyphen}\oarg{raise}\marg{right-kerning} \\
+% \cs{rightkernedhyphen*}\oarg{raise}\marg{right-kerning}
+% \end{synopsis}
+%
+% \begin{usecases}
+% Composites in the form \meta{math}-\meta{noun} in languages where nouns are
+% capitalized.~\visualpar Composites where one or both sides of the hyphen are typeset in
+% different fonts, like, \meta{small-caps}-\meta{roman}.
+% \end{usecases}
+%
+%
+% \subsection{Raise Selected Characters}\label{sec:raise-characters}
+% \index{raised character}
+%
+% Usually all hyphens and dashes of a font are designed to join lowercase letters. This holds
+% also true for most of our \cs{labelitem}\meta{N} markers, bullets, stars, and even fancy
+% dingbats. If these hyphens and dashes connect uppercase letters (or lining numerals) they
+% sometimes appear to low; they disrespect the glyphs' symmetry axis. A similar situation
+% arises if |itemize|~list markers precede an uppercase letter, a lining numeral, or a big
+% mathematical operator.
+%
+% We introduce a set of macros for the most common cases that allow typsetting these characters
+% at a user definable, adjusted height above the baseline. Users can base their own
+% definitions of raised characters on their associated dimensions.\footnote{Also compare with
+% Ex.~12 in Ref.~\citenum{wermuth:2023} for an attempt to automate vertical alignment.}
+%
+% \begin{caution}
+% The height adjustment disables a font's built-in kerning.
+% \end{caution}
+%
+% \noindent
+% General note for all raised hyphen-like macros: Prefer the starred version if applied in
+% front of any punctuation.
+%
+%
+% \subsubsection{Capital Hyphen}\label{sec:capital-hyphen}
+% \index{raised character>hyphen}
+%
+% \DescribeMacro{\capitalhyphen}
+% \DescribeMacro{\capitalhyphen*}
+% In many fonts the height of the hyphen character~\sample{-} above the baseline is optimized
+% for lowercase letters. In languages that capitalize their nouns as, e.\,g., German, this may
+% be too low for compounds involving capitals.
+%
+% \begin{synopsis}\label{syn:capitalhyphen}
+% \cs{capitalhyphen} \\
+% \cs{capitalhyphen*}
+% \end{synopsis}
+%
+% The unstarred version introduces a hyphenation opportunity right after the hyphen character
+% (with penalty~\hyperref[item:breakpenalty]{|breakpenalty|}) whereas the starred version does
+% not. The actual amount the hyphen gets raised in \cs{capitalhyphen} is determined by
+% \hyperref[item:raisecapitalhyphen]{|raisecapitalhyphen|}.
+%
+% \begin{usecases}
+% In languages that capitalize their nouns, the typical use-case is between an
+% \meta{ab\-bre\-vi\-a\-tion} and a \meta{noun} when \meta{ab\-bre\-vi\-a\-tion} is a string
+% of uppercase letters. The same holds true for a connection of an uppercase variable in
+% mathematical mode and a \meta{noun} starting with a capital letter.~\visualpar Abbreviated
+% compound first names (e.\,g., A.\capitalhyphen* M.~Legendre) can be joined with the starred
+% version.~\visualpar Also, the starred form is suited for \acronym{ISO~8601}-formatted dates
+% if they are composed with lining-style numerals.
+% \end{usecases}
+%
+%
+% \subsubsection{Capital Dash}\label{sec:capital-dash}
+% \index{raised character>en-dash}
+%
+% \DescribeMacro{\capitalendash}
+% \DescribeMacro{\capitalendash*}
+% \DescribeMacro{\capitaldash}
+% \DescribeMacro{\capitaldash*}
+% The situation of the en-dash~\sample{--} is almost identical to the one of the hyphen
+% character~\sample{-} described in the previous section or the number dash to be introduced in
+% the next section.
+%
+% \begin{synopsis}\label{syn:capitalendash}\label{syn:capitaldash}
+% \begin{tabbing}
+% \cs{capitalendash}\qquad\= \cs{capitaldash} (alias) \\
+% \cs{capitalendash*} \> \cs{capitaldash*} (alias)
+% \end{tabbing}
+% \end{synopsis}
+%
+% The unstarred version introduces a hyphenation opportunity right after the dash (with
+% penalty~\hyperref[item:breakpenalty]{|breakpenalty|}) whereas the starred version does not.
+% The actual amount the hyphen gets raised in \cs{capitaldash} is determined by
+% \hyperref[item:raisecapitalhyphen]{|raisecapitaldash|}.
+%
+% \begin{usecases}
+% Letter ranges as used in the title of an index.~\visualpar Any mixed letter-digit ranges
+% (of capital letters and lining-style numerals) as in e.\,g., Sec.~B\capitaldash* 2.
+% \end{usecases}
+%
+% \noindent
+% \DescribeMacro{\capitalemdash}
+% \DescribeMacro{\capitalemdash*}
+% For completeness we also introduce a raised em-dash~\sample{---}. It behaves just like its
+% en-dash sibling.
+%
+% \begin{synopsis}\label{syn:capitalemdash}
+% \cs{capitalemdash} \\
+% \cs{capitalemdash*}
+% \end{synopsis}
+%
+% \begin{usecases}
+% Item symbols in \code{itemized} lists if the item text starts with an uppercase
+% letter.~\visualpar Theorem headings, like, e.\,g., \mbox{Definition 6.2 \capitalemdash{}
+% \textsc{Lie} Algebra}.
+% \end{usecases}
+%
+%
+% \subsubsection{Number Dash (Figure Dash)}\label{sec:number-dash}
+% \index{raised character>number dash}
+%
+% \DescribeMacro{\figuredash}
+% \DescribeMacro{\figuredash*}
+% The en-dash often gets used as separator for numerical ranges. In most fonts it has the
+% correct height above baseline for oldstyle numerals,
+% e.\,g.~\oldstylenums{12}--\oldstylenums{34}--\oldstylenums{56}--\oldstylenums{78}, but with
+% lining numerals --~depending on the font~-- it may look like it suffers from
+% \doublequotes{broken suspenders}:
+% 12\textendash34\textendash56\textendash78.\marginnote{\cs{figuredash} yields
+% 12\figuredash34\figuredash56\figuredash78 for sans-serif and {\rm
+% 12\figuredash34\figuredash56\figuredash78} for the roman typeface.} The situation is similar
+% to \cs{capitaldash} and \cs{capitalhyphen} discussed in
+% \cref{sec:capital-hyphen,sec:capital-dash}.
+%
+% \begin{synopsis}\label{syn:figuredash}
+% \cs{figuredash} \\
+% \cs{figuredash*}
+% \end{synopsis}
+%
+% The unstarred version introduces a hyphenation opportunity right after the en-dash with
+% penalty~\hyperref[item:breakpenalty]{|breakpenalty|} whereas the starred version does not.
+% The actual amount the en-dash gets raised in \cs{figuredash} is determined by
+% \hyperref[item:raisefiguredash]{|raisefiguredash|}.
+%
+% Values of .05em to .1em are typical for fonts that need this kind of correction and~.1em is a
+% good starting point. \Cref{tab:raisefiguredash} summarizes some findings.
+%
+% \begin{table}
+% \centering
+% \caption[Suggested raise amounts for \cs{figuredash}]%
+% {Suggested values for raising the en-dash between lining numerals of some selected
+% fonts.}
+% \label{tab:raisefiguredash}
+%
+% \begin{tabfigures}
+% \begin{tabular}{@{}l>{\RaggedRight}p{20em}@{}}
+% \toprule
+% Raise & Font Name \\
+% em & \\
+% \midrule
+% 0 & Alegreya\index{font>Alegreya}, Arvo\index{font>Arvo},
+% Bitter\index{font>Bitter}, Clara\index{font>Clara},
+% \acronym{EB}~Garamond\index{font>EB Garamond=\acronym{EB} Garamond},
+% Gentium\index{font>Gentium},
+% Ibarra Real Nova\index{font>Ibarra Real Nova},
+% \acronym{Inria}~Serif\index{font>Inria Serif=\acronym{Inria} Serif},
+% Libertine\index{font>Libertine}, Libertinus\index{font>Libertinus},
+% Merriweather\index{font>Merriweather},
+% \acronym{PT}~Serif\index{font>PT Serif=\acronym{PT} Serif},
+% Roboto Slab\index{font>Roboto Slab}, Spectral\index{font>Spectral},
+% \acronym{STIX}\index{font>STIX=\acronym{STIX}}, and many more \\
+% .05 & fbb\index{font>fbb}, Source Serif Pro\index{font>Source Serif Pro} \\
+% .0667 & Libre Baskerville\index{font>Libre Baskerville},
+% Crimson Pro\index{font>Crimson Pro},
+% Erewhon\index{font>Erewhon}, Droid Serif\index{font>Droid Serif} \\
+% .1 & \acronym{GFS}~Artemisia\index{font>GFS Artemisia=\acronym{GFS} Artemisia},
+% Libre Caslon\index{font>Libre Caslon},
+% Coelacanth\index{font>Coelacanth}, Crimson Pro\index{font>Crimson Pro},
+% Crimson Text\index{font>Crimson Text},
+% \TeX{} Gyre~Pagella\index{font>TeX Gyre Pagella=\TeX{} Gyre Pagella},
+% Quattrocento\index{font>},
+% \acronym{TX}~Fonts\index{font>TX Fonts=\acronym{TX} Fonts},
+% \acronym{ADF}~Venturis\index{font>ADF Venturis=\acronym{ADF} Venturis},
+% and many more \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{table}
+%
+% Other macros may be redefined with \cs{figuredash} for a consistent appearance of the copy,
+% like, for example, \cs{citedash} (package~\packagename{cite}~\cite{package:cite}), or
+% \cs{crefrangeconjunction} (package~\packagename{cleveref}~\cite{package:cleveref}).
+%
+% \begin{usecase}
+% The key customers of \cs{figuredash} are the |PAGES|~entries of bibliography
+% databases.~\visualpar In an index generated with \command{makeindex} the range
+% delimiter~\code{delim\_r} is a candidate for \cs{figuredash*}.
+% \end{usecase}
+%
+%
+% \subsubsection[Multiplication Sign]%
+% {Multiplication Sign -- Times~\sample{\texttimes}}\label{sec:mult-sign}
+% \index{raised character>multiplication sign}
+%
+% \DescribeMacro{\capitaltimes}
+% The \cs{capitaltimes}~macro is a variation of the
+% \hyperref[syn:capitalhyphen]{\cs{capitalhyphen}}~theme.
+%
+% \begin{synopsis}\label{syn:capitaltimes}
+% \cs{capitaltimes}
+% \end{synopsis}
+%
+% In text mode it expands to an appropriately raised \cs{texttimes}, and in math~mode to a
+% raised \cs{times} binary~operator, where
+% \hyperref[item:raisecapitaltimes]{|raisecapitaltimes|} determines the amount of
+% upward-shifting applied; it never inserts any break points.
+%
+% \begin{usecase}
+% Prime use are two- or higher-dimensional shape specifications with lining numerals or
+% uppercase letters in mathematical mode as, for example, matrix or tensor sizes.
+% \end{usecase}
+%
+%
+% \subsubsection{Guillemets}\label{sec:guillemets}
+% \index{raised character>guillemets}
+%
+% Another possible typographic problem this package addresses is that both sets --~single and
+% double quotes~-- of guillemets may suffer from a too small distance to the baseline.
+%
+% For the implementation \packagename{typog} relies on the T1\footnote{Font
+% encoding~T1\index{font>encoding} can be forced via \cs{usepackage}|[T1]\{fontenc\}| in the
+% document preamble.}~font encoding not on package~\packagename{babel}.
+%
+%
+% \paragraph{Lowercase Versions.}
+% \DescribeMacro{\singleguillemetleft}
+% \DescribeMacro{\singleguillemetright}
+% \DescribeMacro{\doubleguillemetleft}
+% \DescribeMacro{\doubleguillemetright}
+% \begin{synopsis}\label{syn:singleguillemetleft}\label{syn:doubleguillemetleft}
+% \begin{tabbing}
+% \cs{singleguillemetleft}\qquad\= \cs{singleguillemetright} \\
+% \cs{doubleguillemetleft}\> \cs{doubleguillemetright}
+% \end{tabbing}
+% \end{synopsis}
+%
+% \noindent
+% For consistency and easy accessibility we define height-adjusted left and right single
+% guillemets as \cs{singleguillemetleft} and \cs{singleguillemetright}; double guillemets are
+% available with \cs{doubleguillemetleft} and \cs{doubleguillemetright}. Their heights above
+% the baseline are collectively adjusted with
+% \hyperref[item:raiseguillemets]{|raiseguillemets|}.
+%
+%
+% \paragraph{Uppercase Versions.}
+%
+% \DescribeMacro{\Singleguillemetleft}
+% \DescribeMacro{\Singleguillemetright}
+% \DescribeMacro{\Doubleguillemetleft}
+% \DescribeMacro{\Doubleguillemetright}
+% \begin{synopsis}\label{syn:Singleguillemetleft}\label{syn:Doubleguillemetleft}
+% \begin{tabbing}
+% \cs{Singleguillemetleft}\qquad\= \cs{Singleguillemetright} \\
+% \cs{Doubleguillemetleft}\> \cs{Doubleguillemetright}
+% \end{tabbing}
+% \end{synopsis}
+%
+% \noindent
+% The companion set of single, double, left, and right quotes corrected for uppercase letters
+% or lining numerals is \cs{Singleguillemetleft} and \cs{Singleguillemetright} and
+% \cs{Doubleguillemetleft} and \cs{doubleguillemetright}. Mnemonic: These macros start with an
+% uppercase letter. Their height above the baseline is adjusted with
+% \hyperref[item:raisecapitalguillemets]{|raisecapitalguillemets|}. Values of .025em to .075em
+% are typical for fonts that need this kind of correction. \Cref{tab:raiseguillemets}
+% summarizes some findings.
+%
+% \begin{table}
+% \centering
+% \caption[Suggested raise amounts for guillemets]%
+% {Suggested values for raising guillemets of some selected fonts.}
+% \label{tab:raiseguillemets}
+%
+% \begin{tabfigures}
+% \begin{tabular}{@{}cc>{\RaggedRight}p{20em}@{}}
+% \toprule
+% \multicolumn{2}{@{}c}{Raise} & Font Name \\
+% Lowercase & Uppercase & \\
+% em & em & \\
+% \midrule
+% 0 & .05\hphantom{00} &
+% \acronym{EB}~Garamond\index{font>EB Garamond=\acronym{EB} Garamond},
+% Libertinus\index{font>Libertinus},
+% Merriweather\index{font>Merriweather}, and many more \\
+% .025 & .05\hphantom{00} & Gentium\index{font>Gentium} \\
+% .04\hphantom{0} & .0667 &
+% \acronym{ADF}~Baskervald\index{font>ADF Baskervald=\acronym{ADF} Baskervald} \\
+% .05\hphantom{0} & .0625 &
+% \acronym{GFS}~Artemisia\index{font>GFS Artemisia=\acronym{GFS} Artemisia},
+% \acronym{GFS}~Didot\index{font>GFS Didot=\acronym{GFS} Didot} \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{table}
+%
+% \begin{tip}
+% Define shorthand macros that simplify the application of guillemets, like, e.\,g.,
+%
+% \begin{codeexample}
+% \cs{newcommand*}\= \{\= \cs{singlequotes}\}[1] \\
+% \> \{\cs{singleguillemetright} \#1\% \\
+% \> \> \cs{singleguillemetleft}\} \\
+% \cs{let}\cs{sq}=\cs{singlequotes}
+% \end{codeexample}
+%
+% and similar definitions for \cs{Singlequotes}, \cs{doublequotes}, and~\cs{Doublequotes}.
+%
+% Users working according to the French typesetting conventions will want to add extra
+% spacing between the guillemets and the macro argument already in these macros.
+% \end{tip}
+%
+% \noindent
+% Whether the guillemets must be height-adjusted for lowercase letters depends on the font.
+% Careful judgment at various magnifications with a variety of samples is necessary.
+%
+%
+% \paragraph{Interaction with package~\packagename{csquotes}.}
+% \index{csquotes=\packagename{csquotes} (package)}
+%
+% The users of package~\packagename{csquotes}
+% can hook up the guillemets as defined by \packagename{typog}
+% with \cs{DeclareQuoteStyle}:
+%
+% \begin{codeexample}
+% 12\=\kill
+% \cs{DeclareQuoteStyle}\{typog-guillemets\} \\
+% \> \{\cs{doubleguillemetright}\}\%\qquad\= opening outer mark \\
+% \> \{\cs{doubleguillemetleft}\}\% \> closing outer mark \\
+% \> \{\cs{singleguillemetright}\}\% \> opening inner mark \\
+% \> \{\cs{singleguillemetleft}\}\% \> closing inner mark
+% \end{codeexample}
+%
+% \noindent
+% As always, the influence of package~\packagename{babel} on \packagename{csquotes} has to be
+% put into consideration. See Sec.~8 of the \packagename{csquotes}~manual for a description of
+% its configuration possibilities.
+%
+% \begin{usecase}
+% All-capital words as for example acronyms put in guillemets that are raised somewhat almost
+% always look better, whether using the French typographic convention (guillemets pointing
+% outward plus some extra kerning) or the other way round (guillemets pointing inward).
+% \end{usecase}
+%
+% \begin{futuredirection}
+% A correction in the other direction, i.\,e., lowering certain characters may also be
+% desirable, to visually align them to the surrounding copy. Parentheses and in particular
+% square brackets around all-lowercase text come into mind.
+% \end{futuredirection}
+%
+%
+% \subsection[Align Last Line]
+% {Align Last Line of a Paragraph}\label{sec:align-last-line}
+% \index{paragraph>align last line}
+%
+% The usual algorithms of \LaTeX{} typeset the last line of a paragraph flush with the left
+% margin unless |center|, |raggedleft| or |Centering|, |FlushRight|
+% (package~\packagename{ragged2e}~\cite{package:ragged2e}) are in effect. For an instructive
+% discussion consult Ch.~17, \doublequotes{Paragraph End}, of Ref.~\citenum{eijkhout:2007}.
+% The following environments allow to adjust the last lines of paragraphs in different ways.
+%
+% \DescribeEnv{lastlineraggedleftpar}
+% \DescribeEnv{lastlineflushrightpar}
+% The environment |lastlineraggedleftpar|\index{paragraph>align last line>flush right} adjusts
+% the various skips such that the last lines of the paragraphs gets typeset flush with the
+% right margin.
+%
+% \begin{synopsis}\label{syn:lastlineraggedleftpar}\label{syn:lastlineflushrightpar}
+% \cs{begin}|{lastlineraggedleftpar}| \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{lastlineraggedleftpar}| \\[\smallskipamount]
+% |lastlineflushrightpar|~(alias)
+% \end{synopsis}
+%
+% The name |lastlineflushrightpar| is an alias for~\code{lastlineraggedleftpar}.
+%
+% \DescribeEnv{lastlinecenteredpar}
+% Center\index{paragraph>align last line>centered} the last lines of the paragraphs enclosed by
+% this environment.\footnote{Also compare the approach taken in Ref.~\citenum{wermuth:2018}.}
+%
+% \begin{synopsis}\label{syn:lastlinecenteredpar}
+% \cs{begin}|{lastlinecenteredpar}| \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{lastlinecenteredpar}|
+% \end{synopsis}
+%
+% \begin{usecases}
+% |lastlineflushrightpar|: Narrow, justified parts of the text put flush against the right
+% margin.~\visualpar |lastlinecenteredpar|: Table or figure captions typeset justified as
+% centered boxes.
+% \end{usecases}
+%
+%
+% \needtocspace
+% \subsection[Fill Last Line]
+% {Fill Last Line of a Paragraph}\label{sec:fill-last-line}
+% \index{paragraph>fill last line}
+%
+% The problem of when and how to \singlequotes{fill} the last line of a paragraph is quite
+% intricate. We first define the problem then we proceed to general purpose functions and we
+% close the section with specific environments to control the length of the last line.
+%
+%
+% \subsubsection{Problem Definition}
+%
+% Depending on the value of \cs{parindent}, either zero or nonzero, there may be the desire to
+% control the length of the last line of a paragraph.
+%
+% \iffalse
+%<*crookedparagraphs>
+prologues := 3;
+
+def draw_filled_rectangle(expr lower_left, upper_right, color) =
+ fill lower_left -- (xpart upper_right, ypart lower_left) --
+ upper_right -- (xpart lower_left, ypart upper_right) --
+ cycle
+ withcolor color;
+enddef;
+
+
+u := 100;
+
+em := 10;
+linelength := 2u;
+baselineskip := 1.2em;
+parskip := 3;
+parindent := 2.5em;
+
+cmykcolor line_color;
+line_color := (.08, 0, 0, .18); % cold silver
+
+color customred[];
+customred[1] := (.890, .282, .282);
+customred[2] := (.831, .110, .110);
+customred[3] := (.686, .043, .043);
+customred[4] := (.569, .000, .000);
+customred[5] := (.420, .000, .000);
+
+color margin_color;
+margin_color := customred[2];
+
+
+beginfig(1); % short line -- gap
+ y := 0;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (1.1em, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((parindent, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+
+ draw_filled_rectangle((-.667em, 1em), (-.333em, -3baselineskip), margin_color);
+ draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -3baselineskip), margin_color);
+endfig;
+
+
+beginfig(2); % short line -- covered
+ y := 0;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (2parindent, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((parindent, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+
+ draw_filled_rectangle((-.667em, 1em), (-.333em, -3baselineskip), margin_color);
+ draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -3baselineskip), margin_color);
+endfig;
+
+
+beginfig(3); % completely filled line -- no clear paragraph break
+ y := 0;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip - parskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+
+ draw_filled_rectangle((-.667em, 1em), (-.333em, -3baselineskip - parskip), margin_color);
+ draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -3baselineskip - parskip),
+ margin_color);
+endfig;
+
+
+beginfig(4); % completely filled line -- opened right margin
+ y := 0;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - parindent, y + 1em), line_color);
+ y := y - baselineskip - parskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color);
+
+ draw_filled_rectangle((-.667em, 1em), (-.333em, -3baselineskip - parskip), margin_color);
+ draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -3baselineskip - parskip),
+ margin_color);
+endfig;
+end
+%</crookedparagraphs>
+% \fi
+%
+% \begin{enumerate}
+% \item\label{item:o1}
+% \(\cs{parindent} > 0\) \cite[O1]{wermuth:2018}
+%
+% \begin{minipage}{\linewidth}
+% If the last line of a paragraph is shorter than the \cs{parindent} of the following
+% paragraph a visual gap tears open.
+%
+% \begin{center}
+% \includegraphics{crooked-paragraphs-1.mps}
+% \end{center}
+% \end{minipage}
+%
+% The same problem arises with displayed math in a flush-left\footnote{The common practice of
+% centering displayed equations does not call for the manipulations of a paragraph's last
+% line discussed here.} setting, e.\,g., \packagename{amsmath}~\cite{package:amsmath} and
+% option~|fleqn|.\footnote{For displayed equations and \packagename{amsmath} the relevant
+% parameter is~\cs{mathindent}.}
+%
+% \begin{minipage}{\linewidth}
+% A possible remedy is to reflow the paragraph in a way that its last line is clearly wider
+% than \cs{parindent}; a typical suggestion being twice the~\cs{parindent}.
+%
+% \begin{center}
+% \includegraphics{crooked-paragraphs-2.mps}
+% \end{center}
+% \end{minipage}
+%
+% \item\label{item:o2}
+% \(\cs{parindent} = 0\) \cite[O2]{wermuth:2018}
+%
+% \begin{minipage}{\linewidth}
+% If the last line of a paragraph is completely filled with text, i.\,e., flush with the
+% right margin, it may become hard to spot the start of the following paragraph unless
+% \cs{parskip} is large.\footnotemark
+%
+% \begin{center}
+% \includegraphics{crooked-paragraphs-3.mps}
+% \end{center}
+% \end{minipage}\footnotetext{Package~\packagename{parskip} defines \cs{parskip}
+% as \mbox{6pt plus 2pt} for a base size of~10pt.}
+%
+% \medskip
+% \begin{minipage}{\linewidth}
+% A possible, more legible solution is to reformat the paragraph in a way such that its
+% last line leaves a marked gap with respect to the right margin.
+%
+% \begin{center}
+% \includegraphics{crooked-paragraphs-4.mps}
+% \end{center}
+% \end{minipage}
+%
+% The suggestions for the gap-width vary from two~em to twice the width of a
+% \singlequotes{typical} \cs{parindent}\footnote{% For example, \LaTeX's class
+% \packagename{article} uses a \cs{parindent} of~25pt.} for the gap~\cite{carlisle:1996}.
+% \end{enumerate}
+%
+% \begin{tip}
+% In theory both problems, O1 and O2 can be resolved by either shortening or prolonging the
+% last line of the paragraph. For the concrete case it is up to the user to decide which
+% direction to go and to choose the method that yields the most pleasing typographic results.
+%
+% \TeX{} always considers the paragraph in its entirety. Thus any change the user demands
+% \doublequotes{just for the last line} will permeate the whole paragraph and in unfortunate
+% cases botch it.
+%
+% Prudent users check the appearance of the problematic, original paragraph against one or
+% more corrected versions of it~-- at least visually. Quantitative comparisons can be
+% performed with the help of~\cs{tracingparagraphs}.
+% \end{tip}
+%
+% \begin{important}
+% For the techniques in the following two subsections to work the paragraphs treated with
+% them should have certain advantageous properties.
+%
+% \begin{itemize}
+% \item Technically, the paragraphs need to contain enough glue (see
+% e.\,g.~\cref{sec:sloppy-paragraphs}) to achieve a low badness such that the desired
+% paragraph end is deemed feasible by \TeX.
+%
+% \item Aesthetically, the paragraphs must be long enough to absorb the change in last-line
+% fill level otherwise their gray-values visibly deviate from the
+% average.\specialsectionendhere
+% \end{itemize}
+% \end{important}
+%
+%
+% \subsubsection{Manual Changes}\label{sec:fill-last-line-other-methods}
+%
+% Most \hyperref[item:o1]{O1} or \hyperref[item:o2]{O2} situations can be navigated with
+% do-it-yourself methods. Here are some common recipes.
+%
+% \begin{enumerate}
+% \item End-of-paragraph intervention.\label{enum:end-of-paragraph-intervention}
+%
+% \begin{enumerate}[notopsep]
+% \item Tie~\sample{\texttt{\char126}}\label{enum:tie-last-words}\index{paragraph>fill last line>tie}
+%
+% Tie the last words.
+%
+% The problem with the tie may be a hyphenation of one of the words that participates in
+% the tie. The next item avoids this disadvantage.
+%
+% \item \cs{mbox}\label{enum:mbox-last-words}\index{paragraph>fill last line>mbox=\cs{mbox}}
+%
+% Join the last words or inline equation at the end of the paragraph with an~\cs{mbox}.
+%
+% \item \cs{linebreak}\label{enum:linebreak}\index{paragraph>fill last line>linebreak=\cs{linebreak}}
+%
+% Add a \cs{linebreak} to the back part of the paragraph (approximately where the
+% \cs{mbox} of item~\ref{enum:mbox-last-words} would start) in a way that the last line
+% receives the desired length~\cite{wermuth:2022-8-2}. In turn the next-to-last lines
+% may become unsightly. Counteract this degradation e.\,g.~with
+% recipes~\ref{enum:vary-spacing} to~\ref{enum:vary-font-expansion}.
+% \end{enumerate}
+%
+% Tying and \cs{mbox}ing lend themselves to generalizations. We need not only tie at end of
+% a paragraph but fuse logical units of sentences or inline equations so that the relevant
+% information literally stays in the reader's focus. Cementing together text of course finds
+% an end when overfull lines start to show up.
+%
+% \item Uniform paragraph change.\label{enum:uniform-paragraph-change}
+%
+% \begin{enumerate}[notopsep]
+% \item Vary spacing.\label{enum:vary-spacing}\index{font>spacing}
+%
+% Modify the inter-word spacing, for example, with the macros introduced in
+% \cref{sec:looser-tighter-spacing}.
+%
+% Enclose the paragraph in either \hyperref[syn:loosespacing]{|loosespacing|}
+% or~\hyperref[syn:tightspacing]{|tightspacing|}.
+% Increase the spacing~\meta{level} until the last line gets the desired length.
+%
+% \item Vary font tracking.\label{enum:vary-font-tracking}\index{font>tracking}
+%
+% Enclose the paragraph in a \hyperref[syn:setfonttracking]{\code{setfonttracking}}~group.
+% See \cref{sec:tracking-control}. Increase or decrease the tracking in steps of
+% \nativetextfraction{1}{1000}\,em until the last line looks good.
+%
+% \item Vary font expansion.\label{enum:vary-font-expansion}\index{font>expansion}
+%
+% Enclose the paragraph in a \hyperref[syn:setfontexpand]{\code{setfontexpand}}~group. See
+% \cref{sec:font-expansion-control}.
+% \end{enumerate}
+%
+% \item A combination of any of the above items.
+%
+% \item Some curveballs.\label{enum:gonzo-tips}\par
+% \begin{enumerate}[notopsep]
+% \item If the paragraph already suffers from one of the problems that \TeX{} addresses with
+% \cs{doublehyphendemerits}, \cs{finalhyphendemerits}, or~\cs{adjdemerits}, crank up one or
+% all of these values to~10000 and observe whether the length of last line changes in the
+% desired direction.
+%
+% \item If any influential \packagename{microtype} features have been enabled try with one
+% more more of them \emph{disabled}. See, e.\,g.,
+% environment~\hyperref[syn:nofontexpansion]{\code{nofontexpansion}} in
+% \cref{sec:font-expansion-control}.
+% \end{enumerate}
+% \end{enumerate}
+%
+%
+% \subsubsection{Multi\capitalhyphen Purpose Environments}\label{sec:fill-last-line-gp-environments}
+%
+% \DescribeEnv{shortenpar}
+% \DescribeEnv{prolongpar}
+% The two environments |shortenpar|\index{paragraph>fill last
+% line>shortenpar=\code{shortenpar}} and |prolongpar|\index{paragraph>fill last
+% line>prolongpar=\code{prolongpar}} can be employed in quite general situations when a
+% paragraph should be typeset one line longer or shorter, e.\,g., to avoid a
+% widow~line\footnote{The last line of a paragraph becomes a \singlequotes{widow}\index{forlorn
+% line>widow} (ger.~\foreignphrase{Hurenkind}) if it starts the following page or column.} or
+% a club~line\footnote{The first line of a paragraph is called
+% \singlequotes{club}\index{forlorn line>club} or~\singlequotes{orphan}\index{forlorn
+% line>orphan} (ger.~\foreignphrase{Schusterjunge}) if it appears at the bottom of the page or
+% column.}~[\citenum{knuth:1986}, p.~104 and~\citenum{mittelbach:2018c}]. (See also
+% \cref{sec:vtie-paragraph} for special functions to avoid clubs or widows.)
+% \singlequotes{Accidentally}, they also change the length of the last line of the paragraph.
+%
+% \begin{synopsis}\label{syn:shortenpar}
+% \cs{begin}|{shortenpar}|
+% \dots{}
+% \cs{end}|{shortenpar}|
+% \end{synopsis}
+%
+% Environment |shortenpar| decreases the \cs{looseness} of the paragraph.\footnote{Command
+% \cs{looseness} is a \TeX{}~primitive~\cite[p.~103n]{knuth:1986}. A thorough discussion of
+% the interaction of \cs{linepenalty} and \cs{looseness} can be found in
+% Ref.~\citenum{wermuth:2017c}.} It performs well if the last line of the paragraph is short
+% or the whole paragraph is loose.
+%
+% \begin{synopsis}\label{syn:prolongpar}
+% \cs{begin}|{prolongpar}|
+% \dots{}
+% \cs{end}|{prolongpar}|
+% \end{synopsis}
+%
+% This environment increases the \cs{looseness} of the paragraph, which is why it works best
+% with decent or tight last lines that are almost full.
+%
+%
+% \subsubsection{Specialized Environments}\label{sec:fill-last-line-specialized-environments}
+%
+% We introduce environments not just skips to get the correct behavior --~set up all paragraph
+% parameters \emph{before} the paragraph ends~-- and, at the same time, limit the range of this
+% parameter change.
+%
+% \DescribeEnv{covernextindentpar}
+% Environment |covernextindentpar|\index{paragraph>fill last line>covernextindentpar=\code{covernextindentpar}}
+% can be helpful for \hyperref[item:o1]{case~O1}, i.\,e., a too short last line.
+%
+% \begin{synopsis}\label{syn:covernextindentpar}
+% \cs{begin}|{covernextindentpar}|\oarg{dim} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{covernextindentpar}|
+% \end{synopsis}
+%
+% The environment asks \TeX{} to extend the last line of a paragraph such that it takes at
+% least
+% \makeatletter\dumpmacro{\typog@covernextindentpar@nonzero@parindent}\makeatother{}
+% (if \(\cs{parindent} \not= 0\)),
+% \makeatletter\typog@covernextindentpar@zero@parindent\makeatother{}
+% (if \(\cs{parindent} = 0\)), or \meta{dim} if called with an optional argument.
+%
+% \DescribeEnv{openlastlinepar}
+% The next environment, |openlastlinepar|,\index{paragraph>fill last
+% line>openlastlinepar=\code{openlastlinepar}} takes care of \hyperref[item:o2]{case~O2},
+% i.\,e., a last line in a paragraph that is almost full or completely filled.
+%
+% \begin{synopsis}\label{syn:openlastlinepar}
+% \cs{begin}|{openlastlinepar}|\oarg{dim} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{openlastlinepar}|
+% \end{synopsis}
+%
+% It may resolve \hyperref[item:o2]{case~O2} as it attempts to prevent a completely filled line
+% by introducing a partly unshrinkable \cs{parfillskip}. Without optional argument the
+% threshold of unused last-line length is either
+% \makeatletter\dumpmacro{\typog@openlastlinepar@nonzero@parindent}\makeatother{} (if
+% \(\cs{parindent} \not= 0\)) or
+% \makeatletter\typog@openlastlinepar@zero@parindent\makeatother{} (if \(\cs{parindent} = 0\)).
+% The optional argument~\meta{dim} directly sets the gap threshold.
+%
+% Note that the application of this environment can be successful, this is, a completely filled
+% last line is avoided, but the result may be of \hyperref[item:o1]{type~O1} nonetheless.
+%
+%
+% \needtocspace
+% \Needspace{150pt}
+% \subsection{Spacing}\label{sec:spacing-control}\index{font>spacing}
+%
+% \begin{whittyquote}
+% 90~\% of design is typography. \\
+% And the other 90~\% is whitespace. \\
+% \capitalemdash*~\propername{Jeffrey Zeldman}
+% \end{whittyquote}
+%
+% \noindent
+% The functions described in this section rely only on plain \LaTeX. No extra packages are
+% required. Compare to the \packagename{microtype}-based functionality of
+% \cref{sec:microtype-frontend}.
+%
+%
+% \subsubsection[Looser\kernedslash Tighter]{Looser or Tighter Spacing}\label{sec:looser-tighter-spacing}\index{font>spacing>loose}\index{font>spacing>tight}
+%
+%
+% \begin{whittyquote}
+% Never try to adjust lines by squeezing or stretching the tracking. \\
+% Go for the subtle solution: adjust word spacing instead. \\
+% \capitalemdash*~\propername{Jan Middendorp}~\cite[p.~119]{middendorp:2014}
+% \end{whittyquote}
+%
+% \noindent
+% The environments in this section directly influence the spacing, this is, they change the
+% width and stretchability of the horizontal space.
+%
+% They at the one hand act gently by adjusting the spacing only by a small amount. On the
+% other hand they operate decidedly in controlling the glue associated with the adjusted space.
+% The latter also being important to ensure the monotonicity of the different \meta{level}s.
+% However, the strictly managed stretchability\slash shrinkability may lead to many overfull
+% boxes with \cs{fussy} or when applied to short lines.
+%
+% \DescribeEnv{loosespacing}
+% \DescribeEnv{tightspacing}
+% Environments |loosespacing| and |tightspacing| introduce four \meta{level}s of
+% \singlequotes{looseness} or \singlequotes{tightness}, where \meta{level}~=~0 disables the
+% functionalities. The higher the \meta{level} the looser or tighter the text will by typeset,
+% respectively.
+%
+% \begin{synopsis}\label{syn:loosespacing}
+% \cs{begin}|{loosespacing}|\oarg{level}
+% \dots{}
+% \cs{end}|{loosespacing}|
+% \end{synopsis}
+%
+% Environment~|loosespacing| increases the width of a space by the percentages given in the
+% \cref{tab:loosespacing}.
+%
+% \begin{SCtable}[10]
+% \caption[Spacing changes made by \code{loosespacing}]%
+% {Adjustments made by environment |loosespacing| to \cs{spaceskip}.
+% The mapping of \meta{level} to the exact skip definitions are
+% \(1 \mapsto \formatskip{1.05}{.5}{.1}\),
+% \(2 \mapsto \formatskip{1.1}{.5}{.1}\),
+% \(3 \mapsto \formatskip{1.2}{.6}{.2}\), and
+% \(\ge 4 \mapsto \formatskip{1.3}{.8}{.3}\),
+% where all factors scale with \cs{dimen2},
+% the current font's space-width.}
+% \label{tab:loosespacing}
+%
+% \begin{tabfigures}
+% \def~{\hphantom{0}}%
+% \begin{tabular}{@{}ccl@{}}
+% \toprule
+% \meta{level} & Adjustment & Comment \\
+% {} & \% & \\
+% \midrule
+% 0 & n/a & neutral \\
+% 1 & +5~ & default \\
+% 2 & +10 & \\
+% 3 & +20 & \\
+% \(\ge\)\:4 & +30 & \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{SCtable}
+%
+% The default level of |loosespacing| is~1.
+%
+% \begin{synopsis}\label{syn:tightspacing}
+% \cs{begin}|{tightspacing}|\oarg{level}
+% \dots{}
+% \cs{end}|{tightspacing}|
+% \end{synopsis}
+%
+% Environment~|tightspacing| decreases the width of a space by the percentages given in
+% \cref{tab:tightspacing}.
+%
+% \begin{SCtable}[10]
+% \caption[Spacing changes made by \code{tightspacing}]%
+% {Adjustments made by environment |tightspacing| to \cs{spaceskip}.
+% The mapping of \meta{level} to the exact skip definitions are
+% \(1 \mapsto \formatskip{.9875}{.0125}{.5\hphantom{000}}\)\!,
+% \(2 \mapsto \formatskip{.975}{.025}{.5\hphantom{00}}\)\!,
+% \(3 \mapsto \formatskip{.95}{.05}{.5\hphantom{0}}\)\!, and
+% \(\ge 4 \mapsto \formatskip{.9}{.1}{.5}\),
+% where all factors scale with \cs{dimen2},
+% the current font's space-width.}
+% \label{tab:tightspacing}
+%
+% \begin{tabfigures}
+% \def~{\hphantom{0}}%
+% \begin{tabular}{@{}ccl@{}}
+% \toprule
+% \meta{level} & Adjustment & Comment \\
+% {} & \% & \\
+% \midrule
+% 0 & n/a & neutral \\
+% 1 & ~{-}1.25 & default \\
+% 2 & ~{-}2.5~ & \\
+% 3 & ~{-}5\hphantom{.00} & \\
+% \(\ge\)\:4 & -10\hphantom{.00} & \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{SCtable}
+%
+% The default level of |tightspacing| is~1.
+%
+% \begin{note}
+% At a given \meta{level} the changes of |loosespacing| are much larger than those of
+% |tightspacing|.
+% \end{note}
+%
+% \begin{usecases}
+% Nudge line breaks or hyphenation points.~\visualpar Separate clashing descenders and
+% ascenders.~\visualpar Eliminate rivers.
+% \end{usecases}
+%
+%
+% \subsubsection{Wide Space}\label{sec:wide-space}\index{wide space}
+%
+% The \cs{widespace} macro and its companion \cs{narrowspace} derive their appearances from
+% several of the current font's \cs{fontdimen}\meta{number}s. \TeX{} addresses the latter by
+% integers, which is totally non-memnonic. Therefore, we play softball by first presenting
+% \cref{tab:fontdimen} that associates the \cs{fontdimen}\meta{number}s with their meanings and
+% also reports on their current values (for this document).\footnote{The association is given
+% in Appendix~F (p.~433) of Ref.~\citenum{knuth:1986}. For a concise and understandable
+% explanation of the \TeX~\cs{fontdimen} parameters consult Ref.~\citenum{carlisle:2013}.}
+%
+% \begin{SCtable}
+% \caption[\cs{fontdimen}\meta{number} parameters]
+% {The first column~\sample{\#} states the index of the \cs{fontdimen} parameter:
+% \meta{number}. Column~2 presents short descriptions of the
+% \cs{fontdimen}\meta{number} parameters. As examples, the values for the current
+% font are shown in column~3; they are normalized to the quad-size.\bottomstrut}
+% \label{tab:fontdimen}
+%
+% \begin{tabfigures}
+% \def~{\hphantom{0}}%
+% \ExplSyntaxOn
+% \def\straightfontdimen#1{\fp_eval:n {\the\fontdimen#1\font}}
+% \def\roundfontdimen#1{\fp_eval:n {round (1000 * \the\fontdimen#1\font) / 1000}}
+% \def\relativefontdimen#1{\fp_eval:n {round (1000 * \the\fontdimen#1\font / \the\fontdimen6\font) / 10}}
+% \ExplSyntaxOff
+%
+% \begin{tabular}{@{}lll@{}}
+% \toprule
+% \# & Description & Value \\
+% {} & & \multicolumn{1}{c}{\%} \\
+% \midrule
+% 1 & Slant per 1\,pt height & ~~\relativefontdimen1\topstrut \\
+% 2 & Interword space width & ~\relativefontdimen2 \\
+% 3 & Interword stretch & ~\relativefontdimen3 \\
+% 4 & Interword shrink & ~~\relativefontdimen4 \\
+% 5 & \sample{\itcorr{2}x\itcorr{2}} height & ~\relativefontdimen5 \\
+% 6 & \cs{quad} height & \relativefontdimen6 \\
+% 7 & Extra space width & ~~\relativefontdimen7 \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{SCtable}
+%
+% \DescribeMacro{\widespace}
+% \DescribeMacro{\widespace*}
+% \sinceversion{Starred form since v0.2}
+% Typeset a wide, sentence-ending space as if in \cs{nonfrenchspacing}~mode. Consult
+% \Cref{tab:space-sizes} for a comparison of the various sizes.
+%
+% \begin{synopsis}\label{syn:widespace}
+% \cs{widespace} \\
+% \cs{widespace*}
+% \end{synopsis}
+%
+% The unstarred macro~\cs{widespace} inserts a space that is as wide as the font's
+% sentence-ending space in \cs{nonfrenchspacing}~mode, this is
+% \begin{equation*}
+% |\fontdimen2| + \cs{widespacestrength} \times |\fontdimen7|.
+% \end{equation*}
+%
+% \noindent
+% Its width is independent of any \cs{frenchspacing} or \cs{nonfrenchspacing}~settings, but
+% depends on \cs{widespacestrength} which defaults
+% to~\widespacestrength\widespace\marginnote{The sentence that ends with
+% \singlequotes{\widespacestrength} uses \cs{widespace} after the period.} The latter can be
+% overridden by the user to get a more or less pronounced effect.
+%
+% If |\fontdimen7| happens to be zero \cs{widespace} uses
+% \begin{equation*}
+% \cs{widespacescale} \times |\fontdimen2|
+% \end{equation*}
+%
+% \noindent
+% as width instead, where \cs{widespacescale} defaults to \widespacescale. The stretchability
+% and shrinkability of \cs{widespace} always are scaled with \cs{widespacescale}. The
+% \cs{widespacescale} too can be redefined by the user to achieve different effects.
+%
+% The starred form, \cs{widespace*}, unconditionally uses the \(|\fontdimen7| = 0\) code-path.
+%
+% \begin{usecase}
+% Useful as a sentence-ending space if, for example, the sentence ends in an abbreviation
+% with a period or decimal number without trailing digits \emph{and} the next sentence should
+% be delimited in a clearer way.~\visualpar Open tight lines with a series
+% of~\cs{widespace}s.\footnote{\label{fn:widespace}See also \doublequotes{Investigating the
+% badness of a paragraph} on \Cpageref{sec:investigating-paragraph-badness}.}
+% \end{usecase}
+%
+%
+% \subsubsection{Narrow Space}\label{sec:narrow-space}\index{narrow space}
+%
+% \DescribeMacro{\narrowspace}
+% \DescribeMacro{\narrowspace*}
+% \sinceversion{Since v0.2}
+% Typeset a narrow space. Consult \Cref{tab:space-sizes} for a comparison of the various
+% sizes.
+%
+% \begin{synopsis}\label{syn:narrowspace}
+% \cs{narrowspace} \\
+% \cs{narrowspace*}
+% \end{synopsis}
+%
+% The unstarred macro~\cs{narrowspace} inserts a narrow space with the width
+% \begin{equation*}
+% |\fontdimen2| - \cs{narrowspacestrength} \times |\fontdimen7|
+% \end{equation*}
+%
+% \noindent
+% if |\fontdimen7| is different from zero or otherwise
+% \begin{equation*}
+% \cs{narrowspacescale} \times |\fontdimen2|.
+% \end{equation*}
+%
+% \noindent
+% The starred version, \cs{narrowspace*}, unconditionally uses the \(\cs{fontdimen7} = 0\)
+% code-path. Refer to \Cref{tab:fontdimen} for the meanings of the various
+% \cs{fontdimen}~parameters.
+%
+% The stretchability and shrinkability of \cs{narrowspace} always get scaled with
+% \cs{narrowspacescale}. Both factors, \cs{narrowspacestrength} and \cs{narrowspacescale} can
+% be redefined by the user; their defaults are \narrowspacestrength{} and \narrowspacescale,
+% respectively.
+%
+% \begin{usecase}
+% Tighten loose lines with a series of~\cs{narrowspace}s.\footnote{Footnote
+% \ref{fn:widespace} again applies.}
+% \end{usecase}
+%
+% \begin{table}
+% \centering
+% \caption[Comparison of some space sizes]
+% {Exemplary comparison of standard \cs{space} versus \cs{narrowspace} and
+% \cs{widespace}. All values are relative to the size of the current font's quad
+% size. \cs{narrowspace} and \cs{widespace} use the package's defaults.~\visualpar
+% The upper values in the Width-column for \cs{narrowspace}, and \cs{widespace}
+% refer to the \(\cs{fontdimen7} \not= 0\) case and the lower ones to the
+% \(\cs{fontdimen7} = 0\) code-path.}
+% \label{tab:space-sizes}
+%
+% \begin{tabfigures}
+% \def~{\hphantom{0}}%
+% \ExplSyntaxOn
+% \def\relativedimen#1{\fp_eval:n {round (1000 * (#1) / \the\fontdimen6\font) / 10}}
+% \def\relativefontdimen#1{\relativedimen{\the\fontdimen#1\font}}
+% \ExplSyntaxOff
+% \def\nrows{1.75}
+%
+% \begin{tabular}{@{}llll@{}}
+% \toprule
+% Name & Width & Stretch & Shrink \\
+% {} & \% & \% & \% \\
+% \midrule
+% \multirow{\nrows}{*}{\cs{narrowspace}} &
+% \relativedimen{\the\fontdimen2\font - \narrowspacestrength * \the\fontdimen7\font} &
+% \multirow{\nrows}{*}{\relativedimen{\narrowspacescale * \the\fontdimen3\font}} &
+% \multirow{\nrows}{*}{\relativedimen{\narrowspacescale * \the\fontdimen4\font}} \\[-.25\normalbaselineskip]
+% {} & \relativedimen{\narrowspacescale * \the\fontdimen2\font} & & \\
+% \cs{space} & \relativefontdimen2 & \relativefontdimen3 & \relativefontdimen4 \\
+% \multirow{\nrows}{*}{\cs{widespace}} &
+% \relativedimen{\the\fontdimen2\font + \widespacestrength * \the\fontdimen7\font} &
+% \multirow{\nrows}{*}{\relativedimen{\widespacescale * \the\fontdimen3\font}} &
+% \multirow{\nrows}{*}{\relativedimen{\widespacescale * \the\fontdimen4\font}} \\[-.25\normalbaselineskip]
+% {} & \relativedimen{\widespacescale * \the\fontdimen2\font} & & \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{table}
+%
+%
+% \subsection{\packagename{Microtype} Front\capitalhyphen End}\label{sec:microtype-frontend}
+% \index{microtype=\packagename{microtype} (package)}
+%
+% The functionalities are just front-ends of selected macros in
+% package~\packagename{microtype} -- welcome syntactic sugar.
+%
+% \begin{important}
+% All macros and environments introduced in this section require that
+% package~\packagename{microtype}~\cite{package:microtype} has been loaded, preferably
+% \emph{before} package~\packagename{typog}
+%
+% \begin{codeexample}
+% \cs{usepackage}[\meta{microtype-options}\dots]\{microtype\} \\
+% \cs{usepackage}[\meta{typog-options}\dots]\{typog\}
+% \end{codeexample}
+%
+% \noindent
+% in the document preamble.
+% \end{important}
+%
+%
+% \subsubsection{Tracking}\label{sec:tracking-control}\index{font>tracking}
+%
+% \begin{caution}
+% The tracking changes may interfere with implicit changes of tracking declared with
+% \cs{SetTracking}. Explicit calls to \cs{textls} remain in effect.
+% \end{caution}
+%
+% \noindent
+% \DescribeEnv{setfonttracking}
+% Override the default tracking for all fonts.
+%
+% \begin{synopsis}\label{syn:setfonttracking}
+% \cs{begin}|{setfonttracking}|\marg{delta} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{setfonttracking}|
+% \end{synopsis}
+%
+% The environment~|setfonttracking| manages a group for \cs{lsstyle} of
+% package~\packagename{microtype}. The change \meta{delta} in tracking is given as multiples
+% of \nativetextfraction{1}{1000}\,em. Positive as well as negative values of \meta{delta} are
+% allowed.
+%
+% See Sec.~5.3, \singlequotes{Tracking}, and~7, \doublequotes{Letterspacing revisited}, in the
+% documentation of \packagename{microtype}~\cite{package:microtype} for a detailed explanation.
+%
+% For font combinations involving monospaced fonts (\TeX{} lingo: typewriter) an overly large
+% spacing may show up at the borders where fonts change. This is caused by the calculation of
+% the \doublequotes{outer spacing} described in Sec.~5.3 of the \packagename{microtype}~manual.
+%
+% Use configuration variable~\hyperref[item:trackingttspacing]{\code{trackingttspacing}} to
+% reduce the outer spacing to a reasonable value either directly at package-load time
+%
+% \begin{codeexample}
+% \cs{usepackage}[trackingttspacing=\{250, 75, 50\}]\{typog\}
+% \end{codeexample}
+%
+% \noindent
+% or with the help of \cs{typogsetup} in the document \emph{preamble} (after loading
+% \packagename{microtype} and \packagename{typog})
+%
+% \begin{codeexample}
+% \cs{typogsetup}\{trackingttspacing=\{250, 75, 50\}\}
+% \end{codeexample}
+%
+% If the argument of option~\code{trackingttspacing} is omitted the outer spacing defaults to
+% \makeatletter\mbox{\typog@trackingttspacing}\makeatother.
+%
+% \begin{usecases}
+% Nudge line breaks or hyphenation points.~\visualpar Avoid clashes of descenders and
+% ascenders, e.\,g., for \cs{smash}ed symbols of inline math.~-- Think of
+% integrals.~\visualpar Control the length of the last line in a paragraph.
+% \end{usecases}
+%
+%
+% \subsubsection{Font Expansion}\label{sec:font-expansion-control}\index{font>expansion}
+%
+% \DescribeEnv{setfontshrink}
+% \DescribeEnv{setfontstretch}
+% Adjust the limits of either only stretchability or only shrinkability and zero the other
+% component, i.\,e., shrinkability and stretchability, respectively.
+%
+% \begin{synopsis}\label{syn:setfontshrink}\label{syn:setfontstretch}
+% \cs{begin}|{setfontshrink}|\marg{level}
+% \dots{}
+% \cs{end}|{setfontshrink}| \\
+% \cs{begin}|{setfontstretch}|\marg{level}
+% \dots{}
+% \cs{end}|{setfontstretch}|
+% \end{synopsis}
+%
+% A \meta{level} of zero is a no-op. \Cref{tab:setfontshrink-values,tab:setfontstretch-values}
+% summarize the values for |stretch| and |shrink| in these environments.
+%
+% \begin{SCtable}
+% \caption[Shrink values of \code{setfontshrink}]%
+% {\slightlysloppy[2] Preconfigured values for |shrink| inside of
+% environment~\code{setfontshrink}. Note that all |stretch| values are zero, so the fonts
+% only can shrink.}
+% \label{tab:setfontshrink-values}
+%
+% \begin{tabfigures}
+% \begin{tabular}{@{}cccl@{}}
+% \toprule
+% \meta{level} & |stretch| & |shrink| & Comment \\
+% {} & \nativetextfraction{1}{1000}\,em & \nativetextfraction{1}{1000}\,em & \\
+% \midrule
+% 0 & n/a & n/a & no operation \\
+% 1 & 0 & \hphantom{0}\makeatletter\typog@shrink@i\makeatother & default \\
+% 2 & 0 & \makeatletter\typog@shrink@ii\makeatother & \\
+% 3 & 0 & \makeatletter\typog@shrink@iii\makeatother & \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{SCtable}
+%
+% \begin{SCtable}
+% \centering
+% \caption[Stretch values of \code{setfontstretch}]%
+% {\slightlysloppy[2] Preconfigured values for |stretch| inside of
+% environment~\code{setfontstretch}. Note that all |shrink| values are zero, so the fonts
+% only can stretch.}
+% \label{tab:setfontstretch-values}
+%
+% \begin{tabfigures}
+% \begin{tabular}{@{}cccl@{}}
+% \toprule
+% \meta{level} & |stretch| & |shrink| \\
+% {} & \nativetextfraction{1}{1000}\,em & \nativetextfraction{1}{1000}\,em & \\
+% \midrule
+% 0 & n/a & n/a & no operation \\
+% 1 & \hphantom{0}\makeatletter\typog@stretch@i\makeatother & 0 & default \\
+% 2 & \makeatletter\typog@stretch@ii\makeatother & 0 & \\
+% 3 & \makeatletter\typog@stretch@iii\makeatother & 0 & \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{SCtable}
+%
+% The three (nonzero) shrink limits of \code{setfontshrink} can be configured with package
+% option~\hyperref[item:shrinklimits]{\code{shrinklimits}} and --~in the same way~-- the three
+% (nonzero) stretch limits of \code{setfontstretch} with package
+% option~\hyperref[item:stretchlimits]{\code{stretchlimits}}.
+%
+% \begin{usecases}
+% Nudge line breaks or hyphenation points.~\visualpar Control the length of the last line in
+% a paragraph.
+% \end{usecases}
+%
+% \noindent
+% \DescribeEnv{setfontexpand}
+% Manipulate both, |stretch| and |shrink|~values at the same time.
+%
+% \begin{synopsis}\label{syn:setfontexpand}
+% \cs{begin}|{setfontexpand}|\marg{level}
+% \dots{}
+% \cs{end}|{setfontexpand}|
+% \end{synopsis}
+%
+% \Cref{tab:setfontexpand-values} gives an overview of the values associated with \meta{level}.
+%
+% \begin{SCtable}
+% \caption[Shrink and stretch values of \code{setfontexpand}]%
+% {\slightlysloppy[2] Preconfigured values for |shrink| and |stretch| inside of
+% environment~\code{setfontexpand}. Note that both |shrink| and |stretch| values are
+% nonzero, so the fonts can shrink or expand.}
+% \label{tab:setfontexpand-values}
+%
+% \begin{tabfigures}
+% \begin{tabular}{@{}cccl@{}}
+% \toprule
+% \meta{level} & |stretch| & |shrink| & Comment \\
+% {} & \nativetextfraction{1}{1000}\,em & \nativetextfraction{1}{1000}\,em & \\
+% \midrule
+% 0 & n/a & n/a & no operation \\
+% 1 & \hphantom{0}\makeatletter\typog@stretch@i\makeatother & \hphantom{0}\makeatletter\typog@stretch@i\makeatother & default \\
+% 2 & \makeatletter\typog@stretch@ii\makeatother & \makeatletter\typog@stretch@ii\makeatother & \\
+% 3 & \makeatletter\typog@stretch@iii\makeatother & \makeatletter\typog@stretch@iii\makeatother & \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{SCtable}
+%
+% The six shrink and stretch limits of \code{setfontexpand} can be configured with package
+% options~\hyperref[item:shrinklimits]{\code{shrinklimits}}
+% and~\hyperref[item:stretchlimits]{\code{stretchlimits}}.
+%
+% \begin{notes}
+% \begin{itemize}[notopsep]
+% \item Environment~|setfontexpand| shares its
+% \hyperref[item:shrinklimits]{\code{shrinklimits}} with \code{setfontshrink} and its
+% \hyperref[item:stretchlimits]{\code{stretchlimits}} with \code{setfontstretch}.
+%
+% \item These environments do not nail down any font's expansion but only set up its
+% available range. See Sec.~3.3, \doublequotes{Font Expansion}, in the
+% \packagename{microtype} documentation~\cite{package:microtype}.
+%
+% Moreover, a text may not \singlequotes{respond} neither to \code{setfontshrink},
+% \code{setfontstretch}, nor~\code{setfontexpand} because \TeX{} already considers it
+% optimal without expansion or within the previous expansion limits, e.\,g., those set at
+% \packagename{microtype} load~time as opposed to \packagename{typog}'s
+% load~time.\specialsectionendhere
+% \end{itemize}
+% \end{notes}\unskip
+%
+% \begin{usecases}
+% Nudge line breaks or hyphenation points.~\visualpar Control the length of a paragraph,
+% e.\,g., to avoid a widow.
+% \end{usecases}
+%
+% \noindent
+% \DescribeEnv{nofontexpansion}
+% Disable the \packagename{microtype} feature~\singlequotes{expansion} inside of the
+% environment.
+%
+% \begin{synopsis}\label{syn:nofontexpansion}\label{syn:nofontexpand}
+% \cs{begin}|{nofontexpansion}|
+% \dots{}
+% \cs{end}|{nofontexpansion}| \\[\smallskipamount]
+% |nofontexpand|~(alias)
+% \end{synopsis}
+%
+% The name |nofontexpand| is an alias for~|nofontexpansion|.
+%
+% \begin{usecases}
+% Nudge line breaks or hyphenation points.~\visualpar Prevent severe scaling effects in
+% paragraphs strongly manipulated by other means, e.\,g.,
+% \hyperref[syn:shortenpar]{\code{shortenpar}}
+% or~\hyperref[syn:prolongpar]{\code{prolongpar}}.
+% \end{usecases}
+%
+%
+% \subsubsection{Character Protrusion}\label{sec:protrusion}\index{font>protrusion}
+%
+% \DescribeEnv{nocharprotrusion}
+% Disable the \packagename{microtype} feature~\singlequotes{protrusion} inside of the
+% environment.
+%
+% \begin{synopsis}\label{syn:nocharprotrusion}
+% \cs{begin}|{nocharprotrusion}|
+% \dots{}
+% \cs{end}|{nocharprotrusion}|
+% \end{synopsis}
+%
+% \begin{usecases}
+% Table of Contents or similar tables with aligned section numbers.~\visualpar Any table with
+% left- or right-aligned numerals in particular tabular numerals.~\visualpar Index.
+% \end{usecases}
+%
+%
+% \FloatBarrier
+% \subsection{Sloppy Paragraphs}\label{sec:sloppy-paragraphs}\index{paragraph>sloppy}
+%
+% Experienced \LaTeX{} users know that \cs{sloppy} is more of a problem by itself and not
+% really a viable solution of the \doublequotes{overfull~box} syndrome.
+%
+% \DescribeMacro{\slightlysloppy}
+% \DescribeEnv{slightlysloppypar}
+% We define the macro~\cs{slightlysloppy} and the associated environment,
+% \code{slightlysloppypar}, with a user-selectable \meta{sloppiness} parameter. The
+% constructions recover the known settings \cs{fussy} (\meta{sloppiness}~=~0) and \cs{sloppy}
+% (\meta{sloppiness}~\(\ge\)~8), and introduce seven intermediate
+% \meta{sloppiness}~levels.\footnote{Also compare the findings for \cs{emergencystretch} in
+% Ref.~\citenum{wermuth:2017a}.} The default \meta{sloppiness} is 1.
+%
+% \begin{synopsis}\label{syn:slightlysloppy}\label{syn:slightlysloppypar}
+% \cs{slightlysloppy}\oarg{sloppiness} \\[\smallskipamount]
+% \cs{begin}|{slightlysloppypar}|\oarg{sloppiness} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{slightlysloppypar}|
+% \end{synopsis}
+%
+% \Cref{tab:slightlysloppy} summarizes the adjustments that \cs{slightlysloppy} makes depending
+% on the \meta{sloppiness}~level.
+%
+% \begin{table}
+% \centering
+% \caption[Parameter adjustments of \cs{slightlysloppy}]%
+% {Adjustments made by \cs{slightlysloppy} to various \TeX~parameters at different
+% levels of \meta{sloppiness}.}
+% \label{tab:slightlysloppy}
+%
+% \newcommand*{\tolerancemark}{\tablenotemark{\dag}}%
+% \newcommand*{\scaledmark}{\tablenotemark{\ddag}}%
+%
+% \begin{suspendshortverb}
+% \begin{tabfigures}
+% \begin{tabular}{@{}ccccl@{}}
+% \toprule
+% \meta{sloppiness} & \cs{toler-} & \cs{hfuzz} & \cs{emergency-} & Comment \\
+% {} & \code{ance} & \cs{vfuzz} & \code{stretch}~\(G\) & \\
+% {} & & pt & em & \\
+% \midrule
+% 0 & \hphantom{0}200\hphantom{\tolerancemark} & .1\hphantom{0} & 0\hphantom{.000\scaledmark} & \TeX: \verb+\fussy+ \\
+% 1 & \hphantom{0}330\tolerancemark & .15 & \hphantom{0}.375\scaledmark & default \\
+% 2 & \hphantom{0}530\tolerancemark & .2\hphantom{0} & \hphantom{0}.75\scaledmark\hphantom{0} & \\
+% 3 & \hphantom{0}870\tolerancemark & .25 & 1.125\scaledmark & \\
+% 4 & 1410\tolerancemark & .3\hphantom{0} & 1.5\scaledmark\hphantom{00} & \\
+% 5 & 2310\tolerancemark & .35 & 1.875\scaledmark & \\
+% 6 & 3760\tolerancemark & .4\hphantom{0} & 2.25\scaledmark\hphantom{0} & \\
+% 7 & 6130\tolerancemark & .45 & 2.625\scaledmark & \\
+% \(\ge\)\:8 & 9999\hphantom{\tolerancemark} & .5\hphantom{0} & 3\hphantom{.000\scaledmark} & \TeX: \verb+\sloppy+ \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+% \end{suspendshortverb}
+%
+% \begin{tablenotes}
+% \tolerancemark\enspace
+% All intermediate levels set \(\cs{pretolerance} = \cs{tolerance} / 2\).
+%
+% \scaledmark\enspace
+% The intermediate levels scale the amount of available glue~\(G\) (indicated in column~4
+% of the table) for \cs{emergencystretch} with the actual line length, this means, in these
+% levels
+% \begin{equation*}
+% \cs{emergencystretch} = G \times \frac{\cs{linewidth}}{\cs{textwidth}}.
+% \end{equation*}
+% to prevent excessive stretchability in narrow lines.
+% \end{tablenotes}
+% \end{table}
+%
+% Environment~|slightlysloppypar|\oarg{sloppiness} mimics \LaTeX's~\code{sloppypar}, while
+% offering the flexibility of~\cs{slightlysloppy}.
+%
+% \begin{usecases}
+% Drop-in replacement for \cs{sloppy}, whether explicit or implicit (think of
+% \cs{parbox}).~\visualpar Initial paragraphs in theorem environments (e.\,g., as defined by
+% \packagename{amsmath} or \packagename{amsthm}), where the theorem~head already takes a lot
+% of space.~\visualpar Bibliographies as environment~\code{thebibliography} sets~\cs{sloppy}.
+% \end{usecases}
+%
+%
+% \FloatBarrier
+% \subsection{Vertically Partially-Tied Paragraphs}\label{sec:vtie-paragraph}\index{paragraph>vertically tied}
+%
+% \LaTeX{} provides several macros and environments to tie material vertically~-- most
+% prominently |samepage| and |minipage|.\footnote{A valuable complement to these is
+% package~\packagename{needspace}~\cite{package:needspace} which takes a different approach and
+% reliably works in \emph{mixed} horizontal and vertical mode situations.}
+% \packagename{Typog's} macros and environments constitute more sophisticated but weaker forms
+% of these. They tie only the first or last couple of lines in a paragraph while the rest of
+% the paragraph gets broken into pages by \TeX{} in the usual way.
+%
+% The macros and environments described in this section locally set \eTeX{} penalty
+% arrays~\cite[Sec.~3.8]{package:etex}. In addition the environments~\code{vtietoppar},
+% \code{vtiebotpar}, and~\code{vtiebotdisptoppar} explicitly issue a \cs{par} at the end of the
+% group.
+%
+% \DescribeMacro{\vtietop}
+% \DescribeEnv{vtietoppar}
+% Avoid a club\index{forlorn line>club} line in each partial paragraph.
+%
+% \begin{synopsis}\label{syn:vtietop}\label{syn:vtietoppar}
+% \cs{vtietop}\oarg{number-of-lines} \\[\smallskipamount]
+% \cs{begin}|{vtietoppar}|\oarg{number-of-lines}
+% \dots{}
+% \cs{end}|{vtietoppar}|
+% \end{synopsis}
+%
+% Vertically tie the first \meta{number\hyp{}of\hyp{}lines} in a paragraph. Zero or one for
+% \meta{number\hyp{}of\hyp{}lines} are no-ops. Up to nine lines can be fused. The default is
+% to link three lines.
+%
+% \begin{usecases}
+% String together the first paragraph right after a sectioning command.~\visualpar Tie the
+% first line of an itemized, enumerated, or a description list\index{list} with the paragraph
+% following~\cs{item}.
+% \end{usecases}
+%
+% \noindent
+% \DescribeMacro{\splicevtietop}
+% Inside of a \code{list} a one-off solution simply concatenates \cs{item}[\dots]\cs{vtietop}
+% to fuse the line with the \code{item\#}, the representation of the \code{enum\#}, or the
+% description term with the first paragraph. For a systematic use prefer \cs{splicevtietop}
+% and apply it as the first thing in the \code{list}~body.
+%
+% \begin{synopsis}\label{syn:splicevtietop}
+% \cs{splicevtietop}\oarg{number-of-lines}
+% \end{synopsis}
+%
+% Use this macro \emph{inside} of a \code{list}-like environment to equip each \cs{item} with
+% \cs{vtietop}\oarg{number-of-lines}. The default \meta{number-of-lines} is three as for any
+% of the \code{vtie\dots}~functions.
+%
+% Example for a \code{description}~list and plain \LaTeX:
+%
+% \begin{codeexample}
+% 12\=\kill
+% \cs{begin}\{description\} \\
+% \> \cs{splicevtietop}[2] \\
+% \> \cs{item}[...] \\
+% \cs{end}\{description\}
+% \end{codeexample}
+%
+% Alternatively with package~\packagename{enumitem}~\cite{package:enumitem}:
+%
+% \begin{codeexample}
+% 12\=\kill
+% \cs{begin}\= \{description\}[first=\cs{splicevtietop[2]}] \\
+% \> \cs{item}[...] \\
+% \cs{end}\{description\}
+% \end{codeexample}
+%
+% \noindent
+% or shorter and with the default \meta{number-of-lines},~3, using the \packagename{enumitem}
+% style\footnote{The documentation of \packagename{enumitem} prosaically calls them
+% \singlequotes{keys} (Section~3) not \singlequotes{styles}.}~\code{vtietop}:
+%
+% \DescribeEnumItemKey{vtietop}
+% \begin{codeexample}
+% \cs{usepackage}\{enumitem\} \\
+% \cs{begin}\= \{description\}[vtietop] \\
+% ~~\cs{item}[...] \\
+% \cs{end}\{description\}
+% \end{codeexample}
+%
+% \medskip
+%
+% \noindent
+% \DescribeMacro{\vtiebot}
+% \DescribeEnv{vtiebotpar}
+% Avoid a widow\index{forlorn line>widow} line in each partial paragraph.
+%
+% \begin{synopsis}\label{syn:vtiebot}\label{syn:vtiebotpar}
+% \cs{vtiebot}\oarg{number-of-lines} \\[\smallskipamount]
+% \cs{begin}|{vtiebotpar}|\oarg{number-of-lines}
+% \dots{}
+% \cs{end}|{vtiebotpar}|
+% \end{synopsis}
+%
+% Vertically tie the last \meta{number\hyp{}of\hyp{}lines} in a paragraph. Zero or one for
+% \meta{number\hyp{}of\hyp{}lines} are no-ops. Up to nine lines can be fused. The default is
+% to link three lines.
+%
+% \noindent
+% \DescribeEnv{vtiebotdisp}
+% Avoid a display widow\index{forlorn line>display widow} line in each partial paragraph.
+%
+% \begin{synopsis}\label{syn:vtiebotdisp}\label{syn:vtiebotdisppar}
+% \cs{begin}|vtiebotdisp|\oarg{before-disp-number-of-lines} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{vtiebotdisp}|
+% \end{synopsis}
+%
+% Vertically tie the last \meta{before\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} in a paragraph
+% before a display. Zero or one for \meta{before\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} are
+% no-ops. Up to nine lines can be fused. The default is to link three lines.
+%
+% To use the function bracket the paragraph before the display (the one that needs protection)
+% and the associated displayed math:
+%
+% \begin{codeexample}
+% \cs{begin}\{vtiebotdisp\} \\
+% ~~\% vertically tied paragraph before the math display \\
+% ~~\cs{begin}\{equation\} \\
+% ~~~~\% math \\
+% ~~\cs{end}\{equation\} \\
+% \cs{end}\{vtiebotdisp\}
+% \end{codeexample}
+%
+% \DescribeEnv{vtiebotdisptoppar}
+% Avoid a display widow, compound the display with its preceding \emph{and} following
+% paragraph, and avoid a club line in the paragraph right after the display.
+%
+% \begin{synopsis}\label{syn:vtiebotdisptop}\label{syn:vtiebotdisptoppar}
+% \begin{tabbing}
+% \cs{begin}|{vtiebotdisptoppar}|\= \oarg{before-disp-number-of-lines} \\
+% \> \oarg{after-disp-number-of-lines} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{vtiebotdisptoppar}|
+% \end{tabbing}
+% \end{synopsis}
+%
+% Vertically tie the last \meta{before\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} in the
+% paragraph before a display and the first
+% \meta{after\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} in the paragraph after the display.
+% Moreover, turn the paragraphs and the display into an un-breakable unit.\footnote{The
+% paragraphs and the display are concreted together by setting both \cs{predisplaypenalty}
+% and~\cs{postdisplaypenalty} to~10000.}
+%
+% Zero or one for \meta{before-disp-number\hyp{}of\hyp{}lines} as well as
+% \meta{after\hyp{}disp\hyp{}number\hyp{}of\hyp{}lines} are no-ops for the respective
+% paragraph. Up to nine lines each can be fused.
+%
+% Both optional arguments default to three. If only the first argument is given the second
+% acquires the same value.
+%
+%
+% To use the function bracket the paragraphs before and after the display:
+%
+% \begin{codeexample}
+% \cs{begin}\{vtiebotdisptoppar\} \\
+% ~~\% vertically tied paragraph before the math display \\
+% ~~\cs{begin}\{equation\} \\
+% ~~~~\% math \\
+% ~~\cs{end}\{equation\} \\
+% ~~\% vertically tied paragraph after the math display \\
+% \cs{end}\{vtiebotdisptoppar\}
+% \end{codeexample}
+%
+% \smallskip
+%
+% \noindent
+% See also \cref{sec:fill-last-line-gp-environments} for other methods to avoid club or widow
+% lines.
+%
+% \begin{typoginspectpar}{partial-paragraphs}
+% \setlength{\smoothraggedrightragwidth}{8pt}
+% \paragraph{Partial Paragraphs And Counting Lines.} The top-of-paragraph ties, \cs{vtietop}
+% and \code{vtietoppar} count \meta{number\hyp{}of\hyp{}lines} from the beginning of every
+% partial paragraph. Each displayed math in the paragraph resets the count. The
+% bottom-paragraph ties, \cs{vtiebot}, \code{vtiebotpar}, \cs{vtiebotdisp}, and
+% \code{vtiebotdisppar} count backward from the end of each partial paragraph. Again, each
+% displayed math in the paragraph resets the count. According to \TeX's rules, a displayed
+% math formula always is counted as \emph{three} lines no matter its contents.
+% \Cref{tab:partial-paragraph-line-counts} summarizes these rules with the help of an
+% example.
+% \end{typoginspectpar}
+%
+% \begin{table}
+% \centering
+% \caption[Partial paragraph line counts]
+% {Exemplary, eight-line paragraph compounded of two partial paragraphs of three and
+% two lines and a displayed math formula of arbitrary size sandwiched in between.}
+% \label{tab:partial-paragraph-line-counts}
+%
+% \newcommand*{\clubmark}{\tablenotemark{\dag}}
+% \newcommand*{\widowmark}{\tablenotemark{\ddag}}
+%
+% \begin{tabfigures}
+% \begin{tabular}{@{}clcc@{}}
+% \toprule
+% Continuous & Example & \cs{vtietop}\clubmark & \cs{vtiebot}\widowmark \\
+% Line Number & Contents & Count & Count \\
+% \midrule
+% 1 & Text line\textsubscript{1} & 1 & 3 \\
+% 2 & Text line\textsubscript{2} & 2 & 2 \\
+% 3 & Text line\textsubscript{3} & 3 & 1 \\
+% 4 & & & \\
+% 5 & \(\smash{\Biggr\}}\) \parbox[c][0pt]{3.5em}{Display \\[-.12em] math} & & \\
+% 6 & & & \\
+% 7 & Text line\textsubscript{4} & 1 & 2 \\
+% 8 & Text line\textsubscript{5} & 2 & 1 \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+%
+% \begin{tablenotes}
+% \clubmark\enspace
+% This is \eTeX's counting scheme of \cs{clubpenalties}; it also holds for
+% \code{vtietoppar}.
+%
+% \widowmark\enspace
+% The same counting scheme also holds for \code{vtiebotpar}, \cs{vtiebotdisp},
+% and~\code{vtiebotdisppar}. It is implied by \eTeX's line counts of \cs{widowpenalties}
+% and~\cs{displaywidowpenalties} on which the functions of this package are based.
+% \end{tablenotes}
+% \end{table}
+%
+% \begin{tips}
+% \begin{itemize}[notopsep]
+% \item The environments can be combined to arrive at paragraphs that simultaneously are
+% protected against club lines and (display) widow lines.
+%
+% \item For very long derivations that are not interrupted and thus made breakable with the
+% help of \cs{intertext}\footnote{Introduced in
+% package~\packagename{amsmath}~\cite{package:amsmath}.} or
+% \cs{shortintertext}\footnote{Defined in
+% package~\packagename{mathtools}~\cite{package:mathtools}.} it is desirable to make the
+% display breakable. This is achieved with \cs{allowdisplaybreaks} or the
+% environment~\code{breakabledisplay} which will be described
+% in~\cref{sec:breakable-display}.\specialsectionendhere
+% \end{itemize}
+% \end{tips}\unskip
+%
+% \begin{usecases}
+% Fix widows and orphans, e.\,g., those turned up by
+% package~\packagename{widows-and-orphans}~\cite{package:widows-and-orphans}.~\visualpar
+% Extend the typographic convention of \doublequotes{three to four lines instead of a single
+% club or widow line} to a context-dependent number of lines that tries to keep all (well,
+% dream on) the information together the reader needs at that particular point.
+% \end{usecases}
+%
+%
+% \FloatBarrier
+% \subsection{Breakable Displayed Equations}\label{sec:breakable-display}\index{page break}
+%
+% \DescribeEnv{breakabledisplay}
+% Package~\packagename{amsmath}\index{amsmath=\packagename{amsmath} (package)} offers
+% \cs{allowdisplaybreaks} to render displayed equations breakable at each of their lines.
+% Environment~\cs{breakabledisplay} is a wrapper around it which limits the macro's influence
+% to the environment. Furthermore, the default \meta{level} of \code{breakabledisplay} is~3
+% whereas that of \cs{allowdisplaybreaks} is~4. This makes \code{breakabledisplay} less eager
+% to break a displayed equation and thus better suited to full automation of the page-breaking
+% process.
+%
+% \begin{synopsis}\label{syn:breakabledisplay}
+% \cs{begin}|{breakabledisplay}|\oarg{level} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{breakabledisplay}|
+% \end{synopsis}
+%
+% Environment~|breakabledisplay| simply passes on \meta{level} to \cs{allowdisplaybreaks}.
+% \Cref{tab:allowdisplaybreaks-penalties} shows the default penalties that
+% \packagename{amsmath} associated with each of the \meta{level}s.
+%
+% \begin{table}
+% \centering
+% \caption[Env.~\code{breakabledisplay} and \cs{interdisplaylinepenalty}]%
+% {Penalties~\cs{interdisplaylinepenalty} associated with different \meta{level}s of
+% environment~\code{breakabledisplay}. Depending on the version of
+% package~\packagename{amsmath} the actual penalties may differ.}
+% \label{tab:allowdisplaybreaks-penalties}
+%
+% \newcommand*{\clubmark}{\tablenotemark{\dag}}
+%
+% \begin{tabfigures}
+% \begin{tabular}{@{}ccl@{}}
+% \toprule
+% \meta{level} & \cs{interdisplay-} & Comment \\
+% {} & \code{linepenalty} & \\
+% \midrule
+% 0 & 10000 & no operation \\
+% 1 & \hphantom{0}9999 & \\
+% 2 & \hphantom{0}6999 & \\
+% 3 & \hphantom{0}2999 & default \\
+% 4 & \hphantom{0000}0\rlap{\clubmark} & \\
+% \bottomrule
+% \end{tabular}
+% \end{tabfigures}
+%
+% \begin{tablenotes}
+% \clubmark\enspace
+% This is the default of \cs{allowdisplaybreaks}.
+% \end{tablenotes}
+% \end{table}
+%
+% \begin{tips}
+% \begin{itemize}[notopsep]
+% \item Terminating a line with \code{\textbackslash\textbackslash*} inhibits a break after
+% this line.
+%
+% \item A \cs{displaybreak}\oarg{level} can be set for \emph{each} line of the displayed
+% equation separately. \LaTeX{} resumes with the original value of
+% \cs{interdisplaylinepenalty} in the following lines.
+%
+% \item If a discretionary break of the displayed equation is to be accompanied with some aid
+% for the reader, team \cs{intertext} (or \cs{shortintertext}) with \cs{displaybreak} as,
+% e.\,g.,
+%
+% \begin{codeexample}
+% \cs{newcommand*}\{\cs{discretionarydisplaybreak}\} \\
+% 12\=3\=\kill
+% \> \{ \> \cs{intertext}\{\cs{hfill} Eq.\textasciitilde cont.\textasciitilde on next page.\}\% \\
+% \> \> \cs{displaybreak} \\
+% \> \> \cs{intertext}\{Eq.\textasciitilde cont.\textasciitilde
+% from prev.\textasciitilde page.\cs{hfill}\}\}\specialsectionendhere
+% \end{codeexample}
+% \end{itemize}
+% \end{tips}\unskip
+%
+% \begin{usecases}
+% Extremely long derivations without interspersed \cs{intertext} or
+% \cs{shortintertext}.~\visualpar Draft phase of a document.
+% \end{usecases}
+%
+%
+% \FloatBarrier
+% \clearpage
+% \subsection{\packagename{Setspace} Front-End}\label{sec:setspace-frontend}
+%
+% Package \packagename{setspace} \cite{package:setspace} is a base hit when it comes to
+% consistently setting the line skip for a document via the macro~\cs{setstretch}. The
+% interface of \cs{setstretch} though is unintuitive as it asks for an obscure
+% factor.\fontsizeinfo{setspacefontsizeinfo}\marginnote{In the copy of this document gets
+% typeset with~\setspacefontsizeinfo*.} The \LaTeX{} user however prefers to keep her eyes on
+% the ball and set the line skip\index{baseline skip} directly (e.\,g.~12.5pt) or the lines'
+% leading\index{leading} to a length or percentage of the font's size.\footnote{To find out
+% about the current font's size and the \cs{baselineskip} in printable form check out
+% \cref{sec:font-information} on \cpageref{sec:font-information}.} This is where the following
+% macros go to bat.
+%
+% \begin{important}
+% All macros that are introduced in this section rely on macro~\cs{setstretch}. So
+% package~\packagename{setspace} must have been loaded with
+%
+% \begin{codeexample}
+% \cs{usepackage}\{setspace\}
+% \end{codeexample}
+%
+% \noindent
+% in the document preamble.
+% \end{important}
+%
+% \DescribeMacro{\setbaselineskip}
+% \sinceversion{Since v0.3}
+% Set the line skip using an absolute length -- technically: a |dimen|.
+%
+% \begin{synopsis}\label{syn:setbaselineskip}
+% \cs{setbaselineskip}\marg{baseline-skip}
+% \end{synopsis}
+%
+% Set the \cs{baselineskip} to \meta{baseline-skip}. This is what a non-initiated user expects
+% from the assignment
+%
+% \begin{codeexample}
+% \cs{setlength}\{\cs{baselineskip}\}\{\meta{baseline-skip}\}
+% \end{codeexample}
+%
+% The \meta{baseline-skip} can contain a rubber (stretch/shrink) component, however,
+% \cs{setbaselineskip} will discard of it and issue a warning that only the fixed-length part
+% will be used in the computation.
+%
+% \begin{example}
+% Let us assume we want to lighten the gray value of the copy a tad with a \cs{baselineskip}
+% increased (from e.g.~12pt) to~12.5pt. To this end we say:
+%
+% \begin{codeexample}
+% \cs{setbaselineskip}\{12.5pt\}\specialsectionendhere
+% \end{codeexample}
+% \end{example}
+%
+% \begin{tip}
+% To set the \cs{baselineskip} relative to the current value use
+%
+% \begin{codeexample}
+% \cs{setbaselineskip}\{\meta{factor}\cs{baselineskip}\}
+% \end{codeexample}
+%
+% \noindent
+% where \meta{factor} is a floating-point number.
+% \end{tip}
+%
+% \DescribeMacro{\resetbaselineskip}
+% \sinceversion{Since v0.3}
+% Reset the \cs{baselineskip} to its original value.
+%
+% \begin{synopsis}\label{syn:resetbaselineskip}
+% \cs{resetbaselineskip}
+% \end{synopsis}
+%
+% This macro simply expands to |\setstretch{1}|. So, we rely on \packagename{setspace}'s
+% notion of what is a single-line \cs{baselineskip}.
+%
+%
+% \DescribeMacro{\setbaselineskippercentage}
+% \sinceversion{Since v0.3}
+% Set the \cs{baselineskip} with a relative value calculated as a percentage of the current
+% font's design size.
+%
+% \begin{synopsis}\label{syn:setbaselineskippercentage}
+% \cs{setbaselineskippercentage}\marg{baselineskip-percentage}
+% \end{synopsis}
+%
+% Set \cs{baselineskip} to \(\cs{typogfontsize} \times \meta{baselineskip-percentage} / 100\).
+%
+% \begin{example}
+% We modify the previous example and assume a font design size of 10pt, but now write
+%
+% \begin{codeexample}
+% \cs{setbaselineskippercentage}\{125\}
+% \end{codeexample}
+%
+% \noindent
+% which sets \cs{baselineskip} to \(10\text{pt} \times 125 / 100 = 12.5\text{pt}\).
+% \end{example}
+%
+% \DescribeMacro{\setleading}
+% \sinceversion{Since v0.3}
+% Set the \cs{baselineskip} with an absolute length that gets \emph{added to} \cs{typogfontsize}.
+%
+% \begin{synopsis}\label{syn:setleading}
+% \cs{setleading}\marg{leading}
+% \end{synopsis}
+%
+% Set the \cs{baselineskip} to \cs{typogfontsize} plus \meta{leading}. Note that
+% \meta{leading} can be negative, e.\,g.~to set solid.
+%
+% \begin{example}
+% Another solution of the previous example, given a font design size of 10pt is to write
+%
+% \begin{codeexample}
+% \cs{setleading}\{2.5pt\}
+% \end{codeexample}
+%
+% \noindent
+% which sets \cs{baselineskip} to \(10\text{pt} + 2.5\text{pt} = 12.5\text{pt}\).
+% \end{example}
+%
+% \DescribeMacro{\setleadingpercentage}
+% \sinceversion{Since v0.3}
+% Set the \cs{baselineskip} to \cs{typogfontsize} \emph{plus} a relative value calculated as a
+% percentage of \cs{typogfontsize}.
+%
+% \begin{synopsis}\label{syn:setleadingpercentage}
+% \cs{setleadingpercentage}\marg{leading-percentage}
+% \end{synopsis}
+%
+% Set \cs{baselineskip} to \(\cs{typogfontsize} \times (1 + \meta{leading-percentage} / 100)\).
+%
+% \begin{example}
+% We modify the previous example and again assume a font design size of 10pt, but now write
+%
+% \begin{codeexample}
+% \cs{setleadingpercentage}\{25\}
+% \end{codeexample}
+%
+% \noindent
+% which sets \cs{baselineskip} to \(10\text{pt} \times (1 + 25 / 100) = 12.5\text{pt}\).
+% \end{example}
+%
+% \smallskip
+%
+% \DescribeLaTeXDimen{\typogfontsize}
+% \sinceversion{Since v0.3}
+% The macros \cs{setbaselineskippercentage}, \cs{setleading}, and \cs{setleadingpercentage} all
+% depend on the font size. By changing \cs{typogfontsize} they can be configured for different
+% font sizes.
+%
+% The length \cs{typogfontsize} gets initialized at the end of the preamble to the default
+% font's quad size:\footnote{For an overview of the various
+% \cs{fontdimen}\meta{number}~parameters consult \cref{tab:fontdimen} on
+% \cpageref{tab:fontdimen}.}
+%
+% \begin{codeexample}
+% \cs{typogfontsize}=\cs{fontdimen6}\cs{font}
+% \end{codeexample}
+%
+% \noindent
+% which is also called its \doublequotes{nominal size} or its \doublequotes{design size}. This
+% assignment can be repeated at any point in the document to record a reference font's size.
+% To set just \cs{typogfontsize} without changing the current font, encapsulate the font change
+% in a group and export the new value:
+%
+% \begin{codeexample}
+% \cs{begingroup} \\
+% ~~\cs{usefont}\{T1\}\{Arvo-TLF\}\{m\}\{n\}\cs{selectfont} \\
+% ~~\cs{normalsize} \\
+% ~~\cs{global}\cs{typogfontsize}=\cs{fontdimen6}\cs{font} \\
+% \cs{endgroup}
+% \end{codeexample}
+%
+% An alternative to relying on the design size is using the actual size of an uppercase letter:
+%
+% \begin{codeexample}
+% \cs{settoheight}\{\cs{typogfontsize}\}\{CEMNORSUVWXZ\}
+% \end{codeexample}
+%
+% \noindent
+% With \cs{typogfontsize} defined this way it becomes trivial to set solid:
+%
+% \begin{codeexample}
+% \cs{setleading}\{0pt\}
+% \end{codeexample}
+%
+% \noindent
+% or
+%
+% \begin{codeexample}
+% \cs{setleadingpercentage}\{0\}
+% \end{codeexample}
+%
+% \begin{tip}
+% All macros in this section actually accept expressions of their respective argument types,
+% though the sick rules of \TeX{} \meta{dimen}- and \meta{skip}-expressions apply.
+%
+% Here are some forms that do work:
+%
+% \begin{codeexample}
+% \cs{setbaselineskip}\{12pt + 0.6667pt\} \\
+% \cs{setbaselineskip}\{12pt * 110 / 100\} \\
+% \cs{setbaselineskippercentage}\{100 + 25\} \\
+% \cs{setleading}\{1pt / -2.0\} \\
+% \cs{setleadingpercentage}\{10 - 25 / 2\}\specialsectionendhere
+% \end{codeexample}
+% \end{tip}
+%
+%
+% \FloatBarrier
+% \clearpage
+% \subsection{Smooth Ragged}\label{sec:smooth-ragged}\index{ragged right}
+%
+% \begin{whittyquote}
+% The attention someone gives \\
+% to what he or she makes \\
+% is reflected in the end result, \\
+% whether it is obvious or not. \\
+% \capitalemdash*~\propername{Erik Spiekermann}
+% \end{whittyquote}
+%
+% \noindent
+% Package \packagename{typog} implements a novel approach to typeset ragged paragraphs.
+% Instead of setting the glue inside of a paragraph to zero and letting the line-widths vary
+% accordingly~\cite{wermuth:2020} we prescribe the line-widths with the \cs{parshape}~primitive
+% and leave alone the stretchability or shrinkability of the glue.
+%
+% \begin{slightlysloppypar}
+% \hangindent=5.5em\hangafter=-5
+% \DescribeEnv{smoothraggedrightshapetriplet}
+% \DescribeEnv{smoothraggedrightshapequintuplet}
+% \DescribeEnv{smoothraggedrightshapeseptuplet}
+% We introduce three environments that allow for setting three, five, or seven different
+% line-lengths: \code{smoothraggedrightshapetriplet},
+% \code{smoothraggedrightshapequintuplet}, and \code{smoothraggedrightshapeseptuplet}; they
+% work for paragraphs up to
+% \makeatletter
+% \typog@triplet@max@lines, \typog@quintuplet@max@lines, or \typog@septuplet@max@lines~lines,
+% \makeatother
+% respectively.
+% \end{slightlysloppypar}
+%
+%
+% \begin{maxipage}
+% \begin{synopsis}\label{syn:smoothraggedrightshapetriplet}\label{syn:smoothraggedrightshapequintuplet}\label{syn:smoothraggedrightshapeseptuplet}
+% \cs{begin}|{smoothraggedrightshapetriplet}|\oarg{option\dots}\marg{width1}\marg{width2}\marg{width3} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{smoothraggedrightshapetriplet}| \\[\smallskipamount]
+% \cs{begin}|{smoothraggedrightshapequintuplet}|\oarg{option\dots}\marg{width1}\marg{width2}\dots\marg{width5} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{smoothraggedrightshapequintuplet}| \\[\smallskipamount]
+% \cs{begin}|smoothraggedrightshapeseptuplet|\oarg{option\dots}\marg{width1}\marg{width2}\dots\marg{width7}
+% \hspace*{1em}\dots \\
+% \cs{end}|{smoothraggedrightshapeseptuplet}|
+% \end{synopsis}
+% \end{maxipage}
+%
+% The environments take \(N\) = 3, 5, or~7 mandatory line-width parameters, where each
+% \meta{width\itcorr{3}I}, \(I = 1,\dots, N\) is a skip, i.\,e.,~a dimen that can include some
+% glue.
+%
+%
+% \paragraph{Options}
+%
+% \begin{description}[style=nextline]
+% \item[|leftskip=|\meta{dim}]
+% Set the left margin for the smooth ragged paragraph to \meta{dim}. Similar to the \TeX{}
+% parameter~\cs{leftskip}.
+%
+% \item[|parindent=|\meta{dim}]
+% Set the first-line indent for the smooth ragged paragraph to \meta{dim}. Similar to the
+% \TeX{} parameter~\cs{parindent}.
+% \end{description}
+%
+% \noindent
+% \DescribeEnv{smoothraggedrightpar}
+% Environment~|smoothraggedrightpar| builds upon the three generators. It typesets a single
+% paragraph with a given \meta{ragwidth} of the ragged, right margin, where the rag~width is
+% the length-difference of the longest and the shortest lines.
+%
+% \begin{synopsis}\label{syn:smoothraggedrightpar}
+% \cs{begin}|{smoothraggedrightpar}|\oarg{option\dots} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{smoothraggedrightpar}|
+% \end{synopsis}
+%
+% The line lengths equally divide the ragged margin, i.\,e., they are arithmetic means with
+% respect to the generator size.
+%
+% \iffalse
+%<*smoothparshapes>
+prologues := 3;
+
+def draw_filled_rectangle(expr lower_left, upper_right, color) =
+ fill lower_left -- (xpart upper_right, ypart lower_left) --
+ upper_right -- (xpart lower_left, ypart upper_right) --
+ cycle
+ withcolor color;
+enddef;
+
+
+u := 100;
+
+em := 10;
+linelength := 2u;
+baselineskip := 1.2em;
+parskip := 3;
+parindent := 2.5em;
+ragwidth := 2em;
+
+cmykcolor line_color;
+line_color := (.08, 0, 0, .18); % cold silver
+
+color customred[];
+customred[1] := (.890, .282, .282);
+customred[2] := (.831, .110, .110);
+customred[3] := (.686, .043, .043);
+customred[4] := (.569, .000, .000);
+customred[5] := (.420, .000, .000);
+
+color margin_color;
+margin_color := customred[2];
+
+
+beginfig(1); % triplet
+ y := 0;
+ draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (3)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - ragwidth/2, y + 1em), line_color); % (2)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (3)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - ragwidth/2, y + 1em), line_color); % (2)
+
+ draw_filled_rectangle((-.667em, 1em), (-.333em, -5baselineskip), margin_color);
+ draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -5baselineskip), margin_color);
+endfig;
+
+
+beginfig(2); % quintuplet
+ y := 0;
+ draw_filled_rectangle((0, y), (linelength - .75ragwidth, y + 1em), line_color); % (2)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (5)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .5ragwidth, y + 1em), line_color); % (3)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .25ragwidth, y + 1em), line_color); % (4)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .75ragwidth, y + 1em), line_color); % (2)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (5)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .5ragwidth, y + 1em), line_color); % (3)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .25ragwidth, y + 1em), line_color); % (4)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1)
+
+ draw_filled_rectangle((-.667em, 1em), (-.333em, -9baselineskip), margin_color);
+ draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -9baselineskip), margin_color);
+endfig;
+
+
+beginfig(3); % septuplet
+ y := 0;
+ draw_filled_rectangle((0, y), (linelength - .6667ragwidth, y + 1em), line_color); % (3)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .1667ragwidth, y + 1em), line_color); % (6)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .3333ragwidth, y + 1em), line_color); % (5)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .8333ragwidth, y + 1em), line_color); % (2)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (7)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .5ragwidth, y + 1em), line_color); % (4)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .6667ragwidth, y + 1em), line_color); % (3)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .1667ragwidth, y + 1em), line_color); % (6)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - ragwidth, y + 1em), line_color); % (1)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .3333ragwidth, y + 1em), line_color); % (5)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .8333ragwidth, y + 1em), line_color); % (2)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength, y + 1em), line_color); % (7)
+ y := y - baselineskip;
+ draw_filled_rectangle((0, y), (linelength - .5ragwidth, y + 1em), line_color); % (4)
+
+ draw_filled_rectangle((-.667em, 1em), (-.333em, -13baselineskip), margin_color);
+ draw_filled_rectangle((linelength + .333em, 1em), (linelength + .667em, -13baselineskip), margin_color);
+endfig;
+end
+%</smoothparshapes>
+% \fi
+%
+% \begin{itemize}[noindent]
+% \item
+% \begin{minipage}[t]{\linewidth}
+% The triplet generator repeats a \emph{short~line -- long~line -- middle-length~line}
+% sequence. Shown below are two complete cycles.
+%
+% \begin{center}
+% \includegraphics{smooth-parshapes-1.mps}
+% \end{center}
+% \end{minipage}
+%
+% \item
+% \begin{minipage}[t]{\linewidth}
+% The quintuplet generator varies the theme of the triplets and avoids the
+% \singlequotes{ladder} of lines~2\figuredash3\figuredash4 (or, if numbered by
+% cycle:~1.2\figuredash1.3\figuredash2.1) there. Shown here are two cycles.
+%
+% \begin{center}
+% \includegraphics{smooth-parshapes-2.mps}
+% \end{center}
+% \end{minipage}
+%
+% \item
+% \begin{minipage}[t]{\linewidth}
+% The septuplet generator uses a permutation that looks \singlequotes{random}. At least it
+% hides the boundaries of cycles well. Shown here are two of them.
+%
+% \begin{center}
+% \includegraphics{smooth-parshapes-3.mps}
+% \end{center}
+% \end{minipage}
+% \end{itemize}
+%
+% \noindent
+% \DescribeEnv{smoothraggedright}
+% Environment~|smoothraggedright| is the multi-paragraph version of
+% \code{smoothraggedrightpar}. It takes the same optional arguments.
+%
+% \begin{synopsis}\label{syn:smoothraggedright}
+% \cs{begin}|{smoothraggedright}|\oarg{option\dots} \\
+% \hspace*{1em}\dots \\
+% \cs{end}|{smoothraggedright}|
+% \end{synopsis}
+%
+%
+% \paragraph{Options}
+%
+% \begin{description}[style=nextline]
+% \item[|linewidth=|\meta{dim}]
+% Override the length of the longest line. The default line-width is \cs{linewidth}.
+% \end{description}
+%
+%
+% \paragraph{Global Parameters}
+%
+% \begin{description}[style=nextline]
+% \item[\cs{smoothraggedrightfuzzfactor}=\meta{factor}]
+% The environment adds glue to every line-width\footnote{The shortest line only gets
+% stretchability, the longest only receives shrinkability. All other lines are both
+% stretchable and shrinkable.} to achieve a more convincing \doublequotes{ragged appearance}
+% and to reduce the number of overfull lines. The algorithm divides the smooth margin into
+% 3, 5, or~7 parts depending on the chosen \cs{smoothraggedrightgenerator} (see below). The
+% \cs{smoothraggedrightfuzzfactor} is the amount of glue of each line expressed as a multiple
+% of the distance between the division points. The default of 1.0 means to add as much glue
+% such that the lines just do not overlap (assuming justification is feasible).
+%
+% \item[\cs{smoothraggedrightgenerator}]
+% Select a generator to use. Valid generator names:
+% \begin{itemize}[noitemsep]
+% \item |triplet|,
+% \item |quintuplet|,
+% \item |septuplet|.
+% \end{itemize}
+%
+% The default generator is |triplet|.
+%
+% \item[\cs{smoothraggedrightleftskip}=\meta{dim}]
+% Value for |leftskip| to pass to the generator. Default:~0pt.
+%
+% \item[\cs{smoothraggedrightparindent}=\meta{dim}]
+% Value for |parindent| to pass to the generator. Default:~0pt.
+%
+% \item[\cs{smoothraggedrightragwidth}=\meta{dim}]
+% Value for the width of the ragged right margin. Default:~2em.
+% \end{description}
+%
+% \begin{usecases}
+% Replacement for \cs{RaggedRight}~\cite{package:ragged2e}.~\visualpar Design alternative for
+% fully justified paragraphs if used with a small rag-width.
+% \end{usecases}
+%
+%
+% \addtocontents{toc}{\par\bigskip\hfill\textit{Table of Contents continued on next page.}}
+% \addtocontents{toc}{\clearpage}
+%
+%
+% \sectionfinish
+% \clearpage
+% \section{Other Packages for Fine \LaTeX~Typography}\label{sec:other-typography-packages}
+%
+% Many other packages help with getting better output from \LaTeX. Here is a list --~in
+% alphabetical order~-- of the ones the author considers particularly valuable.
+%
+% \sbox{\listlabelbox}{\packagename{microtype}}
+% \begin{description}[font=\normalfont, labelsep*=1em, labelwidth=\wd\listlabelbox, leftmargin=!]
+% \item[\packagename{enumitem}]
+% Flexible and consistent definition of all basic \LaTeX-list types plus inline
+% lists~\cite{package:enumitem}.
+%
+% \item[\packagename{geometry}]
+% Powerful and sophisticated setup of the page layout~\cite{package:geometry}. Best
+% accompanied by \packagename{layout}~\cite{package:layout} to visualize the page geometries.
+%
+% \item[\packagename{hyphenat}]
+% Hyphens that do not inhibit further auto-hyphenation of a compound
+% word~\cite{package:hyphenat}.
+%
+% \item[\packagename{microtype}]
+% Fine control of spacing, tracking, sidebearings, character protrusion into the margins,
+% font expansion, and much more~\cite{package:microtype}.
+%
+% See also \propername{Khirevich's} discussion~\cite{khirevich:2013}.
+%
+% \item[\packagename{ragged2e}]
+% Improved versions of environments |raggedleft|, |raggedright|, and
+% |center|~\cite{package:ragged2e}.
+%
+% \item[\packagename{setspace}]
+% Consistently set the document's line-spacing, i.\,e.,
+% \cs{baselineskip}~\cite{package:setspace}.
+% \end{description}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \MaybeStop{
+% \sectionfinish
+% \clearpage
+% \section{typog-grep}
+% \label{app:typog-grep}
+%
+% The companion program \programname{typog-grep} for analyzing the output of
+% \hyperref[syn:typoginspect]{\code{typoginspect}} and
+% \hyperref[syn:typoginspect]{\code{typoginspectpar}} has its own manual page. We reproduce
+% it here for completeness of the documentation.
+%
+% \begin{suspendshortverb}
+% \setlength{\parindent}{0pt}
+% \setlength{\parskip}{6.0pt plus 2.0pt minus .5pt}
+% \input typog-grep
+% \end{suspendshortverb}
+%
+% \sectionfinish
+% \clearpage
+% \phantomsection
+% \resetfancyhead
+% \addcontentsline{toc}{section}{Change History}
+% \PrintChanges
+%
+% \sectionfinish
+% \clearpage
+% \phantomsection
+% \addcontentsline{toc}{section}{References}
+% \begin{RaggedRight}
+% \begin{thebibliography}{88}
+% \bibitem{abrahams:2020}
+% \bibauthor{Abrahams, Paul~W.},
+% \bibauthor{Hargreaves, Kathryn~A.,} and
+% \bibauthor{Karl Berry}.
+% \bibtitle{\TeX{} for the Impatient}.
+% 2020,
+% \biburl{http://tug.ctan.org/info/impatient/book.pdf}.
+%
+% \bibitem{package:amsmath}
+% \bibauthor{American Mathematical Society} and the
+% \bibauthor{\LaTeXIII\ Project Team}.
+% \bibtitle{Package~\packagename{amsmath}}.
+% 2020,
+% \biburl{https://ctan.org/pkg/amsmath}.
+%
+% \bibitem{package:cite}
+% \bibauthor{Arseneau, Donald}.
+% \bibtitle{Package~\packagename{cite}}.
+% 2015,
+% \biburl{https://ctan.org/pkg/cite}.
+%
+% \bibitem{package:enumitem}
+% \bibauthor{Bezos, Javier}.
+% \bibtitle{Package~\packagename{enumitem}}.
+% 2019,
+% \biburl{https://ctan.org/pkg/enumitem}.
+%
+% \bibitem{package:babel}
+% \bibauthor{Bezos, Javier}.
+% \bibtitle{Package~\packagename{babel}}.
+% 2021,
+% \biburl{https://ctan.org/pkg/babel}.
+% The original author of package~\packagename{babel} was \bibauthor{J. L. Braams}.
+%
+% \bibitem{package:etex}
+% \bibauthor{Breitenlohner, Peter} and
+% the \bibauthor{\(\mathcal{N\kern-.1em\raisebox{-.2em}{T}\kern-.1emS}\)~Team}.
+% \bibtitle{\eTeX}.
+% 1998,
+% \biburl{https://mirrors.ctan.org/systems/doc/etex/etex_man.pdf}.
+%
+% \bibitem{carlisle:1996}
+% \bibauthor{Carlisle, David}.
+% \bibtitle{Russian Paragraph Shapes}.
+% Baskerville, 6(1), 13\figuredash15,
+% 1996,
+% \biburl{http://uk-tug-archive.tug.org/wp-installed-content/uploads/2008/12/61.pdf}.
+%
+% \bibitem{carlisle:2013}
+% \bibauthor{Carlisle, David}.
+% \bibtitle{What do different \cs{fontdimen<num>} mean}.
+% 2013\figuredash*1\figuredash*2,
+% \biburl{https://tex.stackexchange.com/questions/88991/what-do-different-fontdimennum-mean}.
+%
+% \bibitem{package:cleveref}
+% \bibauthor{Cubitt, Toby}.
+% \bibtitle{Package~\packagename{cleveref}}.
+% 2018,
+% \biburl{https://ctan.org/pkg/cleveref}.
+%
+% \bibitem{eijkhout:2007}
+% \bibauthor{Eijkhout, Victor}.
+% \bibtitle{\TeX\ By Topic, A Texnician's Reference}.
+% 2007,
+% \biburl{https://www.eijkhout.net/tex/tex-by-topic.html}.
+%
+% \bibitem{package:mathtools}
+% \bibauthor{H{\o}gholm, Morten},
+% \bibauthor{Madsen, Lars} and
+% the \bibauthor{\LaTeXIII\ Project Team}.
+% \bibtitle{Package~\packagename{mathtools}}.
+% 2020,
+% \biburl{https://ctan.org/pkg/mathtools}.
+%
+% \bibitem{khirevich:2013}
+% \bibauthor{Khirevich, Siarhei}.
+% \bibtitle{Tips on Writing a Thesis in \LaTeX}.
+% 2013,
+% \biburl{http://www.khirevich.com/latex/microtype}.
+%
+% \bibitem{knuth:1986}
+% \bibauthor{Knuth, Donald Ervin}.
+% \bibtitle{The \TeX{}book}.
+% Addison Wesley, Reading\kernedslash MA,
+% 1986.
+%
+% \bibitem{package:layout}
+% \bibauthor{McPherson, Kent}.
+% \bibtitle{Package~\packagename{layout}}.
+% 2014,
+% \biburl{https://ctan.org/pkg/layout}.
+% The package was converted to \LaTeXe\ by \bibauthor{J. L. Braams}
+% and modified by \bibauthor{H. Umeki}.
+%
+% \bibitem{middendorp:2014}
+% \bibauthor{Middendorp, Jan}.
+% \bibtitle{Shaping Text}.
+% \acronym{BIS}~publishers, Amsterdam,
+% 2014.
+%
+% \bibitem{mittelbach:2018c}
+% \bibauthor{Mittelbach, Frank}.
+% \bibtitle{Managing forlorn paragraph lines (a.\,k.\,a.~widows and orphans) in \LaTeX}.
+% TUGboat, 39(3), 246\figuredash251, 2018,
+% \biburl{https://tug.org/TUGboat/tb39-3/tb123mitt-widows.pdf}.
+%
+% \bibitem{package:widows-and-orphans}
+% \bibauthor{Mittelbach, Frank}.
+% \bibtitle{Package~\packagename{widows-and-orphans}}.
+% 2020,
+% \biburl{https://ctan.org/pkg/widows-and-orphans}.
+%
+% \bibitem{package:hyperref}
+% \bibauthor{Rahtz, Sebastian,} and \bibauthor{Frank Mittelbach}.
+% \bibtitle{Package~\packagename{hyperref}}.
+% 2020,
+% \biburl{https://ctan.org/pkg/hyperref}.
+% The package is maintained by the \LaTeXIII~Project Team.
+%
+% \bibitem{package:microtype}
+% \bibauthor{Schlicht, Robert}.
+% \bibtitle{Package~\packagename{microtype}}.
+% 2020,
+% \biburl{https://ctan.org/pkg/microtype}.
+%
+% \bibitem{package:ragged2e}
+% \bibauthor{Schr\"oder, Martin}.
+% \bibtitle{Package~\packagename{ragged2e}}.
+% 2019,
+% \biburl{https://ctan.org/pkg/ragged2e}.
+%
+% \bibitem{solomon:1990}
+% \bibauthor{Solomon, David}.
+% \bibtitle{Output Routines: Examples and Techniques. Part~I: Introduction and Examples}.
+% TUGboat, 11(1), 69\figuredash85, 1990,
+% \biburl{http://www.tug.org/TUGboat/Articles/tb11-1/tb27salomon.pdf}.
+%
+% \bibitem{package:setspace}
+% \bibauthor{Tobin, Geoffrey,} and \bibauthor{Robin Fairbairns}.
+% \bibtitle{Package~\packagename{setspace}}.
+% 2011,
+% \biburl{https://ctan.org/pkg/setspace}.
+%
+% \bibitem{package:geometry}
+% \bibauthor{Umeki, Hideo}.
+% \bibtitle{Package~\packagename{geometry}}.
+% 2020,
+% \biburl{https://ctan.org/pkg/geometry}.
+%
+% \bibitem{wermuth:2016}
+% \bibauthor{Wermuth, Udo}.
+% \bibtitle{Tracing paragraphs}.
+% TUGboat, 37(3), 358\figuredash373, 2016,
+% \biburl{https://tug.org/TUGboat/tb37-3/tb117wermuth.pdf}.
+%
+% \bibitem{wermuth:2017a}
+% \bibauthor{Wermuth, Udo}.
+% \bibtitle{The optimal value for \cs{emergencystretch}}.
+% TUGboat, 38(1), 65\figuredash86, 2017,
+% \biburl{https://tug.org/TUGboat/tb38-1/tb118wermuth.pdf}.
+%
+% \bibitem{wermuth:2017c}
+% \bibauthor{Wermuth, Udo}.
+% \bibtitle{A note on \cs{linepenalty}}.
+% TUGboat, 38(3), 400\figuredash414, 2017,
+% \biburl{https://tug.org/TUGboat/tb38-3/tb120wermuth.pdf}.
+%
+% \bibitem{wermuth:2018}
+% \bibauthor{Wermuth, Udo}.
+% \bibtitle{Experiments with \cs{parfillskip}}.
+% TUGboat, 39(3), 276\figuredash303, 2018,
+% \biburl{https://tug.org/TUGboat/tb39-3/tb123wermuth-parfillskip.pdf}.
+%
+% \bibitem{wermuth:2020}
+% \bibauthor{Wermuth, Udo}.
+% \bibtitle{An attempt at ragged-right typesetting}.
+% TUGboat, 41(1), 73\figuredash94, 2020,
+% \biburl{https://tug.org/TUGboat/tb41-1/tb127wermuth-ragged.pdf}.
+%
+% \bibitem{wermuth:2022-8-2}
+% \bibauthor{Wermuth, Udo}.
+% Personal communication.
+% August~2, 2022.
+%
+% \bibitem{wermuth:2023}
+% \bibauthor{Wermuth, Udo}.
+% \bibtitle{Vertical alignments in plain \TeX}.
+% TUGboat, 44(3), 427\figuredash440, 2023,
+% \biburl{https://tug.org/TUGboat/tb44-3/tb138wermuth-valign.pdf}.
+%
+% \bibitem{package:hyphenat}
+% \bibauthor{Wilson, Peter}.
+% \bibtitle{Package~\packagename{hyphenat}}.
+% 2004,
+% \biburl{https://ctan.org/pkg/hyphenat}.
+% The package is maintained by \bibauthor{W. Robertson}.
+%
+% \bibitem{wilson:2007}
+% \bibauthor{Wilson, Peter}.
+% \bibtitle{Glisterings}.
+% TUGboat, 28(2), 229\figuredash232, 2007,
+% \biburl{https://tug.org/TUGboat/tb28-2/tb89glister.pdf}.
+%
+% \bibitem{package:needspace}
+% \bibauthor{Wilson, Peter}.
+% \bibtitle{Package~\packagename{needspace}}.
+% 2010,
+% \biburl{https://ctan.org/pkg/needspace}.
+% The package is maintained by \bibauthor{W. Robertson}.
+% \end{thebibliography}
+% \end{RaggedRight}
+%
+% \sectionfinish
+% \clearpage
+% \begin{RaggedRight}
+% \setcounter{IndexColumns}{2}
+% \setlength{\columnsep}{30pt}
+% \label{sec:index}
+% \phantomsection
+% \addcontentsline{toc}{section}{Index}
+% \PrintIndex
+% \end{RaggedRight}
+% }
+%
+%
+% \sectionfinish
+% \clearpage
+% \appendix
+% \section{Package Code}\label{sec:package-code}
+% \addtocontents{toc}{\begingroup\small}
+% \addtocontents{toc}{\protect\begin{multicols}{2}}
+% \addtocontents{toc}{\protect\raggedcolumns}
+%
+% This is the \doublequotes{Reference Manual}~section of the documentation
+% where we describe the package's code
+% and explain its implementation details.
+%
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{typog}
+ [2024/05/07 v0.3 TypoGraphic extensions]
+
+\RequirePackage{etoolbox}
+\RequirePackage{everyhook}
+\RequirePackage{xkeyval}
+
+% \end{macrocode}
+%
+% \bigskip
+%
+% \subsection*{Declarations of Lengths, Skips, etc.}
+%
+% \begin{macro}{\typog@TYPOG}
+% Define a macro that unequivocally identifies this very package.
+%
+% \begin{macrocode}
+\newcommand*{\typog@TYPOG}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typoglogo}
+% We have our own, low-key logo.
+%
+% \begin{macrocode}
+\newcommand*{\typoglogo}{\textsf{T\itcorr*{-5}\textsl{y}poG}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\iftypog@debug}
+% Our switch for debug information.
+%
+% \begin{macrocode}
+\newif\iftypog@debug
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@typeout}
+% Our debug information printer.
+%
+% \begin{macrocode}
+\newcommand*{\typog@typeout}[1]
+ {\iftypog@debug
+ \typeout{typog: #1}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@trim@spaces}
+% Pull \cs{tl\_trim\_spaces} into the \singlequotes{classic} namespace.
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+\let\typog@trim@spaces=\tl_trim_spaces:o
+\ExplSyntaxOff
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@register@pdfsubstitute}
+% We often need to register (simple) substitute commands
+% suitable for \acronym{PDF}~bookmarks.
+% This is a convenient abbreviation for that task.
+%
+% \begin{macrocode}
+\newcommand{\typog@register@pdfsubstitute}[1]{%
+ \AtBeginDocument{%
+ \ifdefined\pdfstringdefDisableCommands
+ \pdfstringdefDisableCommands{#1}%
+ \fi}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Some functionality depends on package~\packagename{microtype}.
+% To complicate matters for certain setup operations, e.\,g., \cs{SetExpansion},
+% \packagename{microtype} must be loaded \emph{before} package~\packagename{typog},
+% a fact that we encode in \cs{iftypog@microtype@preloaded}.
+%
+% \begin{macro}{\iftypog@microtype@preloaded}
+% \begin{macrocode}
+\newif\iftypog@microtype@preloaded
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@require@preloaded@microtype}
+% It is easy to determine whether \packagename{microtype} has been sourced.
+% We raise to the occasion and define a pair of check macros
+% which simplify the test for the correct \packagename{microtype} load~state.
+%
+% \begin{macrocode}
+\ifdefined\MT@MT
+ \typog@typeout{package microtype preloaded}%
+ \typog@microtype@preloadedtrue
+ \def\typog@require@preloaded@microtype{\relax}
+\else
+ \typog@microtype@preloadedfalse
+ \def\typog@require@preloaded@microtype
+ {\PackageError{typog}%
+ {package microtype not (pre-)loaded}%
+ {package microtype must be loaded before package typog}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\iftypog@microtype@loaded}
+% \begin{macrocode}
+\newif\iftypog@microtype@loaded
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@require@microtype}
+% This code duplicates \cs{typog@require@preloaded@microtype};
+% the only difference is that we call the test \emph{after} the preamble was processed.
+%
+% \begin{macrocode}
+\AtBeginDocument{
+ \ifdefined\MT@MT
+ \typog@typeout{package microtype loaded}%
+ \typog@microtype@loadedtrue
+ \def\typog@require@microtype{\relax}
+ \else
+ \typog@microtype@loadedfalse
+ \def\typog@require@microtype
+ {\PackageError{typog}%
+ {package microtype not loaded}%
+ {require package microtype before package typog}}%
+ \fi
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Our own state\dots
+%
+% \begin{macro}{\typog@mathitalicscorrection}
+% \begin{macrocode}
+\newmuskip\typog@mathitalicscorrection
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@textitalicscorrection}
+% \begin{macrocode}
+\newlength{\typog@textitalicscorrection}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@ligaturekern}
+% \begin{macrocode}
+\newlength{\typog@ligaturekern}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@raisecapitaldash}
+% \begin{macrocode}
+\newlength{\typog@raisecapitaldash}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@raisecapitalguillemets}
+% \begin{macrocode}
+\newlength{\typog@raisecapitalguillemets}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@raisecapitalhyphen}
+% \begin{macrocode}
+\newlength{\typog@raisecapitalhyphen}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@raisecapitaltimes}
+% \begin{macrocode}
+\newlength{\typog@raisecapitaltimes}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@raiseguillemets}
+% \begin{macrocode}
+\newlength{\typog@raiseguillemets}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@raisefiguredash}
+% \begin{macrocode}
+\newlength{\typog@raisefiguredash}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@slashkern}
+% \begin{macrocode}
+\newlength{\typog@slashkern}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@breakpenalty}
+% \begin{macrocode}
+\newcommand*{\typog@breakpenalty}{\exhyphenpenalty}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@dim@unit}
+% We would like to express the argument values
+% for example of \cs{kernedhyphen*} and \cs{kernedhyphen}
+% as multiples of a thousandth of an~em.
+% Therefore, we define a dimen as \doublequotes{base unit} which simplifies matters greatly.
+%
+% \begin{macrocode}
+\newlength{\typog@dim@unit}
+\setlength{\typog@dim@unit}{.001em}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@trackingttspacing}
+% \begin{macrocode}
+\newcommand*{\typog@trackingttspacing}{300, 90, 60}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@default@shrink@i}
+% The default configuration for shrink values.
+%
+% \begin{macrocode}
+\newcommand*{\typog@default@shrink@i}{5}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@default@shrink@ii}
+% \begin{macrocode}
+\newcommand*{\typog@default@shrink@ii}{10}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@default@shrink@iii}
+% \begin{macrocode}
+\newcommand*{\typog@default@shrink@iii}{20}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@shrink@i}
+% Configurable shrink values.
+% Initialized from the \code{typog@default@shrink@} set.
+%
+% \begin{macrocode}
+\newcommand*{\typog@shrink@i}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@shrink@ii}
+% \begin{macrocode}
+\newcommand*{\typog@shrink@ii}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@shrink@iii}
+% \begin{macrocode}
+\newcommand*{\typog@shrink@iii}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@default@stretch@i}
+% The default configuration for stretch values.
+%
+% \begin{macrocode}
+\newcommand*{\typog@default@stretch@i}{5}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@default@stretch@ii}
+% \begin{macrocode}
+\newcommand*{\typog@default@stretch@ii}{10}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@default@stretch@iii}
+% \begin{macrocode}
+\newcommand*{\typog@default@stretch@iii}{20}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@stretch@i}
+% Configurable stretch values.
+% Initialized from the \code{typog@default@stretch} set.
+%
+% \begin{macrocode}
+\newcommand*{\typog@stretch@i}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@stretch@ii}
+% \begin{macrocode}
+\newcommand*{\typog@stretch@ii}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@stretch@iii}
+% \begin{macrocode}
+\newcommand*{\typog@stretch@iii}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+
+\def\typog@one@of@three#1,#2,#3\relax{\typog@trim@spaces{#1}}
+\def\typog@two@of@three#1,#2,#3\relax{\typog@trim@spaces{#2}}
+\def\typog@three@of@three#1,#2,#3\relax{\typog@trim@spaces{#3}}
+
+\newcommand*{\typog@triple@get@i}[1]{\expandafter\typog@one@of@three #1\relax}
+\newcommand*{\typog@triple@get@ii}[1]{\expandafter\typog@two@of@three #1\relax}
+\newcommand*{\typog@triple@get@iii}[1]{\expandafter\typog@three@of@three #1\relax}
+
+\newcommand*{\typog@set@shrink@limits}
+ {\edef\typog@@star{*}%
+ \edef\typog@@limit{\typog@triple@get@i{\typog@shrinklimits}}%
+ \unless\ifx\typog@@limit\typog@@star\edef\typog@shrink@i{\number\typog@@limit}\fi
+ \edef\typog@@limit{\typog@triple@get@ii{\typog@shrinklimits}}%
+ \unless\ifx\typog@@limit\typog@@star\edef\typog@shrink@ii{\number\typog@@limit}\fi
+ \edef\typog@@limit{\typog@triple@get@iii{\typog@shrinklimits}}%
+ \unless\ifx\typog@@limit\typog@@star\edef\typog@shrink@iii{\number\typog@@limit}\fi}
+
+\newcommand*{\typog@set@stretch@limits}
+ {\edef\typog@@star{*}%
+ \edef\typog@@limit{\typog@triple@get@i{\typog@stretchlimits}}%
+ \unless\ifx\typog@@limit\typog@@star\edef\typog@stretch@i{\number\typog@@limit}\fi
+ \edef\typog@@limit{\typog@triple@get@ii{\typog@stretchlimits}}%
+ \unless\ifx\typog@@limit\typog@@star\edef\typog@stretch@ii{\number\typog@@limit}\fi
+ \edef\typog@@limit{\typog@triple@get@iii{\typog@stretchlimits}}%
+ \unless\ifx\typog@@limit\typog@@star\edef\typog@stretch@iii{\number\typog@@limit}\fi}
+
+\DeclareOptionX<typog>{breakpenalty}%
+ {\renewcommand*{\typog@breakpenalty}{#1}}
+\DeclareOptionX<typog>{debug}{\typog@debugtrue}
+\DeclareOptionX<typog>{mathitalicscorrection}[.4mu]%
+ {\typog@mathitalicscorrection=#1\relax}%
+\DeclareOptionX<typog>{nodebug}{\typog@debugfalse}
+\DeclareOptionX<typog>{textitalicscorrection}[.02em]%
+ {\setlength{\typog@textitalicscorrection}{#1}}
+\DeclareOptionX<typog>{ligaturekern}[.033333em]%
+ {\setlength{\typog@ligaturekern}{#1}}
+\DeclareOptionX<typog>{raisecapitaldash}[\z@]%
+ {\setlength{\typog@raisecapitaldash}{#1}}
+\DeclareOptionX<typog>{raisecapitalguillemets}[\z@]%
+ {\setlength{\typog@raisecapitalguillemets}{#1}}
+\DeclareOptionX<typog>{raisecapitalhyphen}[\z@]%
+ {\setlength{\typog@raisecapitalhyphen}{#1}}
+\DeclareOptionX<typog>{raisecapitaltimes}[\z@]%
+ {\setlength{\typog@raisecapitaltimes}{#1}}
+\DeclareOptionX<typog>{raiseguillemets}[\z@]%
+ {\setlength{\typog@raiseguillemets}{#1}}
+\DeclareOptionX<typog>{raisefiguredash}[\z@]%
+ {\setlength{\typog@raisefiguredash}{#1}}
+\DeclareOptionX<typog>{raise*}[\z@]%
+ {\setlength{\typog@raisecapitaldash}{#1}%
+ \setlength{\typog@raisecapitalhyphen}{#1}%
+ \setlength{\typog@raisecapitaltimes}{#1}%
+ \setlength{\typog@raisefiguredash}{#1}}
+\DeclareOptionX<typog>{shrinklimits}%
+ [\typog@default@shrink@i, \typog@default@shrink@ii, \typog@default@shrink@iii]%
+ {\typog@require@preloaded@microtype
+ \ifx\@onlypreamble\@notprerr
+ \PackageWarning{typog}{option `shrinklimits' can only be used in the preamble}%
+ \else
+ \edef\typog@shrinklimits{#1}%
+ \typog@set@shrink@limits
+ \fi}
+\DeclareOptionX<typog>{slashkern}[.05em]%
+ {\setlength{\typog@slashkern}{#1}}
+\DeclareOptionX<typog>{stretchlimits}%
+ [\typog@default@stretch@i, \typog@default@stretch@ii, \typog@default@stretch@iii]%
+ {\typog@require@preloaded@microtype
+ \ifx\@onlypreamble\@notprerr
+ \PackageWarning{typog}{option `stretchlimits' can only be used in the preamble}%
+ \else
+ \edef\typog@stretchlimits{#1}%
+ \typog@set@stretch@limits
+ \fi}
+\DeclareOptionX<typog>{trackingttspacing}[\typog@trackingttspacing]%
+ {\typog@require@preloaded@microtype
+ \ifx\@onlypreamble\@notprerr
+ \PackageWarning{typog}{option `trackingttspacing' can only be used in the preamble}%
+ \else
+ \typog@typeout{trackingttspacing=#1}%
+ \SetTracking[outer spacing={#1}]{encoding=*, family=tt*}{0}%
+ \fi}
+
+\newcommand*{\typog@initialize@options}
+ {\ExecuteOptionsX<typog>{
+ ligaturekern,
+ mathitalicscorrection, textitalicscorrection,
+ raisecapitaldash, raisecapitalhyphen, raisecapitaltimes,
+ raiseguillemets, raisecapitalguillemets,
+ raisefiguredash,
+ slashkern}
+ \ifdefined\MT@MT
+ \unless\ifx\@onlypreamble\@notprerr
+ \ExecuteOptionsX<typog>{shrinklimits, stretchlimits}
+ \fi
+ \fi}
+
+\typog@initialize@options
+\ProcessOptionsX<typog>
+
+% \fi
+%
+%
+% \subsection*{Setup}
+%
+% \begin{environment}{typogsetup}
+% An empty argument list resets all initialized values to their defaults.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{typogsetup}{m}
+ {\def\typog@@arg{#1}%
+ \ifx\typog@@arg\empty
+ \typog@initialize@options
+ \else
+ \setkeys{typog}{#1}%
+ \fi
+ \ignorespaces}
+ {\ignorespacesafterend}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\typogget}
+% \begin{macrocode}
+\NewDocumentCommand{\typogget}{m}{\csname typog@#1\endcsname}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Information}
+%
+% \begin{macro}{\typog@round@dim@to@tenths}
+% \begin{macrocode}
+\ExplSyntaxOn
+\newcommand*{\typog@round@dim@to@tenths}[1]
+ {\fp_to_decimal:n {round(10 * \dim_to_fp:n{#1} / 1\p@) / 10}}
+\ExplSyntaxOff
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@formatsizeinfo}
+% Arguments 1 and~2 are the font size and the line spacing.
+% The third parameter adds (decorative) units to both numbers.
+%
+% \begin{macrocode}
+\newcommand*{\typog@formatsizeinfo}[3]
+ {#1#3\kernedslash #2#3}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontsizeinfo}
+% All macros defined inside of \cs{fontsizeinfo} must be global
+% because the call can occur inside of a group.
+%
+% The two \cs{edef}s at the beginning capture the desired values
+% at the point where the macro \emph{is called}.
+% The user-macro is tricky for we need
+% a global macro with a constructed name
+% and an associated starred version.
+%
+% \begin{implementationnote}
+% \cs{@ifstar} caused too many problems which \cs{@ifnextchar} in combination with
+% \cs{@gobble} avoid.
+% \end{implementationnote}
+%
+% \begin{macrocode}
+\NewDocumentCommand{\fontsizeinfo}{s m}
+ {\global\expandafter\edef\csname typog@fontsize@#2\endcsname
+ {\typog@round@dim@to@tenths{\fontdimen6\font}}%
+ \global\expandafter\edef\csname typog@linespacing@#2\endcsname
+ {\typog@round@dim@to@tenths{\baselineskip}}%
+ \protected\expandafter\gdef\csname #2\endcsname
+ {\@ifnextchar*{\typog@formatsizeinfo
+ {\csname typog@fontsize@#2\endcsname}%
+ {\csname typog@linespacing@#2\endcsname}%
+ {}% no unit
+ \ignorespaces % eat spaces after star
+ \@gobble} % consume the star itself
+ {\typog@formatsizeinfo
+ {\csname typog@fontsize@#2\endcsname}%
+ {\csname typog@linespacing@#2\endcsname}%
+ {\,pt}% decorative unit `pt'
+ }}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@default@inspect@id@prefix}
+% Id-prefix for those |typoinspect|~environments
+% that were not identified by the user.
+%
+% \begin{macrocode}
+\newcommand*{\typog@default@inspect@id@prefix}{a-}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{typog@inspect@count}
+% Counter to supply unique number and in turn \meta{id}
+% for those |typoinspect|~environments
+% that were not identified by the user.
+%
+% \begin{macrocode}
+\newcounter{typog@inspect@count}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{typoginspect}
+% \begin{macrocode}
+\define@key[typog]{typoginspect}{tracingboxes}[\maxdimen]%
+ {\def\typog@@typoginspect@tracingboxes{#1}}
+\NewDocumentEnvironment{typoginspect}{O{} m}
+ {\def\typog@@typoginspect@tracingboxes{\m@ne}%
+ \setkeys[typog]{typoginspect}{#1}%
+% \end{macrocode}
+%
+% If the user does not supply an \meta{id},
+% we fall back to out own counter
+% and construct a hopefully unique \meta{id} from that.
+%
+% \begin{macrocode}
+ \edef\typog@@arg{#2}%
+ \ifx\typog@@arg\empty
+ \stepcounter{typog@inspect@count}%
+ \edef\typog@@id{\typog@default@inspect@id@prefix\arabic{typog@inspect@count}}%
+ \else
+ \edef\typog@@id{\typog@trim@spaces{\typog@@arg}}%
+ \fi
+ \typeout{<typog-inspect id="\typog@@id" job="\jobname" line="\the\inputlineno" page="\the\value{page}">}%
+% \end{macrocode}
+%
+% Set both badness thresholds to absurdly low values as to activate \TeX's reports.
+%
+% \begin{macrocode}
+ \hbadness=\m@ne
+ \vbadness=\m@ne
+% \end{macrocode}
+%
+% Carefully select the tracing functionality we want (to improve our typography).
+% Too much trace data distracts
+% and the user always can turn on more tracing at the beginning of the environment.
+%
+% \begin{macrocode}
+ \tracingnone
+ \tracingpages=\@ne
+ \tracingparagraphs=\@ne
+ \showboxbreadth=\typog@@typoginspect@tracingboxes
+ \showboxdepth=\typog@@typoginspect@tracingboxes}
+ {\typeout{</typog-inspect>}%
+ \ignorespacesafterend}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{typoginspectpar}
+% Companion environment to |typoginspect|
+% which adds a \cs{par} before the end of the group.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{typoginspectpar}{m}
+ {\typoginspect{#1}}
+ {\par\endtypoginspect}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Hyphenation}
+%
+% \begin{macro}{\typog@allowhyphenation}
+% Re-enable automatic hyphenation.
+%
+% The same or almost the same implementation can be found
+% in \packagename{babel} as macro~\cs{bbl@allowhyphens}
+% and \packagename{hyphenat} as macro~\cs{prw@zbreak}.
+%
+% \begin{macrocode}
+\newcommand*{\typog@allowhyphenation}
+ {\ifvmode
+ \relax
+ \else
+ \nobreak
+ \hskip\z@skip
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\allowhyphenation}
+% Define a user-visible alias unless the name is already used.
+%
+% \begin{macrocode}
+\unless\ifdefined\allowhyphenation
+ \let\allowhyphenation=\typog@allowhyphenation
+\fi
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\breakpoint}
+% The starred form inhibits hyphenation of the right-hand component.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\breakpoint}{s}
+ {\discretionary{}{}{}%
+ \IfBooleanTF{#1}%
+ {\ignorespaces}%
+ {\typog@allowhyphenation}}
+
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \def\breakpoint#1{\if*\detokenize{#1}\ignorespaces\fi}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{hyphenmin}
+% \changes{v0.3}{2024-05-04}{New environment.}
+% No trickery here. -- We use the mandatory argument for the value of \cs{lefthyphenmin} if
+% the optional argument has been omitted.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{hyphenmin}{o m}
+ {\lefthyphenmin=\IfNoValueTF{#1}{#2}{#1}%
+ \righthyphenmin=#2}
+ {}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Disable/Break Ligatures}
+%
+% \begin{macro}{\typog@hyphen}
+% We define our own hyphen so the user can override the definition in a pinch.
+%
+% \begin{macrocode}
+\newcommand*{\typog@hyphen}{\char`-}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nolig}
+% \begin{macrocode}
+\NewDocumentCommand{\nolig}{s o}
+ {\dimen0=\IfNoValueTF{#2}{\typog@ligaturekern}{#2\typog@dim@unit}%
+ \IfBooleanTF{#1}%
+ {\kern\dimen0\ignorespaces}%
+ {\discretionary{\typog@hyphen}{}{\kern\dimen0}%
+ \typog@allowhyphenation
+ \IfNoValueF{#2}{\ignorespaces}}}
+
+% \end{macrocode}
+%
+% The \acronym{PDF}-ready version of \cs{nolig} cannot be implemented with \cs{futurelet}.
+% Doh!
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \RenewExpandableDocumentCommand{\nolig}{s o m}{%
+ \ifx\typog@TYPOG#3\typog@TYPOG
+ \relax
+ \else
+ \ifx\relax#3\relax
+ \relax
+ \else
+ \PackageError{typog}
+ {Missing third argument of \nolig}
+ {Append empty group or \relax after macro invocation}
+ \fi
+ \fi}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Manual Italic Correction}
+%
+% \begin{macro}{\typog@itcorr@text@unconditional}
+% Fallback italics correction for text mode.
+%
+% \begin{macrocode}
+\newcommand*{\typog@itcorr@text@unconditional}[1]
+ {\kern#1\typog@textitalicscorrection}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@itcorr@text}
+% Conditional italics correction depending on
+% the current font's own italics correction,
+% i.\,e., \cs{fontdimen1}.
+%
+% \begin{macrocode}
+\newcommand*{\typog@itcorr@text}[1]
+ {\def\typog@@strength{#1}%
+ \dimen0=\fontdimen1\font
+ \ifdim\dimen0=\z@
+ \typog@itcorr@text@unconditional{\typog@@strength}%
+ \else
+ \kern\typog@@strength\dimen0
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@itcorr@math}
+% Italics correction for math mode.
+%
+% \begin{macrocode}
+\newcommand*{\typog@itcorr@math}[1]
+ {\mkern#1\typog@mathitalicscorrection}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\itcorr}
+% If the font has no italics correction we fall back to out own length.
+% In text mode the starred version always uses the fallback.
+% The star is a no-op in math mode.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\itcorr}{s m}
+ {\ifmmode
+ \typog@itcorr@math{#2}%
+ \else
+ \IfBooleanTF{#1}%
+ {\typog@itcorr@text{#2}}%
+ {\typog@itcorr@text@unconditional{#2}}%
+ \fi}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \RenewExpandableDocumentCommand{\itcorr}{s m}{}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Apply Extra Kerning}
+%
+% \subsubsection*{Slash}
+%
+% \begin{macro}{\typog@forwardslash}
+% We define our own forward-slash so the user can override the definition in a pinch.
+%
+% \begin{macrocode}
+\newcommand*{\typog@forwardslash}{\char`/}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kernedslash}
+% Macro~\cs{kernedslash} introduces a hyphenation possibility right after the dash,
+% whereas the starred version does not.
+%
+% By the way, \cs{slash} expands to `|/|\cs{penalty}\cs{exhyphenpenalty}'.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\kernedslash}{s}
+ {\hspace*{\typog@slashkern}%
+ \typog@forwardslash
+ \IfBooleanTF{#1}%
+ {\hspace*{\typog@slashkern}\ignorespaces}%
+ {\typog@breakpoint\typog@allowhyphenation\hspace*{\typog@slashkern}}}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \def\kernedslash#1{\if*\detokenize{#1}/\ignorespaces\else/#1\fi}%
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection*{Hyphen}
+%
+% \begin{macro}{\kernedhyphen}
+% \begin{macrocode}
+\NewDocumentCommand{\kernedhyphen}{s O{0} m m}
+ {\ifmmode
+ \mspace{\muexpr(#3 mu) * 18 / 1000}%
+ \raisebox{#2\typog@dim@unit}{$\m@th\mathord{-}$}%
+ \mspace{\muexpr(#4 mu) * 18 / 1000}%
+ \else
+ \def\typog@@auto{*}%
+ \def\typog@@optarg{#2}%
+ \hspace*{#3\typog@dim@unit}%
+ \raisebox{\ifx\typog@@optarg\typog@@auto
+ \typog@raisecapitalhyphen
+ \else
+ \typog@@optarg\typog@dim@unit
+ \fi}{\typog@hyphen}%
+ \hspace{#4\typog@dim@unit}%
+ \IfBooleanT{#1}{\nobreak}%
+ \fi}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \RenewExpandableDocumentCommand{\kernedhyphen}{s o m m}{-}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% One-argument shorthands.
+%
+% \begin{macro}{\leftkernedhyphen}
+% Apply kerning on the left-hand side of the hyphen only.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\leftkernedhyphen}{s O{0} m}
+ {\IfBooleanTF{#1}%
+ {\kernedhyphen*[#2]{#3}{0}\ignorespaces}%
+ {\kernedhyphen[#2]{#3}{0}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \RenewExpandableDocumentCommand{\leftkernedhyphen}{s o m}{-}
+}
+
+% \end{macrocode}
+%
+% \begin{macro}{\rightkernedhyphen}
+% Apply kerning on the right-hand side of the hyphen only.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\rightkernedhyphen}{s O{0} m}
+ {\IfBooleanTF{#1}%
+ {\kernedhyphen*[#2]{0}{#3}\ignorespaces}%
+ {\kernedhyphen[#2]{0}{#3}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \RenewExpandableDocumentCommand{\rightkernedhyphen}{s o m}{-}
+}
+
+% \end{macrocode}
+%
+%
+% \subsection{Raise Selected Characters}
+%
+% \begin{macro}{\typog@breakpoint}
+% We want our own penalty for a line-break at a particular point.
+% The predefined \cs{allowbreak} is too eager.
+% A package-private, user-configurable penalty fits best.
+%
+% \begin{macrocode}
+\newcommand*{\typog@breakpoint}
+ {\penalty\typog@breakpenalty}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\capitalhyphen}
+% Macro~\cs{capitalhyphen} introduces a hyphenation possibility right after the dash,
+% whereas the starred version does not.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\capitalhyphen}{s}
+ {\raisebox{\typog@raisecapitalhyphen}{\typog@hyphen}%
+ \IfBooleanTF{#1}%
+ {\ignorespaces}%
+ {\typog@breakpoint\typog@allowhyphenation}}
+% \end{macrocode}
+%
+% The non-hyperref version's code is straightforward.
+% The \cs{pdfstringdefDisableCommands}~version must be expandable
+% and must match the other version's signature.
+% Yikes!
+% We exploit the fact that conditions are expandable.
+% However, we cannot use \cs{typog@hyphen} in the expansion as \cs{char} gets in the way.
+% So, we fall back to the least~common denominator and use a bare dash.
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \def\capitalhyphen#1{%
+ \if*\detokenize{#1}%
+ -\ignorespaces
+ \else
+ -#1%
+ \fi}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\capitalendash}
+% Macro~\cs{capitalendash} introduces a hyphenation possibility right after the dash;
+% its starred version does not.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\capitalendash}{s}
+ {\raisebox{\typog@raisecapitaldash}{\textendash}%
+ \IfBooleanTF{#1}%
+ {\ignorespaces}%
+ {\typog@breakpoint\typog@allowhyphenation}}
+\let\capitaldash=\capitalendash
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \def\capitalendash#1{%
+ \if*\detokenize{#1}%
+ \textendash\ignorespaces
+ \else
+ \textendash#1%
+ \fi}
+ \let\capitaldash=\capitalendash
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\capitalemdash}
+% Macro~\cs{capitalemdash} introduces a hyphenation possibility right after the dash;
+% its starred version does not.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\capitalemdash}{s}
+ {\raisebox{\typog@raisecapitaldash}{\textemdash}%
+ \IfBooleanTF{#1}%
+ {\ignorespaces}%
+ {\typog@breakpoint\typog@allowhyphenation}}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \def\capitalemdash#1{%
+ \if*\detokenize{#1}%
+ \textemdash\ignorespaces
+ \else
+ \textemdash#1%
+ \fi}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\figuredash}
+% Macro~\cs{figuredash} introduces a hyphenation possibility right after the dash;
+% its starred version does not.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\figuredash}{s}
+ {\raisebox{\typog@raisefiguredash}{\textendash}%
+ \IfBooleanTF{#1}%
+ {\ignorespaces}%
+ {\typog@breakpoint\typog@allowhyphenation}}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\figuredash=\capitaldash}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\capitaltimes}
+% \begin{macrocode}
+\NewDocumentCommand{\capitaltimes}{}
+ {\ifmmode
+ \mathbin{\raisebox{\typog@raisecapitaltimes}{$\m@th\times$}}%
+ \else
+ \raisebox{\typog@raisecapitaltimes}{\texttimes}%
+ \fi}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{
+ \RenewExpandableDocumentCommand{\capitaltimes}{}{\texttimes}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\singleguillemetleft}
+% \begin{macrocode}
+\NewDocumentCommand{\singleguillemetleft}{}
+ {\typog@allowhyphenation
+ \raisebox{\typog@raiseguillemets}{\guilsinglleft}}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\singleguillemetleft\guilsinglleft}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\singleguillemetright}
+% \begin{macrocode}
+\NewDocumentCommand{\singleguillemetright}{}
+ {\raisebox{\typog@raiseguillemets}{\guilsinglright}%
+ \typog@allowhyphenation}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\singleguillemetright\guilsinglright}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\doubleguillemetleft}
+% \begin{macrocode}
+\NewDocumentCommand{\doubleguillemetleft}{}
+ {\typog@allowhyphenation
+ \raisebox{\typog@raiseguillemets}{\guillemotleft}}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\doubleguillemetleft\guillemotleft}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\doubleguillemetright}
+% \begin{macrocode}
+\NewDocumentCommand{\doubleguillemetright}{}
+ {\raisebox{\typog@raiseguillemets}{\guillemotright}%
+ \typog@allowhyphenation}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\doubleguillemetright\guillemotright}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Singleguillemetleft}
+% \begin{macrocode}
+\NewDocumentCommand{\Singleguillemetleft}{}
+ {\typog@allowhyphenation
+ \raisebox{\typog@raisecapitalguillemets}{\guilsinglleft}}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\Singleguillemetleft\guilsinglleft}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Singleguillemetright}
+% \begin{macrocode}
+\NewDocumentCommand{\Singleguillemetright}{}
+ {\raisebox{\typog@raisecapitalguillemets}{\guilsinglright}%
+ \typog@allowhyphenation}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\Singleguillemetright\guilsinglright}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Doubleguillemetleft}
+% \begin{macrocode}
+\NewDocumentCommand{\Doubleguillemetleft}{}
+ {\typog@allowhyphenation
+ \raisebox{\typog@raisecapitalguillemets}{\guillemotleft}}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\Doubleguillemetleft\guillemotleft}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Doubleguillemetright}
+% \begin{macrocode}
+\NewDocumentCommand{\Doubleguillemetright}{}
+ {\raisebox{\typog@raisecapitalguillemets}{\guillemotright}%
+ \typog@allowhyphenation}
+% \end{macrocode}
+%
+% \acronym{PDF}-substitute definition
+%
+% \begin{macrocode}
+\typog@register@pdfsubstitute{\let\Doubleguillemetright\guillemotright}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection[Align Last Line]{Align Last Line of a Paragraph}
+%
+% The code of environment |lastlineraggedleftpar|
+% has been inspired by macro~\cs{lastlineraggedleft}~\cite[Sec.~2]{wilson:2007}.
+%
+% \begin{environment}{lastlineraggedleftpar}
+% \begin{macrocode}
+\NewDocumentEnvironment{lastlineraggedleftpar}{}
+ {\lastlinefit=0%
+ \setlength{\leftskip}{\z@ \@plus 1fil}%
+ \setlength{\rightskip}{-\leftskip}%
+ \setlength{\parfillskip}{\leftskip}}
+ {\par}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{lastlineflushrightpar}
+% Define |lastlineflushrightpar| as an alias of |lastlineraggedleftpar|.
+%
+% \begin{macrocode}
+\let\lastlineflushrightpar=\lastlineraggedleftpar
+\let\endlastlineflushrightpar=\endlastlineraggedleftpar
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{lastlinecenteredpar}
+% The code of environment |lastlinecenteredpar|
+% has been inspired by \textit{Tex By Topic}~\cite[Sec.~18.3.1]{eijkhout:2007}.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{lastlinecenteredpar}{}
+ {\lastlinefit=0%
+ \setlength{\leftskip}{\z@ \@plus .5fil}%
+ \setlength{\rightskip}{-\leftskip}%
+ \setlength{\parfillskip}{\z@ \@plus 1fil}}
+ {\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection[Fill Last Line]
+% {Fill Last Line of a Paragraph}
+%
+% \begin{environment}{shortenpar}
+% \begin{macrocode}
+\NewDocumentEnvironment{shortenpar}{}
+ {\advance\looseness by -1
+ \ifnum\tracingparagraphs>0
+ \typeout{@ looseness \the\looseness}%
+ \fi}
+ {\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{prolongpar}
+% We try to be prudent and inhibit hyphenation of the next-to-last line
+% just in case the longer paragraph could be cheaply achieved by hyphenation
+% --~at the worst~-- of the last word.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{prolongpar}{}
+ {\finalhyphendemerits=100000001
+ \advance\looseness by 1
+ \ifnum\tracingparagraphs>0
+ \typeout{@ looseness \the\looseness}%
+ \fi}
+ {\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\typog@covernextindentpar@zero@parindent}
+% This auxiliary macro and the following one
+% are meant as an easy means to override the defaults
+% of the user-visible environment~|covernextindentpar|.
+%
+% \begin{macrocode}
+\newcommand*{\typog@covernextindentpar@zero@parindent}{2em}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@covernextindentpar@nonzero@parindent}
+% \begin{macrocode}
+\newcommand*{\typog@covernextindentpar@nonzero@parindent}{2\parindent}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{covernextindentpar}
+% \begin{macrocode}
+\NewDocumentEnvironment{covernextindentpar}{o}
+ {\IfNoValueTF{#1}
+ {\ifdim\parindent=\z@
+ \dimen0=\dimexpr\linewidth - \typog@covernextindentpar@zero@parindent
+ \else
+ \dimen0=\dimexpr\linewidth - \typog@covernextindentpar@nonzero@parindent
+ \fi}
+ {\dimen0=\dimexpr\linewidth - (#1)}%
+ \parfillskip=\dimen0 \@minus \dimen0
+ \relax}
+ {\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\typog@openlastlinepar@zero@parindent}
+% These auxiliary macros are meant as a means to override the defaults
+% of the user-visible environment~|openlastlinepar|.
+%
+% \begin{macrocode}
+\newcommand*{\typog@openlastlinepar@zero@parindent}{2em}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@openlastlinepar@nonzero@parindent}
+% \begin{macrocode}
+\newcommand*{\typog@openlastlinepar@nonzero@parindent}{2\parindent}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{openlastlinepar}
+% Compare with the suggestion in Ref.~\citenum{wermuth:2018}.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{openlastlinepar}{o}
+ {\IfNoValueTF{#1}
+ {\ifdim\parindent=\z@
+ \skip0=\typog@openlastlinepar@zero@parindent
+ \@plus 1fil
+ \@minus \typog@openlastlinepar@zero@parindent
+ \else
+ \skip0=\typog@openlastlinepar@nonzero@parindent
+ \@plus 1fil
+ \@minus \typog@openlastlinepar@nonzero@parindent
+ \fi}
+ {\dimen0=\dimexpr#1\relax
+ \skip0=\dimen0 \@plus 1fil \@minus \dimen0}
+ \parfillskip=\skip0}
+ {\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Spacing}
+%
+% \begin{macro}{\widespacestrength}
+% Weight factor (``strength'') for \cs{fontdimen7}, the extra width of a sentence-ending
+% space, we apply to construct our \cs{widespace} if \(\cs{fontdimen7} \not= 0\). Can be
+% increased to get a more pronounced effect.
+%
+% \begin{macrocode}
+\newcommand*{\widespacestrength}{1.}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\widespacescale}
+% Scale factor we apply to the glue of the normal space to setup the glue of our
+% \cs{widespacescale}. Also used in the fall-back calculation for the width if
+% \(\cs{fontdimen7} = 0\).
+%
+% \begin{macrocode}
+\newcommand*{\widespacescale}{1.125}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\widespace}
+% \changes{v0.2}{2024-3-29}{Add fallback if \cs{fontdimen7} is zero. Extend with a starred version.}
+% \begin{macrocode}
+\NewDocumentCommand{\widespace}{s}
+ {\IfBooleanTF{#1}%
+ {\dimen0=\widespacescale\fontdimen2\font}%
+ {\ifdim\fontdimen7\font=\z@
+ \dimen0=\widespacescale\fontdimen2\font
+ \else
+ \dimen0=\dimexpr\fontdimen2\font +
+ \widespacestrength\fontdimen7\font
+ \fi}%
+ \hskip \glueexpr\dimen0
+ \@plus \widespacescale\fontdimen3\font
+ \@minus \widespacescale\fontdimen4\font
+ \ignorespaces}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\narrowspacestrength}
+% Weight factor (``strength'') for \cs{fontdimen7}, the extra width of a sentence-ending
+% space, we apply to construct our \cs{narrowspace} if \(\cs{fontdimen7} \not= 0\). Can be
+% increased to get a more pronounced effect.
+%
+% \begin{macrocode}
+\newcommand*{\narrowspacestrength}{.5}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\narrowspacescale}
+% Scale factor we apply to the glue of the normal space to setup the glue of our
+% \cs{narrowspacescale}. Also used in the fall-back calculation for the width if
+% \(\cs{fontdimen7} = 0\).
+%
+% \begin{macrocode}
+\newcommand*{\narrowspacescale}{.9375}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\narrowspace}
+% \changes{v0.2}{2024-3-29}{New macro.}
+% \begin{macrocode}
+\NewDocumentCommand{\narrowspace}{s}
+ {\IfBooleanTF{#1}%
+ {\dimen0=\narrowspacescale\fontdimen2\font}%
+ {\ifdim\fontdimen7\font=\z@
+ \dimen0=\narrowspacescale\fontdimen2\font
+ \else
+ \dimen0=\dimexpr\fontdimen2\font -
+ \narrowspacestrength\fontdimen7\font
+ \fi}%
+ \hskip \glueexpr\dimen0
+ \@plus \narrowspacescale\fontdimen3\font
+ \@minus \narrowspacescale\fontdimen4\font
+ \ignorespaces}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% See also: TeX by Topic \cite[ch.~20, p.~185\figuredash190]{eijkhout:2007}.
+%
+% \begin{environment}{loosespacing}
+% \begin{macrocode}
+\NewDocumentEnvironment{loosespacing}{O{1}}
+ {\dimen2=\fontdimen2\font
+ \ifcase #1
+ \spaceskip=\z@
+ \or % 1 +5%
+ \spaceskip=1.05\dimen2 \@plus .5\dimen2 \@minus .1\dimen2
+ \or % 2 +10%
+ \spaceskip=1.1\dimen2 \@plus .5\dimen2 \@minus .1\dimen2
+ \or % 3 +20%
+ \spaceskip=1.2\dimen2 \@plus .6\dimen2 \@minus .2\dimen2
+ \else % >= 4 +30%
+ \spaceskip=1.3\dimen2 \@plus .8\dimen2 \@minus .3\dimen2
+ \fi
+ \ignorespaces}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{tightspacing}
+% \begin{macrocode}
+\NewDocumentEnvironment{tightspacing}{O{1}}
+ {\dimen2=\fontdimen2\font
+ \ifcase #1
+ \spaceskip=\z@
+ \or % 1 -1.25%
+ \spaceskip=.9875\dimen2 \@plus .0125\dimen2 \@minus .5\dimen2
+ \or % 2 -2.5%
+ \spaceskip=.975\dimen2 \@plus .025\dimen2 \@minus .5\dimen2
+ \or % 3 -5%
+ \spaceskip=.95\dimen2 \@plus .05\dimen2 \@minus .5\dimen2
+ \else % >= 4 -10%
+ \spaceskip=.9\dimen2 \@plus .1\dimen2 \@minus .5\dimen2
+ \fi
+ \ignorespaces}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Microtype Front\capitalhyphen End}
+%
+% \subsubsection*{Tracking}
+%
+% \begin{environment}{setfonttracking}
+%
+% To archieve the control we want,
+% we must tinker with \packagename{microtype's} internals.
+% Doh!
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{setfonttracking}{m}
+ {\edef\MT@letterspace@{#1}%
+ \lsstyle
+ \ignorespaces}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsubsection*{Font Expansion}
+%
+% \begin{macro}{\typog@setup@font@expansion}
+% Note that we cannot factor the encodings into a macro;
+% a single encoding would qualify, though.
+% We need to support multiple encodings and thus go with the literal solution.
+%
+% \begin{macrocode}
+\newcommand*{\typog@setup@font@expansion}
+ {\SetExpansion
+ [context = typog@shrink1,
+ shrink = \typog@shrink@i,
+ stretch = 0]%
+ {encoding = {*}}%
+ {}
+ \SetExpansion
+ [context = typog@shrink2,
+ shrink = \typog@shrink@ii,
+ stretch = 0]%
+ {encoding = {*}}%
+ {}
+ \SetExpansion
+ [context = typog@shrink3,
+ shrink = \typog@shrink@iii,
+ stretch = 0]%
+ {encoding = {*}}%
+ {}
+
+ \SetExpansion
+ [context = typog@stretch1,
+ shrink = 0,
+ stretch = \typog@stretch@i]%
+ {encoding = {*}}%
+ {}
+ \SetExpansion
+ [context = typog@stretch2,
+ shrink = 0,
+ stretch = \typog@stretch@ii]%
+ {encoding = {*}}%
+ {}
+ \SetExpansion
+ [context = typog@stretch3,
+ shrink = 0,
+ stretch = \typog@stretch@iii]%
+ {encoding = {*}}%
+ {}
+
+ \SetExpansion
+ [context = typog@expand1,
+ shrink = \typog@shrink@i,
+ stretch = \typog@stretch@i]%
+ {encoding = {*}}%
+ {}
+ \SetExpansion
+ [context = typog@expand2,
+ shrink = \typog@shrink@ii,
+ stretch = \typog@stretch@ii]%
+ {encoding = {*}}%
+ {}
+ \SetExpansion
+ [context = typog@expand3,
+ shrink = \typog@shrink@iii,
+ stretch = \typog@stretch@iii]%
+ {encoding = {*}}%
+ {}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@test@microtype@expansion@feature}
+% We cannot even parse the \cs{iftypog@microtype@preloaded}~part further down
+% unless the \cs{ifMT@expansion}~conditional exists.
+% So we hoist this test in a macro of its own.
+% It only gets called if package~\packagename{microtype} already has been sourced.
+%
+% \begin{macrocode}
+\newcommand*{\typog@test@microtype@expansion@feature}
+ {\ifMT@expansion
+ \typog@typeout{microtype preloaded -- font expansion features available}%
+ \def\typog@require@microtype@expansion{\relax}
+ \typog@setup@font@expansion
+ \else
+ \PackageWarning{typog}{microtype preloaded,\space
+ but font expansion is disabled}%
+ \def\typog@require@microtype@expansion
+ {\PackageError{typog}
+ {microtype font expansion disabled}
+ {pass option `expansion' to package microtype}}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@require@microtype@expansion}
+% We are all set for the initialization of the font expansion,
+% however, we must be careful in which (load-)state
+% package~\packagename{microtype} is in.
+% Compare the code for \cs{typog@require@microtype}
+% and~\cs{typog@require@preloaded@microtype}.
+%
+% Initialize our own flag and setup meaningful messages for later feature checks.
+%
+% \begin{macrocode}
+\iftypog@microtype@preloaded
+ \typog@test@microtype@expansion@feature
+\else
+ \def\typog@require@microtype@expansion
+ {\PackageError{typog}%
+ {package microtype not (pre-)loaded, %
+ which is required for typog's font expansion}%
+ {require package microtype before package typog}}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{setfontshrink}
+% \begin{macrocode}
+\NewDocumentEnvironment{setfontshrink}{O{1}}
+ {\typog@require@microtype@expansion
+ \ifcase#1% 0
+ \relax
+ \or % 1
+ \microtypecontext{expansion=typog@shrink1}%
+ \or % 2
+ \microtypecontext{expansion=typog@shrink2}%
+ \else % >= 3
+ \microtypecontext{expansion=typog@shrink3}%
+ \fi
+ \ignorespaces}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{setfontstretch}
+% \begin{macrocode}
+\NewDocumentEnvironment{setfontstretch}{O{1}}
+ {\typog@require@microtype@expansion
+ \ifcase#1% 0
+ \relax
+ \or % 1
+ \microtypecontext{expansion=typog@stretch1}%
+ \or % 2
+ \microtypecontext{expansion=typog@stretch2}%
+ \else % >= 3
+ \microtypecontext{expansion=typog@stretch3}%
+ \fi
+ \ignorespaces}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{setfontexpand}
+% \begin{macrocode}
+\NewDocumentEnvironment{setfontexpand}{O{1}}
+ {\typog@require@microtype@expansion
+ \ifcase#1% 0
+ \relax
+ \or % 1
+ \microtypecontext{expansion=typog@expand1}%
+ \or % 2
+ \microtypecontext{expansion=typog@expand2}%
+ \else % >= 3
+ \microtypecontext{expansion=typog@expand3}%
+ \fi
+ \ignorespaces}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{nofontexpansion}
+% Implementation: We proceed a different approach with respect to requiring package microtype.
+% The semantics of the macro is to switch something off.
+% If it is not \singlequotes{on} because the necessary package was not loaded, a no-op is ok.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{nofontexpansion}{}
+ {\ifdefined\microtypesetup
+ \microtypesetup{expansion=false}%
+ \fi
+ \ignorespaces}
+ {\ignorespacesafterend}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{nofontexpand}
+% Define |nofontexpand| as an alias of |nofontexpansion|.
+%
+% \begin{macrocode}
+\let\nofontexpand=\nofontexpansion
+\let\endnofontexpand=\endnofontexpansion
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsubsection*{Character Protrusion}
+%
+% \begin{environment}{nocharprotrusion}
+% See \singlequotes{Implementation} comment of |nofontexpansion|.
+%
+% \begin{macrocode}
+\NewDocumentEnvironment{nocharprotrusion}{}
+ {\ifdefined\microtypesetup
+ \microtypesetup{protrusion=false}%
+ \fi
+ \ignorespaces}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Sloppy Paragraphs}
+%
+% \begin{macro}{\typog@scaled@emergencystretch}
+% Compute the correct scale factor for the emergency stretch
+% even if we do not have a valid \cs{linewidth}.
+%
+% \begin{macrocode}
+\newcommand*{\typog@scaled@emergencystretch}[1]
+ {\emergencystretch=\ifdim\linewidth=\z@
+ #1%
+ \else
+ \dimexpr (#1) * \linewidth / \textwidth
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\slightlysloppy}
+% Macro~\cs{slightlysloppy} takes an optional~\meta{sloppiness} index ranging from~0 to~8,
+% where~0 means the same as \cs{fussy} and~8 or more works like \cs{sloppy}.
+% The default \meta{sloppiness} is~1.
+%
+% \begin{macrocode}
+\NewDocumentCommand{\slightlysloppy}{O{1}}
+ {\ifcase #1% 0
+ % \tolerance=200
+ % \emergencystretch=\z@
+ % \hfuzz=.1\p@
+ % \vfuzz=\hfuzz
+ \fussy
+ \or % 1
+ \pretolerance=165%
+ \tolerance=330%
+ \typog@scaled@emergencystretch{.375em}%
+ \hfuzz=.15\p@
+ \vfuzz=\hfuzz
+ \or % 2
+ \pretolerance=265%
+ \tolerance=530%
+ \typog@scaled@emergencystretch{.75em}%
+ \hfuzz=.15\p@
+ \vfuzz=\hfuzz
+ \or % 3
+ \pretolerance=435%
+ \tolerance=870%
+ \typog@scaled@emergencystretch{1.125em}%
+ \hfuzz=.2\p@
+ \vfuzz=\hfuzz
+ \or % 4
+ \pretolerance=705%
+ \tolerance=1410%
+ \typog@scaled@emergencystretch{1.5em}%
+ \hfuzz=.3\p@
+ \vfuzz=\hfuzz
+ \or % 5
+ \pretolerance=1155%
+ \tolerance=2310%
+ \typog@scaled@emergencystretch{1.875em}%
+ \hfuzz=.35\p@
+ \vfuzz=\hfuzz
+ \or % 6
+ \pretolerance=1880%
+ \tolerance=3760%
+ \typog@scaled@emergencystretch{2.25em}%
+ \hfuzz=.4\p@
+ \vfuzz=\hfuzz
+ \or % 7
+ \pretolerance=3065%
+ \tolerance=6130%
+ \typog@scaled@emergencystretch{2.625em}%
+ \hfuzz=.45\p@
+ \vfuzz=\hfuzz
+ \else % >= 8
+ % \tolerance=9999
+ % \emergencystretch=3em
+ % \hfuzz=.5\p@
+ % \vfuzz=\hfuzz
+ \sloppy
+ \fi
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{implementationnote}
+% \begin{itemize}
+% \item The \cs{tolerance}~values are calculated as the geometric mean of the extreme
+% values~200 and~9999. This means the factor
+% \begin{equation*}
+% f = \Big(\frac{9999}{200}\Big)^{1/8} \approx 1.63
+% \end{equation*}
+% defines additional tolerances which we generously round values in the actual
+% implementation.
+%
+% \item The \cs{emergencystretch} is scaled linearly with \meta{sloppiness} \emph{and} the
+% ratio of the actual \cs{linewidth} to the (maximum) \cs{textwidth}.
+%
+% \item The \cs{hfuzz}~values are interpolated linearly with \meta{sloppiness} between .1pt
+% and~.5pt.
+% \end{itemize}
+%
+% Maxima code to calculate the intermediate values.
+%
+% \begin{description}
+% \item[Initialize.] \code{load("list\_functions")\$}
+% \item[\cs{tolerance}:] \code{logspace(log10(200), log10(9999), 9), numer;}
+% \item[\cs{emergencystretch}:] \code{linspace(0, 3, 9), numer;}
+% \item[\cs{hfuzz}:] \code{linspace(0.1, 0.5, 9);}
+% \end{description}
+% \end{implementationnote}
+%
+% \begin{environment}{slightlysloppypar}
+% \begin{macrocode}
+\NewDocumentEnvironment{slightlysloppypar}{O{1}}
+ {\par\slightlysloppy[#1]\ignorespaces}
+ {\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection[Vert.~Tie Paragraphs]{Vertically Partially-Tied Paragraphs}
+%
+% \begin{macro}{\typog@geometric@mean}
+% This is just the usual geometric mean of two values~\(x\) and~\(y\): \(\sqrt{x y}\).
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+\newcommand*{\typog@geometric@mean}[2]
+ {\fp_to_int:n {sqrt((#1) * (#2))}}
+\ExplSyntaxOff
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{typog@mean@penalty}
+% Reserve a private counter for the geometric-mean penalties.
+%
+% \begin{macrocode}
+\newcounter{typog@mean@penalty}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vtietop}
+% \begin{macrocode}
+\NewDocumentCommand{\vtietop}{O{3}}
+ {\setcounter{typog@mean@penalty}
+ {\typog@geometric@mean{\@M}{\clubpenalty}}%
+ \typog@typeout{vtietop: penalties \the\@M--\the\value{typog@mean@penalty}--\the\clubpenalty}%
+ \unless\ifnum\clubpenalty<\@M
+ \PackageWarning{typog}{vtietop: clubpenalty=\the\clubpenalty\space>= 10000}%
+ \fi
+ \ifcase#1% 0
+ \relax
+ \or % 1
+ \relax
+ \or % 2
+ \clubpenalties 3
+ \@M
+ \value{typog@mean@penalty}
+ \clubpenalty
+ \or % 3
+ \clubpenalties 4
+ \@M \@M
+ \value{typog@mean@penalty}
+ \clubpenalty
+ \or % 4
+ \clubpenalties 5
+ \@M \@M \@M
+ \value{typog@mean@penalty}
+ \clubpenalty
+ \or % 5
+ \clubpenalties 6
+ \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \clubpenalty
+ \or % 6
+ \clubpenalties 7
+ \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \clubpenalty
+ \or % 7
+ \clubpenalties 8
+ \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \clubpenalty
+ \or % 8
+ \clubpenalties 9
+ \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \clubpenalty
+ \else % >= 9
+ \clubpenalties 10
+ \@M \@M \@M \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \clubpenalty
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{vtietoppar}
+% \begin{macrocode}
+\NewDocumentEnvironment{vtietoppar}{O{3}}
+ {\vtietop[#1]}
+ {\par
+ \ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\splicevtietop}
+% \begin{macrocode}
+\NewDocumentCommand{\splicevtietop}{O{3}}
+ {\let\typog@old@item=\@item
+ \def\@item[##1]{\typog@old@item[##1]\vtietop[#1]}%
+ \ignorespaces}
+
+% \end{macrocode}
+%
+% We define an extra style for the users of \packagename{enumitem}.
+% Its only drawback is that it hard-codes the default number of tied lines~(3).
+%
+% \begin{macrocode}
+\ifdefined\SetEnumitemKey
+ \SetEnumitemKey{vtietop}{first=\splicevtietop}
+\fi
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vtiebot}
+% \begin{macrocode}
+\NewDocumentCommand{\vtiebot}{O{3}}
+ {\setcounter{typog@mean@penalty}
+ {\typog@geometric@mean{\@M}{\widowpenalty}}%
+ \typog@typeout{vtiebot: penalties \the\@M--\the\value{typog@mean@penalty}--\the\widowpenalty}%
+ \unless\ifnum\widowpenalty<\@M
+ \PackageWarning{typog}{vtiebot: widowpenalty=\the\widowpenalty\space>= 10000}%
+ \fi
+ \ifcase#1% 0
+ \relax
+ \or % 1
+ \relax
+ \or % 2
+ \widowpenalties 3
+ \@M
+ \value{typog@mean@penalty}
+ \widowpenalty
+ \or % 3
+ \widowpenalties 4
+ \@M \@M
+ \value{typog@mean@penalty}
+ \widowpenalty
+ \or % 4
+ \widowpenalties 5
+ \@M \@M \@M
+ \value{typog@mean@penalty}
+ \widowpenalty
+ \or % 5
+ \widowpenalties 6
+ \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \widowpenalty
+ \or % 6
+ \widowpenalties 7
+ \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \widowpenalty
+ \or % 7
+ \widowpenalties 8
+ \@M \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \widowpenalty
+ \or % 8
+ \widowpenalties 9
+ \@M \@M \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \widowpenalty
+ \else % >= 9
+ \widowpenalties 10
+ \@M \@M \@M \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \widowpenalty
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{vtiebotpar}
+% \begin{macrocode}
+\NewDocumentEnvironment{vtiebotpar}{O{3}}
+ {\vtiebot[#1]}
+ {\par
+ \ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\typog@vtiebotdisp}
+% \begin{macrocode}
+\NewDocumentCommand{\typog@vtiebotdisp}{m}
+ {\setcounter{typog@mean@penalty}
+ {\typog@geometric@mean{\@M}{\displaywidowpenalty}}%
+ \typog@typeout{vtiebotdisp: penalties \the\@M--\the\value{typog@mean@penalty}--\the\displaywidowpenalty}%
+ \unless\ifnum\displaywidowpenalty<\@M
+ \PackageWarning{typog}{vtiebotdisp: displaywidowpenalty=\the\displaywidowpenalty\space>= 10000}%
+ \fi
+ \ifcase#1% 0
+ \relax
+ \or % 1
+ \relax
+ \or % 2
+ \displaywidowpenalties 3
+ \@M
+ \value{typog@mean@penalty}
+ \displaywidowpenalty
+ \or % 3
+ \displaywidowpenalties 4
+ \@M \@M
+ \value{typog@mean@penalty}
+ \displaywidowpenalty
+ \or % 4
+ \displaywidowpenalties 5
+ \@M \@M \@M
+ \value{typog@mean@penalty}
+ \displaywidowpenalty
+ \or % 5
+ \displaywidowpenalties 6
+ \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \displaywidowpenalty
+ \or % 6
+ \displaywidowpenalties 7
+ \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \displaywidowpenalty
+ \or % 7
+ \displaywidowpenalties 8
+ \@M \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \displaywidowpenalty
+ \or % 8
+ \displaywidowpenalties 9
+ \@M \@M \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \displaywidowpenalty
+ \else % >= 9
+ \displaywidowpenalties 10
+ \@M \@M \@M \@M \@M \@M \@M \@M
+ \value{typog@mean@penalty}
+ \displaywidowpenalty
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{vtiebotdisp}
+% \begin{macrocode}
+\NewDocumentEnvironment{vtiebotdisp}{O{3}}
+ {\typog@vtiebotdisp{#1}}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{vtiebotdisptoppar}
+% \begin{macrocode}
+\NewDocumentEnvironment{vtiebotdisptoppar}{O{3}o}
+ {\postdisplaypenalty=\@M
+ \predisplaypenalty=10001% in accordance with package `widows-and-orphans'
+ \edef\typog@@top@lines{\IfNoValueTF{#2}{#1}{#2}}%
+ \edef\typog@@after@display@math{\vtietop[\typog@@top@lines]}%
+ \PushPostHook{display}{\aftergroup\typog@@after@display@math}%
+ \vtiebotdisp[#1]}
+ {\par
+ \PopPostHook{display}%
+ \ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Breakable Disp.~Eqs.}
+%
+% \begin{environment}{breakabledisplay}
+% We use a different default, 3, than \cs{allowdisplaybreaks} which utilizes~4 as its
+% default.
+%
+% \begin{macrocode}
+\newenvironment*{breakabledisplay}[1][3]
+ {\allowdisplaybreaks[#1]}
+ {\ignorespacesafterend}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{Setspace Front-End}
+%
+% \begin{macro}{\typog@iter@limit}
+% The maximum number of iterations we perform before bailing out with an error. Can be
+% changed by the user if convergence is slow.
+%
+% \begin{macrocode}
+\newcommand*{\typog@setbaselineskip@iter@limit}{10}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@setbaselineskip@relative@error}
+% The maximum relative error of the ratio we tolerate for the final baselineskip over the
+% target baselineskip. Can also be changed by the user if necessary.
+%
+% \begin{macrocode}
+\newcommand*{\typog@setbaselineskip@relative@error}{.001}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@setbaselineskip}
+% Given the \meta{target-baselineskip} as argument iterate setting \cs{setstretch} until the
+% error drops below our threshold.
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+\cs_new:Npn \typog@setbaselineskip #1
+{
+% \end{macrocode}
+%
+% Initialize our ``emergency-stop'' loop counter.
+%
+% \begin{macrocode}
+ \int_set:Nn \l_tmpa_int {1}
+ \int_set:Nn \l_tmpb_int {\typog@setbaselineskip@iter@limit}
+% \end{macrocode}
+%
+% Note that the call to \cs{glueexpr} is required to consume dimensions that carry
+% stretchability via |plus| or |minus|.
+%
+% \begin{macrocode}
+ \dim_set:Nn \l_tmpa_dim {\glueexpr #1}
+
+ \typog@typeout{\string\setbaselineskip:\space
+ initial\space baselineskip:\space \the\baselineskip}
+ \typog@typeout{\string\setbaselineskip:\space
+ target\space baselineskip:\space \dim_use:N \l_tmpa_dim}
+
+ \dim_compare:nNnTF {\baselineskip} > {\c_zero_dim}
+ {}
+ {
+ \PackageError{typog}
+ {\string\setbaselineskip:\space
+ baselineskip\space not\space positive}
+ {}
+ }
+
+ \dim_compare:nNnTF {\l_tmpa_dim} > {\c_zero_dim}
+ {}
+ {
+ \PackageError{typog}
+ {\string\setbaselineskip:\space target\space
+ baselineskip\space must\space be\space
+ positive}
+ {}
+ }
+
+ \skip_if_eq:nnTF {\l_tmpa_dim} {\glueexpr #1}
+ {}
+ {
+ \PackageWarning{typog}
+ {\string\setbaselineskip:\space argument\space
+ is\space a\space skip;\space
+ will\space ignore\space glue}
+ {}
+ }
+
+ \fp_set:Nn \l_tmpa_fp {\l_tmpa_dim / \baselineskip}
+ \fp_until_do:nNnn {abs(\l_tmpa_dim / \baselineskip - 1)} <
+ {\typog@setbaselineskip@relative@error}
+ {
+ \setstretch{\fp_use:N \l_tmpa_fp}
+ \fp_set:Nn \l_tmpa_fp
+ {\l_tmpa_fp * \l_tmpa_dim / \baselineskip}
+
+ \int_incr:N \l_tmpa_int
+ \int_compare:nNnTF {\l_tmpa_int} > {\l_tmpb_int}
+ {
+ \PackageError{typog}
+ {\string\setbaselineskip:\space excessive\space
+ number\space of\space iterations:\space
+ \int_use:N \l_tmpa_int\space >\space
+ \int_use:N \l_tmpb_int}
+ {}
+ }
+ {}
+ }
+
+ \typog@typeout{\string\setbaselineskip:\space
+ final\space \string\setstretch\space argument:\space
+ \fp_use:N \l_tmpa_fp}
+ \typog@typeout{\string\setbaselineskip:\space
+ final\space baselineskip:\space \the\baselineskip}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setbaselineskip}
+% \changes{v0.3}{2024-04-04}{New macro.}
+%
+% Set the \cs{baselineskip} to an absolute length.
+%
+% \begin{implementationnote}
+% Viewed as a standalone macro \cs{setbaselineskip} does not need the decoration
+% \cs{AfterPreamble}. However, all of its siblings, \cs{setbaselineskippercentage},
+% \cs{setleading}, and \cs{setleadingpercentage} then would behave differently as they are
+% delayed to the end of the preamble, but \cs{setbaselineskip} immediately becomes
+% effective. For example, the successive calls
+%
+% \begin{codeexample}
+% \cs{setbaselineskippercentage}\{140\} \\
+% \cs{setbaselineskip}\{12.5pt\}
+% \end{codeexample}
+%
+% \noindent
+% in the preamble would set the baselineskip to 140\% in the document. Therefore,
+% \cs{setbaselineskip} is delayed too and the order of the calls thus preserved.
+% \end{implementationnote}
+%
+% \begin{macrocode}
+\cs_new:Npn \setbaselineskip #1
+{
+ \AfterPreamble{\typog@setbaselineskip{#1}}
+ \ignorespaces
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\resetbaselineskip}
+% \changes{v0.3}{2024-04-04}{New macro.}
+%
+% Set the \cs{baselineskip} to \singlequotes{neutral}.
+%
+% \begin{macrocode}
+\cs_new:Npn \resetbaselineskip
+{
+ \AfterPreamble{\setstretch{1}}
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{ldimen}{\typogfontsize}
+% \changes{v0.3}{2024-04-04}{New dimen.}
+% Define the default font-size/quad size.
+%
+% \begin{macrocode}
+\dim_new:N \typogfontsize
+% \end{macrocode}
+%
+% Initialize \cs{typogfontsize} at the end of the preamble, which is after all fonts have
+% been setup.
+%
+% \begin{macrocode}
+\AfterEndPreamble{
+ \dim_set:Nn \typogfontsize {\fontdimen6\font}
+ \typog@typeout{\string\typogfontsize =
+ \dim_use:N \typogfontsize\space
+ (at\space begin\space of\space document)}
+}
+
+% \end{macrocode}
+% \end{ldimen}
+%
+% \begin{macro}{\setbaselineskippercentage}
+% \changes{v0.3}{2024-04-04}{New macro.}
+% \begin{macrocode}
+\cs_new:Npn \setbaselineskippercentage #1
+{
+ \AfterPreamble{
+ \dim_compare:nNnTF {\typogfontsize} > {\c_zero_dim}
+ {
+ \typog@setbaselineskip{
+ \fp_eval:n {(#1) / 100} \typogfontsize}
+ }
+ {
+ \PackageError{typog}
+ {\string\setbaselineskippercentage:\space
+ \string\typogfontsize <= 0}
+ {Maybe\space \string\typogfontsize\space
+ is\space uninitialized?}
+ }
+ }
+ \ignorespaces
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setleading}
+% \changes{v0.3}{2024-04-04}{New macro.}
+% \begin{macrocode}
+\cs_new:Npn \setleading #1
+{
+ \AfterPreamble{
+ \dim_compare:nNnTF {\typogfontsize} > {\c_zero_dim}
+ {
+ \typog@setbaselineskip{\typogfontsize + \dimexpr #1}
+ }
+ {
+ \PackageError{typog}
+ {\string\setleading:\space
+ \string\typogfontsize <= 0}
+ {Maybe\space \string\typogfontsize\space
+ is\space uninitialized?}
+ }
+ }
+ \ignorespaces
+}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setleadingpercentage}
+% \changes{v0.3}{2024-04-04}{New macro.}
+% \begin{macrocode}
+\cs_new:Npn \setleadingpercentage #1
+{
+ \AfterPreamble{
+ \dim_compare:nNnTF {\typogfontsize} > {\c_zero_dim}
+ {
+ \typog@setbaselineskip{
+ \fp_eval:n {1 + (#1) / 100} \typogfontsize}
+ }
+ {
+ \PackageError{typog}
+ {\string\setleadingpercentage:\space
+ \string\typogfontsize <= 0}
+ {Maybe\space \string\typogfontsize\space
+ is\space uninitialized?}
+ }
+ }
+ \ignorespaces
+}
+\ExplSyntaxOff
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Smooth Ragged}
+%
+% \begin{macro}{\typog@repeat}
+% As we shall have to repeat the line specifications for our paragraphs so often we introduce
+% the two argument macro~\cs{typog@repeat} that takes a \meta{repeat-count} and a \meta{body}
+% that is repeated.
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+\cs_new_eq:NN \typog@repeat \prg_replicate:nn
+
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\typog@mod}
+% For error checking we shall need the modulo operation on integers, i.\,e., the remainder of
+% an integral division.
+%
+% \begin{macrocode}
+\newcommand*{\typog@mod}[2]{\int_mod:nn{#1}{#2}}
+\ExplSyntaxOff
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\typog@triplet@max@lines}
+% Maximum number of lines a smoothraggedright paragraph can have with the triplet generator.
+% The number must be divisible by~3.
+%
+% \begin{macrocode}
+\newcommand*{\typog@triplet@max@lines}{99}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{smoothraggedrightshapetriplet}
+% Engine for 3-line repetitions.
+%
+% \begin{macrocode}
+\define@key[typog]{smoothraggedrightshapetriplet}{leftskip}%
+ {\def\typog@@triplet@leftskip{#1}}
+\define@key[typog]{smoothraggedrightshapetriplet}{parindent}%
+ {\def\typog@@triplet@parindent{#1}}
+\NewDocumentEnvironment{smoothraggedrightshapetriplet}{O{} m m m}
+ {\def\typog@@triplet@leftskip{\z@}%
+ \def\typog@@triplet@parindent{\z@}%
+ \setkeys*[typog]{smoothraggedrightshapetriplet}{#1}%
+ \skip0=\typog@@triplet@leftskip\relax
+ \skip1=#2\relax
+ \skip2=#3\relax
+ \skip3=#4\relax
+ \typog@typeout{smoothraggedrightshapetriplet: skip0=\the\skip0}%
+ \typog@typeout{smoothraggedrightshapetriplet: skip1=\the\skip1}%
+ \typog@typeout{smoothraggedrightshapetriplet: skip2=\the\skip2}%
+ \typog@typeout{smoothraggedrightshapetriplet: skip3=\the\skip3}%
+ \unless\ifnum\typog@mod{\typog@triplet@max@lines}{3}=0
+ \PackageError{typog}
+ {Line number of triplet generator %
+ (\typog@triplet@max@lines) not divisible by 3}
+ {}
+ \fi
+ \edef\typog@@triplet@linespecs{%
+ \glueexpr \skip0 + \typog@@triplet@parindent\relax
+ \glueexpr \skip1 - \typog@@triplet@parindent\relax
+ \skip0 \skip2 \skip0 \skip3
+ \typog@repeat{\numexpr\typog@triplet@max@lines / 3 - 1}
+ {\skip0 \skip1 \skip0 \skip2 \skip0 \skip3}}
+ \parshape=\typog@triplet@max@lines\typog@@triplet@linespecs\relax}
+ {\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \begin{macro}{\typog@quintuplet@max@lines}
+% Maximum number of lines a smoothraggedright paragraph can have with the quintuplet
+% generator. The number must be divisible by~5.
+%
+% \begin{macrocode}
+\newcommand*{\typog@quintuplet@max@lines}{95}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{smoothraggedrightshapequintuplet}
+% Engine for 5-line repetitions.
+%
+% \begin{macrocode}
+\define@key[typog]{smoothraggedrightshapequintuplet}{leftskip}
+ {\def\typog@@quintuplet@leftskip{#1}}
+\define@key[typog]{smoothraggedrightshapequintuplet}{parindent}
+ {\def\typog@@quintuplet@parindent{#1}}
+\NewDocumentEnvironment{smoothraggedrightshapequintuplet}{O{} m m m m m}
+ {\def\typog@@quintuplet@leftskip{\z@}%
+ \def\typog@@quintuplet@parindent{\z@}%
+ \setkeys*[typog]{smoothraggedrightshapequintuplet}{#1}%
+ \skip0=\typog@@quintuplet@leftskip
+ \skip1=#2\relax
+ \skip2=#3\relax
+ \skip3=#4\relax
+ \skip4=#5\relax
+ \skip5=#6\relax
+ \typog@typeout{smoothraggedrightshapequintuplet: skip0=\the\skip0}%
+ \typog@typeout{smoothraggedrightshapequintuplet: skip1=\the\skip1}%
+ \typog@typeout{smoothraggedrightshapequintuplet: skip2=\the\skip2}%
+ \typog@typeout{smoothraggedrightshapequintuplet: skip3=\the\skip3}%
+ \typog@typeout{smoothraggedrightshapequintuplet: skip4=\the\skip4}%
+ \typog@typeout{smoothraggedrightshapequintuplet: skip5=\the\skip5}%
+ \unless\ifnum\typog@mod{\typog@quintuplet@max@lines}{5}=0
+ \PackageError{typog}
+ {Line number of quintuplet generator %
+ (\typog@quintuplet@max@lines) not divisible by 5}
+ {}
+ \fi
+ \edef\typog@@quintuplet@linespecs{%
+ \glueexpr \skip0 + \typog@@quintuplet@parindent\relax
+ \glueexpr \skip1 - \typog@@quintuplet@parindent\relax
+ \skip0 \skip2 \skip0 \skip3 \skip0 \skip4 \skip0 \skip5
+ \typog@repeat{\numexpr\typog@quintuplet@max@lines / 5 - 1}
+ {\skip0 \skip1 \skip0 \skip2 \skip0 \skip3 \skip0 \skip4 \skip0 \skip5}}
+ \parshape=\typog@quintuplet@max@lines\typog@@quintuplet@linespecs\relax}
+ {\par}
+% \end{macrocode}
+
+% \end{environment}
+%
+%
+% \begin{macro}{\typog@septuplet@max@lines}
+% Maximum number of lines a smoothraggedright paragraph can have with the septuplet
+% generator. The number must be divisible by~7.
+%
+% \begin{macrocode}
+\newcommand*{\typog@septuplet@max@lines}{98}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{smoothraggedrightshapeseptuplet}
+% Engine for 7-line repetitions.
+%
+% \begin{macrocode}
+\define@key[typog]{smoothraggedrightshapeseptuplet}{leftskip}%
+ {\def\typog@@septuplet@leftskip{#1}}
+\define@key[typog]{smoothraggedrightshapeseptuplet}{parindent}%
+ {\def\typog@@septuplet@parindent{#1}}
+\NewDocumentEnvironment{smoothraggedrightshapeseptuplet}{O{} m m m m m m m}
+ {\def\typog@@septuplet@leftskip{\z@}%
+ \def\typog@@septuplet@parindent{\z@}%
+ \setkeys*[typog]{smoothraggedrightshapeseptuplet}{#1}%
+ \skip0=\typog@@septuplet@leftskip
+ \skip1=#2\relax
+ \skip2=#3\relax
+ \skip3=#4\relax
+ \skip4=#5\relax
+ \skip5=#6\relax
+ \skip6=#7\relax
+ \skip7=#8\relax
+ \typog@typeout{smoothraggedrightshapeseptuplet: skip0=\the\skip0}%
+ \typog@typeout{smoothraggedrightshapeseptuplet: skip1=\the\skip1}%
+ \typog@typeout{smoothraggedrightshapeseptuplet: skip2=\the\skip2}%
+ \typog@typeout{smoothraggedrightshapeseptuplet: skip3=\the\skip3}%
+ \typog@typeout{smoothraggedrightshapeseptuplet: skip4=\the\skip4}%
+ \typog@typeout{smoothraggedrightshapeseptuplet: skip5=\the\skip5}%
+ \typog@typeout{smoothraggedrightshapeseptuplet: skip6=\the\skip6}%
+ \typog@typeout{smoothraggedrightshapeseptuplet: skip7=\the\skip7}%
+ \unless\ifnum\typog@mod{\typog@septuplet@max@lines}{7}=0
+ \PackageError{typog}
+ {Line number of septuplet generator %
+ (\typog@septuplet@max@lines) not divisible by 7}
+ {}
+ \fi
+ \edef\typog@@septuplet@linespecs{%
+ \glueexpr \skip0 + \typog@@septuplet@parindent\relax
+ \glueexpr \skip1 - typog@@septuplet@parindent\relax
+ \skip0 \skip2 \skip0 \skip3 \skip0 \skip4 \skip0 \skip5 \skip0 \skip6 \skip0 \skip7
+ \typog@repeat{\numexpr\typog@septuplet@max@lines / 7 - 1}
+ {\skip0 \skip1 \skip0 \skip2 \skip0 \skip3 \skip0 \skip4 \skip0 \skip5 \skip0 \skip6 \skip0 \skip7}}
+ \parshape=\typog@septuplet@max@lines\typog@@septuplet@linespecs\relax}
+ {\par}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\smoothraggedrightfuzzfactor}
+% \begin{macrocode}
+\newcommand*{\smoothraggedrightfuzzfactor}{1.0}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\smoothraggedrightgenerator}
+% \begin{macrocode}
+\newcommand*{\smoothraggedrightgenerator}{triplet}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\smoothraggedrightleftskip}
+% \begin{macrocode}
+\newlength{\smoothraggedrightleftskip}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\smoothraggedrightparindent}
+% \begin{macrocode}
+\newlength{\smoothraggedrightparindent}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\smoothraggedrightragwidth}
+% \begin{macrocode}
+\newlength{\smoothraggedrightragwidth}
+\setlength{\smoothraggedrightragwidth}{2em}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{ldimen}{\typog@fuzzwidth}
+% \begin{macrocode}
+\newdimen{\typog@fuzzwidth}
+
+% \end{macrocode}
+% \end{ldimen}
+%
+% \begin{environment}{smoothraggedrightpar}
+% The longest line will be \cs{linewidth} wide
+% unless overridden by optional argument~|linewidth|.
+%
+% \begin{macrocode}
+\define@key[typog]{smoothraggedrightpar}{linewidth}%
+ {\def\typog@@linewidth{#1}}
+
+\NewDocumentEnvironment{smoothraggedrightpar}{O{}}
+ {\edef\typog@@linewidth{\linewidth}%
+ \setkeys[typog]{smoothraggedrightpar}{#1}%
+% \end{macrocode}
+% Convert generator name to an integer suitable for \cs{ifcase}.
+% \begin{macrocode}
+ \edef\typog@@generatorchoice{%
+ \ifnum\pdf@strcmp{\smoothraggedrightgenerator}{triplet}=\z@
+ 0%
+ \else
+ \ifnum\pdf@strcmp{\smoothraggedrightgenerator}{quintuplet}=\z@
+ 1%
+ \else
+ \ifnum\pdf@strcmp{\smoothraggedrightgenerator}{septuplet}=\z@
+ 2%
+ \else
+ \PackageError{typog}
+ {smoothraggedright: unknown generator name}
+ {valid generator names are triplet, quintuplet, and septuplet}%
+ \fi
+ \fi
+ \fi}%
+% \end{macrocode}
+% Obey to the indentation prescribed by any list environment.
+% \begin{macrocode}
+ \let\typog@@smoothraggedrightleftskip=\smoothraggedrightleftskip
+ \ifnum\@listdepth>0
+ \addtolength{\typog@@smoothraggedrightleftskip}{\leftmargin}%
+ \fi
+% \end{macrocode}
+% Scale the fuzz-width by the user's factor.
+% Later we shall rescale again specifically for each generator.
+% \begin{macrocode}
+ \typog@fuzzwidth=\smoothraggedrightfuzzfactor\smoothraggedrightragwidth
+% \end{macrocode}
+%
+% Now for the generator-specific code\dots
+% \begin{macrocode}
+ \ifcase\typog@@generatorchoice
+% \end{macrocode}
+%
+% |generator=triplet| produces a \doublequotes{short line -- long line -- middle length line}~sequence.
+% \begin{macrocode}
+ \typog@fuzzwidth=.25\smoothraggedrightragwidth
+ \typog@typeout{smoothraggedright: generator=triplet, typog@fuzzwidth=\the\typog@fuzzwidth}%
+ \smoothraggedrightshapetriplet[leftskip=\typog@@smoothraggedrightleftskip,
+ parindent=\glueexpr\smoothraggedrightparindent + \parindent,
+ #1]%
+ {\glueexpr \typog@@linewidth - \smoothraggedrightragwidth
+ + \glueexpr \z@ \@plus \typog@fuzzwidth\relax}% (1)
+ {\glueexpr \typog@@linewidth \@minus \typog@fuzzwidth}% (3)
+ {\glueexpr (\typog@@linewidth * 2 - \smoothraggedrightragwidth) / 2
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (2)
+ \or
+% \end{macrocode}
+%
+% |generator=quintuplet|.
+% \begin{macrocode}
+ \typog@fuzzwidth=.125\smoothraggedrightragwidth
+ \typog@typeout{smoothraggedright: generator=quintuplet, typog@fuzzwidth=\the\typog@fuzzwidth}%
+ \smoothraggedrightshapequintuplet[leftskip=\typog@@smoothraggedrightleftskip,
+ parindent=\glueexpr\smoothraggedrightparindent + \parindent,
+ #1]%
+ {\glueexpr (\typog@@linewidth * 4 - \smoothraggedrightragwidth * 3) / 4
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (2)
+ {\glueexpr \typog@@linewidth \@minus \typog@fuzzwidth\relax}% (5)
+ {\glueexpr (\typog@@linewidth * 2 - \smoothraggedrightragwidth) / 2
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (3)
+ {\glueexpr (\typog@@linewidth * 4 - \smoothraggedrightragwidth) / 4
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (4)
+ {\glueexpr \typog@@linewidth - \smoothraggedrightragwidth
+ + \glueexpr \z@ \@plus \typog@fuzzwidth\relax}% (1)
+ \or
+% \end{macrocode}
+%
+% |generator=septuplet|.
+%
+% Permutation \mbox{3 -- 6 -- 1 -- 5 -- 2 -- 7 -- 4}
+% looks \singlequotes{random} enough for our purposes.
+%
+% \begin{macrocode}
+ \typog@fuzzwidth=.08333\smoothraggedrightragwidth
+ \typog@typeout{smoothraggedright: generator=septuplet, typog@fuzzwidth=\the\typog@fuzzwidth}%
+ \smoothraggedrightshapeseptuplet[leftskip=\typog@@smoothraggedrightleftskip,
+ parindent=\glueexpr\smoothraggedrightparindent + \parindent,
+ #1]%
+ {\glueexpr (\typog@@linewidth * 3 - \smoothraggedrightragwidth * 2) / 3
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (3)
+ {\glueexpr (\typog@@linewidth * 6 - \smoothraggedrightragwidth) / 6
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (6)
+ {\glueexpr \typog@@linewidth - \smoothraggedrightragwidth +
+ + \glueexpr \z@ \@plus \typog@fuzzwidth\relax}% (1)
+ {\glueexpr (\typog@@linewidth * 3 - \smoothraggedrightragwidth) / 3
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (5)
+ {\glueexpr (\typog@@linewidth * 6 - \smoothraggedrightragwidth * 5) / 6
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (2)
+ {\glueexpr \typog@@linewidth \@minus \typog@fuzzwidth\relax}% (7)
+ {\glueexpr (\typog@@linewidth * 2 - \smoothraggedrightragwidth) / 2
+ + \glueexpr \z@ \@plus \typog@fuzzwidth \@minus \typog@fuzzwidth\relax}% (4)
+ \fi}
+ {\ifcase\typog@@generatorchoice
+ \endsmoothraggedrightshapetriplet
+ \or
+ \endsmoothraggedrightshapequintuplet
+ \or
+ \endsmoothraggedrightshapeseptuplet
+ \fi}
+
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{smoothraggedright}
+% \begin{macrocode}
+\NewDocumentEnvironment{smoothraggedright}{O{}}
+ {\PushPostHook{par}{\hskip-\parindent\smoothraggedrightpar[#1]\relax}}
+ {\par\PopPostHook{par}}
+
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \iffalse
+%</package>
+% \fi
+%
+%
+% \addtocontents{toc}{\protect\end{multicols}}
+% \addtocontents{toc}{\endgroup}
+%
+%
+% \Finale
+%
+%
+%
+% \iffalse
+%<*example>
+\documentclass[a4paper]{article}
+
+\tracingonline=0
+
+\PassOptionsToPackage{dvipsnames}{xcolor}
+
+\usepackage{amsmath}
+\usepackage[main=USenglish, german]{babel}
+\usepackage{float}
+\usepackage[T1]{fontenc}
+\usepackage{fullwidth}
+\usepackage{hyphenat}
+\usepackage{mathtools}
+\usepackage[activate=true, verbose=true]{microtype}
+\usepackage{ragged2e}
+\usepackage[nobottomtitles*]{titlesec}\renewcommand*{\bottomtitlespace}{.2\textheight}
+\usepackage[debug, trackingttspacing]{typog}
+\usepackage{xcolor}
+
+\usepackage[loosest, proportional, scaled=1.064]{erewhon}
+\usepackage[erewhon]{newtxmath}
+\usepackage[scaled=.95]{cabin}
+\usepackage{inconsolata}
+\usepackage{setspace}\setstretch{1.08333}
+
+
+\def\xsfdefault{\relax}
+{
+ \def\examplefont{6}
+
+ \ifcase\examplefont % 0 -- document's default sans-serif font (e.g., ecrm1000)
+ \gdef\examplefontname{default}
+ \global\let\xsf=\sf
+ \global\let\xsfdefault=\sfdefault
+ \or % 1 -- Nunito
+ \gdef\examplefontname{Nunito}
+ \usepackage{nunito}
+ \xdef\xsfdefault{\rmdefault}
+ \gdef\xsf{\let\sfdefault=\xsfdefault\sf}
+ \or % 2 -- OpenSans
+ \gdef\examplefontname{OpenSans}
+ \usepackage[defaultsans]{opensans}
+ \xdef\xsfdefault{\sfdefault}
+ \gdef\xsf{\let\sfdefault=\xsfdefault\sf}
+ \or % 3 -- Noto Sans
+ \gdef\examplefontname{OpenSans}
+ \usepackage[sfdefault]{noto}
+ \xdef\xsfdefault{\sfdefault}
+ \gdef\xsf{\let\sfdefault=\xsfdefault\sf}
+ \or % 4 -- Roboto
+ \gdef\examplefontname{Roboto}
+ \usepackage[sfdefault]{roboto}
+ \xdef\xsfdefault{\sfdefault}
+ \gdef\xsf{\let\sfdefault=\xsfdefault\sf}
+ \or % 5 -- Montserrat
+ \gdef\examplefontname{Montserrat Alternate}
+ \usepackage[alternates]{montserrat}
+ \xdef\xsfdefault{\sfdefault}
+ \gdef\xsf{\let\sfdefault=\xsfdefault\sf}
+ \or % 6 -- Inter
+ \gdef\examplefontname{Inter}
+ \usepackage[sfdefault]{inter}
+ \xdef\xsfdefault{\sfdefault}
+ \gdef\xsf{\let\sfdefault=\xsfdefault\sf}
+ \else
+ \SelectedUnknownExampleFont
+ \fi
+
+ \typeout{typog-example: font for examples: `\xsfdefault'}%
+}
+
+
+\usepackage{hyperref}
+\usepackage{cleveref}
+
+
+\hypersetup{
+ citecolor = CadetBlue,
+ colorlinks = true,
+ linkcolor = Blue,
+ linktocpage = true,
+ pdfauthor={Dr. Christoph L. Spiel},
+ pdfkeywords={Examples,
+ LaTeX, typography, ligature, italic-correction, paragraph justification, sloppy, ragged},
+ pdfsubject={Examples for typographic fine-tuning of LaTeX},
+ pdftitle={Examples for LaTeX package typog},
+ raiselinks = false,
+ urlcolor = Mulberry
+}
+
+
+\makeatletter
+\newcommand{\fs@myruled}{%
+ \fs@ruled
+ \def\@fs@capt##1##2{\floatc@ruled{##1\space\capitaldash*\space}{\fussy ##2}}%
+ \def\@fs@pre{\hrule height.8pt depth0pt \kern4pt}%
+ \def\@fs@mid{\kern3pt\hrule\kern3pt}%
+ \def\@fs@post{\kern4pt\hrule\relax}%
+}
+\makeatother
+
+\floatstyle{myruled}
+\newfloat{exemplary}{htbp}{loe}[section]
+\floatname{exemplary}{Example}
+\Crefname{exemplary}{Example}{Examples}
+\crefname{exemplary}{Ex.}{Ex.}
+
+
+\newcommand*{\acronym}[1]{\mbox{\letterspacecapitals{\MakeUppercase{#1}}}}
+\newcommand*{\bibauthor}[1]{\textsc{#1}}
+\newcommand*{\bibtitle}[1]{\textit{#1}}
+\newcommand*{\bottomstrut}{\rule[-.5em]{0pt}{0pt}}
+\newcommand*{\code}[1]{{\ttfamily\hyphenchar\font=`\-\relax #1}}
+\newcommand*{\doublequotes}[1]{\doubleguillemetright#1\doubleguillemetleft}
+\newcommand*{\eTeX}{\mbox{\(\epsilon\)-\TeX}}
+\newcommand*{\letterspacecapitals}[1]{\textls[30]{#1}}
+\newcommand*{\metavar}[1]{\textit{#1}}
+\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}}
+\newcommand*{\propername}[1]{\mbox{\textsc{\textls[25]{#1}}}}
+\newcommand*{\sample}[1]{\mbox{`\texttt{#1}'}}
+\newcommand*{\singlequotes}[1]{\singleguillemetright#1\singleguillemetleft}
+\newcommand*{\topstrut}{\rule{0pt}{1.25em}}
+\newcommand*{\visualpar}{\,\P\quad}
+
+\newlength{\emreference}
+\AtBeginDocument{\setlength{\emreference}{\fontdimen6\font}}
+\newrobustcmd*{\milliem}[1]
+ {\ifdim #1=0pt
+ #1%
+ \else
+ \generictextfraction{\the\numexpr\dimexpr (#1) * 1000 / \emreference}{1000}\:em%
+ \fi}
+
+\newcommand*{\generictextfraction}[2]
+ {\raisebox{.4em}[0pt]{\scriptsize #1}%
+ \kern-.05em\textfractionsolidus\kern-.05em
+ \raisebox{-.15em}[0pt][0pt]{\scriptsize #2}}
+
+\newcommand*{\leftmarker}{\rule{.2em}{.1pt}\rule{.1pt}{.667em}}
+\newcommand*{\rightmarker}{\rule{.1pt}{.667em}\rule{.2em}{.1pt}}
+\newcommand*{\indicatewidth}[1]{\mbox{\leftmarker #1\rightmarker}}
+
+\newcommand*{\maxipagerule}{\medskip\hrule\medskip}
+\newenvironment*{maxipage*}
+ {\par
+ \noindent
+ \fullwidthsetup{leftmargin=-\marginparsep - \marginparwidth,
+ width=\textwidth + 2\marginparsep + 2\marginparwidth}
+ \begin{fullwidth}%
+ \vspace*{1pt}% Why is some vspace necessary?
+ \parskip=.5\baselineskip}
+ {\par
+ \end{fullwidth}%
+ \par}
+\newenvironment*{maxipage}
+ {\par
+ \noindent
+ \fullwidthsetup{leftmargin=-\marginparsep - \marginparwidth,
+ width=\textwidth + 2\marginparsep + 2\marginparwidth}
+ \begin{fullwidth}%
+ \maxipagerule
+ \parskip=.5\baselineskip}
+ {\par
+ \vskip\parskip
+ \maxipagerule
+ \end{fullwidth}%
+ \par}
+
+
+\newlength{\examplewidth}
+\setlength{\examplewidth}{160pt}
+
+\newcommand*{\texbooktolerancesample}
+ {If you want to avoid overfull boxes at all costs without trying to fix them manually,
+ you might be tempt\-ed to set \texttt{tol\-er\-ance=\allowbreak10000}; this allows
+ arbitrarily bad lines to be acceptable in tough situations. But infinite tolerance
+ is a bad idea, because \TeX{} doesn't distinguish between terribly bad and
+ preposterously horrible lines. Indeed, a tolerance of 10000 encourages \TeX{} to
+ concentrate all the badness in one place, making one truly unsightly line instead of
+ two moderately bad ones, because a single ``write-off'' produces fewest total
+ demerits according to the rules.}
+ %There is a much better way to get the desired effect:~[\dots]
+\newcommand*{\texbooktolerancesamplecredits}
+ {\medskip\noindent
+ \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~107]{knuth:1986}.}}
+
+\newcommand*{\texbookparfillskipsample}
+ {We still haven't discussed the special trick that allows the final line of a paragraph
+ to be shorter than the others. Just before \TeX{} begins to choose breakpoints,
+ it does two important things: [\dots]}
+\newcommand*{\texbooklongparfillskipsample}
+ {We still haven't discussed the special trick that allows the final line of a paragraph
+ to be shorter than the others. Just before \TeX{} begins to choose breakpoints,
+ it does two important things: (1)~If the final item of the current horizontal list is glue,
+ that glue is discarded. (The reason is that a blank space often gets into a token list just
+ before \code{\char92par} or just before \code{\char36\char36}, and this blank space should not be
+ part of the paragraph.) (2)~Three or more items are put at the end of the
+ current horizontal list~[\dots]}
+\newcommand*{\texbookparfillskipsamplecredits}
+ {\medskip\noindent
+ \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~99n]{knuth:1986}.}}
+
+\newcommand*{\texbookparshapeskipsample}
+ {It's possible to control the length of lines in a much more general way, if simple
+ changes to \code{\string\leftskip} and \code{\string\rightskip} aren't flexible enough for your
+ purposes. For example, a semicircular hole has been cut out of the present paragraph,
+ in order to make room for a circular illustration that contains some of
+ Galileo's immortal words about circles; all of the line breaks in this
+ paragraph and in the circular quotation were found by \TeX's line-breaking algorithm.
+ You can specify a essentially arbitrary paragraph shape, by saying
+ \code{parshape}=\metavar{number}, where the \metavar{number} is a positive integer~\(n\),
+ followed by \(2n\)~\metavar{dimen} specifications.}
+\newcommand*{\texbookparshapeskipsamplecredits}
+ {\medskip\noindent
+ \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~101]{knuth:1986}.}}
+
+\newcommand*{\texbookbaselineskipsample}
+ {When you are typsetting a document that spans several pages, it's generally best to
+ define \code{\string\baselineskip} so that it cannot stretch or shrink, because
+ this will give more uniformity to the pages. A small variation in the distance
+ between the baselines---say only half a point---can make a substantial difference
+ in the appearance of the type, since it significantly affects the proportion of
+ white to black. On the other hand, if you are preparing a one-page document, you
+ might want to give the baselineskip some stretchability, so that \TeX{} will help
+ you fit the copy on the page.}
+\newcommand*{\texbookbaselineskipsamplecredits}
+ {\medskip\noindent
+ \textsl{The sample text was taken from The~\TeX{}book~\cite[p.~78]{knuth:1986}.}}
+
+
+
+\newcommand*{\examplepreset}{\microtypesetup{activate=false}}
+\newcommand*{\examplesetup}{\frenchspacing\xsf\small\fussy}
+\newcommand*{\exampleparbox}[2][n/a]
+ {\begin{typoginspect}{#1}
+ \examplepreset
+ \parbox[t]{\examplewidth}{\examplesetup #2}%
+ \end{typoginspect}}
+\newcommand*{\examplesep}{\hspace*{20pt}}
+\def\fontnameandweightinfo#1{%
+ {\def\projectoutfontname##1-##2-##3\relax{##1~\lowercase{##2}}%
+ \global\expandafter\edef\csname#1\endcsname{\expandafter\projectoutfontname\fontname\font\relax}}}
+\newcommand*{\examplefontinformation}
+ {\smallskip
+ \examplesetup
+ \fontnameandweightinfo{exfontnameinfo}%
+ \fontsizeinfo{exfontsizeinfo}%
+ The font used in this example is \exfontnameinfo, \exfontsizeinfo*.}
+
+
+\setcounter{tocdepth}{1}
+\setlength{\overfullrule}{3pt}
+\hbadness=-1
+
+
+\input{ushyphex}
+
+\hyphenation{
+ Double-guillemet-left
+ Double-guillemet-right
+ Double-quotes
+ Single-guillemet-left
+ Single-guillemet-right
+ Single-quotes
+ adj-demerits
+ allow-display-breaks
+ babel-hyphenation
+ base-line-skip
+ break-penalty
+ breakable-display
+ capital-hyphen
+ capital-times
+ cite-dash
+ club-penalties
+ cref-range-conjunction
+ display-break
+ display-widow-penalties
+ double-guillemet-right
+ double-hyphen-demerits
+ double-quotes
+ final-hyphen-demerits
+ inter-display-line-penalty
+ inter-text
+ kerned-hyphen
+ last-line-ragged-left
+ last-line-ragged-left-par
+ line-width
+ loose-ness
+ loose-spacing
+ make-at-letter
+ make-at-other
+ mar-gin-al
+ math-italics-correction
+ micro-type
+ number-dash
+ par-box
+ par-indent
+ parfillskip
+ pdf-string-def-Disable-Commands
+ post-display-penalty
+ pre-display-penalty
+ raise-capital-guillemets
+ raise-capital-times
+ raise-number-dash
+ set-font-expand
+ set-font-shrink
+ set-font-stretch
+ short-inter-text
+ single-guillemet-left
+ single-guillemet-right
+ single-quotes
+ slash-kern
+ slightly-sloppy-par
+ sloppy-par
+ smooth-ragged-right-fuzz-factor
+ smooth-ragged-right-par
+ smooth-ragged-right-shape-quintuplet
+ smooth-ragged-right-shape-septuplet
+ smooth-ragged-right-shape-triplet
+ space-skip
+ text-italics-correction
+ tight-spacing
+ tracing-boxes
+ tracing-para-graphs
+ vtie-bot
+ vtie-bot-disp
+ vtie-bot-disp-par
+ vtie-bot-disp-top-par
+ vtie-bot-par
+ vtie-top
+ vtie-top-par
+ widow-penalties
+}
+
+
+\SetExpansion[context=sloppy, stretch=30, shrink=60, step=5]{encoding={OT1, T1, TS1}}{}% p15
+\SetTracking{encoding=*, shape=sc}{20}
+
+
+\begin{document}
+\fussy
+\lastlinefit=1000
+\nonfrenchspacing
+
+\begin{center}
+ \Huge\bf\sf
+ TypoG Examples
+\end{center}
+
+\bigskip
+
+\noindent
+The section numbers correspond to the subsections of section~3
+in the official documentation of package~\packagename{typog}.
+
+\bigskip
+
+\tableofcontents
+
+
+\clearpage
+\listof{exemplary}{Examples}
+
+
+\clearpage
+\noindent
+Unless otherwise noted the font used in the examples is \singlequotes{\examplefontname}.
+
+\bigskip
+
+\section{Information}
+
+\code{\string\fontsizeinfo} --\fontsizeinfo{docsizeinfo}
+At this point of the document, the font~size
+and the line~spacing are \docsizeinfo*~(w/o~units).
+For footnotes however, the current sizes are%
+\footnote{This is the footnote where we get the sizes from.\fontsizeinfo{footsizeinfo}}
+\footsizeinfo.
+
+Next we show a comparison of different font sizes and line spacings
+decorated with the results of \code{\string\fontsizeinfo}.
+
+\medskip
+
+\begin{maxipage}
+ \setstretch{1}
+ \newcommand*{\baselineskipdoc}%
+ {Macro \code{\string\baselineskip} is a length command which
+ specifies the minimum space between the bottom of two
+ successive lines in a paragraph. Its value may be
+ automatically reset by \LaTeX, for example, by font
+ changes in the text.}
+ \renewcommand*{\examplefontname}{Merriweather}
+ Different font sizes and line spacings exemplified with the \examplefontname~font.
+
+ \smallskip
+
+ \begingroup
+ \fontfamily{Merriwthr-TLF}\selectfont
+ \noindent
+ \parbox[t]{.31\linewidth}%
+ {\fontsize{8.5}{12}\selectfont
+ \baselineskipdoc
+ \fontsizeinfo{examplesizeinfotight}}
+ \hfill
+ \parbox[t]{.31\linewidth}%
+ {\fontsize{10}{12}\selectfont
+ \baselineskipdoc
+ \fontsizeinfo{examplesizeinfo}}
+ \hfill
+ \parbox[t]{.31\linewidth}%
+ {\fontsize{10}{13.5}\selectfont
+ \baselineskipdoc
+ \fontsizeinfo{examplesizeinfoloose}}
+ \endgroup
+
+ \medskip
+
+ \noindent
+ \parbox[t]{.31\linewidth}{\examplefontname~\examplesizeinfotight*}
+ \hfill
+ \parbox[t]{.31\linewidth}{\examplefontname~\examplesizeinfo*}
+ \hfill
+ \parbox[t]{.31\linewidth}{\examplefontname~\examplesizeinfoloose*}
+\end{maxipage}
+
+\noindent Starred form eats spaces? \examplesizeinfo* .
+
+
+\section{Hyphenation}
+
+\noindent Line-break behavior
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+ \parbox[t]{0pt}{%
+ \code{\string\mbox+\string\breakpoint*} \\
+ \mbox{(pre-)}\breakpoint*Hilbert space}
+ \hspace{100pt}
+ \parbox[t]{0pt}{%
+ \code{\string\breakpoint*} \\
+ (pre-)\breakpoint*Hilbert space}
+ \hspace{100pt}
+ \parbox[t]{0pt}{%
+ \code{\string\breakpoint} \\
+ (pre-)\breakpoint Hilbert space}
+\end{quote}
+
+\noindent Starred form eats spaces? a\breakpoint* b. Unstarred: a\breakpoint b.
+
+\medskip
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+ \parbox[t]{0pt}{%
+ \begin{hyphenmin}{6}
+ Set minimum hyphenation values for both \code{\string\lefthyphenmin} and
+ \code{\string\righthyphenmin}: \the\lefthyphenmin{} and \the\righthyphenmin.
+ \end{hyphenmin}}
+ \hspace{100pt}
+ \parbox[t]{0pt}{%
+ \begin{hyphenmin}[4]{5}
+ Set minimum hyphenation values for \code{\string\lefthyphenmin} and
+ \code{\string\righthyphenmin} separately: \the\lefthyphenmin{} and \the\righthyphenmin.
+ \end{hyphenmin}}
+ \hspace{100pt}
+ \parbox[t]{0pt}{%
+ Returned to the default values for \code{\string\lefthyphenmin} and
+ \code{\string\righthyphenmin}: \the\lefthyphenmin{} and \the\righthyphenmin.}
+\end{quote}
+
+
+\section{Disable\kernedslash*Break Ligatures}
+
+\begin{center}
+ \begin{tabular}{@{}ll@{}}
+ \hline
+ \multicolumn{1}{@{}l|}{Macro} & Result \\
+ \hline
+ n/a &
+ fine affirmation of baffling flavors \\
+ \code{\string\nolig*} &
+ f\nolig*ine af\nolig*f\nolig*irmation of baf\nolig*f\nolig*ling f\nolig*lavors \\
+ \code{\string\nolig} &
+ f\nolig{}ine af\nolig{}f\nolig{}irmation of baf\nolig{}f\nolig{}ling f\nolig{}lavors \\
+ \code{\string\nolig*[75]} & of\nolig*[75]f\nolig*[75]ice
+ \end{tabular}
+\end{center}
+
+\noindent Line-break behavior
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+ \parbox[t]{0pt}{%
+ \code{\string\nolig*} \\
+ bi\nolig*{}jection}
+ \hspace{60pt}
+ \parbox[t]{0pt}{%
+ \code{\string\nolig} \\
+ bi\nolig{}jection}
+\end{quote}
+
+\noindent Starred form eats spaces? f\nolig* i, f\nolig*[0] i.
+
+
+\section{Manual Italic Correction}
+
+\paragraph{Text Mode.}
+
+The italic correction of the current font is \the\fontdimen1\font/pt.
+
+We demonstrate the effect of \code{\string\itcorr} with a pair of bookends:
+uncorrected italics: \indicatewidth{\it X},
+\TeX-corrected (\code{\string\/}): \indicatewidth{\it X\/},
+and \code{\string\itcorr\{7\}}: \indicatewidth{\it X\itcorr{7}}.
+
+Correction~0: \indicatewidth{\itcorr*{0}};
+corr.~3: \indicatewidth{\itcorr{3}}, \indicatewidth{\itcorr*{3}} (starred);
+corr.~\textminus6: \indicatewidth{\itcorr{-6}}.
+
+\paragraph{Mathematical Mode.}
+
+Uncorrected: \([f]\),
+corrected: \([\itcorr{1} f\itcorr{1}]\)
+
+Correction~0: \indicatewidth{\(\itcorr{0}\)};
+corr.~3: \indicatewidth{\(\itcorr{3}\)};
+corr.~\textminus6: \indicatewidth{\(\itcorr{-6}\)}.
+
+
+\section{Apply Extra Kerning}
+
+
+\subsection{Slash}
+
+The slash with some extra space around it can be helpful for certain pairs,
+as for example years or names.
+
+\begin{center}
+ \begin{tabular}{@{}ll@{}}
+ \hline
+ \multicolumn{1}{@{}l|}{Macro} & Result \\
+ \hline
+ n/a & 1991/1992,
+ New~York/NY, Korringa/Kohn/Rostoker \\
+ \code{\string\kernedslash} &
+ 1991\kernedslash1992, New~York\kernedslash{}NY, Korringa\kernedslash{}Kohn\kernedslash{}Rostoker \\
+ \end{tabular}
+\end{center}
+
+\noindent Line-break behavior
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+ \parbox[t]{0pt}{%
+ \code{\string\kernedslash*} \\
+ 1991\kernedslash*1992,
+ New~York\kernedslash*NY,
+ Korringa\kernedslash*Kohn\kernedslash*Rostoker}
+ \hspace{120pt}
+ \parbox[t]{0pt}{%
+ \code{\string\kernedslash} \\
+ 1991\kernedslash{}1992,
+ New~York\kernedslash{}NY,
+ Korringa\kernedslash{}Kohn\kernedslash{}Rostoker}
+\end{quote}
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+ \parbox[t]{0pt}{%
+ \code{\string\kernedslash*}\code{\string\nobreak} \\
+ 1991\kernedslash*\nobreak{}1992,
+ New~York\kernedslash*\nobreak{}NY,
+ Korringa\kernedslash*Kohn\kernedslash*\nobreak{}Rostoker}
+ \hspace{140pt}
+ \parbox[t]{0pt}{%
+ \code{\string\allowhyphenation\string\kernedslash} \\
+ 1991\kernedslash{}1992,
+ New~York\kernedslash{}NY,
+ Korringa\allowhyphenation\kernedslash{}Kohn\kernedslash{}Rostoker}
+\end{quote}
+
+\noindent Starred form eats spaces? p\kernedslash* q.
+
+
+\subsection{Hyphen}
+
+Uncorrected
+
+\begin{quote}
+ \(K\)-vector space, \(g\)-factor, \(f\)-function
+\end{quote}
+
+\noindent Corrected
+
+\begin{quote}
+ \typogsetup{raisecapitalhyphen=.075em, raiseguillemets=.05em}
+ \(K\)\leftkernedhyphen{-75}vector space,
+ \(g\)\leftkernedhyphen{-25}factor,
+ \(f\)\leftkernedhyphen{-100}function
+ %% \(G\)\kernedhyphen[*]{50}{-50}Wirkung,
+ %% \(G\)\leftkernedhyphen{50}äquivalent,
+ %% \(K\)\kernedhyphen[*]{-50}{-50}Vektorraum,
+ %% \(K\)\kernedhyphen{-50}{-25}bilinear,
+ %% \propername{Young}\rightkernedhyphen{-50}Tableaux,
+ %% \singlequotes{Bra}\kernedhyphen[50]{50}{-50}Vektor,
+ %% \singlequotes{Ket}\kernedhyphen[50]{50}{-50}Vektor,
+ %% halbzahlige~\(l\)\kernedhyphen{50}{-50}Werte.
+\end{quote}
+
+\noindent Line-break behavior
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+
+ \parbox[t]{0pt}{hyphen~\mbox{`\code{-}'} \\ self-energy}
+ \hspace{80pt}
+ \parbox[t]{0pt}{\code{\string\hyp} \\ self\hyp{}energy}
+ \hspace{60pt}
+ \parbox[t]{0pt}{\code{\string\kernedhyphen*} \\ self\kernedhyphen*{5}{-5}energy}
+ \hspace{80pt}
+ \parbox[t]{0pt}{\code{\string\kernedhyphen} \\ self\kernedhyphen{5}{-5}energy}
+\end{quote}
+
+\noindent If a \code{\string\kernedhyphen} goes astray in a math environment,
+it decays to an ordinary minus with appropriate kerning:
+\(G \kernedhyphen{-30}{-50} V\)\!.
+
+
+\section{Raise Selected Characters}
+
+\subsection{Capital Hyphen}
+
+\newlength{\exemplaryraisecapitalhyphen}
+\setlength{\exemplaryraisecapitalhyphen}{.6667pt}
+With the standard hyphen we get
+
+\begin{quote}
+ \begin{otherlanguage}{german}
+ \acronym{NMR}-Spektroskopie,
+ \acronym{SI}-Einheit,
+ \(G\)-Modul, and
+ \(K\)-Vektorraum,
+ \end{otherlanguage}
+\end{quote}
+
+\noindent whereas with raising the hyphen by \the\exemplaryraisecapitalhyphen{}
+when calling \code{\string\capitalhyphen}, we arrive at
+
+\begin{quote}
+ \begin{otherlanguage}{german}
+ \typogsetup{raisecapitalhyphen=.075em}
+
+ \acronym{NMR}\capitalhyphen{}Spektroskopie,
+ \acronym{SI}\capitalhyphen{}Einheit,
+ \(G\)\capitalhyphen{}Modul, and
+ \(K\)\capitalhyphen{}Vektorraum
+ (even better with \code{\string\kernedhyphen}
+ and the star-option for the correct raise-amount:
+ \(K\)\leftkernedhyphen[*]{-100}Vektorraum).
+ \end{otherlanguage}
+\end{quote}
+
+\noindent Line-break behavior
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+ \begin{otherlanguage}{german}
+ \parbox[t]{0pt}{%
+ \code{\string\capitalhyphen*} \\
+ \acronym{NMR}\capitalhyphen*{}Spektroskopie
+ }
+ \hspace{120pt}
+ \parbox[t]{0pt}{%
+ \code{\string\capitalhyphen} \\
+ \acronym{NMR}\capitalhyphen{}Spektroskopie
+ }
+ \end{otherlanguage}
+\end{quote}
+
+\noindent Starred form eats spaces?
+{\typogsetup{raisecapitalhyphen=.075em}
+ V\capitalhyphen* W.}
+
+
+\subsection{Capital Dash}
+
+\newlength{\exemplaryraisecapitaldash}
+\setlength{\exemplaryraisecapitaldash}{.075em}
+
+Compare the result of plain~\code{\string\textendash}
+
+\begin{quote}
+ A\textendash M, N\textendash Z, C1\,\textendash\,C4, LEED\:\textendash\:STM
+\end{quote}
+
+\noindent with \code{\string\capitaldash}:
+
+\begin{quote}
+ \typogsetup{raisecapitaldash=\exemplaryraisecapitaldash}
+
+ A\capitaldash{}M, N\capitaldash{}Z, C1\,\capitaldash\,C4, LEED\:\capitaldash\:STM
+\end{quote}
+
+\noindent where the en-dash has been raised by \milliem{\exemplaryraisecapitaldash}.
+
+Starred form eats spaces? V\capitaldash* W.
+
+
+\subsection{Number Dash}
+
+\newlength{\exemplaryraisefiguredash}
+\setlength{\exemplaryraisefiguredash}{.6667pt}
+Compare the result of plain~\code{\string\textendash}
+
+\begin{quote}
+ 3--5, 81--82, 485--491
+\end{quote}
+
+\noindent with \code{\string\figuredash}:
+
+\begin{quote}
+ \typogsetup{raisefiguredash=\exemplaryraisefiguredash}
+ 3\figuredash 5, 81\figuredash 82, 485\figuredash 491
+\end{quote}
+
+\noindent where the en-dash has been raised by \the\exemplaryraisefiguredash.
+
+\noindent Line-break behavior
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+ \typogsetup{raisefiguredash=\exemplaryraisefiguredash}
+ \parbox[t]{0pt}{%
+ \code{\string\figuredash*} \\
+ 3\figuredash*5, 81\figuredash*82, 485\figuredash*491
+ }
+ \hspace{80pt}
+ \parbox[t]{0pt}{%
+ \code{\string\figuredash} \\
+ 3\figuredash 5, 81\figuredash 82, 485\figuredash 491
+ }
+\end{quote}
+
+\noindent Starred form eats spaces? 44\figuredash* 55.
+
+
+\subsection{Multiplication Sign \capitaldash{} Times~``\texttimes''}
+
+\newlength{\exemplaryraisetimes}
+\setlength{\exemplaryraisetimes}{.6667pt}
+The problem with a too-low multiplication sign arises
+for example with matrices of a given, specific size.
+
+\noindent Uncorrected
+
+\begin{quote}
+ \acronym{LR}-mode: 2\texttimes2-matrix, \(N\)\texttimes\(M\)-matrix \\
+ Math-mode: \(2\times2\)-matrix, \(N\times M\)-matrix
+\end{quote}
+
+\noindent and corrected
+
+\begin{quote}
+ \typogsetup{raisecapitalhyphen=\exemplaryraisecapitalhyphen,
+ raisecapitaltimes=\exemplaryraisetimes}
+ \acronym{LR}-mode: 2\capitaltimes2-matrix, \(N\)\capitaltimes\(M\)-matrix \\
+ Math-mode: \(2\capitaltimes2\)-matrix, \(N\capitaltimes M\)-matrix.
+\end{quote}
+
+
+\subsection{Guillemets}
+
+\newcommand*{\tschicholdi}
+ {Use single quotes for a first quotation.}
+\newcommand*{\tschicholdii}
+ {Use double quotes for quotations within quotations.}
+
+\newcommand*{\frenchsinglequotes}[1]{\singleguillemetright #1\singleguillemetleft}
+\newcommand*{\Frenchsinglequotes}[1]{\Singleguillemetright #1\Singleguillemetleft}
+\newcommand*{\frenchdoublequotes}[1]{\doubleguillemetright #1\doubleguillemetleft}
+\newcommand*{\Frenchdoublequotes}[1]{\Doubleguillemetright #1\Doubleguillemetleft}
+
+\newcommand*{\frenchsinglequotesFR}[1]{\singleguillemetleft\,\allowhyphenation#1\,\singleguillemetright}
+\newcommand*{\FrenchsinglequotesFR}[1]{\Singleguillemetleft\,\allowhyphenation#1\,\Singleguillemetright}
+\newcommand*{\frenchdoublequotesFR}[1]{\doubleguillemetleft\,\allowhyphenation#1\,\doubleguillemetright}
+\newcommand*{\FrenchdoublequotesFR}[1]{\Doubleguillemetleft\,\allowhyphenation#1\,\Doubleguillemetright}
+
+\newlength{\exemplaryraiseguillemets}
+\setlength{\exemplaryraiseguillemets}{.05em}
+\newlength{\exemplaryraisecapitalguillemets}
+\setlength{\exemplaryraisecapitalguillemets}{.1em}
+
+We again compare the default implementation with the adjusted one.
+
+\begin{quote}
+ \frenchsinglequotes{\tschicholdi} \\
+ \frenchdoublequotes{\tschicholdii} \\
+ \Frenchsinglequotes{1}, \Frenchsinglequotes{2}, \Frenchsinglequotes{3}. \\
+ \Frenchdoublequotes{\letterspacecapitals{ABC}},
+ \Frenchdoublequotes{\letterspacecapitals{MN}},
+ \Frenchdoublequotes{\letterspacecapitals{XYZ}}.
+\end{quote}
+
+\noindent Corrected by raising the glyphs by
+\milliem{\exemplaryraiseguillemets} and
+\milliem{\exemplaryraisecapitalguillemets}, respectively:
+
+\begin{quote}
+ \typogsetup{raiseguillemets=\exemplaryraiseguillemets,
+ raisecapitalguillemets=\exemplaryraisecapitalguillemets}
+ \frenchsinglequotes{\tschicholdi} \\
+ \frenchdoublequotes{\tschicholdii} \\
+ \Frenchsinglequotes{1}, \Frenchsinglequotes{2}, \Frenchsinglequotes{3}. \\
+ \Frenchdoublequotes{\letterspacecapitals{ABC}},
+ \Frenchdoublequotes{\letterspacecapitals{MN}},
+ \Frenchdoublequotes{\letterspacecapitals{XYZ}}.
+\end{quote}
+
+\noindent And the same using French typographic conventions:
+
+\begin{quote}
+ \typogsetup{raiseguillemets=\exemplaryraiseguillemets,
+ raisecapitalguillemets=\exemplaryraisecapitalguillemets}
+ \frenchsinglequotesFR{\tschicholdi} \\
+ \frenchdoublequotesFR{\tschicholdii} \\
+ \FrenchsinglequotesFR{1}, \FrenchsinglequotesFR{2}, \FrenchsinglequotesFR{3}. \\
+ \FrenchdoublequotesFR{\letterspacecapitals{ABC}},
+ \FrenchdoublequotesFR{\letterspacecapitals{MN}},
+ \FrenchdoublequotesFR{\letterspacecapitals{XYZ}}.
+\end{quote}
+
+\noindent Line-break behavior
+
+\begin{quote}
+ \setlength{\overfullrule}{0pt}
+ \typogsetup{raiseguillemets=\exemplaryraiseguillemets,
+ raisecapitalguillemets=\exemplaryraisecapitalguillemets}
+
+ \newcommand*{\samplestring}{relation}
+
+ \parbox[t]{0pt}{\frenchsinglequotes{\samplestring}}
+ \hspace{30pt}
+ \parbox[t]{0pt}{\Frenchsinglequotes{\samplestring}}
+ \hspace{30pt}
+ \parbox[t]{0pt}{\frenchdoublequotes{\samplestring}}
+ \hspace{30pt}
+ \parbox[t]{0pt}{\Frenchdoublequotes{\samplestring}}
+
+ \smallskip
+
+ \parbox[t]{0pt}{\frenchsinglequotesFR{\samplestring}}
+ \hspace{30pt}
+ \parbox[t]{0pt}{\FrenchsinglequotesFR{\samplestring}}
+ \hspace{30pt}
+ \parbox[t]{0pt}{\frenchdoublequotesFR{\samplestring}}
+ \hspace{30pt}
+ \parbox[t]{0pt}{\FrenchdoublequotesFR{\samplestring}}
+\end{quote}
+
+
+\clearpage
+\section{Align Last Line}
+
+\subsection{Last Line Ragged Left/Flush Right}
+
+\Cref{ex:lastlineraggedleftpar} is a typical use of environment~\code{lastlineraggedleftpar}:
+A narrow paragraph gets typeset with full justification
+and put \code{\string\flushright} against the right margin as a whole.
+
+The layout may look more coherent if the last lines is moved to the right margin, too.
+
+\begin{exemplary}
+ \flushright
+ \caption[Justified -- flushright]
+ {\begin{typoginspectpar}{justified-flushright}Typeset a justified paragraph flushright and let
+ macro~\code{\string\lastlineraggedleft} shift the last line
+ over to the right-hand side.\label{ex:lastlineraggedleftpar}\end{typoginspectpar}}
+
+ \setlength{\examplewidth}{220pt}
+ \exampleparbox[lastlineraggedleftpar]{\lastlineraggedleftpar\texbookparfillskipsample}
+
+ \centering
+ \texbookparfillskipsamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+
+\subsection{Last Line Centered}
+
+The situation shown in \cref{ex:lastlinecenteredpar} is
+more widespread than \cref{ex:lastlineraggedleftpar}
+because centered tables and figures are quite common.
+Their caption parboxes are centered too,
+which is where a centered last line might fortify the layout.
+
+Another possible use of environment~\code{lastlinecenteredpar} are the final lines of chapters~--
+in particular if the chapters' ends are marked with centered dingbats.
+
+\begin{exemplary}
+ \centering
+ \caption[Typeset a justified paragraph that is centered.]
+ {\lastlinecenteredpar
+ Typeset a justified paragraph that is centered.
+ This very caption uses \code{lastlinecenteredpar}
+ to have its last line centered as well.
+ Moreover, we put a nifty asterisk centered at the bottom of the sample text.
+ \label{ex:lastlinecenteredpar}}
+
+ \setlength{\examplewidth}{220pt}
+ \exampleparbox[lastlinecenteredpar]{\lastlinecenteredpar\texbookparfillskipsample}
+
+ \medskip\(\ast\)
+
+ \texbookparfillskipsamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+
+\clearpage
+\section{Fill Last Line}
+
+\newcommand*{\abcsample}{abcd efgh ijkl mnop qrst uvwx yz12 3456}
+
+\begin{exemplary}
+ \def\sness{2}
+ \def\exparindent{25pt}
+ \setlength{\examplewidth}{235pt}
+
+ \centering
+ \caption[Plain paragraph vs.~\code{covernextindentpar}]
+ {Top example: Typeset a paragraph without correction of the last line.
+ Middle example: Paragraph corrected with \code{covernextindentpar}.
+ We set a \code{\string\parindent} of~\exparindent{} in both parboxes
+ and we \emph{must} increase the amount of glue in the paragraph
+ to reduce the penalty of stretching the last line under a \code{\string\fussy}~setting.
+ For the samples below, we have chosen \code{\string\slightlysloppy[\sness]}.
+ The \singlequotes{Alternative}, the bottom example,
+ shows the effect of \code{tightspacing};
+ no extra sloppyness is required there.}
+
+ \exampleparbox[covernextindentpar-reference]{%
+ \setlength{\parindent}{\exparindent}%
+ \slightlysloppy[\sness]
+ \texbookparfillskipsample{} \abcsample}
+
+ \medskip
+
+ \exampleparbox[covernextindentpar]{%
+ \setlength{\parindent}{\exparindent}%
+ \slightlysloppy[\sness]
+ \covernextindentpar
+ \texbookparfillskipsample{} \abcsample}
+
+ \medskip
+
+ Alternative\dots\hfill\smallskip
+
+ \exampleparbox[covernextindentpar-tightspacing]{%
+ \setlength{\parindent}{\exparindent}%
+ \begin{tightspacing}
+ \texbookparfillskipsample{} \abcsample
+ \end{tightspacing}}
+
+ \texbookparfillskipsamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+\begin{exemplary}
+ \def\sness{2}
+ \def\exparindent{0pt}
+ \setlength{\examplewidth}{155pt}
+
+ \centering
+ \caption[Plain paragraph vs.~\code{covernextindentpar} (narrow)]
+ {Same comparison as the previous example,
+ but for a small linewidth and zippo~\code{\string\parindent}.
+ The left-hand side sample is uncorrected,
+ the right-hand side features \code{\string\covernextindentpar}.
+ The sloppyness level is~\sness{} for both samples.}
+
+ \exampleparbox[narrow-covernextindentpar-reference]{%
+ \setlength{\parindent}{\exparindent}%
+ \slightlysloppy[\sness]
+ \texbookparfillskipsample{} \abcsample}
+ \qquad
+ \exampleparbox[narrow-covernextindentpar]{%
+ \setlength{\parindent}{\exparindent}%
+ \slightlysloppy[\sness]
+ \covernextindentpar[30pt]
+ \texbookparfillskipsample{} \abcsample}
+
+ \texbookparfillskipsamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+\begin{exemplary}
+ \def\exparindent{10pt}
+ \setlength{\examplewidth}{233pt}
+
+ \centering
+ \caption[Prevent full last line]
+ {Sample~1: Typeset a paragraph without correction of the last line.
+ Sample~2: Paragraph corrected with \code{\string\openlastlinepar}.~-- Disappointing!
+ Sample~3: Same using macro~\code{\string\prolongpar}.
+ Sample~4: Alternative solution that simply increases the tracking by
+ \generictextfraction{2}{1000}\,em with~\code{setfonttracking}.
+ Sample~5: Alternative solution that increases the spacing with
+ \code{loosespacing}.}
+
+ \exampleparbox[openline-reference]{%
+ \setlength{\parindent}{\exparindent}
+ \texbookparfillskipsample{} \abcsample}
+
+ \medskip
+
+ \exampleparbox[openlastlinepar]{%
+ \setlength{\parindent}{\exparindent}
+ \openlastlinepar
+ \texbookparfillskipsample{} \abcsample}
+
+ \medskip
+
+ \exampleparbox[prolongpar]{%
+ \setlength{\parindent}{\exparindent}
+ \prolongpar
+ \texbookparfillskipsample{} \abcsample}
+
+ \medskip
+
+ Alternatives\dots\hfill\smallskip
+
+ \exampleparbox[openline-tracking]{%
+ \setlength{\parindent}{\exparindent}%
+ \setfonttracking{2}
+ \texbookparfillskipsample{} \abcsample}
+
+ \medskip
+
+ \exampleparbox[openline-spacing]{%
+ \setlength{\parindent}{\exparindent}%
+ \begin{loosespacing}
+ \texbookparfillskipsample{} \abcsample
+ \end{loosespacing}}
+
+ \texbookparfillskipsamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+
+\clearpage
+\section{Spacing}
+
+\subsection{Narrow\kernedslash Wide Space}
+
+The current font's parameters are shown in \cref{tab:fontdim}.\footnote{For a concise and
+understandable explanation of the plethora of font parameters
+consult \propername{David Carlisle's} excellent post on \propername{StackExchange}:
+\href{https://tex.stackexchange.com/questions/88991/what-do-different-fontdimennum-mean}%
+ {What Do Different Fontdimennum Mean}.}
+
+\begin{table}[htp]
+ \centering
+ \caption{Important \code{\string\fontdimen} values of the current text font.
+ The middle column~(\#) states the number of the fontdimen.\bottomstrut}
+ \label{tab:fontdim}
+
+ \begin{tabular}{@{}lll@{}}
+ \hline
+ \multicolumn{1}{@{}l|}{Name} & \multicolumn{1}{l|}{\#} & Value \\
+ \hline
+ Interword space & 2 & \the\fontdimen2\font\topstrut \\
+ Interword stretch & 3 & \the\fontdimen3\font \\
+ Interword shrink & 4 & \the\fontdimen4\font \\
+ Extra space & 7 & \the\fontdimen7\font
+ \end{tabular}
+\end{table}
+
+\begin{center}
+ \setlength{\overfullrule}{0pt}
+ \newcommand*{\spacesampletext}[1]{some#1text#1with#1spaces\rule{0.1pt}{1em}}
+ \newsavebox{\narrowspacesample}
+ \sbox{\narrowspacesample}{\spacesampletext{\narrowspace}}
+ \newsavebox{\widespacesample}
+ \sbox{\widespacesample}{\spacesampletext{\widespace}}
+
+ \begin{tabular}{@{}ll@{\qquad}l@{}}
+ Compare & \spacesampletext{\space} & default space, natural glue \\
+ with & \usebox{\narrowspacesample} & \code{\string\narrowspace}, natural glue \\
+ {} & \makebox[\wd\narrowspacesample][l]{\hbox to 0pt{\spacesampletext{\narrowspace}}} &
+ \code{\string\narrowspace}, tight box \\
+ {} & \makebox[\wd\narrowspacesample][l]{\hbox spread 5pt{\spacesampletext{\narrowspace}}} &
+ \code{\string\narrowspace}, spread 5pt \\
+ and again & \spacesampletext{\space} & default space, natural glue \\
+ with & \usebox{\widespacesample} & \code{\string\widespace}, natural glue \\
+ {} & \makebox[\wd\widespacesample][l]{\hbox to 0pt{\spacesampletext{\widespace}}} &
+ \code{\string\widespace}, tight box \\
+ {} & \makebox[\wd\widespacesample][l]{\hbox spread 5pt{\spacesampletext{\widespace}}} &
+ \code{\string\widespace}, spread 5pt
+ \end{tabular}
+\end{center}
+
+\noindent Starred form eats spaces? Narrow\narrowspace* Space. Wide\widespace* Space.
+
+
+\subsection{Looser\kernedslash*Tighter}
+
+\Cref{ex:spacing-i,ex:spacing-ii} show \code{tightspacing} and \code{loosespacing} at work.
+
+\begin{exemplary}
+ \newcommand*{\sness}{3}
+ \newcommand*{\tlevel}{1}
+ \centering
+
+ \caption[Looser or tighter spacing -- sloppy]
+ {Both parboxes are typeset with \code{\string\slightlysloppy[\sness]},
+ the left one with default spacing,
+ the right one with \code{tightspacing[\tlevel]}.\label{ex:spacing-i}}
+
+ \exampleparbox[tightspacing-reference]{\slightlysloppy[\sness]\texbooktolerancesample}
+ \qquad
+ \exampleparbox[tightspacing]{\slightlysloppy[\sness]\tightspacing[\tlevel]\texbooktolerancesample}
+
+ \texbooktolerancesamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+\begin{exemplary}
+ \newcommand*{\sness}{3}
+ \newcommand*{\llevel}{2}
+ \centering
+
+ \caption[Looser or tighter spacing -- sloppy]
+ {Both parboxes are typeset with \code{\string\slightlysloppy[\sness]},
+ the left one with default spacing,
+ the right one with \code{loosespacing[\llevel]}.\label{ex:spacing-ii}}
+
+ \exampleparbox[loosespacing-reference]{\slightlysloppy[\sness]\texbooktolerancesample}
+ \qquad
+ \exampleparbox[loosespacing]{\slightlysloppy[\sness]\loosespacing[\llevel]\texbooktolerancesample}
+
+ \texbooktolerancesamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+
+\clearpage
+\section{Microtype Front\capitalhyphen End}
+
+\subsection{Tracking}
+
+\newcommand*{\trackingsampletext}{%
+ This sentence contains an explicit call to \code{\string\textls}
+ with an optional argument of \((+200)\) to \textls[200]{DEMONSTRATE}
+ that this macro still works inside of \code{setfonttracking}.
+ Apart from that it is just some more text to exercise the macro.
+ Well, the explicit letterspacing example is particularly ugly.}
+
+\begin{exemplary}
+ \renewcommand*{\examplepreset}{\microtypesetup{activate=true}}
+ \def\extratracking{7}
+ \centering
+
+ \caption[Microtype: tracking]
+ {Use \packagename{microtype} to change the font tracking.
+ The sample on the left-hand side shows neutral tracking.
+ The one on the right-hand side received an extra tracking of
+ \generictextfraction{\extratracking}{1000}\,em.}
+
+ \exampleparbox[microtype-tracking-reference]{%
+ \fussy
+ \noindent
+ \trackingsampletext}
+ \qquad
+ \exampleparbox[microtype-tracking-stretch]{%
+ \begin{setfonttracking}{\extratracking}
+ \fussy
+ \noindent
+ \trackingsampletext
+ \end{setfonttracking}}
+
+ \examplefontinformation
+\end{exemplary}
+
+\newcommand*{\trackingsamplefontchangetext}{%
+ {\rm RM} {\sf SF} {\rm RM} {\tt TT} {\rm RM};
+ {\rm RM} {\it IT\/} {\rm RM};
+ {\rm RM} {\sc SC} {\rm RM}.
+ {\rm Rm} {\sf Sf} {\rm Rm} {\tt Tt} {\rm Rm};
+ {\rm Rm} {\it It\/} {\rm Rm};
+ {\rm Rm} {\sc Sc} {\rm Rm}.
+ {\rm rm} {\sf sf} {\rm rm} {\tt tt} {\rm rm};
+ {\rm rm} {\it it\/} {\rm rm};
+ {\rm rm} {\sc sc} {\rm rm}.}
+
+\begin{exemplary}
+ \renewcommand*{\examplepreset}{\microtypesetup{activate=true}}
+ \def\extratracking{1}
+ \centering
+
+ \caption[Microtype: tracking -- font changes]
+ {Check how font changes (serif, serif~italics, small-caps, sans~serif, typewriter)
+ interfere with the interword spacing.
+ The left sample has no tracking changes applied and serves as a reference,
+ whereas the right sample got an extra tracking of
+ \generictextfraction{\extratracking}{1000}\,em.\visualpar
+ The switch from and to typewriter, i.\,e., constant-width fonts
+ commonly is a source of spacing problems.}
+
+ \exampleparbox[microtype-tracking-font-changes-reference]{\trackingsamplefontchangetext}
+ \qquad
+ \exampleparbox[microtype-tracking-font-changes-stretch]{%
+ \begin{setfonttracking}{\extratracking}
+ \trackingsamplefontchangetext
+ \end{setfonttracking}}
+\end{exemplary}
+
+\noindent
+No contents: \leftmarker
+\begin{setfonttracking}{0}
+\end{setfonttracking}\rightmarker.
+
+
+\subsection{Font Expansion}
+
+\newcommand*{\expansionsample}
+ {By default, all characters of a font are allowed to be stretched or
+ shrunk by the same amount. However, it is also possible to limit
+ the expansion of certain characters if they are more sensitive to
+ deformation.
+ This is the purpose of the \code{\string\SetExpansion}~command.}
+
+\begin{exemplary}
+ \setlength{\examplewidth}{250pt}
+ \renewcommand*{\examplepreset}{\microtypesetup{activate=true}}
+ \renewcommand*{\examplesetup}{\frenchspacing\small\fussy}
+
+ \centering
+
+ \caption[Microtype: font expansion]
+ {Use \packagename{microtype} to stretch or shrink a font.
+ The top sample uses \code{\string\setfontshrink} at level~3,
+ the middle sample is the unchanged reference
+ (which is allowed to shrink and expand),
+ and the bottom sample utilizes \code{\string\setfontstretch} at level~2.}
+
+ \exampleparbox[microtype-expansion-shrink]{%
+ \begin{setfontshrink}[3]
+ \noindent\expansionsample
+ \end{setfontshrink}}
+
+ \medskip
+
+ \exampleparbox[microtype-expansion-neutral]{%
+ \begin{setfontexpand}[0]
+ \noindent\expansionsample
+ \end{setfontexpand}}
+
+ \medskip
+
+ \exampleparbox[microtype-expansion-stretch]{%
+ \begin{setfontstretch}[2]
+ \noindent\expansionsample
+ \end{setfontstretch}}
+
+ \examplefontinformation
+\end{exemplary}
+
+\noindent
+No contents -- \code{setfontshrink}: \leftmarker
+\begin{setfontshrink}
+\end{setfontshrink}\rightmarker.
+
+\noindent
+No contents -- \code{setfontstretch}: \leftmarker
+\begin{setfontstretch}
+\end{setfontstretch}\rightmarker.
+
+\noindent
+No contents -- \code{setfontexpand}: \leftmarker
+\begin{setfontexpand}
+\end{setfontexpand}\rightmarker.
+
+\noindent
+No contents -- \code{nofontexpansion}: \leftmarker
+\begin{nofontexpansion}
+\end{nofontexpansion}\rightmarker.
+
+
+
+\subsection{Character Protrusion}
+
+\newcommand*{\zerodepthrule}
+ {\raisebox{0pt}[0pt][0pt]{\rule[-4.5\baselineskip]{.1pt}{4.25\baselineskip}}}
+
+\newcommand*{\protrusionsampletext}{%
+ \noindent
+ \zerodepthrule\hfill\zerodepthrule \\
+ 1\hfill 1 \\
+ .2\hfill 2. \\
+ --3\hfill 3-- \\
+ ---4\hfill 4---}
+
+\begin{exemplary}
+ \renewcommand*{\examplepreset}{\microtypesetup{activate=true}}
+ \renewcommand*{\examplesetup}{\frenchspacing\small\fussy}
+
+ \centering
+
+ \caption[Microtype: protrusion]
+ {Comparison of the \packagename{microtype} feature ``protrusion'' (left-hand side)
+ and \code{nocharprotrusion} (right-hand side).}
+
+ \exampleparbox[microtype-protrusion-reference]{%
+ \microtypesetup{protrusion=true}
+ \protrusionsampletext}
+ \qquad
+ \exampleparbox[microtype-protrusion-off]{%
+ \microtypesetup{protrusion=true}
+ \nocharprotrusion
+ \protrusionsampletext}
+
+ \medskip
+\end{exemplary}
+
+\noindent
+No contents -- \code{nocharprotrusion}: \leftmarker
+\begin{nocharprotrusion}
+\end{nocharprotrusion}\rightmarker.
+
+
+\clearpage
+\section{Sloppy Paragraphs}
+
+\Cref{ex:slightlysloppy-1,ex:slightlysloppy-2} put different amounts of ``sloppiness'' face to face.
+
+\begin{exemplary}
+ \setlength{\examplewidth}{180pt}
+ \def\sness{1}
+ \centering
+ \caption[Paragraphs typeset slightly sloppy~1]
+ {Paragraphs typeset slightly sloppy: \code{\string\slightlysloppy} vs.~\code{\string\fussy}.
+ The left parbox is typeset with \code{\string\slightlysloppy}
+ and \(\metavar{sloppiness} = \sness\), whereas the right sample
+ features the well known \code{\string\fussy} setting.
+ Both parboxes have a width of \the\examplewidth.\label{ex:slightlysloppy-1}}
+
+ \exampleparbox[fussy-vs-slightlysloppy]{\slightlysloppy[\sness]\texbooktolerancesample}
+ \qquad
+ \exampleparbox[fussy-vs-slightlysloppy-reference]{\fussy\texbooktolerancesample}
+
+ \texbooktolerancesamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+\begin{exemplary}
+ \setlength{\examplewidth}{150pt}
+ \def\sness{2}
+ \centering
+ \caption[Paragraphs typeset slightly sloppy~2]
+ {Paragraphs typeset slightly sloppy: \code{\string\slightlysloppy} vs.~\code{\string\sloppy}.
+ The left sample is features \code{\string\slightlysloppy} with \(\metavar{sloppiness} = \sness\),
+ the right sample is typeset with \code{\string\sloppy}.
+ Both parboxes have a width of \the\examplewidth.\label{ex:slightlysloppy-2}}
+
+ \exampleparbox[sloppy-vs-slightlysloppy]{\slightlysloppy[\sness]\texbooktolerancesample}
+ \qquad
+ \exampleparbox[sloppy-vs-slightlysloppy-reference]{\sloppy\texbooktolerancesample}
+
+ \texbooktolerancesamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+In conclusion all renderings of the text in
+\cref{ex:slightlysloppy-1} and \cref{ex:slightlysloppy-2}
+have their merits and their own flaws.
+
+
+\clearpage
+\section{Vertically Partially-Tied Paragraphs}
+
+\paragraph{\code{vtietoppar}}\leavevmode\par
+
+\begin{typoginspect}{vtietoppar}
+ \clubpenalty=150
+ \begin{vtietoppar}[2]
+ After breaking a paragraph into lines, \TeX{} computes the interline
+ penalties by adding the values of: \code{\string\clubpenalty} after
+ the first line of a paragraph.\footnote{Footnote of \code{vtietoppar}.}
+ \eTeX{} generalizes the concept of interline, club, widow, and display widow penalty
+ by allowing their replacement by arrays of penalty values.
+ \end{vtietoppar}
+\end{typoginspect}
+
+\paragraph{\code{vtiebotpar}}\leavevmode\par
+
+\begin{typoginspect}{vtiebotpar}
+ \widowpenalty=150
+ \begin{vtiebotpar}[2]
+ After breaking a paragraph into lines, \TeX{} computes the interline
+ penalties by adding the values of: \code{\string\widowpenalty}
+ before the last line of the paragraph.\marginpar{A float!}
+ \eTeX{} generalizes the concept of interline, club, widow, and display widow penalty
+ by allowing their replacement by arrays of penalty values.
+ \end{vtiebotpar}
+\end{typoginspect}
+
+\paragraph{\code{vtiebotdisp}}\leavevmode\par
+
+\begin{typoginspect}[tracingboxes]{vtiebotdisp}
+ \displaywidowpenalty=150
+ \begin{vtiebotdisp}[2]
+ After breaking a paragraph into lines, \TeX{} computes the interline
+ penalties by adding the values of: \code{\string\displaywidowpenalty}
+ before the line immediately preceding a displayed equation.
+ \eTeX{} generalizes the concept of interline, club, widow, and display widow penalty
+ by allowing their replacement by arrays of penalty values.
+ \[g H = H g \quad \text{for all} \enspace g \in G.\]
+ \end{vtiebotdisp}
+
+ Follow-up paragraph after and outside of the \code{vtiebotdisp}-environment.
+\end{typoginspect}
+
+\paragraph{\code{vtiebotdisptoppar}}\leavevmode\par
+
+\begin{typoginspect}{vtiebotdisptoppar}
+ \displaywidowpenalty=150
+ \begin{vtiebotdisptoppar}[2]
+ After breaking a paragraph into lines, \TeX{} computes the interline
+ penalties by adding the values of: \code{\string\displaywidowpenalty}
+ before the line immediately preceding a displayed equation.
+ \eTeX{} generalizes the concept of interline, club, widow, and display widow penalty
+ by allowing their replacement by arrays of penalty values.
+ \begin{breakabledisplay}
+ \begin{displaymath}
+ g H = H g \quad \text{for all} \enspace g \in G.
+ \end{displaymath}
+ \end{breakabledisplay}
+
+ In this example we need a paragraph that follows the displayed math.
+ So, we have to type some more text here
+ to be able to demonstrate the action of the environment.
+ \end{vtiebotdisptoppar}
+\end{typoginspect}
+
+
+\clearpage
+\section{Breakable Displayed Equations}
+
+\newcommand*{\binaryminus}{\mathbin{-}}
+\newcommand*{\diracadj}[1]{\overline{#1}}
+\newcommand*{\unaryminus}{{-}}
+
+\begin{typoginspect}{breakabledisplay}
+ \begin{breakabledisplay}
+ \begin{align*}
+ \diracadj{\psi}(x) \mathop{\partial_\mu} \psi(x)
+ \mapsto \diracadj{\psi'}(x) \mathop{\partial_\mu} \psi'(x)
+ &= e^{i \alpha(x)} \diracadj{\psi}(x) \mathop{\partial_\mu} \bigl( e^{\unaryminus i \alpha(x)} \psi(x) \bigr) \\
+ &= \underbrace{\diracadj{\psi}(x) \mathop{\partial_\mu} \psi(x)}_{\text{free particle}}
+ \mskip\medmuskip \binaryminus \mskip\medmuskip i \, \diracadj{\psi}(x)
+ \underbrace{\mathop{\partial_\mu} \bigl( \alpha(x) \bigr)}_{\mathclap{\text{vector field}}} \psi(x).
+ \end{align*}
+ \end{breakabledisplay}
+\end{typoginspect}
+
+
+\clearpage
+\section{\packagename{Setspace} Front-End}
+
+\fontsizeinfo{defaultsize}
+Current settings are \defaultsize{}
+%--\settoheight{\typogfontsize}{CEMNORSUVWXZ}
+and \code{\string\typogfontsize} is \the\typogfontsize.
+
+
+\newcommand*{\absbls}{12pt plus 1pt minus .5pt}
+\paragraph{\code{\string\setbaselineskip\{\absbls\}}}
+\resetbaselineskip
+\setbaselineskip{10pt + 2.75pt}% addition
+\setbaselineskip{10.5pt * 100 / 105}% scaling
+\setbaselineskip{11.8pt * 85 / 100}% scaling
+\setbaselineskip{\absbls}
+\fontsizeinfo{baselinesetsize}
+New settings: \baselinesetsize.
+
+\texbookbaselineskipsample
+
+
+\newcommand*{\relbls}{130}
+\paragraph{\code{\string\setbaselineskippercentage\{\relbls\}}}
+\setbaselineskippercentage{1 + 2 + .3333 * 100 + 100 * 0.6667}% float expression
+\setbaselineskippercentage{\relbls}
+\fontsizeinfo{baselinesetsize}
+New settings: \baselinesetsize.
+
+\texbookbaselineskipsample
+
+
+\newcommand*{\absled}{1.5pt}
+\paragraph{\code{\string\setleading\{\absled\}}}
+\setleading{1pt / -2.0}% negative leading
+\setleading{\absled}
+\fontsizeinfo{baselinesetsize}
+New settings: \baselinesetsize.
+
+\texbookbaselineskipsample
+
+
+\newcommand*{\relled}{30}
+\paragraph{\code{\string\setleadingpercentage\{\relled\}}}
+\setleadingpercentage{10 - 25 / 2}% negative leading
+\setleadingpercentage{\relled}
+\fontsizeinfo{baselinesetsize}
+New settings: \baselinesetsize.
+
+\texbookbaselineskipsample
+
+\medskip
+
+\setstretch{1}
+\texbookbaselineskipsamplecredits
+
+
+\clearpage
+\section{Smooth Ragged}
+
+\begin{exemplary}
+ \newcommand*{\ragwidth}{10pt}
+ \centering
+ \caption[Comparison of ragged right typesetting]
+ {Comparison of ragged right typesetting.
+ The first example uses \code{RaggedRight} of \packagename{ragged2e}
+ the second \code{smoothraggedrightpar} of \packagename{typog}.
+ Both examples share a \code{\string\fussy}~setting and
+ a \ragwidth~wide ragged right margin.\label{ex:smoothraggedright}}
+
+ \setlength{\RaggedRightRightskip}{0pt plus \ragwidth}
+
+ %\def\smoothraggedrightgenerator{quintuplet}
+ %\def\smoothraggedrightgenerator{septuplet}
+ \setlength{\smoothraggedrightragwidth}{\ragwidth}
+ %\def\smoothraggedrightfuzzfactor{.667}
+
+ \iffalse
+ \begin{quote}
+ \begin{RaggedRight}\examplesetup
+ \texbookparshapeskipsample
+ \end{RaggedRight}
+ \end{quote}
+
+ \begin{quote}
+ \begin{smoothraggedrightpar}\examplesetup
+ \texbookparshapeskipsample
+ \end{smoothraggedrightpar}
+ \end{quote}
+ \else
+ \exampleparbox[RaggedRight-reference]{\RaggedRight\texbooktolerancesample}
+ \qquad
+ \exampleparbox[smoothraggedrightpar]{\smoothraggedrightpar\texbooktolerancesample}
+ \fi
+
+ \texbookparshapeskipsamplecredits
+
+ \examplefontinformation
+\end{exemplary}
+
+
+ %--\setlength{\smoothraggedrightparindent}{25pt}
+ %--\setlength{\parindent}{0pt}
+
+\noindent
+\code{\string\parindent}=\the\parindent,
+visually: \rule{.1pt}{.8em}\kern\parindent\rule{.1pt}{.8em};
+
+\noindent
+\code{\string\smoothraggedrightleftskip}=\the\smoothraggedrightleftskip.
+\code{\string\smoothraggedrightparindent}=\the\smoothraggedrightparindent.
+\smallskip
+
+{
+ %--\setlength{\smoothraggedrightragwidth}{8pt}
+ \begin{smoothraggedright}
+ \texbooktolerancesample
+
+ \texbooktolerancesample
+ \end{smoothraggedright}
+}
+
+\medskip
+
+{
+ \setlength{\smoothraggedrightragwidth}{15pt}
+
+ \newcommand*{\definitionnilpotent}{%
+ Eine Abbildung oder ein Operator~\(A\)
+ heißen nilpotent vom Grad~\(k\), falls \(k \in N\)
+ die kleinste Zahl ist, für die gilt: \(A^k = 0\).}
+
+ \begin{otherlanguage}{german}
+ \parbox[t]{60pt}{\fussy\RaggedRight\definitionnilpotent}
+ \hspace{40pt}
+ \parbox[t]{60pt}{\fussy\smoothraggedright\definitionnilpotent}
+ \end{otherlanguage}
+}
+
+\clearpage
+\begin{RaggedRight}
+ \begin{thebibliography}{0}
+ \bibitem{knuth:1986}
+ \bibauthor{Knuth, D.~E.},
+ \bibtitle{The \TeX{}book},
+ Vol.~A of Computers\&Typesetting,
+ Addison Wesley, Reading\kernedslash*MA,
+ 1986.
+ \end{thebibliography}
+\end{RaggedRight}
+\end{document}
+%</example>
+% \fi
+%
+%
+%
+% \iffalse
+%<*nomicrotype>
+\documentclass[]{article}
+
+
+\usepackage[english]{babel}
+
+\usepackage{csquotes}
+\DeclareQuoteStyle{typog-guillemets}
+ {\doubleguillemetright}
+ {\doubleguillemetleft}
+ {\singleguillemetright}
+ {\singleguillemetleft}
+
+\usepackage[]{typog}
+
+
+\newcommand*{\packagename}[1]{\mbox{\textsf{#1}}}
+
+
+\begin{document}
+\begin{center}
+ \Huge\bf\sf
+ TypoG Examples \\
+ without Package~\packagename{microtype}
+\end{center}
+
+\bigskip
+
+\noindent
+This example \LaTeX-document uses package~\packagename{typog}
+\emph{without} package~\packagename{microtype}.
+
+We want \packagename{typog} to be as usable as possible even without
+the nice features that \packagename{microtype} offers.
+After all \packagename{typog} is just a front-end for it.
+
+As we are testing a special configuration here anyhow,
+we hook up our quotes with package~csquotes
+to check whether they interact ok.
+{\setquotestyle{typog-guillemets}%
+ \enquote{This is the outer part of the phrase
+ which contains the \enquote{inner part}.}}
+\end{document}
+%</nomicrotype>
+% \fi
+%
+%
+%
+% \iffalse
+%<*teximan2latex>
+## Remove all lines we neither need nor want.
+/^\\input /d
+/^@anchor/d
+/^@bye/d
+/^@documentencoding/d
+/^@node/d
+/^@setfilename/d
+/^@settitle/d
+/^@top/d
+/@menu/,/@end menu/d
+
+## Convert sectioning macros to our own hierarchy.
+s/^@chapter \(.*\)$/\\subsection*{\\textls[40]{\1}}/
+s/^@section \(.*\)$/\\subsubsection*{\1}/
+
+## Make `@asis' list resemble the Texinfo format.
+s/@table @asis/\\begin{list}{}{\\itemindent=-20pt\\leftmargin=20pt}/
+s/@end table/\\end{list}/
+
+## Indenting by four spaces generates a `verbatim' environment.
+s/@verbatim/\\begin{verbatim}/
+s/@end verbatim/\\end{verbatim}/
+
+## We substitute @display for our maxipage environment.
+s/@display/\\begin{maxipage}/
+s/@end display/\\end{maxipage}/
+
+## The argument format of the URL macro is different.
+s/@url{\([^,]*\), \([^}]*\)}/\\href{\1}{\2}/g
+
+## Use our own markup.
+s/\.\.\./\\dots{}/g
+s/LaTeX/\\LaTeX{}/g
+s/@file/\\textit/g
+s/@strong/\\textbf/g
+s/[w]{/mbox{/g
+
+## Quote some special characters.
+s/%/\\%/g
+s/_/\\_/g
+
+## Adapt to how a man-page is typeset.
+## En-dashes in front of long options really suck!
+s/--/-\\nolig*-/g
+
+## Converting the at-signs to backslashes is a bit tricky.
+s/^@item/\\item/
+s/@\([A-Za-z][A-Za-z]*\){/\\\1{/g
+s/@@/@/g
+
+## Convert selected macro names.
+s/\\jobname/\\textbackslash jobname/g
+
+## Make qualified Perl names breakable.
+s/::/::\\discretionary{}{}{}/g
+%</teximan2latex>
+% \fi
+%
+%
+%
+% \iffalse
+%<*typog-grep>
+#! /usr/bin/env perl
+
+
+use autodie qw(:all);
+use strict;
+use warnings;
+
+use Data::Dumper ();
+use English;
+use File::Basename ();
+use Getopt::Long;
+use IO::File;
+use IO::Handle;
+use Term::ANSIColor ();
+
+
+use constant COMMAND_NAME => File::Basename::basename($PROGRAM_NAME);
+
+
+my $DEBUG = 0;
+my $MATCH_COUNT = 0;
+my $OUTPUT_IS_REDIRECTED;
+
+
+sub fail_with_error {
+ print STDERR join('', COMMAND_NAME, ': ', @_, "\n");
+ exit 2;
+}
+
+
+sub issue_warning {
+ print STDERR join('', COMMAND_NAME, ': warning: ', @_, "\n");
+}
+
+
+sub debug_print {
+ return unless $DEBUG;
+ print STDERR "+ @_\n";
+}
+
+
+sub quote_filesystem {qq("$_[0]")}
+sub quote_literal {qq(`$_[0]')}
+
+
+sub limit_string_length {
+ my ($a_string, $a_maximum_length) = @_;
+
+ if (length $a_string <= $a_maximum_length) {
+ $a_string;
+ } else {
+ substr($a_string, 0, $a_maximum_length - 3) . '...';
+ }
+}
+
+
+## We set all colors to `undef' and fill them later with the values
+## of the actual configuration.
+my $highlight_patterns = {
+ PARTIAL_LINE => {
+ FONT_SPEC => [qr#
+ \\
+ (?: OMS | OMX | OT1 | T1 | TS1 | U )
+ (?: /[^/]+ ){5} / \S+ \s
+ (?: \([+-]\d+\) )?
+ #x, undef],
+ MATH => [qr#
+ \$
+ \\
+ (?: LMS | OML )
+ (?: /[^/]+ ){5} / \S+ \s
+ (?: \([+-]\d+\) )?
+ .*?
+ \$
+ #x, undef]
+ },
+ WHOLE_LINE => {
+ FILL_STATE => [qr#^(?:Under|Over)full \\hbox .*$#, undef],
+ FIRST_VBOX => [qr#^%%#, undef],
+ HORIZONTAL_BREAKPOINT => [qr#^@@\d+:.*$#, undef],
+ HORIZONTAL_BREAK_CANDIDATE => [qr#^@[\\ ].*$#, undef],
+ LINE_BREAK_PASS => [qr#^@[a-z]+?pass#, undef],
+ TIGHTNESS => [qr#^(?:Loose|Tight) \\hbox .*$#, undef],
+ VERTICAL_BREAKPOINT => [qr#^% t=\d+.*$#, undef]
+ }
+};
+
+
+sub colorize_line {
+ my ($configuration, $line) = @_;
+
+ foreach my $pattern_color_pair (values %{$highlight_patterns->{WHOLE_LINE}}) {
+ next unless $pattern_color_pair->[1];
+ return Term::ANSIColor::colored($line, $pattern_color_pair->[1])
+ if $line =~ $pattern_color_pair->[0];
+ }
+ return $line if $line =~ m#^\.#; # we do not paint box contents yet
+
+ $line =~ s#$highlight_patterns->{PARTIAL_LINE}->{MATH}->[0]
+ #Term::ANSIColor::colored($MATCH, $highlight_patterns->{PARTIAL_LINE}->{MATH}->[1])
+ #egx;
+
+ $line =~ s#$highlight_patterns->{PARTIAL_LINE}->{FONT_SPEC}->[0]
+ #Term::ANSIColor::colored($MATCH, $highlight_patterns->{PARTIAL_LINE}->{FONT_SPEC}->[1])
+ #egx;
+
+ return $line;
+}
+
+
+my $open_or_close_tag_regexp = qr#^</?typog-inspect[ >]#; # somewhat sloppy definition
+my $close_tag_regexp = qr#^</typog-inspect>#;
+my $open_tag_regexp =
+ qr#^
+ <typog-inspect \s+
+ id="(?<id_match> .*?)" \s+
+ job="(?<job_match> .*?)" \s+
+ line="(?<line_match> .*?)" \s+
+ page="(?<page_match> .*?)"
+ >#x;
+
+
+sub grep_log_file {
+ my ($options, $configuration, $file, $filename, $id_regexp) = @_;
+
+ my $job_name;
+ my $line_number = 0; # line number in the log file we are inspecting, i.e., $filename
+ my $match_count = 0;
+ my $source_line_number; # line number in TeX file the log refers to, i.e., "$job_name.tex"
+ my $page_number;
+ my $regexp_modifier = $options->{IGNORE_CASE} ? 'i' : '';
+ my $id_value;
+ my @nesting_levels;
+
+ if ($options->{WORD_REGEXP}) {
+ $id_regexp = "\\b$id_regexp\\b";
+ }
+
+ while (my $line = readline $file) {
+ chomp $line;
+ $line_number++;
+
+ if ($line =~ $close_tag_regexp) {
+ fail_with_error("$filename: $line_number: mismatched open/close tags") unless @nesting_levels;
+ pop @nesting_levels;
+ }
+
+ if (@nesting_levels and $nesting_levels[-1] and $line !~ $open_or_close_tag_regexp) {
+ if ($options->{LOG_LINE_NUMBER}) {
+ my $formatted_log_line_number =
+ sprintf $configuration->{LOG_LINE_NUMBER_FORMAT}, $line_number;
+ if ($options->{COLORIZE_OUTPUT}) {
+ $formatted_log_line_number =
+ Term::ANSIColor::colored($formatted_log_line_number,
+ $configuration->{COLORS}->{LOG_LINE_NUMBER});
+ }
+ print $formatted_log_line_number, ' ';
+ }
+
+ print "$job_name: " if $options->{JOB_NAME};
+
+ if ($options->{LINE_NUMBER}) {
+ my $formatted_line_number = sprintf $configuration->{LINE_NUMBER_FORMAT}, $source_line_number;
+ if ($options->{COLORIZE_OUTPUT}) {
+ $formatted_line_number =
+ Term::ANSIColor::colored($formatted_line_number,
+ $configuration->{COLORS}->{LINE_NUMBER});
+ }
+ print $formatted_line_number, ' ';
+ }
+
+ if ($options->{PAGE_NUMBER}) {
+ my $formatted_page_number = sprintf $configuration->{PAGE_NUMBER_FORMAT}, $page_number;
+ if ($options->{COLORIZE_OUTPUT}) {
+ $formatted_page_number =
+ Term::ANSIColor::colored($formatted_page_number,
+ $configuration->{COLORS}->{PAGE_NUMBER});
+ }
+ print $formatted_page_number, ' ';
+ }
+
+ if ($options->{ID} and not $configuration->{PRINT_ID_AS_HEADING}) {
+ my $formatted_id = sprintf $configuration->{ID_INLINE_FORMAT}, $id_value;
+ if ($options->{COLORIZE_OUTPUT}) {
+ $formatted_id = Term::ANSIColor::colored($formatted_id ,
+ $configuration->{COLORS}->{ID_COLOR});
+ }
+ print $formatted_id, ' ';
+ }
+
+ if ($options->{COLORIZE_OUTPUT}) {
+ print colorize_line($configuration, $line);
+ } else {
+ print $line;
+ }
+ print "\n";
+ }
+
+ if ($line =~ $open_tag_regexp) {
+ $id_value = limit_string_length($+{id_match}, $configuration->{ID_MAX_LENGTH});
+ $job_name = $+{job_match};
+ $source_line_number = $+{line_match};
+ $page_number = $+{page_match};
+
+ my $found_matching_id = ($id_value =~ m/(?$regexp_modifier)$id_regexp/) ? 1 : 0;
+ push @nesting_levels, $found_matching_id;
+ if ($found_matching_id) {
+ ++$MATCH_COUNT; # global count -- needed for return code of program
+ ++$match_count; # per file count -- needed to be able to separate the hunks
+
+ print "\n" if $match_count >= 2;
+ if ($options->{ID} and $configuration->{PRINT_ID_AS_HEADING}) {
+ my $formatted_id = sprintf $configuration->{ID_HEADING_FORMAT}, $id_value;
+ if ($options->{COLORIZE_OUTPUT}) {
+ $formatted_id =
+ Term::ANSIColor::colored($formatted_id,
+ $configuration->{COLORS}->{ID_HEADING_COLOR});
+ }
+ print $formatted_id, "\n";
+ }
+ }
+ }
+ }
+}
+
+
+sub show_ids_in_file {
+ my ($options, $configuration, $file, $filename, $id_regexp) = @_;
+
+ my $line_number = 0;
+ my @nesting_levels;
+
+ while (my $line = readline $file) {
+ chomp $line;
+ $line_number++;
+
+ if ($line =~ $close_tag_regexp) {
+ fail_with_error("$filename: $line_number: mismatched open/close tags") unless @nesting_levels;
+ pop @nesting_levels;
+ }
+
+ if ($line =~ $open_tag_regexp) {
+ my $id_value = limit_string_length($+{id_match}, $configuration->{ID_MAX_LENGTH});
+ my $job_name = $+{job_match};
+ my $source_line_number = $+{line_match};
+ my $page_number = $+{page_match};
+
+ ++$MATCH_COUNT;
+ push @nesting_levels, 1;
+
+ if ($options->{LOG_LINE_NUMBER}) {
+ my $formatted_log_line_number =
+ sprintf $configuration->{LOG_LINE_NUMBER_FORMAT}, $line_number;
+ if ($options->{COLORIZE_OUTPUT}) {
+ $formatted_log_line_number =
+ Term::ANSIColor::colored($formatted_log_line_number,
+ $configuration->{COLORS}->{LOG_LINE_NUMBER});
+ }
+ print $formatted_log_line_number, ' ';
+ }
+
+ print "$job_name: " if $options->{JOB_NAME};
+
+ if ($options->{LINE_NUMBER}) {
+ my $formatted_line_number = sprintf $configuration->{LINE_NUMBER_FORMAT}, $source_line_number;
+ if ($options->{COLORIZE_OUTPUT}) {
+ $formatted_line_number =
+ Term::ANSIColor::colored($formatted_line_number,
+ $configuration->{COLORS}->{LINE_NUMBER});
+ }
+ print $formatted_line_number, ' ';
+ }
+
+ if ($options->{PAGE_NUMBER}) {
+ my $formatted_page_number = sprintf $configuration->{PAGE_NUMBER_FORMAT}, $page_number;
+ if ($options->{COLORIZE_OUTPUT}) {
+ $formatted_page_number =
+ Term::ANSIColor::colored($formatted_page_number,
+ $configuration->{COLORS}->{PAGE_NUMBER});
+ }
+ print $formatted_page_number, ' ';
+ }
+
+ my $indent = $configuration->{ID_INDENT} * (@nesting_levels - 1);
+ print ' ' x $indent, $id_value, "\n";
+ }
+ }
+}
+
+
+sub open_file_for_reading {
+ my $filename = shift;
+
+ my $file;
+
+ if ($filename eq 'stdin') {
+ $file = IO::Handle->new();
+ $file->fdopen(fileno(STDIN), 'r') or
+ fail_with_error("cannot open stdin: $OS_ERROR");
+ } else {
+ $file = IO::File->new($filename, 'r') or
+ fail_with_error("cannot open @{[quote_filesystem($filename)]}: $OS_ERROR");
+ }
+
+ $file;
+}
+
+
+sub close_file {
+ my ($file, $filename) = shift;
+
+ $file->close or
+ issue_warning("problems while closing @{[quote_filesystem($filename)]}: $OS_ERROR");
+}
+
+
+sub grep_or_show {
+ my ($options, $configuration, $file, $filename, $id_regexp) = @_;
+
+ if ($options->{SHOW_ALL_IDS}) {
+ show_ids_in_file($options, $configuration, $file, $filename, $id_regexp);
+ } else {
+ grep_log_file($options, $configuration, $file, $filename, $id_regexp);
+ }
+}
+
+
+sub scan_files {
+ my ($options, $configuration, $id_regexp, $log_filenames) = @_;
+
+ if (@$log_filenames) {
+ foreach my $log_filename (@$log_filenames) {
+ $log_filename = 'stdin' if $log_filename eq '-';
+ if (@$log_filenames >= 2) {
+ print "\n" unless $log_filename eq $log_filenames->[0];
+ my $filename_header = "==> $log_filename <==\n";
+ $filename_header = Term::ANSIColor::colored($filename_header,
+ $configuration->{COLORS}->{FILE_HEADER})
+ if $options->{COLORIZE_OUTPUT};
+ print $filename_header;
+ }
+ my $file = open_file_for_reading($log_filename);
+ grep_or_show($options, $configuration, $file, $log_filename, $id_regexp);
+ close_file($file, $log_filename);
+ }
+ } else {
+ my $log_filename = 'stdin';
+ my $file = open_file_for_reading($log_filename);
+ grep_or_show($options, $configuration, $file, $log_filename, $id_regexp);
+ close_file($file, $log_filename);
+ }
+}
+
+
+sub redirect_and_scan_files {
+ my ($options, $configuration, $id_regexp, $log_filenames) = @_;
+
+ my $pager;
+
+ my $pid = open($pager, '|-', $configuration->{PAGER}, $configuration->{PAGER_FLAGS});
+ fail_with_error('failed to redirect to pager ', quote_literal($configuration->{PAGER}),
+ ' with flags ', quote_literal($configuration->{PAGER_FLAGS}),
+ ": $OS_ERROR")
+ unless defined $pid;
+ my $stdout = select $pager;
+
+ $pager->autoflush;
+ scan_files($options, $configuration, $id_regexp, $log_filenames);
+
+ close $pager or issue_warning "error occurred while closing the pager (pid: $pid) pipe: $OS_ERROR";
+ select $stdout;
+}
+
+
+########################################################################
+
+
+my $configuration_key_map = {
+ 'id-format' => 'ID_INLINE_FORMAT',
+ 'id-indent' => 'ID_INDENT',
+ 'id-heading' => 'PRINT_ID_AS_HEADING',
+ 'id-heading-format' => 'ID_HEADING_FORMAT',
+ 'id-max-length' => 'ID_MAX_LENGTH',
+ 'line-number-format' => 'LINE_NUMBER_FORMAT',
+ 'log-line-number-format' => 'LOG_LINE_NUMBER_FORMAT',
+ 'page-number-format' => 'PAGE_NUMBER_FORMAT',
+
+ 'file-header-color' => 'FILE_HEADER',
+ 'fill-state-color' => 'FILL_STATE',
+ 'first-vbox-color' => 'FIRST_VBOX',
+ 'font-spec-color' => 'FONT_SPEC',
+ 'horizontal-break-candidate-color' => 'HORIZONTAL_BREAK_CANDIDATE',
+ 'horizontal-breakpoint-color' => 'HORIZONTAL_BREAKPOINT',
+ 'id-color' => 'ID_COLOR',
+ 'id-heading-color' => 'ID_HEADING_COLOR',
+ 'line-break-pass-color' => 'LINE_BREAK_PASS',
+ 'line-number-color' => 'LINE_NUMBER',
+ 'log-line-number-color' => 'LOG_LINE_NUMBER',
+ 'math-color' => 'MATH',
+ 'page-number-color' => 'PAGE_NUMBER',
+ 'pager' => 'PAGER',
+ 'pager-flags' => 'PAGER_FLAGS',
+ 'tightness-color' => 'TIGHTNESS',
+ 'vertical-breakpoint-color' => 'VERTICAL_BREAKPOINT'
+};
+
+
+my $default_configuration = {
+ COLORS => {
+ FILE_HEADER => 'bold black',
+ FILL_STATE => 'bold magenta',
+ FIRST_VBOX => 'bold red',
+ FONT_SPEC => 'grey12',
+ HORIZONTAL_BREAKPOINT => 'bold green',
+ HORIZONTAL_BREAK_CANDIDATE => 'blue',
+ ID_COLOR => 'white on_black',
+ ID_HEADING_COLOR => 'white on_black',
+ LINE_BREAK_PASS => 'bold green',
+ LINE_NUMBER => 'bold black',
+ LOG_LINE_NUMBER => 'italic black',
+ MATH => 'yellow',
+ PAGE_NUMBER => 'bold white on_red',
+ TIGHTNESS => 'bold cyan',
+ VERTICAL_BREAKPOINT => 'red'
+ },
+ ID_INLINE_FORMAT => '%s:',
+ ID_HEADING_FORMAT => '--> %s <--',
+ ID_INDENT => 8,
+ ID_MAX_LENGTH => 40,
+ LINE_NUMBER_FORMAT => '%5d',
+ LOG_LINE_NUMBER_FORMAT => '%6d',
+ PAGE_NUMBER_FORMAT => '[%3d]',
+ PAGER => 'less',
+ PAGER_FLAGS => '--quit-if-one-screen',
+ PRINT_ID_AS_HEADING => 0
+};
+
+
+sub initialize_highlighting_from_configuration {
+ my $configuration = shift;
+
+ while (my (undef, $assoc) = each %$highlight_patterns) {
+ while (my ($name, $pattern_color_pair) = each %$assoc) {
+ $pattern_color_pair->[1] = $configuration->{COLORS}->{$name};
+ }
+ }
+}
+
+
+sub modify_configuration {
+ my ($configuration, $key, $value) = @_;
+
+ fail_with_error('malformed KEY=VALUE pair -- missing key') unless $key;
+
+ if (defined $configuration_key_map->{$key}) {
+ if ($key =~ m/-color$/) {
+ $configuration->{COLORS}->{$configuration_key_map->{$key}} = $value;
+ } else {
+ $configuration->{$configuration_key_map->{$key}} = $value;
+ }
+ } else {
+ fail_with_error("@{[quote_literal($key)]} is not a valid configuration KEY");
+ }
+}
+
+
+sub setup_configuation {
+ my ($config_spec, $configuration) = @_;
+
+ foreach my $spec (split ':', $config_spec) {
+ my ($key, $value) = split '=', $spec;
+ modify_configuration($configuration, $key, $value);
+ }
+}
+
+
+my $default_options = {
+ COLORIZE_MODE => 'auto',
+ DEBUG => 0,
+ ID => 0,
+ IGNORE_CASE => 0,
+ JOB_NAME => 0,
+ LINE_NUMBER => 0,
+ LOG_LINE_NUMBER => 0,
+ PAGE_NUMBER => 0,
+ REQUEST_PAGER => 1,
+ WORD_REGEXP => 0
+};
+
+
+sub show_help {
+ print <<HELP_TEXT;
+Usage: @{[COMMAND_NAME]} [OPTION] ID-REGEXP LOG-FILE...
+Structured grep for typog-inspect elements that match ID-REGEXP in LOG-FILE.
+
+Options
+ --color [WHEN],
+ --colour [WHEN] use color to highlight specific log contents
+ WHEN is 'always', 'never', or 'auto'
+ -C, --config KEY=VALUE set configuration KEY to VALUE
+ -i, --[no-]id print matching id with output lines
+ -y, --[no-]ignore-case ignore case distinctions in patterns and data
+ -j, --[no-]job-name print \\jobname with output lines
+ -n, --[no-]line-number print TeX-source line number with output lines
+ -N, --[no-]log-line-number print log-file line number with output lines
+ -p, --[no-]page-number print page number with output lines
+ -P, --[no-]pager redirect output to pager
+ -w, --[no-]word-regexp match only whole words
+
+ -a, --all, --any show all IDs in LOG-FILE
+ --debug turn on debug output
+ -h, --help display this help and exit
+ --show-config show default configuration and exit
+ -V, --version show version information and exit
+
+HELP_TEXT
+
+ exit 0;
+}
+
+
+sub show_configuration {
+ my $format_string_value = sub {quote_literal($default_configuration->{$_[0]})};
+
+ print <<FIXED_CONFIGURATION_TEXT;
+Configuration
+Key Default Value
+------------------------------------ -------------
+id-format @{[$format_string_value->('ID_INLINE_FORMAT')]}
+id-heading $default_configuration->{PRINT_ID_AS_HEADING}
+id-heading-format @{[$format_string_value->('ID_HEADING_FORMAT')]}
+id-indent $default_configuration->{ID_INDENT}
+id-max-length $default_configuration->{ID_MAX_LENGTH}
+line-number-format @{[$format_string_value->('LINE_NUMBER_FORMAT')]}
+log-line-number-format @{[$format_string_value->('LOG_LINE_NUMBER_FORMAT')]}
+page-number-format @{[$format_string_value->('PAGE_NUMBER_FORMAT')]}
+pager @{[$format_string_value->('PAGER')]}
+pager-flags @{[$format_string_value->('PAGER_FLAGS')]}
+
+FIXED_CONFIGURATION_TEXT
+
+ foreach my $configuration_key (sort keys %$configuration_key_map) {
+ next unless $configuration_key =~ m/-color$/;
+ printf("%-36s %s\n",
+ $configuration_key,
+ quote_literal($default_configuration->
+ {COLORS}->
+ {$configuration_key_map->{$configuration_key}}));
+ }
+
+ exit 0;
+}
+
+
+sub show_version {
+ print <<VERSION_TEXT;
+typog-grep 0.1
+
+Copyright (C) 2024 by Ch. L. Spiel
+License LPPL: LaTeX Project Public License version 1.3 or later
+VERSION_TEXT
+
+ exit 0;
+}
+
+
+sub get_options {
+ my ($options, $configuration) = @_;
+
+ Getopt::Long::Configure('gnu_getopt', 'no_ignore_case');
+
+ Getopt::Long::GetOptions('a|all|any' => \$options->{SHOW_ALL_IDS},
+ 'color|colour=s' => \$options->{COLORIZE_MODE},
+ 'C|configuration=s' => sub{setup_configuation($_[1], $configuration)},
+ 'debug+' => \$DEBUG,
+ 'h|help' => \&show_help,
+ 'i|id!' => \$options->{ID},
+ 'y|ignore-case!' => \$options->{IGNORE_CASE},
+ 'j|job-name!' => \$options->{JOB_NAME},
+ 'n|line-number!' => \$options->{LINE_NUMBER},
+ 'N|log-line-number!' => \$options->{LOG_LINE_NUMBER},
+ 'p|page-number!' => \$options->{PAGE_NUMBER},
+ 'P|pager!' => \$options->{REQUEST_PAGER},
+ 'show-config' => \&show_configuration,
+ 'V|version' => \&show_version,
+ 'w|word-regexp!' => \$options->{WORD_REGEXP}) or
+ fail_with_error('problems while parsing options');
+
+ fail_with_error("unknown colorize mode @{[quote_literal($options->{COLORIZE_MODE})]}")
+ unless $options->{COLORIZE_MODE} =~ m/^(?:always|auto|never)$/i
+}
+
+
+sub do_colorize {
+ my $colorize_mode = shift;
+
+ if ($colorize_mode =~ m/never/i) {
+ 0;
+ } elsif ($colorize_mode =~ m/always/i) {
+ 1;
+ } elsif ($colorize_mode =~ m/auto/i) {
+ not $OUTPUT_IS_REDIRECTED;
+ }
+}
+
+
+## For the comparison with the POSIX spec of grep(1) consult
+## https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html
+
+
+sub main {
+ $OUTPUT_IS_REDIRECTED = -t STDOUT ? 0 : 1;
+
+ my $options = {%$default_options};
+ my $configuration = {%$default_configuration};
+
+ get_options($options, $configuration);
+ $options->{COLORIZE_OUTPUT} = do_colorize($options->{COLORIZE_MODE});
+ initialize_highlighting_from_configuration($configuration);
+ debug_print(Data::Dumper::Dumper($configuration));
+ debug_print(Data::Dumper::Dumper($options));
+
+ my $id_regexp;
+ if ($options->{SHOW_ALL_IDS}) {
+ $id_regexp = '^';
+ issue_warning("option @{[quote_literal('--id')]} ignored in @{[quote_literal('--all')]} mode")
+ if $options->{ID};
+ } else {
+ fail_with_error('missing ID-REGEXP') unless @ARGV >= 1;
+ $id_regexp = shift @ARGV;
+ }
+
+ if ($options->{REQUEST_PAGER} && $OUTPUT_IS_REDIRECTED) {
+ issue_warning("option @{[quote_literal('--pager')]} ignored because output is redirected");
+ }
+ my $use_pager = $options->{REQUEST_PAGER} && !$OUTPUT_IS_REDIRECTED;
+ if ($use_pager) {
+ redirect_and_scan_files($options, $configuration, $id_regexp, \@ARGV);
+ } else {
+ scan_files($options, $configuration, $id_regexp, \@ARGV);
+ }
+
+ exit ($MATCH_COUNT == 0);
+}
+
+
+main();
+%</typog-grep>
+% \fi
+%
+%
+%
+% \iffalse
+%<*typog-grep-documentation>
+=begin man
+
+.\" Turn off justification.
+.na
+
+=end man
+
+=head1 NAME
+
+typog-grep - grep for typog-inspect elements in LaTeX log files
+
+
+=head1 SYNOPSIS
+
+=over
+
+=item B<typog-grep> -a|--all|--any [I<OPTION>...] F<LOG-FILE>...
+
+=item B<typog-grep> [I<OPTION>...] I<REGEXP> F<LOG-FILE>...
+
+=back
+
+The first form shows all C<E<lt>typog-inspect id="I<ID>" ...E<gt>> elements in F<LOG-FILE>.
+
+The second form shows the contents of C<E<lt>typog-inspect id="I<ID>" ...E<gt>> elements
+whose I<ID>s match I<REGEXP> in F<LOG-FILE>.
+
+If no F<LOG-FILE> is given read from F<stdin>.
+The S<filename C<->> is synonymous to F<stdin>.
+
+
+=head1 DESCRIPTION
+
+B<typog-grep> is a tailored post-processor for LaTeX log files
+and the C<typoginspect> environment as provided by S<package typog>.
+It shares more with the venerable
+L<B<sgrep>|https://www.cs.helsinki.fi/u/jjaakkol/sgrep.html>
+than with S<POSIX L<B<grep>|https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html>>.
+
+The LaTeX user brackets her text in
+
+ \begin{typoginspect}{ID}
+ Text and code to investigate
+ \end{typoginspect}
+
+where I<ID> is used to identify one or more bracketed snippets.
+I<ID> does not have to be unique.
+The I<REGEXP> mechanism makes it easy to select groups of related I<ID>s
+if they are named accordingly.
+
+In F<LOG-FILE> the environment shows up, packed with tracing information, as
+
+=begin texinfo
+
+@display
+@relax
+
+=end texinfo
+
+ <typog-inspect id="ID" job="JOB-NAME" line="LINE-NUMBER" page="PAGE-NUMBER">
+ Trace Data
+ </typog-inspect>
+
+=begin texinfo
+
+@end display
+@relax
+
+=end texinfo
+
+where all the capital-letter sequences are meta-variables
+and in particular
+I<JOB-NAME> is the expansion of C<\jobname>,
+I<LINE-NUMBER> is the LaTeX source file line number
+of the beginning of the C<typoginspect> environment,
+and I<PAGE-NUMBER> is the page where
+the output of S<C<Text and code to investigate>> occurs.
+
+B<typog-grep> reveals the contents of F<LOG-FILE>
+between C<E<lt>typog-inspect id="I<ID>" ...E<gt>>
+and C<E<lt>/typog-inspectE<gt>> excluding the XML-tags.
+Access the I<JOB-NAME>, I<LINE-NUMBER>, and I<PAGE-NUMBER>
+with the commandline options
+B<--job-name>, B<--line-number>, and B<--page-number>, respectively.
+Use B<--id> to show the name of the IDs that matched I<REGEXP>.
+
+C<typoginspect> environments can be nested.
+B<typog-grep> respects the nesting,
+i.e., if the I<ID> of the nested environment does not match I<REGEXP>
+it will not be included in the program's output.
+
+
+=head1 OPTIONS
+
+The list of options is sorted by the names of the long options.
+
+=over 4
+
+=item B<-a>, B<--all>, B<--any>
+
+ID-discovery mode:
+Show all C<typog-inspect> elements independent of any matching patterns.
+
+=item B<--color>, B<colour> I<WHEN>
+
+Colorize specific log contents for the matching ids.
+The S<argument I<WHEN>> determines when to apply color:
+C<always>, C<never>, S<or C<auto>>.
+The setting C<auto> checks whether standard output has been redirected.
+This is the default.
+
+=item B<-C>, B<--config> I<KEY>=I<VALUE>[:I<KEY>=I<VALUE>[:...]]
+
+Set one or more configuration I<KEY> to I<VALUE> pairs.
+See S<Sec. CONFIGURATION> below for a description of all available configuration items.
+Use option B<--show-config> to display the default configuration.
+
+=item B<--debug>
+
+Turn on debug output on F<stderr>.
+
+=item B<-h>, B<--help>
+
+Display brief help then exit.
+
+=item B<-i>, B<--[no-]id>
+
+Print the actual id name that matched I<REGEXP>.
+Control the appearance of the matching id with configuration S<item C<id-heading>>.
+
+=item B<-y>, B<--[no-]ignore-case>
+
+Match ids while ignoring case distinctions in patterns and data.
+
+=item B<-j>, B<--[no-]job-name>
+
+Print the C<\jobname> that B<tex> associated with the input file.
+
+=item B<-n>, B<--[no-]line-number>
+
+Print the line number where the S<C<typoginspect> environment>
+was encountered in the LaTeX source file.
+
+=item B<-N>, B<--[no-]log-line-number>
+
+Print the line number of the F<log>-file where the current line was encountered.
+
+=item B<-p>, B<--[no-]page-number>
+
+Print page number where the contents of the S<C<typoginspect> environment>
+starts in the typeset document.
+
+=item B<-P>, B<--[no-]pager>
+
+Redirect output from F<stdout> to the configured pager.
+
+=item B<--show-config>
+
+Show the default configuration and exit.
+
+=item B<-V>, B<--version>
+
+Show version information and exit.
+
+=item B<-w>, B<--[no-]word-regexp>
+
+Match only whole words.
+
+=back
+
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item C<id-format>=I<FORMAT>
+
+Control the I<FORMAT> for printing matching ids in inline-mode,
+where I<FORMAT> is passed to Perl's C<printf>.
+S<Default: C<%s:>.>
+
+=item C<id-heading>=C<0>E<verbar>C<1>
+
+Choose between printing the matching ids with S<option B<--id>>:
+S<Inline (C<0>)> or heading before the matching data (C<1>).
+S<Default: C<0>.>
+
+=item C<id-heading-format>=I<FORMAT>
+
+Control the I<FORMAT> for printing matching ids in heading-mode,
+where I<FORMAT> is passed to Perl's C<printf>.
+S<Default: C<--E<gt> %s E<lt>-->.>
+
+=item C<id-indent>=I<INDENT>
+
+Indentation of nested typog-inspect tags.
+Only used in ``discovery'' mode (first form), i.e., if B<--all> is active.
+S<Default: 8.>
+
+=item C<id-max-length>=I<MAXIMUM-LENGTH>
+
+Set the maximum length of a matching id for printing.
+It a matching id exceeds this length it will be truncated
+and the last three characters (short of I<MAXIMUM-LENGTH>) will be replaced by dots.
+S<Default: 40.>
+
+=item C<line-number-format>=I<FORMAT>
+
+Control the I<FORMAT> for printing TeX source line numbers,
+where I<FORMAT> is passed to Perl's C<printf>.
+S<Default: C<%5d>.>
+
+=item C<log-line-number-format>=I<FORMAT>
+
+Control the I<FORMAT> for printing log line numbers,
+where I<FORMAT> is passed to Perl's C<printf>.
+S<Default: C<%6d>.>
+
+=item C<page-number-format>=I<FORMAT>
+
+Control the I<FORMAT> for printing page numbers,
+where I<FORMAT> is passed to Perl's C<printf>.
+S<Default: C<[%3d]>.>
+
+=item C<pager>=I<PAGER>
+
+Name of pager application to pipe output into
+if run with S<option B<--pager>>.
+S<Default: C<less>>.
+
+=item C<pager-flags>=I<FLAGS>
+
+Pass I<FLAGS> to I<PAGER>.
+S<Default: C<--quit-if-one-screen>>.
+
+=item Color Configuration
+
+For the syntax of the color specifications consult
+the manual page of Term::ANSIColor(pm).
+
+=over 4
+
+=item C<file-header-color>
+
+Color of the filename header.
+
+=item C<fill-state-color>
+
+Color of the messages that report ``Underfull hbox'' or ``Overfull hbox''.
+
+=item C<first-vbox-color>
+
+Color of the first vbox on a page.
+
+=item C<font-spec-color>
+
+Color of font specifications.
+
+=item C<horizontal-break-candidate-color>
+
+Color of lines with horizontal-breakpoint S<candidates C<@>>.
+
+=item C<horizontal-breakpoint-color>
+
+Color of lines with horizontal S<breakpoints C<@@>>.
+
+=item C<id-color>
+
+Color of matching ids when printed inline.
+
+=item C<id-heading-color>
+
+Color of matching ids when printed in heading form.
+
+=item C<line-break-pass-color>
+
+Color of the lines showing which pass (e.g., C<@firstpass>)
+of the line-breaking algorithm is active.
+
+=item C<line-number-color>
+
+Color of TeX-source-file line numbers.
+
+=item C<log-line-number-color>
+
+Color of log-file line numbers.
+
+=item C<math-color>
+
+Color used for math expressions including their font specs.
+
+=item C<page-number-color>
+
+Color of page numbers of the final output.
+
+=item C<tightness-color>
+
+Color of lines with Tight/Loose hbox reports.
+
+=item C<vertical-breakpoint-color>
+
+Color of possible vertical breakpoints.
+
+=back
+
+=back
+
+
+=head2 Brief summary of colors and attributes
+
+=over 4
+
+=item Foreground Color
+
+C<black>, C<red>, C<green>, C<yellow>,
+C<blue>, C<magenta>, C<cyan>, C<white>,
+
+Prefix with C<bright_> for high-intensity or bold foreground.
+
+=item Foreground Grey
+
+C<grey0>, ..., C<grey23>
+
+=item Background Color
+
+C<on_black>, C<on_red>, C<on_green>, C<on_yellow>,
+S<C<on_blue>>, S<C<on_magenta>>, S<C<on_cyan>>, S<C<on_white>>
+
+Replace C<on_> with C<on_bright_> for high-intensity or bold background.
+
+=item Background Grey
+
+C<on_grey0>, ..., C<on_grey23>
+
+=item Text Attribute
+
+C<bold>, C<dark>, C<italic>, C<underline>, C<reverse>
+
+=back
+
+
+=head1 EXIT STATUS
+
+The exit status is 0 if at least one I<ID> matched I<REGEXP>,
+1 if no I<ID> matched I<REGEXP>, and 2 if an error occurred.
+
+
+=head1 SEE ALSO
+
+B<grep>(1), B<printf>(3), B<Term::ANSIColor>(pm)
+
+
+=cut
+%</typog-grep-documentation>
+% \fi
+%
+%
+%
+\endinput
+%
+%
+%
+%%% Local Variables:
+%%% compile-command: "latex typog.dtx"
+%%% fill-column: 96
+%%% End:
diff --git a/macros/latex/contrib/typog/typog.ins b/macros/latex/contrib/typog/typog.ins
new file mode 100644
index 0000000000..06378d86bb
--- /dev/null
+++ b/macros/latex/contrib/typog/typog.ins
@@ -0,0 +1,74 @@
+%% Copyright (C) 2024 by Ch. L. Spiel
+%%
+%% 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.
+
+
+\input docstrip
+
+
+\keepsilent
+\askforoverwritefalse
+
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2024 by Ch. L. Spiel
+
+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'.
+
+The Current Maintainer of this work is Ch. L. Spiel.
+
+This work consists of the files typog.dtx and typog.ins
+and the derived files typog.sty, slant-angle.mp,
+crooked-paragraphs.mp, smooth-parshapes.mp, title.mp,
+typog-example.tex, typog-nomt.tex, typog-grep.pl,
+typog-grep.pod, and teximan2latex.sed.
+
+
+\endpreamble
+
+
+\edef\source{\jobname.dtx}
+
+\generate{\file{typog.sty}{\from{\source}{package}}
+ \file{typog-example.tex}{\from{\source}{example}}
+ \file{typog-nomt.tex}{\from{\source}{nomicrotype}}
+ \file{typog.ist}{\from{\source}{index-style}}}
+
+
+\nopostamble
+\generate{\file{title.mp}{\from{\source}{title}}
+ \file{slant-angle.mp}{\from{\source}{slantangle}}
+ \file{crooked-paragraphs.mp}{\from{\source}{crookedparagraphs}}
+ \file{smooth-parshapes.mp}{\from{\source}{smoothparshapes}}}
+
+
+\nopreamble
+\generate{\file{teximan2latex.sed}{\from{\source}{teximan2latex}}
+ \file{typog-grep.pl}{\from{\source}{typog-grep}}
+ \file{typog-grep.pod}{\from{\source}{typog-grep-documentation}}}
+
+
+\endbatchfile
+
+
+%% Local Variables:
+%% compile-command: "latex typog.ins"
+%% mode: latex
+%% End:
diff --git a/macros/latex/contrib/univie-ling/README b/macros/latex/contrib/univie-ling/README
index 57de3e566b..6d589988de 100644
--- a/macros/latex/contrib/univie-ling/README
+++ b/macros/latex/contrib/univie-ling/README
@@ -97,6 +97,12 @@ also have a look at the example files.
== CHANGES ==
+V. 2.5 (2024-05-09):
+ - univie-ling-paper: implement "short" option.
+ - univie-ling-poster: Add \restspace accessibility helper function.
+ - univie-ling-handout: implement \hoDate.
+ - univie-ling-wlg: upgrade editorial structure.
+
V. 2.4 (2023-03-31):
- univie-ling-paper: fix default ps and se text type.
diff --git a/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx b/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx
index 9dffd636c5..60172f7ebd 100644
--- a/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx
+++ b/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx
@@ -38,7 +38,7 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesFile{univie-ling.bbx}[2023/03/31 v.2.4 biblatex bibliography style]
+\ProvidesFile{univie-ling.bbx}[2024/05/09 v.2.5 biblatex bibliography style]
% Load base style (authoryear-comp)
\RequireBibliographyStyle{authoryear-comp}
diff --git a/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx b/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx
index a1617d71af..837f66d53d 100644
--- a/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx
+++ b/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx
@@ -36,7 +36,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesFile{univie-ling.cbx}[2023/03/31 v.2.4 biblatex citation style]
+\ProvidesFile{univie-ling.cbx}[2024/05/09 v.2.5 biblatex citation style]
\RequireCitationStyle{authoryear-comp}
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdf
index 16d3622e11..022d7b0ffb 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdf
index 0fc933eab6..bd912dfba4 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdf
index 51cdff71d1..bab72dbf24 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex b/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex
index 1d4a093335..da696a8fe1 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex
@@ -7,6 +7,7 @@
%\hoEventLoc{Andere Uni}
\hoTitle{Titel des Handouts/Referats}
\hoSubtitle{Untertitel}
+\hoDate{Datum der Präsentation}
% Vortragende
\hoName{Mein Name \and Zweiter Name}
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdf
index df801a2e82..c7add82055 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex b/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex
index ed375e7a9a..0c4ac2bb6c 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex
@@ -7,6 +7,7 @@
%\hoEventLoc{Other University}
\hoTitle{Title of the Handout/Presentation}
\hoSubtitle{Subtitle}
+\hoDate{Date of the presentation}
% Presenters
\hoName{My Name \and Second Name}
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdf
index 414979d08c..f701cadb32 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdf
index 029263939b..9ca6f625cc 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdf
index e0865ede5e..0ed4b5d7cc 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdf
index 2f58113d8b..ed8866e79a 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdf
index 374070d7af..38fe04556c 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdf
index 8d4b50cec6..eb482b6af2 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdf
index 5e7c3de1a0..ffaa154e26 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdf
index e71523f535..65411031cc 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdf
index b3fd65afb9..c4540b6210 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex
index 28c602cf3f..9a9fc48809 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex
@@ -63,7 +63,7 @@
\author{\texorpdfstring{Jrgen Spitzmller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jrgen Spitzmller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -340,7 +340,11 @@ Templates are provided as well:
\section{Release History}
-\begin{description}
+\begin{itemize}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item No change to this class.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item No change to this class.
@@ -424,7 +428,7 @@ Templates are provided as well:
\item Extend documentation of bibliographic features.
\end{itemize}
\item 2016/01/29 (v.\,0.4) Initial release.
-\end{description}
+\end{itemize}
\begin{thebibliography}{1}
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdf
index 662260a499..4576acd967 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex
index c35b731e87..f67e3f1846 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex
@@ -63,7 +63,7 @@
\author{\texorpdfstring{Jrgen Spitzmller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jrgen Spitzmller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -285,6 +285,7 @@ For student handouts, it is advised to only use name and possibly e-mail.
\item{\jcsmacro{hoEventLoc[<header>]\{<event>\}}}: The location of the event you are presenting at.
Useful for conference presentations.
\item{\jcsmacro{hoEventDate[<header>]\{<event date>\}}}: The date of the event you are presenting at, or the term of your class.
+ \item{\jcsmacro{hoDate[<header>]\{<date>\}}}: The date of your presentation, which might be a subset of the event date only.
\end{description}
\section{Semantic markup}
@@ -385,6 +386,10 @@ Templates are provided as well:
\section{Release History}
\begin{description}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item Add \jcsmacro{hoDate}.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item No change to this class.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdf
index 60aeed4510..26aaaabcd5 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex
index 7b78acec1b..773dfdb47d 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex
@@ -63,7 +63,7 @@
\author{\texorpdfstring{Jrgen Spitzmller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jrgen Spitzmller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -239,6 +239,14 @@ option (e.\,g., \joption{all=false,microtype=true} will switch off all packages
The option \joption{draftmark=true|false|firstpage} allows you to mark your document as a draft, which is indicated by a watermark (including the current date). This might be useful when sharing preliminary versions with your supervisor.
With \joption{draftmark=true}, this mark is printed on top of each page. With \joption{draftmark=firstpage}, the draft mark appears on the title page only.
+\subsection{Short papers}
+
+Via the option \joption{short=true|false}, \uvlt\ provides a layout setting which is more suitable for short written papers such as home exams
+or short concepts. As opposed to the default layout, this uses smaller font sizes and does not insert a title page. Rather than that, the
+title is printed on top of the first page, and the main text immediately follows.
+
+Such short papers usually do not have a table of contents or a declaration, but you can use it if you want.
+
\subsection{Further options}
The class builds on \textsf{scrartcl} (KOMA article), which provides many more options to tweak the appearance of your document. You can use
@@ -256,7 +264,7 @@ given that you have specified the following data in the preamble.
\setlength\itemsep{0pt}
\item{\jcsmacro{author\{<name>\}}}: Name(s) of the paper's author(s). Separate multiple authors by \jcsmacro{and}.
\item{\jcsmacro{studienkennzahl\{<code>\}}}: The degree programme code (\emph{Studienkennzahl}) as it appears on
- the student record sheet, e.\,g. \emph{A\,792\,327}.
+ the student record sheet, e.\,g. \emph{A\,792\,327}. Note that this is not output with \joption{short=true}.
\item{\jcsmacro{matrikelnummer\{<registration number>\}}}: Your registration number (\emph{Matrikelnummer}). In case of multiple authors, separate the codes by \jcsmacro{and}.
\end{description}
@@ -374,6 +382,10 @@ Templates are provided as well:
\section{Release History}
\begin{itemize}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item Implement \joption{short} option.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item Fix default \joption{ps} and \joption{se} text type.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdf
index fc8b6663e6..391bec0c00 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex
index 4c78545c2d..dcd04b3338 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex
@@ -65,7 +65,7 @@
\author{\texorpdfstring{Jrgen Spitzmller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jrgen Spitzmller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -110,6 +110,7 @@ The following class and packages are required and loaded by \uvlt:
\item \textsf{l3keys}: Key-value interface for class options.
\item \textsf{translator}: Localization machinery.
\item \textsf{url}: Support for typesetting URLs.
+ \item \textsf{tikzpagenodes}: Page measuring (for accessibility).
\end{itemize}
The following packages are required for specific features and loaded by default. However, the loading can be individually and generally omitted (see sec.~\ref{coptions}):
\begin{itemize}
@@ -481,6 +482,52 @@ Please refer to the comprehensive beamer manual \cite{beamer} for information.
Please also refer to the template files included in the package for some further usage instructions and hints.
+
+\subsection{Accessibility helpers}
+
+For visually impaired users, setting up posters is quite a challenge, as \LaTeX\ does not really give you good feedback
+on whether the poster is filled evenly, or even in the crucial case if the text overruns the poster page.
+In the latter case, you could watch out for \emph{overfull vbox} warnings, but these are quite ambiguous.
+
+To enhance accessibility in this regard, \uvlt\ provides the following helper function:
+\begin{description}
+ \item{\jcsmacro{restspace[<label>]}}
+\end{description}
+%
+If you insert this to your poster, it will tell you through a package warning in the log file how many normal lines
+there are still available (in the current column, if you are using columns) after the point where the command
+has been inserted:
+\begin{quote}
+ \enquote{Package univie-ling-poster warning: Remaining space: <n> normal lines}
+ (with <n> being the actual number of lines)
+\end{quote}
+%
+With \emph{normal lines}, the warning refers to lines in the normal font size of running text.
+In the warning, the package also provides you with its own evaluation on how to deal with the result.
+Either of these four verdicts will be given:
+\begin{enumerate}
+ \item \enquote{Good, still space left}: poster/column is not full yet, you can safely add more text
+ (more than one normal line left).
+ \item \enquote{All good, but this is full now}: poster/column is filled, and not too crowded,
+ but you should not add more text (one line more will make it look less good).
+ \item \enquote{It is still OK, but the poster is quite full}: The content already touches the footer line.
+ If you don't have space available in other columns and need all text, you can keep this, but it will
+ probably look a bit crowded. So if you can, re-arrange (take out at least one line).
+ \item \enquote{Text exceeds poster! You need to re-arrange the content}:
+ If you get this warning, text runs out of the poster page, and you definitely need to fix that.
+\end{enumerate}
+%
+The optional argument of the macro allows you to set an arbitrary label which is used in the warning.
+This might be helpful if you use multiple \verb|\restspace| macros (e.\,g., in multiple columns).
+So if you insert, for instance \verb|\restspace[1]|, the warning will read
+\enquote{Remaining space (1): <n> normal lines}.
+
+Note that \verb|\restspace| should always be the last element in the column or the text. This means that if
+you are using boxes, set the macro \emph{after} the end of the box, not within the box.
+
+Note further that the \verb|\restspace| macro does not print anything on the poster itself, so you can safely keep
+them in the published version.
+
\subsection{\LyX\ layouts and templates}
A layout for \LyX\footnote{See \url{https://www.lyx.org}.}\ can be retrieved from \url{https://github.com/jspitz/univie-ling/raw/master/lyx/layouts/univie-ling-poster.layout}.
@@ -498,6 +545,10 @@ Templates are provided as well:
\section{Release History}
\begin{description}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item Add \verb|\restspace| accessibility helper function.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item No change to this class.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdf
index e91bb21ee7..199dd750a3 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex
index 5680490e7e..9b99e1db6c 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex
@@ -59,7 +59,7 @@
\author{\texorpdfstring{Jrgen Spitzmller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jrgen Spitzmller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -404,6 +404,10 @@ Templates are provided as well:
\section{Release History}
\begin{itemize}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item No change to this class.
+ \end{itemize}
\item 2023/01/26 (v.\,2.3)
\begin{itemize}
\item No change to this class.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdf
index 13c4c8e24d..c9d37e2221 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex
index 5dedae5b72..96cf80916f 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex
@@ -59,7 +59,7 @@
\author{\texorpdfstring{Jrgen Spitzmller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jrgen Spitzmller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -165,14 +165,12 @@ Data for a particular issue can be set via:
\item{\jcsmacro{issuesubtitle\{<subtitle>\}}} Set subtitle of special issue
\end{description}
%
-If needed, the editorial board (as printed in the imprint) can be adapted for a particular issue via:
+If needed, the editorial (as printed in the imprint) can be adapted for a particular issue via:
\begin{description}
\setlength\itemsep{0pt}
- \item{\jcsmacro{edboardGL\{<name>\}}} Set editorial board member(s) for General Linguistics
- \item{\jcsmacro{edboardAL\{<name>\}}} Set editorial board member(s) for Applied Linguistics
- \item{\jcsmacro{edboardHL\{<name>\}}} Set editorial board member(s) for Historical Linguistics
- \item{\jcsmacro{techboard\{<name>\}}} Set technical board member(s)
+ \item{\jcsmacro{jeditors\{<name>\}}} Set editor(s) of the journal
+ \item{\jcsmacro{jedboard\{<name>\}}} Set editorial board member(s)
\end{description}
%
In general, the data for the editorial board should be set/changed in a local copy of the file
@@ -247,6 +245,10 @@ A template is provided as well: \url{https://github.com/jspitz/univie-ling/raw/m
\raggedright
\begin{itemize}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item Update the editorial structure.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item No change to this class.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling.pdf
index 2452df688b..057fd5d0ff 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling.tex b/macros/latex/contrib/univie-ling/doc/univie-ling.tex
index a3d9e05db9..6cc4ac25f8 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling.tex
@@ -42,7 +42,7 @@
\author{\texorpdfstring{Jrgen Spitzmller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jrgen Spitzmller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls
index c372c01a38..29576a930f 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls
@@ -32,8 +32,8 @@
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{univie-ling-expose}[2023/03/31 v.2.4 Univie Linguistic Exposes (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesPackage{univie-ling-expose}[2024/05/09 v.2.5 Univie Linguistic Exposes (JSp)]
%% ============================================================
@@ -54,10 +54,8 @@
\newif\if@uve@usefontenc\@uve@usefontenctrue
\def\uve@fontenc{T1}
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uve }
+% Define keys and values
+\DeclareKeys[uve]
{
% all=<true|false>
% Load all (most) packages
@@ -167,17 +165,9 @@
\@uve@otffontsfalse
},
}
-\ExplSyntaxOff
% Process
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uve]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uve}
-}
+\ProcessKeyOptions[uve]
%% ============================================================
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls
index 7c7a8ff1da..22a451329d 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls
@@ -34,8 +34,8 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}[1997/06/01]
-\ProvidesClass{univie-ling-handout}[2023/03/31 v.2.4 Univie Ling handout class (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesClass{univie-ling-handout}[2024/05/09 v.2.5 Univie Ling handout class (JSp)]
%% ============================================================
%% CLASS OPTIONS
@@ -107,10 +107,8 @@
}
\uvh@cd@german
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uvh }
+% Define keys and values
+\DeclareKeys[uvh]
{
% all=<true|false>
% Load all (most) packages
@@ -286,17 +284,9 @@
\@uvh@otffontsfalse
},
}
-\ExplSyntaxOff
% Process
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uvh]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uvh}
-}
+\ProcessKeyOptions[uvh]
%% ============================================================
@@ -386,11 +376,13 @@
\newlength\beforeevent
\newlength\beforetitle
\newlength\beforesubtitle
+\newlength\beforedate
\newlength\aftertitle
\setlength\beforetitling{18pt}
\setlength\beforeevent{6pt}
\setlength\beforesubtitle{6pt}
\setlength\beforetitle{6pt}
+\setlength\beforedate{8pt}
\setlength\aftertitle{18pt}
% Boxes
@@ -561,6 +553,15 @@
\def\uvh@eventdate{#2}
}
+% f.) Presentation date
+\def\uvh@date{}
+\def\uvh@date@header{}
+\newcommand*{\hoDate}[2][\@empty]{%
+ \ifx\@empty#1\def\uvh@date@header{#2}
+ \else\def\uvh@date@header{#1}\fi
+ \def\uvh@date{#2}
+}
+
% The maketitle routine
\renewcommand\maketitle{%
\newif\ifuvh@eventline\uvh@eventlinefalse%
@@ -592,7 +593,7 @@
\ifx\uvh@subtitle\empty%
\else
\vspace{\beforesubtitle}\noindent\bgroup\raggedright\uvh@font@subtitle\uvh@subtitle\par\egroup%
- \fi
+ \fi%
\else%
\vspace{.15\baselineskip}%
\begin{minipage}{\textwidth}
@@ -605,7 +606,7 @@
\fi
\end{tabularx}%
\end{minipage}%
- \fi
+ \fi%
\@ifundefined{hypersetup}{}{%
\hypersetup{pdftitle=\ifx\uvh@titleprefix\empty\else\uvh@titleprefix~\fi\uvh@title,
pdfauthor=\uvh@name,
@@ -616,6 +617,11 @@
\else%
\vspace{\beforesubtitle}\bgroup\noindent\raggedright\uvh@font@subtitle\uvh@widesubtitle\par\egroup%
\fi%
+ \ifx\uvh@date\empty%
+ \else%
+ \vspace{\beforedate}%
+ \bgroup\noindent\uvh@font@eventlocdate\uvh@date\egroup%
+ \fi%
\vspace{\aftertitle}%
\@afterindentfalse\@afterheading%
}
@@ -710,19 +716,20 @@
\def\ps@headings{%
\let\uvh@save@and\and%
- \def\and{$\cdot$\ }%
+ \def\uvh@header@and{$\cdot$\ }%
\if@uvh@pplogo\sbox{\uvh@box@logo}{\uvh@printsmalllogo}\fi
\def\uvh@thelogo{\parbox{90mm}{\usebox{\uvh@box@logo}}}
\headheight30mm\headsep2.5mm\footskip8mm
\def\titleline{\ifx\uvh@title@header\empty\else\uvh@font@headertitle%
\ifx\uvh@titleprefix\empty\else\uvh@titleprefix~\fi%
- \uvh@title@header\linebreak\fi}%
+ \uvh@title@header\ifx\uvh@date@header\empty\else\ (\uvh@date@header)\linebreak\fi}%
\ifx\uvh@eventlocation@header\empty\ifx\uvh@eventdate@header\empty\@uvh@noeventtrue\fi\fi%
\def\eventline{%
\uvh@font@header\uvh@event@header\ifx\uvh@eventdate@header\empty\else\if@uvh@breakevent\linebreak\else\ \fi%
\if@uvh@noevent\else(\ifx\uvh@eventlocation@header\empty\else\uvh@eventlocation@header, \fi\uvh@eventdate@header)\fi\linebreak\fi%
}
\def\@oddhead{%
+ \let\and\uvh@header@and%
\unitlength1mm
\hspace{\headeroffset}
\begin{picture}(0,0)
@@ -747,12 +754,12 @@
}%
}
\end{picture}
+ \let\and\uvh@save@and%
\hfill%
}
\def\@oddfoot{\hfill\uvh@font@footer\raggedright\uvh@pageprefix~\thepage\if@uvh@lastpage /\pageref{LastPage}\fi}
\def\@evenhead{\@oddhead}
\def\@evenfoot{\@oddfoot}
- \let\and\uvh@save@and%
}
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls
index 289315beb8..4ee6eaf8f8 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls
@@ -31,8 +31,8 @@
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{univie-ling-paper}[2023/03/31 v.2.4 Univie Linguistic Papers (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesPackage{univie-ling-paper}[2024/05/09 v.2.5 Univie Linguistic Papers (JSp)]
%% ============================================================
@@ -51,13 +51,12 @@
\newif\if@uvp@polyglossia\@uvp@polyglossiafalse
\newif\if@uvp@psfonts\@uvp@psfontstrue
\newif\if@uvp@otffonts\@uvp@otffontsfalse
+\newif\if@uvp@short\@uvp@shortfalse
\newif\if@uvp@usefontenc\@uvp@usefontenctrue
\def\uvp@fontenc{T1}
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uvp }
+% Define keys and values
+\DeclareKeys[uvp]
{
% all=<true|false>
% Load all (most) packages
@@ -166,18 +165,14 @@
{ \@uvp@psfontsfalse
\@uvp@otffontsfalse
},
+ % short=<true|false>
+ % short paper
+ short.legacy_if_set:n = @uvp@short,
+ short.usage:n = preamble,
}
-\ExplSyntaxOff
% Process
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uvp]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uvp}
-}
+\ProcessKeyOptions[uvp]
%% ============================================================
@@ -195,6 +190,12 @@
sectionentrydots=true
]{scrartcl}[2003/04/22]
+\if@uvp@short
+ \KOMAoptions{fontsize=11pt,
+ headings=small,
+ titlepage=false}
+\fi
+
%% ============================================================
%% LOCALIZATION:
@@ -218,6 +219,8 @@
\deftranslation[to=English]{example}{example}
\deftranslation[to=German]{matnr}{Matrikelnummer}
\deftranslation[to=English]{matnr}{Matrikelnummer}
+\deftranslation[to=German]{instructor}{Leitung}
+\deftranslation[to=English]{instructor}{Instructor}
\deftranslation[to=German]{stkz}{Studienkennzahl}
\deftranslation[to=English]{stkz}{Studienkennzahl}
\deftranslation[to=German]{erkl}{Erkl\"arung}
@@ -290,6 +293,12 @@ This includes all drawings, sketches, graphics and internet sources.}
\setkomafont{subtitle}{\normalfont\fontsize{12}{14pt}\sffamily}
\setkomafont{date}{\normalfont\fontsize{10}{12pt}\mdseries\sffamily}
\newkomafont{course}{\normalfont\mdseries\sffamily}
+% short paper settings
+\newkomafont{spauthor}{\normalfont\mdseries}
+\newkomafont{sptitle}{\Large\bfseries}
+\newkomafont{spsubtitle}{\large\bfseries}
+\newkomafont{spdate}{\normalfont\normalsize\mdseries}
+\newkomafont{spcourse}{\footnotesize\mdseries\sffamily}
%% ============================================================
@@ -436,6 +445,35 @@ This includes all drawings, sketches, graphics and internet sources.}
\begin{tabular}[t]{c}%
}%
\fi
+ \if@uvp@short
+ \bgroup
+ \let\footnote\thanks
+ \renewcommand*\thefootnote{\@fnsymbol\c@footnote}%
+ \let\@oldmakefnmark\@makefnmark
+ \renewcommand*{\@makefnmark}{\rlap\@oldmakefnmark}%
+ \setparsizes{\z@}{\z@}{\z@\@plus 1fil}\par@updaterelative
+ \parbox[b]{11.5cm}{%
+ \ifx\@course\@empty\else%
+ \usekomafont{spcourse}{\lectypeverb\ \emph{\@course} (\lecsemshort~\@semester)}%
+ \ifx\@instructor\@empty\else\newline\fi%
+ \fi%
+ \ifx\@instructor\@empty\else%
+ \usekomafont{spcourse}{\translate{instructor}:~\@instructor}\fi
+ }\hfill
+ \parbox[b]{3cm}{\includegraphics[width=3cm]{univielogo-sw}}\par
+ \vskip 3em
+ \def\and{\leavevmode\unskip\slash}%
+ {\usekomafont{spauthor}{\@author\ifx\@matrikelnr\@empty\else\ (\translate{matnr}:~\@matrikelnr)\fi\par\vskip .5em}}%
+ \ifx\@title\@empty\else
+ {\usekomafont{sptitle}{\@title%
+ \ifx\@subtitle\@empty\else\\\usekomafont{spsubtitle}{\@subtitle}\fi\par}}%
+ \fi
+ \vskip .5em
+ {\usekomafont{spdate}{\ifx\@texttype\@empty\else\@texttype, \fi\@date\par%
+ \vspace{.5\baselineskip}}\noindent}%
+ \@thanks\let\@thanks\@empty
+ \egroup
+ \else
\begin{titlepage}
\sffamily%
\setcounter{page}{%
@@ -569,6 +607,7 @@ This includes all drawings, sketches, graphics and internet sources.}
\fi
\ifx\titlepage@restore\relax\else\clearpage\titlepage@restore\fi
\end{titlepage}
+ \fi% not \if@uvp@short
\setcounter{footnote}{0}%
\expandafter\ifnum \csname scr@v@3.12\endcsname>\scr@compatibility\relax
\let\thanks\relax
@@ -607,7 +646,7 @@ This includes all drawings, sketches, graphics and internet sources.}
\begin{tabular}[t]{c}%
\hline
}%
-\clearpage
+\if@uvp@short\else\clearpage\fi
\section*{\translate{erkl}}
\if@uvp@multiauthors
@@ -636,7 +675,7 @@ This includes all drawings, sketches, graphics and internet sources.}
\@author
\end{tabular}\par
\egroup
-\clearpage
+\if@uvp@short\else\clearpage\fi
\global\let\and\relax
}
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls
index bb54e614ae..d2b68940af 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls
@@ -33,8 +33,8 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}[1997/06/01]
-\ProvidesClass{univie-ling-poster}[2023/03/31 v.2.4 Univie Ling poster class (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesClass{univie-ling-poster}[2024/05/09 v.2.5 Univie Ling poster class (JSp)]
%% ============================================================
%% CLASS OPTIONS
@@ -76,10 +76,8 @@
}
\uvpt@cd@german
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uvpt }
+% Define keys and values
+\DeclareKeys[uvpt]
{
% all=<true|false>
% Load all (most) packages
@@ -223,17 +221,9 @@
\@uvpt@otffontsfalse
},
}
-\ExplSyntaxOff
% Process
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uvpt]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uvpt}
-}
+\ProcessKeyOptions[uvpt]
%% ============================================================
@@ -942,13 +932,61 @@
\fi
%% ============================================================
-%% Semantic markup
+%% SEMANTIC MARKUP:
%% ============================================================
\newcommand\Expression[1]{\textit{#1}}
\newcommand\Concept[1]{\textsc{#1}}
\newcommand\Meaning[1]{\enquote*{#1}}
+%% ============================================================
+%% ACCESSIBILITY:
+%% ============================================================
+
+% Helper function that reports on the remaining space on the poster
+% as of the point where the command has been entered
+\RequirePackage{tikzpagenodes}
+\usetikzlibrary{calc}
+
+\newcommand*\restspace[1][]{%
+ \begin{tikzpicture}[overlay,remember picture]
+ \node (cp) at (current page text area.south west) {};%
+ \path let \p0 = (0,0), \p1 = (cp.north) in node [inner sep=0pt,outer sep=0pt,anchor=south] at (\x1,\y1)%
+ {%
+ \pgfmathsetmacro\restheight{((\y0-\y1) / \baselineskip) + 1}%
+ \pgfkeys{/pgf/number format/precision=1}%
+ \pgfmathroundto{\restheight}%
+ \ifx#1\empty%
+ \edef\univie@space@warning{Remaining space: \pgfmathresult\space normal lines}%
+ \else%
+ \edef\univie@space@warning{Remaining space (#1): \pgfmathresult\space normal lines}%
+ \fi%
+ \let\firstpgfmathresult\pgfmathresult%
+ \pgfmathparse{\pgfmathresult > 0}%
+ \def\univie@tmpa{0}%
+ \ifx\pgfmathresult\univie@tmpa%
+ \pgfmathparse{\firstpgfmathresult > -1}%
+ \ifx\pgfmathresult\univie@tmpa%
+ \def\univie@space@expl{\univie@space@warning\MessageBreak
+ Text exceeds poster! You need to re-arrange the content.}%
+ \else%
+ \def\univie@space@expl{It is still OK, but the poster is quite full\MessageBreak
+ Better take out at least one line here.}%
+ \fi%
+ \else%
+ \pgfmathparse{\firstpgfmathresult > 1}%
+ \ifx\pgfmathresult\univie@tmpa%
+ \def\univie@space@expl{All good, but this is full now.}%
+ \else
+ \def\univie@space@expl{Good, still space left!}%
+ \fi
+ \fi%
+ \PackageWarning{univie-ling-poster}{\univie@space@warning\MessageBreak
+ \univie@space@expl}%
+ };%
+ \end{tikzpicture}%
+}
+
\endinput
%%
%% End of file `univie-ling-poster.cls'.
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls
index 87bd736880..bfe9204471 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls
@@ -32,16 +32,14 @@
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{univie-ling-thesis}[2023/03/31 v.2.4 Univie Linguistic Theses (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesPackage{univie-ling-thesis}[2024/05/09 v.2.5 Univie Linguistic Theses (JSp)]
%% ============================================================
%% CLASS OPTIONS
%% ============================================================
-\RequirePackage{xkeyval}
-
\newif\if@uvt@apa\@uvt@apafalse
\newif\if@uvt@biblatex\@uvt@biblatextrue
\newif\if@uvt@captionp\@uvt@captionptrue
@@ -59,10 +57,8 @@
\newif\if@uvt@usefontenc\@uvt@usefontenctrue
\def\uvt@fontenc{T1}
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uvt }
+% Define keys and values
+\DeclareKeys[uvt]
{
% all=<true|false>
% Load all (most) packages
@@ -180,17 +176,10 @@
\@uvt@otffontsfalse
},
}
-\ExplSyntaxOff
% Process
+\ProcessKeyOptions[uvt]
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uvt]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uvt}
-}
%% ============================================================
%% BASE CLASS:
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg b/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg
index 6698cb693e..2c00101fc9 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg
@@ -3,14 +3,12 @@
%
%
-% Editorial Board
+% Editorial
%
-% General Linguistics
-\edboardGL{Markus P\"ochtrager}
-% Applied Linguistics
-\edboardAL{Mi-Cha Flubacher, Florian Grosser \& Carina Lozo}%
-% Historical Linguistics
-\edboardHL{Stefan Schumacher}
+% Editors
+\jeditors{Florian Grosser, Jonas Hassemer \& Carina Lozo}%
+% Editorial Board
+\jedboard{Markus P\"ochtrager \& Stefan Schumacher}
%
% Technical Board
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls
index d5a399fec8..0bdf4b8552 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls
@@ -33,8 +33,8 @@
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{univie-ling-wlg}[2023/03/31 v.2.4 Univie WLG journal layout (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesPackage{univie-ling-wlg}[2024/05/09 v.2.5 Univie WLG journal layout (JSp)]
%% ============================================================
@@ -50,10 +50,8 @@
\newif\if@wlg@specialprint\@wlg@specialprintfalse
\newif\if@wlg@review\@wlg@reviewfalse
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { wlg }
+% Define keys and values
+\DeclareKeys[wlg]
{
% biblatex=<true|false>
% Load biblatex
@@ -125,16 +123,8 @@
% no val equals to true
draftmark .default:n = {true},
}
-\ExplSyntaxOff
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[wlg]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{wlg}
-}
+\ProcessKeyOptions[wlg]
%% ============================================================
@@ -164,6 +154,10 @@
%% CONFIGURATION:
%% ============================================================
+% Current structure
+\newcommand*\jedboard[1]{\def\wlg@jedboard{#1}}
+\newcommand*\jeditors[1]{\def\wlg@jeditors{#1}}
+% Old structure
\newcommand*\edboardAL[1]{\def\wlg@edboardAL{#1}}
\newcommand*\edboardGL[1]{\def\wlg@edboardGL{#1}}
\newcommand*\edboardHL[1]{\def\wlg@edboardHL{#1}}
@@ -293,6 +287,10 @@
\deftranslation[to=English]{univie-address}{Sensengasse 3a\\1090 Vienna\\Austria}
\deftranslation[to=German]{edboard}{Redaktion}
\deftranslation[to=English]{edboard}{Editorial board}
+\deftranslation[to=German]{jeditors}{Redaktion}
+\deftranslation[to=English]{jeditors}{Editors}
+\deftranslation[to=German]{jedboard}{Redaktioneller Beirat}
+\deftranslation[to=English]{jedboard}{Editorial board}
\deftranslation[to=German]{techboard}{Technische Redaktion}
\deftranslation[to=English]{techboard}{Technical editor}
\deftranslation[to=German]{contact}{Kontakt}
@@ -341,12 +339,13 @@
\translate{univie}, \translate{lingdep}\\
\translate{univie-address}
\vspace*{-.5em}
-\begin{labeling}{\textbf{\translate{edboard}:}}
+\begin{labeling}{\textbf{\translate{jedboard}:}}
\setlength\itemsep{0pt}
\setlength\parsep{0pt}
\setlength{\parskip}{0pt}
\def\wlg@lb{}
-\item[\textbf{\translate{edboard}:}]
+\ifcsname wlg@edboardAL\endcsname
+ \item[\textbf{\translate{edboard}:}]
\ifcsname wlg@edboardGL\endcsname
\wlg@edboardGL\ (\translate{general}),%
\def\wlg@lb{\\}%
@@ -358,6 +357,16 @@
\ifcsname wlg@edboardHL\endcsname
\wlg@lb\wlg@edboardHL\ (\translate{hist})
\fi
+\else
+ \ifcsname wlg@jeditors\endcsname
+ \item[\textbf{\translate{jeditors}:}]
+ \wlg@jeditors%
+ \fi
+ \ifcsname wlg@jedboard\endcsname
+ \item[\textbf{\translate{jedboard}:}]
+ \wlg@lb\wlg@jedboard%
+ \fi
+\fi
\ifcsname wlg@techboard\endcsname
\item[\textbf{\translate{techboard}:}] \wlg@techboard
\fi
diff --git a/macros/latex/contrib/ximera/LICENSE b/macros/latex/contrib/ximera/LICENSE
new file mode 100644
index 0000000000..4db9b5af29
--- /dev/null
+++ b/macros/latex/contrib/ximera/LICENSE
@@ -0,0 +1,415 @@
+The LaTeX Project Public License
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+LPPL Version 1.3c 2008-05-04
+
+Copyright 1999 2002-2008 LaTeX3 Project
+ Everyone is allowed to distribute verbatim copies of this
+ license document, but modification of it is not allowed.
+
+
+PREAMBLE
+========
+
+The LaTeX Project Public License (LPPL) is the primary license under
+which the LaTeX kernel and the base LaTeX packages are distributed.
+
+You may use this license for any work of which you hold the copyright
+and which you wish to distribute. This license may be particularly
+suitable if your work is TeX-related (such as a LaTeX package), but
+it is written in such a way that you can use it even if your work is
+unrelated to TeX.
+
+The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE',
+below, gives instructions, examples, and recommendations for authors
+who are considering distributing their works under this license.
+
+This license gives conditions under which a work may be distributed
+and modified, as well as conditions under which modified versions of
+that work may be distributed.
+
+We, the LaTeX3 Project, believe that the conditions below give you
+the freedom to make and distribute modified versions of your work
+that conform with whatever technical specifications you wish while
+maintaining the availability, integrity, and reliability of
+that work. If you do not see how to achieve your goal while
+meeting these conditions, then read the document `cfgguide.tex'
+and `modguide.tex' in the base LaTeX distribution for suggestions.
+
+
+DEFINITIONS
+===========
+
+In this license document the following terms are used:
+
+ `Work'
+ Any work being distributed under this License.
+
+ `Derived Work'
+ Any work that under any applicable law is derived from the Work.
+
+ `Modification'
+ Any procedure that produces a Derived Work under any applicable
+ law -- for example, the production of a file containing an
+ original file associated with the Work or a significant portion of
+ such a file, either verbatim or with modifications and/or
+ translated into another language.
+
+ `Modify'
+ To apply any procedure that produces a Derived Work under any
+ applicable law.
+
+ `Distribution'
+ Making copies of the Work available from one person to another, in
+ whole or in part. Distribution includes (but is not limited to)
+ making any electronic components of the Work accessible by
+ file transfer protocols such as FTP or HTTP or by shared file
+ systems such as Sun's Network File System (NFS).
+
+ `Compiled Work'
+ A version of the Work that has been processed into a form where it
+ is directly usable on a computer system. This processing may
+ include using installation facilities provided by the Work,
+ transformations of the Work, copying of components of the Work, or
+ other activities. Note that modification of any installation
+ facilities provided by the Work constitutes modification of the Work.
+
+ `Current Maintainer'
+ A person or persons nominated as such within the Work. If there is
+ no such explicit nomination then it is the `Copyright Holder' under
+ any applicable law.
+
+ `Base Interpreter'
+ A program or process that is normally needed for running or
+ interpreting a part or the whole of the Work.
+
+ A Base Interpreter may depend on external components but these
+ are not considered part of the Base Interpreter provided that each
+ external component clearly identifies itself whenever it is used
+ interactively. Unless explicitly specified when applying the
+ license to the Work, the only applicable Base Interpreter is a
+ `LaTeX-Format' or in the case of files belonging to the
+ `LaTeX-format' a program implementing the `TeX language'.
+
+
+
+CONDITIONS ON DISTRIBUTION AND MODIFICATION
+===========================================
+
+1. 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.
+
+2. 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.
+
+3. You may distribute a Compiled Work that has been generated from a
+complete, unmodified copy of the Work as distributed under Clause 2
+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.
+
+4. 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.
+
+5. 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.
+
+6. 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. 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.
+
+ b. 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.
+
+ c. 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.
+
+ d. You distribute at least one of the following with the Derived Work:
+
+ 1. 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;
+
+ 2. Information that is sufficient to obtain a complete,
+ unmodified copy of the Work.
+
+7. 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 6, above, are met with
+regard to the Derived Work.
+
+8. 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 4, above.
+
+9. 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.
+
+10. a. A Derived Work may be distributed under a different license
+ provided that license itself honors the conditions listed in
+ Clause 6 above, in regard to the Work, though it does not have
+ to honor the rest of the conditions in this license.
+
+ b. 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 6 above, concerning changes from the Work.
+
+11. 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.
+
+12. Nothing in this license is intended to, or may be used to, prevent
+complete compliance by all parties with all applicable laws.
+
+
+NO WARRANTY
+===========
+
+There is no warranty for the Work. Except when otherwise stated in
+writing, the Copyright Holder provides the Work `as is', without
+warranty of any kind, either expressed or implied, including, but not
+limited to, the implied warranties of merchantability and fitness for a
+particular purpose. The entire risk as to the quality and performance
+of the Work is with you. Should the Work prove defective, you assume
+the cost of all necessary servicing, repair, or correction.
+
+In no event unless required by applicable law or agreed to in writing
+will The Copyright Holder, or any author named in the components of the
+Work, or any other party who may distribute and/or modify the Work as
+permitted above, be liable to you for damages, including any general,
+special, incidental or consequential damages arising out of any use of
+the Work or out of inability to use the Work (including, but not limited
+to, loss of data, data being rendered inaccurate, or losses sustained by
+anyone as a result of any failure of the Work to operate with any other
+programs), even if the Copyright Holder or said author or said other
+party has been advised of the possibility of such damages.
+
+
+MAINTENANCE OF THE WORK
+=======================
+
+The Work has the status `author-maintained' if the Copyright Holder
+explicitly and prominently states near the primary copyright notice in
+the Work that the Work can only be maintained by the Copyright Holder
+or simply that it is `author-maintained'.
+
+The Work has the status `maintained' if there is a Current Maintainer
+who has indicated in the Work that they are willing to receive error
+reports for the Work (for example, by supplying a valid e-mail
+address). It is not required for the Current Maintainer to acknowledge
+or act upon these error reports.
+
+The Work changes from status `maintained' to `unmaintained' if there
+is no Current Maintainer, or the person stated to be Current
+Maintainer of the work cannot be reached through the indicated means
+of communication for a period of six months, and there are no other
+significant signs of active maintenance.
+
+You can become the Current Maintainer of the Work by agreement with
+any existing Current Maintainer to take over this role.
+
+If the Work is unmaintained, you can become the Current Maintainer of
+the Work through the following steps:
+
+ 1. 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.
+
+ 2. If this search is successful, then enquire whether the Work
+ is still maintained.
+
+ a. If it is being maintained, then ask the Current Maintainer
+ to update their communication data within one month.
+
+ b. 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 comp.text.tex.)
+
+ 3a. If the Current Maintainer is reachable and agrees to pass
+ maintenance of the Work to you, then this takes effect
+ immediately upon announcement.
+
+ b. 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.
+
+ 4. If you make an `intention announcement' as described in 2b. 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.
+
+ 5. If the previously unreachable Current Maintainer becomes
+ reachable once more within three months of a change completed
+ under the terms of 3b) or 4), then that Current Maintainer must
+ become or remain the Current Maintainer upon request provided
+ they then update their communication data within one month.
+
+A change in the Current Maintainer does not, of itself, alter the fact
+that the Work is distributed under the LPPL license.
+
+If you become the Current Maintainer of the Work, you should
+immediately provide, within the Work, a prominent and unambiguous
+statement of your status as Current Maintainer. You should also
+announce your new status to the same pertinent community as
+in 2b) above.
+
+
+WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE
+======================================================
+
+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.
+
+Choosing This License or Another License
+----------------------------------------
+
+If for any part of your work you want or need to use *distribution*
+conditions that differ significantly from those in this license, then
+do not refer to this license anywhere in your work but, instead,
+distribute your work under a different license. You may use the text
+of this license as a model for your own license, but your license
+should not refer to the LPPL or otherwise give the impression that
+your work is distributed under the LPPL.
+
+The document `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 GNU General Public
+License (GPL) was considered inappropriate. Even if your work is
+unrelated to LaTeX, the discussion in `modguide.tex' may still be
+relevant, and authors intending to distribute their works under any
+license are encouraged to read it.
+
+A Recommendation on Modification Without Distribution
+-----------------------------------------------------
+
+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.
+
+How to Use This License
+-----------------------
+
+To use this license, place in each of the components of your work both
+an explicit copyright notice including your name and the year the work
+was authored and/or last substantially modified. Include also a
+statement that the distribution and/or modification of that
+component is constrained by the conditions in this license.
+
+Here is an example of such a notice and statement:
+
+ %% 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.
+
+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 `pig.dtx', `pig.ins', and `pig.sty' (the last being
+generated from `pig.dtx' using `pig.ins'), the `Base Interpreter'
+referring to any `LaTeX-Format', and both `Copyright Holder' and
+`Current Maintainer' referring to the person `M. Y. Name'.
+
+If you do not want the Maintenance section of LPPL to apply to your
+Work, change `maintained' above into `author-maintained'.
+However, we recommend that you use `maintained', as the Maintenance
+section was added in order to ensure that your Work remains useful to
+the community even when you can no longer maintain and support it
+yourself.
+
+Derived Works That Are Not Replacements
+---------------------------------------
+
+Several clauses of the LPPL specify means to provide reliability and
+stability for the user community. They therefore concern themselves
+with the case that a Derived Work is intended to be used as a
+(compatible or incompatible) replacement of the original Work. If
+this is not the case (e.g., if a few lines of code are reused for a
+completely different task), then clauses 6b and 6d shall not apply.
+
+
+Important Recommendations
+-------------------------
+
+ Defining What Constitutes the Work
+
+ The LPPL requires that distributions of the Work contain all the
+ files of the Work. It is therefore important that you provide a
+ way for the licensee to determine which files constitute the Work.
+ This could, for example, be achieved by explicitly listing all the
+ files of the Work near the copyright notice of each file or by
+ using a line such as:
+
+ % This work consists of all files listed in manifest.txt.
+
+ 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.
diff --git a/macros/latex/contrib/ximera/Makefile b/macros/latex/contrib/ximera/Makefile
new file mode 100644
index 0000000000..dd9c367745
--- /dev/null
+++ b/macros/latex/contrib/ximera/Makefile
@@ -0,0 +1,50 @@
+NAME = ximera
+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)
+INPUTS = $(wildcard src/*.dtx) $(wildcard src/interactives/*.dtx) $(NAME).dtx
+OUTPUTS = ximera.cls xourse.cls ximera.4ht xourse.4ht ximera.cfg
+
+# based on
+#
+# https://stackoverflow.com/questions/2973445/gnu-makefile-rule-generating-a-few-targets-from-a-single-source-file
+#
+# I use a silly pattern rule to convince GNU make that multiple
+# outputs are created with a single invocation
+
+all: $(NAME).pdf $(OUTPUTS)
+ test -e README.txt && mv README.txt README || exit 0
+
+$(NAME)%pdf ximera%cls xourse%cls ximera%4ht xourse%4ht ximera%cfg: $(INPUTS)
+ pdflatex -shell-escape -recorder -interaction=batchmode $(NAME).dtx >/dev/null
+ 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
+ pdflatex --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
+ pdflatex --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
+
+clean:
+ rm -f $(NAME).{aux,fls,glo,gls,hd,idx,ilg,ind,ins,log,out}
+
+distclean: clean
+ rm -f ximera.pdf README $(OUTPUTS)
+
+# BADBAD: The code below still needs to be fixed
+
+inst: all
+ mkdir -p $(UTREE)/{tex,source,doc}/latex/$(NAME)
+ cp $(NAME).dtx $(UTREE)/source/latex/$(NAME)
+ cp $(NAME).cls $(UTREE)/tex/latex/$(NAME)
+ cp $(NAME).pdf $(UTREE)/doc/latex/$(NAME)
+
+install: all
+ sudo mkdir -p $(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 $(LOCAL)/doc/latex/$(NAME)
+
+zip: all
+ ln -sf . $(NAME)
+ zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME)/{README,$(NAME).{pdf,dtx}}
+ rm $(NAME)
diff --git a/macros/latex/contrib/ximera/README b/macros/latex/contrib/ximera/README
new file mode 100644
index 0000000000..26b91f193f
--- /dev/null
+++ b/macros/latex/contrib/ximera/README
@@ -0,0 +1,18 @@
+|
+------------:| ------------------------------------------------------------
+ ximera:| Simultaneously write print and online interactive materials
+ Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+ E-mail:| bart.snapp@gmail.com
+ License:| Released under the LaTeX Project Public License v1.3c or later
+ See:| http://www.latex-project.org/lppl.txt
+
+Short description:
+Some text about the class: probably the same as the abstract.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
diff --git a/macros/latex/contrib/ximera/README.md b/macros/latex/contrib/ximera/README.md
new file mode 100644
index 0000000000..73dddcbcfc
--- /dev/null
+++ b/macros/latex/contrib/ximera/README.md
@@ -0,0 +1,62 @@
+Greetings! [![Build Status](https://travis-ci.org/XimeraProject/ximeraLatex.svg?branch=master)](https://travis-ci.org/XimeraProject/ximeraLatex)
+==========
+
+In this repository, we hope to supply potential authors of Ximera
+activities with the LaTeX document classes they need to write Ximera
+documents.
+
+To install the XimeraLaTeX package, see:
+
+[Installing Locally](./installingLocally.md)
+
+For a list of different Ximera commands, see:
+
+[Examples of Ximera Envrionments](https://ximera.osu.edu/tester/exampleActivityCollection)
+
+
+Since Ximera is built on LaTeX source, we want to use LaTeX as a
+method of validating the code authors write. Hence, if you want to
+write a Ximera online activity, the first step is constructing LaTeX
+documents.
+
+Once you have the LaTeX documents, and you have checked them for
+typos, accuracy, etc, the fact that they compile should be reasonable
+evidence that they will display correctly in Ximera.
+
+
+
+Contents of the repository
+---------------------------
+
+* This README.md file.
+
+* The GNU license.
+
+* The Ximera document class, ximera.cls
+
+* The Xourse document class, xourse.cls
+
+* Documentation for the document classes above, ximeraLaTeX.pdf
+
+* The Ximera documented LaTeX file type, ximera.dtx. This file
+ generates ximera.cls, xourse.cls, and ximeraLaTeX.pdf, as well as a
+ few other files.
+
+
+Staying up-to-date
+------------------
+
+While we hope to solidify the ximera.cls file, at this point we are
+still in development stages.
+
+To keep your file up-to-date, you may need to periodically sync or
+pull the the ximera.cls within the ximeraLatex directory.
+
+`ximeraLatex$ git fetch --all`
+
+`ximeraLatex$ git reset --hard origin/master`
+
+will reset your ximeraLatex directory. Note it will also overwrite
+*any* modifications you have made in this directory. You should not be
+building your activities in this directory.
+
diff --git a/macros/latex/contrib/ximera/installingLocally.md b/macros/latex/contrib/ximera/installingLocally.md
new file mode 100644
index 0000000000..7c1005e108
--- /dev/null
+++ b/macros/latex/contrib/ximera/installingLocally.md
@@ -0,0 +1,91 @@
+# Installing Locally
+
+To get started as an author in Ximera, all you need is the XimeraLaTeX
+LaTeX Package. Unfortunately, at this point, this package is not part
+of CTAN. However, you can install it manually with the instructions
+below. Please feel free to contact Bart Snapp with questions
+(snapp.14@osu.edu).
+
+1. Get a GitHub account
+2. Go to: [XimeraLaTeX on GitHub](https://github.com/XimeraProject/ximeraLatex)
+3. Click on the green code button: ![Click on the green code button.](https://github.com/XimeraProject/.github/blob/main/profile/codeButton.png "Click on the green code button.") and copy the code, (or just copy: `git@github.com:XimeraProject/ximeraLatex.git`)
+4. Clone the repository.
+
+At this point the installation becomes operating-system specific.
+
+## Linux
+
+If you are running linux, create the local directory structure `~/texmf/tex/latex`
+
+├── texmf
+
+├───└── tex
+
+└───────└── latex
+
+Now move the `ximeraLatex` folder (cloned in step 4. above) into the latex folder. At this point you have installed XimeraLaTeX! You can test your installation by compiling:
+```
+\documentclass{ximera}
+\begin{document}
+\begin{problem}
+Hello $\answer[format=string]{World}$
+\end{problem}
+\end{document}
+```
+
+## MacOS
+
+If you are running MacOS, create the local directory structure `~/Library/texmf/tex/latex`. To do this, you'll need to make your Library folder visible, see [How to make your Library folder visible in the Finder](http://kb.mit.edu/confluence/display/istcontrib/How+to+make+your+Library+folder+visible+in+the+Finder+in+OS+X+10.9+%28Mavericks%29+or+later).
+
+├── Library
+
+├───└── texmf
+
+├───────└── tex
+
+└───────────└── latex
+
+Now move the `ximeraLatex` folder (cloned in step 4. above) into the latex folder. At this point you have installed XimeraLaTeX! You can test your installation by compiling:
+```
+\documentclass{ximera}
+\begin{document}
+\begin{problem}
+Hello $\answer[format=string]{World}$
+\end{problem}
+\end{document}
+```
+
+
+## Windows
+
+If you are running Windows, create the local directory structure `C:\localtexmf\tex\latex\`
+
+├── C:
+
+├───└── localtexmf
+
+├───────└── tex
+
+└───────────└── latex
+
+Now move the `ximeraLatex` folder (cloned in step 4. above) into the latex folder.
+
+For MiKteX to notice this directory, go to:
+
+* Start → All programs → MiKTeX Folder → Maintenance (Admin) Folder → Settings (Admin).
+* Now select the tab “Roots.”
+* Click “Add” because you are going to add a path.
+* Find `C:\localtexmf\` and click “OK.”
+* Click “apply” then “OK.”
+* Reopen Miktex Settings (Admin). Click **Refresh FNDB.**
+
+The steps above will vary between systems. However, the key steps are **adding the path** and **Refreshing FNDB.**
+At this point you have installed XimeraLaTeX! You can test your installation by compiling:
+```
+\documentclass{ximera}
+\begin{document}
+\begin{problem}
+Hello $\answer[format=string]{World}$
+\end{problem}
+\end{document}
+```
diff --git a/macros/latex/contrib/ximera/pgfsys-ximera.def b/macros/latex/contrib/ximera/pgfsys-ximera.def
new file mode 100644
index 0000000000..ffa3205304
--- /dev/null
+++ b/macros/latex/contrib/ximera/pgfsys-ximera.def
@@ -0,0 +1,62 @@
+%%
+%% This is file `pgfsys-ximera.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ximera.dtx (with options: `pgfsys')
+%% src/pgfsys.dtx (with options: `pgfsys')
+%% ------------:| ------------------------------------------------------------
+%% ximera:| Simultaneously writing print and online interactive materials
+%% Author:| Jim Fowler and Oscar Levin and Jason Nowell and Hans Parshall and Bart Snapp
+%% E-mail:| bart.snapp@gmail.com
+%% License:| Released under the LaTeX Project Public License v1.3c or later
+%% See:| http://www.latex-project.org/lppl.txt
+%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\ProvidesFileRCS{pgfsys-ximera.def}
+
+\input pgfsys-dvisvgm.def
+
+\def\pgfsys@beginpicture{%
+ \special{color push gray 0}% make dvisvgm *not* add anything to text
+ \pgf@sys@svg@inpicturetrue% in a picture
+ \pgfsys@svg@boxmodefalse%
+ \special{dvisvgm:beginpicture}
+ \pgfsys@invoke{<g \ifx\pgf@sys@svg@last@stroke\relax\else
+ stroke="\pgf@sys@svg@last@stroke" \fi stroke-miterlimit="10" transform="scale(1,-1)">}}
+
+\def\pgfsys@endpicture{\pgfsys@invoke{</g>}\special{dvisvgm:endpicture}\special{color pop}}
+
+%%
+%% Copyright (C) 2018-2021 by Bart Snapp <bart.snapp@gmail.com> and Jim Fowler <kisonecat@gmail.com>
+%%
+%% 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
+%% Bart Snapp. The source code can be found at:
+%%
+%% https://github.com/XimeraProject/ximeraLatex
+%%
+%% This work consists of the file ximera.dtx, the associated files
+%% under src/, and a Makefile.
+%%
+%% Running "make" generates the derived files README, ximera.pdf, ximera.cls, xourse.cls.
+%%
+%% Running "make inst" installs the files in the user's TeX tree.
+%%
+%% Running "make install" installs the files in the local TeX tree.
+%%
+%%
+%% End of file `pgfsys-ximera.def'.
diff --git a/macros/latex/contrib/ximera/src/abstract.dtx b/macros/latex/contrib/ximera/src/abstract.dtx
new file mode 100644
index 0000000000..2a895568d3
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/abstract.dtx
@@ -0,0 +1,14 @@
+% \subsubsection{Abstract}
+% \DescribeEnv{abstract}{Every activity should include a short abstract.}
+% \begin{macrocode}
+%<*classXimera>
+\let\abstract\relax
+\let\endabstract\relax
+% Use of environ package, may want to find a better way.
+\NewEnviron{abstract}{\protected@xdef\theabstract{\BODY}}
+%</classXimera>
+% \end{macrocode}
+% The abstract has been stored in |\theabstract| and should be emitted
+% as a div, but confusingly I guess |<div class="abstract">| is
+% defined somewhere deeper inside tex4ht, so the code below is
+% probably unnecessary. \ No newline at end of file
diff --git a/macros/latex/contrib/ximera/src/activity.dtx b/macros/latex/contrib/ximera/src/activity.dtx
new file mode 100644
index 0000000000..647be0565d
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/activity.dtx
@@ -0,0 +1,158 @@
+% \subsection{Activities}
+% The core of the |xourse| system. It works by redefining the
+% |document| environment, thus making the |\begin| and
+% |\end{document}| of the subfile `transparent' to the
+% inclusion. The redefinition of |\documentclass| is analogous, just
+% having a required and an optional arguments which mean nothing to
+% |\subfile|.
+% \begin{macrocode}
+%<*classXourse>
+\newcommand{\skip@preamble}{%
+ \let\document\relax\let\enddocument\relax%
+ \newenvironment{document}{\let\input\otherinput}{}%
+ \renewcommand{\documentclass}[2][subfiles]{}}
+% \end{macrocode}
+% Note that the new command |\subfile| calls for |\skip@preamble| \emph{within a group}. The changes to |document| and |\documentclass| are undone after the inclusion of the subfile.
+%
+% Numbering starts a page too soon without this:
+% \begin{macrocode}
+\let\otherinput\input
+% \end{macrocode}
+% Store usual |\maketitle| as |\othermaketitle|
+% \begin{macrocode}
+\let\othermaketitle\maketitle
+% \end{macrocode}
+% \DescribeMacro{\maketitle}{In a \textsf{xourse} file, |\maketitle| is redefined to give course packet title page and toc.}
+% \begin{macrocode}
+\renewcommand{\maketitle}{ %
+\pagestyle{empty}
+\begin{center}
+~\\ %puts space at top of page to move title down.
+\vskip .25\textheight
+\hrulefill\\
+\vskip 1em
+\bfseries{\Huge \@title} \\
+\hrulefill\\
+\vskip 3em
+{\Large \@author}
+\vskip 2em
+{\large \@date}
+\end{center}
+\clearpage
+% \end{macrocode}
+% When |notoc| option is used, we do not include a table of contents.
+% Otherwise we include a table of contents in every course packet.
+% \begin{macrocode}
+\ifnotoc
+\else
+ \tableofcontents\clearpage
+ \clearpage
+\fi
+% \end{macrocode}
+% Switch to main pagestyle, just like a document with documentclass \textsf{ximera}.
+% \begin{macrocode}
+\pagestyle{main}
+% \end{macrocode}
+% Renew maketitle to usual definition.
+% \begin{macrocode}
+\let\maketitle\othermaketitle
+% \end{macrocode}
+% And we finish with our redefinition of |\maketitle|.
+% \begin{macrocode}
+}
+\relax
+%</classXourse>
+% \end{macrocode}
+
+% \subsubsection{Regular activities}
+% \DescribeMacro{\activity}{Documents included with |\activity| will
+% be included in the body of the xourse document. Any |\input|
+% commands within included \textsf{ximera} documents will be ignored.
+% Any |\usepackage| commands within included ximera documents will
+% cause an error. Overlapping |\newcommand| definitions within
+% multiple ximera documents included simultaneously will cause an
+% error.} The |\activity| command inputs the file name provided
+% without |\documentclass|, without
+% |\begin{document}|/|\end{document}| and without any inputs in the
+% preamble of the included file.
+% \begin{macrocode}
+%<*classXourse>
+\ifnonewpage
+\newcommand{\activity}[2][]{%
+ \setkeys{activity}{#1}
+ \renewcommand{\input}[1]{}
+ \begingroup\skip@preamble\otherinput{#2}\endgroup\par\vspace{\topsep}
+ \let\input\otherinput}
+\else
+\newcommand{\activity}[2][]{%
+ \setkeys{activity}{#1}
+ \renewcommand{\input}[1]{}
+ \begingroup\skip@preamble\otherinput{#2}\endgroup\clearpage
+ \let\input\otherinput}
+\fi
+\relax
+%</classXourse>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXourse>
+\renewcommand\activity[2][]{%
+\ifvmode \IgnorePar\fi \EndP\HCode{<a class="activity card \activitystyle" href="#2" data-options="#1">#2</a>}\IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
+
+% When running xake, we can just ignore activities
+% \begin{macrocode}
+%<*classXourse>
+\ifxake
+\renewcommand\activity[2][]{}
+\fi
+%</classXourse>
+% \end{macrocode}
+
+
+% \subsubsection{Practice activities}
+% \DescribeMacro{\practice}{Like |\activity| but not expecting a title.}
+% \begin{macrocode}
+%<*classXourse>
+\ifhandout
+\newcommand{\practice}[2][]{
+ \setkeys{practice}{#1}%!!!!!
+ \renewcommand{\input}[1]{}
+ \begingroup\skip@preamble\otherinput{#2}\endgroup
+ \let\input\otherinput}
+\else
+\newcommand{\practice}[2][]{\texttt{\detokenize{#2}}%% gives file name for practice
+ \setkeys{practice}{#1}%!!!!!
+ \renewcommand{\input}[1]{}
+ \begingroup\skip@preamble\otherinput{#2}\endgroup
+ \let\input\otherinput}
+\fi
+\relax
+%</classXourse>
+% \end{macrocode}
+
+% The practice environment does nothing, but will eventually produce
+% exercises at the end of an activity
+% \begin{macrocode}
+%<*classXourse>
+\ifxake
+\renewcommand\practice[2][]{}
+\fi
+%</classXourse>
+% \end{macrocode}
+
+% I suppose it is reasonable for practice cards to NOT have an activitystyle, since the activitystyle is basically PRACTICE.
+% \begin{macrocode}
+%<*htXourse>
+\renewcommand\practice[2][]{%
+ \ifvmode\IgnorePar\fi\EndP%
+ \HCode{<a class="activity card practice" href="#2" data-options="#1">#2</a>}%
+ \IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
+
+
+
diff --git a/macros/latex/contrib/ximera/src/answer.dtx b/macros/latex/contrib/ximera/src/answer.dtx
new file mode 100644
index 0000000000..c6f5460d05
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/answer.dtx
@@ -0,0 +1,111 @@
+% \subsubsection{Answers}
+% \DescribeMacro{\answer}{A math answer}
+% \begin{macrocode}
+%<*classXimera>
+
+\ifdefined\HCode
+\newcommand{\recordvariable}[1]{}
+\else
+\newwrite\idfile
+\immediate\openout\idfile=\jobname.ids
+\newcommand{\recordvariable}[1]{\ifthenelse{\equal{#1}{}}{}{\immediate\write\idfile{var #1;}}}
+\fi
+% \end{macrocode}
+% Determines if answer is shown in handout mode. when |given=true|,
+% show answer in handout mode, show answer in ``given box'' outside
+% handout mode. When |given=false|, do not show answer in handout
+% mode, show answer outside handout mode
+% \begin{macrocode}
+\define@key{answer}{given}[true]{\def\ans@given{#1}}
+% \end{macrocode}
+% Used for setting numeric answer tolerance for online student input.
+% \begin{macrocode}
+\define@key{answer}{tolerance}{\def\ans@tol{#1}}
+% \end{macrocode}
+% Used to run dynamic js code on student provided answers. Note:
+% currently pdf outputs the validator code itself.
+% \begin{macrocode}
+\define@key{answer}{validator}{}
+% \end{macrocode}
+% Used for assigning a js ID to answer for dynamic code (eg validators).
+% \begin{macrocode}
+\define@key{answer}{id}{\def\ans@id{#1}}
+% \end{macrocode}
+% Used to set anticipated input format; eg "string".
+% \begin{macrocode}
+\define@key{answer}{format}{}
+% \end{macrocode}
+% Used to hide the answer input box on the web.
+% \begin{macrocode}
+\define@key{answer}{onlinenoinput}[false]{}
+% \end{macrocode}
+% Used to add a `show answer' button to the answer blank.
+% \begin{macrocode}
+\define@key{answer}{onlineshowanswerbutton}[false]{}
+% \end{macrocode}
+% Set default values for |\answer| command |key=value| pairs.
+% Default values are |given = false|.
+% \begin{macrocode}
+\setkeys{answer}{id=,given=false,onlinenoinput=false,onlineshowanswerbutton=false}
+% \end{macrocode}
+% Basic code for |\answer|.
+% \begin{macrocode}
+
+% Options for handout
+\newcommand{\answerFormatLength}{2cm}
+
+\newcommand{\answerFormatDots}[1]{\ldots\ldots}
+\newcommand{\answerFormatLine}[1]{\protect\rule{\answerFormatLength}{0.4pt}}
+\newcommand{\answerFormatFlexibleLine}[1]{\protect\rule{\widthof{$#1$}*2}{0.4pt}}
+\newcommand{\answerFormatFlexibleBox}[1]{\fbox{\scalebox{2}{\phantom{$#1$}}}}
+
+% options for default (i.e with answers filled in)
+\newcommand{\answerFormatPlain}[1]{\ensuremath{#1}}
+\newcommand{\answerFormatBlue}[1]{\color{blue}\ensuremath{#1}}
+\newcommand{\answerFormatBoxed}[1]{\fbox{\ensuremath{#1}}}
+\newcommand{\answerFormatBoxedGiven}[1]{\underset{\scriptstyle\mathrm{given}}{\fbox{\ensuremath{#1}}}}
+
+% defaults for handout and default mode, and for \answer[given]
+\let\handoutAnswerFormat\answerFormatDots
+\let\defaultAnswerFormat\answerFormatBlue
+\let\givenAnswerFormat\answerFormatBoxedGiven
+
+\newcommand{\answer}[2][]{%
+ \ifmmode%
+ \setkeys{answer}{#1}%
+ \recordvariable{\ans@id}
+ \ifthenelse{\boolean{\ans@given}}
+ {% Start then statement
+ \ifhandout
+ #2
+ \else
+ \givenAnswerFormat{#2} %% in case the argument helps formatting
+ \fi
+ }% End then statement
+ {% Start else statement
+ \ifhandout
+ \handoutAnswerFormat{#2} %% in case the argument helps formatting
+ \else% show answer in box outside handout mode
+ \defaultAnswerFormat{#2} %% in case the argument helps formatting
+ \fi
+ }% End else statement
+ \else%
+ \GenericError{\space\space\space\space}% Throw an error based on... something? -- Jason
+ {Attempt to use \@backslashchar answer outside of math mode}
+ {See https://github.com/ximeraProject/ximeraLatex for explanation.}
+ {Need to use either inline or display math.}%
+ \fi
+}
+%</classXimera>
+% \end{macrocode}
+% On the HTML side, |\answer| emits spans---but it is usually just
+% handled directly by MathJax.
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\answer}[2][false]{\HCode{<span class="answer respondable">}#2\HCode{</span>}}
+
+\def\validator[#1]{\stepcounter{identification}\HCode{<div class="validator" id="validator\arabic{identification}"><script type="text/javascript">function validator\arabic{identification}() }\{\HCode{ return \detokenize{#1}; }\}\HCode{</script>}}
+\def\endvalidator{\HCode{</div>}}
+
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/banner.dtx b/macros/latex/contrib/ximera/src/banner.dtx
new file mode 100644
index 0000000000..ec5d62b283
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/banner.dtx
@@ -0,0 +1,21 @@
+% \begin{macrocode}
+%<*classXimera>
+\let\m\message
+\def\w{\m{::}}\def\t{\m{:::}}\def\s{\m{ }}\def\n{\m{^^J}}\def\u{::'}\def\d{'::}\def\v{:::::}
+\n
+\m{\d.}\s\m{.\u}\w\m{}\m{\v}\s\s\m{\v}\m{}\m{.\v\v\v::::.}\s\m{}\t\n
+\s\m{\d.\u}\s\w\t\t\s\t\t\w\m{}\s\s\s\s\s\s\s\t\s\m{\u::}\n
+\s\s\t\s\s\w\t\m{}\t\t\m{}\t\m{ ::::\v}\m{.\v:\u}\m{}\m{\u}\m{\d}\n
+\s\m{.\u::.}\s\w\t\m{}\t\t\m{}\t\w\s\s\s\s\w\m{}\m{\d.}\s\m{\u}\s\m{\d}\n
+\m{.\u}\s\m{\d.}\w\t\s\m{':\u}\s\t\m{\d\v::}\w\s\m{}\m{\d.\u}\s\s\m{\d}\n
+\n
+\let\w\undefined
+\let\t\undefined
+\let\s\undefined
+\let\n\undefined
+\let\u\undefined
+\let\d\undefined
+\let\v\undefined
+\let\m\undefined
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/choice.dtx b/macros/latex/contrib/ximera/src/choice.dtx
new file mode 100644
index 0000000000..70770cd24e
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/choice.dtx
@@ -0,0 +1,226 @@
+% \subsubsection{Multiple choice and the like}
+% \DescribeEnv{multipleChoice}{Multiple choice}
+% \begin{macrocode}
+%<*classXimera>
+% Jim: Originally this was \renewcommand{\theenumi}{$(\mathrm{\alph{enumi}})$}
+% but that breaks tex4ht because mathmode can only be processed by mathjax.
+% so now I made this just italicized.
+% \end{macrocode}
+% \subsubsection{Options}
+% \begin{macrocode}
+\define@key{choice}{value}[]{\def\choice@value{#1}}
+% \end{macrocode}
+% This flags the answer as the correct answer
+% \begin{macrocode}
+\define@boolkey{choice}{correct}[true]{\def\choice@correct{#1}}
+% \end{macrocode}
+% Use an ID to refer to the choice.
+% \begin{macrocode}
+\define@key{multipleChoice}{id}{\def\mc@id{#1}}
+% \end{macrocode}
+% |\otherchoice| outputs the item if correct and nothing if incorrect.
+% \begin{macrocode}
+\define@key{otherchoice}{value}[]{\def\otherchoice@value{#1}}
+\define@boolkey{otherchoice}{correct}[true]{\def\otherchoice@correct{#1}}
+% \end{macrocode}
+% Default key choices for multiple choice options.
+% Default for choice pairs.
+% Default: answers without the option "correct=true" is "incorrect".
+% \begin{macrocode}
+\setkeys{choice}{correct=false,value=}
+% \end{macrocode}
+% Defaults for multipleChoice pairs.
+% Default to no id? -- Jason
+% \begin{macrocode}
+\setkeys{multipleChoice}{id=}
+% \end{macrocode}
+% Defaults for otherchoice pairs.
+% Default "otherchoice" to behave like "choice" for error checking.
+% \begin{macrocode}
+\setkeys{otherchoice}{correct=false,value=}
+%</classXimera>
+% \end{macrocode}
+%
+% \subsubsection{Choices}
+% \DescribeMacro{\choice}{Like |\item| but for choice environments.}
+% choice command denotes a possible answer choice for the multiple choice question.
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\choice}[2][]{%
+\setkeys{choice}{#1}%
+\item{#2}
+\ifthenelse{\boolean{\choice@correct}}
+ {% Begin then result
+ \ifhandout% if it's a handout do nothing.
+ \else% otherwise place a checkmark when you select the "correct choice"... maybe? -- Jason
+ \,\checkmark\,\setkeys{choice}{correct=false}
+ \fi
+ }% End then result
+ {}% Begin/End else result.
+}
+
+%Define an expandable version of choice Not really meant to be used outside this package (used in wordChoice)
+% Is there a reason we can't just always use this as default? -- Jason
+\newcommand{\choiceEXP}[2][]{%
+ \expandafter\setkeys\expandafter{choice}{#1}%
+ \item{#2}
+ \ifthenelse{\boolean{\choice@correct}}
+ {% Begin then result
+ \ifhandout
+ \else
+ \,\checkmark\,\setkeys{choice}{correct=false}
+ \fi
+ }% End then result
+ {}% Begin/End else result.
+ } %% note all the {} are needed in case the choice has [] in it.
+
+% \otherchoice is the \choice used in wordChoice command.
+\newcommand{\otherchoice}[2][]{%
+\ignorespaces%
+\setkeys{otherchoice}{#1}%
+\ifthenelse{\boolean{\otherchoice@correct}}%
+{% Start then result
+#2\ignorespaces\setkeys{otherchoice}{correct=false}\ignorespaces%
+}% End then result
+{}% Start/End else result
+\ignorespaces%
+}%
+\newcommand{\inlinechoice}[2][]{%
+\setkeys{choice}{#1}%
+\iffirstinlinechoice
+(\hspace{-.25em}
+\firstinlinechoicefalse
+\else
+/
+\fi
+#2
+\ifthenelse{\boolean{\choice@correct}}%
+{% Start then result
+\ifhandout\else\checkmark\ignorespaces\setkeys{choice}{correct=false}\ignorespaces\fi%
+}% End then result
+{}% Start/End else result
+\hspace{-.25em}\ignorespaces%
+}
+
+%</classXimera>
+% \end{macrocode}
+% On the HTML side, |\choice| emits |<span>|s.
+% \begin{macrocode}
+%<*htXimera>
+\newcounter{choiceId}
+\renewcommand{\choice}[2][]{%
+\setkeys{choice}{correct=false}%
+\setkeys{choice}{#1}%
+\stepcounter{choiceId}\IgnorePar%
+\HCode{<span class="choice }%
+\ifthenelse{\boolean{\choice@correct}}{\HCode{correct}}{}
+\HCode{" }
+\ifthenelse{\equal{\choice@value}{}}{}{\HCode{data-value="\choice@value" }}
+\HCode{id="choice\arabic{choiceId}">}%
+#2\HCode{</span>}}
+\let\inlinechoice\choice
+%</htXimera>
+% \end{macrocode}
+
+% \subsubsection{Environment(s)}
+% The environment |multipleChoice@| is for internal use only.
+% \DescribeEnv{multipleChoice}{Wrap |\choice|s in a |multipleChoice| environment to make a multiple choice question.}
+% \begin{macrocode}
+%<*classXimera>
+\newenvironment{multipleChoice}[1][]
+ {% Environment Start Code
+ \setkeys{multipleChoice}{#1}%
+ \recordvariable{\mc@id}%
+ \begin{trivlist}
+ \item[\hskip \labelsep\small\bfseries Multiple Choice:]\hfil
+ \begin{enumerate}
+ }% Note this means that \item has to be the first line after \begin{multipleChoice}.
+ {% Environment End Code
+ \end{enumerate}
+ \end{trivlist}
+ }
+
+%multipleChoice@ is for internal use only! (used in wordChoice)
+%this is simply a wrapper for the sole showing (other)choice.
+\newenvironment{multipleChoice@}[1][]{}{)}
+%</classXimera>
+% \end{macrocode}
+
+
+
+% On the web, you might also expect these to be "problem environments"
+% but they aren't -- they're respondables. You might expect a
+% |\setcounter{choiceId}{0}| here --- that would be wrong, because then
+% the generated IDs would no longer be unique.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{multipleChoice}[1][]
+{\setkeys{multipleChoice}{#1}%
+\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="multiple-choice" }%
+\ifthenelse{\equal{\mc@id}{}}{}{\HCode{data-id="\mc@id" }}%
+\HCode{id="problem\arabic{identification}">}%
+}{\HCode{</div>}\IgnoreIndent}
+\ConfigureEnv{multipleChoice}{}{}{}{}
+%</htXimera>
+% \end{macrocode}
+
+% \subsection{Word choice}
+% \DescribeMacro{\wordChoice}{An in-line version of multipleChoice:
+% uses enumitem package note, it is coded as a single line to avoid
+% unwanted spaces in ``given'' mode.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\wordChoice}[1]{%
+\let\choicetemp\choice% Assign a "choicetemp" command to duplicate choice.
+\ifwordchoicegiven% If wordchoice option is on, we need to juggle around some definitions.
+\let\choice\otherchoice%
+%\begin{multipleChoice@}% -unnecessary (REMOVE THIS LINE IF THE YEAR IS 2019 or Beyond)
+#1
+%\end{multipleChoice@}% -unnecessary (REMOVE THIS LINE IF THE YEAR IS 2019 or Beyond)
+\else% If it isn't the regular "choice" command should work.
+\let\choice\inlinechoice%
+\begin{multipleChoice@}%
+#1%
+\end{multipleChoice@}%
+\fi%
+\let\choice\choicetemp% Now that choicetmp has been manipulated to what we want, replace choice with it.
+}%
+
+
+%</classXimera>
+% \end{macrocode}
+% This is actually just word choice
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{multipleChoice@}{\refstepcounter{problem}}{}%
+\ConfigureEnv{multipleChoice@}{\stepcounter{identification}\IgnorePar\HCode{<span class="word-choice" id="word-choice\arabic{identification}">}}{\HCode{</span>}\IgnoreIndent}{}{}
+%</htXimera>
+% \end{macrocode}
+
+% \subsection{Select all}
+% \DescribeEnv{selectAll}{A multiple-multiple choice question}
+% \begin{macrocode}
+%<*classXimera>
+\newenvironment{selectAll}[1][]
+{\begin{trivlist}\item[\hskip \labelsep\small\bfseries Select All Correct Answers:]\hfil\begin{enumerate}}
+ {\end{enumerate}\end{trivlist}}
+%</classXimera>
+% \end{macrocode}
+
+% In the future we need this to (optionally) be displayed in the
+% problem, while the actual code lives in the solution. Here is how
+% this could be implemented: Like the title/maketitle commands, the
+% multiple-choice could be stored in |\themultiplechoice|, flip a
+% boolean, and execute |\makemultiplechoice| at the |\end| of the
+% problem. We should also make a command called |\showchoices| that
+% will show choices in the handout.
+
+% On the web, |selectAll| is handled just like |multipleChoice|.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{selectAll}{\refstepcounter{problem}}{}%
+\ConfigureEnv{selectAll}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="select-all" id="problem\arabic{identification}">}}{\HCode{</div>}\IgnoreIndent}{}{}
+%</htXimera>
+% \end{macrocode}
+
+
diff --git a/macros/latex/contrib/ximera/src/clearEnv.dtx b/macros/latex/contrib/ximera/src/clearEnv.dtx
new file mode 100644
index 0000000000..af906995d9
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/clearEnv.dtx
@@ -0,0 +1,18 @@
+% \subsubsection{clearEnv}
+% \DescribeMacro{clearEnv}{envName}
+% This macro allows you to delete an environment by redefining it as null. This also deletes any corresponding internal counter - such as those generated by "\newtheorem" command.
+% #1 is envName is the name of the environment you want to clear. This will (re)define the
+% begin and end environments, as well as the internal counter from \newtheoremenv to \relax.
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\clearEnv}[1]{
+ %% Syntax: \clearEnv{envName}
+ % #1 is envName is the name of the environment you want to clear. This will (re)define the
+ % begin and end environments, as well as the internal counter from \newtheoremenv to \relax.
+ \expandafter\let\csname #1\endcsname\relax
+ \expandafter\let\csname end#1\endcsname\relax
+ \expandafter\let\csname c@#1\endcsname\relax
+ }
+%</classXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/dialogue.dtx b/macros/latex/contrib/ximera/src/dialogue.dtx
new file mode 100644
index 0000000000..b4b31580df
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/dialogue.dtx
@@ -0,0 +1,28 @@
+% \subsubsection{Dialogues}
+% \DescribeEnv{dialogue}{A dialogue between people.}
+% \begin{macrocode}
+%<*classXimera>
+\newenvironment{dialogue}{%
+ \renewcommand\descriptionlabel[1]{\hspace{\labelsep}\textbf{##1:}}
+ \begin{description}%
+}{%
+ \end{description}%
+}
+%</classXimera>
+% \end{macrocode}
+% On the web, the resulting |<dl>| should have an appropriate |class| set.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{dialogue}{\begin{description}}{\end{description}}
+
+\ConfigureList{dialogue}%
+ {\EndP\HCode{<dl \a:LRdir class="dialogue">}%
+ \PushMacro\end:itm
+\global\let\end:itm=\empty}
+ {\PopMacro\end:itm \global\let\end:itm \end:itm
+\EndP\HCode{</dd></dl>}\ShowPar}
+ {\end:itm \global\def\end:itm{\EndP\Tg</dd>}\HCode{<dt
+ class="actor">}\bgroup \bf}
+ {\egroup\EndP\HCode{</dt><dd\Hnewline class="speech">}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/ending.dtx b/macros/latex/contrib/ximera/src/ending.dtx
new file mode 100644
index 0000000000..8f53a0fd27
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/ending.dtx
@@ -0,0 +1,20 @@
+% \subsubsection{The End}
+% It seems that some of the files need to conclude with something or another.
+% \begin{macrocode}
+%<*htXimera>
+\Hinput{ximera}
+%</htXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXourse>
+\Hinput{xourse}
+%</htXourse>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*cfgXimera>
+\begin{document}
+\EndPreamble
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/enumerate.dtx b/macros/latex/contrib/ximera/src/enumerate.dtx
new file mode 100644
index 0000000000..7c37e9743e
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/enumerate.dtx
@@ -0,0 +1,10 @@
+% \subsubsection{Enumerate fixes}
+% Make enumerate use a letter
+% \begin{macrocode}
+%<*classXimera>
+\renewcommand{\theenumi}{\textup{(\alph{enumi})}}
+\renewcommand{\labelenumi}{\theenumi}
+\renewcommand{\theenumii}{\textup{(\roman{enumii})}}
+\renewcommand{\labelenumii}{\theenumii}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/feedback.dtx b/macros/latex/contrib/ximera/src/feedback.dtx
new file mode 100644
index 0000000000..03d09770b8
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/feedback.dtx
@@ -0,0 +1,72 @@
+% \subsubsection{Feedback}
+% \DescribeEnv{feedback}{An initially hidden environment that uncovers itself at an appropriate time.}
+% New Validator rewrite code added by Jason Nowell. Original code
+% orovided by Jim Fowler Validator is an environment designed to run a
+% custom check on answers (usually) using javascript code.
+%
+% Define a placeholder command for validator and feedback.
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\PH@Command}{}
+% \end{macrocode}
+% Validator should take an argument and detokenize it and display it
+% at the start of the environment. The original Validator environment
+% had everything framed in an mbox; presumably to make the text look
+% a bit nicer, although this seems redundant with |texttt|. It
+% shouldn't cause any harm so I have left it in for now.
+% \begin{macrocode}
+\newenvironment{validator}[1][]{
+ \def\PH@Command{#1}% Use PH@Command to hold the content and be a target for "\expandafter" to expand once.
+ \mbox{\texttt{\detokenize\expandafter{\PH@Command}}}% Now expand PH@Command once and then detokenize.
+ }{}
+% \end{macrocode}
+% First, if it's a handout, we want feedback to eat everything and
+% then disappear entirely. So we do this:
+% \begin{macrocode}
+\ifhandout%
+\newenvironment{feedback}
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+% \end{macrocode}
+% If this isn't a handout, then we want to display the Feedback by
+% using a label, positioned and formated as a |\item| in a
+% trivlist. It is important that we also detokenize the content of
+% the optional argument, as it is likely to contain javascript or
+% other code that latex won't be able to make sense of.
+% \begin{macrocode}
+\else
+% \end{macrocode}
+% \begin{macrocode}
+\newenvironment{feedback}[1][attempt]{
+
+ \def\PH@Command{#1}% Use PH@Command to hold the content and be a target for "\expandafter" to expand once.
+
+ \begin{trivlist}% Begin the trivlist to use formating of the "Feedback" label.
+ \item[\hskip \labelsep\small\slshape\bfseries Feedback% Format the "Feedback" label. Don't forget the space.
+ (\texttt{\detokenize\expandafter{\PH@Command}}):% Format (and detokenize) the condition for feedback to trigger
+ \hspace{2ex}]\small\slshape% Insert some space before the actual feedback given.
+ }{
+ \end{trivlist}
+ }
+
+\fi
+%</classXimera>
+% \end{macrocode}
+% Feedback environments take an optional parameter (which describes
+% when the feedback is to be provided)
+% \begin{macrocode}
+%<*htXimera>
+\def\feedback{\@ifnextchar[{\@feedbackcode}{\@feedbackattempt}}
+\def\@feedbackattempt{\@feedbackcode[attempt]}
+\def\@feedbackcode[#1]{\stepcounter{identification}%
+\ifvmode \IgnorePar\fi \EndP%
+\ifthenelse{\equal{#1}{attempt}}{\HCode{<div class="feedback" data-feedback="attempt" id="feedback\arabic{identification}">}}%
+{\ifthenelse{\equal{#1}{correct}}{\HCode{<div class="feedback" data-feedback="correct" id="feedback\arabic{identification}">}}%
+{\HCode{<div class="feedback" data-feedback="script" id="feedback\arabic{identification}"><script type="text/javascript">function feedback\arabic{identification}() }\{\HCode{ return \detokenize{#1}; }\}\HCode{</script>}}}}
+\def\endfeedback{\HCode{</div>}\IgnoreIndent}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/foldable.dtx b/macros/latex/contrib/ximera/src/foldable.dtx
new file mode 100644
index 0000000000..94c5eb36cb
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/foldable.dtx
@@ -0,0 +1,76 @@
+% \subsubsection{Foldable}
+% The package \verb|mdframed| is used to make pretty foldable, but the
+% amsthm/mdframed conflict also messes up the .jax file so we don't
+% load mdframed when performing the xake step. But even the below
+% isn't enough to fix this.
+% \begin{macrocode}
+%\iftikzexport\else\RequirePackage[framemethod=TikZ]{mdframed}\fi
+% \end{macrocode}
+% \DescribeEnv{foldable}{Does it fold?}
+% \begin{macrocode}
+%<*classXimera>
+
+\colorlet{textColor}{black} % since textColor is referenced below
+\colorlet{background}{white} % since background is referenced below
+
+% The core environments. Find results in 4ht file.
+%% pretty-foldable
+%\iftikzexport
+\newenvironment{foldable}{%
+}{%
+}
+%\else
+%\renewmdenv[
+% font=\upshape,
+% outerlinewidth=3,
+% topline=false,
+% bottomline=false,
+% leftline=true,
+% rightline=false,
+% leftmargin=0,
+% innertopmargin=0pt,
+% innerbottommargin=0pt,
+% skipbelow=\baselineskip,
+% linecolor=textColor!20!white,
+% fontcolor=textColor,
+% backgroundcolor=background
+%]{foldable}%
+%\fi
+
+%% pretty-expandable
+%\iftikzexport
+\newenvironment{expandable}{%
+}{%
+}
+%\else
+%\newmdenv[
+% font=\upshape,
+% outerlinewidth=3,
+% topline=false,
+% bottomline=false,
+% leftline=true,
+% rightline=false,
+% leftmargin=0,
+% innertopmargin=0pt,
+% innerbottommargin=0pt,
+% skipbelow=\baselineskip,
+% linecolor=black,
+%]{expandable}%
+%\fi
+
+\newcommand{\unfoldable}[1]{#1}
+
+%</classXimera>
+% \end{macrocode}
+% On the web, these foldable elements could be HTML5 details and summary.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{foldable}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div id="foldable\arabic{identification}" class="foldable">}}{\HCode{</div>}\IgnoreIndent}
+
+\renewenvironment{expandable}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div data-original="expandable" id="foldable\arabic{identification}" class="foldable">}
+
+}{\HCode{</div>}\IgnoreIndent}
+
+\renewcommand{\unfoldable}[1]{\HCode{<span class="unfoldable">}#1\HCode{</span>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/footnotes.dtx b/macros/latex/contrib/ximera/src/footnotes.dtx
new file mode 100644
index 0000000000..cd37a086e4
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/footnotes.dtx
@@ -0,0 +1,63 @@
+% \subsection{How to handle footnotes in this setting.}
+% \DescribeMacro{\footnote}{% Written by Jason Nowell Standard Footnotes in pdf, but expandable parenthetical online. Supports different coloring by using |\colorlet{fncolor}{COLOR}| and setting COLOR to whatever color you want (Default is blue).}%
+%
+% \begin{macrocode}
+%<*htXimera>
+\newcounter{footnoteNum}% This will track footnote numbering for the superscript and for the ID.
+\colorlet{fncolor}{red!30!blue}% This is the footnote text coloring. This will allow users to renew this coloring to their own preference if they want to. The default here is a blue coloring. NOTE: Currently; trying to use `footnotecolor' (as a more descriptive color name) breaks everything on my system pretty spectacularly for some reason. This may be just mine or a clash somewhere in the ximera package, so for now I'm leaving it as `fncolor'.
+\renewcommand{\footnote}[1]{\ifvmode\ShowPar\fi
+ \stepcounter{footnoteNum}% Step the counter to make a new footnote
+ %% The following HCode should setup the javascript function that shows or hides the footnote. If you want to change the footnote location, you may want to change the 'inline' part of x.style.display = 'inline'; to another CSS display type, like 'block' or 'inherit'. Current the `x.display.color' seems to not be working.
+ \HCode{
+ <script type="text/javascript">
+ function footnotefunction(ID) {
+ var x = document.getElementById(ID);
+ if (x.style.display === "none") {
+ x.style.color = "blue";
+ x.style.display = "inline";
+ } else {
+ x.style.display = "none";
+ }
+ }
+ </script>
+ }
+ %% The next command needs \expandafter in order to expand the counter footnoteNum into a roman character for the footnote ID. These seem to work better than arabic numerals in some cases, although why is not clear.
+ %% The next HCode controls the formatting for the actual footnote reference number (ie the superscript), but not the footnote itself.
+ \expandafter\HCode{
+ <span style=
+ "position=relative;
+ vertical-align=baseline;"
+ >
+ <button onclick="footnotefunction('footnote\roman{footnoteNum}')"
+ style=
+ "background:none!important;
+ color:inherit;
+ border:none;
+ padding:0!important;
+ font: inherit;
+ cursor: pointer;"
+ >
+ <sup>}[\arabic{footnoteNum}]\HCode{</sup></button>
+ }
+ %% The next command needs \expandafter in order to expand the counter footnoteNum into a roman character for the footnote ID. These seem to work better than arabic numerals in some cases, although why is not clear. Note that the ID counter style choice (roman vs arabic etc) needs to match the previous HCode choice.
+ %% Currently most of the formatting doesn't seem to work as intended, so that still needs to be figured out and fixed. Ideally we would have the footnote appear as a bubble above the footnote superscript when the footnote superscript is clicked.
+ \expandafter\HCode{
+ <span id="footnote\roman{footnoteNum}"
+ style=
+ "display:none;
+ min-width:20em;
+ position:relative;
+ left:2px;
+ padding:5px;
+ color:blue;
+ word-wrap:break-word;
+ z-index=9999;
+ overflow=auto;"
+ >
+ }
+ \textcolor{fncolor}{(#1)}% Display the actual footnote here with color `fncolor' and within ()'s.
+ \HCode{</span></span>}
+ }% End of footnote definition.
+%</htXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/freeresponse.dtx b/macros/latex/contrib/ximera/src/freeresponse.dtx
new file mode 100644
index 0000000000..2fe03c5287
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/freeresponse.dtx
@@ -0,0 +1,60 @@
+% \subsubsection{Free response}
+% \DescribeEnv{freeResponse}{A freeform input box.}
+% \begin{macrocode}
+%<*classXimera>
+\newboolean{given} %% required for freeResponse
+\setboolean{given}{true} %% could be replaced by a key=value pair later if needed
+
+\ifhandout
+ \newenvironment{freeResponse}[1][false]%
+ {%
+ \def\givenatend{\boolean{#1}}
+ \ifthenelse{\boolean{#1}}
+ {% Begin then result
+ \begin{trivlist}
+ \item
+ }% End then result
+ {% Begin else result
+ \setbox0\vbox\bgroup
+ }% End else result
+% {}% Don't think this is doing anything? -- Jason
+ }
+ {%
+ \ifthenelse{\givenatend}
+ {% Begin then result
+ \end{trivlist}
+ }% End then result
+ {% Begin else result
+ \egroup
+ }% End else result
+% {}% Don't think this is doing anything? -- Jason
+ }
+\else
+ \newenvironment{freeResponse}[1][false]%
+ {% Environment Beginning Code
+ \ifthenelse{\boolean{#1}}%% Could probably change this with just putting the (given) in the boolean?-- Jason
+ {% Begin then result
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Free Response (Given):\hspace{2ex}]
+ }% End then result
+ {% Begin else result
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Free Response:\hspace{2ex}]
+ }% End else result
+ }
+ {% Environment Ending Code
+ \end{trivlist}
+ }
+\fi
+
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+
+\renewenvironment{freeResponse}{\refstepcounter{problem}}{}%
+\ConfigureEnv{freeResponse}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="free-response" id="problem\arabic{identification}">}}{\HCode{</div>}\IgnoreIndent}{}{}%
+
+%</htXimera>
+% \end{macrocode} \ No newline at end of file
diff --git a/macros/latex/contrib/ximera/src/graded.dtx b/macros/latex/contrib/ximera/src/graded.dtx
new file mode 100644
index 0000000000..24ec67052d
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/graded.dtx
@@ -0,0 +1,20 @@
+% \subsection{Grading by points}
+% \DescribeEnv{graded}{The |graded| environment does nothing in latex,
+% but in html, it wraps the activities in a div in order to assign
+% some weight to them for grading.}
+% \begin{macrocode}
+%<*classXourse>
+\newenvironment{graded}[1]{}{}
+%</classXourse>
+% \end{macrocode}
+% So indeed this environment in html wraps the activities in a div in
+% order to assign some number of points to them.
+% \begin{macrocode}
+%<*htXourse>
+\renewenvironment{graded}[1]{%
+\ifvmode \IgnorePar\fi \EndP\HCode{<div class="graded" data-weight="#1">}\IgnoreIndent%
+}{
+\ifvmode \IgnorePar\fi \EndP\HCode{</div>}\IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/hideEnv.dtx b/macros/latex/contrib/ximera/src/hideEnv.dtx
new file mode 100644
index 0000000000..5abcdfb0c0
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/hideEnv.dtx
@@ -0,0 +1,36 @@
+% \subsubsection{hideEnv}
+% \DescribeMacro{hideEnv}[replacementCode]{environmentName}
+% This macro allows you to hide an environment by name, ensuring it - and all its contents - are no longer visible on the pdf output. It also allows you an optional input to replace the block of content with new (uniform) content if desired.
+% #1 is replacementCode and is optional. This will be code that is executed when the env is executed,
+% even though the content of the environment is hidden.
+% #2 is the name of the environment which gets hidden.
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\hideEnv}[2][]{
+ %% Syntax: \hideEnv[NewCode]{environmentName}
+
+ \expandafter\def\csname temp@#2\endcsname\csname #2\endcsname
+ \expandafter\def\csname temp@end#2\endcsname\csname end#2\endcsname
+ \expandafter\def\csname#2\endcsname{
+ \ifnum\value{depth@Check}<1
+ Suppress Should start here.
+ \suppress
+ \fi
+ \stepcounter{depth@Check}
+
+% Current Depth reported as: \arabic{depth@Check}
+ }
+ \expandafter\def\csname end#2\endcsname{
+ \addtocounter{depth@Check}{-1}
+ \ifnum\value{depth@Check}<1
+ Suppress Should End Here.
+ \endsuppress
+ \fi
+
+% Current Depth reported as: \arabic{depth@Check}
+ \noexpand{#1}
+ }
+ }
+%</classXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/hints.dtx b/macros/latex/contrib/ximera/src/hints.dtx
new file mode 100644
index 0000000000..b777bd8235
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/hints.dtx
@@ -0,0 +1,53 @@
+% \subsubsection{Hints}
+% \DescribeEnv{hint}{Hint environments can be embedded inside problems.}
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% Create a counter that will track how deeply nested the current hint is
+% \begin{macrocode}
+\newcounter{hintLevel}
+\setcounter{hintLevel}{0}
+% \end{macrocode}
+% Create an empty shell to renew
+% \begin{macrocode}
+\newenvironment{hint}{}{}
+% \end{macrocode}
+% Now we renew the environment as needed, this should allow support
+% for any transition code that treats some parts as a "handout" and
+% some parts as non-handout. renewing the environment on the fly is a
+% bit hacky.
+% \begin{macrocode}
+\renewenvironment{hint}
+ {
+ \ifhandout
+ \setbox0\vbox\bgroup
+ \else
+ \begin{trivlist}\item[\hskip \labelsep\small\slshape\bfseries Hint:\hspace{2ex}]
+ \small\slshape
+ \fi
+% \end{macrocode}
+% Step up hint level to track the nested level of the hint. This will be used for problem numbering.
+% \begin{macrocode}
+ \stepcounter{hintLevel}
+ }
+ {
+ \ifhandout
+ \egroup\ignorespacesafterend
+ \else
+ \end{trivlist}
+ \fi
+% \end{macrocode}
+% Detract from hint level counter to track hint nested level
+% \begin{macrocode}
+ \addtocounter{hintLevel}{-1}
+ }
+
+\ifhints
+ \renewenvironment{hint}{
+ \begin{trivlist}\item[\hskip \labelsep\small\slshape\bfseries Hint:\hspace{2ex}]
+ \small\slshape}
+ {\end{trivlist}}
+\fi
+
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/html.dtx b/macros/latex/contrib/ximera/src/html.dtx
new file mode 100644
index 0000000000..8c0b458bf1
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/html.dtx
@@ -0,0 +1,20 @@
+% \subsubsection{Semantic HTML}
+% \DescribeMacro{\textbf}{Using \verb|\textbf| emits a \verb|<strong>| tag.}
+% \begin{macrocode}
+%<*cfgXimera>
+\Configure{textbf}{\ifvmode\ShowPar\fi\HCode{<strong>}}{\HCode{</strong>}}
+%</cfgXimera>
+% \end{macrocode}
+% \DescribeMacro{\textit}{Using \verb|\textit| or similar emits an \verb|<em>| tag.}
+% \begin{macrocode}
+%<*cfgXimera>
+\Configure{textit}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}
+\Configure{emph}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}
+%</cfgXimera>
+% \end{macrocode}
+% \DescribeMacro{\texttt}{Using \verb|\texttt| emits a \verb|<code>| tag.}
+% \begin{macrocode}
+%<*cfgXimera>
+\Configure{texttt}{\ifvmode\ShowPar\fi\HCode{<code>}}{\HCode{</code>}}
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/hyperref.dtx b/macros/latex/contrib/ximera/src/hyperref.dtx
new file mode 100644
index 0000000000..d035b4d976
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/hyperref.dtx
@@ -0,0 +1,12 @@
+% We put hyperref after all other packages becuase that is better.
+% \begin{macrocode}
+%<*classXimera>
+% Don't use hyperref when using Tex4ht
+\ifdefined\HCode
+\RequirePackage{hyperref}
+\else
+\RequirePackage[pdfpagelabels,colorlinks=true,allcolors=blue!30!black]{hyperref}
+\pdfstringdefDisableCommands{\def\hskip{}}%% quiets warning
+\fi
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/image.dtx b/macros/latex/contrib/ximera/src/image.dtx
new file mode 100644
index 0000000000..e8e0a96e5a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/image.dtx
@@ -0,0 +1,60 @@
+% \subsubsection{Images}
+% \DescribeEnv{image}{Place images inside an |image| environment. On paper, this centers the image. On the web, this provides additional benefits.}
+% \begin{macrocode}
+%<*classXimera>
+%\newenvironment{image}[1][]{\begin{center}}{\end{center}}
+\NewEnviron{image}[1][3in]{%
+ \begin{center}\resizebox{#1}{!}{\BODY}\end{center}% resize and center
+}
+%</classXimera>
+% \end{macrocode}
+% \DescribeMacro{\alt}{Inside an |image| environment, |\alt| provides alt-text for assistive technology like screenreaders.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\alt}[1]{}
+%</classXimera>
+% \end{macrocode}
+% The |image| environment doesn't actually work in tex4ht as defined
+% with NewEnviron; so this renewenvironment is needed.
+% image-environment also gets formatted in a well, and when the user
+% clicks on the image, it zooms in.
+% \begin{macrocode}
+%<*htXimera>
+\newcounter{imagealt}
+\setcounter{imagealt}{0}
+\renewenvironment{image}[1][]{\stepcounter{imagealt}%
+ \ifvmode \IgnorePar\fi \EndP%
+ \HCode{<div class="image-environment" role="img" aria-labelledby="image-alt-\arabic{imagealt}">}%
+}{\HCode{</div>}}
+\renewcommand{\alt}[1]{\HCode{<div style="display: none;" id="image-alt-\arabic{imagealt}">}#1\HCode{</div>}}
+%</htXimera>
+% \end{macrocode}
+% Although we accept many formats, SVG is preferred on the web.
+% Since we have a different mechanism for producing |alt| text, we
+% want to ignore tex4ht's own method fo producing alt text.
+% \begin{macrocode}
+%<*cfgXimera>
+\DeclareGraphicsExtensions{.jpg,.png,.gif,.svg}
+\Configure{graphics*}
+{svg}{
+ {\Configure{Needs}{File: \Gin@base.svg}\Needs{}}
+ \Picture[]{\csname Gin@base\endcsname.svg \csname a:Gin-dim\endcsname}%
+}
+%</cfgXimera>
+% \end{macrocode}
+% This is a hack to kill |includegraphics| commands in
+% |\documentclass{standalone}| files
+% \begin{macrocode}
+%<*cfgXimera>
+\ifcsname ifstandalone\endcsname
+ \ifstandalone
+ \renewcommand\includegraphics[2][]{}
+ \fi
+%</cfgXimera>
+% \end{macrocode}
+% PGF sometimes causes trouble, but we simply don't care in tex4ht mode.
+% \begin{macrocode}
+%<*htXimera>
+\newcommand{\pgfsyspdfmark}[3]{}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/instructornotes.dtx b/macros/latex/contrib/ximera/src/instructornotes.dtx
new file mode 100644
index 0000000000..c175319f69
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/instructornotes.dtx
@@ -0,0 +1,101 @@
+% \subsubsection{Instructor notes}
+% \begin{macrocode}
+%<*classXimera>
+
+%% instructor intro/instructor notes
+%%
+\ifhandout % what follows is handout behavior
+ \ifinstructornotes
+ \newenvironment{instructorIntro}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Instructor Introduction:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+ \else
+ \newenvironment{instructorIntro}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%If this mysteriously starts breaking
+ % remove \ignorespacesafterend
+ \egroup\ignorespacesafterend
+ }
+ \fi
+\else% for handout, so what follows is default
+\ifinstructornotes
+ \newenvironment{instructorIntro}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+ \else
+ \newenvironment{instructorIntro}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Instructor Introduction:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+ \fi
+\fi
+
+
+
+
+%% instructorNotes environment
+\ifhandout % what follows is handout behavior
+\ifinstructornotes
+\newenvironment{instructorNotes}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Instructor Notes:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+ \else
+ \newenvironment{instructorNotes}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+ \fi
+\else% for handout, so what follows is default
+\ifinstructornotes
+\newenvironment{instructorNotes}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+ \else
+ \newenvironment{instructorNotes}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Instructor Notes:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+ \fi
+ \fi
+
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/interactives/desmos.dtx b/macros/latex/contrib/ximera/src/interactives/desmos.dtx
new file mode 100644
index 0000000000..9a55db8f43
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/desmos.dtx
@@ -0,0 +1,14 @@
+% \subsubsection{Desmos}
+% \DescribeMacro{\desmos}{Desmos command. Requires id, width, and height as arguments.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\desmos}[3]{Desmos link: \url{https://www.desmos.com/calculator/#1}}
+\newcommand{\desmosThreeD}[3]{Desmos3D link: \url{https://www.desmos.com/3d/#1}}
+%</classXimera>
+% \end{macrocode}
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\desmos}[3]{\HCode{<iframe src="https://www.desmos.com/calculator/#1" width="100\%" height="#3px" style="border: 1px solid \#ccc" frameborder=0>This browser does not support embedded elements.</iframe>}}
+\renewcommand{\desmosThreeD}[3]{\HCode{<iframe src="https://www.desmos.com/3d/#1" width="#2px" height="#3px" style="border: 1px solid \#ccc" frameborder=0>This browser does not support embedded elements.</iframe>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/interactives/geogebra.dtx b/macros/latex/contrib/ximera/src/interactives/geogebra.dtx
new file mode 100644
index 0000000000..696ac32236
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/geogebra.dtx
@@ -0,0 +1,27 @@
+% \subsubsection{Geogebra}
+% \DescribeMacro{\geogebra}{Geogebra command. Requires id, width, and
+% height as arguments.}
+% \begin{macrocode}
+%<*classXimera>
+%Geogebra link
+\newcommand{\geogebra}[3]{Geogebra link: \url{https://www.geogebra.org/m/#1}}
+%</classXimera>
+% \end{macrocode}
+% Define keys for answer geogebra key=value pairs.
+% \begin{macrocode}
+%<*htXimera>
+\define@key{geogebra}{rc}[true]{\def\geo@rc{#1}}
+\define@key{geogebra}{sdz}[true]{\def\geo@sdz{#1}}
+\define@key{geogebra}{smb}[true]{\def\geo@smb{#1}}
+\define@key{geogebra}{stb}[true]{\def\geo@stb{#1}}
+\define@key{geogebra}{stbh}[true]{\def\geo@stbh{#1}}
+\define@key{geogebra}{ld}[true]{\def\geo@ld{#1}}
+\define@key{geogebra}{sri}[true]{\def\geo@sri{#1}}
+%set default key values
+\setkeys{geogebra}{rc=false,sdz=false,smb=false,stb=false,stbh=false,ld=false,sri=false}
+%command definition
+\renewcommand{\geogebra}[4][]{%
+ \setkeys{geogebra}{#1}% Set new keys
+ \HCode{<iframe scrolling="no" src="https://www.geogebra.org/material/iframe/id/#2/width/#3/height/#4/border/888888/rc/\geo@rc/ai/false/sdz/\geo@sdz/smb/\geo@smb/stb/\geo@stb/stbh/\geo@stbh/ld/\geo@ld/sri/\geo@sri/at/auto" width="#3px" height="#4px" style="border:0px; max-width: fit-content"> </iframe>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/interactives/google.dtx b/macros/latex/contrib/ximera/src/interactives/google.dtx
new file mode 100644
index 0000000000..cbe75498f1
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/google.dtx
@@ -0,0 +1,26 @@
+% \subsubsection{Google Sheet}
+% \DescribeMacro{\googleSheet}{googleSheet command. Requires id,
+% width, and height as arguments. optional arguments are gid for
+% sheet ID and range for cell range. command definition}
+% \begin{macrocode}
+%<*classXimera>
+% Google Spreadsheet link (read only)
+\newcommand{\googleSheet}[5]{%
+ Google Spreadsheet link: \url{https://docs.google.com/spreadsheets/d/#1}%
+}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\googleSheet}[5]{%
+ \ifthenelse{\equal{#4}{}}%
+ {\HCode{<iframe width="#2px" height="#3px" src="https://docs.google.com/spreadsheets/d/#1/htmlembed?widget=true">This browser does not support embedded elements.</iframe>}}%
+ {\ifthenelse{\equal{#5}{}}%
+ {\HCode{<iframe width="#2px" height="#3px" src="https://docs.google.com/spreadsheets/d/#1/htmlembed?single=true&amp;gid=#4&amp;widget=false">This browser does not support embedded elements.</iframe>}}%
+ {\HCode{<iframe width="#2px" height="#3px" src="https://docs.google.com/spreadsheets/d/#1/htmlembed?single=true&amp;gid=#4&amp;range=#5&amp;widget=false">This browser does not support embedded elements.</iframe>}}%
+ }%
+ }%
+%</htXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/interactives/graph.dtx b/macros/latex/contrib/ximera/src/interactives/graph.dtx
new file mode 100644
index 0000000000..154c2803af
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/graph.dtx
@@ -0,0 +1,14 @@
+% \subsubsection{Graphs}
+% \DescribeMacro{\graph}{An embedded graph (in math mode).}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\graph}[2][]{\text{Graph of $#2$}}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\graph}[2][]{\HCode{<div class="graph" data-options="#1">}#2\HCode{</div>}}
+%</htXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/interactives/include.dtx b/macros/latex/contrib/ximera/src/interactives/include.dtx
new file mode 100644
index 0000000000..76eaa0dd6f
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/include.dtx
@@ -0,0 +1,22 @@
+% \subsubsection{Including widgets}
+% \DescribeMacro{\includeinteractive}{Cognate to |includegraphics| but
+% instead of a graphics file, accepts a |.js| file which will be
+% loaded as an interactive widget.}
+% \begin{macrocode}
+%<*classXimera>
+\define@key{interactive}{id}{\def\interactive@id{#1}}
+\setkeys{interactive}{id=}
+\newcommand{\includeinteractive}[2][]{
+\setkeys*{interactive}{#1}%
+\ifthenelse{\equal{\interactive@id}{}}{}{\recordvariable{\interactive@id}}
+Interactive
+}
+%</classXimera>
+% \end{macrocode}
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\includeinteractive}[2][]{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div id="interactive\arabic{identification}" class="interactive"> </div>}\HCode{<script src="#2" data-argument="#1" data-target="interactive\arabic{identification}"> </script>}\IgnoreIndent}
+%</htXimera>
+% \end{macrocode}
+
+
diff --git a/macros/latex/contrib/ximera/src/interactives/javascript.dtx b/macros/latex/contrib/ximera/src/interactives/javascript.dtx
new file mode 100644
index 0000000000..c67a7e5235
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/javascript.dtx
@@ -0,0 +1,31 @@
+% \subsubsection{JavaScript}
+
+% \DescribeEnv{javascript}{Code inside a javascript environment is printed on paper, but executed on the web.}
+
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{javascript}{Verbatim}{numbers=left,frame=lines,label=JavaScript,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+% for programming javascript
+\renewenvironment{javascript}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{javascript}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="javascript" id="javascript\arabic{identification}"><script type="text/javascript">}\HtmlParOff}{\HtmlParOn\HCode{</script></div>}}
+%</htXimera>
+% \end{macrocode}
+
+% \DescribeMacro{\js}{Code inside a |\js| macro is evaluated and replaced with its value.}
+% \begin{macrocode}
+%<*classXimera>
+\def\js#1{\mbox{\texttt{\detokenize{#1}}}}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\def\js#1{\stepcounter{identification}\HCode{<span class="inline-javascript" id="javascript\arabic{identification}"><script type="text/javascript"> function javascript\arabic{identification}() }\{\HCode{ return \detokenize{#1}; }\}\HCode{</script></span>}}
+%</htXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/interactives/sagemath.dtx b/macros/latex/contrib/ximera/src/interactives/sagemath.dtx
new file mode 100644
index 0000000000..95d378afde
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/sagemath.dtx
@@ -0,0 +1,43 @@
+% \subsection{SageMath support}
+% Load Sage\TeX\ if it exists.
+% \begin{macrocode}
+%<*classXimera>
+\IfFileExists{sagetex.sty}{\RequirePackage{sagetex}}{}
+%</classXimera>
+% \end{macrocode}
+
+% \DescribeEnv{sageCell}{Create an interactive SageMath widget.}
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{sageCell}{Verbatim}{numbers=left,frame=lines,label=SAGE,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{sageCell}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{sageCell}{\ifvmode \IgnorePar\fi \EndP\HCode{<div class="sage"><script type="text/x-sage">}\HtmlParOff}{\HtmlParOn\HCode{\Hnewline</script></div>}}
+%</htXimera>
+% \end{macrocode}
+
+% \DescribeEnv{sageOutput}{Execute SageMath code and output the result.}
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{sageOutput}{Verbatim}{numbers=left,frame=lines,label=SAGE-Output,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{sageOutput}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{sageOutput}{\ifvmode \IgnorePar\fi \EndP\HCode{<div class="sageOutput"><script type="text/x-sage">}}{\HCode{\Hnewline</script></div>}}
+%</htXimera>
+% \end{macrocode}
+
+% \DescribeEnv{sageSilent}{Execute SageMath code without outputing the result.}
+% \begin{macrocode}
+%<*htXimera>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\renewenvironment{sagesilent}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{sagesilent}{\ifvmode \IgnorePar\fi \EndP\HCode{<script type="text/sagemath">}\HtmlParOff}{\HtmlParOn\HCode{</script></div>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/interactives/video.dtx b/macros/latex/contrib/ximera/src/interactives/video.dtx
new file mode 100644
index 0000000000..7f7979db3f
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/video.dtx
@@ -0,0 +1,21 @@
+% \subsubsection{Video}
+% \DescribeMacro{\youtube}{Youtube command. Requires id.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\youtube}[1]{YouTube link: \url{https://www.youtube.com/watch?v=#1}}
+%</classXimera>
+% \end{macrocode}
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\youtube}[1]{\ifvmode \IgnorePar\fi \EndP\HCode{<div class="video youtube-player" data-youtube="#1">_</div>}}
+%</htXimera>
+% \end{macrocode}
+% Video commands are also emitted, slightly differently, when placed
+% at top-level in a xourse file.
+% \begin{macrocode}
+%<*htXourse>
+\renewcommand\youtube[1]{%
+\ifvmode \IgnorePar\fi \EndP\HCode{<a class="youtube" href="https://www.youtube.com/watch?v=#1">#1</a>}\IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/jax.dtx b/macros/latex/contrib/ximera/src/jax.dtx
new file mode 100644
index 0000000000..5441a139e1
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/jax.dtx
@@ -0,0 +1,115 @@
+% \subsubsection{MathJax support}
+% When using mathjax, dump all the |\newcommand|s to a |.jax| file.
+%
+% First, create the |.jax| file.
+% \begin{macrocode}
+%<*classXimera>
+\ifdefined\HCode
+ \else
+ \newwrite\myfile
+ \immediate\openout\myfile=\jobname.jax
+\fi
+%</classXimera>
+% \end{macrocode}
+% From |only.dtx| we must also create |prompt| on the MathJax side.
+% \begin{macrocode}
+%<*classXimera>
+\ifdefined\HCode
+ \else
+ \immediate\write\myfile{\unexpanded{\newenvironment}{prompt}{}{}}
+\fi
+%</classXimera>
+% \end{macrocode}
+% Redefine newcommand appropriately.
+% \begin{macrocode}
+%<*classXimera>
+\ifdefined\HCode
+ \else
+\let\@oldargdef\@argdef
+\long\def\@argdef#1[#2]#3{%
+\immediate\write\myfile{\unexpanded{\newcommand}{\unexpanded{#1}}[\unexpanded{#2}]{\unexpanded{#3}}}%
+\@oldargdef#1[#2]{#3}%
+}
+
+\let\@OldDeclareMathOperator\DeclareMathOperator
+\renewcommand{\DeclareMathOperator}[2]{\@OldDeclareMathOperator{#1}{#2}\immediate\write\myfile{\unexpanded{\DeclareMathOperator}{\unexpanded{#1}}{\unexpanded{#2}}}}
+
+\fi
+%</classXimera>
+% \end{macrocode}
+% Include the jax'ed newcommands
+% \begin{macrocode}
+%<*cfgXimera>
+% Remove commands that use @
+\immediate\write18{sed -i "/@/d" \jobname.jax}
+% Replace ##1 with #1 and so forth
+\immediate\write18{sed -i "s/\string#\string#\string\\([0-9]\string\\)/\string#\string\\1/g" \jobname.jax}
+
+\Configure{BVerbatimInput}{}{}{}{}
+
+\Configure{verbatiminput}{}{}{}{}
+
+% Instead of a nonbreaking space, use a standard space
+\makeatletter
+\def\FV@Space{\space}
+\makeatother
+
+% Include the mathjax newcommands in a math/tex script right at the beginning of the body
+\Configure{BODY}{%
+\HCode{<body>\Hnewline}%
+\Tg<div class="preamble">%
+\Tg<script type="math/tex">%
+\BVerbatimInput{\jobname.jax}%
+\Tg</script>%
+\IfFileExists{\jobname.ids}{\HCode{<script type="text/javascript">\Hnewline}%
+\BVerbatimInput{\jobname.ids}%
+\HCode{</script>\Hnewline}%
+\Tg</div>%
+}{}
+}{%
+\HCode{</body>\Hnewline}%
+}
+% \end{macrocode}
+% Now I just need to add a newcommand command which outputs the
+% appropriate newcommands to MathJax; then this should be "good
+% enough" for our purposes.
+% \begin{macrocode}
+\newtoks\eqtoks
+\def\AltMath#1${\eqtoks{#1}%
+ \HCode{<script type="math/tex">\the\eqtoks</script>}$}
+\Configure{$}{}{}{\expandafter\AltMath}
+
+\def\AltlMathI#1\){\eqtoks{#1}%
+ \HCode{<script type="math/tex">\the\eqtoks</script>}\)}
+\Configure{()}{\AltlMathI}{}
+
+\def\AltlDisplay#1\]{\eqtoks{#1}%
+ \HCode{<script type="math/tex; mode=display">\the\eqtoks</script>}\]}
+\Configure{[]}{\AltlDisplay}{}
+
+\def\AltlDisplayI#1$${\eqtoks{#1}%
+ \HCode{<script type="math/tex; mode=display">\the\eqtoks</script>}$$}
+\Configure{$$}{}{}{\expandafter\AltlDisplayI}
+% \end{macrocode}
+% Need to turn off htmlpar too, as expained in http://tex.stackexchange.com/questions/204930/vertical-spaces-in-htlatex-scriptenv
+% \begin{macrocode}
+\newcommand\VerbMath[1]{%
+\renewenvironment{#1}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{#1}{\ifvmode \IgnorePar\fi \EndP\HCode{<script type="math/tex; mode=display"> \string\begin{#1}\Hnewline}\HtmlParOff}{\HtmlParOn\HCode{\string\end{#1}</script>}}
+}
+% \end{macrocode}
+% This is a fix for the LAODE book, which uses matlabEquation as if it were an equation
+% \begin{macrocode}
+\ScriptEnv{matlabEquation}{\ifvmode \IgnorePar\fi \EndP\HCode{<script type="math/tex; mode=display"> \string\begin{equation}\Hnewline}\HtmlParOff}{\HtmlParOn\HCode{\string\end{equation}</script>}}
+
+\VerbMath{equation}
+\VerbMath{equation*}
+\VerbMath{align}
+\VerbMath{align*}
+\VerbMath{alignat}
+\VerbMath{alignat*}
+\VerbMath{eqnarray}
+\VerbMath{eqnarray*}
+
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/labels.dtx b/macros/latex/contrib/ximera/src/labels.dtx
new file mode 100644
index 0000000000..05ecf31fc9
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/labels.dtx
@@ -0,0 +1,15 @@
+% \subsubsection{Labels and references}
+% Labels and refs both generate anchors.
+% \DescribeMacro{\label}{A |\label| can be referenced from any file in the xourse.}
+% \begin{macrocode}
+%<*htXimera>
+\let\oldlabel\label
+\renewcommand{\label}[1]{\oldlabel{#1}\HCode{<a class="ximera-label" id="#1"></a>}}
+%</htXimera>
+% \end{macrocode}
+% \DescribeMacro{\ref}{A |\ref| can connect one \TeX\ file to another if they are in the same xourse.}
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\ref}[1]{\HCode{<a class="reference" href="\##1">#1</a>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/leash.dtx b/macros/latex/contrib/ximera/src/leash.dtx
new file mode 100644
index 0000000000..b52b5e2bf0
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/leash.dtx
@@ -0,0 +1,18 @@
+% \subsubsection{Leashes}
+% \DescribeEnv{leash}{Put content inside a scrollable box.}
+% \begin{macrocode}
+%<*classXimera>
+
+\newenvironment{leash}[1]{%
+}{%
+}
+
+
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{leash}[1]{\ifvmode \IgnorePar\fi \EndP\HCode{<div style="overflow: auto; height: #1px">}}{\HCode{</div>}\IgnoreIndent}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/link.dtx b/macros/latex/contrib/ximera/src/link.dtx
new file mode 100644
index 0000000000..9e76659e83
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/link.dtx
@@ -0,0 +1,31 @@
+% Hyperlinks to outside documents
+% \begin{macrocode}
+%<*classXimera>
+\newcommand*{\link}[2][]{#1%
+ \ifthenelse{\equal{#1}{}}%
+ {\footnote{Link: \url{#2}}}%
+ {\footnote{See #1 at \url{#2}}}
+ }
+%</classXimera>
+% \end{macrocode}
+
+
+% \begin{macrocode}
+%<*htXimera>
+% This is a command used in versions of documents created with
+% these classes; in Jim's opinion it should be deprecated for |\href|
+% Bart on the other hand likes |\link|
+\renewcommand*{\link}[2][]{%
+\ifthenelse{\equal{#1}{}}%
+{\url{#2}}
+{\href{#2}{#1}}}
+%\renewcommand*{\link}[2][]{%
+%\ifthenelse{\equal{#1}{}}%
+%{\url{#2}}
+%{\href{#2}{#1}}}
+
+% because hyperref redefines stuff atbegindocument, we do too.
+\AtBeginDocument{\renewcommand{\ref}[1]{\HCode{<a class="reference" href="\##1">#1</a>}}}
+
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/logo.dtx b/macros/latex/contrib/ximera/src/logo.dtx
new file mode 100644
index 0000000000..cbe808502a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/logo.dtx
@@ -0,0 +1,30 @@
+% \subsection{Logos}
+% \DescribeMacro{\logo}{A logo for the xourse.}
+% \begin{macrocode}
+%<*classXourse>
+\newcommand*{\logo}[1]{%
+ \ifx\@onlypreamble\@notprerr
+ \ClassError{xourse}{logo can only be used in the preamble}
+ {Move your logo command to the preamble}
+ \else %
+ \IfFileExists{#1}%
+ {\gdef\xourse@logo{#1}}%
+ {\ClassError{xourse}{logo file does not exist}
+ {To use logo, make sure that the referenced image file exists}}%
+ \fi%
+}
+
+%</classXourse>
+% \end{macrocode}
+
+% The xourse logo is an |og:image| in the opengraph taxonomy.
+% \begin{macrocode}
+%<*htXourse>
+\Configure{@HEAD}{%
+ \HCode{<meta name="og:image" content="}%
+\ifdefined\xourse@logo%
+ \xourse@logo%
+\fi%
+\HCode{" />\Hnewline}}%
+%</htXourse>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/macros.dtx b/macros/latex/contrib/ximera/src/macros.dtx
new file mode 100644
index 0000000000..0968942be5
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/macros.dtx
@@ -0,0 +1,14 @@
+% \subsubsection{Macros}
+% Makes everymath display style even when inline, could be optional.
+% \begin{macrocode}
+%<*classXimera>
+\everymath{\displaystyle}
+%</classXimera>
+% \end{macrocode}
+% Ok not everything, we also need to configure ``display style'' limits.
+% \begin{macrocode}
+%<*classXimera>
+\let\prelim\lim
+\renewcommand{\lim}{\displaystyle\prelim}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/makeCounter.dtx b/macros/latex/contrib/ximera/src/makeCounter.dtx
new file mode 100644
index 0000000000..2e898255e7
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/makeCounter.dtx
@@ -0,0 +1,37 @@
+% \subsubsection{Utility macros}
+% These are a list of new utility macros that are generally useful and are loaded after packages and the Tikz Fix.
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% \begin{macro}{NewCounter}
+% Improved version of |\newcounter| to check for existance before creating a counter to minimize conflicts with packages. Added by Jason Nowell
+% \begin{macrocode}
+\newcommand{\Make@Counter}[1]{% This is an internal macro that should probably be depreciated for the below universal macro.
+% Code located in "Utilitymacros.dtx"
+ \@ifundefined{c@#1}% Check to see if counter exists
+ { % If not, create it and set it to 0.
+ \newcounter{#1}
+ \setcounter{#1}{0}
+ }
+ {%If so, reset to 0.
+ \setcounter{#1}{0}
+ }
+}
+
+\newcommand{\MakeCounter}[1]{%% Code located in "Utilitymacros.dtx"
+% Code located in "Utilitymacros.dtx"
+ \@ifundefined{c@#1}% Check to see if counter exists
+ { % If not, create it and set it to 0.
+ \newcounter{#1}
+ \setcounter{#1}{0}
+ }
+ {%If so, reset to 0.
+ \setcounter{#1}{0}
+ }
+}
+% \end{macrocode}
+%</classXimera>
+% \end{macro}
+
+
+
diff --git a/macros/latex/contrib/ximera/src/metadata.dtx b/macros/latex/contrib/ximera/src/metadata.dtx
new file mode 100644
index 0000000000..5f33cde072
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/metadata.dtx
@@ -0,0 +1,32 @@
+% \subsubsection{Metadata}
+% To encourage authors to include relevant parseable metadata in the
+% preamble, we define some currently ignored commands.
+
+% \DescribeMacro{\license}{In the preamble, use |\license| with an SPDX license expression.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\license}{\excludecomment}
+%</classXimera>
+% \end{macrocode}
+
+% \DescribeMacro{\acknowledgement}{In the preamble, use |\acknowledgement| to credit others who contributed to the intellectual content beside the author.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\acknowledgement}{\excludecomment}
+%</classXimera>
+% \end{macrocode}
+
+% \DescribeMacro{\tag}{In the preamble, a |\tag| provides a free-form taxonomy.}
+% \begin{macrocode}
+%<*classXimera>
+\renewcommand{\tag}{\excludecomment}
+%</classXimera>
+% \end{macrocode}
+% On the HTML side, we mark the file as the appropriate kind of
+% object---either activity or xourse.
+% \begin{macrocode}
+%<*htXourse>
+% Mark this as a xourse file
+\Configure{@HEAD}{\HCode{<meta name="description" content="xourse" />\Hnewline}}
+%</htXourse>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/only.dtx b/macros/latex/contrib/ximera/src/only.dtx
new file mode 100644
index 0000000000..cdb676c90e
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/only.dtx
@@ -0,0 +1,38 @@
+% \subsubsection{Only}
+
+% \DescribeEnv{prompt}{The prompt part for mathmode}
+% \begin{macrocode}
+%<*classXimera>
+\ifxake
+ \newenvironment{prompt}{}{}
+\else
+\ifhandout
+ \NewEnviron{prompt}{}
+% Currently breaks when put in mathmode!
+% \newenvironment{prompt}{\suppress}{\endsuppress}
+\else
+ \newenvironment{prompt}
+ {\bgroup\color{gray!50!black}}
+ {\egroup}
+\fi
+\fi
+% \end{macrocode}
+
+% \DescribeEnv{onlineOnly}{Only display it online}
+% \begin{macrocode}
+\ifhandout
+ \NewEnviron{onlineOnly}{
+ \iftikzexport
+ \BODY
+ \else
+ \fi
+ }
+\else
+ \newenvironment{onlineOnly}
+ {\bgroup\color{red!50!black}}
+ {\egroup}
+\fi
+
+\newcommand{\pdfOnly}[1]{\iftikzexport\else #1\fi}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/options.dtx b/macros/latex/contrib/ximera/src/options.dtx
new file mode 100644
index 0000000000..7e131bb0ba
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/options.dtx
@@ -0,0 +1,123 @@
+% \subsection{Options for the class}
+% We start by listing the options for the \textsf{ximera} document class. Note, since the \textsf{xourse} class is based on the \textsf{ximera} class, all listed options are available there too.
+%
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% \begin{macro}{handout}
+% The default behavior of the class is to display \textbf{all} content. This means that if any questions are asked, all answers are shown. Moreover, some content will only have a meaningful presentation when displayed online. When compiled without any options, this content will be shown too. This option will supress such content and generate a reasonable printiable ``handout.''
+% \begin{macrocode}
+\newif\ifhandout
+\handoutfalse
+\DeclareOption{handout}{\handouttrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{noauthor}
+% By default, authors are listed at the bottom of the first page of a document. This option will supress the listing of the authors.
+% \begin{macrocode}
+\newif\ifnoauthor
+\noauthorfalse
+\DeclareOption{noauthor}{\noauthortrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{nooutcomes}
+% By default, learning outcomes are listed at the bottom of the first page of a document. This option will supress the listing of the learning outcomes.
+% \begin{macrocode}
+\newif\ifnooutcomes
+\nooutcomesfalse
+\DeclareOption{nooutcomes}{\nooutcomestrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{instructornotes}
+% This option will turn on (and off) notes written for the instructor.
+% \begin{macrocode}
+\newif\ifinstructornotes
+\instructornotesfalse
+\DeclareOption{instructornotes}{\instructornotestrue}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{noinstructornotes}
+% This option will turn off (and on) notes written for the instructor.
+% \begin{macrocode}
+\DeclareOption{noinstructornotes}{\instructornotestrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{hints}
+% When the \texttt{handout} options is used, hints are not shown. This option will make hints visible in handout mode.
+% \begin{macrocode}
+\newif\ifhints
+\hintsfalse
+\DeclareOption{hints}{\hintstrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{newpage}
+% This option will start each problem-like environment (\texttt{exercise}, \texttt{question}, \texttt{problem}, and \texttt{exploration}) start on a new page.
+% \begin{macrocode}
+\newif\ifnewpage
+\newpagefalse
+\DeclareOption{newpage}{\newpagetrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{numbers}
+% This option will number the titles of the activity. By default the activities are unnumbered.
+% \begin{macrocode}
+\newif\ifnumbers
+\numbersfalse
+\DeclareOption{numbers}{\numberstrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{wordchoicegiven}
+% This option will replace the choices shown by \texttt{wordChoice} with the correct choice. No indication of the \texttt{wordChoice} environment will be shown.
+% \begin{macrocode}
+\newif\ifwordchoicegiven
+\wordchoicegivenfalse
+\DeclareOption{wordchoicegiven}{\wordchoicegiventrue}
+\newif\iffirstinlinechoice% Support for other wordchoice command contents.
+\firstinlinechoicetrue
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+
+\newif\ifxake
+\xakefalse
+\DeclareOption{xake}{\xaketrue}
+
+\newif\iftikzexport
+\tikzexportfalse
+\DeclareOption{tikzexport}{%
+ \tikzexporttrue%
+ \handoutfalse%
+ \numbersfalse%
+ \newpagefalse%
+ \hintsfalse%
+ \nooutcomesfalse%
+}
+
+\DeclareOption*{%
+ \PassOptionsToClass{\CurrentOption}{article}%
+}
+\ProcessOptions\relax
+\LoadClass{article}
+
+\ifdefined\HCode
+ \xaketrue%
+ \tikzexporttrue%
+ \handoutfalse%
+ \numbersfalse%
+ \newpagefalse%
+ \hintsfalse%
+ \nooutcomesfalse%
+\fi
+
+%</classXimera>
+% \end{macrocode}
+
+
+
diff --git a/macros/latex/contrib/ximera/src/optionsxourse.dtx b/macros/latex/contrib/ximera/src/optionsxourse.dtx
new file mode 100644
index 0000000000..1217fce199
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/optionsxourse.dtx
@@ -0,0 +1,27 @@
+% \begin{macrocode}
+%<*classXourse>
+% \end{macrocode}
+% \begin{macro}{notoc}
+% The default behavior of the class is to provide a table of contents listing all activities in the course. This option will supress this table of contents.
+% \begin{macrocode}
+\newif\ifnotoc
+\notocfalse
+\DeclareOption{notoc}{\notoctrue}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{nonewpage}
+% The default behavior of the class is to start each activity on a new page. This option will start activities without making a new page.
+% \begin{macrocode}
+\newif\ifnonewpage
+\nonewpagefalse
+\DeclareOption{nonewpage}{\nonewpagetrue}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{ximera}}
+\ProcessOptions\relax
+\LoadClass{ximera}
+% \begin{macrocode}
+%</classXourse>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/outcomes.dtx b/macros/latex/contrib/ximera/src/outcomes.dtx
new file mode 100644
index 0000000000..1e174b7655
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/outcomes.dtx
@@ -0,0 +1,34 @@
+% \subsubsection{Learning Outcomes}
+% \DescribeMacro{\outcome}{Specify a learning outcome, either at the level of a |problem| or an entire document in the preamble.}
+% \begin{macrocode}
+%<*classXimera>
+\def\theoutcomes{}
+
+\ifdefined\HCode%
+ \newcommand{\outcome}[1]{}
+\else%
+ \newwrite\outcomefile
+ \immediate\openout\outcomefile=\jobname.oc
+
+ \newcommand{\outcome}[1]{\edef\theoutcomes{\theoutcomes #1~}%
+ \immediate\write\outcomefile{\unexpanded{\outcome}{#1}}}
+ \fi%
+%</classXimera>
+% \end{macrocode}
+% These can appear in either the preamble or in problem environments.
+% with pdflatex, we produce the .oc file which includes ALL the
+% outcomes; in the tex4ht world, we just produce spans for the
+% specific outcomes.
+% \begin{macrocode}
+%<*cfgXimera>
+\renewcommand{\outcome}[1]{
+ \Configure{@HEAD}{\HCode{<meta name="learning-outcome" content="#1"/>\Hnewline}}
+}
+% Sometimes there are no outcomes at all
+\IfFileExists{\jobname.oc}{\input{\jobname.oc}}{}
+
+\renewcommand{\outcome}[1]{%
+ \HCode{<span class="learning-outcome">#1</span>}
+}
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/packages.dtx b/macros/latex/contrib/ximera/src/packages.dtx
new file mode 100644
index 0000000000..72fb4c6e2a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/packages.dtx
@@ -0,0 +1,54 @@
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% \subsection{Loading packages}
+% Since we want |\cancel| to work, we load it here to avoid polluting the |.jax| output.
+% \begin{macrocode}
+\RequirePackage[makeroom]{cancel}
+% \end{macrocode}
+% Quite a few packages are required by the document class. This is a
+% list of required packages. As packages are added to this list, we
+% should include a comment as to where they are being utilized. This
+% will help keep this list from being redundant and/or outdated.
+% \begin{macrocode}
+\RequirePackage[inline]{enumitem}
+\RequirePackage[pagestyles]{titlesec}
+\RequirePackage{titletoc}
+\RequirePackage{titling}
+\RequirePackage{url}
+\RequirePackage[table]{xcolor}
+\RequirePackage{tikz}
+\RequirePackage{pgfplots}
+\usepgfplotslibrary{groupplots}
+\usetikzlibrary{calc}
+\RequirePackage{fancyvrb}
+% \end{macrocode}
+% Load |forloop| for the problem environment dynamic naming and
+% building.
+% \begin{macrocode}
+\RequirePackage{forloop}
+% \end{macrocode}
+% Now we load even more packages.
+% \begin{macrocode}
+\RequirePackage{environ}% Included to allow saving of environment contents. This does *not* play well with various verbatem environments however and would be great to find a way around utilizing this package. One option is the "Suppress" command included below.
+\RequirePackage{amssymb}% Included to have access to math typeset.
+\RequirePackage{amsmath}% Included to have access to math typeset.
+\RequirePackage{amsthm}% Included to have access to math typeset.
+\RequirePackage{xifthen}% http://ctan.org/pkg/xifthen
+\RequirePackage{multido}% http://ctan.org/pkg/multido
+\RequirePackage{listings} %% is this required???
+
+\RequirePackage{xkeyval}
+
+\RequirePackage{comment}
+%</classXimera>
+% \end{macrocode}
+% Various packages must be loaded early to avoid polluting the |.jax|
+% file.
+% \begin{macrocode}
+%<*classXimera>
+\RequirePackage{gettitlestring}
+\RequirePackage{nameref}
+\RequirePackage{epstopdf}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/pagesetup.dtx b/macros/latex/contrib/ximera/src/pagesetup.dtx
new file mode 100644
index 0000000000..9bf13d3cd9
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/pagesetup.dtx
@@ -0,0 +1,55 @@
+% \subsection{Page setup}
+% We want non-indented spaced-out paragraphs.
+% \begin{macrocode}
+%<*classXimera>
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{5pt}
+%</classXimera>
+% \end{macrocode}
+% To avoid weird margins in 2-sided mode, change the margins.
+% \begin{macrocode}
+%<*classXimera>
+\oddsidemargin 62pt
+\evensidemargin 62pt
+\textwidth 345pt
+\headheight 14pt
+%</classXimera>
+% \end{macrocode}
+% On the HTML side, there is more complicated page setup to perform.
+% \begin{macrocode}
+%<*cfgXimera>
+\Preamble{xhtml}
+
+% We don't want to translate font suggestions with ugly wrappers like
+% <span class="cmti-10"> for italic text
+\NoFonts
+
+% Don't output xml version tag
+\Configure{VERSION}{}
+
+% Output HTML5 doctype instead of the default for HTML4
+\Configure{DOCTYPE}{\HCode{<!doctype html>\Hnewline}}
+
+% Custom page opening
+\Configure{HTML}{\HCode{<html lang="en">\Hnewline}}{\HCode{\Hnewline</html>}}
+
+% Reset <head>, aka delete all default boilerplate; alternatively set up new content
+\Configure{@HEAD}{\HCode{<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/\string~gurari/TeX4ht/)" />\Hnewline}}
+\Configure{@HEAD}{\HCode{<meta name="ximera" content="version 0.0.1" />\Hnewline}}
+\Configure{@HEAD}{\HCode{<link href="https://ximera.osu.edu/public/stylesheets/standalone.css" rel="stylesheet" media="screen"/>\Hnewline}}
+\Configure{@HEAD}{\HCode{<script type="text/javascript" async src="https://ximera.osu.edu/public/javascripts/standalone.min.js"></script>\Hnewline}}
+%</cfgXimera>
+% \end{macrocode}
+% Disable certain ligatures in HTML.
+% \begin{macrocode}
+%<*htXimera>
+\usepackage{microtype}
+\DisableLigatures[f]{encoding=*}
+%</htXimera>
+% \end{macrocode}
+% I am not sure what this does.
+% \begin{macrocode}
+%<*htXimera>
+\NewEnviron{html}{\HCode{\BODY}}
+%</htXimera>
+% \end{macrocode} \ No newline at end of file
diff --git a/macros/latex/contrib/ximera/src/problem.dtx b/macros/latex/contrib/ximera/src/problem.dtx
new file mode 100644
index 0000000000..4a8cfaeddb
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/problem.dtx
@@ -0,0 +1,197 @@
+% \subsubsection{Problem environments}
+
+% These are problem environment decorations (these should be user invoked, not default).
+% The decoration for these environments were inspired by
+% \url{http://tex.stackexchange.com/questions/11098/nice-formatting-for-theorems}
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+
+% \begin{macro}{latexProblemContent}
+% Added for those that want to use UF problems without using the problem filter code. This command is renewed into something meaningful in the 'ProblemSelector.sty'.
+% \begin{macrocode}
+\providecommand{\latexProblemContent}[1]{#1}
+% Iterate count for problem counts.
+\Make@Counter{Iteration@probCnt}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\hang}{% top theorem decoration
+ \begingroup%
+ \setlength{\unitlength}{.005\linewidth}% \linewidth/200
+ \begin{picture}(0,0)(1.5,0)%
+ \linethickness{1pt} \color{black!50}%
+ \put(-3,2){\line(1,0){206}}% Top line
+ \multido{\iA=2+-1,\iB=50+-10}{5}{% Top hangs
+ \color{black!\iB}%
+ \put(-3,\iA){\line(0,-1){1}}% Top left hang
+ %\put(203,\iA){\line(0,-1){1}}% Top right hang
+ }%
+ \end{picture}%
+ \endgroup%
+}%
+\newcommand{\hung}{% bottom theorem decoration
+ \nobreak
+ \begingroup%
+ \setlength{\unitlength}{.005\linewidth}% \linewidth/200
+ \begin{picture}(0,0)(1.5,0)%
+ \linethickness{1pt} \color{black!50}%
+ \put(60,0){\line(1,0){143}}% Bottom line
+ \multido{\iA=0+1,\iB=50+-10}{5}{% Bottom hangs
+ \color{black!\iB}%
+ %\put(-3,\iA){\line(0,1){1}}% Bottom left hang
+ \put(203,\iA){\line(0,1){1}}% Bottom right hang
+ \put(\iB,0){\line(60,0){10}}% Left fade out
+ }%
+ \end{picture}%
+ \endgroup%
+}%
+% \end{macrocode}
+%
+% Configure environment configuration commands
+%
+% The command |\problemNumber| contains all the format code to determine the number (and the format of the number) for any of the problem environments.
+%
+% \begin{macrocode}
+\MakeCounter{problem}
+\newcommand{\problemNumber}{
+% First we determine if we have a counter for this question depth level.
+\ifcsname c@depth\Roman{problem@Depth}Count\endcsname% Check to see if counter exists
+ %If so, do nothing.
+ \else
+ %If not, create it.
+ \expandafter\newcounter{depth\Roman{problem@Depth}Count}
+ \expandafter\setcounter{depth\Roman{problem@Depth}Count}{0}
+ \fi
+
+\expandafter\stepcounter{depth\Roman{problem@Depth}Count}
+\arabic{depthICount}% The first problem depth, what use to be |\theproblem|.
+
+\forloop{Iteration@probCnt}{2}{\arabic{Iteration@probCnt} < \numexpr \value{problem@Depth} + 1 \relax}{%
+ .\expandafter\arabic{depth\Roman{Iteration@probCnt}Count}% Get the problem number of the next depth level and append it with a ".".
+}
+%\@ifpackageloaded{shuffle}{<true>}{<false>}% Check if Shuffle has been added. If so, add special numbering to the shuffled "groups". Currently commented out while we decide what that should look like (compared to the normal nested problems).
+%\ifhandout % Currently handout mode doesn't allow hints. Putting this code in place in case that changes.
+% \theproblem
+%\else
+% \theproblem
+%\fi
+}
+
+
+%%%%%% Configure various problem environment commands
+\Make@Counter{problem@Depth}
+
+
+
+%%%% Configure environments start content
+
+\newcommand{\problemEnvironmentStart}[2]{%
+% This takes in 2 arguments.
+% The first is optional and is the old optional argument from existing environments.
+% This is passed down to the associated problem environment name in case you want a global value.
+% The second argument is mandatory and is the name of the 'problem' environment,
+% such as problem, question, exercise, etc.
+% It then configures everything needed at the start of that environment.
+
+\stepcounter{problem@Depth}% Started a problem, so we've sunk another problem layer.
+\def\spaceatend{#1}%
+\begin{trivlist}%
+\item%
+ [%
+ \hskip\labelsep\sffamily\bfseries
+ #2 \problemNumber% Determine the correct number of the problem, and the format of that number.
+ ]%
+\slshape
+}
+
+
+
+%%%%% Configure environments end content
+
+\newcommand{\problemEnvironmentEnd}{%This configures all the end content for a problem.
+%
+% First we need to see if we've dropped fully out of a depth level,
+% so we can reset that counter back to zero for the next time we enter that depth level.
+\stepcounter{problem@Depth}
+\ifcsname c@depth\Roman{problem@Depth}Count\endcsname
+ \expandafter\ifnum\expandafter\value{depth\Roman{problem@Depth}Count}>0
+ \expandafter\setcounter{depth\Roman{problem@Depth}Count}{0}
+ \fi
+\fi
+
+\addtocounter{problem@Depth}{-2}% Exited a problem so we've exited a problem layer. Need -2 because we steppped once at the start to check for needing a depth-level count reset.
+
+\par\addvspace{.5ex}\nobreak\noindent\hung %% line at the bottom
+
+\ifhandout
+ \ifnewpage
+ \newpage
+ \fi
+\fi
+\end{trivlist}
+}
+
+
+
+%%%% Now populate the old environment names
+%
+% Old environments were "problem", "exercise", "exploration", and "question".
+% Note that you can add content to the start/end code on top of these base code pieces if you want.
+
+
+\newenvironment{problem}[1][2in]%
+{%Env start code
+\problemEnvironmentStart{#1}{Problem}
+}
+{%Env end code
+\problemEnvironmentEnd
+}
+
+\newenvironment{exercise}[1][2in]%
+{%Env start code
+\problemEnvironmentStart{#1}{Exercise}
+}
+{%Env end code
+\problemEnvironmentEnd
+}
+
+\newenvironment{exploration}[1][2in]%
+{%Env start code
+\problemEnvironmentStart{#1}{Exploration}
+}
+{%Env end code
+\problemEnvironmentEnd
+}
+
+\newenvironment{question}[1][2in]%
+{%Env start code
+\problemEnvironmentStart{#1}{Question}
+}
+{%Env end code
+\problemEnvironmentEnd
+}
+%</classXimera>
+% \end{macrocode}
+
+
+% Use an ``identification'' counter to assign IDs to the various problem-related DOM elements
+% \begin{macrocode}
+%<*htXimera>
+\newcounter{identification}
+\setcounter{identification}{0}
+
+\newcommand{\ConfigureQuestionEnv}[2]{%
+% refstepcounter ensures that labels get updated within these environments
+\renewenvironment{#1}{\refstepcounter{problem}}{}%
+\ConfigureEnv{#1}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div role="article" class="problem-environment #2" id="problem\arabic{identification}">}}{\ifvmode \IgnorePar\fi \EndP\HCode{</div>}\IgnoreIndent}{}{}%
+}
+
+\ConfigureQuestionEnv{problem}{problem}
+\ConfigureQuestionEnv{exercise}{exercise}
+\ConfigureQuestionEnv{question}{question}
+\ConfigureQuestionEnv{exploration}{exploration}
+\ConfigureQuestionEnv{hint}{hint}
+%%%%\ConfigureQuestionEnv{shuffle}{shuffle}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/proof.dtx b/macros/latex/contrib/ximera/src/proof.dtx
new file mode 100644
index 0000000000..ab86e93f52
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/proof.dtx
@@ -0,0 +1,10 @@
+% \subsubsection{Proofs}
+% \DescribeEnv{proof}{A mathematical proof environment.}
+% \begin{macrocode}
+%<*classXimera>
+\renewcommand{\qedsymbol}{$\blacksquare$}
+\renewenvironment{proof}[1][\proofname]
+ {\begin{trivlist}\item[\hskip \labelsep \itshape \bfseries #1{}\hspace{2ex}]}
+{\qed\end{trivlist}}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/sectioning.dtx b/macros/latex/contrib/ximera/src/sectioning.dtx
new file mode 100644
index 0000000000..3f9100294d
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/sectioning.dtx
@@ -0,0 +1,49 @@
+% \subsection{Sectioning}
+% Makes the table of contents look a bit better. This can be
+% redefined in the preamble if you do not like the appearance.
+% \DescribeMacro{\section}{The name of a section inside an activity.}
+% \begin{macrocode}
+%<*classXourse>
+\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{4.2em}}
+%</classXourse>
+% \end{macrocode}
+% \DescribeMacro{\subsection}{The name of a subsection inside an activity.}
+% \begin{macrocode}
+%<*classXourse>
+\renewcommand*\l@subsection{\@dottedtocline{2}{3.8em}{4.2em}}
+%</classXourse>
+% \end{macrocode}
+% Xourse files can have parts.
+% \DescribeMacro{\part}{The name of a large part of a xourse.}
+% \begin{macrocode}
+%<*htXourse>
+\newcounter{ximera@part}
+\setcounter{ximera@part}{0}
+\renewcommand\part[1]{%
+\stepcounter{ximera@part}%
+\ifvmode \IgnorePar\fi \EndP%
+%\HCode{<h1 id="part\arabic{ximera@part}" class="card part">}#1\HCode{</h1>}% makes cards disappear?
+\HCode{<h1 id="part\arabic{ximera@part}" class="card part">#1</h1>}%
+\IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
+% Paragraph commands emit spans.
+% \DescribeMacro{\paragraph}{A small heading.}
+% \begin{macrocode}
+%<*cfgXimera>
+\renewcommand{\paragraph}[1]{%
+ \HCode{<span class="paragraphHead">}%
+ #1%
+ \HCode{</span>}\par\IgnorePar}
+%</cfgXimera>
+% \end{macrocode}
+% \DescribeMacro{\subparagraph}{An even smaller heading.}
+% \begin{macrocode}
+%<*cfgXimera>
+\renewcommand{\subparagraph}[1]{%
+ \HCode{<span class="subparagraphHead">}%
+ #1%
+ \HCode{</span>}\par\IgnorePar}
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/solution.dtx b/macros/latex/contrib/ximera/src/solution.dtx
new file mode 100644
index 0000000000..45f6301031
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/solution.dtx
@@ -0,0 +1,30 @@
+% \subsubsection{Solution}
+% \DescribeEnv{solution}{The solution to a problem.}
+% \begin{macrocode}
+%<*classXimera>
+%% solution environment
+\ifhandout % what follows is handout behavior
+\newenvironment{solution}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+\else
+\newenvironment{solution}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Solution:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+\fi
+
+
+
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/suppress.dtx b/macros/latex/contrib/ximera/src/suppress.dtx
new file mode 100644
index 0000000000..dcdcf924d1
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/suppress.dtx
@@ -0,0 +1,33 @@
+% \subsubsection{Suppress}
+% \DescribeEnv{suppress}{The suppress environment is a good way to suppress output without
+% commenting it. This way we can avoid many of the places we use
+% environ package and this should also avoid most of the verbatim
+% conflicts.}
+% This is code adapted from |syntonly.sty|.
+% \begin{macrocode}
+%<*classXimera>
+\font\dummyft@=dummy \relax
+\def\suppress{%
+ \begingroup\par
+ \parskip\z@
+ \offinterlineskip
+ \baselineskip=\z@skip
+ \lineskip=\z@skip
+ \lineskiplimit=\maxdimen
+ \dummyft@
+ \count@\sixt@@n
+ \loop\ifnum\count@ >\z@
+ \advance\count@\m@ne
+ \textfont\count@\dummyft@
+ \scriptfont\count@\dummyft@
+ \scriptscriptfont\count@\dummyft@
+ \repeat
+ \let\selectfont\relax
+ \let\mathversion\@gobble
+ \let\getanddefine@fonts\@gobbletwo
+ \tracinglostchars\z@
+ \frenchspacing
+ \hbadness\@M}
+\def\endsuppress{\par\endgroup}
+%</classXimera>
+% \end{macrocode} \ No newline at end of file
diff --git a/macros/latex/contrib/ximera/src/textcolor.dtx b/macros/latex/contrib/ximera/src/textcolor.dtx
new file mode 100644
index 0000000000..318d34365a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/textcolor.dtx
@@ -0,0 +1,20 @@
+% Make \textcolor work using https://tex.stackexchange.com/questions/390127/textcolor-with-tex4ht
+% \begin{macrocode}
+%<*cfgXimera>
+\makeatletter
+\Configure{textcolor}{\HCode{<span style="color:\#\tsf@color;">}}{\HCode{</span>}}
+% redefine \textcolor command
+\let\oldtextcolor\textcolor
+
+\renewcommand\textcolor[2]{%
+ % we need to convert the current color to hexadecimal form usable in the style attribute
+ % the \tsf@color macro is used in the \Configure{textcolor} configuration to insert the
+ % CSS color
+ \extractcolorspec{#1}{\tsf@color}%
+ \expandafter\convertcolorspec\tsf@color{HTML}\tsf@color%
+ % call the original command
+ \oldtextcolor{#1}{#2}%
+}%
+\makeatother
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/theorems.dtx b/macros/latex/contrib/ximera/src/theorems.dtx
new file mode 100644
index 0000000000..292d7a89b2
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/theorems.dtx
@@ -0,0 +1,174 @@
+% \subsubsection{Theorem and theorem-like environments}
+% On the web, a theorem is emitted as a special |<div>|.
+% \begin{macrocode}
+%<*htXimera>
+\newcommand{\ConfigureTheoremEnv}[1]{%
+\renewenvironment{#1}[1][]{\refstepcounter{problem}%
+\ifthenelse{\equal{##1}{}}{}{%
+ \HCode{<span class="theorem-like-title">}##1\HCode{</span>}%
+}}{}
+\ConfigureEnv{#1}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="theorem-like problem-environment #1" id="problem\arabic{identification}">}}{\HCode{</div>}\IgnoreIndent}{}{}%
+}
+%</htXimera>
+%<classXimera>\theoremstyle{definition} % No italic (because this makes also text in TikZ italic !!!)
+% \end{macrocode}
+
+% The key is to make sure that the theorem environments are defined in
+% a corresponding fashion on the web and on paper.
+
+% \DescribeEnv{theorem}{Theorem}
+% \begin{macrocode}
+%<classXimera> \newtheorem{theorem}{Theorem}
+%<htXimera> \ConfigureTheoremEnv{theorem}
+% \end{macrocode}
+
+% \DescribeEnv{algorithm}{Algorithm}
+% \begin{macrocode}
+%<classXimera> \newtheorem{algorithm}{Algorithm}
+%<htXimera> \ConfigureTheoremEnv{algorithm}
+% \end{macrocode}
+
+% \DescribeEnv{axiom}{Axiom}
+% \begin{macrocode}
+%<classXimera> \newtheorem{axiom}{Axiom}
+%<htXimera> \ConfigureTheoremEnv{axiom}
+% \end{macrocode}
+
+% \DescribeEnv{claim}{Claim}
+% \begin{macrocode}
+%<classXimera> \newtheorem{claim}{Claim}
+%<htXimera> \ConfigureTheoremEnv{claim}
+% \end{macrocode}
+
+% \DescribeEnv{conclusion}{Conclusion}
+% \begin{macrocode}
+%<classXimera> \newtheorem{conclusion}{Conclusion}
+%<htXimera> \ConfigureTheoremEnv{conclusion}
+% \end{macrocode}
+
+% \DescribeEnv{condition}{Condition}
+% \begin{macrocode}
+%<classXimera> \newtheorem{condition}{Condition}
+%<htXimera> \ConfigureTheoremEnv{condition}
+% \end{macrocode}
+
+% \DescribeEnv{conjecture}{Conjecture}
+% \begin{macrocode}
+%<classXimera> \newtheorem{conjecture}{Conjecture}
+%<htXimera> \ConfigureTheoremEnv{conjecture}
+% \end{macrocode}
+
+% \DescribeEnv{corollary}{Corollary}
+% \begin{macrocode}
+%<classXimera> \newtheorem{corollary}{Corollary}
+%<htXimera> \ConfigureTheoremEnv{corollary}
+% \end{macrocode}
+
+% \DescribeEnv{criterion}{Criterion}
+% \begin{macrocode}
+%<classXimera> \newtheorem{criterion}{Criterion}
+%<htXimera> \ConfigureTheoremEnv{criterion}
+% \end{macrocode}
+
+% \DescribeEnv{definition}{Definition}
+% \begin{macrocode}
+%<classXimera> \newtheorem{definition}{Definition}
+%<htXimera> \ConfigureTheoremEnv{definition}
+% \end{macrocode}
+
+% \DescribeEnv{example}{Example}
+% \begin{macrocode}
+%<classXimera> \newtheorem{example}{Example}
+%<htXimera> \ConfigureTheoremEnv{example}
+% \end{macrocode}
+
+% \DescribeEnv{explanation}{Explanation}
+% \begin{macrocode}
+%<classXimera> \newtheorem*{explanation}{Explanation}
+%<htXimera> \ConfigureTheoremEnv{explanation}
+% \end{macrocode}
+
+% \DescribeEnv{fact}{Fact}
+% \begin{macrocode}
+%<classXimera> \newtheorem{fact}{Fact}
+%<htXimera> \ConfigureTheoremEnv{fact}
+% \end{macrocode}
+
+% \DescribeEnv{lemma}{Lemma}
+% \begin{macrocode}
+%<classXimera> \newtheorem{lemma}{Lemma}
+%<htXimera> \ConfigureTheoremEnv{lemma}
+% \end{macrocode}
+
+% \DescribeEnv{formula}{Formula}
+% \begin{macrocode}
+%<classXimera> \newtheorem{formula}{Formula}
+%<htXimera> \ConfigureTheoremEnv{formula}
+% \end{macrocode}
+
+% \DescribeEnv{idea}{Idea}
+% \begin{macrocode}
+%<classXimera> \newtheorem{idea}{Idea}
+%<htXimera> \ConfigureTheoremEnv{idea}
+% \end{macrocode}
+
+% \DescribeEnv{notation}{Notation}
+% \begin{macrocode}
+%<classXimera> \newtheorem{notation}{Notation}
+%<htXimera> \ConfigureTheoremEnv{notation}
+% \end{macrocode}
+
+% \DescribeEnv{model}{Model}
+% \begin{macrocode}
+%<classXimera> \newtheorem{model}{Model}
+%<htXimera> \ConfigureTheoremEnv{model}
+% \end{macrocode}
+
+% \DescribeEnv{observation}{Observation}
+% \begin{macrocode}
+%<classXimera> \newtheorem{observation}{Observation}
+%<htXimera> \ConfigureTheoremEnv{observation}
+% \end{macrocode}
+
+% \DescribeEnv{proposition}{Proposition}
+% \begin{macrocode}
+%<classXimera> \newtheorem{proposition}{Proposition}
+%<htXimera> \ConfigureTheoremEnv{proposition}
+% \end{macrocode}
+
+% \DescribeEnv{paradox}{Paradox}
+% \begin{macrocode}
+%<classXimera> \newtheorem{paradox}{Paradox}
+%<htXimera> \ConfigureTheoremEnv{paradox}
+% \end{macrocode}
+
+% \DescribeEnv{procedure}{Procedure}
+% \begin{macrocode}
+%<classXimera> \newtheorem{procedure}{Procedure}
+%<htXimera> \ConfigureTheoremEnv{procedure}
+% \end{macrocode}
+
+% \DescribeEnv{remark}{Remark}
+% \begin{macrocode}
+%<classXimera> \newtheorem{remark}{Remark}
+%<htXimera> \ConfigureTheoremEnv{remark}
+% \end{macrocode}
+
+% \DescribeEnv{summary}{Summary}
+% \begin{macrocode}
+%<classXimera> \newtheorem{summary}{Summary}
+%<htXimera> \ConfigureTheoremEnv{summary}
+% \end{macrocode}
+
+% \DescribeEnv{template}{Template}
+% \begin{macrocode}
+%<classXimera> \newtheorem{template}{Template}
+%<htXimera> \ConfigureTheoremEnv{template}
+% \end{macrocode}
+
+% \DescribeEnv{warning}{Warning}
+% \begin{macrocode}
+%<classXimera> \newtheorem{warning}{Warning}
+%<htXimera> \ConfigureTheoremEnv{warning}
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/tikzexport.dtx b/macros/latex/contrib/ximera/src/tikzexport.dtx
new file mode 100644
index 0000000000..c89f26a49a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/tikzexport.dtx
@@ -0,0 +1,42 @@
+% \subsubsection{TikZ export}
+% We generate SVGs and PNGs for any TikZ images, via the
+% ``externalize'' feature of TikZ.
+%
+% Currently TikZ doesn't compile natively into the website because of
+% how the xake bake compilation works. In order to make Tikz work,
+% you need to get the tool \verb|mutool| on the machine that is
+% performing \verb|xake bake|.
+% \begin{macrocode}
+%<*classXimera>
+\ifdefined\HCode
+ \tikzexporttrue
+\fi
+
+\iftikzexport
+ \usetikzlibrary{external}
+
+ \ifdefined\HCode
+ % in htlatex, just include the svg files
+ \def\pgfsys@imagesuffixlist{.svg}
+
+ \tikzexternalize[prefix=./,mode=graphics if exists]
+ \else
+ % in pdflatex, actually generate the svg files
+ \tikzset{
+ /tikz/external/system call={
+ pdflatex \tikzexternalcheckshellescape
+ -halt-on-error -interaction=batchmode
+ -jobname "\image" "\\PassOptionsToClass{tikzexport}{ximera}\texsource";
+ mutool draw -F svg \image.pdf > \image.svg ; % mutool adds "1" to filename ????
+ mutool draw -o \image.svg \image.pdf ;
+ mutool draw -r 150 -c rgbalpha -o \image.png \image.pdf ;
+ ebb -x \image.png
+ }
+ }
+ \tikzexternalize[optimize=false,prefix=./]
+ \fi
+
+ \fi
+
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/title.dtx b/macros/latex/contrib/ximera/src/title.dtx
new file mode 100644
index 0000000000..56380af5d7
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/title.dtx
@@ -0,0 +1,122 @@
+% \subsubsection{Titles and authors}
+%
+% \subsubsection{Authors}
+% \DescribeMacro{\author}{Activities have authors. Warn the user if no author is provided.}
+% \begin{macrocode}
+%<*classXimera>
+\let\@emptyauthor\@author
+\def\author#1{\gdef\@author{#1}}
+\def\@author{\@latex@warning@no@line{No \noexpand\author given}}
+%</classXimera>
+% \end{macrocode}
+% Include author name in meta tags
+% \begin{macrocode}
+%<*htXimera>
+\Configure{@HEAD}{\HCode{<meta name="author" content="}\@author\HCode{" />\Hnewline}}
+%</htXimera>
+% \end{macrocode}
+% The |\and| command would emit tabular environments which really
+% should not appear in a meta tag.
+% \begin{macrocode}
+%<htXimera|classXimera>\def\and{and }
+% \end{macrocode}
+
+% \subsubsection{Title}
+% \DescribeMacro{\title}{Activities have titles.}
+% \begin{macrocode}
+%<*classXimera>
+\let\title\relax
+\newcommand{\title}[1][]{{\protected@xdef\@pretitle{#1}}\protected@xdef\@title}
+
+\title{}
+
+\newcounter{titlenumber}
+\renewcommand{\thetitlenumber}{\arabic{titlenumber}}
+%\renewcommand{\thesection}{\arabic{titlenumber}} %% Makes section numbers work
+\setcounter{titlenumber}{0}
+
+\newpagestyle{main}{
+\sethead[\textsl{\ifnumbers\thetitlenumber\hspace{1em}\fi\@title}][][] % even
+{}{}{\textsl{\ifnumbers\thetitlenumber\hspace{1em}\fi\@title}} % odd
+\setfoot[\thepage][][] % even
+{}{}{\thepage} % odd
+}
+\pagestyle{main}
+% \end{macrocode}
+% \DescribeMacro{\maketitle}{In a \textsf{ximera} document, redefine
+% |\maketitle| and put them in a table of contents. The
+% |\phantomsection| is to fix the hrefs.}
+% \begin{macrocode}
+\renewcommand\maketitle{%
+ \addtocounter{titlenumber}{1}%
+ {\flushleft\large\bfseries \@pretitle\par\vspace{-1em}}
+ {\flushleft\LARGE\bfseries {\ifnumbers\thetitlenumber\fi}{\ifnumbers\hspace{1em}\else\hspace{0em}\fi}\@title \par }
+ \phantomsection%
+ \ifnumbers\addcontentsline{toc}{section}{\thetitlenumber~\@title}\else\addcontentsline{toc}{section}{\@title}\fi
+ \vskip .6em\noindent\textit\theabstract\setcounter{problem}{0}\setcounter{section}{0}\setcounter{subsection}{0}\par\vspace{2em}
+ \ifnooutcomes\else\let\thefootnote\relax\footnote{Learning outcomes: \theoutcomes}\fi
+ \ifnoauthor\else\let\thefootnote\relax\footnote{Author(s):~\@author}\fi
+ \aftergroup\@afterindentfalse
+ \aftergroup\@afterheading}
+
+\ifnumbers
+\setcounter{secnumdepth}{2}
+\renewcommand{\thesection}{\arabic{titlenumber}.\arabic{section}}
+\renewcommand{\thesubsection}{\arabic{titlenumber}.\arabic{section}.\arabic{subsection}}
+\else
+\setcounter{secnumdepth}{-2}
+\fi
+
+\def\activitystyle{}
+\newcounter{sectiontitlenumber}
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{2}
+\newcommand\chapterstyle{%
+ \def\activitystyle{activity-chapter}
+ \def\maketitle{%
+ \addtocounter{titlenumber}{1}%
+ {\flushleft\small\sffamily\bfseries\@pretitle\par\vspace{-1.5em}}%
+ {\flushleft\LARGE\sffamily\bfseries\thetitlenumber\hspace{1em}\@title \par }%
+ {\vskip .6em\noindent\textit\theabstract\setcounter{problem}{0}\setcounter{section}{0}}%
+ \par\vspace{2em}
+ \phantomsection\addcontentsline{toc}{section}{\textbf{\thetitlenumber\hspace{1em}\@title}}%
+}}
+
+
+\newcommand\sectionstyle{%
+ \def\activitystyle{activity-section}
+ \def\maketitle{%
+ \addtocounter{section}{1}
+ \setcounter{sectiontitlenumber}{\value{section}}
+ {\flushleft\small\sffamily\bfseries\@pretitle\par\vspace{-1.5em}}%
+ {\flushleft\Large\sffamily\bfseries\thetitlenumber.\thesectiontitlenumber\hspace{1em}\@title \par}%
+ {\vskip .6em\noindent\textit\theabstract\setcounter{subsection}{0}}%
+ \par\vspace{2em}
+ \phantomsection\addcontentsline{toc}{section}{\thetitlenumber.\thesectiontitlenumber\hspace{1em}\@title}%
+ \renewcommand\section{\@startsection{subsection}{2}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\normalfont\large\bfseries}}
+
+ \renewcommand\subsection{\@startsection{subsubsection}{3}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\normalfont\normalsize\bfseries}}
+
+}}
+
+
+\iftikzexport%% allows xake to handle \chapterstyle and \sectionstye
+\renewcommand\chapterstyle{\def\activitystyle{chapter}}
+\renewcommand\sectionstyle{\def\activitystyle{section}}
+\else
+\fi
+
+%</classXimera>
+% \end{macrocode}
+% Eliminate some formatting that we'll handle later with CSS
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\maketitle}{}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/ungraded.dtx b/macros/latex/contrib/ximera/src/ungraded.dtx
new file mode 100644
index 0000000000..78b3e29738
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/ungraded.dtx
@@ -0,0 +1,22 @@
+% \subsubsection{Ungraded activities}
+% \DescribeEnv{ungraded}{The |ungraded| environment is used to record
+% that certain parts of activities should not be worth points. For
+% example, if you want to use a multipleChoice as a survey question,
+% you can place it inside an |ungraded| environment.}
+% On the \LaTeX\ side, the |ungraded| environment does nothing.
+% \begin{macrocode}
+%<*classXimera>
+\newenvironment{ungraded}{}{}
+%</classXimera>
+% \end{macrocode}
+% But on the html side, |ungraded| wraps the activities in a div in
+% order to assign some weight to them for grading.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{ungraded}{%
+\ifvmode \IgnorePar\fi \EndP\HCode{<div class="ungraded">}\IgnoreIndent%
+}{
+\ifvmode \IgnorePar\fi \EndP\HCode{</div>}\IgnoreIndent%
+}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/utilitymacros.dtx b/macros/latex/contrib/ximera/src/utilitymacros.dtx
new file mode 100644
index 0000000000..e44b490e06
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/utilitymacros.dtx
@@ -0,0 +1,45 @@
+% \subsubsection{Utility macros}
+% These are a list of new utility macros that are generally useful and are loaded after packages and the Tikz Fix.
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% \begin{macro}{NewCounter}
+% Improved version of |\newcounter| to check for existance before creating a counter to minimize conflicts with packages. Added by Jason Nowell
+% \begin{macrocode}
+\newcommand{\Make@Counter}[1]{% This is an internal macro that should probably be depreciated for the below universal macro.
+% Code located in "Utilitymacros.dtx"
+ \@ifundefined{c@#1}% Check to see if counter exists
+ { % If not, create it and set it to 0.
+ \newcounter{#1}
+ \setcounter{#1}{0}
+ }
+ {%If so, reset to 0.
+ \setcounter{#1}{0}
+ }
+}
+
+\newcommand{\MakeCounter}[1]{%% Code located in "Utilitymacros.dtx"
+% Code located in "Utilitymacros.dtx"
+ \@ifundefined{c@#1}% Check to see if counter exists
+ { % If not, create it and set it to 0.
+ \newcounter{#1}
+ \setcounter{#1}{0}
+ }
+ {%If so, reset to 0.
+ \setcounter{#1}{0}
+ }
+}
+% \end{macrocode}
+%</classXimera>
+% \end{macro}
+
+% \begin{macro}{latexProblemContent}
+% Added for those that want to use UF problems without using the problem filter code. This command is renewed into something meaningful in the 'ProblemSelector.sty'.
+% \begin{macrocode}
+\providecommand{\latexProblemContent}[1]{#1}
+% Iterate count for problem counts.
+\Make@Counter{Iteration@probCnt}
+% \end{macrocode}
+% \end{macro}
+
+
diff --git a/macros/latex/contrib/ximera/src/verbatim.dtx b/macros/latex/contrib/ximera/src/verbatim.dtx
new file mode 100644
index 0000000000..88da69a318
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/verbatim.dtx
@@ -0,0 +1,36 @@
+% \subsubsection{Code listing environments}
+% \DescribeEnv{code}{A code answer environment} You cannot use Environ
+% with the fancyvrb/listings package if you want nested environments.
+%
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{code}{Verbatim}{numbers=left,frame=lines,label=Code,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+% \DescribeEnv{python}{A python answer environment} You cannot use
+% Environ with the fancyvrb/listings package if you want nested
+% environments
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{python}{Verbatim}{numbers=left,frame=lines,label=Python,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+% \DescribeEnv{javascriptCode}{A JavaScript answer environment} Unfortunately the name |javascript| is already used for the actual, executed (!) JavaScript interactive.
+% environments
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{javascriptCode}{Verbatim}{numbers=left,frame=lines,label=JavaScript,labelposition=topline}
+%</classXimera>
+%<*cfgXimera>
+\renewenvironment{javascriptCode}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{javascriptCode}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="javascript-code" id="javascript\arabic{identification}"><script type="text/text">}\HtmlParOff}{\HtmlParOn\HCode{\Hnewline</script></div>}}
+%</cfgXimera>
+% \end{macrocode}
+% On the web, translate verbatim and lstlisting blocks into |<pre>|
+% elements.
+% \begin{macrocode}
+%<*cfgXimera>
+\ConfigureEnv{verbatim}{\HCode{<pre>}}{\HCode{</pre>}}{}{}
+\ConfigureEnv{lstlisting}{\HCode{<pre>}}{\HCode{</pre>}}{}{}
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/xkcd.dtx b/macros/latex/contrib/ximera/src/xkcd.dtx
new file mode 100644
index 0000000000..1d08288803
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/xkcd.dtx
@@ -0,0 +1,13 @@
+% \subsubsection{XKCD}
+% \DescribeMacro{\xkcd}{Reference an XKCD cartoon.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\xkcd}[1]{#1}
+%</classXimera>
+% \end{macrocode}
+% On the web, this should be an image linked to the actual XKCD website.
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\xkcd}[1]{\ifvmode \IgnorePar\fi \EndP\HCode{<img src="https://imgs.xkcd.com/comics/#1.png">}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/ximera.dtx b/macros/latex/contrib/ximera/ximera.dtx
new file mode 100644
index 0000000000..597e3b5b20
--- /dev/null
+++ b/macros/latex/contrib/ximera/ximera.dtx
@@ -0,0 +1,363 @@
+% \iffalse meta-comment
+% vim: textwidth=75
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+|
+------------:| ------------------------------------------------------------
+ ximera:| Simultaneously write print and online interactive materials
+ Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+ E-mail:| bart.snapp@gmail.com
+ License:| Released under the LaTeX Project Public License v1.3c or later
+ See:| http://www.latex-project.org/lppl.txt
+
+Short description:
+Some text about the class: probably the same as the abstract.
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+------------:| ------------------------------------------------------------
+ ximera:| Simultaneously writing print and online interactive materials
+ Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+ E-mail:| bart.snapp@gmail.com
+ License:| Released under the LaTeX Project Public License v1.3c or later
+ See:| http://www.latex-project.org/lppl.txt
+
+\endpreamble
+\postamble
+
+Copyright (C) 2024 by Bart Snapp <bart.snapp@gmail.com> and Jim Fowler <kisonecat@gmail.com>
+
+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
+Bart Snapp. The source code can be found at:
+
+https://github.com/XimeraProject/ximeraLatex
+
+This work consists of the file ximera.dtx, the associated files
+under src/, and a Makefile.
+
+Running "make" generates the derived files README, ximera.pdf, ximera.cls, xourse.cls.
+
+Running "make inst" installs the files in the user's TeX tree.
+
+Running "make install" installs the files in the local TeX tree.
+
+\endpostamble
+
+\usedir{tex/latex/ximera}
+\input docstrip
+\askforoverwritefalse
+\generate{
+ \file{ximera.cls}{
+ \from{ximera.dtx}{classXimera}
+ \from{src/banner.dtx}{classXimera}
+ \from{src/options.dtx}{classXimera}
+ \from{src/packages.dtx}{classXimera}
+ \from{src/tikzexport.dtx}{classXimera}
+ \from{src/hyperref.dtx}{classXimera}
+ \from{src/suppress.dtx}{classXimera}
+ \from{src/makeCounter.dtx}{classXimera}
+ \from{src/pagesetup.dtx}{classXimera}
+ \from{src/metadata.dtx}{classXimera}
+ \from{src/outcomes.dtx}{classXimera}
+ \from{src/macros.dtx}{classXimera}
+ \from{src/theorems.dtx}{classXimera}
+ \from{src/enumerate.dtx}{classXimera}
+ \from{src/proof.dtx}{classXimera}
+ \from{src/only.dtx}{classXimera}
+ \from{src/problem.dtx}{classXimera}
+ \from{src/hints.dtx}{classXimera}
+ \from{src/abstract.dtx}{classXimera}
+ \from{src/title.dtx}{classXimera}
+ \from{src/image.dtx}{classXimera}
+ \from{src/interactives/javascript.dtx}{classXimera}
+ \from{src/interactives/include.dtx}{classXimera}
+ \from{src/interactives/geogebra.dtx}{classXimera}
+ \from{src/interactives/desmos.dtx}{classXimera}
+ \from{src/interactives/google.dtx}{classXimera}
+ \from{src/interactives/graph.dtx}{classXimera}
+ \from{src/link.dtx}{classXimera}
+ \from{src/interactives/video.dtx}{classXimera}
+ \from{src/answer.dtx}{classXimera}
+ \from{src/choice.dtx}{classXimera}
+ \from{src/solution.dtx}{classXimera}
+ \from{src/feedback.dtx}{classXimera}
+ \from{src/freeresponse.dtx}{classXimera}
+ \from{src/verbatim.dtx}{classXimera}
+ \from{src/dialogue.dtx}{classXimera}
+ \from{src/instructornotes.dtx}{classXimera}
+ \from{src/xkcd.dtx}{classXimera}
+ \from{src/foldable.dtx}{classXimera}
+ \from{src/leash.dtx}{classXimera}
+ \from{src/interactives/sagemath.dtx}{classXimera}
+ \from{src/jax.dtx}{classXimera}
+ \from{src/ungraded.dtx}{classXimera}
+ \from{src/clearEnv.dtx}{classXimera}
+ \from{src/hideEnv.dtx}{classXimera}
+ }
+}
+\generate{
+ \file{xourse.cls}{
+ \from{ximera.dtx}{classXourse}
+ \from{src/optionsxourse.dtx}{classXourse}
+ \from{src/activity.dtx}{classXourse}
+ \from{src/sectioning.dtx}{classXourse}
+ \from{src/logo.dtx}{classXourse}
+ \from{src/graded.dtx}{classXourse}
+ }
+}
+\generate{
+ \file{ximera.cfg}{
+ \from{ximera.dtx}{cfgXimera}
+ \from{src/pagesetup.dtx}{cfgXimera}
+ \from{src/packages.dtx}{cfgXimera}
+ \from{src/jax.dtx}{cfgXimera}
+ \from{src/sectioning.dtx}{cfgXimera}
+ \from{src/title.dtx}{cfgXimera}
+ \from{src/abstract.dtx}{cfgXimera}
+ \from{src/image.dtx}{cfgXimera}
+ \from{src/outcomes.dtx}{cfgXimera}
+ \from{src/textcolor.dtx}{cfgXimera}
+ \from{src/verbatim.dtx}{cfgXimera}
+ \from{src/html.dtx}{cfgXimera}
+ \from{src/ending.dtx}{cfgXimera}
+ }
+}
+\generate{
+ \file{ximera.4ht}{
+ \from{ximera.dtx}{htXimera}
+ \from{src/pagesetup.dtx}{htXimera}
+ \from{src/title.dtx}{htXimera}
+ \from{src/problem.dtx}{htXimera}
+ \from{src/macros.dtx}{htXimera}
+ \from{src/theorems.dtx}{htXimera}
+ \from{src/image.dtx}{htXimera}
+ \from{src/dialogue.dtx}{htXimera}
+ \from{src/foldable.dtx}{htXimera}
+ \from{src/interactives/video.dtx}{htXimera}
+ \from{src/xkcd.dtx}{htXimera}
+ \from{src/link.dtx}{htXimera}
+ \from{src/interactives/graph.dtx}{htXimera}
+ \from{src/answer.dtx}{htXimera}
+ \from{src/choice.dtx}{htXimera}
+ \from{src/freeresponse.dtx}{htXimera}
+ \from{src/interactives/javascript.dtx}{htXimera}
+ \from{src/interactives/include.dtx}{htXimera}
+ \from{src/interactives/geogebra.dtx}{htXimera}
+ \from{src/interactives/desmos.dtx}{htXimera}
+ \from{src/interactives/google.dtx}{htXimera}
+ \from{src/feedback.dtx}{htXimera}
+ \from{src/leash.dtx}{htXimera}
+ \from{src/labels.dtx}{htXimera}
+ \from{src/interactives/sagemath.dtx}{htXimera}
+ \from{src/ungraded.dtx}{htXimera}
+ \from{src/footnotes.dtx}{htXimera}
+ \from{src/ending.dtx}{htXimera}
+ }
+}
+\generate{
+ \file{xourse.4ht}{
+ \from{ximera.dtx}{htXourse}
+ \from{src/logo.dtx}{htXourse}
+ \from{src/metadata.dtx}{htXourse}
+ \from{src/activity.dtx}{htXourse}
+ \from{src/sectioning.dtx}{htXourse}
+ \from{src/graded.dtx}{htXourse}
+ \from{src/interactives/video.dtx}{htXourse}
+ \from{src/ending.dtx}{htXourse}
+ }
+}
+%</install>
+%<install>\endbatchfile
+%<*internal>
+\usedir{source/latex/ximera}
+\generate{
+ \file{ximera.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\usedir{doc/latex/ximera}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%</internal>
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{ximera.dtx}
+%</driver>
+%<classXimera|classXourse>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<classXimera>\ProvidesClass{ximera}
+%<classXourse>\ProvidesClass{xourse}
+%<classXimera|classXourse> [2024/05/12 v1.5.1
+%<classXimera> Simultaneously write print and online interactive materials]
+%<classXourse> Combining Ximera activities into Xourses]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[a4paper,margin=25mm,left=50mm,nohead]{geometry}
+\usepackage[numbered]{hypdoc}
+\usepackage{hyperref}
+
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+\DocInput{\jobname.dtx}
+\section{ximera.cls}
+\DocInput{src/options.dtx}
+\DocInput{src/packages.dtx}
+\DocInput{src/pagesetup.dtx}
+\subsection{Structure}
+\DocInput{src/macros.dtx}
+\DocInput{src/theorems.dtx}
+\DocInput{src/enumerate.dtx}
+\DocInput{src/proof.dtx}
+\DocInput{src/problem.dtx}
+\DocInput{src/hints.dtx}
+\DocInput{src/solution.dtx}
+\DocInput{src/verbatim.dtx}
+\DocInput{src/dialogue.dtx}
+\DocInput{src/instructornotes.dtx}
+\DocInput{src/only.dtx}
+\DocInput{src/foldable.dtx}
+\DocInput{src/leash.dtx}
+\subsection{Document metadata}
+\DocInput{src/metadata.dtx}
+\DocInput{src/abstract.dtx}
+\DocInput{src/title.dtx}
+\DocInput{src/outcomes.dtx}
+\DocInput{src/labels.dtx}
+\subsection{Images}
+\DocInput{src/image.dtx}
+\DocInput{src/tikzexport.dtx}
+\DocInput{src/xkcd.dtx}
+\subsection{Links}
+\DocInput{src/hyperref.dtx}
+\subsection{Interactives}
+\DocInput{src/interactives/include.dtx}
+\DocInput{src/interactives/google.dtx}
+\DocInput{src/interactives/geogebra.dtx}
+\DocInput{src/interactives/desmos.dtx}
+\DocInput{src/interactives/graph.dtx}
+\DocInput{src/interactives/video.dtx}
+\DocInput{src/interactives/javascript.dtx}
+\DocInput{src/interactives/sagemath.dtx}
+\subsection{Answerables}
+\DocInput{src/answer.dtx}
+\DocInput{src/choice.dtx}
+\DocInput{src/freeresponse.dtx}
+\DocInput{src/feedback.dtx}
+\DocInput{src/ungraded.dtx}
+\subsection{Support for the web}
+\DocInput{src/jax.dtx}
+\DocInput{src/html.dtx}
+\subsection{Tools}
+\DocInput{src/suppress.dtx}
+\DocInput{src/ending.dtx}
+\section{xourse.cls}
+\DocInput{src/optionsxourse.dtx}
+\DocInput{src/activity.dtx}
+\DocInput{src/sectioning.dtx}
+\DocInput{src/graded.dtx}
+\DocInput{src/logo.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%\def\fileversion{v1.5.1}
+%\def\filedate{2024/05/12}
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+%\title{\textsf{ximera} --- Simultaneously write print and online interactive materials.\thanks{This file
+% describes version \fileversion, last revised \filedate.}
+%}
+%\author{Jim Fowler \and Jeramiah Hocutt \and Oscar Levin \and Jason Nowell \and Wim Obbels \and Hans Parshall \and Bart Snapp}
+%\date{Released \filedate}
+%
+%\maketitle
+%
+%\changes{v1.0.0}{2018/05/25}{First public release}
+%\changes{v1.5.0}{2024/05/08}{Submitting to CTAN}
+%\changes{v1.5.1}{2024/05/12}{Fixed date bug}
+
+% \begin{abstract}
+% ``\textsf{Ximera} begins where \TeX\ ends.'' The \textsf{ximera}
+% class aids in the creation of handouts, worksheets, exercises, and
+% sections of textbooks to be used either individually or ``glued''
+% together via a \textsf{xourse} file. All \textsf{ximera} documents
+% can be deployed in an online interactive form via \texttt{xake}
+% See: \href{https://ximera.osu.edu}{Ximera Project} and the source
+% code on \href{https://github.com/XimeraProject}{GitHub}.
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% Ximera, pronounced ``chimera,'' (\textbf{X}imera:
+% \textbf{I}nteractive, \textbf{M}athematics,
+% \textbf{E}\textbf{R}esources, for \textbf{A}ll) is an open-source
+% platform that provides tools for authoring and publishing (PDF and
+% Online), open-source, interactive educational content, such as textbooks, assessments, and online courses.
+% The Ximera document class provides the following features:
+% \begin{description}
+% \item[Formatting for different domains] The Ximera document class
+% provides built-in support for formatting documents in both PDF and
+% online formats, which can be a big time-saver for
+% authors. Additionally, it allows for the simultaneous creation of
+% solution manuals and teaching editions, which can be especially
+% useful for educators.
+%\item[Compiling individually or as a whole] With the Ximera document
+% class, authors can easily compile individual documents or an entire
+% collection of documents. This flexibility can be helpful when making
+% changes to specific documents without having to re-compile the
+% entire collection. Moreover, this allows an author to share large
+% portions of a text with another, with minimal changes.
+%\item[Interactive content] The Ximera document class allows for the
+% inclusion of interactive content, such as answer boxes that are
+% validated by a client-side computer algebra system. Additionally, it
+% allows for the embedding of YouTube videos, Desmos graphs, and
+% GeoGebra interactives.
+%\item[All content displayed] By default, the Ximera document class
+% displays all content to the author. This means the author see what
+% the students see, along with answers and solutions, and links (that
+% can be checked) to various interactive elements (when deployed, the
+% interactive elements are truly embedded). This can be especially
+% helpful for catching errors or inconsistencies in the content.
+%\end{description}
+%
+%Online examples can be found at
+%\begin{center}
+%\url{https://go.osu.edu/ximera-examples}
+%\end{center}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%\Finale
diff --git a/macros/latex/contrib/ximera/ximera.ins b/macros/latex/contrib/ximera/ximera.ins
new file mode 100644
index 0000000000..54545d64cc
--- /dev/null
+++ b/macros/latex/contrib/ximera/ximera.ins
@@ -0,0 +1,211 @@
+%%
+%% This is file `ximera.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ximera.dtx (with options: `install')
+%% ------------:| ------------------------------------------------------------
+%% ximera:| Simultaneously writing print and online interactive materials
+%% Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+%% E-mail:| bart.snapp@gmail.com
+%% 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
+------------:| ------------------------------------------------------------
+ ximera:| Simultaneously writing print and online interactive materials
+ Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+ E-mail:| bart.snapp@gmail.com
+ License:| Released under the LaTeX Project Public License v1.3c or later
+ See:| http://www.latex-project.org/lppl.txt
+
+\endpreamble
+\postamble
+
+Copyright (C) 2024 by Bart Snapp <bart.snapp@gmail.com> and Jim Fowler <kisonecat@gmail.com>
+
+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
+Bart Snapp. The source code can be found at:
+
+https://github.com/XimeraProject/ximeraLatex
+
+This work consists of the file ximera.dtx, the associated files
+under src/, and a Makefile.
+
+Running "make" generates the derived files README, ximera.pdf, ximera.cls, xourse.cls.
+
+Running "make inst" installs the files in the user's TeX tree.
+
+Running "make install" installs the files in the local TeX tree.
+
+\endpostamble
+
+\usedir{tex/latex/ximera}
+\input docstrip
+\askforoverwritefalse
+\generate{
+ \file{ximera.cls}{
+ \from{ximera.dtx}{classXimera}
+ \from{src/banner.dtx}{classXimera}
+ \from{src/options.dtx}{classXimera}
+ \from{src/packages.dtx}{classXimera}
+ \from{src/tikzexport.dtx}{classXimera}
+ \from{src/hyperref.dtx}{classXimera}
+ \from{src/suppress.dtx}{classXimera}
+ \from{src/makeCounter.dtx}{classXimera}
+ \from{src/pagesetup.dtx}{classXimera}
+ \from{src/metadata.dtx}{classXimera}
+ \from{src/outcomes.dtx}{classXimera}
+ \from{src/macros.dtx}{classXimera}
+ \from{src/theorems.dtx}{classXimera}
+ \from{src/enumerate.dtx}{classXimera}
+ \from{src/proof.dtx}{classXimera}
+ \from{src/only.dtx}{classXimera}
+ \from{src/problem.dtx}{classXimera}
+ \from{src/hints.dtx}{classXimera}
+ \from{src/abstract.dtx}{classXimera}
+ \from{src/title.dtx}{classXimera}
+ \from{src/image.dtx}{classXimera}
+ \from{src/interactives/javascript.dtx}{classXimera}
+ \from{src/interactives/include.dtx}{classXimera}
+ \from{src/interactives/geogebra.dtx}{classXimera}
+ \from{src/interactives/desmos.dtx}{classXimera}
+ \from{src/interactives/google.dtx}{classXimera}
+ \from{src/interactives/graph.dtx}{classXimera}
+ \from{src/link.dtx}{classXimera}
+ \from{src/interactives/video.dtx}{classXimera}
+ \from{src/answer.dtx}{classXimera}
+ \from{src/choice.dtx}{classXimera}
+ \from{src/solution.dtx}{classXimera}
+ \from{src/feedback.dtx}{classXimera}
+ \from{src/freeresponse.dtx}{classXimera}
+ \from{src/verbatim.dtx}{classXimera}
+ \from{src/dialogue.dtx}{classXimera}
+ \from{src/instructornotes.dtx}{classXimera}
+ \from{src/xkcd.dtx}{classXimera}
+ \from{src/foldable.dtx}{classXimera}
+ \from{src/leash.dtx}{classXimera}
+ \from{src/interactives/sagemath.dtx}{classXimera}
+ \from{src/jax.dtx}{classXimera}
+ \from{src/ungraded.dtx}{classXimera}
+ \from{src/clearEnv.dtx}{classXimera}
+ \from{src/hideEnv.dtx}{classXimera}
+ }
+}
+\generate{
+ \file{xourse.cls}{
+ \from{ximera.dtx}{classXourse}
+ \from{src/optionsxourse.dtx}{classXourse}
+ \from{src/activity.dtx}{classXourse}
+ \from{src/sectioning.dtx}{classXourse}
+ \from{src/logo.dtx}{classXourse}
+ \from{src/graded.dtx}{classXourse}
+ }
+}
+\generate{
+ \file{ximera.cfg}{
+ \from{ximera.dtx}{cfgXimera}
+ \from{src/pagesetup.dtx}{cfgXimera}
+ \from{src/packages.dtx}{cfgXimera}
+ \from{src/jax.dtx}{cfgXimera}
+ \from{src/sectioning.dtx}{cfgXimera}
+ \from{src/title.dtx}{cfgXimera}
+ \from{src/abstract.dtx}{cfgXimera}
+ \from{src/image.dtx}{cfgXimera}
+ \from{src/outcomes.dtx}{cfgXimera}
+ \from{src/textcolor.dtx}{cfgXimera}
+ \from{src/verbatim.dtx}{cfgXimera}
+ \from{src/html.dtx}{cfgXimera}
+ \from{src/ending.dtx}{cfgXimera}
+ }
+}
+\generate{
+ \file{ximera.4ht}{
+ \from{ximera.dtx}{htXimera}
+ \from{src/pagesetup.dtx}{htXimera}
+ \from{src/title.dtx}{htXimera}
+ \from{src/problem.dtx}{htXimera}
+ \from{src/macros.dtx}{htXimera}
+ \from{src/theorems.dtx}{htXimera}
+ \from{src/image.dtx}{htXimera}
+ \from{src/dialogue.dtx}{htXimera}
+ \from{src/foldable.dtx}{htXimera}
+ \from{src/interactives/video.dtx}{htXimera}
+ \from{src/xkcd.dtx}{htXimera}
+ \from{src/link.dtx}{htXimera}
+ \from{src/interactives/graph.dtx}{htXimera}
+ \from{src/answer.dtx}{htXimera}
+ \from{src/choice.dtx}{htXimera}
+ \from{src/freeresponse.dtx}{htXimera}
+ \from{src/interactives/javascript.dtx}{htXimera}
+ \from{src/interactives/include.dtx}{htXimera}
+ \from{src/interactives/geogebra.dtx}{htXimera}
+ \from{src/interactives/desmos.dtx}{htXimera}
+ \from{src/interactives/google.dtx}{htXimera}
+ \from{src/feedback.dtx}{htXimera}
+ \from{src/leash.dtx}{htXimera}
+ \from{src/labels.dtx}{htXimera}
+ \from{src/interactives/sagemath.dtx}{htXimera}
+ \from{src/ungraded.dtx}{htXimera}
+ \from{src/footnotes.dtx}{htXimera}
+ \from{src/ending.dtx}{htXimera}
+ }
+}
+\generate{
+ \file{xourse.4ht}{
+ \from{ximera.dtx}{htXourse}
+ \from{src/logo.dtx}{htXourse}
+ \from{src/metadata.dtx}{htXourse}
+ \from{src/activity.dtx}{htXourse}
+ \from{src/sectioning.dtx}{htXourse}
+ \from{src/graded.dtx}{htXourse}
+ \from{src/interactives/video.dtx}{htXourse}
+ \from{src/ending.dtx}{htXourse}
+ }
+}
+\endbatchfile
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%
+%% Copyright (C) 2024 by Bart Snapp <bart.snapp@gmail.com> and Jim Fowler <kisonecat@gmail.com>
+%%
+%% 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
+%% Bart Snapp. The source code can be found at:
+%%
+%% https://github.com/XimeraProject/ximeraLatex
+%%
+%% This work consists of the file ximera.dtx, the associated files
+%% under src/, and a Makefile.
+%%
+%% Running "make" generates the derived files README, ximera.pdf, ximera.cls, xourse.cls.
+%%
+%% Running "make inst" installs the files in the user's TeX tree.
+%%
+%% Running "make install" installs the files in the local TeX tree.
+%%
+%%
+%% End of file `ximera.ins'.
diff --git a/macros/latex/contrib/ximera/ximera.pdf b/macros/latex/contrib/ximera/ximera.pdf
new file mode 100644
index 0000000000..0d2545b701
--- /dev/null
+++ b/macros/latex/contrib/ximera/ximera.pdf
Binary files differ
diff --git a/macros/latex/contrib/zref-clever/CHANGELOG.md b/macros/latex/contrib/zref-clever/CHANGELOG.md
index 89c3c1414c..3cf6c73b25 100644
--- a/macros/latex/contrib/zref-clever/CHANGELOG.md
+++ b/macros/latex/contrib/zref-clever/CHANGELOG.md
@@ -1,6 +1,12 @@
# Changelog
-## [Unreleased](https://github.com/gusbrs/zref-clever/compare/v0.4.4...HEAD)
+## [Unreleased](https://github.com/gusbrs/zref-clever/compare/v0.4.5...HEAD)
+
+## [v0.4.5](https://github.com/gusbrs/zref-clever/compare/v0.4.4...v0.4.5) (2024-05-20)
+
+### Added
+- Provided Russian language file (see PR
+ [#29](https://github.com/gusbrs/zref-clever/pull/29)).
## [v0.4.4](https://github.com/gusbrs/zref-clever/compare/v0.4.3...v0.4.4) (2024-03-14)
diff --git a/macros/latex/contrib/zref-clever/zref-clever-code.pdf b/macros/latex/contrib/zref-clever/zref-clever-code.pdf
index 4dd6a24efc..09b441eeb1 100644
--- a/macros/latex/contrib/zref-clever/zref-clever-code.pdf
+++ b/macros/latex/contrib/zref-clever/zref-clever-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/zref-clever/zref-clever-code.tex b/macros/latex/contrib/zref-clever/zref-clever-code.tex
index 8aebe70d6f..9be1e8f18b 100644
--- a/macros/latex/contrib/zref-clever/zref-clever-code.tex
+++ b/macros/latex/contrib/zref-clever/zref-clever-code.tex
@@ -41,6 +41,11 @@
\documentclass{l3doc}
+\usepackage{fontspec}
+\setmainfont{CMU Serif}
+\setsansfont{CMU Sans Serif}
+\setmonofont{CMU Typewriter Text}
+
% Have \GetFileInfo pick up date and version data and used in the
% documentation.
\usepackage{zref-clever}
diff --git a/macros/latex/contrib/zref-clever/zref-clever-doc.pdf b/macros/latex/contrib/zref-clever/zref-clever-doc.pdf
index 9973f6d546..5594a06fb3 100644
--- a/macros/latex/contrib/zref-clever/zref-clever-doc.pdf
+++ b/macros/latex/contrib/zref-clever/zref-clever-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/zref-clever/zref-clever-doc.tex b/macros/latex/contrib/zref-clever/zref-clever-doc.tex
index 744732ade0..e088c49915 100644
--- a/macros/latex/contrib/zref-clever/zref-clever-doc.tex
+++ b/macros/latex/contrib/zref-clever/zref-clever-doc.tex
@@ -41,6 +41,11 @@
\documentclass{l3doc}
+\usepackage{fontspec}
+\setmainfont{TeX Gyre Pagella}
+\setsansfont{TeX Gyre Heros}[Scale=MatchLowercase]
+\setmonofont{inconsolata}[Scale=MatchLowercase]
+
% The package itself *must* be loaded so that \GetFileInfo can pick up date
% and version data. Naturally, we also use it.
\usepackage{zref-clever}
@@ -48,13 +53,6 @@
\usepackage{zref-check}
\usepackage{zref-titleref}
-\usepackage[T1]{fontenc}
-
-\usepackage[sc]{mathpazo}
-\linespread{1.05}
-\usepackage[scale=.88]{tgheros} % sans
-\usepackage[varqu,scaled=1.03]{inconsolata} % tt
-
\usepackage{listings}
\usepackage{microtype}
@@ -1414,7 +1412,7 @@ indeed required, without users having to worry about it at all.
& UKenglish \\
& USenglish \\
french & acadian \\
- & \\
+ spanish & \\
\bottomrule
\end{tabular}
\quad
@@ -1431,7 +1429,7 @@ indeed required, without users having to worry about it at all.
portuguese & brazilian \\
& brazil \\
& portuges \\
- spanish & \\
+ russian & \\
\bottomrule
\end{tabular}
\caption{Declared languages and aliases}
@@ -1480,13 +1478,14 @@ in effect for the languages declared by \pkg{zref-clever}.
\toprule
Language & declension & gender & allcaps \\
\midrule
- dutch & -- & f,m,n & -- \\
- english & -- & -- & -- \\
- french & -- & f,m & -- \\
- german & N,A,D,G & f,m,n & yes \\
- italian & -- & f,m & -- \\
- portuguese & -- & f,m & -- \\
- spanish & -- & f,m & -- \\
+ dutch & -- & f,m,n & -- \\
+ english & -- & -- & -- \\
+ french & -- & f,m & -- \\
+ german & N,A,D,G & f,m,n & yes \\
+ italian & -- & f,m & -- \\
+ portuguese & -- & f,m & -- \\
+ spanish & -- & f,m & -- \\
+ russian & n,a,g,d,i,p & f,m,n & -- \\
\bottomrule
\end{tabular}
\caption{Options for declared languages}
@@ -2641,6 +2640,7 @@ were generously provided by (in chronological order):
% 2023-05-11: https://github.com/T-F-S/tcolorbox/issues/230
% 2023-11-09: https://github.com/gusbrs/zref-clever/issues/20
% 2024-01-20: https://github.com/gusbrs/zref-clever/pull/25
+ % 2024-05-04: https://github.com/gusbrs/zref-clever/pull/27
and Lars Madsen.
% 2023-07-24: https://chat.stackexchange.com/transcript/message/64039717#64039717
% and following discussion.
@@ -2661,8 +2661,12 @@ The package's language files have been provided or improved thanks to:
% 2022-01-09: https://github.com/gusbrs/zref-clever/pull/5
% 2022-12-27: https://github.com/gusbrs/zref-clever/pull/12
% 2022-12-27: https://github.com/gusbrs/zref-clever/pull/13
- and Matteo Ferrigato (Italian). % 'matteo339'
+ Matteo Ferrigato (Italian), % 'matteo339'
% 2022-12-12: https://github.com/gusbrs/zref-clever/issues/11
+ and Sergey Slyusarev (Russian). % 'jemmybutton'
+ % 2024-05-18: https://github.com/gusbrs/zref-clever/issues/28
+ % 2024-05-19: https://github.com/gusbrs/zref-clever/pull/29
+ % 2024-05-20: https://github.com/gusbrs/zref-clever/pull/30
If I have inadvertently left anyone off the list I apologize, and please let
me know, so that I can correct the oversight.
diff --git a/macros/latex/contrib/zref-clever/zref-clever.dtx b/macros/latex/contrib/zref-clever/zref-clever.dtx
index 5767e6ab4f..9c1d73a5a2 100644
--- a/macros/latex/contrib/zref-clever/zref-clever.dtx
+++ b/macros/latex/contrib/zref-clever/zref-clever.dtx
@@ -43,6 +43,11 @@
%<*driver>
\documentclass{l3doc}
+\usepackage{fontspec}
+\setmainfont{CMU Serif}
+\setsansfont{CMU Sans Serif}
+\setmonofont{CMU Typewriter Text}
+
% Have \GetFileInfo pick up date and version data and used in the
% documentation.
\usepackage{zref-clever}
@@ -166,7 +171,7 @@
%
% Identify the package.
% \begin{macrocode}
-\ProvidesExplPackage {zref-clever} {2024-03-14} {0.4.4}
+\ProvidesExplPackage {zref-clever} {2024-05-20} {0.4.5}
{Clever LaTeX cross-references based on zref}
% \end{macrocode}
%
@@ -10397,6 +10402,1264 @@ type = solution ,
% \end{macrocode}
%
%
+% \subsection{Russian}
+%
+% Russian language file initially contributed by \contributor{Sergey Slyusarev
+% \username{jemmybutton}} (\githubPR{29}). Russian localization in consistent
+% with that of \pkg{cleveref}, with the following exceptions: ``equation'' is
+% translated as ``уравнение'', rather than ``formula'', ``proposition'' is
+% translated as ``предложение'', rather than ``утверждение''; several
+% abbreviations are replaced with more common ones, e.g. abbreviated plural of
+% ``item'' is ``пп.'', not ``п.п.''.
+%
+% \begin{macrocode}
+%<*package>
+\zcDeclareLanguage
+ [ declension = { n , a , g , d , i , p } , gender = { f , m , n } ]
+ { russian }
+%</package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*lang-russian>
+% \end{macrocode}
+%
+% \begin{macrocode}
+namesep = {\nobreakspace} ,
+pairsep = {~и\nobreakspace} ,
+listsep = {,~} ,
+lastsep = {~и\nobreakspace} ,
+tpairsep = {~и\nobreakspace} ,
+tlistsep = {,~} ,
+tlastsep = {,~и\nobreakspace} ,
+notesep = {~} ,
+rangesep = {~по\nobreakspace} ,
++refbounds-rb = {с\nobreakspace,,,} ,
+
+type = book ,
+ gender = f ,
+ case = n ,
+ Name-sg = Книга ,
+ name-sg = книга ,
+ Name-pl = Книги ,
+ name-pl = книги ,
+ case = a ,
+ Name-sg = Книгу ,
+ name-sg = книгу ,
+ Name-pl = Книги ,
+ name-pl = книги ,
+ case = g ,
+ Name-sg = Книги ,
+ name-sg = книги ,
+ Name-pl = Книг ,
+ name-pl = книг ,
+ case = d ,
+ Name-sg = Книге ,
+ name-sg = книге ,
+ Name-pl = Книгам ,
+ name-pl = книгам ,
+ case = i ,
+ Name-sg = Книгой ,
+ name-sg = книгой ,
+ Name-pl = Книгами ,
+ name-pl = книгами ,
+ case = p ,
+ Name-sg = Книге ,
+ name-sg = книге ,
+ Name-pl = Книгах ,
+ name-pl = книгах ,
+
+type = part ,
+ gender = f ,
+ case = n ,
+ Name-sg = Часть ,
+ name-sg = часть ,
+ Name-pl = Части ,
+ name-pl = части ,
+ Name-sg-ab = Ч. ,
+ name-sg-ab = ч. ,
+ Name-pl-ab = Чч. ,
+ name-pl-ab = чч. ,
+ case = a ,
+ Name-sg = Часть ,
+ name-sg = часть ,
+ Name-pl = Части ,
+ name-pl = части ,
+ Name-sg-ab = Ч. ,
+ name-sg-ab = ч. ,
+ Name-pl-ab = Чч. ,
+ name-pl-ab = чч. ,
+ case = g ,
+ Name-sg = Части ,
+ name-sg = части ,
+ Name-pl = Частей ,
+ name-pl = частей ,
+ Name-sg-ab = Ч. ,
+ name-sg-ab = ч. ,
+ Name-pl-ab = Чч. ,
+ name-pl-ab = чч. ,
+ case = d ,
+ Name-sg = Части ,
+ name-sg = части ,
+ Name-pl = Частям ,
+ name-pl = частям ,
+ Name-sg-ab = Ч. ,
+ name-sg-ab = ч. ,
+ Name-pl-ab = Чч. ,
+ name-pl-ab = чч. ,
+ case = i ,
+ Name-sg = Частью ,
+ name-sg = частью ,
+ Name-pl = Частями ,
+ name-pl = частями ,
+ Name-sg-ab = Ч. ,
+ name-sg-ab = ч. ,
+ Name-pl-ab = Чч. ,
+ name-pl-ab = чч. ,
+ case = p ,
+ Name-sg = Части ,
+ name-sg = части ,
+ Name-pl = Частях ,
+ name-pl = частях ,
+ Name-sg-ab = Ч. ,
+ name-sg-ab = ч. ,
+ Name-pl-ab = Чч. ,
+ name-pl-ab = чч. ,
+
+type = chapter ,
+ gender = f ,
+ case = n ,
+ Name-sg = Глава ,
+ name-sg = глава ,
+ Name-pl = Главы ,
+ name-pl = главы ,
+ Name-sg-ab = Гл. ,
+ name-sg-ab = гл. ,
+ Name-pl-ab = Гл. ,
+ name-pl-ab = гл. ,
+ case = a ,
+ Name-sg = Главу ,
+ name-sg = главу ,
+ Name-pl = Главы ,
+ name-pl = главы ,
+ Name-sg-ab = Гл. ,
+ name-sg-ab = гл. ,
+ Name-pl-ab = Гл. ,
+ name-pl-ab = гл. ,
+ case = g ,
+ Name-sg = Главы ,
+ name-sg = главы ,
+ Name-pl = Глав ,
+ name-pl = глав ,
+ Name-sg-ab = Гл. ,
+ name-sg-ab = гл. ,
+ Name-pl-ab = Гл. ,
+ name-pl-ab = гл. ,
+ case = d ,
+ Name-sg = Главе ,
+ name-sg = главе ,
+ Name-pl = Главам ,
+ name-pl = главам ,
+ Name-sg-ab = Гл. ,
+ name-sg-ab = гл. ,
+ Name-pl-ab = Гл. ,
+ name-pl-ab = гл. ,
+ case = i ,
+ Name-sg = Главой ,
+ name-sg = главой ,
+ Name-pl = Главами ,
+ name-pl = главами ,
+ Name-sg-ab = Гл. ,
+ name-sg-ab = гл. ,
+ Name-pl-ab = Гл. ,
+ name-pl-ab = гл. ,
+ case = p ,
+ Name-sg = Главе ,
+ name-sg = главе ,
+ Name-pl = Главах ,
+ name-pl = главах ,
+ Name-sg-ab = Гл. ,
+ name-sg-ab = гл. ,
+ Name-pl-ab = Гл. ,
+ name-pl-ab = гл. ,
+
+type = section ,
+ gender = m ,
+ case = n ,
+ Name-sg = Раздел ,
+ name-sg = раздел ,
+ Name-pl = Разделы ,
+ name-pl = разделы ,
+ case = a ,
+ Name-sg = Раздел ,
+ name-sg = раздел ,
+ Name-pl = Разделы ,
+ name-pl = разделы ,
+ case = g ,
+ Name-sg = Раздела ,
+ name-sg = раздела ,
+ Name-pl = Разделов ,
+ name-pl = разделов ,
+ case = d ,
+ Name-sg = Разделу ,
+ name-sg = разделу ,
+ Name-pl = Разделам ,
+ name-pl = разделам ,
+ case = i ,
+ Name-sg = Разделом ,
+ name-sg = разделом ,
+ Name-pl = Разделами ,
+ name-pl = разделами ,
+ case = p ,
+ Name-sg = Разделе ,
+ name-sg = разделе ,
+ Name-pl = Разделах ,
+ name-pl = разделах ,
+
+type = paragraph ,
+ gender = m ,
+ case = n ,
+ Name-sg = Абзац ,
+ name-sg = абзац ,
+ Name-pl = Абзацы ,
+ name-pl = абзацы ,
+ case = a ,
+ Name-sg = Абзац ,
+ name-sg = абзац ,
+ Name-pl = Абзацы ,
+ name-pl = абзацы ,
+ case = g ,
+ Name-sg = Абзаца ,
+ name-sg = абзаца ,
+ Name-pl = Абзацев ,
+ name-pl = абзацев ,
+ case = d ,
+ Name-sg = Абзацу ,
+ name-sg = абзацу ,
+ Name-pl = Абзацам ,
+ name-pl = абзацам ,
+ case = i ,
+ Name-sg = Абзацем ,
+ name-sg = абзацем ,
+ Name-pl = Абзацами ,
+ name-pl = абзацами ,
+ case = p ,
+ Name-sg = Абзаце ,
+ name-sg = абзаце ,
+ Name-pl = Абзацах ,
+ name-pl = абзацах ,
+
+type = appendix ,
+ gender = n ,
+ case = n ,
+ Name-sg = Приложение ,
+ name-sg = приложение ,
+ Name-pl = Приложения ,
+ name-pl = приложения ,
+ case = a ,
+ Name-sg = Приложение ,
+ name-sg = приложение ,
+ Name-pl = Приложения ,
+ name-pl = приложения ,
+ case = g ,
+ Name-sg = Приложения ,
+ name-sg = приложения ,
+ Name-pl = Приложений ,
+ name-pl = приложений ,
+ case = d ,
+ Name-sg = Приложению ,
+ name-sg = приложению ,
+ Name-pl = Приложениям ,
+ name-pl = приложениям ,
+ case = i ,
+ Name-sg = Приложением ,
+ name-sg = приложением ,
+ Name-pl = Приложениями ,
+ name-pl = приложениями ,
+ case = p ,
+ Name-sg = Приложении ,
+ name-sg = приложении ,
+ Name-pl = Приложениях ,
+ name-pl = приложениях ,
+
+type = page ,
+ gender = f ,
+ case = n ,
+ Name-sg = Страница ,
+ name-sg = страница ,
+ Name-pl = Страницы ,
+ name-pl = страницы ,
+ Name-sg-ab = С. ,
+ name-sg-ab = с. ,
+ Name-pl-ab = Сс. ,
+ name-pl-ab = сс. ,
+ case = a ,
+ Name-sg = Страницу ,
+ name-sg = страницу ,
+ Name-pl = Страницы ,
+ name-pl = страницы ,
+ Name-sg-ab = С. ,
+ name-sg-ab = с. ,
+ Name-pl-ab = Сс. ,
+ name-pl-ab = сс. ,
+ case = g ,
+ Name-sg = Страницы ,
+ name-sg = страницы ,
+ Name-pl = Страниц ,
+ name-pl = страниц ,
+ Name-sg-ab = С. ,
+ name-sg-ab = с. ,
+ Name-pl-ab = Сс. ,
+ name-pl-ab = сс. ,
+ case = d ,
+ Name-sg = Странице ,
+ name-sg = странице ,
+ Name-pl = Страницам ,
+ name-pl = страницам ,
+ Name-sg-ab = С. ,
+ name-sg-ab = с. ,
+ Name-pl-ab = Сс. ,
+ name-pl-ab = сс. ,
+ case = i ,
+ Name-sg = Страницей ,
+ name-sg = страницей ,
+ Name-pl = Страницами ,
+ name-pl = страницами ,
+ Name-sg-ab = С. ,
+ name-sg-ab = с. ,
+ Name-pl-ab = Сс. ,
+ name-pl-ab = сс. ,
+ case = p ,
+ Name-sg = Странице ,
+ name-sg = странице ,
+ Name-pl = Страницах ,
+ name-pl = страницах ,
+ Name-sg-ab = С. ,
+ name-sg-ab = с. ,
+ Name-pl-ab = Сс. ,
+ name-pl-ab = сс. ,
+ rangesep = {\textendash} ,
+ rangetopair = false ,
+ +refbounds-rb = {,,,} ,
+
+type = line ,
+ gender = f ,
+ case = n ,
+ Name-sg = Строка ,
+ name-sg = строка ,
+ Name-pl = Строки ,
+ name-pl = строки ,
+ case = a ,
+ Name-sg = Строку ,
+ name-sg = строку ,
+ Name-pl = Строки ,
+ name-pl = строки ,
+ case = g ,
+ Name-sg = Строки ,
+ name-sg = строки ,
+ Name-pl = Строк ,
+ name-pl = строк ,
+ case = d ,
+ Name-sg = Строке ,
+ name-sg = строке ,
+ Name-pl = Строкам ,
+ name-pl = строкам ,
+ case = i ,
+ Name-sg = Строкой ,
+ name-sg = строкой ,
+ Name-pl = Строками ,
+ name-pl = строками ,
+ case = p ,
+ Name-sg = Строке ,
+ name-sg = строке ,
+ Name-pl = Строках ,
+ name-pl = строках ,
+
+type = figure ,
+ gender = m ,
+ case = n ,
+ Name-sg = Рисунок ,
+ name-sg = рисунок ,
+ Name-pl = Рисунки ,
+ name-pl = рисунки ,
+ Name-sg-ab = Рис. ,
+ name-sg-ab = рис. ,
+ Name-pl-ab = Рис. ,
+ name-pl-ab = рис. ,
+ case = a ,
+ Name-sg = Рисунок ,
+ name-sg = рисунок ,
+ Name-pl = Рисунки ,
+ name-pl = рисунки ,
+ Name-sg-ab = Рис. ,
+ name-sg-ab = рис. ,
+ Name-pl-ab = Рис. ,
+ name-pl-ab = рис. ,
+ case = g ,
+ Name-sg = Рисунка ,
+ name-sg = рисунка ,
+ Name-pl = Рисунков ,
+ name-pl = рисунков ,
+ Name-sg-ab = Рис. ,
+ name-sg-ab = рис. ,
+ Name-pl-ab = Рис. ,
+ name-pl-ab = рис. ,
+ case = d ,
+ Name-sg = Рисунку ,
+ name-sg = рисунку ,
+ Name-pl = Рисункам ,
+ name-pl = рисункам ,
+ Name-sg-ab = Рис. ,
+ name-sg-ab = рис. ,
+ Name-pl-ab = Рис. ,
+ name-pl-ab = рис. ,
+ case = i ,
+ Name-sg = Рисунком ,
+ name-sg = рисунком ,
+ Name-pl = Рисунками ,
+ name-pl = рисунками ,
+ Name-sg-ab = Рис. ,
+ name-sg-ab = рис. ,
+ Name-pl-ab = Рис. ,
+ name-pl-ab = рис. ,
+ case = p ,
+ Name-sg = Рисунке ,
+ name-sg = рисунке ,
+ Name-pl = Рисунках ,
+ name-pl = рисунках ,
+ Name-sg-ab = Рис. ,
+ name-sg-ab = рис. ,
+ Name-pl-ab = Рис. ,
+ name-pl-ab = рис. ,
+
+type = table ,
+ gender = f ,
+ case = n ,
+ Name-sg = Таблица ,
+ name-sg = таблица ,
+ Name-pl = Таблицы ,
+ name-pl = таблицы ,
+ Name-sg-ab = Табл. ,
+ name-sg-ab = табл. ,
+ Name-pl-ab = Табл. ,
+ name-pl-ab = табл. ,
+ case = a ,
+ Name-sg = Таблицу ,
+ name-sg = таблицу ,
+ Name-pl = Таблицы ,
+ name-pl = таблицы ,
+ Name-sg-ab = Табл. ,
+ name-sg-ab = табл. ,
+ Name-pl-ab = Табл. ,
+ name-pl-ab = табл. ,
+ case = g ,
+ Name-sg = Таблицы ,
+ name-sg = таблицы ,
+ Name-pl = Таблиц ,
+ name-pl = таблиц ,
+ Name-sg-ab = Табл. ,
+ name-sg-ab = табл. ,
+ Name-pl-ab = Табл. ,
+ name-pl-ab = табл. ,
+ case = d ,
+ Name-sg = Таблице ,
+ name-sg = таблице ,
+ Name-pl = Таблицам ,
+ name-pl = таблицам ,
+ Name-sg-ab = Табл. ,
+ name-sg-ab = табл. ,
+ Name-pl-ab = Табл. ,
+ name-pl-ab = табл. ,
+ case = i ,
+ Name-sg = Таблицей ,
+ name-sg = таблицей ,
+ Name-pl = Таблицами ,
+ name-pl = таблицами ,
+ Name-sg-ab = Табл. ,
+ name-sg-ab = табл. ,
+ Name-pl-ab = Табл. ,
+ name-pl-ab = табл. ,
+ case = p ,
+ Name-sg = Таблице ,
+ name-sg = таблице ,
+ Name-pl = Таблицах ,
+ name-pl = таблицах ,
+ Name-sg-ab = Табл. ,
+ name-sg-ab = табл. ,
+ Name-pl-ab = Табл. ,
+ name-pl-ab = табл. ,
+
+type = item ,
+ gender = m ,
+ case = n ,
+ Name-sg = Пункт ,
+ name-sg = пункт ,
+ Name-pl = Пункты ,
+ name-pl = пункты ,
+ Name-sg-ab = П. ,
+ name-sg-ab = п. ,
+ Name-pl-ab = Пп. ,
+ name-pl-ab = пп. ,
+ case = a ,
+ Name-sg = Пункт ,
+ name-sg = пункт ,
+ Name-pl = Пункты ,
+ name-pl = пункты ,
+ Name-sg-ab = П. ,
+ name-sg-ab = п. ,
+ Name-pl-ab = Пп. ,
+ name-pl-ab = пп. ,
+ case = g ,
+ Name-sg = Пункта ,
+ name-sg = пункта ,
+ Name-pl = Пунктов ,
+ name-pl = пунктов ,
+ Name-sg-ab = П. ,
+ name-sg-ab = п. ,
+ Name-pl-ab = Пп. ,
+ name-pl-ab = пп. ,
+ case = d ,
+ Name-sg = Пункту ,
+ name-sg = пункту ,
+ Name-pl = Пунктам ,
+ name-pl = пунктам ,
+ Name-sg-ab = П. ,
+ name-sg-ab = п. ,
+ Name-pl-ab = Пп. ,
+ name-pl-ab = пп. ,
+ case = i ,
+ Name-sg = Пунктом ,
+ name-sg = пунктом ,
+ Name-pl = Пунктами ,
+ name-pl = пунктами ,
+ Name-sg-ab = П. ,
+ name-sg-ab = п. ,
+ Name-pl-ab = Пп. ,
+ name-pl-ab = пп. ,
+ case = p ,
+ Name-sg = Пункте ,
+ name-sg = пункте ,
+ Name-pl = Пунктах ,
+ name-pl = пунктах ,
+ Name-sg-ab = П. ,
+ name-sg-ab = п. ,
+ Name-pl-ab = Пп. ,
+ name-pl-ab = пп. ,
+
+type = footnote ,
+ gender = f ,
+ case = n ,
+ Name-sg = Сноска ,
+ name-sg = сноска ,
+ Name-pl = Сноски ,
+ name-pl = сноски ,
+ case = a ,
+ Name-sg = Сноску ,
+ name-sg = сноску ,
+ Name-pl = Сноски ,
+ name-pl = сноски ,
+ case = g ,
+ Name-sg = Сноски ,
+ name-sg = сноски ,
+ Name-pl = Сносок ,
+ name-pl = сносок ,
+ case = d ,
+ Name-sg = Сноске ,
+ name-sg = сноске ,
+ Name-pl = Сноскам ,
+ name-pl = сноскам ,
+ case = i ,
+ Name-sg = Сноской ,
+ name-sg = сноской ,
+ Name-pl = Сносками ,
+ name-pl = сносками ,
+ case = p ,
+ Name-sg = Сноске ,
+ name-sg = сноске ,
+ Name-pl = Сносках ,
+ name-pl = сносках ,
+
+type = endnote ,
+ gender = f ,
+ case = n ,
+ Name-sg = Сноска ,
+ name-sg = сноска ,
+ Name-pl = Сноски ,
+ name-pl = сноски ,
+ case = a ,
+ Name-sg = Сноску ,
+ name-sg = сноску ,
+ Name-pl = Сноски ,
+ name-pl = сноски ,
+ case = g ,
+ Name-sg = Сноски ,
+ name-sg = сноски ,
+ Name-pl = Сносок ,
+ name-pl = сносок ,
+ case = d ,
+ Name-sg = Сноске ,
+ name-sg = сноске ,
+ Name-pl = Сноскам ,
+ name-pl = сноскам ,
+ case = i ,
+ Name-sg = Сноской ,
+ name-sg = сноской ,
+ Name-pl = Сносками ,
+ name-pl = сносками ,
+ case = p ,
+ Name-sg = Сноске ,
+ name-sg = сноске ,
+ Name-pl = Сносках ,
+ name-pl = сносках ,
+
+type = note ,
+ gender = f ,
+ case = n ,
+ Name-sg = Заметка ,
+ name-sg = заметка ,
+ Name-pl = Заметки ,
+ name-pl = заметки ,
+ case = a ,
+ Name-sg = Заметку ,
+ name-sg = заметку ,
+ Name-pl = Заметки ,
+ name-pl = заметки ,
+ case = g ,
+ Name-sg = Заметки ,
+ name-sg = заметки ,
+ Name-pl = Заметок ,
+ name-pl = заметок ,
+ case = d ,
+ Name-sg = Заметке ,
+ name-sg = заметке ,
+ Name-pl = Заметкам ,
+ name-pl = заметкам ,
+ case = i ,
+ Name-sg = Заметкой ,
+ name-sg = заметкой ,
+ Name-pl = Заметками ,
+ name-pl = заметками ,
+ case = p ,
+ Name-sg = Заметке ,
+ name-sg = заметке ,
+ Name-pl = Заметках ,
+ name-pl = заметках ,
+
+type = equation ,
+ gender = n ,
+ case = n ,
+ Name-sg = Уравнение ,
+ name-sg = уравнение ,
+ Name-pl = Уравнения ,
+ name-pl = уравнения ,
+ Name-sg-ab = Ур. ,
+ name-sg-ab = ур. ,
+ Name-pl-ab = Ур. ,
+ name-pl-ab = ур. ,
+ case = a ,
+ Name-sg = Уравнение ,
+ name-sg = уравнение ,
+ Name-pl = Уравнения ,
+ name-pl = уравнения ,
+ Name-sg-ab = Ур. ,
+ name-sg-ab = ур. ,
+ Name-pl-ab = Ур. ,
+ name-pl-ab = ур. ,
+ case = g ,
+ Name-sg = Уравнения ,
+ name-sg = уравнения ,
+ Name-pl = Уравнений ,
+ name-pl = уравнений ,
+ Name-sg-ab = Ур. ,
+ name-sg-ab = ур. ,
+ Name-pl-ab = Ур. ,
+ name-pl-ab = ур. ,
+ case = d ,
+ Name-sg = Уравнению ,
+ name-sg = уравнению ,
+ Name-pl = Уравнениям ,
+ name-pl = уравнениям ,
+ Name-sg-ab = Ур. ,
+ name-sg-ab = ур. ,
+ Name-pl-ab = Ур. ,
+ name-pl-ab = ур. ,
+ case = i ,
+ Name-sg = Уравнением ,
+ name-sg = уравнением ,
+ Name-pl = Уравнениями ,
+ name-pl = уравнениями ,
+ Name-sg-ab = Ур. ,
+ name-sg-ab = ур. ,
+ Name-pl-ab = Ур. ,
+ name-pl-ab = ур. ,
+ case = p ,
+ Name-sg = Уравнении ,
+ name-sg = уравнении ,
+ Name-pl = Уравнениях ,
+ name-pl = уравнениях ,
+ Name-sg-ab = Ур. ,
+ name-sg-ab = ур. ,
+ Name-pl-ab = Ур. ,
+ name-pl-ab = ур. ,
+ +refbounds-rb = {с\nobreakspace(,,,)} ,
+ refbounds-first-sg = {,(,),} ,
+ refbounds = {(,,,)} ,
+
+type = theorem ,
+ gender = f ,
+ case = n ,
+ Name-sg = Теорема ,
+ name-sg = теорема ,
+ Name-pl = Теоремы ,
+ name-pl = теоремы ,
+ Name-sg-ab = Теор. ,
+ name-sg-ab = теор. ,
+ Name-pl-ab = Теор. ,
+ name-pl-ab = теор. ,
+ case = a ,
+ Name-sg = Теорему ,
+ name-sg = теорему ,
+ Name-pl = Теоремы ,
+ name-pl = теоремы ,
+ Name-sg-ab = Теор. ,
+ name-sg-ab = теор. ,
+ Name-pl-ab = Теор. ,
+ name-pl-ab = теор. ,
+ case = g ,
+ Name-sg = Теоремы ,
+ name-sg = теоремы ,
+ Name-pl = Теорем ,
+ name-pl = теорем ,
+ Name-sg-ab = Теор. ,
+ name-sg-ab = теор. ,
+ Name-pl-ab = Теор. ,
+ name-pl-ab = теор. ,
+ case = d ,
+ Name-sg = Теореме ,
+ name-sg = теореме ,
+ Name-pl = Теоремам ,
+ name-pl = теоремам ,
+ Name-sg-ab = Теор. ,
+ name-sg-ab = теор. ,
+ Name-pl-ab = Теор. ,
+ name-pl-ab = теор. ,
+ case = i ,
+ Name-sg = Теоремой ,
+ name-sg = теоремой ,
+ Name-pl = Теоремами ,
+ name-pl = теоремами ,
+ Name-sg-ab = Теор. ,
+ name-sg-ab = теор. ,
+ Name-pl-ab = Теор. ,
+ name-pl-ab = теор. ,
+ case = p ,
+ Name-sg = Теореме ,
+ name-sg = теореме ,
+ Name-pl = Теоремах ,
+ name-pl = теоремах ,
+ Name-sg-ab = Теор. ,
+ name-sg-ab = теор. ,
+ Name-pl-ab = Теор. ,
+ name-pl-ab = теор. ,
+
+type = lemma ,
+ gender = f ,
+ case = n ,
+ Name-sg = Лемма ,
+ name-sg = лемма ,
+ Name-pl = Леммы ,
+ name-pl = леммы ,
+ case = a ,
+ Name-sg = Лемму ,
+ name-sg = лемму ,
+ Name-pl = Леммы ,
+ name-pl = леммы ,
+ case = g ,
+ Name-sg = Леммы ,
+ name-sg = леммы ,
+ Name-pl = Лемм ,
+ name-pl = лемм ,
+ case = d ,
+ Name-sg = Лемме ,
+ name-sg = лемме ,
+ Name-pl = Леммам ,
+ name-pl = леммам ,
+ case = i ,
+ Name-sg = Леммой ,
+ name-sg = леммой ,
+ Name-pl = Леммами ,
+ name-pl = леммами ,
+ case = p ,
+ Name-sg = Лемме ,
+ name-sg = лемме ,
+ Name-pl = Леммах ,
+ name-pl = леммах ,
+
+type = corollary ,
+ gender = m ,
+ case = n ,
+ Name-sg = Вывод ,
+ name-sg = вывод ,
+ Name-pl = Выводы ,
+ name-pl = выводы ,
+ case = a ,
+ Name-sg = Вывод ,
+ name-sg = вывод ,
+ Name-pl = Выводы ,
+ name-pl = выводы ,
+ case = g ,
+ Name-sg = Вывода ,
+ name-sg = вывода ,
+ Name-pl = Выводов ,
+ name-pl = выводов ,
+ case = d ,
+ Name-sg = Выводу ,
+ name-sg = выводу ,
+ Name-pl = Выводам ,
+ name-pl = выводам ,
+ case = i ,
+ Name-sg = Выводом ,
+ name-sg = выводом ,
+ Name-pl = Выводами ,
+ name-pl = выводами ,
+ case = p ,
+ Name-sg = Выводе ,
+ name-sg = выводе ,
+ Name-pl = Выводах ,
+ name-pl = выводах ,
+
+type = proposition ,
+ gender = n ,
+ case = n ,
+ Name-sg = Предложение ,
+ name-sg = предложение ,
+ Name-pl = Предложения ,
+ name-pl = предложения ,
+ Name-sg-ab = Предл. ,
+ name-sg-ab = предл. ,
+ Name-pl-ab = Предл. ,
+ name-pl-ab = предл. ,
+ case = a ,
+ Name-sg = Предложение ,
+ name-sg = предложение ,
+ Name-pl = Предложения ,
+ name-pl = предложения ,
+ Name-sg-ab = Предл. ,
+ name-sg-ab = предл. ,
+ Name-pl-ab = Предл. ,
+ name-pl-ab = предл. ,
+ case = g ,
+ Name-sg = Предложения ,
+ name-sg = предложения ,
+ Name-pl = Предложений ,
+ name-pl = предложений ,
+ Name-sg-ab = Предл. ,
+ name-sg-ab = предл. ,
+ Name-pl-ab = Предл. ,
+ name-pl-ab = предл. ,
+ case = d ,
+ Name-sg = Предложению ,
+ name-sg = предложению ,
+ Name-pl = Предложениям ,
+ name-pl = предложениям ,
+ Name-sg-ab = Предл. ,
+ name-sg-ab = предл. ,
+ Name-pl-ab = Предл. ,
+ name-pl-ab = предл. ,
+ case = i ,
+ Name-sg = Предложением ,
+ name-sg = предложением ,
+ Name-pl = Предложениями ,
+ name-pl = предложениями ,
+ Name-sg-ab = Предл. ,
+ name-sg-ab = предл. ,
+ Name-pl-ab = Предл. ,
+ name-pl-ab = предл. ,
+ case = p ,
+ Name-sg = Предложении ,
+ name-sg = предложении ,
+ Name-pl = Предложениях ,
+ name-pl = предложениях ,
+ Name-sg-ab = Предл. ,
+ name-sg-ab = предл. ,
+ Name-pl-ab = Предл. ,
+ name-pl-ab = предл. ,
+
+type = definition ,
+ gender = n ,
+ case = n ,
+ Name-sg = Определение ,
+ name-sg = определение ,
+ Name-pl = Определения ,
+ name-pl = определения ,
+ Name-sg-ab = Опр. ,
+ name-sg-ab = опр. ,
+ Name-pl-ab = Опр. ,
+ name-pl-ab = опр. ,
+ case = a ,
+ Name-sg = Определение ,
+ name-sg = определение ,
+ Name-pl = Определения ,
+ name-pl = определения ,
+ Name-sg-ab = Опр. ,
+ name-sg-ab = опр. ,
+ Name-pl-ab = Опр. ,
+ name-pl-ab = опр. ,
+ case = g ,
+ Name-sg = Определения ,
+ name-sg = определения ,
+ Name-pl = Определений ,
+ name-pl = определений ,
+ Name-sg-ab = Опр. ,
+ name-sg-ab = опр. ,
+ Name-pl-ab = Опр. ,
+ name-pl-ab = опр. ,
+ case = d ,
+ Name-sg = Определению ,
+ name-sg = определению ,
+ Name-pl = Определениям ,
+ name-pl = определениям ,
+ Name-sg-ab = Опр. ,
+ name-sg-ab = опр. ,
+ Name-pl-ab = Опр. ,
+ name-pl-ab = опр. ,
+ case = i ,
+ Name-sg = Определением ,
+ name-sg = определением ,
+ Name-pl = Определениями ,
+ name-pl = определениями ,
+ Name-sg-ab = Опр. ,
+ name-sg-ab = опр. ,
+ Name-pl-ab = Опр. ,
+ name-pl-ab = опр. ,
+ case = p ,
+ Name-sg = Определении ,
+ name-sg = определении ,
+ Name-pl = Определениях ,
+ name-pl = определениях ,
+ Name-sg-ab = Опр. ,
+ name-sg-ab = опр. ,
+ Name-pl-ab = Опр. ,
+ name-pl-ab = опр. ,
+
+type = proof ,
+ gender = n ,
+ case = n ,
+ Name-sg = Доказательство ,
+ name-sg = доказательство ,
+ Name-pl = Доказательства ,
+ name-pl = доказательства ,
+ case = a ,
+ Name-sg = Доказательство ,
+ name-sg = доказательство ,
+ Name-pl = Доказательства ,
+ name-pl = доказательства ,
+ case = g ,
+ Name-sg = Доказательства ,
+ name-sg = доказательства ,
+ Name-pl = Доказательств ,
+ name-pl = доказательств ,
+ case = d ,
+ Name-sg = Доказательству ,
+ name-sg = доказательству ,
+ Name-pl = Доказательствам ,
+ name-pl = доказательствам ,
+ case = i ,
+ Name-sg = Доказательством ,
+ name-sg = доказательством ,
+ Name-pl = Доказательствами ,
+ name-pl = доказательствами ,
+ case = p ,
+ Name-sg = Доказательстве ,
+ name-sg = доказательстве ,
+ Name-pl = Доказательствах ,
+ name-pl = доказательствах ,
+
+type = result ,
+ gender = m ,
+ case = n ,
+ Name-sg = Результат ,
+ name-sg = результат ,
+ Name-pl = Результаты ,
+ name-pl = результаты ,
+ case = a ,
+ Name-sg = Результат ,
+ name-sg = результат ,
+ Name-pl = Результаты ,
+ name-pl = результаты ,
+ case = g ,
+ Name-sg = Результата ,
+ name-sg = результата ,
+ Name-pl = Результатов ,
+ name-pl = результатов ,
+ case = d ,
+ Name-sg = Результату ,
+ name-sg = результату ,
+ Name-pl = Результатам ,
+ name-pl = результатам ,
+ case = i ,
+ Name-sg = Результатом ,
+ name-sg = результатом ,
+ Name-pl = Результатами ,
+ name-pl = результатами ,
+ case = p ,
+ Name-sg = Результате ,
+ name-sg = результате ,
+ Name-pl = Результатах ,
+ name-pl = результатах ,
+
+type = remark ,
+ gender = n ,
+ case = n ,
+ Name-sg = Примечание ,
+ name-sg = примечание ,
+ Name-pl = Примечания ,
+ name-pl = примечания ,
+ Name-sg-ab = Прим. ,
+ name-sg-ab = прим. ,
+ Name-pl-ab = Прим. ,
+ name-pl-ab = прим. ,
+ case = a ,
+ Name-sg = Примечание ,
+ name-sg = примечание ,
+ Name-pl = Примечания ,
+ name-pl = примечания ,
+ Name-sg-ab = Прим. ,
+ name-sg-ab = прим. ,
+ Name-pl-ab = Прим. ,
+ name-pl-ab = прим. ,
+ case = g ,
+ Name-sg = Примечания ,
+ name-sg = примечания ,
+ Name-pl = Примечаний ,
+ name-pl = примечаний ,
+ Name-sg-ab = Прим. ,
+ name-sg-ab = прим. ,
+ Name-pl-ab = Прим. ,
+ name-pl-ab = прим. ,
+ case = d ,
+ Name-sg = Примечанию ,
+ name-sg = примечанию ,
+ Name-pl = Примечаниям ,
+ name-pl = примечаниям ,
+ Name-sg-ab = Прим. ,
+ name-sg-ab = прим. ,
+ Name-pl-ab = Прим. ,
+ name-pl-ab = прим. ,
+ case = i ,
+ Name-sg = Примечанием ,
+ name-sg = примечанием ,
+ Name-pl = Примечаниями ,
+ name-pl = примечаниями ,
+ Name-sg-ab = Прим. ,
+ name-sg-ab = прим. ,
+ Name-pl-ab = Прим. ,
+ name-pl-ab = прим. ,
+ case = p ,
+ Name-sg = Примечании ,
+ name-sg = примечании ,
+ Name-pl = Примечаниях ,
+ name-pl = примечаниях ,
+ Name-sg-ab = Прим. ,
+ name-sg-ab = прим. ,
+ Name-pl-ab = Прим. ,
+ name-pl-ab = прим. ,
+
+type = example ,
+ gender = m ,
+ case = n ,
+ Name-sg = Пример ,
+ name-sg = пример ,
+ Name-pl = Примеры ,
+ name-pl = примеры ,
+ case = a ,
+ Name-sg = Пример ,
+ name-sg = пример ,
+ Name-pl = Примеры ,
+ name-pl = примеры ,
+ case = g ,
+ Name-sg = Примера ,
+ name-sg = примера ,
+ Name-pl = Примеров ,
+ name-pl = примеров ,
+ case = d ,
+ Name-sg = Примеру ,
+ name-sg = примеру ,
+ Name-pl = Примерам ,
+ name-pl = примерам ,
+ case = i ,
+ Name-sg = Примером ,
+ name-sg = примером ,
+ Name-pl = Примерами ,
+ name-pl = примерами ,
+ case = p ,
+ Name-sg = Примере ,
+ name-sg = примере ,
+ Name-pl = Примерах ,
+ name-pl = примерах ,
+
+type = algorithm ,
+ gender = m ,
+ case = n ,
+ Name-sg = Алгоритм ,
+ name-sg = алгоритм ,
+ Name-pl = Алгоритмы ,
+ name-pl = алгоритмы ,
+ case = a ,
+ Name-sg = Алгоритм ,
+ name-sg = алгоритм ,
+ Name-pl = Алгоритмы ,
+ name-pl = алгоритмы ,
+ case = g ,
+ Name-sg = Алгоритма ,
+ name-sg = алгоритма ,
+ Name-pl = Алгоритмов ,
+ name-pl = алгоритмов ,
+ case = d ,
+ Name-sg = Алгоритму ,
+ name-sg = алгоритму ,
+ Name-pl = Алгоритмам ,
+ name-pl = алгоритмам ,
+ case = i ,
+ Name-sg = Алгоритмом ,
+ name-sg = алгоритмом ,
+ Name-pl = Алгоритмами ,
+ name-pl = алгоритмами ,
+ case = p ,
+ Name-sg = Алгоритме ,
+ name-sg = алгоритме ,
+ Name-pl = Алгоритмах ,
+ name-pl = алгоритмах ,
+
+type = listing ,
+ gender = m ,
+ case = n ,
+ Name-sg = Листинг ,
+ name-sg = листинг ,
+ Name-pl = Листинги ,
+ name-pl = листинги ,
+ case = a ,
+ Name-sg = Листинг ,
+ name-sg = листинг ,
+ Name-pl = Листинги ,
+ name-pl = листинги ,
+ case = g ,
+ Name-sg = Листинга ,
+ name-sg = листинга ,
+ Name-pl = Листингов ,
+ name-pl = листингов ,
+ case = d ,
+ Name-sg = Листингу ,
+ name-sg = листингу ,
+ Name-pl = Листингам ,
+ name-pl = листингам ,
+ case = i ,
+ Name-sg = Листингом ,
+ name-sg = листинглм ,
+ Name-pl = Листингами ,
+ name-pl = листингами ,
+ case = p ,
+ Name-sg = Листинге ,
+ name-sg = листинге ,
+ Name-pl = Листингах ,
+ name-pl = листингах ,
+
+type = exercise ,
+ gender = n ,
+ case = n ,
+ Name-sg = Упражнение ,
+ name-sg = упражнение ,
+ Name-pl = Упражнения ,
+ name-pl = упражнения ,
+ Name-sg-ab = Упр. ,
+ name-sg-ab = упр. ,
+ Name-pl-ab = Упр. ,
+ name-pl-ab = упр. ,
+ case = a ,
+ Name-sg = Упражнение ,
+ name-sg = упражнение ,
+ Name-pl = Упражнения ,
+ name-pl = упражнения ,
+ Name-sg-ab = Упр. ,
+ name-sg-ab = упр. ,
+ Name-pl-ab = Упр. ,
+ name-pl-ab = упр. ,
+ case = g ,
+ Name-sg = Упражнения ,
+ name-sg = упражнения ,
+ Name-pl = Упражнений ,
+ name-pl = упражнений ,
+ Name-sg-ab = Упр. ,
+ name-sg-ab = упр. ,
+ Name-pl-ab = Упр. ,
+ name-pl-ab = упр. ,
+ case = d ,
+ Name-sg = Упражнению ,
+ name-sg = упражнению ,
+ Name-pl = Упражнениям ,
+ name-pl = упражнениям ,
+ Name-sg-ab = Упр. ,
+ name-sg-ab = упр. ,
+ Name-pl-ab = Упр. ,
+ name-pl-ab = упр. ,
+ case = i ,
+ Name-sg = Упражнением ,
+ name-sg = упражнением ,
+ Name-pl = Упражнениями ,
+ name-pl = упражнениями ,
+ Name-sg-ab = Упр. ,
+ name-sg-ab = упр. ,
+ Name-pl-ab = Упр. ,
+ name-pl-ab = упр. ,
+ case = p ,
+ Name-sg = Упражнении ,
+ name-sg = упражнении ,
+ Name-pl = Упражнениях ,
+ name-pl = упражнениях ,
+ Name-sg-ab = Упр. ,
+ name-sg-ab = упр. ,
+ Name-pl-ab = Упр. ,
+ name-pl-ab = упр. ,
+
+type = solution ,
+ gender = n ,
+ case = n ,
+ Name-sg = Решение ,
+ name-sg = решение ,
+ Name-pl = Решения ,
+ name-pl = решения ,
+ case = a ,
+ Name-sg = Решение ,
+ name-sg = решение ,
+ Name-pl = Решения ,
+ name-pl = решения ,
+ case = g ,
+ Name-sg = Решения ,
+ name-sg = решения ,
+ Name-pl = Решений ,
+ name-pl = решений ,
+ case = d ,
+ Name-sg = Решению ,
+ name-sg = решению ,
+ Name-pl = Решениям ,
+ name-pl = решениям ,
+ case = i ,
+ Name-sg = Решением ,
+ name-sg = решением ,
+ Name-pl = Решениями ,
+ name-pl = решениями ,
+ case = p ,
+ Name-sg = Решении ,
+ name-sg = решении ,
+ Name-pl = Решениях ,
+ name-pl = решениях ,
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</lang-russian>
+% \end{macrocode}
+%
+%
% \PrintIndex
%
%
diff --git a/macros/latex/contrib/zref-clever/zref-clever.ins b/macros/latex/contrib/zref-clever/zref-clever.ins
index 17e4599190..0aefb6ce73 100644
--- a/macros/latex/contrib/zref-clever/zref-clever.ins
+++ b/macros/latex/contrib/zref-clever/zref-clever.ins
@@ -95,5 +95,6 @@ for those people who are interested.
\generate{\file{zref-clever-spanish.lang}{\from{zref-clever.dtx}{lang-spanish}}}
\generate{\file{zref-clever-dutch.lang}{\from{zref-clever.dtx}{lang-dutch}}}
\generate{\file{zref-clever-italian.lang}{\from{zref-clever.dtx}{lang-italian}}}
+\generate{\file{zref-clever-russian.lang}{\from{zref-clever.dtx}{lang-russian}}}
\endbatchfile
diff --git a/macros/latex/required/babel/base/README.md b/macros/latex/required/babel/base/README.md
index 07a872c4ab..3247ec987f 100644
--- a/macros/latex/required/babel/base/README.md
+++ b/macros/latex/required/babel/base/README.md
@@ -1,6 +1,6 @@
-## Babel 24.4
+## Babel 24.5
-2024-04-20
+2024-05-18
`babel` is the multilingual framework for localizing documents in
LaTeX, LuaLaTeX, XeLaTeX. It manages culturally-determined
@@ -10,9 +10,9 @@ languages even work with Plain formats.
The latest stable version is available on <https://ctan.org/pkg/babel>.
-Changes in version 24.4 are described in:
+Changes in version 24.5 are described in:
-https://latex3.github.io/babel/news/whats-new-in-babel-24.4.html
+https://latex3.github.io/babel/news/whats-new-in-babel-24.5.html
Apart from the manual, you can find information on some aspects of babel at:
@@ -48,10 +48,14 @@ respective authors.
### Summary of latest changes
```
-24.4 2024-04-20
- * New ‘interchar’ declarations for Cantonese, Chinese, Japanese and
- Korean: linebreak.basic (xe).
- * Fixed Tibetan line breaking with closing punctuation (lua).
+24.5 2024-05-18
+ * Change the first item in `abjad` and `maghrebi.abjad` counters
+ in `ar-DZ`, `ar-MA` and `ar-TN`), from ا to أ. Suggested by
+ @seloumi.
+ * Fixed an error when a locale is loaded on the fly and there are empty
+ captions in another language (#294)
+ * Fix in transforms (lua): negative values in `space` and `spacefactor`
+ raised and error.
```
### Previous changes
diff --git a/macros/latex/required/babel/base/babel-code.pdf b/macros/latex/required/babel/base/babel-code.pdf
index b157d32efd..fc188152cf 100644
--- a/macros/latex/required/babel/base/babel-code.pdf
+++ b/macros/latex/required/babel/base/babel-code.pdf
Binary files differ
diff --git a/macros/latex/required/babel/base/babel.dtx b/macros/latex/required/babel/base/babel.dtx
index 256ec0384c..6a129d2c32 100644
--- a/macros/latex/required/babel/base/babel.dtx
+++ b/macros/latex/required/babel/base/babel.dtx
@@ -32,7 +32,7 @@
%
% \iffalse
%<*filedriver>
-\ProvidesFile{babel.dtx}[2024/04/20 v24.4 The Babel package]
+\ProvidesFile{babel.dtx}[2024/05/18 v24.5 The Babel package]
\documentclass{ltxdoc}
\GetFileInfo{babel.dtx}
\usepackage{fontspec}
@@ -2567,11 +2567,11 @@ languages above. So, the previous example is best written as:
\babelprovide[_import_]{hungarian}
\end{verbatim}
-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
-may show a warning about the current lack of suitability of some
-features.
+There are 380 |ini| files for about 300 languages, 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 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
@@ -3892,22 +3892,26 @@ There are some package options controlling bidi writing.
$\string|$ \texttt{basic-r} $\string|$ \texttt{bidi-l} $\string|$
\texttt{bidi-r}}
-\New{3.14} Selects the bidi algorithm to be used. With |default| the
-bidi mechanism is just activated (by default it is not), but every
-change must be marked up. In \xetex{} and \pdftex{} this is the only
-option.
+\New{3.14} Selects the bidi algorithm to be used.
-In \luatex, |basic-r| provides a simple and fast method for R text,
-which handles numbers and unmarked L text within an R context many in
-typical cases. \New{3.19} Finally, |basic| supports both L and R text,
-and it is the preferred method (support for |basic-r| is currently
-limited). (They are named \texttt{basic} mainly because they only
-consider the intrinsic direction of scripts and weak directionality.)
+With |default| the bidi mechanism is just activated (by default it is
+not), but every change must be marked up. In \pdftex{} this is the only
+option. If the RL text only consists of letters and punctuation, it
+will be fine in most cases, but numbers, for example, will be rendered
+in the wrong order.
-\New{3.29} In \xetex, |bidi-r| and |bidi-l| resort to the package
-\textsf{bidi} (by Vafa Khalighi). Integration is still somewhat
-tentative, but it mostly works. For RL documents use the former, and
-for LR ones use the latter.
+In \luatex, the preferred method is |basic|, which supports both L and
+R text. |basic-r| was a first attempt to create a bidi algorith and
+provides a simple and fast method for R text in some typical cases.
+(They are named \texttt{basic} mainly because they only consider the
+intrinsic direction of scripts and weak directionality.)
+
+In \xetex, |bidi-r| and |bidi-l| resort to the package \textsf{bidi}
+(by Vafa Khalighi). For RL documents use the former, and for LR ones
+use the latter. However, this package patches heavily lots of macros
+and packages even if the RL script is not the main one, which can lead
+to some surprising results, so for short and simple texts (letters and
+punctuation) the |default| method can be preferable.
There are samples on GitHub, under \texttt{/required/babel/samples}.
See particularly |lua-bidibasic.tex| and |lua-secenum.tex|.
@@ -5475,8 +5479,8 @@ wouldn’t exist.
% \section{Tools}
%
% \begin{macrocode}
-%<<version=24.4>>
-%<<date=2024/04/20>>
+%<<version=24.5>>
+%<<date=2024/05/18>>
% \end{macrocode}
%
% \textbf{Do not use the following macros in \texttt{ldf} files. They
@@ -10354,15 +10358,15 @@ wouldn’t exist.
\@namedef{extras#1}{}%
\@namedef{noextras#1}{}%
\bbl@startcommands*{#1}{captions}%
- \ifx\bbl@KVP@captions\@nnil % and also if import, implicit
+ \ifx\bbl@KVP@captions\@nnil % and also if import, implicit
\def\bbl@tempb##1{% elt for \bbl@captionslist
- \ifx##1\@empty\else
+ \ifx##1\@nnil\else
\bbl@exp{%
\\\SetString\\##1{%
\\\bbl@nocaption{\bbl@stripslash##1}{#1\bbl@stripslash##1}}}%
\expandafter\bbl@tempb
\fi}%
- \expandafter\bbl@tempb\bbl@captionslist\@empty
+ \expandafter\bbl@tempb\bbl@captionslist\@nnil
\else
\ifx\bbl@initoload\relax
\bbl@read@ini{\bbl@KVP@captions}2% % Here letters cat = 11
@@ -14592,10 +14596,10 @@ end
}}
\begingroup
\catcode`\%=12
-\catcode`\^=14
+\catcode`\&=14
\catcode`\'=12
\catcode`\~=12
-\gdef\bbl@seaintraspace{^
+\gdef\bbl@seaintraspace{&
\let\bbl@seaintraspace\relax
\directlua{
Babel = Babel or {}
@@ -14611,7 +14615,7 @@ end
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
@@ -14621,16 +14625,16 @@ end
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)
@@ -14641,7 +14645,7 @@ end
end
end
end
- }^^
+ }&
\bbl@luahyphenate}
% \end{macrocode}
%
@@ -15321,9 +15325,11 @@ end
rep = rep:gsub('^%s*(insert)%s*,', 'insert = true, ')
rep = rep:gsub('(string)%s*=%s*([^%s,]*)', Babel.capture_func)
if #1 == 0 or #1 == 2 then
- rep = rep:gsub('(space)%s*=%s*([%d%.]+)%s+([%d%.]+)%s+([%d%.]+)',
+ rep = rep:gsub(&%
+ '(space)%s*=%s*([%-%d%.]+)%s+([%-%d%.]+)%s+([%-%d%.]+)',
'space = {' .. '%2, %3, %4' .. '}')
- rep = rep:gsub('(spacefactor)%s*=%s*([%d%.]+)%s+([%d%.]+)%s+([%d%.]+)',
+ rep = rep:gsub(&%
+ '(spacefactor)%s*=%s*([%-%d%.]+)%s+([%-%d%.]+)%s+([%-%d%.]+)',
'spacefactor = {' .. '%2, %3, %4' .. '}')
rep = rep:gsub('(kashida)%s*=%s*([^%s,]*)', Babel.capture_kashida)
else
diff --git a/macros/latex/required/babel/base/babel.ins b/macros/latex/required/babel/base/babel.ins
index 4bd22c8667..d70ae40c62 100644
--- a/macros/latex/required/babel/base/babel.ins
+++ b/macros/latex/required/babel/base/babel.ins
@@ -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{2024/04/20}
+\def\filedate{2024/05/18}
\def\batchfile{babel.ins}
\input docstrip.tex
diff --git a/macros/latex/required/babel/base/babel.pdf b/macros/latex/required/babel/base/babel.pdf
index 55df378a61..b541f0bf05 100644
--- a/macros/latex/required/babel/base/babel.pdf
+++ b/macros/latex/required/babel/base/babel.pdf
Binary files differ
diff --git a/macros/latex/required/babel/base/bbcompat.dtx b/macros/latex/required/babel/base/bbcompat.dtx
index f36bd4b705..00e5a6b8b5 100644
--- a/macros/latex/required/babel/base/bbcompat.dtx
+++ b/macros/latex/required/babel/base/bbcompat.dtx
@@ -30,7 +30,7 @@
%
% \iffalse
%<*dtx>
-\ProvidesFile{bbcompat.dtx}[2024/04/20 v24.4]
+\ProvidesFile{bbcompat.dtx}[2024/05/18 v24.5]
%</dtx>
%
%% File 'bbcompat.dtx'
diff --git a/macros/latex/contrib/l3backend/CHANGELOG.md b/macros/latex/required/l3backend/CHANGELOG.md
index 66a69a3bb3..68f697ac5f 100644
--- a/macros/latex/contrib/l3backend/CHANGELOG.md
+++ b/macros/latex/required/l3backend/CHANGELOG.md
@@ -6,6 +6,22 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2024-05-08]
+
+### Changed
+- Use built-in conversion for CMYK colors with `dvisvgm` (see \#1538)
+
+### Fixed
+- CMYK output from `dvisvgm`
+
+## [2024-04-11]
+
+### Added
+- Support for 'raw' PDF object IDs
+
+### Changed
+- Update PDF object management code
+
## [2024-03-14]
### Removed
@@ -32,7 +48,7 @@ this project uses date-based 'snapshot' version identifiers.
## [2023-11-09]
### Changed
-- Changed `luaotfload` integration to allow coexistance with (x)color.
+- Changed `luaotfload` integration to allow coexistence with (x)color.
## [2023-11-04]
@@ -217,7 +233,7 @@ this project uses date-based 'snapshot' version identifiers.
backend)
### Changed
-- Implementation of color wtih (x)dvipdfmx (requires an up-to-date
+- Implementation of color with (x)dvipdfmx (requires an up-to-date
backend)
## [2020-09-24]
@@ -339,7 +355,9 @@ this project uses date-based 'snapshot' version identifiers.
- Include `l3backend` in file names
- Moved backend code to internal for each 'parent' module
-[Unreleased]: https://github.com/latex3/latex3/compare/2024-03-14...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2024-05-08...HEAD
+[2024-05-08]: https://github.com/latex3/latex3/compare/2024-04-11...2024-05-08
+[2024-04-11]: https://github.com/latex3/latex3/compare/2024-03-14...2024-04-11
[2024-03-14]: https://github.com/latex3/latex3/compare/2024-02-20...2024-03-14
[2024-02-20]: https://github.com/latex3/latex3/compare/2024-01-04...2024-02-20
[2024-01-04]: https://github.com/latex3/latex3/compare/2023-11-09...2024-01-04
diff --git a/macros/latex/contrib/l3backend/README.md b/macros/latex/required/l3backend/README.md
index 7be33df8b8..77eb591526 100644
--- a/macros/latex/contrib/l3backend/README.md
+++ b/macros/latex/required/l3backend/README.md
@@ -1,7 +1,7 @@
LaTeX3 Backend Drivers
======================
-Release 2024-03-14
+Release 2024-05-08
This package forms parts of `expl3`, and contains the code used to interface
with backends (drivers) across the `expl3` codebase. The functions here are
diff --git a/macros/latex/contrib/l3backend/l3backend-basics.dtx b/macros/latex/required/l3backend/l3backend-basics.dtx
index 4d3b68225a..81c51b5b72 100644
--- a/macros/latex/contrib/l3backend/l3backend-basics.dtx
+++ b/macros/latex/required/l3backend/l3backend-basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -70,27 +70,27 @@
% \begin{macrocode}
\ProvidesExplFile
%<*dvipdfmx>
- {l3backend-dvipdfmx.def}{2024-03-14}{}
+ {l3backend-dvipdfmx.def}{2024-05-08}{}
{L3 backend support: dvipdfmx}
%</dvipdfmx>
%<*dvips>
- {l3backend-dvips.def}{2024-03-14}{}
+ {l3backend-dvips.def}{2024-05-08}{}
{L3 backend support: dvips}
%</dvips>
%<*dvisvgm>
- {l3backend-dvisvgm.def}{2024-03-14}{}
+ {l3backend-dvisvgm.def}{2024-05-08}{}
{L3 backend support: dvisvgm}
%</dvisvgm>
%<*luatex>
- {l3backend-luatex.def}{2024-03-14}{}
+ {l3backend-luatex.def}{2024-05-08}{}
{L3 backend support: PDF output (LuaTeX)}
%</luatex>
%<*pdftex>
- {l3backend-pdftex.def}{2024-03-14}{}
+ {l3backend-pdftex.def}{2024-05-08}{}
{L3 backend support: PDF output (pdfTeX)}
%</pdftex>
%<*xetex>
- {l3backend-xetex.def}{2024-03-14}{}
+ {l3backend-xetex.def}{2024-05-08}{}
{L3 backend support: XeTeX}
%</xetex>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3backend/l3backend-box.dtx b/macros/latex/required/l3backend/l3backend-box.dtx
index 3fc3243c42..8bfd0e1494 100644
--- a/macros/latex/contrib/l3backend/l3backend-box.dtx
+++ b/macros/latex/required/l3backend/l3backend-box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-code.pdf b/macros/latex/required/l3backend/l3backend-code.pdf
index 9affc7d856..b53361f166 100644
--- a/macros/latex/contrib/l3backend/l3backend-code.pdf
+++ b/macros/latex/required/l3backend/l3backend-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3backend/l3backend-code.tex b/macros/latex/required/l3backend/l3backend-code.tex
index df0dd0ea8c..df0dd0ea8c 100644
--- a/macros/latex/contrib/l3backend/l3backend-code.tex
+++ b/macros/latex/required/l3backend/l3backend-code.tex
diff --git a/macros/latex/contrib/l3backend/l3backend-color.dtx b/macros/latex/required/l3backend/l3backend-color.dtx
index eaa89add8c..1dae4b5ce9 100644
--- a/macros/latex/contrib/l3backend/l3backend-color.dtx
+++ b/macros/latex/required/l3backend/l3backend-color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -920,7 +920,7 @@
% Here, \texttt{dvipdfmx}/\XeTeX{} we write direct PDF specials for the fill,
% and only use the stack for the stroke color (see above for comments on why
% we cannot use multiple stacks with these backends). \LuaTeX{} and \pdfTeX{}
-% have mutiple stacks that can deal with fill and stroke. For \texttt{dvips}
+% have multiple stacks that can deal with fill and stroke. 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.
%
@@ -1138,8 +1138,7 @@
% \@@_backend_fill_rgb:n ,
% \@@_backend_fill:n
% }
-% Fill color here is the same as general color \emph{except} we skip the
-% stroke part.
+% Fill color here is the same as general color.
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_fill_cmyk:n #1
{ \@@_backend_fill:n { cmyk ~ #1 } }
@@ -1155,27 +1154,19 @@
% \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).
+% For drawings in SVG, we use scopes for all stroke colors. The backend
+% provides the necessary conversion for CMYK but only if that is set as
+% the main color: a little bit of gymnastics as a result.
% \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
{
- \use:e
- {
- \@@_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 ) ) } }
- }
+ \@@_backend_fill_cmyk:n {#1}
+ \__kernel_backend_scope:n { stroke = "{?color}" }
+ \@@_backend_reset:
}
\cs_new_protected:Npn \@@_backend_stroke_gray:n #1
{
@@ -1221,7 +1212,6 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \begin{macro}
% {
diff --git a/macros/latex/contrib/l3backend/l3backend-draw.dtx b/macros/latex/required/l3backend/l3backend-draw.dtx
index eef86886f5..02d84ed656 100644
--- a/macros/latex/contrib/l3backend/l3backend-draw.dtx
+++ b/macros/latex/required/l3backend/l3backend-draw.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -776,7 +776,7 @@
% \end{macro}
%
% \begin{macro}{\@@_backend_begin:, \@@_backend_end:}
-% A drawing needs to be set up such that the co-ordinate system is
+% A drawing needs to be set up such that the coordinate system is
% translated. That is done inside a scope, which as described below
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_begin:
diff --git a/macros/latex/contrib/l3backend/l3backend-graphics.dtx b/macros/latex/required/l3backend/l3backend-graphics.dtx
index 9360bffd2e..f487a323c1 100644
--- a/macros/latex/contrib/l3backend/l3backend-graphics.dtx
+++ b/macros/latex/required/l3backend/l3backend-graphics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-header.dtx b/macros/latex/required/l3backend/l3backend-header.dtx
index 84f8ab53b7..4eb70cc536 100644
--- a/macros/latex/contrib/l3backend/l3backend-header.dtx
+++ b/macros/latex/required/l3backend/l3backend-header.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -184,7 +184,7 @@ false setglobal
% For finding the anchor point of a destination link. We make the use case
% a separate function as it comes up a lot, and as this makes it easier to
% adjust if we need additional effects. We also need a more complex approach
-% to convert a co-ordinate pair correctly when defining a rectangle: this
+% to convert a coordinate pair correctly when defining a rectangle: this
% can otherwise be out when using a landscape page. (Thanks to Alexander
% Grahn for the approach here.)
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3backend/l3backend-opacity.dtx b/macros/latex/required/l3backend/l3backend-opacity.dtx
index a5828bfd90..1798146eec 100644
--- a/macros/latex/contrib/l3backend/l3backend-opacity.dtx
+++ b/macros/latex/required/l3backend/l3backend-opacity.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-pdf.dtx b/macros/latex/required/l3backend/l3backend-pdf.dtx
index 0a16a79f9e..31ad60b7b6 100644
--- a/macros/latex/contrib/l3backend/l3backend-pdf.dtx
+++ b/macros/latex/required/l3backend/l3backend-pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -113,25 +113,13 @@
%
% \subsubsection{Objects}
%
-% \begin{variable}{\g_@@_backend_object_int}
-% For tracking objects.
+% \begin{macro}{\@@_backend_object_new:}
+% \begin{macro}[EXP]{\@@_backend_object_ref:n, \@@_backend_object_id:n}
% \begin{macrocode}
-\int_new:N \g_@@_backend_object_int
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\@@_backend_object_new:n}
-% \begin{macro}[EXP]{\@@_backend_object_ref:n}
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_object_new:n #1
- {
- \int_gincr:N \g_@@_backend_object_int
- \int_const:cn
- { c_@@_object_ \tl_to_str:n {#1} _int }
- { \g_@@_backend_object_int }
- }
-\cs_new:Npn \@@_backend_object_ref:n #1
- { { pdf.obj \int_use:c { c_@@_object_ \tl_to_str:n {#1} _int } } }
+\cs_new_protected:Npn \@@_backend_object_new:
+ { \int_gincr:N \g_@@_backend_object_int }
+\cs_new:Npn \@@_backend_object_ref:n #1 { { pdf.obj #1 } }
+\cs_new_eq:NN \@@_backend_object_id:n \@@_backend_object_ref:n
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -278,7 +266,7 @@
%
% \begin{macro}{\@@_backend_annotation:nnnn}
% Annotations are objects, but we track them separately. Notably, they are
-% not in the object data lists. Here, to get the co-ordinates of the
+% not in the object data lists. Here, to get the coordinates of the
% annotation, we need to have the data collected at the PostScript level.
% That requires a bit of box trickery (effectively a \LaTeXe{} |picture|
% of zero size). Once the data is collected, use it to set up the annotation
@@ -388,7 +376,7 @@
% \begin{macro}{\@@_backend_link_minima:}
% \begin{macro}{\@@_backend_link_outerbox:n}
% \begin{macro}{\@@_backend_link_sf_save:, \@@_backend_link_sf_restore:}
-% Links are crated like annotations but with dedicated code to allow for
+% Links are created like annotations but with dedicated code to allow for
% adjusting the size of the rectangle. In contrast to \pkg{hyperref}, we
% grab the link content as a box which can then unbox: this allows the same
% interface as for \pdfTeX{}.
@@ -958,12 +946,12 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_backend_object_new:n}
-% \begin{macro}[EXP]{\@@_backend_object_ref:n}
+% \begin{macro}{\@@_backend_object_new:}
+% \begin{macro}[EXP]{\@@_backend_object_ref:n, \@@_backend_object_id:n}
% Declaring objects means reserving at the PDF level plus starting
% tracking.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_object_new:n #1
+\cs_new_protected:Npn \@@_backend_object_new:
{
%<*luatex>
\tex_pdfextension:D obj ~
@@ -972,17 +960,16 @@
\tex_pdfobj:D
%</pdftex>
reserveobjnum ~
- \int_const:cn
- { c_@@_object_ \tl_to_str:n {#1} _int }
+ \int_gset:Nn \g_@@_backend_object_int
%<*luatex>
- { \tex_pdffeedback:D lastobj }
+ { \tex_pdffeedback:D lastobj }
%</luatex>
%<*pdftex>
- { \tex_pdflastobj:D }
+ { \tex_pdflastobj:D }
%</pdftex>
}
-\cs_new:Npn \@@_backend_object_ref:n #1
- { \int_use:c { c_@@_object_ \tl_to_str:n {#1} _int } ~ 0 ~ R }
+\cs_new:Npn \@@_backend_object_ref:n #1 { #1 ~ 0 ~ R }
+\cs_new:Npn \@@_backend_object_id:n #1 {#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1001,28 +988,26 @@
%<*pdftex>
\tex_immediate:D \tex_pdfobj:D
%</pdftex>
- useobjnum ~
- \int_use:c
- { c_@@_object_ \tl_to_str:n {#1} _int }
- \@@_backend_object_write:nn {#2} {#3}
+ useobjnum ~ #1
+ \@@_backend_object_write:nn {#2} {#3}
}
\cs_new:Npn \@@_backend_object_write:nn #1#2
{
- \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 }
- }
- }
+ \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 }
+ }
+ }
}
\cs_generate_variant:Nn \@@_backend_object_write:nnn { nne }
\cs_new:Npn \@@_exp_not_i:nn #1#2 { \exp_not:n {#1} }
@@ -1235,28 +1220,22 @@
%
% \subsubsection{Objects}
%
-% \begin{variable}{\g_@@_backend_object_int, \g_@@_backend_object_prop}
+% \begin{variable}{\g_@@_backend_object_prop}
% For tracking objects to allow finalisation.
% \begin{macrocode}
-\int_new:N \g_@@_backend_object_int
\prop_new:N \g_@@_backend_object_prop
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_backend_object_new:n}
-% \begin{macro}[EXP]{\@@_backend_object_ref:n}
+% \begin{macro}{\@@_backend_object_new:}
+% \begin{macro}[EXP]{\@@_backend_object_ref:n, \@@_backend_object_id:n}
% Objects are tracked at the macro level, but we don't have to do anything
% at this stage.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_object_new:n #1
- {
- \int_gincr:N \g_@@_backend_object_int
- \int_const:cn
- { c_@@_object_ \tl_to_str:n {#1} _int }
- { \g_@@_backend_object_int }
- }
-\cs_new:Npn \@@_backend_object_ref:n #1
- { @pdf.obj \int_use:c { c_@@_object_ \tl_to_str:n {#1} _int } }
+\cs_new_protected:Npn \@@_backend_object_new:
+ { \int_gincr:N \g_@@_backend_object_int }
+\cs_new:Npn \@@_backend_object_ref:n #1 { @pdf.obj #1 }
+\cs_new_eq:NN \@@_backend_object_id:n \@@_backend_object_ref:n
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1627,16 +1606,17 @@
%
% \subsubsection{Objects}
%
-% \begin{macro}{\@@_backend_object_new:n}
-% \begin{macro}[EXP]{\@@_backend_object_ref:n}
+% \begin{macro}{\@@_backend_object_new:}
+% \begin{macro}[EXP]{\@@_backend_object_ref:n, \@@_backend_object_id:n}
% \begin{macro}{\@@_backend_object_write:nnn, \@@_backend_object_write:ne}
% \begin{macro}{\@@_backend_object_now:nn, , \@@_backend_object_now:ne}
% \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 { }
+\cs_new_protected:Npn \@@_backend_object_new: { }
\cs_new:Npn \@@_backend_object_ref:n #1 { }
+\cs_new:Npn \@@_backend_object_id:n #1 { }
\cs_new_protected:Npn \@@_backend_object_write:nnn #1#2#3 { }
\cs_new_protected:Npn \@@_backend_object_write:nne #1#2#3 { }
\cs_new_protected:Npn \@@_backend_object_now:nn #1#2 { }
diff --git a/macros/latex/contrib/l3backend/l3backend.ins b/macros/latex/required/l3backend/l3backend.ins
index e24c41d236..e24c41d236 100644
--- a/macros/latex/contrib/l3backend/l3backend.ins
+++ b/macros/latex/required/l3backend/l3backend.ins
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/required/l3kernel/CHANGELOG.md
index 9c8c4d506c..82eb45806a 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/required/l3kernel/CHANGELOG.md
@@ -7,6 +7,39 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2024-05-08]
+
+### Added
+- Full set of variants for `\prop_(g)put_if_not_in:Nnn`
+- `keys_set_groups:nnn(n)N` to match `keys_set_exclude_groups:nnn(n)N`
+
+### Fixed
+- Implementation of deprecated `\pdf_object_write:nn`
+
+## [2024-04-11]
+
+### Added
+- `\prop_(g)put_if_not_in:Nnn` (renamed from `\prop_(g)put_if_new:Nnn`)
+- `\intarray_if_exist:N(TF)`
+- `\fparray_if_exist:N(TF)`
+- Support for 'indexed' PDF objects
+
+### Changed
+- Expand object names in `\pdf_object_...` functions (issue \#1521)
+- Adapt `l3doc` for `ltcmd` change to handling of newlines
+ (see latex3/latex2e\#1304)
+- Return active spaces from `\sys_get_query:n(nn)N` (issue \#1529)
+
+### Fixed
+- False `debug` error raised by `\cctab_const:Nn` (issue \#1508)
+- Undefined `\__kernel_iwo_open:Nn` used in `\iow_shell_open:Nn`
+ (issue \#1515)
+- Naming of register functions in LuaMetaTeX 2.11+ (issue \#1518)
+- Catcode applied to letters by `\sys_get_query:n(nn)N`
+
+### Deprecated
+- `\prop_(g)put_if_new:Nnn` (renamed to `\prop_(g)put_if_not_in:Nnn`)
+
## [2024-03-14]
### Added
@@ -20,6 +53,7 @@ this project uses date-based 'snapshot' version identifiers.
### Fixed
- Typeset `TF` of internal conditionals in current color (issue \#730)
- Some functions and variables were defined locally
+
## [2024-02-20]
### Changed
@@ -853,7 +887,7 @@ this project uses date-based 'snapshot' version identifiers.
improve target placement, solve pdfTeX and makeindex warnings
### Fixed
-- Evalutate integer constants only once (issue [\#861](https://github.com/latex3/latex3/issues/861))
+- Evaluate integer constants only once (issue [\#861](https://github.com/latex3/latex3/issues/861))
- Detect `\ior_map_inline:Nn` calls on undefined streams (issue [\#194](https://github.com/latex3/latex3/issues/194))
### Deprecated
@@ -1700,7 +1734,9 @@ this project uses date-based 'snapshot' version identifiers.
- Step functions have been added for dim variables,
e.g. `\dim_step_inline:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2024-03-14...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2024-05-08...HEAD
+[2024-05-08]: https://github.com/latex3/latex3/compare/2024-04-11...2024-05-08
+[2024-04-11]: https://github.com/latex3/latex3/compare/2024-03-14...2024-04-11
[2024-03-14]: https://github.com/latex3/latex3/compare/2024-02-20...2024-03-14
[2024-02-20]: https://github.com/latex3/latex3/compare/2024-02-18...2024-02-20
[2024-02-18]: https://github.com/latex3/latex3/compare/2024-02-13...2024-02-18
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/required/l3kernel/README.md
index 8ef94a41ac..0928ea46ce 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/required/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2024-03-14
+Release 2024-05-08
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/required/l3kernel/expl3.dtx
index 76ef8ec919..f4129aeb02 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/required/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2024-03-14}%
+\def\ExplFileDate{2024-05-08}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -1287,7 +1287,7 @@
% 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
+% slightly older kernel, so we fire the incompatibility error message and
% abort loading.
% \begin{macrocode}
\ifodd\csname\detokenize{l__kernel_expl_bool}\endcsname
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/required/l3kernel/expl3.pdf
index b36343153a..dd4f07af68 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/required/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/required/l3kernel/interface3.pdf
index 1df60adf1a..309d9c92a7 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/required/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/required/l3kernel/interface3.tex
index ff8114028e..613eb673b0 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/required/l3kernel/interface3.tex
@@ -58,7 +58,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2024-03-14}
+\date{Released 2024-05-08}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3.ins b/macros/latex/required/l3kernel/l3.ins
index 2940230505..bf7a75381d 100644
--- a/macros/latex/contrib/l3kernel/l3.ins
+++ b/macros/latex/required/l3kernel/l3.ins
@@ -105,7 +105,7 @@ and all files in that bundle must be distributed together.
\from{l3regex.dtx} {package}
\from{l3box.dtx} {package}
\from{l3color.dtx} {package}
- \from{l3pdf.dtx} {package}
+ \from{l3pdf.dtx} {package,tex}
\from{l3coffins.dtx} {package}
\from{l3luatex.dtx} {package,tex}
\from{l3unicode.dtx} {package}
@@ -176,6 +176,7 @@ and all files in that bundle must be distributed together.
\from{l3sys.dtx}{package,lua}
\from{l3token.dtx}{package,lua}
\from{l3intarray.dtx}{package,lua}
+ \from{l3pdf.dtx}{package,lua}
}}
\endbatchfile
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/required/l3kernel/l3basics.dtx
index 66e999fe62..4c00ec0032 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/required/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -1340,8 +1340,9 @@
% only locally/globally assigned;
% \item \texttt{check-expressions} that checks integer, dimension,
% skip, and muskip expressions are not terminated prematurely;
-% \item \texttt{deprecation} that makes soon-to-be-deprecated commands produce errors;
-% \item \texttt{log-functions} that logs function definitions;
+% \item \texttt{deprecation} that makes deprecated commands produce errors;
+% \item \texttt{log-functions} that logs function definitions and
+% variable declarations;
% \item \texttt{all} that does all of the above.
% \end{itemize}
% Providing these as switches rather than options allows testing code
@@ -1355,10 +1356,10 @@
% \cs{debug_suspend:} \ldots{} \cs{debug_resume:}
% \end{syntax}
% Suppress (locally) errors and logging from \texttt{debug} commands,
-% except for the \texttt{deprecation} errors or warnings. These pairs
+% except for the \texttt{deprecation} errors. These pairs
% of commands can be nested. This can be used around pieces of code
% that are known to fail checks, if such failures should be ignored.
-% See for instance \pkg{l3coffins}.
+% See for instance \pkg{l3cctab} and \pkg{l3coffins}.
% \end{function}
%
% \end{documentation}
@@ -1871,9 +1872,8 @@
%
% \begin{macro}{\__kernel_deprecation_code:nn}
% \begin{variable}{\g_@@_deprecation_on_tl, \g_@@_deprecation_off_tl}
-% Some commands were more recently deprecated and not yet removed;
-% only make these into errors if the user requests it. This relies on
-% two token lists, filled up in \pkg{l3deprecation}.
+% Make deprecated commands throw errors if the user requests it.
+% This relies on two token lists, filled up in \pkg{l3deprecation}.
% \begin{macrocode}
\cs_gset_nopar:Npn \g_@@_deprecation_on_tl { }
\cs_gset_nopar:Npn \g_@@_deprecation_off_tl { }
diff --git a/macros/latex/contrib/l3kernel/l3bitset.dtx b/macros/latex/required/l3kernel/l3bitset.dtx
index 3100c28463..22cf7dc1f7 100644
--- a/macros/latex/contrib/l3kernel/l3bitset.dtx
+++ b/macros/latex/required/l3kernel/l3bitset.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/required/l3kernel/l3bootstrap.dtx
index 5ff0c2e68d..e17c056909 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/required/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/required/l3kernel/l3box.dtx
index 08463db56d..5d5aa54027 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/required/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -928,8 +928,8 @@
% \cs{box_set_viewport:Nnnnn} \meta{box} \Arg{llx} \Arg{lly} \Arg{urx} \Arg{ury}
% \end{syntax}
% Adjusts the bounding box of the \meta{box} such that it has lower-left
-% co-ordinates (\meta{llx}, \meta{lly}) and upper-right co-ordinates
-% (\meta{urx}, \meta{ury}). All four co-ordinate positions are
+% coordinates (\meta{llx}, \meta{lly}) and upper-right coordinates
+% (\meta{urx}, \meta{ury}). All four coordinate positions are
% \meta{dim exprs}. Material outside of the bounding box is
% still displayed in the output unless \cs{box_set_clipped:N} is
% subsequently applied.
@@ -1846,7 +1846,7 @@
% \put(40,49){E}
% \put(21,59){O}
% \end{picture}
-% \caption{Co-ordinates of a box prior to rotation.}
+% \caption{Coordinates of a box prior to rotation.}
% \label{fig:l3box:rotation}
% \end{figure}
% The formulae are, for a point $P$ and angle $\alpha$:
@@ -2066,7 +2066,7 @@
}
% \end{macrocode}
% With at least one real scaling to do, the next phase is to find the new
-% edge co-ordinates. In the $x$~direction this is relatively easy: just
+% edge coordinates. In the $x$~direction this is relatively easy: just
% scale the right edge. In the $y$~direction, both dimensions have to be
% scaled, and this again needs the absolute scale value.
% Once that is all done, the common resize/rescale code can be employed.
diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/required/l3kernel/l3cctab.dtx
index 5cdaa3dc92..a8c5232b3e 100644
--- a/macros/latex/contrib/l3kernel/l3cctab.dtx
+++ b/macros/latex/required/l3kernel/l3cctab.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -286,15 +286,23 @@
% \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
+% \IniTeX{} codes. The \cs{debug_suspend:} and \cs{debug_resume:}
+% functions prevent errors and logging from \texttt{debug} commands
+% which are either duplicate or false when \cs{@@_new:N} is used
+% by \cs{cctab_new:N} or \cs{cctab_const:Nn}.
+% 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 } }
+ {
+ \debug_suspend:
+ \intarray_new:Nn #1 { 257 }
+ \debug_resume:
+ }
\cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
- { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} }
+ { \intarray_gset:Nnn #1 { #2 + 1 } {#3} }
\cs_new_protected:Npn \cctab_new:N #1
{
\__kernel_chk_if_free_cs:N #1
@@ -796,13 +804,22 @@
% \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.
+% Creates a new \meta{cctab~var} then sets it with the \IniTeX{} and
+% user-supplied codes. To avoid false \texttt{debug} errors, we write
+% out implementation of \cs{cctab_new:N} and \cs{cctab_gset:Nn}
+% instead of directly using them here. The initialization part in
+% \cs{cctab_new:N} in non-\LuaTeX{} is omitted as it's covered by
+% the \IniTeX{} settings.
% \begin{macrocode}
\cs_new_protected:Npn \cctab_const:Nn #1#2
{
- \cctab_new:N #1
- \cctab_gset:Nn #1 {#2}
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new:N #1
+ \group_begin:
+ \cctab_select:N \c_initex_cctab
+ #2 \scan_stop:
+ \@@_gset:n {#1}
+ \group_end:
}
\cs_generate_variant:Nn \cctab_const:Nn { c }
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/required/l3kernel/l3clist.dtx
index ad65a4b174..ebbfa29ddc 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/required/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/required/l3kernel/l3coffins.dtx
index ad41224aa0..76bbc78d99 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/required/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -375,7 +375,7 @@
% poles of the coffin.
%
% Notice that the poles of a coffin are defined by four values:
-% the $x$ and $y$ co-ordinates of a point that the pole
+% the $x$ and $y$ coordinates of a point that the pole
% passes through and the $x$- and $y$-components of a
% vector denoting the direction of the pole. It is the ratio between
% the later, rather than the absolute values, which determines the
@@ -897,7 +897,7 @@
% Special coffins: these cannot be set up earlier as they need
% \cs{coffin_new:N}. The empty coffin is set as a box as the full
% coffin-setting system needs some material which is not yet available.
-% The empty coffin is creted entirely by hand: not everything is in place
+% The empty coffin is created entirely by hand: not everything is in place
% yet.
% \begin{macrocode}
\coffin_new:N \c_empty_coffin
@@ -1197,7 +1197,7 @@
% ($a$, $b$, $c$, $d$) and
% ($a'$, $b'$, $c'$, $d'$). These are arguments
% $1$--$4$ and $5$--$8$, respectively. In both
-% cases $a$ and $b$ are the co-ordinates of a point on the
+% cases $a$ and $b$ are the coordinates of a point on the
% pole and $c$ and $d$ define the direction of the pole. Finding
% the intersection depends on the directions of the poles, which are
% given by $d / c$ and $d' / c'$. However, if one of the poles
@@ -1541,7 +1541,7 @@
% \end{macro}
%
% \begin{macro}{\@@_rotate_pole:Nnnnnn}
-% Rotating a single pole simply means shifting the co-ordinate of
+% Rotating a single pole simply means shifting the coordinate of
% the pole and its direction. The rotation here is about the bottom-left
% corner of the coffin.
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3color.dtx b/macros/latex/required/l3kernel/l3color.dtx
index 514ff326a4..f9383d0404 100644
--- a/macros/latex/contrib/l3kernel/l3color.dtx
+++ b/macros/latex/required/l3kernel/l3color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/required/l3kernel/l3debug.dtx
index 6654b6d4cd..7fb64a8c13 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/required/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -69,7 +69,7 @@
%
% Standard file identification.
% \begin{macrocode}
-\ProvidesExplFile{l3debug.def}{2024-03-14}{}{L3 Debugging support}
+\ProvidesExplFile{l3debug.def}{2024-05-08}{}{L3 Debugging support}
% \end{macrocode}
%
% \begin{variable}{\s_@@_stop}
@@ -389,10 +389,9 @@
% \end{macro}
%
% \begin{macro}{\@@_deprecation_on:, \@@_deprecation_off:}
-% Some commands were more recently deprecated and not yet removed;
-% only make these into errors if the user requests it. This relies on
-% two token lists, filled up in \pkg{l3deprecation} by calls to
-% \cs{__kernel_deprecation_code:nn}.
+% Make deprecated commands throw errors if the user requests it.
+% This relies on two token lists, filled up in \pkg{l3deprecation} by
+% calls to \cs{__kernel_deprecation_code:nn}.
% \begin{macrocode}
\cs_new_protected:Npn \@@_deprecation_on:
{ \g_@@_deprecation_on_tl }
@@ -781,7 +780,7 @@
\prop_pop:NnNF
\prop_pop:NnNTF
\prop_put:Nnn
- \prop_put_if_new:Nnn
+ \prop_put_if_not_in:Nnn
\prop_put_from_keyval:Nn
\prop_remove:Nn
\prop_set_eq:NN
@@ -862,7 +861,7 @@
\prop_gpop:NnNF
\prop_gpop:NnNTF
\prop_gput:Nnn
- \prop_gput_if_new:Nnn
+ \prop_gput_if_not_in:Nnn
\prop_gput_from_keyval:Nn
\prop_gremove:Nn
\prop_gset_eq:NN
@@ -1153,7 +1152,7 @@
% \end{macrocode}
%
% The functions here can get a bit repetitive, so we define a helper
-% which can re-use the same patch code repeatedly. The main part of the
+% which can reuse the same patch code repeatedly. The main part of the
% patch is the same, so we just have to deal with the part which varies
% depending on the type of expression.
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/required/l3kernel/l3deprecation.dtx
index 3906c6786e..d947bb4599 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/required/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -51,8 +51,10 @@
%
% \section{\pkg{l3deprecation} documentation}
%
-% A few commands have had to be deprecated over the years. This module
-% defines deprecated and deleted commands to produce an error.
+% A few commands have had to be deprecated over the years.
+% All commands deprecated before release 2022-01-12 were already
+% removed; commands deprecated since then will no longer be removed.
+% Instead, this module defines them to produce errors.
%
% \end{documentation}
%
@@ -74,31 +76,12 @@
% \cs{__kernel_patch_deprecation:nnNNpn} \Arg{date} \Arg{replacement}
% \meta{definition} \meta{function} \meta{parameters} \Arg{code}
% \end{quote}
-% defines the \meta{function} to produce a warning and run its
-% \meta{code}, or to produce an error and not run any \meta{code},
-% depending on the \pkg{expl3} date.
-% \begin{itemize}
-% \item If the \pkg{expl3} date is less than the \meta{date} (plus
-% $6$~months in case \texttt{undo-recent-deprecations} is used) then
-% we define the \meta{function} to produce a warning and run its code.
-% The warning is actually suppressed in two cases:
-% \begin{itemize}
-% \item if neither \texttt{undo-recent-deprecations} nor
-% \texttt{enable-debug} are in effect we may be in an end-user's
-% document so it is suppressed;
-% \item if the command is expandable then we cannot produce a warning.
-% \end{itemize}
-% \item Otherwise, we define the \meta{function} to produce an error.
-% \end{itemize}
-% In both cases we additionally make \cs{debug_on:n} |{deprecation}|
-% turn the \meta{function} into an \tn{outer} error, and
-% \cs{debug_off:n} |{deprecation}| restore whatever the behaviour was
-% without \cs{debug_on:n} |{deprecation}|.
-%
-% In later sections we use the \pkg{l3doc} key \texttt{deprecated} with
-% a date equal to that \meta{date} plus $6$~months, so that \pkg{l3doc}
-% will complain if we forget to remove the stale \meta{parameters} and
-% \Arg{code}.
+% defines the \meta{function} to produce an error and run its
+% \meta{code}.
+%
+% We make \cs{debug_on:n} |{deprecation}| turn the \meta{function} into
+% an \tn{outer} error, and \cs{debug_off:n} |{deprecation}| restore
+% whatever the behaviour was without \cs{debug_on:n} |{deprecation}|.
%
% In the explanations below, \meta{definition} \meta{function}
% \meta{parameters} \Arg{code} or assignments that only differ in the
@@ -183,8 +166,7 @@
%
% \begin{macro}{\__kernel_deprecation_error:Nnn}
% The \tn{outer} definition here ensures the command cannot appear
-% in an argument. Use this auxiliary on all commands that have been
-% removed since 2015.
+% in an argument.
% \begin{macrocode}
\cs_new_protected:Npn \__kernel_deprecation_error:Nnn #1#2#3
{
@@ -348,13 +330,14 @@
\cs_new_protected:Npn \pdf_object_new:nn #1#2
{
\prop_gput:Nnn \g_@@_object_prop {#1} {#2}
- \@@_backend_object_new:n {#1}
+ \pdf_object_new:n {#1}
}
\__kernel_patch_deprecation:nnNNpn { 2022-08-30 } { [\pdf_object_write:n] }
\cs_new_protected:Npn \pdf_object_write:nn #1#2
{
- \exp_args:Nne \@@_backend_object_write:nnn
- {#1} { \prop_item:Nn \g_@@_object_prop {#1} } {#2}
+ \exp_args:Nee \@@_backend_object_write:nnn
+ { \@@_object_retrieve:n {#1} }
+ { \prop_item:Nn \g_@@_object_prop {#1} } {#2}
\bool_gset_true:N \g_@@_init_bool
}
\cs_generate_variant:Nn \pdf_object_write:nn { nx }
@@ -679,6 +662,27 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Deprecated \pkg{l3prop} functions}
+%
+% \begin{macro}[deprecated]
+% {
+% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV,
+% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV,
+% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV,
+% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV
+% }
+% \begin{macrocode}
+%\__kernel_patch_deprecation:nnNNpn { 2024-03-30 } { \prop_put_if_not_in:Nnn }
+\cs_new_protected:Npn \prop_put_if_new:Nnn { \prop_put_if_not_in:Nnn }
+%\__kernel_patch_deprecation:nnNNpn { 2024-03-30 } { \prop_gput_if_not_in:Nnn }
+\cs_new_protected:Npn \prop_gput_if_new:Nnn { \prop_gput_if_not_in:Nnn }
+\cs_generate_variant:Nn \prop_put_if_new:Nnn
+ { NnV , NV , c , cnV , cV }
+\cs_generate_variant:Nn \prop_gput_if_new:Nnn
+ { NnV , NV , c , cnV , cV }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/required/l3kernel/l3doc.dtx
index a48a24df23..24efea50c7 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/required/l3kernel/l3doc.dtx
@@ -71,7 +71,7 @@ and all files in that bundle must be distributed together.
% This isn't included in the typeset documentation because it's a bit
% ugly:
%<*class>
-\ProvidesExplClass{l3doc}{2024-03-14}{}
+\ProvidesExplClass{l3doc}{2024-05-08}{}
{L3 Experimental documentation class}
%</class>
% \fi
@@ -84,7 +84,7 @@ and all files in that bundle must be distributed together.
% require you to do updates, if the class changes.}}
%
% \author{\Team}
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
% \maketitle
% \tableofcontents
%
@@ -365,7 +365,7 @@ and all files in that bundle must be distributed together.
% \begin{syntax}
% \cs{tn} \oarg{options} \marg{csname}
% \end{syntax}
-% Analoguous to \cs{cs} but intended for \enquote{traditional} \TeX{}
+% Analogous to \cs{cs} but intended for \enquote{traditional} \TeX{}
% or \LaTeXe{} commands; they are indexed accordingly. This is in
% fact equivalent to \cs{cs} |[module=TeX, replace=false,|
% \meta{options}|]| \Arg{csname}.
@@ -2181,6 +2181,8 @@ and all files in that bundle must be distributed together.
{
\tl_remove_all:Ne \l_@@_tmpa_tl
{ \iow_char:N \^^M \c_percent_str }
+ \tl_remove_all:Ne \l_@@_tmpa_tl
+ { \token_to_str:N \obeyedline \c_space_tl \c_percent_str }
\tl_remove_all:Ne \l_@@_tmpa_tl { \tl_to_str:n { ^ ^ A } }
\tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^I }
\tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^M }
@@ -3318,7 +3320,7 @@ and all files in that bundle must be distributed together.
% we can check now whether the macro is tested. If the \env{macro}
% environment which is being ended is the outermost one, then wrap
% each macro in \tn{texttt} (with the addition of |TF| if relevant)
-% and typeset two informations: that this ends the definition of some
+% and typeset two pieces of information: that this ends the definition of some
% macros, and that they are documented on some page.
% \begin{macrocode}
\cs_new_protected:Npn \@@_macro_end:
@@ -4496,7 +4498,7 @@ and all files in that bundle must be distributed together.
%
% \begin{macro}{\@@_key_trim_module:n, \@@_key_drop_underscores:}
% Helper that removes from \cs{l_@@_index_module_tl} everything after
-% the first occurence of |#1|. Helper that removes any leading
+% the first occurrence of |#1|. Helper that removes any leading
% underscore from \cs{l_@@_index_key_tl}.
% \begin{macrocode}
\cs_new_protected:Npn \@@_key_trim_module:n #1
diff --git a/macros/latex/contrib/l3kernel/l3doc.pdf b/macros/latex/required/l3kernel/l3doc.pdf
index 2f85329fdc..9a856d8aed 100644
--- a/macros/latex/contrib/l3kernel/l3doc.pdf
+++ b/macros/latex/required/l3kernel/l3doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/required/l3kernel/l3docstrip.dtx
index c973d593c5..a3b62db0af 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/required/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/required/l3kernel/l3docstrip.pdf
index f2e611b2c9..d2fe34a02b 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/required/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/required/l3kernel/l3expan.dtx
index 7e507b7598..7b859acaa5 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/required/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -135,7 +135,7 @@
% then used to define variants of the
% \meta{original argument specifier} if these are not already
% defined; entries which correspond to existing functions are silently
-% ingored. For each \meta{variant} given, a function is created
+% ignored. For each \meta{variant} given, a function is created
% that expands its arguments as detailed and passes them
% to the \meta{parent control sequence}. So for example
% \begin{verbatim}
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/required/l3kernel/l3file.dtx
index 3a4d1c06dc..ba460e3fee 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/required/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -107,7 +107,7 @@
% control sequence for file access. If the \meta{stream} was already
% open it is closed before the new operation begins. The
% \meta{stream} is available for access immediately and will remain
-% allocated to \meta{file name} until a \cs{ior_close:N} instruction
+% allocated to \meta{file name} until an \cs{ior_close:N} instruction
% is given or the \TeX{} run ends.
% If the file is not found, an error is raised.
% \end{function}
@@ -167,7 +167,7 @@
% control sequence for access. If the \meta{stream} was already
% open it is closed before the new operation begins. The
% \meta{stream} is available for access immediately and will remain
-% allocated to \meta{shell command} until a \cs{iow_close:N} instruction
+% allocated to \meta{shell command} until an \cs{iow_close:N} instruction
% is given or the \TeX{} run ends.
% If piped system calls are disabled an error is raised.
%
@@ -429,7 +429,7 @@
%
% \begin{function}[added = 2019-03-23]{\ior_get_term:nN, \ior_str_get_term:nN}
% \begin{syntax}
-% \cs{ior_get_term:nN} \meta{prompt} \meta{token list variable}
+% \cs{ior_get_term:nN} \Arg{prompt} \meta{token list variable}
% \end{syntax}
% Function that reads one or more lines (until an equal number of left
% and right braces are found) from the terminal and stores
@@ -673,7 +673,7 @@
% \end{texnote}
% \end{function}
%
-% \section{File opertions}
+% \section{File operations}
%
% \subsection{Basic file operations}
%
@@ -1679,6 +1679,7 @@
% \end{variable}
%
% \begin{macro}{\iow_open:Nn, \iow_open:NV, \iow_open:cn, \iow_open:cV}
+% \begin{macro}{\__kernel_iow_open:Nn, \__kernel_iow_open:No}
% \begin{macro}{\@@_open_stream:Nn, \@@_open_stream:NV}
% The same idea as for reading, but without the path and without the need
% to allow for a conditional version.
@@ -1687,16 +1688,21 @@
{
\__kernel_tl_set:Nx \l_@@_file_name_tl
{ \__kernel_file_name_sanitize:n {#2} }
+ \__kernel_iow_open:No #1 \l_@@_file_name_tl
+ }
+\cs_generate_variant:Nn \iow_open:Nn { NV , c , cV }
+\cs_new_protected:Npn \__kernel_iow_open:Nn #1#2
+ {
\iow_close:N #1
\seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
- { \@@_open_stream:NV #1 \l_@@_file_name_tl }
+ { \@@_open_stream:Nn #1 {#2} }
{
\@@_new:N #1
\__kernel_tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
- \@@_open_stream:NV #1 \l_@@_file_name_tl
+ \@@_open_stream:Nn #1 {#2}
}
}
-\cs_generate_variant:Nn \iow_open:Nn { NV , c , cV }
+\cs_generate_variant:Nn \__kernel_iow_open:Nn { No }
\cs_new_protected:Npn \@@_open_stream:Nn #1#2
{
\tex_global:D \tex_chardef:D #1 = \l_@@_stream_tl \scan_stop:
@@ -1708,6 +1714,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\iow_shell_open:Nn}
% \begin{macro}{\@@_shell_open:nN, \@@_shell_open:oN}
@@ -3811,7 +3818,7 @@
%
% 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
+% then compared with the argument requested date (usually 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}
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/required/l3kernel/l3flag.dtx
index 40614c7348..bf7776f449 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/required/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/required/l3kernel/l3fp-assign.dtx
index 6d00047e4d..9ef1944a99 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/required/l3kernel/l3fp-assign.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/required/l3kernel/l3fp-aux.dtx
index 1f4ea5d34d..f788b85df9 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/required/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/required/l3kernel/l3fp-basics.dtx
index a7401407cd..83c9cc87fa 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/required/l3kernel/l3fp-basics.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/required/l3kernel/l3fp-convert.dtx
index 0459331326..e42fb383fe 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/required/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/required/l3kernel/l3fp-expo.dtx
index 5b5f947c38..31eb49093d 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/required/l3kernel/l3fp-expo.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/required/l3kernel/l3fp-extended.dtx
index bcd16a4b68..e35f0ae55e 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/required/l3kernel/l3fp-extended.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-functions.dtx b/macros/latex/required/l3kernel/l3fp-functions.dtx
index b26d8e7f26..e7667eaa9b 100644
--- a/macros/latex/contrib/l3kernel/l3fp-functions.dtx
+++ b/macros/latex/required/l3kernel/l3fp-functions.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/required/l3kernel/l3fp-logic.dtx
index c95704085c..49ad2b1c02 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/required/l3kernel/l3fp-logic.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/required/l3kernel/l3fp-parse.dtx
index 53b85a7cc8..7999be7966 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/required/l3kernel/l3fp-parse.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -430,7 +430,7 @@
% second attempt would be to call \cs{@@_parse_operand:Nw} with the
% \meta{precedence} of the previous operator, but |0>-2+3| is then
% parsed as |0>-(2+3)|: the addition is performed because it binds more
-% tightly than the comparision which precedes~|-|. The correct approach
+% tightly than the comparison which precedes~|-|. The correct approach
% is for a unary~|-| to perform operations whose precedence is greater
% than both that of the previous operation, and that of the unary~|-|
% itself. The unary~|-| is given a precedence higher than
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/required/l3kernel/l3fp-random.dtx
index cdbdf38ee1..2a3d00cb58 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/required/l3kernel/l3fp-random.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/required/l3kernel/l3fp-round.dtx
index bddb146be7..b96d496b22 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/required/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx b/macros/latex/required/l3kernel/l3fp-symbolic.dtx
index 26a084733d..cdb7383949 100644
--- a/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx
+++ b/macros/latex/required/l3kernel/l3fp-symbolic.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/required/l3kernel/l3fp-traps.dtx
index e1a3dd89a0..bca459effa 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/required/l3kernel/l3fp-traps.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/required/l3kernel/l3fp-trig.dtx
index 21cefc166c..8e8bc1cbf8 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/required/l3kernel/l3fp-trig.dtx
@@ -42,7 +42,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-types.dtx b/macros/latex/required/l3kernel/l3fp-types.dtx
index 0d589c9549..9764606e83 100644
--- a/macros/latex/contrib/l3kernel/l3fp-types.dtx
+++ b/macros/latex/required/l3kernel/l3fp-types.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/required/l3kernel/l3fp.dtx
index 11dbcdceef..d49d2431cb 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/required/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/required/l3kernel/l3fparray.dtx
index 1517840431..8b8026a6b8 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/required/l3kernel/l3fparray.dtx
@@ -44,20 +44,20 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
% \begin{documentation}
%
-% \section{\pkg{l3fparray} documentation}
-%
% For applications requiring heavy use of floating points, this module
% provides arrays which can be accessed in constant time (contrast
% \pkg{l3seq}, where access time is linear). The interface is very
% close to that of \pkg{l3intarray}. The size of the array is fixed and
% must be given at point of initialisation
%
+% \section{Creating and initialising floating point array variables}
+%
% \begin{function}[added = 2018-05-05]{\fparray_new:Nn, \fparray_new:cn}
% \begin{syntax}
% \cs{fparray_new:Nn} \meta{fparray~var} \Arg{size}
@@ -68,14 +68,16 @@
% assignments are always global.
% \end{function}
%
-% \begin{function}[EXP, added = 2018-05-05]{\fparray_count:N, \fparray_count:c}
+% \begin{function}[added = 2018-05-05]{\fparray_gzero:N, \fparray_gzero:c}
% \begin{syntax}
-% \cs{fparray_count:N} \meta{fparray~var}
+% \cs{fparray_gzero:N} \meta{fparray~var}
% \end{syntax}
-% Expands to the number of entries in the \meta{floating point array
-% variable}. This is performed in constant time.
+% Sets all entries of the \meta{floating point array variable} to
+% $+0$. Assignments are always global.
% \end{function}
%
+% \section{Adding data to floating point arrays}
+%
% \begin{function}[added = 2018-05-05]{\fparray_gset:Nnn, \fparray_gset:cnn}
% \begin{syntax}
% \cs{fparray_gset:Nnn} \meta{fparray~var} \Arg{position} \Arg{value}
@@ -87,17 +89,21 @@
% Assignments are always global.
% \end{function}
%
-% \begin{function}[added = 2018-05-05]{\fparray_gzero:N, \fparray_gzero:c}
+% \section{Counting entries in floating point arrays}
+%
+% \begin{function}[EXP, added = 2018-05-05]{\fparray_count:N, \fparray_count:c}
% \begin{syntax}
-% \cs{fparray_gzero:N} \meta{fparray~var}
+% \cs{fparray_count:N} \meta{fparray~var}
% \end{syntax}
-% Sets all entries of the \meta{floating point array variable} to
-% $+0$. Assignments are always global.
+% Expands to the number of entries in the \meta{floating point array
+% variable}. This is performed in constant time.
% \end{function}
%
+% \section{Using a single entry}
+%
% \begin{function}[EXP, added = 2018-05-05]
% {
-% \fparray_item:Nn, \fparray_item:cn
+% \fparray_item:Nn, \fparray_item:cn,
% \fparray_item_to_tl:Nn, \fparray_item_to_tl:cn
% }
% \begin{syntax}
@@ -106,8 +112,21 @@
% Applies \cs{fp_use:N} or \cs{fp_to_tl:N} (respectively) to the
% floating point entry stored at the (integer expression)
% \meta{position} in the \meta{floating point array variable}. If the
-% \meta{position} is not between $1$ and the \cs{fparray_count:N}, an
-% error occurs.
+% \meta{position} is not between $1$ and the
+% \cs{fparray_count:N} \meta{fparray~var}, an error occurs.
+% \end{function}
+%
+% \section{Floating point array conditional}
+%
+% \begin{function}[pTF, added = 2024-03-31]
+% {\fparray_if_exist:N, \fparray_if_exist:c}
+% \begin{syntax}
+% \cs{fparray_if_exist_p:N} \meta{fparray~var}
+% \cs{fparray_if_exist:NTF} \meta{fparray~var} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether the \meta{fparray~var} is currently defined. This
+% does not check that the \meta{fparray~var} really is a floating
+% point array variable.
% \end{function}
%
% \end{documentation}
@@ -389,6 +408,16 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}[pTF]{\fparray_if_exist:N, \fparray_if_exist:c}
+% Copies of the \texttt{cs} functions defined in \pkg{l3basics}.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn \fparray_if_exist:N \cs_if_exist:N
+ { TF , T , F , p }
+\prg_new_eq_conditional:NNn \fparray_if_exist:c \cs_if_exist:c
+ { TF , T , F , p }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/required/l3kernel/l3int.dtx
index 9fa2a547ff..c4e8408af2 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/required/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -186,7 +186,7 @@
% encountered that cannot form part of such an expression. If that
% token is \cs{scan_stop:} it is removed, otherwise not. Spaces do
% \emph{not} terminate the expression. However, spaces terminate
-% explict integers, and this may terminate the expression: for
+% explicit integers, and this may terminate the expression: for
% instance, \cs{int_eval:w} \verb*|1 + 1 9| (with explicit space
% tokens inserted using |~| in a code setting) expands to \texttt{29}
% since the digit~\texttt{9} is not part of the expression. Expansion
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/required/l3kernel/l3intarray.dtx
index 5704a2ab75..20e6219ef8 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/required/l3kernel/l3intarray.dtx
@@ -44,14 +44,12 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
% \begin{documentation}
%
-% \section{\pkg{l3intarray} documentation}
-%
% For applications requiring heavy use of integers, this module provides
% arrays which can be accessed in constant time (contrast \pkg{l3seq},
% where access time is linear). These arrays have several important
@@ -66,6 +64,8 @@
% The use of \texttt{intarray} data is therefore recommended for cases where
% the need for fast access is of paramount importance.
%
+% \section{Creating and initialising integer array variables}
+%
% \begin{function}[added = 2018-03-29]{\intarray_new:Nn, \intarray_new:cn}
% \begin{syntax}
% \cs{intarray_new:Nn} \meta{intarray~var} \Arg{size}
@@ -76,14 +76,27 @@
% always global.
% \end{function}
%
-% \begin{function}[EXP, added = 2018-03-29]{\intarray_count:N, \intarray_count:c}
+% \begin{function}[added = 2018-05-04]
+% {\intarray_const_from_clist:Nn, \intarray_const_from_clist:cn}
% \begin{syntax}
-% \cs{intarray_count:N} \meta{intarray~var}
+% \cs{intarray_const_from_clist:Nn} \meta{intarray~var} \meta{int expr clist}
% \end{syntax}
-% Expands to the number of entries in the \meta{integer array variable}.
-% Contrarily to \cs{seq_count:N} this is performed in constant time.
+% Creates a new constant \meta{integer array variable} or raises an
+% error if the name is already taken. The \meta{integer array
+% variable} is set (globally) to contain as its items the results of
+% evaluating each \meta{integer expression} in the \meta{comma list}.
% \end{function}
%
+% \begin{function}[added = 2018-05-04]{\intarray_gzero:N, \intarray_gzero:c}
+% \begin{syntax}
+% \cs{intarray_gzero:N} \meta{intarray~var}
+% \end{syntax}
+% Sets all entries of the \meta{integer array variable} to zero.
+% Assignments are always global.
+% \end{function}
+%
+% \section{Adding data to integer arrays}
+%
% \begin{function}[added = 2018-03-29]{\intarray_gset:Nnn, \intarray_gset:cnn}
% \begin{syntax}
% \cs{intarray_gset:Nnn} \meta{intarray~var} \Arg{position} \Arg{value}
@@ -96,25 +109,18 @@
% global.
% \end{function}
%
-% \begin{function}[added = 2018-05-04]
-% {\intarray_const_from_clist:Nn, \intarray_const_from_clist:cn}
-% \begin{syntax}
-% \cs{intarray_const_from_clist:Nn} \meta{intarray~var} \meta{int expr clist}
-% \end{syntax}
-% Creates a new constant \meta{integer array variable} or raises an
-% error if the name is already taken. The \meta{integer array
-% variable} is set (globally) to contain as its items the results of
-% evaluating each \meta{integer expression} in the \meta{comma list}.
-% \end{function}
+% \section{Counting entries in integer arrays}
%
-% \begin{function}[added = 2018-05-04]{\intarray_gzero:N, \intarray_gzero:c}
+% \begin{function}[EXP, added = 2018-03-29]{\intarray_count:N, \intarray_count:c}
% \begin{syntax}
-% \cs{intarray_gzero:N} \meta{intarray~var}
+% \cs{intarray_count:N} \meta{intarray~var}
% \end{syntax}
-% Sets all entries of the \meta{integer array variable} to zero.
-% Assignments are always global.
+% Expands to the number of entries in the \meta{integer array variable}.
+% Contrarily to \cs{seq_count:N} this is performed in constant time.
% \end{function}
%
+% \section{Using a single entry}
+%
% \begin{function}[EXP, added = 2018-03-29]{\intarray_item:Nn, \intarray_item:cn}
% \begin{syntax}
% \cs{intarray_item:Nn} \meta{intarray~var} \Arg{position}
@@ -134,6 +140,21 @@
% \meta{integer array} is empty, produce an error.
% \end{function}
%
+% \section{Integer array conditional}
+%
+% \begin{function}[pTF, added = 2024-03-31]
+% {\intarray_if_exist:N, \intarray_if_exist:c}
+% \begin{syntax}
+% \cs{intarray_if_exist_p:N} \meta{intarray~var}
+% \cs{intarray_if_exist:NTF} \meta{intarray~var} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether the \meta{intarray~var} is currently defined. This
+% does not check that the \meta{intarray~var} really is an integer
+% array variable.
+% \end{function}
+%
+% \section{Viewing integer arrays}
+%
% \begin{function}[added = 2018-05-04]
% {\intarray_show:N, \intarray_show:c, \intarray_log:N, \intarray_log:c}
% \begin{syntax}
@@ -144,7 +165,7 @@
% terminal or writes them in the log file.
% \end{function}
%
-% \subsection{Implementation notes}
+% \section{Implementation notes}
%
% It is a wrapper around the \tn{fontdimen} primitive, used to store
% arrays of integers (with a restricted range: absolute value at most
@@ -256,7 +277,7 @@ end, 'protected', 'global')
% \end{macro}
% \end{macro}
%
-% Before we get to the first command implmented in Lua, we first need some
+% Before we get to the first command implemented in Lua, we first need some
% definitions. Since \texttt{token.create} only works correctly if \TeX{}
% has seen the tokens before, we first run a short \TeX{} sequence to ensure
% that all relevant control sequences are known.
@@ -912,6 +933,16 @@ luacmd('@@_gset_range:w', function()
%
% \subsection{Common parts}
%
+% \begin{macro}[pTF]{\intarray_if_exist:N, \intarray_if_exist:c}
+% Copies of the \texttt{cs} functions defined in \pkg{l3basics}.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn \intarray_if_exist:N \cs_if_exist:N
+ { TF , T , F , p }
+\prg_new_eq_conditional:NNn \intarray_if_exist:c \cs_if_exist:c
+ { TF , T , F , p }
+% \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}
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/required/l3kernel/l3kernel-functions.dtx
index 480425d730..6779a3ca6c 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/required/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -333,7 +333,21 @@
% higher-level
% functions which have already fully expanded the \meta{file name} and which
% need to perform multiple open or close operations. See for example the
-% implementation of \cs{file_get_full_name:nN},
+% implementation of \cs{ior_shell_open:Nn}.
+% \end{function}
+%
+% \begin{function}{\__kernel_iow_open:Nn, \__kernel_iow_open:No}
+% \begin{syntax}
+% \cs{__kernel_iow_open:Nn} \meta{stream} \Arg{file name}
+% \end{syntax}
+% This function has identical syntax to the public version. However,
+% is does not take precautions against active characters in the
+% \meta{file name}, and it does not attempt to add a \meta{path} to
+% the \meta{file name}: it is therefore intended to be used by
+% higher-level
+% functions which have already fully expanded the \meta{file name} and which
+% need to perform multiple open or close operations. See for example the
+% implementation of \cs{iow_shell_open:Nn}.
% \end{function}
%
% \begin{function}{\__kernel_iow_with:Nnn}
@@ -367,6 +381,17 @@
% |1+2| then this logs |> 1+2=3.|
% \end{function}
%
+% \begin{function}[EXP]{\__kernel_pdf_object_id:n, \__kernel_pdf_object_id_indexed:nn}
+% \begin{syntax}
+% \cs{__kernel_pdf_object_id:n} \Arg{object}
+% \cs{__kernel_pdf_object_id_indexed:nn} \Arg{class} \Arg{number}
+% \end{syntax}
+% Expands to the ID of \meta{object} (or object of \meta{number} within
+% the \meta{class}), in for example page resource allocation. Depending on
+% the backend, the result may be the same as
+% \cs{pdf_object_id:n}/\cs{pdf_object_id_indexed:nn}.
+% \end{function}
+%
% \begin{variable}{\g__kernel_prg_map_int}
% This integer is used by non-expandable mapping functions to track
% the level of nesting in force. The functions
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/required/l3kernel/l3keys.dtx
index 5ea436176f..f03c628a63 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/required/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -585,7 +585,7 @@
% by creating sub-keys of the choice key. This can be carried out in
% two ways.
%
-% In many cases, choices execute similar code which is dependant only
+% In many cases, choices execute similar code which is dependent only
% on the name of the choice or the position of the choice in the
% list of all possibilities. Here, the keys can share the same code, and can
% be rapidly created using the \texttt{.choices:nn} property.
@@ -876,7 +876,7 @@
% \cs{keys_set_exclude_groups:nnnN} \Arg{module} \Arg{groups} \Arg{keyval list} \meta{tl}
% \cs{keys_set_exclude_groups:nnnnN} \Arg{module} \Arg{groups} \Arg{keyval list} \meta{root} \meta{tl}
% \end{syntax}
-% Sets keys by excluding those in the specificied \meta{groups}.
+% Sets keys by excluding those in the specified \meta{groups}.
% The \meta{groups} are
% given as a comma-separated list. Unknown keys are not assigned to any
% group and are thus always set. The key--value pairs for each
@@ -891,10 +891,14 @@
% the key names and values are returned.
% \end{function}
%
-% \begin{function}[added = 2013-07-14, updated = 2017-05-27]
+% \begin{function}[added = 2013-07-14, updated = 2024-05-08]
% {
% \keys_set_groups:nnn, \keys_set_groups:nnV,
-% \keys_set_groups:nnv, \keys_set_groups:nno
+% \keys_set_groups:nnv, \keys_set_groups:nno,
+% \keys_set_groups:nnnN, \keys_set_groups:nnVN,
+% \keys_set_groups:nnvN, \keys_set_groups:nnoN,
+% \keys_set_groups:nnnnN, \keys_set_groups:nnVnN,
+% \keys_set_groups:nnvnN, \keys_set_groups:nnonN,
% }
% \begin{syntax}
% \cs{keys_set_groups:nnn} \Arg{module} \Arg{groups} \Arg{keyval list}
@@ -902,7 +906,10 @@
% Activates key filtering in an \enquote{opt-in} sense: only keys assigned to
% one or more of the \meta{groups} specified are set. The \meta{groups} are
% given as a comma-separated list. Unknown keys are not assigned to any
-% group and are thus never set.
+% group and are thus never set. The key--value pairs for each
+% key which is filtered out are stored in the \meta{tl} in a
+% comma-separated form (\emph{i.e.}~an edited version of the \meta{keyval
+% list}). The \cs{keys_set_groups:nnn} version skips this stage
% \end{function}
%
% \section{Digesting keys}
@@ -1667,20 +1674,27 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_selective_bool, \l_@@_filtered_bool}
+% \begin{variable}{\l_@@_selective_bool, \l_@@_exclude_bool}
% Two booleans for using key groups: one to indicate that \enquote{selective}
% setting is active, a second to specify which type (\enquote{opt-in}
% or \enquote{opt-out}).
% \begin{macrocode}
\bool_new:N \l_@@_selective_bool
-\bool_new:N \l_@@_filtered_bool
+\bool_new:N \l_@@_exclude_bool
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_selective_seq}
+% \begin{variable}{\l_@@_selective_clist}
% The list of key groups being filtered in or out during selective setting.
% \begin{macrocode}
-\seq_new:N \l_@@_selective_seq
+\seq_new:N \l_@@_selective_clist
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_tmp_clist}
+% Scratch space used as a data dump.
+% \begin{macrocode}
+\seq_new:N \l_@@_tmp_clist
% \end{macrocode}
% \end{variable}
%
@@ -2787,36 +2801,58 @@
%
% \subsection{Setting keys}
%
-% \begin{macro}
-% {
-% \keys_set:nn, \keys_set:nV, \keys_set:nv, \keys_set:ne,
-% \keys_set:no, \keys_set:nx,
-% \@@_set:nn
-% }
+% \begin{macro}{\@@_set:nnnnNn}
+% \begin{macro}{\@@_set:nnnnnnnNn}
+% \begin{macro}[EXP]{\@@_reset_bool:N, \@@_reset_var:N}
+% \begin{macro}{\@@_set:nn}
% \begin{macro}{\@@_set:nnn}
-% A simple wrapper allowing for nesting.
-% \begin{macrocode}
-\cs_new_protected:Npn \keys_set:nn #1#2
+% The aim here is to allow nesting of key setting without needing lots of
+% tracking. That is done by expanding the appropriate tokens \enquote{around}
+% the core keyval parsing. As there are several different sub-paths, this
+% needs a few steps and some generic auxiliaries. The arguments here are
+% \begin{enumerate}
+% \item The root for keys
+% \item The key groups
+% \item The keys themselves
+% \item The relative root for return of unset keys
+% \item The \texttt{clist} var for returning unset keys
+% \item The code to set up the correct selection approach
+% \end{enumerate}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set:nnnnNn
+ {
+ \exp_args:Nooo \@@_set:nnnnnnnNn
+ \l_@@_unused_clist
+ \l_@@_selective_clist
+ \l_@@_relative_tl
+ }
+\cs_new_protected:Npn \@@_set:nnnnnnnNn #1#2#3#4#5#6#7#8#9
{
+ \clist_clear:N \l_@@_unused_clist
+ \clist_set:Ne \l_@@_selective_clist { \tl_to_str:n {#5} }
+ \tl_set:Nn \l_@@_relative_tl {#7}
\use:e
{
- \bool_set_false:N \exp_not:N \l_@@_only_known_bool
- \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 }
- \@@_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 }
- \bool_if:NT \l_@@_filtered_bool
- { \bool_set_true:N \exp_not:N \l_@@_filtered_bool }
- \bool_if:NT \l_@@_selective_bool
- { \bool_set_true:N \exp_not:N \l_@@_selective_bool }
- \tl_set:Nn \exp_not:N \l_@@_relative_tl
- { \exp_not:o \l_@@_relative_tl }
+ \exp_not:n
+ {
+ #9
+ \@@_set:nn {#4} {#6}
+ }
+ \@@_reset_bool:N \l_@@_only_known_bool
+ \@@_reset_bool:N \l_@@_exclude_bool
+ \@@_reset_bool:N \l_@@_selective_bool
}
+ \clist_set_eq:NN #8 \l_@@_unused_clist
+ \__kernel_tl_set:Nx \l_@@_unused_clist { \exp_not:n {#1} }
+ \__kernel_tl_set:Nx \l_@@_selective_clist {#2}
+ \__kernel_tl_set:Nx \l_@@_relative_tl { \exp_not:n {#3} }
+ }
+\cs_new:Npn \@@_reset_bool:N #1
+ {
+ \exp_not:c
+ { bool_set_ \bool_if:NTF #1 { true } { false } :N }
+ \exp_not:N #1
}
-\cs_generate_variant:Nn \keys_set:nn { nV , nv , ne , no , nx }
\cs_new_protected:Npn \@@_set:nn #1#2
{ \exp_args:No \@@_set:nnn \l_@@_module_str {#1} {#2} }
\cs_new_protected:Npn \@@_set:nnn #1#2#3
@@ -2828,80 +2864,72 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {
-% \keys_set_known:nnN, \keys_set_known:nVN,
-% \keys_set_known:nvN, \keys_set_known:neN,
-% \keys_set_known:noN
+% \keys_set:nn, \keys_set:nV, \keys_set:nv, \keys_set:ne,
+% \keys_set:no, \keys_set:nx
% }
+% A simple wrapper allowing for nesting.
+% \begin{macrocode}
+\cs_new_protected:Npn \keys_set:nn #1#2
+ {
+ \@@_set:nnnnNn
+ {#1} { } {#2} { \q_@@_no_value } \l_@@_tmp_clist
+ {
+ \bool_set_false:N \l_@@_only_known_bool
+ \bool_set_false:N \l_@@_exclude_bool
+ \bool_set_false:N \l_@@_selective_bool
+ }
+ }
+\cs_generate_variant:Nn \keys_set:nn { nV , nv , ne , no , nx }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}
% {
% \keys_set_known:nnnN, \keys_set_known:nVnN,
% \keys_set_known:nvnN, \keys_set_known:nenN,
% \keys_set_known:nonN
% }
-% \begin{macro}{\@@_set_known:nnnnN}
+% \begin{macro}
+% {
+% \keys_set_known:nnN, \keys_set_known:nVN,
+% \keys_set_known:nvN, \keys_set_known:neN,
+% \keys_set_known:noN
+% }
% \begin{macro}
% {
% \keys_set_known:nn, \keys_set_known:nV,
% \keys_set_known:nv, \keys_set_known:ne,
% \keys_set_known:no
% }
-% \begin{macro}{\@@_set_known:nnn}
-% Setting known keys simply means setting the appropriate boolean, then
-% running the standard code. To allow for nested setting, any existing
-% value of \cs{l_@@_unused_clist} is saved on the stack and reset
-% afterwards. Note that for speed/simplicity reasons we use a \texttt{tl}
-% operation to set the \texttt{clist} here!
+% Simply set the right variables.
% \begin{macrocode}
-\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
- }
-\cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , ne , no }
\cs_new_protected:Npn \keys_set_known:nnnN #1#2#3#4
{
- \exp_args:No \@@_set_known:nnnnN
- \l_@@_unused_clist {#3} {#1} {#2} #4
+ \@@_set:nnnnNn
+ {#1} { } {#2} {#3} #4
+ {
+ \bool_set_true:N \l_@@_only_known_bool
+ \bool_set_false:N \l_@@_exclude_bool
+ \bool_set_false:N \l_@@_selective_bool
+ }
}
\cs_generate_variant:Nn \keys_set_known:nnnN { nV , nv , ne , no }
-\cs_new_protected:Npn \@@_set_known:nnnnN #1#2#3#4#5
- {
- \clist_clear:N \l_@@_unused_clist
- \@@_set_known:nnn {#2} {#3} {#4}
- \__kernel_tl_set:Nx #5 { \exp_not:o \l_@@_unused_clist }
- \__kernel_tl_set:Nx \l_@@_unused_clist { \exp_not:n {#1} }
- }
+\cs_new_protected:Npn \keys_set_known:nnN #1#2#3
+ { \keys_set_known:nnnN {#1} {#2} { \q_@@_no_value } #3 }
+\cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , ne , no }
\cs_new_protected:Npn \keys_set_known:nn #1#2
- { \@@_set_known:nnn \q_@@_no_value {#1} {#2} }
+ { \keys_set_known:nnnN {#1} {#2} { \q_@@_no_value } \l_@@_tmp_clist }
\cs_generate_variant:Nn \keys_set_known:nn { nV , nv , ne , no }
-\cs_new_protected:Npn \@@_set_known:nnn #1#2#3
- {
- \use:e
- {
- \bool_set_true:N \exp_not:N \l_@@_only_known_bool
- \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 {#1} }
- \@@_set:nn \exp_not:n { {#2} {#3} }
- \bool_if:NF \l_@@_only_known_bool
- { \bool_set_false:N \exp_not:N \l_@@_only_known_bool }
- \bool_if:NT \l_@@_filtered_bool
- { \bool_set_true:N \exp_not:N \l_@@_filtered_bool }
- \bool_if:NT \l_@@_selective_bool
- { \bool_set_true:N \exp_not:N \l_@@_selective_bool }
- \tl_set:Nn \exp_not:N \l_@@_relative_tl
- { \exp_not:o \l_@@_relative_tl }
- }
- }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}
% {
@@ -2913,97 +2941,68 @@
% \keys_set_exclude_groups:nnnnN, \keys_set_exclude_groups:nnVnN,
% \keys_set_exclude_groups:nnvnN, \keys_set_exclude_groups:nnonN
% }
-% \begin{macro}{\@@_set_exclude_groups:nnnnnN}
% \begin{macro}
% {
% \keys_set_exclude_groups:nnn, \keys_set_exclude_groups:nnV,
% \keys_set_exclude_groups:nnv, \keys_set_exclude_groups:nno
% }
-% \begin{macro}{\@@_set_exclude_groups:nnnn}
% \begin{macro}
% {
-% \keys_set_groups:nnn, \keys_set_groups:nnV, \keys_set_groups:nnv,
-% \keys_set_groups:nno
+% \keys_set_groups:nnnN, \keys_set_groups:nnVN,
+% \keys_set_groups:nnvN, \keys_set_groups:nnoN
+% }
+% \begin{macro}
+% {
+% \keys_set_groups:nnnnN, \keys_set_groups:nnVnN,
+% \keys_set_groups:nnvnN, \keys_set_groups:nnonN
+% }
+% \begin{macro}
+% {
+% \keys_set_groups:nnn, \keys_set_groups:nnV,
+% \keys_set_groups:nnv, \keys_set_groups:nno
% }
-% \begin{macro}{\@@_set_selective:nnn}
-% \begin{macro}{\@@_set_selective:nnnn}
-% The idea of setting keys in a selective manner again uses booleans
-% wrapped around the basic code. The comments on \cs{keys_set_known:nnN}
-% also apply here. We have a bit more shuffling to do to keep everything
-% nestable.
+% The same for (exclusion) groups.
% \begin{macrocode}
-\cs_new_protected:Npn \keys_set_exclude_groups:nnnN #1#2#3#4
- {
- \exp_args:No \@@_set_exclude_groups:nnnnnN
- \l_@@_unused_clist
- \q_@@_no_value {#1} {#2} {#3} #4
- }
-\cs_generate_variant:Nn \keys_set_exclude_groups:nnnN { nnV , nnv , nno }
\cs_new_protected:Npn \keys_set_exclude_groups:nnnnN #1#2#3#4#5
{
- \exp_args:No \@@_set_exclude_groups:nnnnnN
- \l_@@_unused_clist {#4} {#1} {#2} {#3} #5
+ \@@_set:nnnnNn
+ {#1} {#2} {#3} {#4} #5
+ {
+ \bool_set_false:N \l_@@_only_known_bool
+ \bool_set_true:N \l_@@_exclude_bool
+ \bool_set_true:N \l_@@_selective_bool
+ }
}
\cs_generate_variant:Nn \keys_set_exclude_groups:nnnnN { nnV , nnv , nno }
-\cs_new_protected:Npn \@@_set_exclude_groups:nnnnnN #1#2#3#4#5#6
+\cs_new_protected:Npn \keys_set_exclude_groups:nnnN #1#2#3#4
+ { \keys_set_exclude_groups:nnnnN {#1} {#2} {#3} { \q_@@_no_value } #4 }
+\cs_generate_variant:Nn \keys_set_exclude_groups:nnnN { nnV , nnv , nno }
+\cs_new_protected:Npn \keys_set_exclude_groups:nnn #1#2#3
{
- \clist_clear:N \l_@@_unused_clist
- \@@_set_exclude_groups:nnnn {#2} {#3} {#4} {#5}
- \__kernel_tl_set:Nx #6 { \exp_not:o \l_@@_unused_clist }
- \__kernel_tl_set:Nx \l_@@_unused_clist { \exp_not:n {#1} }
+ \keys_set_exclude_groups:nnnnN {#1} {#2} {#3}
+ { \q_@@_no_value } \l_@@_tmp_clist
}
-\cs_new_protected:Npn \keys_set_exclude_groups:nnn #1#2#3
- {\@@_set_exclude_groups:nnnn \q_@@_no_value {#1} {#2} {#3} }
\cs_generate_variant:Nn \keys_set_exclude_groups:nnn { nnV , nnv , nno }
-\cs_new_protected:Npn \@@_set_exclude_groups:nnnn #1#2#3#4
+\cs_new_protected:Npn \keys_set_groups:nnnnN #1#2#3#4#5
{
- \use:e
+ \@@_set:nnnnNn
+ {#1} {#2} {#3} {#4} #5
{
- \bool_set_false:N \exp_not:N \l_@@_only_known_bool
- \bool_set_true: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 {#1} }
- \@@_set_selective:nnn \exp_not:n { {#2} {#3} {#4} }
- \bool_if:NT \l_@@_only_known_bool
- { \bool_set_true:N \exp_not:N \l_@@_only_known_bool }
- \bool_if:NF \l_@@_filtered_bool
- { \bool_set_false:N \exp_not:N \l_@@_filtered_bool }
- \bool_if:NF \l_@@_selective_bool
- { \bool_set_false:N \exp_not:N \l_@@_selective_bool }
- \tl_set:Nn \exp_not:N \l_@@_relative_tl
- { \exp_not:o \l_@@_relative_tl }
+ \bool_set_false:N \l_@@_only_known_bool
+ \bool_set_false:N \l_@@_exclude_bool
+ \bool_set_true:N \l_@@_selective_bool
}
}
+\cs_generate_variant:Nn \keys_set_groups:nnnnN { nnV , nnv , nno }
+\cs_new_protected:Npn \keys_set_groups:nnnN #1#2#3#4
+ { \keys_set_groups:nnnnN {#1} {#2} {#3} { \q_@@_no_value } #4 }
+\cs_generate_variant:Nn \keys_set_groups:nnnN { nnV , nnv , nno }
\cs_new_protected:Npn \keys_set_groups:nnn #1#2#3
{
- \use:e
- {
- \bool_set_false:N \exp_not:N \l_@@_only_known_bool
- \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 }
- \@@_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 }
- \bool_if:NF \l_@@_filtered_bool
- { \bool_set_true:N \exp_not:N \l_@@_filtered_bool }
- \bool_if:NF \l_@@_selective_bool
- { \bool_set_false:N \exp_not:N \l_@@_selective_bool }
- \tl_set:Nn \exp_not:N \l_@@_relative_tl
- { \exp_not:o \l_@@_relative_tl }
- }
+ \keys_set_groups:nnnnN {#1} {#2} {#3}
+ { \q_@@_no_value } \l_@@_tmp_clist
}
\cs_generate_variant:Nn \keys_set_groups:nnn { nnV , nnv , nno }
-\cs_new_protected:Npn \@@_set_selective:nnn
- { \exp_args:No \@@_set_selective:nnnn \l_@@_selective_seq }
-\cs_new_protected:Npn \@@_set_selective:nnnn #1#2#3#4
- {
- \exp_args:NNe \seq_set_from_clist:Nn
- \l_@@_selective_seq { \tl_to_str:n {#3} }
- \@@_set:nn {#2} {#4}
- \tl_set:Nn \l_@@_selective_seq {#1}
- }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3011,8 +3010,6 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}{\keys_precompile:nnN}
% A simple wrapper.
@@ -3127,7 +3124,7 @@
\@@_check_groups:
}
{
- \bool_if:NTF \l_@@_filtered_bool
+ \bool_if:NTF \l_@@_exclude_bool
\@@_execute:
\@@_store_unused:
}
@@ -3138,7 +3135,7 @@
% set active. That requires two mappings, and again a different outcome
% depending on whether opt-in or opt-out is set.
% It is safe to use \cs{clist_if_in:NnTF} because
-% both \cs{l_@@_selective_seq} and \cs{l_@@_groups_clist} contain the
+% both \cs{l_@@_selective_clist} and \cs{l_@@_groups_clist} contain the
% groups as strings, without leading/trailing spaces in any item,
% since the \pkg{l3clist} functions were applied to the result of
% applying \cs{tl_to_str:n}.
@@ -3146,22 +3143,22 @@
\cs_new_protected:Npn \@@_check_groups:
{
\bool_set_false:N \l_@@_tmp_bool
- \seq_map_inline:Nn \l_@@_selective_seq
+ \clist_map_inline:Nn \l_@@_selective_clist
{
\clist_if_in:NnT \l_@@_groups_clist {##1}
{
\bool_set_true:N \l_@@_tmp_bool
- \seq_map_break:
+ \clist_map_break:
}
}
\bool_if:NTF \l_@@_tmp_bool
{
- \bool_if:NTF \l_@@_filtered_bool
+ \bool_if:NTF \l_@@_exclude_bool
\@@_store_unused:
\@@_execute:
}
{
- \bool_if:NTF \l_@@_filtered_bool
+ \bool_if:NTF \l_@@_exclude_bool
\@@_execute:
\@@_store_unused:
}
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/required/l3kernel/l3legacy.dtx
index bd56f1ed3a..fd30799ea1 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/required/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/required/l3kernel/l3luatex.dtx
index 3d177f6345..19d92a1591 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/required/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -452,7 +452,7 @@ ltxutils.filedump = filedump
%
% \begin{macro}[int]{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
+% In some engines, this is built-in. For traditional \LuaTeX{}, the conversion
% to hexadecimal has to be done by us.
% \begin{macrocode}
local md5_HEX = md5.HEX
@@ -664,7 +664,7 @@ end)
%<@@=lua>
% \end{macrocode}
%
-% The Lua state is not dumped when a forat is written, therefore any Lua
+% The Lua state is not dumped when a format is written, therefore any Lua
% variables filled doing format building need to be restored in order to
% be accessible during normal runs.
%
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/required/l3kernel/l3msg.dtx
index 3acae8d111..96fc231193 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/required/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -92,7 +92,7 @@
% will allow to filter out specifically messages from the \texttt{submodule}.
%
% Some authors may find the need to include spaces as |~| characters
-% tedious. This can be avoided by locally reseting the cateogry code
+% tedious. This can be avoided by locally resetting the category code
% of \verb*| |.
% \begin{verbatim}
% \char_set_catcode_space:n { `\ }
@@ -203,7 +203,9 @@
% \end{quote}
% This function can be redefined to alter the language in which the
% message is given, using |#1| as the name of the \meta{module} to
-% be included.
+% be included. Any redefinition \emph{must} produce output containing
+% the \meta{module} name, and will affect all messages using the
+% \pkg{expl3} mechanism.
% \end{function}
%
% \begin{function}[EXP]{\msg_critical_text:n}
@@ -217,7 +219,9 @@
% \end{quote}
% This function can be redefined to alter the language in which the
% message is given, using |#1| as the name of the \meta{module} to
-% be included.
+% be included. Any redefinition \emph{must} produce output containing
+% the \meta{module} name, and will affect all messages using the
+% \pkg{expl3} mechanism.
% \end{function}
%
% \begin{function}[EXP]{\msg_error_text:n}
@@ -231,7 +235,9 @@
% \end{quote}
% This function can be redefined to alter the language in which the
% message is given, using |#1| as the name of the \meta{module} to
-% be included.
+% be included. Any redefinition \emph{must} produce output containing
+% the \meta{module} name, and will affect all messages using the
+% \pkg{expl3} mechanism.
% \end{function}
%
% \begin{function}[EXP]{\msg_warning_text:n}
@@ -247,6 +253,9 @@
% message is given, using |#1| as the name of the \meta{module} to
% be included. The \meta{type} of \meta{module} may be adjusted:
% |Package| is the standard outcome: see \cs{msg_module_type:n}.
+% Any redefinition \emph{must} produce output containing
+% the \meta{module} name, and will affect all messages using the
+% \pkg{expl3} mechanism.
% \end{function}
%
% \begin{function}[EXP]{\msg_info_text:n}
@@ -262,6 +271,9 @@
% message is given, using |#1| as the name of the \meta{module} to
% be included. The \meta{type} of \meta{module} may be adjusted:
% |Package| is the standard outcome: see \cs{msg_module_type:n}.
+% Any redefinition \emph{must} produce output containing
+% the \meta{module} name, and will affect all messages using the
+% \pkg{expl3} mechanism.
% \end{function}
%
% \begin{function}[EXP,updated = 2018-09-30]{\msg_see_documentation_text:n}
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/required/l3kernel/l3names.dtx
index 3e78d86acf..c2af4697f2 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/required/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -1540,7 +1540,7 @@ end, 'global')
% \begin{macro}[no-user-doc]{\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
+% \pdfTeX, but it effectively 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.
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/required/l3kernel/l3news.pdf
index 87f01af5a7..eeea0487e7 100644
--- a/macros/latex/contrib/l3kernel/l3news.pdf
+++ b/macros/latex/required/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news.tex b/macros/latex/required/l3kernel/l3news.tex
index b8f0de5c72..b8f0de5c72 100644
--- a/macros/latex/contrib/l3kernel/l3news.tex
+++ b/macros/latex/required/l3kernel/l3news.tex
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/required/l3kernel/l3news01.pdf
index 5a6d4af9e2..eed44515b5 100644
--- a/macros/latex/contrib/l3kernel/l3news01.pdf
+++ b/macros/latex/required/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.tex b/macros/latex/required/l3kernel/l3news01.tex
index b4841ac24b..b4841ac24b 100644
--- a/macros/latex/contrib/l3kernel/l3news01.tex
+++ b/macros/latex/required/l3kernel/l3news01.tex
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/required/l3kernel/l3news02.pdf
index 8cda69f971..34df11b4f6 100644
--- a/macros/latex/contrib/l3kernel/l3news02.pdf
+++ b/macros/latex/required/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.tex b/macros/latex/required/l3kernel/l3news02.tex
index a3d5467c8e..a3d5467c8e 100644
--- a/macros/latex/contrib/l3kernel/l3news02.tex
+++ b/macros/latex/required/l3kernel/l3news02.tex
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/required/l3kernel/l3news03.pdf
index f16bb58750..fa2fc3a7b9 100644
--- a/macros/latex/contrib/l3kernel/l3news03.pdf
+++ b/macros/latex/required/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.tex b/macros/latex/required/l3kernel/l3news03.tex
index e3e245f051..e3e245f051 100644
--- a/macros/latex/contrib/l3kernel/l3news03.tex
+++ b/macros/latex/required/l3kernel/l3news03.tex
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/required/l3kernel/l3news04.pdf
index 52c33e516a..c1b5f0e555 100644
--- a/macros/latex/contrib/l3kernel/l3news04.pdf
+++ b/macros/latex/required/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.tex b/macros/latex/required/l3kernel/l3news04.tex
index a0fc82f3de..a0fc82f3de 100644
--- a/macros/latex/contrib/l3kernel/l3news04.tex
+++ b/macros/latex/required/l3kernel/l3news04.tex
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/required/l3kernel/l3news05.pdf
index 1f6bda9687..a3dc4d6e02 100644
--- a/macros/latex/contrib/l3kernel/l3news05.pdf
+++ b/macros/latex/required/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.tex b/macros/latex/required/l3kernel/l3news05.tex
index 43ec2a8d19..43ec2a8d19 100644
--- a/macros/latex/contrib/l3kernel/l3news05.tex
+++ b/macros/latex/required/l3kernel/l3news05.tex
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/required/l3kernel/l3news06.pdf
index cd65bce3a6..765174a222 100644
--- a/macros/latex/contrib/l3kernel/l3news06.pdf
+++ b/macros/latex/required/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.tex b/macros/latex/required/l3kernel/l3news06.tex
index 63ee6c7c75..63ee6c7c75 100644
--- a/macros/latex/contrib/l3kernel/l3news06.tex
+++ b/macros/latex/required/l3kernel/l3news06.tex
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/required/l3kernel/l3news07.pdf
index 721252a9b0..d9d2c2a281 100644
--- a/macros/latex/contrib/l3kernel/l3news07.pdf
+++ b/macros/latex/required/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.tex b/macros/latex/required/l3kernel/l3news07.tex
index 2b433da4c4..2b433da4c4 100644
--- a/macros/latex/contrib/l3kernel/l3news07.tex
+++ b/macros/latex/required/l3kernel/l3news07.tex
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/required/l3kernel/l3news08.pdf
index 855db5bdc5..810cc505a0 100644
--- a/macros/latex/contrib/l3kernel/l3news08.pdf
+++ b/macros/latex/required/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.tex b/macros/latex/required/l3kernel/l3news08.tex
index 17107f8360..17107f8360 100644
--- a/macros/latex/contrib/l3kernel/l3news08.tex
+++ b/macros/latex/required/l3kernel/l3news08.tex
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/required/l3kernel/l3news09.pdf
index 5dc3a3b9ad..1491fdd32c 100644
--- a/macros/latex/contrib/l3kernel/l3news09.pdf
+++ b/macros/latex/required/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.tex b/macros/latex/required/l3kernel/l3news09.tex
index 55ed700a2c..43293ff1d6 100644
--- a/macros/latex/contrib/l3kernel/l3news09.tex
+++ b/macros/latex/required/l3kernel/l3news09.tex
@@ -1421,7 +1421,7 @@ Basically help is possible on any level and it doesn't need to involve programmi
\item help on shaping the document interface layer
\end{itemize}
These concepts, as well as their implementation, are under discussion on the list \texttt{latex-l}.\footnote{Instructions for joining and browsing archives at:\\ \url{http://latex-project.org/code.html}}
-The list has only a fairly low level of traffic right now as actual implementation and development tasks are typically discussed directly among the few active implementors. But this might change if more people join.
+The list has only a fairly low level of traffic right now as actual implementation and development tasks are typically discussed directly among the few active implementers. But this might change if more people join.
\subsection{And something else \dots}
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/required/l3kernel/l3news10.pdf
index e921d2c81b..496795ff16 100644
--- a/macros/latex/contrib/l3kernel/l3news10.pdf
+++ b/macros/latex/required/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.tex b/macros/latex/required/l3kernel/l3news10.tex
index 88291e848f..88291e848f 100644
--- a/macros/latex/contrib/l3kernel/l3news10.tex
+++ b/macros/latex/required/l3kernel/l3news10.tex
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/required/l3kernel/l3news11.pdf
index a4866d55e7..68a16e2539 100644
--- a/macros/latex/contrib/l3kernel/l3news11.pdf
+++ b/macros/latex/required/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.tex b/macros/latex/required/l3kernel/l3news11.tex
index a1fd8a129c..a1fd8a129c 100644
--- a/macros/latex/contrib/l3kernel/l3news11.tex
+++ b/macros/latex/required/l3kernel/l3news11.tex
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/required/l3kernel/l3news12.pdf
index 4b6072bca1..f99bb21037 100644
--- a/macros/latex/contrib/l3kernel/l3news12.pdf
+++ b/macros/latex/required/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.tex b/macros/latex/required/l3kernel/l3news12.tex
index f41e4b3690..f41e4b3690 100644
--- a/macros/latex/contrib/l3kernel/l3news12.tex
+++ b/macros/latex/required/l3kernel/l3news12.tex
diff --git a/macros/latex/contrib/l3kernel/l3pdf.dtx b/macros/latex/required/l3kernel/l3pdf.dtx
index 7ffd0c1c05..007cb5b5ad 100644
--- a/macros/latex/contrib/l3kernel/l3pdf.dtx
+++ b/macros/latex/required/l3kernel/l3pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -51,6 +51,11 @@
%
% \section{Objects}
%
+% \subsection{Named objects}
+%
+% An \meta{object} name should fully expand to tokens suitable for use in a
+% label-like context.
+%
% \begin{function}[added = 2022-08-23]{\pdf_object_new:n}
% \begin{syntax}
% \cs{pdf_object_new:n} \Arg{object}
@@ -62,7 +67,7 @@
% \begin{function}[added = 2022-08-23]
% {\pdf_object_write:nnn, \pdf_object_write:nne}
% \begin{syntax}
-% \cs{pdf_object_write:nn} \Arg{object} \Arg{type} \Arg{content}
+% \cs{pdf_object_write:nnn} \Arg{object} \Arg{type} \Arg{content}
% \end{syntax}
% Writes the \meta{content} as content of the \meta{object}. Depending on the
% \meta{type} declared for the object, the format required for the
@@ -83,9 +88,71 @@
% \cs{pdf_object_ref:n} \Arg{object}
% \end{syntax}
% Inserts the appropriate information to reference the \meta{object}
-% in for example page resource allocation
+% in for example page resource allocation. If the \meta{object} does
+% not exist then the function expands to a reference to object zero;
+% no PDF indirect object ever has this number, so this is a marker for
+% error.
+% \end{function}
+%
+% \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} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether an object with name \Arg{object} has been defined.
+% \end{function}
+%
+% \subsection{Indexed objects}
+%
+% Objects can also be created using a pair of \meta{class} and \emph{index};
+% the \meta{class} argument should expand to character tokens, whilst the
+% \meta{index} is an \meta{int expr} and starts at $1$. For large
+% families of objects, this approach is more efficient than using
+% individual names.
+%
+% \begin{function}[added = 2024-04-01]{\pdf_object_new_indexed:nn}
+% \begin{syntax}
+% \cs{pdf_object_new_indexed:nn} \Arg{class} \Arg{index}
+% \end{syntax}
+% Declares a PDF object of \meta{class} and \meta{index}. The object may be
+% referenced from this point on, and written later using
+% \cs{pdf_object_write_indexed:nnnn}.
% \end{function}
%
+% \begin{function}[added = 2024-04-01]
+% {\pdf_object_write_indexed:nnnn, \pdf_object_write_indexed:nnne}
+% \begin{syntax}
+% \cs{pdf_object_write_indexed:nnnn} \Arg{class} \Arg{index} \Arg{type} \Arg{content}
+% \end{syntax}
+% Writes the \meta{content} as content of the object of \meta{class} and
+% \meta{index}. Depending on the
+% \meta{type} declared for the object, the format required for the
+% \meta{content} will vary
+% \begin{itemize}
+% \item[\texttt{array}] A space-separated list of values
+% \item[\texttt{dict}] Key--value pairs in the form
+% \texttt{/\meta{key} \meta{value}}
+% \item[\texttt{fstream}] Two brace groups: \meta{file name} and
+% \meta{file content}
+% \item[\texttt{stream}] Two brace groups: \meta{attributes (dictionary)}
+% and \meta{stream contents}
+% \end{itemize}
+% \end{function}
+%
+% \begin{function}[EXP, added = 2024-04-01]{\pdf_object_ref_indexed:nn}
+% \begin{syntax}
+% \cs{pdf_object_ref_indexed:nn} \Arg{class} \Arg{index}
+% \end{syntax}
+% Inserts the appropriate information to reference the object of \meta{class}
+% and \meta{index} in for example page resource allocation. If the
+% \meta{class}/\meta{index} combination does
+% not exist then the function expands to a reference to object zero;
+% no PDF indirect object ever has this number, so this is a marker for
+% error.
+% \end{function}
+%
+% \subsection{General functions}
+%
% \begin{function}[added = 2021-02-10]
% {\pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne}
% \begin{syntax}
@@ -112,19 +179,13 @@
% created. This is particularly useful for anonymous objects.
% \end{function}
%
-% \begin{function}[EXP, added = 2021-02-10]{\pdf_pageobject_ref:n}
+% \begin{function}[EXP, added = 2021-02-10, updated = 2024-04-22]
+% {\pdf_pageobject_ref:n}
% \begin{syntax}
-% \cs{pdf_pagobject_ref:n} \Arg{pageobject}
+% \cs{pdf_pageobject_ref:n} \Arg{abspage}
% \end{syntax}
-% Inserts the appropriate information to reference the \meta{pageobject}.
-% \end{function}
-%
-% \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.
+% Inserts the appropriate information to reference the \meta{abspage};
+% the latter is expanded fully before further processing.
% \end{function}
%
% \section{Version}
@@ -171,6 +232,9 @@
% \end{syntax}
% Sets the page size (mediabox) of the PDF being created to the
% \meta{width} and \meta{height}, both of which are \meta{dimexpr}.
+% The page size can only be set at the start of the output with
+% \texttt{dvips}; with other backends, this can be adjusted on a
+% per-page basis.
% \end{function}
%
% \section{Compression}
@@ -267,6 +331,10 @@
%<@@=pdf>
% \end{macrocode}
%
+% \begin{macrocode}
+%<*tex>
+% \end{macrocode}
+%
% \begin{variable}{\s_@@_stop}
% Internal scan marks.
% \begin{macrocode}
@@ -311,59 +379,292 @@
%
% \subsection{Objects}
%
+% \begin{variable}{\g_@@_backend_object_int}
+% For returning object numbers.
+% \begin{macrocode}
+\int_new:N \g_@@_backend_object_int
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\pdf_object_new:n}
% \begin{macro}
% {\pdf_object_write:nnn, \pdf_object_write:nne, \pdf_object_write:nnx}
% \begin{macro}{\pdf_object_ref:n}
-% \begin{macro}
-% {
-% \pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne,
-% \pdf_object_unnamed_write:nx
-% }
-% \begin{macro}{\pdf_object_ref_last:}
-% \begin{macro}[pTF]{\pdf_object_if_exist:n}
+% \begin{macro}{\__kernel_pdf_object_id:n}
% Simple to do: all objects create a constant |int| so it is not a
% backend-specific name.
% \begin{macrocode}
\cs_new_protected:Npn \pdf_object_new:n #1
{
- \@@_backend_object_new:n {#1}
- \cs_new_eq:cc
- { c_@@_backend_object_ \tl_to_str:n {#1} _int }
- { c_@@_object_ \tl_to_str:n {#1} _int }
+ \@@_backend_object_new:
+ \@@_object_record:nN {#1} \g_@@_backend_object_int
}
\cs_new_protected:Npn \pdf_object_write:nnn #1#2#3
{
- \@@_backend_object_write:nnn {#1} {#2} {#3}
+ \exp_args:Ne \@@_backend_object_write:nnn
+ { \@@_object_retrieve:n {#1} } {#2} {#3}
\bool_gset_true:N \g_@@_init_bool
}
\cs_generate_variant:Nn \pdf_object_write:nnn { nne , nnx }
-\cs_new:Npn \pdf_object_ref:n #1 { \@@_backend_object_ref:n {#1} }
-\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2
+\cs_new:Npn \pdf_object_ref:n #1
{
- \@@_backend_object_now:nn {#1} {#2}
- \bool_gset_true:N \g_@@_init_bool
+ \exp_args:Ne \@@_backend_object_ref:n
+ { \@@_object_retrieve:n {#1} }
}
-\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { ne , nx }
-\cs_new:Npn \pdf_object_ref_last: { \@@_backend_object_last: }
+\cs_new:Npn \__kernel_pdf_object_id:n #1
+ {
+ \exp_args:Ne \@@_backend_object_id:n
+ { \@@_object_retrieve:n {#1} }
+ }
+%</tex>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@@_object_record:nN}
+% \begin{macro}[EXP]{\@@_object_retrieve:n}
+% \begin{macro}{ltx.pdf.object_id}
+% Object mappings are tracked in Lua for \LuaTeX{} as this makes retrieving
+% them much easier; as a result, there is a split in approaches. In Lua we
+% store values in a table indexed by name. The Lua function here is set up
+% to deal with both named and indexed objects: fits the Lua idiom well.
+% \begin{macrocode}
+%<*lua>
+
+local scan_int = token.scan_int
+local scan_string = token.scan_string
+local cprint = tex.cprint
+
+local @@_objects_named = {}
+local @@_objects_indexed = {}
+
+luacmd('@@_object_record:nN', function()
+ local name = scan_string()
+ local n = scan_int()
+ @@_objects_named[name] = n
+end,'protected','global')
+
+local function object_id(name,index)
+ if index then
+ return @@_objects_indexed[name][index] or 0
+ else
+ return @@_objects_named[name] or 0
+ end
+end
+
+luacmd('@@_object_retrieve:n', function()
+ local name = scan_string()
+ return cprint(12,tostring(object_id(name)))
+end,'global')
+
+ltx.pdf = ltx.pdf or {}
+ltx.pdf.object_id = object_id
+
+%</lua>
+% \end{macrocode}
+% Whereas in \TeX{} we use integer constants.
+% \begin{macrocode}
+%<*tex>
+\sys_if_engine_luatex:F
+ {
+ \cs_new_protected:Npn \@@_object_record:nN #1#2
+ {
+ \int_const:cn
+ { c_@@_object_ #1 _int } {#2}
+ }
+ \cs_new:Npn \@@_object_retrieve:n #1
+ {
+ \int_if_exist:cTF { c_@@_object_ #1 _int }
+ {
+ \int_use:c
+ { c_@@_object_ #1 _int }
+ }
+ { 0 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}[pTF,EXP]{\pdf_object_if_exist:n}
+% \begin{macrocode}
\prg_new_conditional:Npnn \pdf_object_if_exist:n #1 { p , T , F , TF }
{
- \int_if_exist:cTF { c_@@_object_ \tl_to_str:n {#1} _int }
- \prg_return_true:
+ \int_compare:nNnTF { \@@_object_retrieve:n {#1} } = 0
\prg_return_false:
+ \prg_return_true:
}
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\pdf_object_new_indexed:nn}
+% \begin{macro}{\pdf_object_write_indexed:nnnn, \pdf_object_write_indexed:nnne}
+% \begin{macro}[EXP]{\pdf_object_ref_indexed:nn}
+% \begin{macro}[EXP]{\__kernel_pdf_object_id_indexed:nn}
+% Again we split between the common code and the macro- or Lua-based
+% implementation. To make life easier for the Lua route, all of the
+% potential expressions are expanded to braced numbers.
+% \begin{macrocode}
+\cs_new_protected:Npn \pdf_object_new_indexed:nn #1#2
+ {
+ \@@_backend_object_new:
+ \@@_object_record:neN {#1}
+ { \int_eval:n {#2} } \g_@@_backend_object_int
+ }
+\cs_new_protected:Npn \pdf_object_write_indexed:nnnn #1#2#3#4
+ {
+ \exp_args:Ne \@@_backend_object_write:nnn
+ { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } } {#3} {#4}
+ \bool_gset_true:N \g_@@_init_bool
+ }
+\cs_generate_variant:Nn \pdf_object_write_indexed:nnnn { nnne }
+\cs_new:Npn \pdf_object_ref_indexed:nn #1#2
+ {
+ \exp_args:Ne \@@_backend_object_ref:n
+ { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } }
+ }
+\cs_new:Npn \__kernel_pdf_object_id_indexed:nn #1#2
+ {
+ \exp_args:Ne \@@_backend_object_id:n
+ { \@@_object_retrieve:ne {#1} { \int_eval:n {#2} } }
+ }
+%</tex>
+% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
+% \begin{macro}{\@@_object_record:nnN, \@@_object_record:neN}
+% \begin{macro}[EXP]{\@@_object_retrieve:nn}
+% \begin{macro}{\@@_object_record:NnN}
+% \begin{macro}[EXP]{\@@_object_retrieve:Nn}
+% Again we split for Lua: the same idea as above but with nested tables.
+% As we've arranged above that the \TeX{} code passes a braced number,
+% we can use |tonumber(scan_string())| rather than |scan_int()|
+% for the index.
+% \begin{macrocode}
+%<*lua>
+
+luacmd('@@_object_record:nnN', function()
+ local name = scan_string()
+ local index = tonumber(scan_string())
+ local n = scan_int()
+ @@_objects_indexed[name] = @@_objects_indexed[name] or {}
+ @@_objects_indexed[name][index] = n
+end,'protected','global')
+
+luacmd('@@_object_retrieve:nn', function()
+ local name = scan_string()
+ local index = tonumber(scan_string())
+ return cprint(12,tostring(object_id(name,index)))
+end,'global')
+
+%</lua>
+% \end{macrocode}
+% The non-Lua approach is to divide the range into blocks, and store in integer
+% arrays that can simulate dynamic assignment.
+% \begin{macrocode}
+%<*tex>
+\sys_if_engine_luatex:F
+ {
+ \cs_new_protected:Npn \@@_object_record:nnN #1#2#3
+ {
+ \use:e
+ {
+ \@@_object_record:NnN
+ \@@_object_index_split:nn {#1} {#2}
+ \exp_not:N #3
+ }
+ }
+ \cs_new_protected:Npn \@@_object_record:NnN #1#2#3
+ {
+ \intarray_if_exist:NF #1
+ { \intarray_new:Nn #1 \c_@@_object_block_size_int }
+ \intarray_gset:Nnn #1 {#2} #3
+ }
+ \cs_new:Npn \@@_object_retrieve:nn #1#2
+ {
+ \use:e
+ {
+ \exp_not:N \@@_object_retrieve:Nn
+ \@@_object_index_split:nn {#1} {#2}
+ }
+ }
+ \cs_new:Npn \@@_object_retrieve:Nn #1#2
+ { \intarray_item:Nn #1 {#2} }
+% \end{macrocode}
+% As we want blocks to start from one, and within the block for the top value
+% to be \enquote{in} the block, we do a little bit of manipulation. By shifting
+% down by one, we keep the values \enquote{in} the block, then we adjust the
+% block/index number to get back on track.
+% \begin{macrocode}
+ \cs_new:Npn \@@_object_index_split:nn #1#2
+ {
+ \exp_not:c
+ {
+ g_@@_object_ #1 _
+ \int_eval:n
+ {
+ \int_div_truncate:nn { #2 - 1 }
+ \c_@@_object_block_size_int + 1
+ }
+ _intarray
+ }
+ {
+ \int_eval:n
+ { \int_mod:nn { #2 - 1 } \c_@@_object_block_size_int + 1 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{variable}{\c_@@_object_block_size_int}
+% Sets the block size used for managing indexed objects.
+% \begin{macrocode}
+ \int_const:Nn \c_@@_object_block_size_int { 10000 }
+ }
+% \end{macrocode}
+% \end{variable}
+% \begin{macro}{\@@_object_record:neN}
+% \begin{macro}[EXP]{\@@_object_retrieve:ne}
+% Common variants.
+% \begin{macrocode}
+\cs_generate_variant:Nn \@@_object_record:nnN { ne }
+\cs_generate_variant:Nn \@@_object_retrieve:nn { ne }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:ne,
+% \pdf_object_unnamed_write:nx
+% }
+% No tracking needed here.
+% \begin{macrocode}
+\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2
+ {
+ \exp_args:Ne \@@_backend_object_now:nn {#1} {#2}
+ \bool_gset_true:N \g_@@_init_bool
+ }
+\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { ne , nx }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdf_object_ref_last:}
+% A one-step wrapper for consistency.
+% \begin{macrocode}
+\cs_new:Npn \pdf_object_ref_last: { \@@_backend_object_last: }
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\pdf_pageobject_ref:n}
% \begin{macrocode}
\cs_new:Npn \pdf_pageobject_ref:n #1
- { \@@_backend_pageobject_ref:n {#1} }
+ { \exp_args:Ne \@@_backend_pageobject_ref:n {#1} }
% \end{macrocode}
% \end{macro}
%
@@ -523,6 +824,10 @@
% \end{macrocode}
%
% \begin{macrocode}
+%</tex>
+% \end{macrocode}
+%
+% \begin{macrocode}
%</package>
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/required/l3kernel/l3prefixes.csv
index 54fb41bdeb..7baa984582 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/required/l3kernel/l3prefixes.csv
@@ -96,6 +96,7 @@ fmuft,unicodefonttable,Frank Mittelbach,https://www.latex-project.org/,https://g
fmwao,widows-and-orphans,Frank Mittelbach,https://www.latex-project.org/,https://github.com/FrankMittelbach/fmitex-widows-and-orphans.git,https://github.com/FrankMittelbach/fmitex-widows-and-orphans/issues,2018-09-26,2018-09-26,
fnote,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2023-10-17,2023-10-17,
fnpct,fnpct,Clemens Niederberger,https://github.com/cgnieder/fnpct/,https://github.com/cgnieder/fnpct.git,https://github.com/cgnieder/fnpct/issues,2013-03-16,2020-04-14,
+fontscale,fontscale,Oliver Beery,https://github.com/beeryoliver/fontscale,https://github.com/beeryoliver/fontscale.git,https://github.com/beeryoliver/fontscale/issues,2024-04-18,2024-04-18,
fontsizes,fontsizes,Julien Rivaud,,,,,2018-06-13,
fontspec,fontspec,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/fontspec.git,https://github.com/latex3/fontspec/issues,2013-03-16,2024-02-15,
fp,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
@@ -124,9 +125,11 @@ intarray,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,ht
ior,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
iot,iot,Island of TeX,https://islandoftex.gitlab.io,https://gitlab.com/islandoftex/texmf,https://gitlab.com/groups/islandoftex/texmf/-/issues,2023-07-18,2023-07-18,
iow,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+istqb,istqb,Vít Starý Novotný,https://github.com/istqborg/istqb_product_base/,https://github.com/istqborg/istqb_product_base.git,https://github.com/istqborg/istqb_product_base/issues,2024-04-24,2024-04-24,
iwonamath,iwonamath,Boris Veytsman,https://github.com/borisveytsman/iwonamath,https://github.com/borisveytsman/iwonamath,https://github.com/borisveytsman/iwonamath/issues,2023-09-04,2023-09-04,
jiazhu,jiazhu,Qing Lee,https://github.com/CTeX-org/ctex-kit,https://github.com/CTeX-org/ctex-kit.git,https://github.com/CTeX-org/ctex-kit/issues,2020-05-17,2020-05-17,
job,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2021-04-23,2021-04-23,
+jsonparse,jsonparse,Jasper Habicht,https://github.com/jasperhabicht/jsonparse,https://github.com/jasperhabicht/jsonparse/jsponsparse.git,https://github.com/jasperhabicht/jsonparse/issues,2024-04-14,2024-04-14,
kernel,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
keys,"l3kernel,l3keys2e,ltkeys",The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
keyval,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
@@ -137,11 +140,11 @@ left,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https:
lltxmath,lualatex-math,Philipp Stephani,https://github.com/phst/lualatex-math,https://github.com/phst/lualatex-math.git,https://github.com/phst/lualatex-math/issues,2012-11-07,2012-11-07,
log,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
lua,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
-luabridge,lt3luabridge,Vít Novotný,https://ctan.org/pkg/lt3luabridge,https://github.com/witiko/lt3luabridge.git,https://github.com/witiko/lt3luabridge/issues,2022-06-25,2022-06-25,
+luabridge,lt3luabridge,Vít Starý Novotný,https://ctan.org/pkg/lt3luabridge,https://github.com/witiko/lt3luabridge.git,https://github.com/witiko/lt3luabridge/issues,2022-06-25,2024-04-24,
luatex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
lwc,lua-widow-control,Max Chernoff,https://github.com/gucci-on-fleek/lua-widow-control,https://github.com/gucci-on-fleek/lua-widow-control.git,https://github.com/gucci-on-fleek/lua-widow-control/issues,2022-02-24,2022-02-24,
mark,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
-markdown,markdown,Vít Novotný,https://ctan.org/pkg/markdown,https://github.com/witiko/markdown.git,https://github.com/witiko/markdown/issues,2021-09-08,2021-09-08,
+markdown,markdown,Vít Starý Novotný,https://ctan.org/pkg/markdown,https://github.com/witiko/markdown.git,https://github.com/witiko/markdown/issues,2021-09-08,2024-04-24,
marks,l3kernel/xmarks,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2020-02-17,2020-02-17,
marks,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2021-03-03,2021-03-03,
math,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
@@ -218,6 +221,7 @@ reverse,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,htt
right,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
rivbook,rivbook,Julien Rivaud,,,,2018-06-13,2018-06-14,
rivmath,rivmath,Julien Rivaud,,,,2018-06-13,2018-06-13,
+rpgicons,rpgicons,Jasper Habicht,https://github.com/jasperhabicht/rpgicons,https://github.com/jasperhabicht/rpgicons/rpgicons.git,https://github.com/jasperhabicht/rpgicons/issues,2024-04-29,2024-04-29,
sanuml,sanitize-umlaut,Thomas F. Sturm,https://github.com/T-F-S/sanitize-umlaut,https://github.com/T-F-S/sanitize-umlaut.git,https://github.com/T-F-S/sanitize-umlaut/issues,2022-07-19,2022-07-19,
scan,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
schulma,schulmathematik,Keno Wehr,https://ctan.org/pkg/schulmathematik,,,2021-08-23,2021-08-23,
@@ -275,6 +279,7 @@ vcoffin,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,htt
wheelchart,wheelchart,Matthias Floré,,,,2023-12-07,2023-12-07,
withargs,withargs,Michiel Helvensteijn,,,,2014-02-05,2014-02-05,
witharrows,witharrows,François Pantigny,,,,2019-12-19,2019-12-19,
+wstf,wrapstuff,Qing Lee,https://github.com/qinglee/wrapstuff,https://github.com/qinglee/wrapstuff.git,https://github.com/qinglee/wrapstuff/issues,2024-04-18,2024-04-18,
xeCJK,xecjk,Qing Lee,https://github.com/CTeX-org/ctex-kit,https://github.com/CTeX-org/ctex-kit.git,https://github.com/CTeX-org/ctex-kit/issues,2013-05-26,2013-05-26,
xetex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
xfrac,xfrac,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/xfrac.git,https://github.com/latex3/xfrac/issues,2012-09-27,2024-02-14,
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/required/l3kernel/l3prefixes.pdf
index 9b2e9b407e..0a721bca11 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/required/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.tex b/macros/latex/required/l3kernel/l3prefixes.tex
index 6c7cf24244..6c7cf24244 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.tex
+++ b/macros/latex/required/l3kernel/l3prefixes.tex
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/required/l3kernel/l3prg.dtx
index 8bbdd6a587..96ef859b3f 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/required/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/required/l3kernel/l3prop.dtx
index 878b9eb758..3350b27792 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/required/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -299,15 +299,27 @@
% codes are ignored.
% \end{function}
%
-% \begin{function}
+% \begin{function}[added = 2024-03-30, updated = 2024-05-07]
% {
-% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV,
-% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV,
-% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV,
-% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV
+% \prop_put_if_not_in:Nnn, \prop_put_if_not_in:NnV, \prop_put_if_not_in:Nnv, \prop_put_if_not_in:Nne,
+% \prop_put_if_not_in:NVn, \prop_put_if_not_in:NVV, \prop_put_if_not_in:NVv, \prop_put_if_not_in:NVe,
+% \prop_put_if_not_in:Nvn, \prop_put_if_not_in:NvV, \prop_put_if_not_in:Nvv, \prop_put_if_not_in:Nve,
+% \prop_put_if_not_in:Nen, \prop_put_if_not_in:NeV, \prop_put_if_not_in:Nev, \prop_put_if_not_in:Nee,
+% \prop_put_if_not_in:cnn, \prop_put_if_not_in:cnV, \prop_put_if_not_in:cnv, \prop_put_if_not_in:cne,
+% \prop_put_if_not_in:cVn, \prop_put_if_not_in:cVV, \prop_put_if_not_in:cVv, \prop_put_if_not_in:cVe,
+% \prop_put_if_not_in:cvn, \prop_put_if_not_in:cvV, \prop_put_if_not_in:cvv, \prop_put_if_not_in:cve,
+% \prop_put_if_not_in:cen, \prop_put_if_not_in:ceV, \prop_put_if_not_in:cev, \prop_put_if_not_in:cee,
+% \prop_gput_if_not_in:Nnn, \prop_gput_if_not_in:NnV, \prop_gput_if_not_in:Nnv, \prop_gput_if_not_in:Nne,
+% \prop_gput_if_not_in:NVn, \prop_gput_if_not_in:NVV, \prop_gput_if_not_in:NVv, \prop_gput_if_not_in:NVe,
+% \prop_gput_if_not_in:Nvn, \prop_gput_if_not_in:NvV, \prop_gput_if_not_in:Nvv, \prop_gput_if_not_in:Nve,
+% \prop_gput_if_not_in:Nen, \prop_gput_if_not_in:NeV, \prop_gput_if_not_in:Nev, \prop_gput_if_not_in:Nee,
+% \prop_gput_if_not_in:cnn, \prop_gput_if_not_in:cnV, \prop_gput_if_not_in:cnv, \prop_gput_if_not_in:cne,
+% \prop_gput_if_not_in:cVn, \prop_gput_if_not_in:cVV, \prop_gput_if_not_in:cVv, \prop_gput_if_not_in:cVe,
+% \prop_gput_if_not_in:cvn, \prop_gput_if_not_in:cvV, \prop_gput_if_not_in:cvv, \prop_gput_if_not_in:cve,
+% \prop_gput_if_not_in:cen, \prop_gput_if_not_in:ceV, \prop_gput_if_not_in:cev, \prop_gput_if_not_in:cee
% }
% \begin{syntax}
-% \cs{prop_put_if_new:Nnn} \meta{property list} \Arg{key} \Arg{value}
+% \cs{prop_put_if_not_in:Nnn} \meta{property list} \Arg{key} \Arg{value}
% \end{syntax}
% If the \meta{key} is present in the \meta{property list} then no
% action is taken. Otherwise, a new entry is added as described for
@@ -1358,7 +1370,7 @@
% in the linked case. If |#5| is |#3| itself we have to be careful
% not to lose the data, and we even take the opportunity to skip the
% copying step completely. To keep the correct version of the
-% duplicate keys we use the code underlying \cs{prop_put_if_new:Nnn},
+% duplicate keys we use the code underlying \cs{prop_put_if_not_in:Nnn},
% which involves passing \cs{use_none:nnn} to the auxiliary instead of
% nothing.
% There is no need to check for the case where |#3| is equal to~|#4|
@@ -1940,10 +1952,22 @@
% }
% \begin{macro}[tested = m3prop002]
% {
-% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV,
-% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV,
-% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV,
-% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV
+% \prop_put_if_not_in:Nnn, \prop_put_if_not_in:NnV, \prop_put_if_not_in:Nnv, \prop_put_if_not_in:Nne,
+% \prop_put_if_not_in:NVn, \prop_put_if_not_in:NVV, \prop_put_if_not_in:NVv, \prop_put_if_not_in:NVe,
+% \prop_put_if_not_in:Nvn, \prop_put_if_not_in:NvV, \prop_put_if_not_in:Nvv, \prop_put_if_not_in:Nve,
+% \prop_put_if_not_in:Nen, \prop_put_if_not_in:NeV, \prop_put_if_not_in:Nev, \prop_put_if_not_in:Nee,
+% \prop_put_if_not_in:cnn, \prop_put_if_not_in:cnV, \prop_put_if_not_in:cnv, \prop_put_if_not_in:cne,
+% \prop_put_if_not_in:cVn, \prop_put_if_not_in:cVV, \prop_put_if_not_in:cVv, \prop_put_if_not_in:cVe,
+% \prop_put_if_not_in:cvn, \prop_put_if_not_in:cvV, \prop_put_if_not_in:cvv, \prop_put_if_not_in:cve,
+% \prop_put_if_not_in:cen, \prop_put_if_not_in:ceV, \prop_put_if_not_in:cev, \prop_put_if_not_in:cee,
+% \prop_gput_if_not_in:Nnn, \prop_gput_if_not_in:NnV, \prop_gput_if_not_in:Nnv, \prop_gput_if_not_in:Nne,
+% \prop_gput_if_not_in:NVn, \prop_gput_if_not_in:NVV, \prop_gput_if_not_in:NVv, \prop_gput_if_not_in:NVe,
+% \prop_gput_if_not_in:Nvn, \prop_gput_if_not_in:NvV, \prop_gput_if_not_in:Nvv, \prop_gput_if_not_in:Nve,
+% \prop_gput_if_not_in:Nen, \prop_gput_if_not_in:NeV, \prop_gput_if_not_in:Nev, \prop_gput_if_not_in:Nee,
+% \prop_gput_if_not_in:cnn, \prop_gput_if_not_in:cnV, \prop_gput_if_not_in:cnv, \prop_gput_if_not_in:cne,
+% \prop_gput_if_not_in:cVn, \prop_gput_if_not_in:cVV, \prop_gput_if_not_in:cVv, \prop_gput_if_not_in:cVe,
+% \prop_gput_if_not_in:cvn, \prop_gput_if_not_in:cvV, \prop_gput_if_not_in:cvv, \prop_gput_if_not_in:cve,
+% \prop_gput_if_not_in:cen, \prop_gput_if_not_in:ceV, \prop_gput_if_not_in:cev, \prop_gput_if_not_in:cee
% }
% \begin{macro}[tested = m3prop002]
% {
@@ -1965,17 +1989,17 @@
% auxiliary to skip this checking step and avoid getting multiple
% error messages for the same error.
% The \meta{code} (empty for |put| and \cs{use_none:nnn} for
-% |put_if_new|) is placed before the assignment in cases where the key
+% |put_if_not_in|) is placed before the assignment in cases where the key
% is already present, in order to suppress the assignment in the
-% |put_if_new| case.
+% |put_if_not_in| case.
% \begin{macrocode}
\cs_new_protected:Npn \prop_put:Nnn
{ \@@_put:nNNnn { } \cs_set_nopar:Npe }
\cs_new_protected:Npn \prop_gput:Nnn
{ \@@_put:nNNnn { } \cs_gset_nopar:Npe }
-\cs_new_protected:Npn \prop_put_if_new:Nnn
+\cs_new_protected:Npn \prop_put_if_not_in:Nnn
{ \@@_put:nNNnn \use_none:nnn \cs_set_nopar:Npe }
-\cs_new_protected:Npn \prop_gput_if_new:Nnn
+\cs_new_protected:Npn \prop_gput_if_not_in:Nnn
{ \@@_put:nNNnn \use_none:nnn \cs_gset_nopar:Npe }
\cs_generate_variant:Nn \prop_put:Nnn
{
@@ -2005,10 +2029,20 @@
}
\cs_generate_variant:Nn \prop_gput:Nnn
{ cno , co , coo , cnx , cVx , cxV , cxx }
-\cs_generate_variant:Nn \prop_put_if_new:Nnn
- { NnV , NV , cnV , cV }
-\cs_generate_variant:Nn \prop_gput_if_new:Nnn
- { NnV , NV , cnV , cV }
+\cs_generate_variant:Nn \prop_put_if_not_in:Nnn
+ {
+ NnV , Nnv , Nne , NV , NVV , NVv , NVe ,
+ Nv , NvV , Nvv , Nve , Ne , NeV , Nev , Nee ,
+ c , cnV , cnv , cne , cV , cVV , cVv , cVe ,
+ cv , cvV , cvv , cve , ce , ceV , cev , cee
+ }
+\cs_generate_variant:Nn \prop_gput_if_not_in:Nnn
+ {
+ NnV , Nnv , Nne , NV , NVV , NVv , NVe ,
+ Nv , NvV , Nvv , Nve , Ne , NeV , Nev , Nee ,
+ c , cnV , cnv , cne , cV , cVV , cVv , cVe ,
+ cv , cvV , cvv , cve , ce , ceV , cev , cee
+ }
% \end{macrocode}
% Since the true branch of \cs{@@_split:NnTFn} is used as the
% replacement text of an internal macro, and since the \meta{key} and
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/required/l3kernel/l3quark.dtx
index 000063bc00..c989bd4024 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/required/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/required/l3kernel/l3regex.dtx
index 395be76907..ad44b8c6f9 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/required/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -2047,9 +2047,9 @@
% phase. Compiled regular expressions consist of the following:
% \begin{itemize}
% \item \cs{@@_class:NnnnN} \meta{boolean} \Arg{tests} \Arg{min}
-% \Arg{more} \meta{lazyness}
+% \Arg{more} \meta{laziness}
% \item \cs{@@_group:nnnN} \Arg{branches} \Arg{min} \Arg{more}
-% \meta{lazyness}, also \cs{@@_group_no_capture:nnnN} and
+% \meta{laziness}, also \cs{@@_group_no_capture:nnnN} and
% \cs{@@_group_resetting:nnnN} with the same syntax.
% \item \cs{@@_branch:n} \Arg{contents}
% \item \cs{@@_command_K:}
@@ -2638,7 +2638,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_compile_quantifier_lazyness:nnNN}
+% \begin{macro}{\@@_compile_quantifier_laziness:nnNN}
% Once the \enquote{main} quantifier (\texttt{?}, \texttt{*},
% \texttt{+} or a braced construction) is found, we check whether it
% is lazy (followed by a question mark). We then add to the compiled
@@ -2646,7 +2646,7 @@
% the start-point of the range, its end-point, and a boolean,
% \texttt{true} for lazy and \texttt{false} for greedy operators.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_compile_quantifier_lazyness:nnNN #1#2#3#4
+\cs_new_protected:Npn \@@_compile_quantifier_laziness:nnNN #1#2#3#4
{
\@@_two_if_eq:NNNNTF #3 #4 \@@_compile_special:N ?
{
@@ -2669,15 +2669,15 @@
% \@@_compile_quantifier_+:w
% }
% For each \enquote{basic} quantifier, |?|, |*|, |+|, feed the correct
-% arguments to \cs{@@_compile_quantifier_lazyness:nnNN}, $-1$ means
+% arguments to \cs{@@_compile_quantifier_laziness:nnNN}, $-1$ means
% that there is no upper bound on the number of repetitions.
% \begin{macrocode}
\cs_new_protected:cpn { @@_compile_quantifier_?:w }
- { \@@_compile_quantifier_lazyness:nnNN { 0 } { 1 } }
+ { \@@_compile_quantifier_laziness:nnNN { 0 } { 1 } }
\cs_new_protected:cpn { @@_compile_quantifier_*:w }
- { \@@_compile_quantifier_lazyness:nnNN { 0 } { -1 } }
+ { \@@_compile_quantifier_laziness:nnNN { 0 } { -1 } }
\cs_new_protected:cpn { @@_compile_quantifier_+:w }
- { \@@_compile_quantifier_lazyness:nnNN { 1 } { -1 } }
+ { \@@_compile_quantifier_laziness:nnNN { 1 } { -1 } }
% \end{macrocode}
% \end{macro}
%
@@ -2711,7 +2711,7 @@
{
{ \@@_compile_special:N \c_right_brace_str }
{
- \exp_args:No \@@_compile_quantifier_lazyness:nnNN
+ \exp_args:No \@@_compile_quantifier_laziness:nnNN
{ \int_use:N \l_@@_internal_a_int } 0
}
{ \@@_compile_special:N , }
@@ -2731,7 +2731,7 @@
{
\@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N \c_right_brace_str
{
- \exp_args:No \@@_compile_quantifier_lazyness:nnNN
+ \exp_args:No \@@_compile_quantifier_laziness:nnNN
{ \int_use:N \l_@@_internal_a_int } { -1 }
}
{
@@ -2753,7 +2753,7 @@
\else:
\int_sub:Nn \l_@@_internal_b_int \l_@@_internal_a_int
\fi:
- \exp_args:Noo \@@_compile_quantifier_lazyness:nnNN
+ \exp_args:Noo \@@_compile_quantifier_laziness:nnNN
{ \int_use:N \l_@@_internal_a_int }
{ \int_use:N \l_@@_internal_b_int }
}
@@ -4517,13 +4517,13 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_build_transitions_lazyness:NNNNN}
+% \begin{macro}{\@@_build_transitions_laziness:NNNNN}
% This function creates a new state, and puts two transitions starting
% from the old current state. The order of the transitions is
% controlled by |#1|, true for lazy quantifiers, and false for greedy
% quantifiers.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_build_transitions_lazyness:NNNNN #1#2#3#4#5
+\cs_new_protected:Npn \@@_build_transitions_laziness:NNNNN #1#2#3#4#5
{
\@@_build_new_state:
\@@_toks_put_right:Ne \l_@@_left_state_int
@@ -4545,7 +4545,7 @@
% \begin{macro}{\@@_class:NnnnN}
% \begin{macro}[rEXP]{\@@_tests_action_cost:n}
% The arguments are: \meta{boolean} \Arg{tests} \Arg{min} \Arg{more}
-% \meta{lazyness}. First store the tests with a trailing
+% \meta{laziness}. First store the tests with a trailing
% \cs{@@_action_cost:n}, in the true branch of
% \cs{@@_break_point:TF} for positive classes, or the false branch
% for negative classes. The integer \meta{more} is $0$ for fixed
@@ -4599,18 +4599,18 @@
% \cs{@@_class_repeat:n} for the code to match |#1| repetitions,
% and add free transitions from the last state to the previous one,
% and to a new one. In both cases, the order of transitions is
-% controlled by the lazyness boolean |#2|.
+% controlled by the laziness boolean |#2|.
% \begin{macrocode}
\cs_new_protected:Npn \@@_class_repeat:nN #1#2
{
\if_int_compare:w #1 = \c_zero_int
- \@@_build_transitions_lazyness:NNNNN #2
+ \@@_build_transitions_laziness:NNNNN #2
\@@_action_free:n \l_@@_right_state_int
\@@_tests_action_cost:n \l_@@_left_state_int
\else:
\@@_class_repeat:n {#1}
\int_set_eq:NN \l_@@_internal_a_int \l_@@_left_state_int
- \@@_build_transitions_lazyness:NNNNN #2
+ \@@_build_transitions_laziness:NNNNN #2
\@@_action_free:n \l_@@_right_state_int
\@@_action_free:n \l_@@_internal_a_int
\fi:
@@ -4634,7 +4634,7 @@
{ \l_@@_max_state_int + #2 - \c_one_int }
\prg_replicate:nn { #2 }
{
- \@@_build_transitions_lazyness:NNNNN #3
+ \@@_build_transitions_laziness:NNNNN #3
\@@_action_free:n \l_@@_internal_a_int
\@@_tests_action_cost:n \l_@@_right_state_int
}
@@ -4646,7 +4646,7 @@
%
% \begin{macro}{\@@_group_aux:nnnnN}
% Arguments: \Arg{label} \Arg{contents} \Arg{min} \Arg{more}
-% \meta{lazyness}. If \meta{min} is $0$, we need to add a state before
+% \meta{laziness}. If \meta{min} is $0$, we need to add a state before
% building the group, so that the thread which skips the group does
% not also set the start-point of the submatch. After adding one more
% state, the \texttt{left_state} is the left end of the group, from
@@ -4656,7 +4656,7 @@
% build the \textsc{nfa} states for the contents |#2| of the group,
% and we forget about the two integers. Once this is done, perform the
% repetition: either exactly |#3| times, or |#3| or more times, or
-% between |#3| and $|#3|+|#4|$ times, with lazyness |#5|. The
+% between |#3| and $|#3|+|#4|$ times, with laziness |#5|. The
% \meta{label} |#1| is used for submatch tracking. Each of the three
% auxiliaries expects \texttt{left_state} and \texttt{right_state} to
% be set properly.
@@ -4884,7 +4884,7 @@
%
% \begin{macro}{\@@_group_repeat:nnnN}
% We wish to repeat the group between |#2| and $|#2|+|#3|$ times, with
-% a lazyness controlled by |#4|. We insert submatch tracking up front:
+% a laziness controlled by |#4|. We insert submatch tracking up front:
% in principle, we could avoid recording submatches for the first |#2|
% copies of the group, but that forces us to treat specially the case
% $|#2|=0$. Repeat that group with submatch tracking $|#2|+|#3|$ times
@@ -8076,7 +8076,7 @@
% This is not technically a message, but seems related enough to go
% there. The arguments are: |#1| is the minimum number of repetitions;
% |#2| is the number of allowed extra repetitions ($-1$ for infinite
-% number), and |#3| tells us about lazyness.
+% number), and |#3| tells us about laziness.
% \begin{macrocode}
\cs_new:Npn \@@_msg_repeated:nnN #1#2#3
{
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/required/l3kernel/l3seq.dtx
index 5334e8fd88..713e4a33b1 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/required/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -1690,7 +1690,7 @@
}
% \end{macrocode}
% If the position is ok, \cs{@@_set_item:nNnnNNNN} makes the assignment
-% and returns \texttt{true} (in the case of conditionnals). Here |#1|
+% and returns \texttt{true} (in the case of conditionals). Here |#1|
% is an integer expression (position minus one), it needs to be
% evaluated. The sequence |#5| starts with \cs{s_@@} (even if empty),
% which stops the integer expression and is absorbed by it. The
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/required/l3kernel/l3skip.dtx
index 1839c8a2e5..3eeb891e3d 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/required/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/required/l3kernel/l3sort.dtx
index 818f605e07..9ba8713244 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/required/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/required/l3kernel/l3str-convert.dtx
index be850b3109..0b280fb109 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/required/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/required/l3kernel/l3str.dtx
index 88ad33c74b..d4e08b2dd2 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/required/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/required/l3kernel/l3styleguide.pdf
index 322b032a67..33333f832f 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/required/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/required/l3kernel/l3styleguide.tex
index a2ffe8d770..2cffd774e3 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/required/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2024-03-14}
+\date{Released 2024-05-08}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/required/l3kernel/l3syntax-changes.pdf
index 2a701d8ec5..64bf0da4e8 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/required/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/required/l3kernel/l3syntax-changes.tex
index 7e124576c7..0b21c09da0 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/required/l3kernel/l3syntax-changes.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2024-03-14}
+\date{Released 2024-05-08}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/required/l3kernel/l3sys.dtx
index feec1232fd..0417a963bc 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/required/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -333,7 +333,7 @@
% not directly available within the \TeX{} run. Note that if restricted
% shell escape is disabled, no results can be obtained.
%
-% \begin{function}[added = 2024-03-08]
+% \begin{function}[added = 2024-03-08, updated = 2024-04-08]
% {\sys_get_query:nN, \sys_get_query:nnN, \sys_get_query:nnnN}
% \begin{syntax}
% \cs{sys_get_query:nN} \Arg{cmd} \Arg{tl var}
@@ -357,6 +357,14 @@
% The \meta{spec} and \meta{options}, if given, are expanded fully
% before passing to the underlying script.
%
+% Spaces in the output are stored as active tokens, allowing them to be
+% replaced by for example a visible space easily. Other non-letter
+% characters in the ASCII range are set to category code~12. The category
+% codes for characters out of the ASCII range are left unchanged: typically
+% this will mean that with an 8-bit engine, accented values can be typeset
+% directly whilst in Unicode engines, standard category code setup will
+% apply.
+%
% If more than one line of text is returned by the \meta{cmd}, these will be
% separated by character~13 (|^^M|) tokens of category code~12. In most
% cases, \cs{sys_split_query:nnnN} should be preferred when multi-line
@@ -1161,7 +1169,7 @@ end
{ \sys_get_query:nnnN {#1} { } {#2} #3 }
\cs_new_protected:Npn \sys_get_query:nnnN #1#2#3#4
{
- \str_clear:N #4
+ \tl_clear:N #4
\@@_get_query_auxi:neeN {#1} {#2} {#3} #4
}
\cs_new:Npn \@@_get_query_auxi:nnnN #1#2#3#4
@@ -1187,10 +1195,13 @@ end
\sys_get_shell:nnN
{ l3sys-query~#1 #2 #3 }
{
- \int_step_inline:nnn { 0 } { `a - 1 }
+ \int_step_inline:nnn { 0 } { `A - 1 }
+ { \char_set_catcode_other:n {##1} }
+ \int_step_inline:nnn { `Z + 1 } { `a - 1 }
{ \char_set_catcode_other:n {##1} }
- \int_step_inline:nnn { `Z + 1 } { 127 }
+ \int_step_inline:nnn { `z + 1 } { 127 }
{ \char_set_catcode_other:n {##1} }
+ \char_set_catcode_active:n { `\ }
\tex_endlinechar:D 13 \scan_stop:
}
\l_@@_tmp_tl
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/required/l3kernel/l3term-glossary.pdf
index 93def3980b..b54a47f899 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/required/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/required/l3kernel/l3term-glossary.tex
index 5db9e83a45..86ad15568a 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/required/l3kernel/l3term-glossary.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2024-03-14}
+\date{Released 2024-05-08}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/required/l3kernel/l3text-case.dtx
index 0547db28b1..888e6e97b9 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/required/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -1919,7 +1919,7 @@
% \end{macrocode}
% If there was a hit, output the result with the dot-above and move on.
% Otherwise, look for one of the three letters that can take a combining
-% accent: I, J nd I-ogonek.
+% accent: I, J, and I-ogonek.
% \begin{macrocode}
\cs_new:Npn \@@_change_case_lower_lt_auxi:nnnnn #1#2#3#4#5
{
diff --git a/macros/latex/contrib/l3kernel/l3text-map.dtx b/macros/latex/required/l3kernel/l3text-map.dtx
index d364c32199..ab4a6db91e 100644
--- a/macros/latex/contrib/l3kernel/l3text-map.dtx
+++ b/macros/latex/required/l3kernel/l3text-map.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/required/l3kernel/l3text-purify.dtx
index 8f92c1eae9..ec85eb8be4 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/required/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/required/l3kernel/l3text.dtx
index 5feff565b9..a59e047bd7 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/required/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -887,7 +887,7 @@
% {\c_@@_chardef_group_begin_token, \c_@@_mathchardef_group_begin_token}
% \begin{variable}
% {\c_@@_chardef_group_end_token, \c_@@_mathchardef_group_end_token}
-% Markers for implict char handling.
+% Markers for implicit char handling.
% \begin{macrocode}
\tex_global:D \tex_chardef:D \c_@@_chardef_space_token = `\ %
\tex_global:D \tex_mathchardef:D \c_@@_mathchardef_space_token = `\ %
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/required/l3kernel/l3tl-analysis.dtx
index d965050c76..80a7d74cef 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/required/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl-build.dtx b/macros/latex/required/l3kernel/l3tl-build.dtx
index 175b7bc24f..708ea81680 100644
--- a/macros/latex/contrib/l3kernel/l3tl-build.dtx
+++ b/macros/latex/required/l3kernel/l3tl-build.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -73,7 +73,8 @@
% \end{syntax}
% Clears the \meta{tl~var} and sets it up to support other
% \cs[no-index]{tl_build_\ldots{}} functions. Until \cs{tl_build_end:N}
-% \meta{tl~var} is called, applying any function from \pkg{l3tl} other
+% \meta{tl~var} or \cs{tl_build_gend:N} \meta{tl~var} is called,
+% applying any function from \pkg{l3tl} other
% than \cs[no-index]{tl_build_\ldots{}} will lead to incorrect
% results. The |begin| and |gbegin| functions must be used for local
% and global \meta{tl~var} respectively.
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/required/l3kernel/l3tl.dtx
index 0938e7cd5e..940b3cb8d0 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/required/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -3339,7 +3339,7 @@
% }
% \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:}
+% be preceded 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
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/required/l3kernel/l3token.dtx
index cd538ee6d0..5c31ab04e7 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/required/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -2298,7 +2298,7 @@
% 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.
+% command code for the token and compares 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.
%
@@ -2345,11 +2345,11 @@ do
[cmd'outer_call' or cmd'tolerant_call'] = true,
[cmd'long_outer_call' or cmd'tolerant_protected_call'] = true,
[cmd'assign_glue' or cmd'register_glue'] = index_not_nil,
- [cmd'assign_mu_glue' or cmd'register_mu_glue'] = index_not_nil,
+ [cmd'assign_mu_glue' or cmd'register_mu_glue' or cmd'register_muglue'] = index_not_nil,
[cmd'assign_toks' or cmd'register_toks'] = index_not_nil,
- [cmd'assign_int' or cmd'register_int'] = index_not_nil,
+ [cmd'assign_int' or cmd'register_int' or cmd'register_integer'] = index_not_nil,
[cmd'assign_attr' or cmd'register_attribute'] = true,
- [cmd'assign_dimen' or cmd'register_dimen'] = index_not_nil,
+ [cmd'assign_dimen' or cmd'register_dimen' or cmd'register_dimension'] = index_not_nil,
}
luacmd("@@_if_primitive_lua:N", function()
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/required/l3kernel/l3unicode.dtx
index cd552800b0..3b3bd007a4 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/required/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2024-03-14}
+% \date{Released 2024-05-08}
%
% \maketitle
%
@@ -52,7 +52,7 @@
% This module provides Unicode-specific functions along with loading data
% from a range of Unicode Consortium files. Most of the code here is
% internal, but there are a small set of public functions. These work with
-% Unicode \meta{codepoints} and are designed to give useable results with
+% Unicode \meta{codepoints} and are designed to give usable results with
% both Unicode-aware and $8$-bit engines.
%
% \begin{function}[EXP, added = 2022-10-09, updated = 2022-11-09]
@@ -82,7 +82,7 @@
% range, the generated character tokens will be active (category code
% $13$); for codepoints in the ASCII range, the given \meta{catcode}
% will be used. To allow the result of this function to be used
-% inside a expansion context, the result is protected by \cs{exp_not:n}.
+% inside an expansion context, the result is protected by \cs{exp_not:n}.
%
% \begin{texnote}
% Users of (u)p\TeX{} note that these engines are treated as $8$-bit in
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/required/l3kernel/source3.pdf
index c6a6396503..77c8b81892 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/required/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/required/l3kernel/source3.tex
index c09d75767b..623b9cc1a0 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/required/l3kernel/source3.tex
@@ -57,7 +57,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2024-03-14}
+\date{Released 2024-05-08}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/required/l3kernel/source3body.tex
index 8471296227..8471296227 100644
--- a/macros/latex/contrib/l3kernel/source3body.tex
+++ b/macros/latex/required/l3kernel/source3body.tex