diff options
483 files changed, 30137 insertions, 5558 deletions
diff --git a/FILES.byname b/FILES.byname index e7a5bd999e..596606f4e0 100644 --- a/FILES.byname +++ b/FILES.byname @@ -2147,12 +2147,12 @@ 2024/10/05 | 1837 | biblio/citation-style-language/README.md 2024/10/05 | 12878 | biblio/citation-style-language/vancouver.csl 2024/10/05 | 4673585 | biblio/citation-style-language.zip -2024/10/31 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2024/11/01 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx -2024/10/31 | 2896295 | biblio/ctan-bibdata/ctan.bib -2024/10/31 | 3790528 | biblio/ctan-bibdata/ctan.pdf +2024/11/01 | 2896242 | biblio/ctan-bibdata/ctan.bib +2024/11/01 | 3790528 | biblio/ctan-bibdata/ctan.pdf 2023/01/16 | 1489 | biblio/ctan-bibdata/README -2024/10/31 | 4207713 | biblio/ctan-bibdata.zip +2024/11/01 | 4207758 | biblio/ctan-bibdata.zip 2023/02/23 | 3126 | biblio/pbibtex/pbibtex-base/cpp.awk 2023/02/23 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh 2023/02/23 | 22362 | biblio/pbibtex/pbibtex-base/jabbrv.bst @@ -5514,7 +5514,7 @@ 1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp 1990/10/02 | 812 | dviware/vutex/vaxvms.ins 1990/10/02 | 127576 | dviware/vutex/vutex.web -2024/10/31 | 160266 | FILES.last07days +2024/11/01 | 158430 | FILES.last07days 2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs 2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf 2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf @@ -88388,69 +88388,74 @@ 2013/03/04 | 692 | fonts/nanumtype1/vf/ts1nanummjmo.vf 2013/03/04 | 684 | fonts/nanumtype1/vf/ts1nanummjm.vf 2013/03/25 | 30424476 | fonts/nanumtype1.zip -2024/07/27 | 4972 | fonts/newcomputermodern/doc/colored-diacritics.pdf -2024/07/27 | 655 | fonts/newcomputermodern/doc/colored-diacritics.tex -2024/07/27 | 6102 | fonts/newcomputermodern/doc/integral.pdf -2024/07/27 | 191 | fonts/newcomputermodern/doc/integral.tex -2024/09/06 | 338383 | fonts/newcomputermodern/doc/newcm-doc.pdf -2024/09/06 | 64292 | fonts/newcomputermodern/doc/newcm-doc.tex -2024/07/27 | 16144 | fonts/newcomputermodern/doc/newcm-unimath-symbols.ltx -2024/07/27 | 1303962 | fonts/newcomputermodern/doc/newcm-unimath-symbols.pdf -2024/07/27 | 141279 | fonts/newcomputermodern/doc/newcomputermodern-sample.pdf -2024/07/27 | 8015 | fonts/newcomputermodern/doc/newcomputermodern-sample.tex -2024/07/27 | 6423 | fonts/newcomputermodern/doc/opticalmathlm-cropped.pdf -2024/07/27 | 3888 | fonts/newcomputermodern/doc/opticalmathlm.pdf -2024/07/27 | 205 | fonts/newcomputermodern/doc/opticalmathlm.tex -2024/08/09 | 648708 | fonts/newcomputermodern/otf/NewCM08-BookItalic.otf -2024/08/25 | 627652 | fonts/newcomputermodern/otf/NewCM08-Book.otf -2024/08/09 | 336620 | fonts/newcomputermodern/otf/NewCM08Devanagari-Book.otf -2024/08/09 | 326428 | fonts/newcomputermodern/otf/NewCM08Devanagari-Regular.otf -2024/08/09 | 578420 | fonts/newcomputermodern/otf/NewCM08-Italic.otf -2024/08/25 | 547804 | fonts/newcomputermodern/otf/NewCM08-Regular.otf -2024/08/09 | 468252 | fonts/newcomputermodern/otf/NewCM10-BoldItalic.otf -2024/08/25 | 520928 | fonts/newcomputermodern/otf/NewCM10-Bold.otf -2024/08/09 | 576212 | fonts/newcomputermodern/otf/NewCM10-BookItalic.otf -2024/08/25 | 615400 | fonts/newcomputermodern/otf/NewCM10-Book.otf -2024/08/09 | 324804 | fonts/newcomputermodern/otf/NewCM10Devanagari-Bold.otf -2024/08/09 | 322328 | fonts/newcomputermodern/otf/NewCM10Devanagari-Book.otf -2024/08/09 | 344220 | fonts/newcomputermodern/otf/NewCM10Devanagari-Regular.otf -2024/08/09 | 610008 | fonts/newcomputermodern/otf/NewCM10-Italic.otf -2024/08/25 | 590292 | fonts/newcomputermodern/otf/NewCM10-Regular.otf -2024/09/06 | 1071856 | fonts/newcomputermodern/otf/NewCMMath-Bold.otf -2024/09/06 | 1267908 | fonts/newcomputermodern/otf/NewCMMath-Book.otf -2024/09/06 | 1138628 | fonts/newcomputermodern/otf/NewCMMath-Regular.otf -2024/08/09 | 685256 | fonts/newcomputermodern/otf/NewCMMono10-BoldOblique.otf -2024/08/09 | 327480 | fonts/newcomputermodern/otf/NewCMMono10-Bold.otf -2024/08/09 | 524128 | fonts/newcomputermodern/otf/NewCMMono10-BookItalic.otf -2024/08/09 | 452232 | fonts/newcomputermodern/otf/NewCMMono10-Book.otf -2024/08/09 | 432560 | fonts/newcomputermodern/otf/NewCMMono10-Italic.otf -2024/08/09 | 364708 | fonts/newcomputermodern/otf/NewCMMono10-Regular.otf -2024/08/09 | 417264 | fonts/newcomputermodern/otf/NewCMSans08-BookOblique.otf -2024/08/09 | 495036 | fonts/newcomputermodern/otf/NewCMSans08-Book.otf -2024/08/09 | 383932 | fonts/newcomputermodern/otf/NewCMSans08-Oblique.otf -2024/08/09 | 483420 | fonts/newcomputermodern/otf/NewCMSans08-Regular.otf -2024/08/09 | 411756 | fonts/newcomputermodern/otf/NewCMSans10-BoldOblique.otf -2024/08/09 | 441000 | fonts/newcomputermodern/otf/NewCMSans10-Bold.otf -2024/08/09 | 464228 | fonts/newcomputermodern/otf/NewCMSans10-BookOblique.otf -2024/08/09 | 504476 | fonts/newcomputermodern/otf/NewCMSans10-Book.otf -2024/08/09 | 376740 | fonts/newcomputermodern/otf/NewCMSans10-Oblique.otf -2024/08/09 | 463244 | fonts/newcomputermodern/otf/NewCMSans10-Regular.otf -2024/08/09 | 22368 | fonts/newcomputermodern/otf/NewCMUncial08-Bold.otf -2024/08/09 | 23208 | fonts/newcomputermodern/otf/NewCMUncial08-Book.otf -2024/08/09 | 22472 | fonts/newcomputermodern/otf/NewCMUncial08-Regular.otf -2024/08/09 | 21084 | fonts/newcomputermodern/otf/NewCMUncial10-Bold.otf -2024/08/09 | 22888 | fonts/newcomputermodern/otf/NewCMUncial10-Book.otf -2024/08/09 | 30292 | fonts/newcomputermodern/otf/NewCMUncial10-Regular.otf -2024/08/09 | 15636 | fonts/newcomputermodern/README -2024/09/06 | 16143636 | fonts/newcomputermodern/source.txz -2024/07/27 | 1014 | fonts/newcomputermodern/tex/NewCM10-Book.fontspec -2024/07/27 | 1034 | fonts/newcomputermodern/tex/NewCM10-Regular.fontspec -2024/07/27 | 232 | fonts/newcomputermodern/tex/NewCMMono10-Book.fontspec -2024/07/27 | 234 | fonts/newcomputermodern/tex/NewCMMono10-Regular.fontspec -2024/07/27 | 887 | fonts/newcomputermodern/tex/NewCMSans10-Book.fontspec -2024/07/27 | 886 | fonts/newcomputermodern/tex/NewCMSans10-Regular.fontspec -2024/08/09 | 514 | fonts/newcomputermodern/tex/newcomputermodern.sty -2024/09/08 | 29179842 | fonts/newcomputermodern.zip +2024/10/31 | 4972 | fonts/newcomputermodern/doc/colored-diacritics.pdf +2024/10/31 | 655 | fonts/newcomputermodern/doc/colored-diacritics.tex +2024/10/31 | 6102 | fonts/newcomputermodern/doc/integral.pdf +2024/10/31 | 191 | fonts/newcomputermodern/doc/integral.tex +2024/10/31 | 9503 | fonts/newcomputermodern/doc/mathkern-example.pdf +2024/10/31 | 616 | fonts/newcomputermodern/doc/mathkern-example.tex +2024/11/01 | 371398 | fonts/newcomputermodern/doc/newcm-doc.pdf +2024/11/01 | 69041 | fonts/newcomputermodern/doc/newcm-doc.tex +2024/10/31 | 16144 | fonts/newcomputermodern/doc/newcm-unimath-symbols.ltx +2024/10/31 | 1303962 | fonts/newcomputermodern/doc/newcm-unimath-symbols.pdf +2024/10/31 | 141279 | fonts/newcomputermodern/doc/newcomputermodern-sample.pdf +2024/10/31 | 8015 | fonts/newcomputermodern/doc/newcomputermodern-sample.tex +2024/10/31 | 6423 | fonts/newcomputermodern/doc/opticalmathlm-cropped.pdf +2024/10/31 | 3888 | fonts/newcomputermodern/doc/opticalmathlm.pdf +2024/10/31 | 205 | fonts/newcomputermodern/doc/opticalmathlm.tex +2024/11/01 | 147755 | fonts/newcomputermodern/doc/testmath-newcm-sans.pdf +2024/11/01 | 81234 | fonts/newcomputermodern/doc/testmath-newcm-sans.tex +2024/10/31 | 649120 | fonts/newcomputermodern/otf/NewCM08-BookItalic.otf +2024/10/31 | 627888 | fonts/newcomputermodern/otf/NewCM08-Book.otf +2024/10/31 | 336624 | fonts/newcomputermodern/otf/NewCM08Devanagari-Book.otf +2024/10/31 | 326432 | fonts/newcomputermodern/otf/NewCM08Devanagari-Regular.otf +2024/10/31 | 579396 | fonts/newcomputermodern/otf/NewCM08-Italic.otf +2024/10/31 | 548340 | fonts/newcomputermodern/otf/NewCM08-Regular.otf +2024/10/31 | 468928 | fonts/newcomputermodern/otf/NewCM10-BoldItalic.otf +2024/10/31 | 521544 | fonts/newcomputermodern/otf/NewCM10-Bold.otf +2024/10/31 | 577560 | fonts/newcomputermodern/otf/NewCM10-BookItalic.otf +2024/10/31 | 615784 | fonts/newcomputermodern/otf/NewCM10-Book.otf +2024/10/31 | 324808 | fonts/newcomputermodern/otf/NewCM10Devanagari-Bold.otf +2024/10/31 | 322264 | fonts/newcomputermodern/otf/NewCM10Devanagari-Book.otf +2024/10/31 | 344172 | fonts/newcomputermodern/otf/NewCM10Devanagari-Regular.otf +2024/10/31 | 611648 | fonts/newcomputermodern/otf/NewCM10-Italic.otf +2024/10/31 | 590532 | fonts/newcomputermodern/otf/NewCM10-Regular.otf +2024/10/31 | 1071712 | fonts/newcomputermodern/otf/NewCMMath-Bold.otf +2024/10/31 | 1277256 | fonts/newcomputermodern/otf/NewCMMath-Book.otf +2024/10/31 | 1149908 | fonts/newcomputermodern/otf/NewCMMath-Regular.otf +2024/10/31 | 685888 | fonts/newcomputermodern/otf/NewCMMono10-BoldOblique.otf +2024/10/31 | 328112 | fonts/newcomputermodern/otf/NewCMMono10-Bold.otf +2024/10/31 | 528968 | fonts/newcomputermodern/otf/NewCMMono10-BookItalic.otf +2024/10/31 | 452884 | fonts/newcomputermodern/otf/NewCMMono10-Book.otf +2024/10/31 | 433204 | fonts/newcomputermodern/otf/NewCMMono10-Italic.otf +2024/10/31 | 365360 | fonts/newcomputermodern/otf/NewCMMono10-Regular.otf +2024/10/31 | 417988 | fonts/newcomputermodern/otf/NewCMSans08-BookOblique.otf +2024/10/31 | 495808 | fonts/newcomputermodern/otf/NewCMSans08-Book.otf +2024/10/31 | 384680 | fonts/newcomputermodern/otf/NewCMSans08-Oblique.otf +2024/10/31 | 484156 | fonts/newcomputermodern/otf/NewCMSans08-Regular.otf +2024/10/31 | 412360 | fonts/newcomputermodern/otf/NewCMSans10-BoldOblique.otf +2024/10/31 | 441708 | fonts/newcomputermodern/otf/NewCMSans10-Bold.otf +2024/10/31 | 464940 | fonts/newcomputermodern/otf/NewCMSans10-BookOblique.otf +2024/10/31 | 505052 | fonts/newcomputermodern/otf/NewCMSans10-Book.otf +2024/10/31 | 378916 | fonts/newcomputermodern/otf/NewCMSans10-Oblique.otf +2024/10/31 | 463956 | fonts/newcomputermodern/otf/NewCMSans10-Regular.otf +2024/10/31 | 877364 | fonts/newcomputermodern/otf/NewCMSansMath-Regular.otf +2024/10/31 | 22372 | fonts/newcomputermodern/otf/NewCMUncial08-Bold.otf +2024/10/31 | 23212 | fonts/newcomputermodern/otf/NewCMUncial08-Book.otf +2024/10/31 | 22472 | fonts/newcomputermodern/otf/NewCMUncial08-Regular.otf +2024/10/31 | 21088 | fonts/newcomputermodern/otf/NewCMUncial10-Bold.otf +2024/10/31 | 22892 | fonts/newcomputermodern/otf/NewCMUncial10-Book.otf +2024/10/31 | 30296 | fonts/newcomputermodern/otf/NewCMUncial10-Regular.otf +2024/11/01 | 16618 | fonts/newcomputermodern/README +2024/11/01 | 17014544 | fonts/newcomputermodern/source.txz +2024/10/15 | 1014 | fonts/newcomputermodern/tex/NewCM10-Book.fontspec +2024/10/15 | 1034 | fonts/newcomputermodern/tex/NewCM10-Regular.fontspec +2024/10/15 | 232 | fonts/newcomputermodern/tex/NewCMMono10-Book.fontspec +2024/10/15 | 234 | fonts/newcomputermodern/tex/NewCMMono10-Regular.fontspec +2024/10/15 | 887 | fonts/newcomputermodern/tex/NewCMSans10-Book.fontspec +2024/10/15 | 886 | fonts/newcomputermodern/tex/NewCMSans10-Regular.fontspec +2024/11/01 | 659 | fonts/newcomputermodern/tex/newcomputermodern.sty +2024/11/01 | 30874862 | fonts/newcomputermodern.zip 2020/06/03 | 5405 | fonts/newpx/afm/NewPXBMI.afm 2019/09/10 | 4864 | fonts/newpx/afm/NewPXBMI_gnu.afm 2020/06/03 | 5651 | fonts/newpx/afm/NewPXMI.afm @@ -140921,56 +140926,56 @@ 2008/10/27 | 1415 | fonts/shuffle/shuffle.mf 2008/10/27 | 295904 | fonts/shuffle/shuffle.pdf 2008/10/27 | 288258 | fonts/shuffle.zip -2024/10/25 | 184212 | fonts/simpleicons/doc/bindings.tex -2024/10/25 | 2541375 | fonts/simpleicons/doc/simpleicons.pdf -2024/10/25 | 1813 | fonts/simpleicons/doc/simpleicons.tex -2024/10/25 | 3514 | fonts/simpleicons/enc/simpleiconseight.enc -2024/10/25 | 3925 | fonts/simpleicons/enc/simpleiconsfive.enc -2024/10/25 | 3517 | fonts/simpleicons/enc/simpleiconsfour.enc -2024/10/25 | 3542 | fonts/simpleicons/enc/simpleiconsnine.enc -2024/10/25 | 3937 | fonts/simpleicons/enc/simpleiconsone.enc -2024/10/25 | 3726 | fonts/simpleicons/enc/simpleiconsoneone.enc -2024/10/25 | 2953 | fonts/simpleicons/enc/simpleiconsonethree.enc -2024/10/25 | 3481 | fonts/simpleicons/enc/simpleiconsonetwo.enc -2024/10/25 | 3698 | fonts/simpleicons/enc/simpleiconsonezero.enc -2024/10/25 | 3682 | fonts/simpleicons/enc/simpleiconsseven.enc -2024/10/25 | 3388 | fonts/simpleicons/enc/simpleiconssix.enc -2024/10/25 | 3791 | fonts/simpleicons/enc/simpleiconsthree.enc -2024/10/25 | 3640 | fonts/simpleicons/enc/simpleiconstwo.enc -2024/10/25 | 1476 | fonts/simpleicons/map/simpleicons.map -2024/10/25 | 2463616 | fonts/simpleicons/opentype/SimpleIcons.otf -2024/10/25 | 1207 | fonts/simpleicons/README.md -2024/10/25 | 310109 | fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex -2024/10/25 | 302739 | fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex -2024/10/25 | 1745 | fonts/simpleicons/tex/simpleicons.sty -2024/10/25 | 264 | fonts/simpleicons/tex/usimpleiconseight.fd -2024/10/25 | 259 | fonts/simpleicons/tex/usimpleiconsfive.fd -2024/10/25 | 259 | fonts/simpleicons/tex/usimpleiconsfour.fd -2024/10/25 | 259 | fonts/simpleicons/tex/usimpleiconsnine.fd -2024/10/25 | 254 | fonts/simpleicons/tex/usimpleiconsone.fd -2024/10/25 | 269 | fonts/simpleicons/tex/usimpleiconsoneone.fd -2024/10/25 | 279 | fonts/simpleicons/tex/usimpleiconsonethree.fd -2024/10/25 | 269 | fonts/simpleicons/tex/usimpleiconsonetwo.fd -2024/10/25 | 274 | fonts/simpleicons/tex/usimpleiconsonezero.fd -2024/10/25 | 264 | fonts/simpleicons/tex/usimpleiconsseven.fd -2024/10/25 | 254 | fonts/simpleicons/tex/usimpleiconssix.fd -2024/10/25 | 264 | fonts/simpleicons/tex/usimpleiconsthree.fd -2024/10/25 | 254 | fonts/simpleicons/tex/usimpleiconstwo.fd -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconseight.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfive.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfour.tfm -2024/10/25 | 1236 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsnine.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsoneone.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsone.tfm -2024/10/25 | 784 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonethree.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonezero.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsseven.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconssix.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsthree.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconstwo.tfm -2024/10/25 | 2268648 | fonts/simpleicons/type1/SimpleIcons.pfb -2024/10/25 | 6388813 | fonts/simpleicons.zip +2024/11/01 | 184259 | fonts/simpleicons/doc/bindings.tex +2024/11/01 | 2542185 | fonts/simpleicons/doc/simpleicons.pdf +2024/11/01 | 1813 | fonts/simpleicons/doc/simpleicons.tex +2024/11/01 | 3514 | fonts/simpleicons/enc/simpleiconseight.enc +2024/11/01 | 3925 | fonts/simpleicons/enc/simpleiconsfive.enc +2024/11/01 | 3517 | fonts/simpleicons/enc/simpleiconsfour.enc +2024/11/01 | 3542 | fonts/simpleicons/enc/simpleiconsnine.enc +2024/11/01 | 3937 | fonts/simpleicons/enc/simpleiconsone.enc +2024/11/01 | 3718 | fonts/simpleicons/enc/simpleiconsoneone.enc +2024/11/01 | 2955 | fonts/simpleicons/enc/simpleiconsonethree.enc +2024/11/01 | 3487 | fonts/simpleicons/enc/simpleiconsonetwo.enc +2024/11/01 | 3698 | fonts/simpleicons/enc/simpleiconsonezero.enc +2024/11/01 | 3682 | fonts/simpleicons/enc/simpleiconsseven.enc +2024/11/01 | 3388 | fonts/simpleicons/enc/simpleiconssix.enc +2024/11/01 | 3791 | fonts/simpleicons/enc/simpleiconsthree.enc +2024/11/01 | 3640 | fonts/simpleicons/enc/simpleiconstwo.enc +2024/11/01 | 1476 | fonts/simpleicons/map/simpleicons.map +2024/11/01 | 2464060 | fonts/simpleicons/opentype/SimpleIcons.otf +2024/11/01 | 1207 | fonts/simpleicons/README.md +2024/11/01 | 310204 | fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex +2024/11/01 | 302828 | fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex +2024/11/01 | 1745 | fonts/simpleicons/tex/simpleicons.sty +2024/11/01 | 264 | fonts/simpleicons/tex/usimpleiconseight.fd +2024/11/01 | 259 | fonts/simpleicons/tex/usimpleiconsfive.fd +2024/11/01 | 259 | fonts/simpleicons/tex/usimpleiconsfour.fd +2024/11/01 | 259 | fonts/simpleicons/tex/usimpleiconsnine.fd +2024/11/01 | 254 | fonts/simpleicons/tex/usimpleiconsone.fd +2024/11/01 | 269 | fonts/simpleicons/tex/usimpleiconsoneone.fd +2024/11/01 | 279 | fonts/simpleicons/tex/usimpleiconsonethree.fd +2024/11/01 | 269 | fonts/simpleicons/tex/usimpleiconsonetwo.fd +2024/11/01 | 274 | fonts/simpleicons/tex/usimpleiconsonezero.fd +2024/11/01 | 264 | fonts/simpleicons/tex/usimpleiconsseven.fd +2024/11/01 | 254 | fonts/simpleicons/tex/usimpleiconssix.fd +2024/11/01 | 264 | fonts/simpleicons/tex/usimpleiconsthree.fd +2024/11/01 | 254 | fonts/simpleicons/tex/usimpleiconstwo.fd +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconseight.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfive.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfour.tfm +2024/11/01 | 1236 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsnine.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsoneone.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsone.tfm +2024/11/01 | 788 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonethree.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonezero.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsseven.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconssix.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsthree.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconstwo.tfm +2024/11/01 | 2269126 | fonts/simpleicons/type1/SimpleIcons.pfb +2024/11/01 | 6390551 | fonts/simpleicons.zip 2002/02/27 | 3750 | fonts/skull/skull.dtx 2002/02/27 | 156 | fonts/skull/skull.ins 2002/02/27 | 2973 | fonts/skull/skull.mf @@ -207654,7 +207659,7 @@ 2023/01/23 | 862071 | install/macros/generic/expkv-bundle.tds.zip 2022/02/04 | 232668 | install/macros/generic/iftex.tds.zip 2012/09/20 | 321508 | install/macros/generic/langcode.tds.zip -2024/09/30 | 1670270 | install/macros/generic/markdown.tds.zip +2024/10/31 | 1719340 | install/macros/generic/markdown.tds.zip 2014/06/11 | 428488 | install/macros/generic/mathdots.tds.zip 2024/04/02 | 2935898 | install/macros/generic/memoize.tds.zip 2014/01/02 | 496633 | install/macros/generic/minifp.tds.zip @@ -207956,25 +207961,25 @@ 2020/04/09 | 806385 | install/macros/latex/contrib/zhlipsum.tds.zip 2022/07/14 | 321454 | install/macros/latex/contrib/zhnumber.tds.zip 2024/09/30 | 1194699 | install/macros/latex/contrib/zref-clever.tds.zip -2024/10/13 | 46421486 | install/macros/latex-dev/latex-base-dev.tds.zip +2024/10/31 | 46686815 | install/macros/latex-dev/latex-base-dev.tds.zip 2024/05/08 | 946534 | install/macros/latex-dev/required/l3backend-dev.tds.zip 2024/10/09 | 14398197 | install/macros/latex-dev/required/l3kernel-dev.tds.zip -2024/10/13 | 2798443 | install/macros/latex-dev/required/latex-amsmath-dev.tds.zip -2024/10/13 | 283449 | install/macros/latex-dev/required/latex-firstaid-dev.tds.zip -2024/10/13 | 3098692 | install/macros/latex-dev/required/latex-graphics-dev.tds.zip -2024/10/13 | 12705478 | install/macros/latex-dev/required/latex-lab-dev.tds.zip -2024/10/13 | 8352652 | install/macros/latex-dev/required/latex-tools-dev.tds.zip +2024/10/31 | 2799192 | install/macros/latex-dev/required/latex-amsmath-dev.tds.zip +2024/10/31 | 287813 | install/macros/latex-dev/required/latex-firstaid-dev.tds.zip +2024/10/31 | 3098705 | install/macros/latex-dev/required/latex-graphics-dev.tds.zip +2024/10/31 | 12725613 | install/macros/latex-dev/required/latex-lab-dev.tds.zip +2024/10/31 | 8360836 | install/macros/latex-dev/required/latex-tools-dev.tds.zip 2024/10/31 | 46461166 | install/macros/latex/latex-base.tds.zip 2020/06/01 | 1578753 | install/macros/latex/required/amscls.tds.zip 2024/10/20 | 3805862 | install/macros/latex/required/babel-base.tds.zip 2024/05/23 | 946356 | install/macros/latex/required/l3backend.tds.zip 2024/10/22 | 14397137 | install/macros/latex/required/l3kernel.tds.zip -2024/06/01 | 2796532 | install/macros/latex/required/latex-amsmath.tds.zip +2024/10/31 | 2798830 | install/macros/latex/required/latex-amsmath.tds.zip 2024/06/17 | 244182 | install/macros/latex/required/latexbug.tds.zip 2024/06/01 | 1349959 | install/macros/latex/required/latex-cyrillic.tds.zip -2024/06/26 | 283508 | install/macros/latex/required/latex-firstaid.tds.zip +2024/10/31 | 287749 | install/macros/latex/required/latex-firstaid.tds.zip 2024/10/31 | 3098298 | install/macros/latex/required/latex-graphics.tds.zip -2024/06/01 | 12492918 | install/macros/latex/required/latex-lab.tds.zip +2024/10/31 | 12724789 | install/macros/latex/required/latex-lab.tds.zip 2024/10/31 | 8359906 | install/macros/latex/required/latex-tools.tds.zip 2016/09/02 | 108688 | install/macros/luatex/generic/cstypo.tds.zip 2015/10/01 | 154538 | install/macros/luatex/generic/ctablestack.tds.zip @@ -216295,25 +216300,25 @@ 2016/06/15 | 170646 | macros/generic/luatex85/luatex85.pdf 2016/06/15 | 316 | macros/generic/luatex85/README.md 2016/06/15 | 173375 | macros/generic/luatex85.zip -2024/09/30 | 51966 | macros/generic/markdown/CHANGES.md -2024/09/30 | 281 | macros/generic/markdown/DEPENDS.txt -2024/09/30 | 4435 | macros/generic/markdown/docstrip.cfg -2024/09/30 | 2153 | macros/generic/markdown/examples/context-mkiv.tex -2024/09/30 | 3832 | macros/generic/markdown/examples/example.md -2024/09/30 | 2037 | macros/generic/markdown/examples/latex-luatex.tex -2024/09/30 | 2066 | macros/generic/markdown/examples/latex-pdftex.tex -2024/09/30 | 10042 | macros/generic/markdown/examples/optex.tex -2024/09/30 | 75 | macros/generic/markdown/examples/scientists.csv -2024/09/30 | 22928 | macros/generic/markdown/libraries/markdown-tinyyaml.lua -2024/09/30 | 4681 | macros/generic/markdown/markdown.css -2024/09/30 | 1006512 | macros/generic/markdown/markdown.dtx -2024/09/30 | 1047286 | macros/generic/markdown/markdown.html -2024/09/30 | 1939 | macros/generic/markdown/markdown.ins -2024/09/30 | 1156338 | macros/generic/markdown/markdown.pdf -2024/09/30 | 140951 | macros/generic/markdown/markdown.png -2024/09/30 | 23175 | macros/generic/markdown/README.md -2024/09/30 | 31 | macros/generic/markdown/VERSION -2024/09/30 | 1562122 | macros/generic/markdown.zip +2024/10/31 | 54849 | macros/generic/markdown/CHANGES.md +2024/10/31 | 333 | macros/generic/markdown/DEPENDS.txt +2024/10/31 | 4435 | macros/generic/markdown/docstrip.cfg +2024/10/31 | 2806 | macros/generic/markdown/examples/context-mkiv.tex +2024/10/31 | 3832 | macros/generic/markdown/examples/example.md +2024/10/31 | 2007 | macros/generic/markdown/examples/latex-luatex.tex +2024/10/31 | 2036 | macros/generic/markdown/examples/latex-pdftex.tex +2024/10/31 | 10042 | macros/generic/markdown/examples/optex.tex +2024/10/31 | 75 | macros/generic/markdown/examples/scientists.csv +2024/10/31 | 22928 | macros/generic/markdown/libraries/markdown-tinyyaml.lua +2024/10/31 | 4681 | macros/generic/markdown/markdown.css +2024/10/31 | 1034391 | macros/generic/markdown/markdown.dtx +2024/10/31 | 1049656 | macros/generic/markdown/markdown.html +2024/10/31 | 1939 | macros/generic/markdown/markdown.ins +2024/10/31 | 1198555 | macros/generic/markdown/markdown.pdf +2024/10/31 | 140951 | macros/generic/markdown/markdown.png +2024/10/31 | 23117 | macros/generic/markdown/README.md +2024/10/31 | 31 | macros/generic/markdown/VERSION +2024/11/01 | 1609195 | macros/generic/markdown.zip 2014/06/11 | 20744 | macros/generic/mathdots/mathdots.dtx 2014/06/11 | 1203 | macros/generic/mathdots/mathdots.ins 2014/06/11 | 258547 | macros/generic/mathdots/mathdots.pdf @@ -233610,12 +233615,12 @@ 2008/02/10 | 19110 | macros/latex/contrib/ean13isbn/License.txt 2021/01/24 | 422 | macros/latex/contrib/ean13isbn/README 2021/01/24 | 322624 | macros/latex/contrib/ean13isbn.zip -2024/10/31 | 94823 | macros/latex/contrib/easybook/easybook.dtx +2024/11/01 | 94778 | macros/latex/contrib/easybook/easybook.dtx 2024/01/04 | 2081 | macros/latex/contrib/easybook/easybook.ins -2024/10/31 | 649454 | macros/latex/contrib/easybook/easybook.pdf -2024/10/31 | 113751 | macros/latex/contrib/easybook/easybook.tex -2024/10/31 | 913 | macros/latex/contrib/easybook/README.md -2024/10/31 | 704137 | macros/latex/contrib/easybook.zip +2024/11/01 | 650533 | macros/latex/contrib/easybook/easybook.pdf +2024/11/01 | 113851 | macros/latex/contrib/easybook/easybook.tex +2024/11/01 | 913 | macros/latex/contrib/easybook/README.md +2024/11/01 | 705246 | macros/latex/contrib/easybook.zip 2009/06/17 | 82589 | macros/latex/contrib/easy/doc/docbib.pdf 2009/06/17 | 78378 | macros/latex/contrib/easy/doc/docbmat.pdf 2009/06/17 | 99132 | macros/latex/contrib/easy/doc/doceqn.pdf @@ -234361,6 +234366,11 @@ 2024/06/03 | 1365 | macros/latex/contrib/ensps-colorscheme/Makefile 2024/06/03 | 1158 | macros/latex/contrib/ensps-colorscheme/README.md 2024/06/04 | 215572 | macros/latex/contrib/ensps-colorscheme.zip +2024/11/01 | 610787 | macros/latex/contrib/enumext/enumext.dtx +2024/11/01 | 1649 | macros/latex/contrib/enumext/enumext.ins +2024/11/01 | 1643633 | macros/latex/contrib/enumext/enumext.pdf +2024/11/01 | 2164 | macros/latex/contrib/enumext/README.md +2024/11/01 | 1675962 | macros/latex/contrib/enumext.zip 2019/06/20 | 145488 | macros/latex/contrib/enumitem/enumitem.pdf 2019/06/20 | 51697 | macros/latex/contrib/enumitem/enumitem.sty 2019/06/20 | 65422 | macros/latex/contrib/enumitem/enumitem.tex @@ -239277,13 +239287,13 @@ 2023/02/26 | 329925 | macros/latex/contrib/hrefhide/hrefhide.pdf 2023/02/26 | 4859 | macros/latex/contrib/hrefhide/README 2023/02/26 | 442306 | macros/latex/contrib/hrefhide.zip -2024/01/09 | 236 | macros/latex/contrib/href-ul/DEPENDS.txt -2024/01/09 | 5610 | macros/latex/contrib/href-ul/href-ul.dtx -2024/01/09 | 2631 | macros/latex/contrib/href-ul/href-ul.ins -2024/01/09 | 300457 | macros/latex/contrib/href-ul/href-ul.pdf -2024/01/09 | 1083 | macros/latex/contrib/href-ul/LICENSE.txt -2024/01/09 | 1244 | macros/latex/contrib/href-ul/README.md -2024/01/09 | 288348 | macros/latex/contrib/href-ul.zip +2024/11/01 | 236 | macros/latex/contrib/href-ul/DEPENDS.txt +2024/11/01 | 5645 | macros/latex/contrib/href-ul/href-ul.dtx +2024/11/01 | 2631 | macros/latex/contrib/href-ul/href-ul.ins +2024/11/01 | 300493 | macros/latex/contrib/href-ul/href-ul.pdf +2024/11/01 | 1083 | macros/latex/contrib/href-ul/LICENSE.txt +2024/11/01 | 1295 | macros/latex/contrib/href-ul/README.md +2024/11/01 | 288439 | macros/latex/contrib/href-ul.zip 2024/10/25 | 691 | macros/latex/contrib/huawei/DEPENDS.txt 2024/10/25 | 253724 | macros/latex/contrib/huawei/huawei-cover-picture.pdf 2024/10/25 | 36315 | macros/latex/contrib/huawei/huawei.dtx @@ -241551,12 +241561,12 @@ 2024/08/08 | 3965 | macros/latex/contrib/jsonparse/jason/jason.pdf 2024/05/09 | 7658 | macros/latex/contrib/jsonparse/jason/jason.svg 2024/08/08 | 14806 | macros/latex/contrib/jsonparse/jason/jason.tex -2024/10/28 | 437147 | macros/latex/contrib/jsonparse/jsonparse-doc.pdf -2024/10/28 | 31398 | macros/latex/contrib/jsonparse/jsonparse-doc.tex -2024/10/28 | 38250 | macros/latex/contrib/jsonparse/jsonparse.sty +2024/11/01 | 488485 | macros/latex/contrib/jsonparse/jsonparse-doc.pdf +2024/11/01 | 33877 | macros/latex/contrib/jsonparse/jsonparse-doc.tex +2024/11/01 | 43243 | macros/latex/contrib/jsonparse/jsonparse.sty 2024/04/05 | 19105 | macros/latex/contrib/jsonparse/LICENCE -2024/10/28 | 1741 | macros/latex/contrib/jsonparse/README.md -2024/10/28 | 443584 | macros/latex/contrib/jsonparse.zip +2024/11/01 | 1741 | macros/latex/contrib/jsonparse/README.md +2024/11/01 | 493201 | macros/latex/contrib/jsonparse.zip 2015/06/02 | 141342 | macros/latex/contrib/jumplines/jumplines_doc.pdf 2015/06/02 | 10822 | macros/latex/contrib/jumplines/jumplines_doc.tex 2015/06/02 | 110248 | macros/latex/contrib/jumplines/jumplines_example.pdf @@ -252884,376 +252894,378 @@ 2024/10/31 | 20405 | macros/latex/contrib/spbmark/spbmark.sty 2024/10/31 | 22542 | macros/latex/contrib/spbmark/spbmark.tex 2024/10/31 | 103744 | macros/latex/contrib/spbmark.zip -2024/10/23 | 94259 | macros/latex/contrib/spelatex/Example/example.pdf -2024/10/23 | 39732 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-1.ogg -2024/10/23 | 10787 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-2.ogg -2024/10/23 | 13031 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-3.ogg -2024/10/23 | 12973 | macros/latex/contrib/spelatex/Example/example-spel/1.ogg -2024/10/23 | 36885 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-1.ogg -2024/10/23 | 74019 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-2.ogg -2024/10/23 | 39646 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-3.ogg -2024/10/23 | 446 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0.m3u -2024/10/23 | 18746 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0.ogg -2024/10/23 | 113548 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0-1.ogg -2024/10/23 | 57815 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0-2.ogg -2024/10/23 | 348 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0.m3u -2024/10/23 | 21105 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0.ogg -2024/10/23 | 39304 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0-1.ogg -2024/10/23 | 250 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0.m3u -2024/10/23 | 15489 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0.ogg -2024/10/23 | 13775 | macros/latex/contrib/spelatex/Example/example-spel/2.ogg -2024/10/23 | 37521 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0-1.ogg -2024/10/23 | 57294 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0-2.ogg -2024/10/23 | 348 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0.m3u -2024/10/23 | 16652 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0.ogg -2024/10/23 | 631 | macros/latex/contrib/spelatex/Example/example-spel/3.2.0.0.0.0.m3u -2024/10/23 | 18708 | macros/latex/contrib/spelatex/Example/example-spel/3.2.0.0.0.0.ogg -2024/10/23 | 35730 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0-1.ogg -2024/10/23 | 250 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0.m3u -2024/10/23 | 21171 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0.ogg -2024/10/23 | 49487 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0-1.ogg -2024/10/23 | 341 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0.m3u -2024/10/23 | 24293 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0.ogg -2024/10/23 | 15991 | macros/latex/contrib/spelatex/Example/example-spel/3.ogg -2024/10/23 | 16529 | macros/latex/contrib/spelatex/Example/example-spel/author.ogg -2024/10/23 | 16025 | macros/latex/contrib/spelatex/Example/example-spel/date.ogg -2024/10/23 | 8721 | macros/latex/contrib/spelatex/Example/example-spel/star-1.ogg -2024/10/23 | 15704 | macros/latex/contrib/spelatex/Example/example-spel/title.ogg -2024/10/23 | 3064 | macros/latex/contrib/spelatex/Example/example.tex -2024/10/07 | 342 | macros/latex/contrib/spelatex/LICENSE -2024/10/07 | 2525 | macros/latex/contrib/spelatex/README -2024/10/23 | 91572 | macros/latex/contrib/spelatex/spelatex.dtx -2024/09/25 | 2048 | macros/latex/contrib/spelatex/spelatex.ins -2024/10/23 | 367674 | macros/latex/contrib/spelatex/spelatex.pdf -2024/10/23 | 47368 | macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-1.ogg -2024/10/23 | 8041 | macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-star-1.ogg -2024/10/23 | 2538 | macros/latex/contrib/spelatex/spelatex-spel/1.0.0.0.0.m3u -2024/10/23 | 12760 | macros/latex/contrib/spelatex/spelatex-spel/1.0.0.0.0.ogg -2024/10/23 | 133644 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-1.ogg -2024/10/23 | 110198 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-2.ogg -2024/10/23 | 120483 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-3.ogg -2024/10/23 | 410 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0.m3u -2024/10/23 | 16931 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0.ogg -2024/10/23 | 1029 | macros/latex/contrib/spelatex/spelatex-spel/1.2.0.0.0.m3u -2024/10/23 | 19455 | macros/latex/contrib/spelatex/spelatex-spel/1.2.0.0.0.ogg -2024/10/23 | 244757 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-1.ogg -2024/10/23 | 93092 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-2.ogg -2024/10/23 | 118238 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-3.ogg -2024/10/23 | 410 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0.m3u -2024/10/23 | 20052 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0.ogg -2024/10/23 | 105752 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-1.ogg -2024/10/23 | 50742 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-2.ogg -2024/10/23 | 26416 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-3.ogg -2024/10/23 | 28102 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-4.ogg -2024/10/23 | 20721 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-5.ogg -2024/10/23 | 588 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0.m3u -2024/10/23 | 20854 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0.ogg -2024/10/23 | 117608 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-10.ogg -2024/10/23 | 112516 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-11.ogg -2024/10/23 | 56785 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-1.ogg -2024/10/23 | 238754 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-2.ogg -2024/10/23 | 75832 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-3.ogg -2024/10/23 | 60673 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-4.ogg -2024/10/23 | 43807 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-5.ogg -2024/10/23 | 75953 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-6.ogg -2024/10/23 | 124157 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-7.ogg -2024/10/23 | 83405 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-8.ogg -2024/10/23 | 149382 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-9.ogg -2024/10/23 | 1124 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0.m3u -2024/10/23 | 18983 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0.ogg -2024/10/23 | 4310 | macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.m3u -2024/10/23 | 14567 | macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.ogg -2024/10/23 | 33539 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-1.ogg -2024/10/23 | 13805 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-2.ogg -2024/10/23 | 13665 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-3.ogg -2024/10/23 | 47328 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-4.ogg -2024/10/23 | 56006 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-5.ogg -2024/10/23 | 88036 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg -2024/10/23 | 765 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.m3u -2024/10/23 | 19440 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.ogg -2024/10/23 | 2628 | macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.m3u -2024/10/23 | 20866 | macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.ogg -2024/10/23 | 106395 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-10.ogg -2024/10/23 | 148669 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-11.ogg -2024/10/23 | 65448 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg -2024/10/23 | 151459 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-2.ogg -2024/10/23 | 110899 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg -2024/10/23 | 106961 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg -2024/10/23 | 122975 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg -2024/10/23 | 299281 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-6.ogg -2024/10/23 | 85250 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-7.ogg -2024/10/23 | 25048 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-8.ogg -2024/10/23 | 60306 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-9.ogg -2024/10/23 | 1212 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.m3u -2024/10/23 | 22528 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.ogg -2024/10/23 | 142297 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-1.ogg -2024/10/23 | 180352 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-2.ogg -2024/10/23 | 72978 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-3.ogg -2024/10/23 | 410 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0.m3u -2024/10/23 | 24007 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0.ogg -2024/10/23 | 238840 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-1.ogg -2024/10/23 | 36950 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-2.ogg -2024/10/23 | 27987 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-3.ogg -2024/10/23 | 19493 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-4.ogg -2024/10/23 | 185657 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-5.ogg -2024/10/23 | 54375 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-6.ogg -2024/10/23 | 677 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0.m3u -2024/10/23 | 25043 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0.ogg -2024/10/23 | 166124 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-1.ogg -2024/10/23 | 76717 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-2.ogg -2024/10/23 | 118189 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-3.ogg -2024/10/23 | 410 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0.m3u -2024/10/23 | 20386 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0.ogg -2024/10/23 | 90454 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-1.ogg -2024/10/23 | 87506 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-2.ogg -2024/10/23 | 38837 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-3.ogg -2024/10/23 | 32271 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-4.ogg -2024/10/23 | 499 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0.m3u -2024/10/23 | 20889 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0.ogg -2024/10/23 | 35444 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-1.ogg -2024/10/23 | 297720 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-2.ogg -2024/10/23 | 71704 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-3.ogg -2024/10/23 | 45809 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-4.ogg -2024/10/23 | 499 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0.m3u -2024/10/23 | 17487 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0.ogg -2024/10/23 | 2267 | macros/latex/contrib/spelatex/spelatex-spel/3.0.0.0.0.m3u -2024/10/23 | 14438 | macros/latex/contrib/spelatex/spelatex-spel/3.0.0.0.0.ogg -2024/10/23 | 33709 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-1.ogg -2024/10/23 | 98449 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-2.ogg -2024/10/23 | 106138 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-3.ogg -2024/10/23 | 410 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0.m3u -2024/10/23 | 22976 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0.ogg -2024/10/23 | 1296 | macros/latex/contrib/spelatex/spelatex-spel/3.2.0.0.0.m3u -2024/10/23 | 28766 | macros/latex/contrib/spelatex/spelatex-spel/3.2.0.0.0.ogg -2024/10/23 | 96575 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-1.ogg -2024/10/23 | 45232 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-2.ogg -2024/10/23 | 35932 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-3.ogg -2024/10/23 | 65725 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-4.ogg -2024/10/23 | 37206 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-5.ogg -2024/10/23 | 588 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0.m3u -2024/10/23 | 20494 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0.ogg -2024/10/23 | 145651 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-1.ogg -2024/10/23 | 73497 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-2.ogg -2024/10/23 | 91450 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-3.ogg -2024/10/23 | 84218 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-4.ogg -2024/10/23 | 77413 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-5.ogg -2024/10/23 | 135191 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-6.ogg -2024/10/23 | 677 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0.m3u -2024/10/23 | 24225 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0.ogg -2024/10/23 | 86700 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0-1.ogg -2024/10/23 | 232 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0.m3u -2024/10/23 | 20517 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0.ogg -2024/10/23 | 80366 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-1.ogg -2024/10/23 | 117318 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-2.ogg -2024/10/23 | 70916 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-3.ogg -2024/10/23 | 410 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0.m3u -2024/10/23 | 19599 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0.ogg -2024/10/23 | 5194 | macros/latex/contrib/spelatex/spelatex-spel/4.0.0.0.0.m3u -2024/10/23 | 13146 | macros/latex/contrib/spelatex/spelatex-spel/4.0.0.0.0.ogg -2024/10/23 | 49459 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-1.ogg -2024/10/23 | 12177 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-2.ogg -2024/10/23 | 17829 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-3.ogg -2024/10/23 | 14968 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-4.ogg -2024/10/23 | 16905 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-5.ogg -2024/10/23 | 31955 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-6.ogg -2024/10/23 | 32717 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-7.ogg -2024/10/23 | 4575 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0.m3u -2024/10/23 | 22463 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0.ogg -2024/10/23 | 85473 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-1.ogg -2024/10/23 | 69409 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-2.ogg -2024/10/23 | 63694 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-3.ogg -2024/10/23 | 87004 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-4.ogg -2024/10/23 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0.m3u -2024/10/23 | 26567 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0.ogg -2024/10/23 | 168156 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-1.ogg -2024/10/23 | 45627 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-2.ogg -2024/10/23 | 321 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0.m3u -2024/10/23 | 27721 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0.ogg -2024/10/23 | 94364 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-1.ogg -2024/10/23 | 66772 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-2.ogg -2024/10/23 | 44273 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-3.ogg -2024/10/23 | 104843 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-4.ogg -2024/10/23 | 45802 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-5.ogg -2024/10/23 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0.m3u -2024/10/23 | 30360 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0.ogg -2024/10/23 | 70606 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-1.ogg -2024/10/23 | 74100 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-2.ogg -2024/10/23 | 321 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0.m3u -2024/10/23 | 28771 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0.ogg -2024/10/23 | 103962 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-1.ogg -2024/10/23 | 59942 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-2.ogg -2024/10/23 | 64185 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-3.ogg -2024/10/23 | 92521 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-4.ogg -2024/10/23 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0.m3u -2024/10/23 | 31552 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0.ogg -2024/10/23 | 113818 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-1.ogg -2024/10/23 | 56585 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-2.ogg -2024/10/23 | 78350 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-3.ogg -2024/10/23 | 44705 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-4.ogg -2024/10/23 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0.m3u -2024/10/23 | 29964 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0.ogg -2024/10/23 | 135360 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-1.ogg -2024/10/23 | 17439 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-2.ogg -2024/10/23 | 18231 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-3.ogg -2024/10/23 | 66745 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-4.ogg -2024/10/23 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0.m3u -2024/10/23 | 24223 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0.ogg -2024/10/23 | 81048 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-1.ogg -2024/10/23 | 36401 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-2.ogg -2024/10/23 | 49408 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-3.ogg -2024/10/23 | 53200 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-4.ogg -2024/10/23 | 9928 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-5.ogg -2024/10/23 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0.m3u -2024/10/23 | 52258 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0.ogg -2024/10/23 | 35628 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-1.ogg -2024/10/23 | 59688 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-2.ogg -2024/10/23 | 35666 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-3.ogg -2024/10/23 | 56769 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-4.ogg -2024/10/23 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0.m3u -2024/10/23 | 25176 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0.ogg -2024/10/23 | 41633 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-1.ogg -2024/10/23 | 61026 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-2.ogg -2024/10/23 | 44789 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-3.ogg -2024/10/23 | 82794 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-4.ogg -2024/10/23 | 93981 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-5.ogg -2024/10/23 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0.m3u -2024/10/23 | 19984 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0.ogg -2024/10/23 | 50813 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0-1.ogg -2024/10/23 | 232 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0.m3u -2024/10/23 | 14244 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0.ogg -2024/10/23 | 103136 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0-1.ogg -2024/10/23 | 4389 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0.m3u -2024/10/23 | 12633 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0.ogg -2024/10/23 | 83643 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0-1.ogg -2024/10/23 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0.m3u -2024/10/23 | 17619 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0.ogg -2024/10/23 | 673 | macros/latex/contrib/spelatex/spelatex-spel/6.2.0.0.0.m3u -2024/10/23 | 18774 | macros/latex/contrib/spelatex/spelatex-spel/6.2.0.0.0.ogg -2024/10/23 | 20873 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-1.ogg -2024/10/23 | 42377 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-2.ogg -2024/10/23 | 12567 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-3.ogg -2024/10/23 | 410 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0.m3u -2024/10/23 | 28099 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0.ogg -2024/10/23 | 78802 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0-1.ogg -2024/10/23 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0.m3u -2024/10/23 | 28749 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0.ogg -2024/10/23 | 1116 | macros/latex/contrib/spelatex/spelatex-spel/6.3.0.0.0.m3u -2024/10/23 | 21905 | macros/latex/contrib/spelatex/spelatex-spel/6.3.0.0.0.ogg -2024/10/23 | 73250 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0-1.ogg -2024/10/23 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0.m3u -2024/10/23 | 24697 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0.ogg -2024/10/23 | 12505 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-1.ogg -2024/10/23 | 55382 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-2.ogg -2024/10/23 | 11130 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-3.ogg -2024/10/23 | 34069 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-4.ogg -2024/10/23 | 11444 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-5.ogg -2024/10/23 | 24117 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-6.ogg -2024/10/23 | 677 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0.m3u -2024/10/23 | 27873 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0.ogg -2024/10/23 | 55513 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0-1.ogg -2024/10/23 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0.m3u -2024/10/23 | 28471 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0.ogg -2024/10/23 | 36972 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0-1.ogg -2024/10/23 | 73657 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0-2.ogg -2024/10/23 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0.m3u -2024/10/23 | 17379 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0.ogg -2024/10/23 | 13449 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0-1.ogg -2024/10/23 | 104147 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0-2.ogg -2024/10/23 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0.m3u -2024/10/23 | 19345 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0.ogg -2024/10/23 | 762 | macros/latex/contrib/spelatex/spelatex-spel/6.6.0.0.0.m3u -2024/10/23 | 21207 | macros/latex/contrib/spelatex/spelatex-spel/6.6.0.0.0.ogg -2024/10/23 | 27251 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-1.ogg -2024/10/23 | 94513 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-2.ogg -2024/10/23 | 16847 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-3.ogg -2024/10/23 | 410 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0.m3u -2024/10/23 | 20541 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0.ogg -2024/10/23 | 20607 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-1.ogg -2024/10/23 | 70900 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-2.ogg -2024/10/23 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0.m3u -2024/10/23 | 20955 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0.ogg -2024/10/23 | 131060 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-10.ogg -2024/10/23 | 69856 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-11.ogg -2024/10/23 | 113548 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-1.ogg -2024/10/23 | 57815 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-2.ogg -2024/10/23 | 41688 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-3.ogg -2024/10/23 | 56609 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-4.ogg -2024/10/23 | 62348 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-5.ogg -2024/10/23 | 123843 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-6.ogg -2024/10/23 | 28210 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-7.ogg -2024/10/23 | 30482 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-8.ogg -2024/10/23 | 23883 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-9.ogg -2024/10/23 | 1124 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0.m3u -2024/10/23 | 20555 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0.ogg -2024/10/23 | 64306 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0-1.ogg -2024/10/23 | 2504 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0.m3u -2024/10/23 | 15080 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0.ogg -2024/10/23 | 320 | macros/latex/contrib/spelatex/spelatex-spel/7.10.0.0.0.m3u -2024/10/23 | 30441 | macros/latex/contrib/spelatex/spelatex-spel/7.10.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.1.0.0.0.m3u -2024/10/23 | 20095 | macros/latex/contrib/spelatex/spelatex-spel/7.1.0.0.0.ogg -2024/10/23 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.10.1.0.0.m3u -2024/10/23 | 33980 | macros/latex/contrib/spelatex/spelatex-spel/7.10.1.0.0.ogg -2024/10/23 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.10.2.0.0.m3u -2024/10/23 | 25990 | macros/latex/contrib/spelatex/spelatex-spel/7.10.2.0.0.ogg -2024/10/23 | 584 | macros/latex/contrib/spelatex/spelatex-spel/7.11.0.0.0.m3u -2024/10/23 | 26438 | macros/latex/contrib/spelatex/spelatex-spel/7.11.0.0.0.ogg -2024/10/23 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.1.0.0.m3u -2024/10/23 | 31172 | macros/latex/contrib/spelatex/spelatex-spel/7.11.1.0.0.ogg -2024/10/23 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.2.0.0.m3u -2024/10/23 | 29964 | macros/latex/contrib/spelatex/spelatex-spel/7.11.2.0.0.ogg -2024/10/23 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.3.0.0.m3u -2024/10/23 | 31297 | macros/latex/contrib/spelatex/spelatex-spel/7.11.3.0.0.ogg -2024/10/23 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.4.0.0.m3u -2024/10/23 | 31865 | macros/latex/contrib/spelatex/spelatex-spel/7.11.4.0.0.ogg -2024/10/23 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.5.0.0.m3u -2024/10/23 | 28100 | macros/latex/contrib/spelatex/spelatex-spel/7.11.5.0.0.ogg -2024/10/23 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.12.0.0.0.m3u -2024/10/23 | 22712 | macros/latex/contrib/spelatex/spelatex-spel/7.12.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.2.0.0.0.m3u -2024/10/23 | 21437 | macros/latex/contrib/spelatex/spelatex-spel/7.2.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.3.0.0.0.m3u -2024/10/23 | 18369 | macros/latex/contrib/spelatex/spelatex-spel/7.3.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.4.0.0.0.m3u -2024/10/23 | 17710 | macros/latex/contrib/spelatex/spelatex-spel/7.4.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.5.0.0.0.m3u -2024/10/23 | 19920 | macros/latex/contrib/spelatex/spelatex-spel/7.5.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.6.0.0.0.m3u -2024/10/23 | 22306 | macros/latex/contrib/spelatex/spelatex-spel/7.6.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.7.0.0.0.m3u -2024/10/23 | 21099 | macros/latex/contrib/spelatex/spelatex-spel/7.7.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.8.0.0.0.m3u -2024/10/23 | 21720 | macros/latex/contrib/spelatex/spelatex-spel/7.8.0.0.0.ogg -2024/10/23 | 752 | macros/latex/contrib/spelatex/spelatex-spel/7.9.0.0.0.m3u -2024/10/23 | 28374 | macros/latex/contrib/spelatex/spelatex-spel/7.9.0.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.1.0.0.m3u -2024/10/23 | 24118 | macros/latex/contrib/spelatex/spelatex-spel/7.9.1.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.2.0.0.m3u -2024/10/23 | 22681 | macros/latex/contrib/spelatex/spelatex-spel/7.9.2.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.3.0.0.m3u -2024/10/23 | 23444 | macros/latex/contrib/spelatex/spelatex-spel/7.9.3.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.4.0.0.m3u -2024/10/23 | 24256 | macros/latex/contrib/spelatex/spelatex-spel/7.9.4.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.5.0.0.m3u -2024/10/23 | 20629 | macros/latex/contrib/spelatex/spelatex-spel/7.9.5.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.6.0.0.m3u -2024/10/23 | 29599 | macros/latex/contrib/spelatex/spelatex-spel/7.9.6.0.0.ogg -2024/10/23 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.7.0.0.m3u -2024/10/23 | 23431 | macros/latex/contrib/spelatex/spelatex-spel/7.9.7.0.0.ogg -2024/10/23 | 23138 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-1.ogg -2024/10/23 | 48292 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-2.ogg -2024/10/23 | 18160 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-3.ogg -2024/10/23 | 692 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0.m3u -2024/10/23 | 12564 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0.ogg -2024/10/23 | 8673 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-2.ogg -2024/10/23 | 9620 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-3.ogg -2024/10/23 | 7220 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-4.ogg -2024/10/23 | 31731 | macros/latex/contrib/spelatex/spelatex-spel/author.ogg -2024/10/23 | 27120 | macros/latex/contrib/spelatex/spelatex-spel/date.ogg -2024/10/23 | 59163 | macros/latex/contrib/spelatex/spelatex-spel/footnote-1.ogg -2024/10/23 | 32152 | macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg -2024/10/23 | 22432 | macros/latex/contrib/spelatex/spelatex-spel/title.ogg -2024/10/23 | 15129398 | macros/latex/contrib/spelatex.zip +2024/11/01 | 94918 | macros/latex/contrib/spelatex/Example/example.pdf +2024/11/01 | 74060 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-1.ogg +2024/11/01 | 10787 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-2.ogg +2024/11/01 | 13031 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-3.ogg +2024/11/01 | 12973 | macros/latex/contrib/spelatex/Example/example-spel/1.ogg +2024/11/01 | 70172 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-1.ogg +2024/11/01 | 142608 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-2.ogg +2024/11/01 | 75731 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-3.ogg +2024/11/01 | 446 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0.m3u +2024/11/01 | 18746 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0.ogg +2024/11/01 | 113548 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0-1.ogg +2024/11/01 | 57815 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0-2.ogg +2024/11/01 | 348 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0.m3u +2024/11/01 | 21105 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0.ogg +2024/11/01 | 75007 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0-1.ogg +2024/11/01 | 250 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0.m3u +2024/11/01 | 15489 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0.ogg +2024/11/01 | 13775 | macros/latex/contrib/spelatex/Example/example-spel/2.ogg +2024/11/01 | 37521 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0-1.ogg +2024/11/01 | 57294 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0-2.ogg +2024/11/01 | 348 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0.m3u +2024/11/01 | 16652 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0.ogg +2024/11/01 | 631 | macros/latex/contrib/spelatex/Example/example-spel/3.2.0.0.0.0.m3u +2024/11/01 | 18708 | macros/latex/contrib/spelatex/Example/example-spel/3.2.0.0.0.0.ogg +2024/11/01 | 35730 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0-1.ogg +2024/11/01 | 250 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0.m3u +2024/11/01 | 21171 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0.ogg +2024/11/01 | 49487 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0-1.ogg +2024/11/01 | 341 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0.m3u +2024/11/01 | 24293 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0.ogg +2024/11/01 | 15991 | macros/latex/contrib/spelatex/Example/example-spel/3.ogg +2024/11/01 | 16529 | macros/latex/contrib/spelatex/Example/example-spel/author.ogg +2024/11/01 | 16025 | macros/latex/contrib/spelatex/Example/example-spel/date.ogg +2024/11/01 | 8721 | macros/latex/contrib/spelatex/Example/example-spel/star-1.ogg +2024/11/01 | 15704 | macros/latex/contrib/spelatex/Example/example-spel/title.ogg +2024/11/01 | 3064 | macros/latex/contrib/spelatex/Example/example.tex +2024/09/18 | 342 | macros/latex/contrib/spelatex/LICENSE +2024/09/18 | 2525 | macros/latex/contrib/spelatex/README +2024/11/01 | 92332 | macros/latex/contrib/spelatex/spelatex.dtx +2024/09/18 | 2048 | macros/latex/contrib/spelatex/spelatex.ins +2024/11/01 | 368412 | macros/latex/contrib/spelatex/spelatex.pdf +2024/11/01 | 91709 | macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-1.ogg +2024/11/01 | 8041 | macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-star-1.ogg +2024/11/01 | 2538 | macros/latex/contrib/spelatex/spelatex-spel/1.0.0.0.0.m3u +2024/11/01 | 12760 | macros/latex/contrib/spelatex/spelatex-spel/1.0.0.0.0.ogg +2024/11/01 | 262984 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-1.ogg +2024/11/01 | 217852 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-2.ogg +2024/11/01 | 237522 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-3.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0.m3u +2024/11/01 | 16931 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0.ogg +2024/11/01 | 1029 | macros/latex/contrib/spelatex/spelatex-spel/1.2.0.0.0.m3u +2024/11/01 | 19455 | macros/latex/contrib/spelatex/spelatex-spel/1.2.0.0.0.ogg +2024/11/01 | 486327 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-1.ogg +2024/11/01 | 182403 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-2.ogg +2024/11/01 | 232528 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-3.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0.m3u +2024/11/01 | 20052 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0.ogg +2024/11/01 | 208290 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-1.ogg +2024/11/01 | 97186 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-2.ogg +2024/11/01 | 26416 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-3.ogg +2024/11/01 | 28102 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-4.ogg +2024/11/01 | 20721 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-5.ogg +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0.m3u +2024/11/01 | 20854 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0.ogg +2024/11/01 | 232389 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-10.ogg +2024/11/01 | 221229 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-11.ogg +2024/11/01 | 110193 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-1.ogg +2024/11/01 | 473613 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-2.ogg +2024/11/01 | 147801 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-3.ogg +2024/11/01 | 117980 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-4.ogg +2024/11/01 | 43807 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-5.ogg +2024/11/01 | 75953 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-6.ogg +2024/11/01 | 124157 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-7.ogg +2024/11/01 | 163073 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-8.ogg +2024/11/01 | 294502 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-9.ogg +2024/11/01 | 1124 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0.m3u +2024/11/01 | 18983 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0.ogg +2024/11/01 | 4486 | macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.m3u +2024/11/01 | 14567 | macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.ogg +2024/11/01 | 63286 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-1.ogg +2024/11/01 | 13805 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-2.ogg +2024/11/01 | 13665 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-3.ogg +2024/11/01 | 47328 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-4.ogg +2024/11/01 | 56006 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-5.ogg +2024/11/01 | 173055 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg +2024/11/01 | 853 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.m3u +2024/11/01 | 19440 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.ogg +2024/11/01 | 2716 | macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.m3u +2024/11/01 | 20866 | macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.ogg +2024/11/01 | 106395 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-10.ogg +2024/11/01 | 148669 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-11.ogg +2024/11/01 | 127251 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg +2024/11/01 | 151459 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-2.ogg +2024/11/01 | 217550 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg +2024/11/01 | 210488 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg +2024/11/01 | 242272 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg +2024/11/01 | 299281 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-6.ogg +2024/11/01 | 85250 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-7.ogg +2024/11/01 | 46676 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-8.ogg +2024/11/01 | 60306 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-9.ogg +2024/11/01 | 1300 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.m3u +2024/11/01 | 22528 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.ogg +2024/11/01 | 280698 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-1.ogg +2024/11/01 | 356307 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-2.ogg +2024/11/01 | 142113 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-3.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0.m3u +2024/11/01 | 24007 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0.ogg +2024/11/01 | 473243 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-1.ogg +2024/11/01 | 69911 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-2.ogg +2024/11/01 | 27987 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-3.ogg +2024/11/01 | 19493 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-4.ogg +2024/11/01 | 366896 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-5.ogg +2024/11/01 | 105048 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-6.ogg +2024/11/01 | 677 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0.m3u +2024/11/01 | 25043 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0.ogg +2024/11/01 | 328888 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-1.ogg +2024/11/01 | 150678 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-2.ogg +2024/11/01 | 233550 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-3.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0.m3u +2024/11/01 | 20386 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0.ogg +2024/11/01 | 177085 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-1.ogg +2024/11/01 | 170260 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-2.ogg +2024/11/01 | 38837 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-3.ogg +2024/11/01 | 32271 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-4.ogg +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0.m3u +2024/11/01 | 20889 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0.ogg +2024/11/01 | 67763 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-1.ogg +2024/11/01 | 297720 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-2.ogg +2024/11/01 | 71704 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-3.ogg +2024/11/01 | 45809 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-4.ogg +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0.m3u +2024/11/01 | 17487 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0.ogg +2024/11/01 | 2267 | macros/latex/contrib/spelatex/spelatex-spel/3.0.0.0.0.m3u +2024/11/01 | 14438 | macros/latex/contrib/spelatex/spelatex-spel/3.0.0.0.0.ogg +2024/11/01 | 64240 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-1.ogg +2024/11/01 | 193476 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-2.ogg +2024/11/01 | 208854 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-3.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0.m3u +2024/11/01 | 22976 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0.ogg +2024/11/01 | 1296 | macros/latex/contrib/spelatex/spelatex-spel/3.2.0.0.0.m3u +2024/11/01 | 28766 | macros/latex/contrib/spelatex/spelatex-spel/3.2.0.0.0.ogg +2024/11/01 | 189821 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-1.ogg +2024/11/01 | 87081 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-2.ogg +2024/11/01 | 67677 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-3.ogg +2024/11/01 | 127640 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-4.ogg +2024/11/01 | 70620 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-5.ogg +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0.m3u +2024/11/01 | 20494 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0.ogg +2024/11/01 | 145651 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-1.ogg +2024/11/01 | 73497 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-2.ogg +2024/11/01 | 178845 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-3.ogg +2024/11/01 | 84218 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-4.ogg +2024/11/01 | 77413 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-5.ogg +2024/11/01 | 266982 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-6.ogg +2024/11/01 | 677 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0.m3u +2024/11/01 | 24225 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0.ogg +2024/11/01 | 170139 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0-1.ogg +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0.m3u +2024/11/01 | 20517 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0.ogg +2024/11/01 | 157512 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-1.ogg +2024/11/01 | 232052 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-2.ogg +2024/11/01 | 138116 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-3.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0.m3u +2024/11/01 | 19599 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0.ogg +2024/11/01 | 5194 | macros/latex/contrib/spelatex/spelatex-spel/4.0.0.0.0.m3u +2024/11/01 | 13146 | macros/latex/contrib/spelatex/spelatex-spel/4.0.0.0.0.ogg +2024/11/01 | 49459 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-1.ogg +2024/11/01 | 20337 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-2.ogg +2024/11/01 | 17829 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-3.ogg +2024/11/01 | 14968 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-4.ogg +2024/11/01 | 16905 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-5.ogg +2024/11/01 | 31955 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-6.ogg +2024/11/01 | 32717 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-7.ogg +2024/11/01 | 4575 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0.m3u +2024/11/01 | 22463 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0.ogg +2024/11/01 | 167655 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-1.ogg +2024/11/01 | 135299 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-2.ogg +2024/11/01 | 63694 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-3.ogg +2024/11/01 | 87004 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-4.ogg +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0.m3u +2024/11/01 | 26567 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0.ogg +2024/11/01 | 333648 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-1.ogg +2024/11/01 | 87049 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-2.ogg +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0.m3u +2024/11/01 | 27721 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0.ogg +2024/11/01 | 94364 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-1.ogg +2024/11/01 | 66772 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-2.ogg +2024/11/01 | 44273 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-3.ogg +2024/11/01 | 104843 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-4.ogg +2024/11/01 | 45802 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-5.ogg +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0.m3u +2024/11/01 | 30360 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0.ogg +2024/11/01 | 138185 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-1.ogg +2024/11/01 | 144854 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-2.ogg +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0.m3u +2024/11/01 | 28771 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0.ogg +2024/11/01 | 103962 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-1.ogg +2024/11/01 | 59942 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-2.ogg +2024/11/01 | 64185 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-3.ogg +2024/11/01 | 92521 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-4.ogg +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0.m3u +2024/11/01 | 31552 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0.ogg +2024/11/01 | 113818 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-1.ogg +2024/11/01 | 56585 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-2.ogg +2024/11/01 | 78350 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-3.ogg +2024/11/01 | 44705 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-4.ogg +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0.m3u +2024/11/01 | 29964 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0.ogg +2024/11/01 | 267743 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-1.ogg +2024/11/01 | 31085 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-2.ogg +2024/11/01 | 32579 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-3.ogg +2024/11/01 | 66745 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-4.ogg +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0.m3u +2024/11/01 | 24223 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0.ogg +2024/11/01 | 81048 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-1.ogg +2024/11/01 | 36401 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-2.ogg +2024/11/01 | 49408 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-3.ogg +2024/11/01 | 53200 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-4.ogg +2024/11/01 | 9928 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-5.ogg +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0.m3u +2024/11/01 | 52258 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0.ogg +2024/11/01 | 35628 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-1.ogg +2024/11/01 | 59688 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-2.ogg +2024/11/01 | 35666 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-3.ogg +2024/11/01 | 56769 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-4.ogg +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0.m3u +2024/11/01 | 25176 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0.ogg +2024/11/01 | 41633 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-1.ogg +2024/11/01 | 61026 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-2.ogg +2024/11/01 | 44789 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-3.ogg +2024/11/01 | 82794 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-4.ogg +2024/11/01 | 93981 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-5.ogg +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0.m3u +2024/11/01 | 19984 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0.ogg +2024/11/01 | 50813 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0-1.ogg +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0.m3u +2024/11/01 | 14244 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0.ogg +2024/11/01 | 103136 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0-1.ogg +2024/11/01 | 4389 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0.m3u +2024/11/01 | 12633 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0.ogg +2024/11/01 | 83643 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0-1.ogg +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0.m3u +2024/11/01 | 17619 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0.ogg +2024/11/01 | 673 | macros/latex/contrib/spelatex/spelatex-spel/6.2.0.0.0.m3u +2024/11/01 | 18774 | macros/latex/contrib/spelatex/spelatex-spel/6.2.0.0.0.ogg +2024/11/01 | 38996 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-1.ogg +2024/11/01 | 80653 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-2.ogg +2024/11/01 | 21826 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-3.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0.m3u +2024/11/01 | 28099 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0.ogg +2024/11/01 | 78802 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0-1.ogg +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0.m3u +2024/11/01 | 28749 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0.ogg +2024/11/01 | 1116 | macros/latex/contrib/spelatex/spelatex-spel/6.3.0.0.0.m3u +2024/11/01 | 21905 | macros/latex/contrib/spelatex/spelatex-spel/6.3.0.0.0.ogg +2024/11/01 | 73250 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0-1.ogg +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0.m3u +2024/11/01 | 24697 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0.ogg +2024/11/01 | 12505 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-1.ogg +2024/11/01 | 55382 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-2.ogg +2024/11/01 | 11130 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-3.ogg +2024/11/01 | 34069 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-4.ogg +2024/11/01 | 11444 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-5.ogg +2024/11/01 | 24117 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-6.ogg +2024/11/01 | 677 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0.m3u +2024/11/01 | 27873 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0.ogg +2024/11/01 | 55513 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0-1.ogg +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0.m3u +2024/11/01 | 28471 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0.ogg +2024/11/01 | 36972 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0-1.ogg +2024/11/01 | 73657 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0-2.ogg +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0.m3u +2024/11/01 | 17379 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0.ogg +2024/11/01 | 13449 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0-1.ogg +2024/11/01 | 104147 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0-2.ogg +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0.m3u +2024/11/01 | 19345 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0.ogg +2024/11/01 | 762 | macros/latex/contrib/spelatex/spelatex-spel/6.6.0.0.0.m3u +2024/11/01 | 21207 | macros/latex/contrib/spelatex/spelatex-spel/6.6.0.0.0.ogg +2024/11/01 | 27251 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-1.ogg +2024/11/01 | 94513 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-2.ogg +2024/11/01 | 16847 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-3.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0.m3u +2024/11/01 | 20541 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0.ogg +2024/11/01 | 37328 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-1.ogg +2024/11/01 | 70900 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-2.ogg +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0.m3u +2024/11/01 | 20955 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0.ogg +2024/11/01 | 131060 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-10.ogg +2024/11/01 | 69856 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-11.ogg +2024/11/01 | 113548 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-1.ogg +2024/11/01 | 57815 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-2.ogg +2024/11/01 | 41688 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-3.ogg +2024/11/01 | 56609 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-4.ogg +2024/11/01 | 62902 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-5.ogg +2024/11/01 | 123843 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-6.ogg +2024/11/01 | 28210 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-7.ogg +2024/11/01 | 30482 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-8.ogg +2024/11/01 | 23883 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-9.ogg +2024/11/01 | 1124 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0.m3u +2024/11/01 | 20555 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0.ogg +2024/11/01 | 64306 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0-1.ogg +2024/11/01 | 2504 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0.m3u +2024/11/01 | 15080 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0.ogg +2024/11/01 | 320 | macros/latex/contrib/spelatex/spelatex-spel/7.10.0.0.0.m3u +2024/11/01 | 30441 | macros/latex/contrib/spelatex/spelatex-spel/7.10.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.1.0.0.0.m3u +2024/11/01 | 20095 | macros/latex/contrib/spelatex/spelatex-spel/7.1.0.0.0.ogg +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.10.1.0.0.m3u +2024/11/01 | 33980 | macros/latex/contrib/spelatex/spelatex-spel/7.10.1.0.0.ogg +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.10.2.0.0.m3u +2024/11/01 | 25990 | macros/latex/contrib/spelatex/spelatex-spel/7.10.2.0.0.ogg +2024/11/01 | 584 | macros/latex/contrib/spelatex/spelatex-spel/7.11.0.0.0.m3u +2024/11/01 | 26438 | macros/latex/contrib/spelatex/spelatex-spel/7.11.0.0.0.ogg +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.1.0.0.m3u +2024/11/01 | 31172 | macros/latex/contrib/spelatex/spelatex-spel/7.11.1.0.0.ogg +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.2.0.0.m3u +2024/11/01 | 29964 | macros/latex/contrib/spelatex/spelatex-spel/7.11.2.0.0.ogg +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.3.0.0.m3u +2024/11/01 | 31297 | macros/latex/contrib/spelatex/spelatex-spel/7.11.3.0.0.ogg +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.4.0.0.m3u +2024/11/01 | 31865 | macros/latex/contrib/spelatex/spelatex-spel/7.11.4.0.0.ogg +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.5.0.0.m3u +2024/11/01 | 28100 | macros/latex/contrib/spelatex/spelatex-spel/7.11.5.0.0.ogg +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.12.0.0.0.m3u +2024/11/01 | 22712 | macros/latex/contrib/spelatex/spelatex-spel/7.12.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.2.0.0.0.m3u +2024/11/01 | 21437 | macros/latex/contrib/spelatex/spelatex-spel/7.2.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.3.0.0.0.m3u +2024/11/01 | 18369 | macros/latex/contrib/spelatex/spelatex-spel/7.3.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.4.0.0.0.m3u +2024/11/01 | 17710 | macros/latex/contrib/spelatex/spelatex-spel/7.4.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.5.0.0.0.m3u +2024/11/01 | 19920 | macros/latex/contrib/spelatex/spelatex-spel/7.5.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.6.0.0.0.m3u +2024/11/01 | 22306 | macros/latex/contrib/spelatex/spelatex-spel/7.6.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.7.0.0.0.m3u +2024/11/01 | 21099 | macros/latex/contrib/spelatex/spelatex-spel/7.7.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.8.0.0.0.m3u +2024/11/01 | 21720 | macros/latex/contrib/spelatex/spelatex-spel/7.8.0.0.0.ogg +2024/11/01 | 752 | macros/latex/contrib/spelatex/spelatex-spel/7.9.0.0.0.m3u +2024/11/01 | 28374 | macros/latex/contrib/spelatex/spelatex-spel/7.9.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.1.0.0.m3u +2024/11/01 | 24118 | macros/latex/contrib/spelatex/spelatex-spel/7.9.1.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.2.0.0.m3u +2024/11/01 | 22681 | macros/latex/contrib/spelatex/spelatex-spel/7.9.2.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.3.0.0.m3u +2024/11/01 | 23444 | macros/latex/contrib/spelatex/spelatex-spel/7.9.3.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.4.0.0.m3u +2024/11/01 | 24256 | macros/latex/contrib/spelatex/spelatex-spel/7.9.4.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.5.0.0.m3u +2024/11/01 | 20629 | macros/latex/contrib/spelatex/spelatex-spel/7.9.5.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.6.0.0.m3u +2024/11/01 | 29599 | macros/latex/contrib/spelatex/spelatex-spel/7.9.6.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.7.0.0.m3u +2024/11/01 | 23431 | macros/latex/contrib/spelatex/spelatex-spel/7.9.7.0.0.ogg +2024/11/01 | 23138 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-1.ogg +2024/11/01 | 48292 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-2.ogg +2024/11/01 | 18160 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-3.ogg +2024/11/01 | 692 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0.m3u +2024/11/01 | 12564 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0.ogg +2024/11/01 | 8673 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-2.ogg +2024/11/01 | 9620 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-3.ogg +2024/11/01 | 7220 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-4.ogg +2024/11/01 | 31731 | macros/latex/contrib/spelatex/spelatex-spel/author.ogg +2024/11/01 | 26247 | macros/latex/contrib/spelatex/spelatex-spel/date.ogg +2024/11/01 | 59163 | macros/latex/contrib/spelatex/spelatex-spel/footnote-1.ogg +2024/11/01 | 59163 | macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg +2024/11/01 | 32152 | macros/latex/contrib/spelatex/spelatex-spel/footnote-3.ogg +2024/11/01 | 32152 | macros/latex/contrib/spelatex/spelatex-spel/footnote-4.ogg +2024/11/01 | 22432 | macros/latex/contrib/spelatex/spelatex-spel/title.ogg +2024/11/01 | 20967874 | macros/latex/contrib/spelatex.zip 2010/10/31 | 241052 | macros/latex/contrib/sphack/sphack-doc.pdf 2010/10/31 | 4122 | macros/latex/contrib/sphack/sphack-doc.tex 2010/12/23 | 4230 | macros/latex/contrib/sphack/sphack.sty @@ -259863,391 +259875,393 @@ 2022/04/18 | 501158 | macros/latex/contrib/zwpagelayout/zwpagelayout.pdf 2022/04/18 | 36154 | macros/latex/contrib/zwpagelayout/zwpagelayout.sty 2022/04/18 | 69553 | macros/latex/contrib/zwpagelayout/zwpagelayout.tex -2024/10/13 | 7103 | macros/latex-dev/base/alltt.dtx -2024/10/13 | 2890 | macros/latex-dev/base/alltt.ins -2024/10/13 | 223766 | macros/latex-dev/base/alltt.pdf -2024/10/13 | 3282 | macros/latex-dev/base/bugs.txt -2024/10/13 | 264168 | macros/latex-dev/base/cfgguide.pdf -2024/10/13 | 22723 | macros/latex-dev/base/cfgguide.tex -2024/10/13 | 42708 | macros/latex-dev/base/changes.old.txt -2024/10/13 | 419491 | macros/latex-dev/base/changes.txt -2024/10/13 | 156258 | macros/latex-dev/base/classes.dtx -2024/10/13 | 4087 | macros/latex-dev/base/classes.ins -2024/10/13 | 560495 | macros/latex-dev/base/classes.pdf -2024/10/13 | 415956 | macros/latex-dev/base/clsguide-historic.pdf -2024/10/13 | 69441 | macros/latex-dev/base/clsguide-historic.tex -2024/10/13 | 495486 | macros/latex-dev/base/clsguide.pdf -2024/10/13 | 69087 | macros/latex-dev/base/clsguide.tex -2024/10/13 | 5273 | macros/latex-dev/base/cmextra.ins -2024/10/13 | 44531 | macros/latex-dev/base/cmfonts.fdd -2024/10/13 | 4324 | macros/latex-dev/base/cmfonts.ins -2024/10/13 | 292600 | macros/latex-dev/base/cmfonts.pdf -2024/10/13 | 257359 | macros/latex-dev/base/cyrguide.pdf -2024/10/13 | 17782 | macros/latex-dev/base/cyrguide.tex -2024/10/13 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty -2024/10/13 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty -2024/10/13 | 1079175 | macros/latex-dev/base/doc-code.pdf -2024/10/13 | 96 | macros/latex-dev/base/doc-code.tex -2024/10/13 | 241889 | macros/latex-dev/base/doc.dtx -2024/10/13 | 758107 | macros/latex-dev/base/doc.pdf -2024/10/13 | 171410 | macros/latex-dev/base/docstrip.dtx -2024/10/13 | 4273 | macros/latex-dev/base/docstrip.ins -2024/10/13 | 506772 | macros/latex-dev/base/docstrip.pdf -2024/10/13 | 4390 | macros/latex-dev/base/ec.ins -2024/10/13 | 1318576 | macros/latex-dev/base/encguide.pdf -2024/10/13 | 52813 | macros/latex-dev/base/encguide.tex -2024/10/13 | 7216 | macros/latex-dev/base/exscale.dtx -2024/10/13 | 3338 | macros/latex-dev/base/exscale.ins -2024/10/13 | 204708 | macros/latex-dev/base/exscale.pdf -2024/10/13 | 23516 | macros/latex-dev/base/fix-cm.dtx -2024/10/13 | 2892 | macros/latex-dev/base/fix-cm.ins -2024/10/13 | 287727 | macros/latex-dev/base/fix-cm.pdf -2024/10/13 | 522637 | macros/latex-dev/base/fntguide.pdf -2024/10/13 | 111446 | macros/latex-dev/base/fntguide.tex -2024/10/13 | 60824 | macros/latex-dev/base/fontdef.dtx -2024/10/13 | 10072 | macros/latex-dev/base/format.ins -2024/10/13 | 5509 | macros/latex-dev/base/graphpap.dtx -2024/10/13 | 2892 | macros/latex-dev/base/graphpap.ins -2024/10/13 | 161722 | macros/latex-dev/base/graphpap.pdf -2024/10/13 | 2705 | macros/latex-dev/base/idx.tex -2024/10/13 | 19199 | macros/latex-dev/base/ifthen.dtx -2024/10/13 | 2888 | macros/latex-dev/base/ifthen.ins -2024/10/13 | 222460 | macros/latex-dev/base/ifthen.pdf -2024/10/13 | 106906 | macros/latex-dev/base/inputenc.dtx -2024/10/13 | 5714 | macros/latex-dev/base/inputenc.ins -2024/10/13 | 318372 | macros/latex-dev/base/inputenc.pdf -2024/10/13 | 4079 | macros/latex-dev/base/lablst.tex -2024/10/13 | 13759 | macros/latex-dev/base/lamport-manual.err -2024/10/13 | 170876 | macros/latex-dev/base/lamport-manual.pdf -2024/10/13 | 38730 | macros/latex-dev/base/latex209.dtx -2024/10/13 | 4219 | macros/latex-dev/base/latex209.ins -2024/10/13 | 45346 | macros/latex-dev/base/latexrelease.dtx -2024/10/13 | 6202 | macros/latex-dev/base/latexrelease.ins -2024/10/13 | 282447 | macros/latex-dev/base/latexrelease.pdf -2024/10/13 | 6709 | macros/latex-dev/base/latexsym.dtx -2024/10/13 | 5041 | macros/latex-dev/base/latexsym.ins -2024/10/13 | 200759 | macros/latex-dev/base/latexsym.pdf -2024/10/13 | 53334 | macros/latex-dev/base/lb2.err -2024/10/13 | 252519 | macros/latex-dev/base/lb2.pdf -2024/10/13 | 1279 | macros/latex-dev/base/legal.txt -2024/10/13 | 63341 | macros/latex-dev/base/letter.dtx -2024/10/13 | 3372 | macros/latex-dev/base/letter.ins -2024/10/13 | 337788 | macros/latex-dev/base/letter.pdf -2024/10/13 | 21229 | macros/latex-dev/base/lgc2.err -2024/10/13 | 217663 | macros/latex-dev/base/lgc2.pdf -2024/10/13 | 9068 | macros/latex-dev/base/lppl-1-0.txt -2024/10/13 | 14341 | macros/latex-dev/base/lppl-1-1.txt -2024/10/13 | 14421 | macros/latex-dev/base/lppl-1-2.txt -2024/10/13 | 132370 | macros/latex-dev/base/lppl.pdf -2024/10/13 | 23386 | macros/latex-dev/base/lppl.tex -2024/10/13 | 19040 | macros/latex-dev/base/lppl.txt -2024/10/13 | 4298 | macros/latex-dev/base/ltalloc.dtx -2024/10/13 | 17389 | macros/latex-dev/base/ltbibl.dtx -2024/10/13 | 51638 | macros/latex-dev/base/ltboxes.dtx -2024/10/13 | 152125 | macros/latex-dev/base/ltclass.dtx -2024/10/13 | 193083 | macros/latex-dev/base/ltcmd.dtx -2024/10/13 | 753317 | macros/latex-dev/base/ltcmdhooks-code.pdf -2024/10/13 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex -2024/10/13 | 498918 | macros/latex-dev/base/ltcmdhooks-doc.pdf -2024/10/13 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex -2024/10/13 | 68373 | macros/latex-dev/base/ltcmdhooks.dtx -2024/10/13 | 9557 | macros/latex-dev/base/ltcntrl.dtx -2024/10/13 | 27303 | macros/latex-dev/base/ltcounts.dtx -2024/10/13 | 93194 | macros/latex-dev/base/ltdefns.dtx -2024/10/13 | 35431 | macros/latex-dev/base/ltdirchk.dtx -2024/10/13 | 27372 | macros/latex-dev/base/lterror.dtx -2024/10/13 | 20030 | macros/latex-dev/base/ltexpl.dtx -2024/10/13 | 806610 | macros/latex-dev/base/ltfilehook-code.pdf -2024/10/13 | 105 | macros/latex-dev/base/ltfilehook-code.tex -2024/10/13 | 551943 | macros/latex-dev/base/ltfilehook-doc.pdf -2024/10/13 | 241 | macros/latex-dev/base/ltfilehook-doc.tex -2024/10/13 | 67898 | macros/latex-dev/base/ltfilehook.dtx -2024/10/13 | 62897 | macros/latex-dev/base/ltfiles.dtx -2024/10/13 | 51161 | macros/latex-dev/base/ltfinal.dtx -2024/10/13 | 55687 | macros/latex-dev/base/ltfloat.dtx -2024/10/13 | 29270 | macros/latex-dev/base/ltfntcmd.dtx -2024/10/13 | 58548 | macros/latex-dev/base/ltfssaxes.dtx -2024/10/13 | 83043 | macros/latex-dev/base/ltfssbas.dtx -2024/10/13 | 10370 | macros/latex-dev/base/ltfsscmp.dtx -2024/10/13 | 75111 | macros/latex-dev/base/ltfssdcl.dtx -2024/10/13 | 84233 | macros/latex-dev/base/ltfssini.dtx -2024/10/13 | 72493 | macros/latex-dev/base/ltfsstrc.dtx -2024/10/13 | 1251255 | macros/latex-dev/base/lthooks-code.pdf -2024/10/13 | 102 | macros/latex-dev/base/lthooks-code.tex -2024/10/13 | 762323 | macros/latex-dev/base/lthooks-doc.pdf -2024/10/13 | 238 | macros/latex-dev/base/lthooks-doc.tex -2024/10/13 | 307136 | macros/latex-dev/base/lthooks.dtx -2024/10/13 | 4945 | macros/latex-dev/base/lthyphen.dtx -2024/10/13 | 5859 | macros/latex-dev/base/ltidxglo.dtx -2024/10/13 | 23177 | macros/latex-dev/base/ltkeys.dtx -2024/10/13 | 5463 | macros/latex-dev/base/ltlength.dtx -2024/10/13 | 40804 | macros/latex-dev/base/ltlists.dtx -2024/10/13 | 3725 | macros/latex-dev/base/ltlogos.dtx -2024/10/13 | 75698 | macros/latex-dev/base/ltluatex.dtx -2024/10/13 | 325889 | macros/latex-dev/base/ltluatex.pdf -2024/10/13 | 717810 | macros/latex-dev/base/ltmarks-code.pdf -2024/10/13 | 102 | macros/latex-dev/base/ltmarks-code.tex -2024/10/13 | 575888 | macros/latex-dev/base/ltmarks-doc.pdf -2024/10/13 | 238 | macros/latex-dev/base/ltmarks-doc.tex -2024/10/13 | 80523 | macros/latex-dev/base/ltmarks.dtx -2024/10/13 | 42287 | macros/latex-dev/base/ltmath.dtx -2024/10/13 | 6901 | macros/latex-dev/base/ltmeta.dtx -2024/10/13 | 68616 | macros/latex-dev/base/ltmiscen.dtx -2024/10/13 | 169553 | macros/latex-dev/base/ltnews01.pdf -2024/10/13 | 5246 | macros/latex-dev/base/ltnews01.tex -2024/10/13 | 151773 | macros/latex-dev/base/ltnews02.pdf -2024/10/13 | 5462 | macros/latex-dev/base/ltnews02.tex -2024/10/13 | 151324 | macros/latex-dev/base/ltnews03.pdf -2024/10/13 | 5369 | macros/latex-dev/base/ltnews03.tex -2024/10/13 | 152551 | macros/latex-dev/base/ltnews04.pdf -2024/10/13 | 5678 | macros/latex-dev/base/ltnews04.tex -2024/10/13 | 175211 | macros/latex-dev/base/ltnews05.pdf -2024/10/13 | 5699 | macros/latex-dev/base/ltnews05.tex -2024/10/13 | 142867 | macros/latex-dev/base/ltnews06.pdf -2024/10/13 | 5544 | macros/latex-dev/base/ltnews06.tex -2024/10/13 | 138214 | macros/latex-dev/base/ltnews07.pdf -2024/10/13 | 5576 | macros/latex-dev/base/ltnews07.tex -2024/10/13 | 155442 | macros/latex-dev/base/ltnews08.pdf -2024/10/13 | 5732 | macros/latex-dev/base/ltnews08.tex -2024/10/13 | 130028 | macros/latex-dev/base/ltnews09.pdf -2024/10/13 | 5451 | macros/latex-dev/base/ltnews09.tex -2024/10/13 | 169433 | macros/latex-dev/base/ltnews10.pdf -2024/10/13 | 5825 | macros/latex-dev/base/ltnews10.tex -2024/10/13 | 112208 | macros/latex-dev/base/ltnews11.pdf -2024/10/13 | 5529 | macros/latex-dev/base/ltnews11.tex -2024/10/13 | 156764 | macros/latex-dev/base/ltnews12.pdf -2024/10/13 | 5574 | macros/latex-dev/base/ltnews12.tex -2024/10/13 | 182483 | macros/latex-dev/base/ltnews13.pdf -2024/10/13 | 7029 | macros/latex-dev/base/ltnews13.tex -2024/10/13 | 170722 | macros/latex-dev/base/ltnews14.pdf -2024/10/13 | 6424 | macros/latex-dev/base/ltnews14.tex -2024/10/13 | 130328 | macros/latex-dev/base/ltnews15.pdf -2024/10/13 | 5986 | macros/latex-dev/base/ltnews15.tex -2024/10/13 | 138107 | macros/latex-dev/base/ltnews16.pdf -2024/10/13 | 5775 | macros/latex-dev/base/ltnews16.tex -2024/10/13 | 166269 | macros/latex-dev/base/ltnews17.pdf -2024/10/13 | 8970 | macros/latex-dev/base/ltnews17.tex -2024/10/13 | 39839 | macros/latex-dev/base/ltnews18.pdf -2024/10/13 | 1341 | macros/latex-dev/base/ltnews18.tex -2024/10/13 | 225936 | macros/latex-dev/base/ltnews19.pdf -2024/10/13 | 4190 | macros/latex-dev/base/ltnews19.tex -2024/10/13 | 318193 | macros/latex-dev/base/ltnews20.pdf -2024/10/13 | 7244 | macros/latex-dev/base/ltnews20.tex -2024/10/13 | 245228 | macros/latex-dev/base/ltnews21.pdf -2024/10/13 | 9935 | macros/latex-dev/base/ltnews21.tex -2024/10/13 | 318026 | macros/latex-dev/base/ltnews22.pdf -2024/10/13 | 10792 | macros/latex-dev/base/ltnews22.tex -2024/10/13 | 286824 | macros/latex-dev/base/ltnews23.pdf -2024/10/13 | 10791 | macros/latex-dev/base/ltnews23.tex -2024/10/13 | 265497 | macros/latex-dev/base/ltnews24.pdf -2024/10/13 | 12334 | macros/latex-dev/base/ltnews24.tex -2024/10/13 | 205100 | macros/latex-dev/base/ltnews25.pdf -2024/10/13 | 5588 | macros/latex-dev/base/ltnews25.tex -2024/10/13 | 379733 | macros/latex-dev/base/ltnews26.pdf -2024/10/13 | 10798 | macros/latex-dev/base/ltnews26.tex -2024/10/13 | 251283 | macros/latex-dev/base/ltnews27.pdf -2024/10/13 | 5691 | macros/latex-dev/base/ltnews27.tex -2024/10/13 | 376950 | macros/latex-dev/base/ltnews28.pdf -2024/10/13 | 15047 | macros/latex-dev/base/ltnews28.tex -2024/10/13 | 455437 | macros/latex-dev/base/ltnews29.pdf -2024/10/13 | 18944 | macros/latex-dev/base/ltnews29.tex -2024/10/13 | 512240 | macros/latex-dev/base/ltnews30.pdf -2024/10/13 | 23646 | macros/latex-dev/base/ltnews30.tex -2024/10/13 | 526681 | macros/latex-dev/base/ltnews31.pdf -2024/10/13 | 30448 | macros/latex-dev/base/ltnews31.tex -2024/10/13 | 546540 | macros/latex-dev/base/ltnews32.pdf -2024/10/13 | 33243 | macros/latex-dev/base/ltnews32.tex -2024/10/13 | 522757 | macros/latex-dev/base/ltnews33.pdf -2024/10/13 | 33911 | macros/latex-dev/base/ltnews33.tex -2024/10/13 | 508345 | macros/latex-dev/base/ltnews34.pdf -2024/10/13 | 32331 | macros/latex-dev/base/ltnews34.tex -2024/10/13 | 563305 | macros/latex-dev/base/ltnews35.pdf -2024/10/13 | 38225 | macros/latex-dev/base/ltnews35.tex -2024/10/13 | 517934 | macros/latex-dev/base/ltnews36.pdf -2024/10/13 | 19333 | macros/latex-dev/base/ltnews36.tex -2024/10/13 | 456933 | macros/latex-dev/base/ltnews37.pdf -2024/10/13 | 33083 | macros/latex-dev/base/ltnews37.tex -2024/10/13 | 523675 | macros/latex-dev/base/ltnews38.pdf -2024/10/13 | 22946 | macros/latex-dev/base/ltnews38.tex -2024/10/13 | 541772 | macros/latex-dev/base/ltnews39.pdf -2024/10/13 | 36656 | macros/latex-dev/base/ltnews39.tex -2024/10/13 | 486885 | macros/latex-dev/base/ltnews40.pdf -2024/10/13 | 20334 | macros/latex-dev/base/ltnews40.tex -2024/10/13 | 21488 | macros/latex-dev/base/ltnews.cls -2024/10/13 | 1431653 | macros/latex-dev/base/ltnews.pdf -2024/10/13 | 8051 | macros/latex-dev/base/ltnews.tex -2024/10/13 | 148564 | macros/latex-dev/base/ltoutenc.dtx -2024/10/13 | 3367 | macros/latex-dev/base/ltoutenc.ins -2024/10/13 | 178564 | macros/latex-dev/base/ltoutput.dtx -2024/10/13 | 14091 | macros/latex-dev/base/ltpage.dtx -2024/10/13 | 2728 | macros/latex-dev/base/ltpageno.dtx -2024/10/13 | 672995 | macros/latex-dev/base/ltpara-code.pdf -2024/10/13 | 99 | macros/latex-dev/base/ltpara-code.tex -2024/10/13 | 560715 | macros/latex-dev/base/ltpara-doc.pdf -2024/10/13 | 234 | macros/latex-dev/base/ltpara-doc.tex -2024/10/13 | 54988 | macros/latex-dev/base/ltpara.dtx -2024/10/13 | 6155 | macros/latex-dev/base/ltpar.dtx -2024/10/13 | 68979 | macros/latex-dev/base/ltpictur.dtx -2024/10/13 | 60434 | macros/latex-dev/base/ltplain.dtx -2024/10/13 | 557533 | macros/latex-dev/base/ltproperties-code.pdf -2024/10/13 | 107 | macros/latex-dev/base/ltproperties-code.tex -2024/10/13 | 432296 | macros/latex-dev/base/ltproperties-doc.pdf -2024/10/13 | 243 | macros/latex-dev/base/ltproperties-doc.tex -2024/10/13 | 34336 | macros/latex-dev/base/ltproperties.dtx -2024/10/13 | 33928 | macros/latex-dev/base/ltsect.dtx -2024/10/13 | 821586 | macros/latex-dev/base/ltshipout-code.pdf -2024/10/13 | 104 | macros/latex-dev/base/ltshipout-code.tex -2024/10/13 | 567758 | macros/latex-dev/base/ltshipout-doc.pdf -2024/10/13 | 240 | macros/latex-dev/base/ltshipout-doc.tex -2024/10/13 | 80747 | macros/latex-dev/base/ltshipout.dtx -2024/10/13 | 599231 | macros/latex-dev/base/ltsockets-code.pdf -2024/10/13 | 104 | macros/latex-dev/base/ltsockets-code.tex -2024/10/13 | 482086 | macros/latex-dev/base/ltsockets-doc.pdf -2024/10/13 | 240 | macros/latex-dev/base/ltsockets-doc.tex -2024/10/13 | 37714 | macros/latex-dev/base/ltsockets.dtx -2024/10/13 | 49532 | macros/latex-dev/base/ltspace.dtx -2024/10/13 | 47895 | macros/latex-dev/base/lttab.dtx -2024/10/13 | 32771 | macros/latex-dev/base/lttagging.dtx -2024/10/13 | 751718 | macros/latex-dev/base/lttemplates-code.pdf -2024/10/13 | 106 | macros/latex-dev/base/lttemplates-code.tex -2024/10/13 | 467500 | macros/latex-dev/base/lttemplates-doc.pdf -2024/10/13 | 242 | macros/latex-dev/base/lttemplates-doc.tex -2024/10/13 | 91054 | macros/latex-dev/base/lttemplates.dtx -2024/10/13 | 114477 | macros/latex-dev/base/lttextcomp.dtx -2024/10/13 | 10169 | macros/latex-dev/base/ltthm.dtx -2024/10/13 | 15384 | macros/latex-dev/base/ltvers.dtx -2024/10/13 | 219358 | macros/latex-dev/base/ltx3info.pdf -2024/10/13 | 18299 | macros/latex-dev/base/ltx3info.tex -2024/10/13 | 27122 | macros/latex-dev/base/ltxcheck.tex -2024/10/13 | 22822 | macros/latex-dev/base/ltxdoc.dtx -2024/10/13 | 244141 | macros/latex-dev/base/ltxdoc.pdf -2024/10/13 | 7528 | macros/latex-dev/base/ltxguide.cls -2024/10/13 | 24883 | macros/latex-dev/base/ltxref.dtx -2024/10/13 | 10601 | macros/latex-dev/base/makeindx.dtx -2024/10/13 | 3434 | macros/latex-dev/base/makeindx.ins -2024/10/13 | 165816 | macros/latex-dev/base/makeindx.pdf -2024/10/13 | 11964 | macros/latex-dev/base/manifest.txt -2024/10/13 | 1941 | macros/latex-dev/base/minimal.cls -2024/10/13 | 257825 | macros/latex-dev/base/modguide.pdf -2024/10/13 | 16500 | macros/latex-dev/base/modguide.tex -2024/10/13 | 4254 | macros/latex-dev/base/newdc.ins -2024/10/13 | 6357 | macros/latex-dev/base/newlfont.dtx -2024/10/13 | 18401 | macros/latex-dev/base/nfssfont.dtx -2024/10/13 | 2893 | macros/latex-dev/base/nfssfont.ins -2024/10/13 | 211314 | macros/latex-dev/base/nfssfont.pdf -2024/10/13 | 3960 | macros/latex-dev/base/olddc.ins -2024/10/13 | 8626 | macros/latex-dev/base/oldlfont.dtx -2024/10/13 | 9345 | macros/latex-dev/base/preload.dtx -2024/10/13 | 13589 | macros/latex-dev/base/proc.dtx -2024/10/13 | 3401 | macros/latex-dev/base/proc.ins -2024/10/13 | 227065 | macros/latex-dev/base/proc.pdf -2024/10/13 | 3083 | macros/latex-dev/base/README.md -2024/10/13 | 7200 | macros/latex-dev/base/sample2e.tex -2024/10/13 | 89727 | macros/latex-dev/base/slides.dtx -2024/10/13 | 6760 | macros/latex-dev/base/slides.ins -2024/10/13 | 375493 | macros/latex-dev/base/slides.pdf -2024/10/13 | 15693 | macros/latex-dev/base/slifonts.fdd -2024/10/13 | 233905 | macros/latex-dev/base/slifonts.pdf -2024/10/13 | 1694 | macros/latex-dev/base/small2e.tex -2024/10/13 | 6911 | macros/latex-dev/base/source2edoc.cls -2024/10/13 | 6506843 | macros/latex-dev/base/source2e.pdf -2024/10/13 | 15553 | macros/latex-dev/base/source2e.tex -2024/10/13 | 9398 | macros/latex-dev/base/syntonly.dtx -2024/10/13 | 2896 | macros/latex-dev/base/syntonly.ins -2024/10/13 | 189462 | macros/latex-dev/base/syntonly.pdf -2024/10/13 | 12520 | macros/latex-dev/base/testpage.tex -2024/10/13 | 173013 | macros/latex-dev/base/tlc2.err -2024/10/13 | 290257 | macros/latex-dev/base/tlc2.pdf -2024/10/13 | 51067 | macros/latex-dev/base/tlc3.err -2024/10/13 | 385504 | macros/latex-dev/base/tlc3.pdf -2024/10/13 | 12246 | macros/latex-dev/base/tulm.fdd -2024/10/13 | 3781 | macros/latex-dev/base/tulm.ins -2024/10/13 | 162773 | macros/latex-dev/base/tulm.pdf -2024/10/13 | 3181 | macros/latex-dev/base/unpack.ins -2024/10/13 | 439393 | macros/latex-dev/base/usrguide-historic.pdf -2024/10/13 | 68746 | macros/latex-dev/base/usrguide-historic.tex -2024/10/13 | 487553 | macros/latex-dev/base/usrguide.pdf -2024/10/13 | 58474 | macros/latex-dev/base/usrguide.tex -2024/10/13 | 92294 | macros/latex-dev/base/utf8ienc.dtx -2024/10/13 | 353390 | macros/latex-dev/base/utf8ienc.pdf -2024/10/13 | 10247 | macros/latex-dev/base/webcomp.err -2024/10/13 | 146205 | macros/latex-dev/base/webcomp.pdf -2024/10/13 | 45816048 | macros/latex-dev/base.zip -2024/10/13 | 8663 | macros/latex-dev/required/amsmath/amsbsy.dtx -2024/10/13 | 1505 | macros/latex-dev/required/amsmath/amsbsy.ins -2024/10/13 | 174946 | macros/latex-dev/required/amsmath/amsbsy.pdf -2024/10/13 | 11284 | macros/latex-dev/required/amsmath/amscd.dtx -2024/10/13 | 1487 | macros/latex-dev/required/amsmath/amscd.ins -2024/10/13 | 179948 | macros/latex-dev/required/amsmath/amscd.pdf -2024/10/13 | 5313 | macros/latex-dev/required/amsmath/ams-external.txt -2024/10/13 | 13442 | macros/latex-dev/required/amsmath/amsgen.dtx -2024/10/13 | 1484 | macros/latex-dev/required/amsmath/amsgen.ins -2024/10/13 | 178193 | macros/latex-dev/required/amsmath/amsgen.pdf -2024/10/13 | 5860 | macros/latex-dev/required/amsmath/ams-internal.txt -2024/10/13 | 508207 | macros/latex-dev/required/amsmath/amsldoc.pdf -2024/10/13 | 104792 | macros/latex-dev/required/amsmath/amsldoc.tex -2024/10/13 | 85247 | macros/latex-dev/required/amsmath/amsmath-2018-12-01.sty -2024/10/13 | 232339 | macros/latex-dev/required/amsmath/amsmath.dtx -2024/10/13 | 1504 | macros/latex-dev/required/amsmath/amsmath.ins -2024/10/13 | 421790 | macros/latex-dev/required/amsmath/amsmath.pdf -2024/10/13 | 10199 | macros/latex-dev/required/amsmath/amsopn.dtx -2024/10/13 | 1490 | macros/latex-dev/required/amsmath/amsopn.ins -2024/10/13 | 140093 | macros/latex-dev/required/amsmath/amsopn.pdf -2024/10/13 | 69732 | macros/latex-dev/required/amsmath/amstex.sty -2024/10/13 | 11398 | macros/latex-dev/required/amsmath/amstext.dtx -2024/10/13 | 1492 | macros/latex-dev/required/amsmath/amstext.ins -2024/10/13 | 217504 | macros/latex-dev/required/amsmath/amstext.pdf -2024/10/13 | 4336 | macros/latex-dev/required/amsmath/amsxtra.dtx -2024/10/13 | 1492 | macros/latex-dev/required/amsmath/amsxtra.ins -2024/10/13 | 113560 | macros/latex-dev/required/amsmath/amsxtra.pdf -2024/10/13 | 9155 | macros/latex-dev/required/amsmath/changes.txt -2024/10/13 | 22605 | macros/latex-dev/required/amsmath/diffs-m.txt -2024/10/13 | 369 | macros/latex-dev/required/amsmath/manifest.txt -2024/10/13 | 2723 | macros/latex-dev/required/amsmath/README.md -2024/10/13 | 109740 | macros/latex-dev/required/amsmath/subeqn.pdf -2024/10/13 | 6440 | macros/latex-dev/required/amsmath/subeqn.tex -2024/10/13 | 147459 | macros/latex-dev/required/amsmath/technote.pdf -2024/10/13 | 12005 | macros/latex-dev/required/amsmath/technote.tex -2024/10/13 | 454643 | macros/latex-dev/required/amsmath/testmath.pdf -2024/10/13 | 81184 | macros/latex-dev/required/amsmath/testmath.tex -2024/10/13 | 2765125 | macros/latex-dev/required/amsmath.zip -2024/10/13 | 6382 | macros/latex-dev/required/firstaid/changes.txt -2024/10/13 | 2744 | macros/latex-dev/required/firstaid/firstaid.ins -2024/10/13 | 25896 | macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx -2024/10/13 | 276636 | macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf -2024/10/13 | 474 | macros/latex-dev/required/firstaid/README.md -2024/10/13 | 277913 | macros/latex-dev/required/firstaid.zip -2024/10/13 | 15737 | macros/latex-dev/required/graphics/cat.eps -2024/10/13 | 36167 | macros/latex-dev/required/graphics/changes.txt -2024/10/13 | 32462 | macros/latex-dev/required/graphics/color.dtx -2024/10/13 | 212777 | macros/latex-dev/required/graphics/color.pdf -2024/10/13 | 50819 | macros/latex-dev/required/graphics/drivers.dtx -2024/10/13 | 286448 | macros/latex-dev/required/graphics/drivers.pdf -2024/10/13 | 4137 | macros/latex-dev/required/graphics/epsfig.dtx -2024/10/13 | 159239 | macros/latex-dev/required/graphics/epsfig.pdf -2024/10/13 | 15577 | macros/latex-dev/required/graphics/graphics-2017-06-25.sty -2024/10/13 | 2994 | macros/latex-dev/required/graphics/graphics-drivers.ins -2024/10/13 | 71006 | macros/latex-dev/required/graphics/graphics.dtx -2024/10/13 | 1189 | macros/latex-dev/required/graphics/graphics.ins -2024/10/13 | 303762 | macros/latex-dev/required/graphics/graphics.pdf -2024/10/13 | 30464 | macros/latex-dev/required/graphics/graphicx.dtx -2024/10/13 | 240618 | macros/latex-dev/required/graphics/graphicx.pdf -2024/10/13 | 331361 | macros/latex-dev/required/graphics/grfguide.pdf -2024/10/13 | 38040 | macros/latex-dev/required/graphics/grfguide.tex -2024/10/13 | 13875 | macros/latex-dev/required/graphics/keyval.dtx -2024/10/13 | 239587 | macros/latex-dev/required/graphics/keyval.pdf -2024/10/13 | 3946 | macros/latex-dev/required/graphics/lscape.dtx -2024/10/13 | 155987 | macros/latex-dev/required/graphics/lscape.pdf -2024/10/13 | 16168 | macros/latex-dev/required/graphics/mathcolor.dtx -2024/10/13 | 460753 | macros/latex-dev/required/graphics/mathcolor.pdf -2024/10/13 | 2090 | macros/latex-dev/required/graphics/README.md -2024/10/13 | 21067 | macros/latex-dev/required/graphics/rotating.dtx -2024/10/13 | 278524 | macros/latex-dev/required/graphics/rotating.pdf -2024/10/13 | 172252 | macros/latex-dev/required/graphics/rotex.pdf -2024/10/13 | 14575 | macros/latex-dev/required/graphics/rotex.tex -2024/10/13 | 10749 | macros/latex-dev/required/graphics/trig.dtx -2024/10/13 | 199290 | macros/latex-dev/required/graphics/trig.pdf -2024/10/13 | 3060929 | macros/latex-dev/required/graphics.zip +2024/10/31 | 7103 | macros/latex-dev/base/alltt.dtx +2024/10/31 | 2890 | macros/latex-dev/base/alltt.ins +2024/10/31 | 223766 | macros/latex-dev/base/alltt.pdf +2024/10/31 | 3282 | macros/latex-dev/base/bugs.txt +2024/10/31 | 264168 | macros/latex-dev/base/cfgguide.pdf +2024/10/31 | 22723 | macros/latex-dev/base/cfgguide.tex +2024/10/31 | 42708 | macros/latex-dev/base/changes.old.txt +2024/10/31 | 421161 | macros/latex-dev/base/changes.txt +2024/10/31 | 156258 | macros/latex-dev/base/classes.dtx +2024/10/31 | 4087 | macros/latex-dev/base/classes.ins +2024/10/31 | 560495 | macros/latex-dev/base/classes.pdf +2024/10/31 | 415956 | macros/latex-dev/base/clsguide-historic.pdf +2024/10/31 | 69441 | macros/latex-dev/base/clsguide-historic.tex +2024/10/31 | 495486 | macros/latex-dev/base/clsguide.pdf +2024/10/31 | 69087 | macros/latex-dev/base/clsguide.tex +2024/10/31 | 5273 | macros/latex-dev/base/cmextra.ins +2024/10/31 | 44531 | macros/latex-dev/base/cmfonts.fdd +2024/10/31 | 4324 | macros/latex-dev/base/cmfonts.ins +2024/10/31 | 292600 | macros/latex-dev/base/cmfonts.pdf +2024/10/31 | 257359 | macros/latex-dev/base/cyrguide.pdf +2024/10/31 | 17782 | macros/latex-dev/base/cyrguide.tex +2024/10/31 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty +2024/10/31 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty +2024/10/31 | 1078843 | macros/latex-dev/base/doc-code.pdf +2024/10/31 | 96 | macros/latex-dev/base/doc-code.tex +2024/10/31 | 241893 | macros/latex-dev/base/doc.dtx +2024/10/31 | 757312 | macros/latex-dev/base/doc.pdf +2024/10/31 | 171410 | macros/latex-dev/base/docstrip.dtx +2024/10/31 | 4273 | macros/latex-dev/base/docstrip.ins +2024/10/31 | 506772 | macros/latex-dev/base/docstrip.pdf +2024/10/31 | 4390 | macros/latex-dev/base/ec.ins +2024/10/31 | 1318576 | macros/latex-dev/base/encguide.pdf +2024/10/31 | 52813 | macros/latex-dev/base/encguide.tex +2024/10/31 | 7216 | macros/latex-dev/base/exscale.dtx +2024/10/31 | 3338 | macros/latex-dev/base/exscale.ins +2024/10/31 | 204708 | macros/latex-dev/base/exscale.pdf +2024/10/31 | 23516 | macros/latex-dev/base/fix-cm.dtx +2024/10/31 | 2892 | macros/latex-dev/base/fix-cm.ins +2024/10/31 | 287727 | macros/latex-dev/base/fix-cm.pdf +2024/10/31 | 522637 | macros/latex-dev/base/fntguide.pdf +2024/10/31 | 111446 | macros/latex-dev/base/fntguide.tex +2024/10/31 | 60824 | macros/latex-dev/base/fontdef.dtx +2024/10/31 | 10072 | macros/latex-dev/base/format.ins +2024/10/31 | 5509 | macros/latex-dev/base/graphpap.dtx +2024/10/31 | 2892 | macros/latex-dev/base/graphpap.ins +2024/10/31 | 161722 | macros/latex-dev/base/graphpap.pdf +2024/10/31 | 2705 | macros/latex-dev/base/idx.tex +2024/10/31 | 19199 | macros/latex-dev/base/ifthen.dtx +2024/10/31 | 2888 | macros/latex-dev/base/ifthen.ins +2024/10/31 | 222460 | macros/latex-dev/base/ifthen.pdf +2024/10/31 | 106906 | macros/latex-dev/base/inputenc.dtx +2024/10/31 | 5714 | macros/latex-dev/base/inputenc.ins +2024/10/31 | 318372 | macros/latex-dev/base/inputenc.pdf +2024/10/31 | 4079 | macros/latex-dev/base/lablst.tex +2024/10/31 | 13759 | macros/latex-dev/base/lamport-manual.err +2024/10/31 | 170876 | macros/latex-dev/base/lamport-manual.pdf +2024/10/31 | 38730 | macros/latex-dev/base/latex209.dtx +2024/10/31 | 4219 | macros/latex-dev/base/latex209.ins +2024/10/31 | 45346 | macros/latex-dev/base/latexrelease.dtx +2024/10/31 | 6202 | macros/latex-dev/base/latexrelease.ins +2024/10/31 | 282447 | macros/latex-dev/base/latexrelease.pdf +2024/10/31 | 6709 | macros/latex-dev/base/latexsym.dtx +2024/10/31 | 5041 | macros/latex-dev/base/latexsym.ins +2024/10/31 | 200759 | macros/latex-dev/base/latexsym.pdf +2024/10/31 | 53334 | macros/latex-dev/base/lb2.err +2024/10/31 | 252519 | macros/latex-dev/base/lb2.pdf +2024/10/31 | 1279 | macros/latex-dev/base/legal.txt +2024/10/31 | 63341 | macros/latex-dev/base/letter.dtx +2024/10/31 | 3372 | macros/latex-dev/base/letter.ins +2024/10/31 | 337788 | macros/latex-dev/base/letter.pdf +2024/10/31 | 21229 | macros/latex-dev/base/lgc2.err +2024/10/31 | 217663 | macros/latex-dev/base/lgc2.pdf +2024/10/31 | 9068 | macros/latex-dev/base/lppl-1-0.txt +2024/10/31 | 14341 | macros/latex-dev/base/lppl-1-1.txt +2024/10/31 | 14421 | macros/latex-dev/base/lppl-1-2.txt +2024/10/31 | 132370 | macros/latex-dev/base/lppl.pdf +2024/10/31 | 23386 | macros/latex-dev/base/lppl.tex +2024/10/31 | 19040 | macros/latex-dev/base/lppl.txt +2024/10/31 | 4298 | macros/latex-dev/base/ltalloc.dtx +2024/10/31 | 17389 | macros/latex-dev/base/ltbibl.dtx +2024/10/31 | 51638 | macros/latex-dev/base/ltboxes.dtx +2024/10/31 | 152125 | macros/latex-dev/base/ltclass.dtx +2024/10/31 | 193083 | macros/latex-dev/base/ltcmd.dtx +2024/10/31 | 756067 | macros/latex-dev/base/ltcmdhooks-code.pdf +2024/10/31 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex +2024/10/31 | 505075 | macros/latex-dev/base/ltcmdhooks-doc.pdf +2024/10/31 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex +2024/10/31 | 70868 | macros/latex-dev/base/ltcmdhooks.dtx +2024/10/31 | 9557 | macros/latex-dev/base/ltcntrl.dtx +2024/10/31 | 27557 | macros/latex-dev/base/ltcounts.dtx +2024/10/31 | 93194 | macros/latex-dev/base/ltdefns.dtx +2024/10/31 | 35431 | macros/latex-dev/base/ltdirchk.dtx +2024/10/31 | 27372 | macros/latex-dev/base/lterror.dtx +2024/10/31 | 20030 | macros/latex-dev/base/ltexpl.dtx +2024/10/31 | 806610 | macros/latex-dev/base/ltfilehook-code.pdf +2024/10/31 | 105 | macros/latex-dev/base/ltfilehook-code.tex +2024/10/31 | 551941 | macros/latex-dev/base/ltfilehook-doc.pdf +2024/10/31 | 241 | macros/latex-dev/base/ltfilehook-doc.tex +2024/10/31 | 67898 | macros/latex-dev/base/ltfilehook.dtx +2024/10/31 | 62897 | macros/latex-dev/base/ltfiles.dtx +2024/10/31 | 51161 | macros/latex-dev/base/ltfinal.dtx +2024/10/31 | 55687 | macros/latex-dev/base/ltfloat.dtx +2024/10/31 | 29270 | macros/latex-dev/base/ltfntcmd.dtx +2024/10/31 | 58548 | macros/latex-dev/base/ltfssaxes.dtx +2024/10/31 | 83043 | macros/latex-dev/base/ltfssbas.dtx +2024/10/31 | 10370 | macros/latex-dev/base/ltfsscmp.dtx +2024/10/31 | 75111 | macros/latex-dev/base/ltfssdcl.dtx +2024/10/31 | 84233 | macros/latex-dev/base/ltfssini.dtx +2024/10/31 | 72493 | macros/latex-dev/base/ltfsstrc.dtx +2024/10/31 | 1254049 | macros/latex-dev/base/lthooks-code.pdf +2024/10/31 | 102 | macros/latex-dev/base/lthooks-code.tex +2024/10/31 | 762877 | macros/latex-dev/base/lthooks-doc.pdf +2024/10/31 | 238 | macros/latex-dev/base/lthooks-doc.tex +2024/10/31 | 308133 | macros/latex-dev/base/lthooks.dtx +2024/10/31 | 4945 | macros/latex-dev/base/lthyphen.dtx +2024/10/31 | 5859 | macros/latex-dev/base/ltidxglo.dtx +2024/10/31 | 23177 | macros/latex-dev/base/ltkeys.dtx +2024/10/31 | 5463 | macros/latex-dev/base/ltlength.dtx +2024/10/31 | 40804 | macros/latex-dev/base/ltlists.dtx +2024/10/31 | 3725 | macros/latex-dev/base/ltlogos.dtx +2024/10/31 | 75698 | macros/latex-dev/base/ltluatex.dtx +2024/10/31 | 325889 | macros/latex-dev/base/ltluatex.pdf +2024/10/31 | 719005 | macros/latex-dev/base/ltmarks-code.pdf +2024/10/31 | 102 | macros/latex-dev/base/ltmarks-code.tex +2024/10/31 | 582809 | macros/latex-dev/base/ltmarks-doc.pdf +2024/10/31 | 238 | macros/latex-dev/base/ltmarks-doc.tex +2024/10/31 | 80919 | macros/latex-dev/base/ltmarks.dtx +2024/10/31 | 42287 | macros/latex-dev/base/ltmath.dtx +2024/10/31 | 6901 | macros/latex-dev/base/ltmeta.dtx +2024/10/31 | 68616 | macros/latex-dev/base/ltmiscen.dtx +2024/10/31 | 169553 | macros/latex-dev/base/ltnews01.pdf +2024/10/31 | 5246 | macros/latex-dev/base/ltnews01.tex +2024/10/31 | 151773 | macros/latex-dev/base/ltnews02.pdf +2024/10/31 | 5462 | macros/latex-dev/base/ltnews02.tex +2024/10/31 | 151324 | macros/latex-dev/base/ltnews03.pdf +2024/10/31 | 5369 | macros/latex-dev/base/ltnews03.tex +2024/10/31 | 152551 | macros/latex-dev/base/ltnews04.pdf +2024/10/31 | 5678 | macros/latex-dev/base/ltnews04.tex +2024/10/31 | 175211 | macros/latex-dev/base/ltnews05.pdf +2024/10/31 | 5699 | macros/latex-dev/base/ltnews05.tex +2024/10/31 | 142867 | macros/latex-dev/base/ltnews06.pdf +2024/10/31 | 5544 | macros/latex-dev/base/ltnews06.tex +2024/10/31 | 138214 | macros/latex-dev/base/ltnews07.pdf +2024/10/31 | 5576 | macros/latex-dev/base/ltnews07.tex +2024/10/31 | 155442 | macros/latex-dev/base/ltnews08.pdf +2024/10/31 | 5732 | macros/latex-dev/base/ltnews08.tex +2024/10/31 | 130028 | macros/latex-dev/base/ltnews09.pdf +2024/10/31 | 5451 | macros/latex-dev/base/ltnews09.tex +2024/10/31 | 169433 | macros/latex-dev/base/ltnews10.pdf +2024/10/31 | 5825 | macros/latex-dev/base/ltnews10.tex +2024/10/31 | 112208 | macros/latex-dev/base/ltnews11.pdf +2024/10/31 | 5529 | macros/latex-dev/base/ltnews11.tex +2024/10/31 | 156764 | macros/latex-dev/base/ltnews12.pdf +2024/10/31 | 5574 | macros/latex-dev/base/ltnews12.tex +2024/10/31 | 182483 | macros/latex-dev/base/ltnews13.pdf +2024/10/31 | 7029 | macros/latex-dev/base/ltnews13.tex +2024/10/31 | 170722 | macros/latex-dev/base/ltnews14.pdf +2024/10/31 | 6424 | macros/latex-dev/base/ltnews14.tex +2024/10/31 | 130328 | macros/latex-dev/base/ltnews15.pdf +2024/10/31 | 5986 | macros/latex-dev/base/ltnews15.tex +2024/10/31 | 138107 | macros/latex-dev/base/ltnews16.pdf +2024/10/31 | 5775 | macros/latex-dev/base/ltnews16.tex +2024/10/31 | 166269 | macros/latex-dev/base/ltnews17.pdf +2024/10/31 | 8970 | macros/latex-dev/base/ltnews17.tex +2024/10/31 | 39839 | macros/latex-dev/base/ltnews18.pdf +2024/10/31 | 1341 | macros/latex-dev/base/ltnews18.tex +2024/10/31 | 225936 | macros/latex-dev/base/ltnews19.pdf +2024/10/31 | 4190 | macros/latex-dev/base/ltnews19.tex +2024/10/31 | 318193 | macros/latex-dev/base/ltnews20.pdf +2024/10/31 | 7244 | macros/latex-dev/base/ltnews20.tex +2024/10/31 | 245228 | macros/latex-dev/base/ltnews21.pdf +2024/10/31 | 9935 | macros/latex-dev/base/ltnews21.tex +2024/10/31 | 318026 | macros/latex-dev/base/ltnews22.pdf +2024/10/31 | 10792 | macros/latex-dev/base/ltnews22.tex +2024/10/31 | 286824 | macros/latex-dev/base/ltnews23.pdf +2024/10/31 | 10791 | macros/latex-dev/base/ltnews23.tex +2024/10/31 | 265497 | macros/latex-dev/base/ltnews24.pdf +2024/10/31 | 12334 | macros/latex-dev/base/ltnews24.tex +2024/10/31 | 205100 | macros/latex-dev/base/ltnews25.pdf +2024/10/31 | 5588 | macros/latex-dev/base/ltnews25.tex +2024/10/31 | 379733 | macros/latex-dev/base/ltnews26.pdf +2024/10/31 | 10798 | macros/latex-dev/base/ltnews26.tex +2024/10/31 | 251283 | macros/latex-dev/base/ltnews27.pdf +2024/10/31 | 5691 | macros/latex-dev/base/ltnews27.tex +2024/10/31 | 376950 | macros/latex-dev/base/ltnews28.pdf +2024/10/31 | 15047 | macros/latex-dev/base/ltnews28.tex +2024/10/31 | 455437 | macros/latex-dev/base/ltnews29.pdf +2024/10/31 | 18944 | macros/latex-dev/base/ltnews29.tex +2024/10/31 | 512240 | macros/latex-dev/base/ltnews30.pdf +2024/10/31 | 23646 | macros/latex-dev/base/ltnews30.tex +2024/10/31 | 526681 | macros/latex-dev/base/ltnews31.pdf +2024/10/31 | 30448 | macros/latex-dev/base/ltnews31.tex +2024/10/31 | 546540 | macros/latex-dev/base/ltnews32.pdf +2024/10/31 | 33243 | macros/latex-dev/base/ltnews32.tex +2024/10/31 | 522757 | macros/latex-dev/base/ltnews33.pdf +2024/10/31 | 33911 | macros/latex-dev/base/ltnews33.tex +2024/10/31 | 508345 | macros/latex-dev/base/ltnews34.pdf +2024/10/31 | 32331 | macros/latex-dev/base/ltnews34.tex +2024/10/31 | 563305 | macros/latex-dev/base/ltnews35.pdf +2024/10/31 | 38225 | macros/latex-dev/base/ltnews35.tex +2024/10/31 | 517934 | macros/latex-dev/base/ltnews36.pdf +2024/10/31 | 19333 | macros/latex-dev/base/ltnews36.tex +2024/10/31 | 456933 | macros/latex-dev/base/ltnews37.pdf +2024/10/31 | 33083 | macros/latex-dev/base/ltnews37.tex +2024/10/31 | 523675 | macros/latex-dev/base/ltnews38.pdf +2024/10/31 | 22946 | macros/latex-dev/base/ltnews38.tex +2024/10/31 | 541772 | macros/latex-dev/base/ltnews39.pdf +2024/10/31 | 36656 | macros/latex-dev/base/ltnews39.tex +2024/10/31 | 476853 | macros/latex-dev/base/ltnews40.pdf +2024/10/31 | 29086 | macros/latex-dev/base/ltnews40.tex +2024/10/31 | 222785 | macros/latex-dev/base/ltnews41.pdf +2024/10/31 | 5206 | macros/latex-dev/base/ltnews41.tex +2024/10/31 | 21488 | macros/latex-dev/base/ltnews.cls +2024/10/31 | 1444433 | macros/latex-dev/base/ltnews.pdf +2024/10/31 | 8051 | macros/latex-dev/base/ltnews.tex +2024/10/31 | 148564 | macros/latex-dev/base/ltoutenc.dtx +2024/10/31 | 3367 | macros/latex-dev/base/ltoutenc.ins +2024/10/31 | 178564 | macros/latex-dev/base/ltoutput.dtx +2024/10/31 | 14091 | macros/latex-dev/base/ltpage.dtx +2024/10/31 | 2728 | macros/latex-dev/base/ltpageno.dtx +2024/10/31 | 672995 | macros/latex-dev/base/ltpara-code.pdf +2024/10/31 | 99 | macros/latex-dev/base/ltpara-code.tex +2024/10/31 | 560715 | macros/latex-dev/base/ltpara-doc.pdf +2024/10/31 | 234 | macros/latex-dev/base/ltpara-doc.tex +2024/10/31 | 54988 | macros/latex-dev/base/ltpara.dtx +2024/10/31 | 6155 | macros/latex-dev/base/ltpar.dtx +2024/10/31 | 68979 | macros/latex-dev/base/ltpictur.dtx +2024/10/31 | 60434 | macros/latex-dev/base/ltplain.dtx +2024/10/31 | 557320 | macros/latex-dev/base/ltproperties-code.pdf +2024/10/31 | 107 | macros/latex-dev/base/ltproperties-code.tex +2024/10/31 | 431802 | macros/latex-dev/base/ltproperties-doc.pdf +2024/10/31 | 243 | macros/latex-dev/base/ltproperties-doc.tex +2024/10/31 | 34679 | macros/latex-dev/base/ltproperties.dtx +2024/10/31 | 33928 | macros/latex-dev/base/ltsect.dtx +2024/10/31 | 821340 | macros/latex-dev/base/ltshipout-code.pdf +2024/10/31 | 104 | macros/latex-dev/base/ltshipout-code.tex +2024/10/31 | 567691 | macros/latex-dev/base/ltshipout-doc.pdf +2024/10/31 | 240 | macros/latex-dev/base/ltshipout-doc.tex +2024/10/31 | 80728 | macros/latex-dev/base/ltshipout.dtx +2024/10/31 | 602006 | macros/latex-dev/base/ltsockets-code.pdf +2024/10/31 | 104 | macros/latex-dev/base/ltsockets-code.tex +2024/10/31 | 486428 | macros/latex-dev/base/ltsockets-doc.pdf +2024/10/31 | 240 | macros/latex-dev/base/ltsockets-doc.tex +2024/10/31 | 38984 | macros/latex-dev/base/ltsockets.dtx +2024/10/31 | 49532 | macros/latex-dev/base/ltspace.dtx +2024/10/31 | 47895 | macros/latex-dev/base/lttab.dtx +2024/10/31 | 33763 | macros/latex-dev/base/lttagging.dtx +2024/10/31 | 751718 | macros/latex-dev/base/lttemplates-code.pdf +2024/10/31 | 106 | macros/latex-dev/base/lttemplates-code.tex +2024/10/31 | 467500 | macros/latex-dev/base/lttemplates-doc.pdf +2024/10/31 | 242 | macros/latex-dev/base/lttemplates-doc.tex +2024/10/31 | 91054 | macros/latex-dev/base/lttemplates.dtx +2024/10/31 | 114477 | macros/latex-dev/base/lttextcomp.dtx +2024/10/31 | 10169 | macros/latex-dev/base/ltthm.dtx +2024/10/31 | 15383 | macros/latex-dev/base/ltvers.dtx +2024/10/31 | 219358 | macros/latex-dev/base/ltx3info.pdf +2024/10/31 | 18299 | macros/latex-dev/base/ltx3info.tex +2024/10/31 | 27122 | macros/latex-dev/base/ltxcheck.tex +2024/10/31 | 22822 | macros/latex-dev/base/ltxdoc.dtx +2024/10/31 | 244141 | macros/latex-dev/base/ltxdoc.pdf +2024/10/31 | 7528 | macros/latex-dev/base/ltxguide.cls +2024/10/31 | 24883 | macros/latex-dev/base/ltxref.dtx +2024/10/31 | 10601 | macros/latex-dev/base/makeindx.dtx +2024/10/31 | 3434 | macros/latex-dev/base/makeindx.ins +2024/10/31 | 165816 | macros/latex-dev/base/makeindx.pdf +2024/10/31 | 12092 | macros/latex-dev/base/manifest.txt +2024/10/31 | 1941 | macros/latex-dev/base/minimal.cls +2024/10/31 | 257825 | macros/latex-dev/base/modguide.pdf +2024/10/31 | 16500 | macros/latex-dev/base/modguide.tex +2024/10/31 | 4254 | macros/latex-dev/base/newdc.ins +2024/10/31 | 6357 | macros/latex-dev/base/newlfont.dtx +2024/10/31 | 18401 | macros/latex-dev/base/nfssfont.dtx +2024/10/31 | 2893 | macros/latex-dev/base/nfssfont.ins +2024/10/31 | 211314 | macros/latex-dev/base/nfssfont.pdf +2024/10/31 | 3960 | macros/latex-dev/base/olddc.ins +2024/10/31 | 8626 | macros/latex-dev/base/oldlfont.dtx +2024/10/31 | 9345 | macros/latex-dev/base/preload.dtx +2024/10/31 | 13589 | macros/latex-dev/base/proc.dtx +2024/10/31 | 3401 | macros/latex-dev/base/proc.ins +2024/10/31 | 227065 | macros/latex-dev/base/proc.pdf +2024/10/31 | 3083 | macros/latex-dev/base/README.md +2024/10/31 | 7200 | macros/latex-dev/base/sample2e.tex +2024/10/31 | 89727 | macros/latex-dev/base/slides.dtx +2024/10/31 | 6760 | macros/latex-dev/base/slides.ins +2024/10/31 | 375493 | macros/latex-dev/base/slides.pdf +2024/10/31 | 15693 | macros/latex-dev/base/slifonts.fdd +2024/10/31 | 233905 | macros/latex-dev/base/slifonts.pdf +2024/10/31 | 1694 | macros/latex-dev/base/small2e.tex +2024/10/31 | 6911 | macros/latex-dev/base/source2edoc.cls +2024/10/31 | 6521205 | macros/latex-dev/base/source2e.pdf +2024/10/31 | 15553 | macros/latex-dev/base/source2e.tex +2024/10/31 | 9398 | macros/latex-dev/base/syntonly.dtx +2024/10/31 | 2896 | macros/latex-dev/base/syntonly.ins +2024/10/31 | 189462 | macros/latex-dev/base/syntonly.pdf +2024/10/31 | 12520 | macros/latex-dev/base/testpage.tex +2024/10/31 | 173013 | macros/latex-dev/base/tlc2.err +2024/10/31 | 290257 | macros/latex-dev/base/tlc2.pdf +2024/10/31 | 51067 | macros/latex-dev/base/tlc3.err +2024/10/31 | 385504 | macros/latex-dev/base/tlc3.pdf +2024/10/31 | 12246 | macros/latex-dev/base/tulm.fdd +2024/10/31 | 3781 | macros/latex-dev/base/tulm.ins +2024/10/31 | 162773 | macros/latex-dev/base/tulm.pdf +2024/10/31 | 3181 | macros/latex-dev/base/unpack.ins +2024/10/31 | 439393 | macros/latex-dev/base/usrguide-historic.pdf +2024/10/31 | 68746 | macros/latex-dev/base/usrguide-historic.tex +2024/10/31 | 488007 | macros/latex-dev/base/usrguide.pdf +2024/10/31 | 58760 | macros/latex-dev/base/usrguide.tex +2024/10/31 | 92294 | macros/latex-dev/base/utf8ienc.dtx +2024/10/31 | 353390 | macros/latex-dev/base/utf8ienc.pdf +2024/10/31 | 10247 | macros/latex-dev/base/webcomp.err +2024/10/31 | 146205 | macros/latex-dev/base/webcomp.pdf +2024/11/01 | 46080841 | macros/latex-dev/base.zip +2024/10/31 | 8663 | macros/latex-dev/required/amsmath/amsbsy.dtx +2024/10/31 | 1505 | macros/latex-dev/required/amsmath/amsbsy.ins +2024/10/31 | 174946 | macros/latex-dev/required/amsmath/amsbsy.pdf +2024/10/31 | 11284 | macros/latex-dev/required/amsmath/amscd.dtx +2024/10/31 | 1487 | macros/latex-dev/required/amsmath/amscd.ins +2024/10/31 | 179948 | macros/latex-dev/required/amsmath/amscd.pdf +2024/10/31 | 5313 | macros/latex-dev/required/amsmath/ams-external.txt +2024/10/31 | 13442 | macros/latex-dev/required/amsmath/amsgen.dtx +2024/10/31 | 1484 | macros/latex-dev/required/amsmath/amsgen.ins +2024/10/31 | 178193 | macros/latex-dev/required/amsmath/amsgen.pdf +2024/10/31 | 5860 | macros/latex-dev/required/amsmath/ams-internal.txt +2024/10/31 | 508207 | macros/latex-dev/required/amsmath/amsldoc.pdf +2024/10/31 | 104792 | macros/latex-dev/required/amsmath/amsldoc.tex +2024/10/31 | 85247 | macros/latex-dev/required/amsmath/amsmath-2018-12-01.sty +2024/10/31 | 233049 | macros/latex-dev/required/amsmath/amsmath.dtx +2024/10/31 | 1504 | macros/latex-dev/required/amsmath/amsmath.ins +2024/10/31 | 422294 | macros/latex-dev/required/amsmath/amsmath.pdf +2024/10/31 | 10199 | macros/latex-dev/required/amsmath/amsopn.dtx +2024/10/31 | 1490 | macros/latex-dev/required/amsmath/amsopn.ins +2024/10/31 | 140093 | macros/latex-dev/required/amsmath/amsopn.pdf +2024/10/31 | 69732 | macros/latex-dev/required/amsmath/amstex.sty +2024/10/31 | 11398 | macros/latex-dev/required/amsmath/amstext.dtx +2024/10/31 | 1492 | macros/latex-dev/required/amsmath/amstext.ins +2024/10/31 | 217504 | macros/latex-dev/required/amsmath/amstext.pdf +2024/10/31 | 4336 | macros/latex-dev/required/amsmath/amsxtra.dtx +2024/10/31 | 1492 | macros/latex-dev/required/amsmath/amsxtra.ins +2024/10/31 | 113560 | macros/latex-dev/required/amsmath/amsxtra.pdf +2024/10/31 | 9229 | macros/latex-dev/required/amsmath/changes.txt +2024/10/31 | 22605 | macros/latex-dev/required/amsmath/diffs-m.txt +2024/10/31 | 369 | macros/latex-dev/required/amsmath/manifest.txt +2024/10/31 | 2723 | macros/latex-dev/required/amsmath/README.md +2024/10/31 | 109740 | macros/latex-dev/required/amsmath/subeqn.pdf +2024/10/31 | 6440 | macros/latex-dev/required/amsmath/subeqn.tex +2024/10/31 | 147459 | macros/latex-dev/required/amsmath/technote.pdf +2024/10/31 | 12005 | macros/latex-dev/required/amsmath/technote.tex +2024/10/31 | 454643 | macros/latex-dev/required/amsmath/testmath.pdf +2024/10/31 | 81184 | macros/latex-dev/required/amsmath/testmath.tex +2024/11/01 | 2765797 | macros/latex-dev/required/amsmath.zip +2024/10/31 | 6559 | macros/latex-dev/required/firstaid/changes.txt +2024/10/31 | 2744 | macros/latex-dev/required/firstaid/firstaid.ins +2024/10/31 | 27231 | macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx +2024/10/31 | 280510 | macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf +2024/10/31 | 474 | macros/latex-dev/required/firstaid/README.md +2024/11/01 | 282030 | macros/latex-dev/required/firstaid.zip +2024/10/31 | 15737 | macros/latex-dev/required/graphics/cat.eps +2024/10/31 | 36241 | macros/latex-dev/required/graphics/changes.txt +2024/10/31 | 32462 | macros/latex-dev/required/graphics/color.dtx +2024/10/31 | 212777 | macros/latex-dev/required/graphics/color.pdf +2024/10/31 | 50819 | macros/latex-dev/required/graphics/drivers.dtx +2024/10/31 | 286448 | macros/latex-dev/required/graphics/drivers.pdf +2024/10/31 | 4137 | macros/latex-dev/required/graphics/epsfig.dtx +2024/10/31 | 159239 | macros/latex-dev/required/graphics/epsfig.pdf +2024/10/31 | 15577 | macros/latex-dev/required/graphics/graphics-2017-06-25.sty +2024/10/31 | 2994 | macros/latex-dev/required/graphics/graphics-drivers.ins +2024/10/31 | 71006 | macros/latex-dev/required/graphics/graphics.dtx +2024/10/31 | 1189 | macros/latex-dev/required/graphics/graphics.ins +2024/10/31 | 303762 | macros/latex-dev/required/graphics/graphics.pdf +2024/10/31 | 30464 | macros/latex-dev/required/graphics/graphicx.dtx +2024/10/31 | 240618 | macros/latex-dev/required/graphics/graphicx.pdf +2024/10/31 | 331361 | macros/latex-dev/required/graphics/grfguide.pdf +2024/10/31 | 38040 | macros/latex-dev/required/graphics/grfguide.tex +2024/10/31 | 13875 | macros/latex-dev/required/graphics/keyval.dtx +2024/10/31 | 239587 | macros/latex-dev/required/graphics/keyval.pdf +2024/10/31 | 3946 | macros/latex-dev/required/graphics/lscape.dtx +2024/10/31 | 155987 | macros/latex-dev/required/graphics/lscape.pdf +2024/10/31 | 16168 | macros/latex-dev/required/graphics/mathcolor.dtx +2024/10/31 | 460753 | macros/latex-dev/required/graphics/mathcolor.pdf +2024/10/31 | 2090 | macros/latex-dev/required/graphics/README.md +2024/10/31 | 21067 | macros/latex-dev/required/graphics/rotating.dtx +2024/10/31 | 278524 | macros/latex-dev/required/graphics/rotating.pdf +2024/10/31 | 172252 | macros/latex-dev/required/graphics/rotex.pdf +2024/10/31 | 14575 | macros/latex-dev/required/graphics/rotex.tex +2024/10/31 | 10749 | macros/latex-dev/required/graphics/trig.dtx +2024/10/31 | 199290 | macros/latex-dev/required/graphics/trig.pdf +2024/11/01 | 3060934 | macros/latex-dev/required/graphics.zip 2024/05/08 | 11376 | macros/latex-dev/required/l3backend/CHANGELOG.md 2024/05/08 | 16213 | macros/latex-dev/required/l3backend/l3backend-basics.dtx 2024/05/08 | 14433 | macros/latex-dev/required/l3backend/l3backend-box.dtx @@ -260370,143 +260384,143 @@ 2024/10/09 | 7613270 | macros/latex-dev/required/l3kernel/source3.pdf 2024/10/09 | 2282 | macros/latex-dev/required/l3kernel/source3.tex 2024/10/09 | 14126802 | macros/latex-dev/required/l3kernel.zip -2024/10/13 | 881794 | macros/latex-dev/required/latex-lab/blocks-code.pdf -2024/10/13 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex -2024/10/13 | 485663 | macros/latex-dev/required/latex-lab/blocks-doc.pdf -2024/10/13 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex -2024/10/13 | 19009 | macros/latex-dev/required/latex-lab/changes.txt -2024/10/13 | 563214 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf -2024/10/13 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex -2024/10/13 | 420933 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf -2024/10/13 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex -2024/10/13 | 23994 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx -2024/10/13 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex -2024/10/13 | 7452 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx -2024/10/13 | 382388 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf -2024/10/13 | 14380 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx -2024/10/13 | 383673 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf -2024/10/13 | 145696 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx -2024/10/13 | 881794 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf -2024/10/13 | 19732 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx -2024/10/13 | 398505 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf -2024/10/13 | 22813 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx -2024/10/13 | 444624 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf -2024/10/13 | 91590 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx -2024/10/13 | 821496 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf -2024/10/13 | 34515 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx -2024/10/13 | 517603 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf -2024/10/13 | 6601 | macros/latex-dev/required/latex-lab/latex-lab.ins -2024/10/13 | 9808 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx -2024/10/13 | 414685 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf -2024/10/13 | 89753 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx -2024/10/13 | 778634 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf -2024/10/13 | 2898 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx -2024/10/13 | 355758 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf -2024/10/13 | 6441 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx -2024/10/13 | 372235 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf -2024/10/13 | 8048 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx -2024/10/13 | 282259 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf -2024/10/13 | 3349 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx -2024/10/13 | 235962 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf -2024/10/13 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx -2024/10/13 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf -2024/10/13 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx -2024/10/13 | 632196 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf -2024/10/13 | 27216 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx -2024/10/13 | 544929 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf -2024/10/13 | 49846 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx -2024/10/13 | 572577 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf -2024/10/13 | 4824 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx -2024/10/13 | 298160 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf -2024/10/13 | 3678 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx -2024/10/13 | 307847 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf -2024/10/13 | 17010 | macros/latex-dev/required/latex-lab/latex-lab-title.dtx -2024/10/13 | 348117 | macros/latex-dev/required/latex-lab/latex-lab-title.pdf -2024/10/13 | 12633 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx -2024/10/13 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx -2024/10/13 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf -2024/10/13 | 18661 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx -2024/10/13 | 373186 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf -2024/10/13 | 406053 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf -2024/10/13 | 1156 | macros/latex-dev/required/latex-lab/README.md -2024/10/13 | 12607161 | macros/latex-dev/required/latex-lab.zip -2024/10/13 | 14075 | macros/latex-dev/required/tools/afterpage.dtx -2024/10/13 | 2538 | macros/latex-dev/required/tools/afterpage.ins -2024/10/13 | 198100 | macros/latex-dev/required/tools/afterpage.pdf -2024/10/13 | 11849 | macros/latex-dev/required/tools/array-2016-10-06.sty -2024/10/13 | 12535 | macros/latex-dev/required/tools/array-2020-02-10.sty -2024/10/13 | 12587 | macros/latex-dev/required/tools/array-2023-11-01.sty -2024/10/13 | 143376 | macros/latex-dev/required/tools/array.dtx -2024/10/13 | 868668 | macros/latex-dev/required/tools/array.pdf -2024/10/13 | 61642 | macros/latex-dev/required/tools/bm.dtx -2024/10/13 | 2524 | macros/latex-dev/required/tools/bm.ins -2024/10/13 | 323640 | macros/latex-dev/required/tools/bm.pdf -2024/10/13 | 53167 | macros/latex-dev/required/tools/calc.dtx -2024/10/13 | 370660 | macros/latex-dev/required/tools/calc.pdf -2024/10/13 | 67725 | macros/latex-dev/required/tools/changes.txt -2024/10/13 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx -2024/10/13 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf -2024/10/13 | 6789 | macros/latex-dev/required/tools/delarray.dtx -2024/10/13 | 191058 | macros/latex-dev/required/tools/delarray.pdf -2024/10/13 | 10637 | macros/latex-dev/required/tools/enumerate.dtx -2024/10/13 | 215077 | macros/latex-dev/required/tools/enumerate.pdf -2024/10/13 | 4959 | macros/latex-dev/required/tools/fileerr.dtx -2024/10/13 | 187903 | macros/latex-dev/required/tools/fileerr.pdf -2024/10/13 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx -2024/10/13 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf -2024/10/13 | 39697 | macros/latex-dev/required/tools/ftnright.dtx -2024/10/13 | 387212 | macros/latex-dev/required/tools/ftnright.pdf -2024/10/13 | 11148 | macros/latex-dev/required/tools/hhline.dtx -2024/10/13 | 189678 | macros/latex-dev/required/tools/hhline.pdf -2024/10/13 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx -2024/10/13 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf -2024/10/13 | 21076 | macros/latex-dev/required/tools/l3sys-query.dtx -2024/10/13 | 2554 | macros/latex-dev/required/tools/l3sys-query.ins -2024/10/13 | 482622 | macros/latex-dev/required/tools/l3sys-query.pdf -2024/10/13 | 32047 | macros/latex-dev/required/tools/layout.dtx -2024/10/13 | 260278 | macros/latex-dev/required/tools/layout.pdf -2024/10/13 | 12282 | macros/latex-dev/required/tools/longtable-2020-01-07.sty -2024/10/13 | 88707 | macros/latex-dev/required/tools/longtable.dtx -2024/10/13 | 2538 | macros/latex-dev/required/tools/longtable.ins -2024/10/13 | 402854 | macros/latex-dev/required/tools/longtable.pdf -2024/10/13 | 3286 | macros/latex-dev/required/tools/manifest.txt -2024/10/13 | 29812 | macros/latex-dev/required/tools/multicol-2017-04-11.sty -2024/10/13 | 31467 | macros/latex-dev/required/tools/multicol-2019-10-01.sty -2024/10/13 | 188769 | macros/latex-dev/required/tools/multicol.dtx -2024/10/13 | 2576 | macros/latex-dev/required/tools/multicol.ins -2024/10/13 | 525497 | macros/latex-dev/required/tools/multicol.pdf -2024/10/13 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx -2024/10/13 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf -2024/10/13 | 1664 | macros/latex-dev/required/tools/README.md -2024/10/13 | 9559 | macros/latex-dev/required/tools/shellesc.dtx -2024/10/13 | 176171 | macros/latex-dev/required/tools/shellesc.pdf -2024/10/13 | 8780 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty -2024/10/13 | 30386 | macros/latex-dev/required/tools/showkeys.dtx -2024/10/13 | 252922 | macros/latex-dev/required/tools/showkeys.pdf -2024/10/13 | 5791 | macros/latex-dev/required/tools/somedefs.dtx -2024/10/13 | 167583 | macros/latex-dev/required/tools/somedefs.pdf -2024/10/13 | 37462 | macros/latex-dev/required/tools/tabularx.dtx -2024/10/13 | 2535 | macros/latex-dev/required/tools/tabularx.ins -2024/10/13 | 289601 | macros/latex-dev/required/tools/tabularx.pdf -2024/10/13 | 43423 | macros/latex-dev/required/tools/theorem.dtx -2024/10/13 | 351812 | macros/latex-dev/required/tools/theorem.pdf -2024/10/13 | 5667 | macros/latex-dev/required/tools/tools.ins -2024/10/13 | 73684 | macros/latex-dev/required/tools/tools-overview.pdf -2024/10/13 | 5213 | macros/latex-dev/required/tools/tools-overview.tex -2024/10/13 | 25146 | macros/latex-dev/required/tools/trace.dtx -2024/10/13 | 222074 | macros/latex-dev/required/tools/trace.pdf -2024/10/13 | 34011 | macros/latex-dev/required/tools/varioref-2016-02-16.sty -2024/10/13 | 114484 | macros/latex-dev/required/tools/varioref.dtx -2024/10/13 | 2531 | macros/latex-dev/required/tools/varioref.ins -2024/10/13 | 393884 | macros/latex-dev/required/tools/varioref.pdf -2024/10/13 | 72911 | macros/latex-dev/required/tools/verbatim.dtx -2024/10/13 | 331587 | macros/latex-dev/required/tools/verbatim.pdf -2024/10/13 | 2749 | macros/latex-dev/required/tools/xr-2023-07-04.sty -2024/10/13 | 12515 | macros/latex-dev/required/tools/xr.dtx -2024/10/13 | 323877 | macros/latex-dev/required/tools/xr.pdf -2024/10/13 | 17856 | macros/latex-dev/required/tools/xspace.dtx -2024/10/13 | 257027 | macros/latex-dev/required/tools/xspace.pdf -2024/10/13 | 8257146 | macros/latex-dev/required/tools.zip +2024/10/31 | 881794 | macros/latex-dev/required/latex-lab/blocks-code.pdf +2024/10/31 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex +2024/10/31 | 485663 | macros/latex-dev/required/latex-lab/blocks-doc.pdf +2024/10/31 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex +2024/10/31 | 19443 | macros/latex-dev/required/latex-lab/changes.txt +2024/10/31 | 563214 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf +2024/10/31 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex +2024/10/31 | 420933 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf +2024/10/31 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex +2024/10/31 | 23994 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx +2024/10/31 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex +2024/10/31 | 7452 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx +2024/10/31 | 382388 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf +2024/10/31 | 14380 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx +2024/10/31 | 383673 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf +2024/10/31 | 145696 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx +2024/10/31 | 881794 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf +2024/10/31 | 19925 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx +2024/10/31 | 398544 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf +2024/10/31 | 22813 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx +2024/10/31 | 444624 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf +2024/10/31 | 91590 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx +2024/10/31 | 821496 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf +2024/10/31 | 34515 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx +2024/10/31 | 517603 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf +2024/10/31 | 6601 | macros/latex-dev/required/latex-lab/latex-lab.ins +2024/10/31 | 9808 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx +2024/10/31 | 414685 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf +2024/10/31 | 99855 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx +2024/10/31 | 797404 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf +2024/10/31 | 2898 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx +2024/10/31 | 355758 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf +2024/10/31 | 6441 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx +2024/10/31 | 372235 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf +2024/10/31 | 8048 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx +2024/10/31 | 282259 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf +2024/10/31 | 3349 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx +2024/10/31 | 235962 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf +2024/10/31 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx +2024/10/31 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf +2024/10/31 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx +2024/10/31 | 632196 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf +2024/10/31 | 27216 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx +2024/10/31 | 544929 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf +2024/10/31 | 49846 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx +2024/10/31 | 572577 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf +2024/10/31 | 4824 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx +2024/10/31 | 298160 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf +2024/10/31 | 3678 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx +2024/10/31 | 307847 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf +2024/10/31 | 17010 | macros/latex-dev/required/latex-lab/latex-lab-title.dtx +2024/10/31 | 348117 | macros/latex-dev/required/latex-lab/latex-lab-title.pdf +2024/10/31 | 12633 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx +2024/10/31 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx +2024/10/31 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf +2024/10/31 | 18661 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx +2024/10/31 | 373186 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf +2024/10/31 | 406053 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf +2024/10/31 | 1156 | macros/latex-dev/required/latex-lab/README.md +2024/11/01 | 12626830 | macros/latex-dev/required/latex-lab.zip +2024/10/31 | 14075 | macros/latex-dev/required/tools/afterpage.dtx +2024/10/31 | 2538 | macros/latex-dev/required/tools/afterpage.ins +2024/10/31 | 198100 | macros/latex-dev/required/tools/afterpage.pdf +2024/10/31 | 11849 | macros/latex-dev/required/tools/array-2016-10-06.sty +2024/10/31 | 12535 | macros/latex-dev/required/tools/array-2020-02-10.sty +2024/10/31 | 12587 | macros/latex-dev/required/tools/array-2023-11-01.sty +2024/10/31 | 147854 | macros/latex-dev/required/tools/array.dtx +2024/10/31 | 875329 | macros/latex-dev/required/tools/array.pdf +2024/10/31 | 61642 | macros/latex-dev/required/tools/bm.dtx +2024/10/31 | 2524 | macros/latex-dev/required/tools/bm.ins +2024/10/31 | 323640 | macros/latex-dev/required/tools/bm.pdf +2024/10/31 | 53167 | macros/latex-dev/required/tools/calc.dtx +2024/10/31 | 370660 | macros/latex-dev/required/tools/calc.pdf +2024/10/31 | 68102 | macros/latex-dev/required/tools/changes.txt +2024/10/31 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx +2024/10/31 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf +2024/10/31 | 6789 | macros/latex-dev/required/tools/delarray.dtx +2024/10/31 | 191058 | macros/latex-dev/required/tools/delarray.pdf +2024/10/31 | 10637 | macros/latex-dev/required/tools/enumerate.dtx +2024/10/31 | 215077 | macros/latex-dev/required/tools/enumerate.pdf +2024/10/31 | 4959 | macros/latex-dev/required/tools/fileerr.dtx +2024/10/31 | 187903 | macros/latex-dev/required/tools/fileerr.pdf +2024/10/31 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx +2024/10/31 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf +2024/10/31 | 39697 | macros/latex-dev/required/tools/ftnright.dtx +2024/10/31 | 387212 | macros/latex-dev/required/tools/ftnright.pdf +2024/10/31 | 11148 | macros/latex-dev/required/tools/hhline.dtx +2024/10/31 | 189678 | macros/latex-dev/required/tools/hhline.pdf +2024/10/31 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx +2024/10/31 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf +2024/10/31 | 21076 | macros/latex-dev/required/tools/l3sys-query.dtx +2024/10/31 | 2554 | macros/latex-dev/required/tools/l3sys-query.ins +2024/10/31 | 482622 | macros/latex-dev/required/tools/l3sys-query.pdf +2024/10/31 | 32047 | macros/latex-dev/required/tools/layout.dtx +2024/10/31 | 260278 | macros/latex-dev/required/tools/layout.pdf +2024/10/31 | 12282 | macros/latex-dev/required/tools/longtable-2020-01-07.sty +2024/10/31 | 88888 | macros/latex-dev/required/tools/longtable.dtx +2024/10/31 | 2538 | macros/latex-dev/required/tools/longtable.ins +2024/10/31 | 402733 | macros/latex-dev/required/tools/longtable.pdf +2024/10/31 | 3286 | macros/latex-dev/required/tools/manifest.txt +2024/10/31 | 29812 | macros/latex-dev/required/tools/multicol-2017-04-11.sty +2024/10/31 | 31467 | macros/latex-dev/required/tools/multicol-2019-10-01.sty +2024/10/31 | 188769 | macros/latex-dev/required/tools/multicol.dtx +2024/10/31 | 2576 | macros/latex-dev/required/tools/multicol.ins +2024/10/31 | 525497 | macros/latex-dev/required/tools/multicol.pdf +2024/10/31 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx +2024/10/31 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf +2024/10/31 | 1664 | macros/latex-dev/required/tools/README.md +2024/10/31 | 9559 | macros/latex-dev/required/tools/shellesc.dtx +2024/10/31 | 176171 | macros/latex-dev/required/tools/shellesc.pdf +2024/10/31 | 8780 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty +2024/10/31 | 30386 | macros/latex-dev/required/tools/showkeys.dtx +2024/10/31 | 252922 | macros/latex-dev/required/tools/showkeys.pdf +2024/10/31 | 5791 | macros/latex-dev/required/tools/somedefs.dtx +2024/10/31 | 167583 | macros/latex-dev/required/tools/somedefs.pdf +2024/10/31 | 37462 | macros/latex-dev/required/tools/tabularx.dtx +2024/10/31 | 2535 | macros/latex-dev/required/tools/tabularx.ins +2024/10/31 | 289601 | macros/latex-dev/required/tools/tabularx.pdf +2024/10/31 | 43423 | macros/latex-dev/required/tools/theorem.dtx +2024/10/31 | 351812 | macros/latex-dev/required/tools/theorem.pdf +2024/10/31 | 5667 | macros/latex-dev/required/tools/tools.ins +2024/10/31 | 73684 | macros/latex-dev/required/tools/tools-overview.pdf +2024/10/31 | 5213 | macros/latex-dev/required/tools/tools-overview.tex +2024/10/31 | 25146 | macros/latex-dev/required/tools/trace.dtx +2024/10/31 | 222074 | macros/latex-dev/required/tools/trace.pdf +2024/10/31 | 34011 | macros/latex-dev/required/tools/varioref-2016-02-16.sty +2024/10/31 | 114484 | macros/latex-dev/required/tools/varioref.dtx +2024/10/31 | 2531 | macros/latex-dev/required/tools/varioref.ins +2024/10/31 | 393884 | macros/latex-dev/required/tools/varioref.pdf +2024/10/31 | 72911 | macros/latex-dev/required/tools/verbatim.dtx +2024/10/31 | 331587 | macros/latex-dev/required/tools/verbatim.pdf +2024/10/31 | 2749 | macros/latex-dev/required/tools/xr-2023-07-04.sty +2024/10/31 | 12515 | macros/latex-dev/required/tools/xr.dtx +2024/10/31 | 323877 | macros/latex-dev/required/tools/xr.pdf +2024/10/31 | 17856 | macros/latex-dev/required/tools/xspace.dtx +2024/10/31 | 257027 | macros/latex-dev/required/tools/xspace.pdf +2024/11/01 | 8265408 | macros/latex-dev/required/tools.zip 1999/05/03 | 8998 | macros/latex/exptl/delimtxt/delimtxt.dtx 1999/03/28 | 143 | macros/latex/exptl/delimtxt/delimtxt.ins 2006/03/21 | 55074 | macros/latex/exptl/delimtxt/delimtxt.pdf @@ -260711,44 +260725,44 @@ 2020/06/01 | 5281 | macros/latex/required/amscls/upref.dtx 2020/06/01 | 1999 | macros/latex/required/amscls/upref.ins 2020/06/01 | 1208335 | macros/latex/required/amscls.zip -2024/06/01 | 8663 | macros/latex/required/amsmath/amsbsy.dtx -2024/06/01 | 1505 | macros/latex/required/amsmath/amsbsy.ins -2024/06/01 | 174946 | macros/latex/required/amsmath/amsbsy.pdf -2024/06/01 | 11284 | macros/latex/required/amsmath/amscd.dtx -2024/06/01 | 1487 | macros/latex/required/amsmath/amscd.ins -2024/06/01 | 179951 | macros/latex/required/amsmath/amscd.pdf -2024/06/01 | 5313 | macros/latex/required/amsmath/ams-external.txt -2024/06/01 | 13442 | macros/latex/required/amsmath/amsgen.dtx -2024/06/01 | 1484 | macros/latex/required/amsmath/amsgen.ins -2024/06/01 | 178193 | macros/latex/required/amsmath/amsgen.pdf -2024/06/01 | 5860 | macros/latex/required/amsmath/ams-internal.txt -2024/06/01 | 508230 | macros/latex/required/amsmath/amsldoc.pdf -2024/06/01 | 104792 | macros/latex/required/amsmath/amsldoc.tex -2024/06/01 | 85247 | macros/latex/required/amsmath/amsmath-2018-12-01.sty -2024/06/01 | 230689 | macros/latex/required/amsmath/amsmath.dtx -2024/06/01 | 1504 | macros/latex/required/amsmath/amsmath.ins -2024/06/01 | 420765 | macros/latex/required/amsmath/amsmath.pdf -2024/06/01 | 10199 | macros/latex/required/amsmath/amsopn.dtx -2024/06/01 | 1490 | macros/latex/required/amsmath/amsopn.ins -2024/06/01 | 140093 | macros/latex/required/amsmath/amsopn.pdf -2024/06/01 | 69732 | macros/latex/required/amsmath/amstex.sty -2024/06/01 | 11398 | macros/latex/required/amsmath/amstext.dtx -2024/06/01 | 1492 | macros/latex/required/amsmath/amstext.ins -2024/06/01 | 217504 | macros/latex/required/amsmath/amstext.pdf -2024/06/01 | 4336 | macros/latex/required/amsmath/amsxtra.dtx -2024/06/01 | 1492 | macros/latex/required/amsmath/amsxtra.ins -2024/06/01 | 113560 | macros/latex/required/amsmath/amsxtra.pdf -2024/06/01 | 8924 | macros/latex/required/amsmath/changes.txt -2024/06/01 | 22605 | macros/latex/required/amsmath/diffs-m.txt -2024/06/01 | 369 | macros/latex/required/amsmath/manifest.txt -2024/06/01 | 2723 | macros/latex/required/amsmath/README.md -2024/06/01 | 109733 | macros/latex/required/amsmath/subeqn.pdf -2024/06/01 | 6440 | macros/latex/required/amsmath/subeqn.tex -2024/06/01 | 147459 | macros/latex/required/amsmath/technote.pdf -2024/06/01 | 12005 | macros/latex/required/amsmath/technote.tex -2024/06/01 | 454643 | macros/latex/required/amsmath/testmath.pdf -2024/06/01 | 81184 | macros/latex/required/amsmath/testmath.tex -2024/06/02 | 2763663 | macros/latex/required/amsmath.zip +2024/10/31 | 8663 | macros/latex/required/amsmath/amsbsy.dtx +2024/10/31 | 1505 | macros/latex/required/amsmath/amsbsy.ins +2024/10/31 | 174946 | macros/latex/required/amsmath/amsbsy.pdf +2024/10/31 | 11284 | macros/latex/required/amsmath/amscd.dtx +2024/10/31 | 1487 | macros/latex/required/amsmath/amscd.ins +2024/10/31 | 179948 | macros/latex/required/amsmath/amscd.pdf +2024/10/31 | 5313 | macros/latex/required/amsmath/ams-external.txt +2024/10/31 | 13442 | macros/latex/required/amsmath/amsgen.dtx +2024/10/31 | 1484 | macros/latex/required/amsmath/amsgen.ins +2024/10/31 | 178193 | macros/latex/required/amsmath/amsgen.pdf +2024/10/31 | 5860 | macros/latex/required/amsmath/ams-internal.txt +2024/10/31 | 508207 | macros/latex/required/amsmath/amsldoc.pdf +2024/10/31 | 104792 | macros/latex/required/amsmath/amsldoc.tex +2024/10/31 | 85247 | macros/latex/required/amsmath/amsmath-2018-12-01.sty +2024/10/31 | 233049 | macros/latex/required/amsmath/amsmath.dtx +2024/10/31 | 1504 | macros/latex/required/amsmath/amsmath.ins +2024/10/31 | 422294 | macros/latex/required/amsmath/amsmath.pdf +2024/10/31 | 10199 | macros/latex/required/amsmath/amsopn.dtx +2024/10/31 | 1490 | macros/latex/required/amsmath/amsopn.ins +2024/10/31 | 140093 | macros/latex/required/amsmath/amsopn.pdf +2024/10/31 | 69732 | macros/latex/required/amsmath/amstex.sty +2024/10/31 | 11398 | macros/latex/required/amsmath/amstext.dtx +2024/10/31 | 1492 | macros/latex/required/amsmath/amstext.ins +2024/10/31 | 217504 | macros/latex/required/amsmath/amstext.pdf +2024/10/31 | 4336 | macros/latex/required/amsmath/amsxtra.dtx +2024/10/31 | 1492 | macros/latex/required/amsmath/amsxtra.ins +2024/10/31 | 113560 | macros/latex/required/amsmath/amsxtra.pdf +2024/10/31 | 9229 | macros/latex/required/amsmath/changes.txt +2024/10/31 | 22605 | macros/latex/required/amsmath/diffs-m.txt +2024/10/31 | 369 | macros/latex/required/amsmath/manifest.txt +2024/10/31 | 2709 | macros/latex/required/amsmath/README.md +2024/10/31 | 109740 | macros/latex/required/amsmath/subeqn.pdf +2024/10/31 | 6440 | macros/latex/required/amsmath/subeqn.tex +2024/10/31 | 147459 | macros/latex/required/amsmath/technote.pdf +2024/10/31 | 12005 | macros/latex/required/amsmath/technote.tex +2024/10/31 | 454643 | macros/latex/required/amsmath/testmath.pdf +2024/10/31 | 81184 | macros/latex/required/amsmath/testmath.tex +2024/11/01 | 2765785 | macros/latex/required/amsmath.zip 2024/10/20 | 676588 | macros/latex/required/babel/base/babel-code.pdf 2024/10/20 | 815695 | macros/latex/required/babel/base/babel.dtx 2024/10/20 | 8001 | macros/latex/required/babel/base/babel.ins @@ -260779,12 +260793,12 @@ 2024/06/01 | 27558 | macros/latex/required/cyrillic/t2lhfnt.fdd 2024/06/01 | 144073 | macros/latex/required/cyrillic/t2lhfnt.pdf 2024/06/02 | 1202142 | macros/latex/required/cyrillic.zip -2024/06/26 | 6382 | macros/latex/required/firstaid/changes.txt -2024/06/26 | 2744 | macros/latex/required/firstaid/firstaid.ins -2024/06/26 | 25894 | macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx -2024/06/26 | 276648 | macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf -2024/06/26 | 474 | macros/latex/required/firstaid/README.md -2024/06/26 | 278037 | macros/latex/required/firstaid.zip +2024/10/31 | 6559 | macros/latex/required/firstaid/changes.txt +2024/10/31 | 2744 | macros/latex/required/firstaid/firstaid.ins +2024/10/31 | 27231 | macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx +2024/10/31 | 280510 | macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf +2024/10/31 | 474 | macros/latex/required/firstaid/README.md +2024/11/01 | 282030 | macros/latex/required/firstaid.zip 2024/10/31 | 15737 | macros/latex/required/graphics/cat.eps 2024/10/31 | 36241 | macros/latex/required/graphics/changes.txt 2024/10/31 | 32462 | macros/latex/required/graphics/color.dtx @@ -260944,66 +260958,66 @@ 2024/06/17 | 225573 | macros/latex/required/latexbug/latexbug.pdf 2024/06/17 | 248 | macros/latex/required/latexbug/README.md 2024/06/17 | 234469 | macros/latex/required/latexbug.zip -2024/06/01 | 871980 | macros/latex/required/latex-lab/blocks-code.pdf -2024/06/01 | 108 | macros/latex/required/latex-lab/blocks-code.tex -2024/06/01 | 486159 | macros/latex/required/latex-lab/blocks-doc.pdf -2024/06/01 | 105 | macros/latex/required/latex-lab/blocks-doc.tex -2024/06/01 | 13366 | macros/latex/required/latex-lab/changes.txt -2024/06/01 | 539294 | macros/latex/required/latex-lab/documentmetadata-support-code.pdf -2024/06/01 | 117 | macros/latex/required/latex-lab/documentmetadata-support-code.tex -2024/06/01 | 420808 | macros/latex/required/latex-lab/documentmetadata-support-doc.pdf -2024/06/01 | 191 | macros/latex/required/latex-lab/documentmetadata-support-doc.tex -2024/06/01 | 23552 | macros/latex/required/latex-lab/documentmetadata-support.dtx -2024/06/01 | 6221 | macros/latex/required/latex-lab/glyphtounicode-cmex.tex -2024/06/01 | 7422 | macros/latex/required/latex-lab/latex-lab-amsmath.dtx -2024/06/01 | 381899 | macros/latex/required/latex-lab/latex-lab-amsmath.pdf -2024/06/01 | 14373 | macros/latex/required/latex-lab/latex-lab-bib.dtx -2024/06/01 | 383259 | macros/latex/required/latex-lab/latex-lab-bib.pdf -2024/06/01 | 137301 | macros/latex/required/latex-lab/latex-lab-block.dtx -2024/06/01 | 871980 | macros/latex/required/latex-lab/latex-lab-block.pdf -2024/06/01 | 10996 | macros/latex/required/latex-lab/latex-lab-firstaid.dtx -2024/06/01 | 368000 | macros/latex/required/latex-lab/latex-lab-firstaid.pdf -2024/06/01 | 17974 | macros/latex/required/latex-lab/latex-lab-float.dtx -2024/06/01 | 426854 | macros/latex/required/latex-lab/latex-lab-float.pdf -2024/06/01 | 89915 | macros/latex/required/latex-lab/latex-lab-footnotes.dtx -2024/06/01 | 819567 | macros/latex/required/latex-lab/latex-lab-footnotes.pdf -2024/06/01 | 34475 | macros/latex/required/latex-lab/latex-lab-graphic.dtx -2024/06/01 | 517900 | macros/latex/required/latex-lab/latex-lab-graphic.pdf -2024/06/01 | 6601 | macros/latex/required/latex-lab/latex-lab.ins -2024/06/01 | 8891 | macros/latex/required/latex-lab/latex-lab-marginpar.dtx -2024/06/01 | 389702 | macros/latex/required/latex-lab/latex-lab-marginpar.pdf -2024/06/01 | 72667 | macros/latex/required/latex-lab/latex-lab-math.dtx -2024/06/01 | 740772 | macros/latex/required/latex-lab/latex-lab-math.pdf -2024/06/01 | 2898 | macros/latex/required/latex-lab/latex-lab-mathpkg.dtx -2024/06/01 | 355622 | macros/latex/required/latex-lab/latex-lab-mathpkg.pdf -2024/06/01 | 6269 | macros/latex/required/latex-lab/latex-lab-mathtools.dtx -2024/06/01 | 381899 | macros/latex/required/latex-lab/latex-lab-mathtools.pdf -2024/06/01 | 7315 | macros/latex/required/latex-lab/latex-lab-minipage.dtx -2024/06/01 | 280811 | macros/latex/required/latex-lab/latex-lab-minipage.pdf -2024/06/01 | 3348 | macros/latex/required/latex-lab/latex-lab-namespace.dtx -2024/06/01 | 235751 | macros/latex/required/latex-lab/latex-lab-namespace.pdf -2024/06/01 | 5684 | macros/latex/required/latex-lab/latex-lab-new-or-1.dtx -2024/06/01 | 389721 | macros/latex/required/latex-lab/latex-lab-new-or-1.pdf -2024/06/01 | 23812 | macros/latex/required/latex-lab/latex-lab-new-or-2.dtx -2024/06/01 | 632196 | macros/latex/required/latex-lab/latex-lab-new-or-2.pdf -2024/06/01 | 26699 | macros/latex/required/latex-lab/latex-lab-sec.dtx -2024/06/01 | 527096 | macros/latex/required/latex-lab/latex-lab-sec.pdf -2024/06/01 | 39912 | macros/latex/required/latex-lab/latex-lab-table.dtx -2024/06/01 | 556567 | macros/latex/required/latex-lab/latex-lab-table.pdf -2024/06/01 | 4822 | macros/latex/required/latex-lab/latex-lab-testphase.dtx -2024/06/01 | 297981 | macros/latex/required/latex-lab/latex-lab-testphase.pdf -2024/06/01 | 3674 | macros/latex/required/latex-lab/latex-lab-text.dtx -2024/06/01 | 307812 | macros/latex/required/latex-lab/latex-lab-text.pdf -2024/06/01 | 17010 | macros/latex/required/latex-lab/latex-lab-title.dtx -2024/06/01 | 348117 | macros/latex/required/latex-lab/latex-lab-title.pdf -2024/06/01 | 12805 | macros/latex/required/latex-lab/latex-lab-toc.dtx -2024/06/01 | 5733 | macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.dtx -2024/06/01 | 296124 | macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.pdf -2024/06/01 | 18465 | macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.dtx -2024/06/01 | 361081 | macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.pdf -2024/06/01 | 396814 | macros/latex/required/latex-lab/latex-lab-toc.pdf -2024/06/01 | 1156 | macros/latex/required/latex-lab/README.md -2024/06/02 | 12399834 | macros/latex/required/latex-lab.zip +2024/10/31 | 881794 | macros/latex/required/latex-lab/blocks-code.pdf +2024/10/31 | 108 | macros/latex/required/latex-lab/blocks-code.tex +2024/10/31 | 485663 | macros/latex/required/latex-lab/blocks-doc.pdf +2024/10/31 | 105 | macros/latex/required/latex-lab/blocks-doc.tex +2024/10/31 | 19443 | macros/latex/required/latex-lab/changes.txt +2024/10/31 | 563214 | macros/latex/required/latex-lab/documentmetadata-support-code.pdf +2024/10/31 | 117 | macros/latex/required/latex-lab/documentmetadata-support-code.tex +2024/10/31 | 420933 | macros/latex/required/latex-lab/documentmetadata-support-doc.pdf +2024/10/31 | 191 | macros/latex/required/latex-lab/documentmetadata-support-doc.tex +2024/10/31 | 23994 | macros/latex/required/latex-lab/documentmetadata-support.dtx +2024/10/31 | 6221 | macros/latex/required/latex-lab/glyphtounicode-cmex.tex +2024/10/31 | 7452 | macros/latex/required/latex-lab/latex-lab-amsmath.dtx +2024/10/31 | 382388 | macros/latex/required/latex-lab/latex-lab-amsmath.pdf +2024/10/31 | 14380 | macros/latex/required/latex-lab/latex-lab-bib.dtx +2024/10/31 | 383673 | macros/latex/required/latex-lab/latex-lab-bib.pdf +2024/10/31 | 145696 | macros/latex/required/latex-lab/latex-lab-block.dtx +2024/10/31 | 881794 | macros/latex/required/latex-lab/latex-lab-block.pdf +2024/10/31 | 19925 | macros/latex/required/latex-lab/latex-lab-firstaid.dtx +2024/10/31 | 398544 | macros/latex/required/latex-lab/latex-lab-firstaid.pdf +2024/10/31 | 22813 | macros/latex/required/latex-lab/latex-lab-float.dtx +2024/10/31 | 444624 | macros/latex/required/latex-lab/latex-lab-float.pdf +2024/10/31 | 91590 | macros/latex/required/latex-lab/latex-lab-footnotes.dtx +2024/10/31 | 821496 | macros/latex/required/latex-lab/latex-lab-footnotes.pdf +2024/10/31 | 34515 | macros/latex/required/latex-lab/latex-lab-graphic.dtx +2024/10/31 | 517603 | macros/latex/required/latex-lab/latex-lab-graphic.pdf +2024/10/31 | 6601 | macros/latex/required/latex-lab/latex-lab.ins +2024/10/31 | 9808 | macros/latex/required/latex-lab/latex-lab-marginpar.dtx +2024/10/31 | 414685 | macros/latex/required/latex-lab/latex-lab-marginpar.pdf +2024/10/31 | 99855 | macros/latex/required/latex-lab/latex-lab-math.dtx +2024/10/31 | 797404 | macros/latex/required/latex-lab/latex-lab-math.pdf +2024/10/31 | 2898 | macros/latex/required/latex-lab/latex-lab-mathpkg.dtx +2024/10/31 | 355758 | macros/latex/required/latex-lab/latex-lab-mathpkg.pdf +2024/10/31 | 6441 | macros/latex/required/latex-lab/latex-lab-mathtools.dtx +2024/10/31 | 372235 | macros/latex/required/latex-lab/latex-lab-mathtools.pdf +2024/10/31 | 8048 | macros/latex/required/latex-lab/latex-lab-minipage.dtx +2024/10/31 | 282259 | macros/latex/required/latex-lab/latex-lab-minipage.pdf +2024/10/31 | 3349 | macros/latex/required/latex-lab/latex-lab-namespace.dtx +2024/10/31 | 235962 | macros/latex/required/latex-lab/latex-lab-namespace.pdf +2024/10/31 | 5684 | macros/latex/required/latex-lab/latex-lab-new-or-1.dtx +2024/10/31 | 389721 | macros/latex/required/latex-lab/latex-lab-new-or-1.pdf +2024/10/31 | 23812 | macros/latex/required/latex-lab/latex-lab-new-or-2.dtx +2024/10/31 | 632196 | macros/latex/required/latex-lab/latex-lab-new-or-2.pdf +2024/10/31 | 27216 | macros/latex/required/latex-lab/latex-lab-sec.dtx +2024/10/31 | 544929 | macros/latex/required/latex-lab/latex-lab-sec.pdf +2024/10/31 | 49846 | macros/latex/required/latex-lab/latex-lab-table.dtx +2024/10/31 | 572577 | macros/latex/required/latex-lab/latex-lab-table.pdf +2024/10/31 | 4824 | macros/latex/required/latex-lab/latex-lab-testphase.dtx +2024/10/31 | 298160 | macros/latex/required/latex-lab/latex-lab-testphase.pdf +2024/10/31 | 3678 | macros/latex/required/latex-lab/latex-lab-text.dtx +2024/10/31 | 307847 | macros/latex/required/latex-lab/latex-lab-text.pdf +2024/10/31 | 17010 | macros/latex/required/latex-lab/latex-lab-title.dtx +2024/10/31 | 348117 | macros/latex/required/latex-lab/latex-lab-title.pdf +2024/10/31 | 12633 | macros/latex/required/latex-lab/latex-lab-toc.dtx +2024/10/31 | 5733 | macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.dtx +2024/10/31 | 296124 | macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.pdf +2024/10/31 | 18661 | macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.dtx +2024/10/31 | 373186 | macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.pdf +2024/10/31 | 406053 | macros/latex/required/latex-lab/latex-lab-toc.pdf +2024/10/31 | 1142 | macros/latex/required/latex-lab/README.md +2024/11/01 | 12626833 | macros/latex/required/latex-lab.zip 2020/04/01 | 4858 | macros/latex/required/psnfss/8r.enc 2020/04/01 | 8765 | macros/latex/required/psnfss/changes.txt 2020/04/01 | 503 | macros/latex/required/psnfss/charter.map @@ -270946,30 +270960,31 @@ 2024/02/13 | 11357 | macros/unicodetex/latex/emotion/LICENSE 2024/02/13 | 1396 | macros/unicodetex/latex/emotion/README.md 2024/02/13 | 36791 | macros/unicodetex/latex/emotion.zip -2024/09/12 | 580990 | macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.pdf -2024/09/12 | 25057 | macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.tex -2024/09/12 | 32601 | macros/unicodetex/latex/fontsetup/doc/fspsample-cmr.pdf -2024/09/12 | 31498 | macros/unicodetex/latex/fontsetup/doc/fspsample-concrete.pdf -2024/09/12 | 32639 | macros/unicodetex/latex/fontsetup/doc/fspsample-ebgaramond.pdf -2024/09/12 | 17171 | macros/unicodetex/latex/fontsetup/doc/fspsample-erewhon.pdf -2024/09/12 | 27734 | macros/unicodetex/latex/fontsetup/doc/fspsample-euler.pdf -2024/09/12 | 22438 | macros/unicodetex/latex/fontsetup/doc/fspsample-fira.pdf -2024/09/12 | 27819 | macros/unicodetex/latex/fontsetup/doc/fspsample-gfsartemisia.pdf -2024/09/12 | 32654 | macros/unicodetex/latex/fontsetup/doc/fspsample-gfsdidotclassic.pdf -2024/09/12 | 31224 | macros/unicodetex/latex/fontsetup/doc/fspsample-gfsdidot.pdf -2024/09/12 | 27539 | macros/unicodetex/latex/fontsetup/doc/fspsample-gfsneohellenic.pdf -2024/09/12 | 29383 | macros/unicodetex/latex/fontsetup/doc/fspsample-kerkis.pdf -2024/09/12 | 33644 | macros/unicodetex/latex/fontsetup/doc/fspsample-libertinus.pdf -2024/09/12 | 35319 | macros/unicodetex/latex/fontsetup/doc/fspsample-newdefault.pdf -2024/09/12 | 26155 | macros/unicodetex/latex/fontsetup/doc/fspsample-oldstandard.pdf -2024/09/12 | 34450 | macros/unicodetex/latex/fontsetup/doc/fspsample.pdf -2024/09/12 | 28947 | macros/unicodetex/latex/fontsetup/doc/fspsample-stixtwo.pdf -2024/09/12 | 37112 | macros/unicodetex/latex/fontsetup/doc/fspsample-talos.pdf -2024/09/12 | 3776 | macros/unicodetex/latex/fontsetup/doc/fspsample.tex -2024/09/12 | 23139 | macros/unicodetex/latex/fontsetup/doc/fspsample-times.pdf -2024/09/12 | 25650 | macros/unicodetex/latex/fontsetup/doc/fspsample-withsans.pdf -2024/09/12 | 3833 | macros/unicodetex/latex/fontsetup/doc/fspsample-withsans.tex -2024/09/12 | 26496 | macros/unicodetex/latex/fontsetup/doc/fspsample-xcharter.pdf +2024/11/01 | 608170 | macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.pdf +2024/11/01 | 25383 | macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.tex +2024/10/23 | 32601 | macros/unicodetex/latex/fontsetup/doc/fspsample-cmr.pdf +2024/10/23 | 31498 | macros/unicodetex/latex/fontsetup/doc/fspsample-concrete.pdf +2024/10/23 | 32639 | macros/unicodetex/latex/fontsetup/doc/fspsample-ebgaramond.pdf +2024/10/23 | 17171 | macros/unicodetex/latex/fontsetup/doc/fspsample-erewhon.pdf +2024/10/23 | 27734 | macros/unicodetex/latex/fontsetup/doc/fspsample-euler.pdf +2024/10/23 | 22438 | macros/unicodetex/latex/fontsetup/doc/fspsample-fira.pdf +2024/10/23 | 27819 | macros/unicodetex/latex/fontsetup/doc/fspsample-gfsartemisia.pdf +2024/10/23 | 32654 | macros/unicodetex/latex/fontsetup/doc/fspsample-gfsdidotclassic.pdf +2024/10/23 | 31224 | macros/unicodetex/latex/fontsetup/doc/fspsample-gfsdidot.pdf +2024/10/23 | 27539 | macros/unicodetex/latex/fontsetup/doc/fspsample-gfsneohellenic.pdf +2024/10/23 | 29383 | macros/unicodetex/latex/fontsetup/doc/fspsample-kerkis.pdf +2024/10/23 | 33644 | macros/unicodetex/latex/fontsetup/doc/fspsample-libertinus.pdf +2024/10/23 | 35319 | macros/unicodetex/latex/fontsetup/doc/fspsample-newdefault.pdf +2024/10/23 | 26155 | macros/unicodetex/latex/fontsetup/doc/fspsample-oldstandard.pdf +2024/10/23 | 34450 | macros/unicodetex/latex/fontsetup/doc/fspsample.pdf +2024/11/01 | 27749 | macros/unicodetex/latex/fontsetup/doc/fspsample-sansdefault.pdf +2024/10/23 | 28947 | macros/unicodetex/latex/fontsetup/doc/fspsample-stixtwo.pdf +2024/10/23 | 37112 | macros/unicodetex/latex/fontsetup/doc/fspsample-talos.pdf +2024/11/01 | 3828 | macros/unicodetex/latex/fontsetup/doc/fspsample.tex +2024/10/23 | 23139 | macros/unicodetex/latex/fontsetup/doc/fspsample-times.pdf +2024/10/23 | 25650 | macros/unicodetex/latex/fontsetup/doc/fspsample-withsans.pdf +2024/10/23 | 3833 | macros/unicodetex/latex/fontsetup/doc/fspsample-withsans.tex +2024/10/23 | 26496 | macros/unicodetex/latex/fontsetup/doc/fspsample-xcharter.pdf 2023/12/13 | 289785 | macros/unicodetex/latex/fontsetup-nonfree/doc/fontsetup-nonfree-doc.pdf 2023/12/13 | 3250 | macros/unicodetex/latex/fontsetup-nonfree/doc/fontsetup-nonfree-doc.tex 2023/12/13 | 60986 | macros/unicodetex/latex/fontsetup-nonfree/doc/fspsample-cambria.pdf @@ -270987,32 +271002,33 @@ 2023/12/13 | 1297 | macros/unicodetex/latex/fontsetup-nonfree/tex/fspmsgaramondot.tex 2023/12/13 | 767 | macros/unicodetex/latex/fontsetup-nonfree/tex/fsppalatinoot.tex 2023/12/16 | 580596 | macros/unicodetex/latex/fontsetup-nonfree.zip -2024/09/12 | 371 | macros/unicodetex/latex/fontsetup/README -2024/09/12 | 1053 | macros/unicodetex/latex/fontsetup/tex/cv04-Book.fontspec -2024/09/12 | 1128 | macros/unicodetex/latex/fontsetup/tex/cv04Mono-Book.fontspec -2024/09/12 | 1137 | macros/unicodetex/latex/fontsetup/tex/cv04Mono-Regular.fontspec -2024/09/12 | 1062 | macros/unicodetex/latex/fontsetup/tex/cv04-Regular.fontspec -2024/09/12 | 1119 | macros/unicodetex/latex/fontsetup/tex/cv04Sans-Book.fontspec -2024/09/12 | 1140 | macros/unicodetex/latex/fontsetup/tex/cv04Sans-Regular.fontspec -2024/09/12 | 7192 | macros/unicodetex/latex/fontsetup/tex/fontsetup.sty -2024/09/12 | 795 | macros/unicodetex/latex/fontsetup/tex/fspconcrete.tex -2024/09/12 | 24162 | macros/unicodetex/latex/fontsetup/tex/fspdefault.tex -2024/09/12 | 638 | macros/unicodetex/latex/fontsetup/tex/fspebgaramondot.tex -2024/09/12 | 344 | macros/unicodetex/latex/fontsetup/tex/fsperewhon.tex -2024/09/12 | 1444 | macros/unicodetex/latex/fontsetup/tex/fspeulerot.tex -2024/09/12 | 629 | macros/unicodetex/latex/fontsetup/tex/fspfiraot.tex -2024/09/12 | 601 | macros/unicodetex/latex/fontsetup/tex/fspgfsartemisiaot.tex -2024/09/12 | 722 | macros/unicodetex/latex/fontsetup/tex/fspgfsdidotclassicot.tex -2024/09/12 | 1143 | macros/unicodetex/latex/fontsetup/tex/fspgfsdidotot.tex -2024/09/12 | 1946 | macros/unicodetex/latex/fontsetup/tex/fspgfsneohellenicot.tex -2024/09/12 | 399 | macros/unicodetex/latex/fontsetup/tex/fspkerkisot.tex -2024/09/12 | 24199 | macros/unicodetex/latex/fontsetup/tex/fspolddefault.tex -2024/09/12 | 632 | macros/unicodetex/latex/fontsetup/tex/fspoldstandard.tex -2024/09/12 | 389 | macros/unicodetex/latex/fontsetup/tex/fspstixtwoot.tex -2024/09/12 | 819 | macros/unicodetex/latex/fontsetup/tex/fsptalos.tex -2024/09/12 | 616 | macros/unicodetex/latex/fontsetup/tex/fsptimesot.tex -2024/09/12 | 752 | macros/unicodetex/latex/fontsetup/tex/fspxcharter.tex -2024/09/12 | 1145065 | macros/unicodetex/latex/fontsetup.zip +2024/11/01 | 371 | macros/unicodetex/latex/fontsetup/README +2024/10/31 | 1053 | macros/unicodetex/latex/fontsetup/tex/cv04-Book.fontspec +2024/10/31 | 1128 | macros/unicodetex/latex/fontsetup/tex/cv04Mono-Book.fontspec +2024/10/31 | 1137 | macros/unicodetex/latex/fontsetup/tex/cv04Mono-Regular.fontspec +2024/10/31 | 1062 | macros/unicodetex/latex/fontsetup/tex/cv04-Regular.fontspec +2024/10/31 | 1119 | macros/unicodetex/latex/fontsetup/tex/cv04Sans-Book.fontspec +2024/10/31 | 1140 | macros/unicodetex/latex/fontsetup/tex/cv04Sans-Regular.fontspec +2024/11/01 | 9804 | macros/unicodetex/latex/fontsetup/tex/fontsetup.sty +2024/10/31 | 795 | macros/unicodetex/latex/fontsetup/tex/fspconcrete.tex +2024/10/31 | 24162 | macros/unicodetex/latex/fontsetup/tex/fspdefault.tex +2024/10/31 | 638 | macros/unicodetex/latex/fontsetup/tex/fspebgaramondot.tex +2024/10/31 | 344 | macros/unicodetex/latex/fontsetup/tex/fsperewhon.tex +2024/10/31 | 1444 | macros/unicodetex/latex/fontsetup/tex/fspeulerot.tex +2024/10/31 | 629 | macros/unicodetex/latex/fontsetup/tex/fspfiraot.tex +2024/10/31 | 601 | macros/unicodetex/latex/fontsetup/tex/fspgfsartemisiaot.tex +2024/10/31 | 722 | macros/unicodetex/latex/fontsetup/tex/fspgfsdidotclassicot.tex +2024/10/31 | 1143 | macros/unicodetex/latex/fontsetup/tex/fspgfsdidotot.tex +2024/10/31 | 1946 | macros/unicodetex/latex/fontsetup/tex/fspgfsneohellenicot.tex +2024/10/31 | 399 | macros/unicodetex/latex/fontsetup/tex/fspkerkisot.tex +2024/10/31 | 24199 | macros/unicodetex/latex/fontsetup/tex/fspolddefault.tex +2024/10/31 | 632 | macros/unicodetex/latex/fontsetup/tex/fspoldstandard.tex +2024/10/31 | 24161 | macros/unicodetex/latex/fontsetup/tex/fspsansdefault.tex +2024/10/31 | 389 | macros/unicodetex/latex/fontsetup/tex/fspstixtwoot.tex +2024/10/31 | 819 | macros/unicodetex/latex/fontsetup/tex/fsptalos.tex +2024/10/31 | 616 | macros/unicodetex/latex/fontsetup/tex/fsptimesot.tex +2024/10/31 | 752 | macros/unicodetex/latex/fontsetup/tex/fspxcharter.tex +2024/11/01 | 1201604 | macros/unicodetex/latex/fontsetup.zip 2024/05/11 | 25600 | macros/unicodetex/latex/fontspec/CHANGES.md 2024/05/11 | 549 | macros/unicodetex/latex/fontspec/fontspec.cfg 2024/05/11 | 16125 | macros/unicodetex/latex/fontspec/fontspec-code-api.dtx @@ -310024,8 +310040,8 @@ 2021/05/11 | 624 | systems/texlive/tlnet/archive/collection-basic.r59159.tar.xz 2024/08/01 | 1292 | systems/texlive/tlnet/archive/collection-bibtexextra.r71940.tar.xz 2024/09/22 | 1012 | systems/texlive/tlnet/archive/collection-binextra.r72338.tar.xz -2024/07/24 | 532 | systems/texlive/tlnet/archive/collection-context.r71879.tar.xz -2024/10/13 | 2084 | systems/texlive/tlnet/archive/collection-fontsextra.r72535.tar.xz +2024/11/01 | 540 | systems/texlive/tlnet/archive/collection-context.r72727.tar.xz +2024/11/01 | 2072 | systems/texlive/tlnet/archive/collection-fontsextra.r72727.tar.xz 2020/03/04 | 560 | systems/texlive/tlnet/archive/collection-fontsrecommended.r54074.tar.xz 2021/12/03 | 536 | systems/texlive/tlnet/archive/collection-fontutils.r61207.tar.xz 2024/09/11 | 572 | systems/texlive/tlnet/archive/collection-formatsextra.r72250.tar.xz @@ -311453,9 +311469,9 @@ 2021/07/19 | 313228 | systems/texlive/tlnet/archive/easing.doc.r59975.tar.xz 2021/07/19 | 2220 | systems/texlive/tlnet/archive/easing.r59975.tar.xz 2021/07/19 | 7876 | systems/texlive/tlnet/archive/easing.source.r59975.tar.xz -2024/10/30 | 679640 | systems/texlive/tlnet/archive/easybook.doc.r72700.tar.xz -2024/10/30 | 20260 | systems/texlive/tlnet/archive/easybook.r72700.tar.xz -2024/10/30 | 20144 | systems/texlive/tlnet/archive/easybook.source.r72700.tar.xz +2024/11/01 | 679632 | systems/texlive/tlnet/archive/easybook.doc.r72725.tar.xz +2024/11/01 | 20252 | systems/texlive/tlnet/archive/easybook.r72725.tar.xz +2024/11/01 | 20160 | systems/texlive/tlnet/archive/easybook.source.r72725.tar.xz 2019/02/28 | 4540 | systems/texlive/tlnet/archive/easy.doc.r19440.tar.xz 2023/10/12 | 344 | systems/texlive/tlnet/archive/easydtx.aarch64-linux.r68514.tar.xz 2023/10/12 | 344 | systems/texlive/tlnet/archive/easydtx.amd64-freebsd.r68514.tar.xz @@ -311741,13 +311757,13 @@ 2024/01/12 | 336 | systems/texlive/tlnet/archive/eolang.amd64-freebsd.r69391.tar.xz 2024/01/12 | 340 | systems/texlive/tlnet/archive/eolang.amd64-netbsd.r69391.tar.xz 2024/01/12 | 340 | systems/texlive/tlnet/archive/eolang.armhf-linux.r69391.tar.xz -2024/02/15 | 1454980 | systems/texlive/tlnet/archive/eolang.doc.r69857.tar.xz +2024/11/01 | 1358064 | systems/texlive/tlnet/archive/eolang.doc.r72724.tar.xz 2024/01/12 | 340 | systems/texlive/tlnet/archive/eolang.i386-freebsd.r69391.tar.xz 2024/01/12 | 336 | systems/texlive/tlnet/archive/eolang.i386-linux.r69391.tar.xz 2024/01/12 | 340 | systems/texlive/tlnet/archive/eolang.i386-netbsd.r69391.tar.xz 2024/01/12 | 336 | systems/texlive/tlnet/archive/eolang.i386-solaris.r69391.tar.xz -2024/02/15 | 9096 | systems/texlive/tlnet/archive/eolang.r69857.tar.xz -2024/02/15 | 16988 | systems/texlive/tlnet/archive/eolang.source.r69857.tar.xz +2024/11/01 | 8924 | systems/texlive/tlnet/archive/eolang.r72724.tar.xz +2024/11/01 | 16996 | systems/texlive/tlnet/archive/eolang.source.r72724.tar.xz 2024/01/12 | 340 | systems/texlive/tlnet/archive/eolang.universal-darwin.r69391.tar.xz 2024/01/12 | 2304 | systems/texlive/tlnet/archive/eolang.windows.r69391.tar.xz 2024/01/12 | 340 | systems/texlive/tlnet/archive/eolang.x86_64-cygwin.r69391.tar.xz @@ -314645,9 +314661,9 @@ 2019/12/05 | 2092 | systems/texlive/tlnet/archive/letltxmacro.r53022.tar.xz 2019/12/05 | 5912 | systems/texlive/tlnet/archive/letltxmacro.source.r53022.tar.xz 2020/03/13 | 5180 | systems/texlive/tlnet/archive/letterspacing.r54266.tar.xz -2021/07/20 | 480964 | systems/texlive/tlnet/archive/letterswitharrows.doc.r59993.tar.xz -2021/07/20 | 3252 | systems/texlive/tlnet/archive/letterswitharrows.r59993.tar.xz -2021/07/20 | 5380 | systems/texlive/tlnet/archive/letterswitharrows.source.r59993.tar.xz +2024/11/01 | 468336 | systems/texlive/tlnet/archive/letterswitharrows.doc.r72723.tar.xz +2024/11/01 | 3392 | systems/texlive/tlnet/archive/letterswitharrows.r72723.tar.xz +2024/11/01 | 5572 | systems/texlive/tlnet/archive/letterswitharrows.source.r72723.tar.xz 2020/04/15 | 1005116 | systems/texlive/tlnet/archive/lettre.doc.r54722.tar.xz 2020/04/15 | 25428 | systems/texlive/tlnet/archive/lettre.r54722.tar.xz 2024/06/27 | 454688 | systems/texlive/tlnet/archive/lettrine.doc.r71627.tar.xz @@ -317409,8 +317425,8 @@ 2019/02/28 | 38588 | systems/texlive/tlnet/archive/pittetd.source.r15878.tar.xz 2023/02/22 | 387308 | systems/texlive/tlnet/archive/pixelart.doc.r66012.tar.xz 2023/02/22 | 6764 | systems/texlive/tlnet/archive/pixelart.r66012.tar.xz -2024/04/17 | 1286624 | systems/texlive/tlnet/archive/pixelarttikz.doc.r70964.tar.xz -2024/04/17 | 4768 | systems/texlive/tlnet/archive/pixelarttikz.r70964.tar.xz +2024/11/01 | 1296992 | systems/texlive/tlnet/archive/pixelarttikz.doc.r72726.tar.xz +2024/11/01 | 4992 | systems/texlive/tlnet/archive/pixelarttikz.r72726.tar.xz 2019/02/28 | 340 | systems/texlive/tlnet/archive/pkfix.aarch64-linux.r46208.tar.xz 2019/02/28 | 340 | systems/texlive/tlnet/archive/pkfix.amd64-freebsd.r16472.tar.xz 2019/02/28 | 336 | systems/texlive/tlnet/archive/pkfix.amd64-netbsd.r30191.tar.xz @@ -317681,8 +317697,8 @@ 2024/09/06 | 1365548 | systems/texlive/tlnet/archive/profcollege.r72198.tar.xz 2022/04/27 | 134096 | systems/texlive/tlnet/archive/proflabo.doc.r63147.tar.xz 2022/04/27 | 2748 | systems/texlive/tlnet/archive/proflabo.r63147.tar.xz -2024/10/25 | 2563420 | systems/texlive/tlnet/archive/proflycee.doc.r72645.tar.xz -2024/10/25 | 396636 | systems/texlive/tlnet/archive/proflycee.r72645.tar.xz +2024/11/01 | 2572216 | systems/texlive/tlnet/archive/proflycee.doc.r72722.tar.xz +2024/11/01 | 397156 | systems/texlive/tlnet/archive/proflycee.r72722.tar.xz 2024/10/23 | 430540 | systems/texlive/tlnet/archive/profmaquette.doc.r72622.tar.xz 2024/10/23 | 35432 | systems/texlive/tlnet/archive/profmaquette.r72622.tar.xz 2024/05/20 | 578468 | systems/texlive/tlnet/archive/profsio.doc.r71302.tar.xz @@ -318568,9 +318584,9 @@ 2019/02/28 | 352 | systems/texlive/tlnet/archive/rubik.x86_64-linuxmusl.r46840.tar.xz 2019/02/28 | 348 | systems/texlive/tlnet/archive/rubik.x86_64-linux.r32919.tar.xz 2019/02/28 | 348 | systems/texlive/tlnet/archive/rubik.x86_64-solaris.r32919.tar.xz -2024/09/07 | 436836 | systems/texlive/tlnet/archive/rub-kunstgeschichte.doc.r72213.tar.xz -2024/09/07 | 1596 | systems/texlive/tlnet/archive/rub-kunstgeschichte.r72213.tar.xz -2024/09/07 | 6156 | systems/texlive/tlnet/archive/rub-kunstgeschichte.source.r72213.tar.xz +2024/11/01 | 482328 | systems/texlive/tlnet/archive/rub-kunstgeschichte.doc.r72721.tar.xz +2024/11/01 | 3084 | systems/texlive/tlnet/archive/rub-kunstgeschichte.r72721.tar.xz +2024/11/01 | 10244 | systems/texlive/tlnet/archive/rub-kunstgeschichte.source.r72721.tar.xz 2019/02/28 | 56732 | systems/texlive/tlnet/archive/ruhyphen.r21081.tar.xz 2019/02/28 | 13656 | systems/texlive/tlnet/archive/ruhyphen.source.r21081.tar.xz 2019/05/05 | 58888 | systems/texlive/tlnet/archive/rulerbox.doc.r50984.tar.xz @@ -319101,8 +319117,8 @@ 2024/06/01 | 1682276 | systems/texlive/tlnet/archive/spath3.doc.r71396.tar.xz 2024/06/01 | 25664 | systems/texlive/tlnet/archive/spath3.r71396.tar.xz 2024/06/01 | 37744 | systems/texlive/tlnet/archive/spath3.source.r71396.tar.xz -2024/10/31 | 98976 | systems/texlive/tlnet/archive/spbmark.doc.r72710.tar.xz -2024/10/31 | 4364 | systems/texlive/tlnet/archive/spbmark.r72710.tar.xz +2024/11/01 | 99832 | systems/texlive/tlnet/archive/spbmark.doc.r72720.tar.xz +2024/11/01 | 4416 | systems/texlive/tlnet/archive/spbmark.r72720.tar.xz 2022/09/28 | 80968 | systems/texlive/tlnet/archive/spectral.doc.r64528.tar.xz 2022/09/28 | 3545188 | systems/texlive/tlnet/archive/spectral.r64528.tar.xz 2023/01/30 | 2103268 | systems/texlive/tlnet/archive/spectralsequences.doc.r65667.tar.xz @@ -319981,7 +319997,7 @@ 2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz -2024/10/31 | 438816 | systems/texlive/tlnet/archive/texlive-scripts.doc.r72717.tar.xz +2024/11/01 | 439404 | systems/texlive/tlnet/archive/texlive-scripts.doc.r72728.tar.xz 2024/07/09 | 908 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r71749.tar.xz 2024/07/09 | 920 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r71749.tar.xz 2024/07/09 | 908 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r71749.tar.xz @@ -320003,7 +320019,7 @@ 2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz -2024/10/31 | 114392 | systems/texlive/tlnet/archive/texlive-scripts.r72717.tar.xz +2024/11/01 | 114408 | systems/texlive/tlnet/archive/texlive-scripts.r72728.tar.xz 2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz 2024/05/10 | 60592 | systems/texlive/tlnet/archive/texlive-scripts.windows.r71215.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz @@ -320778,8 +320794,8 @@ 2022/11/08 | 7888 | systems/texlive/tlnet/archive/turnstile.source.r64967.tar.xz 2019/02/28 | 78428 | systems/texlive/tlnet/archive/turnthepage.doc.r29803.tar.xz 2019/02/28 | 1664 | systems/texlive/tlnet/archive/turnthepage.r29803.tar.xz -2024/10/30 | 1941896 | systems/texlive/tlnet/archive/tutodoc.doc.r72696.tar.xz -2024/10/30 | 10800 | systems/texlive/tlnet/archive/tutodoc.r72696.tar.xz +2024/11/01 | 1888144 | systems/texlive/tlnet/archive/tutodoc.doc.r72719.tar.xz +2024/11/01 | 11376 | systems/texlive/tlnet/archive/tutodoc.r72719.tar.xz 2024/08/08 | 712 | systems/texlive/tlnet/archive/twemoji-colr.doc.r71991.tar.xz 2024/08/08 | 581212 | systems/texlive/tlnet/archive/twemoji-colr.r71991.tar.xz 2022/04/06 | 4751536 | systems/texlive/tlnet/archive/twemojis.doc.r62930.tar.xz @@ -321966,16 +321982,16 @@ 2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz 2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz 2024/07/20 | 125851 | systems/texlive/tlnet/install-tl -2024/10/31 | 5758225 | systems/texlive/tlnet/install-tl-unx.tar.gz -2024/10/31 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 -2024/10/31 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2024/11/01 | 5755715 | systems/texlive/tlnet/install-tl-unx.tar.gz +2024/11/01 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2024/11/01 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc 2024/04/13 | 5743 | systems/texlive/tlnet/install-tl-windows.bat -2024/10/31 | 27713836 | systems/texlive/tlnet/install-tl-windows.exe -2024/10/31 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 -2024/10/31 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2024/10/31 | 34429453 | systems/texlive/tlnet/install-tl.zip -2024/10/31 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 -2024/10/31 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2024/11/01 | 27713678 | systems/texlive/tlnet/install-tl-windows.exe +2024/11/01 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2024/11/01 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2024/11/01 | 34429467 | systems/texlive/tlnet/install-tl.zip +2024/11/01 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2024/11/01 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc 2024/03/13 | 1229 | systems/texlive/tlnet/README.md 2024/03/13 | 0 | systems/texlive/tlnet/TEXLIVE_2024 2024/01/02 | 9011 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg @@ -321985,7 +322001,7 @@ 2024/01/02 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg 2024/07/29 | 50743 | systems/texlive/tlnet/tlpkg/installer/config.guess 2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt -2024/10/31 | 7382 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +2024/11/01 | 7426 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2024/09/25 | 234847 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt 2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe 2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt @@ -322027,12 +322043,12 @@ 2023/02/21 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm 2024/05/02 | 5898 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm 2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm -2024/10/31 | 19663383 | systems/texlive/tlnet/tlpkg/texlive.tlpdb -2024/10/31 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2024/11/01 | 19663418 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2024/11/01 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 2024/06/22 | 87725 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm -2024/10/31 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 -2024/10/31 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2024/10/31 | 2609692 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2024/11/01 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2024/11/01 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2024/11/01 | 2608204 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz 2023/02/20 | 58928 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm 2023/06/11 | 42749 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm 2023/02/21 | 16138 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm @@ -333837,7 +333853,7 @@ 2014/07/05 | 611 | systems/win32/yandy/README 2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz 2014/07/05 | 1012416 | systems/win32/yandy.zip -2024/11/01 | 186 | timestamp +2024/11/02 | 186 | timestamp 2002/08/26 | 61898 | usergrps/dante/antrag.pdf 2002/08/26 | 118217 | usergrps/dante/antrag.ps 2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib diff --git a/FILES.byname.gz b/FILES.byname.gz Binary files differindex 0ff6e31fc2..0df4505343 100644 --- a/FILES.byname.gz +++ b/FILES.byname.gz diff --git a/FILES.last07days b/FILES.last07days index 180813f694..5c45df61e0 100644 --- a/FILES.last07days +++ b/FILES.last07days @@ -1,521 +1,1727 @@ +2024/11/01 | 99832 | systems/texlive/tlnet/archive/spbmark.doc.r72720.tar.xz +2024/11/01 | 9928 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-5.ogg +2024/11/01 | 9804 | macros/unicodetex/latex/fontsetup/tex/fontsetup.sty +2024/11/01 | 97186 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-2.ogg +2024/11/01 | 9620 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-3.ogg +2024/11/01 | 94918 | macros/latex/contrib/spelatex/Example/example.pdf +2024/11/01 | 94778 | macros/latex/contrib/easybook/easybook.dtx +2024/11/01 | 94513 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-2.ogg +2024/11/01 | 94364 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-1.ogg +2024/11/01 | 93981 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-5.ogg +2024/11/01 | 92521 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-4.ogg +2024/11/01 | 92332 | macros/latex/contrib/spelatex/spelatex.dtx +2024/11/01 | 91709 | macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-1.ogg +2024/11/01 | 913 | macros/latex/contrib/easybook/README.md +2024/11/01 | 8924 | systems/texlive/tlnet/archive/eolang.r72724.tar.xz +2024/11/01 | 8721 | macros/latex/contrib/spelatex/Example/example-spel/star-1.ogg +2024/11/01 | 87081 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-2.ogg +2024/11/01 | 87049 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-2.ogg +2024/11/01 | 87004 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-4.ogg +2024/11/01 | 8673 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-2.ogg +2024/11/01 | 853 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.m3u +2024/11/01 | 85250 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-7.ogg +2024/11/01 | 84218 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-4.ogg +2024/11/01 | 83643 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0-1.ogg +2024/11/01 | 82794 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-4.ogg +2024/11/01 | 8265408 | macros/latex-dev/required/tools.zip +2024/11/01 | 81234 | fonts/newcomputermodern/doc/testmath-newcm-sans.tex +2024/11/01 | 81048 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-1.ogg +2024/11/01 | 80653 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-2.ogg +2024/11/01 | 8041 | macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-star-1.ogg +2024/11/01 | 788 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonethree.tfm +2024/11/01 | 78802 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0-1.ogg +2024/11/01 | 78350 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-3.ogg +2024/11/01 | 77413 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-5.ogg +2024/11/01 | 762 | macros/latex/contrib/spelatex/spelatex-spel/6.6.0.0.0.m3u +2024/11/01 | 75953 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-6.ogg +2024/11/01 | 75731 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-3.ogg +2024/11/01 | 752 | macros/latex/contrib/spelatex/spelatex-spel/7.9.0.0.0.m3u +2024/11/01 | 75007 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0-1.ogg +2024/11/01 | 7426 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +2024/11/01 | 74060 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-1.ogg +2024/11/01 | 73657 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0-2.ogg +2024/11/01 | 73497 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-2.ogg +2024/11/01 | 73250 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0-1.ogg +2024/11/01 | 7220 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-star-4.ogg +2024/11/01 | 71704 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-3.ogg +2024/11/01 | 70900 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-2.ogg +2024/11/01 | 70620 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-5.ogg +2024/11/01 | 705246 | macros/latex/contrib/easybook.zip +2024/11/01 | 70172 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-1.ogg +2024/11/01 | 69911 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-2.ogg +2024/11/01 | 69856 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-11.ogg +2024/11/01 | 692 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0.m3u +2024/11/01 | 69041 | fonts/newcomputermodern/doc/newcm-doc.tex +2024/11/01 | 679632 | systems/texlive/tlnet/archive/easybook.doc.r72725.tar.xz +2024/11/01 | 677 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0.m3u +2024/11/01 | 677 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0.m3u +2024/11/01 | 677 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0.m3u +2024/11/01 | 67763 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-1.ogg +2024/11/01 | 67677 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-3.ogg +2024/11/01 | 673 | macros/latex/contrib/spelatex/spelatex-spel/6.2.0.0.0.m3u +2024/11/01 | 66772 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-2.ogg +2024/11/01 | 66745 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-4.ogg +2024/11/01 | 659 | fonts/newcomputermodern/tex/newcomputermodern.sty +2024/11/01 | 650533 | macros/latex/contrib/easybook/easybook.pdf +2024/11/01 | 64306 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0-1.ogg +2024/11/01 | 64240 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-1.ogg +2024/11/01 | 64185 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-3.ogg +2024/11/01 | 6390551 | fonts/simpleicons.zip +2024/11/01 | 63694 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-3.ogg +2024/11/01 | 63286 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-1.ogg +2024/11/01 | 631 | macros/latex/contrib/spelatex/Example/example-spel/3.2.0.0.0.0.m3u +2024/11/01 | 62902 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-5.ogg +2024/11/01 | 610787 | macros/latex/contrib/enumext/enumext.dtx +2024/11/01 | 61026 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-2.ogg +2024/11/01 | 608170 | macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.pdf +2024/11/01 | 60306 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-9.ogg +2024/11/01 | 59942 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-2.ogg +2024/11/01 | 59688 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-2.ogg +2024/11/01 | 59163 | macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg +2024/11/01 | 59163 | macros/latex/contrib/spelatex/spelatex-spel/footnote-1.ogg +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0.m3u +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0.m3u +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0.m3u +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0.m3u +2024/11/01 | 588 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0.m3u +2024/11/01 | 584 | macros/latex/contrib/spelatex/spelatex-spel/7.11.0.0.0.m3u +2024/11/01 | 57815 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-2.ogg +2024/11/01 | 57815 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0-2.ogg +2024/11/01 | 5755715 | systems/texlive/tlnet/install-tl-unx.tar.gz +2024/11/01 | 57294 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0-2.ogg +2024/11/01 | 56769 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-4.ogg +2024/11/01 | 56609 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-4.ogg +2024/11/01 | 56585 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-2.ogg +2024/11/01 | 5645 | macros/latex/contrib/href-ul/href-ul.dtx +2024/11/01 | 56006 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-5.ogg +2024/11/01 | 5572 | systems/texlive/tlnet/archive/letterswitharrows.source.r72723.tar.xz +2024/11/01 | 55513 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0-1.ogg +2024/11/01 | 55382 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-2.ogg +2024/11/01 | 540 | systems/texlive/tlnet/archive/collection-context.r72727.tar.xz +2024/11/01 | 53200 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-4.ogg +2024/11/01 | 52258 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0.ogg +2024/11/01 | 5194 | macros/latex/contrib/spelatex/spelatex-spel/4.0.0.0.0.m3u +2024/11/01 | 50813 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0-1.ogg +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0.m3u +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0.m3u +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0.m3u +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0.m3u +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0.m3u +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0.m3u +2024/11/01 | 499 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0.m3u +2024/11/01 | 4992 | systems/texlive/tlnet/archive/pixelarttikz.r72726.tar.xz +2024/11/01 | 49487 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0-1.ogg +2024/11/01 | 49459 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-1.ogg +2024/11/01 | 49408 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-3.ogg +2024/11/01 | 493201 | macros/latex/contrib/jsonparse.zip +2024/11/01 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2024/11/01 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2024/11/01 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2024/11/01 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2024/11/01 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2024/11/01 | 488485 | macros/latex/contrib/jsonparse/jsonparse-doc.pdf +2024/11/01 | 486327 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-1.ogg +2024/11/01 | 48292 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-2.ogg +2024/11/01 | 482328 | systems/texlive/tlnet/archive/rub-kunstgeschichte.doc.r72721.tar.xz +2024/11/01 | 473613 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-2.ogg +2024/11/01 | 47328 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-4.ogg +2024/11/01 | 473243 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-1.ogg +2024/11/01 | 468336 | systems/texlive/tlnet/archive/letterswitharrows.doc.r72723.tar.xz +2024/11/01 | 46676 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-8.ogg +2024/11/01 | 46080841 | macros/latex-dev/base.zip +2024/11/01 | 45809 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-4.ogg +2024/11/01 | 45802 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-5.ogg +2024/11/01 | 4575 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0.m3u +2024/11/01 | 4486 | macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.m3u +2024/11/01 | 44789 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-3.ogg +2024/11/01 | 44705 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-4.ogg +2024/11/01 | 446 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0.m3u +2024/11/01 | 44273 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-3.ogg +2024/11/01 | 4416 | systems/texlive/tlnet/archive/spbmark.r72720.tar.xz +2024/11/01 | 439404 | systems/texlive/tlnet/archive/texlive-scripts.doc.r72728.tar.xz +2024/11/01 | 4389 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0.m3u +2024/11/01 | 43807 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-5.ogg +2024/11/01 | 43243 | macros/latex/contrib/jsonparse/jsonparse.sty +2024/11/01 | 4207758 | biblio/ctan-bibdata.zip +2024/11/01 | 41688 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-3.ogg +2024/11/01 | 41633 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0-1.ogg +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0.m3u +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0.m3u +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0.m3u +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0.m3u +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0.m3u +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0.m3u +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0.m3u +2024/11/01 | 410 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0.m3u +2024/11/01 | 397156 | systems/texlive/tlnet/archive/proflycee.r72722.tar.xz +2024/11/01 | 3937 | fonts/simpleicons/enc/simpleiconsone.enc +2024/11/01 | 3925 | fonts/simpleicons/enc/simpleiconsfive.enc +2024/11/01 | 38996 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-1.ogg +2024/11/01 | 38837 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-3.ogg +2024/11/01 | 3828 | macros/unicodetex/latex/fontsetup/doc/fspsample.tex +2024/11/01 | 3791 | fonts/simpleicons/enc/simpleiconsthree.enc +2024/11/01 | 3790528 | biblio/ctan-bibdata/ctan.pdf +2024/11/01 | 37521 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0-1.ogg +2024/11/01 | 37328 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-1.ogg +2024/11/01 | 371 | macros/unicodetex/latex/fontsetup/README +2024/11/01 | 3718 | fonts/simpleicons/enc/simpleiconsoneone.enc +2024/11/01 | 371398 | fonts/newcomputermodern/doc/newcm-doc.pdf +2024/11/01 | 3698 | fonts/simpleicons/enc/simpleiconsonezero.enc +2024/11/01 | 36972 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0-1.ogg +2024/11/01 | 368412 | macros/latex/contrib/spelatex/spelatex.pdf +2024/11/01 | 3682 | fonts/simpleicons/enc/simpleiconsseven.enc +2024/11/01 | 366896 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-5.ogg +2024/11/01 | 3640 | fonts/simpleicons/enc/simpleiconstwo.enc +2024/11/01 | 36401 | macros/latex/contrib/spelatex/spelatex-spel/4.1.8.0.0-2.ogg +2024/11/01 | 35730 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0-1.ogg +2024/11/01 | 35666 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-3.ogg +2024/11/01 | 356307 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-2.ogg +2024/11/01 | 35628 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0-1.ogg +2024/11/01 | 3542 | fonts/simpleicons/enc/simpleiconsnine.enc +2024/11/01 | 3517 | fonts/simpleicons/enc/simpleiconsfour.enc +2024/11/01 | 3514 | fonts/simpleicons/enc/simpleiconseight.enc +2024/11/01 | 348 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0.m3u +2024/11/01 | 348 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0.m3u +2024/11/01 | 3487 | fonts/simpleicons/enc/simpleiconsonetwo.enc +2024/11/01 | 34429467 | systems/texlive/tlnet/install-tl.zip +2024/11/01 | 341 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0.m3u +2024/11/01 | 34069 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-4.ogg +2024/11/01 | 33980 | macros/latex/contrib/spelatex/spelatex-spel/7.10.1.0.0.ogg +2024/11/01 | 3392 | systems/texlive/tlnet/archive/letterswitharrows.r72723.tar.xz +2024/11/01 | 3388 | fonts/simpleicons/enc/simpleiconssix.enc +2024/11/01 | 33877 | macros/latex/contrib/jsonparse/jsonparse-doc.tex +2024/11/01 | 333648 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-1.ogg +2024/11/01 | 328888 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-1.ogg +2024/11/01 | 32717 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-7.ogg +2024/11/01 | 32579 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-3.ogg +2024/11/01 | 32271 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-4.ogg +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0.m3u +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0.m3u +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0.m3u +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0.m3u +2024/11/01 | 321 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0.m3u +2024/11/01 | 32152 | macros/latex/contrib/spelatex/spelatex-spel/footnote-4.ogg +2024/11/01 | 32152 | macros/latex/contrib/spelatex/spelatex-spel/footnote-3.ogg +2024/11/01 | 320 | macros/latex/contrib/spelatex/spelatex-spel/7.10.0.0.0.m3u +2024/11/01 | 31955 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-6.ogg +2024/11/01 | 31865 | macros/latex/contrib/spelatex/spelatex-spel/7.11.4.0.0.ogg +2024/11/01 | 31731 | macros/latex/contrib/spelatex/spelatex-spel/author.ogg +2024/11/01 | 31552 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0.ogg +2024/11/01 | 31297 | macros/latex/contrib/spelatex/spelatex-spel/7.11.3.0.0.ogg +2024/11/01 | 31172 | macros/latex/contrib/spelatex/spelatex-spel/7.11.1.0.0.ogg +2024/11/01 | 31085 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-2.ogg +2024/11/01 | 310204 | fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex +2024/11/01 | 30874862 | fonts/newcomputermodern.zip +2024/11/01 | 3084 | systems/texlive/tlnet/archive/rub-kunstgeschichte.r72721.tar.xz +2024/11/01 | 3064 | macros/latex/contrib/spelatex/Example/example.tex +2024/11/01 | 3060934 | macros/latex-dev/required/graphics.zip +2024/11/01 | 30482 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-8.ogg +2024/11/01 | 30441 | macros/latex/contrib/spelatex/spelatex-spel/7.10.0.0.0.ogg +2024/11/01 | 30360 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0.ogg +2024/11/01 | 302828 | fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex +2024/11/01 | 300493 | macros/latex/contrib/href-ul/href-ul.pdf +2024/11/01 | 29964 | macros/latex/contrib/spelatex/spelatex-spel/7.11.2.0.0.ogg +2024/11/01 | 29964 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0.ogg +2024/11/01 | 299281 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-6.ogg +2024/11/01 | 297720 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-2.ogg +2024/11/01 | 29599 | macros/latex/contrib/spelatex/spelatex-spel/7.9.6.0.0.ogg +2024/11/01 | 2955 | fonts/simpleicons/enc/simpleiconsonethree.enc +2024/11/01 | 294502 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-9.ogg +2024/11/01 | 2896242 | biblio/ctan-bibdata/ctan.bib +2024/11/01 | 288439 | macros/latex/contrib/href-ul.zip +2024/11/01 | 28771 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0.ogg +2024/11/01 | 28766 | macros/latex/contrib/spelatex/spelatex-spel/3.2.0.0.0.ogg +2024/11/01 | 28749 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0.ogg +2024/11/01 | 28471 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0.ogg +2024/11/01 | 28374 | macros/latex/contrib/spelatex/spelatex-spel/7.9.0.0.0.ogg +2024/11/01 | 28210 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-7.ogg +2024/11/01 | 282030 | macros/latex/required/firstaid.zip +2024/11/01 | 282030 | macros/latex-dev/required/firstaid.zip +2024/11/01 | 28102 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-4.ogg +2024/11/01 | 28100 | macros/latex/contrib/spelatex/spelatex-spel/7.11.5.0.0.ogg +2024/11/01 | 28099 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0.ogg +2024/11/01 | 280698 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-1.ogg +2024/11/01 | 279 | fonts/simpleicons/tex/usimpleiconsonethree.fd +2024/11/01 | 27987 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-3.ogg +2024/11/01 | 27873 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0.ogg +2024/11/01 | 27749 | macros/unicodetex/latex/fontsetup/doc/fspsample-sansdefault.pdf +2024/11/01 | 27721 | macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0.ogg +2024/11/01 | 27713678 | systems/texlive/tlnet/install-tl-windows.exe +2024/11/01 | 2765797 | macros/latex-dev/required/amsmath.zip +2024/11/01 | 2765785 | macros/latex/required/amsmath.zip +2024/11/01 | 274 | fonts/simpleicons/tex/usimpleiconsonezero.fd +2024/11/01 | 27251 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-1.ogg +2024/11/01 | 2716 | macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.m3u +2024/11/01 | 269 | fonts/simpleicons/tex/usimpleiconsonetwo.fd +2024/11/01 | 269 | fonts/simpleicons/tex/usimpleiconsoneone.fd +2024/11/01 | 267743 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-1.ogg +2024/11/01 | 266982 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-6.ogg +2024/11/01 | 26567 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0.ogg +2024/11/01 | 264 | fonts/simpleicons/tex/usimpleiconsthree.fd +2024/11/01 | 264 | fonts/simpleicons/tex/usimpleiconsseven.fd +2024/11/01 | 264 | fonts/simpleicons/tex/usimpleiconseight.fd +2024/11/01 | 26438 | macros/latex/contrib/spelatex/spelatex-spel/7.11.0.0.0.ogg +2024/11/01 | 26416 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-3.ogg +2024/11/01 | 2631 | macros/latex/contrib/href-ul/href-ul.ins +2024/11/01 | 262984 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-1.ogg +2024/11/01 | 26247 | macros/latex/contrib/spelatex/spelatex-spel/date.ogg +2024/11/01 | 2608204 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2024/11/01 | 259 | fonts/simpleicons/tex/usimpleiconsnine.fd +2024/11/01 | 259 | fonts/simpleicons/tex/usimpleiconsfour.fd +2024/11/01 | 259 | fonts/simpleicons/tex/usimpleiconsfive.fd +2024/11/01 | 25990 | macros/latex/contrib/spelatex/spelatex-spel/7.10.2.0.0.ogg +2024/11/01 | 2572216 | systems/texlive/tlnet/archive/proflycee.doc.r72722.tar.xz +2024/11/01 | 254 | fonts/simpleicons/tex/usimpleiconstwo.fd +2024/11/01 | 254 | fonts/simpleicons/tex/usimpleiconssix.fd +2024/11/01 | 254 | fonts/simpleicons/tex/usimpleiconsone.fd +2024/11/01 | 2542185 | fonts/simpleicons/doc/simpleicons.pdf +2024/11/01 | 2538 | macros/latex/contrib/spelatex/spelatex-spel/1.0.0.0.0.m3u +2024/11/01 | 25383 | macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.tex +2024/11/01 | 25176 | macros/latex/contrib/spelatex/spelatex-spel/4.1.9.0.0.ogg +2024/11/01 | 250 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0.m3u +2024/11/01 | 250 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0.m3u +2024/11/01 | 2504 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0.m3u +2024/11/01 | 25043 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0.ogg +2024/11/01 | 24697 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0.ogg +2024/11/01 | 2464060 | fonts/simpleicons/opentype/SimpleIcons.otf +2024/11/01 | 24293 | macros/latex/contrib/spelatex/Example/example-spel/3.2.2.0.0.0.ogg +2024/11/01 | 24256 | macros/latex/contrib/spelatex/spelatex-spel/7.9.4.0.0.ogg +2024/11/01 | 242272 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg +2024/11/01 | 24225 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0.ogg +2024/11/01 | 24223 | macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0.ogg +2024/11/01 | 24118 | macros/latex/contrib/spelatex/spelatex-spel/7.9.1.0.0.ogg +2024/11/01 | 24117 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-6.ogg +2024/11/01 | 24007 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0.ogg +2024/11/01 | 23883 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-9.ogg +2024/11/01 | 237522 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-3.ogg +2024/11/01 | 236 | macros/latex/contrib/href-ul/DEPENDS.txt +2024/11/01 | 23444 | macros/latex/contrib/spelatex/spelatex-spel/7.9.3.0.0.ogg +2024/11/01 | 23431 | macros/latex/contrib/spelatex/spelatex-spel/7.9.7.0.0.ogg +2024/11/01 | 233550 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-3.ogg +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.3.3.0.0.m3u +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.3.1.0.0.m3u +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.2.2.0.0.m3u +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0.m3u +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0.m3u +2024/11/01 | 232 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0.m3u +2024/11/01 | 232528 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-3.ogg +2024/11/01 | 232389 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-10.ogg +2024/11/01 | 232052 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-2.ogg +2024/11/01 | 23138 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-1.ogg +2024/11/01 | 22976 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0.ogg +2024/11/01 | 22712 | macros/latex/contrib/spelatex/spelatex-spel/7.12.0.0.0.ogg +2024/11/01 | 2269126 | fonts/simpleicons/type1/SimpleIcons.pfb +2024/11/01 | 22681 | macros/latex/contrib/spelatex/spelatex-spel/7.9.2.0.0.ogg +2024/11/01 | 2267 | macros/latex/contrib/spelatex/spelatex-spel/3.0.0.0.0.m3u +2024/11/01 | 22528 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.ogg +2024/11/01 | 22463 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0.ogg +2024/11/01 | 22432 | macros/latex/contrib/spelatex/spelatex-spel/title.ogg +2024/11/01 | 22306 | macros/latex/contrib/spelatex/spelatex-spel/7.6.0.0.0.ogg +2024/11/01 | 221229 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-11.ogg +2024/11/01 | 21905 | macros/latex/contrib/spelatex/spelatex-spel/6.3.0.0.0.ogg +2024/11/01 | 21826 | macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-3.ogg +2024/11/01 | 217852 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-2.ogg +2024/11/01 | 217550 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg +2024/11/01 | 21720 | macros/latex/contrib/spelatex/spelatex-spel/7.8.0.0.0.ogg +2024/11/01 | 2164 | macros/latex/contrib/enumext/README.md +2024/11/01 | 21437 | macros/latex/contrib/spelatex/spelatex-spel/7.2.0.0.0.ogg +2024/11/01 | 21207 | macros/latex/contrib/spelatex/spelatex-spel/6.6.0.0.0.ogg +2024/11/01 | 21171 | macros/latex/contrib/spelatex/Example/example-spel/3.2.1.0.0.0.ogg +2024/11/01 | 21105 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0.ogg +2024/11/01 | 21099 | macros/latex/contrib/spelatex/spelatex-spel/7.7.0.0.0.ogg +2024/11/01 | 210488 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg +2024/11/01 | 20967874 | macros/latex/contrib/spelatex.zip +2024/11/01 | 20955 | macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0.ogg +2024/11/01 | 20889 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0.ogg +2024/11/01 | 208854 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-3.ogg +2024/11/01 | 20866 | macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.ogg +2024/11/01 | 20854 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0.ogg +2024/11/01 | 208290 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-1.ogg +2024/11/01 | 2072 | systems/texlive/tlnet/archive/collection-fontsextra.r72727.tar.xz +2024/11/01 | 20721 | macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-5.ogg +2024/11/01 | 20629 | macros/latex/contrib/spelatex/spelatex-spel/7.9.5.0.0.ogg +2024/11/01 | 20555 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0.ogg +2024/11/01 | 20541 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0.ogg +2024/11/01 | 20517 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0.ogg +2024/11/01 | 20494 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0.ogg +2024/11/01 | 20386 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0.ogg +2024/11/01 | 20337 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-2.ogg +2024/11/01 | 20252 | systems/texlive/tlnet/archive/easybook.r72725.tar.xz +2024/11/01 | 20160 | systems/texlive/tlnet/archive/easybook.source.r72725.tar.xz +2024/11/01 | 20095 | macros/latex/contrib/spelatex/spelatex-spel/7.1.0.0.0.ogg +2024/11/01 | 20052 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0.ogg +2024/11/01 | 19984 | macros/latex/contrib/spelatex/spelatex-spel/4.2.0.0.0.ogg +2024/11/01 | 19920 | macros/latex/contrib/spelatex/spelatex-spel/7.5.0.0.0.ogg +2024/11/01 | 19663418 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2024/11/01 | 19599 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0.ogg +2024/11/01 | 19493 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-4.ogg +2024/11/01 | 19455 | macros/latex/contrib/spelatex/spelatex-spel/1.2.0.0.0.ogg +2024/11/01 | 19440 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.ogg +2024/11/01 | 193476 | macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-2.ogg +2024/11/01 | 19345 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0.ogg +2024/11/01 | 18983 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0.ogg +2024/11/01 | 189821 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-1.ogg +2024/11/01 | 1888144 | systems/texlive/tlnet/archive/tutodoc.doc.r72719.tar.xz +2024/11/01 | 18774 | macros/latex/contrib/spelatex/spelatex-spel/6.2.0.0.0.ogg +2024/11/01 | 18746 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0.ogg +2024/11/01 | 18708 | macros/latex/contrib/spelatex/Example/example-spel/3.2.0.0.0.0.ogg +2024/11/01 | 184259 | fonts/simpleicons/doc/bindings.tex +2024/11/01 | 18369 | macros/latex/contrib/spelatex/spelatex-spel/7.3.0.0.0.ogg +2024/11/01 | 182403 | macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-2.ogg +2024/11/01 | 18160 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0-3.ogg +2024/11/01 | 1813 | fonts/simpleicons/doc/simpleicons.tex +2024/11/01 | 178845 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-3.ogg +2024/11/01 | 17829 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-3.ogg +2024/11/01 | 17710 | macros/latex/contrib/spelatex/spelatex-spel/7.4.0.0.0.ogg +2024/11/01 | 177085 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-1.ogg +2024/11/01 | 17619 | macros/latex/contrib/spelatex/spelatex-spel/6.1.0.0.0.ogg +2024/11/01 | 17487 | macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0.ogg +2024/11/01 | 1745 | fonts/simpleicons/tex/simpleicons.sty +2024/11/01 | 1741 | macros/latex/contrib/jsonparse/README.md +2024/11/01 | 17379 | macros/latex/contrib/spelatex/spelatex-spel/6.4.0.0.0.ogg +2024/11/01 | 173055 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg +2024/11/01 | 170260 | macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-2.ogg +2024/11/01 | 17014544 | fonts/newcomputermodern/source.txz +2024/11/01 | 170139 | macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0-1.ogg +2024/11/01 | 16996 | systems/texlive/tlnet/archive/eolang.source.r72724.tar.xz +2024/11/01 | 16931 | macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0.ogg +2024/11/01 | 16905 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-5.ogg +2024/11/01 | 16847 | macros/latex/contrib/spelatex/spelatex-spel/6.6.1.0.0-3.ogg +2024/11/01 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2024/11/01 | 167655 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-1.ogg +2024/11/01 | 1675962 | macros/latex/contrib/enumext.zip +2024/11/01 | 16652 | macros/latex/contrib/spelatex/Example/example-spel/3.1.0.0.0.0.ogg +2024/11/01 | 16618 | fonts/newcomputermodern/README +2024/11/01 | 16529 | macros/latex/contrib/spelatex/Example/example-spel/author.ogg +2024/11/01 | 1649 | macros/latex/contrib/enumext/enumext.ins +2024/11/01 | 1643633 | macros/latex/contrib/enumext/enumext.pdf +2024/11/01 | 163073 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-8.ogg +2024/11/01 | 1609195 | macros/generic/markdown.zip +2024/11/01 | 16025 | macros/latex/contrib/spelatex/Example/example-spel/date.ogg +2024/11/01 | 15991 | macros/latex/contrib/spelatex/Example/example-spel/3.ogg +2024/11/01 | 157512 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-1.ogg +2024/11/01 | 15704 | macros/latex/contrib/spelatex/Example/example-spel/title.ogg +2024/11/01 | 15489 | macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0.ogg +2024/11/01 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2024/11/01 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2024/11/01 | 151459 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-2.ogg +2024/11/01 | 15080 | macros/latex/contrib/spelatex/spelatex-spel/7.0.0.0.0.ogg +2024/11/01 | 150678 | macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-2.ogg +2024/11/01 | 14968 | macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-4.ogg +2024/11/01 | 148669 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-11.ogg +2024/11/01 | 147801 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-3.ogg +2024/11/01 | 147755 | fonts/newcomputermodern/doc/testmath-newcm-sans.pdf +2024/11/01 | 1476 | fonts/simpleicons/map/simpleicons.map +2024/11/01 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2024/11/01 | 14567 | macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.ogg +2024/11/01 | 145651 | macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-1.ogg +2024/11/01 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.12.0.0.0.m3u +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.5.0.0.m3u +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.4.0.0.m3u +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.3.0.0.m3u +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.2.0.0.m3u +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.11.1.0.0.m3u +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.10.2.0.0.m3u +2024/11/01 | 144 | macros/latex/contrib/spelatex/spelatex-spel/7.10.1.0.0.m3u +2024/11/01 | 144854 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-2.ogg +2024/11/01 | 14438 | macros/latex/contrib/spelatex/spelatex-spel/3.0.0.0.0.ogg +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.7.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.6.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.5.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.4.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.3.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.2.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.9.1.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.8.0.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.7.0.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.6.0.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.5.0.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.4.0.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.3.0.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.2.0.0.0.m3u +2024/11/01 | 143 | macros/latex/contrib/spelatex/spelatex-spel/7.1.0.0.0.m3u +2024/11/01 | 142608 | macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-2.ogg +2024/11/01 | 14244 | macros/latex/contrib/spelatex/spelatex-spel/5.0.0.0.0.ogg +2024/11/01 | 142113 | macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-3.ogg +2024/11/01 | 138185 | macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-1.ogg +2024/11/01 | 138116 | macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-3.ogg +2024/11/01 | 13805 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-2.ogg +2024/11/01 | 13775 | macros/latex/contrib/spelatex/Example/example-spel/2.ogg +2024/11/01 | 13665 | macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-3.ogg +2024/11/01 | 1358064 | systems/texlive/tlnet/archive/eolang.doc.r72724.tar.xz +2024/11/01 | 135299 | macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-2.ogg +2024/11/01 | 13449 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0-1.ogg +2024/11/01 | 13146 | macros/latex/contrib/spelatex/spelatex-spel/4.0.0.0.0.ogg +2024/11/01 | 131060 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-10.ogg +2024/11/01 | 13031 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-3.ogg +2024/11/01 | 1300 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.m3u +2024/11/01 | 12973 | macros/latex/contrib/spelatex/Example/example-spel/1.ogg +2024/11/01 | 1296 | macros/latex/contrib/spelatex/spelatex-spel/3.2.0.0.0.m3u +2024/11/01 | 1296992 | systems/texlive/tlnet/archive/pixelarttikz.doc.r72726.tar.xz +2024/11/01 | 1295 | macros/latex/contrib/href-ul/README.md +2024/11/01 | 127640 | macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-4.ogg +2024/11/01 | 12760 | macros/latex/contrib/spelatex/spelatex-spel/1.0.0.0.0.ogg +2024/11/01 | 127251 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg +2024/11/01 | 12633 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0.ogg +2024/11/01 | 12626833 | macros/latex/required/latex-lab.zip +2024/11/01 | 12626830 | macros/latex-dev/required/latex-lab.zip +2024/11/01 | 12564 | macros/latex/contrib/spelatex/spelatex-spel/8.0.0.0.0.ogg +2024/11/01 | 12505 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-1.ogg +2024/11/01 | 124157 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-7.ogg +2024/11/01 | 123843 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-6.ogg +2024/11/01 | 1236 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsnine.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconstwo.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsthree.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconssix.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsseven.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonezero.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsone.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsoneone.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfour.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfive.tfm +2024/11/01 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconseight.tfm +2024/11/01 | 1207 | fonts/simpleicons/README.md +2024/11/01 | 1201604 | macros/unicodetex/latex/fontsetup.zip +2024/11/01 | 117980 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-4.ogg +2024/11/01 | 11444 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-5.ogg +2024/11/01 | 114408 | systems/texlive/tlnet/archive/texlive-scripts.r72728.tar.xz +2024/11/01 | 113851 | macros/latex/contrib/easybook/easybook.tex +2024/11/01 | 113818 | macros/latex/contrib/spelatex/spelatex-spel/4.1.6.0.0-1.ogg +2024/11/01 | 11376 | systems/texlive/tlnet/archive/tutodoc.r72719.tar.xz +2024/11/01 | 113548 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-1.ogg +2024/11/01 | 113548 | macros/latex/contrib/spelatex/Example/example-spel/2.2.0.0.0.0-1.ogg +2024/11/01 | 1124 | macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0.m3u +2024/11/01 | 1124 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0.m3u +2024/11/01 | 1116 | macros/latex/contrib/spelatex/spelatex-spel/6.3.0.0.0.m3u +2024/11/01 | 11130 | macros/latex/contrib/spelatex/spelatex-spel/6.3.2.0.0-3.ogg +2024/11/01 | 110193 | macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-1.ogg +2024/11/01 | 1083 | macros/latex/contrib/href-ul/LICENSE.txt +2024/11/01 | 10787 | macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-2.ogg +2024/11/01 | 106395 | macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-10.ogg +2024/11/01 | 105048 | macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-6.ogg +2024/11/01 | 104843 | macros/latex/contrib/spelatex/spelatex-spel/4.1.3.0.0-4.ogg +2024/11/01 | 104147 | macros/latex/contrib/spelatex/spelatex-spel/6.5.0.0.0-2.ogg +2024/11/01 | 103962 | macros/latex/contrib/spelatex/spelatex-spel/4.1.5.0.0-1.ogg +2024/11/01 | 103136 | macros/latex/contrib/spelatex/spelatex-spel/6.0.0.0.0-1.ogg +2024/11/01 | 1029 | macros/latex/contrib/spelatex/spelatex-spel/1.2.0.0.0.m3u +2024/11/01 | 10244 | systems/texlive/tlnet/archive/rub-kunstgeschichte.source.r72721.tar.xz +2024/10/31 | 99 | macros/latex-dev/base/ltpara-code.tex 2024/10/31 | 99 | macros/latex/base/ltpara-code.tex +2024/10/31 | 99855 | macros/latex/required/latex-lab/latex-lab-math.dtx +2024/10/31 | 99855 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx +2024/10/31 | 9935 | macros/latex-dev/base/ltnews21.tex 2024/10/31 | 9935 | macros/latex/base/ltnews21.tex 2024/10/31 | 990 | graphics/pgf/contrib/pixelarttikz/doc/cap.csv -2024/10/31 | 98976 | systems/texlive/tlnet/archive/spbmark.doc.r72710.tar.xz +2024/10/31 | 9808 | macros/latex/required/latex-lab/latex-lab-marginpar.dtx +2024/10/31 | 9808 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx +2024/10/31 | 96 | macros/latex-dev/base/doc-code.tex 2024/10/31 | 96 | macros/latex/base/doc-code.tex 2024/10/31 | 9559 | macros/latex/required/tools/shellesc.dtx +2024/10/31 | 9559 | macros/latex-dev/required/tools/shellesc.dtx +2024/10/31 | 9557 | macros/latex-dev/base/ltcntrl.dtx 2024/10/31 | 9557 | macros/latex/base/ltcntrl.dtx 2024/10/31 | 95496 | macros/latex/contrib/spbmark/spbmark.pdf -2024/10/31 | 94823 | macros/latex/contrib/easybook/easybook.dtx +2024/10/31 | 9503 | fonts/newcomputermodern/doc/mathkern-example.pdf +2024/10/31 | 9398 | macros/latex-dev/base/syntonly.dtx 2024/10/31 | 9398 | macros/latex/base/syntonly.dtx +2024/10/31 | 9345 | macros/latex-dev/base/preload.dtx 2024/10/31 | 9345 | macros/latex/base/preload.dtx +2024/10/31 | 93194 | macros/latex-dev/base/ltdefns.dtx 2024/10/31 | 93194 | macros/latex/base/ltdefns.dtx +2024/10/31 | 9229 | macros/latex/required/amsmath/changes.txt +2024/10/31 | 9229 | macros/latex-dev/required/amsmath/changes.txt +2024/10/31 | 92294 | macros/latex-dev/base/utf8ienc.dtx 2024/10/31 | 92294 | macros/latex/base/utf8ienc.dtx -2024/10/31 | 913 | macros/latex/contrib/easybook/README.md +2024/10/31 | 91590 | macros/latex/required/latex-lab/latex-lab-footnotes.dtx +2024/10/31 | 91590 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx +2024/10/31 | 91054 | macros/latex-dev/base/lttemplates.dtx 2024/10/31 | 91054 | macros/latex/base/lttemplates.dtx +2024/10/31 | 9068 | macros/latex-dev/base/lppl-1-0.txt 2024/10/31 | 9068 | macros/latex/base/lppl-1-0.txt 2024/10/31 | 897716 | systems/texlive/tlnet/archive/fvextra.doc.r72706.tar.xz 2024/10/31 | 8976 | macros/latex/required/tools/rawfonts.dtx +2024/10/31 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx +2024/10/31 | 89727 | macros/latex-dev/base/slides.dtx 2024/10/31 | 89727 | macros/latex/base/slides.dtx +2024/10/31 | 8970 | macros/latex-dev/base/ltnews17.tex 2024/10/31 | 8970 | macros/latex/base/ltnews17.tex 2024/10/31 | 88888 | macros/latex/required/tools/longtable.dtx +2024/10/31 | 88888 | macros/latex-dev/required/tools/longtable.dtx 2024/10/31 | 88636 | systems/texlive/tlnet/archive/hyperref.r72707.tar.xz +2024/10/31 | 881794 | macros/latex/required/latex-lab/latex-lab-block.pdf +2024/10/31 | 881794 | macros/latex/required/latex-lab/blocks-code.pdf +2024/10/31 | 881794 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf +2024/10/31 | 881794 | macros/latex-dev/required/latex-lab/blocks-code.pdf 2024/10/31 | 8780 | macros/latex/required/tools/showkeys-2014-10-28.sty +2024/10/31 | 8780 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty +2024/10/31 | 877364 | fonts/newcomputermodern/otf/NewCMSansMath-Regular.otf 2024/10/31 | 875329 | macros/latex/required/tools/array.pdf +2024/10/31 | 875329 | macros/latex-dev/required/tools/array.pdf +2024/10/31 | 8663 | macros/latex/required/amsmath/amsbsy.dtx +2024/10/31 | 8663 | macros/latex-dev/required/amsmath/amsbsy.dtx +2024/10/31 | 8626 | macros/latex-dev/base/oldlfont.dtx 2024/10/31 | 8626 | macros/latex/base/oldlfont.dtx +2024/10/31 | 85247 | macros/latex/required/amsmath/amsmath-2018-12-01.sty +2024/10/31 | 85247 | macros/latex-dev/required/amsmath/amsmath-2018-12-01.sty +2024/10/31 | 84233 | macros/latex-dev/base/ltfssini.dtx 2024/10/31 | 84233 | macros/latex/base/ltfssini.dtx +2024/10/31 | 8360836 | install/macros/latex-dev/required/latex-tools-dev.tds.zip 2024/10/31 | 8359906 | install/macros/latex/required/latex-tools.tds.zip +2024/10/31 | 83043 | macros/latex-dev/base/ltfssbas.dtx 2024/10/31 | 83043 | macros/latex/base/ltfssbas.dtx 2024/10/31 | 8265413 | macros/latex/required/tools.zip +2024/10/31 | 821496 | macros/latex/required/latex-lab/latex-lab-footnotes.pdf +2024/10/31 | 821496 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf +2024/10/31 | 821340 | macros/latex-dev/base/ltshipout-code.pdf 2024/10/31 | 821340 | macros/latex/base/ltshipout-code.pdf 2024/10/31 | 8212 | systems/texlive/tlnet/archive/moloch.source.r72715.tar.xz +2024/10/31 | 819 | macros/unicodetex/latex/fontsetup/tex/fsptalos.tex 2024/10/31 | 813580 | systems/texlive/tlnet/archive/tugboat.doc.r72711.tar.xz +2024/10/31 | 81184 | macros/latex/required/amsmath/testmath.tex +2024/10/31 | 81184 | macros/latex-dev/required/amsmath/testmath.tex +2024/10/31 | 80919 | macros/latex-dev/base/ltmarks.dtx 2024/10/31 | 80919 | macros/latex/base/ltmarks.dtx +2024/10/31 | 80728 | macros/latex-dev/base/ltshipout.dtx 2024/10/31 | 80728 | macros/latex/base/ltshipout.dtx +2024/10/31 | 806610 | macros/latex-dev/base/ltfilehook-code.pdf 2024/10/31 | 806610 | macros/latex/base/ltfilehook-code.pdf +2024/10/31 | 8051 | macros/latex-dev/base/ltnews.tex 2024/10/31 | 8051 | macros/latex/base/ltnews.tex +2024/10/31 | 8048 | macros/latex/required/latex-lab/latex-lab-minipage.dtx +2024/10/31 | 8048 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx +2024/10/31 | 8015 | fonts/newcomputermodern/doc/newcomputermodern-sample.tex +2024/10/31 | 797404 | macros/latex/required/latex-lab/latex-lab-math.pdf +2024/10/31 | 797404 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf 2024/10/31 | 79708 | systems/texlive/tlnet/archive/xltabular.doc.r72712.tar.xz +2024/10/31 | 795 | macros/unicodetex/latex/fontsetup/tex/fspconcrete.tex 2024/10/31 | 788150 | graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.pdf +2024/10/31 | 762877 | macros/latex-dev/base/lthooks-doc.pdf 2024/10/31 | 762877 | macros/latex/base/lthooks-doc.pdf +2024/10/31 | 75 | macros/generic/markdown/examples/scientists.csv 2024/10/31 | 759 | graphics/pgf/contrib/pixelarttikz/doc/test1.csv +2024/10/31 | 757312 | macros/latex-dev/base/doc.pdf 2024/10/31 | 757312 | macros/latex/base/doc.pdf +2024/10/31 | 75698 | macros/latex-dev/base/ltluatex.dtx 2024/10/31 | 75698 | macros/latex/base/ltluatex.dtx +2024/10/31 | 756067 | macros/latex-dev/base/ltcmdhooks-code.pdf 2024/10/31 | 756067 | macros/latex/base/ltcmdhooks-code.pdf +2024/10/31 | 752 | macros/unicodetex/latex/fontsetup/tex/fspxcharter.tex +2024/10/31 | 7528 | macros/latex-dev/base/ltxguide.cls 2024/10/31 | 7528 | macros/latex/base/ltxguide.cls +2024/10/31 | 751718 | macros/latex-dev/base/lttemplates-code.pdf 2024/10/31 | 751718 | macros/latex/base/lttemplates-code.pdf +2024/10/31 | 75111 | macros/latex-dev/base/ltfssdcl.dtx 2024/10/31 | 75111 | macros/latex/base/ltfssdcl.dtx 2024/10/31 | 748920 | graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.pdf +2024/10/31 | 7452 | macros/latex/required/latex-lab/latex-lab-amsmath.dtx +2024/10/31 | 7452 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx 2024/10/31 | 740 | macros/latex/contrib/eolang/eolang.1 -2024/10/31 | 7382 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2024/10/31 | 73684 | macros/latex/required/tools/tools-overview.pdf +2024/10/31 | 73684 | macros/latex-dev/required/tools/tools-overview.pdf 2024/10/31 | 72911 | macros/latex/required/tools/verbatim.dtx +2024/10/31 | 72911 | macros/latex-dev/required/tools/verbatim.dtx +2024/10/31 | 72493 | macros/latex-dev/base/ltfsstrc.dtx 2024/10/31 | 72493 | macros/latex/base/ltfsstrc.dtx +2024/10/31 | 7244 | macros/latex-dev/base/ltnews20.tex 2024/10/31 | 7244 | macros/latex/base/ltnews20.tex +2024/10/31 | 722 | macros/unicodetex/latex/fontsetup/tex/fspgfsdidotclassicot.tex +2024/10/31 | 7216 | macros/latex-dev/base/exscale.dtx 2024/10/31 | 7216 | macros/latex/base/exscale.dtx +2024/10/31 | 7200 | macros/latex-dev/base/sample2e.tex 2024/10/31 | 7200 | macros/latex/base/sample2e.tex +2024/10/31 | 719005 | macros/latex-dev/base/ltmarks-code.pdf 2024/10/31 | 719005 | macros/latex/base/ltmarks-code.pdf +2024/10/31 | 7103 | macros/latex-dev/base/alltt.dtx 2024/10/31 | 7103 | macros/latex/base/alltt.dtx 2024/10/31 | 71006 | macros/latex/required/graphics/graphics.dtx +2024/10/31 | 71006 | macros/latex-dev/required/graphics/graphics.dtx +2024/10/31 | 70868 | macros/latex-dev/base/ltcmdhooks.dtx 2024/10/31 | 70868 | macros/latex/base/ltcmdhooks.dtx -2024/10/31 | 704137 | macros/latex/contrib/easybook.zip +2024/10/31 | 7029 | macros/latex-dev/base/ltnews13.tex 2024/10/31 | 7029 | macros/latex/base/ltnews13.tex +2024/10/31 | 69732 | macros/latex/required/amsmath/amstex.sty +2024/10/31 | 69732 | macros/latex-dev/required/amsmath/amstex.sty +2024/10/31 | 69441 | macros/latex-dev/base/clsguide-historic.tex 2024/10/31 | 69441 | macros/latex/base/clsguide-historic.tex +2024/10/31 | 6911 | macros/latex-dev/base/source2edoc.cls 2024/10/31 | 6911 | macros/latex/base/source2edoc.cls +2024/10/31 | 69087 | macros/latex-dev/base/clsguide.tex 2024/10/31 | 69087 | macros/latex/base/clsguide.tex +2024/10/31 | 6901 | macros/latex-dev/base/ltmeta.dtx 2024/10/31 | 6901 | macros/latex/base/ltmeta.dtx +2024/10/31 | 68979 | macros/latex-dev/base/ltpictur.dtx 2024/10/31 | 68979 | macros/latex/base/ltpictur.dtx 2024/10/31 | 688 | macros/latex/contrib/spbmark/README.md +2024/10/31 | 68746 | macros/latex-dev/base/usrguide-historic.tex 2024/10/31 | 68746 | macros/latex/base/usrguide-historic.tex 2024/10/31 | 68744 | systems/texlive/tlnet/archive/letgut.source.r72713.tar.xz +2024/10/31 | 68616 | macros/latex-dev/base/ltmiscen.dtx 2024/10/31 | 68616 | macros/latex/base/ltmiscen.dtx +2024/10/31 | 685888 | fonts/newcomputermodern/otf/NewCMMono10-BoldOblique.otf 2024/10/31 | 68102 | macros/latex/required/tools/changes.txt +2024/10/31 | 68102 | macros/latex-dev/required/tools/changes.txt 2024/10/31 | 6789 | macros/latex/required/tools/delarray.dtx +2024/10/31 | 6789 | macros/latex-dev/required/tools/delarray.dtx +2024/10/31 | 67898 | macros/latex-dev/base/ltfilehook.dtx 2024/10/31 | 67898 | macros/latex/base/ltfilehook.dtx +2024/10/31 | 6760 | macros/latex-dev/base/slides.ins 2024/10/31 | 6760 | macros/latex/base/slides.ins +2024/10/31 | 672995 | macros/latex-dev/base/ltpara-code.pdf 2024/10/31 | 672995 | macros/latex/base/ltpara-code.pdf +2024/10/31 | 6709 | macros/latex-dev/base/latexsym.dtx 2024/10/31 | 6709 | macros/latex/base/latexsym.dtx +2024/10/31 | 6601 | macros/latex/required/latex-lab/latex-lab.ins +2024/10/31 | 6601 | macros/latex-dev/required/latex-lab/latex-lab.ins +2024/10/31 | 655 | fonts/newcomputermodern/doc/colored-diacritics.tex +2024/10/31 | 6559 | macros/latex/required/firstaid/changes.txt +2024/10/31 | 6559 | macros/latex-dev/required/firstaid/changes.txt +2024/10/31 | 6521205 | macros/latex-dev/base/source2e.pdf 2024/10/31 | 6520036 | macros/latex/base/source2e.pdf -2024/10/31 | 649454 | macros/latex/contrib/easybook/easybook.pdf +2024/10/31 | 649120 | fonts/newcomputermodern/otf/NewCM08-BookItalic.otf +2024/10/31 | 6441 | macros/latex/required/latex-lab/latex-lab-mathtools.dtx +2024/10/31 | 6441 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx +2024/10/31 | 6440 | macros/latex/required/amsmath/subeqn.tex +2024/10/31 | 6440 | macros/latex-dev/required/amsmath/subeqn.tex +2024/10/31 | 6424 | macros/latex-dev/base/ltnews14.tex 2024/10/31 | 6424 | macros/latex/base/ltnews14.tex +2024/10/31 | 6423 | fonts/newcomputermodern/doc/opticalmathlm-cropped.pdf +2024/10/31 | 638 | macros/unicodetex/latex/fontsetup/tex/fspebgaramondot.tex +2024/10/31 | 6357 | macros/latex-dev/base/newlfont.dtx 2024/10/31 | 6357 | macros/latex/base/newlfont.dtx +2024/10/31 | 63341 | macros/latex-dev/base/letter.dtx 2024/10/31 | 63341 | macros/latex/base/letter.dtx +2024/10/31 | 632 | macros/unicodetex/latex/fontsetup/tex/fspoldstandard.tex +2024/10/31 | 632196 | macros/latex/required/latex-lab/latex-lab-new-or-2.pdf +2024/10/31 | 632196 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf +2024/10/31 | 629 | macros/unicodetex/latex/fontsetup/tex/fspfiraot.tex +2024/10/31 | 62897 | macros/latex-dev/base/ltfiles.dtx 2024/10/31 | 62897 | macros/latex/base/ltfiles.dtx +2024/10/31 | 627888 | fonts/newcomputermodern/otf/NewCM08-Book.otf 2024/10/31 | 62223 | macros/latex/contrib/eolang/eolang.dtx +2024/10/31 | 6221 | macros/latex/required/latex-lab/glyphtounicode-cmex.tex +2024/10/31 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex +2024/10/31 | 6202 | macros/latex-dev/base/latexrelease.ins 2024/10/31 | 6202 | macros/latex/base/latexrelease.ins 2024/10/31 | 61784 | systems/texlive/tlnet/archive/fvextra.source.r72706.tar.xz +2024/10/31 | 616 | macros/unicodetex/latex/fontsetup/tex/fsptimesot.tex +2024/10/31 | 616 | fonts/newcomputermodern/doc/mathkern-example.tex 2024/10/31 | 61642 | macros/latex/required/tools/bm.dtx +2024/10/31 | 61642 | macros/latex-dev/required/tools/bm.dtx +2024/10/31 | 615784 | fonts/newcomputermodern/otf/NewCM10-Book.otf +2024/10/31 | 6155 | macros/latex-dev/base/ltpar.dtx 2024/10/31 | 6155 | macros/latex/base/ltpar.dtx +2024/10/31 | 611648 | fonts/newcomputermodern/otf/NewCM10-Italic.otf +2024/10/31 | 6102 | fonts/newcomputermodern/doc/integral.pdf +2024/10/31 | 60824 | macros/latex-dev/base/fontdef.dtx 2024/10/31 | 60824 | macros/latex/base/fontdef.dtx +2024/10/31 | 60434 | macros/latex-dev/base/ltplain.dtx 2024/10/31 | 60434 | macros/latex/base/ltplain.dtx +2024/10/31 | 602006 | macros/latex-dev/base/ltsockets-code.pdf 2024/10/31 | 602006 | macros/latex/base/ltsockets-code.pdf +2024/10/31 | 601 | macros/unicodetex/latex/fontsetup/tex/fspgfsartemisiaot.tex +2024/10/31 | 5986 | macros/latex-dev/base/ltnews15.tex 2024/10/31 | 5986 | macros/latex/base/ltnews15.tex +2024/10/31 | 590532 | fonts/newcomputermodern/otf/NewCM10-Regular.otf +2024/10/31 | 58760 | macros/latex-dev/base/usrguide.tex 2024/10/31 | 58760 | macros/latex/base/usrguide.tex +2024/10/31 | 5860 | macros/latex/required/amsmath/ams-internal.txt +2024/10/31 | 5860 | macros/latex-dev/required/amsmath/ams-internal.txt +2024/10/31 | 5859 | macros/latex-dev/base/ltidxglo.dtx 2024/10/31 | 5859 | macros/latex/base/ltidxglo.dtx +2024/10/31 | 58548 | macros/latex-dev/base/ltfssaxes.dtx 2024/10/31 | 58548 | macros/latex/base/ltfssaxes.dtx +2024/10/31 | 582809 | macros/latex-dev/base/ltmarks-doc.pdf 2024/10/31 | 582809 | macros/latex/base/ltmarks-doc.pdf +2024/10/31 | 5825 | macros/latex-dev/base/ltnews10.tex 2024/10/31 | 5825 | macros/latex/base/ltnews10.tex +2024/10/31 | 579396 | fonts/newcomputermodern/otf/NewCM08-Italic.otf 2024/10/31 | 5791 | macros/latex/required/tools/somedefs.dtx +2024/10/31 | 5791 | macros/latex-dev/required/tools/somedefs.dtx +2024/10/31 | 5775 | macros/latex-dev/base/ltnews16.tex 2024/10/31 | 5775 | macros/latex/base/ltnews16.tex +2024/10/31 | 577560 | fonts/newcomputermodern/otf/NewCM10-BookItalic.otf 2024/10/31 | 576 | systems/texlive/tlnet/archive/drawing-with-metapost.r72705.tar.xz -2024/10/31 | 5758225 | systems/texlive/tlnet/install-tl-unx.tar.gz +2024/10/31 | 5733 | macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.dtx +2024/10/31 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx +2024/10/31 | 5732 | macros/latex-dev/base/ltnews08.tex 2024/10/31 | 5732 | macros/latex/base/ltnews08.tex +2024/10/31 | 572577 | macros/latex/required/latex-lab/latex-lab-table.pdf +2024/10/31 | 572577 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf +2024/10/31 | 5714 | macros/latex-dev/base/inputenc.ins 2024/10/31 | 5714 | macros/latex/base/inputenc.ins +2024/10/31 | 5699 | macros/latex-dev/base/ltnews05.tex 2024/10/31 | 5699 | macros/latex/base/ltnews05.tex +2024/10/31 | 5691 | macros/latex-dev/base/ltnews27.tex 2024/10/31 | 5691 | macros/latex/base/ltnews27.tex +2024/10/31 | 5684 | macros/latex/required/latex-lab/latex-lab-new-or-1.dtx +2024/10/31 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx +2024/10/31 | 5678 | macros/latex-dev/base/ltnews04.tex 2024/10/31 | 5678 | macros/latex/base/ltnews04.tex +2024/10/31 | 567691 | macros/latex-dev/base/ltshipout-doc.pdf 2024/10/31 | 567691 | macros/latex/base/ltshipout-doc.pdf 2024/10/31 | 5667 | macros/latex/required/tools/tools.ins +2024/10/31 | 5667 | macros/latex-dev/required/tools/tools.ins +2024/10/31 | 563305 | macros/latex-dev/base/ltnews35.pdf 2024/10/31 | 563305 | macros/latex/base/ltnews35.pdf +2024/10/31 | 563214 | macros/latex/required/latex-lab/documentmetadata-support-code.pdf +2024/10/31 | 563214 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf +2024/10/31 | 560715 | macros/latex-dev/base/ltpara-doc.pdf 2024/10/31 | 560715 | macros/latex/base/ltpara-doc.pdf +2024/10/31 | 560495 | macros/latex-dev/base/classes.pdf 2024/10/31 | 560495 | macros/latex/base/classes.pdf +2024/10/31 | 5588 | macros/latex-dev/base/ltnews25.tex 2024/10/31 | 5588 | macros/latex/base/ltnews25.tex +2024/10/31 | 5576 | macros/latex-dev/base/ltnews07.tex 2024/10/31 | 5576 | macros/latex/base/ltnews07.tex +2024/10/31 | 5574 | macros/latex-dev/base/ltnews12.tex 2024/10/31 | 5574 | macros/latex/base/ltnews12.tex +2024/10/31 | 557320 | macros/latex-dev/base/ltproperties-code.pdf 2024/10/31 | 557320 | macros/latex/base/ltproperties-code.pdf +2024/10/31 | 55687 | macros/latex-dev/base/ltfloat.dtx 2024/10/31 | 55687 | macros/latex/base/ltfloat.dtx +2024/10/31 | 5544 | macros/latex-dev/base/ltnews06.tex 2024/10/31 | 5544 | macros/latex/base/ltnews06.tex +2024/10/31 | 5529 | macros/latex-dev/base/ltnews11.tex 2024/10/31 | 5529 | macros/latex/base/ltnews11.tex +2024/10/31 | 551941 | macros/latex-dev/base/ltfilehook-doc.pdf 2024/10/31 | 551941 | macros/latex/base/ltfilehook-doc.pdf +2024/10/31 | 5509 | macros/latex-dev/base/graphpap.dtx 2024/10/31 | 5509 | macros/latex/base/graphpap.dtx +2024/10/31 | 54988 | macros/latex-dev/base/ltpara.dtx 2024/10/31 | 54988 | macros/latex/base/ltpara.dtx +2024/10/31 | 54849 | macros/generic/markdown/CHANGES.md +2024/10/31 | 548340 | fonts/newcomputermodern/otf/NewCM08-Regular.otf +2024/10/31 | 546540 | macros/latex-dev/base/ltnews32.pdf 2024/10/31 | 546540 | macros/latex/base/ltnews32.pdf +2024/10/31 | 5463 | macros/latex-dev/base/ltlength.dtx 2024/10/31 | 5463 | macros/latex/base/ltlength.dtx +2024/10/31 | 5462 | macros/latex-dev/base/ltnews02.tex 2024/10/31 | 5462 | macros/latex/base/ltnews02.tex +2024/10/31 | 5451 | macros/latex-dev/base/ltnews09.tex 2024/10/31 | 5451 | macros/latex/base/ltnews09.tex +2024/10/31 | 544929 | macros/latex/required/latex-lab/latex-lab-sec.pdf +2024/10/31 | 544929 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf +2024/10/31 | 541772 | macros/latex-dev/base/ltnews39.pdf 2024/10/31 | 541772 | macros/latex/base/ltnews39.pdf 2024/10/31 | 5384 | systems/texlive/tlnet/archive/luamml.source.r72714.tar.xz +2024/10/31 | 5369 | macros/latex-dev/base/ltnews03.tex 2024/10/31 | 5369 | macros/latex/base/ltnews03.tex 2024/10/31 | 53648 | systems/texlive/tlnet/archive/letgut.r72713.tar.xz +2024/10/31 | 53334 | macros/latex-dev/base/lb2.err 2024/10/31 | 53334 | macros/latex/base/lb2.err 2024/10/31 | 53167 | macros/latex/required/tools/calc.dtx +2024/10/31 | 53167 | macros/latex-dev/required/tools/calc.dtx +2024/10/31 | 5313 | macros/latex/required/amsmath/ams-external.txt +2024/10/31 | 5313 | macros/latex-dev/required/amsmath/ams-external.txt +2024/10/31 | 528968 | fonts/newcomputermodern/otf/NewCMMono10-BookItalic.otf +2024/10/31 | 52813 | macros/latex-dev/base/encguide.tex 2024/10/31 | 52813 | macros/latex/base/encguide.tex +2024/10/31 | 5273 | macros/latex-dev/base/cmextra.ins 2024/10/31 | 5273 | macros/latex/base/cmextra.ins +2024/10/31 | 526681 | macros/latex-dev/base/ltnews31.pdf 2024/10/31 | 526681 | macros/latex/base/ltnews31.pdf 2024/10/31 | 525497 | macros/latex/required/tools/multicol.pdf +2024/10/31 | 525497 | macros/latex-dev/required/tools/multicol.pdf +2024/10/31 | 5246 | macros/latex-dev/base/ltnews01.tex 2024/10/31 | 5246 | macros/latex/base/ltnews01.tex +2024/10/31 | 523675 | macros/latex-dev/base/ltnews38.pdf 2024/10/31 | 523675 | macros/latex/base/ltnews38.pdf +2024/10/31 | 522757 | macros/latex-dev/base/ltnews33.pdf 2024/10/31 | 522757 | macros/latex/base/ltnews33.pdf +2024/10/31 | 522637 | macros/latex-dev/base/fntguide.pdf 2024/10/31 | 522637 | macros/latex/base/fntguide.pdf +2024/10/31 | 521544 | fonts/newcomputermodern/otf/NewCM10-Bold.otf 2024/10/31 | 5213 | macros/latex/required/tools/tools-overview.tex +2024/10/31 | 5213 | macros/latex-dev/required/tools/tools-overview.tex +2024/10/31 | 5206 | macros/latex-dev/base/ltnews41.tex +2024/10/31 | 517934 | macros/latex-dev/base/ltnews36.pdf 2024/10/31 | 517934 | macros/latex/base/ltnews36.pdf +2024/10/31 | 517603 | macros/latex/required/latex-lab/latex-lab-graphic.pdf +2024/10/31 | 517603 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf +2024/10/31 | 51638 | macros/latex-dev/base/ltboxes.dtx 2024/10/31 | 51638 | macros/latex/base/ltboxes.dtx 2024/10/31 | 513540 | systems/texlive/tlnet/archive/minted.doc.r72709.tar.xz +2024/10/31 | 512240 | macros/latex-dev/base/ltnews30.pdf 2024/10/31 | 512240 | macros/latex/base/ltnews30.pdf +2024/10/31 | 51161 | macros/latex-dev/base/ltfinal.dtx 2024/10/31 | 51161 | macros/latex/base/ltfinal.dtx +2024/10/31 | 51067 | macros/latex-dev/base/tlc3.err 2024/10/31 | 51067 | macros/latex/base/tlc3.err +2024/10/31 | 508345 | macros/latex-dev/base/ltnews34.pdf 2024/10/31 | 508345 | macros/latex/base/ltnews34.pdf +2024/10/31 | 508207 | macros/latex/required/amsmath/amsldoc.pdf +2024/10/31 | 508207 | macros/latex-dev/required/amsmath/amsldoc.pdf 2024/10/31 | 50819 | macros/latex/required/graphics/drivers.dtx +2024/10/31 | 50819 | macros/latex-dev/required/graphics/drivers.dtx +2024/10/31 | 506772 | macros/latex-dev/base/docstrip.pdf 2024/10/31 | 506772 | macros/latex/base/docstrip.pdf +2024/10/31 | 505075 | macros/latex-dev/base/ltcmdhooks-doc.pdf 2024/10/31 | 505075 | macros/latex/base/ltcmdhooks-doc.pdf +2024/10/31 | 505052 | fonts/newcomputermodern/otf/NewCMSans10-Book.otf +2024/10/31 | 5041 | macros/latex-dev/base/latexsym.ins 2024/10/31 | 5041 | macros/latex/base/latexsym.ins 2024/10/31 | 503118 | macros/latex/contrib/rub-kunstgeschichte.zip 2024/10/31 | 502 | macros/latex/contrib/rub-kunstgeschichte/README.md 2024/10/31 | 502 | macros/latex/contrib/eolang/DEPENDS.txt +2024/10/31 | 49846 | macros/latex/required/latex-lab/latex-lab-table.dtx +2024/10/31 | 49846 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx +2024/10/31 | 4972 | fonts/newcomputermodern/doc/colored-diacritics.pdf 2024/10/31 | 4959 | macros/latex/required/tools/fileerr.dtx +2024/10/31 | 4959 | macros/latex-dev/required/tools/fileerr.dtx +2024/10/31 | 495808 | fonts/newcomputermodern/otf/NewCMSans08-Book.otf +2024/10/31 | 495486 | macros/latex-dev/base/clsguide.pdf 2024/10/31 | 495486 | macros/latex/base/clsguide.pdf +2024/10/31 | 49532 | macros/latex-dev/base/ltspace.dtx 2024/10/31 | 49532 | macros/latex/base/ltspace.dtx +2024/10/31 | 4945 | macros/latex-dev/base/lthyphen.dtx 2024/10/31 | 4945 | macros/latex/base/lthyphen.dtx -2024/10/31 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 -2024/10/31 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2024/10/31 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc -2024/10/31 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2024/10/31 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2024/10/31 | 488007 | macros/latex-dev/base/usrguide.pdf 2024/10/31 | 488007 | macros/latex/base/usrguide.pdf +2024/10/31 | 486428 | macros/latex-dev/base/ltsockets-doc.pdf 2024/10/31 | 486428 | macros/latex/base/ltsockets-doc.pdf +2024/10/31 | 485663 | macros/latex/required/latex-lab/blocks-doc.pdf +2024/10/31 | 485663 | macros/latex-dev/required/latex-lab/blocks-doc.pdf +2024/10/31 | 484156 | fonts/newcomputermodern/otf/NewCMSans08-Regular.otf 2024/10/31 | 482622 | macros/latex/required/tools/l3sys-query.pdf +2024/10/31 | 482622 | macros/latex-dev/required/tools/l3sys-query.pdf +2024/10/31 | 4824 | macros/latex/required/latex-lab/latex-lab-testphase.dtx +2024/10/31 | 4824 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx 2024/10/31 | 480750 | macros/latex/contrib/letterswitharrows/letterswitharrows.pdf +2024/10/31 | 47895 | macros/latex-dev/base/lttab.dtx 2024/10/31 | 47895 | macros/latex/base/lttab.dtx 2024/10/31 | 47687 | macros/latex/contrib/eolang/cactus.pdf +2024/10/31 | 476853 | macros/latex-dev/base/ltnews40.pdf 2024/10/31 | 476853 | macros/latex/base/ltnews40.pdf +2024/10/31 | 474 | macros/latex/required/firstaid/README.md +2024/10/31 | 474 | macros/latex-dev/required/firstaid/README.md 2024/10/31 | 472281 | macros/latex/contrib/letterswitharrows.zip +2024/10/31 | 468928 | fonts/newcomputermodern/otf/NewCM10-BoldItalic.otf +2024/10/31 | 4681 | macros/generic/markdown/markdown.css +2024/10/31 | 467500 | macros/latex-dev/base/lttemplates-doc.pdf 2024/10/31 | 467500 | macros/latex/base/lttemplates-doc.pdf +2024/10/31 | 46686815 | install/macros/latex-dev/latex-base-dev.tds.zip +2024/10/31 | 464940 | fonts/newcomputermodern/otf/NewCMSans10-BookOblique.otf 2024/10/31 | 46461166 | install/macros/latex/latex-base.tds.zip +2024/10/31 | 463956 | fonts/newcomputermodern/otf/NewCMSans10-Regular.otf 2024/10/31 | 4624 | systems/texlive/tlnet/archive/moloch.r72715.tar.xz 2024/10/31 | 460753 | macros/latex/required/graphics/mathcolor.pdf +2024/10/31 | 460753 | macros/latex-dev/required/graphics/mathcolor.pdf 2024/10/31 | 45856347 | macros/latex/base.zip +2024/10/31 | 456933 | macros/latex-dev/base/ltnews37.pdf 2024/10/31 | 456933 | macros/latex/base/ltnews37.pdf +2024/10/31 | 455437 | macros/latex-dev/base/ltnews29.pdf 2024/10/31 | 455437 | macros/latex/base/ltnews29.pdf +2024/10/31 | 454643 | macros/latex/required/amsmath/testmath.pdf +2024/10/31 | 454643 | macros/latex-dev/required/amsmath/testmath.pdf +2024/10/31 | 45346 | macros/latex-dev/base/latexrelease.dtx 2024/10/31 | 45346 | macros/latex/base/latexrelease.dtx +2024/10/31 | 452884 | fonts/newcomputermodern/otf/NewCMMono10-Book.otf 2024/10/31 | 45232 | systems/texlive/tlnet/archive/tugboat.source.r72711.tar.xz +2024/10/31 | 44531 | macros/latex-dev/base/cmfonts.fdd 2024/10/31 | 44531 | macros/latex/base/cmfonts.fdd +2024/10/31 | 444624 | macros/latex/required/latex-lab/latex-lab-float.pdf +2024/10/31 | 444624 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf +2024/10/31 | 4435 | macros/generic/markdown/docstrip.cfg +2024/10/31 | 441708 | fonts/newcomputermodern/otf/NewCMSans10-Bold.otf +2024/10/31 | 439393 | macros/latex-dev/base/usrguide-historic.pdf 2024/10/31 | 439393 | macros/latex/base/usrguide-historic.pdf +2024/10/31 | 4390 | macros/latex-dev/base/ec.ins 2024/10/31 | 4390 | macros/latex/base/ec.ins -2024/10/31 | 438816 | systems/texlive/tlnet/archive/texlive-scripts.doc.r72717.tar.xz 2024/10/31 | 437 | macros/latex/contrib/letterswitharrows/README.txt -2024/10/31 | 4364 | systems/texlive/tlnet/archive/spbmark.r72710.tar.xz 2024/10/31 | 43423 | macros/latex/required/tools/theorem.dtx +2024/10/31 | 43423 | macros/latex-dev/required/tools/theorem.dtx +2024/10/31 | 4336 | macros/latex/required/amsmath/amsxtra.dtx +2024/10/31 | 4336 | macros/latex-dev/required/amsmath/amsxtra.dtx +2024/10/31 | 433204 | fonts/newcomputermodern/otf/NewCMMono10-Italic.otf +2024/10/31 | 4324 | macros/latex-dev/base/cmfonts.ins 2024/10/31 | 4324 | macros/latex/base/cmfonts.ins +2024/10/31 | 431802 | macros/latex-dev/base/ltproperties-doc.pdf 2024/10/31 | 431802 | macros/latex/base/ltproperties-doc.pdf 2024/10/31 | 43000 | graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-fr.tex +2024/10/31 | 4298 | macros/latex-dev/base/ltalloc.dtx 2024/10/31 | 4298 | macros/latex/base/ltalloc.dtx 2024/10/31 | 4274 | macros/latex/contrib/eolang/eolang.pl +2024/10/31 | 4273 | macros/latex-dev/base/docstrip.ins 2024/10/31 | 4273 | macros/latex/base/docstrip.ins +2024/10/31 | 42708 | macros/latex-dev/base/changes.old.txt 2024/10/31 | 42708 | macros/latex/base/changes.old.txt 2024/10/31 | 42572 | systems/texlive/tlnet/archive/minted.source.r72709.tar.xz +2024/10/31 | 4254 | macros/latex-dev/base/newdc.ins 2024/10/31 | 4254 | macros/latex/base/newdc.ins +2024/10/31 | 42287 | macros/latex-dev/base/ltmath.dtx 2024/10/31 | 42287 | macros/latex/base/ltmath.dtx +2024/10/31 | 422294 | macros/latex/required/amsmath/amsmath.pdf +2024/10/31 | 422294 | macros/latex-dev/required/amsmath/amsmath.pdf +2024/10/31 | 4219 | macros/latex-dev/base/latex209.ins 2024/10/31 | 4219 | macros/latex/base/latex209.ins +2024/10/31 | 421161 | macros/latex-dev/base/changes.txt 2024/10/31 | 421161 | macros/latex/base/changes.txt -2024/10/31 | 4207713 | biblio/ctan-bibdata.zip +2024/10/31 | 420933 | macros/latex/required/latex-lab/documentmetadata-support-doc.pdf +2024/10/31 | 420933 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf +2024/10/31 | 4190 | macros/latex-dev/base/ltnews19.tex 2024/10/31 | 4190 | macros/latex/base/ltnews19.tex +2024/10/31 | 417988 | fonts/newcomputermodern/otf/NewCMSans08-BookOblique.otf 2024/10/31 | 417868 | systems/texlive/tlnet/archive/hyperref.source.r72707.tar.xz +2024/10/31 | 415956 | macros/latex-dev/base/clsguide-historic.pdf 2024/10/31 | 415956 | macros/latex/base/clsguide-historic.pdf +2024/10/31 | 414685 | macros/latex/required/latex-lab/latex-lab-marginpar.pdf +2024/10/31 | 414685 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf 2024/10/31 | 4137 | macros/latex/required/graphics/epsfig.dtx +2024/10/31 | 4137 | macros/latex-dev/required/graphics/epsfig.dtx +2024/10/31 | 412360 | fonts/newcomputermodern/otf/NewCMSans10-BoldOblique.otf +2024/10/31 | 4087 | macros/latex-dev/base/classes.ins 2024/10/31 | 4087 | macros/latex/base/classes.ins +2024/10/31 | 40804 | macros/latex-dev/base/ltlists.dtx 2024/10/31 | 40804 | macros/latex/base/ltlists.dtx +2024/10/31 | 4079 | macros/latex-dev/base/lablst.tex 2024/10/31 | 4079 | macros/latex/base/lablst.tex +2024/10/31 | 406053 | macros/latex/required/latex-lab/latex-lab-toc.pdf +2024/10/31 | 406053 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf 2024/10/31 | 402733 | macros/latex/required/tools/longtable.pdf +2024/10/31 | 402733 | macros/latex-dev/required/tools/longtable.pdf +2024/10/31 | 399 | macros/unicodetex/latex/fontsetup/tex/fspkerkisot.tex +2024/10/31 | 398544 | macros/latex/required/latex-lab/latex-lab-firstaid.pdf +2024/10/31 | 398544 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf +2024/10/31 | 39839 | macros/latex-dev/base/ltnews18.pdf 2024/10/31 | 39839 | macros/latex/base/ltnews18.pdf 2024/10/31 | 39697 | macros/latex/required/tools/ftnright.dtx +2024/10/31 | 39697 | macros/latex-dev/required/tools/ftnright.dtx +2024/10/31 | 3960 | macros/latex-dev/base/olddc.ins 2024/10/31 | 3960 | macros/latex/base/olddc.ins 2024/10/31 | 3946 | macros/latex/required/graphics/lscape.dtx +2024/10/31 | 3946 | macros/latex-dev/required/graphics/lscape.dtx 2024/10/31 | 393884 | macros/latex/required/tools/varioref.pdf +2024/10/31 | 393884 | macros/latex-dev/required/tools/varioref.pdf +2024/10/31 | 389 | macros/unicodetex/latex/fontsetup/tex/fspstixtwoot.tex +2024/10/31 | 38984 | macros/latex-dev/base/ltsockets.dtx 2024/10/31 | 38984 | macros/latex/base/ltsockets.dtx +2024/10/31 | 389721 | macros/latex/required/latex-lab/latex-lab-new-or-1.pdf +2024/10/31 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf +2024/10/31 | 3888 | fonts/newcomputermodern/doc/opticalmathlm.pdf +2024/10/31 | 38730 | macros/latex-dev/base/latex209.dtx 2024/10/31 | 38730 | macros/latex/base/latex209.dtx 2024/10/31 | 387212 | macros/latex/required/tools/ftnright.pdf +2024/10/31 | 387212 | macros/latex-dev/required/tools/ftnright.pdf +2024/10/31 | 385504 | macros/latex-dev/base/tlc3.pdf 2024/10/31 | 385504 | macros/latex/base/tlc3.pdf +2024/10/31 | 384680 | fonts/newcomputermodern/otf/NewCMSans08-Oblique.otf +2024/10/31 | 383673 | macros/latex/required/latex-lab/latex-lab-bib.pdf +2024/10/31 | 383673 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf +2024/10/31 | 3832 | macros/generic/markdown/examples/example.md +2024/10/31 | 382388 | macros/latex/required/latex-lab/latex-lab-amsmath.pdf +2024/10/31 | 382388 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf +2024/10/31 | 38225 | macros/latex-dev/base/ltnews35.tex 2024/10/31 | 38225 | macros/latex/base/ltnews35.tex 2024/10/31 | 38040 | macros/latex/required/graphics/grfguide.tex +2024/10/31 | 38040 | macros/latex-dev/required/graphics/grfguide.tex +2024/10/31 | 379733 | macros/latex-dev/base/ltnews26.pdf 2024/10/31 | 379733 | macros/latex/base/ltnews26.pdf -2024/10/31 | 3790528 | biblio/ctan-bibdata/ctan.pdf +2024/10/31 | 378916 | fonts/newcomputermodern/otf/NewCMSans10-Oblique.otf +2024/10/31 | 3781 | macros/latex-dev/base/tulm.ins 2024/10/31 | 3781 | macros/latex/base/tulm.ins +2024/10/31 | 376950 | macros/latex-dev/base/ltnews28.pdf 2024/10/31 | 376950 | macros/latex/base/ltnews28.pdf +2024/10/31 | 375493 | macros/latex-dev/base/slides.pdf 2024/10/31 | 375493 | macros/latex/base/slides.pdf 2024/10/31 | 3752 | systems/texlive/tlnet/archive/latex2pydata.r72708.tar.xz 2024/10/31 | 37462 | macros/latex/required/tools/tabularx.dtx +2024/10/31 | 37462 | macros/latex-dev/required/tools/tabularx.dtx +2024/10/31 | 373186 | macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.pdf +2024/10/31 | 373186 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf +2024/10/31 | 3725 | macros/latex-dev/base/ltlogos.dtx 2024/10/31 | 3725 | macros/latex/base/ltlogos.dtx +2024/10/31 | 372235 | macros/latex/required/latex-lab/latex-lab-mathtools.pdf +2024/10/31 | 372235 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf 2024/10/31 | 370660 | macros/latex/required/tools/calc.pdf +2024/10/31 | 370660 | macros/latex-dev/required/tools/calc.pdf +2024/10/31 | 369 | macros/latex/required/amsmath/manifest.txt +2024/10/31 | 369 | macros/latex-dev/required/amsmath/manifest.txt +2024/10/31 | 3678 | macros/latex/required/latex-lab/latex-lab-text.dtx +2024/10/31 | 3678 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx +2024/10/31 | 36656 | macros/latex-dev/base/ltnews39.tex 2024/10/31 | 36656 | macros/latex/base/ltnews39.tex +2024/10/31 | 365360 | fonts/newcomputermodern/otf/NewCMMono10-Regular.otf 2024/10/31 | 36408 | graphics/pgf/contrib/pixelarttikz/tex/PixelArtTikz.sty 2024/10/31 | 36241 | macros/latex/required/graphics/changes.txt +2024/10/31 | 36241 | macros/latex-dev/required/graphics/changes.txt 2024/10/31 | 35861 | macros/latex/contrib/rub-kunstgeschichte/rub-kunstgeschichte.dtx +2024/10/31 | 355758 | macros/latex/required/latex-lab/latex-lab-mathpkg.pdf +2024/10/31 | 355758 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf +2024/10/31 | 35431 | macros/latex-dev/base/ltdirchk.dtx 2024/10/31 | 35431 | macros/latex/base/ltdirchk.dtx +2024/10/31 | 353390 | macros/latex-dev/base/utf8ienc.pdf 2024/10/31 | 353390 | macros/latex/base/utf8ienc.pdf 2024/10/31 | 351812 | macros/latex/required/tools/theorem.pdf +2024/10/31 | 351812 | macros/latex-dev/required/tools/theorem.pdf 2024/10/31 | 3510772 | systems/texlive/tlnet/archive/hyperref.doc.r72707.tar.xz +2024/10/31 | 348117 | macros/latex/required/latex-lab/latex-lab-title.pdf +2024/10/31 | 348117 | macros/latex-dev/required/latex-lab/latex-lab-title.pdf +2024/10/31 | 34679 | macros/latex-dev/base/ltproperties.dtx 2024/10/31 | 34679 | macros/latex/base/ltproperties.dtx 2024/10/31 | 346720 | macros/latex/contrib/rub-kunstgeschichte/rub-kunstgeschichte.pdf -2024/10/31 | 34429453 | systems/texlive/tlnet/install-tl.zip +2024/10/31 | 34515 | macros/latex/required/latex-lab/latex-lab-graphic.dtx +2024/10/31 | 34515 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx +2024/10/31 | 344 | macros/unicodetex/latex/fontsetup/tex/fsperewhon.tex +2024/10/31 | 344172 | fonts/newcomputermodern/otf/NewCM10Devanagari-Regular.otf +2024/10/31 | 3434 | macros/latex-dev/base/makeindx.ins 2024/10/31 | 3434 | macros/latex/base/makeindx.ins +2024/10/31 | 3401 | macros/latex-dev/base/proc.ins 2024/10/31 | 3401 | macros/latex/base/proc.ins 2024/10/31 | 34011 | macros/latex/required/tools/varioref-2016-02-16.sty +2024/10/31 | 34011 | macros/latex-dev/required/tools/varioref-2016-02-16.sty +2024/10/31 | 33928 | macros/latex-dev/base/ltsect.dtx 2024/10/31 | 33928 | macros/latex/base/ltsect.dtx +2024/10/31 | 33911 | macros/latex-dev/base/ltnews33.tex 2024/10/31 | 33911 | macros/latex/base/ltnews33.tex +2024/10/31 | 337788 | macros/latex-dev/base/letter.pdf 2024/10/31 | 337788 | macros/latex/base/letter.pdf +2024/10/31 | 33763 | macros/latex-dev/base/lttagging.dtx 2024/10/31 | 33763 | macros/latex/base/lttagging.dtx +2024/10/31 | 3372 | macros/latex-dev/base/letter.ins 2024/10/31 | 3372 | macros/latex/base/letter.ins +2024/10/31 | 3367 | macros/latex-dev/base/ltoutenc.ins 2024/10/31 | 3367 | macros/latex/base/ltoutenc.ins +2024/10/31 | 336624 | fonts/newcomputermodern/otf/NewCM08Devanagari-Book.otf +2024/10/31 | 3349 | macros/latex/required/latex-lab/latex-lab-namespace.dtx +2024/10/31 | 3349 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx +2024/10/31 | 333 | macros/generic/markdown/DEPENDS.txt +2024/10/31 | 3338 | macros/latex-dev/base/exscale.ins 2024/10/31 | 3338 | macros/latex/base/exscale.ins +2024/10/31 | 33243 | macros/latex-dev/base/ltnews32.tex 2024/10/31 | 33243 | macros/latex/base/ltnews32.tex 2024/10/31 | 331587 | macros/latex/required/tools/verbatim.pdf +2024/10/31 | 331587 | macros/latex-dev/required/tools/verbatim.pdf 2024/10/31 | 331365 | macros/latex/required/graphics/grfguide.pdf +2024/10/31 | 331361 | macros/latex-dev/required/graphics/grfguide.pdf +2024/10/31 | 33083 | macros/latex-dev/base/ltnews37.tex 2024/10/31 | 33083 | macros/latex/base/ltnews37.tex 2024/10/31 | 32 | graphics/pgf/contrib/pixelarttikz/doc/testlist.csv 2024/10/31 | 32 | graphics/pgf/contrib/pixelarttikz/doc/base.csv 2024/10/31 | 3286 | macros/latex/required/tools/manifest.txt +2024/10/31 | 3286 | macros/latex-dev/required/tools/manifest.txt +2024/10/31 | 3282 | macros/latex-dev/base/bugs.txt 2024/10/31 | 3282 | macros/latex/base/bugs.txt +2024/10/31 | 328112 | fonts/newcomputermodern/otf/NewCMMono10-Bold.otf +2024/10/31 | 326432 | fonts/newcomputermodern/otf/NewCM08Devanagari-Regular.otf 2024/10/31 | 32616 | systems/texlive/tlnet/archive/tugboat.r72711.tar.xz +2024/10/31 | 325889 | macros/latex-dev/base/ltluatex.pdf 2024/10/31 | 325889 | macros/latex/base/ltluatex.pdf +2024/10/31 | 324808 | fonts/newcomputermodern/otf/NewCM10Devanagari-Bold.otf 2024/10/31 | 32462 | macros/latex/required/graphics/color.dtx +2024/10/31 | 32462 | macros/latex-dev/required/graphics/color.dtx 2024/10/31 | 323877 | macros/latex/required/tools/xr.pdf +2024/10/31 | 323877 | macros/latex-dev/required/tools/xr.pdf 2024/10/31 | 323640 | macros/latex/required/tools/bm.pdf +2024/10/31 | 323640 | macros/latex-dev/required/tools/bm.pdf +2024/10/31 | 32331 | macros/latex-dev/base/ltnews34.tex 2024/10/31 | 32331 | macros/latex/base/ltnews34.tex +2024/10/31 | 322264 | fonts/newcomputermodern/otf/NewCM10Devanagari-Book.otf 2024/10/31 | 32047 | macros/latex/required/tools/layout.dtx +2024/10/31 | 32047 | macros/latex-dev/required/tools/layout.dtx 2024/10/31 | 3200 | graphics/pgf/contrib/pixelarttikz/doc/PAkoala.csv +2024/10/31 | 31 | macros/generic/markdown/VERSION +2024/10/31 | 318372 | macros/latex-dev/base/inputenc.pdf 2024/10/31 | 318372 | macros/latex/base/inputenc.pdf +2024/10/31 | 3181 | macros/latex-dev/base/unpack.ins 2024/10/31 | 3181 | macros/latex/base/unpack.ins +2024/10/31 | 318193 | macros/latex-dev/base/ltnews20.pdf 2024/10/31 | 318193 | macros/latex/base/ltnews20.pdf +2024/10/31 | 318026 | macros/latex-dev/base/ltnews22.pdf 2024/10/31 | 318026 | macros/latex/base/ltnews22.pdf 2024/10/31 | 31467 | macros/latex/required/tools/multicol-2019-10-01.sty +2024/10/31 | 31467 | macros/latex-dev/required/tools/multicol-2019-10-01.sty 2024/10/31 | 3124895 | macros/latex/contrib/proflycee.zip +2024/10/31 | 3098705 | install/macros/latex-dev/required/latex-graphics-dev.tds.zip 2024/10/31 | 3098298 | install/macros/latex/required/latex-graphics.tds.zip +2024/10/31 | 3083 | macros/latex-dev/base/README.md +2024/10/31 | 308133 | macros/latex-dev/base/lthooks.dtx 2024/10/31 | 308133 | macros/latex/base/lthooks.dtx +2024/10/31 | 307847 | macros/latex/required/latex-lab/latex-lab-text.pdf +2024/10/31 | 307847 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf 2024/10/31 | 3069 | macros/latex/base/README.md 2024/10/31 | 3060938 | macros/latex/required/graphics.zip +2024/10/31 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty 2024/10/31 | 30499 | macros/latex/base/doc-2021-06-01.sty 2024/10/31 | 30464 | macros/latex/required/graphics/graphicx.dtx +2024/10/31 | 30464 | macros/latex-dev/required/graphics/graphicx.dtx +2024/10/31 | 30448 | macros/latex-dev/base/ltnews31.tex 2024/10/31 | 30448 | macros/latex/base/ltnews31.tex 2024/10/31 | 30386 | macros/latex/required/tools/showkeys.dtx +2024/10/31 | 30386 | macros/latex-dev/required/tools/showkeys.dtx 2024/10/31 | 303762 | macros/latex/required/graphics/graphics.pdf +2024/10/31 | 303762 | macros/latex-dev/required/graphics/graphics.pdf 2024/10/31 | 30340 | graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.tex +2024/10/31 | 30296 | fonts/newcomputermodern/otf/NewCMUncial10-Regular.otf +2024/10/31 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty 2024/10/31 | 29965 | macros/latex/base/doc-2016-02-15.sty 2024/10/31 | 2994 | macros/latex/required/graphics/graphics-drivers.ins +2024/10/31 | 2994 | macros/latex-dev/required/graphics/graphics-drivers.ins +2024/10/31 | 298160 | macros/latex/required/latex-lab/latex-lab-testphase.pdf +2024/10/31 | 298160 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf 2024/10/31 | 29812 | macros/latex/required/tools/multicol-2017-04-11.sty +2024/10/31 | 29812 | macros/latex-dev/required/tools/multicol-2017-04-11.sty 2024/10/31 | 297316 | systems/texlive/tlnet/archive/moloch.doc.r72715.tar.xz +2024/10/31 | 296124 | macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.pdf +2024/10/31 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf +2024/10/31 | 29270 | macros/latex-dev/base/ltfntcmd.dtx 2024/10/31 | 29270 | macros/latex/base/ltfntcmd.dtx +2024/10/31 | 292600 | macros/latex-dev/base/cmfonts.pdf 2024/10/31 | 292600 | macros/latex/base/cmfonts.pdf 2024/10/31 | 292240 | systems/texlive/tlnet/archive/latex2pydata.doc.r72708.tar.xz +2024/10/31 | 29086 | macros/latex-dev/base/ltnews40.tex 2024/10/31 | 29086 | macros/latex/base/ltnews40.tex +2024/10/31 | 290257 | macros/latex-dev/base/tlc2.pdf 2024/10/31 | 290257 | macros/latex/base/tlc2.pdf +2024/10/31 | 2898 | macros/latex/required/latex-lab/latex-lab-mathpkg.dtx +2024/10/31 | 2898 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx +2024/10/31 | 2896 | macros/latex-dev/base/syntonly.ins 2024/10/31 | 2896 | macros/latex/base/syntonly.ins -2024/10/31 | 2896295 | biblio/ctan-bibdata/ctan.bib 2024/10/31 | 289601 | macros/latex/required/tools/tabularx.pdf +2024/10/31 | 289601 | macros/latex-dev/required/tools/tabularx.pdf +2024/10/31 | 2893 | macros/latex-dev/base/nfssfont.ins 2024/10/31 | 2893 | macros/latex/base/nfssfont.ins +2024/10/31 | 2892 | macros/latex-dev/base/graphpap.ins +2024/10/31 | 2892 | macros/latex-dev/base/fix-cm.ins 2024/10/31 | 2892 | macros/latex/base/graphpap.ins 2024/10/31 | 2892 | macros/latex/base/fix-cm.ins +2024/10/31 | 2890 | macros/latex-dev/base/alltt.ins 2024/10/31 | 2890 | macros/latex/base/alltt.ins +2024/10/31 | 2888 | macros/latex-dev/base/ifthen.ins 2024/10/31 | 2888 | macros/latex/base/ifthen.ins +2024/10/31 | 287813 | install/macros/latex-dev/required/latex-firstaid-dev.tds.zip +2024/10/31 | 287749 | install/macros/latex/required/latex-firstaid.tds.zip +2024/10/31 | 287727 | macros/latex-dev/base/fix-cm.pdf 2024/10/31 | 287727 | macros/latex/base/fix-cm.pdf +2024/10/31 | 286824 | macros/latex-dev/base/ltnews23.pdf 2024/10/31 | 286824 | macros/latex/base/ltnews23.pdf 2024/10/31 | 286448 | macros/latex/required/graphics/drivers.pdf +2024/10/31 | 286448 | macros/latex-dev/required/graphics/drivers.pdf 2024/10/31 | 284421 | macros/latex/contrib/proflycee/doc/ProfLycee-docctan.zip +2024/10/31 | 282447 | macros/latex-dev/base/latexrelease.pdf 2024/10/31 | 282447 | macros/latex/base/latexrelease.pdf +2024/10/31 | 282259 | macros/latex/required/latex-lab/latex-lab-minipage.pdf +2024/10/31 | 282259 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf +2024/10/31 | 2806 | macros/generic/markdown/examples/context-mkiv.tex +2024/10/31 | 280510 | macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf +2024/10/31 | 280510 | macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf +2024/10/31 | 2799192 | install/macros/latex-dev/required/latex-amsmath-dev.tds.zip +2024/10/31 | 2798830 | install/macros/latex/required/latex-amsmath.tds.zip 2024/10/31 | 278524 | macros/latex/required/graphics/rotating.pdf -2024/10/31 | 27713836 | systems/texlive/tlnet/install-tl-windows.exe +2024/10/31 | 278524 | macros/latex-dev/required/graphics/rotating.pdf +2024/10/31 | 27557 | macros/latex-dev/base/ltcounts.dtx 2024/10/31 | 27557 | macros/latex/base/ltcounts.dtx 2024/10/31 | 2750 | macros/latex/contrib/rub-kunstgeschichte/rub-kunstgeschichte.ins 2024/10/31 | 2749 | macros/latex/required/tools/xr-2023-07-04.sty +2024/10/31 | 2749 | macros/latex-dev/required/tools/xr-2023-07-04.sty +2024/10/31 | 2744 | macros/latex/required/firstaid/firstaid.ins +2024/10/31 | 2744 | macros/latex-dev/required/firstaid/firstaid.ins +2024/10/31 | 27372 | macros/latex-dev/base/lterror.dtx 2024/10/31 | 27372 | macros/latex/base/lterror.dtx +2024/10/31 | 2728 | macros/latex-dev/base/ltpageno.dtx 2024/10/31 | 2728 | macros/latex/base/ltpageno.dtx +2024/10/31 | 2723 | macros/latex-dev/required/amsmath/README.md +2024/10/31 | 27231 | macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx +2024/10/31 | 27231 | macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx +2024/10/31 | 27216 | macros/latex/required/latex-lab/latex-lab-sec.dtx +2024/10/31 | 27216 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx +2024/10/31 | 27122 | macros/latex-dev/base/ltxcheck.tex 2024/10/31 | 27122 | macros/latex/base/ltxcheck.tex +2024/10/31 | 2709 | macros/latex/required/amsmath/README.md +2024/10/31 | 2705 | macros/latex-dev/base/idx.tex 2024/10/31 | 2705 | macros/latex/base/idx.tex +2024/10/31 | 265497 | macros/latex-dev/base/ltnews24.pdf 2024/10/31 | 265497 | macros/latex/base/ltnews24.pdf +2024/10/31 | 264168 | macros/latex-dev/base/cfgguide.pdf 2024/10/31 | 264168 | macros/latex/base/cfgguide.pdf 2024/10/31 | 2628 | macros/latex/contrib/eolang/eolang.ins -2024/10/31 | 2609692 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz 2024/10/31 | 260278 | macros/latex/required/tools/layout.pdf +2024/10/31 | 260278 | macros/latex-dev/required/tools/layout.pdf +2024/10/31 | 257825 | macros/latex-dev/base/modguide.pdf 2024/10/31 | 257825 | macros/latex/base/modguide.pdf 2024/10/31 | 2576 | macros/latex/required/tools/multicol.ins +2024/10/31 | 2576 | macros/latex-dev/required/tools/multicol.ins +2024/10/31 | 257359 | macros/latex-dev/base/cyrguide.pdf 2024/10/31 | 257359 | macros/latex/base/cyrguide.pdf 2024/10/31 | 257027 | macros/latex/required/tools/xspace.pdf +2024/10/31 | 257027 | macros/latex-dev/required/tools/xspace.pdf 2024/10/31 | 2554 | macros/latex/required/tools/l3sys-query.ins +2024/10/31 | 2554 | macros/latex-dev/required/tools/l3sys-query.ins 2024/10/31 | 2538 | macros/latex/required/tools/longtable.ins 2024/10/31 | 2538 | macros/latex/required/tools/afterpage.ins +2024/10/31 | 2538 | macros/latex-dev/required/tools/longtable.ins +2024/10/31 | 2538 | macros/latex-dev/required/tools/afterpage.ins 2024/10/31 | 2535 | macros/latex/required/tools/tabularx.ins +2024/10/31 | 2535 | macros/latex-dev/required/tools/tabularx.ins 2024/10/31 | 2531 | macros/latex/required/tools/varioref.ins +2024/10/31 | 2531 | macros/latex-dev/required/tools/varioref.ins 2024/10/31 | 252922 | macros/latex/required/tools/showkeys.pdf +2024/10/31 | 252922 | macros/latex-dev/required/tools/showkeys.pdf +2024/10/31 | 252519 | macros/latex-dev/base/lb2.pdf 2024/10/31 | 252519 | macros/latex/base/lb2.pdf 2024/10/31 | 2524 | macros/latex/required/tools/bm.ins +2024/10/31 | 2524 | macros/latex-dev/required/tools/bm.ins 2024/10/31 | 25146 | macros/latex/required/tools/trace.dtx +2024/10/31 | 25146 | macros/latex-dev/required/tools/trace.dtx +2024/10/31 | 251283 | macros/latex-dev/base/ltnews27.pdf 2024/10/31 | 251283 | macros/latex/base/ltnews27.pdf +2024/10/31 | 24883 | macros/latex-dev/base/ltxref.dtx 2024/10/31 | 24883 | macros/latex/base/ltxref.dtx +2024/10/31 | 245228 | macros/latex-dev/base/ltnews21.pdf 2024/10/31 | 245228 | macros/latex/base/ltnews21.pdf +2024/10/31 | 244141 | macros/latex-dev/base/ltxdoc.pdf 2024/10/31 | 244141 | macros/latex/base/ltxdoc.pdf +2024/10/31 | 243 | macros/latex-dev/base/ltproperties-doc.tex 2024/10/31 | 243 | macros/latex/base/ltproperties-doc.tex +2024/10/31 | 242 | macros/latex-dev/base/lttemplates-doc.tex 2024/10/31 | 242 | macros/latex/base/lttemplates-doc.tex +2024/10/31 | 241 | macros/latex-dev/base/ltfilehook-doc.tex 2024/10/31 | 241 | macros/latex/base/ltfilehook-doc.tex +2024/10/31 | 24199 | macros/unicodetex/latex/fontsetup/tex/fspolddefault.tex +2024/10/31 | 241893 | macros/latex-dev/base/doc.dtx 2024/10/31 | 241893 | macros/latex/base/doc.dtx +2024/10/31 | 24162 | macros/unicodetex/latex/fontsetup/tex/fspdefault.tex +2024/10/31 | 24161 | macros/unicodetex/latex/fontsetup/tex/fspsansdefault.tex +2024/10/31 | 240 | macros/latex-dev/base/ltsockets-doc.tex +2024/10/31 | 240 | macros/latex-dev/base/ltshipout-doc.tex 2024/10/31 | 240 | macros/latex/base/ltsockets-doc.tex 2024/10/31 | 240 | macros/latex/base/ltshipout-doc.tex 2024/10/31 | 240618 | macros/latex/required/graphics/graphicx.pdf +2024/10/31 | 240618 | macros/latex-dev/required/graphics/graphicx.pdf +2024/10/31 | 23994 | macros/latex/required/latex-lab/documentmetadata-support.dtx +2024/10/31 | 23994 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx 2024/10/31 | 239587 | macros/latex/required/graphics/keyval.pdf +2024/10/31 | 239587 | macros/latex-dev/required/graphics/keyval.pdf +2024/10/31 | 238 | macros/latex-dev/base/ltmarks-doc.tex +2024/10/31 | 238 | macros/latex-dev/base/lthooks-doc.tex +2024/10/31 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex 2024/10/31 | 238 | macros/latex/base/ltmarks-doc.tex 2024/10/31 | 238 | macros/latex/base/lthooks-doc.tex 2024/10/31 | 238 | macros/latex/base/ltcmdhooks-doc.tex +2024/10/31 | 23812 | macros/latex/required/latex-lab/latex-lab-new-or-2.dtx +2024/10/31 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx +2024/10/31 | 23646 | macros/latex-dev/base/ltnews30.tex 2024/10/31 | 23646 | macros/latex/base/ltnews30.tex +2024/10/31 | 235962 | macros/latex/required/latex-lab/latex-lab-namespace.pdf +2024/10/31 | 235962 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf +2024/10/31 | 23516 | macros/latex-dev/base/fix-cm.dtx 2024/10/31 | 23516 | macros/latex/base/fix-cm.dtx +2024/10/31 | 234 | macros/latex-dev/base/ltpara-doc.tex 2024/10/31 | 234 | macros/latex/base/ltpara-doc.tex +2024/10/31 | 233905 | macros/latex-dev/base/slifonts.pdf 2024/10/31 | 233905 | macros/latex/base/slifonts.pdf +2024/10/31 | 23386 | macros/latex-dev/base/lppl.tex 2024/10/31 | 23386 | macros/latex/base/lppl.tex +2024/10/31 | 233049 | macros/latex/required/amsmath/amsmath.dtx +2024/10/31 | 233049 | macros/latex-dev/required/amsmath/amsmath.dtx +2024/10/31 | 23212 | fonts/newcomputermodern/otf/NewCMUncial08-Book.otf +2024/10/31 | 23177 | macros/latex-dev/base/ltkeys.dtx 2024/10/31 | 23177 | macros/latex/base/ltkeys.dtx +2024/10/31 | 23117 | macros/generic/markdown/README.md +2024/10/31 | 22946 | macros/latex-dev/base/ltnews38.tex 2024/10/31 | 22946 | macros/latex/base/ltnews38.tex +2024/10/31 | 22928 | macros/generic/markdown/libraries/markdown-tinyyaml.lua +2024/10/31 | 22892 | fonts/newcomputermodern/otf/NewCMUncial10-Book.otf +2024/10/31 | 22822 | macros/latex-dev/base/ltxdoc.dtx 2024/10/31 | 22822 | macros/latex/base/ltxdoc.dtx +2024/10/31 | 22813 | macros/latex/required/latex-lab/latex-lab-float.dtx +2024/10/31 | 22813 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx +2024/10/31 | 22723 | macros/latex-dev/base/cfgguide.tex 2024/10/31 | 22723 | macros/latex/base/cfgguide.tex +2024/10/31 | 227065 | macros/latex-dev/base/proc.pdf 2024/10/31 | 227065 | macros/latex/base/proc.pdf +2024/10/31 | 22605 | macros/latex/required/amsmath/diffs-m.txt +2024/10/31 | 22605 | macros/latex-dev/required/amsmath/diffs-m.txt +2024/10/31 | 225936 | macros/latex-dev/base/ltnews19.pdf 2024/10/31 | 225936 | macros/latex/base/ltnews19.pdf 2024/10/31 | 22542 | macros/latex/contrib/spbmark/spbmark.tex +2024/10/31 | 22472 | fonts/newcomputermodern/otf/NewCMUncial08-Regular.otf +2024/10/31 | 223766 | macros/latex-dev/base/alltt.pdf 2024/10/31 | 223766 | macros/latex/base/alltt.pdf +2024/10/31 | 22372 | fonts/newcomputermodern/otf/NewCMUncial08-Bold.otf +2024/10/31 | 222785 | macros/latex-dev/base/ltnews41.pdf +2024/10/31 | 222460 | macros/latex-dev/base/ifthen.pdf 2024/10/31 | 222460 | macros/latex/base/ifthen.pdf 2024/10/31 | 222074 | macros/latex/required/tools/trace.pdf +2024/10/31 | 222074 | macros/latex-dev/required/tools/trace.pdf 2024/10/31 | 2219 | macros/latex/required/tools/indentfirst.dtx +2024/10/31 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx 2024/10/31 | 221038 | macros/latex/required/tools/dcolumn.pdf +2024/10/31 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf +2024/10/31 | 219358 | macros/latex-dev/base/ltx3info.pdf 2024/10/31 | 219358 | macros/latex/base/ltx3info.pdf +2024/10/31 | 217663 | macros/latex-dev/base/lgc2.pdf 2024/10/31 | 217663 | macros/latex/base/lgc2.pdf +2024/10/31 | 217504 | macros/latex/required/amsmath/amstext.pdf +2024/10/31 | 217504 | macros/latex-dev/required/amsmath/amstext.pdf 2024/10/31 | 215077 | macros/latex/required/tools/enumerate.pdf +2024/10/31 | 215077 | macros/latex-dev/required/tools/enumerate.pdf +2024/10/31 | 21488 | macros/latex-dev/base/ltnews.cls 2024/10/31 | 21488 | macros/latex/base/ltnews.cls 2024/10/31 | 21444 | systems/texlive/tlnet/archive/luamml.r72714.tar.xz 2024/10/31 | 212777 | macros/latex/required/graphics/color.pdf +2024/10/31 | 212777 | macros/latex-dev/required/graphics/color.pdf +2024/10/31 | 21229 | macros/latex-dev/base/lgc2.err 2024/10/31 | 21229 | macros/latex/base/lgc2.err 2024/10/31 | 2114722 | macros/latex/contrib/tutodoc.zip +2024/10/31 | 211314 | macros/latex-dev/base/nfssfont.pdf 2024/10/31 | 211314 | macros/latex/base/nfssfont.pdf +2024/10/31 | 21088 | fonts/newcomputermodern/otf/NewCMUncial10-Bold.otf 2024/10/31 | 21076 | macros/latex/required/tools/l3sys-query.dtx +2024/10/31 | 21076 | macros/latex-dev/required/tools/l3sys-query.dtx 2024/10/31 | 21067 | macros/latex/required/graphics/rotating.dtx +2024/10/31 | 21067 | macros/latex-dev/required/graphics/rotating.dtx +2024/10/31 | 2090 | macros/latex-dev/required/graphics/README.md 2024/10/31 | 2076 | macros/latex/required/graphics/README.md +2024/10/31 | 205 | fonts/newcomputermodern/doc/opticalmathlm.tex +2024/10/31 | 205100 | macros/latex-dev/base/ltnews25.pdf 2024/10/31 | 205100 | macros/latex/base/ltnews25.pdf +2024/10/31 | 204708 | macros/latex-dev/base/exscale.pdf 2024/10/31 | 204708 | macros/latex/base/exscale.pdf 2024/10/31 | 20405 | macros/latex/contrib/spbmark/spbmark.sty +2024/10/31 | 2036 | macros/generic/markdown/examples/latex-pdftex.tex 2024/10/31 | 200 | graphics/pgf/contrib/pixelarttikz/doc/PAyoda.csv +2024/10/31 | 2007 | macros/generic/markdown/examples/latex-luatex.tex +2024/10/31 | 200759 | macros/latex-dev/base/latexsym.pdf 2024/10/31 | 200759 | macros/latex/base/latexsym.pdf +2024/10/31 | 20030 | macros/latex-dev/base/ltexpl.dtx 2024/10/31 | 20030 | macros/latex/base/ltexpl.dtx 2024/10/31 | 199290 | macros/latex/required/graphics/trig.pdf +2024/10/31 | 199290 | macros/latex-dev/required/graphics/trig.pdf +2024/10/31 | 19925 | macros/latex/required/latex-lab/latex-lab-firstaid.dtx +2024/10/31 | 19925 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx 2024/10/31 | 198100 | macros/latex/required/tools/afterpage.pdf -2024/10/31 | 19663383 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2024/10/31 | 198100 | macros/latex-dev/required/tools/afterpage.pdf 2024/10/31 | 1956 | systems/texlive/tlnet/archive/xltabular.r72712.tar.xz +2024/10/31 | 1946 | macros/unicodetex/latex/fontsetup/tex/fspgfsneohellenicot.tex 2024/10/31 | 19459 | macros/latex/contrib/letterswitharrows/letterswitharrows.dtx +2024/10/31 | 19443 | macros/latex/required/latex-lab/changes.txt +2024/10/31 | 19443 | macros/latex-dev/required/latex-lab/changes.txt +2024/10/31 | 1941 | macros/latex-dev/base/minimal.cls 2024/10/31 | 1941 | macros/latex/base/minimal.cls +2024/10/31 | 1939 | macros/generic/markdown/markdown.ins +2024/10/31 | 19333 | macros/latex-dev/base/ltnews36.tex 2024/10/31 | 19333 | macros/latex/base/ltnews36.tex +2024/10/31 | 193083 | macros/latex-dev/base/ltcmd.dtx 2024/10/31 | 193083 | macros/latex/base/ltcmd.dtx +2024/10/31 | 191 | macros/latex/required/latex-lab/documentmetadata-support-doc.tex +2024/10/31 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex +2024/10/31 | 191 | fonts/newcomputermodern/doc/integral.tex +2024/10/31 | 19199 | macros/latex-dev/base/ifthen.dtx 2024/10/31 | 19199 | macros/latex/base/ifthen.dtx 2024/10/31 | 191058 | macros/latex/required/tools/delarray.pdf +2024/10/31 | 191058 | macros/latex-dev/required/tools/delarray.pdf +2024/10/31 | 19040 | macros/latex-dev/base/lppl.txt 2024/10/31 | 19040 | macros/latex/base/lppl.txt 2024/10/31 | 189678 | macros/latex/required/tools/hhline.pdf +2024/10/31 | 189678 | macros/latex-dev/required/tools/hhline.pdf +2024/10/31 | 189462 | macros/latex-dev/base/syntonly.pdf 2024/10/31 | 189462 | macros/latex/base/syntonly.pdf +2024/10/31 | 18944 | macros/latex-dev/base/ltnews29.tex 2024/10/31 | 18944 | macros/latex/base/ltnews29.tex 2024/10/31 | 188769 | macros/latex/required/tools/multicol.dtx +2024/10/31 | 188769 | macros/latex-dev/required/tools/multicol.dtx 2024/10/31 | 187903 | macros/latex/required/tools/fileerr.pdf +2024/10/31 | 187903 | macros/latex-dev/required/tools/fileerr.pdf +2024/10/31 | 18661 | macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.dtx +2024/10/31 | 18661 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx 2024/10/31 | 1863816 | macros/latex/contrib/eolang/eolang.pdf 2024/10/31 | 1844753 | macros/latex/contrib/eolang.zip +2024/10/31 | 18401 | macros/latex-dev/base/nfssfont.dtx 2024/10/31 | 18401 | macros/latex/base/nfssfont.dtx +2024/10/31 | 18299 | macros/latex-dev/base/ltx3info.tex 2024/10/31 | 18299 | macros/latex/base/ltx3info.tex +2024/10/31 | 182483 | macros/latex-dev/base/ltnews13.pdf 2024/10/31 | 182483 | macros/latex/base/ltnews13.pdf +2024/10/31 | 179948 | macros/latex/required/amsmath/amscd.pdf +2024/10/31 | 179948 | macros/latex-dev/required/amsmath/amscd.pdf 2024/10/31 | 17856 | macros/latex/required/tools/xspace.dtx +2024/10/31 | 17856 | macros/latex-dev/required/tools/xspace.dtx +2024/10/31 | 178564 | macros/latex-dev/base/ltoutput.dtx 2024/10/31 | 178564 | macros/latex/base/ltoutput.dtx +2024/10/31 | 178193 | macros/latex/required/amsmath/amsgen.pdf +2024/10/31 | 178193 | macros/latex-dev/required/amsmath/amsgen.pdf +2024/10/31 | 17782 | macros/latex-dev/base/cyrguide.tex 2024/10/31 | 17782 | macros/latex/base/cyrguide.tex 2024/10/31 | 1763 | macros/latex/contrib/eolang/eolang.bib 2024/10/31 | 176171 | macros/latex/required/tools/shellesc.pdf +2024/10/31 | 176171 | macros/latex-dev/required/tools/shellesc.pdf +2024/10/31 | 175211 | macros/latex-dev/base/ltnews05.pdf 2024/10/31 | 175211 | macros/latex/base/ltnews05.pdf +2024/10/31 | 174946 | macros/latex/required/amsmath/amsbsy.pdf +2024/10/31 | 174946 | macros/latex-dev/required/amsmath/amsbsy.pdf +2024/10/31 | 17389 | macros/latex-dev/base/ltbibl.dtx 2024/10/31 | 17389 | macros/latex/base/ltbibl.dtx +2024/10/31 | 173013 | macros/latex-dev/base/tlc2.err 2024/10/31 | 173013 | macros/latex/base/tlc2.err +2024/10/31 | 172252 | macros/latex-dev/required/graphics/rotex.pdf 2024/10/31 | 172251 | macros/latex/required/graphics/rotex.pdf +2024/10/31 | 1719340 | install/macros/generic/markdown.tds.zip +2024/10/31 | 171410 | macros/latex-dev/base/docstrip.dtx 2024/10/31 | 171410 | macros/latex/base/docstrip.dtx +2024/10/31 | 170876 | macros/latex-dev/base/lamport-manual.pdf 2024/10/31 | 170876 | macros/latex/base/lamport-manual.pdf +2024/10/31 | 170722 | macros/latex-dev/base/ltnews14.pdf 2024/10/31 | 170722 | macros/latex/base/ltnews14.pdf +2024/10/31 | 17010 | macros/latex/required/latex-lab/latex-lab-title.dtx +2024/10/31 | 17010 | macros/latex-dev/required/latex-lab/latex-lab-title.dtx +2024/10/31 | 169553 | macros/latex-dev/base/ltnews01.pdf 2024/10/31 | 169553 | macros/latex/base/ltnews01.pdf +2024/10/31 | 1694 | macros/latex-dev/base/small2e.tex 2024/10/31 | 1694 | macros/latex/base/small2e.tex +2024/10/31 | 169433 | macros/latex-dev/base/ltnews10.pdf 2024/10/31 | 169433 | macros/latex/base/ltnews10.pdf -2024/10/31 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2024/10/31 | 167583 | macros/latex/required/tools/somedefs.pdf +2024/10/31 | 167583 | macros/latex-dev/required/tools/somedefs.pdf +2024/10/31 | 1664 | macros/latex-dev/required/tools/README.md +2024/10/31 | 166269 | macros/latex-dev/base/ltnews17.pdf 2024/10/31 | 166269 | macros/latex/base/ltnews17.pdf +2024/10/31 | 165816 | macros/latex-dev/base/makeindx.pdf 2024/10/31 | 165816 | macros/latex/base/makeindx.pdf 2024/10/31 | 1650 | macros/latex/required/tools/README.md +2024/10/31 | 16500 | macros/latex-dev/base/modguide.tex 2024/10/31 | 16500 | macros/latex/base/modguide.tex 2024/10/31 | 16397872 | systems/texlive/tlnet/archive/drawing-with-metapost.doc.r72705.tar.xz +2024/10/31 | 162773 | macros/latex-dev/base/tulm.pdf 2024/10/31 | 162773 | macros/latex/base/tulm.pdf 2024/10/31 | 162772 | systems/texlive/tlnet/archive/luamml.doc.r72714.tar.xz 2024/10/31 | 162167 | macros/latex/contrib/rub-kunstgeschichte/rub-kunstgeschichte-example.pdf +2024/10/31 | 161722 | macros/latex-dev/base/graphpap.pdf 2024/10/31 | 161722 | macros/latex/base/graphpap.pdf 2024/10/31 | 16168 | macros/latex/required/graphics/mathcolor.dtx +2024/10/31 | 16168 | macros/latex-dev/required/graphics/mathcolor.dtx +2024/10/31 | 16144 | fonts/newcomputermodern/doc/newcm-unimath-symbols.ltx 2024/10/31 | 159239 | macros/latex/required/graphics/epsfig.pdf +2024/10/31 | 159239 | macros/latex-dev/required/graphics/epsfig.pdf 2024/10/31 | 15737 | macros/latex/required/graphics/cat.eps +2024/10/31 | 15737 | macros/latex-dev/required/graphics/cat.eps 2024/10/31 | 157352 | macros/latex/required/tools/indentfirst.pdf +2024/10/31 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf +2024/10/31 | 15693 | macros/latex-dev/base/slifonts.fdd 2024/10/31 | 15693 | macros/latex/base/slifonts.fdd +2024/10/31 | 156764 | macros/latex-dev/base/ltnews12.pdf 2024/10/31 | 156764 | macros/latex/base/ltnews12.pdf +2024/10/31 | 156258 | macros/latex-dev/base/classes.dtx 2024/10/31 | 156258 | macros/latex/base/classes.dtx 2024/10/31 | 155987 | macros/latex/required/graphics/lscape.pdf +2024/10/31 | 155987 | macros/latex-dev/required/graphics/lscape.pdf 2024/10/31 | 15577 | macros/latex/required/graphics/graphics-2017-06-25.sty +2024/10/31 | 15577 | macros/latex-dev/required/graphics/graphics-2017-06-25.sty +2024/10/31 | 15553 | macros/latex-dev/base/source2e.tex 2024/10/31 | 15553 | macros/latex/base/source2e.tex +2024/10/31 | 155442 | macros/latex-dev/base/ltnews08.pdf 2024/10/31 | 155442 | macros/latex/base/ltnews08.pdf -2024/10/31 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2024/10/31 | 15383 | macros/latex-dev/base/ltvers.dtx 2024/10/31 | 15346 | macros/latex/base/ltvers.dtx -2024/10/31 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2024/10/31 | 152551 | macros/latex-dev/base/ltnews04.pdf 2024/10/31 | 152551 | macros/latex/base/ltnews04.pdf +2024/10/31 | 152125 | macros/latex-dev/base/ltclass.dtx 2024/10/31 | 152125 | macros/latex/base/ltclass.dtx +2024/10/31 | 151773 | macros/latex-dev/base/ltnews02.pdf 2024/10/31 | 151773 | macros/latex/base/ltnews02.pdf +2024/10/31 | 151324 | macros/latex-dev/base/ltnews03.pdf 2024/10/31 | 151324 | macros/latex/base/ltnews03.pdf +2024/10/31 | 1505 | macros/latex/required/amsmath/amsbsy.ins +2024/10/31 | 1505 | macros/latex-dev/required/amsmath/amsbsy.ins +2024/10/31 | 1504 | macros/latex/required/amsmath/amsmath.ins +2024/10/31 | 1504 | macros/latex-dev/required/amsmath/amsmath.ins +2024/10/31 | 15047 | macros/latex-dev/base/ltnews28.tex 2024/10/31 | 15047 | macros/latex/base/ltnews28.tex 2024/10/31 | 14932 | systems/texlive/tlnet/archive/fvextra.r72706.tar.xz +2024/10/31 | 1492 | macros/latex/required/amsmath/amsxtra.ins +2024/10/31 | 1492 | macros/latex/required/amsmath/amstext.ins +2024/10/31 | 1492 | macros/latex-dev/required/amsmath/amsxtra.ins +2024/10/31 | 1492 | macros/latex-dev/required/amsmath/amstext.ins +2024/10/31 | 1490 | macros/latex/required/amsmath/amsopn.ins +2024/10/31 | 1490 | macros/latex-dev/required/amsmath/amsopn.ins 2024/10/31 | 1489621 | graphics/pgf/contrib/pixelarttikz.zip +2024/10/31 | 1487 | macros/latex/required/amsmath/amscd.ins +2024/10/31 | 1487 | macros/latex-dev/required/amsmath/amscd.ins +2024/10/31 | 148564 | macros/latex-dev/base/ltoutenc.dtx 2024/10/31 | 148564 | macros/latex/base/ltoutenc.dtx +2024/10/31 | 1484 | macros/latex/required/amsmath/amsgen.ins +2024/10/31 | 1484 | macros/latex-dev/required/amsmath/amsgen.ins 2024/10/31 | 147854 | macros/latex/required/tools/array.dtx +2024/10/31 | 147854 | macros/latex-dev/required/tools/array.dtx +2024/10/31 | 147459 | macros/latex/required/amsmath/technote.pdf +2024/10/31 | 147459 | macros/latex-dev/required/amsmath/technote.pdf 2024/10/31 | 146438 | macros/latex/required/tools/fontsmpl.pdf +2024/10/31 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf +2024/10/31 | 146205 | macros/latex-dev/base/webcomp.pdf 2024/10/31 | 146205 | macros/latex/base/webcomp.pdf -2024/10/31 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 2024/10/31 | 14575 | macros/latex/required/graphics/rotex.tex -2024/10/31 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2024/10/31 | 14575 | macros/latex-dev/required/graphics/rotex.tex +2024/10/31 | 145696 | macros/latex/required/latex-lab/latex-lab-block.dtx +2024/10/31 | 145696 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx +2024/10/31 | 1444 | macros/unicodetex/latex/fontsetup/tex/fspeulerot.tex +2024/10/31 | 1444433 | macros/latex-dev/base/ltnews.pdf +2024/10/31 | 14421 | macros/latex-dev/base/lppl-1-2.txt 2024/10/31 | 14421 | macros/latex/base/lppl-1-2.txt 2024/10/31 | 1441033 | macros/latex/base/ltnews.pdf +2024/10/31 | 14380 | macros/latex/required/latex-lab/latex-lab-bib.dtx +2024/10/31 | 14380 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx +2024/10/31 | 14341 | macros/latex-dev/base/lppl-1-1.txt 2024/10/31 | 14341 | macros/latex/base/lppl-1-1.txt +2024/10/31 | 142867 | macros/latex-dev/base/ltnews06.pdf 2024/10/31 | 142867 | macros/latex/base/ltnews06.pdf +2024/10/31 | 141279 | fonts/newcomputermodern/doc/newcomputermodern-sample.pdf +2024/10/31 | 140951 | macros/generic/markdown/markdown.png +2024/10/31 | 14091 | macros/latex-dev/base/ltpage.dtx 2024/10/31 | 14091 | macros/latex/base/ltpage.dtx 2024/10/31 | 14075 | macros/latex/required/tools/afterpage.dtx +2024/10/31 | 14075 | macros/latex-dev/required/tools/afterpage.dtx +2024/10/31 | 140093 | macros/latex/required/amsmath/amsopn.pdf +2024/10/31 | 140093 | macros/latex-dev/required/amsmath/amsopn.pdf 2024/10/31 | 138956 | macros/latex/required/tools/rawfonts.pdf +2024/10/31 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf 2024/10/31 | 13875 | macros/latex/required/graphics/keyval.dtx +2024/10/31 | 13875 | macros/latex-dev/required/graphics/keyval.dtx +2024/10/31 | 138214 | macros/latex-dev/base/ltnews07.pdf 2024/10/31 | 138214 | macros/latex/base/ltnews07.pdf +2024/10/31 | 138107 | macros/latex-dev/base/ltnews16.pdf 2024/10/31 | 138107 | macros/latex/base/ltnews16.pdf 2024/10/31 | 1380 | macros/latex/contrib/eolang/README.md +2024/10/31 | 13759 | macros/latex-dev/base/lamport-manual.err 2024/10/31 | 13759 | macros/latex/base/lamport-manual.err +2024/10/31 | 13589 | macros/latex-dev/base/proc.dtx 2024/10/31 | 13589 | macros/latex/base/proc.dtx +2024/10/31 | 13442 | macros/latex/required/amsmath/amsgen.dtx +2024/10/31 | 13442 | macros/latex-dev/required/amsmath/amsgen.dtx +2024/10/31 | 1341 | macros/latex-dev/base/ltnews18.tex 2024/10/31 | 1341 | macros/latex/base/ltnews18.tex 2024/10/31 | 1335372 | systems/texlive/tlnet/archive/letgut.doc.r72713.tar.xz +2024/10/31 | 132370 | macros/latex-dev/base/lppl.pdf 2024/10/31 | 132370 | macros/latex/base/lppl.pdf +2024/10/31 | 1318576 | macros/latex-dev/base/encguide.pdf 2024/10/31 | 1318576 | macros/latex/base/encguide.pdf +2024/10/31 | 1303962 | fonts/newcomputermodern/doc/newcm-unimath-symbols.pdf +2024/10/31 | 130328 | macros/latex-dev/base/ltnews15.pdf 2024/10/31 | 130328 | macros/latex/base/ltnews15.pdf +2024/10/31 | 130028 | macros/latex-dev/base/ltnews09.pdf 2024/10/31 | 130028 | macros/latex/base/ltnews09.pdf +2024/10/31 | 1279 | macros/latex-dev/base/legal.txt 2024/10/31 | 1279 | macros/latex/base/legal.txt +2024/10/31 | 1277256 | fonts/newcomputermodern/otf/NewCMMath-Book.otf +2024/10/31 | 12725613 | install/macros/latex-dev/required/latex-lab-dev.tds.zip +2024/10/31 | 12724789 | install/macros/latex/required/latex-lab.tds.zip 2024/10/31 | 12716 | systems/texlive/tlnet/archive/latex2pydata.source.r72708.tar.xz 2024/10/31 | 12706 | macros/latex/required/tools/dcolumn.dtx +2024/10/31 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx 2024/10/31 | 1269020 | systems/texlive/tlnet/archive/minted.r72709.tar.xz +2024/10/31 | 12633 | macros/latex/required/latex-lab/latex-lab-toc.dtx +2024/10/31 | 12633 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx 2024/10/31 | 12587 | macros/latex/required/tools/array-2023-11-01.sty +2024/10/31 | 12587 | macros/latex-dev/required/tools/array-2023-11-01.sty +2024/10/31 | 1254049 | macros/latex-dev/base/lthooks-code.pdf 2024/10/31 | 1254049 | macros/latex/base/lthooks-code.pdf 2024/10/31 | 12535 | macros/latex/required/tools/array-2020-02-10.sty +2024/10/31 | 12535 | macros/latex-dev/required/tools/array-2020-02-10.sty +2024/10/31 | 12520 | macros/latex-dev/base/testpage.tex 2024/10/31 | 12520 | macros/latex/base/testpage.tex 2024/10/31 | 12515 | macros/latex/required/tools/xr.dtx +2024/10/31 | 12515 | macros/latex-dev/required/tools/xr.dtx +2024/10/31 | 12334 | macros/latex-dev/base/ltnews24.tex 2024/10/31 | 12334 | macros/latex/base/ltnews24.tex 2024/10/31 | 12282 | macros/latex/required/tools/longtable-2020-01-07.sty +2024/10/31 | 12282 | macros/latex-dev/required/tools/longtable-2020-01-07.sty +2024/10/31 | 12246 | macros/latex-dev/base/tulm.fdd 2024/10/31 | 12246 | macros/latex/base/tulm.fdd +2024/10/31 | 12092 | macros/latex-dev/base/manifest.txt 2024/10/31 | 12027 | macros/latex/base/manifest.txt +2024/10/31 | 12005 | macros/latex/required/amsmath/technote.tex +2024/10/31 | 12005 | macros/latex-dev/required/amsmath/technote.tex +2024/10/31 | 1198555 | macros/generic/markdown/markdown.pdf 2024/10/31 | 1189 | macros/latex/required/graphics/graphics.ins +2024/10/31 | 1189 | macros/latex-dev/required/graphics/graphics.ins 2024/10/31 | 11849 | macros/latex/required/tools/array-2016-10-06.sty +2024/10/31 | 11849 | macros/latex-dev/required/tools/array-2016-10-06.sty +2024/10/31 | 117 | macros/latex/required/latex-lab/documentmetadata-support-code.tex +2024/10/31 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex +2024/10/31 | 1156 | macros/latex-dev/required/latex-lab/README.md +2024/10/31 | 1149908 | fonts/newcomputermodern/otf/NewCMMath-Regular.otf 2024/10/31 | 114484 | macros/latex/required/tools/varioref.dtx +2024/10/31 | 114484 | macros/latex-dev/required/tools/varioref.dtx +2024/10/31 | 114477 | macros/latex-dev/base/lttextcomp.dtx 2024/10/31 | 114477 | macros/latex/base/lttextcomp.dtx -2024/10/31 | 114392 | systems/texlive/tlnet/archive/texlive-scripts.r72717.tar.xz -2024/10/31 | 113751 | macros/latex/contrib/easybook/easybook.tex +2024/10/31 | 1143 | macros/unicodetex/latex/fontsetup/tex/fspgfsdidotot.tex +2024/10/31 | 1142 | macros/latex/required/latex-lab/README.md +2024/10/31 | 1140 | macros/unicodetex/latex/fontsetup/tex/cv04Sans-Regular.fontspec +2024/10/31 | 11398 | macros/latex/required/amsmath/amstext.dtx +2024/10/31 | 11398 | macros/latex-dev/required/amsmath/amstext.dtx +2024/10/31 | 1137 | macros/unicodetex/latex/fontsetup/tex/cv04Mono-Regular.fontspec +2024/10/31 | 113560 | macros/latex/required/amsmath/amsxtra.pdf +2024/10/31 | 113560 | macros/latex-dev/required/amsmath/amsxtra.pdf +2024/10/31 | 1128 | macros/unicodetex/latex/fontsetup/tex/cv04Mono-Book.fontspec +2024/10/31 | 11284 | macros/latex/required/amsmath/amscd.dtx +2024/10/31 | 11284 | macros/latex-dev/required/amsmath/amscd.dtx +2024/10/31 | 112208 | macros/latex-dev/base/ltnews11.pdf 2024/10/31 | 112208 | macros/latex/base/ltnews11.pdf +2024/10/31 | 1119 | macros/unicodetex/latex/fontsetup/tex/cv04Sans-Book.fontspec 2024/10/31 | 11148 | macros/latex/required/tools/hhline.dtx +2024/10/31 | 11148 | macros/latex-dev/required/tools/hhline.dtx +2024/10/31 | 111446 | macros/latex-dev/base/fntguide.tex 2024/10/31 | 111446 | macros/latex/base/fntguide.tex +2024/10/31 | 109740 | macros/latex/required/amsmath/subeqn.pdf +2024/10/31 | 109740 | macros/latex-dev/required/amsmath/subeqn.pdf +2024/10/31 | 108 | macros/latex/required/latex-lab/blocks-code.tex +2024/10/31 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex 2024/10/31 | 1083 | macros/latex/contrib/eolang/LICENSE.txt +2024/10/31 | 107 | macros/latex-dev/base/ltproperties-code.tex 2024/10/31 | 107 | macros/latex/base/ltproperties-code.tex +2024/10/31 | 10798 | macros/latex-dev/base/ltnews26.tex 2024/10/31 | 10798 | macros/latex/base/ltnews26.tex +2024/10/31 | 10792 | macros/latex-dev/base/ltnews22.tex 2024/10/31 | 10792 | macros/latex/base/ltnews22.tex +2024/10/31 | 10791 | macros/latex-dev/base/ltnews23.tex 2024/10/31 | 10791 | macros/latex/base/ltnews23.tex +2024/10/31 | 1078843 | macros/latex-dev/base/doc-code.pdf 2024/10/31 | 1078843 | macros/latex/base/doc-code.pdf 2024/10/31 | 10771 | macros/latex/required/tools/fontsmpl.dtx +2024/10/31 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx 2024/10/31 | 10749 | macros/latex/required/graphics/trig.dtx +2024/10/31 | 10749 | macros/latex-dev/required/graphics/trig.dtx +2024/10/31 | 1071712 | fonts/newcomputermodern/otf/NewCMMath-Bold.otf +2024/10/31 | 106 | macros/latex-dev/base/lttemplates-code.tex 2024/10/31 | 106 | macros/latex/base/lttemplates-code.tex +2024/10/31 | 106906 | macros/latex-dev/base/inputenc.dtx 2024/10/31 | 106906 | macros/latex/base/inputenc.dtx 2024/10/31 | 10637 | macros/latex/required/tools/enumerate.dtx +2024/10/31 | 10637 | macros/latex-dev/required/tools/enumerate.dtx +2024/10/31 | 1062 | macros/unicodetex/latex/fontsetup/tex/cv04-Regular.fontspec +2024/10/31 | 10601 | macros/latex-dev/base/makeindx.dtx 2024/10/31 | 10601 | macros/latex/base/makeindx.dtx +2024/10/31 | 105 | macros/latex/required/latex-lab/blocks-doc.tex +2024/10/31 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex +2024/10/31 | 105 | macros/latex-dev/base/ltfilehook-code.tex 2024/10/31 | 105 | macros/latex/base/ltfilehook-code.tex +2024/10/31 | 1053 | macros/unicodetex/latex/fontsetup/tex/cv04-Book.fontspec +2024/10/31 | 104 | macros/latex-dev/base/ltsockets-code.tex +2024/10/31 | 104 | macros/latex-dev/base/ltshipout-code.tex 2024/10/31 | 104 | macros/latex/base/ltsockets-code.tex 2024/10/31 | 104 | macros/latex/base/ltshipout-code.tex +2024/10/31 | 1049656 | macros/generic/markdown/markdown.html +2024/10/31 | 104792 | macros/latex/required/amsmath/amsldoc.tex +2024/10/31 | 104792 | macros/latex-dev/required/amsmath/amsldoc.tex +2024/10/31 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex 2024/10/31 | 103 | macros/latex/base/ltcmdhooks-code.tex 2024/10/31 | 103744 | macros/latex/contrib/spbmark.zip +2024/10/31 | 10370 | macros/latex-dev/base/ltfsscmp.dtx 2024/10/31 | 10370 | macros/latex/base/ltfsscmp.dtx +2024/10/31 | 1034391 | macros/generic/markdown/markdown.dtx +2024/10/31 | 102 | macros/latex-dev/base/ltmarks-code.tex +2024/10/31 | 102 | macros/latex-dev/base/lthooks-code.tex 2024/10/31 | 102 | macros/latex/base/ltmarks-code.tex 2024/10/31 | 102 | macros/latex/base/lthooks-code.tex +2024/10/31 | 10247 | macros/latex-dev/base/webcomp.err 2024/10/31 | 10247 | macros/latex/base/webcomp.err +2024/10/31 | 10199 | macros/latex/required/amsmath/amsopn.dtx +2024/10/31 | 10199 | macros/latex-dev/required/amsmath/amsopn.dtx +2024/10/31 | 10169 | macros/latex-dev/base/ltthm.dtx 2024/10/31 | 10169 | macros/latex/base/ltthm.dtx +2024/10/31 | 10072 | macros/latex-dev/base/format.ins 2024/10/31 | 10072 | macros/latex/base/format.ins +2024/10/31 | 10042 | macros/generic/markdown/examples/optex.tex 2024/10/30 | 998 | info/drawing-with-metapost/src/rec-general-tree-deviate.mp 2024/10/30 | 993 | info/drawing-with-metapost/src/curves-limacon-simple.mp 2024/10/30 | 98 | macros/latex/contrib/minted/DEPENDS.txt @@ -665,7 +1871,6 @@ 2024/10/30 | 6832 | info/drawing-with-metapost/src/pics-border-dashed.pdf 2024/10/30 | 6816 | info/drawing-with-metapost/src/color-brexit-map.mp 2024/10/30 | 680 | info/drawing-with-metapost/src/color-grey-shadows.mp -2024/10/30 | 679640 | systems/texlive/tlnet/archive/easybook.doc.r72700.tar.xz 2024/10/30 | 678 | info/drawing-with-metapost/src/trad-greek-homer.mp 2024/10/30 | 673 | info/drawing-with-metapost/src/func-maurer-rose.mp 2024/10/30 | 6717 | info/drawing-with-metapost/src/dwmpcode.sty @@ -938,11 +2143,9 @@ 2024/10/30 | 2041 | info/drawing-with-metapost/src/pens-besides.mp 2024/10/30 | 20334 | info/drawing-with-metapost/src/paths-triangles.pdf 2024/10/30 | 20280 | macros/latex/contrib/proflycee/tex/ProfLycee.sty -2024/10/30 | 20260 | systems/texlive/tlnet/archive/easybook.r72700.tar.xz 2024/10/30 | 20257 | info/drawing-with-metapost/src/trad-utf8.pdf 2024/10/30 | 2021 | info/drawing-with-metapost/src/geometry-circumcircle.mp 2024/10/30 | 20210 | info/drawing-with-metapost/src/paths-schlafli-polygons.pdf -2024/10/30 | 20144 | systems/texlive/tlnet/archive/easybook.source.r72700.tar.xz 2024/10/30 | 20139 | macros/latex/contrib/beamer-contrib/themes/moloch/LICENSE 2024/10/30 | 2012 | info/drawing-with-metapost/src/tufte-snow.mp 2024/10/30 | 200471 | info/drawing-with-metapost/src/rec-dragon-golden.pdf @@ -957,7 +2160,6 @@ 2024/10/30 | 19571046 | info/drawing-with-metapost.zip 2024/10/30 | 194916 | macros/luatex/latex/luamml.zip 2024/10/30 | 19444 | macros/luatex/latex/letgut/doc/exemple-nouveautes.pdf -2024/10/30 | 1941896 | systems/texlive/tlnet/archive/tutodoc.doc.r72696.tar.xz 2024/10/30 | 19395 | macros/latex/contrib/hyperref/hyperref-linktarget.dtx 2024/10/30 | 19329 | info/drawing-with-metapost/src/geometry-intersection-algorithm.pdf 2024/10/30 | 1929 | macros/latex/contrib/hyperref/manifest.txt @@ -1178,7 +2380,6 @@ 2024/10/30 | 1085 | info/drawing-with-metapost/src/random-qed.mp 2024/10/30 | 10845 | info/drawing-with-metapost/src/tufte-snow.pdf 2024/10/30 | 108183 | info/drawing-with-metapost/src/illusions-fraser-spiral.pdf -2024/10/30 | 10800 | systems/texlive/tlnet/archive/tutodoc.r72696.tar.xz 2024/10/30 | 1079 | info/drawing-with-metapost/src/random-freehand-through.mp 2024/10/30 | 107831 | info/drawing-with-metapost/src/pairs-random-selection.pdf 2024/10/30 | 1076 | info/drawing-with-metapost/src/cd-tikzcd-example.mp @@ -1280,8 +2481,6 @@ 2024/10/28 | 531736 | graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.pdf 2024/10/28 | 508 | macros/latex/contrib/bmstu-iu8/README.md 2024/10/28 | 46511 | graphics/pstricks/contrib/pst-optic/doc/pst-optic-doc.tex -2024/10/28 | 443584 | macros/latex/contrib/jsonparse.zip -2024/10/28 | 437147 | macros/latex/contrib/jsonparse/jsonparse-doc.pdf 2024/10/28 | 422 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/IU8-21-math.sty 2024/10/28 | 4175 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/IU8-02-construction.sty 2024/10/28 | 4074 | macros/latex/contrib/easyfloats/doc/content/x3_other-packages.tex @@ -1289,13 +2488,11 @@ 2024/10/28 | 4043 | macros/latex/contrib/easyfloats/doc/easyfloats.bib 2024/10/28 | 400 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/DEPENDS.txt 2024/10/28 | 393717 | install/macros/latex/contrib/pdfpages.tds.zip -2024/10/28 | 38250 | macros/latex/contrib/jsonparse/jsonparse.sty 2024/10/28 | 363159 | macros/latex/contrib/pdfpages.zip 2024/10/28 | 3560 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/IU8-04-section-numbering.sty 2024/10/28 | 353458 | graphics/pstricks/contrib/pst-optic.zip 2024/10/28 | 3499 | macros/latex/contrib/easyfloats/doc/content/s6_changelog.tex 2024/10/28 | 34532 | systems/texlive/tlnet/archive/tugboat-plain.r72675.tar.xz -2024/10/28 | 31398 | macros/latex/contrib/jsonparse/jsonparse-doc.tex 2024/10/28 | 30894 | macros/latex/contrib/pdfpages/dummy.pdf 2024/10/28 | 302693 | macros/latex/contrib/pdfpages/pdfpages.pdf 2024/10/28 | 2985 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/IU8-07-footnotes.sty @@ -1313,7 +2510,6 @@ 2024/10/28 | 179934 | macros/latex/contrib/pdfpages/pdfpages.dtx 2024/10/28 | 177191 | macros/latex/contrib/bmstu-iu8/bmstu-example.pdf 2024/10/28 | 1752 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/IU8-13-contents.sty -2024/10/28 | 1741 | macros/latex/contrib/jsonparse/README.md 2024/10/28 | 1719 | macros/latex/contrib/bmstu-iu8/bmstu-iu8/styles/IU8-12-abstract.sty 2024/10/28 | 1654 | macros/latex/contrib/easyfloats/doc/content/x2_used-packages.tex 2024/10/28 | 1634400 | systems/texlive/tlnet/archive/kpfonts.doc.r72680.tar.xz @@ -1472,7 +2668,6 @@ 2024/10/27 | 1044184 | systems/texlive/tlnet/archive/prooftrees.doc.r72665.tar.xz 2024/10/26 | 987 | support/texlab/crates/references/src/label.rs 2024/10/26 | 987 | support/texlab/crates/commands/src/change_env.rs -2024/10/26 | 9868 | systems/texlive/tlnet/archive/algxpar.r72657.tar.xz 2024/10/26 | 98129 | systems/win32/miktex/tm/packages/pgfornament-han.tar.lzma 2024/10/26 | 9748 | graphics/metapost/contrib/macros/mpchess/metapost/mpchess-pgn.mp 2024/10/26 | 967 | support/texlab/crates/completion/src/util.rs @@ -1480,7 +2675,6 @@ 2024/10/26 | 949 | support/texlab/crates/citeproc/src/lib.rs 2024/10/26 | 9434 | systems/win32/miktex/tm/packages/algxpar.tar.lzma 2024/10/26 | 9351 | support/texlab/crates/symbols/src/document/tex.rs -2024/10/26 | 93316 | systems/texlive/tlnet/archive/pdflatexpicscale.doc.r72650.tar.xz 2024/10/26 | 930 | support/texlab/crates/base-db/src/util/expand.rs 2024/10/26 | 927 | support/texlab/crates/texlab/src/features/symbols.rs 2024/10/26 | 9271 | support/texlab/crates/base-db/src/deps/graph.rs @@ -1506,7 +2700,6 @@ 2024/10/26 | 847 | macros/latex/contrib/iaria-lite/iaria-lite.ins 2024/10/26 | 846 | macros/latex/contrib/cs-techrep/cs-techrep.ins 2024/10/26 | 84555 | systems/win32/miktex/tm/packages/randintlist__doc.tar.lzma -2024/10/26 | 830152 | systems/texlive/tlnet/archive/algxpar.doc.r72657.tar.xz 2024/10/26 | 829974 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma 2024/10/26 | 829884 | systems/win32/miktex/tm/packages/next/files.csv.lzma 2024/10/26 | 829128 | systems/win32/miktex/tm/packages/files.csv.lzma @@ -1521,7 +2714,6 @@ 2024/10/26 | 812896 | systems/win32/miktex/tm/packages/mp-geom2d__source.tar.lzma 2024/10/26 | 806 | support/texlab/crates/highlights/src/label.rs 2024/10/26 | 804 | support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs -2024/10/26 | 791604 | systems/texlive/tlnet/archive/beamertheme-mirage.doc.r72656.tar.xz 2024/10/26 | 785385 | systems/win32/miktex/tm/packages/beamertheme-mirage__doc.tar.lzma 2024/10/26 | 78338 | systems/win32/miktex/tm/packages/make4ht.tar.lzma 2024/10/26 | 78326 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma @@ -1543,7 +2735,6 @@ 2024/10/26 | 73405 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma 2024/10/26 | 73399 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma 2024/10/26 | 7299 | systems/win32/miktex/tm/packages/highlightx__source.tar.lzma -2024/10/26 | 7288 | systems/texlive/tlnet/archive/collection-latexextra.r72656.tar.xz 2024/10/26 | 725 | support/texlab/crates/hover/src/package.rs 2024/10/26 | 72597 | systems/win32/miktex/tm/packages/commalists-tools__doc.tar.lzma 2024/10/26 | 7202 | support/texlab/crates/diagnostics/src/tests.rs @@ -1590,7 +2781,6 @@ 2024/10/26 | 602823 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma 2024/10/26 | 59213 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma 2024/10/26 | 5910 | support/texlab/crates/base-db/src/util/label.rs -2024/10/26 | 5900 | systems/texlive/tlnet/archive/naive-ebnf.source.r72652.tar.xz 2024/10/26 | 58964 | systems/win32/miktex/tm/packages/next/miktex-xml2pmx-bin-x64.tar.lzma 2024/10/26 | 584 | support/texlab/crates/base-db/src/lib.rs 2024/10/26 | 58486 | support/texlab/crates/base-db/src/data.rs @@ -1624,14 +2814,12 @@ 2024/10/26 | 51244 | support/texlab/crates/completion/src/tests.rs 2024/10/26 | 50950 | graphics/metapost/contrib/macros/mpchess/doc/mpchess-doc-fr.tex 2024/10/26 | 509192 | systems/win32/miktex/tm/packages/naive-ebnf__doc.tar.lzma -2024/10/26 | 506872 | systems/texlive/tlnet/archive/naive-ebnf.doc.r72652.tar.xz 2024/10/26 | 505 | support/texlab/crates/texlab/src/features/highlight.rs 2024/10/26 | 50312 | systems/win32/miktex/tm/packages/easybook__source.tar.lzma 2024/10/26 | 500 | macros/latex/contrib/iaria-lite/COPYING 2024/10/26 | 500 | macros/latex/contrib/iaria/COPYING 2024/10/26 | 500 | macros/latex/contrib/cs-techrep/COPYING 2024/10/26 | 499518 | systems/win32/miktex/tm/packages/next/miktex-ptex-bin-x64.tar.lzma -2024/10/26 | 4992 | systems/texlive/tlnet/archive/pdflatexpicscale.r72650.tar.xz 2024/10/26 | 49726 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma 2024/10/26 | 495 | support/texlab/crates/hover/Cargo.toml 2024/10/26 | 491879 | systems/win32/miktex/tm/packages/sshrc-insight__doc.tar.lzma @@ -1688,7 +2876,6 @@ 2024/10/26 | 3914 | systems/win32/miktex/tm/packages/sshrc-insight.tar.lzma 2024/10/26 | 3904 | support/texlab/crates/diagnostics/src/chktex.rs 2024/10/26 | 389 | support/texlab/crates/commands/src/lib.rs -2024/10/26 | 3868 | systems/texlive/tlnet/archive/mathfixs.r72653.tar.xz 2024/10/26 | 3838 | support/texlab/README.md 2024/10/26 | 38292 | graphics/metapost/contrib/macros/mpchess/fonts/mpchessfont.ttf 2024/10/26 | 3807 | support/texlab/crates/references/src/tests.rs @@ -1708,7 +2895,6 @@ 2024/10/26 | 364 | macros/latex/contrib/iaria-lite/docstrip.cfg 2024/10/26 | 364 | macros/latex/contrib/cs-techrep/docstrip.cfg 2024/10/26 | 3636 | support/texlab/crates/diagnostics/src/grammar/tex.rs -2024/10/26 | 357944 | systems/texlive/tlnet/archive/mathfixs.doc.r72653.tar.xz 2024/10/26 | 357730 | systems/win32/miktex/tm/packages/mathfixs__doc.tar.lzma 2024/10/26 | 3576 | support/texlab/crates/rename/src/tests.rs 2024/10/26 | 35610 | systems/win32/miktex/tm/packages/profmaquette.tar.lzma @@ -1718,7 +2904,6 @@ 2024/10/26 | 3525 | support/texlab/crates/inlay-hints/src/tests.rs 2024/10/26 | 352157 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma 2024/10/26 | 35149 | support/texlab/LICENSE -2024/10/26 | 3507812 | systems/texlive/tlnet/archive/simpleicons.r72659.tar.xz 2024/10/26 | 348 | support/texlab/crates/completion-data/Cargo.toml 2024/10/26 | 3486 | support/texlab/crates/bibfmt/src/tests.rs 2024/10/26 | 3468 | support/texlab/crates/base-db/src/deps/discover.rs @@ -1755,7 +2940,6 @@ 2024/10/26 | 286152 | systems/win32/miktex/tm/packages/proflycee__source.tar.lzma 2024/10/26 | 2844337 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma 2024/10/26 | 2826 | systems/win32/miktex/tm/packages/dashrulex__source.tar.lzma -2024/10/26 | 2796 | systems/texlive/tlnet/archive/cora-macs.r72655.tar.xz 2024/10/26 | 2781 | support/texlab/crates/base-db/src/semantics/bib.rs 2024/10/26 | 2741974 | graphics/metapost/contrib/macros/mpchess.zip 2024/10/26 | 2736 | support/texlab/crates/definition/src/tests.rs @@ -1773,7 +2957,6 @@ 2024/10/26 | 264 | support/texlab/crates/links/src/lib.rs 2024/10/26 | 26443 | graphics/metapost/contrib/macros/mpchess/metapost/mpchess-chessboard.mp 2024/10/26 | 264386 | systems/win32/miktex/tm/packages/xcharter-math.tar.lzma -2024/10/26 | 264020 | systems/texlive/tlnet/archive/xcharter-math.r72658.tar.xz 2024/10/26 | 26339 | support/texlab/texlab.pdf 2024/10/26 | 262743 | systems/win32/miktex/tm/packages/huawei.tar.lzma 2024/10/26 | 2610 | support/texlab/crates/symbols/src/types.rs @@ -1789,8 +2972,6 @@ 2024/10/26 | 256187 | macros/latex/contrib/iaria.zip 2024/10/26 | 2561490 | systems/win32/miktex/tm/packages/simpleicons__doc.tar.lzma 2024/10/26 | 256049 | macros/latex/contrib/iaria-lite.zip -2024/10/26 | 255936 | systems/texlive/tlnet/archive/concmath-otf.r72660.tar.xz -2024/10/26 | 2552772 | systems/texlive/tlnet/archive/simpleicons.doc.r72659.tar.xz 2024/10/26 | 2504 | support/texlab/crates/diagnostics/src/labels.rs 2024/10/26 | 249333 | systems/win32/miktex/tm/packages/next/miktex-hitex-bin-x64.tar.lzma 2024/10/26 | 2492 | support/texlab/crates/completion/src/providers/argument.rs @@ -1798,10 +2979,7 @@ 2024/10/26 | 2467 | support/texlab/crates/distro/src/miktex.rs 2024/10/26 | 2467 | support/texlab/crates/base-db/src/semantics/auxiliary.rs 2024/10/26 | 2467287 | systems/win32/miktex/tm/packages/paracol__doc.tar.lzma -2024/10/26 | 2466756 | systems/texlive/tlnet/archive/paracol.doc.r72651.tar.xz 2024/10/26 | 245826 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma -2024/10/26 | 2448 | systems/texlive/tlnet/archive/naive-ebnf.r72652.tar.xz -2024/10/26 | 2428 | systems/texlive/tlnet/archive/beamertheme-mirage.r72656.tar.xz 2024/10/26 | 2426682 | systems/win32/miktex/tm/packages/nicematrix__doc.tar.lzma 2024/10/26 | 24135 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma 2024/10/26 | 2411 | support/texlab/crates/texlab/src/server/dispatch.rs @@ -1841,7 +3019,6 @@ 2024/10/26 | 2125 | support/texlab/crates/bibtex-utils/src/field/author.rs 2024/10/26 | 2118 | graphics/pgf/contrib/prooftrees/README.md 2024/10/26 | 211879 | systems/win32/miktex/tm/packages/paracol__source.tar.lzma -2024/10/26 | 211664 | systems/texlive/tlnet/archive/paracol.source.r72651.tar.xz 2024/10/26 | 2112 | systems/win32/miktex/tm/packages/sunpath.tar.lzma 2024/10/26 | 2106 | support/texlab/crates/completion/src/providers/color.rs 2024/10/26 | 2082 | macros/latex/contrib/iaria-lite/README @@ -1861,12 +3038,9 @@ 2024/10/26 | 196 | support/texlab/crates/bibtex-utils/src/field.rs 2024/10/26 | 19643 | systems/win32/miktex/tm/packages/paracol.tar.lzma 2024/10/26 | 1955 | support/texlab/crates/references/src/command.rs -2024/10/26 | 1951916 | systems/texlive/tlnet/archive/xcharter-math.doc.r72658.tar.xz 2024/10/26 | 1946965 | systems/win32/miktex/tm/packages/xcharter-math__doc.tar.lzma -2024/10/26 | 19428 | systems/texlive/tlnet/archive/paracol.r72651.tar.xz 2024/10/26 | 1940 | systems/win32/miktex/tm/packages/commalists-tools.tar.lzma 2024/10/26 | 1914 | support/texlab/crates/texlab/Cargo.toml -2024/10/26 | 1902976 | systems/texlive/tlnet/archive/concmath-otf.doc.r72660.tar.xz 2024/10/26 | 1899960 | systems/win32/miktex/tm/packages/concmath-otf__doc.tar.lzma 2024/10/26 | 189954 | macros/latex/contrib/cs-techrep/cs-techrep.pdf 2024/10/26 | 1881 | support/texlab/crates/commands/src/clean.rs @@ -1874,7 +3048,6 @@ 2024/10/26 | 18536 | systems/win32/miktex/tm/packages/keytheorems.tar.lzma 2024/10/26 | 18525 | systems/win32/miktex/tm/packages/mathastext.tar.lzma 2024/10/26 | 182764 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma -2024/10/26 | 182512 | systems/texlive/tlnet/archive/cora-macs.doc.r72655.tar.xz 2024/10/26 | 181 | support/texlab/CONTRIBUTING.md 2024/10/26 | 181669 | systems/win32/miktex/tm/packages/cora-macs__doc.tar.lzma 2024/10/26 | 1814931 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma @@ -1882,7 +3055,6 @@ 2024/10/26 | 1814030 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma 2024/10/26 | 1810 | macros/latex/contrib/cs-techrep/README 2024/10/26 | 180923 | systems/win32/miktex/tm/packages/l3kernel.tar.lzma -2024/10/26 | 1804 | systems/texlive/tlnet/archive/collection-mathscience.r72655.tar.xz 2024/10/26 | 17 | support/texlab/crates/test-utils/src/lib.rs 2024/10/26 | 1781 | support/texlab/crates/syntax/src/latex/kind.rs 2024/10/26 | 1777 | support/texlab/crates/inlay-hints/src/label.rs @@ -1897,7 +3069,6 @@ 2024/10/26 | 173923 | macros/latex/contrib/iaria-lite/iaria-lite.pdf 2024/10/26 | 1732 | support/texlab/crates/texlab/src/util/line_index_ext.rs 2024/10/26 | 1729 | support/texlab/crates/commands/src/dep_graph.rs -2024/10/26 | 17296 | systems/texlive/tlnet/archive/mathfixs.source.r72653.tar.xz 2024/10/26 | 1698 | support/texlab/crates/folding/src/tests.rs 2024/10/26 | 169854 | support/texlab/crates/parser/src/bibtex/tests.rs 2024/10/26 | 16970 | systems/win32/miktex/tm/packages/llncs.tar.lzma @@ -2002,103 +3173,3 @@ 2024/10/26 | 1033 | support/texlab/crates/completion/benches/bench_main.rs 2024/10/26 | 1025 | support/texlab/crates/completion/src/util/matchers.rs 2024/10/26 | 102404 | graphics/pgf/contrib/prooftrees/prooftrees.tex -2024/10/25 | 963513 | macros/latex/contrib/huawei.zip -2024/10/25 | 9607 | support/TeX4ht/source/tex4ht-mathjax.tex -2024/10/25 | 920 | support/pdflatexpicscale/README -2024/10/25 | 840235 | macros/latex/contrib/algxpar.zip -2024/10/25 | 7997 | macros/latex/contrib/cora-macs/cora-macs.sty -2024/10/25 | 784 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonethree.tfm -2024/10/25 | 74006 | macros/latex/contrib/mathfixs/mathfixs.dtx -2024/10/25 | 735500 | macros/latex/contrib/huawei/huawei.pdf -2024/10/25 | 7098 | fonts/xcharter-math/xcharter-otf.sty -2024/10/25 | 691 | macros/latex/contrib/huawei/DEPENDS.txt -2024/10/25 | 6388813 | fonts/simpleicons.zip -2024/10/25 | 592942 | macros/latex/contrib/naive-ebnf/naive-ebnf.pdf -2024/10/25 | 5916 | macros/latex/contrib/cora-macs/cora-macs-doc.tex -2024/10/25 | 560302 | macros/latex/contrib/naive-ebnf.zip -2024/10/25 | 5589 | fonts/concmath-otf/concmath-otf.sty -2024/10/25 | 5295 | fonts/concmath-otf/README.md -2024/10/25 | 5238 | fonts/xcharter-math/README.md -2024/10/25 | 3937 | fonts/simpleicons/enc/simpleiconsone.enc -2024/10/25 | 3925 | fonts/simpleicons/enc/simpleiconsfive.enc -2024/10/25 | 383256 | fonts/concmath-otf/Concrete-Math.otf -2024/10/25 | 383074 | macros/latex/contrib/mathfixs/mathfixs.pdf -2024/10/25 | 3791 | fonts/simpleicons/enc/simpleiconsthree.enc -2024/10/25 | 374721 | macros/latex/contrib/mathfixs.zip -2024/10/25 | 3726 | fonts/simpleicons/enc/simpleiconsoneone.enc -2024/10/25 | 3698 | fonts/simpleicons/enc/simpleiconsonezero.enc -2024/10/25 | 3682 | fonts/simpleicons/enc/simpleiconsseven.enc -2024/10/25 | 365552 | fonts/xcharter-math/XCharter-Math.otf -2024/10/25 | 3640 | fonts/simpleicons/enc/simpleiconstwo.enc -2024/10/25 | 36315 | macros/latex/contrib/huawei/huawei.dtx -2024/10/25 | 3542 | fonts/simpleicons/enc/simpleiconsnine.enc -2024/10/25 | 3517 | fonts/simpleicons/enc/simpleiconsfour.enc -2024/10/25 | 3514 | fonts/simpleicons/enc/simpleiconseight.enc -2024/10/25 | 3481 | fonts/simpleicons/enc/simpleiconsonetwo.enc -2024/10/25 | 3388 | fonts/simpleicons/enc/simpleiconssix.enc -2024/10/25 | 310109 | fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex -2024/10/25 | 302739 | fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex -2024/10/25 | 2953 | fonts/simpleicons/enc/simpleiconsonethree.enc -2024/10/25 | 2814 | support/pdflatexpicscale/testprinter.ps -2024/10/25 | 279 | fonts/simpleicons/tex/usimpleiconsonethree.fd -2024/10/25 | 274 | fonts/simpleicons/tex/usimpleiconsonezero.fd -2024/10/25 | 27393 | fonts/xcharter-math/XCharter-Math.ltx -2024/10/25 | 269 | fonts/simpleicons/tex/usimpleiconsonetwo.fd -2024/10/25 | 269 | fonts/simpleicons/tex/usimpleiconsoneone.fd -2024/10/25 | 264 | fonts/simpleicons/tex/usimpleiconsthree.fd -2024/10/25 | 264 | fonts/simpleicons/tex/usimpleiconsseven.fd -2024/10/25 | 264 | fonts/simpleicons/tex/usimpleiconseight.fd -2024/10/25 | 2640 | macros/latex/contrib/naive-ebnf/naive-ebnf.ins -2024/10/25 | 2626 | macros/latex/contrib/huawei/huawei.ins -2024/10/25 | 259 | fonts/simpleicons/tex/usimpleiconsnine.fd -2024/10/25 | 259 | fonts/simpleicons/tex/usimpleiconsfour.fd -2024/10/25 | 259 | fonts/simpleicons/tex/usimpleiconsfive.fd -2024/10/25 | 254 | fonts/simpleicons/tex/usimpleiconstwo.fd -2024/10/25 | 254 | fonts/simpleicons/tex/usimpleiconssix.fd -2024/10/25 | 254 | fonts/simpleicons/tex/usimpleiconsone.fd -2024/10/25 | 2541375 | fonts/simpleicons/doc/simpleicons.pdf -2024/10/25 | 253724 | macros/latex/contrib/huawei/huawei-cover-picture.pdf -2024/10/25 | 2463616 | fonts/simpleicons/opentype/SimpleIcons.otf -2024/10/25 | 23480 | fonts/concmath-otf/concmath-otf.ltx -2024/10/25 | 2327131 | fonts/xcharter-math.zip -2024/10/25 | 2275557 | fonts/concmath-otf.zip -2024/10/25 | 2268648 | fonts/simpleicons/type1/SimpleIcons.pfb -2024/10/25 | 208 | macros/latex/contrib/naive-ebnf/DEPENDS.txt -2024/10/25 | 204086 | fonts/xcharter-math/XCharter-Math.pdf -2024/10/25 | 184478 | macros/latex/contrib/cora-macs.zip -2024/10/25 | 184212 | fonts/simpleicons/doc/bindings.tex -2024/10/25 | 183263 | macros/latex/contrib/cora-macs/cora-macs-doc.pdf -2024/10/25 | 1826273 | fonts/xcharter-math/unimath-xcharter.pdf -2024/10/25 | 1813 | fonts/simpleicons/doc/simpleicons.tex -2024/10/25 | 1810711 | fonts/concmath-otf/unimath-concrete.pdf -2024/10/25 | 1745 | fonts/simpleicons/tex/simpleicons.sty -2024/10/25 | 17127 | fonts/xcharter-math/unimath-xcharter.ltx -2024/10/25 | 17084 | macros/latex/contrib/naive-ebnf/naive-ebnf.dtx -2024/10/25 | 16886 | fonts/concmath-otf/unimath-concrete.ltx -2024/10/25 | 167878 | fonts/concmath-otf/concmath-otf.pdf -2024/10/25 | 1652 | macros/latex/contrib/huawei/README.md -2024/10/25 | 1522419 | macros/latex/contrib/beamer-contrib/themes/beamertheme-mirage.zip -2024/10/25 | 15161 | support/pdflatexpicscale/pdflatexpicscale.tex -2024/10/25 | 1493 | macros/latex/contrib/naive-ebnf/README.md -2024/10/25 | 148324 | fonts/concmath-otf/Concrete-Math-Bold.otf -2024/10/25 | 1476 | fonts/simpleicons/map/simpleicons.map -2024/10/25 | 145720 | fonts/xcharter-math/XCharter-Math-Bold.otf -2024/10/25 | 14448 | support/pdflatexpicscale/pdflatexpicscale.pl -2024/10/25 | 127589 | support/pdflatexpicscale/pdflatexpicscale.pdf -2024/10/25 | 1236 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsnine.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconstwo.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsthree.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconssix.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsseven.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonezero.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsone.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsoneone.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfour.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfive.tfm -2024/10/25 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconseight.tfm -2024/10/25 | 1207 | fonts/simpleicons/README.md -2024/10/25 | 1192 | macros/latex/contrib/mathfixs/README.txt -2024/10/25 | 1083 | macros/latex/contrib/naive-ebnf/LICENSE.txt -2024/10/25 | 1083 | macros/latex/contrib/huawei/LICENSE.txt -2024/10/25 | 101277 | support/pdflatexpicscale.zip diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib index fcd3238654..f58ff894d1 100644 --- a/biblio/ctan-bibdata/ctan.bib +++ b/biblio/ctan-bibdata/ctan.bib @@ -1,7 +1,7 @@ %% bib file of all CTAN packages %% (C) Herbert Voß %% -%% created at 31-10-2024, 02:00:02 +%% created at 01-11-2024, 02:00:02 %% %% This file is provided under the terms of the LPPL v1.3 or @@ -1638,7 +1638,7 @@ title = {The \texttt{alltt} package}, subtitle = {Everything in tt font, but obey commands and line endings}, author = {Leslie Lamport and Johannes L. Braams and {The LaTeX Project Team}}, - date = {2024-06-01}, + date = {2024-10-31}, version = {2.0g}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, @@ -3262,8 +3262,8 @@ title = {The \texttt{array} package}, subtitle = {Extending the array and tabular environments}, author = {Frank Mittelbach and {The LaTeX Project Team}}, - date = {2024-06-02}, - version = {2.6c}, + date = {2024-10-31}, + version = {2.6g}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/required/tools}, url = {https://ctan.org/pkg/array}, @@ -3388,7 +3388,7 @@ title = {The \texttt{article} package}, subtitle = {Default class for composing an article}, author = {{The LaTeX Project Team}}, - date = {2024-06-02}, + date = {2024-10-31}, version = {1.4n}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, @@ -9488,7 +9488,7 @@ title = {The \texttt{book} package}, subtitle = {A class for typesetting books}, author = {{The LaTeX Project Team}}, - date = {2024-06-02}, + date = {2024-10-31}, version = {1.4n}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, @@ -13106,7 +13106,7 @@ title = {The \texttt{classes} package}, subtitle = {The source of \LaTeX{}’s standard classes}, author = {{The LaTeX Project Team}}, - date = {2024-06-01}, + date = {2024-10-31}, version = {1.4n}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, @@ -14279,8 +14279,8 @@ title = {The \texttt{color} package}, subtitle = {Colour control for \LaTeX{} documents}, author = {David Carlisle and {The LaTeX Project Team}}, - date = {2024-06-02}, - version = {1.3d}, + date = {2024-10-31}, + version = {1.3e}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/required/graphics}, url = {https://ctan.org/pkg/color}, @@ -19373,8 +19373,8 @@ title = {The \texttt{doc} package}, subtitle = {Format \LaTeX{} documentation}, author = {Frank Mittelbach and {The LaTeX Project Team}}, - date = {2024-06-01}, - version = {3.0p}, + date = {2024-10-31}, + version = {3.0q}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, url = {https://ctan.org/pkg/doc}, @@ -21024,8 +21024,8 @@ title = {The \texttt{easybook} package}, subtitle = {Easily typesetting Chinese theses or books}, author = {Qu Yi}, - date = {2024-10-28}, - version = {2024eu}, + date = {2024-10-31}, + version = {2024ex}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/easybook}, url = {https://ctan.org/pkg/easybook}, @@ -22791,8 +22791,8 @@ title = {The \texttt{eolang} package}, subtitle = {Formulas and graphs for the EO programming language}, author = {Yegor Bugayenko}, - date = {2024-02-14}, - version = {0.18.1}, + date = {2024-10-31}, + version = {0.18.2}, license = {mit}, mirror = {https://mirror.ctan.org/macros/latex/contrib/eolang}, url = {https://ctan.org/pkg/eolang}, @@ -30695,7 +30695,7 @@ title = {The \texttt{graphics} package}, subtitle = {Standard \LaTeX{} graphics}, author = {David Carlisle and {The LaTeX Project Team}}, - date = {2024-06-02}, + date = {2024-10-31}, version = {1.4g}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/required/graphics}, @@ -38435,8 +38435,8 @@ title = {The \texttt{latex-base} package}, subtitle = {Base sources of \LaTeX{}}, author = {{The LaTeX Project Team} and Frank Mittelbach}, - date = {2024-06-26}, - version = {2024-06-01 PL2}, + date = {2024-10-31}, + version = {}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, url = {https://ctan.org/pkg/latex-base}, @@ -38558,8 +38558,8 @@ title = {The \texttt{latex-doc} package}, subtitle = {Documentation supplied as part of the \LaTeX{} distribution}, author = {{The LaTeX Project Team}}, - date = {2024-06-26}, - version = {2024-06-01 PL2}, + date = {2024-10-31}, + version = {}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, url = {https://ctan.org/pkg/latex-doc}, @@ -38675,7 +38675,7 @@ title = {The \texttt{latex-graphics} package}, subtitle = {The \LaTeX{} standard graphics bundle}, author = {{The LaTeX Project Team}}, - date = {2024-06-02}, + date = {2024-10-31}, version = {}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/required/graphics}, @@ -38879,8 +38879,8 @@ title = {The \texttt{latex-tools} package}, subtitle = {The \LaTeX{} standard tools bundle}, author = {{The LaTeX Project Team}}, - date = {2024-06-14}, - version = {2024-06-01a}, + date = {2024-10-31}, + version = {}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/required/tools}, url = {https://ctan.org/pkg/latex-tools}, @@ -38961,8 +38961,8 @@ title = {The \texttt{latex} package}, subtitle = {A \TeX{} macro package that defines \LaTeX{}}, author = {{The LaTeX Project Team} and Leslie Lamport}, - date = {2024-06-26}, - version = {2024-06-01 PL2}, + date = {2024-10-31}, + version = {}, license = {lppl1.3c}, url = {https://ctan.org/pkg/latex}, } @@ -39466,7 +39466,7 @@ title = {The \texttt{latexrelease} package}, subtitle = {LaTeX release emulation}, author = {{The LaTeX Project Team}}, - date = {2024-01-15}, + date = {2024-10-31}, version = {1.0p}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, @@ -39987,7 +39987,7 @@ title = {The \texttt{letter} package}, subtitle = {The standard \LaTeX{}2e letter document class}, author = {Leslie Lamport and Frank Mittelbach and Rainer Schöpf and {The LaTeX Project Team}}, - date = {2022-06-08}, + date = {2024-10-31}, version = {1.3c}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, @@ -40042,7 +40042,7 @@ title = {The \texttt{letterswitharrows} package}, subtitle = {Draw arrows over math letters}, author = {Maximilian Teegen}, - date = {2021-07-19}, + date = {2024-10-31}, version = {}, license = {lppl1.3}, mirror = {https://mirror.ctan.org/macros/latex/contrib/letterswitharrows}, @@ -41488,8 +41488,8 @@ title = {The \texttt{longtable} package}, subtitle = {Allow tables to flow over page boundaries}, author = {David Carlisle and David Kastrup and {The LaTeX Project Team}}, - date = {2024-06-02}, - version = {4.20}, + date = {2024-10-31}, + version = {4.22}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/required/tools}, url = {https://ctan.org/pkg/longtable}, @@ -48234,8 +48234,8 @@ title = {The \texttt{multicol} package}, subtitle = {Intermix single and multiple columns}, author = {Frank Mittelbach and {The LaTeX Project Team}}, - date = {2024-06-02}, - version = {1.9h}, + date = {2024-10-31}, + version = {1.9i}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/required/tools}, url = {https://ctan.org/pkg/multicol}, @@ -54836,8 +54836,8 @@ title = {The \texttt{PixelArtTikz} package}, subtitle = {Work with PixelArts, with TikZ}, author = {Cédric Pierquet}, - date = {2024-04-16}, - version = {0.1.4}, + date = {2024-10-31}, + version = {0.1.5}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/graphics/pgf/contrib/pixelarttikz}, url = {https://ctan.org/pkg/pixelarttikz}, @@ -56386,8 +56386,8 @@ title = {The \texttt{ProfLycee} package}, subtitle = {A \LaTeX{} package for French maths teachers in high school}, author = {Cédric Pierquet}, - date = {2024-10-24}, - version = {3.10e}, + date = {2024-10-31}, + version = {3.10f}, license = {lppl1.3c,cc0,cc-by-sa-3}, mirror = {https://mirror.ctan.org/macros/latex/contrib/proflycee}, url = {https://ctan.org/pkg/proflycee}, @@ -60534,7 +60534,7 @@ title = {The \texttt{report} package}, subtitle = {Typeset a multi-chapter report}, author = {{The LaTeX Project Team}}, - date = {2024-06-02}, + date = {2024-10-31}, version = {1.4n}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, @@ -61498,8 +61498,8 @@ title = {The \texttt{rub-kunstgeschichte} package}, subtitle = {A class for the art history institute at Ruhr University Bochum}, author = {Joran Schneyer}, - date = {2024-09-06}, - version = {0.2.0}, + date = {2024-10-31}, + version = {0.3.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/rub-kunstgeschichte}, url = {https://ctan.org/pkg/rub-kunstgeschichte}, @@ -64047,8 +64047,8 @@ title = {The \texttt{shortvrb} package}, subtitle = {Abbreviated verbatim commands}, author = {{The LaTeX Project Team}}, - date = {2024-06-02}, - version = {3.0p}, + date = {2024-10-31}, + version = {3.0q}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/base}, url = {https://ctan.org/pkg/shortvrb}, @@ -65826,8 +65826,8 @@ title = {The \texttt{spbmark} package}, subtitle = {Customize superscripts and subscripts}, author = {Qu Yi}, - date = {2024-10-30}, - version = {1.46s}, + date = {2024-10-31}, + version = {1.46t}, license = {cc-by-4}, mirror = {https://mirror.ctan.org/macros/latex/contrib/spbmark}, url = {https://ctan.org/pkg/spbmark}, @@ -71023,7 +71023,7 @@ title = {The \texttt{theorem} package}, subtitle = {Manipulate theorem environments}, author = {Frank Mittelbach and {The LaTeX Project Team}}, - date = {2023-11-01}, + date = {2024-10-31}, version = {2.2c}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/required/tools}, @@ -74320,8 +74320,8 @@ title = {The \texttt{tutodoc} package}, subtitle = {Typeset tutorial-like documentations}, author = {Christophe Bal}, - date = {2024-10-29}, - version = {1.6.1}, + date = {2024-10-31}, + version = {1.6.2}, license = {gpl3}, mirror = {https://mirror.ctan.org/macros/latex/contrib/tutodoc}, url = {https://ctan.org/pkg/tutodoc}, diff --git a/fonts/newcomputermodern/README b/fonts/newcomputermodern/README index 353a80f6d8..cc68608d5c 100644 --- a/fonts/newcomputermodern/README +++ b/fonts/newcomputermodern/README @@ -1,7 +1,7 @@ New Computer Modern Fonts - (Package version 6.0.0, GustFLv1 or later) + (Package version 7.0.0, GustFLv1 or later) Antonis Tsolomitis Samos, Greece, 2019--2024 @@ -26,12 +26,20 @@ or OR +\usepackage[sansdefault]{fontsetup} (loads the Regular Sans weight) +or +\usepackage[sansdefault]{newcomputermodern} (loads the Regular Sans weight) + + + +OR + \usepackage{fontspec} \setmainfont{NewCM10-Book} \setsansfont{NewCMSans10-Book} \setmonofont{NewCMMono10-Book} -and similarly for the Regular weight. +and similarly for the Regular weight or the Sans family. ======================================================================= The fonts contain Latin and accented latin letters and combinations, @@ -47,7 +55,9 @@ Regular/Book 08/10pt and Bold 10t. As of version 6.0.0 a Bold Math font has been added. -The Math fonts (Regular, Book, and Bold) support fully all Unicode blocks +As of version 7.0.0 a Sans Math font has been added. + +The Math fonts (Regular, Book, Bold and Sans) support fully all Unicode blocks of Mathematics providing the widest possible Mathematical coverage. The fonts have their own protrusion settings through the microtype package @@ -105,6 +115,32 @@ xelatex newcm-doc.tex Latest additions/improvements: ------------------------------ +Version 7.0.0 + +Added NewCMSansMath-Regular + +Sans letters used for math variables are a new design +(and not the original with a slant) so they really look as variables! + +NewCM mathbb/symbb symbols in Sans have been reworked to match the Sans design +in both style and wight. + +Same goes for mathcal/symcal letters. + +Math Kerning has been introduced in ALL math fonts to compensate +for bad spacing especially of the index of mathcal/symcal letters. + +Added ss06 and ss07 to be selected for auto +middle beta and theta in Greek. + +The kerning of Greek Oblique block has been greatly improved; "theorem" +statements now look much better. + +testmath-newcm.tex/pdf has been added to the documentation from the AMS bundle +to showcase the new SansMath font. + + + Version 6.0.0 Added Bold Math font diff --git a/fonts/newcomputermodern/doc/mathkern-example.pdf b/fonts/newcomputermodern/doc/mathkern-example.pdf Binary files differnew file mode 100644 index 0000000000..564665901b --- /dev/null +++ b/fonts/newcomputermodern/doc/mathkern-example.pdf diff --git a/fonts/newcomputermodern/doc/mathkern-example.tex b/fonts/newcomputermodern/doc/mathkern-example.tex new file mode 100644 index 0000000000..a3ed1a2076 --- /dev/null +++ b/fonts/newcomputermodern/doc/mathkern-example.tex @@ -0,0 +1,24 @@ +\documentclass{standalone} +\pagestyle{empty} +\usepackage{fontspec} +\usepackage{unicode-math} +\usepackage[olddefault]{fontsetup} +\begin{document} + + + +% \begin{center} +\renewcommand{\arraystretch}{2} + \begin{tabular}{c|c} + Latin Modern & NewCM-Regular\\ \hline +{\setmathfont{latinmodern-math.otf}\Large $F_x$ $Y_x$ $\symscr N_x$ $\symcal J_x$ $\symcal G_x$ $\Gamma_x$ } & {\setmathfont{NewCMMath-Regular.otf}\Large $F_x$ $Y_x$ $\symscr N_x$ $\symcal J_x$ $\symcal G_x$ $\Gamma_x$ } + \end{tabular} +%\end{center} + + + +\end{document} + +\Large +$F_x$ $J_x$ $Y_x$ $\mathcal J_x$ $\mathcal G_x$ $\Gamma_x$ +\end{document} diff --git a/fonts/newcomputermodern/doc/newcm-doc.pdf b/fonts/newcomputermodern/doc/newcm-doc.pdf Binary files differindex aad33a686f..a2102f5b48 100644 --- a/fonts/newcomputermodern/doc/newcm-doc.pdf +++ b/fonts/newcomputermodern/doc/newcm-doc.pdf diff --git a/fonts/newcomputermodern/doc/newcm-doc.tex b/fonts/newcomputermodern/doc/newcm-doc.tex index de5584b201..69ce5eed3c 100644 --- a/fonts/newcomputermodern/doc/newcm-doc.tex +++ b/fonts/newcomputermodern/doc/newcm-doc.tex @@ -8,6 +8,7 @@ \setotherlanguage[variant=polytonic]{greek} \usepackage[hidelinks,pdfa]{hyperref} %\usepackage{xgreek} +\usepackage{pstricks,hvlogos} \usepackage[default,varnothing]{fontsetup} \usepackage{unicodefonttable,graphicx,wrapfig,xcolor,calc} \newfontfamily\lmboldsans{lmsans10-bold.otf} @@ -20,9 +21,11 @@ \newfontfamily\showtiefont[CharacterVariant=5]{NewCM10-Book.otf} \newfontfamily\ipafont[%Renderer = {Harfbuzz}, StylisticSet = {05},ItalicFont=NewCM10-BookItalic]{NewCM10-Book.otf} -% -%%%%%%% Define Bold Math Font for version bold %%%%%%% -\setmathfont{NewCMMath-Bold.otf}[version=bold] +\newfontfamily\middlegreekon[StylisticSet=7]{NewCM10-Book.otf} +\newfontfamily\middlegreekonsans[StylisticSet=6,StylisticSet=7]{NewCMSans10-Book.otf} +\newfontfamily{\mathastext}{NewCMMath-Book.otf} +\newfontfamily{\mathastextnewcm}[StylisticSet=3]{NewCMMath-Book.otf} +% %%%%%%%%%%%%%%%%%%%%%%%%%%%% Devanagari text %%%% \newfontfamily\hinditext[% Script=Devanagari,% @@ -97,14 +100,17 @@ Language=Nepali, \renewcommand{\arraystretch}{1.4} -\title{The New Computer Modern FontFamily\\ version 6.0.0} +\title{The New Computer Modern FontFamily\\ version 7.0.0} \author{Antonis Tsolomitis} %\address{Department of Mathematics\\ University of the Aegean\\ Karlovassi, 832\,00 Samos\\ Greece} %\netaddress{atsol (at) aegean dot gr} %\personalURL{https://myria.math.aegean.gr/~atsol/} %%% End of metadata %%% -\usepackage{pstricks,hvlogos} \begin{document} +\mathversion{bold} +\newsavebox{\mathcalscrA} +\savebox{\mathcalscrA}{$\symcal A$ $\symbfscr A$} +\mathversion{normal} % \rput(-2,-3){\devgray ल}% @@ -176,17 +182,8 @@ Language=Nepali, \null\thispagestyle{empty} -%\vfill -% -%\ttxstackedup \qquad -%{\ttxstackeddown} -% -%\vfill -% - \newpage -%\end{document} \maketitle \tableofcontents @@ -197,8 +194,8 @@ the number of additional glyphs) of the \verb|lm| fonts. It is not just a family adding random missing glyphs but it adds support for several more languages and shapes needed for academic (and not only) work. Currently it supports among others, Greek\footnote{from Claudio Beccari's Greek.}, -Cyrillic\footnote{from the \texttt{cmu} package.}, Hebrew, Cherokee and -Coptic. Since it supports +Cyrillic\footnote{from the \texttt{cmu} package.}, Devanagari, Hebrew, Coptic, Cherokee and +Canadian Aboriginal. Since it supports diacritics stacking the number of languages that use the Latin alphabet is greatly expanded. Diacritics stacking is also needed for Greek for papyrological work and this is also supported. @@ -222,16 +219,21 @@ and you may not have the latest development version and your patches may not apply if created for the published version. + \section{How to load the fonts} The simpler way to load the fonts is through the \verb|fontsetup| package. The command \verb|\usepackage[default]{fontsetup}| -\noindent will load the Book weight of the NewCM family, and +\noindent will load the Book weight of the NewCM family, \verb|\usepackage[olddefault]{fontsetup}| -\noindent will load the Regular weight. +\noindent will load the Regular weight, and + +\verb|\usepackage[sansdefault]{fontsetup}| + +\noindent will load the Sans Serif NewCM family. Also notice that the fonts support the microtype package for fine typographic tuning. See the documentation of microtype for this. @@ -323,7 +325,7 @@ U10307, U10310, U10312, U10314, U1031F and U1032F are {\sffamily\char"10307\char"10310\char"10312\char"10314\char"1031F\char"1032F}. \subsection{Diacritics Stacking} -\marginpar{\begin{center} +\marginpar{\begin{center} \ \\[-1cm] {\color{red}$\rightarrow$}\ \xstacked\quad{\sffamily\xstacked}\quad{\ttfamily\xstacked}\ {\color{red}$\leftarrow$} \end{center}} Diacritics---the full block U+0300 to U+036F---and diacritics stacking @@ -400,6 +402,36 @@ The full Unicode Greek block is supported, which is Pamphilian digamma (ͷ) etc, have been added. For example, it is now possible to write \centerline{βιϐλίο instead of βιβλίο.} + + In order to auto select this conversion for middle beta and theta the StylisticSets + ss07 must be enabled with, say, + + \noindent\verb|\addfontfeatures{StylisticSet=7}|, + + \noindent but for the Sans and Mono fonts \texttt{StylisticSet=6} is also needed, with + + \noindent\verb|\addfontfeatures{StylisticSet=6,StylisticSet=7}|. + + To disable this feature + you can do + + \noindent\verb|\addfontfeature{RawFeature={-ss07}}| + + or + + \noindent\verb|\addfontfeature{RawFeature={-ss06},RawFeature={-ss07}}| + + for the Sans and Mono families. + + \begin{center} + \begin{tabular}{|c|c|c|} \hline + \texttt{Source} & \texttt{βιβλίο} & \texttt{θυμήθηκα}\\ \hline + \texttt{ss07} enabled & {\middlegreekon βιβλίο} & {\middlegreekon θυμήθηκα}\\ \hline + \texttt{ss06} and \texttt{ss07} enabled for Sans & {\middlegreekonsans βιβλίο}& {\middlegreekonsans θυμήθηκα}\\ \hline + \texttt{ss06} and \texttt{ss07} disabled & βιβλίο, \textsf{βιβλίο} &θυμήθηκα, \textsf{θυμήθηκα} \\ \hline + \end{tabular} + \end{center} + \item U1F00--U1FFF for polytonic, and \item U10140--U1018F for ancient Greek numbers. @@ -797,7 +829,11 @@ Renderer=Harfbuzz]{NewCM10Devanagari-Book.otf} The Devanagari fonts were developed with the help of {\devanagaritext निरंजन} (Niranjan) whose name appears in the copyright section of the fonts and I also thank him for -providing the samples below. +providing the samples below. It should also be noted that the design is original +and based on old handwritten books. In old civilizations, such as the Indian one, +it is only natural that the design be affected by how the handwritten +book look. Ink creates ``drop''-like serifs on paper that absorbs it, and the +tool used to write also affects the look of the script. All these were taken into account. \noindent A Sanskrit sample from {\sanskrittext बृहदारण्यकोपनिषद्} (bṛhadāraṇyakopaniṣad) follows: @@ -1198,6 +1234,8 @@ $$\sqrt[3]{x+y\pm 1}=\sum_{n=1}^\infty \int_{K}f_n(x)\,dx.$$ \setmathfont{NewCMMath-Bold.otf} %[version=bold] %\mathversion{bold} +\setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-Book.otf} + Bold inline: $\sqrt[3]{x+y\pm 1}=\sum_{n=1}^\infty \int_{K}f_n(x)\,dx$ and the same in display $$\sqrt[3]{x+y\pm 1}=\sum_{n=1}^\infty \int_{K}f_n(x)\,dx.$$ @@ -1217,7 +1255,54 @@ or \verb|olddefault| options of the \verb|fontsetup| package, change the math ve to bold with \verb|\mathversion{bold}| \textit{before} the commands for chapter and section and switch back to normal with \verb|\mathversion{normal}| \textit{afterwards}. +The \verb|unicode-math| package, according to it's documentation +has still some troubles with ``versions'' and the \verb|range| options. These seem to affect +at least the calligraphic and script math alphabets. In normal version for example +the commands \verb|\symcal| and \verb|\symscr| work as expected, but when one switches +to the bold version the \verb|\symscr| fails. In this case one can use +\verb|\symbfscr|: \usebox{\mathcalscrA} (which was \verb|$\symcal A$ $\symbfscr A$|). + %\mathversion{normal} + +\subsection{Sans Serif Math} + +\setmathfont{NewCMSansMath-Regular.otf} +\newfontfamily{\sansAmSfont}{NewCMSansMath-Regular.otf} +\renewcommand{\AmS}{{\sansAmSfont $\symcal A$\kern-.1667em\lower.5ex\hbox{$\symcal M$}\kern-.125em$\symcal S$}} + + +As of version 7.0.0, the family includes a full-featured Math Sans font. Up to now such a font +did not exist in the CM family (although partial solutions existed), and it +posed a serious problem for scientific writing especially in the preparation of presentations. +The font supplied with NewCM covers all Unicode math slots but it also provides some new features. +The lowercase Latin alphabet has been completely re-worked so that it really looks +as it should when used for Math variables. The letters are + +$$|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|$$ +In Large +\begin{Large} +$$|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|$$ +\end{Large} +Moreover the calligraphic capitals have been re-worked to match +better with the sans serif style (see subsection~\ref{mathscript} for how to select them) +$$\symcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$$ + +Same goes for the \verb|\mathbb/\symbb| capital letters. They have been adjusted to match +the Sans design, both in style and weight: +$$\symbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$$ +It is also worth noticing that the SansSerifed and the Serifed letters have swapped slots +in the font. So if using the MathSans font and you write for example \verb|$\symsf{ABCDabcd}$| +you will get the Serifed version(!): $\symsf{ABCDabcd}$. This choice facilitates +converting a document with Serifed fonts using Sans for emphasis or differentiation +to keep these characteristics when changed to Sans. + +One can see the Sans Serif Math font in action in the provided file +\verb|testmath-newcm.pdf| which comes form the \AmS-{\sffamily L\kern-.5ex\raise.5ex\hbox{\textsc{a}}\kern-.2exT\kern-.4ex\lower.6ex\hbox{E}X} +bundle (here the logo is written in NewCMSans). + + + + \setmathfont{NewCMMath-Book.otf} \subsection{Optical sizes for more glyphs} @@ -1235,9 +1320,9 @@ Zoom or print and compare with \texttt{lat\-in\-modern-math} font: \end{center} -\subsection{Math Script} +\subsection{Math Script}\label{mathscript} -Calligraphic letters are accessed as usual with \verb|\mathcal| producing +Calligraphic letters are accessed as usual with \verb|\mathcal| or \verb|\symcal|, producing $$\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$$ However, mathematicians often need a second level of ``scriptness''. The fonts @@ -1267,12 +1352,25 @@ $$ \setmathfont{NewCMMath-Book.otf}$$\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$$ +\subsection{Math Kerning} + +Math kerning has been added to all NewCM Math fonts. This feature +greatly improves Math typesetting, especially for the calligraphic letters but for regular +letters as well, such as, $Y$ or $\Gamma$. + + +\begin{center} + \includegraphics{mathkern-example.pdf} +\end{center} + + + \subsection{Blackboard Bold} The fonts contain as default the \textsc{ams} blackboard bold. These are: $$\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$$ $$\mathbb{abcdefghijklmnopqrstuvwxyz}$$ -$$\mathbb{0123456789\ \pi\gamma\Gamma\Pi\Sigma\mitBbbD\mitBbbd\mitBbbe\mitBbbi\mitBbbj}$$ +$$\mathbb{0123456789\ \pi\gamma\Gamma\Pi\textrm{\mathastext\char"2140}\mitBbbD\mitBbbd\mitBbbe\mitBbbi\mitBbbj}$$ They also contain a blackboard bold that matches the design of Computer Modern but respecting the fact that most users have been used for a long period to @@ -1296,7 +1394,7 @@ Then the above blackboard bold design changes to \setmathfont[StylisticSet=3]{NewCMMath-Book.otf} $$\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}$$ $$\mathbb{abcdefghijklmnopqrstuvwxyz}$$ -$$\mathbb{0123456789\ \pi\gamma\Gamma\Pi\Sigma\mitBbbD\mitBbbd\mitBbbe\mitBbbi\mitBbbj}$$ +$$\mathbb{0123456789\ \pi\gamma\Gamma\Pi\textrm{\mathastextnewcm\char"2140}\mitBbbD\mitBbbd\mitBbbe\mitBbbi\mitBbbj}$$ \setmathfont{NewCMMath-Book.otf} \newsavebox{\emptysetdefault} @@ -1518,8 +1616,6 @@ I thank Ulrike Fischer for this solution. - - \begin{thebibliography}{9} \bibitem[\textsc{at}]{1} Antonis Tsolomitis, \textit{The NewComputerModern font family}, \textsc{tug}boat Vol.~\textsc{42}, No.~\textsc{1}, \textsc{2021}. \bibitem[\textsc{ipa}rev]{2} Council actions on revisions of the \textsc{ipa}, Phonetic Representation: b) Revision of the \textsc{ipa}, Journal of the International Phonetic Association, Volume \textsc{23}, Issue \textsc{1}, diff --git a/fonts/newcomputermodern/doc/testmath-newcm-sans.pdf b/fonts/newcomputermodern/doc/testmath-newcm-sans.pdf Binary files differnew file mode 100644 index 0000000000..9ff206ea70 --- /dev/null +++ b/fonts/newcomputermodern/doc/testmath-newcm-sans.pdf diff --git a/fonts/newcomputermodern/doc/testmath-newcm-sans.tex b/fonts/newcomputermodern/doc/testmath-newcm-sans.tex new file mode 100644 index 0000000000..44ee168372 --- /dev/null +++ b/fonts/newcomputermodern/doc/testmath-newcm-sans.tex @@ -0,0 +1,2321 @@ +%%% ==================================================================== +%%% filename = testmath.tex +%%% version = 2.0a +%%% date = 2023/08/24 +%%% author = American Mathematical Society +%%% copyright = Copyright 1995, 1999 American Mathematical Society +%%% 2023 LaTeX Project. +%%% License = https://www.latex-project.org/lppl/lppl-1-3c +%%% keywords = latex, amsmath, examples, documentation +%%% abstract = This is a test file containing extensive examples of +%%% mathematical constructs supported by the amsmath +%%% package." +%%% ==================================================================== +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) +[1994/12/01]% LaTeX date must December 1994 or later +\documentclass[draft]{article} +\synctex=1 +\pagestyle{headings} + +\title{Sample Paper for the \pkg{amsmath} Package\\ +File name: \fn{testmath.tex}} +\author{American Mathematical Society} +\date{Version 2.0a, 2023/08/24} + +\usepackage{amsmath,amsthm} +\usepackage[sansdefault]{fontsetup} +\newfontfamily{\sansAmSfont}{NewCMSansMath-Regular.otf} +\renewcommand{\AmS}{{\sansAmSfont $\symcal A$\kern-.1667em\lower.5ex\hbox{$\symcal M$}\kern-.125em$\symcal S$}} +% \input fspdefault.tex + +% Some definitions useful in producing this sort of documentation: +\chardef\bslash=`\\ % p. 424, TeXbook +% Normalized (nonbold, nonitalic) tt font, to avoid font +% substitution warning messages if tt is used inside section +% headings and other places where odd font combinations might +% result. +\newcommand{\ntt}{\normalfont\ttfamily} +% command name +\newcommand{\cn}[1]{{\protect\ntt\bslash#1}} +% LaTeX package name +\newcommand{\pkg}[1]{{\protect\ntt#1}} +% File name +\newcommand{\fn}[1]{{\protect\ntt#1}} +% environment name +\newcommand{\env}[1]{{\protect\ntt#1}} +\hfuzz1pc % Don't bother to report overfull boxes if overage is < 1pc + +% Theorem environments + +%% \theoremstyle{plain} %% This is the default +\newtheorem{thm}{Theorem}[section] +\newtheorem{cor}[thm]{Corollary} +\newtheorem{lem}[thm]{Lemma} +\newtheorem{prop}[thm]{Proposition} +\newtheorem{ax}{Axiom} + +\theoremstyle{definition} +\newtheorem{defn}{Definition}[section] + +\theoremstyle{remark} +\newtheorem{rem}{Remark}[section] +\newtheorem*{notation}{Notation} + +%\numberwithin{equation}{section} + +\newcommand{\thmref}[1]{Theorem~\ref{#1}} +\newcommand{\secref}[1]{\S\ref{#1}} +\newcommand{\lemref}[1]{Lemma~\ref{#1}} + +\newcommand{\bysame}{\mbox{\rule{3em}{.4pt}}\,} + +% Math definitions + +\newcommand{\A}{{\symcal A}} +\newcommand{\B}{{\symcal B}} +\newcommand{\st}{\sigma} +\newcommand{\XcY}{{(X,Y)}} +\newcommand{\SX}{{S_X}} +\newcommand{\SY}{{S_Y}} +\newcommand{\SXY}{{S_{X,Y}}} +\newcommand{\SXgYy}{{S_{X|Y}(y)}} +\newcommand{\Cw}[1]{{\hat C_#1(X|Y)}} +\newcommand{\G}{{G(X|Y)}} +\newcommand{\PY}{{P_{\symcal Y}}} +\newcommand{\X}{{\symcal X}} +\newcommand{\wt}{\widetilde} +\newcommand{\wh}{\widehat} + +\DeclareMathOperator{\per}{per} +\DeclareMathOperator{\cov}{cov} +\DeclareMathOperator{\non}{non} +\DeclareMathOperator{\cf}{cf} +\DeclareMathOperator{\add}{add} +\DeclareMathOperator{\Cham}{Cham} +\DeclareMathOperator{\IM}{Im} +\DeclareMathOperator{\esssup}{ess\,sup} +\DeclareMathOperator{\meas}{meas} +\DeclareMathOperator{\seg}{seg} + +% \interval is used to provide better spacing after a [ that +% is used as a closing delimiter. +\newcommand{\interval}[1]{\mathinner{#1}} + +% Notation for an expression evaluated at a particular condition. The +% optional argument can be used to override automatic sizing of the +% right vert bar, e.g. \eval[\biggr]{...}_{...} +\newcommand{\eval}[2][\right]{\relax + \ifx#1\right\relax \left.\fi#2#1\rvert} + +% Enclose the argument in vert-bar delimiters: +\newcommand{\envert}[1]{\left\lvert#1\right\rvert} +\let\abs=\envert + +% Enclose the argument in double-vert-bar delimiters: +\newcommand{\enVert}[1]{\left\lVert#1\right\rVert} +\let\norm=\enVert + +\begin{document} +\maketitle +\markboth{Sample paper for the {\protect\ntt\lowercase{amsmath}} package} +{Sample paper for the {\protect\ntt\lowercase{amsmath}} package} +\renewcommand{\sectionmark}[1]{} + +\section{Introduction} + +This paper contains examples of various features from \AmS-\LaTeX{}. + + +\section{Enumeration of Hamiltonian paths in a graph} + +Let $\symbf{A}=(a_{ij})$ be the adjacency matrix of graph $G$. The +corresponding Kirchhoff matrix $\symbf{K}=(k_{ij})$ is obtained from +$\symbf{A}$ by replacing in $-\symbf{A}$ each diagonal entry by the +degree of its corresponding vertex; i.e., the $i$th diagonal entry is +identified with the degree of the $i$th vertex. It is well known that +\begin{equation} +\det\symbf{K}(i|i)=\text{ the number of spanning trees of $G$}, +\quad i=1,\dots,n +\end{equation} +where $\symbf{K}(i|i)$ is the $i$th principal submatrix of +$\symbf{K}$. +\begin{verbatim} +\det\symbf{K}(i|i)=\text{ the number of spanning trees of $G$}, +\end{verbatim} + +Let $C_{i(j)}$ be the set of graphs obtained from $G$ by attaching edge +$(v_iv_j)$ to each spanning tree of $G$. Denote by $C_i=\bigcup_j +C_{i(j)}$. It is obvious that the collection of Hamiltonian cycles is a +subset of $C_i$. Note that the cardinality of $C_i$ is $k_{ii}\det +\symbf{K}(i|i)$. Let $\wh X=\{\hat x_1,\dots,\hat x_n\}$. +\begin{verbatim} +$\wh X=\{\hat x_1,\dots,\hat x_n\}$ +\end{verbatim} +Define multiplication for the elements of $\wh X$ by +\begin{equation}\label{multdef} +\hat x_i\hat x_j=\hat x_j\hat x_i,\quad \hat x^2_i=0,\quad +i,j=1,\dots,n. +\end{equation} +Let $\hat{k}_{ij}=k_{ij}\hat x_j$ and $\hat k_{ij}=-\sum_{j\not=i} \hat +k_{ij}$. Then the number of Hamiltonian cycles $H_c$ is given by the +relation \cite{liuchow:formalsum} +\begin{equation}\label{H-cycles} +\biggl(\prod^n_{\,j=1}\hat x_j\biggr)H_c=\frac{1}{2}\hat k_{ij}\det +\wh{\symbf{K}}(i|i),\qquad i=1,\dots,n. +\end{equation} +The task here is to express \eqref{H-cycles} +in a form free of any $\hat x_i$, +$i=1,\dots,n$. The result also leads to the resolution of enumeration of +Hamiltonian paths in a graph. + +It is well known that the enumeration of Hamiltonian cycles and paths in +a complete graph $K_n$ and in a complete bipartite graph $K_{n_1n_2}$ +can only be found from \textit{first combinatorial principles} +\cite{hapa:graphenum}. One wonders if there exists a formula which can +be used very efficiently to produce $K_n$ and $K_{n_1n_2}$. Recently, +using Lagrangian methods, Goulden and Jackson have shown that $H_c$ can +be expressed in terms of the determinant and permanent of the adjacency +matrix \cite{gouja:lagrmeth}. However, the formula of Goulden and +Jackson determines neither $K_n$ nor $K_{n_1n_2}$ effectively. In this +paper, using an algebraic method, we parametrize the adjacency matrix. +The resulting formula also involves the determinant and permanent, but +it can easily be applied to $K_n$ and $K_{n_1n_2}$. In addition, we +eliminate the permanent from $H_c$ and show that $H_c$ can be +represented by a determinantal function of multivariables, each variable +with domain $\{0,1\}$. Furthermore, we show that $H_c$ can be written by +number of spanning trees of subgraphs. Finally, we apply the formulas to +a complete multigraph $K_{n_1\dots n_p}$. + +The conditions $a_{ij}=a_{ji}$, $i,j=1,\dots,n$, are not required in +this paper. All formulas can be extended to a digraph simply by +multiplying $H_c$ by 2. + +\section{Main Theorem} +\label{s:mt} + +\begin{notation} For $p,q\in P$ and $n\in\omega$ we write +$(q,n)\le(p,n)$ if $q\le p$ and $A_{q,n}=A_{p,n}$. +\begin{verbatim} +\begin{notation} For $p,q\in P$ and $n\in\omega$ +... +\end{notation} +\end{verbatim} +\end{notation} + +Let $\symbf{B}=(b_{ij})$ be an $n\times n$ matrix. Let $\symbf{n}=\{1, +\dots,n\}$. Using the properties of \eqref{multdef}, it is readily seen +that + +\begin{lem}\label{lem-per} +\begin{equation} +\prod_{i\in\symbf{n}} +\biggl(\sum_{\,j\in\symbf{n}}b_{ij}\hat x_i\biggr) +=\biggl(\prod_{\,i\in\symbf{n}}\hat x_i\biggr)\per \symbf{B} +\end{equation} +where $\per \symbf{B}$ is the permanent of $\symbf{B}$. +\end{lem} + +Let $\wh Y=\{\hat y_1,\dots,\hat y_n\}$. Define multiplication +for the elements of $\wh Y$ by +\begin{equation} +\hat y_i\hat y_j+\hat y_j\hat y_i=0,\quad i,j=1,\dots,n. +\end{equation} +Then, it follows that +\begin{lem}\label{lem-det} +\begin{equation}\label{detprod} +\prod_{i\in\symbf{n}} +\biggl(\sum_{\,j\in\symbf{n}}b_{ij}\hat y_j\biggr) +=\biggl(\prod_{\,i\in\symbf{n}}\hat y_i\biggr)\det\symbf{B}. +\end{equation} +\end{lem} + +Note that all basic properties of determinants are direct consequences +of Lemma~\ref{lem-det}. Write +\begin{equation}\label{sum-bij} +\sum_{j\in\symbf{n}}b_{ij}\hat y_j=\sum_{j\in\symbf{n}}b^{(\lambda)} +_{ij}\hat y_j+(b_{ii}-\lambda_i)\hat y_i\hat y +\end{equation} +where +\begin{equation} +b^{(\lambda)}_{ii}=\lambda_i,\quad b^{(\lambda)}_{ij}=b_{ij}, +\quad i\not=j. +\end{equation} +Let $\symbf{B}^{(\lambda)}=(b^{(\lambda)}_{ij})$. By \eqref{detprod} +and \eqref{sum-bij}, it is +straightforward to show the following +result: +\begin{thm}\label{thm-main} +\begin{equation}\label{detB} +\det\symbf{B}= +\sum^n_{l =0}\sum_{I_l \subseteq n} +\prod_{i\in I_l}(b_{ii}-\lambda_i) +\det\symbf{B}^{(\lambda)}(I_l |I_l ), +\end{equation} +where $I_l =\{i_1,\dots,i_l \}$ and $\symbf{B}^{(\lambda)}(I_l |I_l )$ +is the principal submatrix obtained from $\symbf{B}^{(\lambda)}$ +by deleting its $i_1,\dots,i_l $ rows and columns. +\end{thm} + +\begin{rem} +Let $\symbf{M}$ be an $n\times n$ matrix. The convention +$\symbf{M}(\symbf{n}|\symbf{n})=1$ has been used in \eqref{detB} and +hereafter. +\end{rem} + +Before proceeding with our discussion, we pause to note that +\thmref{thm-main} yields immediately a fundamental formula which can be +used to compute the coefficients of a characteristic polynomial +\cite{mami:matrixth}: +\begin{cor}\label{BI} +Write $\det(\symbf{B}-x\symbf{I})=\sum^n_{l =0}(-1) +^l b_l x^l $. Then +\begin{equation}\label{bl-sum} +b_l =\sum_{I_l \subseteq\symbf{n}}\det\symbf{B}(I_l |I_l ). +\end{equation} +\end{cor} +Let +\begin{equation} +\symbf{K}(t,t_1,\dots,t_n) +=\begin{pmatrix} D_1t&-a_{12}t_2&\dots&-a_{1n}t_n\\ +-a_{21}t_1&D_2t&\dots&-a_{2n}t_n\\ +\hdotsfor[2]{4}\\ +-a_{n1}t_1&-a_{n2}t_2&\dots&D_nt\end{pmatrix}, +\end{equation} +\begin{verbatim} +\begin{pmatrix} D_1t&-a_{12}t_2&\dots&-a_{1n}t_n\\ +-a_{21}t_1&D_2t&\dots&-a_{2n}t_n\\ +\hdotsfor[2]{4}\\ +-a_{n1}t_1&-a_{n2}t_2&\dots&D_nt\end{pmatrix} +\end{verbatim} +where +\begin{equation} +D_i=\sum_{j\in\symbf{n}}a_{ij}t_j,\quad i=1,\dots,n. +\end{equation} + +Set +\begin{equation*} +D(t_1,\dots,t_n)=\frac{\delta}{\delta t}\eval{\det\symbf{K}(t,t_1,\dots,t_n) +}_{t=1}. +\end{equation*} +Then +\begin{equation}\label{sum-Di} +D(t_1,\dots,t_n) +=\sum_{i\in\symbf{n}}D_i\det\symbf{K}(t=1,t_1,\dots,t_n; i|i), +\end{equation} +where $\symbf{K}(t=1,t_1,\dots,t_n; i|i)$ is the $i$th principal +submatrix of $\symbf{K}(t=1,t_1,\dots,t_n)$. + +Theorem~\ref{thm-main} leads to +\begin{equation}\label{detK1} +\det\symbf{K}(t_1,t_1,\dots,t_n) +=\sum_{I\in\symbf{n}}(-1)^{\envert{I}}t^{n-\envert{I}} +\prod_{i\in I}t_i\prod_{j\in I}(D_j+\lambda_jt_j)\det\symbf{A} +^{(\lambda t)}(\overline{I}|\overline I). +\end{equation} +Note that +\begin{equation}\label{detK2} +\det\symbf{K}(t=1,t_1,\dots,t_n)=\sum_{I\in\symbf{n}}(-1)^{\envert{I}} +\prod_{i\in I}t_i\prod_{j\in I}(D_j+\lambda_jt_j)\det\symbf{A} +^{(\lambda)}(\overline{I}|\overline{I})=0. +\end{equation} + +Let $t_i=\hat x_i,i=1,\dots,n$. Lemma~\ref{lem-per} yields +\begin{multline} +\biggl(\sum_{\,i\in\symbf{n}}a_{l _i}x_i\biggr) +\det\symbf{K}(t=1,x_1,\dots,x_n;l |l )\\ +=\biggl(\prod_{\,i\in\symbf{n}}\hat x_i\biggr) +\sum_{I\subseteq\symbf{n}-\{l \}} +(-1)^{\envert{I}}\per\symbf{A}^{(\lambda)}(I|I) +\det\symbf{A}^{(\lambda)} +(\overline I\cup\{l \}|\overline I\cup\{l \}). +\label{sum-ali} +\end{multline} +\begin{verbatim} +\begin{multline} +\biggl(\sum_{\,i\in\symbf{n}}a_{l _i}x_i\biggr) +\det\symbf{K}(t=1,x_1,\dots,x_n;l |l )\\ +=\biggl(\prod_{\,i\in\symbf{n}}\hat x_i\biggr) +\sum_{I\subseteq\symbf{n}-\{l \}} +(-1)^{\envert{I}}\per\symbf{A}^{(\lambda)}(I|I) +\det\symbf{A}^{(\lambda)} +(\overline I\cup\{l \}|\overline I\cup\{l \}). +\label{sum-ali} +\end{multline} +\end{verbatim} + +By \eqref{H-cycles}, \eqref{detprod}, and \eqref{sum-bij}, we have +\begin{prop}\label{prop:eg} +\begin{equation} +H_c=\frac1{2n}\sum^n_{l =0}(-1)^{l} +D_{l}, +\end{equation} +where +\begin{equation}\label{delta-l} +D_{l}=\eval[2]{\sum_{I_{l}\subseteq \symbf{n}} +D(t_1,\dots,t_n)}_{t_i=\left\{\begin{smallmatrix} +0,& \text{if }i\in I_{l}\quad\\% \quad added for centering +1,& \text{otherwise}\end{smallmatrix}\right.\;,\;\; i=1,\dots,n}. +\end{equation} +\end{prop} + +\section{Application} +\label{lincomp} + +We consider here the applications of Theorems~\ref{th-info-ow-ow} +and~\ref{th-weak-ske-owf} to a complete +multipartite graph $K_{n_1\dots n_p}$. It can be shown that the +number of spanning trees of $K_{n_1\dots n_p}$ +may be written +\begin{equation}\label{e:st} +T=n^{p-2}\prod^p_{i=1} +(n-n_i)^{n_i-1} +\end{equation} +where +\begin{equation} +n=n_1+\dots+n_p. +\end{equation} + +It follows from Theorems~\ref{th-info-ow-ow} and~\ref{th-weak-ske-owf} that +\begin{equation}\label{e:barwq} +\begin{split} +H_c&=\frac1{2n} +\sum^n_{{l}=0}(-1)^{l}(n-{l})^{p-2} +\sum_{l _1+\dots+l _p=l}\prod^p_{i=1} +\binom{n_i}{l _i}\\ +&\quad\cdot[(n-l )-(n_i-l _i)]^{n_i-l _i}\cdot +\biggl[(n-l )^2-\sum^p_{j=1}(n_i-l _i)^2\biggr].\end{split} +\end{equation} +\begin{verbatim} +... \binom{n_i}{l _i}\\ +\end{verbatim} +and +\begin{equation}\label{joe} +\begin{split} +H_c&=\frac12\sum^{n-1}_{l =0} +(-1)^{l}(n-l )^{p-2} +\sum_{l _1+\dots+l _p=l} +\prod^p_{i=1}\binom{n_i}{l _i}\\ +&\quad\cdot[(n-l )-(n_i-l _i)]^{n_i-l _i} +\left(1-\frac{l _p}{n_p}\right) +[(n-l )-(n_p-l _p)]. +\end{split} +\end{equation} + +The enumeration of $H_c$ in a $K_{n_1\dotsm n_p}$ graph can also be +carried out by Theorem~\ref{thm-H-param} or~\ref{thm-asym} +together with the algebraic method of \eqref{multdef}. +Some elegant representations may be obtained. For example, $H_c$ in +a $K_{n_1n_2n_3}$ graph may be written +\begin{equation}\label{j:mark} +\begin{split} +H_c=& +\frac{n_1!\,n_2!\,n_3!} +{n_1+n_2+n_3}\sum_i\left[\binom{n_1}{i} +\binom{n_2}{n_3-n_1+i}\binom{n_3}{n_3-n_2+i}\right.\\ +&+\left.\binom{n_1-1}{i} +\binom{n_2-1}{n_3-n_1+i} +\binom{n_3-1}{n_3-n_2+i}\right].\end{split} +\end{equation} + +\section{Secret Key Exchanges} +\label{SKE} + +Modern cryptography is fundamentally concerned with the problem of +secure private communication. A Secret Key Exchange is a protocol +where Alice and Bob, having no secret information in common to start, +are able to agree on a common secret key, conversing over a public +channel. The notion of a Secret Key Exchange protocol was first +introduced in the seminal paper of Diffie and Hellman +\cite{dihe:newdir}. \cite{dihe:newdir} presented a concrete +implementation of a Secret Key Exchange protocol, dependent on a +specific assumption (a variant on the discrete log), specially +tailored to yield Secret Key Exchange. Secret Key Exchange is of +course trivial if trapdoor permutations exist. However, there is no +known implementation based on a weaker general assumption. + +The concept of an informationally one-way function was introduced +in \cite{imlelu:oneway}. We give only an informal definition here: + +\begin{defn} A polynomial time +computable function $f = \{f_k\}$ is informationally +one-way if there is no probabilistic polynomial time algorithm which +(with probability of the form $1 - k^{-e}$ for some $e > 0$) +returns on input $y \in \{0,1\}^{k}$ a random element of $f^{-1}(y)$. +\end{defn} +In the non-uniform setting \cite{imlelu:oneway} show that these are not +weaker than one-way functions: +\begin{thm}[\cite{imlelu:oneway} (non-uniform)] +\label{th-info-ow-ow} +The existence of informationally one-way functions +implies the existence of one-way functions. +\end{thm} +We will stick to the convention introduced above of saying +``non-uniform'' before the theorem statement when the theorem +makes use of non-uniformity. It should be understood that +if nothing is said then the result holds for both the uniform and +the non-uniform models. + +It now follows from \thmref{th-info-ow-ow} that + +\begin{thm}[non-uniform]\label{th-weak-ske-owf} Weak SKE +implies the existence of a one-way function. +\end{thm} + +More recently, the polynomial-time, interior point algorithms for linear +programming have been extended to the case of convex quadratic programs +\cite{moad:quadpro,ye:intalg}, certain linear complementarity problems +\cite{komiyo:lincomp,miyoki:lincomp}, and the nonlinear complementarity +problem \cite{komiyo:unipfunc}. The connection between these algorithms +and the classical Newton method for nonlinear equations is well +explained in \cite{komiyo:lincomp}. + +\section{Review} +\label{computation} + +We begin our discussion with the following definition: + +\begin{defn} + +A function $H\colon \Re^n \to \Re^n$ is said to be +\emph{B-differentiable} at the point $z$ if (i)~$H$ is Lipschitz +continuous in a neighborhood of $z$, and (ii)~there exists a positive +homogeneous function $BH(z)\colon \Re^n \to \Re^n$, called the +\emph{B-derivative} of $H$ at $z$, such that +\[ \lim_{v \to 0} \frac{H(z+v) - H(z) - BH(z)v}{\enVert{v}} = 0. \] +The function $H$ is \textit{B-differentiable in set $S$} if it is +B-differentiable at every point in $S$. The B-derivative $BH(z)$ is said +to be \textit{strong} if +\[ \lim_{(v,v') \to (0,0)} \frac{H(z+v) - H(z+v') - BH(z)(v + -v')}{\enVert{v - v'}} = 0. \] +\end{defn} + + +\begin{lem}\label{limbog} There exists a smooth function $\psi_0(z)$ +defined for $\abs{z}>1-2a$ satisfying the following properties\textup{:} +\begin{enumerate} +\renewcommand{\labelenumi}{(\roman{enumi})} +\item $\psi_0(z)$ is bounded above and below by positive constants +$c_1\leq \psi_0(z)\leq c_2$. +\item If $\abs{z}>1$, then $\psi_0(z)=1$. +\item For all $z$ in the domain of $\psi_0$, $\Delta_0\ln \psi_0\geq 0$. +\item If $1-2a<\abs{z}<1-a$, then $\Delta_0\ln \psi_0\geq +c_3>0$. +\end{enumerate} +\end{lem} + +\begin{proof} +We choose $\psi_0(z)$ to be a radial function depending only on $r=\abs{z}$. +Let $h(r)\geq 0$ be a suitable smooth function satisfying $h(r)\geq c_3$ +for $1-2a<\abs{z}<1-a$, and $h(r)=0$ for $\abs{z}>1-\tfrac a2$. The radial +Laplacian +\[\Delta_0\ln\psi_0(r)=\left(\frac {d^2}{dr^2}+\frac +1r\frac d{dr}\right)\ln\psi_0(r)\] +has smooth coefficients for $r>1-2a$. Therefore, we may +apply the existence and uniqueness theory for ordinary differential +equations. Simply let $\ln \psi_0(r)$ be the solution of the differential +equation +\[\left(\frac{d^2}{dr^2}+\frac 1r\frac d{dr}\right)\ln \psi_0(r)=h(r)\] +with initial conditions given by $\ln \psi_0(1)=0$ and +$\ln\psi_0'(1)=0$. + +Next, let $D_\nu$ be a finite collection of pairwise disjoint disks, +all of which are contained in the unit disk centered at the origin in +$C$. We assume that $D_\nu=\{z\mid \abs{z-z_\nu}<\delta\}$. Suppose that +$D_\nu(a)$ denotes the smaller concentric disk $D_\nu(a)=\{z\mid +\abs{z-z_\nu}\leq (1-2a)\delta\}$. We define a smooth weight function +$\Phi_0(z)$ for $z\in C-\bigcup_\nu D_\nu(a)$ by setting $\Phi_ +0(z)=1$ when $z\notin \bigcup_\nu D_\nu$ and $\Phi_ +0(z)=\psi_0((z-z_\nu)/\delta)$ when $z$ is an element of $D_\nu$. It +follows from \lemref{limbog} that $\Phi_ 0$ satisfies the properties: +\begin{enumerate} +\renewcommand{\labelenumi}{(\roman{enumi})} +\item \label{boundab}$\Phi_ 0(z)$ is bounded above and below by +positive constants $c_1\leq \Phi_ 0(z)\leq c_2$. +\item \label{d:over}$\Delta_0\ln\Phi_ 0\geq 0$ for all +$z\in C-\bigcup_\nu D_\nu(a)$, +the domain where the function $\Phi_ 0$ is defined. +\item \label{d:ad}$\Delta_0\ln\Phi_ 0\geq c_3\delta^{-2}$ +when $(1-2a)\delta<\abs{z-z_\nu}<(1-a)\delta$. +\end{enumerate} +Let $A_\nu$ denote the annulus $A_\nu=\{(1-2a)\delta<\abs{z-z_\nu}<(1-a) +\delta \}$, and set $A=\bigcup_\nu A_\nu$. The +properties (\ref{d:over}) and (\ref{d:ad}) of $\Phi_ 0$ +may be summarized as $\Delta_0\ln \Phi_ 0\geq c_3\delta^{-2}\chi_A$, +where $\chi _A$ is the characteristic function of $A$. +\end{proof} + +Suppose that $\alpha$ is a nonnegative real constant. We apply +Proposition~\ref{prop:eg} with $\Phi(z)=\Phi_ 0(z) e^{\alpha\abs{z}^2}$. If +$u\in C^\infty_0(R^2-\bigcup_\nu D_\nu(a))$, assume that $\symcal{D}$ +is a bounded domain containing the support of $u$ and $A\subset +\symcal{D}\subset R^2-\bigcup_\nu D_\nu(a)$. A calculation gives +\[\int_{\symcal{D}}\abs{\overline\partial u}^2\Phi_ 0(z) e^{\alpha\abs{z}^2} +\geq c_4\alpha\int_{\symcal{D}}\abs{u}^2\Phi_ 0e^{\alpha\abs{z}^2} ++c_5\delta^{-2}\int_ A\abs{u}^2\Phi_ 0e^{\alpha\abs{z}^2}.\] + +The boundedness, property (\ref{boundab}) of $\Phi_ 0$, then yields +\[\int_{\symcal{D}}\abs{\overline\partial u}^2e^{\alpha\abs{z}^2}\geq c_6\alpha +\int_{\symcal{D}}\abs{u}^2e^{\alpha\abs{z}^2} ++c_7\delta^{-2}\int_ A\abs{u}^2e^{\alpha\abs{z}^2}.\] + +Let $B(X)$ be the set of blocks of $\Lambda_{X}$ +and let $b(X) = \abs{B(X)}$. If $\phi \in Q_{X}$ then +$\phi$ is constant on the blocks of $\Lambda_{X}$. +\begin{equation}\label{far-d} + P_{X} = \{ \phi \in M \mid \Lambda_{\phi} = \Lambda_{X} \}, +\qquad +Q_{X} = \{\phi \in M \mid \Lambda_{\phi} \geq \Lambda_{X} \}. +\end{equation} +If $\Lambda_{\phi} \geq \Lambda_{X}$ then +$\Lambda_{\phi} = \Lambda_{Y}$ for some $Y \geq X$ so that +\[ Q_{X} = \bigcup_{Y \geq X} P_{Y}. \] +Thus by M\"obius inversion +\[ \abs{P_{Y}}= \sum_{X\geq Y} \mu (Y,X)\abs{Q_{X}}.\] +Thus there is a bijection from $Q_{X}$ to $W^{B(X)}$. +In particular $\abs{Q_{X}} = w^{b(X)}$. + +Next note that $b(X)=\dim X$. We see this by choosing a +basis for $X$ consisting of vectors $v^{k}$ defined by +\[v^{k}_{i}= +\begin{cases} 1 & \text{if $i \in \Lambda_{k}$},\\ +0 &\text{otherwise.} \end{cases} +\] +\begin{verbatim} +\[v^{k}_{i}= +\begin{cases} 1 & \text{if $i \in \Lambda_{k}$},\\ +0 &\text{otherwise.} \end{cases} +\] +\end{verbatim} + +\begin{lem}\label{p0201} +Let $\A$ be an arrangement. Then +\[ \chi (\A,t) = \sum_{\B \subseteq \A} +(-1)^{\abs{\B}} t^{\dim T(\B)}. \] +\end{lem} + +In order to compute $R''$ recall the definition +of $S(X,Y)$ from \lemref{lem-per}. Since $H \in \B$, +$\A_{H} \subseteq \B$. Thus if $T(\B) = Y$ then +$\B \in S(H,Y)$. Let $L'' = L(\A'')$. Then +\begin{equation}\label{E_SXgYy} +\begin{split} +R''&= \sum_{H\in \B \subseteq \A} (-1)^{\abs{\B}} +t^{\dim T(\B)}\\ +&= \sum_{Y \in L''} \sum_{\B \in S(H,Y)} +(-1)^{\abs{\B}}t^{\dim Y} \\ +&= -\sum_{Y \in L''} \sum_{\B \in S(H,Y)} (-1)^ +{\abs{\B - \A_{H}}} t^{\dim Y} \\ +&= -\sum_{Y \in L''} \mu (H,Y)t^{\dim Y} \\ +&= -\chi (\A '',t). +\end{split} +\end{equation} + +\begin{cor}\label{tripleA} +Let $(\A,\A',\A'')$ be a triple of arrangements. Then +\[ \pi (\A,t) = \pi (\A',t) + t \pi (\A'',t). \] +\end{cor} + +\begin{defn} +Let $(\A,\A',\A'')$ be a triple with respect to +the hyperplane $H \in \A$. Call $H$ a \textit{separator} +if $T(\A) \not\in L(\A')$. +\end{defn} + +\begin{cor}\label{nsep} +Let $(\A,\A',\A'')$ be a triple with respect to $H \in \A$. +\begin{enumerate} +\renewcommand{\labelenumi}{(\roman{enumi})} +\item +If $H$ is a separator then +\[ \mu (\A) = - \mu (\A'') \] +and hence +\[ \abs{\mu (\A)} = \abs{ \mu (\A'')}. \] + +\item If $H$ is not a separator then +\[\mu (\A) = \mu (\A') - \mu (\A'') \] +and +\[ \abs{\mu (\A)} = \abs{\mu (\A')} + \abs{\mu (\A'')}. \] +\end{enumerate} +\end{cor} + +\begin{proof} +It follows from \thmref{th-info-ow-ow} that $\pi(\A,t)$ +has leading term +\[(-1)^{r(\A)}\mu (\A)t^{r(\A)}.\] +The conclusion +follows by comparing coefficients of the leading +terms on both sides of the equation in +Corollary~\ref{tripleA}. If $H$ is a separator then +$r(\A') < r(\A)$ and there is no contribution +from $\pi (\A',t)$. +\end{proof} + +The Poincar\'e polynomial of an arrangement +will appear repeatedly +in these notes. It will be shown to equal the +Poincar\'e polynomial +of the graded algebras which we are going to +associate with $\A$. It is also the Poincar\'e +polynomial of the complement $M(\A)$ for a +complex arrangement. Here we prove +that the Poincar\'e polynomial is the chamber +counting function for a real arrangement. The +complement $M(\A)$ is a disjoint union of chambers +\[M(\A) = \bigcup_{C \in \Cham(\A)} C.\] +The number +of chambers is determined by the Poincar\'e +polynomial as follows. + +\begin{thm}\label{th-realarr} +Let $\A_{\symbf{R}}$ be a real arrangement. Then +\[ \abs{\Cham(\A_{\symbf{R}})} = \pi (\A_{\symbf{R}},1). \] +\end{thm} + +\begin{proof} +We check the properties required in Corollary~\ref{nsep}: +(i) follows from $\pi (\Phi_{ l},t) = 1$, and (ii) is a +consequence of Corollary~\ref{BI}. +\end{proof} + +\begin{figure} +\vspace{5cm} +\caption[]{$Q(\A_{1}) = xyz(x-z)(x+z)(y-z)(y+z)$} +\end{figure} + +\begin{figure} +\vspace{5cm} +\caption[]{$Q(\A_{2})= xyz(x+y+z)(x+y-z)(x-y+z)(x-y-z)$} +\end{figure} + + +\begin{thm} +\label{T_first_the_int} +Let $\phi$ be a protocol for a random pair $\XcY$. +If one of $\st_\phi(x',y)$ and $\st_\phi(x,y')$ is a prefix of the other +and $(x,y)\in\SXY$, then +\[ +\langle \st_j(x',y)\rangle_{j=1}^\infty +=\langle \st_j(x,y)\rangle_{j=1}^\infty +=\langle \st_j(x,y')\rangle_{j=1}^\infty . +\] +\end{thm} +\begin{proof} +We show by induction on $i$ that +\[ +\langle \st_j(x',y)\rangle_{j=1}^i +=\langle \st_j(x,y)\rangle_{j=1}^i +=\langle \st_j(x,y')\rangle_{j=1}^i. +\] +The induction hypothesis holds vacuously for $i=0$. Assume it holds for +$i-1$, in particular +$[\st_j(x',y)]_{j=1}^{i-1}=[\st_j(x,y')]_{j=1}^{i-1}$. Then one of +$[\st_j(x',y)]_{j=i}^{\infty}$ and $[\st_j(x,y')]_{j=i}^{\infty}$ is a +prefix of the other which implies that one of $\st_i(x',y)$ and +$\st_i(x,y')$ is a prefix of the other. If the $i$th message is +transmitted by $P_\X$ then, by the separate-transmissions property and +the induction hypothesis, $\st_i(x,y)=\st_i(x,y')$, hence one of +$\st_i(x,y)$ and $\st_i(x',y)$ is a prefix of the other. By the +implicit-termination property, neither $\st_i(x,y)$ nor $\st_i(x',y)$ +can be a proper prefix of the other, hence they must be the same and +$\st_i(x',y)=\st_i(x,y)=\st_i(x,y')$. If the $i$th message is +transmitted by $\PY$ then, symmetrically, $\st_i(x,y)=\st_i(x',y)$ by +the induction hypothesis and the separate-transmissions property, and, +then, $\st_i(x,y)=\st_i(x,y')$ by the implicit-termination property, +proving the induction step. +\end{proof} + +If $\phi$ is a protocol for $(X,Y)$, and $(x,y)$, $(x',y)$ are distinct +inputs in $\SXY$, then, by the correct-decision property, +$\langle\st_j(x,y)\rangle_{j=1}^\infty\ne\langle +\st_j(x',y)\rangle_{j=1}^\infty$. + +Equation~(\ref{E_SXgYy}) defined $\PY$'s ambiguity set $\SXgYy$ +to be the set of possible $X$ values when $Y=y$. +The last corollary implies that for all $y\in\SY$, +the multiset% +\footnote{A multiset allows multiplicity of elements. +Hence, $\{0,01,01\}$ is prefix free as a set, but not as a multiset.} +of codewords $\{\st_\phi(x,y):x\in\SXgYy\}$ is prefix free. + +\section{One-Way Complexity} +\label{S_Cp1} + +$\Cw1$, the one-way complexity of a random pair $\XcY$, +is the number of bits $P_\X$ must transmit in the worst case +when $\PY$ is not permitted to transmit any feedback messages. +Starting with $\SXY$, the support set of $\XcY$, we define $\G$, +the \textit{characteristic hypergraph} of $\XcY$, and show that +\[ +\Cw1=\lceil\,\log\chi(\G)\rceil\ . +\] + +Let $\XcY$ be a random pair. For each $y$ in $\SY$, the support set of +$Y$, Equation~(\ref{E_SXgYy}) defined $\SXgYy$ to be the set of possible +$x$ values when $Y=y$. The \textit{characteristic hypergraph} $\G$ of +$\XcY$ has $\SX$ as its vertex set and the hyperedge $\SXgYy$ for each +$y\in\SY$. + + +We can now prove a continuity theorem. +\begin{thm}\label{t:conl} +Let $\Omega \subset\symbf{R}^n$ be an open set, let +$u\in BV(\Omega ;\symbf{R}^m)$, and let +\begin{equation}\label{quts} +T^u_x=\left\{y\in\symbf{R}^m: + y=\tilde u(x)+\left\langle \frac{Du}{\abs{Du}}(x),z +\right\rangle \text{ for some }z\in\symbf{R}^n\right\} +\end{equation} +for every $x\in\Omega \backslash S_u$. Let $f\colon \symbf{R}^m\to +\symbf{R}^k$ be a Lipschitz continuous function such that $f(0)=0$, and +let $v=f(u)\colon \Omega \to \symbf{R}^k$. Then $v\in BV(\Omega +;\symbf{R}^k)$ and +\begin{equation} +Jv=\eval{(f(u^+)-f(u^-))\otimes \nu_u\cdot\, +\symcal{H}_{n-1}}_{S_u}. +\end{equation} +In addition, for $\abs{\wt{D}u}$-almost every $x\in\Omega $ the +restriction of the function $f$ to $T^u_x$ is differentiable at $\tilde +u(x)$ and +\begin{equation} +\wt{D}v=\nabla (\eval{f}_{T^u_x})(\tilde u) +\frac{\wt{D}u}{\abs{\wt{D}u}}\cdot\abs{\wt{D}u}.\end{equation} +\end{thm} + +Before proving the theorem, we state without proof three elementary +remarks which will be useful in the sequel. +\begin{rem}\label{r:omb} +Let $\omega\colon \left]0,+\infty\right[\to \left]0,+\infty\right[$ +be a continuous function such that $\omega (t)\to 0$ as $t\to +0$. Then +\[\lim_{h\to 0^+}g(\omega(h))=L\Leftrightarrow\lim_{h\to +0^+}g(h)=L\] +for any function $g\colon \left]0,+\infty\right[\to \symbf{R}$. +\end{rem} +\begin{rem}\label{r:dif} +Let $g \colon \symbf{R}^n\to \symbf{R}$ be a Lipschitz +continuous function and assume that +\[L(z)=\lim_{h\to 0^+}\frac{g(hz)-g(0)}h\] +exists for every $z\in\symbf{Q}^n$ and that $L$ is a linear function of +$z$. Then $g$ is differentiable at 0. +\end{rem} +\begin{rem}\label{r:dif0} +Let $A \colon \symbf{R}^n\to \symbf{R}^m$ be a linear function, and +let $f \colon \symbf{R}^m\to \symbf{R}$ be a function. Then the +restriction of $f$ to the range of $A$ is differentiable at 0 if and +only if $f(A)\colon \symbf{R}^n\to \symbf{R}$ is differentiable at 0 +and +\[\nabla(\eval{f}_{\IM(A)})(0)A=\nabla (f(A))(0).\] +\end{rem} + +\begin{proof} + We begin by showing that $v\in BV(\Omega;\symbf{R}^k)$ and +\begin{equation}\label{e:bomb} +\abs{Dv}(B)\le K\abs{Du}(B)\qquad\forall B\in\symbf{B}(\Omega ), +\end{equation} +where $K>0$ is the Lipschitz constant of $f$. By \eqref{sum-Di} and by +the approximation result quoted in \secref{s:mt}, it is possible to find +a sequence $(u_h)\subset C^1(\Omega ;\symbf{R}^m)$ converging to $u$ in +$L^1(\Omega ;\symbf{R}^m)$ and such that +\[\lim_{h\to +\infty}\int_\Omega \abs{\nabla u_h}\,dx=\abs{Du}(\Omega ).\] +The functions $v_h=f(u_h)$ are locally Lipschitz continuous in $\Omega +$, and the definition of differential implies that $\abs{\nabla v_h}\le +K\abs{\nabla u_h}$ almost everywhere in $\Omega $. The lower semicontinuity +of the total variation and \eqref{sum-Di} yield +\begin{equation} +\begin{split} +\abs{Dv}(\Omega )\le\liminf_{h\to +\infty}\abs{Dv_h}(\Omega) & +=\liminf_{h\to +\infty}\int_\Omega \abs{\nabla v_h}\,dx\\ +&\le K\liminf_{h\to +\infty}\int_\Omega +\abs{\nabla u_h}\,dx=K\abs{Du}(\Omega). +\end{split}\end{equation} +Since $f(0)=0$, we have also +\[\int_\Omega \abs{v}\,dx\le K\int_\Omega \abs{u}\,dx;\] +therefore $u\in BV(\Omega ;\symbf{R}^k)$. Repeating the same argument +for every open set $A\subset\Omega $, we get \eqref{e:bomb} for every +$B\in\symbf{B}(\Omega)$, because $\abs{Dv}$, $\abs{Du}$ are Radon measures. To +prove \lemref{limbog}, first we observe that +\begin{equation}\label{e:SS} +S_v\subset S_u,\qquad\tilde v(x)=f(\tilde u(x))\qquad \forall x\in\Omega +\backslash S_u.\end{equation} +In fact, for every $\varepsilon >0$ we have +\[\{y\in B_\rho(x): \abs{v(y)-f(\tilde u(x))}>\varepsilon \}\subset \{y\in +B_\rho(x): \abs{u(y)-\tilde u(x)}>\varepsilon /K\},\] +hence +\[\lim_{\rho\to 0^+}\frac{\abs{\{y\in B_\rho(x): \abs{v(y)-f(\tilde u(x))}> +\varepsilon \}}}{\rho^n}=0\] +whenever $x\in\Omega \backslash S_u$. By a similar argument, if $x\in +S_u$ is a point such that there exists a triplet $(u^+,u^-,\nu_u)$ +satisfying \eqref{detK1}, \eqref{detK2}, then +\[ +(v^+(x)-v^-(x))\otimes \nu_v=(f(u^+(x))-f(u^-(x)))\otimes\nu_u\quad +\text{if }x\in S_v +\] +and $f(u^-(x))=f(u^+(x))$ if $x\in S_u\backslash S_v$. Hence, by (1.8) +we get +\begin{equation*}\begin{split} +Jv(B)=\int_{B\cap S_v}(v^+-v^-)\otimes \nu_v\,d\symcal{H}_{n-1}&= +\int_{B\cap S_v}(f(u^+)-f(u^-))\otimes \nu_u\,d\symcal{H}_{n-1}\\ +&=\int_{B\cap S_u}(f(u^+)-f(u^-))\otimes \nu_u\,d\symcal{H}_{n-1} +\end{split}\end{equation*} +and \lemref{limbog} is proved. +\end{proof} + +To prove \eqref{e:SS}, it is not restrictive to assume that $k=1$. +Moreover, to simplify our notation, from now on we shall assume that +$\Omega = \symbf{R}^n$. The proof of \eqref{e:SS} is divided into two +steps. In the first step we prove the statement in the one-dimensional +case $(n=1)$, using \thmref{th-weak-ske-owf}. In the second step we +achieve the general result using \thmref{t:conl}. + +\subsection*{Step 1} +Assume that $n=1$. Since $S_u$ is at most countable, \eqref{sum-bij} +yields that $\abs{\wt{D}v}(S_u\backslash S_v)=0$, so that +\eqref{e:st} and \eqref{e:barwq} imply that $Dv=\wt{D}v+Jv$ is +the Radon-Nikod\'ym decomposition of $Dv$ in absolutely continuous and +singular part with respect to $\abs{\wt{D} u}$. By +\thmref{th-weak-ske-owf}, we have +\begin{equation*} +\frac{\wt{D}v}{\abs{\wt{D}u}}(t)=\lim_{s\to t^+} +\frac{Dv(\interval{\left[t,s\right[})} +{\abs{\wt{D}u}(\interval{\left[t,s\right[})},\qquad +\frac{\wt{D}u}{\abs{\wt{D}u}}(t)=\lim_{s\to t^+} +\frac{Du(\interval{\left[t,s\right[})} +{\abs{\wt{D}u}(\interval{\left[t,s\right[})} +\end{equation*} +$\abs{\wt{D}u}$-almost everywhere in $\symbf{R}$. It is well known +(see, for instance, \cite[2.5.16]{ste:sint}) that every one-dimensional +function of bounded variation $w$ has a unique left continuous +representative, i.e., a function $\hat w$ such that $\hat w=w$ almost +everywhere and $\lim_{s\to t^-}\hat w(s)=\hat w(t)$ for every $t\in +\symbf{R}$. These conditions imply +\begin{equation} +\hat u(t)=Du(\interval{\left]-\infty,t\right[}), +\qquad \hat v(t)=Dv(\interval{\left]-\infty,t\right[})\qquad +\forall t\in\symbf{R} +\end{equation} +and +\begin{equation}\label{alimo} +\hat v(t)=f(\hat u(t))\qquad\forall t\in\symbf{R}.\end{equation} +Let $t\in\symbf{R}$ be such that +$\abs{\wt{D}u}(\interval{\left[t,s\right[})>0$ for every $s>t$ and +assume that the limits in \eqref{joe} exist. By \eqref{j:mark} and +\eqref{far-d} we get +\begin{equation*}\begin{split} +\frac{\hat v(s)-\hat +v(t)}{\abs{\wt{D}u}(\interval{\left[t,s\right[})}&=\frac {f(\hat +u(s))-f(\hat u(t))}{\abs{\wt{D}u}(\interval{\left[t,s\right[})}\\ +&=\frac{f(\hat u(s))-f(\hat +u(t)+\dfrac{\wt{D}u}{\abs{\wt{D}u}}(t)\abs{\wt{D}u +}(\interval{\left[t,s\right[}))}% +{\abs{\wt{D}u}(\interval{\left[t,s\right[})}\\ +&+\frac +{f(\hat u(t)+\dfrac{\wt{D}u}{\abs{\wt{D}u}}(t)\abs{\wt{D} +u}(\interval{\left[t,s\right[}))-f(\hat +u(t))}{\abs{\wt{D}u}(\interval{\left[t,s\right[})} +\end{split}\end{equation*} +for every $s>t$. Using the Lipschitz condition on $f$ we find +{\setlength{\multlinegap}{0pt} +\begin{multline*} +\left\lvert\frac{\hat v(s)-\hat +v(t)}{\abs{\wt{D}u}(\interval{\left[t,s\right[})} -\frac{f(\hat +u(t)+\dfrac{\wt{D}u}{\abs{\wt{D}u}}(t) +\abs{\wt{D}u}(\interval{\left[t,s\right[}))-f(\hat +u(t))}{\abs{\wt{D}u}(\interval{\left[t,s\right[})}\right\rvert\\ +\le K\left\lvert +\frac{\hat u(s)-\hat u(t)} + {\abs{\wt{D}u}(\interval{\left[t,s\right[})} +-\frac{\wt{D}u}{\abs{ +\wt{D}u}}(t)\right\rvert.\end{multline*} +}% end of group with \multlinegap=0pt +By \eqref{e:bomb}, the function $s\to +\abs{\wt{D}u}(\interval{\left[t,s\right[})$ is continuous and +converges to 0 as $s\downarrow t$. Therefore Remark~\ref{r:omb} and the +previous inequality imply +\[\frac{\wt{D}v}{\abs{\wt{D}u}}(t)=\lim_{h\to 0^+} +\frac{f(\hat u(t)+h\dfrac{\wt{D}u}{\abs{\wt{D}u}} +(t))-f(\hat u(t))}h\quad\abs{\wt{D}u}\text{-a.e. in }\symbf{R}.\] +By \eqref{joe}, $\hat u(x)=\tilde u(x)$ for every +$x\in\symbf{R}\backslash S_u$; moreover, applying the same argument to +the functions $u'(t)=u(-t)$, $v'(t)=f(u'(t))=v(-t)$, we get +\[\frac{\wt{D}v}{\abs{\wt{D}u}}(t)=\lim_{h\to 0} +\frac{f(\tilde u(t) ++h\dfrac{\wt{D}u}{\abs{\wt{D}u}}(t))-f(\tilde u(t))}{h} +\qquad\abs{\wt{D}u}\text{-a.e. in }\symbf{R}\] +and our statement is proved. + +\subsection*{Step 2} + +Let us consider now the general case $n>1$. Let $\nu\in \symbf{R}^n$ be +such that $\abs{\nu}=1$, and let $\pi_\nu=\{y\in\symbf{R}^n: \langle +y,\nu\rangle =0\}$. In the following, we shall identify $\symbf{R}^n$ +with $\pi_\nu\times\symbf{R}$, and we shall denote by $y$ the variable +ranging in $\pi_\nu$ and by $t$ the variable ranging in $\symbf{R}$. By +the just proven one-dimensional result, and by \thmref{thm-main}, we get +\[\lim_{h\to 0}\frac{f(\tilde u(y+t\nu)+h\dfrac{\wt{D}u_y}{\abs{ +\wt{D}u_y}}(t))-f(\tilde u(y+t\nu))}h=\frac{\wt{D}v_y}{\abs{ +\wt{D}u_y}}(t)\qquad\abs{\wt{D}u_y}\text{-a.e. in }\symbf{R}\] +for $\symcal{H}_{n-1}$-almost every $y\in \pi_\nu$. We claim that +\begin{equation} +\frac{\langle \wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle +}}(y+t\nu)=\frac{\wt{D}u_y} +{\abs{\wt{D}u_y}}(t)\qquad\abs{\wt{D}u_y}\text{-a.e. in }\symbf{R} +\end{equation} +for $\symcal{H}_{n-1}$-almost every $y\in\pi_\nu$. In fact, by +\eqref{sum-ali} and \eqref{delta-l} we get +\begin{multline*} +\int_{\pi_\nu}\frac{\wt{D}u_y}{\abs{\wt{D}u_y}}\cdot\abs{\wt{D}u_y +}\,d\symcal{H}_{n-1}(y)=\int_{\pi_\nu}\wt{D}u_y\,d\symcal{H}_{n-1}(y)\\ +=\langle \wt{D}u,\nu\rangle =\frac +{\langle \wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle}}\cdot +\abs{\langle \wt{D}u,\nu\rangle }=\int_{\pi_\nu}\frac{ +\langle \wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle }} +(y+\cdot \nu)\cdot\abs{\wt{D}u_y}\,d\symcal{H}_{n-1}(y) +\end{multline*} +and \eqref{far-d} follows from \eqref{sum-Di}. By the same argument it +is possible to prove that +\begin{equation} +\frac{\langle \wt{D}v,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle +}}(y+t\nu)=\frac{\wt{D}v_y}{\abs{\wt{D}u_y}}(t)\qquad\abs{ +\wt{D}u_y}\text{-a.e. in }\symbf{R}\end{equation} +for $\symcal{H}_{n-1}$-almost every $y\in \pi_\nu$. By \eqref{far-d} +and \eqref{E_SXgYy} we get +\[ +\lim_{h\to 0}\frac{f(\tilde u(y+t\nu)+h\dfrac{\langle \wt{D} +u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle }}(y+t\nu))-f(\tilde +u(y+t\nu))}{h} +=\frac{\langle \wt{D}v,\nu\rangle }{\abs{\langle +\wt{D}u,\nu\rangle }}(y+t\nu)\] +for $\symcal{H}_{n-1}$-almost every $y\in\pi_\nu$, and using again +\eqref{detK1}, \eqref{detK2} we get +\[ +\lim_{h\to 0}\frac{f(\tilde u(x)+h\dfrac{\langle +\wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle }}(x))-f(\tilde +u(x))}{h}=\frac{\langle \wt{D}v,\nu\rangle }{\abs{\langle \wt{D}u,\nu +\rangle }}(x) +\] +$\abs{\langle \wt{D}u,\nu\rangle}$-a.e. in $\symbf{R}^n$. + +Since the function $\abs{\langle \wt{D}u,\nu\rangle }/\abs{\wt{D}u}$ +is strictly positive $\abs{\langle \wt{D}u,\nu\rangle }$-almost everywhere, +we obtain also +\begin{multline*} +\lim_{h\to 0}\frac{f(\tilde u(x)+h\dfrac{\abs{\langle +\wt{D}u,\nu\rangle }}{\abs{\wt{D}u}}(x)\dfrac{\langle \wt{D} +u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle }}(x))-f(\tilde u(x))}{h}\\ +=\frac{\abs{\langle \wt{D}u,\nu\rangle }}{\abs{\wt{D}u}}(x)\frac +{\langle \wt{D}v,\nu\rangle }{\abs{\langle +\wt{D}u,\nu\rangle }}(x) +\end{multline*} +$\abs{\langle \wt{D}u,\nu\rangle }$-almost everywhere in $\symbf{R}^n$. + +Finally, since +\begin{align*} +&\frac{\abs{\langle \wt{D}u,\nu\rangle }}{\abs{\wt{D}u}} +\frac{\langle \wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle}} +=\frac{\langle \wt{D}u,\nu\rangle }{\abs{\wt{D}u}} +=\left\langle \frac{\wt{D}u}{\abs{\wt{D}u}},\nu\right\rangle + \qquad\abs{\wt{D}u}\text{-a.e. in }\symbf{R}^n\\ +&\frac{\abs{\langle \wt{D}u,\nu\rangle }}{\abs{\wt{D}u}} +\frac{\langle \wt{D}v,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle}} +=\frac{\langle \wt{D}v,\nu\rangle }{\abs{\wt{D}u}} +=\left\langle \frac{\wt{D}v}{\abs{\wt{D}u}},\nu\right\rangle + \qquad\abs{\wt{D}u}\text{-a.e. in }\symbf{R}^n +\end{align*} +and since both sides of \eqref{alimo} +are zero $\abs{\wt{D}u}$-almost everywhere +on $\abs{\langle \wt{D}u,\nu\rangle }$-negligible sets, we conclude that +\[ +\lim_{h\to 0}\frac{f\left( +\tilde u(x)+h\left\langle \dfrac{\wt{D} +u}{\abs{\wt{D}u}}(x),\nu\right\rangle \right)-f(\tilde u(x))}h +=\left\langle \frac{\wt{D}v}{\abs{\wt{D}u}}(x),\nu\right\rangle, +\] +$\abs{\wt{D}u}$-a.e. in $\symbf{R}^n$. +Since $\nu$ is arbitrary, by Remarks \ref{r:dif} and~\ref{r:dif0} +the restriction of $f$ to +the affine space $T^u_x$ is differentiable at $\tilde u(x)$ for $\abs{\wt{D} +u}$-almost every $x\in \symbf{R}^n$ and \eqref{quts} holds.\qed + +It follows from \eqref{sum-Di}, \eqref{detK1}, and \eqref{detK2} that +\begin{equation}\label{Dt} +D(t_1,\dots,t_n)=\sum_{I\in\symbf{n}}(-1)^{\abs{I}-1}\abs{I} +\prod_{i\in I}t_i\prod_{j\in I}(D_j+\lambda_jt_j)\det\symbf{A}^{(\lambda)} +(\overline I|\overline I). +\end{equation} +Let $t_i=\hat x_i$, $i=1,\dots,n$. Lemma 1 leads to +\begin{equation}\label{Dx} +D(\hat x_1,\dots,\hat x_n)=\prod_{i\in\symbf{n}}\hat x_i +\sum_{I\in\symbf{n}}(-1)^{\abs{I}-1}\abs{I}\per \symbf{A} +^{(\lambda)}(I|I)\det\symbf{A}^{(\lambda)}(\overline I|\overline I). +\end{equation} +By \eqref{H-cycles}, \eqref{sum-Di}, and \eqref{Dx}, +we have the following result: +\begin{thm}\label{thm-H-param} +\begin{equation}\label{H-param} +H_c=\frac{1}{2n}\sum^n_{l =1}l (-1)^{l -1}A_{l} +^{(\lambda)}, +\end{equation} +where +\begin{equation}\label{A-l-lambda} +A^{(\lambda)}_l =\sum_{I_l \subseteq\symbf{n}}\per \symbf{A} +^{(\lambda)}(I_l |I_l )\det\symbf{A}^{(\lambda)} +(\overline I_{l}|\overline I_l ),\abs{I_{l}}=l . +\end{equation} +\end{thm} + +It is worth noting that $A_l ^{(\lambda)}$ of \eqref{A-l-lambda} is +similar to the coefficients $b_l $ of the characteristic polynomial of +\eqref{bl-sum}. It is well known in graph theory that the coefficients +$b_l $ can be expressed as a sum over certain subgraphs. It is +interesting to see whether $A_l $, $\lambda=0$, structural properties +of a graph. + +We may call \eqref{H-param} a parametric representation of $H_c$. In +computation, the parameter $\lambda_i$ plays very important roles. The +choice of the parameter usually depends on the properties of the given +graph. For a complete graph $K_n$, let $\lambda_i=1$, $i=1,\dots,n$. +It follows from \eqref{A-l-lambda} that +\begin{equation}\label{compl-gr} +A^{(1)}_l =\begin{cases} n!,&\text{if }l =1\\ +0,&\text{otherwise}.\end{cases} +\end{equation} +By \eqref{H-param} +\begin{equation} +H_c=\frac 12(n-1)!. +\end{equation} +For a complete bipartite graph $K_{n_1n_2}$, let $\lambda_i=0$, $i=1,\dots,n$. +By \eqref{A-l-lambda}, +\begin{equation} +A_l = +\begin{cases} -n_1!n_2!\delta_{n_1n_2},&\text{if }l =2\\ +0,&\text{otherwise }.\end{cases} +\label{compl-bip-gr} +\end{equation} +Theorem~\ref{thm-H-param} +leads to +\begin{equation} +H_c=\frac1{n_1+n_2}n_1!n_2!\delta_{n_1n_2}. +\end{equation} + +Now, we consider an asymmetrical approach. Theorem \ref{thm-main} leads to +\begin{multline} +\det\symbf{K}(t=1,t_1,\dots,t_n;l |l )\\ +=\sum_{I\subseteq\symbf{n}-\{l \}} +(-1)^{\abs{I}}\prod_{i\in I}t_i\prod_{j\in I} +(D_j+\lambda_jt_j)\det\symbf{A}^{(\lambda)} +(\overline I\cup\{l \}|\overline I\cup\{l \}). +\end{multline} + +By \eqref{H-cycles} and \eqref{sum-ali} we have the following asymmetrical +result: +\begin{thm}\label{thm-asym} +\begin{equation} +H_c=\frac12\sum_{I\subseteq\symbf{n}-\{l \}} +(-1)^{\abs{I}}\per\symbf{A}^{(\lambda)}(I|I)\det +\symbf{A}^{(\lambda)} +(\overline I\cup\{l \}|\overline I\cup\{l \}) +\end{equation} +which reduces to Goulden--Jackson's formula when $\lambda_i=0,i=1,\dots,n$ +\cite{mami:matrixth}. +\end{thm} + +\section{Various font features of the \pkg{amsmath} package} +\label{s:font} +\subsection{Bold versions of special symbols} + +In the \pkg{amsmath} package \cn{boldsymbol} is used for getting +individual bold math symbols and bold Greek letters---everything in +math except for letters of the Latin alphabet, +where you'd use \cn{symbf}. For example, +\begin{verbatim} +A_\infty + \pi A_0 \sim +\symbf{A}_{\boldsymbol{\infty}} \boldsymbol{+} +\boldsymbol{\pi} \symbf{A}_{\boldsymbol{0}} +\end{verbatim} +looks like this: +\[A_\infty + \pi A_0 \sim \symbf{A}_{\boldsymbol{\infty}} +\boldsymbol{+} \boldsymbol{\pi} \symbf{A}_{\boldsymbol{0}}\] + +\subsection{``Poor man's bold''} +If a bold version of a particular symbol doesn't exist in the +available fonts, +then \cn{boldsymbol} can't be used to make that symbol bold. +At the present time, this means that +\cn{boldsymbol} can't be used with symbols from +the \fn{msam} and \fn{msbm} fonts, among others. +In some cases, poor man's bold (\cn{pmb}) can be used instead +of \cn{boldsymbol}: +% Can't show example from msam or msbm because this document is +% supposed to be TeXable even if the user doesn't have +% AMSFonts. MJD 5-JUL-1990 +\[\frac{\partial x}{\partial y} +\pmb{\bigg\vert} +\frac{\partial y}{\partial z}\] +\begin{verbatim} +\[\frac{\partial x}{\partial y} +\pmb{\bigg\vert} +\frac{\partial y}{\partial z}\] +\end{verbatim} +So-called ``large operator'' symbols such as $\sum$ and $\prod$ +require an additional command, \cn{mathop}, +to produce proper spacing and limits when \cn{pmb} is used. +For further details see \textit{The \TeX book}. +\[\sum_{\substack{i<B\\\text{$i$ odd}}} +\prod_\kappa \kappa F(r_i)\qquad +\mathop{\pmb{\sum}}_{\substack{i<B\\\text{$i$ odd}}} +\mathop{\pmb{\prod}}_\kappa \kappa(r_i) +\] +\begin{verbatim} +\[\sum_{\substack{i<B\\\text{$i$ odd}}} +\prod_\kappa \kappa F(r_i)\qquad +\mathop{\pmb{\sum}}_{\substack{i<B\\\text{$i$ odd}}} +\mathop{\pmb{\prod}}_\kappa \kappa(r_i) +\] +\end{verbatim} + +\section{Compound symbols and other features} +\label{s:comp} +\subsection{Multiple integral signs} + +\cn{iint}, \cn{iiint}, and \cn{iiiint} give multiple integral signs +with the spacing between them nicely adjusted, in both text and +display style. \cn{idotsint} gives two integral signs with dots +between them. +\begin{gather} +\iint\limits_A f(x,y)\,dx\,dy\qquad\iiint\limits_A +f(x,y,z)\,dx\,dy\,dz\\ +\iiiint\limits_A +f(w,x,y,z)\,dw\,dx\,dy\,dz\qquad\idotsint\limits_A f(x_1,\dots,x_k) +\end{gather} + +\subsection{Over and under arrows} + +Some extra over and under arrow operations are provided in +the \pkg{amsmath} package. (Basic \LaTeX\ provides +\cn{overrightarrow} and \cn{overleftarrow}). +\begin{align*} +\overrightarrow{\psi_\delta(t) E_t h}& +=\underrightarrow{\psi_\delta(t) E_t h}\\ +\overleftarrow{\psi_\delta(t) E_t h}& +=\underleftarrow{\psi_\delta(t) E_t h}\\ +\overleftrightarrow{\psi_\delta(t) E_t h}& +=\underleftrightarrow{\psi_\delta(t) E_t h} +\end{align*} +\begin{verbatim} +\begin{align*} +\overrightarrow{\psi_\delta(t) E_t h}& +=\underrightarrow{\psi_\delta(t) E_t h}\\ +\overleftarrow{\psi_\delta(t) E_t h}& +=\underleftarrow{\psi_\delta(t) E_t h}\\ +\overleftrightarrow{\psi_\delta(t) E_t h}& +=\underleftrightarrow{\psi_\delta(t) E_t h} +\end{align*} +\end{verbatim} +These all scale properly in subscript sizes: +\[\int_{\overrightarrow{AB}} ax\,dx\] +\begin{verbatim} +\[\int_{\overrightarrow{AB}} ax\,dx\] +\end{verbatim} + +\subsection{Dots} + +Normally you need only type \cn{dots} for ellipsis dots in a +math formula. The main exception is when the dots +fall at the end of the formula; then you need to +specify one of \cn{dotsc} (series dots, after a comma), +\cn{dotsb} (binary dots, for binary relations or operators), +\cn{dotsm} (multiplication dots), or \cn{dotsi} (dots after +an integral). For example, the input +\begin{verbatim} +Then we have the series $A_1,A_2,\dotsc$, +the regional sum $A_1+A_2+\dotsb$, +the orthogonal product $A_1A_2\dotsm$, +and the infinite integral +\[\int_{A_1}\int_{A_2}\dotsi\]. +\end{verbatim} +produces +\begin{quotation} +Then we have the series $A_1,A_2,\dotsc$, +the regional sum $A_1+A_2+\dotsb$, +the orthogonal product $A_1A_2\dotsm$, +and the infinite integral +\[\int_{A_1}\int_{A_2}\dotsi\] +\end{quotation} + +\subsection{Accents in math} + +Double accents: +\[\Hat{\Hat{H}}\quad\Check{\Check{C}}\quad +\Tilde{\Tilde{T}}\quad\Acute{\Acute{A}}\quad +\Grave{\Grave{G}}\quad\Dot{\Dot{D}}\quad +\Ddot{\Ddot{D}}\quad\Breve{\Breve{B}}\quad +\Bar{\Bar{B}}\quad\Vec{\Vec{V}}\] +\begin{verbatim} +\[\Hat{\Hat{H}}\quad\Check{\Check{C}}\quad +\Tilde{\Tilde{T}}\quad\Acute{\Acute{A}}\quad +\Grave{\Grave{G}}\quad\Dot{\Dot{D}}\quad +\Ddot{\Ddot{D}}\quad\Breve{\Breve{B}}\quad +\Bar{\Bar{B}}\quad\Vec{\Vec{V}}\] +\end{verbatim} +This double accent operation is complicated +and tends to slow down the processing of a \LaTeX\ file. + + +\subsection{Dot accents} +\cn{dddot} and \cn{ddddot} are available to +produce triple and quadruple dot accents +in addition to the \cn{dot} and \cn{ddot} accents already available +in \LaTeX: +\[\dddot{Q}\qquad\ddddot{R}\] +\begin{verbatim} +\[\dddot{Q}\qquad\ddddot{R}\] +\end{verbatim} + +\subsection{Roots} + +In the \pkg{amsmath} package \cn{leftroot} and \cn{uproot} allow you to adjust +the position of the root index of a radical: +\begin{verbatim} +\sqrt[\leftroot{-2}\uproot{2}\beta]{k} +\end{verbatim} +gives good positioning of the $\beta$: +\[\sqrt[\leftroot{0}\uproot{2}\beta]{k}\] + +\subsection{Boxed formulas} The command \cn{boxed} puts a box around its +argument, like \cn{fbox} except that the contents are in math mode: +\begin{verbatim} +\boxed{W_t-F\subseteq V(P_i)\subseteq W_t} +\end{verbatim} +\[\boxed{W_t-F\subseteq V(P_i)\subseteq W_t}.\] + +\subsection{Extensible arrows} +\cn{xleftarrow} and \cn{xrightarrow} produce +arrows that extend automatically to accommodate unusually wide +subscripts or superscripts. The text of the subscript or superscript +are given as an optional resp.\@ mandatory argument: +Example: +\[0 \xleftarrow[\zeta]{\alpha} F\times\triangle[n-1] + \xrightarrow{\partial_0\alpha(b)} E^{\partial_0b}\] +\begin{verbatim} +\[0 \xleftarrow[\zeta]{\alpha} F\times\triangle[n-1] + \xrightarrow{\partial_0\alpha(b)} E^{\partial_0b}\] +\end{verbatim} + +\subsection{\cn{overset}, \cn{underset}, and \cn{sideset}} +Examples: +\[\overset{*}{X}\qquad\underset{*}{X}\qquad +\overset{a}{\underset{b}{X}}\] +\begin{verbatim} +\[\overset{*}{X}\qquad\underset{*}{X}\qquad +\overset{a}{\underset{b}{X}}\] +\end{verbatim} + +The command \cn{sideset} is for a rather special +purpose: putting symbols at the subscript and superscript +corners of a large operator symbol such as $\sum$ or $\prod$, +without affecting the placement of limits. +Examples: +\[\sideset{_*^*}{_*^*}\prod_k\qquad +\sideset{}{'}\sum_{0\le i\le m} E_i\beta x +\] +\begin{verbatim} +\[\sideset{_*^*}{_*^*}\prod_k\qquad +\sideset{}{'}\sum_{0\le i\le m} E_i\beta x +\] +\end{verbatim} + +\subsection{The \cn{text} command} +The main use of the command \cn{text} is for words or phrases in a +display: +\[\symbf{y}=\symbf{y}'\quad\text{if and only if}\quad +y'_k=\delta_k y_{\tau(k)}\] +\begin{verbatim} +\[\symbf{y}=\symbf{y}'\quad\text{if and only if}\quad +y'_k=\delta_k y_{\tau(k)}\] +\end{verbatim} + +\subsection{Operator names} +The more common math functions such as $\log$, $\sin$, and $\lim$ +have predefined control sequences: \verb=\log=, \verb=\sin=, +\verb=\lim=. +The \pkg{amsmath} package provides \cn{DeclareMathOperator} and +\cn{DeclareMathOperator*} +for producing new function names that will have the +same typographical treatment. +Examples: +\[\norm{f}_\infty= +\esssup_{x\in R^n}\abs{f(x)}\] +\begin{verbatim} +\[\norm{f}_\infty= +\esssup_{x\in R^n}\abs{f(x)}\] +\end{verbatim} +\[\meas_1\{u\in R_+^1\colon f^*(u)>\alpha\} +=\meas_n\{x\in R^n\colon \abs{f(x)}\geq\alpha\} +\quad \forall\alpha>0.\] +\begin{verbatim} +\[\meas_1\{u\in R_+^1\colon f^*(u)>\alpha\} +=\meas_n\{x\in R^n\colon \abs{f(x)}\geq\alpha\} +\quad \forall\alpha>0.\] +\end{verbatim} +\cn{esssup} and \cn{meas} would be defined in the document preamble as +\begin{verbatim} +\DeclareMathOperator*{\esssup}{ess\,sup} +\DeclareMathOperator{\meas}{meas} +\end{verbatim} + +The following special operator names are predefined in the \pkg{amsmath} +package: \cn{varlimsup}, \cn{varliminf}, \cn{varinjlim}, and +\cn{varprojlim}. Here's what they look like in use: +\begin{align} +&\varlimsup_{n\rightarrow\infty} + \symcal{Q}(u_n,u_n-u^{\#})\le0\\ +&\varliminf_{n\rightarrow\infty} + \left\lvert a_{n+1}\right\rvert/\left\lvert a_n\right\rvert=0\\ +&\varinjlim (m_i^\lambda\cdot)^*\le0\\ +&\varprojlim_{p\in S(A)}A_p\le0 +\end{align} +\begin{verbatim} +\begin{align} +&\varlimsup_{n\rightarrow\infty} + \symcal{Q}(u_n,u_n-u^{\#})\le0\\ +&\varliminf_{n\rightarrow\infty} + \left\lvert a_{n+1}\right\rvert/\left\lvert a_n\right\rvert=0\\ +&\varinjlim (m_i^\lambda\cdot)^*\le0\\ +&\varprojlim_{p\in S(A)}A_p\le0 +\end{align} +\end{verbatim} + +\subsection{\cn{mod} and its relatives} +The commands \cn{mod} and \cn{pod} are variants of +\cn{pmod} preferred by some authors; \cn{mod} omits the parentheses, +whereas \cn{pod} omits the `mod' and retains the parentheses. +Examples: +\begin{align} +x&\equiv y+1\pmod{m^2}\\ +x&\equiv y+1\mod{m^2}\\ +x&\equiv y+1\pod{m^2} +\end{align} +\begin{verbatim} +\begin{align} +x&\equiv y+1\pmod{m^2}\\ +x&\equiv y+1\mod{m^2}\\ +x&\equiv y+1\pod{m^2} +\end{align} +\end{verbatim} + +\subsection{Fractions and related constructions} +\label{fracs} + +The usual notation for binomials is similar to the fraction concept, +so it has a similar command \cn{binom} with two arguments. Example: +\begin{equation} +\begin{split} +\sum_{\gamma\in\Gamma_C} I_\gamma& +=2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2}\\ +&\quad+\dots+(-1)^l\binom{k}{l}2^{k-l} ++\dots+(-1)^k\\ +&=(2-1)^k=1 +\end{split} +\end{equation} +\begin{verbatim} +\begin{equation} +\begin{split} +[\sum_{\gamma\in\Gamma_C} I_\gamma& +=2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2}\\ +&\quad+\dots+(-1)^l\binom{k}{l}2^{k-l} ++\dots+(-1)^k\\ +&=(2-1)^k=1 +\end{split} +\end{equation} +\end{verbatim} +There are also abbreviations +\begin{verbatim} +\dfrac \dbinom +\tfrac \tbinom +\end{verbatim} +for the commonly needed constructions +\begin{verbatim} +{\displaystyle\frac ... } {\displaystyle\binom ... } +{\textstyle\frac ... } {\textstyle\binom ... } +\end{verbatim} + +The generalized fraction command \cn{genfrac} provides full access to +the six \TeX{} fraction primitives: +\begin{align} +\text{\cn{over}: }&\genfrac{}{}{}{}{n+1}{2}& +\text{\cn{overwithdelims}: }& + \genfrac{\langle}{\rangle}{}{}{n+1}{2}\\ +\text{\cn{atop}: }&\genfrac{}{}{0pt}{}{n+1}{2}& +\text{\cn{atopwithdelims}: }& + \genfrac{(}{)}{0pt}{}{n+1}{2}\\ +\text{\cn{above}: }&\genfrac{}{}{1pt}{}{n+1}{2}& +\text{\cn{abovewithdelims}: }& + \genfrac{[}{]}{1pt}{}{n+1}{2} +\end{align} +\begin{verbatim} +\text{\cn{over}: }&\genfrac{}{}{}{}{n+1}{2}& +\text{\cn{overwithdelims}: }& + \genfrac{\langle}{\rangle}{}{}{n+1}{2}\\ +\text{\cn{atop}: }&\genfrac{}{}{0pt}{}{n+1}{2}& +\text{\cn{atopwithdelims}: }& + \genfrac{(}{)}{0pt}{}{n+1}{2}\\ +\text{\cn{above}: }&\genfrac{}{}{1pt}{}{n+1}{2}& +\text{\cn{abovewithdelims}: }& + \genfrac{[}{]}{1pt}{}{n+1}{2} +\end{verbatim} + +\subsection{Continued fractions} +The continued fraction +\begin{equation} +\cfrac{1}{\sqrt{2}+ + \cfrac{1}{\sqrt{2}+ + \cfrac{1}{\sqrt{2}+ + \cfrac{1}{\sqrt{2}+ + \cfrac{1}{\sqrt{2}+\dotsb +}}}}} +\end{equation} +can be obtained by typing +\begin{verbatim} +\cfrac{1}{\sqrt{2}+ + \cfrac{1}{\sqrt{2}+ + \cfrac{1}{\sqrt{2}+ + \cfrac{1}{\sqrt{2}+ + \cfrac{1}{\sqrt{2}+\dotsb +}}}}} +\end{verbatim} +Left or right placement of any of the numerators is accomplished by using +\cn{cfrac[l]} or \cn{cfrac[r]} instead of \cn{cfrac}. + +\subsection{Smash} + +In \pkg{amsmath} there are optional arguments \verb"t" and \verb"b" for +the plain \TeX\ command \cn{smash}, because sometimes it is advantageous +to be able to `smash' only the top or only the bottom of something while +retaining the natural depth or height. In the formula +$X_j=(1/\sqrt{\smash[b]{\lambda_j}})X_j'$ \cn{smash}\verb=[b]= has been +used to limit the size of the radical symbol. +\begin{verbatim} +$X_j=(1/\sqrt{\smash[b]{\lambda_j}})X_j'$ +\end{verbatim} +Without the use of \cn{smash}\verb=[b]= the formula would have appeared +thus: $X_j=(1/\sqrt{\lambda_j})X_j'$, with the radical extending to +encompass the depth of the subscript $j$. + +\subsection{The `cases' environment} +`Cases' constructions like the following can be produced using +the \env{cases} environment. +\begin{equation} +P_{r-j}= + \begin{cases} + 0& \text{if $r-j$ is odd},\\ + r!\,(-1)^{(r-j)/2}& \text{if $r-j$ is even}. + \end{cases} +\end{equation} +\begin{verbatim} +\begin{equation} P_{r-j}= + \begin{cases} + 0& \text{if $r-j$ is odd},\\ + r!\,(-1)^{(r-j)/2}& \text{if $r-j$ is even}. + \end{cases} +\end{equation} +\end{verbatim} +Notice the use of \cn{text} and the embedded math. + +\subsection{Matrix} + +Here are samples of the matrix environments, +\cn{matrix}, \cn{pmatrix}, \cn{bmatrix}, \cn{Bmatrix}, \cn{vmatrix} +and \cn{Vmatrix}: +\begin{equation} +\begin{matrix} +\vartheta& \varrho\\\varphi& \varpi +\end{matrix}\quad +\begin{pmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{pmatrix}\quad +\begin{bmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{bmatrix}\quad +\begin{Bmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{Bmatrix}\quad +\begin{vmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{vmatrix}\quad +\begin{Vmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{Vmatrix} +\end{equation} +% +\begin{verbatim} +\begin{matrix} +\vartheta& \varrho\\\varphi& \varpi +\end{matrix}\quad +\begin{pmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{pmatrix}\quad +\begin{bmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{bmatrix}\quad +\begin{Bmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{Bmatrix}\quad +\begin{vmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{vmatrix}\quad +\begin{Vmatrix} +\vartheta& \varrho\\\varphi& \varpi +\end{Vmatrix} +\end{verbatim} + +To produce a small matrix suitable for use in text, use the +\env{smallmatrix} environment. +\begin{verbatim} +\begin{math} + \bigl( \begin{smallmatrix} + a&b\\ c&d + \end{smallmatrix} \bigr) +\end{math} +\end{verbatim} +To show +the effect of the matrix on the surrounding lines of +a paragraph, we put it here: \begin{math} + \bigl( \begin{smallmatrix} + a&b\\ c&d + \end{smallmatrix} \bigr) +\end{math} +and follow it with enough text to ensure that there will +be at least one full line below the matrix. + +\cn{hdotsfor}\verb"{"\textit{number}\verb"}" produces a row of dots in a matrix +spanning the given number of columns: +\[W(\Phi)= \begin{Vmatrix} +\dfrac\varphi{(\varphi_1,\varepsilon_1)}&0&\dots&0\\ +\dfrac{\varphi k_{n2}}{(\varphi_2,\varepsilon_1)}& +\dfrac\varphi{(\varphi_2,\varepsilon_2)}&\dots&0\\ +\hdotsfor{5}\\ +\dfrac{\varphi k_{n1}}{(\varphi_n,\varepsilon_1)}& +\dfrac{\varphi k_{n2}}{(\varphi_n,\varepsilon_2)}&\dots& +\dfrac{\varphi k_{n\,n-1}}{(\varphi_n,\varepsilon_{n-1})}& +\dfrac{\varphi}{(\varphi_n,\varepsilon_n)} +\end{Vmatrix}\] +\begin{verbatim} +\[W(\Phi)= \begin{Vmatrix} +\dfrac\varphi{(\varphi_1,\varepsilon_1)}&0&\dots&0\\ +\dfrac{\varphi k_{n2}}{(\varphi_2,\varepsilon_1)}& +\dfrac\varphi{(\varphi_2,\varepsilon_2)}&\dots&0\\ +\hdotsfor{5}\\ +\dfrac{\varphi k_{n1}}{(\varphi_n,\varepsilon_1)}& +\dfrac{\varphi k_{n2}}{(\varphi_n,\varepsilon_2)}&\dots& +\dfrac{\varphi k_{n\,n-1}}{(\varphi_n,\varepsilon_{n-1})}& +\dfrac{\varphi}{(\varphi_n,\varepsilon_n)} +\end{Vmatrix}\] +\end{verbatim} +The spacing of the dots can be varied through use of a square-bracket +option, for example, \verb"\hdotsfor[1.5]{3}". The number in square brackets +will be used as a multiplier; the normal value is 1. + +\subsection{The \cn{substack} command} + +The \cn{substack} command can be used to produce a multiline +subscript or superscript: +for example +\begin{verbatim} +\sum_{\substack{0\le i\le m\\ 0<j<n}} P(i,j) +\end{verbatim} +produces a two-line subscript underneath the sum: +\begin{equation} +\sum_{\substack{0\le i\le m\\ 0<j<n}} P(i,j) +\end{equation} +A slightly more generalized form is the \env{subarray} environment which +allows you to specify that each line should be left-aligned instead of +centered, as here: +\begin{equation} +\sum_{\begin{subarray}{l} + 0\le i\le m\\ 0<j<n + \end{subarray}} + P(i,j) +\end{equation} +\begin{verbatim} +\sum_{\begin{subarray}{l} + 0\le i\le m\\ 0<j<n + \end{subarray}} + P(i,j) +\end{verbatim} + + +\subsection{Big-g-g delimiters} +Here are some big delimiters, first in \cn{normalsize}: +\[\biggl(\symbf{E}_{y} + \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds + \biggr) +\] +\begin{verbatim} +\[\biggl(\symbf{E}_{y} + \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds + \biggr) +\] +\end{verbatim} +and now in \cn{Large} size: +{\Large +\[\biggl(\symbf{E}_{y} + \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds + \biggr) +\]} +\begin{verbatim} +{\Large +\[\biggl(\symbf{E}_{y} + \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds + \biggr) +\]} +\end{verbatim} + +\newpage +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\makeatletter + +%% This turns on vertical rules at the right and left margins, to +%% better illustrate the spacing for certain multiple-line equation +%% structures. +\def\@makecol{\ifvoid\footins \setbox\@outputbox\box\@cclv + \else\setbox\@outputbox + \vbox{\boxmaxdepth \maxdepth + \unvbox\@cclv\vskip\skip\footins\footnoterule\unvbox\footins}\fi + \xdef\@freelist{\@freelist\@midlist}\gdef\@midlist{}\@combinefloats + \setbox\@outputbox\hbox{\vrule width\marginrulewidth + \vbox to\@colht{\boxmaxdepth\maxdepth + \@texttop\dimen128=\dp\@outputbox\unvbox\@outputbox + \vskip-\dimen128\@textbottom}% + \vrule width\marginrulewidth}% + \global\maxdepth\@maxdepth} +\newdimen\marginrulewidth +\setlength{\marginrulewidth}{.1pt} +\makeatother + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\appendix +\section{Examples of multiple-line equation structures} +\label{s:eq} + +\textbf{\large Note: Starting on this page, vertical rules are +added at the margins so that the positioning of various display elements +with respect to the margins can be seen more clearly.} + +\subsection{Split} +The \env{split} environment is not an independent environment +but should be used inside something else such as \env{equation} +or \env{align}. + +If there is not enough room for it, the equation number for a +\env{split} will be shifted to the previous line, when equation numbers are +on the left; the number shifts down to the next line when numbers are on +the right. +\begin{equation} +\begin{split} +f_{h,\varepsilon}(x,y) +&=\varepsilon\symbf{E}_{x,y}\int_0^{t_\varepsilon} +L_{x,y_\varepsilon(\varepsilon u)}\varphi(x)\,du\\ +&= h\int L_{x,z}\varphi(x)\rho_x(dz)\\ +&\quad+h\biggl[\frac{1}{t_\varepsilon}\biggl(\symbf{E}_{y} + \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds + -t_\varepsilon\int L_{x,z}\varphi(x)\rho_x(dz)\biggr)\\ +&\phantom{{=}+h\biggl[}+\frac{1}{t_\varepsilon} + \biggl(\symbf{E}_{y}\int_0^{t_\varepsilon}L_{x,y^x(s)} + \varphi(x)\,ds -\symbf{E}_{x,y}\int_0^{t_\varepsilon} + L_{x,y_\varepsilon(\varepsilon s)} + \varphi(x)\,ds\biggr)\biggr]\\ +&=h\wh{L}_x\varphi(x)+h\theta_\varepsilon(x,y), +\end{split} +\end{equation} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{equation} +\begin{split} +f_{h,\varepsilon}(x,y) +&=\varepsilon\symbf{E}_{x,y}\int_0^{t_\varepsilon} +L_{x,y_\varepsilon(\varepsilon u)}\varphi(x)\,du\\ +&= h\int L_{x,z}\varphi(x)\rho_x(dz)\\ +&\quad+h\biggl[\frac{1}{t_\varepsilon}\biggl(\symbf{E}_{y} + \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds + -t_\varepsilon\int L_{x,z}\varphi(x)\rho_x(dz)\biggr)\\ +&\phantom{{=}+h\biggl[}+\frac{1}{t_\varepsilon} + \biggl(\symbf{E}_{y}\int_0^{t_\varepsilon}L_{x,y^x(s)} + \varphi(x)\,ds -\symbf{E}_{x,y}\int_0^{t_\varepsilon} + L_{x,y_\varepsilon(\varepsilon s)} + \varphi(x)\,ds\biggr)\biggr]\\ +&=h\wh{L}_x\varphi(x)+h\theta_\varepsilon(x,y), +\end{split} +\end{equation} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +Unnumbered version: +\begin{equation*} +\begin{split} +f_{h,\varepsilon}(x,y) +&=\varepsilon\symbf{E}_{x,y}\int_0^{t_\varepsilon} +L_{x,y_\varepsilon(\varepsilon u)}\varphi(x)\,du\\ +&= h\int L_{x,z}\varphi(x)\rho_x(dz)\\ +&\quad+h\biggl[\frac{1}{t_\varepsilon}\biggl(\symbf{E}_{y} + \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds + -t_\varepsilon\int L_{x,z}\varphi(x)\rho_x(dz)\biggr)\\ +&\phantom{{=}+h\biggl[}+\frac{1}{t_\varepsilon} + \biggl(\symbf{E}_{y}\int_0^{t_\varepsilon}L_{x,y^x(s)} + \varphi(x)\,ds -\symbf{E}_{x,y}\int_0^{t_\varepsilon} + L_{x,y_\varepsilon(\varepsilon s)} + \varphi(x)\,ds\biggr)\biggr]\\ +&=h\wh{L}_x\varphi(x)+h\theta_\varepsilon(x,y), +\end{split} +\end{equation*} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{equation*} +\begin{split} +f_{h,\varepsilon}(x,y) +&=\varepsilon\symbf{E}_{x,y}\int_0^{t_\varepsilon} +L_{x,y_\varepsilon(\varepsilon u)}\varphi(x)\,du\\ +&= h\int L_{x,z}\varphi(x)\rho_x(dz)\\ +&\quad+h\biggl[\frac{1}{t_\varepsilon}\biggl(\symbf{E}_{y} + \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds + -t_\varepsilon\int L_{x,z}\varphi(x)\rho_x(dz)\biggr)\\ +&\phantom{{=}+h\biggl[}+\frac{1}{t_\varepsilon} + \biggl(\symbf{E}_{y}\int_0^{t_\varepsilon}L_{x,y^x(s)} + \varphi(x)\,ds -\symbf{E}_{x,y}\int_0^{t_\varepsilon} + L_{x,y_\varepsilon(\varepsilon s)} + \varphi(x)\,ds\biggr)\biggr]\\ +&=h\wh{L}_x\varphi(x)+h\theta_\varepsilon(x,y), +\end{split} +\end{equation*} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +If the option \env{centertags} is included in the options +list of the \pkg{amsmath} package, +the equation numbers for \env{split} environments will be +centered vertically on the height +of the \env{split}: +{\makeatletter\ctagsplit@true +\begin{equation} +\begin{split} + \abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t)-\int_{\gamma(t)}^a + \frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\ +&\le C_6\left\lvert \left\lvert f\int_\Omega\left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split} +\end{equation}}% +Some text after to test the below-display spacing. + +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +Use of \env{split} within \env{align}: +{\delimiterfactor750 +\begin{align} +\begin{split}\abs{I_1} + &=\left\lvert \int_\Omega gRu\,d\Omega\right\rvert\\ +&\le C_3\left[\int_\Omega\left(\int_{a}^x + g(\xi,t)\,d\xi\right)^2d\Omega\right]^{1/2}\\ +&\quad\times \left[\int_\Omega\left\{u^2_x+\frac{1}{k} + \left(\int_{a}^x cu_t\,d\xi\right)^2\right\} + c\Omega\right]^{1/2}\\ +&\le C_4\left\lvert \left\lvert f\left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split}\label{eq:A}\\ +\begin{split}\abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t) + -\int_{\gamma(t)}^a\frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\ +&\le C_6\left\lvert \left\lvert f\int_\Omega + \left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split} +\end{align}}% +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{align} +\begin{split}\abs{I_1} + &=\left\lvert \int_\Omega gRu\,d\Omega\right\rvert\\ +&\le C_3\left[\int_\Omega\left(\int_{a}^x + g(\xi,t)\,d\xi\right)^2d\Omega\right]^{1/2}\\ +&\quad\times \left[\int_\Omega\left\{u^2_x+\frac{1}{k} + \left(\int_{a}^x cu_t\,d\xi\right)^2\right\} + c\Omega\right]^{1/2}\\ +&\le C_4\left\lvert \left\lvert f\left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split}\label{eq:A}\\ +\begin{split}\abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t) + -\int_{\gamma(t)}^a\frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\ +&\le C_6\left\lvert \left\lvert f\int_\Omega + \left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split} +\end{align} +\end{verbatim} + +%%%%%%%%%%%%%%%%%% + +\newpage +Unnumbered \env{align}, with a number on the second \env{split}: +\begin{align*} +\begin{split}\abs{I_1}&=\left\lvert \int_\Omega gRu\,d\Omega\right\rvert\\ + &\le C_3\left[\int_\Omega\left(\int_{a}^x + g(\xi,t)\,d\xi\right)^2d\Omega\right]^{1/2}\\ +&\phantom{=}\times \left[\int_\Omega\left\{u^2_x+\frac{1}{k} + \left(\int_{a}^x cu_t\,d\xi\right)^2\right\} + c\Omega\right]^{1/2}\\ +&\le C_4\left\lvert \left\lvert f\left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split}\\ +\begin{split}\abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t) + -\int_{\gamma(t)}^a\frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\ +&\le C_6\left\lvert \left\lvert f\int_\Omega + \left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split}\tag{\theequation$'$} +\end{align*} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{align*} +\begin{split}\abs{I_1}&=\left\lvert \int_\Omega gRu\,d\Omega\right\rvert\\ + &\le C_3\left[\int_\Omega\left(\int_{a}^x + g(\xi,t)\,d\xi\right)^2d\Omega\right]^{1/2}\\ +&\phantom{=}\times \left[\int_\Omega\left\{u^2_x+\frac{1}{k} + \left(\int_{a}^x cu_t\,d\xi\right)^2\right\} + c\Omega\right]^{1/2}\\ +&\le C_4\left\lvert \left\lvert f\left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split}\\ +\begin{split}\abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t) + -\int_{\gamma(t)}^a\frac{d\theta}{k(\theta,t)} + \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\ +&\le C_6\left\lvert \left\lvert f\int_\Omega + \left\lvert \wt{S}^{-1,0}_{a,-} + W_2(\Omega,\Gamma_l)\right\rvert\right\rvert + \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}} + (\Omega;\Gamma_r,T)\right\rvert\right\rvert. +\end{split}\tag{\theequation$'$} +\end{align*} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +\subsection{Multline} +Numbered version: +\begin{multline}\label{eq:E} +\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2] + -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\ + =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2 + \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy +\end{multline} +To test the use of \verb=\label= and +\verb=\ref=, we refer to the number of this +equation here: (\ref{eq:E}). + +\begin{verbatim} +\begin{multline}\label{eq:E} +\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2] + -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\ + =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2 + \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy +\end{multline} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Unnumbered version: +\begin{multline*} +\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2] + -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\ + =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2 + \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy +\end{multline*} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{multline*} +\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2] + -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\ + =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2 + \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy +\end{multline*} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\iffalse % bugfix needed, error message "Multiple \tag" + % [mjd,24-Jan-1995] +\newpage +And now an ``unnumbered'' version numbered with a literal tag: +\begin{multline*}\tag*{[a]} +\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2] + -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\ + =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2 + \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy +\end{multline*} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{multline*}\tag*{[a]} +\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2] + -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\ + =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2 + \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy +\end{multline*} +\end{verbatim} + +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The same display with \verb=\multlinegap= set to zero. +Notice that the space on the left in +the first line does not change, because of the equation number, while +the second line is pushed over to the right margin. +{\setlength{\multlinegap}{0pt} +\begin{multline*}\tag*{[a]} +\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2] + -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\ + =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2 + \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy +\end{multline*}}% +Some text after to test the below-display spacing. + +\begin{verbatim} +{\setlength{\multlinegap}{0pt} +\begin{multline*}\tag*{[a]} +\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2] + -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\ + =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2 + \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy +\end{multline*}} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\fi % matches \iffalse above [mjd,24-Jan-1995] + +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +\subsection{Gather} +Numbered version with \verb;\notag; on the second line: +\begin{gather} +D(a,r)\equiv\{z\in\symbf{C}\colon \abs{z-a}<r\},\\ +\seg(a,r)\equiv\{z\in\symbf{C}\colon +\Im z= \Im a,\ \abs{z-a}<r\},\notag\\ +c(e,\theta,r)\equiv\{(x,y)\in\symbf{C} +\colon \abs{x-e}<y\tan\theta,\ 0<y<r\},\\ +C(E,\theta,r)\equiv\bigcup_{e\in E}c(e,\theta,r). +\end{gather} +\begin{verbatim} +\begin{gather} +D(a,r)\equiv\{z\in\symbf{C}\colon \abs{z-a}<r\},\\ +\seg(a,r)\equiv\{z\in\symbf{C}\colon +\Im z= \Im a,\ \abs{z-a}<r\},\notag\\ +c(e,\theta,r)\equiv\{(x,y)\in\symbf{C} +\colon \abs{x-e}<y\tan\theta,\ 0<y<r\},\\ +C(E,\theta,r)\equiv\bigcup_{e\in E}c(e,\theta,r). +\end{gather} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Unnumbered version. +\begin{gather*} +D(a,r)\equiv\{z\in\symbf{C}\colon \abs{z-a}<r\},\\ +\seg (a,r)\equiv\{z\in\symbf{C}\colon +\Im z= \Im a,\ \abs{z-a}<r\},\\ +c(e,\theta,r)\equiv\{(x,y)\in\symbf{C} + \colon \abs{x-e}<y\tan\theta,\ 0<y<r\},\\ +C(E,\theta,r)\equiv\bigcup_{e\in E}c(e,\theta,r). +\end{gather*} +Some text after to test the below-display spacing. +\begin{verbatim} +\begin{gather*} +D(a,r)\equiv\{z\in\symbf{C}\colon \abs{z-a}<r\},\\ +\seg (a,r)\equiv\{z\in\symbf{C}\colon +\Im z= \Im a,\ \abs{z-a}<r\},\\ +c(e,\theta,r)\equiv\{(x,y)\in\symbf{C} + \colon \abs{x-e}<y\tan\theta,\ 0<y<r\},\\ +C(E,\theta,r)\equiv\bigcup_{e\in E}c(e,\theta,r). +\end{gather*} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +\subsection{Align} +Numbered version: +\begin{align} +\gamma_x(t)&=(\cos tu+\sin tx,v),\\ +\gamma_y(t)&=(u,\cos tv+\sin ty),\\ +\gamma_z(t)&=\left(\cos tu+\frac\alpha\beta\sin tv, + -\frac\beta\alpha\sin tu+\cos tv\right). +\end{align} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{align} +\gamma_x(t)&=(\cos tu+\sin tx,v),\\ +\gamma_y(t)&=(u,\cos tv+\sin ty),\\ +\gamma_z(t)&=\left(\cos tu+\frac\alpha\beta\sin tv, + -\frac\beta\alpha\sin tu+\cos tv\right). +\end{align} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Unnumbered version: +\begin{align*} +\gamma_x(t)&=(\cos tu+\sin tx,v),\\ +\gamma_y(t)&=(u,\cos tv+\sin ty),\\ +\gamma_z(t)&=\left(\cos tu+\frac\alpha\beta\sin tv, + -\frac\beta\alpha\sin tu+\cos tv\right). +\end{align*} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{align*} +\gamma_x(t)&=(\cos tu+\sin tx,v),\\ +\gamma_y(t)&=(u,\cos tv+\sin ty),\\ +\gamma_z(t)&=\left(\cos tu+\frac\alpha\beta\sin tv, + -\frac\beta\alpha\sin tu+\cos tv\right). +\end{align*} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +A variation: +\begin{align} +x& =y && \text {by (\ref{eq:C})}\\ +x'& = y' && \text {by (\ref{eq:D})}\\ +x+x' & = y+y' && \text {by Axiom 1.} +\end{align} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{align} +x& =y && \text {by (\ref{eq:C})}\\ +x'& = y' && \text {by (\ref{eq:D})}\\ +x+x' & = y+y' && \text {by Axiom 1.} +\end{align} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +\subsection{Align and split within gather} +When using the \env{align} environment within the \env{gather} +environment, one or the other, or both, should be unnumbered (using the +\verb"*" form); numbering both the outer and inner environment would +cause a conflict. + +Automatically numbered \env{gather} with \env{split} and \env{align*}: +\begin{gather} +\begin{split} \varphi(x,z) +&=z-\gamma_{10}x-\gamma_{mn}x^mz^n\\ +&=z-Mr^{-1}x-Mr^{-(m+n)}x^mz^n +\end{split}\\[6pt] +\begin{align*} +\zeta^0 &=(\xi^0)^2,\\ +\zeta^1 &=\xi^0\xi^1,\\ +\zeta^2 &=(\xi^1)^2, +\end{align*} +\end{gather} +Here the \env{split} environment gets a number from the outer +\env{gather} environment; numbers for individual lines of the +\env{align*} are suppressed because of the star. + +\begin{verbatim} +\begin{gather} +\begin{split} \varphi(x,z) +&=z-\gamma_{10}x-\gamma_{mn}x^mz^n\\ +&=z-Mr^{-1}x-Mr^{-(m+n)}x^mz^n +\end{split}\\[6pt] +\begin{align*} +\zeta^0 &=(\xi^0)^2,\\ +\zeta^1 &=\xi^0\xi^1,\\ +\zeta^2 &=(\xi^1)^2, +\end{align*} +\end{gather} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The \verb"*"-ed form of \env{gather} with the non-\verb"*"-ed form of +\env{align}. +\begin{gather*} +\begin{split} \varphi(x,z) +&=z-\gamma_{10}x-\gamma_{mn}x^mz^n\\ +&=z-Mr^{-1}x-Mr^{-(m+n)}x^mz^n +\end{split}\\[6pt] +\begin{align} \zeta^0&=(\xi^0)^2,\\ +\zeta^1 &=\xi^0\xi^1,\\ +\zeta^2 &=(\xi^1)^2, +\end{align} +\end{gather*} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{gather*} +\begin{split} \varphi(x,z) +&=z-\gamma_{10}x-\gamma_{mn}x^mz^n\\ +&=z-Mr^{-1}x-Mr^{-(m+n)}x^mz^n +\end{split}\\[6pt] +\begin{align} \zeta^0&=(\xi^0)^2,\\ +\zeta^1 &=\xi^0\xi^1,\\ +\zeta^2 &=(\xi^1)^2, +\end{align} +\end{gather*} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +\subsection{Alignat} +Numbered version: +\begin{alignat}{3} +V_i & =v_i - q_i v_j, & \qquad X_i & = x_i - q_i x_j, + & \qquad U_i & = u_i, + \qquad \text{for $i\ne j$;}\label{eq:B}\\ +V_j & = v_j, & \qquad X_j & = x_j, + & \qquad U_j & u_j + \sum_{i\ne j} q_i u_i. +\end{alignat} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{alignat}{3} +V_i & =v_i - q_i v_j, & \qquad X_i & = x_i - q_i x_j, + & \qquad U_i & = u_i, + \qquad \text{for $i\ne j$;}\label{eq:B}\\ +V_j & = v_j, & \qquad X_j & = x_j, + & \qquad U_j & u_j + \sum_{i\ne j} q_i u_i. +\end{alignat} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Unnumbered version: +\begin{alignat*}3 +V_i & =v_i - q_i v_j, & \qquad X_i & = x_i - q_i x_j, + & \qquad U_i & = u_i, + \qquad \text{for $i\ne j$;} \\ +V_j & = v_j, & \qquad X_j & = x_j, + & \qquad U_j & u_j + \sum_{i\ne j} q_i u_i. +\end{alignat*} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{alignat*}3 +V_i & =v_i - q_i v_j, & \qquad X_i & = x_i - q_i x_j, + & \qquad U_i & = u_i, + \qquad \text{for $i\ne j$;} \\ +V_j & = v_j, & \qquad X_j & = x_j, + & \qquad U_j & u_j + \sum_{i\ne j} q_i u_i. +\end{alignat*} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +The most common use for \env{alignat} is for things like +\begin{alignat}{2} +x& =y && \qquad \text {by (\ref{eq:A})}\label{eq:C}\\ +x'& = y' && \qquad \text {by (\ref{eq:B})}\label{eq:D}\\ +x+x' & = y+y' && \qquad \text {by Axiom 1.} +\end{alignat} +Some text after to test the below-display spacing. + +\begin{verbatim} +\begin{alignat}{2} +x& =y && \qquad \text {by (\ref{eq:A})}\label{eq:C}\\ +x'& = y' && \qquad \text {by (\ref{eq:B})}\label{eq:D}\\ +x+x' & = y+y' && \qquad \text {by Axiom 1.} +\end{alignat} +\end{verbatim} +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newpage +\setlength{\marginrulewidth}{0pt} + +\begin{thebibliography}{10} + +\bibitem{dihe:newdir} +W.~Diffie and E.~Hellman, \emph{New directions in cryptography}, IEEE +Transactions on Information Theory \textbf{22} (1976), no.~5, 644--654. + +\bibitem{fre:cichon} +D.~H. Fremlin, \emph{Cichon's diagram}, 1983/1984, presented at the +S{\'e}minaire Initiation {\`a} l'Analyse, G. Choquet, M. Rogalski, J. +Saint Raymond, at the Universit{\'e} Pierre et Marie Curie, Paris, 23e +ann{\'e}e. + +\bibitem{gouja:lagrmeth} +I.~P. Goulden and D.~M. Jackson, \emph{The enumeration of directed +closed {E}uler trails and directed {H}amiltonian circuits by +{L}angrangian methods}, European J. Combin. \textbf{2} (1981), 131--212. + +\bibitem{hapa:graphenum} +F.~Harary and E.~M. Palmer, \emph{Graphical enumeration}, Academic +Press, 1973. + +\bibitem{imlelu:oneway} +R.~Impagliazzo, L.~Levin, and M.~Luby, \emph{Pseudo-random generation +from one-way functions}, Proc. 21st STOC (1989), ACM, New York, +pp.~12--24. + +\bibitem{komiyo:unipfunc} +M.~Kojima, S.~Mizuno, and A.~Yoshise, \emph{A new continuation method +for complementarity problems with uniform p-functions}, Tech. Report +B-194, Tokyo Inst. of Technology, Tokyo, 1987, Dept. of Information +Sciences. + +\bibitem{komiyo:lincomp} +\bysame, \emph{A polynomial-time algorithm for a class of linear +complementarity problems}, Tech. Report B-193, Tokyo Inst. of +Technology, Tokyo, 1987, Dept. of Information Sciences. + +\bibitem{liuchow:formalsum} +C.~J. Liu and Yutze Chow, \emph{On operator and formal sum methods for +graph enumeration problems}, SIAM J. Algorithms Discrete Methods +\textbf{5} (1984), 384--438. + +\bibitem{mami:matrixth} +M.~Marcus and H.~Minc, \emph{A survey of matrix theory and matrix +inequalities}, Complementary Series in Math. \textbf{14} (1964), 21--48. + +\bibitem{miyoki:lincomp} +S.~Mizuno, A.~Yoshise, and T.~Kikuchi, \emph{Practical polynomial time +algorithms for linear complementarity problems}, Tech. Report~13, Tokyo +Inst. of Technology, Tokyo, April 1988, Dept. of Industrial Engineering +and Management. + +\bibitem{moad:quadpro} +R.~D. Monteiro and I.~Adler, \emph{Interior path following primal-dual +algorithms, part {II}: Quadratic programming}, August 1987, Working +paper, Dept. of Industrial Engineering and Operations Research. + +\bibitem{ste:sint} +E.~M. Stein, \emph{Singular integrals and differentiability properties +of functions}, Princeton Univ. Press, Princeton, N.J., 1970. + +\bibitem{ye:intalg} +Y.~Ye, \emph{Interior algorithms for linear, quadratic and linearly +constrained convex programming}, Ph.D. thesis, Stanford Univ., Palo +Alto, Calif., July 1987, Dept. of Engineering--Economic Systems, +unpublished. + +\end{thebibliography} + +\end{document} +\endinput diff --git a/fonts/newcomputermodern/otf/NewCM08-Book.otf b/fonts/newcomputermodern/otf/NewCM08-Book.otf Binary files differindex d5781e4be3..3ce70d1c06 100644 --- a/fonts/newcomputermodern/otf/NewCM08-Book.otf +++ b/fonts/newcomputermodern/otf/NewCM08-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCM08-BookItalic.otf b/fonts/newcomputermodern/otf/NewCM08-BookItalic.otf Binary files differindex 3ccf81d30a..0ffe04ec08 100644 --- a/fonts/newcomputermodern/otf/NewCM08-BookItalic.otf +++ b/fonts/newcomputermodern/otf/NewCM08-BookItalic.otf diff --git a/fonts/newcomputermodern/otf/NewCM08-Italic.otf b/fonts/newcomputermodern/otf/NewCM08-Italic.otf Binary files differindex cace8b5dd5..dc63f591c2 100644 --- a/fonts/newcomputermodern/otf/NewCM08-Italic.otf +++ b/fonts/newcomputermodern/otf/NewCM08-Italic.otf diff --git a/fonts/newcomputermodern/otf/NewCM08-Regular.otf b/fonts/newcomputermodern/otf/NewCM08-Regular.otf Binary files differindex 6c105e5a6a..67449187a0 100644 --- a/fonts/newcomputermodern/otf/NewCM08-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCM08-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCM08Devanagari-Book.otf b/fonts/newcomputermodern/otf/NewCM08Devanagari-Book.otf Binary files differindex 5380371217..c00015f006 100644 --- a/fonts/newcomputermodern/otf/NewCM08Devanagari-Book.otf +++ b/fonts/newcomputermodern/otf/NewCM08Devanagari-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCM08Devanagari-Regular.otf b/fonts/newcomputermodern/otf/NewCM08Devanagari-Regular.otf Binary files differindex 2a02cb4ae4..4f8e94b9fa 100644 --- a/fonts/newcomputermodern/otf/NewCM08Devanagari-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCM08Devanagari-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCM10-Bold.otf b/fonts/newcomputermodern/otf/NewCM10-Bold.otf Binary files differindex 9c266eed73..e170424b44 100644 --- a/fonts/newcomputermodern/otf/NewCM10-Bold.otf +++ b/fonts/newcomputermodern/otf/NewCM10-Bold.otf diff --git a/fonts/newcomputermodern/otf/NewCM10-BoldItalic.otf b/fonts/newcomputermodern/otf/NewCM10-BoldItalic.otf Binary files differindex f937c97270..75dbe2bb12 100644 --- a/fonts/newcomputermodern/otf/NewCM10-BoldItalic.otf +++ b/fonts/newcomputermodern/otf/NewCM10-BoldItalic.otf diff --git a/fonts/newcomputermodern/otf/NewCM10-Book.otf b/fonts/newcomputermodern/otf/NewCM10-Book.otf Binary files differindex 39ff7b2a0c..047920b634 100644 --- a/fonts/newcomputermodern/otf/NewCM10-Book.otf +++ b/fonts/newcomputermodern/otf/NewCM10-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCM10-BookItalic.otf b/fonts/newcomputermodern/otf/NewCM10-BookItalic.otf Binary files differindex 1fd40e0ff0..987eca62da 100644 --- a/fonts/newcomputermodern/otf/NewCM10-BookItalic.otf +++ b/fonts/newcomputermodern/otf/NewCM10-BookItalic.otf diff --git a/fonts/newcomputermodern/otf/NewCM10-Italic.otf b/fonts/newcomputermodern/otf/NewCM10-Italic.otf Binary files differindex 1642bfa126..d8668a3bd4 100644 --- a/fonts/newcomputermodern/otf/NewCM10-Italic.otf +++ b/fonts/newcomputermodern/otf/NewCM10-Italic.otf diff --git a/fonts/newcomputermodern/otf/NewCM10-Regular.otf b/fonts/newcomputermodern/otf/NewCM10-Regular.otf Binary files differindex 12fbaa764d..deca16ead0 100644 --- a/fonts/newcomputermodern/otf/NewCM10-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCM10-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCM10Devanagari-Bold.otf b/fonts/newcomputermodern/otf/NewCM10Devanagari-Bold.otf Binary files differindex c671d12fe4..6a4add2226 100644 --- a/fonts/newcomputermodern/otf/NewCM10Devanagari-Bold.otf +++ b/fonts/newcomputermodern/otf/NewCM10Devanagari-Bold.otf diff --git a/fonts/newcomputermodern/otf/NewCM10Devanagari-Book.otf b/fonts/newcomputermodern/otf/NewCM10Devanagari-Book.otf Binary files differindex ec6603d0ee..b452d018e9 100644 --- a/fonts/newcomputermodern/otf/NewCM10Devanagari-Book.otf +++ b/fonts/newcomputermodern/otf/NewCM10Devanagari-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCM10Devanagari-Regular.otf b/fonts/newcomputermodern/otf/NewCM10Devanagari-Regular.otf Binary files differindex 87a3fc04c3..7423521961 100644 --- a/fonts/newcomputermodern/otf/NewCM10Devanagari-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCM10Devanagari-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCMMath-Bold.otf b/fonts/newcomputermodern/otf/NewCMMath-Bold.otf Binary files differindex 6944d5b6f8..7f066cc5df 100644 --- a/fonts/newcomputermodern/otf/NewCMMath-Bold.otf +++ b/fonts/newcomputermodern/otf/NewCMMath-Bold.otf diff --git a/fonts/newcomputermodern/otf/NewCMMath-Book.otf b/fonts/newcomputermodern/otf/NewCMMath-Book.otf Binary files differindex b8fa368a6e..0b16c7abed 100644 --- a/fonts/newcomputermodern/otf/NewCMMath-Book.otf +++ b/fonts/newcomputermodern/otf/NewCMMath-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCMMath-Regular.otf b/fonts/newcomputermodern/otf/NewCMMath-Regular.otf Binary files differindex 58ba71cc1a..fbcb0b8ce3 100644 --- a/fonts/newcomputermodern/otf/NewCMMath-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCMMath-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCMMono10-Bold.otf b/fonts/newcomputermodern/otf/NewCMMono10-Bold.otf Binary files differindex 91864ce837..33e4e5ad7c 100644 --- a/fonts/newcomputermodern/otf/NewCMMono10-Bold.otf +++ b/fonts/newcomputermodern/otf/NewCMMono10-Bold.otf diff --git a/fonts/newcomputermodern/otf/NewCMMono10-BoldOblique.otf b/fonts/newcomputermodern/otf/NewCMMono10-BoldOblique.otf Binary files differindex 59506f27d9..51c5d16b14 100644 --- a/fonts/newcomputermodern/otf/NewCMMono10-BoldOblique.otf +++ b/fonts/newcomputermodern/otf/NewCMMono10-BoldOblique.otf diff --git a/fonts/newcomputermodern/otf/NewCMMono10-Book.otf b/fonts/newcomputermodern/otf/NewCMMono10-Book.otf Binary files differindex d3d1103cbe..c48df75bd5 100644 --- a/fonts/newcomputermodern/otf/NewCMMono10-Book.otf +++ b/fonts/newcomputermodern/otf/NewCMMono10-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCMMono10-BookItalic.otf b/fonts/newcomputermodern/otf/NewCMMono10-BookItalic.otf Binary files differindex 5acfca8a4e..2aa9ec408c 100644 --- a/fonts/newcomputermodern/otf/NewCMMono10-BookItalic.otf +++ b/fonts/newcomputermodern/otf/NewCMMono10-BookItalic.otf diff --git a/fonts/newcomputermodern/otf/NewCMMono10-Italic.otf b/fonts/newcomputermodern/otf/NewCMMono10-Italic.otf Binary files differindex 4a7c5579aa..0e0bcf3c05 100644 --- a/fonts/newcomputermodern/otf/NewCMMono10-Italic.otf +++ b/fonts/newcomputermodern/otf/NewCMMono10-Italic.otf diff --git a/fonts/newcomputermodern/otf/NewCMMono10-Regular.otf b/fonts/newcomputermodern/otf/NewCMMono10-Regular.otf Binary files differindex bb0572eaf5..c0c2177119 100644 --- a/fonts/newcomputermodern/otf/NewCMMono10-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCMMono10-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans08-Book.otf b/fonts/newcomputermodern/otf/NewCMSans08-Book.otf Binary files differindex 0a0947e81a..e21ad7a489 100644 --- a/fonts/newcomputermodern/otf/NewCMSans08-Book.otf +++ b/fonts/newcomputermodern/otf/NewCMSans08-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans08-BookOblique.otf b/fonts/newcomputermodern/otf/NewCMSans08-BookOblique.otf Binary files differindex c763acaf4c..7b57e56a94 100644 --- a/fonts/newcomputermodern/otf/NewCMSans08-BookOblique.otf +++ b/fonts/newcomputermodern/otf/NewCMSans08-BookOblique.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans08-Oblique.otf b/fonts/newcomputermodern/otf/NewCMSans08-Oblique.otf Binary files differindex 76ee0532a3..a41ad065f8 100644 --- a/fonts/newcomputermodern/otf/NewCMSans08-Oblique.otf +++ b/fonts/newcomputermodern/otf/NewCMSans08-Oblique.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans08-Regular.otf b/fonts/newcomputermodern/otf/NewCMSans08-Regular.otf Binary files differindex b6112c9fa5..8d7e495eac 100644 --- a/fonts/newcomputermodern/otf/NewCMSans08-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCMSans08-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans10-Bold.otf b/fonts/newcomputermodern/otf/NewCMSans10-Bold.otf Binary files differindex 8d2858fe21..1b094dc38b 100644 --- a/fonts/newcomputermodern/otf/NewCMSans10-Bold.otf +++ b/fonts/newcomputermodern/otf/NewCMSans10-Bold.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans10-BoldOblique.otf b/fonts/newcomputermodern/otf/NewCMSans10-BoldOblique.otf Binary files differindex 5a54177fd8..1402569f6d 100644 --- a/fonts/newcomputermodern/otf/NewCMSans10-BoldOblique.otf +++ b/fonts/newcomputermodern/otf/NewCMSans10-BoldOblique.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans10-Book.otf b/fonts/newcomputermodern/otf/NewCMSans10-Book.otf Binary files differindex 8c2d414b92..5f289aba7d 100644 --- a/fonts/newcomputermodern/otf/NewCMSans10-Book.otf +++ b/fonts/newcomputermodern/otf/NewCMSans10-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans10-BookOblique.otf b/fonts/newcomputermodern/otf/NewCMSans10-BookOblique.otf Binary files differindex e638e6eebc..84aa0abc49 100644 --- a/fonts/newcomputermodern/otf/NewCMSans10-BookOblique.otf +++ b/fonts/newcomputermodern/otf/NewCMSans10-BookOblique.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans10-Oblique.otf b/fonts/newcomputermodern/otf/NewCMSans10-Oblique.otf Binary files differindex da7e73237a..f623188ea2 100644 --- a/fonts/newcomputermodern/otf/NewCMSans10-Oblique.otf +++ b/fonts/newcomputermodern/otf/NewCMSans10-Oblique.otf diff --git a/fonts/newcomputermodern/otf/NewCMSans10-Regular.otf b/fonts/newcomputermodern/otf/NewCMSans10-Regular.otf Binary files differindex b5b9cee523..e4bde6b3c0 100644 --- a/fonts/newcomputermodern/otf/NewCMSans10-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCMSans10-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCMSansMath-Regular.otf b/fonts/newcomputermodern/otf/NewCMSansMath-Regular.otf Binary files differnew file mode 100644 index 0000000000..eb571b226e --- /dev/null +++ b/fonts/newcomputermodern/otf/NewCMSansMath-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCMUncial08-Bold.otf b/fonts/newcomputermodern/otf/NewCMUncial08-Bold.otf Binary files differindex ac4994c551..0974289bf6 100644 --- a/fonts/newcomputermodern/otf/NewCMUncial08-Bold.otf +++ b/fonts/newcomputermodern/otf/NewCMUncial08-Bold.otf diff --git a/fonts/newcomputermodern/otf/NewCMUncial08-Book.otf b/fonts/newcomputermodern/otf/NewCMUncial08-Book.otf Binary files differindex d7a734c58b..7051678d15 100644 --- a/fonts/newcomputermodern/otf/NewCMUncial08-Book.otf +++ b/fonts/newcomputermodern/otf/NewCMUncial08-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCMUncial08-Regular.otf b/fonts/newcomputermodern/otf/NewCMUncial08-Regular.otf Binary files differindex 9423b90dd6..ceeea18eaa 100644 --- a/fonts/newcomputermodern/otf/NewCMUncial08-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCMUncial08-Regular.otf diff --git a/fonts/newcomputermodern/otf/NewCMUncial10-Bold.otf b/fonts/newcomputermodern/otf/NewCMUncial10-Bold.otf Binary files differindex 1d2be7a552..e4115d91ff 100644 --- a/fonts/newcomputermodern/otf/NewCMUncial10-Bold.otf +++ b/fonts/newcomputermodern/otf/NewCMUncial10-Bold.otf diff --git a/fonts/newcomputermodern/otf/NewCMUncial10-Book.otf b/fonts/newcomputermodern/otf/NewCMUncial10-Book.otf Binary files differindex 06f74a8e0b..614ac51a5b 100644 --- a/fonts/newcomputermodern/otf/NewCMUncial10-Book.otf +++ b/fonts/newcomputermodern/otf/NewCMUncial10-Book.otf diff --git a/fonts/newcomputermodern/otf/NewCMUncial10-Regular.otf b/fonts/newcomputermodern/otf/NewCMUncial10-Regular.otf Binary files differindex 4c36278757..71eae5a0e7 100644 --- a/fonts/newcomputermodern/otf/NewCMUncial10-Regular.otf +++ b/fonts/newcomputermodern/otf/NewCMUncial10-Regular.otf diff --git a/fonts/newcomputermodern/source.txz b/fonts/newcomputermodern/source.txz Binary files differindex 05e591e8a3..99d6c998d9 100644 --- a/fonts/newcomputermodern/source.txz +++ b/fonts/newcomputermodern/source.txz diff --git a/fonts/newcomputermodern/tex/newcomputermodern.sty b/fonts/newcomputermodern/tex/newcomputermodern.sty index 6edd20dc1b..d5e1db18c4 100644 --- a/fonts/newcomputermodern/tex/newcomputermodern.sty +++ b/fonts/newcomputermodern/tex/newcomputermodern.sty @@ -1,5 +1,5 @@ %\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{newcomputermodern}[v6.0.0 NewCM fonts by Antonis Tsolomitis] +\ProvidesPackage{newcomputermodern}[v7.0.0 NewCM fonts by Antonis Tsolomitis] \typeout{Loading NewCM fonts by Antonis Tsolomitis} \RequirePackage{fontspec} \RequirePackage{unicode-math} @@ -8,6 +8,10 @@ \DeclareOption{regular}{\@olddefaulttrue} \ProcessOptions\relax +\newif\if@sansdefault +\DeclareOption{sansdefault}{\@sansdefaulttrue} +\ProcessOptions\relax + %Next command has been moved to fspolddefault.tex and % fspdefault.tex %\let\prosgegrammeni=\undefined %Babel compatibility @@ -15,7 +19,11 @@ \if@olddefault \input{fspolddefault.tex} \else +\if@sansdefault +\input{fspsansdefault.tex} +\else \input{fspdefault.tex} \fi +\fi \endinput diff --git a/fonts/simpleicons/doc/bindings.tex b/fonts/simpleicons/doc/bindings.tex index b793983d7d..b7accca66f 100644 --- a/fonts/simpleicons/doc/bindings.tex +++ b/fonts/simpleicons/doc/bindings.tex @@ -5401,6 +5401,8 @@ \showcaseicon{suckless}{simpleicon\{suckless\}} + \showcaseicon{sui}{simpleicon\{sui\}} + \showcaseicon{sumologic}{simpleicon\{sumologic\}} \showcaseicon{suno}{simpleicon\{suno\}} diff --git a/fonts/simpleicons/doc/simpleicons.pdf b/fonts/simpleicons/doc/simpleicons.pdf Binary files differindex 5ebacede45..3239f7306d 100644 --- a/fonts/simpleicons/doc/simpleicons.pdf +++ b/fonts/simpleicons/doc/simpleicons.pdf diff --git a/fonts/simpleicons/doc/simpleicons.tex b/fonts/simpleicons/doc/simpleicons.tex index 480b8a5d64..1c6651330a 100644 --- a/fonts/simpleicons/doc/simpleicons.tex +++ b/fonts/simpleicons/doc/simpleicons.tex @@ -14,7 +14,7 @@ Simple Icons (Font)\\% Inesh Bose (\LaTeX{} package)% } -\date{13.14.1 -- \today}\maketitle +\date{13.15.0 -- \today}\maketitle This package provides \LaTeX{} support for the Simple Icons logos. To use Simple Icons in your document, include the package with |\usepackage{simpleicons}|. diff --git a/fonts/simpleicons/enc/simpleiconsoneone.enc b/fonts/simpleicons/enc/simpleiconsoneone.enc index 73fd17bad0..2758dccbb3 100644 --- a/fonts/simpleicons/enc/simpleiconsoneone.enc +++ b/fonts/simpleicons/enc/simpleiconsoneone.enc @@ -140,6 +140,7 @@ /subtitleediticon /subversionicon /sucklessicon +/suiicon /sumologicicon /sunoicon /sunriseicon @@ -254,5 +255,4 @@ /threedotjsicon /threemaicon /thumbtackicon -/thunderbirdicon ] def diff --git a/fonts/simpleicons/enc/simpleiconsonethree.enc b/fonts/simpleicons/enc/simpleiconsonethree.enc index f96719ae86..00c1c8cd48 100644 --- a/fonts/simpleicons/enc/simpleiconsonethree.enc +++ b/fonts/simpleicons/enc/simpleiconsonethree.enc @@ -1,4 +1,5 @@ /simpleiconsonethree [ +/webglicon /webgpuicon /weblateicon /webminicon @@ -253,5 +254,4 @@ /.notdef /.notdef /.notdef -/.notdef ] def diff --git a/fonts/simpleicons/enc/simpleiconsonetwo.enc b/fonts/simpleicons/enc/simpleiconsonetwo.enc index 4ee88e098c..96a84a74af 100644 --- a/fonts/simpleicons/enc/simpleiconsonetwo.enc +++ b/fonts/simpleicons/enc/simpleiconsonetwo.enc @@ -1,4 +1,5 @@ /simpleiconsonetwo [ +/thunderbirdicon /thunderstoreicon /thurgauerkantonalbankicon /thymeleaficon @@ -254,5 +255,4 @@ /webdriverioicon /webexicon /webflowicon -/webglicon ] def diff --git a/fonts/simpleicons/opentype/SimpleIcons.otf b/fonts/simpleicons/opentype/SimpleIcons.otf Binary files differindex efeb9f5d57..0a0431a215 100644 --- a/fonts/simpleicons/opentype/SimpleIcons.otf +++ b/fonts/simpleicons/opentype/SimpleIcons.otf diff --git a/fonts/simpleicons/tex/simpleicons.sty b/fonts/simpleicons/tex/simpleicons.sty index 2f2bb11ba4..aef756d6ba 100644 --- a/fonts/simpleicons/tex/simpleicons.sty +++ b/fonts/simpleicons/tex/simpleicons.sty @@ -1,6 +1,6 @@ \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{simpleicons}[2024/10/25 13.14.1 Simple Icons 13.14.1 Logos] +\ProvidesPackage{simpleicons}[2024/11/01 13.15.0 Simple Icons 13.15.0 Logos] \RequirePackage{iftex} diff --git a/fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex b/fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex index 4a1a6b76a6..123c5f4a5b 100644 --- a/fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex +++ b/fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex @@ -2700,518 +2700,519 @@ \expandafter\def\csname simpleicon@subtitleediticon\endcsname {\simpleiconsmaponeone\symbol{138}} \expandafter\def\csname simpleicon@subversionicon\endcsname {\simpleiconsmaponeone\symbol{139}} \expandafter\def\csname simpleicon@sucklessicon\endcsname {\simpleiconsmaponeone\symbol{140}} - \expandafter\def\csname simpleicon@sumologicicon\endcsname {\simpleiconsmaponeone\symbol{141}} - \expandafter\def\csname simpleicon@sunoicon\endcsname {\simpleiconsmaponeone\symbol{142}} - \expandafter\def\csname simpleicon@sunriseicon\endcsname {\simpleiconsmaponeone\symbol{143}} - \expandafter\def\csname simpleicon@supabaseicon\endcsname {\simpleiconsmaponeone\symbol{144}} - \expandafter\def\csname simpleicon@supercreaseicon\endcsname {\simpleiconsmaponeone\symbol{145}} - \expandafter\def\csname simpleicon@supermicroicon\endcsname {\simpleiconsmaponeone\symbol{146}} - \expandafter\def\csname simpleicon@superusericon\endcsname {\simpleiconsmaponeone\symbol{147}} - \expandafter\def\csname simpleicon@surrealdbicon\endcsname {\simpleiconsmaponeone\symbol{148}} - \expandafter\def\csname simpleicon@surveymonkeyicon\endcsname {\simpleiconsmaponeone\symbol{149}} - \expandafter\def\csname simpleicon@suseicon\endcsname {\simpleiconsmaponeone\symbol{150}} - \expandafter\def\csname simpleicon@suzukiicon\endcsname {\simpleiconsmaponeone\symbol{151}} - \expandafter\def\csname simpleicon@svelteicon\endcsname {\simpleiconsmaponeone\symbol{152}} - \expandafter\def\csname simpleicon@svgicon\endcsname {\simpleiconsmaponeone\symbol{153}} - \expandafter\def\csname simpleicon@svgdotjsicon\endcsname {\simpleiconsmaponeone\symbol{154}} - \expandafter\def\csname simpleicon@svgoicon\endcsname {\simpleiconsmaponeone\symbol{155}} - \expandafter\def\csname simpleicon@svgtraceicon\endcsname {\simpleiconsmaponeone\symbol{156}} - \expandafter\def\csname simpleicon@swaggericon\endcsname {\simpleiconsmaponeone\symbol{157}} - \expandafter\def\csname simpleicon@swarmicon\endcsname {\simpleiconsmaponeone\symbol{158}} - \expandafter\def\csname simpleicon@swayicon\endcsname {\simpleiconsmaponeone\symbol{159}} - \expandafter\def\csname simpleicon@swcicon\endcsname {\simpleiconsmaponeone\symbol{160}} - \expandafter\def\csname simpleicon@swifticon\endcsname {\simpleiconsmaponeone\symbol{161}} - \expandafter\def\csname simpleicon@swiggyicon\endcsname {\simpleiconsmaponeone\symbol{162}} - \expandafter\def\csname simpleicon@swipericon\endcsname {\simpleiconsmaponeone\symbol{163}} - \expandafter\def\csname simpleicon@swricon\endcsname {\simpleiconsmaponeone\symbol{164}} - \expandafter\def\csname simpleicon@symantecicon\endcsname {\simpleiconsmaponeone\symbol{165}} - \expandafter\def\csname simpleicon@symbolabicon\endcsname {\simpleiconsmaponeone\symbol{166}} - \expandafter\def\csname simpleicon@symfonyicon\endcsname {\simpleiconsmaponeone\symbol{167}} - \expandafter\def\csname simpleicon@symphonyicon\endcsname {\simpleiconsmaponeone\symbol{168}} - \expandafter\def\csname simpleicon@sympyicon\endcsname {\simpleiconsmaponeone\symbol{169}} - \expandafter\def\csname simpleicon@syncthingicon\endcsname {\simpleiconsmaponeone\symbol{170}} - \expandafter\def\csname simpleicon@synologyicon\endcsname {\simpleiconsmaponeone\symbol{171}} - \expandafter\def\csname simpleicon@system76icon\endcsname {\simpleiconsmaponeone\symbol{172}} - \expandafter\def\csname simpleicon@tabelogicon\endcsname {\simpleiconsmaponeone\symbol{173}} - \expandafter\def\csname simpleicon@tableauicon\endcsname {\simpleiconsmaponeone\symbol{174}} - \expandafter\def\csname simpleicon@tablecheckicon\endcsname {\simpleiconsmaponeone\symbol{175}} - \expandafter\def\csname simpleicon@tacobellicon\endcsname {\simpleiconsmaponeone\symbol{176}} - \expandafter\def\csname simpleicon@tadoicon\endcsname {\simpleiconsmaponeone\symbol{177}} - \expandafter\def\csname simpleicon@taichigraphicsicon\endcsname {\simpleiconsmaponeone\symbol{178}} - \expandafter\def\csname simpleicon@taichilangicon\endcsname {\simpleiconsmaponeone\symbol{179}} - \expandafter\def\csname simpleicon@tailsicon\endcsname {\simpleiconsmaponeone\symbol{180}} - \expandafter\def\csname simpleicon@tailscaleicon\endcsname {\simpleiconsmaponeone\symbol{181}} - \expandafter\def\csname simpleicon@tailwindcssicon\endcsname {\simpleiconsmaponeone\symbol{182}} - \expandafter\def\csname simpleicon@taipyicon\endcsname {\simpleiconsmaponeone\symbol{183}} - \expandafter\def\csname simpleicon@taketwointeractivesoftwareicon\endcsname {\simpleiconsmaponeone\symbol{184}} - \expandafter\def\csname simpleicon@talendicon\endcsname {\simpleiconsmaponeone\symbol{185}} - \expandafter\def\csname simpleicon@talenthouseicon\endcsname {\simpleiconsmaponeone\symbol{186}} - \expandafter\def\csname simpleicon@talosicon\endcsname {\simpleiconsmaponeone\symbol{187}} - \expandafter\def\csname simpleicon@tamiyaicon\endcsname {\simpleiconsmaponeone\symbol{188}} - \expandafter\def\csname simpleicon@tampermonkeyicon\endcsname {\simpleiconsmaponeone\symbol{189}} - \expandafter\def\csname simpleicon@taobaoicon\endcsname {\simpleiconsmaponeone\symbol{190}} - \expandafter\def\csname simpleicon@tapasicon\endcsname {\simpleiconsmaponeone\symbol{191}} - \expandafter\def\csname simpleicon@targeticon\endcsname {\simpleiconsmaponeone\symbol{192}} - \expandafter\def\csname simpleicon@taromicon\endcsname {\simpleiconsmaponeone\symbol{193}} - \expandafter\def\csname simpleicon@taskicon\endcsname {\simpleiconsmaponeone\symbol{194}} - \expandafter\def\csname simpleicon@tasmotaicon\endcsname {\simpleiconsmaponeone\symbol{195}} - \expandafter\def\csname simpleicon@tataicon\endcsname {\simpleiconsmaponeone\symbol{196}} - \expandafter\def\csname simpleicon@tauriicon\endcsname {\simpleiconsmaponeone\symbol{197}} - \expandafter\def\csname simpleicon@taxbuzzicon\endcsname {\simpleiconsmaponeone\symbol{198}} - \expandafter\def\csname simpleicon@tcsicon\endcsname {\simpleiconsmaponeone\symbol{199}} - \expandafter\def\csname simpleicon@tealicon\endcsname {\simpleiconsmaponeone\symbol{200}} - \expandafter\def\csname simpleicon@teamcityicon\endcsname {\simpleiconsmaponeone\symbol{201}} - \expandafter\def\csname simpleicon@teamspeakicon\endcsname {\simpleiconsmaponeone\symbol{202}} - \expandafter\def\csname simpleicon@teamviewericon\endcsname {\simpleiconsmaponeone\symbol{203}} - \expandafter\def\csname simpleicon@techcrunchicon\endcsname {\simpleiconsmaponeone\symbol{204}} - \expandafter\def\csname simpleicon@tedicon\endcsname {\simpleiconsmaponeone\symbol{205}} - \expandafter\def\csname simpleicon@teepublicicon\endcsname {\simpleiconsmaponeone\symbol{206}} - \expandafter\def\csname simpleicon@teespringicon\endcsname {\simpleiconsmaponeone\symbol{207}} - \expandafter\def\csname simpleicon@tektonicon\endcsname {\simpleiconsmaponeone\symbol{208}} - \expandafter\def\csname simpleicon@tele5icon\endcsname {\simpleiconsmaponeone\symbol{209}} - \expandafter\def\csname simpleicon@telegramicon\endcsname {\simpleiconsmaponeone\symbol{210}} - \expandafter\def\csname simpleicon@telegraphicon\endcsname {\simpleiconsmaponeone\symbol{211}} - \expandafter\def\csname simpleicon@telequebecicon\endcsname {\simpleiconsmaponeone\symbol{212}} - \expandafter\def\csname simpleicon@temporalicon\endcsname {\simpleiconsmaponeone\symbol{213}} - \expandafter\def\csname simpleicon@tencentqqicon\endcsname {\simpleiconsmaponeone\symbol{214}} - \expandafter\def\csname simpleicon@tensorflowicon\endcsname {\simpleiconsmaponeone\symbol{215}} - \expandafter\def\csname simpleicon@teradataicon\endcsname {\simpleiconsmaponeone\symbol{216}} - \expandafter\def\csname simpleicon@teratailicon\endcsname {\simpleiconsmaponeone\symbol{217}} - \expandafter\def\csname simpleicon@termiusicon\endcsname {\simpleiconsmaponeone\symbol{218}} - \expandafter\def\csname simpleicon@terraformicon\endcsname {\simpleiconsmaponeone\symbol{219}} - \expandafter\def\csname simpleicon@tescoicon\endcsname {\simpleiconsmaponeone\symbol{220}} - \expandafter\def\csname simpleicon@teslaicon\endcsname {\simpleiconsmaponeone\symbol{221}} - \expandafter\def\csname simpleicon@testcafeicon\endcsname {\simpleiconsmaponeone\symbol{222}} - \expandafter\def\csname simpleicon@testinicon\endcsname {\simpleiconsmaponeone\symbol{223}} - \expandafter\def\csname simpleicon@testinglibraryicon\endcsname {\simpleiconsmaponeone\symbol{224}} - \expandafter\def\csname simpleicon@testrailicon\endcsname {\simpleiconsmaponeone\symbol{225}} - \expandafter\def\csname simpleicon@tethericon\endcsname {\simpleiconsmaponeone\symbol{226}} - \expandafter\def\csname simpleicon@textpatternicon\endcsname {\simpleiconsmaponeone\symbol{227}} - \expandafter\def\csname simpleicon@tgaicon\endcsname {\simpleiconsmaponeone\symbol{228}} - \expandafter\def\csname simpleicon@thangsicon\endcsname {\simpleiconsmaponeone\symbol{229}} - \expandafter\def\csname simpleicon@thanosicon\endcsname {\simpleiconsmaponeone\symbol{230}} - \expandafter\def\csname simpleicon@thealgorithmsicon\endcsname {\simpleiconsmaponeone\symbol{231}} - \expandafter\def\csname simpleicon@theboringcompanyicon\endcsname {\simpleiconsmaponeone\symbol{232}} - \expandafter\def\csname simpleicon@theconversationicon\endcsname {\simpleiconsmaponeone\symbol{233}} - \expandafter\def\csname simpleicon@thefinalsicon\endcsname {\simpleiconsmaponeone\symbol{234}} - \expandafter\def\csname simpleicon@theguardianicon\endcsname {\simpleiconsmaponeone\symbol{235}} - \expandafter\def\csname simpleicon@theirishtimesicon\endcsname {\simpleiconsmaponeone\symbol{236}} - \expandafter\def\csname simpleicon@themightyicon\endcsname {\simpleiconsmaponeone\symbol{237}} - \expandafter\def\csname simpleicon@themodelsresourceicon\endcsname {\simpleiconsmaponeone\symbol{238}} - \expandafter\def\csname simpleicon@themoviedatabaseicon\endcsname {\simpleiconsmaponeone\symbol{239}} - \expandafter\def\csname simpleicon@thenorthfaceicon\endcsname {\simpleiconsmaponeone\symbol{240}} - \expandafter\def\csname simpleicon@theodinprojecticon\endcsname {\simpleiconsmaponeone\symbol{241}} - \expandafter\def\csname simpleicon@theregistericon\endcsname {\simpleiconsmaponeone\symbol{242}} - \expandafter\def\csname simpleicon@thesoundsresourceicon\endcsname {\simpleiconsmaponeone\symbol{243}} - \expandafter\def\csname simpleicon@thespritersresourceicon\endcsname {\simpleiconsmaponeone\symbol{244}} - \expandafter\def\csname simpleicon@thewashingtonposticon\endcsname {\simpleiconsmaponeone\symbol{245}} - \expandafter\def\csname simpleicon@theweatherchannelicon\endcsname {\simpleiconsmaponeone\symbol{246}} - \expandafter\def\csname simpleicon@thingiverseicon\endcsname {\simpleiconsmaponeone\symbol{247}} - \expandafter\def\csname simpleicon@thinkpadicon\endcsname {\simpleiconsmaponeone\symbol{248}} - \expandafter\def\csname simpleicon@thirdwebicon\endcsname {\simpleiconsmaponeone\symbol{249}} - \expandafter\def\csname simpleicon@threadlessicon\endcsname {\simpleiconsmaponeone\symbol{250}} - \expandafter\def\csname simpleicon@threadsicon\endcsname {\simpleiconsmaponeone\symbol{251}} - \expandafter\def\csname simpleicon@threedotjsicon\endcsname {\simpleiconsmaponeone\symbol{252}} - \expandafter\def\csname simpleicon@threemaicon\endcsname {\simpleiconsmaponeone\symbol{253}} - \expandafter\def\csname simpleicon@thumbtackicon\endcsname {\simpleiconsmaponeone\symbol{254}} - \expandafter\def\csname simpleicon@thunderbirdicon\endcsname {\simpleiconsmaponeone\symbol{255}} - \expandafter\def\csname simpleicon@thunderstoreicon\endcsname {\simpleiconsmaponetwo\symbol{0}} - \expandafter\def\csname simpleicon@thurgauerkantonalbankicon\endcsname {\simpleiconsmaponetwo\symbol{1}} - \expandafter\def\csname simpleicon@thymeleaficon\endcsname {\simpleiconsmaponetwo\symbol{2}} - \expandafter\def\csname simpleicon@ticketmastericon\endcsname {\simpleiconsmaponetwo\symbol{3}} - \expandafter\def\csname simpleicon@ticktickicon\endcsname {\simpleiconsmaponetwo\symbol{4}} - \expandafter\def\csname simpleicon@tidalicon\endcsname {\simpleiconsmaponetwo\symbol{5}} - \expandafter\def\csname simpleicon@tiddlywikiicon\endcsname {\simpleiconsmaponetwo\symbol{6}} - \expandafter\def\csname simpleicon@tideicon\endcsname {\simpleiconsmaponetwo\symbol{7}} - \expandafter\def\csname simpleicon@tidyverseicon\endcsname {\simpleiconsmaponetwo\symbol{8}} - \expandafter\def\csname simpleicon@tietoevryicon\endcsname {\simpleiconsmaponetwo\symbol{9}} - \expandafter\def\csname simpleicon@tiktokicon\endcsname {\simpleiconsmaponetwo\symbol{10}} - \expandafter\def\csname simpleicon@tildapublishingicon\endcsname {\simpleiconsmaponetwo\symbol{11}} - \expandafter\def\csname simpleicon@tileicon\endcsname {\simpleiconsmaponetwo\symbol{12}} - \expandafter\def\csname simpleicon@timescaleicon\endcsname {\simpleiconsmaponetwo\symbol{13}} - \expandafter\def\csname simpleicon@tinaicon\endcsname {\simpleiconsmaponetwo\symbol{14}} - \expandafter\def\csname simpleicon@tindericon\endcsname {\simpleiconsmaponetwo\symbol{15}} - \expandafter\def\csname simpleicon@tindieicon\endcsname {\simpleiconsmaponetwo\symbol{16}} - \expandafter\def\csname simpleicon@tinkercadicon\endcsname {\simpleiconsmaponetwo\symbol{17}} - \expandafter\def\csname simpleicon@tinygradicon\endcsname {\simpleiconsmaponetwo\symbol{18}} - \expandafter\def\csname simpleicon@tinylettericon\endcsname {\simpleiconsmaponetwo\symbol{19}} - \expandafter\def\csname simpleicon@tistoryicon\endcsname {\simpleiconsmaponetwo\symbol{20}} - \expandafter\def\csname simpleicon@tldrawicon\endcsname {\simpleiconsmaponetwo\symbol{21}} - \expandafter\def\csname simpleicon@tmobileicon\endcsname {\simpleiconsmaponetwo\symbol{22}} - \expandafter\def\csname simpleicon@tmuxicon\endcsname {\simpleiconsmaponetwo\symbol{23}} - \expandafter\def\csname simpleicon@todoisticon\endcsname {\simpleiconsmaponetwo\symbol{24}} - \expandafter\def\csname simpleicon@togglicon\endcsname {\simpleiconsmaponetwo\symbol{25}} - \expandafter\def\csname simpleicon@toggltrackicon\endcsname {\simpleiconsmaponetwo\symbol{26}} - \expandafter\def\csname simpleicon@tokyometroicon\endcsname {\simpleiconsmaponetwo\symbol{27}} - \expandafter\def\csname simpleicon@tollicon\endcsname {\simpleiconsmaponetwo\symbol{28}} - \expandafter\def\csname simpleicon@tomlicon\endcsname {\simpleiconsmaponetwo\symbol{29}} - \expandafter\def\csname simpleicon@tomorrowlandicon\endcsname {\simpleiconsmaponetwo\symbol{30}} - \expandafter\def\csname simpleicon@tonicon\endcsname {\simpleiconsmaponetwo\symbol{31}} - \expandafter\def\csname simpleicon@topcodericon\endcsname {\simpleiconsmaponetwo\symbol{32}} - \expandafter\def\csname simpleicon@topdotggicon\endcsname {\simpleiconsmaponetwo\symbol{33}} - \expandafter\def\csname simpleicon@toptalicon\endcsname {\simpleiconsmaponetwo\symbol{34}} - \expandafter\def\csname simpleicon@torbrowsericon\endcsname {\simpleiconsmaponetwo\symbol{35}} - \expandafter\def\csname simpleicon@torprojecticon\endcsname {\simpleiconsmaponetwo\symbol{36}} - \expandafter\def\csname simpleicon@toshibaicon\endcsname {\simpleiconsmaponetwo\symbol{37}} - \expandafter\def\csname simpleicon@totvsicon\endcsname {\simpleiconsmaponetwo\symbol{38}} - \expandafter\def\csname simpleicon@tourboxicon\endcsname {\simpleiconsmaponetwo\symbol{39}} - \expandafter\def\csname simpleicon@towericon\endcsname {\simpleiconsmaponetwo\symbol{40}} - \expandafter\def\csname simpleicon@toyotaicon\endcsname {\simpleiconsmaponetwo\symbol{41}} - \expandafter\def\csname simpleicon@tplinkicon\endcsname {\simpleiconsmaponetwo\symbol{42}} - \expandafter\def\csname simpleicon@tqdmicon\endcsname {\simpleiconsmaponetwo\symbol{43}} - \expandafter\def\csname simpleicon@traccaricon\endcsname {\simpleiconsmaponetwo\symbol{44}} - \expandafter\def\csname simpleicon@tradingviewicon\endcsname {\simpleiconsmaponetwo\symbol{45}} - \expandafter\def\csname simpleicon@traefikmeshicon\endcsname {\simpleiconsmaponetwo\symbol{46}} - \expandafter\def\csname simpleicon@traefikproxyicon\endcsname {\simpleiconsmaponetwo\symbol{47}} - \expandafter\def\csname simpleicon@trailforksicon\endcsname {\simpleiconsmaponetwo\symbol{48}} - \expandafter\def\csname simpleicon@trainerroadicon\endcsname {\simpleiconsmaponetwo\symbol{49}} - \expandafter\def\csname simpleicon@trakticon\endcsname {\simpleiconsmaponetwo\symbol{50}} - \expandafter\def\csname simpleicon@transifexicon\endcsname {\simpleiconsmaponetwo\symbol{51}} - \expandafter\def\csname simpleicon@transmissionicon\endcsname {\simpleiconsmaponetwo\symbol{52}} - \expandafter\def\csname simpleicon@transportforirelandicon\endcsname {\simpleiconsmaponetwo\symbol{53}} - \expandafter\def\csname simpleicon@transportforlondonicon\endcsname {\simpleiconsmaponetwo\symbol{54}} - \expandafter\def\csname simpleicon@travisciicon\endcsname {\simpleiconsmaponetwo\symbol{55}} - \expandafter\def\csname simpleicon@treehouseicon\endcsname {\simpleiconsmaponetwo\symbol{56}} - \expandafter\def\csname simpleicon@trelloicon\endcsname {\simpleiconsmaponetwo\symbol{57}} - \expandafter\def\csname simpleicon@trendmicroicon\endcsname {\simpleiconsmaponetwo\symbol{58}} - \expandafter\def\csname simpleicon@treyarchicon\endcsname {\simpleiconsmaponetwo\symbol{59}} - \expandafter\def\csname simpleicon@tricentisicon\endcsname {\simpleiconsmaponetwo\symbol{60}} - \expandafter\def\csname simpleicon@triliumicon\endcsname {\simpleiconsmaponetwo\symbol{61}} - \expandafter\def\csname simpleicon@trillericon\endcsname {\simpleiconsmaponetwo\symbol{62}} - \expandafter\def\csname simpleicon@trillertvicon\endcsname {\simpleiconsmaponetwo\symbol{63}} - \expandafter\def\csname simpleicon@trinoicon\endcsname {\simpleiconsmaponetwo\symbol{64}} - \expandafter\def\csname simpleicon@tripadvisoricon\endcsname {\simpleiconsmaponetwo\symbol{65}} - \expandafter\def\csname simpleicon@tripdotcomicon\endcsname {\simpleiconsmaponetwo\symbol{66}} - \expandafter\def\csname simpleicon@trivagoicon\endcsname {\simpleiconsmaponetwo\symbol{67}} - \expandafter\def\csname simpleicon@trivyicon\endcsname {\simpleiconsmaponetwo\symbol{68}} - \expandafter\def\csname simpleicon@troveicon\endcsname {\simpleiconsmaponetwo\symbol{69}} - \expandafter\def\csname simpleicon@trpcicon\endcsname {\simpleiconsmaponetwo\symbol{70}} - \expandafter\def\csname simpleicon@truenasicon\endcsname {\simpleiconsmaponetwo\symbol{71}} - \expandafter\def\csname simpleicon@trueupicon\endcsname {\simpleiconsmaponetwo\symbol{72}} - \expandafter\def\csname simpleicon@truliaicon\endcsname {\simpleiconsmaponetwo\symbol{73}} - \expandafter\def\csname simpleicon@trustedshopsicon\endcsname {\simpleiconsmaponetwo\symbol{74}} - \expandafter\def\csname simpleicon@trustpiloticon\endcsname {\simpleiconsmaponetwo\symbol{75}} - \expandafter\def\csname simpleicon@tryhackmeicon\endcsname {\simpleiconsmaponetwo\symbol{76}} - \expandafter\def\csname simpleicon@tryitonlineicon\endcsname {\simpleiconsmaponetwo\symbol{77}} - \expandafter\def\csname simpleicon@tsnodeicon\endcsname {\simpleiconsmaponetwo\symbol{78}} - \expandafter\def\csname simpleicon@tubiicon\endcsname {\simpleiconsmaponetwo\symbol{79}} - \expandafter\def\csname simpleicon@tuiicon\endcsname {\simpleiconsmaponetwo\symbol{80}} - \expandafter\def\csname simpleicon@tumblricon\endcsname {\simpleiconsmaponetwo\symbol{81}} - \expandafter\def\csname simpleicon@tuneinicon\endcsname {\simpleiconsmaponetwo\symbol{82}} - \expandafter\def\csname simpleicon@turboicon\endcsname {\simpleiconsmaponetwo\symbol{83}} - \expandafter\def\csname simpleicon@turborepoicon\endcsname {\simpleiconsmaponetwo\symbol{84}} - \expandafter\def\csname simpleicon@turbosquidicon\endcsname {\simpleiconsmaponetwo\symbol{85}} - \expandafter\def\csname simpleicon@turkishairlinesicon\endcsname {\simpleiconsmaponetwo\symbol{86}} - \expandafter\def\csname simpleicon@tursoicon\endcsname {\simpleiconsmaponetwo\symbol{87}} - \expandafter\def\csname simpleicon@tutanotaicon\endcsname {\simpleiconsmaponetwo\symbol{88}} - \expandafter\def\csname simpleicon@tv4playicon\endcsname {\simpleiconsmaponetwo\symbol{89}} - \expandafter\def\csname simpleicon@tvtimeicon\endcsname {\simpleiconsmaponetwo\symbol{90}} - \expandafter\def\csname simpleicon@twilioicon\endcsname {\simpleiconsmaponetwo\symbol{91}} - \expandafter\def\csname simpleicon@twinklyicon\endcsname {\simpleiconsmaponetwo\symbol{92}} - \expandafter\def\csname simpleicon@twinmotionicon\endcsname {\simpleiconsmaponetwo\symbol{93}} - \expandafter\def\csname simpleicon@twitchicon\endcsname {\simpleiconsmaponetwo\symbol{94}} - \expandafter\def\csname simpleicon@typeformicon\endcsname {\simpleiconsmaponetwo\symbol{95}} - \expandafter\def\csname simpleicon@typeormicon\endcsname {\simpleiconsmaponetwo\symbol{96}} - \expandafter\def\csname simpleicon@typericon\endcsname {\simpleiconsmaponetwo\symbol{97}} - \expandafter\def\csname simpleicon@typescripticon\endcsname {\simpleiconsmaponetwo\symbol{98}} - \expandafter\def\csname simpleicon@typo3icon\endcsname {\simpleiconsmaponetwo\symbol{99}} - \expandafter\def\csname simpleicon@typsticon\endcsname {\simpleiconsmaponetwo\symbol{100}} - \expandafter\def\csname simpleicon@ubericon\endcsname {\simpleiconsmaponetwo\symbol{101}} - \expandafter\def\csname simpleicon@ubereatsicon\endcsname {\simpleiconsmaponetwo\symbol{102}} - \expandafter\def\csname simpleicon@ubiquitiicon\endcsname {\simpleiconsmaponetwo\symbol{103}} - \expandafter\def\csname simpleicon@ubisofticon\endcsname {\simpleiconsmaponetwo\symbol{104}} - \expandafter\def\csname simpleicon@ublockoriginicon\endcsname {\simpleiconsmaponetwo\symbol{105}} - \expandafter\def\csname simpleicon@ubuntuicon\endcsname {\simpleiconsmaponetwo\symbol{106}} - \expandafter\def\csname simpleicon@ubuntumateicon\endcsname {\simpleiconsmaponetwo\symbol{107}} - \expandafter\def\csname simpleicon@udacityicon\endcsname {\simpleiconsmaponetwo\symbol{108}} - \expandafter\def\csname simpleicon@udemyicon\endcsname {\simpleiconsmaponetwo\symbol{109}} - \expandafter\def\csname simpleicon@ufcicon\endcsname {\simpleiconsmaponetwo\symbol{110}} - \expandafter\def\csname simpleicon@uikiticon\endcsname {\simpleiconsmaponetwo\symbol{111}} - \expandafter\def\csname simpleicon@uipathicon\endcsname {\simpleiconsmaponetwo\symbol{112}} - \expandafter\def\csname simpleicon@ululeicon\endcsname {\simpleiconsmaponetwo\symbol{113}} - \expandafter\def\csname simpleicon@umamiicon\endcsname {\simpleiconsmaponetwo\symbol{114}} - \expandafter\def\csname simpleicon@umbracoicon\endcsname {\simpleiconsmaponetwo\symbol{115}} - \expandafter\def\csname simpleicon@umlicon\endcsname {\simpleiconsmaponetwo\symbol{116}} - \expandafter\def\csname simpleicon@unacademyicon\endcsname {\simpleiconsmaponetwo\symbol{117}} - \expandafter\def\csname simpleicon@underarmouricon\endcsname {\simpleiconsmaponetwo\symbol{118}} - \expandafter\def\csname simpleicon@underscoredotjsicon\endcsname {\simpleiconsmaponetwo\symbol{119}} - \expandafter\def\csname simpleicon@undertaleicon\endcsname {\simpleiconsmaponetwo\symbol{120}} - \expandafter\def\csname simpleicon@unicodeicon\endcsname {\simpleiconsmaponetwo\symbol{121}} - \expandafter\def\csname simpleicon@unilevericon\endcsname {\simpleiconsmaponetwo\symbol{122}} - \expandafter\def\csname simpleicon@uniqloicon\endcsname {\simpleiconsmaponetwo\symbol{123}} - \expandafter\def\csname simpleicon@uniqlojaicon\endcsname {\simpleiconsmaponetwo\symbol{124}} - \expandafter\def\csname simpleicon@unitedairlinesicon\endcsname {\simpleiconsmaponetwo\symbol{125}} - \expandafter\def\csname simpleicon@unitednationsicon\endcsname {\simpleiconsmaponetwo\symbol{126}} - \expandafter\def\csname simpleicon@unityicon\endcsname {\simpleiconsmaponetwo\symbol{127}} - \expandafter\def\csname simpleicon@unjsicon\endcsname {\simpleiconsmaponetwo\symbol{128}} - \expandafter\def\csname simpleicon@unlicenseicon\endcsname {\simpleiconsmaponetwo\symbol{129}} - \expandafter\def\csname simpleicon@unocssicon\endcsname {\simpleiconsmaponetwo\symbol{130}} - \expandafter\def\csname simpleicon@unpkgicon\endcsname {\simpleiconsmaponetwo\symbol{131}} - \expandafter\def\csname simpleicon@unraidicon\endcsname {\simpleiconsmaponetwo\symbol{132}} - \expandafter\def\csname simpleicon@unrealengineicon\endcsname {\simpleiconsmaponetwo\symbol{133}} - \expandafter\def\csname simpleicon@unsplashicon\endcsname {\simpleiconsmaponetwo\symbol{134}} - \expandafter\def\csname simpleicon@untappdicon\endcsname {\simpleiconsmaponetwo\symbol{135}} - \expandafter\def\csname simpleicon@upcloudicon\endcsname {\simpleiconsmaponetwo\symbol{136}} - \expandafter\def\csname simpleicon@upholdicon\endcsname {\simpleiconsmaponetwo\symbol{137}} - \expandafter\def\csname simpleicon@uplabsicon\endcsname {\simpleiconsmaponetwo\symbol{138}} - \expandafter\def\csname simpleicon@upptimeicon\endcsname {\simpleiconsmaponetwo\symbol{139}} - \expandafter\def\csname simpleicon@upsicon\endcsname {\simpleiconsmaponetwo\symbol{140}} - \expandafter\def\csname simpleicon@upstashicon\endcsname {\simpleiconsmaponetwo\symbol{141}} - \expandafter\def\csname simpleicon@uptimekumaicon\endcsname {\simpleiconsmaponetwo\symbol{142}} - \expandafter\def\csname simpleicon@uptoboxicon\endcsname {\simpleiconsmaponetwo\symbol{143}} - \expandafter\def\csname simpleicon@upworkicon\endcsname {\simpleiconsmaponetwo\symbol{144}} - \expandafter\def\csname simpleicon@uspsicon\endcsname {\simpleiconsmaponetwo\symbol{145}} - \expandafter\def\csname simpleicon@utorrenticon\endcsname {\simpleiconsmaponetwo\symbol{146}} - \expandafter\def\csname simpleicon@vicon\endcsname {\simpleiconsmaponetwo\symbol{147}} - \expandafter\def\csname simpleicon@v2exicon\endcsname {\simpleiconsmaponetwo\symbol{148}} - \expandafter\def\csname simpleicon@v8icon\endcsname {\simpleiconsmaponetwo\symbol{149}} - \expandafter\def\csname simpleicon@vaadinicon\endcsname {\simpleiconsmaponetwo\symbol{150}} - \expandafter\def\csname simpleicon@vagranticon\endcsname {\simpleiconsmaponetwo\symbol{151}} - \expandafter\def\csname simpleicon@valaicon\endcsname {\simpleiconsmaponetwo\symbol{152}} - \expandafter\def\csname simpleicon@valoranticon\endcsname {\simpleiconsmaponetwo\symbol{153}} - \expandafter\def\csname simpleicon@valveicon\endcsname {\simpleiconsmaponetwo\symbol{154}} - \expandafter\def\csname simpleicon@vaporicon\endcsname {\simpleiconsmaponetwo\symbol{155}} - \expandafter\def\csname simpleicon@vaulticon\endcsname {\simpleiconsmaponetwo\symbol{156}} - \expandafter\def\csname simpleicon@vaultwardenicon\endcsname {\simpleiconsmaponetwo\symbol{157}} - \expandafter\def\csname simpleicon@vauxhallicon\endcsname {\simpleiconsmaponetwo\symbol{158}} - \expandafter\def\csname simpleicon@vbulletinicon\endcsname {\simpleiconsmaponetwo\symbol{159}} - \expandafter\def\csname simpleicon@vectaryicon\endcsname {\simpleiconsmaponetwo\symbol{160}} - \expandafter\def\csname simpleicon@vectorlogozoneicon\endcsname {\simpleiconsmaponetwo\symbol{161}} - \expandafter\def\csname simpleicon@vectorworksicon\endcsname {\simpleiconsmaponetwo\symbol{162}} - \expandafter\def\csname simpleicon@veeamicon\endcsname {\simpleiconsmaponetwo\symbol{163}} - \expandafter\def\csname simpleicon@veedicon\endcsname {\simpleiconsmaponetwo\symbol{164}} - \expandafter\def\csname simpleicon@veepeeicon\endcsname {\simpleiconsmaponetwo\symbol{165}} - \expandafter\def\csname simpleicon@vegaicon\endcsname {\simpleiconsmaponetwo\symbol{166}} - \expandafter\def\csname simpleicon@vegasicon\endcsname {\simpleiconsmaponetwo\symbol{167}} - \expandafter\def\csname simpleicon@velogicon\endcsname {\simpleiconsmaponetwo\symbol{168}} - \expandafter\def\csname simpleicon@venmoicon\endcsname {\simpleiconsmaponetwo\symbol{169}} - \expandafter\def\csname simpleicon@vercelicon\endcsname {\simpleiconsmaponetwo\symbol{170}} - \expandafter\def\csname simpleicon@verdaccioicon\endcsname {\simpleiconsmaponetwo\symbol{171}} - \expandafter\def\csname simpleicon@veritasicon\endcsname {\simpleiconsmaponetwo\symbol{172}} - \expandafter\def\csname simpleicon@verizonicon\endcsname {\simpleiconsmaponetwo\symbol{173}} - \expandafter\def\csname simpleicon@vespaicon\endcsname {\simpleiconsmaponetwo\symbol{174}} - \expandafter\def\csname simpleicon@vestelicon\endcsname {\simpleiconsmaponetwo\symbol{175}} - \expandafter\def\csname simpleicon@vexxhosticon\endcsname {\simpleiconsmaponetwo\symbol{176}} - \expandafter\def\csname simpleicon@vfairsicon\endcsname {\simpleiconsmaponetwo\symbol{177}} - \expandafter\def\csname simpleicon@viadeoicon\endcsname {\simpleiconsmaponetwo\symbol{178}} - \expandafter\def\csname simpleicon@viaplayicon\endcsname {\simpleiconsmaponetwo\symbol{179}} - \expandafter\def\csname simpleicon@vibericon\endcsname {\simpleiconsmaponetwo\symbol{180}} - \expandafter\def\csname simpleicon@vibloicon\endcsname {\simpleiconsmaponetwo\symbol{181}} - \expandafter\def\csname simpleicon@victoriametricsicon\endcsname {\simpleiconsmaponetwo\symbol{182}} - \expandafter\def\csname simpleicon@victronenergyicon\endcsname {\simpleiconsmaponetwo\symbol{183}} - \expandafter\def\csname simpleicon@vimicon\endcsname {\simpleiconsmaponetwo\symbol{184}} - \expandafter\def\csname simpleicon@vimeoicon\endcsname {\simpleiconsmaponetwo\symbol{185}} - \expandafter\def\csname simpleicon@vimeolivestreamicon\endcsname {\simpleiconsmaponetwo\symbol{186}} - \expandafter\def\csname simpleicon@virginicon\endcsname {\simpleiconsmaponetwo\symbol{187}} - \expandafter\def\csname simpleicon@virginatlanticicon\endcsname {\simpleiconsmaponetwo\symbol{188}} - \expandafter\def\csname simpleicon@virginmediaicon\endcsname {\simpleiconsmaponetwo\symbol{189}} - \expandafter\def\csname simpleicon@virtualboxicon\endcsname {\simpleiconsmaponetwo\symbol{190}} - \expandafter\def\csname simpleicon@virustotalicon\endcsname {\simpleiconsmaponetwo\symbol{191}} - \expandafter\def\csname simpleicon@visaicon\endcsname {\simpleiconsmaponetwo\symbol{192}} - \expandafter\def\csname simpleicon@visxicon\endcsname {\simpleiconsmaponetwo\symbol{193}} - \expandafter\def\csname simpleicon@viteicon\endcsname {\simpleiconsmaponetwo\symbol{194}} - \expandafter\def\csname simpleicon@vitepressicon\endcsname {\simpleiconsmaponetwo\symbol{195}} - \expandafter\def\csname simpleicon@vitessicon\endcsname {\simpleiconsmaponetwo\symbol{196}} - \expandafter\def\csname simpleicon@vitesticon\endcsname {\simpleiconsmaponetwo\symbol{197}} - \expandafter\def\csname simpleicon@vivaldiicon\endcsname {\simpleiconsmaponetwo\symbol{198}} - \expandafter\def\csname simpleicon@vivawalleticon\endcsname {\simpleiconsmaponetwo\symbol{199}} - \expandafter\def\csname simpleicon@vivinoicon\endcsname {\simpleiconsmaponetwo\symbol{200}} - \expandafter\def\csname simpleicon@vivinticon\endcsname {\simpleiconsmaponetwo\symbol{201}} - \expandafter\def\csname simpleicon@vivoicon\endcsname {\simpleiconsmaponetwo\symbol{202}} - \expandafter\def\csname simpleicon@vkicon\endcsname {\simpleiconsmaponetwo\symbol{203}} - \expandafter\def\csname simpleicon@vlcmediaplayericon\endcsname {\simpleiconsmaponetwo\symbol{204}} - \expandafter\def\csname simpleicon@vmwareicon\endcsname {\simpleiconsmaponetwo\symbol{205}} - \expandafter\def\csname simpleicon@vodafoneicon\endcsname {\simpleiconsmaponetwo\symbol{206}} - \expandafter\def\csname simpleicon@voidlinuxicon\endcsname {\simpleiconsmaponetwo\symbol{207}} - \expandafter\def\csname simpleicon@voipdotmsicon\endcsname {\simpleiconsmaponetwo\symbol{208}} - \expandafter\def\csname simpleicon@volkswagenicon\endcsname {\simpleiconsmaponetwo\symbol{209}} - \expandafter\def\csname simpleicon@volvoicon\endcsname {\simpleiconsmaponetwo\symbol{210}} - \expandafter\def\csname simpleicon@vonageicon\endcsname {\simpleiconsmaponetwo\symbol{211}} - \expandafter\def\csname simpleicon@vorondesignicon\endcsname {\simpleiconsmaponetwo\symbol{212}} - \expandafter\def\csname simpleicon@vowpalwabbiticon\endcsname {\simpleiconsmaponetwo\symbol{213}} - \expandafter\def\csname simpleicon@voxicon\endcsname {\simpleiconsmaponetwo\symbol{214}} - \expandafter\def\csname simpleicon@vrchaticon\endcsname {\simpleiconsmaponetwo\symbol{215}} - \expandafter\def\csname simpleicon@vscoicon\endcsname {\simpleiconsmaponetwo\symbol{216}} - \expandafter\def\csname simpleicon@vscodiumicon\endcsname {\simpleiconsmaponetwo\symbol{217}} - \expandafter\def\csname simpleicon@vtexicon\endcsname {\simpleiconsmaponetwo\symbol{218}} - \expandafter\def\csname simpleicon@vuedotjsicon\endcsname {\simpleiconsmaponetwo\symbol{219}} - \expandafter\def\csname simpleicon@vuetifyicon\endcsname {\simpleiconsmaponetwo\symbol{220}} - \expandafter\def\csname simpleicon@vulkanicon\endcsname {\simpleiconsmaponetwo\symbol{221}} - \expandafter\def\csname simpleicon@vultricon\endcsname {\simpleiconsmaponetwo\symbol{222}} - \expandafter\def\csname simpleicon@vyondicon\endcsname {\simpleiconsmaponetwo\symbol{223}} - \expandafter\def\csname simpleicon@w3schoolsicon\endcsname {\simpleiconsmaponetwo\symbol{224}} - \expandafter\def\csname simpleicon@wacomicon\endcsname {\simpleiconsmaponetwo\symbol{225}} - \expandafter\def\csname simpleicon@wagmiicon\endcsname {\simpleiconsmaponetwo\symbol{226}} - \expandafter\def\csname simpleicon@wagtailicon\endcsname {\simpleiconsmaponetwo\symbol{227}} - \expandafter\def\csname simpleicon@wailsicon\endcsname {\simpleiconsmaponetwo\symbol{228}} - \expandafter\def\csname simpleicon@wakatimeicon\endcsname {\simpleiconsmaponetwo\symbol{229}} - \expandafter\def\csname simpleicon@walkmanicon\endcsname {\simpleiconsmaponetwo\symbol{230}} - \expandafter\def\csname simpleicon@wallabagicon\endcsname {\simpleiconsmaponetwo\symbol{231}} - \expandafter\def\csname simpleicon@walletconnecticon\endcsname {\simpleiconsmaponetwo\symbol{232}} - \expandafter\def\csname simpleicon@walmarticon\endcsname {\simpleiconsmaponetwo\symbol{233}} - \expandafter\def\csname simpleicon@wantedlyicon\endcsname {\simpleiconsmaponetwo\symbol{234}} - \expandafter\def\csname simpleicon@wappalyzericon\endcsname {\simpleiconsmaponetwo\symbol{235}} - \expandafter\def\csname simpleicon@warnerbrosicon\endcsname {\simpleiconsmaponetwo\symbol{236}} - \expandafter\def\csname simpleicon@warpicon\endcsname {\simpleiconsmaponetwo\symbol{237}} - \expandafter\def\csname simpleicon@wasabiicon\endcsname {\simpleiconsmaponetwo\symbol{238}} - \expandafter\def\csname simpleicon@wasmcloudicon\endcsname {\simpleiconsmaponetwo\symbol{239}} - \expandafter\def\csname simpleicon@wasmericon\endcsname {\simpleiconsmaponetwo\symbol{240}} - \expandafter\def\csname simpleicon@watchtowericon\endcsname {\simpleiconsmaponetwo\symbol{241}} - \expandafter\def\csname simpleicon@wattpadicon\endcsname {\simpleiconsmaponetwo\symbol{242}} - \expandafter\def\csname simpleicon@waylandicon\endcsname {\simpleiconsmaponetwo\symbol{243}} - \expandafter\def\csname simpleicon@wazeicon\endcsname {\simpleiconsmaponetwo\symbol{244}} - \expandafter\def\csname simpleicon@wazirxicon\endcsname {\simpleiconsmaponetwo\symbol{245}} - \expandafter\def\csname simpleicon@wearosicon\endcsname {\simpleiconsmaponetwo\symbol{246}} - \expandafter\def\csname simpleicon@weasylicon\endcsname {\simpleiconsmaponetwo\symbol{247}} - \expandafter\def\csname simpleicon@web3dotjsicon\endcsname {\simpleiconsmaponetwo\symbol{248}} - \expandafter\def\csname simpleicon@webassemblyicon\endcsname {\simpleiconsmaponetwo\symbol{249}} - \expandafter\def\csname simpleicon@webauthnicon\endcsname {\simpleiconsmaponetwo\symbol{250}} - \expandafter\def\csname simpleicon@webcomponentsdotorgicon\endcsname {\simpleiconsmaponetwo\symbol{251}} - \expandafter\def\csname simpleicon@webdriverioicon\endcsname {\simpleiconsmaponetwo\symbol{252}} - \expandafter\def\csname simpleicon@webexicon\endcsname {\simpleiconsmaponetwo\symbol{253}} - \expandafter\def\csname simpleicon@webflowicon\endcsname {\simpleiconsmaponetwo\symbol{254}} - \expandafter\def\csname simpleicon@webglicon\endcsname {\simpleiconsmaponetwo\symbol{255}} - \expandafter\def\csname simpleicon@webgpuicon\endcsname {\simpleiconsmaponethree\symbol{0}} - \expandafter\def\csname simpleicon@weblateicon\endcsname {\simpleiconsmaponethree\symbol{1}} - \expandafter\def\csname simpleicon@webminicon\endcsname {\simpleiconsmaponethree\symbol{2}} - \expandafter\def\csname simpleicon@webmoneyicon\endcsname {\simpleiconsmaponethree\symbol{3}} - \expandafter\def\csname simpleicon@webpackicon\endcsname {\simpleiconsmaponethree\symbol{4}} - \expandafter\def\csname simpleicon@webrtcicon\endcsname {\simpleiconsmaponethree\symbol{5}} - \expandafter\def\csname simpleicon@webstormicon\endcsname {\simpleiconsmaponethree\symbol{6}} - \expandafter\def\csname simpleicon@webtoonicon\endcsname {\simpleiconsmaponethree\symbol{7}} - \expandafter\def\csname simpleicon@webtreesicon\endcsname {\simpleiconsmaponethree\symbol{8}} - \expandafter\def\csname simpleicon@wechaticon\endcsname {\simpleiconsmaponethree\symbol{9}} - \expandafter\def\csname simpleicon@wegameicon\endcsname {\simpleiconsmaponethree\symbol{10}} - \expandafter\def\csname simpleicon@weightsandbiasesicon\endcsname {\simpleiconsmaponethree\symbol{11}} - \expandafter\def\csname simpleicon@welcometothejungleicon\endcsname {\simpleiconsmaponethree\symbol{12}} - \expandafter\def\csname simpleicon@wellfoundicon\endcsname {\simpleiconsmaponethree\symbol{13}} - \expandafter\def\csname simpleicon@wellsfargoicon\endcsname {\simpleiconsmaponethree\symbol{14}} - \expandafter\def\csname simpleicon@wemoicon\endcsname {\simpleiconsmaponethree\symbol{15}} - \expandafter\def\csname simpleicon@westerndigitalicon\endcsname {\simpleiconsmaponethree\symbol{16}} - \expandafter\def\csname simpleicon@westernunionicon\endcsname {\simpleiconsmaponethree\symbol{17}} - \expandafter\def\csname simpleicon@wetransfericon\endcsname {\simpleiconsmaponethree\symbol{18}} - \expandafter\def\csname simpleicon@weztermicon\endcsname {\simpleiconsmaponethree\symbol{19}} - \expandafter\def\csname simpleicon@wgpuicon\endcsname {\simpleiconsmaponethree\symbol{20}} - \expandafter\def\csname simpleicon@whatsappicon\endcsname {\simpleiconsmaponethree\symbol{21}} - \expandafter\def\csname simpleicon@wheniworkicon\endcsname {\simpleiconsmaponethree\symbol{22}} - \expandafter\def\csname simpleicon@wiiicon\endcsname {\simpleiconsmaponethree\symbol{23}} - \expandafter\def\csname simpleicon@wiiuicon\endcsname {\simpleiconsmaponethree\symbol{24}} - \expandafter\def\csname simpleicon@wikidataicon\endcsname {\simpleiconsmaponethree\symbol{25}} - \expandafter\def\csname simpleicon@wikidotggicon\endcsname {\simpleiconsmaponethree\symbol{26}} - \expandafter\def\csname simpleicon@wikidotjsicon\endcsname {\simpleiconsmaponethree\symbol{27}} - \expandafter\def\csname simpleicon@wikimediacommonsicon\endcsname {\simpleiconsmaponethree\symbol{28}} - \expandafter\def\csname simpleicon@wikimediafoundationicon\endcsname {\simpleiconsmaponethree\symbol{29}} - \expandafter\def\csname simpleicon@wikipediaicon\endcsname {\simpleiconsmaponethree\symbol{30}} - \expandafter\def\csname simpleicon@wikiquoteicon\endcsname {\simpleiconsmaponethree\symbol{31}} - \expandafter\def\csname simpleicon@wikivoyageicon\endcsname {\simpleiconsmaponethree\symbol{32}} - \expandafter\def\csname simpleicon@winampicon\endcsname {\simpleiconsmaponethree\symbol{33}} - \expandafter\def\csname simpleicon@wiproicon\endcsname {\simpleiconsmaponethree\symbol{34}} - \expandafter\def\csname simpleicon@wireicon\endcsname {\simpleiconsmaponethree\symbol{35}} - \expandafter\def\csname simpleicon@wireguardicon\endcsname {\simpleiconsmaponethree\symbol{36}} - \expandafter\def\csname simpleicon@wiresharkicon\endcsname {\simpleiconsmaponethree\symbol{37}} - \expandafter\def\csname simpleicon@wiseicon\endcsname {\simpleiconsmaponethree\symbol{38}} - \expandafter\def\csname simpleicon@wishicon\endcsname {\simpleiconsmaponethree\symbol{39}} - \expandafter\def\csname simpleicon@wistiaicon\endcsname {\simpleiconsmaponethree\symbol{40}} - \expandafter\def\csname simpleicon@wixicon\endcsname {\simpleiconsmaponethree\symbol{41}} - \expandafter\def\csname simpleicon@wizzairicon\endcsname {\simpleiconsmaponethree\symbol{42}} - \expandafter\def\csname simpleicon@wolframicon\endcsname {\simpleiconsmaponethree\symbol{43}} - \expandafter\def\csname simpleicon@wolframlanguageicon\endcsname {\simpleiconsmaponethree\symbol{44}} - \expandafter\def\csname simpleicon@wolframmathematicaicon\endcsname {\simpleiconsmaponethree\symbol{45}} - \expandafter\def\csname simpleicon@wondershareicon\endcsname {\simpleiconsmaponethree\symbol{46}} - \expandafter\def\csname simpleicon@wondersharefilmoraicon\endcsname {\simpleiconsmaponethree\symbol{47}} - \expandafter\def\csname simpleicon@wooicon\endcsname {\simpleiconsmaponethree\symbol{48}} - \expandafter\def\csname simpleicon@woocommerceicon\endcsname {\simpleiconsmaponethree\symbol{49}} - \expandafter\def\csname simpleicon@wordpressicon\endcsname {\simpleiconsmaponethree\symbol{50}} - \expandafter\def\csname simpleicon@workplaceicon\endcsname {\simpleiconsmaponethree\symbol{51}} - \expandafter\def\csname simpleicon@worldhealthorganizationicon\endcsname {\simpleiconsmaponethree\symbol{52}} - \expandafter\def\csname simpleicon@wpengineicon\endcsname {\simpleiconsmaponethree\symbol{53}} - \expandafter\def\csname simpleicon@wpexplorericon\endcsname {\simpleiconsmaponethree\symbol{54}} - \expandafter\def\csname simpleicon@wprocketicon\endcsname {\simpleiconsmaponethree\symbol{55}} - \expandafter\def\csname simpleicon@writedotasicon\endcsname {\simpleiconsmaponethree\symbol{56}} - \expandafter\def\csname simpleicon@wweicon\endcsname {\simpleiconsmaponethree\symbol{57}} - \expandafter\def\csname simpleicon@wwiseicon\endcsname {\simpleiconsmaponethree\symbol{58}} - \expandafter\def\csname simpleicon@wykopicon\endcsname {\simpleiconsmaponethree\symbol{59}} - \expandafter\def\csname simpleicon@wyzeicon\endcsname {\simpleiconsmaponethree\symbol{60}} - \expandafter\def\csname simpleicon@xicon\endcsname {\simpleiconsmaponethree\symbol{61}} - \expandafter\def\csname simpleicon@xamppicon\endcsname {\simpleiconsmaponethree\symbol{62}} - \expandafter\def\csname simpleicon@xcodeicon\endcsname {\simpleiconsmaponethree\symbol{63}} - \expandafter\def\csname simpleicon@xdadevelopersicon\endcsname {\simpleiconsmaponethree\symbol{64}} - \expandafter\def\csname simpleicon@xdotorgicon\endcsname {\simpleiconsmaponethree\symbol{65}} - \expandafter\def\csname simpleicon@xenditicon\endcsname {\simpleiconsmaponethree\symbol{66}} - \expandafter\def\csname simpleicon@xeroicon\endcsname {\simpleiconsmaponethree\symbol{67}} - \expandafter\def\csname simpleicon@xfceicon\endcsname {\simpleiconsmaponethree\symbol{68}} - \expandafter\def\csname simpleicon@xiaohongshuicon\endcsname {\simpleiconsmaponethree\symbol{69}} - \expandafter\def\csname simpleicon@xiaomiicon\endcsname {\simpleiconsmaponethree\symbol{70}} - \expandafter\def\csname simpleicon@xingicon\endcsname {\simpleiconsmaponethree\symbol{71}} - \expandafter\def\csname simpleicon@xmlicon\endcsname {\simpleiconsmaponethree\symbol{72}} - \expandafter\def\csname simpleicon@xmppicon\endcsname {\simpleiconsmaponethree\symbol{73}} - \expandafter\def\csname simpleicon@xoicon\endcsname {\simpleiconsmaponethree\symbol{74}} - \expandafter\def\csname simpleicon@xrpicon\endcsname {\simpleiconsmaponethree\symbol{75}} - \expandafter\def\csname simpleicon@xspliticon\endcsname {\simpleiconsmaponethree\symbol{76}} - \expandafter\def\csname simpleicon@xstateicon\endcsname {\simpleiconsmaponethree\symbol{77}} - \expandafter\def\csname simpleicon@xubuntuicon\endcsname {\simpleiconsmaponethree\symbol{78}} - \expandafter\def\csname simpleicon@yabaiicon\endcsname {\simpleiconsmaponethree\symbol{79}} - \expandafter\def\csname simpleicon@yaleicon\endcsname {\simpleiconsmaponethree\symbol{80}} - \expandafter\def\csname simpleicon@yamahacorporationicon\endcsname {\simpleiconsmaponethree\symbol{81}} - \expandafter\def\csname simpleicon@yamahamotorcorporationicon\endcsname {\simpleiconsmaponethree\symbol{82}} - \expandafter\def\csname simpleicon@yamlicon\endcsname {\simpleiconsmaponethree\symbol{83}} - \expandafter\def\csname simpleicon@yandexcloudicon\endcsname {\simpleiconsmaponethree\symbol{84}} - \expandafter\def\csname simpleicon@yarnicon\endcsname {\simpleiconsmaponethree\symbol{85}} - \expandafter\def\csname simpleicon@ycombinatoricon\endcsname {\simpleiconsmaponethree\symbol{86}} - \expandafter\def\csname simpleicon@yelpicon\endcsname {\simpleiconsmaponethree\symbol{87}} - \expandafter\def\csname simpleicon@yetiicon\endcsname {\simpleiconsmaponethree\symbol{88}} - \expandafter\def\csname simpleicon@yiiicon\endcsname {\simpleiconsmaponethree\symbol{89}} - \expandafter\def\csname simpleicon@yoasticon\endcsname {\simpleiconsmaponethree\symbol{90}} - \expandafter\def\csname simpleicon@youtubeicon\endcsname {\simpleiconsmaponethree\symbol{91}} - \expandafter\def\csname simpleicon@youtubegamingicon\endcsname {\simpleiconsmaponethree\symbol{92}} - \expandafter\def\csname simpleicon@youtubekidsicon\endcsname {\simpleiconsmaponethree\symbol{93}} - \expandafter\def\csname simpleicon@youtubemusicicon\endcsname {\simpleiconsmaponethree\symbol{94}} - \expandafter\def\csname simpleicon@youtubeshortsicon\endcsname {\simpleiconsmaponethree\symbol{95}} - \expandafter\def\csname simpleicon@youtubestudioicon\endcsname {\simpleiconsmaponethree\symbol{96}} - \expandafter\def\csname simpleicon@youtubetvicon\endcsname {\simpleiconsmaponethree\symbol{97}} - \expandafter\def\csname simpleicon@yricon\endcsname {\simpleiconsmaponethree\symbol{98}} - \expandafter\def\csname simpleicon@yubicoicon\endcsname {\simpleiconsmaponethree\symbol{99}} - \expandafter\def\csname simpleicon@yunohosticon\endcsname {\simpleiconsmaponethree\symbol{100}} - \expandafter\def\csname simpleicon@zabkaicon\endcsname {\simpleiconsmaponethree\symbol{101}} - \expandafter\def\csname simpleicon@zaimicon\endcsname {\simpleiconsmaponethree\symbol{102}} - \expandafter\def\csname simpleicon@zalandoicon\endcsname {\simpleiconsmaponethree\symbol{103}} - \expandafter\def\csname simpleicon@zaloicon\endcsname {\simpleiconsmaponethree\symbol{104}} - \expandafter\def\csname simpleicon@zapicon\endcsname {\simpleiconsmaponethree\symbol{105}} - \expandafter\def\csname simpleicon@zapiericon\endcsname {\simpleiconsmaponethree\symbol{106}} - \expandafter\def\csname simpleicon@zaraicon\endcsname {\simpleiconsmaponethree\symbol{107}} - \expandafter\def\csname simpleicon@zazzleicon\endcsname {\simpleiconsmaponethree\symbol{108}} - \expandafter\def\csname simpleicon@zcashicon\endcsname {\simpleiconsmaponethree\symbol{109}} - \expandafter\def\csname simpleicon@zcoolicon\endcsname {\simpleiconsmaponethree\symbol{110}} - \expandafter\def\csname simpleicon@zdficon\endcsname {\simpleiconsmaponethree\symbol{111}} - \expandafter\def\csname simpleicon@zebpayicon\endcsname {\simpleiconsmaponethree\symbol{112}} - \expandafter\def\csname simpleicon@zebratechnologiesicon\endcsname {\simpleiconsmaponethree\symbol{113}} - \expandafter\def\csname simpleicon@zedindustriesicon\endcsname {\simpleiconsmaponethree\symbol{114}} - \expandafter\def\csname simpleicon@zelleicon\endcsname {\simpleiconsmaponethree\symbol{115}} - \expandafter\def\csname simpleicon@zendicon\endcsname {\simpleiconsmaponethree\symbol{116}} - \expandafter\def\csname simpleicon@zendeskicon\endcsname {\simpleiconsmaponethree\symbol{117}} - \expandafter\def\csname simpleicon@zennicon\endcsname {\simpleiconsmaponethree\symbol{118}} - \expandafter\def\csname simpleicon@zenodoicon\endcsname {\simpleiconsmaponethree\symbol{119}} - \expandafter\def\csname simpleicon@zensaricon\endcsname {\simpleiconsmaponethree\symbol{120}} - \expandafter\def\csname simpleicon@zerodhaicon\endcsname {\simpleiconsmaponethree\symbol{121}} - \expandafter\def\csname simpleicon@zerotiericon\endcsname {\simpleiconsmaponethree\symbol{122}} - \expandafter\def\csname simpleicon@zerplyicon\endcsname {\simpleiconsmaponethree\symbol{123}} - \expandafter\def\csname simpleicon@zettlricon\endcsname {\simpleiconsmaponethree\symbol{124}} - \expandafter\def\csname simpleicon@zhihuicon\endcsname {\simpleiconsmaponethree\symbol{125}} - \expandafter\def\csname simpleicon@zigicon\endcsname {\simpleiconsmaponethree\symbol{126}} - \expandafter\def\csname simpleicon@zigbeeicon\endcsname {\simpleiconsmaponethree\symbol{127}} - \expandafter\def\csname simpleicon@zigbee2mqtticon\endcsname {\simpleiconsmaponethree\symbol{128}} - \expandafter\def\csname simpleicon@ziggoicon\endcsname {\simpleiconsmaponethree\symbol{129}} - \expandafter\def\csname simpleicon@zilchicon\endcsname {\simpleiconsmaponethree\symbol{130}} - \expandafter\def\csname simpleicon@zillowicon\endcsname {\simpleiconsmaponethree\symbol{131}} - \expandafter\def\csname simpleicon@zincsearchicon\endcsname {\simpleiconsmaponethree\symbol{132}} - \expandafter\def\csname simpleicon@zingaticon\endcsname {\simpleiconsmaponethree\symbol{133}} - \expandafter\def\csname simpleicon@zodicon\endcsname {\simpleiconsmaponethree\symbol{134}} - \expandafter\def\csname simpleicon@zohoicon\endcsname {\simpleiconsmaponethree\symbol{135}} - \expandafter\def\csname simpleicon@zoipericon\endcsname {\simpleiconsmaponethree\symbol{136}} - \expandafter\def\csname simpleicon@zomatoicon\endcsname {\simpleiconsmaponethree\symbol{137}} - \expandafter\def\csname simpleicon@zoomicon\endcsname {\simpleiconsmaponethree\symbol{138}} - \expandafter\def\csname simpleicon@zorinicon\endcsname {\simpleiconsmaponethree\symbol{139}} - \expandafter\def\csname simpleicon@zoteroicon\endcsname {\simpleiconsmaponethree\symbol{140}} - \expandafter\def\csname simpleicon@zshicon\endcsname {\simpleiconsmaponethree\symbol{141}} - \expandafter\def\csname simpleicon@zulipicon\endcsname {\simpleiconsmaponethree\symbol{142}} - \expandafter\def\csname simpleicon@zyteicon\endcsname {\simpleiconsmaponethree\symbol{143}}
\ No newline at end of file + \expandafter\def\csname simpleicon@suiicon\endcsname {\simpleiconsmaponeone\symbol{141}} + \expandafter\def\csname simpleicon@sumologicicon\endcsname {\simpleiconsmaponeone\symbol{142}} + \expandafter\def\csname simpleicon@sunoicon\endcsname {\simpleiconsmaponeone\symbol{143}} + \expandafter\def\csname simpleicon@sunriseicon\endcsname {\simpleiconsmaponeone\symbol{144}} + \expandafter\def\csname simpleicon@supabaseicon\endcsname {\simpleiconsmaponeone\symbol{145}} + \expandafter\def\csname simpleicon@supercreaseicon\endcsname {\simpleiconsmaponeone\symbol{146}} + \expandafter\def\csname simpleicon@supermicroicon\endcsname {\simpleiconsmaponeone\symbol{147}} + \expandafter\def\csname simpleicon@superusericon\endcsname {\simpleiconsmaponeone\symbol{148}} + \expandafter\def\csname simpleicon@surrealdbicon\endcsname {\simpleiconsmaponeone\symbol{149}} + \expandafter\def\csname simpleicon@surveymonkeyicon\endcsname {\simpleiconsmaponeone\symbol{150}} + \expandafter\def\csname simpleicon@suseicon\endcsname {\simpleiconsmaponeone\symbol{151}} + \expandafter\def\csname simpleicon@suzukiicon\endcsname {\simpleiconsmaponeone\symbol{152}} + \expandafter\def\csname simpleicon@svelteicon\endcsname {\simpleiconsmaponeone\symbol{153}} + \expandafter\def\csname simpleicon@svgicon\endcsname {\simpleiconsmaponeone\symbol{154}} + \expandafter\def\csname simpleicon@svgdotjsicon\endcsname {\simpleiconsmaponeone\symbol{155}} + \expandafter\def\csname simpleicon@svgoicon\endcsname {\simpleiconsmaponeone\symbol{156}} + \expandafter\def\csname simpleicon@svgtraceicon\endcsname {\simpleiconsmaponeone\symbol{157}} + \expandafter\def\csname simpleicon@swaggericon\endcsname {\simpleiconsmaponeone\symbol{158}} + \expandafter\def\csname simpleicon@swarmicon\endcsname {\simpleiconsmaponeone\symbol{159}} + \expandafter\def\csname simpleicon@swayicon\endcsname {\simpleiconsmaponeone\symbol{160}} + \expandafter\def\csname simpleicon@swcicon\endcsname {\simpleiconsmaponeone\symbol{161}} + \expandafter\def\csname simpleicon@swifticon\endcsname {\simpleiconsmaponeone\symbol{162}} + \expandafter\def\csname simpleicon@swiggyicon\endcsname {\simpleiconsmaponeone\symbol{163}} + \expandafter\def\csname simpleicon@swipericon\endcsname {\simpleiconsmaponeone\symbol{164}} + \expandafter\def\csname simpleicon@swricon\endcsname {\simpleiconsmaponeone\symbol{165}} + \expandafter\def\csname simpleicon@symantecicon\endcsname {\simpleiconsmaponeone\symbol{166}} + \expandafter\def\csname simpleicon@symbolabicon\endcsname {\simpleiconsmaponeone\symbol{167}} + \expandafter\def\csname simpleicon@symfonyicon\endcsname {\simpleiconsmaponeone\symbol{168}} + \expandafter\def\csname simpleicon@symphonyicon\endcsname {\simpleiconsmaponeone\symbol{169}} + \expandafter\def\csname simpleicon@sympyicon\endcsname {\simpleiconsmaponeone\symbol{170}} + \expandafter\def\csname simpleicon@syncthingicon\endcsname {\simpleiconsmaponeone\symbol{171}} + \expandafter\def\csname simpleicon@synologyicon\endcsname {\simpleiconsmaponeone\symbol{172}} + \expandafter\def\csname simpleicon@system76icon\endcsname {\simpleiconsmaponeone\symbol{173}} + \expandafter\def\csname simpleicon@tabelogicon\endcsname {\simpleiconsmaponeone\symbol{174}} + \expandafter\def\csname simpleicon@tableauicon\endcsname {\simpleiconsmaponeone\symbol{175}} + \expandafter\def\csname simpleicon@tablecheckicon\endcsname {\simpleiconsmaponeone\symbol{176}} + \expandafter\def\csname simpleicon@tacobellicon\endcsname {\simpleiconsmaponeone\symbol{177}} + \expandafter\def\csname simpleicon@tadoicon\endcsname {\simpleiconsmaponeone\symbol{178}} + \expandafter\def\csname simpleicon@taichigraphicsicon\endcsname {\simpleiconsmaponeone\symbol{179}} + \expandafter\def\csname simpleicon@taichilangicon\endcsname {\simpleiconsmaponeone\symbol{180}} + \expandafter\def\csname simpleicon@tailsicon\endcsname {\simpleiconsmaponeone\symbol{181}} + \expandafter\def\csname simpleicon@tailscaleicon\endcsname {\simpleiconsmaponeone\symbol{182}} + \expandafter\def\csname simpleicon@tailwindcssicon\endcsname {\simpleiconsmaponeone\symbol{183}} + \expandafter\def\csname simpleicon@taipyicon\endcsname {\simpleiconsmaponeone\symbol{184}} + \expandafter\def\csname simpleicon@taketwointeractivesoftwareicon\endcsname {\simpleiconsmaponeone\symbol{185}} + \expandafter\def\csname simpleicon@talendicon\endcsname {\simpleiconsmaponeone\symbol{186}} + \expandafter\def\csname simpleicon@talenthouseicon\endcsname {\simpleiconsmaponeone\symbol{187}} + \expandafter\def\csname simpleicon@talosicon\endcsname {\simpleiconsmaponeone\symbol{188}} + \expandafter\def\csname simpleicon@tamiyaicon\endcsname {\simpleiconsmaponeone\symbol{189}} + \expandafter\def\csname simpleicon@tampermonkeyicon\endcsname {\simpleiconsmaponeone\symbol{190}} + \expandafter\def\csname simpleicon@taobaoicon\endcsname {\simpleiconsmaponeone\symbol{191}} + \expandafter\def\csname simpleicon@tapasicon\endcsname {\simpleiconsmaponeone\symbol{192}} + \expandafter\def\csname simpleicon@targeticon\endcsname {\simpleiconsmaponeone\symbol{193}} + \expandafter\def\csname simpleicon@taromicon\endcsname {\simpleiconsmaponeone\symbol{194}} + \expandafter\def\csname simpleicon@taskicon\endcsname {\simpleiconsmaponeone\symbol{195}} + \expandafter\def\csname simpleicon@tasmotaicon\endcsname {\simpleiconsmaponeone\symbol{196}} + \expandafter\def\csname simpleicon@tataicon\endcsname {\simpleiconsmaponeone\symbol{197}} + \expandafter\def\csname simpleicon@tauriicon\endcsname {\simpleiconsmaponeone\symbol{198}} + \expandafter\def\csname simpleicon@taxbuzzicon\endcsname {\simpleiconsmaponeone\symbol{199}} + \expandafter\def\csname simpleicon@tcsicon\endcsname {\simpleiconsmaponeone\symbol{200}} + \expandafter\def\csname simpleicon@tealicon\endcsname {\simpleiconsmaponeone\symbol{201}} + \expandafter\def\csname simpleicon@teamcityicon\endcsname {\simpleiconsmaponeone\symbol{202}} + \expandafter\def\csname simpleicon@teamspeakicon\endcsname {\simpleiconsmaponeone\symbol{203}} + \expandafter\def\csname simpleicon@teamviewericon\endcsname {\simpleiconsmaponeone\symbol{204}} + \expandafter\def\csname simpleicon@techcrunchicon\endcsname {\simpleiconsmaponeone\symbol{205}} + \expandafter\def\csname simpleicon@tedicon\endcsname {\simpleiconsmaponeone\symbol{206}} + \expandafter\def\csname simpleicon@teepublicicon\endcsname {\simpleiconsmaponeone\symbol{207}} + \expandafter\def\csname simpleicon@teespringicon\endcsname {\simpleiconsmaponeone\symbol{208}} + \expandafter\def\csname simpleicon@tektonicon\endcsname {\simpleiconsmaponeone\symbol{209}} + \expandafter\def\csname simpleicon@tele5icon\endcsname {\simpleiconsmaponeone\symbol{210}} + \expandafter\def\csname simpleicon@telegramicon\endcsname {\simpleiconsmaponeone\symbol{211}} + \expandafter\def\csname simpleicon@telegraphicon\endcsname {\simpleiconsmaponeone\symbol{212}} + \expandafter\def\csname simpleicon@telequebecicon\endcsname {\simpleiconsmaponeone\symbol{213}} + \expandafter\def\csname simpleicon@temporalicon\endcsname {\simpleiconsmaponeone\symbol{214}} + \expandafter\def\csname simpleicon@tencentqqicon\endcsname {\simpleiconsmaponeone\symbol{215}} + \expandafter\def\csname simpleicon@tensorflowicon\endcsname {\simpleiconsmaponeone\symbol{216}} + \expandafter\def\csname simpleicon@teradataicon\endcsname {\simpleiconsmaponeone\symbol{217}} + \expandafter\def\csname simpleicon@teratailicon\endcsname {\simpleiconsmaponeone\symbol{218}} + \expandafter\def\csname simpleicon@termiusicon\endcsname {\simpleiconsmaponeone\symbol{219}} + \expandafter\def\csname simpleicon@terraformicon\endcsname {\simpleiconsmaponeone\symbol{220}} + \expandafter\def\csname simpleicon@tescoicon\endcsname {\simpleiconsmaponeone\symbol{221}} + \expandafter\def\csname simpleicon@teslaicon\endcsname {\simpleiconsmaponeone\symbol{222}} + \expandafter\def\csname simpleicon@testcafeicon\endcsname {\simpleiconsmaponeone\symbol{223}} + \expandafter\def\csname simpleicon@testinicon\endcsname {\simpleiconsmaponeone\symbol{224}} + \expandafter\def\csname simpleicon@testinglibraryicon\endcsname {\simpleiconsmaponeone\symbol{225}} + \expandafter\def\csname simpleicon@testrailicon\endcsname {\simpleiconsmaponeone\symbol{226}} + \expandafter\def\csname simpleicon@tethericon\endcsname {\simpleiconsmaponeone\symbol{227}} + \expandafter\def\csname simpleicon@textpatternicon\endcsname {\simpleiconsmaponeone\symbol{228}} + \expandafter\def\csname simpleicon@tgaicon\endcsname {\simpleiconsmaponeone\symbol{229}} + \expandafter\def\csname simpleicon@thangsicon\endcsname {\simpleiconsmaponeone\symbol{230}} + \expandafter\def\csname simpleicon@thanosicon\endcsname {\simpleiconsmaponeone\symbol{231}} + \expandafter\def\csname simpleicon@thealgorithmsicon\endcsname {\simpleiconsmaponeone\symbol{232}} + \expandafter\def\csname simpleicon@theboringcompanyicon\endcsname {\simpleiconsmaponeone\symbol{233}} + \expandafter\def\csname simpleicon@theconversationicon\endcsname {\simpleiconsmaponeone\symbol{234}} + \expandafter\def\csname simpleicon@thefinalsicon\endcsname {\simpleiconsmaponeone\symbol{235}} + \expandafter\def\csname simpleicon@theguardianicon\endcsname {\simpleiconsmaponeone\symbol{236}} + \expandafter\def\csname simpleicon@theirishtimesicon\endcsname {\simpleiconsmaponeone\symbol{237}} + \expandafter\def\csname simpleicon@themightyicon\endcsname {\simpleiconsmaponeone\symbol{238}} + \expandafter\def\csname simpleicon@themodelsresourceicon\endcsname {\simpleiconsmaponeone\symbol{239}} + \expandafter\def\csname simpleicon@themoviedatabaseicon\endcsname {\simpleiconsmaponeone\symbol{240}} + \expandafter\def\csname simpleicon@thenorthfaceicon\endcsname {\simpleiconsmaponeone\symbol{241}} + \expandafter\def\csname simpleicon@theodinprojecticon\endcsname {\simpleiconsmaponeone\symbol{242}} + \expandafter\def\csname simpleicon@theregistericon\endcsname {\simpleiconsmaponeone\symbol{243}} + \expandafter\def\csname simpleicon@thesoundsresourceicon\endcsname {\simpleiconsmaponeone\symbol{244}} + \expandafter\def\csname simpleicon@thespritersresourceicon\endcsname {\simpleiconsmaponeone\symbol{245}} + \expandafter\def\csname simpleicon@thewashingtonposticon\endcsname {\simpleiconsmaponeone\symbol{246}} + \expandafter\def\csname simpleicon@theweatherchannelicon\endcsname {\simpleiconsmaponeone\symbol{247}} + \expandafter\def\csname simpleicon@thingiverseicon\endcsname {\simpleiconsmaponeone\symbol{248}} + \expandafter\def\csname simpleicon@thinkpadicon\endcsname {\simpleiconsmaponeone\symbol{249}} + \expandafter\def\csname simpleicon@thirdwebicon\endcsname {\simpleiconsmaponeone\symbol{250}} + \expandafter\def\csname simpleicon@threadlessicon\endcsname {\simpleiconsmaponeone\symbol{251}} + \expandafter\def\csname simpleicon@threadsicon\endcsname {\simpleiconsmaponeone\symbol{252}} + \expandafter\def\csname simpleicon@threedotjsicon\endcsname {\simpleiconsmaponeone\symbol{253}} + \expandafter\def\csname simpleicon@threemaicon\endcsname {\simpleiconsmaponeone\symbol{254}} + \expandafter\def\csname simpleicon@thumbtackicon\endcsname {\simpleiconsmaponeone\symbol{255}} + \expandafter\def\csname simpleicon@thunderbirdicon\endcsname {\simpleiconsmaponetwo\symbol{0}} + \expandafter\def\csname simpleicon@thunderstoreicon\endcsname {\simpleiconsmaponetwo\symbol{1}} + \expandafter\def\csname simpleicon@thurgauerkantonalbankicon\endcsname {\simpleiconsmaponetwo\symbol{2}} + \expandafter\def\csname simpleicon@thymeleaficon\endcsname {\simpleiconsmaponetwo\symbol{3}} + \expandafter\def\csname simpleicon@ticketmastericon\endcsname {\simpleiconsmaponetwo\symbol{4}} + \expandafter\def\csname simpleicon@ticktickicon\endcsname {\simpleiconsmaponetwo\symbol{5}} + \expandafter\def\csname simpleicon@tidalicon\endcsname {\simpleiconsmaponetwo\symbol{6}} + \expandafter\def\csname simpleicon@tiddlywikiicon\endcsname {\simpleiconsmaponetwo\symbol{7}} + \expandafter\def\csname simpleicon@tideicon\endcsname {\simpleiconsmaponetwo\symbol{8}} + \expandafter\def\csname simpleicon@tidyverseicon\endcsname {\simpleiconsmaponetwo\symbol{9}} + \expandafter\def\csname simpleicon@tietoevryicon\endcsname {\simpleiconsmaponetwo\symbol{10}} + \expandafter\def\csname simpleicon@tiktokicon\endcsname {\simpleiconsmaponetwo\symbol{11}} + \expandafter\def\csname simpleicon@tildapublishingicon\endcsname {\simpleiconsmaponetwo\symbol{12}} + \expandafter\def\csname simpleicon@tileicon\endcsname {\simpleiconsmaponetwo\symbol{13}} + \expandafter\def\csname simpleicon@timescaleicon\endcsname {\simpleiconsmaponetwo\symbol{14}} + \expandafter\def\csname simpleicon@tinaicon\endcsname {\simpleiconsmaponetwo\symbol{15}} + \expandafter\def\csname simpleicon@tindericon\endcsname {\simpleiconsmaponetwo\symbol{16}} + \expandafter\def\csname simpleicon@tindieicon\endcsname {\simpleiconsmaponetwo\symbol{17}} + \expandafter\def\csname simpleicon@tinkercadicon\endcsname {\simpleiconsmaponetwo\symbol{18}} + \expandafter\def\csname simpleicon@tinygradicon\endcsname {\simpleiconsmaponetwo\symbol{19}} + \expandafter\def\csname simpleicon@tinylettericon\endcsname {\simpleiconsmaponetwo\symbol{20}} + \expandafter\def\csname simpleicon@tistoryicon\endcsname {\simpleiconsmaponetwo\symbol{21}} + \expandafter\def\csname simpleicon@tldrawicon\endcsname {\simpleiconsmaponetwo\symbol{22}} + \expandafter\def\csname simpleicon@tmobileicon\endcsname {\simpleiconsmaponetwo\symbol{23}} + \expandafter\def\csname simpleicon@tmuxicon\endcsname {\simpleiconsmaponetwo\symbol{24}} + \expandafter\def\csname simpleicon@todoisticon\endcsname {\simpleiconsmaponetwo\symbol{25}} + \expandafter\def\csname simpleicon@togglicon\endcsname {\simpleiconsmaponetwo\symbol{26}} + \expandafter\def\csname simpleicon@toggltrackicon\endcsname {\simpleiconsmaponetwo\symbol{27}} + \expandafter\def\csname simpleicon@tokyometroicon\endcsname {\simpleiconsmaponetwo\symbol{28}} + \expandafter\def\csname simpleicon@tollicon\endcsname {\simpleiconsmaponetwo\symbol{29}} + \expandafter\def\csname simpleicon@tomlicon\endcsname {\simpleiconsmaponetwo\symbol{30}} + \expandafter\def\csname simpleicon@tomorrowlandicon\endcsname {\simpleiconsmaponetwo\symbol{31}} + \expandafter\def\csname simpleicon@tonicon\endcsname {\simpleiconsmaponetwo\symbol{32}} + \expandafter\def\csname simpleicon@topcodericon\endcsname {\simpleiconsmaponetwo\symbol{33}} + \expandafter\def\csname simpleicon@topdotggicon\endcsname {\simpleiconsmaponetwo\symbol{34}} + \expandafter\def\csname simpleicon@toptalicon\endcsname {\simpleiconsmaponetwo\symbol{35}} + \expandafter\def\csname simpleicon@torbrowsericon\endcsname {\simpleiconsmaponetwo\symbol{36}} + \expandafter\def\csname simpleicon@torprojecticon\endcsname {\simpleiconsmaponetwo\symbol{37}} + \expandafter\def\csname simpleicon@toshibaicon\endcsname {\simpleiconsmaponetwo\symbol{38}} + \expandafter\def\csname simpleicon@totvsicon\endcsname {\simpleiconsmaponetwo\symbol{39}} + \expandafter\def\csname simpleicon@tourboxicon\endcsname {\simpleiconsmaponetwo\symbol{40}} + \expandafter\def\csname simpleicon@towericon\endcsname {\simpleiconsmaponetwo\symbol{41}} + \expandafter\def\csname simpleicon@toyotaicon\endcsname {\simpleiconsmaponetwo\symbol{42}} + \expandafter\def\csname simpleicon@tplinkicon\endcsname {\simpleiconsmaponetwo\symbol{43}} + \expandafter\def\csname simpleicon@tqdmicon\endcsname {\simpleiconsmaponetwo\symbol{44}} + \expandafter\def\csname simpleicon@traccaricon\endcsname {\simpleiconsmaponetwo\symbol{45}} + \expandafter\def\csname simpleicon@tradingviewicon\endcsname {\simpleiconsmaponetwo\symbol{46}} + \expandafter\def\csname simpleicon@traefikmeshicon\endcsname {\simpleiconsmaponetwo\symbol{47}} + \expandafter\def\csname simpleicon@traefikproxyicon\endcsname {\simpleiconsmaponetwo\symbol{48}} + \expandafter\def\csname simpleicon@trailforksicon\endcsname {\simpleiconsmaponetwo\symbol{49}} + \expandafter\def\csname simpleicon@trainerroadicon\endcsname {\simpleiconsmaponetwo\symbol{50}} + \expandafter\def\csname simpleicon@trakticon\endcsname {\simpleiconsmaponetwo\symbol{51}} + \expandafter\def\csname simpleicon@transifexicon\endcsname {\simpleiconsmaponetwo\symbol{52}} + \expandafter\def\csname simpleicon@transmissionicon\endcsname {\simpleiconsmaponetwo\symbol{53}} + \expandafter\def\csname simpleicon@transportforirelandicon\endcsname {\simpleiconsmaponetwo\symbol{54}} + \expandafter\def\csname simpleicon@transportforlondonicon\endcsname {\simpleiconsmaponetwo\symbol{55}} + \expandafter\def\csname simpleicon@travisciicon\endcsname {\simpleiconsmaponetwo\symbol{56}} + \expandafter\def\csname simpleicon@treehouseicon\endcsname {\simpleiconsmaponetwo\symbol{57}} + \expandafter\def\csname simpleicon@trelloicon\endcsname {\simpleiconsmaponetwo\symbol{58}} + \expandafter\def\csname simpleicon@trendmicroicon\endcsname {\simpleiconsmaponetwo\symbol{59}} + \expandafter\def\csname simpleicon@treyarchicon\endcsname {\simpleiconsmaponetwo\symbol{60}} + \expandafter\def\csname simpleicon@tricentisicon\endcsname {\simpleiconsmaponetwo\symbol{61}} + \expandafter\def\csname simpleicon@triliumicon\endcsname {\simpleiconsmaponetwo\symbol{62}} + \expandafter\def\csname simpleicon@trillericon\endcsname {\simpleiconsmaponetwo\symbol{63}} + \expandafter\def\csname simpleicon@trillertvicon\endcsname {\simpleiconsmaponetwo\symbol{64}} + \expandafter\def\csname simpleicon@trinoicon\endcsname {\simpleiconsmaponetwo\symbol{65}} + \expandafter\def\csname simpleicon@tripadvisoricon\endcsname {\simpleiconsmaponetwo\symbol{66}} + \expandafter\def\csname simpleicon@tripdotcomicon\endcsname {\simpleiconsmaponetwo\symbol{67}} + \expandafter\def\csname simpleicon@trivagoicon\endcsname {\simpleiconsmaponetwo\symbol{68}} + \expandafter\def\csname simpleicon@trivyicon\endcsname {\simpleiconsmaponetwo\symbol{69}} + \expandafter\def\csname simpleicon@troveicon\endcsname {\simpleiconsmaponetwo\symbol{70}} + \expandafter\def\csname simpleicon@trpcicon\endcsname {\simpleiconsmaponetwo\symbol{71}} + \expandafter\def\csname simpleicon@truenasicon\endcsname {\simpleiconsmaponetwo\symbol{72}} + \expandafter\def\csname simpleicon@trueupicon\endcsname {\simpleiconsmaponetwo\symbol{73}} + \expandafter\def\csname simpleicon@truliaicon\endcsname {\simpleiconsmaponetwo\symbol{74}} + \expandafter\def\csname simpleicon@trustedshopsicon\endcsname {\simpleiconsmaponetwo\symbol{75}} + \expandafter\def\csname simpleicon@trustpiloticon\endcsname {\simpleiconsmaponetwo\symbol{76}} + \expandafter\def\csname simpleicon@tryhackmeicon\endcsname {\simpleiconsmaponetwo\symbol{77}} + \expandafter\def\csname simpleicon@tryitonlineicon\endcsname {\simpleiconsmaponetwo\symbol{78}} + \expandafter\def\csname simpleicon@tsnodeicon\endcsname {\simpleiconsmaponetwo\symbol{79}} + \expandafter\def\csname simpleicon@tubiicon\endcsname {\simpleiconsmaponetwo\symbol{80}} + \expandafter\def\csname simpleicon@tuiicon\endcsname {\simpleiconsmaponetwo\symbol{81}} + \expandafter\def\csname simpleicon@tumblricon\endcsname {\simpleiconsmaponetwo\symbol{82}} + \expandafter\def\csname simpleicon@tuneinicon\endcsname {\simpleiconsmaponetwo\symbol{83}} + \expandafter\def\csname simpleicon@turboicon\endcsname {\simpleiconsmaponetwo\symbol{84}} + \expandafter\def\csname simpleicon@turborepoicon\endcsname {\simpleiconsmaponetwo\symbol{85}} + \expandafter\def\csname simpleicon@turbosquidicon\endcsname {\simpleiconsmaponetwo\symbol{86}} + \expandafter\def\csname simpleicon@turkishairlinesicon\endcsname {\simpleiconsmaponetwo\symbol{87}} + \expandafter\def\csname simpleicon@tursoicon\endcsname {\simpleiconsmaponetwo\symbol{88}} + \expandafter\def\csname simpleicon@tutanotaicon\endcsname {\simpleiconsmaponetwo\symbol{89}} + \expandafter\def\csname simpleicon@tv4playicon\endcsname {\simpleiconsmaponetwo\symbol{90}} + \expandafter\def\csname simpleicon@tvtimeicon\endcsname {\simpleiconsmaponetwo\symbol{91}} + \expandafter\def\csname simpleicon@twilioicon\endcsname {\simpleiconsmaponetwo\symbol{92}} + \expandafter\def\csname simpleicon@twinklyicon\endcsname {\simpleiconsmaponetwo\symbol{93}} + \expandafter\def\csname simpleicon@twinmotionicon\endcsname {\simpleiconsmaponetwo\symbol{94}} + \expandafter\def\csname simpleicon@twitchicon\endcsname {\simpleiconsmaponetwo\symbol{95}} + \expandafter\def\csname simpleicon@typeformicon\endcsname {\simpleiconsmaponetwo\symbol{96}} + \expandafter\def\csname simpleicon@typeormicon\endcsname {\simpleiconsmaponetwo\symbol{97}} + \expandafter\def\csname simpleicon@typericon\endcsname {\simpleiconsmaponetwo\symbol{98}} + \expandafter\def\csname simpleicon@typescripticon\endcsname {\simpleiconsmaponetwo\symbol{99}} + \expandafter\def\csname simpleicon@typo3icon\endcsname {\simpleiconsmaponetwo\symbol{100}} + \expandafter\def\csname simpleicon@typsticon\endcsname {\simpleiconsmaponetwo\symbol{101}} + \expandafter\def\csname simpleicon@ubericon\endcsname {\simpleiconsmaponetwo\symbol{102}} + \expandafter\def\csname simpleicon@ubereatsicon\endcsname {\simpleiconsmaponetwo\symbol{103}} + \expandafter\def\csname simpleicon@ubiquitiicon\endcsname {\simpleiconsmaponetwo\symbol{104}} + \expandafter\def\csname simpleicon@ubisofticon\endcsname {\simpleiconsmaponetwo\symbol{105}} + \expandafter\def\csname simpleicon@ublockoriginicon\endcsname {\simpleiconsmaponetwo\symbol{106}} + \expandafter\def\csname simpleicon@ubuntuicon\endcsname {\simpleiconsmaponetwo\symbol{107}} + \expandafter\def\csname simpleicon@ubuntumateicon\endcsname {\simpleiconsmaponetwo\symbol{108}} + \expandafter\def\csname simpleicon@udacityicon\endcsname {\simpleiconsmaponetwo\symbol{109}} + \expandafter\def\csname simpleicon@udemyicon\endcsname {\simpleiconsmaponetwo\symbol{110}} + \expandafter\def\csname simpleicon@ufcicon\endcsname {\simpleiconsmaponetwo\symbol{111}} + \expandafter\def\csname simpleicon@uikiticon\endcsname {\simpleiconsmaponetwo\symbol{112}} + \expandafter\def\csname simpleicon@uipathicon\endcsname {\simpleiconsmaponetwo\symbol{113}} + \expandafter\def\csname simpleicon@ululeicon\endcsname {\simpleiconsmaponetwo\symbol{114}} + \expandafter\def\csname simpleicon@umamiicon\endcsname {\simpleiconsmaponetwo\symbol{115}} + \expandafter\def\csname simpleicon@umbracoicon\endcsname {\simpleiconsmaponetwo\symbol{116}} + \expandafter\def\csname simpleicon@umlicon\endcsname {\simpleiconsmaponetwo\symbol{117}} + \expandafter\def\csname simpleicon@unacademyicon\endcsname {\simpleiconsmaponetwo\symbol{118}} + \expandafter\def\csname simpleicon@underarmouricon\endcsname {\simpleiconsmaponetwo\symbol{119}} + \expandafter\def\csname simpleicon@underscoredotjsicon\endcsname {\simpleiconsmaponetwo\symbol{120}} + \expandafter\def\csname simpleicon@undertaleicon\endcsname {\simpleiconsmaponetwo\symbol{121}} + \expandafter\def\csname simpleicon@unicodeicon\endcsname {\simpleiconsmaponetwo\symbol{122}} + \expandafter\def\csname simpleicon@unilevericon\endcsname {\simpleiconsmaponetwo\symbol{123}} + \expandafter\def\csname simpleicon@uniqloicon\endcsname {\simpleiconsmaponetwo\symbol{124}} + \expandafter\def\csname simpleicon@uniqlojaicon\endcsname {\simpleiconsmaponetwo\symbol{125}} + \expandafter\def\csname simpleicon@unitedairlinesicon\endcsname {\simpleiconsmaponetwo\symbol{126}} + \expandafter\def\csname simpleicon@unitednationsicon\endcsname {\simpleiconsmaponetwo\symbol{127}} + \expandafter\def\csname simpleicon@unityicon\endcsname {\simpleiconsmaponetwo\symbol{128}} + \expandafter\def\csname simpleicon@unjsicon\endcsname {\simpleiconsmaponetwo\symbol{129}} + \expandafter\def\csname simpleicon@unlicenseicon\endcsname {\simpleiconsmaponetwo\symbol{130}} + \expandafter\def\csname simpleicon@unocssicon\endcsname {\simpleiconsmaponetwo\symbol{131}} + \expandafter\def\csname simpleicon@unpkgicon\endcsname {\simpleiconsmaponetwo\symbol{132}} + \expandafter\def\csname simpleicon@unraidicon\endcsname {\simpleiconsmaponetwo\symbol{133}} + \expandafter\def\csname simpleicon@unrealengineicon\endcsname {\simpleiconsmaponetwo\symbol{134}} + \expandafter\def\csname simpleicon@unsplashicon\endcsname {\simpleiconsmaponetwo\symbol{135}} + \expandafter\def\csname simpleicon@untappdicon\endcsname {\simpleiconsmaponetwo\symbol{136}} + \expandafter\def\csname simpleicon@upcloudicon\endcsname {\simpleiconsmaponetwo\symbol{137}} + \expandafter\def\csname simpleicon@upholdicon\endcsname {\simpleiconsmaponetwo\symbol{138}} + \expandafter\def\csname simpleicon@uplabsicon\endcsname {\simpleiconsmaponetwo\symbol{139}} + \expandafter\def\csname simpleicon@upptimeicon\endcsname {\simpleiconsmaponetwo\symbol{140}} + \expandafter\def\csname simpleicon@upsicon\endcsname {\simpleiconsmaponetwo\symbol{141}} + \expandafter\def\csname simpleicon@upstashicon\endcsname {\simpleiconsmaponetwo\symbol{142}} + \expandafter\def\csname simpleicon@uptimekumaicon\endcsname {\simpleiconsmaponetwo\symbol{143}} + \expandafter\def\csname simpleicon@uptoboxicon\endcsname {\simpleiconsmaponetwo\symbol{144}} + \expandafter\def\csname simpleicon@upworkicon\endcsname {\simpleiconsmaponetwo\symbol{145}} + \expandafter\def\csname simpleicon@uspsicon\endcsname {\simpleiconsmaponetwo\symbol{146}} + \expandafter\def\csname simpleicon@utorrenticon\endcsname {\simpleiconsmaponetwo\symbol{147}} + \expandafter\def\csname simpleicon@vicon\endcsname {\simpleiconsmaponetwo\symbol{148}} + \expandafter\def\csname simpleicon@v2exicon\endcsname {\simpleiconsmaponetwo\symbol{149}} + \expandafter\def\csname simpleicon@v8icon\endcsname {\simpleiconsmaponetwo\symbol{150}} + \expandafter\def\csname simpleicon@vaadinicon\endcsname {\simpleiconsmaponetwo\symbol{151}} + \expandafter\def\csname simpleicon@vagranticon\endcsname {\simpleiconsmaponetwo\symbol{152}} + \expandafter\def\csname simpleicon@valaicon\endcsname {\simpleiconsmaponetwo\symbol{153}} + \expandafter\def\csname simpleicon@valoranticon\endcsname {\simpleiconsmaponetwo\symbol{154}} + \expandafter\def\csname simpleicon@valveicon\endcsname {\simpleiconsmaponetwo\symbol{155}} + \expandafter\def\csname simpleicon@vaporicon\endcsname {\simpleiconsmaponetwo\symbol{156}} + \expandafter\def\csname simpleicon@vaulticon\endcsname {\simpleiconsmaponetwo\symbol{157}} + \expandafter\def\csname simpleicon@vaultwardenicon\endcsname {\simpleiconsmaponetwo\symbol{158}} + \expandafter\def\csname simpleicon@vauxhallicon\endcsname {\simpleiconsmaponetwo\symbol{159}} + \expandafter\def\csname simpleicon@vbulletinicon\endcsname {\simpleiconsmaponetwo\symbol{160}} + \expandafter\def\csname simpleicon@vectaryicon\endcsname {\simpleiconsmaponetwo\symbol{161}} + \expandafter\def\csname simpleicon@vectorlogozoneicon\endcsname {\simpleiconsmaponetwo\symbol{162}} + \expandafter\def\csname simpleicon@vectorworksicon\endcsname {\simpleiconsmaponetwo\symbol{163}} + \expandafter\def\csname simpleicon@veeamicon\endcsname {\simpleiconsmaponetwo\symbol{164}} + \expandafter\def\csname simpleicon@veedicon\endcsname {\simpleiconsmaponetwo\symbol{165}} + \expandafter\def\csname simpleicon@veepeeicon\endcsname {\simpleiconsmaponetwo\symbol{166}} + \expandafter\def\csname simpleicon@vegaicon\endcsname {\simpleiconsmaponetwo\symbol{167}} + \expandafter\def\csname simpleicon@vegasicon\endcsname {\simpleiconsmaponetwo\symbol{168}} + \expandafter\def\csname simpleicon@velogicon\endcsname {\simpleiconsmaponetwo\symbol{169}} + \expandafter\def\csname simpleicon@venmoicon\endcsname {\simpleiconsmaponetwo\symbol{170}} + \expandafter\def\csname simpleicon@vercelicon\endcsname {\simpleiconsmaponetwo\symbol{171}} + \expandafter\def\csname simpleicon@verdaccioicon\endcsname {\simpleiconsmaponetwo\symbol{172}} + \expandafter\def\csname simpleicon@veritasicon\endcsname {\simpleiconsmaponetwo\symbol{173}} + \expandafter\def\csname simpleicon@verizonicon\endcsname {\simpleiconsmaponetwo\symbol{174}} + \expandafter\def\csname simpleicon@vespaicon\endcsname {\simpleiconsmaponetwo\symbol{175}} + \expandafter\def\csname simpleicon@vestelicon\endcsname {\simpleiconsmaponetwo\symbol{176}} + \expandafter\def\csname simpleicon@vexxhosticon\endcsname {\simpleiconsmaponetwo\symbol{177}} + \expandafter\def\csname simpleicon@vfairsicon\endcsname {\simpleiconsmaponetwo\symbol{178}} + \expandafter\def\csname simpleicon@viadeoicon\endcsname {\simpleiconsmaponetwo\symbol{179}} + \expandafter\def\csname simpleicon@viaplayicon\endcsname {\simpleiconsmaponetwo\symbol{180}} + \expandafter\def\csname simpleicon@vibericon\endcsname {\simpleiconsmaponetwo\symbol{181}} + \expandafter\def\csname simpleicon@vibloicon\endcsname {\simpleiconsmaponetwo\symbol{182}} + \expandafter\def\csname simpleicon@victoriametricsicon\endcsname {\simpleiconsmaponetwo\symbol{183}} + \expandafter\def\csname simpleicon@victronenergyicon\endcsname {\simpleiconsmaponetwo\symbol{184}} + \expandafter\def\csname simpleicon@vimicon\endcsname {\simpleiconsmaponetwo\symbol{185}} + \expandafter\def\csname simpleicon@vimeoicon\endcsname {\simpleiconsmaponetwo\symbol{186}} + \expandafter\def\csname simpleicon@vimeolivestreamicon\endcsname {\simpleiconsmaponetwo\symbol{187}} + \expandafter\def\csname simpleicon@virginicon\endcsname {\simpleiconsmaponetwo\symbol{188}} + \expandafter\def\csname simpleicon@virginatlanticicon\endcsname {\simpleiconsmaponetwo\symbol{189}} + \expandafter\def\csname simpleicon@virginmediaicon\endcsname {\simpleiconsmaponetwo\symbol{190}} + \expandafter\def\csname simpleicon@virtualboxicon\endcsname {\simpleiconsmaponetwo\symbol{191}} + \expandafter\def\csname simpleicon@virustotalicon\endcsname {\simpleiconsmaponetwo\symbol{192}} + \expandafter\def\csname simpleicon@visaicon\endcsname {\simpleiconsmaponetwo\symbol{193}} + \expandafter\def\csname simpleicon@visxicon\endcsname {\simpleiconsmaponetwo\symbol{194}} + \expandafter\def\csname simpleicon@viteicon\endcsname {\simpleiconsmaponetwo\symbol{195}} + \expandafter\def\csname simpleicon@vitepressicon\endcsname {\simpleiconsmaponetwo\symbol{196}} + \expandafter\def\csname simpleicon@vitessicon\endcsname {\simpleiconsmaponetwo\symbol{197}} + \expandafter\def\csname simpleicon@vitesticon\endcsname {\simpleiconsmaponetwo\symbol{198}} + \expandafter\def\csname simpleicon@vivaldiicon\endcsname {\simpleiconsmaponetwo\symbol{199}} + \expandafter\def\csname simpleicon@vivawalleticon\endcsname {\simpleiconsmaponetwo\symbol{200}} + \expandafter\def\csname simpleicon@vivinoicon\endcsname {\simpleiconsmaponetwo\symbol{201}} + \expandafter\def\csname simpleicon@vivinticon\endcsname {\simpleiconsmaponetwo\symbol{202}} + \expandafter\def\csname simpleicon@vivoicon\endcsname {\simpleiconsmaponetwo\symbol{203}} + \expandafter\def\csname simpleicon@vkicon\endcsname {\simpleiconsmaponetwo\symbol{204}} + \expandafter\def\csname simpleicon@vlcmediaplayericon\endcsname {\simpleiconsmaponetwo\symbol{205}} + \expandafter\def\csname simpleicon@vmwareicon\endcsname {\simpleiconsmaponetwo\symbol{206}} + \expandafter\def\csname simpleicon@vodafoneicon\endcsname {\simpleiconsmaponetwo\symbol{207}} + \expandafter\def\csname simpleicon@voidlinuxicon\endcsname {\simpleiconsmaponetwo\symbol{208}} + \expandafter\def\csname simpleicon@voipdotmsicon\endcsname {\simpleiconsmaponetwo\symbol{209}} + \expandafter\def\csname simpleicon@volkswagenicon\endcsname {\simpleiconsmaponetwo\symbol{210}} + \expandafter\def\csname simpleicon@volvoicon\endcsname {\simpleiconsmaponetwo\symbol{211}} + \expandafter\def\csname simpleicon@vonageicon\endcsname {\simpleiconsmaponetwo\symbol{212}} + \expandafter\def\csname simpleicon@vorondesignicon\endcsname {\simpleiconsmaponetwo\symbol{213}} + \expandafter\def\csname simpleicon@vowpalwabbiticon\endcsname {\simpleiconsmaponetwo\symbol{214}} + \expandafter\def\csname simpleicon@voxicon\endcsname {\simpleiconsmaponetwo\symbol{215}} + \expandafter\def\csname simpleicon@vrchaticon\endcsname {\simpleiconsmaponetwo\symbol{216}} + \expandafter\def\csname simpleicon@vscoicon\endcsname {\simpleiconsmaponetwo\symbol{217}} + \expandafter\def\csname simpleicon@vscodiumicon\endcsname {\simpleiconsmaponetwo\symbol{218}} + \expandafter\def\csname simpleicon@vtexicon\endcsname {\simpleiconsmaponetwo\symbol{219}} + \expandafter\def\csname simpleicon@vuedotjsicon\endcsname {\simpleiconsmaponetwo\symbol{220}} + \expandafter\def\csname simpleicon@vuetifyicon\endcsname {\simpleiconsmaponetwo\symbol{221}} + \expandafter\def\csname simpleicon@vulkanicon\endcsname {\simpleiconsmaponetwo\symbol{222}} + \expandafter\def\csname simpleicon@vultricon\endcsname {\simpleiconsmaponetwo\symbol{223}} + \expandafter\def\csname simpleicon@vyondicon\endcsname {\simpleiconsmaponetwo\symbol{224}} + \expandafter\def\csname simpleicon@w3schoolsicon\endcsname {\simpleiconsmaponetwo\symbol{225}} + \expandafter\def\csname simpleicon@wacomicon\endcsname {\simpleiconsmaponetwo\symbol{226}} + \expandafter\def\csname simpleicon@wagmiicon\endcsname {\simpleiconsmaponetwo\symbol{227}} + \expandafter\def\csname simpleicon@wagtailicon\endcsname {\simpleiconsmaponetwo\symbol{228}} + \expandafter\def\csname simpleicon@wailsicon\endcsname {\simpleiconsmaponetwo\symbol{229}} + \expandafter\def\csname simpleicon@wakatimeicon\endcsname {\simpleiconsmaponetwo\symbol{230}} + \expandafter\def\csname simpleicon@walkmanicon\endcsname {\simpleiconsmaponetwo\symbol{231}} + \expandafter\def\csname simpleicon@wallabagicon\endcsname {\simpleiconsmaponetwo\symbol{232}} + \expandafter\def\csname simpleicon@walletconnecticon\endcsname {\simpleiconsmaponetwo\symbol{233}} + \expandafter\def\csname simpleicon@walmarticon\endcsname {\simpleiconsmaponetwo\symbol{234}} + \expandafter\def\csname simpleicon@wantedlyicon\endcsname {\simpleiconsmaponetwo\symbol{235}} + \expandafter\def\csname simpleicon@wappalyzericon\endcsname {\simpleiconsmaponetwo\symbol{236}} + \expandafter\def\csname simpleicon@warnerbrosicon\endcsname {\simpleiconsmaponetwo\symbol{237}} + \expandafter\def\csname simpleicon@warpicon\endcsname {\simpleiconsmaponetwo\symbol{238}} + \expandafter\def\csname simpleicon@wasabiicon\endcsname {\simpleiconsmaponetwo\symbol{239}} + \expandafter\def\csname simpleicon@wasmcloudicon\endcsname {\simpleiconsmaponetwo\symbol{240}} + \expandafter\def\csname simpleicon@wasmericon\endcsname {\simpleiconsmaponetwo\symbol{241}} + \expandafter\def\csname simpleicon@watchtowericon\endcsname {\simpleiconsmaponetwo\symbol{242}} + \expandafter\def\csname simpleicon@wattpadicon\endcsname {\simpleiconsmaponetwo\symbol{243}} + \expandafter\def\csname simpleicon@waylandicon\endcsname {\simpleiconsmaponetwo\symbol{244}} + \expandafter\def\csname simpleicon@wazeicon\endcsname {\simpleiconsmaponetwo\symbol{245}} + \expandafter\def\csname simpleicon@wazirxicon\endcsname {\simpleiconsmaponetwo\symbol{246}} + \expandafter\def\csname simpleicon@wearosicon\endcsname {\simpleiconsmaponetwo\symbol{247}} + \expandafter\def\csname simpleicon@weasylicon\endcsname {\simpleiconsmaponetwo\symbol{248}} + \expandafter\def\csname simpleicon@web3dotjsicon\endcsname {\simpleiconsmaponetwo\symbol{249}} + \expandafter\def\csname simpleicon@webassemblyicon\endcsname {\simpleiconsmaponetwo\symbol{250}} + \expandafter\def\csname simpleicon@webauthnicon\endcsname {\simpleiconsmaponetwo\symbol{251}} + \expandafter\def\csname simpleicon@webcomponentsdotorgicon\endcsname {\simpleiconsmaponetwo\symbol{252}} + \expandafter\def\csname simpleicon@webdriverioicon\endcsname {\simpleiconsmaponetwo\symbol{253}} + \expandafter\def\csname simpleicon@webexicon\endcsname {\simpleiconsmaponetwo\symbol{254}} + \expandafter\def\csname simpleicon@webflowicon\endcsname {\simpleiconsmaponetwo\symbol{255}} + \expandafter\def\csname simpleicon@webglicon\endcsname {\simpleiconsmaponethree\symbol{0}} + \expandafter\def\csname simpleicon@webgpuicon\endcsname {\simpleiconsmaponethree\symbol{1}} + \expandafter\def\csname simpleicon@weblateicon\endcsname {\simpleiconsmaponethree\symbol{2}} + \expandafter\def\csname simpleicon@webminicon\endcsname {\simpleiconsmaponethree\symbol{3}} + \expandafter\def\csname simpleicon@webmoneyicon\endcsname {\simpleiconsmaponethree\symbol{4}} + \expandafter\def\csname simpleicon@webpackicon\endcsname {\simpleiconsmaponethree\symbol{5}} + \expandafter\def\csname simpleicon@webrtcicon\endcsname {\simpleiconsmaponethree\symbol{6}} + \expandafter\def\csname simpleicon@webstormicon\endcsname {\simpleiconsmaponethree\symbol{7}} + \expandafter\def\csname simpleicon@webtoonicon\endcsname {\simpleiconsmaponethree\symbol{8}} + \expandafter\def\csname simpleicon@webtreesicon\endcsname {\simpleiconsmaponethree\symbol{9}} + \expandafter\def\csname simpleicon@wechaticon\endcsname {\simpleiconsmaponethree\symbol{10}} + \expandafter\def\csname simpleicon@wegameicon\endcsname {\simpleiconsmaponethree\symbol{11}} + \expandafter\def\csname simpleicon@weightsandbiasesicon\endcsname {\simpleiconsmaponethree\symbol{12}} + \expandafter\def\csname simpleicon@welcometothejungleicon\endcsname {\simpleiconsmaponethree\symbol{13}} + \expandafter\def\csname simpleicon@wellfoundicon\endcsname {\simpleiconsmaponethree\symbol{14}} + \expandafter\def\csname simpleicon@wellsfargoicon\endcsname {\simpleiconsmaponethree\symbol{15}} + \expandafter\def\csname simpleicon@wemoicon\endcsname {\simpleiconsmaponethree\symbol{16}} + \expandafter\def\csname simpleicon@westerndigitalicon\endcsname {\simpleiconsmaponethree\symbol{17}} + \expandafter\def\csname simpleicon@westernunionicon\endcsname {\simpleiconsmaponethree\symbol{18}} + \expandafter\def\csname simpleicon@wetransfericon\endcsname {\simpleiconsmaponethree\symbol{19}} + \expandafter\def\csname simpleicon@weztermicon\endcsname {\simpleiconsmaponethree\symbol{20}} + \expandafter\def\csname simpleicon@wgpuicon\endcsname {\simpleiconsmaponethree\symbol{21}} + \expandafter\def\csname simpleicon@whatsappicon\endcsname {\simpleiconsmaponethree\symbol{22}} + \expandafter\def\csname simpleicon@wheniworkicon\endcsname {\simpleiconsmaponethree\symbol{23}} + \expandafter\def\csname simpleicon@wiiicon\endcsname {\simpleiconsmaponethree\symbol{24}} + \expandafter\def\csname simpleicon@wiiuicon\endcsname {\simpleiconsmaponethree\symbol{25}} + \expandafter\def\csname simpleicon@wikidataicon\endcsname {\simpleiconsmaponethree\symbol{26}} + \expandafter\def\csname simpleicon@wikidotggicon\endcsname {\simpleiconsmaponethree\symbol{27}} + \expandafter\def\csname simpleicon@wikidotjsicon\endcsname {\simpleiconsmaponethree\symbol{28}} + \expandafter\def\csname simpleicon@wikimediacommonsicon\endcsname {\simpleiconsmaponethree\symbol{29}} + \expandafter\def\csname simpleicon@wikimediafoundationicon\endcsname {\simpleiconsmaponethree\symbol{30}} + \expandafter\def\csname simpleicon@wikipediaicon\endcsname {\simpleiconsmaponethree\symbol{31}} + \expandafter\def\csname simpleicon@wikiquoteicon\endcsname {\simpleiconsmaponethree\symbol{32}} + \expandafter\def\csname simpleicon@wikivoyageicon\endcsname {\simpleiconsmaponethree\symbol{33}} + \expandafter\def\csname simpleicon@winampicon\endcsname {\simpleiconsmaponethree\symbol{34}} + \expandafter\def\csname simpleicon@wiproicon\endcsname {\simpleiconsmaponethree\symbol{35}} + \expandafter\def\csname simpleicon@wireicon\endcsname {\simpleiconsmaponethree\symbol{36}} + \expandafter\def\csname simpleicon@wireguardicon\endcsname {\simpleiconsmaponethree\symbol{37}} + \expandafter\def\csname simpleicon@wiresharkicon\endcsname {\simpleiconsmaponethree\symbol{38}} + \expandafter\def\csname simpleicon@wiseicon\endcsname {\simpleiconsmaponethree\symbol{39}} + \expandafter\def\csname simpleicon@wishicon\endcsname {\simpleiconsmaponethree\symbol{40}} + \expandafter\def\csname simpleicon@wistiaicon\endcsname {\simpleiconsmaponethree\symbol{41}} + \expandafter\def\csname simpleicon@wixicon\endcsname {\simpleiconsmaponethree\symbol{42}} + \expandafter\def\csname simpleicon@wizzairicon\endcsname {\simpleiconsmaponethree\symbol{43}} + \expandafter\def\csname simpleicon@wolframicon\endcsname {\simpleiconsmaponethree\symbol{44}} + \expandafter\def\csname simpleicon@wolframlanguageicon\endcsname {\simpleiconsmaponethree\symbol{45}} + \expandafter\def\csname simpleicon@wolframmathematicaicon\endcsname {\simpleiconsmaponethree\symbol{46}} + \expandafter\def\csname simpleicon@wondershareicon\endcsname {\simpleiconsmaponethree\symbol{47}} + \expandafter\def\csname simpleicon@wondersharefilmoraicon\endcsname {\simpleiconsmaponethree\symbol{48}} + \expandafter\def\csname simpleicon@wooicon\endcsname {\simpleiconsmaponethree\symbol{49}} + \expandafter\def\csname simpleicon@woocommerceicon\endcsname {\simpleiconsmaponethree\symbol{50}} + \expandafter\def\csname simpleicon@wordpressicon\endcsname {\simpleiconsmaponethree\symbol{51}} + \expandafter\def\csname simpleicon@workplaceicon\endcsname {\simpleiconsmaponethree\symbol{52}} + \expandafter\def\csname simpleicon@worldhealthorganizationicon\endcsname {\simpleiconsmaponethree\symbol{53}} + \expandafter\def\csname simpleicon@wpengineicon\endcsname {\simpleiconsmaponethree\symbol{54}} + \expandafter\def\csname simpleicon@wpexplorericon\endcsname {\simpleiconsmaponethree\symbol{55}} + \expandafter\def\csname simpleicon@wprocketicon\endcsname {\simpleiconsmaponethree\symbol{56}} + \expandafter\def\csname simpleicon@writedotasicon\endcsname {\simpleiconsmaponethree\symbol{57}} + \expandafter\def\csname simpleicon@wweicon\endcsname {\simpleiconsmaponethree\symbol{58}} + \expandafter\def\csname simpleicon@wwiseicon\endcsname {\simpleiconsmaponethree\symbol{59}} + \expandafter\def\csname simpleicon@wykopicon\endcsname {\simpleiconsmaponethree\symbol{60}} + \expandafter\def\csname simpleicon@wyzeicon\endcsname {\simpleiconsmaponethree\symbol{61}} + \expandafter\def\csname simpleicon@xicon\endcsname {\simpleiconsmaponethree\symbol{62}} + \expandafter\def\csname simpleicon@xamppicon\endcsname {\simpleiconsmaponethree\symbol{63}} + \expandafter\def\csname simpleicon@xcodeicon\endcsname {\simpleiconsmaponethree\symbol{64}} + \expandafter\def\csname simpleicon@xdadevelopersicon\endcsname {\simpleiconsmaponethree\symbol{65}} + \expandafter\def\csname simpleicon@xdotorgicon\endcsname {\simpleiconsmaponethree\symbol{66}} + \expandafter\def\csname simpleicon@xenditicon\endcsname {\simpleiconsmaponethree\symbol{67}} + \expandafter\def\csname simpleicon@xeroicon\endcsname {\simpleiconsmaponethree\symbol{68}} + \expandafter\def\csname simpleicon@xfceicon\endcsname {\simpleiconsmaponethree\symbol{69}} + \expandafter\def\csname simpleicon@xiaohongshuicon\endcsname {\simpleiconsmaponethree\symbol{70}} + \expandafter\def\csname simpleicon@xiaomiicon\endcsname {\simpleiconsmaponethree\symbol{71}} + \expandafter\def\csname simpleicon@xingicon\endcsname {\simpleiconsmaponethree\symbol{72}} + \expandafter\def\csname simpleicon@xmlicon\endcsname {\simpleiconsmaponethree\symbol{73}} + \expandafter\def\csname simpleicon@xmppicon\endcsname {\simpleiconsmaponethree\symbol{74}} + \expandafter\def\csname simpleicon@xoicon\endcsname {\simpleiconsmaponethree\symbol{75}} + \expandafter\def\csname simpleicon@xrpicon\endcsname {\simpleiconsmaponethree\symbol{76}} + \expandafter\def\csname simpleicon@xspliticon\endcsname {\simpleiconsmaponethree\symbol{77}} + \expandafter\def\csname simpleicon@xstateicon\endcsname {\simpleiconsmaponethree\symbol{78}} + \expandafter\def\csname simpleicon@xubuntuicon\endcsname {\simpleiconsmaponethree\symbol{79}} + \expandafter\def\csname simpleicon@yabaiicon\endcsname {\simpleiconsmaponethree\symbol{80}} + \expandafter\def\csname simpleicon@yaleicon\endcsname {\simpleiconsmaponethree\symbol{81}} + \expandafter\def\csname simpleicon@yamahacorporationicon\endcsname {\simpleiconsmaponethree\symbol{82}} + \expandafter\def\csname simpleicon@yamahamotorcorporationicon\endcsname {\simpleiconsmaponethree\symbol{83}} + \expandafter\def\csname simpleicon@yamlicon\endcsname {\simpleiconsmaponethree\symbol{84}} + \expandafter\def\csname simpleicon@yandexcloudicon\endcsname {\simpleiconsmaponethree\symbol{85}} + \expandafter\def\csname simpleicon@yarnicon\endcsname {\simpleiconsmaponethree\symbol{86}} + \expandafter\def\csname simpleicon@ycombinatoricon\endcsname {\simpleiconsmaponethree\symbol{87}} + \expandafter\def\csname simpleicon@yelpicon\endcsname {\simpleiconsmaponethree\symbol{88}} + \expandafter\def\csname simpleicon@yetiicon\endcsname {\simpleiconsmaponethree\symbol{89}} + \expandafter\def\csname simpleicon@yiiicon\endcsname {\simpleiconsmaponethree\symbol{90}} + \expandafter\def\csname simpleicon@yoasticon\endcsname {\simpleiconsmaponethree\symbol{91}} + \expandafter\def\csname simpleicon@youtubeicon\endcsname {\simpleiconsmaponethree\symbol{92}} + \expandafter\def\csname simpleicon@youtubegamingicon\endcsname {\simpleiconsmaponethree\symbol{93}} + \expandafter\def\csname simpleicon@youtubekidsicon\endcsname {\simpleiconsmaponethree\symbol{94}} + \expandafter\def\csname simpleicon@youtubemusicicon\endcsname {\simpleiconsmaponethree\symbol{95}} + \expandafter\def\csname simpleicon@youtubeshortsicon\endcsname {\simpleiconsmaponethree\symbol{96}} + \expandafter\def\csname simpleicon@youtubestudioicon\endcsname {\simpleiconsmaponethree\symbol{97}} + \expandafter\def\csname simpleicon@youtubetvicon\endcsname {\simpleiconsmaponethree\symbol{98}} + \expandafter\def\csname simpleicon@yricon\endcsname {\simpleiconsmaponethree\symbol{99}} + \expandafter\def\csname simpleicon@yubicoicon\endcsname {\simpleiconsmaponethree\symbol{100}} + \expandafter\def\csname simpleicon@yunohosticon\endcsname {\simpleiconsmaponethree\symbol{101}} + \expandafter\def\csname simpleicon@zabkaicon\endcsname {\simpleiconsmaponethree\symbol{102}} + \expandafter\def\csname simpleicon@zaimicon\endcsname {\simpleiconsmaponethree\symbol{103}} + \expandafter\def\csname simpleicon@zalandoicon\endcsname {\simpleiconsmaponethree\symbol{104}} + \expandafter\def\csname simpleicon@zaloicon\endcsname {\simpleiconsmaponethree\symbol{105}} + \expandafter\def\csname simpleicon@zapicon\endcsname {\simpleiconsmaponethree\symbol{106}} + \expandafter\def\csname simpleicon@zapiericon\endcsname {\simpleiconsmaponethree\symbol{107}} + \expandafter\def\csname simpleicon@zaraicon\endcsname {\simpleiconsmaponethree\symbol{108}} + \expandafter\def\csname simpleicon@zazzleicon\endcsname {\simpleiconsmaponethree\symbol{109}} + \expandafter\def\csname simpleicon@zcashicon\endcsname {\simpleiconsmaponethree\symbol{110}} + \expandafter\def\csname simpleicon@zcoolicon\endcsname {\simpleiconsmaponethree\symbol{111}} + \expandafter\def\csname simpleicon@zdficon\endcsname {\simpleiconsmaponethree\symbol{112}} + \expandafter\def\csname simpleicon@zebpayicon\endcsname {\simpleiconsmaponethree\symbol{113}} + \expandafter\def\csname simpleicon@zebratechnologiesicon\endcsname {\simpleiconsmaponethree\symbol{114}} + \expandafter\def\csname simpleicon@zedindustriesicon\endcsname {\simpleiconsmaponethree\symbol{115}} + \expandafter\def\csname simpleicon@zelleicon\endcsname {\simpleiconsmaponethree\symbol{116}} + \expandafter\def\csname simpleicon@zendicon\endcsname {\simpleiconsmaponethree\symbol{117}} + \expandafter\def\csname simpleicon@zendeskicon\endcsname {\simpleiconsmaponethree\symbol{118}} + \expandafter\def\csname simpleicon@zennicon\endcsname {\simpleiconsmaponethree\symbol{119}} + \expandafter\def\csname simpleicon@zenodoicon\endcsname {\simpleiconsmaponethree\symbol{120}} + \expandafter\def\csname simpleicon@zensaricon\endcsname {\simpleiconsmaponethree\symbol{121}} + \expandafter\def\csname simpleicon@zerodhaicon\endcsname {\simpleiconsmaponethree\symbol{122}} + \expandafter\def\csname simpleicon@zerotiericon\endcsname {\simpleiconsmaponethree\symbol{123}} + \expandafter\def\csname simpleicon@zerplyicon\endcsname {\simpleiconsmaponethree\symbol{124}} + \expandafter\def\csname simpleicon@zettlricon\endcsname {\simpleiconsmaponethree\symbol{125}} + \expandafter\def\csname simpleicon@zhihuicon\endcsname {\simpleiconsmaponethree\symbol{126}} + \expandafter\def\csname simpleicon@zigicon\endcsname {\simpleiconsmaponethree\symbol{127}} + \expandafter\def\csname simpleicon@zigbeeicon\endcsname {\simpleiconsmaponethree\symbol{128}} + \expandafter\def\csname simpleicon@zigbee2mqtticon\endcsname {\simpleiconsmaponethree\symbol{129}} + \expandafter\def\csname simpleicon@ziggoicon\endcsname {\simpleiconsmaponethree\symbol{130}} + \expandafter\def\csname simpleicon@zilchicon\endcsname {\simpleiconsmaponethree\symbol{131}} + \expandafter\def\csname simpleicon@zillowicon\endcsname {\simpleiconsmaponethree\symbol{132}} + \expandafter\def\csname simpleicon@zincsearchicon\endcsname {\simpleiconsmaponethree\symbol{133}} + \expandafter\def\csname simpleicon@zingaticon\endcsname {\simpleiconsmaponethree\symbol{134}} + \expandafter\def\csname simpleicon@zodicon\endcsname {\simpleiconsmaponethree\symbol{135}} + \expandafter\def\csname simpleicon@zohoicon\endcsname {\simpleiconsmaponethree\symbol{136}} + \expandafter\def\csname simpleicon@zoipericon\endcsname {\simpleiconsmaponethree\symbol{137}} + \expandafter\def\csname simpleicon@zomatoicon\endcsname {\simpleiconsmaponethree\symbol{138}} + \expandafter\def\csname simpleicon@zoomicon\endcsname {\simpleiconsmaponethree\symbol{139}} + \expandafter\def\csname simpleicon@zorinicon\endcsname {\simpleiconsmaponethree\symbol{140}} + \expandafter\def\csname simpleicon@zoteroicon\endcsname {\simpleiconsmaponethree\symbol{141}} + \expandafter\def\csname simpleicon@zshicon\endcsname {\simpleiconsmaponethree\symbol{142}} + \expandafter\def\csname simpleicon@zulipicon\endcsname {\simpleiconsmaponethree\symbol{143}} + \expandafter\def\csname simpleicon@zyteicon\endcsname {\simpleiconsmaponethree\symbol{144}}
\ No newline at end of file diff --git a/fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex b/fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex index 5c63f5ff35..8bea3eec85 100644 --- a/fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex +++ b/fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex @@ -2700,518 +2700,519 @@ \expandafter\def\csname simpleicon@subtitleediticon\endcsname {\simpleiconsmap\symbol{"F48B}} \expandafter\def\csname simpleicon@subversionicon\endcsname {\simpleiconsmap\symbol{"F48C}} \expandafter\def\csname simpleicon@sucklessicon\endcsname {\simpleiconsmap\symbol{"F48D}} - \expandafter\def\csname simpleicon@sumologicicon\endcsname {\simpleiconsmap\symbol{"F48E}} - \expandafter\def\csname simpleicon@sunoicon\endcsname {\simpleiconsmap\symbol{"F48F}} - \expandafter\def\csname simpleicon@sunriseicon\endcsname {\simpleiconsmap\symbol{"F490}} - \expandafter\def\csname simpleicon@supabaseicon\endcsname {\simpleiconsmap\symbol{"F491}} - \expandafter\def\csname simpleicon@supercreaseicon\endcsname {\simpleiconsmap\symbol{"F492}} - \expandafter\def\csname simpleicon@supermicroicon\endcsname {\simpleiconsmap\symbol{"F493}} - \expandafter\def\csname simpleicon@superusericon\endcsname {\simpleiconsmap\symbol{"F494}} - \expandafter\def\csname simpleicon@surrealdbicon\endcsname {\simpleiconsmap\symbol{"F495}} - \expandafter\def\csname simpleicon@surveymonkeyicon\endcsname {\simpleiconsmap\symbol{"F496}} - \expandafter\def\csname simpleicon@suseicon\endcsname {\simpleiconsmap\symbol{"F497}} - \expandafter\def\csname simpleicon@suzukiicon\endcsname {\simpleiconsmap\symbol{"F498}} - \expandafter\def\csname simpleicon@svelteicon\endcsname {\simpleiconsmap\symbol{"F499}} - \expandafter\def\csname simpleicon@svgicon\endcsname {\simpleiconsmap\symbol{"F49A}} - \expandafter\def\csname simpleicon@svgdotjsicon\endcsname {\simpleiconsmap\symbol{"F49B}} - \expandafter\def\csname simpleicon@svgoicon\endcsname {\simpleiconsmap\symbol{"F49C}} - \expandafter\def\csname simpleicon@svgtraceicon\endcsname {\simpleiconsmap\symbol{"F49D}} - \expandafter\def\csname simpleicon@swaggericon\endcsname {\simpleiconsmap\symbol{"F49E}} - \expandafter\def\csname simpleicon@swarmicon\endcsname {\simpleiconsmap\symbol{"F49F}} - \expandafter\def\csname simpleicon@swayicon\endcsname {\simpleiconsmap\symbol{"F4A0}} - \expandafter\def\csname simpleicon@swcicon\endcsname {\simpleiconsmap\symbol{"F4A1}} - \expandafter\def\csname simpleicon@swifticon\endcsname {\simpleiconsmap\symbol{"F4A2}} - \expandafter\def\csname simpleicon@swiggyicon\endcsname {\simpleiconsmap\symbol{"F4A3}} - \expandafter\def\csname simpleicon@swipericon\endcsname {\simpleiconsmap\symbol{"F4A4}} - \expandafter\def\csname simpleicon@swricon\endcsname {\simpleiconsmap\symbol{"F4A5}} - \expandafter\def\csname simpleicon@symantecicon\endcsname {\simpleiconsmap\symbol{"F4A6}} - \expandafter\def\csname simpleicon@symbolabicon\endcsname {\simpleiconsmap\symbol{"F4A7}} - \expandafter\def\csname simpleicon@symfonyicon\endcsname {\simpleiconsmap\symbol{"F4A8}} - \expandafter\def\csname simpleicon@symphonyicon\endcsname {\simpleiconsmap\symbol{"F4A9}} - \expandafter\def\csname simpleicon@sympyicon\endcsname {\simpleiconsmap\symbol{"F4AA}} - \expandafter\def\csname simpleicon@syncthingicon\endcsname {\simpleiconsmap\symbol{"F4AB}} - \expandafter\def\csname simpleicon@synologyicon\endcsname {\simpleiconsmap\symbol{"F4AC}} - \expandafter\def\csname simpleicon@system76icon\endcsname {\simpleiconsmap\symbol{"F4AD}} - \expandafter\def\csname simpleicon@tabelogicon\endcsname {\simpleiconsmap\symbol{"F4AE}} - \expandafter\def\csname simpleicon@tableauicon\endcsname {\simpleiconsmap\symbol{"F4AF}} - \expandafter\def\csname simpleicon@tablecheckicon\endcsname {\simpleiconsmap\symbol{"F4B0}} - \expandafter\def\csname simpleicon@tacobellicon\endcsname {\simpleiconsmap\symbol{"F4B1}} - \expandafter\def\csname simpleicon@tadoicon\endcsname {\simpleiconsmap\symbol{"F4B2}} - \expandafter\def\csname simpleicon@taichigraphicsicon\endcsname {\simpleiconsmap\symbol{"F4B3}} - \expandafter\def\csname simpleicon@taichilangicon\endcsname {\simpleiconsmap\symbol{"F4B4}} - \expandafter\def\csname simpleicon@tailsicon\endcsname {\simpleiconsmap\symbol{"F4B5}} - \expandafter\def\csname simpleicon@tailscaleicon\endcsname {\simpleiconsmap\symbol{"F4B6}} - \expandafter\def\csname simpleicon@tailwindcssicon\endcsname {\simpleiconsmap\symbol{"F4B7}} - \expandafter\def\csname simpleicon@taipyicon\endcsname {\simpleiconsmap\symbol{"F4B8}} - \expandafter\def\csname simpleicon@taketwointeractivesoftwareicon\endcsname {\simpleiconsmap\symbol{"F4B9}} - \expandafter\def\csname simpleicon@talendicon\endcsname {\simpleiconsmap\symbol{"F4BA}} - \expandafter\def\csname simpleicon@talenthouseicon\endcsname {\simpleiconsmap\symbol{"F4BB}} - \expandafter\def\csname simpleicon@talosicon\endcsname {\simpleiconsmap\symbol{"F4BC}} - \expandafter\def\csname simpleicon@tamiyaicon\endcsname {\simpleiconsmap\symbol{"F4BD}} - \expandafter\def\csname simpleicon@tampermonkeyicon\endcsname {\simpleiconsmap\symbol{"F4BE}} - \expandafter\def\csname simpleicon@taobaoicon\endcsname {\simpleiconsmap\symbol{"F4BF}} - \expandafter\def\csname simpleicon@tapasicon\endcsname {\simpleiconsmap\symbol{"F4C0}} - \expandafter\def\csname simpleicon@targeticon\endcsname {\simpleiconsmap\symbol{"F4C1}} - \expandafter\def\csname simpleicon@taromicon\endcsname {\simpleiconsmap\symbol{"F4C2}} - \expandafter\def\csname simpleicon@taskicon\endcsname {\simpleiconsmap\symbol{"F4C3}} - \expandafter\def\csname simpleicon@tasmotaicon\endcsname {\simpleiconsmap\symbol{"F4C4}} - \expandafter\def\csname simpleicon@tataicon\endcsname {\simpleiconsmap\symbol{"F4C5}} - \expandafter\def\csname simpleicon@tauriicon\endcsname {\simpleiconsmap\symbol{"F4C6}} - \expandafter\def\csname simpleicon@taxbuzzicon\endcsname {\simpleiconsmap\symbol{"F4C7}} - \expandafter\def\csname simpleicon@tcsicon\endcsname {\simpleiconsmap\symbol{"F4C8}} - \expandafter\def\csname simpleicon@tealicon\endcsname {\simpleiconsmap\symbol{"F4C9}} - \expandafter\def\csname simpleicon@teamcityicon\endcsname {\simpleiconsmap\symbol{"F4CA}} - \expandafter\def\csname simpleicon@teamspeakicon\endcsname {\simpleiconsmap\symbol{"F4CB}} - \expandafter\def\csname simpleicon@teamviewericon\endcsname {\simpleiconsmap\symbol{"F4CC}} - \expandafter\def\csname simpleicon@techcrunchicon\endcsname {\simpleiconsmap\symbol{"F4CD}} - \expandafter\def\csname simpleicon@tedicon\endcsname {\simpleiconsmap\symbol{"F4CE}} - \expandafter\def\csname simpleicon@teepublicicon\endcsname {\simpleiconsmap\symbol{"F4CF}} - \expandafter\def\csname simpleicon@teespringicon\endcsname {\simpleiconsmap\symbol{"F4D0}} - \expandafter\def\csname simpleicon@tektonicon\endcsname {\simpleiconsmap\symbol{"F4D1}} - \expandafter\def\csname simpleicon@tele5icon\endcsname {\simpleiconsmap\symbol{"F4D2}} - \expandafter\def\csname simpleicon@telegramicon\endcsname {\simpleiconsmap\symbol{"F4D3}} - \expandafter\def\csname simpleicon@telegraphicon\endcsname {\simpleiconsmap\symbol{"F4D4}} - \expandafter\def\csname simpleicon@telequebecicon\endcsname {\simpleiconsmap\symbol{"F4D5}} - \expandafter\def\csname simpleicon@temporalicon\endcsname {\simpleiconsmap\symbol{"F4D6}} - \expandafter\def\csname simpleicon@tencentqqicon\endcsname {\simpleiconsmap\symbol{"F4D7}} - \expandafter\def\csname simpleicon@tensorflowicon\endcsname {\simpleiconsmap\symbol{"F4D8}} - \expandafter\def\csname simpleicon@teradataicon\endcsname {\simpleiconsmap\symbol{"F4D9}} - \expandafter\def\csname simpleicon@teratailicon\endcsname {\simpleiconsmap\symbol{"F4DA}} - \expandafter\def\csname simpleicon@termiusicon\endcsname {\simpleiconsmap\symbol{"F4DB}} - \expandafter\def\csname simpleicon@terraformicon\endcsname {\simpleiconsmap\symbol{"F4DC}} - \expandafter\def\csname simpleicon@tescoicon\endcsname {\simpleiconsmap\symbol{"F4DD}} - \expandafter\def\csname simpleicon@teslaicon\endcsname {\simpleiconsmap\symbol{"F4DE}} - \expandafter\def\csname simpleicon@testcafeicon\endcsname {\simpleiconsmap\symbol{"F4DF}} - \expandafter\def\csname simpleicon@testinicon\endcsname {\simpleiconsmap\symbol{"F4E0}} - \expandafter\def\csname simpleicon@testinglibraryicon\endcsname {\simpleiconsmap\symbol{"F4E1}} - \expandafter\def\csname simpleicon@testrailicon\endcsname {\simpleiconsmap\symbol{"F4E2}} - \expandafter\def\csname simpleicon@tethericon\endcsname {\simpleiconsmap\symbol{"F4E3}} - \expandafter\def\csname simpleicon@textpatternicon\endcsname {\simpleiconsmap\symbol{"F4E4}} - \expandafter\def\csname simpleicon@tgaicon\endcsname {\simpleiconsmap\symbol{"F4E5}} - \expandafter\def\csname simpleicon@thangsicon\endcsname {\simpleiconsmap\symbol{"F4E6}} - \expandafter\def\csname simpleicon@thanosicon\endcsname {\simpleiconsmap\symbol{"F4E7}} - \expandafter\def\csname simpleicon@thealgorithmsicon\endcsname {\simpleiconsmap\symbol{"F4E8}} - \expandafter\def\csname simpleicon@theboringcompanyicon\endcsname {\simpleiconsmap\symbol{"F4E9}} - \expandafter\def\csname simpleicon@theconversationicon\endcsname {\simpleiconsmap\symbol{"F4EA}} - \expandafter\def\csname simpleicon@thefinalsicon\endcsname {\simpleiconsmap\symbol{"F4EB}} - \expandafter\def\csname simpleicon@theguardianicon\endcsname {\simpleiconsmap\symbol{"F4EC}} - \expandafter\def\csname simpleicon@theirishtimesicon\endcsname {\simpleiconsmap\symbol{"F4ED}} - \expandafter\def\csname simpleicon@themightyicon\endcsname {\simpleiconsmap\symbol{"F4EE}} - \expandafter\def\csname simpleicon@themodelsresourceicon\endcsname {\simpleiconsmap\symbol{"F4EF}} - \expandafter\def\csname simpleicon@themoviedatabaseicon\endcsname {\simpleiconsmap\symbol{"F4F0}} - \expandafter\def\csname simpleicon@thenorthfaceicon\endcsname {\simpleiconsmap\symbol{"F4F1}} - \expandafter\def\csname simpleicon@theodinprojecticon\endcsname {\simpleiconsmap\symbol{"F4F2}} - \expandafter\def\csname simpleicon@theregistericon\endcsname {\simpleiconsmap\symbol{"F4F3}} - \expandafter\def\csname simpleicon@thesoundsresourceicon\endcsname {\simpleiconsmap\symbol{"F4F4}} - \expandafter\def\csname simpleicon@thespritersresourceicon\endcsname {\simpleiconsmap\symbol{"F4F5}} - \expandafter\def\csname simpleicon@thewashingtonposticon\endcsname {\simpleiconsmap\symbol{"F4F6}} - \expandafter\def\csname simpleicon@theweatherchannelicon\endcsname {\simpleiconsmap\symbol{"F4F7}} - \expandafter\def\csname simpleicon@thingiverseicon\endcsname {\simpleiconsmap\symbol{"F4F8}} - \expandafter\def\csname simpleicon@thinkpadicon\endcsname {\simpleiconsmap\symbol{"F4F9}} - \expandafter\def\csname simpleicon@thirdwebicon\endcsname {\simpleiconsmap\symbol{"F4FA}} - \expandafter\def\csname simpleicon@threadlessicon\endcsname {\simpleiconsmap\symbol{"F4FB}} - \expandafter\def\csname simpleicon@threadsicon\endcsname {\simpleiconsmap\symbol{"F4FC}} - \expandafter\def\csname simpleicon@threedotjsicon\endcsname {\simpleiconsmap\symbol{"F4FD}} - \expandafter\def\csname simpleicon@threemaicon\endcsname {\simpleiconsmap\symbol{"F4FE}} - \expandafter\def\csname simpleicon@thumbtackicon\endcsname {\simpleiconsmap\symbol{"F4FF}} - \expandafter\def\csname simpleicon@thunderbirdicon\endcsname {\simpleiconsmap\symbol{"F500}} - \expandafter\def\csname simpleicon@thunderstoreicon\endcsname {\simpleiconsmap\symbol{"F501}} - \expandafter\def\csname simpleicon@thurgauerkantonalbankicon\endcsname {\simpleiconsmap\symbol{"F502}} - \expandafter\def\csname simpleicon@thymeleaficon\endcsname {\simpleiconsmap\symbol{"F503}} - \expandafter\def\csname simpleicon@ticketmastericon\endcsname {\simpleiconsmap\symbol{"F504}} - \expandafter\def\csname simpleicon@ticktickicon\endcsname {\simpleiconsmap\symbol{"F505}} - \expandafter\def\csname simpleicon@tidalicon\endcsname {\simpleiconsmap\symbol{"F506}} - \expandafter\def\csname simpleicon@tiddlywikiicon\endcsname {\simpleiconsmap\symbol{"F507}} - \expandafter\def\csname simpleicon@tideicon\endcsname {\simpleiconsmap\symbol{"F508}} - \expandafter\def\csname simpleicon@tidyverseicon\endcsname {\simpleiconsmap\symbol{"F509}} - \expandafter\def\csname simpleicon@tietoevryicon\endcsname {\simpleiconsmap\symbol{"F50A}} - \expandafter\def\csname simpleicon@tiktokicon\endcsname {\simpleiconsmap\symbol{"F50B}} - \expandafter\def\csname simpleicon@tildapublishingicon\endcsname {\simpleiconsmap\symbol{"F50C}} - \expandafter\def\csname simpleicon@tileicon\endcsname {\simpleiconsmap\symbol{"F50D}} - \expandafter\def\csname simpleicon@timescaleicon\endcsname {\simpleiconsmap\symbol{"F50E}} - \expandafter\def\csname simpleicon@tinaicon\endcsname {\simpleiconsmap\symbol{"F50F}} - \expandafter\def\csname simpleicon@tindericon\endcsname {\simpleiconsmap\symbol{"F510}} - \expandafter\def\csname simpleicon@tindieicon\endcsname {\simpleiconsmap\symbol{"F511}} - \expandafter\def\csname simpleicon@tinkercadicon\endcsname {\simpleiconsmap\symbol{"F512}} - \expandafter\def\csname simpleicon@tinygradicon\endcsname {\simpleiconsmap\symbol{"F513}} - \expandafter\def\csname simpleicon@tinylettericon\endcsname {\simpleiconsmap\symbol{"F514}} - \expandafter\def\csname simpleicon@tistoryicon\endcsname {\simpleiconsmap\symbol{"F515}} - \expandafter\def\csname simpleicon@tldrawicon\endcsname {\simpleiconsmap\symbol{"F516}} - \expandafter\def\csname simpleicon@tmobileicon\endcsname {\simpleiconsmap\symbol{"F517}} - \expandafter\def\csname simpleicon@tmuxicon\endcsname {\simpleiconsmap\symbol{"F518}} - \expandafter\def\csname simpleicon@todoisticon\endcsname {\simpleiconsmap\symbol{"F519}} - \expandafter\def\csname simpleicon@togglicon\endcsname {\simpleiconsmap\symbol{"F51A}} - \expandafter\def\csname simpleicon@toggltrackicon\endcsname {\simpleiconsmap\symbol{"F51B}} - \expandafter\def\csname simpleicon@tokyometroicon\endcsname {\simpleiconsmap\symbol{"F51C}} - \expandafter\def\csname simpleicon@tollicon\endcsname {\simpleiconsmap\symbol{"F51D}} - \expandafter\def\csname simpleicon@tomlicon\endcsname {\simpleiconsmap\symbol{"F51E}} - \expandafter\def\csname simpleicon@tomorrowlandicon\endcsname {\simpleiconsmap\symbol{"F51F}} - \expandafter\def\csname simpleicon@tonicon\endcsname {\simpleiconsmap\symbol{"F520}} - \expandafter\def\csname simpleicon@topcodericon\endcsname {\simpleiconsmap\symbol{"F521}} - \expandafter\def\csname simpleicon@topdotggicon\endcsname {\simpleiconsmap\symbol{"F522}} - \expandafter\def\csname simpleicon@toptalicon\endcsname {\simpleiconsmap\symbol{"F523}} - \expandafter\def\csname simpleicon@torbrowsericon\endcsname {\simpleiconsmap\symbol{"F524}} - \expandafter\def\csname simpleicon@torprojecticon\endcsname {\simpleiconsmap\symbol{"F525}} - \expandafter\def\csname simpleicon@toshibaicon\endcsname {\simpleiconsmap\symbol{"F526}} - \expandafter\def\csname simpleicon@totvsicon\endcsname {\simpleiconsmap\symbol{"F527}} - \expandafter\def\csname simpleicon@tourboxicon\endcsname {\simpleiconsmap\symbol{"F528}} - \expandafter\def\csname simpleicon@towericon\endcsname {\simpleiconsmap\symbol{"F529}} - \expandafter\def\csname simpleicon@toyotaicon\endcsname {\simpleiconsmap\symbol{"F52A}} - \expandafter\def\csname simpleicon@tplinkicon\endcsname {\simpleiconsmap\symbol{"F52B}} - \expandafter\def\csname simpleicon@tqdmicon\endcsname {\simpleiconsmap\symbol{"F52C}} - \expandafter\def\csname simpleicon@traccaricon\endcsname {\simpleiconsmap\symbol{"F52D}} - \expandafter\def\csname simpleicon@tradingviewicon\endcsname {\simpleiconsmap\symbol{"F52E}} - \expandafter\def\csname simpleicon@traefikmeshicon\endcsname {\simpleiconsmap\symbol{"F52F}} - \expandafter\def\csname simpleicon@traefikproxyicon\endcsname {\simpleiconsmap\symbol{"F530}} - \expandafter\def\csname simpleicon@trailforksicon\endcsname {\simpleiconsmap\symbol{"F531}} - \expandafter\def\csname simpleicon@trainerroadicon\endcsname {\simpleiconsmap\symbol{"F532}} - \expandafter\def\csname simpleicon@trakticon\endcsname {\simpleiconsmap\symbol{"F533}} - \expandafter\def\csname simpleicon@transifexicon\endcsname {\simpleiconsmap\symbol{"F534}} - \expandafter\def\csname simpleicon@transmissionicon\endcsname {\simpleiconsmap\symbol{"F535}} - \expandafter\def\csname simpleicon@transportforirelandicon\endcsname {\simpleiconsmap\symbol{"F536}} - \expandafter\def\csname simpleicon@transportforlondonicon\endcsname {\simpleiconsmap\symbol{"F537}} - \expandafter\def\csname simpleicon@travisciicon\endcsname {\simpleiconsmap\symbol{"F538}} - \expandafter\def\csname simpleicon@treehouseicon\endcsname {\simpleiconsmap\symbol{"F539}} - \expandafter\def\csname simpleicon@trelloicon\endcsname {\simpleiconsmap\symbol{"F53A}} - \expandafter\def\csname simpleicon@trendmicroicon\endcsname {\simpleiconsmap\symbol{"F53B}} - \expandafter\def\csname simpleicon@treyarchicon\endcsname {\simpleiconsmap\symbol{"F53C}} - \expandafter\def\csname simpleicon@tricentisicon\endcsname {\simpleiconsmap\symbol{"F53D}} - \expandafter\def\csname simpleicon@triliumicon\endcsname {\simpleiconsmap\symbol{"F53E}} - \expandafter\def\csname simpleicon@trillericon\endcsname {\simpleiconsmap\symbol{"F53F}} - \expandafter\def\csname simpleicon@trillertvicon\endcsname {\simpleiconsmap\symbol{"F540}} - \expandafter\def\csname simpleicon@trinoicon\endcsname {\simpleiconsmap\symbol{"F541}} - \expandafter\def\csname simpleicon@tripadvisoricon\endcsname {\simpleiconsmap\symbol{"F542}} - \expandafter\def\csname simpleicon@tripdotcomicon\endcsname {\simpleiconsmap\symbol{"F543}} - \expandafter\def\csname simpleicon@trivagoicon\endcsname {\simpleiconsmap\symbol{"F544}} - \expandafter\def\csname simpleicon@trivyicon\endcsname {\simpleiconsmap\symbol{"F545}} - \expandafter\def\csname simpleicon@troveicon\endcsname {\simpleiconsmap\symbol{"F546}} - \expandafter\def\csname simpleicon@trpcicon\endcsname {\simpleiconsmap\symbol{"F547}} - \expandafter\def\csname simpleicon@truenasicon\endcsname {\simpleiconsmap\symbol{"F548}} - \expandafter\def\csname simpleicon@trueupicon\endcsname {\simpleiconsmap\symbol{"F549}} - \expandafter\def\csname simpleicon@truliaicon\endcsname {\simpleiconsmap\symbol{"F54A}} - \expandafter\def\csname simpleicon@trustedshopsicon\endcsname {\simpleiconsmap\symbol{"F54B}} - \expandafter\def\csname simpleicon@trustpiloticon\endcsname {\simpleiconsmap\symbol{"F54C}} - \expandafter\def\csname simpleicon@tryhackmeicon\endcsname {\simpleiconsmap\symbol{"F54D}} - \expandafter\def\csname simpleicon@tryitonlineicon\endcsname {\simpleiconsmap\symbol{"F54E}} - \expandafter\def\csname simpleicon@tsnodeicon\endcsname {\simpleiconsmap\symbol{"F54F}} - \expandafter\def\csname simpleicon@tubiicon\endcsname {\simpleiconsmap\symbol{"F550}} - \expandafter\def\csname simpleicon@tuiicon\endcsname {\simpleiconsmap\symbol{"F551}} - \expandafter\def\csname simpleicon@tumblricon\endcsname {\simpleiconsmap\symbol{"F552}} - \expandafter\def\csname simpleicon@tuneinicon\endcsname {\simpleiconsmap\symbol{"F553}} - \expandafter\def\csname simpleicon@turboicon\endcsname {\simpleiconsmap\symbol{"F554}} - \expandafter\def\csname simpleicon@turborepoicon\endcsname {\simpleiconsmap\symbol{"F555}} - \expandafter\def\csname simpleicon@turbosquidicon\endcsname {\simpleiconsmap\symbol{"F556}} - \expandafter\def\csname simpleicon@turkishairlinesicon\endcsname {\simpleiconsmap\symbol{"F557}} - \expandafter\def\csname simpleicon@tursoicon\endcsname {\simpleiconsmap\symbol{"F558}} - \expandafter\def\csname simpleicon@tutanotaicon\endcsname {\simpleiconsmap\symbol{"F559}} - \expandafter\def\csname simpleicon@tv4playicon\endcsname {\simpleiconsmap\symbol{"F55A}} - \expandafter\def\csname simpleicon@tvtimeicon\endcsname {\simpleiconsmap\symbol{"F55B}} - \expandafter\def\csname simpleicon@twilioicon\endcsname {\simpleiconsmap\symbol{"F55C}} - \expandafter\def\csname simpleicon@twinklyicon\endcsname {\simpleiconsmap\symbol{"F55D}} - \expandafter\def\csname simpleicon@twinmotionicon\endcsname {\simpleiconsmap\symbol{"F55E}} - \expandafter\def\csname simpleicon@twitchicon\endcsname {\simpleiconsmap\symbol{"F55F}} - \expandafter\def\csname simpleicon@typeformicon\endcsname {\simpleiconsmap\symbol{"F560}} - \expandafter\def\csname simpleicon@typeormicon\endcsname {\simpleiconsmap\symbol{"F561}} - \expandafter\def\csname simpleicon@typericon\endcsname {\simpleiconsmap\symbol{"F562}} - \expandafter\def\csname simpleicon@typescripticon\endcsname {\simpleiconsmap\symbol{"F563}} - \expandafter\def\csname simpleicon@typo3icon\endcsname {\simpleiconsmap\symbol{"F564}} - \expandafter\def\csname simpleicon@typsticon\endcsname {\simpleiconsmap\symbol{"F565}} - \expandafter\def\csname simpleicon@ubericon\endcsname {\simpleiconsmap\symbol{"F566}} - \expandafter\def\csname simpleicon@ubereatsicon\endcsname {\simpleiconsmap\symbol{"F567}} - \expandafter\def\csname simpleicon@ubiquitiicon\endcsname {\simpleiconsmap\symbol{"F568}} - \expandafter\def\csname simpleicon@ubisofticon\endcsname {\simpleiconsmap\symbol{"F569}} - \expandafter\def\csname simpleicon@ublockoriginicon\endcsname {\simpleiconsmap\symbol{"F56A}} - \expandafter\def\csname simpleicon@ubuntuicon\endcsname {\simpleiconsmap\symbol{"F56B}} - \expandafter\def\csname simpleicon@ubuntumateicon\endcsname {\simpleiconsmap\symbol{"F56C}} - \expandafter\def\csname simpleicon@udacityicon\endcsname {\simpleiconsmap\symbol{"F56D}} - \expandafter\def\csname simpleicon@udemyicon\endcsname {\simpleiconsmap\symbol{"F56E}} - \expandafter\def\csname simpleicon@ufcicon\endcsname {\simpleiconsmap\symbol{"F56F}} - \expandafter\def\csname simpleicon@uikiticon\endcsname {\simpleiconsmap\symbol{"F570}} - \expandafter\def\csname simpleicon@uipathicon\endcsname {\simpleiconsmap\symbol{"F571}} - \expandafter\def\csname simpleicon@ululeicon\endcsname {\simpleiconsmap\symbol{"F572}} - \expandafter\def\csname simpleicon@umamiicon\endcsname {\simpleiconsmap\symbol{"F573}} - \expandafter\def\csname simpleicon@umbracoicon\endcsname {\simpleiconsmap\symbol{"F574}} - \expandafter\def\csname simpleicon@umlicon\endcsname {\simpleiconsmap\symbol{"F575}} - \expandafter\def\csname simpleicon@unacademyicon\endcsname {\simpleiconsmap\symbol{"F576}} - \expandafter\def\csname simpleicon@underarmouricon\endcsname {\simpleiconsmap\symbol{"F577}} - \expandafter\def\csname simpleicon@underscoredotjsicon\endcsname {\simpleiconsmap\symbol{"F578}} - \expandafter\def\csname simpleicon@undertaleicon\endcsname {\simpleiconsmap\symbol{"F579}} - \expandafter\def\csname simpleicon@unicodeicon\endcsname {\simpleiconsmap\symbol{"F57A}} - \expandafter\def\csname simpleicon@unilevericon\endcsname {\simpleiconsmap\symbol{"F57B}} - \expandafter\def\csname simpleicon@uniqloicon\endcsname {\simpleiconsmap\symbol{"F57C}} - \expandafter\def\csname simpleicon@uniqlojaicon\endcsname {\simpleiconsmap\symbol{"F57D}} - \expandafter\def\csname simpleicon@unitedairlinesicon\endcsname {\simpleiconsmap\symbol{"F57E}} - \expandafter\def\csname simpleicon@unitednationsicon\endcsname {\simpleiconsmap\symbol{"F57F}} - \expandafter\def\csname simpleicon@unityicon\endcsname {\simpleiconsmap\symbol{"F580}} - \expandafter\def\csname simpleicon@unjsicon\endcsname {\simpleiconsmap\symbol{"F581}} - \expandafter\def\csname simpleicon@unlicenseicon\endcsname {\simpleiconsmap\symbol{"F582}} - \expandafter\def\csname simpleicon@unocssicon\endcsname {\simpleiconsmap\symbol{"F583}} - \expandafter\def\csname simpleicon@unpkgicon\endcsname {\simpleiconsmap\symbol{"F584}} - \expandafter\def\csname simpleicon@unraidicon\endcsname {\simpleiconsmap\symbol{"F585}} - \expandafter\def\csname simpleicon@unrealengineicon\endcsname {\simpleiconsmap\symbol{"F586}} - \expandafter\def\csname simpleicon@unsplashicon\endcsname {\simpleiconsmap\symbol{"F587}} - \expandafter\def\csname simpleicon@untappdicon\endcsname {\simpleiconsmap\symbol{"F588}} - \expandafter\def\csname simpleicon@upcloudicon\endcsname {\simpleiconsmap\symbol{"F589}} - \expandafter\def\csname simpleicon@upholdicon\endcsname {\simpleiconsmap\symbol{"F58A}} - \expandafter\def\csname simpleicon@uplabsicon\endcsname {\simpleiconsmap\symbol{"F58B}} - \expandafter\def\csname simpleicon@upptimeicon\endcsname {\simpleiconsmap\symbol{"F58C}} - \expandafter\def\csname simpleicon@upsicon\endcsname {\simpleiconsmap\symbol{"F58D}} - \expandafter\def\csname simpleicon@upstashicon\endcsname {\simpleiconsmap\symbol{"F58E}} - \expandafter\def\csname simpleicon@uptimekumaicon\endcsname {\simpleiconsmap\symbol{"F58F}} - \expandafter\def\csname simpleicon@uptoboxicon\endcsname {\simpleiconsmap\symbol{"F590}} - \expandafter\def\csname simpleicon@upworkicon\endcsname {\simpleiconsmap\symbol{"F591}} - \expandafter\def\csname simpleicon@uspsicon\endcsname {\simpleiconsmap\symbol{"F592}} - \expandafter\def\csname simpleicon@utorrenticon\endcsname {\simpleiconsmap\symbol{"F593}} - \expandafter\def\csname simpleicon@vicon\endcsname {\simpleiconsmap\symbol{"F594}} - \expandafter\def\csname simpleicon@v2exicon\endcsname {\simpleiconsmap\symbol{"F595}} - \expandafter\def\csname simpleicon@v8icon\endcsname {\simpleiconsmap\symbol{"F596}} - \expandafter\def\csname simpleicon@vaadinicon\endcsname {\simpleiconsmap\symbol{"F597}} - \expandafter\def\csname simpleicon@vagranticon\endcsname {\simpleiconsmap\symbol{"F598}} - \expandafter\def\csname simpleicon@valaicon\endcsname {\simpleiconsmap\symbol{"F599}} - \expandafter\def\csname simpleicon@valoranticon\endcsname {\simpleiconsmap\symbol{"F59A}} - \expandafter\def\csname simpleicon@valveicon\endcsname {\simpleiconsmap\symbol{"F59B}} - \expandafter\def\csname simpleicon@vaporicon\endcsname {\simpleiconsmap\symbol{"F59C}} - \expandafter\def\csname simpleicon@vaulticon\endcsname {\simpleiconsmap\symbol{"F59D}} - \expandafter\def\csname simpleicon@vaultwardenicon\endcsname {\simpleiconsmap\symbol{"F59E}} - \expandafter\def\csname simpleicon@vauxhallicon\endcsname {\simpleiconsmap\symbol{"F59F}} - \expandafter\def\csname simpleicon@vbulletinicon\endcsname {\simpleiconsmap\symbol{"F5A0}} - \expandafter\def\csname simpleicon@vectaryicon\endcsname {\simpleiconsmap\symbol{"F5A1}} - \expandafter\def\csname simpleicon@vectorlogozoneicon\endcsname {\simpleiconsmap\symbol{"F5A2}} - \expandafter\def\csname simpleicon@vectorworksicon\endcsname {\simpleiconsmap\symbol{"F5A3}} - \expandafter\def\csname simpleicon@veeamicon\endcsname {\simpleiconsmap\symbol{"F5A4}} - \expandafter\def\csname simpleicon@veedicon\endcsname {\simpleiconsmap\symbol{"F5A5}} - \expandafter\def\csname simpleicon@veepeeicon\endcsname {\simpleiconsmap\symbol{"F5A6}} - \expandafter\def\csname simpleicon@vegaicon\endcsname {\simpleiconsmap\symbol{"F5A7}} - \expandafter\def\csname simpleicon@vegasicon\endcsname {\simpleiconsmap\symbol{"F5A8}} - \expandafter\def\csname simpleicon@velogicon\endcsname {\simpleiconsmap\symbol{"F5A9}} - \expandafter\def\csname simpleicon@venmoicon\endcsname {\simpleiconsmap\symbol{"F5AA}} - \expandafter\def\csname simpleicon@vercelicon\endcsname {\simpleiconsmap\symbol{"F5AB}} - \expandafter\def\csname simpleicon@verdaccioicon\endcsname {\simpleiconsmap\symbol{"F5AC}} - \expandafter\def\csname simpleicon@veritasicon\endcsname {\simpleiconsmap\symbol{"F5AD}} - \expandafter\def\csname simpleicon@verizonicon\endcsname {\simpleiconsmap\symbol{"F5AE}} - \expandafter\def\csname simpleicon@vespaicon\endcsname {\simpleiconsmap\symbol{"F5AF}} - \expandafter\def\csname simpleicon@vestelicon\endcsname {\simpleiconsmap\symbol{"F5B0}} - \expandafter\def\csname simpleicon@vexxhosticon\endcsname {\simpleiconsmap\symbol{"F5B1}} - \expandafter\def\csname simpleicon@vfairsicon\endcsname {\simpleiconsmap\symbol{"F5B2}} - \expandafter\def\csname simpleicon@viadeoicon\endcsname {\simpleiconsmap\symbol{"F5B3}} - \expandafter\def\csname simpleicon@viaplayicon\endcsname {\simpleiconsmap\symbol{"F5B4}} - \expandafter\def\csname simpleicon@vibericon\endcsname {\simpleiconsmap\symbol{"F5B5}} - \expandafter\def\csname simpleicon@vibloicon\endcsname {\simpleiconsmap\symbol{"F5B6}} - \expandafter\def\csname simpleicon@victoriametricsicon\endcsname {\simpleiconsmap\symbol{"F5B7}} - \expandafter\def\csname simpleicon@victronenergyicon\endcsname {\simpleiconsmap\symbol{"F5B8}} - \expandafter\def\csname simpleicon@vimicon\endcsname {\simpleiconsmap\symbol{"F5B9}} - \expandafter\def\csname simpleicon@vimeoicon\endcsname {\simpleiconsmap\symbol{"F5BA}} - \expandafter\def\csname simpleicon@vimeolivestreamicon\endcsname {\simpleiconsmap\symbol{"F5BB}} - \expandafter\def\csname simpleicon@virginicon\endcsname {\simpleiconsmap\symbol{"F5BC}} - \expandafter\def\csname simpleicon@virginatlanticicon\endcsname {\simpleiconsmap\symbol{"F5BD}} - \expandafter\def\csname simpleicon@virginmediaicon\endcsname {\simpleiconsmap\symbol{"F5BE}} - \expandafter\def\csname simpleicon@virtualboxicon\endcsname {\simpleiconsmap\symbol{"F5BF}} - \expandafter\def\csname simpleicon@virustotalicon\endcsname {\simpleiconsmap\symbol{"F5C0}} - \expandafter\def\csname simpleicon@visaicon\endcsname {\simpleiconsmap\symbol{"F5C1}} - \expandafter\def\csname simpleicon@visxicon\endcsname {\simpleiconsmap\symbol{"F5C2}} - \expandafter\def\csname simpleicon@viteicon\endcsname {\simpleiconsmap\symbol{"F5C3}} - \expandafter\def\csname simpleicon@vitepressicon\endcsname {\simpleiconsmap\symbol{"F5C4}} - \expandafter\def\csname simpleicon@vitessicon\endcsname {\simpleiconsmap\symbol{"F5C5}} - \expandafter\def\csname simpleicon@vitesticon\endcsname {\simpleiconsmap\symbol{"F5C6}} - \expandafter\def\csname simpleicon@vivaldiicon\endcsname {\simpleiconsmap\symbol{"F5C7}} - \expandafter\def\csname simpleicon@vivawalleticon\endcsname {\simpleiconsmap\symbol{"F5C8}} - \expandafter\def\csname simpleicon@vivinoicon\endcsname {\simpleiconsmap\symbol{"F5C9}} - \expandafter\def\csname simpleicon@vivinticon\endcsname {\simpleiconsmap\symbol{"F5CA}} - \expandafter\def\csname simpleicon@vivoicon\endcsname {\simpleiconsmap\symbol{"F5CB}} - \expandafter\def\csname simpleicon@vkicon\endcsname {\simpleiconsmap\symbol{"F5CC}} - \expandafter\def\csname simpleicon@vlcmediaplayericon\endcsname {\simpleiconsmap\symbol{"F5CD}} - \expandafter\def\csname simpleicon@vmwareicon\endcsname {\simpleiconsmap\symbol{"F5CE}} - \expandafter\def\csname simpleicon@vodafoneicon\endcsname {\simpleiconsmap\symbol{"F5CF}} - \expandafter\def\csname simpleicon@voidlinuxicon\endcsname {\simpleiconsmap\symbol{"F5D0}} - \expandafter\def\csname simpleicon@voipdotmsicon\endcsname {\simpleiconsmap\symbol{"F5D1}} - \expandafter\def\csname simpleicon@volkswagenicon\endcsname {\simpleiconsmap\symbol{"F5D2}} - \expandafter\def\csname simpleicon@volvoicon\endcsname {\simpleiconsmap\symbol{"F5D3}} - \expandafter\def\csname simpleicon@vonageicon\endcsname {\simpleiconsmap\symbol{"F5D4}} - \expandafter\def\csname simpleicon@vorondesignicon\endcsname {\simpleiconsmap\symbol{"F5D5}} - \expandafter\def\csname simpleicon@vowpalwabbiticon\endcsname {\simpleiconsmap\symbol{"F5D6}} - \expandafter\def\csname simpleicon@voxicon\endcsname {\simpleiconsmap\symbol{"F5D7}} - \expandafter\def\csname simpleicon@vrchaticon\endcsname {\simpleiconsmap\symbol{"F5D8}} - \expandafter\def\csname simpleicon@vscoicon\endcsname {\simpleiconsmap\symbol{"F5D9}} - \expandafter\def\csname simpleicon@vscodiumicon\endcsname {\simpleiconsmap\symbol{"F5DA}} - \expandafter\def\csname simpleicon@vtexicon\endcsname {\simpleiconsmap\symbol{"F5DB}} - \expandafter\def\csname simpleicon@vuedotjsicon\endcsname {\simpleiconsmap\symbol{"F5DC}} - \expandafter\def\csname simpleicon@vuetifyicon\endcsname {\simpleiconsmap\symbol{"F5DD}} - \expandafter\def\csname simpleicon@vulkanicon\endcsname {\simpleiconsmap\symbol{"F5DE}} - \expandafter\def\csname simpleicon@vultricon\endcsname {\simpleiconsmap\symbol{"F5DF}} - \expandafter\def\csname simpleicon@vyondicon\endcsname {\simpleiconsmap\symbol{"F5E0}} - \expandafter\def\csname simpleicon@w3schoolsicon\endcsname {\simpleiconsmap\symbol{"F5E1}} - \expandafter\def\csname simpleicon@wacomicon\endcsname {\simpleiconsmap\symbol{"F5E2}} - \expandafter\def\csname simpleicon@wagmiicon\endcsname {\simpleiconsmap\symbol{"F5E3}} - \expandafter\def\csname simpleicon@wagtailicon\endcsname {\simpleiconsmap\symbol{"F5E4}} - \expandafter\def\csname simpleicon@wailsicon\endcsname {\simpleiconsmap\symbol{"F5E5}} - \expandafter\def\csname simpleicon@wakatimeicon\endcsname {\simpleiconsmap\symbol{"F5E6}} - \expandafter\def\csname simpleicon@walkmanicon\endcsname {\simpleiconsmap\symbol{"F5E7}} - \expandafter\def\csname simpleicon@wallabagicon\endcsname {\simpleiconsmap\symbol{"F5E8}} - \expandafter\def\csname simpleicon@walletconnecticon\endcsname {\simpleiconsmap\symbol{"F5E9}} - \expandafter\def\csname simpleicon@walmarticon\endcsname {\simpleiconsmap\symbol{"F5EA}} - \expandafter\def\csname simpleicon@wantedlyicon\endcsname {\simpleiconsmap\symbol{"F5EB}} - \expandafter\def\csname simpleicon@wappalyzericon\endcsname {\simpleiconsmap\symbol{"F5EC}} - \expandafter\def\csname simpleicon@warnerbrosicon\endcsname {\simpleiconsmap\symbol{"F5ED}} - \expandafter\def\csname simpleicon@warpicon\endcsname {\simpleiconsmap\symbol{"F5EE}} - \expandafter\def\csname simpleicon@wasabiicon\endcsname {\simpleiconsmap\symbol{"F5EF}} - \expandafter\def\csname simpleicon@wasmcloudicon\endcsname {\simpleiconsmap\symbol{"F5F0}} - \expandafter\def\csname simpleicon@wasmericon\endcsname {\simpleiconsmap\symbol{"F5F1}} - \expandafter\def\csname simpleicon@watchtowericon\endcsname {\simpleiconsmap\symbol{"F5F2}} - \expandafter\def\csname simpleicon@wattpadicon\endcsname {\simpleiconsmap\symbol{"F5F3}} - \expandafter\def\csname simpleicon@waylandicon\endcsname {\simpleiconsmap\symbol{"F5F4}} - \expandafter\def\csname simpleicon@wazeicon\endcsname {\simpleiconsmap\symbol{"F5F5}} - \expandafter\def\csname simpleicon@wazirxicon\endcsname {\simpleiconsmap\symbol{"F5F6}} - \expandafter\def\csname simpleicon@wearosicon\endcsname {\simpleiconsmap\symbol{"F5F7}} - \expandafter\def\csname simpleicon@weasylicon\endcsname {\simpleiconsmap\symbol{"F5F8}} - \expandafter\def\csname simpleicon@web3dotjsicon\endcsname {\simpleiconsmap\symbol{"F5F9}} - \expandafter\def\csname simpleicon@webassemblyicon\endcsname {\simpleiconsmap\symbol{"F5FA}} - \expandafter\def\csname simpleicon@webauthnicon\endcsname {\simpleiconsmap\symbol{"F5FB}} - \expandafter\def\csname simpleicon@webcomponentsdotorgicon\endcsname {\simpleiconsmap\symbol{"F5FC}} - \expandafter\def\csname simpleicon@webdriverioicon\endcsname {\simpleiconsmap\symbol{"F5FD}} - \expandafter\def\csname simpleicon@webexicon\endcsname {\simpleiconsmap\symbol{"F5FE}} - \expandafter\def\csname simpleicon@webflowicon\endcsname {\simpleiconsmap\symbol{"F5FF}} - \expandafter\def\csname simpleicon@webglicon\endcsname {\simpleiconsmap\symbol{"F600}} - \expandafter\def\csname simpleicon@webgpuicon\endcsname {\simpleiconsmap\symbol{"F601}} - \expandafter\def\csname simpleicon@weblateicon\endcsname {\simpleiconsmap\symbol{"F602}} - \expandafter\def\csname simpleicon@webminicon\endcsname {\simpleiconsmap\symbol{"F603}} - \expandafter\def\csname simpleicon@webmoneyicon\endcsname {\simpleiconsmap\symbol{"F604}} - \expandafter\def\csname simpleicon@webpackicon\endcsname {\simpleiconsmap\symbol{"F605}} - \expandafter\def\csname simpleicon@webrtcicon\endcsname {\simpleiconsmap\symbol{"F606}} - \expandafter\def\csname simpleicon@webstormicon\endcsname {\simpleiconsmap\symbol{"F607}} - \expandafter\def\csname simpleicon@webtoonicon\endcsname {\simpleiconsmap\symbol{"F608}} - \expandafter\def\csname simpleicon@webtreesicon\endcsname {\simpleiconsmap\symbol{"F609}} - \expandafter\def\csname simpleicon@wechaticon\endcsname {\simpleiconsmap\symbol{"F60A}} - \expandafter\def\csname simpleicon@wegameicon\endcsname {\simpleiconsmap\symbol{"F60B}} - \expandafter\def\csname simpleicon@weightsandbiasesicon\endcsname {\simpleiconsmap\symbol{"F60C}} - \expandafter\def\csname simpleicon@welcometothejungleicon\endcsname {\simpleiconsmap\symbol{"F60D}} - \expandafter\def\csname simpleicon@wellfoundicon\endcsname {\simpleiconsmap\symbol{"F60E}} - \expandafter\def\csname simpleicon@wellsfargoicon\endcsname {\simpleiconsmap\symbol{"F60F}} - \expandafter\def\csname simpleicon@wemoicon\endcsname {\simpleiconsmap\symbol{"F610}} - \expandafter\def\csname simpleicon@westerndigitalicon\endcsname {\simpleiconsmap\symbol{"F611}} - \expandafter\def\csname simpleicon@westernunionicon\endcsname {\simpleiconsmap\symbol{"F612}} - \expandafter\def\csname simpleicon@wetransfericon\endcsname {\simpleiconsmap\symbol{"F613}} - \expandafter\def\csname simpleicon@weztermicon\endcsname {\simpleiconsmap\symbol{"F614}} - \expandafter\def\csname simpleicon@wgpuicon\endcsname {\simpleiconsmap\symbol{"F615}} - \expandafter\def\csname simpleicon@whatsappicon\endcsname {\simpleiconsmap\symbol{"F616}} - \expandafter\def\csname simpleicon@wheniworkicon\endcsname {\simpleiconsmap\symbol{"F617}} - \expandafter\def\csname simpleicon@wiiicon\endcsname {\simpleiconsmap\symbol{"F618}} - \expandafter\def\csname simpleicon@wiiuicon\endcsname {\simpleiconsmap\symbol{"F619}} - \expandafter\def\csname simpleicon@wikidataicon\endcsname {\simpleiconsmap\symbol{"F61A}} - \expandafter\def\csname simpleicon@wikidotggicon\endcsname {\simpleiconsmap\symbol{"F61B}} - \expandafter\def\csname simpleicon@wikidotjsicon\endcsname {\simpleiconsmap\symbol{"F61C}} - \expandafter\def\csname simpleicon@wikimediacommonsicon\endcsname {\simpleiconsmap\symbol{"F61D}} - \expandafter\def\csname simpleicon@wikimediafoundationicon\endcsname {\simpleiconsmap\symbol{"F61E}} - \expandafter\def\csname simpleicon@wikipediaicon\endcsname {\simpleiconsmap\symbol{"F61F}} - \expandafter\def\csname simpleicon@wikiquoteicon\endcsname {\simpleiconsmap\symbol{"F620}} - \expandafter\def\csname simpleicon@wikivoyageicon\endcsname {\simpleiconsmap\symbol{"F621}} - \expandafter\def\csname simpleicon@winampicon\endcsname {\simpleiconsmap\symbol{"F622}} - \expandafter\def\csname simpleicon@wiproicon\endcsname {\simpleiconsmap\symbol{"F623}} - \expandafter\def\csname simpleicon@wireicon\endcsname {\simpleiconsmap\symbol{"F624}} - \expandafter\def\csname simpleicon@wireguardicon\endcsname {\simpleiconsmap\symbol{"F625}} - \expandafter\def\csname simpleicon@wiresharkicon\endcsname {\simpleiconsmap\symbol{"F626}} - \expandafter\def\csname simpleicon@wiseicon\endcsname {\simpleiconsmap\symbol{"F627}} - \expandafter\def\csname simpleicon@wishicon\endcsname {\simpleiconsmap\symbol{"F628}} - \expandafter\def\csname simpleicon@wistiaicon\endcsname {\simpleiconsmap\symbol{"F629}} - \expandafter\def\csname simpleicon@wixicon\endcsname {\simpleiconsmap\symbol{"F62A}} - \expandafter\def\csname simpleicon@wizzairicon\endcsname {\simpleiconsmap\symbol{"F62B}} - \expandafter\def\csname simpleicon@wolframicon\endcsname {\simpleiconsmap\symbol{"F62C}} - \expandafter\def\csname simpleicon@wolframlanguageicon\endcsname {\simpleiconsmap\symbol{"F62D}} - \expandafter\def\csname simpleicon@wolframmathematicaicon\endcsname {\simpleiconsmap\symbol{"F62E}} - \expandafter\def\csname simpleicon@wondershareicon\endcsname {\simpleiconsmap\symbol{"F62F}} - \expandafter\def\csname simpleicon@wondersharefilmoraicon\endcsname {\simpleiconsmap\symbol{"F630}} - \expandafter\def\csname simpleicon@wooicon\endcsname {\simpleiconsmap\symbol{"F631}} - \expandafter\def\csname simpleicon@woocommerceicon\endcsname {\simpleiconsmap\symbol{"F632}} - \expandafter\def\csname simpleicon@wordpressicon\endcsname {\simpleiconsmap\symbol{"F633}} - \expandafter\def\csname simpleicon@workplaceicon\endcsname {\simpleiconsmap\symbol{"F634}} - \expandafter\def\csname simpleicon@worldhealthorganizationicon\endcsname {\simpleiconsmap\symbol{"F635}} - \expandafter\def\csname simpleicon@wpengineicon\endcsname {\simpleiconsmap\symbol{"F636}} - \expandafter\def\csname simpleicon@wpexplorericon\endcsname {\simpleiconsmap\symbol{"F637}} - \expandafter\def\csname simpleicon@wprocketicon\endcsname {\simpleiconsmap\symbol{"F638}} - \expandafter\def\csname simpleicon@writedotasicon\endcsname {\simpleiconsmap\symbol{"F639}} - \expandafter\def\csname simpleicon@wweicon\endcsname {\simpleiconsmap\symbol{"F63A}} - \expandafter\def\csname simpleicon@wwiseicon\endcsname {\simpleiconsmap\symbol{"F63B}} - \expandafter\def\csname simpleicon@wykopicon\endcsname {\simpleiconsmap\symbol{"F63C}} - \expandafter\def\csname simpleicon@wyzeicon\endcsname {\simpleiconsmap\symbol{"F63D}} - \expandafter\def\csname simpleicon@xicon\endcsname {\simpleiconsmap\symbol{"F63E}} - \expandafter\def\csname simpleicon@xamppicon\endcsname {\simpleiconsmap\symbol{"F63F}} - \expandafter\def\csname simpleicon@xcodeicon\endcsname {\simpleiconsmap\symbol{"F640}} - \expandafter\def\csname simpleicon@xdadevelopersicon\endcsname {\simpleiconsmap\symbol{"F641}} - \expandafter\def\csname simpleicon@xdotorgicon\endcsname {\simpleiconsmap\symbol{"F642}} - \expandafter\def\csname simpleicon@xenditicon\endcsname {\simpleiconsmap\symbol{"F643}} - \expandafter\def\csname simpleicon@xeroicon\endcsname {\simpleiconsmap\symbol{"F644}} - \expandafter\def\csname simpleicon@xfceicon\endcsname {\simpleiconsmap\symbol{"F645}} - \expandafter\def\csname simpleicon@xiaohongshuicon\endcsname {\simpleiconsmap\symbol{"F646}} - \expandafter\def\csname simpleicon@xiaomiicon\endcsname {\simpleiconsmap\symbol{"F647}} - \expandafter\def\csname simpleicon@xingicon\endcsname {\simpleiconsmap\symbol{"F648}} - \expandafter\def\csname simpleicon@xmlicon\endcsname {\simpleiconsmap\symbol{"F649}} - \expandafter\def\csname simpleicon@xmppicon\endcsname {\simpleiconsmap\symbol{"F64A}} - \expandafter\def\csname simpleicon@xoicon\endcsname {\simpleiconsmap\symbol{"F64B}} - \expandafter\def\csname simpleicon@xrpicon\endcsname {\simpleiconsmap\symbol{"F64C}} - \expandafter\def\csname simpleicon@xspliticon\endcsname {\simpleiconsmap\symbol{"F64D}} - \expandafter\def\csname simpleicon@xstateicon\endcsname {\simpleiconsmap\symbol{"F64E}} - \expandafter\def\csname simpleicon@xubuntuicon\endcsname {\simpleiconsmap\symbol{"F64F}} - \expandafter\def\csname simpleicon@yabaiicon\endcsname {\simpleiconsmap\symbol{"F650}} - \expandafter\def\csname simpleicon@yaleicon\endcsname {\simpleiconsmap\symbol{"F651}} - \expandafter\def\csname simpleicon@yamahacorporationicon\endcsname {\simpleiconsmap\symbol{"F652}} - \expandafter\def\csname simpleicon@yamahamotorcorporationicon\endcsname {\simpleiconsmap\symbol{"F653}} - \expandafter\def\csname simpleicon@yamlicon\endcsname {\simpleiconsmap\symbol{"F654}} - \expandafter\def\csname simpleicon@yandexcloudicon\endcsname {\simpleiconsmap\symbol{"F655}} - \expandafter\def\csname simpleicon@yarnicon\endcsname {\simpleiconsmap\symbol{"F656}} - \expandafter\def\csname simpleicon@ycombinatoricon\endcsname {\simpleiconsmap\symbol{"F657}} - \expandafter\def\csname simpleicon@yelpicon\endcsname {\simpleiconsmap\symbol{"F658}} - \expandafter\def\csname simpleicon@yetiicon\endcsname {\simpleiconsmap\symbol{"F659}} - \expandafter\def\csname simpleicon@yiiicon\endcsname {\simpleiconsmap\symbol{"F65A}} - \expandafter\def\csname simpleicon@yoasticon\endcsname {\simpleiconsmap\symbol{"F65B}} - \expandafter\def\csname simpleicon@youtubeicon\endcsname {\simpleiconsmap\symbol{"F65C}} - \expandafter\def\csname simpleicon@youtubegamingicon\endcsname {\simpleiconsmap\symbol{"F65D}} - \expandafter\def\csname simpleicon@youtubekidsicon\endcsname {\simpleiconsmap\symbol{"F65E}} - \expandafter\def\csname simpleicon@youtubemusicicon\endcsname {\simpleiconsmap\symbol{"F65F}} - \expandafter\def\csname simpleicon@youtubeshortsicon\endcsname {\simpleiconsmap\symbol{"F660}} - \expandafter\def\csname simpleicon@youtubestudioicon\endcsname {\simpleiconsmap\symbol{"F661}} - \expandafter\def\csname simpleicon@youtubetvicon\endcsname {\simpleiconsmap\symbol{"F662}} - \expandafter\def\csname simpleicon@yricon\endcsname {\simpleiconsmap\symbol{"F663}} - \expandafter\def\csname simpleicon@yubicoicon\endcsname {\simpleiconsmap\symbol{"F664}} - \expandafter\def\csname simpleicon@yunohosticon\endcsname {\simpleiconsmap\symbol{"F665}} - \expandafter\def\csname simpleicon@zabkaicon\endcsname {\simpleiconsmap\symbol{"F666}} - \expandafter\def\csname simpleicon@zaimicon\endcsname {\simpleiconsmap\symbol{"F667}} - \expandafter\def\csname simpleicon@zalandoicon\endcsname {\simpleiconsmap\symbol{"F668}} - \expandafter\def\csname simpleicon@zaloicon\endcsname {\simpleiconsmap\symbol{"F669}} - \expandafter\def\csname simpleicon@zapicon\endcsname {\simpleiconsmap\symbol{"F66A}} - \expandafter\def\csname simpleicon@zapiericon\endcsname {\simpleiconsmap\symbol{"F66B}} - \expandafter\def\csname simpleicon@zaraicon\endcsname {\simpleiconsmap\symbol{"F66C}} - \expandafter\def\csname simpleicon@zazzleicon\endcsname {\simpleiconsmap\symbol{"F66D}} - \expandafter\def\csname simpleicon@zcashicon\endcsname {\simpleiconsmap\symbol{"F66E}} - \expandafter\def\csname simpleicon@zcoolicon\endcsname {\simpleiconsmap\symbol{"F66F}} - \expandafter\def\csname simpleicon@zdficon\endcsname {\simpleiconsmap\symbol{"F670}} - \expandafter\def\csname simpleicon@zebpayicon\endcsname {\simpleiconsmap\symbol{"F671}} - \expandafter\def\csname simpleicon@zebratechnologiesicon\endcsname {\simpleiconsmap\symbol{"F672}} - \expandafter\def\csname simpleicon@zedindustriesicon\endcsname {\simpleiconsmap\symbol{"F673}} - \expandafter\def\csname simpleicon@zelleicon\endcsname {\simpleiconsmap\symbol{"F674}} - \expandafter\def\csname simpleicon@zendicon\endcsname {\simpleiconsmap\symbol{"F675}} - \expandafter\def\csname simpleicon@zendeskicon\endcsname {\simpleiconsmap\symbol{"F676}} - \expandafter\def\csname simpleicon@zennicon\endcsname {\simpleiconsmap\symbol{"F677}} - \expandafter\def\csname simpleicon@zenodoicon\endcsname {\simpleiconsmap\symbol{"F678}} - \expandafter\def\csname simpleicon@zensaricon\endcsname {\simpleiconsmap\symbol{"F679}} - \expandafter\def\csname simpleicon@zerodhaicon\endcsname {\simpleiconsmap\symbol{"F67A}} - \expandafter\def\csname simpleicon@zerotiericon\endcsname {\simpleiconsmap\symbol{"F67B}} - \expandafter\def\csname simpleicon@zerplyicon\endcsname {\simpleiconsmap\symbol{"F67C}} - \expandafter\def\csname simpleicon@zettlricon\endcsname {\simpleiconsmap\symbol{"F67D}} - \expandafter\def\csname simpleicon@zhihuicon\endcsname {\simpleiconsmap\symbol{"F67E}} - \expandafter\def\csname simpleicon@zigicon\endcsname {\simpleiconsmap\symbol{"F67F}} - \expandafter\def\csname simpleicon@zigbeeicon\endcsname {\simpleiconsmap\symbol{"F680}} - \expandafter\def\csname simpleicon@zigbee2mqtticon\endcsname {\simpleiconsmap\symbol{"F681}} - \expandafter\def\csname simpleicon@ziggoicon\endcsname {\simpleiconsmap\symbol{"F682}} - \expandafter\def\csname simpleicon@zilchicon\endcsname {\simpleiconsmap\symbol{"F683}} - \expandafter\def\csname simpleicon@zillowicon\endcsname {\simpleiconsmap\symbol{"F684}} - \expandafter\def\csname simpleicon@zincsearchicon\endcsname {\simpleiconsmap\symbol{"F685}} - \expandafter\def\csname simpleicon@zingaticon\endcsname {\simpleiconsmap\symbol{"F686}} - \expandafter\def\csname simpleicon@zodicon\endcsname {\simpleiconsmap\symbol{"F687}} - \expandafter\def\csname simpleicon@zohoicon\endcsname {\simpleiconsmap\symbol{"F688}} - \expandafter\def\csname simpleicon@zoipericon\endcsname {\simpleiconsmap\symbol{"F689}} - \expandafter\def\csname simpleicon@zomatoicon\endcsname {\simpleiconsmap\symbol{"F68A}} - \expandafter\def\csname simpleicon@zoomicon\endcsname {\simpleiconsmap\symbol{"F68B}} - \expandafter\def\csname simpleicon@zorinicon\endcsname {\simpleiconsmap\symbol{"F68C}} - \expandafter\def\csname simpleicon@zoteroicon\endcsname {\simpleiconsmap\symbol{"F68D}} - \expandafter\def\csname simpleicon@zshicon\endcsname {\simpleiconsmap\symbol{"F68E}} - \expandafter\def\csname simpleicon@zulipicon\endcsname {\simpleiconsmap\symbol{"F68F}} - \expandafter\def\csname simpleicon@zyteicon\endcsname {\simpleiconsmap\symbol{"F690}}
\ No newline at end of file + \expandafter\def\csname simpleicon@suiicon\endcsname {\simpleiconsmap\symbol{"F48E}} + \expandafter\def\csname simpleicon@sumologicicon\endcsname {\simpleiconsmap\symbol{"F48F}} + \expandafter\def\csname simpleicon@sunoicon\endcsname {\simpleiconsmap\symbol{"F490}} + \expandafter\def\csname simpleicon@sunriseicon\endcsname {\simpleiconsmap\symbol{"F491}} + \expandafter\def\csname simpleicon@supabaseicon\endcsname {\simpleiconsmap\symbol{"F492}} + \expandafter\def\csname simpleicon@supercreaseicon\endcsname {\simpleiconsmap\symbol{"F493}} + \expandafter\def\csname simpleicon@supermicroicon\endcsname {\simpleiconsmap\symbol{"F494}} + \expandafter\def\csname simpleicon@superusericon\endcsname {\simpleiconsmap\symbol{"F495}} + \expandafter\def\csname simpleicon@surrealdbicon\endcsname {\simpleiconsmap\symbol{"F496}} + \expandafter\def\csname simpleicon@surveymonkeyicon\endcsname {\simpleiconsmap\symbol{"F497}} + \expandafter\def\csname simpleicon@suseicon\endcsname {\simpleiconsmap\symbol{"F498}} + \expandafter\def\csname simpleicon@suzukiicon\endcsname {\simpleiconsmap\symbol{"F499}} + \expandafter\def\csname simpleicon@svelteicon\endcsname {\simpleiconsmap\symbol{"F49A}} + \expandafter\def\csname simpleicon@svgicon\endcsname {\simpleiconsmap\symbol{"F49B}} + \expandafter\def\csname simpleicon@svgdotjsicon\endcsname {\simpleiconsmap\symbol{"F49C}} + \expandafter\def\csname simpleicon@svgoicon\endcsname {\simpleiconsmap\symbol{"F49D}} + \expandafter\def\csname simpleicon@svgtraceicon\endcsname {\simpleiconsmap\symbol{"F49E}} + \expandafter\def\csname simpleicon@swaggericon\endcsname {\simpleiconsmap\symbol{"F49F}} + \expandafter\def\csname simpleicon@swarmicon\endcsname {\simpleiconsmap\symbol{"F4A0}} + \expandafter\def\csname simpleicon@swayicon\endcsname {\simpleiconsmap\symbol{"F4A1}} + \expandafter\def\csname simpleicon@swcicon\endcsname {\simpleiconsmap\symbol{"F4A2}} + \expandafter\def\csname simpleicon@swifticon\endcsname {\simpleiconsmap\symbol{"F4A3}} + \expandafter\def\csname simpleicon@swiggyicon\endcsname {\simpleiconsmap\symbol{"F4A4}} + \expandafter\def\csname simpleicon@swipericon\endcsname {\simpleiconsmap\symbol{"F4A5}} + \expandafter\def\csname simpleicon@swricon\endcsname {\simpleiconsmap\symbol{"F4A6}} + \expandafter\def\csname simpleicon@symantecicon\endcsname {\simpleiconsmap\symbol{"F4A7}} + \expandafter\def\csname simpleicon@symbolabicon\endcsname {\simpleiconsmap\symbol{"F4A8}} + \expandafter\def\csname simpleicon@symfonyicon\endcsname {\simpleiconsmap\symbol{"F4A9}} + \expandafter\def\csname simpleicon@symphonyicon\endcsname {\simpleiconsmap\symbol{"F4AA}} + \expandafter\def\csname simpleicon@sympyicon\endcsname {\simpleiconsmap\symbol{"F4AB}} + \expandafter\def\csname simpleicon@syncthingicon\endcsname {\simpleiconsmap\symbol{"F4AC}} + \expandafter\def\csname simpleicon@synologyicon\endcsname {\simpleiconsmap\symbol{"F4AD}} + \expandafter\def\csname simpleicon@system76icon\endcsname {\simpleiconsmap\symbol{"F4AE}} + \expandafter\def\csname simpleicon@tabelogicon\endcsname {\simpleiconsmap\symbol{"F4AF}} + \expandafter\def\csname simpleicon@tableauicon\endcsname {\simpleiconsmap\symbol{"F4B0}} + \expandafter\def\csname simpleicon@tablecheckicon\endcsname {\simpleiconsmap\symbol{"F4B1}} + \expandafter\def\csname simpleicon@tacobellicon\endcsname {\simpleiconsmap\symbol{"F4B2}} + \expandafter\def\csname simpleicon@tadoicon\endcsname {\simpleiconsmap\symbol{"F4B3}} + \expandafter\def\csname simpleicon@taichigraphicsicon\endcsname {\simpleiconsmap\symbol{"F4B4}} + \expandafter\def\csname simpleicon@taichilangicon\endcsname {\simpleiconsmap\symbol{"F4B5}} + \expandafter\def\csname simpleicon@tailsicon\endcsname {\simpleiconsmap\symbol{"F4B6}} + \expandafter\def\csname simpleicon@tailscaleicon\endcsname {\simpleiconsmap\symbol{"F4B7}} + \expandafter\def\csname simpleicon@tailwindcssicon\endcsname {\simpleiconsmap\symbol{"F4B8}} + \expandafter\def\csname simpleicon@taipyicon\endcsname {\simpleiconsmap\symbol{"F4B9}} + \expandafter\def\csname simpleicon@taketwointeractivesoftwareicon\endcsname {\simpleiconsmap\symbol{"F4BA}} + \expandafter\def\csname simpleicon@talendicon\endcsname {\simpleiconsmap\symbol{"F4BB}} + \expandafter\def\csname simpleicon@talenthouseicon\endcsname {\simpleiconsmap\symbol{"F4BC}} + \expandafter\def\csname simpleicon@talosicon\endcsname {\simpleiconsmap\symbol{"F4BD}} + \expandafter\def\csname simpleicon@tamiyaicon\endcsname {\simpleiconsmap\symbol{"F4BE}} + \expandafter\def\csname simpleicon@tampermonkeyicon\endcsname {\simpleiconsmap\symbol{"F4BF}} + \expandafter\def\csname simpleicon@taobaoicon\endcsname {\simpleiconsmap\symbol{"F4C0}} + \expandafter\def\csname simpleicon@tapasicon\endcsname {\simpleiconsmap\symbol{"F4C1}} + \expandafter\def\csname simpleicon@targeticon\endcsname {\simpleiconsmap\symbol{"F4C2}} + \expandafter\def\csname simpleicon@taromicon\endcsname {\simpleiconsmap\symbol{"F4C3}} + \expandafter\def\csname simpleicon@taskicon\endcsname {\simpleiconsmap\symbol{"F4C4}} + \expandafter\def\csname simpleicon@tasmotaicon\endcsname {\simpleiconsmap\symbol{"F4C5}} + \expandafter\def\csname simpleicon@tataicon\endcsname {\simpleiconsmap\symbol{"F4C6}} + \expandafter\def\csname simpleicon@tauriicon\endcsname {\simpleiconsmap\symbol{"F4C7}} + \expandafter\def\csname simpleicon@taxbuzzicon\endcsname {\simpleiconsmap\symbol{"F4C8}} + \expandafter\def\csname simpleicon@tcsicon\endcsname {\simpleiconsmap\symbol{"F4C9}} + \expandafter\def\csname simpleicon@tealicon\endcsname {\simpleiconsmap\symbol{"F4CA}} + \expandafter\def\csname simpleicon@teamcityicon\endcsname {\simpleiconsmap\symbol{"F4CB}} + \expandafter\def\csname simpleicon@teamspeakicon\endcsname {\simpleiconsmap\symbol{"F4CC}} + \expandafter\def\csname simpleicon@teamviewericon\endcsname {\simpleiconsmap\symbol{"F4CD}} + \expandafter\def\csname simpleicon@techcrunchicon\endcsname {\simpleiconsmap\symbol{"F4CE}} + \expandafter\def\csname simpleicon@tedicon\endcsname {\simpleiconsmap\symbol{"F4CF}} + \expandafter\def\csname simpleicon@teepublicicon\endcsname {\simpleiconsmap\symbol{"F4D0}} + \expandafter\def\csname simpleicon@teespringicon\endcsname {\simpleiconsmap\symbol{"F4D1}} + \expandafter\def\csname simpleicon@tektonicon\endcsname {\simpleiconsmap\symbol{"F4D2}} + \expandafter\def\csname simpleicon@tele5icon\endcsname {\simpleiconsmap\symbol{"F4D3}} + \expandafter\def\csname simpleicon@telegramicon\endcsname {\simpleiconsmap\symbol{"F4D4}} + \expandafter\def\csname simpleicon@telegraphicon\endcsname {\simpleiconsmap\symbol{"F4D5}} + \expandafter\def\csname simpleicon@telequebecicon\endcsname {\simpleiconsmap\symbol{"F4D6}} + \expandafter\def\csname simpleicon@temporalicon\endcsname {\simpleiconsmap\symbol{"F4D7}} + \expandafter\def\csname simpleicon@tencentqqicon\endcsname {\simpleiconsmap\symbol{"F4D8}} + \expandafter\def\csname simpleicon@tensorflowicon\endcsname {\simpleiconsmap\symbol{"F4D9}} + \expandafter\def\csname simpleicon@teradataicon\endcsname {\simpleiconsmap\symbol{"F4DA}} + \expandafter\def\csname simpleicon@teratailicon\endcsname {\simpleiconsmap\symbol{"F4DB}} + \expandafter\def\csname simpleicon@termiusicon\endcsname {\simpleiconsmap\symbol{"F4DC}} + \expandafter\def\csname simpleicon@terraformicon\endcsname {\simpleiconsmap\symbol{"F4DD}} + \expandafter\def\csname simpleicon@tescoicon\endcsname {\simpleiconsmap\symbol{"F4DE}} + \expandafter\def\csname simpleicon@teslaicon\endcsname {\simpleiconsmap\symbol{"F4DF}} + \expandafter\def\csname simpleicon@testcafeicon\endcsname {\simpleiconsmap\symbol{"F4E0}} + \expandafter\def\csname simpleicon@testinicon\endcsname {\simpleiconsmap\symbol{"F4E1}} + \expandafter\def\csname simpleicon@testinglibraryicon\endcsname {\simpleiconsmap\symbol{"F4E2}} + \expandafter\def\csname simpleicon@testrailicon\endcsname {\simpleiconsmap\symbol{"F4E3}} + \expandafter\def\csname simpleicon@tethericon\endcsname {\simpleiconsmap\symbol{"F4E4}} + \expandafter\def\csname simpleicon@textpatternicon\endcsname {\simpleiconsmap\symbol{"F4E5}} + \expandafter\def\csname simpleicon@tgaicon\endcsname {\simpleiconsmap\symbol{"F4E6}} + \expandafter\def\csname simpleicon@thangsicon\endcsname {\simpleiconsmap\symbol{"F4E7}} + \expandafter\def\csname simpleicon@thanosicon\endcsname {\simpleiconsmap\symbol{"F4E8}} + \expandafter\def\csname simpleicon@thealgorithmsicon\endcsname {\simpleiconsmap\symbol{"F4E9}} + \expandafter\def\csname simpleicon@theboringcompanyicon\endcsname {\simpleiconsmap\symbol{"F4EA}} + \expandafter\def\csname simpleicon@theconversationicon\endcsname {\simpleiconsmap\symbol{"F4EB}} + \expandafter\def\csname simpleicon@thefinalsicon\endcsname {\simpleiconsmap\symbol{"F4EC}} + \expandafter\def\csname simpleicon@theguardianicon\endcsname {\simpleiconsmap\symbol{"F4ED}} + \expandafter\def\csname simpleicon@theirishtimesicon\endcsname {\simpleiconsmap\symbol{"F4EE}} + \expandafter\def\csname simpleicon@themightyicon\endcsname {\simpleiconsmap\symbol{"F4EF}} + \expandafter\def\csname simpleicon@themodelsresourceicon\endcsname {\simpleiconsmap\symbol{"F4F0}} + \expandafter\def\csname simpleicon@themoviedatabaseicon\endcsname {\simpleiconsmap\symbol{"F4F1}} + \expandafter\def\csname simpleicon@thenorthfaceicon\endcsname {\simpleiconsmap\symbol{"F4F2}} + \expandafter\def\csname simpleicon@theodinprojecticon\endcsname {\simpleiconsmap\symbol{"F4F3}} + \expandafter\def\csname simpleicon@theregistericon\endcsname {\simpleiconsmap\symbol{"F4F4}} + \expandafter\def\csname simpleicon@thesoundsresourceicon\endcsname {\simpleiconsmap\symbol{"F4F5}} + \expandafter\def\csname simpleicon@thespritersresourceicon\endcsname {\simpleiconsmap\symbol{"F4F6}} + \expandafter\def\csname simpleicon@thewashingtonposticon\endcsname {\simpleiconsmap\symbol{"F4F7}} + \expandafter\def\csname simpleicon@theweatherchannelicon\endcsname {\simpleiconsmap\symbol{"F4F8}} + \expandafter\def\csname simpleicon@thingiverseicon\endcsname {\simpleiconsmap\symbol{"F4F9}} + \expandafter\def\csname simpleicon@thinkpadicon\endcsname {\simpleiconsmap\symbol{"F4FA}} + \expandafter\def\csname simpleicon@thirdwebicon\endcsname {\simpleiconsmap\symbol{"F4FB}} + \expandafter\def\csname simpleicon@threadlessicon\endcsname {\simpleiconsmap\symbol{"F4FC}} + \expandafter\def\csname simpleicon@threadsicon\endcsname {\simpleiconsmap\symbol{"F4FD}} + \expandafter\def\csname simpleicon@threedotjsicon\endcsname {\simpleiconsmap\symbol{"F4FE}} + \expandafter\def\csname simpleicon@threemaicon\endcsname {\simpleiconsmap\symbol{"F4FF}} + \expandafter\def\csname simpleicon@thumbtackicon\endcsname {\simpleiconsmap\symbol{"F500}} + \expandafter\def\csname simpleicon@thunderbirdicon\endcsname {\simpleiconsmap\symbol{"F501}} + \expandafter\def\csname simpleicon@thunderstoreicon\endcsname {\simpleiconsmap\symbol{"F502}} + \expandafter\def\csname simpleicon@thurgauerkantonalbankicon\endcsname {\simpleiconsmap\symbol{"F503}} + \expandafter\def\csname simpleicon@thymeleaficon\endcsname {\simpleiconsmap\symbol{"F504}} + \expandafter\def\csname simpleicon@ticketmastericon\endcsname {\simpleiconsmap\symbol{"F505}} + \expandafter\def\csname simpleicon@ticktickicon\endcsname {\simpleiconsmap\symbol{"F506}} + \expandafter\def\csname simpleicon@tidalicon\endcsname {\simpleiconsmap\symbol{"F507}} + \expandafter\def\csname simpleicon@tiddlywikiicon\endcsname {\simpleiconsmap\symbol{"F508}} + \expandafter\def\csname simpleicon@tideicon\endcsname {\simpleiconsmap\symbol{"F509}} + \expandafter\def\csname simpleicon@tidyverseicon\endcsname {\simpleiconsmap\symbol{"F50A}} + \expandafter\def\csname simpleicon@tietoevryicon\endcsname {\simpleiconsmap\symbol{"F50B}} + \expandafter\def\csname simpleicon@tiktokicon\endcsname {\simpleiconsmap\symbol{"F50C}} + \expandafter\def\csname simpleicon@tildapublishingicon\endcsname {\simpleiconsmap\symbol{"F50D}} + \expandafter\def\csname simpleicon@tileicon\endcsname {\simpleiconsmap\symbol{"F50E}} + \expandafter\def\csname simpleicon@timescaleicon\endcsname {\simpleiconsmap\symbol{"F50F}} + \expandafter\def\csname simpleicon@tinaicon\endcsname {\simpleiconsmap\symbol{"F510}} + \expandafter\def\csname simpleicon@tindericon\endcsname {\simpleiconsmap\symbol{"F511}} + \expandafter\def\csname simpleicon@tindieicon\endcsname {\simpleiconsmap\symbol{"F512}} + \expandafter\def\csname simpleicon@tinkercadicon\endcsname {\simpleiconsmap\symbol{"F513}} + \expandafter\def\csname simpleicon@tinygradicon\endcsname {\simpleiconsmap\symbol{"F514}} + \expandafter\def\csname simpleicon@tinylettericon\endcsname {\simpleiconsmap\symbol{"F515}} + \expandafter\def\csname simpleicon@tistoryicon\endcsname {\simpleiconsmap\symbol{"F516}} + \expandafter\def\csname simpleicon@tldrawicon\endcsname {\simpleiconsmap\symbol{"F517}} + \expandafter\def\csname simpleicon@tmobileicon\endcsname {\simpleiconsmap\symbol{"F518}} + \expandafter\def\csname simpleicon@tmuxicon\endcsname {\simpleiconsmap\symbol{"F519}} + \expandafter\def\csname simpleicon@todoisticon\endcsname {\simpleiconsmap\symbol{"F51A}} + \expandafter\def\csname simpleicon@togglicon\endcsname {\simpleiconsmap\symbol{"F51B}} + \expandafter\def\csname simpleicon@toggltrackicon\endcsname {\simpleiconsmap\symbol{"F51C}} + \expandafter\def\csname simpleicon@tokyometroicon\endcsname {\simpleiconsmap\symbol{"F51D}} + \expandafter\def\csname simpleicon@tollicon\endcsname {\simpleiconsmap\symbol{"F51E}} + \expandafter\def\csname simpleicon@tomlicon\endcsname {\simpleiconsmap\symbol{"F51F}} + \expandafter\def\csname simpleicon@tomorrowlandicon\endcsname {\simpleiconsmap\symbol{"F520}} + \expandafter\def\csname simpleicon@tonicon\endcsname {\simpleiconsmap\symbol{"F521}} + \expandafter\def\csname simpleicon@topcodericon\endcsname {\simpleiconsmap\symbol{"F522}} + \expandafter\def\csname simpleicon@topdotggicon\endcsname {\simpleiconsmap\symbol{"F523}} + \expandafter\def\csname simpleicon@toptalicon\endcsname {\simpleiconsmap\symbol{"F524}} + \expandafter\def\csname simpleicon@torbrowsericon\endcsname {\simpleiconsmap\symbol{"F525}} + \expandafter\def\csname simpleicon@torprojecticon\endcsname {\simpleiconsmap\symbol{"F526}} + \expandafter\def\csname simpleicon@toshibaicon\endcsname {\simpleiconsmap\symbol{"F527}} + \expandafter\def\csname simpleicon@totvsicon\endcsname {\simpleiconsmap\symbol{"F528}} + \expandafter\def\csname simpleicon@tourboxicon\endcsname {\simpleiconsmap\symbol{"F529}} + \expandafter\def\csname simpleicon@towericon\endcsname {\simpleiconsmap\symbol{"F52A}} + \expandafter\def\csname simpleicon@toyotaicon\endcsname {\simpleiconsmap\symbol{"F52B}} + \expandafter\def\csname simpleicon@tplinkicon\endcsname {\simpleiconsmap\symbol{"F52C}} + \expandafter\def\csname simpleicon@tqdmicon\endcsname {\simpleiconsmap\symbol{"F52D}} + \expandafter\def\csname simpleicon@traccaricon\endcsname {\simpleiconsmap\symbol{"F52E}} + \expandafter\def\csname simpleicon@tradingviewicon\endcsname {\simpleiconsmap\symbol{"F52F}} + \expandafter\def\csname simpleicon@traefikmeshicon\endcsname {\simpleiconsmap\symbol{"F530}} + \expandafter\def\csname simpleicon@traefikproxyicon\endcsname {\simpleiconsmap\symbol{"F531}} + \expandafter\def\csname simpleicon@trailforksicon\endcsname {\simpleiconsmap\symbol{"F532}} + \expandafter\def\csname simpleicon@trainerroadicon\endcsname {\simpleiconsmap\symbol{"F533}} + \expandafter\def\csname simpleicon@trakticon\endcsname {\simpleiconsmap\symbol{"F534}} + \expandafter\def\csname simpleicon@transifexicon\endcsname {\simpleiconsmap\symbol{"F535}} + \expandafter\def\csname simpleicon@transmissionicon\endcsname {\simpleiconsmap\symbol{"F536}} + \expandafter\def\csname simpleicon@transportforirelandicon\endcsname {\simpleiconsmap\symbol{"F537}} + \expandafter\def\csname simpleicon@transportforlondonicon\endcsname {\simpleiconsmap\symbol{"F538}} + \expandafter\def\csname simpleicon@travisciicon\endcsname {\simpleiconsmap\symbol{"F539}} + \expandafter\def\csname simpleicon@treehouseicon\endcsname {\simpleiconsmap\symbol{"F53A}} + \expandafter\def\csname simpleicon@trelloicon\endcsname {\simpleiconsmap\symbol{"F53B}} + \expandafter\def\csname simpleicon@trendmicroicon\endcsname {\simpleiconsmap\symbol{"F53C}} + \expandafter\def\csname simpleicon@treyarchicon\endcsname {\simpleiconsmap\symbol{"F53D}} + \expandafter\def\csname simpleicon@tricentisicon\endcsname {\simpleiconsmap\symbol{"F53E}} + \expandafter\def\csname simpleicon@triliumicon\endcsname {\simpleiconsmap\symbol{"F53F}} + \expandafter\def\csname simpleicon@trillericon\endcsname {\simpleiconsmap\symbol{"F540}} + \expandafter\def\csname simpleicon@trillertvicon\endcsname {\simpleiconsmap\symbol{"F541}} + \expandafter\def\csname simpleicon@trinoicon\endcsname {\simpleiconsmap\symbol{"F542}} + \expandafter\def\csname simpleicon@tripadvisoricon\endcsname {\simpleiconsmap\symbol{"F543}} + \expandafter\def\csname simpleicon@tripdotcomicon\endcsname {\simpleiconsmap\symbol{"F544}} + \expandafter\def\csname simpleicon@trivagoicon\endcsname {\simpleiconsmap\symbol{"F545}} + \expandafter\def\csname simpleicon@trivyicon\endcsname {\simpleiconsmap\symbol{"F546}} + \expandafter\def\csname simpleicon@troveicon\endcsname {\simpleiconsmap\symbol{"F547}} + \expandafter\def\csname simpleicon@trpcicon\endcsname {\simpleiconsmap\symbol{"F548}} + \expandafter\def\csname simpleicon@truenasicon\endcsname {\simpleiconsmap\symbol{"F549}} + \expandafter\def\csname simpleicon@trueupicon\endcsname {\simpleiconsmap\symbol{"F54A}} + \expandafter\def\csname simpleicon@truliaicon\endcsname {\simpleiconsmap\symbol{"F54B}} + \expandafter\def\csname simpleicon@trustedshopsicon\endcsname {\simpleiconsmap\symbol{"F54C}} + \expandafter\def\csname simpleicon@trustpiloticon\endcsname {\simpleiconsmap\symbol{"F54D}} + \expandafter\def\csname simpleicon@tryhackmeicon\endcsname {\simpleiconsmap\symbol{"F54E}} + \expandafter\def\csname simpleicon@tryitonlineicon\endcsname {\simpleiconsmap\symbol{"F54F}} + \expandafter\def\csname simpleicon@tsnodeicon\endcsname {\simpleiconsmap\symbol{"F550}} + \expandafter\def\csname simpleicon@tubiicon\endcsname {\simpleiconsmap\symbol{"F551}} + \expandafter\def\csname simpleicon@tuiicon\endcsname {\simpleiconsmap\symbol{"F552}} + \expandafter\def\csname simpleicon@tumblricon\endcsname {\simpleiconsmap\symbol{"F553}} + \expandafter\def\csname simpleicon@tuneinicon\endcsname {\simpleiconsmap\symbol{"F554}} + \expandafter\def\csname simpleicon@turboicon\endcsname {\simpleiconsmap\symbol{"F555}} + \expandafter\def\csname simpleicon@turborepoicon\endcsname {\simpleiconsmap\symbol{"F556}} + \expandafter\def\csname simpleicon@turbosquidicon\endcsname {\simpleiconsmap\symbol{"F557}} + \expandafter\def\csname simpleicon@turkishairlinesicon\endcsname {\simpleiconsmap\symbol{"F558}} + \expandafter\def\csname simpleicon@tursoicon\endcsname {\simpleiconsmap\symbol{"F559}} + \expandafter\def\csname simpleicon@tutanotaicon\endcsname {\simpleiconsmap\symbol{"F55A}} + \expandafter\def\csname simpleicon@tv4playicon\endcsname {\simpleiconsmap\symbol{"F55B}} + \expandafter\def\csname simpleicon@tvtimeicon\endcsname {\simpleiconsmap\symbol{"F55C}} + \expandafter\def\csname simpleicon@twilioicon\endcsname {\simpleiconsmap\symbol{"F55D}} + \expandafter\def\csname simpleicon@twinklyicon\endcsname {\simpleiconsmap\symbol{"F55E}} + \expandafter\def\csname simpleicon@twinmotionicon\endcsname {\simpleiconsmap\symbol{"F55F}} + \expandafter\def\csname simpleicon@twitchicon\endcsname {\simpleiconsmap\symbol{"F560}} + \expandafter\def\csname simpleicon@typeformicon\endcsname {\simpleiconsmap\symbol{"F561}} + \expandafter\def\csname simpleicon@typeormicon\endcsname {\simpleiconsmap\symbol{"F562}} + \expandafter\def\csname simpleicon@typericon\endcsname {\simpleiconsmap\symbol{"F563}} + \expandafter\def\csname simpleicon@typescripticon\endcsname {\simpleiconsmap\symbol{"F564}} + \expandafter\def\csname simpleicon@typo3icon\endcsname {\simpleiconsmap\symbol{"F565}} + \expandafter\def\csname simpleicon@typsticon\endcsname {\simpleiconsmap\symbol{"F566}} + \expandafter\def\csname simpleicon@ubericon\endcsname {\simpleiconsmap\symbol{"F567}} + \expandafter\def\csname simpleicon@ubereatsicon\endcsname {\simpleiconsmap\symbol{"F568}} + \expandafter\def\csname simpleicon@ubiquitiicon\endcsname {\simpleiconsmap\symbol{"F569}} + \expandafter\def\csname simpleicon@ubisofticon\endcsname {\simpleiconsmap\symbol{"F56A}} + \expandafter\def\csname simpleicon@ublockoriginicon\endcsname {\simpleiconsmap\symbol{"F56B}} + \expandafter\def\csname simpleicon@ubuntuicon\endcsname {\simpleiconsmap\symbol{"F56C}} + \expandafter\def\csname simpleicon@ubuntumateicon\endcsname {\simpleiconsmap\symbol{"F56D}} + \expandafter\def\csname simpleicon@udacityicon\endcsname {\simpleiconsmap\symbol{"F56E}} + \expandafter\def\csname simpleicon@udemyicon\endcsname {\simpleiconsmap\symbol{"F56F}} + \expandafter\def\csname simpleicon@ufcicon\endcsname {\simpleiconsmap\symbol{"F570}} + \expandafter\def\csname simpleicon@uikiticon\endcsname {\simpleiconsmap\symbol{"F571}} + \expandafter\def\csname simpleicon@uipathicon\endcsname {\simpleiconsmap\symbol{"F572}} + \expandafter\def\csname simpleicon@ululeicon\endcsname {\simpleiconsmap\symbol{"F573}} + \expandafter\def\csname simpleicon@umamiicon\endcsname {\simpleiconsmap\symbol{"F574}} + \expandafter\def\csname simpleicon@umbracoicon\endcsname {\simpleiconsmap\symbol{"F575}} + \expandafter\def\csname simpleicon@umlicon\endcsname {\simpleiconsmap\symbol{"F576}} + \expandafter\def\csname simpleicon@unacademyicon\endcsname {\simpleiconsmap\symbol{"F577}} + \expandafter\def\csname simpleicon@underarmouricon\endcsname {\simpleiconsmap\symbol{"F578}} + \expandafter\def\csname simpleicon@underscoredotjsicon\endcsname {\simpleiconsmap\symbol{"F579}} + \expandafter\def\csname simpleicon@undertaleicon\endcsname {\simpleiconsmap\symbol{"F57A}} + \expandafter\def\csname simpleicon@unicodeicon\endcsname {\simpleiconsmap\symbol{"F57B}} + \expandafter\def\csname simpleicon@unilevericon\endcsname {\simpleiconsmap\symbol{"F57C}} + \expandafter\def\csname simpleicon@uniqloicon\endcsname {\simpleiconsmap\symbol{"F57D}} + \expandafter\def\csname simpleicon@uniqlojaicon\endcsname {\simpleiconsmap\symbol{"F57E}} + \expandafter\def\csname simpleicon@unitedairlinesicon\endcsname {\simpleiconsmap\symbol{"F57F}} + \expandafter\def\csname simpleicon@unitednationsicon\endcsname {\simpleiconsmap\symbol{"F580}} + \expandafter\def\csname simpleicon@unityicon\endcsname {\simpleiconsmap\symbol{"F581}} + \expandafter\def\csname simpleicon@unjsicon\endcsname {\simpleiconsmap\symbol{"F582}} + \expandafter\def\csname simpleicon@unlicenseicon\endcsname {\simpleiconsmap\symbol{"F583}} + \expandafter\def\csname simpleicon@unocssicon\endcsname {\simpleiconsmap\symbol{"F584}} + \expandafter\def\csname simpleicon@unpkgicon\endcsname {\simpleiconsmap\symbol{"F585}} + \expandafter\def\csname simpleicon@unraidicon\endcsname {\simpleiconsmap\symbol{"F586}} + \expandafter\def\csname simpleicon@unrealengineicon\endcsname {\simpleiconsmap\symbol{"F587}} + \expandafter\def\csname simpleicon@unsplashicon\endcsname {\simpleiconsmap\symbol{"F588}} + \expandafter\def\csname simpleicon@untappdicon\endcsname {\simpleiconsmap\symbol{"F589}} + \expandafter\def\csname simpleicon@upcloudicon\endcsname {\simpleiconsmap\symbol{"F58A}} + \expandafter\def\csname simpleicon@upholdicon\endcsname {\simpleiconsmap\symbol{"F58B}} + \expandafter\def\csname simpleicon@uplabsicon\endcsname {\simpleiconsmap\symbol{"F58C}} + \expandafter\def\csname simpleicon@upptimeicon\endcsname {\simpleiconsmap\symbol{"F58D}} + \expandafter\def\csname simpleicon@upsicon\endcsname {\simpleiconsmap\symbol{"F58E}} + \expandafter\def\csname simpleicon@upstashicon\endcsname {\simpleiconsmap\symbol{"F58F}} + \expandafter\def\csname simpleicon@uptimekumaicon\endcsname {\simpleiconsmap\symbol{"F590}} + \expandafter\def\csname simpleicon@uptoboxicon\endcsname {\simpleiconsmap\symbol{"F591}} + \expandafter\def\csname simpleicon@upworkicon\endcsname {\simpleiconsmap\symbol{"F592}} + \expandafter\def\csname simpleicon@uspsicon\endcsname {\simpleiconsmap\symbol{"F593}} + \expandafter\def\csname simpleicon@utorrenticon\endcsname {\simpleiconsmap\symbol{"F594}} + \expandafter\def\csname simpleicon@vicon\endcsname {\simpleiconsmap\symbol{"F595}} + \expandafter\def\csname simpleicon@v2exicon\endcsname {\simpleiconsmap\symbol{"F596}} + \expandafter\def\csname simpleicon@v8icon\endcsname {\simpleiconsmap\symbol{"F597}} + \expandafter\def\csname simpleicon@vaadinicon\endcsname {\simpleiconsmap\symbol{"F598}} + \expandafter\def\csname simpleicon@vagranticon\endcsname {\simpleiconsmap\symbol{"F599}} + \expandafter\def\csname simpleicon@valaicon\endcsname {\simpleiconsmap\symbol{"F59A}} + \expandafter\def\csname simpleicon@valoranticon\endcsname {\simpleiconsmap\symbol{"F59B}} + \expandafter\def\csname simpleicon@valveicon\endcsname {\simpleiconsmap\symbol{"F59C}} + \expandafter\def\csname simpleicon@vaporicon\endcsname {\simpleiconsmap\symbol{"F59D}} + \expandafter\def\csname simpleicon@vaulticon\endcsname {\simpleiconsmap\symbol{"F59E}} + \expandafter\def\csname simpleicon@vaultwardenicon\endcsname {\simpleiconsmap\symbol{"F59F}} + \expandafter\def\csname simpleicon@vauxhallicon\endcsname {\simpleiconsmap\symbol{"F5A0}} + \expandafter\def\csname simpleicon@vbulletinicon\endcsname {\simpleiconsmap\symbol{"F5A1}} + \expandafter\def\csname simpleicon@vectaryicon\endcsname {\simpleiconsmap\symbol{"F5A2}} + \expandafter\def\csname simpleicon@vectorlogozoneicon\endcsname {\simpleiconsmap\symbol{"F5A3}} + \expandafter\def\csname simpleicon@vectorworksicon\endcsname {\simpleiconsmap\symbol{"F5A4}} + \expandafter\def\csname simpleicon@veeamicon\endcsname {\simpleiconsmap\symbol{"F5A5}} + \expandafter\def\csname simpleicon@veedicon\endcsname {\simpleiconsmap\symbol{"F5A6}} + \expandafter\def\csname simpleicon@veepeeicon\endcsname {\simpleiconsmap\symbol{"F5A7}} + \expandafter\def\csname simpleicon@vegaicon\endcsname {\simpleiconsmap\symbol{"F5A8}} + \expandafter\def\csname simpleicon@vegasicon\endcsname {\simpleiconsmap\symbol{"F5A9}} + \expandafter\def\csname simpleicon@velogicon\endcsname {\simpleiconsmap\symbol{"F5AA}} + \expandafter\def\csname simpleicon@venmoicon\endcsname {\simpleiconsmap\symbol{"F5AB}} + \expandafter\def\csname simpleicon@vercelicon\endcsname {\simpleiconsmap\symbol{"F5AC}} + \expandafter\def\csname simpleicon@verdaccioicon\endcsname {\simpleiconsmap\symbol{"F5AD}} + \expandafter\def\csname simpleicon@veritasicon\endcsname {\simpleiconsmap\symbol{"F5AE}} + \expandafter\def\csname simpleicon@verizonicon\endcsname {\simpleiconsmap\symbol{"F5AF}} + \expandafter\def\csname simpleicon@vespaicon\endcsname {\simpleiconsmap\symbol{"F5B0}} + \expandafter\def\csname simpleicon@vestelicon\endcsname {\simpleiconsmap\symbol{"F5B1}} + \expandafter\def\csname simpleicon@vexxhosticon\endcsname {\simpleiconsmap\symbol{"F5B2}} + \expandafter\def\csname simpleicon@vfairsicon\endcsname {\simpleiconsmap\symbol{"F5B3}} + \expandafter\def\csname simpleicon@viadeoicon\endcsname {\simpleiconsmap\symbol{"F5B4}} + \expandafter\def\csname simpleicon@viaplayicon\endcsname {\simpleiconsmap\symbol{"F5B5}} + \expandafter\def\csname simpleicon@vibericon\endcsname {\simpleiconsmap\symbol{"F5B6}} + \expandafter\def\csname simpleicon@vibloicon\endcsname {\simpleiconsmap\symbol{"F5B7}} + \expandafter\def\csname simpleicon@victoriametricsicon\endcsname {\simpleiconsmap\symbol{"F5B8}} + \expandafter\def\csname simpleicon@victronenergyicon\endcsname {\simpleiconsmap\symbol{"F5B9}} + \expandafter\def\csname simpleicon@vimicon\endcsname {\simpleiconsmap\symbol{"F5BA}} + \expandafter\def\csname simpleicon@vimeoicon\endcsname {\simpleiconsmap\symbol{"F5BB}} + \expandafter\def\csname simpleicon@vimeolivestreamicon\endcsname {\simpleiconsmap\symbol{"F5BC}} + \expandafter\def\csname simpleicon@virginicon\endcsname {\simpleiconsmap\symbol{"F5BD}} + \expandafter\def\csname simpleicon@virginatlanticicon\endcsname {\simpleiconsmap\symbol{"F5BE}} + \expandafter\def\csname simpleicon@virginmediaicon\endcsname {\simpleiconsmap\symbol{"F5BF}} + \expandafter\def\csname simpleicon@virtualboxicon\endcsname {\simpleiconsmap\symbol{"F5C0}} + \expandafter\def\csname simpleicon@virustotalicon\endcsname {\simpleiconsmap\symbol{"F5C1}} + \expandafter\def\csname simpleicon@visaicon\endcsname {\simpleiconsmap\symbol{"F5C2}} + \expandafter\def\csname simpleicon@visxicon\endcsname {\simpleiconsmap\symbol{"F5C3}} + \expandafter\def\csname simpleicon@viteicon\endcsname {\simpleiconsmap\symbol{"F5C4}} + \expandafter\def\csname simpleicon@vitepressicon\endcsname {\simpleiconsmap\symbol{"F5C5}} + \expandafter\def\csname simpleicon@vitessicon\endcsname {\simpleiconsmap\symbol{"F5C6}} + \expandafter\def\csname simpleicon@vitesticon\endcsname {\simpleiconsmap\symbol{"F5C7}} + \expandafter\def\csname simpleicon@vivaldiicon\endcsname {\simpleiconsmap\symbol{"F5C8}} + \expandafter\def\csname simpleicon@vivawalleticon\endcsname {\simpleiconsmap\symbol{"F5C9}} + \expandafter\def\csname simpleicon@vivinoicon\endcsname {\simpleiconsmap\symbol{"F5CA}} + \expandafter\def\csname simpleicon@vivinticon\endcsname {\simpleiconsmap\symbol{"F5CB}} + \expandafter\def\csname simpleicon@vivoicon\endcsname {\simpleiconsmap\symbol{"F5CC}} + \expandafter\def\csname simpleicon@vkicon\endcsname {\simpleiconsmap\symbol{"F5CD}} + \expandafter\def\csname simpleicon@vlcmediaplayericon\endcsname {\simpleiconsmap\symbol{"F5CE}} + \expandafter\def\csname simpleicon@vmwareicon\endcsname {\simpleiconsmap\symbol{"F5CF}} + \expandafter\def\csname simpleicon@vodafoneicon\endcsname {\simpleiconsmap\symbol{"F5D0}} + \expandafter\def\csname simpleicon@voidlinuxicon\endcsname {\simpleiconsmap\symbol{"F5D1}} + \expandafter\def\csname simpleicon@voipdotmsicon\endcsname {\simpleiconsmap\symbol{"F5D2}} + \expandafter\def\csname simpleicon@volkswagenicon\endcsname {\simpleiconsmap\symbol{"F5D3}} + \expandafter\def\csname simpleicon@volvoicon\endcsname {\simpleiconsmap\symbol{"F5D4}} + \expandafter\def\csname simpleicon@vonageicon\endcsname {\simpleiconsmap\symbol{"F5D5}} + \expandafter\def\csname simpleicon@vorondesignicon\endcsname {\simpleiconsmap\symbol{"F5D6}} + \expandafter\def\csname simpleicon@vowpalwabbiticon\endcsname {\simpleiconsmap\symbol{"F5D7}} + \expandafter\def\csname simpleicon@voxicon\endcsname {\simpleiconsmap\symbol{"F5D8}} + \expandafter\def\csname simpleicon@vrchaticon\endcsname {\simpleiconsmap\symbol{"F5D9}} + \expandafter\def\csname simpleicon@vscoicon\endcsname {\simpleiconsmap\symbol{"F5DA}} + \expandafter\def\csname simpleicon@vscodiumicon\endcsname {\simpleiconsmap\symbol{"F5DB}} + \expandafter\def\csname simpleicon@vtexicon\endcsname {\simpleiconsmap\symbol{"F5DC}} + \expandafter\def\csname simpleicon@vuedotjsicon\endcsname {\simpleiconsmap\symbol{"F5DD}} + \expandafter\def\csname simpleicon@vuetifyicon\endcsname {\simpleiconsmap\symbol{"F5DE}} + \expandafter\def\csname simpleicon@vulkanicon\endcsname {\simpleiconsmap\symbol{"F5DF}} + \expandafter\def\csname simpleicon@vultricon\endcsname {\simpleiconsmap\symbol{"F5E0}} + \expandafter\def\csname simpleicon@vyondicon\endcsname {\simpleiconsmap\symbol{"F5E1}} + \expandafter\def\csname simpleicon@w3schoolsicon\endcsname {\simpleiconsmap\symbol{"F5E2}} + \expandafter\def\csname simpleicon@wacomicon\endcsname {\simpleiconsmap\symbol{"F5E3}} + \expandafter\def\csname simpleicon@wagmiicon\endcsname {\simpleiconsmap\symbol{"F5E4}} + \expandafter\def\csname simpleicon@wagtailicon\endcsname {\simpleiconsmap\symbol{"F5E5}} + \expandafter\def\csname simpleicon@wailsicon\endcsname {\simpleiconsmap\symbol{"F5E6}} + \expandafter\def\csname simpleicon@wakatimeicon\endcsname {\simpleiconsmap\symbol{"F5E7}} + \expandafter\def\csname simpleicon@walkmanicon\endcsname {\simpleiconsmap\symbol{"F5E8}} + \expandafter\def\csname simpleicon@wallabagicon\endcsname {\simpleiconsmap\symbol{"F5E9}} + \expandafter\def\csname simpleicon@walletconnecticon\endcsname {\simpleiconsmap\symbol{"F5EA}} + \expandafter\def\csname simpleicon@walmarticon\endcsname {\simpleiconsmap\symbol{"F5EB}} + \expandafter\def\csname simpleicon@wantedlyicon\endcsname {\simpleiconsmap\symbol{"F5EC}} + \expandafter\def\csname simpleicon@wappalyzericon\endcsname {\simpleiconsmap\symbol{"F5ED}} + \expandafter\def\csname simpleicon@warnerbrosicon\endcsname {\simpleiconsmap\symbol{"F5EE}} + \expandafter\def\csname simpleicon@warpicon\endcsname {\simpleiconsmap\symbol{"F5EF}} + \expandafter\def\csname simpleicon@wasabiicon\endcsname {\simpleiconsmap\symbol{"F5F0}} + \expandafter\def\csname simpleicon@wasmcloudicon\endcsname {\simpleiconsmap\symbol{"F5F1}} + \expandafter\def\csname simpleicon@wasmericon\endcsname {\simpleiconsmap\symbol{"F5F2}} + \expandafter\def\csname simpleicon@watchtowericon\endcsname {\simpleiconsmap\symbol{"F5F3}} + \expandafter\def\csname simpleicon@wattpadicon\endcsname {\simpleiconsmap\symbol{"F5F4}} + \expandafter\def\csname simpleicon@waylandicon\endcsname {\simpleiconsmap\symbol{"F5F5}} + \expandafter\def\csname simpleicon@wazeicon\endcsname {\simpleiconsmap\symbol{"F5F6}} + \expandafter\def\csname simpleicon@wazirxicon\endcsname {\simpleiconsmap\symbol{"F5F7}} + \expandafter\def\csname simpleicon@wearosicon\endcsname {\simpleiconsmap\symbol{"F5F8}} + \expandafter\def\csname simpleicon@weasylicon\endcsname {\simpleiconsmap\symbol{"F5F9}} + \expandafter\def\csname simpleicon@web3dotjsicon\endcsname {\simpleiconsmap\symbol{"F5FA}} + \expandafter\def\csname simpleicon@webassemblyicon\endcsname {\simpleiconsmap\symbol{"F5FB}} + \expandafter\def\csname simpleicon@webauthnicon\endcsname {\simpleiconsmap\symbol{"F5FC}} + \expandafter\def\csname simpleicon@webcomponentsdotorgicon\endcsname {\simpleiconsmap\symbol{"F5FD}} + \expandafter\def\csname simpleicon@webdriverioicon\endcsname {\simpleiconsmap\symbol{"F5FE}} + \expandafter\def\csname simpleicon@webexicon\endcsname {\simpleiconsmap\symbol{"F5FF}} + \expandafter\def\csname simpleicon@webflowicon\endcsname {\simpleiconsmap\symbol{"F600}} + \expandafter\def\csname simpleicon@webglicon\endcsname {\simpleiconsmap\symbol{"F601}} + \expandafter\def\csname simpleicon@webgpuicon\endcsname {\simpleiconsmap\symbol{"F602}} + \expandafter\def\csname simpleicon@weblateicon\endcsname {\simpleiconsmap\symbol{"F603}} + \expandafter\def\csname simpleicon@webminicon\endcsname {\simpleiconsmap\symbol{"F604}} + \expandafter\def\csname simpleicon@webmoneyicon\endcsname {\simpleiconsmap\symbol{"F605}} + \expandafter\def\csname simpleicon@webpackicon\endcsname {\simpleiconsmap\symbol{"F606}} + \expandafter\def\csname simpleicon@webrtcicon\endcsname {\simpleiconsmap\symbol{"F607}} + \expandafter\def\csname simpleicon@webstormicon\endcsname {\simpleiconsmap\symbol{"F608}} + \expandafter\def\csname simpleicon@webtoonicon\endcsname {\simpleiconsmap\symbol{"F609}} + \expandafter\def\csname simpleicon@webtreesicon\endcsname {\simpleiconsmap\symbol{"F60A}} + \expandafter\def\csname simpleicon@wechaticon\endcsname {\simpleiconsmap\symbol{"F60B}} + \expandafter\def\csname simpleicon@wegameicon\endcsname {\simpleiconsmap\symbol{"F60C}} + \expandafter\def\csname simpleicon@weightsandbiasesicon\endcsname {\simpleiconsmap\symbol{"F60D}} + \expandafter\def\csname simpleicon@welcometothejungleicon\endcsname {\simpleiconsmap\symbol{"F60E}} + \expandafter\def\csname simpleicon@wellfoundicon\endcsname {\simpleiconsmap\symbol{"F60F}} + \expandafter\def\csname simpleicon@wellsfargoicon\endcsname {\simpleiconsmap\symbol{"F610}} + \expandafter\def\csname simpleicon@wemoicon\endcsname {\simpleiconsmap\symbol{"F611}} + \expandafter\def\csname simpleicon@westerndigitalicon\endcsname {\simpleiconsmap\symbol{"F612}} + \expandafter\def\csname simpleicon@westernunionicon\endcsname {\simpleiconsmap\symbol{"F613}} + \expandafter\def\csname simpleicon@wetransfericon\endcsname {\simpleiconsmap\symbol{"F614}} + \expandafter\def\csname simpleicon@weztermicon\endcsname {\simpleiconsmap\symbol{"F615}} + \expandafter\def\csname simpleicon@wgpuicon\endcsname {\simpleiconsmap\symbol{"F616}} + \expandafter\def\csname simpleicon@whatsappicon\endcsname {\simpleiconsmap\symbol{"F617}} + \expandafter\def\csname simpleicon@wheniworkicon\endcsname {\simpleiconsmap\symbol{"F618}} + \expandafter\def\csname simpleicon@wiiicon\endcsname {\simpleiconsmap\symbol{"F619}} + \expandafter\def\csname simpleicon@wiiuicon\endcsname {\simpleiconsmap\symbol{"F61A}} + \expandafter\def\csname simpleicon@wikidataicon\endcsname {\simpleiconsmap\symbol{"F61B}} + \expandafter\def\csname simpleicon@wikidotggicon\endcsname {\simpleiconsmap\symbol{"F61C}} + \expandafter\def\csname simpleicon@wikidotjsicon\endcsname {\simpleiconsmap\symbol{"F61D}} + \expandafter\def\csname simpleicon@wikimediacommonsicon\endcsname {\simpleiconsmap\symbol{"F61E}} + \expandafter\def\csname simpleicon@wikimediafoundationicon\endcsname {\simpleiconsmap\symbol{"F61F}} + \expandafter\def\csname simpleicon@wikipediaicon\endcsname {\simpleiconsmap\symbol{"F620}} + \expandafter\def\csname simpleicon@wikiquoteicon\endcsname {\simpleiconsmap\symbol{"F621}} + \expandafter\def\csname simpleicon@wikivoyageicon\endcsname {\simpleiconsmap\symbol{"F622}} + \expandafter\def\csname simpleicon@winampicon\endcsname {\simpleiconsmap\symbol{"F623}} + \expandafter\def\csname simpleicon@wiproicon\endcsname {\simpleiconsmap\symbol{"F624}} + \expandafter\def\csname simpleicon@wireicon\endcsname {\simpleiconsmap\symbol{"F625}} + \expandafter\def\csname simpleicon@wireguardicon\endcsname {\simpleiconsmap\symbol{"F626}} + \expandafter\def\csname simpleicon@wiresharkicon\endcsname {\simpleiconsmap\symbol{"F627}} + \expandafter\def\csname simpleicon@wiseicon\endcsname {\simpleiconsmap\symbol{"F628}} + \expandafter\def\csname simpleicon@wishicon\endcsname {\simpleiconsmap\symbol{"F629}} + \expandafter\def\csname simpleicon@wistiaicon\endcsname {\simpleiconsmap\symbol{"F62A}} + \expandafter\def\csname simpleicon@wixicon\endcsname {\simpleiconsmap\symbol{"F62B}} + \expandafter\def\csname simpleicon@wizzairicon\endcsname {\simpleiconsmap\symbol{"F62C}} + \expandafter\def\csname simpleicon@wolframicon\endcsname {\simpleiconsmap\symbol{"F62D}} + \expandafter\def\csname simpleicon@wolframlanguageicon\endcsname {\simpleiconsmap\symbol{"F62E}} + \expandafter\def\csname simpleicon@wolframmathematicaicon\endcsname {\simpleiconsmap\symbol{"F62F}} + \expandafter\def\csname simpleicon@wondershareicon\endcsname {\simpleiconsmap\symbol{"F630}} + \expandafter\def\csname simpleicon@wondersharefilmoraicon\endcsname {\simpleiconsmap\symbol{"F631}} + \expandafter\def\csname simpleicon@wooicon\endcsname {\simpleiconsmap\symbol{"F632}} + \expandafter\def\csname simpleicon@woocommerceicon\endcsname {\simpleiconsmap\symbol{"F633}} + \expandafter\def\csname simpleicon@wordpressicon\endcsname {\simpleiconsmap\symbol{"F634}} + \expandafter\def\csname simpleicon@workplaceicon\endcsname {\simpleiconsmap\symbol{"F635}} + \expandafter\def\csname simpleicon@worldhealthorganizationicon\endcsname {\simpleiconsmap\symbol{"F636}} + \expandafter\def\csname simpleicon@wpengineicon\endcsname {\simpleiconsmap\symbol{"F637}} + \expandafter\def\csname simpleicon@wpexplorericon\endcsname {\simpleiconsmap\symbol{"F638}} + \expandafter\def\csname simpleicon@wprocketicon\endcsname {\simpleiconsmap\symbol{"F639}} + \expandafter\def\csname simpleicon@writedotasicon\endcsname {\simpleiconsmap\symbol{"F63A}} + \expandafter\def\csname simpleicon@wweicon\endcsname {\simpleiconsmap\symbol{"F63B}} + \expandafter\def\csname simpleicon@wwiseicon\endcsname {\simpleiconsmap\symbol{"F63C}} + \expandafter\def\csname simpleicon@wykopicon\endcsname {\simpleiconsmap\symbol{"F63D}} + \expandafter\def\csname simpleicon@wyzeicon\endcsname {\simpleiconsmap\symbol{"F63E}} + \expandafter\def\csname simpleicon@xicon\endcsname {\simpleiconsmap\symbol{"F63F}} + \expandafter\def\csname simpleicon@xamppicon\endcsname {\simpleiconsmap\symbol{"F640}} + \expandafter\def\csname simpleicon@xcodeicon\endcsname {\simpleiconsmap\symbol{"F641}} + \expandafter\def\csname simpleicon@xdadevelopersicon\endcsname {\simpleiconsmap\symbol{"F642}} + \expandafter\def\csname simpleicon@xdotorgicon\endcsname {\simpleiconsmap\symbol{"F643}} + \expandafter\def\csname simpleicon@xenditicon\endcsname {\simpleiconsmap\symbol{"F644}} + \expandafter\def\csname simpleicon@xeroicon\endcsname {\simpleiconsmap\symbol{"F645}} + \expandafter\def\csname simpleicon@xfceicon\endcsname {\simpleiconsmap\symbol{"F646}} + \expandafter\def\csname simpleicon@xiaohongshuicon\endcsname {\simpleiconsmap\symbol{"F647}} + \expandafter\def\csname simpleicon@xiaomiicon\endcsname {\simpleiconsmap\symbol{"F648}} + \expandafter\def\csname simpleicon@xingicon\endcsname {\simpleiconsmap\symbol{"F649}} + \expandafter\def\csname simpleicon@xmlicon\endcsname {\simpleiconsmap\symbol{"F64A}} + \expandafter\def\csname simpleicon@xmppicon\endcsname {\simpleiconsmap\symbol{"F64B}} + \expandafter\def\csname simpleicon@xoicon\endcsname {\simpleiconsmap\symbol{"F64C}} + \expandafter\def\csname simpleicon@xrpicon\endcsname {\simpleiconsmap\symbol{"F64D}} + \expandafter\def\csname simpleicon@xspliticon\endcsname {\simpleiconsmap\symbol{"F64E}} + \expandafter\def\csname simpleicon@xstateicon\endcsname {\simpleiconsmap\symbol{"F64F}} + \expandafter\def\csname simpleicon@xubuntuicon\endcsname {\simpleiconsmap\symbol{"F650}} + \expandafter\def\csname simpleicon@yabaiicon\endcsname {\simpleiconsmap\symbol{"F651}} + \expandafter\def\csname simpleicon@yaleicon\endcsname {\simpleiconsmap\symbol{"F652}} + \expandafter\def\csname simpleicon@yamahacorporationicon\endcsname {\simpleiconsmap\symbol{"F653}} + \expandafter\def\csname simpleicon@yamahamotorcorporationicon\endcsname {\simpleiconsmap\symbol{"F654}} + \expandafter\def\csname simpleicon@yamlicon\endcsname {\simpleiconsmap\symbol{"F655}} + \expandafter\def\csname simpleicon@yandexcloudicon\endcsname {\simpleiconsmap\symbol{"F656}} + \expandafter\def\csname simpleicon@yarnicon\endcsname {\simpleiconsmap\symbol{"F657}} + \expandafter\def\csname simpleicon@ycombinatoricon\endcsname {\simpleiconsmap\symbol{"F658}} + \expandafter\def\csname simpleicon@yelpicon\endcsname {\simpleiconsmap\symbol{"F659}} + \expandafter\def\csname simpleicon@yetiicon\endcsname {\simpleiconsmap\symbol{"F65A}} + \expandafter\def\csname simpleicon@yiiicon\endcsname {\simpleiconsmap\symbol{"F65B}} + \expandafter\def\csname simpleicon@yoasticon\endcsname {\simpleiconsmap\symbol{"F65C}} + \expandafter\def\csname simpleicon@youtubeicon\endcsname {\simpleiconsmap\symbol{"F65D}} + \expandafter\def\csname simpleicon@youtubegamingicon\endcsname {\simpleiconsmap\symbol{"F65E}} + \expandafter\def\csname simpleicon@youtubekidsicon\endcsname {\simpleiconsmap\symbol{"F65F}} + \expandafter\def\csname simpleicon@youtubemusicicon\endcsname {\simpleiconsmap\symbol{"F660}} + \expandafter\def\csname simpleicon@youtubeshortsicon\endcsname {\simpleiconsmap\symbol{"F661}} + \expandafter\def\csname simpleicon@youtubestudioicon\endcsname {\simpleiconsmap\symbol{"F662}} + \expandafter\def\csname simpleicon@youtubetvicon\endcsname {\simpleiconsmap\symbol{"F663}} + \expandafter\def\csname simpleicon@yricon\endcsname {\simpleiconsmap\symbol{"F664}} + \expandafter\def\csname simpleicon@yubicoicon\endcsname {\simpleiconsmap\symbol{"F665}} + \expandafter\def\csname simpleicon@yunohosticon\endcsname {\simpleiconsmap\symbol{"F666}} + \expandafter\def\csname simpleicon@zabkaicon\endcsname {\simpleiconsmap\symbol{"F667}} + \expandafter\def\csname simpleicon@zaimicon\endcsname {\simpleiconsmap\symbol{"F668}} + \expandafter\def\csname simpleicon@zalandoicon\endcsname {\simpleiconsmap\symbol{"F669}} + \expandafter\def\csname simpleicon@zaloicon\endcsname {\simpleiconsmap\symbol{"F66A}} + \expandafter\def\csname simpleicon@zapicon\endcsname {\simpleiconsmap\symbol{"F66B}} + \expandafter\def\csname simpleicon@zapiericon\endcsname {\simpleiconsmap\symbol{"F66C}} + \expandafter\def\csname simpleicon@zaraicon\endcsname {\simpleiconsmap\symbol{"F66D}} + \expandafter\def\csname simpleicon@zazzleicon\endcsname {\simpleiconsmap\symbol{"F66E}} + \expandafter\def\csname simpleicon@zcashicon\endcsname {\simpleiconsmap\symbol{"F66F}} + \expandafter\def\csname simpleicon@zcoolicon\endcsname {\simpleiconsmap\symbol{"F670}} + \expandafter\def\csname simpleicon@zdficon\endcsname {\simpleiconsmap\symbol{"F671}} + \expandafter\def\csname simpleicon@zebpayicon\endcsname {\simpleiconsmap\symbol{"F672}} + \expandafter\def\csname simpleicon@zebratechnologiesicon\endcsname {\simpleiconsmap\symbol{"F673}} + \expandafter\def\csname simpleicon@zedindustriesicon\endcsname {\simpleiconsmap\symbol{"F674}} + \expandafter\def\csname simpleicon@zelleicon\endcsname {\simpleiconsmap\symbol{"F675}} + \expandafter\def\csname simpleicon@zendicon\endcsname {\simpleiconsmap\symbol{"F676}} + \expandafter\def\csname simpleicon@zendeskicon\endcsname {\simpleiconsmap\symbol{"F677}} + \expandafter\def\csname simpleicon@zennicon\endcsname {\simpleiconsmap\symbol{"F678}} + \expandafter\def\csname simpleicon@zenodoicon\endcsname {\simpleiconsmap\symbol{"F679}} + \expandafter\def\csname simpleicon@zensaricon\endcsname {\simpleiconsmap\symbol{"F67A}} + \expandafter\def\csname simpleicon@zerodhaicon\endcsname {\simpleiconsmap\symbol{"F67B}} + \expandafter\def\csname simpleicon@zerotiericon\endcsname {\simpleiconsmap\symbol{"F67C}} + \expandafter\def\csname simpleicon@zerplyicon\endcsname {\simpleiconsmap\symbol{"F67D}} + \expandafter\def\csname simpleicon@zettlricon\endcsname {\simpleiconsmap\symbol{"F67E}} + \expandafter\def\csname simpleicon@zhihuicon\endcsname {\simpleiconsmap\symbol{"F67F}} + \expandafter\def\csname simpleicon@zigicon\endcsname {\simpleiconsmap\symbol{"F680}} + \expandafter\def\csname simpleicon@zigbeeicon\endcsname {\simpleiconsmap\symbol{"F681}} + \expandafter\def\csname simpleicon@zigbee2mqtticon\endcsname {\simpleiconsmap\symbol{"F682}} + \expandafter\def\csname simpleicon@ziggoicon\endcsname {\simpleiconsmap\symbol{"F683}} + \expandafter\def\csname simpleicon@zilchicon\endcsname {\simpleiconsmap\symbol{"F684}} + \expandafter\def\csname simpleicon@zillowicon\endcsname {\simpleiconsmap\symbol{"F685}} + \expandafter\def\csname simpleicon@zincsearchicon\endcsname {\simpleiconsmap\symbol{"F686}} + \expandafter\def\csname simpleicon@zingaticon\endcsname {\simpleiconsmap\symbol{"F687}} + \expandafter\def\csname simpleicon@zodicon\endcsname {\simpleiconsmap\symbol{"F688}} + \expandafter\def\csname simpleicon@zohoicon\endcsname {\simpleiconsmap\symbol{"F689}} + \expandafter\def\csname simpleicon@zoipericon\endcsname {\simpleiconsmap\symbol{"F68A}} + \expandafter\def\csname simpleicon@zomatoicon\endcsname {\simpleiconsmap\symbol{"F68B}} + \expandafter\def\csname simpleicon@zoomicon\endcsname {\simpleiconsmap\symbol{"F68C}} + \expandafter\def\csname simpleicon@zorinicon\endcsname {\simpleiconsmap\symbol{"F68D}} + \expandafter\def\csname simpleicon@zoteroicon\endcsname {\simpleiconsmap\symbol{"F68E}} + \expandafter\def\csname simpleicon@zshicon\endcsname {\simpleiconsmap\symbol{"F68F}} + \expandafter\def\csname simpleicon@zulipicon\endcsname {\simpleiconsmap\symbol{"F690}} + \expandafter\def\csname simpleicon@zyteicon\endcsname {\simpleiconsmap\symbol{"F691}}
\ No newline at end of file diff --git a/fonts/simpleicons/tex/usimpleiconseight.fd b/fonts/simpleicons/tex/usimpleiconseight.fd index 353b004619..bcf14edd83 100644 --- a/fonts/simpleicons/tex/usimpleiconseight.fd +++ b/fonts/simpleicons/tex/usimpleiconseight.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconseight.fd}[2024/10/25 Font definitions for U/simpleiconseight.] + \ProvidesFile{usimpleiconseight.fd}[2024/11/01 Font definitions for U/simpleiconseight.] \DeclareFontFamily{U}{simpleiconseight}{} \DeclareFontShape{U}{simpleiconseight}{m}{n}{<-> SimpleIcons--simpleiconseight}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsfive.fd b/fonts/simpleicons/tex/usimpleiconsfive.fd index f2b8d5b87b..48eba5fa25 100644 --- a/fonts/simpleicons/tex/usimpleiconsfive.fd +++ b/fonts/simpleicons/tex/usimpleiconsfive.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsfive.fd}[2024/10/25 Font definitions for U/simpleiconsfive.] + \ProvidesFile{usimpleiconsfive.fd}[2024/11/01 Font definitions for U/simpleiconsfive.] \DeclareFontFamily{U}{simpleiconsfive}{} \DeclareFontShape{U}{simpleiconsfive}{m}{n}{<-> SimpleIcons--simpleiconsfive}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsfour.fd b/fonts/simpleicons/tex/usimpleiconsfour.fd index 9cf9b56823..e0ab55be73 100644 --- a/fonts/simpleicons/tex/usimpleiconsfour.fd +++ b/fonts/simpleicons/tex/usimpleiconsfour.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsfour.fd}[2024/10/25 Font definitions for U/simpleiconsfour.] + \ProvidesFile{usimpleiconsfour.fd}[2024/11/01 Font definitions for U/simpleiconsfour.] \DeclareFontFamily{U}{simpleiconsfour}{} \DeclareFontShape{U}{simpleiconsfour}{m}{n}{<-> SimpleIcons--simpleiconsfour}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsnine.fd b/fonts/simpleicons/tex/usimpleiconsnine.fd index cf76687430..a8ba9a909d 100644 --- a/fonts/simpleicons/tex/usimpleiconsnine.fd +++ b/fonts/simpleicons/tex/usimpleiconsnine.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsnine.fd}[2024/10/25 Font definitions for U/simpleiconsnine.] + \ProvidesFile{usimpleiconsnine.fd}[2024/11/01 Font definitions for U/simpleiconsnine.] \DeclareFontFamily{U}{simpleiconsnine}{} \DeclareFontShape{U}{simpleiconsnine}{m}{n}{<-> SimpleIcons--simpleiconsnine}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsone.fd b/fonts/simpleicons/tex/usimpleiconsone.fd index c4b58a589f..e398a36847 100644 --- a/fonts/simpleicons/tex/usimpleiconsone.fd +++ b/fonts/simpleicons/tex/usimpleiconsone.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsone.fd}[2024/10/25 Font definitions for U/simpleiconsone.] + \ProvidesFile{usimpleiconsone.fd}[2024/11/01 Font definitions for U/simpleiconsone.] \DeclareFontFamily{U}{simpleiconsone}{} \DeclareFontShape{U}{simpleiconsone}{m}{n}{<-> SimpleIcons--simpleiconsone}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsoneone.fd b/fonts/simpleicons/tex/usimpleiconsoneone.fd index 8e8cdf4a32..fb730933c0 100644 --- a/fonts/simpleicons/tex/usimpleiconsoneone.fd +++ b/fonts/simpleicons/tex/usimpleiconsoneone.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsoneone.fd}[2024/10/25 Font definitions for U/simpleiconsoneone.] + \ProvidesFile{usimpleiconsoneone.fd}[2024/11/01 Font definitions for U/simpleiconsoneone.] \DeclareFontFamily{U}{simpleiconsoneone}{} \DeclareFontShape{U}{simpleiconsoneone}{m}{n}{<-> SimpleIcons--simpleiconsoneone}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsonethree.fd b/fonts/simpleicons/tex/usimpleiconsonethree.fd index 3a9740cebc..e7149c3774 100644 --- a/fonts/simpleicons/tex/usimpleiconsonethree.fd +++ b/fonts/simpleicons/tex/usimpleiconsonethree.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsonethree.fd}[2024/10/25 Font definitions for U/simpleiconsonethree.] + \ProvidesFile{usimpleiconsonethree.fd}[2024/11/01 Font definitions for U/simpleiconsonethree.] \DeclareFontFamily{U}{simpleiconsonethree}{} \DeclareFontShape{U}{simpleiconsonethree}{m}{n}{<-> SimpleIcons--simpleiconsonethree}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsonetwo.fd b/fonts/simpleicons/tex/usimpleiconsonetwo.fd index 159b23f656..cca0c5f9d5 100644 --- a/fonts/simpleicons/tex/usimpleiconsonetwo.fd +++ b/fonts/simpleicons/tex/usimpleiconsonetwo.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsonetwo.fd}[2024/10/25 Font definitions for U/simpleiconsonetwo.] + \ProvidesFile{usimpleiconsonetwo.fd}[2024/11/01 Font definitions for U/simpleiconsonetwo.] \DeclareFontFamily{U}{simpleiconsonetwo}{} \DeclareFontShape{U}{simpleiconsonetwo}{m}{n}{<-> SimpleIcons--simpleiconsonetwo}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsonezero.fd b/fonts/simpleicons/tex/usimpleiconsonezero.fd index cb39ffded4..1eee5248c6 100644 --- a/fonts/simpleicons/tex/usimpleiconsonezero.fd +++ b/fonts/simpleicons/tex/usimpleiconsonezero.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsonezero.fd}[2024/10/25 Font definitions for U/simpleiconsonezero.] + \ProvidesFile{usimpleiconsonezero.fd}[2024/11/01 Font definitions for U/simpleiconsonezero.] \DeclareFontFamily{U}{simpleiconsonezero}{} \DeclareFontShape{U}{simpleiconsonezero}{m}{n}{<-> SimpleIcons--simpleiconsonezero}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsseven.fd b/fonts/simpleicons/tex/usimpleiconsseven.fd index 93b1223cb7..45a5b7abe2 100644 --- a/fonts/simpleicons/tex/usimpleiconsseven.fd +++ b/fonts/simpleicons/tex/usimpleiconsseven.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsseven.fd}[2024/10/25 Font definitions for U/simpleiconsseven.] + \ProvidesFile{usimpleiconsseven.fd}[2024/11/01 Font definitions for U/simpleiconsseven.] \DeclareFontFamily{U}{simpleiconsseven}{} \DeclareFontShape{U}{simpleiconsseven}{m}{n}{<-> SimpleIcons--simpleiconsseven}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconssix.fd b/fonts/simpleicons/tex/usimpleiconssix.fd index d9ca3f175d..661f0e1d84 100644 --- a/fonts/simpleicons/tex/usimpleiconssix.fd +++ b/fonts/simpleicons/tex/usimpleiconssix.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconssix.fd}[2024/10/25 Font definitions for U/simpleiconssix.] + \ProvidesFile{usimpleiconssix.fd}[2024/11/01 Font definitions for U/simpleiconssix.] \DeclareFontFamily{U}{simpleiconssix}{} \DeclareFontShape{U}{simpleiconssix}{m}{n}{<-> SimpleIcons--simpleiconssix}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconsthree.fd b/fonts/simpleicons/tex/usimpleiconsthree.fd index 783184b1a9..e28ce7a0d2 100644 --- a/fonts/simpleicons/tex/usimpleiconsthree.fd +++ b/fonts/simpleicons/tex/usimpleiconsthree.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconsthree.fd}[2024/10/25 Font definitions for U/simpleiconsthree.] + \ProvidesFile{usimpleiconsthree.fd}[2024/11/01 Font definitions for U/simpleiconsthree.] \DeclareFontFamily{U}{simpleiconsthree}{} \DeclareFontShape{U}{simpleiconsthree}{m}{n}{<-> SimpleIcons--simpleiconsthree}{} \endinput diff --git a/fonts/simpleicons/tex/usimpleiconstwo.fd b/fonts/simpleicons/tex/usimpleiconstwo.fd index 37133d0df8..e62e36c1d7 100644 --- a/fonts/simpleicons/tex/usimpleiconstwo.fd +++ b/fonts/simpleicons/tex/usimpleiconstwo.fd @@ -1,5 +1,5 @@ - \ProvidesFile{usimpleiconstwo.fd}[2024/10/25 Font definitions for U/simpleiconstwo.] + \ProvidesFile{usimpleiconstwo.fd}[2024/11/01 Font definitions for U/simpleiconstwo.] \DeclareFontFamily{U}{simpleiconstwo}{} \DeclareFontShape{U}{simpleiconstwo}{m}{n}{<-> SimpleIcons--simpleiconstwo}{} \endinput diff --git a/fonts/simpleicons/tfm/SimpleIcons--simpleiconsoneone.tfm b/fonts/simpleicons/tfm/SimpleIcons--simpleiconsoneone.tfm Binary files differindex d4933e83e9..d30a2f6b46 100644 --- a/fonts/simpleicons/tfm/SimpleIcons--simpleiconsoneone.tfm +++ b/fonts/simpleicons/tfm/SimpleIcons--simpleiconsoneone.tfm diff --git a/fonts/simpleicons/tfm/SimpleIcons--simpleiconsonethree.tfm b/fonts/simpleicons/tfm/SimpleIcons--simpleiconsonethree.tfm Binary files differindex 13714a2a8d..062ef0bf5f 100644 --- a/fonts/simpleicons/tfm/SimpleIcons--simpleiconsonethree.tfm +++ b/fonts/simpleicons/tfm/SimpleIcons--simpleiconsonethree.tfm diff --git a/fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm b/fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm Binary files differindex a27c8d4a22..8f1aecd904 100644 --- a/fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm +++ b/fonts/simpleicons/tfm/SimpleIcons--simpleiconsonetwo.tfm diff --git a/fonts/simpleicons/type1/SimpleIcons.pfb b/fonts/simpleicons/type1/SimpleIcons.pfb Binary files differindex e75fc3165d..734b6e6686 100644 --- a/fonts/simpleicons/type1/SimpleIcons.pfb +++ b/fonts/simpleicons/type1/SimpleIcons.pfb diff --git a/macros/generic/markdown/CHANGES.md b/macros/generic/markdown/CHANGES.md index 1b32517f09..69deeac748 100644 --- a/macros/generic/markdown/CHANGES.md +++ b/macros/generic/markdown/CHANGES.md @@ -1,5 +1,82 @@ # Changes +## 3.8.0 (2024-10-31) + +Development: + +- Add support for versioned themes and add new Lua option `experimental`. + (#466, #512, #514, [matrix.org][matrix-514] reviewed by @TeXhackse, #521) + + The option `experimental` enables experimental features that are planned to + be the new default in the next major release of the Markdown package. + + At the moment, this just means that the version `experimental` of the theme + `witiko/markdown/defaults` will be loaded and warnings for hard-deprecated + features will become errors. However, the effects may extend to other areas + in the future as well. + + [matrix-514]: https://matrix.to/#/!UeAwznpYwwsinVTetR:matrix.org/$TTc-m7B5NSdsLBNNyIuFWQ-u2nOZ03lJ5js88hnyFiU?via=matrix.org&via=im.f3l.de + +- Add first-class support for YAML documents. (#452, #473, #524) + - Add plain TeX macros `\yamlSetup`, `\yamlInput`, `\yamlBegin`, and `\yamlEnd`. + - Add LaTeX environment `yaml` and redefine command `\yamlInput` for LaTeX. + - Add ConTeXt commands `\setupyaml`, `\inputyaml`, `\startyaml`, and `\stopyaml`. + +Documentation: + +- Document LaTeX hooks. (#464, #507) + +Defaults: + +- Improve the compatibility of the default LaTeX packages with PDF tagging: + (#466, #512, #514, #521, reported and consulted by @u-fischer) + + - In TeX engines other than LuaTeX, use the package soul instead of the + package soulutf8 in TeX Live ≥ 2023. + + - In LuaLaTeX, use the package lua-ul for strike-through/mark renderer + prototypes instead of the package soul. + + - Use the package enumitem for tight and fancy lists instead of the package + paralist. + + This is a breaking change that is marked as experimental. To enable it, + either use the package option `experimental` or specify any test phase in + the document metadata: + + 1. `\usepackage[experimental]{markdown}` + 2. `\DocumentMetadata{testphase=phase-III}` + +- Define LaTeX renderers for image identifiers. + (#520, suggested by @jurf, 6f3dcd0c, 478530f, [matrix.org][matrix-520]) + + This establishes a reliable method for authors to reference figures within Markdown: + + ``` tex + \documentclass{article} + \usepackage[link_attributes, relative_references]{markdown} + \begin{document} + \begin{markdown} + + {#example-image-id} + + See Figure <#example-image-id>. + + \end{markdown} + \end{document} + ``` + +- Set correct category codes for version 3 of the package minted. (39980934) + +Continuous Integration: + +- Only use self-hosted runners for the quick CI in pull requests. + For full CI outside pull requests, use GitHub-hosted runners. + (c2697428, [matrix.org][matrix-950e8269]) + + [matrix-950e8269]: https://matrix.to/#/!pznomuvubVyxElflTe:matrix.org/$op_onsRdhtXJsZB5d5LZrOFF75T02XvKehmikdoucx4?via=matrix.org&via=im.f3l.de + [matrix-520]: https://matrix.to/#/!lWGKeMcpgwGHpfLYkf:matrix.org/$mZB-_YfreLFSKU5eDzp0AIvMnsV_Bn-rpUoj9HtUVwk?via=matrix.org&via=im.f3l.de + ## 3.7.1 (2024-09-30) Development: @@ -21,8 +98,8 @@ Fixes: - Properly load LaTeX themes when `theme` or `import` is used in `\usepackage[...]{markdown}`. (#471, #498) -- Prevent endless loop when setting deprecated `jekyllDataString` (renderer) - prototype. (#500) +- Prevent endless loop when setting deprecated `jekyllDataString` renderer + (prototype). (#500) - Correctly handle backslashes in `\markdownOptionOutputDir` on Windows. (#492, #500, reported by @l0th3r) @@ -125,7 +202,7 @@ Continuous Integration: - Only test latest TeX Live in pull requests. (81927ca1) -Unit Tests: +Tests: - Test the `outputDir` plain TeX option. (#457, #459) @@ -303,7 +380,7 @@ Default Renderer Prototypes: - Do not unnecessarily override math renderer prototypes in LaTeX/ConTeXt. (#387, #396, contributed by @zousiyu1995) -Unit Tests: +Tests: - In pull requests, process added and modified testfiles first. (feafe9b9, 9ff530da, 18deae73) @@ -407,7 +484,7 @@ Documentation: [matrix-357]: https://matrix.to/#/!efVbynJpCMjlOTfose:matrix.org/$WR3quuO1fyOl6w_KX6YFA4BACBcL-cWUWBpVfpPWDkI?via=matrix.org&via=im.f3l.de -Unit Tests: +Tests: - Restore CommonMark testfiles with trailing tabs and spaces. (#348, #353, lostenderman/markdown#2, contributed by @lostenderman) @@ -450,7 +527,7 @@ Deprecation: [matrix-351]: https://matrix.to/#/!lWGKeMcpgwGHpfLYkf:matrix.org/$yVeWB0Yzfz6mgORv5VeG9IEl7a4xLogkAUmdNMSCxEg?via=matrix.org&via=im.f3l.de -Unit Tests: +Tests: - Add support for YAML metadata in testfiles. (#345, #347, [matrix.org][matrix-347]) @@ -497,7 +574,7 @@ Documentation: (f3efcb9) - Document setting up catcodes in Lua. (#329, #342) -Unit Tests: +Tests: - Batch unit tests to improve speed. (#245, #316, 8bfd0b3, #317, #319..#325, #327, #328, e3b31696, @@ -531,7 +608,7 @@ Documentation: - Add a link to TUG 2023 slides and video to the README. (ce6047b8, adb69e2f) -Unit Tests: +Tests: - Rewrite the unit testing framework from Bash to Python and implement summarization. (#245, #314) @@ -709,7 +786,7 @@ Default Renderer Prototypes: - In LaTeX and ConTeXt, use just first word of infostring to determine fence code block language. (#244) -Unit Tests: +Tests: - Do not fold tabs and spaces into a single space token. (lostenderman#107, #242) @@ -1238,7 +1315,7 @@ Licensing: - Bump the copyright year. (9462f17) - Sublicense the code as LPPL v1.3c. (609aeee) -Unit tests: +Tests: - Remove xtrace from `test.sh` for less verbose output. (b307ee6) - Treat all files as text with GNU diff in `test.sh`. (ec89e6d) diff --git a/macros/generic/markdown/DEPENDS.txt b/macros/generic/markdown/DEPENDS.txt index 3f73ad3431..ee358c0eef 100644 --- a/macros/generic/markdown/DEPENDS.txt +++ b/macros/generic/markdown/DEPENDS.txt @@ -5,6 +5,7 @@ soft amsfonts soft amsmath soft catchfile soft csvsimple +soft enumitem soft epstopdf-pkg soft etoolbox soft fancyvrb @@ -13,9 +14,12 @@ soft graphics soft grffile soft latex soft ltxcmds +soft lua-ul +soft luacolor soft paralist soft pgf soft soul soft tools soft url soft verse +soft xcolor diff --git a/macros/generic/markdown/README.md b/macros/generic/markdown/README.md index fc65a0b689..46801605af 100644 --- a/macros/generic/markdown/README.md +++ b/macros/generic/markdown/README.md @@ -147,8 +147,8 @@ For further information, consult one of the following: - [Markdown 2.17.1: What's New, What's Next?][tb135], - [Attributes in Markdown][tb136], - [Markdown 3 at TUG 2023: Reflections from the Q&A session][tb138], - - Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching ([preprint][tb139]), and - - Markdown Themes in Practice ([preprint][tb140-preprint], [work in progress][tb140]). + - [Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching][tb139], and + - [Markdown Themes in Practice][tb140]. 5. Journal articles published by [CSTUG Bulletin][csbul] (in Czech and Slovak): - [Rendering Markdown inside TeX Documents][10.5300/2016-1-4/78], - [Markdown 2.8.1: Boldly Unto the Throne of Lightweight Markup in TeX][10.5300/2020-1-2/48], @@ -183,7 +183,7 @@ For further information, consult one of the following: [tb135]: https://www.tug.org/TUGboat/tb43-3/tb135novotny-markdown.pdf "Markdown 2.17.1: What's New, What's Next?" [tb136]: https://www.tug.org/TUGboat/tb44-1/tb136novotny-markdown-attr.pdf "Attributes in Markdown" [tb138]: https://www.tug.org/TUGboat/tb44-3/tb138starynovotny-markdown-qa.pdf "Markdown 3 at TUG 2023: Reflections from the Q&A session" - [tb139]: https://github.com/Witiko/fast-regression-testing/releases/download/latest/tb139starynovotny-testing.pdf "Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching" + [tb139]: https://www.tug.org/TUGboat/tb45-1/tb139starynovotny-testing.pdf "Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching" [tb140]: https://github.com/Witiko/markdown-themes-in-practice/releases/download/latest/tb140starynovotny-markdown-themes.pdf "Markdown Themes in Practice" [tb131-slides]: https://tug.org/tug2021/assets/pdf/tug2021-novotny-slides.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" diff --git a/macros/generic/markdown/VERSION b/macros/generic/markdown/VERSION index 95d6c0a328..8d19285c37 100644 --- a/macros/generic/markdown/VERSION +++ b/macros/generic/markdown/VERSION @@ -1 +1 @@ -3.7.1-0-g8e726800 (2024-09-30) +3.8.0-0-ga4bab835 (2024-10-31) diff --git a/macros/generic/markdown/examples/context-mkiv.tex b/macros/generic/markdown/examples/context-mkiv.tex index 6cb185802a..34b6b35093 100644 --- a/macros/generic/markdown/examples/context-mkiv.tex +++ b/macros/generic/markdown/examples/context-mkiv.tex @@ -57,6 +57,37 @@ kpse.set_program_name("luatex") \starttext +% Set and typeset the document metadata using a YAML metadata block. +\setupyaml + [ + jekyllDataRenderers = { + title = {\gdef\doctitle{#1}}, + author = {\gdef\author{#1}}, + date = {\gdef\date{#1}}, + }, + renderers = { + jekyllDataEnd = {% + \startalignment[center] + \blank[force,2*big] + {\tfd \doctitle} + \blank[3*medium] + {\tfa \author} + \blank[2*medium] + {\tfa \date} + \blank[3*medium] + \stopalignment + }, + }, + ] + +\startyaml + +title: An Example *Markdown* Document +author: Vít Starý Novotný +date: `\currentdate`{=tex} + +\stopyaml + % Typeset the document `example.md` by letting the Markdown package handle % the conversion internally. Optionally, we can specify additional options % between the square brackets similarly to the command `\setupmarkdown`. diff --git a/macros/generic/markdown/examples/latex-luatex.tex b/macros/generic/markdown/examples/latex-luatex.tex index 51be09c1f6..370ce2f231 100644 --- a/macros/generic/markdown/examples/latex-luatex.tex +++ b/macros/generic/markdown/examples/latex-luatex.tex @@ -12,7 +12,6 @@ fencedCode, hashEnumerators, inlineNotes, - jekyllData, lineBlocks, notes, pipeTables, @@ -28,13 +27,11 @@ texMathSingleBackslash, ]{markdown} % Set the document metadata using a YAML metadata block. -\begin{markdown}[hybrid] ---- +\begin{yaml} title: An Example *Markdown* Document author: Vít Starý Novotný -date: \today ---- -\end{markdown} +date: `\today`{=tex} +\end{yaml} \begin{document} % Typeset the document `example.md` by letting the Markdown package handle % the conversion internally. diff --git a/macros/generic/markdown/examples/latex-pdftex.tex b/macros/generic/markdown/examples/latex-pdftex.tex index 34f78707c3..b530443548 100644 --- a/macros/generic/markdown/examples/latex-pdftex.tex +++ b/macros/generic/markdown/examples/latex-pdftex.tex @@ -13,7 +13,6 @@ fencedCode, hashEnumerators, inlineNotes, - jekyllData, lineBlocks, notes, pipeTables, @@ -29,13 +28,11 @@ texMathSingleBackslash, ]{markdown} % Set the document metadata using a YAML metadata block. -\begin{markdown}[hybrid] ---- +\begin{yaml} title: An Example *Markdown* Document author: Vít Starý Novotný -date: \today ---- -\end{markdown} +date: `\today`{=tex} +\end{yaml} \begin{document} % Typeset the document `example.md` by letting the Markdown package handle % the conversion internally. diff --git a/macros/generic/markdown/markdown.dtx b/macros/generic/markdown/markdown.dtx index cced9c9460..092c68c911 100644 --- a/macros/generic/markdown/markdown.dtx +++ b/macros/generic/markdown/markdown.dtx @@ -2,8 +2,7 @@ %<*driver> \documentclass{ltxdockit} \usepackage[american]{babel} -\usepackage{amsmath,btxdockit,doc,fancyvrb,graphicx,hologo,microtype} -\IfFileExists{minted2.sty}{\usepackage{minted2}}{\usepackage{minted}} +\usepackage{amsmath,btxdockit,doc,fancyvrb,graphicx,hologo,microtype,minted} % Set up the style. \usepackage{xcolor} @@ -79,10 +78,9 @@ \usepackage[ citations, definitionLists, - fencedCode, + experimental, notes, headerAttributes, - html, hybrid, inlineNotes, jekyllData, @@ -685,113 +683,132 @@ abbr { %</techdoc-block-diagram> %<*techdoc-bibliography> @online{starynovotny24, - author = {Starý Novotný, Vít and Enrico Gregorio and Max Chernoff and P. Spratte, Jonathan}, - title = {Convert control sequence with a variable number of undelimited parameters into a token list}, - url = {https://tex.stackexchange.com/q/716362/70941}, - urldate = {2024-04-28}, + author = {Starý Novotný, Vít and Enrico Gregorio and Max Chernoff and P. Spratte, Jonathan}, + title = {Convert control sequence with a variable number of undelimited parameters into a token list}, + url = {https://tex.stackexchange.com/q/716362/70941}, + urldate = {2024-04-28}, } @book{tantau21, - author = {Till Tantau and Joseph Wright and Vedran Miletić}, - title = {The Beamer class}, - date = {2021-02-10}, - url = {https://mirrors.ctan.org/macros/latex/contrib/beamer/doc/beameruserguide.pdf}, - urldate = {2021-02-11}} + author = {Till Tantau and Joseph Wright and Vedran Miletić}, + title = {The Beamer class}, + date = {2021-02-10}, + url = {https://mirrors.ctan.org/macros/latex/contrib/beamer/doc/beameruserguide.pdf}, + urldate = {2021-02-11}} @online{sotkov17, - author = {Sotkov, Anton}, - title = {File transclusion syntax for Markdown}, - date = {2017-01-19}, - url = {https://github.com/iainc/Markdown-Content-Blocks}, - urldate = {2018-01-08}} + author = {Sotkov, Anton}, + title = {File transclusion syntax for Markdown}, + date = {2017-01-19}, + url = {https://github.com/iainc/Markdown-Content-Blocks}, + urldate = {2018-01-08}} @book{luatex21, - author = {{Lua\TeX{} development team}}, - title = {Lua\TeX{} reference manual}, - date = {2021-07-23}, - note = {Version 1.10 (stable)}, - url = {https://www.pragma-ade.com/general/manuals/luatex.pdf}, - urldate = {2022-09-30}} + author = {{Lua\TeX{} development team}}, + title = {Lua\TeX{} reference manual}, + date = {2021-07-23}, + note = {Version 1.10 (stable)}, + url = {https://www.pragma-ade.com/general/manuals/luatex.pdf}, + urldate = {2022-09-30}} @book{latex17, - author = {Braams, Johannes and Carlisle, David and Jeffrey, Alan and + author = {Braams, Johannes and Carlisle, David and Jeffrey, Alan and Lamport, Leslie and Mittelbach, Frank and Rowley, Chris and Schöpf, Rainer}, - title = {The \Hologo{LaTeX2e} Sources}, - date = {2017-04-15}, - url = {https://mirrors.ctan.org/macros/latex/base/source2e.pdf}, - urldate = {2018-01-08}} + title = {The \Hologo{LaTeX2e} Sources}, + date = {2017-04-15}, + url = {https://mirrors.ctan.org/macros/latex/base/source2e.pdf}, + urldate = {2018-01-08}} @book{mittelbach17, - author = {Mittelbach, Frank}, - title = {The \texttt{doc} and \texttt{shortvrb} Packages}, - date = {2017-04-15}, - url = {https://mirrors.ctan.org/macros/latex/base/doc.pdf}, - urldate = {2018-02-19}} + author = {Mittelbach, Frank}, + title = {The \texttt{doc} and \texttt{shortvrb} Packages}, + date = {2017-04-15}, + url = {https://mirrors.ctan.org/macros/latex/base/doc.pdf}, + urldate = {2018-02-19}} +@book{mittelbach24, + author = {Mittelbach, Frank}, + title = {\LaTeX's hook management}, + date = {2024-06-26}, + url = {https://mirrors.ctan.org/macros/latex/base/lthooks-code.pdf}, + urldate = {2024-10-02}} @book{poore17, - author = {Poore, Geoffrey M.}, - title = {The \texttt{minted} Package}, - subtitle = {Highlighted source code in \LaTeX}, - date = {2017-07-19}, - version = {v2.5}, - url = {https://mirrors.ctan.org/macros/latex/contrib/minted/minted.pdf}, - urldate = {2020-09-01}} + author = {Poore, Geoffrey M.}, + title = {The \texttt{minted} Package}, + subtitle = {Highlighted source code in \LaTeX}, + date = {2017-07-19}, + version = {v2.5}, + url = {https://mirrors.ctan.org/macros/latex/contrib/minted/minted.pdf}, + urldate = {2020-09-01}} @online{macfarlane22, - title = {Pandoc}, - subtitle = {a universal document converter}, - author = {John MacFarlane}, - year = {2022}, - url = {https://pandoc.org/}, - urldate = {2022-10-05}} + title = {Pandoc}, + subtitle = {a universal document converter}, + author = {John MacFarlane}, + year = {2022}, + url = {https://pandoc.org/}, + urldate = {2022-10-05}} @online{novotny15, - author = {Novotný, Vít}, - year = {2015}, - title = {TeXový interpret jazyka Markdown (markdown.sty)}, - location = {Brno, Czech Republic}, - publisher = {Masaryk University}, - url = {https://www.muni.cz/en/research/projects/32984}, - urldate = {2018-02-19}} + author = {Novotný, Vít}, + year = {2015}, + title = {TeXový interpret jazyka Markdown (markdown.sty)}, + location = {Brno, Czech Republic}, + publisher = {Masaryk University}, + url = {https://www.muni.cz/en/research/projects/32984}, + urldate = {2018-02-19}} @book{ierusalimschy13, - author = {Ierusalimschy, Roberto}, - year = {2013}, - title = {Programming in Lua}, - edition = {3}, - isbn = {978-85-903798-5-0}, - pagetotal = {xviii, 347}, - location = {Rio de Janeiro}, - publisher = {PUC-Rio}} + author = {Ierusalimschy, Roberto}, + year = {2013}, + title = {Programming in Lua}, + edition = {3}, + isbn = {978-85-903798-5-0}, + pagetotal = {xviii, 347}, + location = {Rio de Janeiro}, + publisher = {PUC-Rio}} @book{knuth86a, - author = {Knuth, Donald Ervin}, - year = {1986}, - title = {The \TeX{}book}, - edition = {3}, - isbn = {0-201-13447-0}, - pagetotal = {ix, 479}, - series = {Computers \& Typesetting}, - volume = {A}, - location = {Reading, MA}, - publisher = {Addison-Wesley}} + author = {Knuth, Donald Ervin}, + year = {1986}, + title = {The \TeX{}book}, + edition = {3}, + isbn = {0-201-13447-0}, + pagetotal = {ix, 479}, + series = {Computers \& Typesetting}, + volume = {A}, + location = {Reading, MA}, + publisher = {Addison-Wesley}} @book{knuth86b, - author = {Knuth, Donald Ervin}, - year = {1986}, - title = {\TeX: The Program}, - isbn = {978-0-201-13437-7}, - pagetotal = {xvi, 594}, - series = {Computers \& Typesetting}, - volume = {B}, - location = {Reading, MA}, - publisher = {Addison-Wesley}} + author = {Knuth, Donald Ervin}, + year = {1986}, + title = {\TeX: The Program}, + isbn = {978-0-201-13437-7}, + pagetotal = {xvi, 594}, + series = {Computers \& Typesetting}, + volume = {B}, + location = {Reading, MA}, + publisher = {Addison-Wesley}} @book{eijkhout92, - author = {Victor Eijkhout}, - title = {\TeX{} by Topic}, - subtitle = {A \TeX nician's Reference}, - isbn = {978-0-201-56882-0}, - pagetotal = {307}, - date = {1992-02-01}, - location = {Wokingham, England}, - publisher = {Addison-Wesley}} + author = {Victor Eijkhout}, + title = {\TeX{} by Topic}, + subtitle = {A \TeX nician's Reference}, + isbn = {978-0-201-56882-0}, + pagetotal = {307}, + date = {1992-02-01}, + location = {Wokingham, England}, + publisher = {Addison-Wesley}} @inproceedings{sharif10, - author = {Sharif, Bonita and Maletic, Jonathan I.}, - booktitle = {2010 IEEE 18th International Conference on Program Comprehension}, - title = {An Eye Tracking Study on camelCase and under\_score Identifier Styles}, - year = {2010}, - pages = {196-205}, - doi = {10.1109/ICPC.2010.41}} + author = {Sharif, Bonita and Maletic, Jonathan I.}, + booktitle = {2010 IEEE 18th International Conference on Program Comprehension}, + title = {An Eye Tracking Study on camelCase and under\_score Identifier Styles}, + year = {2010}, + pages = {196-205}, + doi = {10.1109/ICPC.2010.41}} +@online{novotny24, + author = {Starý Novotný, Vít}, + title = {Versioned Themes}, + titleaddon = {Markdown Enhancement Proposal}, + date = {2024-10-13}, + urldate = {2024-10-21}, + url = {https://github.com/Witiko/markdown/discussions/514}} +@book{latex24, + author = {Frank Mittelbach and Ulrike Fischer and {\LaTeX{} Project}}, + title = {The \texttt{documentmetadata-support} code}, + date = {2024-06-01}, + url = {https://mirrors.ctan.org/macros/latex/required/latex-lab/documentmetadata-support-code.pdf}, + urldate = {2024-10-21}} %</techdoc-bibliography> %<@@=markdown> %<*themes-witiko-markdown-techdoc> @@ -813,6 +830,8 @@ abbr { }% }, }, +} +\yamlSetup{ jekyllDataRenderers = { /authors/* = {% \expandafter\gdef @@ -1316,7 +1335,8 @@ hard lt3luabridge %### \LaTeX{} Requirements {#latex-prerequisites} % % The \LaTeX{} part of the package requires that the \Hologo{LaTeX2e} format is -% loaded, +% loaded, a \TeX{} engine that extends \Hologo{eTeX}, and all the plain \TeX{} +% prerequisites (see Section <#sec:tex-prerequisites>). % \end{markdown} % \iffalse %<*themes-witiko-dot,latex-themes-witiko-graphicx-http> @@ -1331,8 +1351,6 @@ hard lt3luabridge %<*depends> % \fi % \begin{markdown} -% a \TeX{} engine that extends \Hologo{eTeX}, and all the plain \TeX{} -% prerequisites (see Section <#sec:tex-prerequisites>): % % The following packages are soft prerequisites. They are only used to provide % default token renderer prototypes (see sections @@ -1354,7 +1372,7 @@ soft url % \pkg{graphicx} % %: A package that provides the `\includegraphics` macro for the typesetting -% of images.Furthermore, it also provides a key-value interface that is +% of images. Furthermore, it also provides a key-value interface that is % used in the default renderer prototypes for image attribute contexts. % % \end{markdown} @@ -1363,15 +1381,20 @@ soft graphics % \end{macrocode} % \begin{markdown} % -% \pkg{paralist} +% \pkg{enumitem} and \pkg{paralist} +% +%: Packages that provide macros for the default renderer prototypes for +% tight and fancy lists. % -%: A package that provides the `compactitem`, `compactenum`, and -% `compactdesc` macros for the typesetting of tight bulleted lists, -% ordered lists, and definition lists as well as the rendering of -% fancy lists. +% The package \pkg{paralist} will be used unless the option +% \Opt{experimental} has been enabled, in which case, the package +% \pkg{enumitem} will be used. Furthermore, enabling any test phase +% [@latex24] will also cause \pkg{enumitem} to be used. In a future +% major version, \pkg{enumitem} will replace \pkg{paralist} altogether. % % \end{markdown} % \begin{macrocode} +soft enumitem soft paralist % \end{macrocode} % \begin{markdown} @@ -1478,15 +1501,28 @@ soft etoolbox % \end{macrocode} % \begin{markdown} % -% \pkg{soulutf8} +% \pkg{soulutf8} and \pkg{xcolor} % -%: A package that is used in the default renderer prototype for -% strike-throughs and marked text. +%: Packages that are used in the default renderer prototypes for +% strike-throughs and marked text in pdf\TeX. % <!-- TODO: 1,$s/soulutf8/soul/g in TeX Live 2023. --> % % \end{markdown} % \begin{macrocode} soft soul +soft xcolor +% \end{macrocode} +% \begin{markdown} +% +% \pkg{lua-ul} and \pkg{luacolor} +% +%: Packages that are used in the default renderer prototypes for +% strike-throughs and marked text in Lua\TeX. +% +% \end{markdown} +% \begin{macrocode} +soft lua-ul +soft luacolor % \end{macrocode} % \begin{markdown} % @@ -1912,9 +1948,9 @@ module and a command-line interface (CLI). local M = {metadata = metadata} % \end{macrocode} % \iffalse -% \fi %</lua,lua-loader,lua-unicode-data> %<*lua> +% \fi % \par % \begin{markdown} % @@ -2683,6 +2719,52 @@ defaultOptions.eagerCache = true %</lua,lua-cli,lua-loader> %<*manual-options> +#### Option `experimental` + +`experimental` (default value: `false`) + +% \fi +% \begin{markdown} +% +% \Optitem[false]{experimental}{\opt{true}, \opt{false}} +% +: true + + : Experimental features that are planned to be the new default in the + next major release of the Markdown package will be enabled. + + At the moment, this just means that the version `experimental` of the + theme `witiko/markdown/defaults` will be loaded and warnings for + hard-deprecated features will become errors. However, the effects may + extend to other areas in the future as well. + +: false + + : Experimental features will be disabled. + +% \end{markdown} +% \iffalse +%</manual-options> +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { experimental } + { boolean } + { false } +% \end{macrocode} +% \iffalse +%</tex> +%<*lua,lua-cli,lua-loader> +% \fi +% \begin{macrocode} +defaultOptions.experimental = false +% \end{macrocode} +% \par +% \iffalse +%</lua,lua-cli,lua-loader> +%<*manual-options> + #### Option `singletonCache` `singletonCache` (default value: `true`) @@ -11745,10 +11827,13 @@ pdftex --shell-escape document.tex % \noindent It is expected that the special plain \TeX{} characters have the % expected category codes, when `\input`ting the file. % -%### Typesetting Markdown {#tex-typesetting} +%### Typesetting Markdown and YAML {#tex-typesetting} % % The interface exposes the \mdef{markdownBegin}, \mdef{markdownEnd}, -% \mdef{markinline}, \mdef{markdownInput}, and \mdef{markdownEscape} macros. +% \mdef{yamlBegin}, \mref{yamlEnd}, \mdef{markinline}, \mdef{markdownInput}, +% \mdef{yamlInput}, and \mdef{markdownEscape} macros. +% +%#### Typesetting Markdown and YAML directly % % The \mref{markdownBegin} macro marks the beginning of a markdown document % fragment and the \mref{markdownEnd} macro marks its end. @@ -11806,6 +11891,44 @@ pdftex --shell-escape document.tex % \bye % ``````` % +% The \mref{yamlBegin} macro marks the beginning of an \acro{YAML} document +% fragment and the \mref{yamlEnd} macro marks its end. +% +% \end{markdown} +% \begin{macrocode} +\let\yamlBegin\relax +\def\yamlEnd{\markdownEnd\endgroup} +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \mref{yamlBegin} and \mref{yamlEnd} macros are subject to the same +% limitations as the \mref{markdownBegin} and \mref{markdownEnd} macros. +% +% The following example plain \TeX{} code showcases the usage of the +% \mref{markdownBegin} and \mref{markdownEnd} macros: +% +% ``` tex +% \input markdown +% \yamlBegin +% title: _Hello_ **world** ... +% author: John Doe +% \yamlEnd +% \bye +% ``````` +% +% The above code has the same effect as the below code: +% +% ``` tex +% \input markdown +% \yamlSetup{jekyllData, expectJekyllData, ensureJekyllData} +% \markdownBegin +% title: _Hello_ **world** ... +% author: John Doe +% \markdownEnd +% \bye +% ``````` +% % You can use the \mref{markinline} macro to input inline markdown content. % % \end{markdown} @@ -11838,6 +11961,8 @@ pdftex --shell-escape document.tex % The \mref{markinline} macro is subject to the same limitations as the % \mref{markdownBegin} and \mref{markdownEnd} macros. % +%#### Typesetting Markdown and YAML from external documents +% % You can use the \mref{markdownInput} macro to include markdown documents, % similarly to how you might use the \mref{input} \TeX{} primitive to include % \TeX{} documents. The \mref{markdownInput} macro accepts a single parameter @@ -11851,7 +11976,7 @@ pdftex --shell-escape document.tex % \par % \begin{markdown} % -% This macro is not subject to the limitations of the +% The macro \mref{markdownInput} is not subject to the limitations of the % \mref{markdownBegin} and \mref{markdownEnd} macros. % % The following example plain \TeX{} code showcases the usage of the @@ -11863,6 +11988,47 @@ pdftex --shell-escape document.tex % \bye % ``````` % +% You can use the \mref{yamlInput} macro to include \acro{YAML} documents. +% similarly to how you might use the \mref{input} \TeX{} primitive to include +% \TeX{} documents. The \mref{yamlInput} macro accepts a single parameter with +% the filename of a \acro{YAML} document and expands to the result of the +% conversion of the input \acro{YAML} document to plain \TeX{}. +% +% \end{markdown} +% \begin{macrocode} +\def\yamlInput#1{% + \begingroup + \yamlSetup{jekyllData, expectJekyllData, ensureJekyllData}% + \markdownInput{#1}% + \endgroup +}% +% \end{macrocode} +% \par +% \begin{markdown} +% +% The macro \mref{yamlInput} is also not subject to the limitations of the +% \mref{markdownBegin} and \mref{markdownEnd} macros. +% +% The following example plain \TeX{} code showcases the usage of the +% \mref{markdownInput} macro: +% +% ``` tex +% \input markdown +% \yamlInput{hello.yml} +% \bye +% ``````` +% +% The above code has the same effect as the below code: +% +% ``` tex +% \input markdown +% \yamlSetup{jekyllData, expectJekyllData, ensureJekyllData} +% \markdownInput{hello.yml} +% \bye +% ``````` +% +%#### Typesetting TeX from inside Markdown and YAML documents +% % The \mref{markdownEscape} macro accepts a single parameter with the filename % of a \TeX{} document and executes the \TeX{} document in the middle of a % markdown document fragment. Unlike the `\input` built-in of \TeX, @@ -11983,6 +12149,18 @@ following code in your plain \TeX{} document: \markdownSetup \@@_setup:n % \end{macrocode} +% \begin{markdown} +% +% The command \mdef{yamlSetup} is also available as an alias for the command +% \mref{markdownSetup}. +% +% \end{markdown} +% \begin{macrocode} +\cs_gset_eq:NN + \yamlSetup + \markdownSetup +% \end{macrocode} +% % \iffalse %</tex> %<*manual-options> @@ -12705,7 +12883,7 @@ A PDF document named `document.pdf` should be produced and contain the text \prg_generate_conditional_variant:Nnn \str_if_eq:nn { en } - { F } + { p, F } \msg_new:nnn { markdown } { malformed-name-for-clist-option } @@ -12742,28 +12920,34 @@ User-defined themes for the Markdown package provide a domain-specific interpretation of Markdown tokens. Themes allow the authors to achieve a specific look and other high-level goals without low-level programming. -% The key-values `theme`=\meta{theme name} and `import`=\meta{theme name} load -% a \TeX{} document (further referred to as *a theme*) named -% `markdowntheme`\meta{munged theme name}`.tex`, where the *munged theme name* -% is the *theme name* after the substitution of all forward slashes (`/`) for -% an underscore (`_`). The theme name is *qualified* and contains no -% underscores. A theme name is qualified if and only if it contains at least -% one forward slash. Themes are inspired by the Beamer \LaTeX{} package, which -% provides similar functionality with its `\usetheme` macro [@tantau21, Section -% 15.1]. -% -% Theme names must be qualified to minimize naming conflicts between different -% themes with a similar purpose. The preferred format of a theme name is -% \meta{theme author}`/`\meta{theme purpose}`/`\meta{private naming -% scheme}, where the *private naming scheme* may contain additional forward -% slashes. For example, a theme by a user `witiko` for the MU theme of the -% Beamer document class may have the name `witiko/beamer/MU`. +% The key-values `theme`=\meta{theme name} and `import`=\meta{theme name}, +% optionally followed by `@`\meta{theme version}, load a \TeX{} document +% (further referred to as *a theme*) named `markdowntheme`\meta{munged theme +% name}`.tex`, where the *munged theme name* is the *theme name* after the +% substitution of all forward slashes (`/`) for an underscore (`_`). +% The theme name must be *qualified* and contain no underscores or at signs +% (`@`). Themes are inspired by the Beamer \LaTeX{} package, which provides +% similar functionality with its `\usetheme` macro [@tantau21, Section 15.1]. +% +% A theme name is qualified if and only if it contains at least one forward +% slash. Theme names must be qualified to minimize naming conflicts between +% different themes with a similar purpose. The preferred format of a theme name +% is \meta{theme author}`/`\meta{theme purpose}`/`\meta{private naming scheme}, +% where the *private naming scheme* may contain additional forward slashes. For +% example, a theme by a user `witiko` for the MU theme of the Beamer document +% class may have the name `witiko/beamer/MU`. % % Theme names are munged to allow structure inside theme names without % dictating where the themes should be located inside the \TeX{} directory % structure. For example, loading a theme named `witiko/beamer/MU` would % load a \TeX{} document package named `markdownthemewitiko_beamer_MU.tex`. % +% If `@`\meta{theme version} is specified after \meta{theme name}, then the +% text *theme version* will be available in the macro +% \mdef{markdownThemeVersion} when the theme is loaded. If `@`\meta{theme +% version} is not specified, the macro \mref{markdownThemeVersion} will +% contain the text `latest` [@novotny24]. +% % \end{markdown} % \iffalse %</manual-options> @@ -12806,21 +12990,31 @@ a specific look and other high-level goals without low-level programming. % \begin{markdown} % % To keep track of the current theme when themes are nested, we will -% maintain the \mdef{g_\@\@_themes_seq} stack of theme names. -% For convenience, the name of the current theme is also available in the -% \mdef{g_@@_current_theme_tl} macro. +% maintain the stacks \mdef{g_\@\@_theme_names_seq} and +% \mdef{g_\@\@_theme_versions_seq} stack of theme names and versions, +% respectively. For convenience, the name of the current theme and version is +% also available in the macros \mdef{g_@@_current_theme_tl} and +% \mref{markdownThemeVersion}, respectively. % % \end{markdown} % \begin{macrocode} \seq_new:N - \g_@@_themes_seq + \g_@@_theme_names_seq +\seq_new:N + \g_@@_theme_versions_seq \tl_new:N \g_@@_current_theme_tl \tl_gset:Nn \g_@@_current_theme_tl { } \seq_gput_right:NV - \g_@@_themes_seq + \g_@@_theme_names_seq + \g_@@_current_theme_tl +\cs_new:Npn + \markdownThemeVersion + { } +\seq_gput_right:NV + \g_@@_theme_versions_seq \g_@@_current_theme_tl \cs_new:Nn \@@_set_theme:n @@ -12853,13 +13047,55 @@ a specific look and other high-level goals without low-level programming. % \end{macrocode} % \begin{markdown} % +% Next, we extract the theme version. +% +% \end{markdown} +% \begin{macrocode} + \str_if_in:nnTF + { #1 } + { @ } + { + \regex_extract_once:nnN + { (.*) @ (.*) } + { #1 } + \l_tmpa_seq + \seq_gpop_left:NN + \l_tmpa_seq + \l_tmpa_tl + \seq_gpop_left:NN + \l_tmpa_seq + \l_tmpa_tl + \tl_gset:NV + \g_@@_current_theme_tl + \l_tmpa_tl + \seq_gpop_left:NN + \l_tmpa_seq + \l_tmpa_tl + \cs_gset:Npe + \markdownThemeVersion + { + \tl_use:N + \l_tmpa_tl + } + } + { + \tl_gset:Nn + \g_@@_current_theme_tl + { #1 } + \cs_gset:Npn + \markdownThemeVersion + { latest } + } +% \end{macrocode} +% \begin{markdown} +% % Next, we munge the theme name. % % \end{markdown} % \begin{macrocode} - \str_set:Nn + \str_set:NV \l_tmpa_str - { #1 } + \g_@@_current_theme_tl \str_replace_all:Nnn \l_tmpa_str { / } @@ -12867,28 +13103,56 @@ a specific look and other high-level goals without low-level programming. % \end{macrocode} % \begin{markdown} % -% Finally, we load the theme. +% Finally, we load the theme. Before loading the theme, we push down the +% current name and version of the theme on the stack. % % \end{markdown} % \begin{macrocode} - \tl_gset:Nn + \tl_set:NV + \l_tmpa_tl + \g_@@_current_theme_tl + \tl_put_right:Nn \g_@@_current_theme_tl - { #1 / } + { / } \seq_gput_right:NV - \g_@@_themes_seq + \g_@@_theme_names_seq \g_@@_current_theme_tl - \@@_load_theme:nV - { #1 } + \seq_gput_right:NV + \g_@@_theme_versions_seq + \markdownThemeVersion + \@@_load_theme:VeV + \l_tmpa_tl + { \markdownThemeVersion } \l_tmpa_str +% \end{macrocode} +% \begin{markdown} +% +% After the theme has been loaded, we recover the name and version of the +% previous theme from the stack. +% +% \end{markdown} +% \begin{macrocode} \seq_gpop_right:NN - \g_@@_themes_seq + \g_@@_theme_names_seq \l_tmpa_tl \seq_get_right:NN - \g_@@_themes_seq + \g_@@_theme_names_seq \l_tmpa_tl \tl_gset:NV \g_@@_current_theme_tl \l_tmpa_tl + \seq_gpop_right:NN + \g_@@_theme_versions_seq + \l_tmpa_tl + \seq_get_right:NN + \g_@@_theme_versions_seq + \l_tmpa_tl + \cs_gset:Npe + \markdownThemeVersion + { + \tl_use:N + \l_tmpa_tl + } } \msg_new:nnnn { markdown } @@ -12903,6 +13167,9 @@ a specific look and other high-level goals without low-level programming. \cs_generate_variant:Nn \tl_replace_all:Nnn { NnV } +\cs_generate_variant:Nn + \cs_gset:Npn + { Npe } \ExplSyntaxOff % \end{macrocode} % \iffalse @@ -13046,20 +13313,21 @@ options locally. % % \end{markdown} % \begin{macrocode} +\tl_new:N + \l_@@_current_snippet_tl \prg_new_conditional:Nnn \@@_if_snippet_exists:n { TF, T, F } { \tl_set:NV - \l_tmpa_tl + \l_@@_current_snippet_tl \g_@@_current_theme_tl \tl_put_right:Nn - \l_tmpa_tl + \l_@@_current_snippet_tl { #1 } - \prop_get:NVNTF + \prop_if_in:NVTF \g_@@_snippets_prop - \l_tmpa_tl - \l_tmpb_tl + \l_@@_current_snippet_tl { \prg_return_true: } { \prg_return_false: } } @@ -15735,7 +16003,7 @@ following text: % % \begin{markdown} -#### Emphasis Renderers +#### Emphasis Renderers {#emphasis-renderers} The \mdef{markdownRendererEmphasis} macro represents an emphasized span of text. The macro receives a single argument that corresponds to the emphasized span of text. @@ -19644,7 +19912,7 @@ following text: % % \begin{markdown} -#### Table Renderer +#### Table Renderer {#table-renderer} The \mdef{markdownRendererTable} macro represents a table. This macro will only be produced, when the \Opt{pipeTables} option is enabled. The macro receives the parameters `{`\meta{caption}`}{`\meta{number of rows}`}{`\meta{number of columns}`}` @@ -20550,24 +20818,47 @@ removed in Markdown 4.0.0. \cs_if_exist:NTF \markdownRendererJekyllDataString { - \markdownWarning + \@@_if_option:nTF + { experimental } { - The~jekyllDataString~renderer~has~been~deprecated,~ - to~be~removed~in~Markdown~4.0.0 + \markdownError + { + The~jekyllDataString~renderer~has~been~deprecated,~ + to~be~removed~in~Markdown~4.0.0 + } + } + { + \markdownWarning + { + The~jekyllDataString~renderer~has~been~deprecated,~ + to~be~removed~in~Markdown~4.0.0 + } + \markdownRendererJekyllDataString } - \markdownRendererJekyllDataString } { \cs_if_exist:NTF \markdownRendererJekyllDataStringPrototype { - \markdownWarning + \@@_if_option:nTF + { experimental } { - The~jekyllDataString~renderer~prototype~ - has~been~deprecated,~ - to~be~removed~in~Markdown~4.0.0 + \markdownError + { + The~jekyllDataString~renderer~prototype~ + has~been~deprecated,~ + to~be~removed~in~Markdown~4.0.0 + } + } + { + \markdownWarning + { + The~jekyllDataString~renderer~prototype~ + has~been~deprecated,~ + to~be~removed~in~Markdown~4.0.0 + } + \markdownRendererJekyllDataStringPrototype } - \markdownRendererJekyllDataStringPrototype } { \markdownRendererJekyllDataTypographicStringPrototype @@ -21802,12 +22093,12 @@ following text: % \begin{markdown} % % The \mdef{markdownReadAndConvert} macro implements the \mref{markdownBegin} -% macro. The first argument specifies the token sequence that will terminate -% the markdown input (\mref{markdownEnd} in the instance of the \mref{markdownBegin} -% macro) when the plain \TeX{} special characters have had their category -% changed to *other*. The second argument specifies the token sequence -% that will actually be inserted into the document, when the ending token -% sequence has been found. +% and \mref{yamlBegin} macros. The first argument specifies the token sequence +% that will terminate the markdown input when the plain \TeX{} special +% characters have had their category changed to *other*: \mref{markdownEnd} for +% the \mref{markdownBegin} macro and \mref{yamlEnd} for the \mref{yamlBegin} +% macro. The second argument specifies the token sequence that will actually be +% inserted into the document, when the ending token sequence has been found. % % \end{markdown} % \begin{macrocode} @@ -21826,6 +22117,11 @@ following text: |gdef|markdownBegin{% |markdownReadAndConvert{\markdownEnd}% {|markdownEnd}}% + |gdef|yamlBegin{% + |begingroup + |yamlSetup{jekyllData, expectJekyllData, ensureJekyllData}% + |markdownReadAndConvert{\yamlEnd}% + {|yamlEnd}}% |endgroup % \end{macrocode} % \begin{markdown} @@ -21968,16 +22264,16 @@ pdflatex --shell-escape document.tex % \begin{markdown} % %### Typesetting Markdown -% The interface exposes the \envmdef{markdown} and \envmdef{markdown*} -% \LaTeX{} environments, and redefines the \mref{markinline} and -% \mref{markdownInput} commands. % -%#### The `markdown` and `markdown*` \LaTeX{} environments -% The \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are used -% to typeset markdown document fragments. Both \LaTeX{} environments accept -% \LaTeX{} interface options (see Section <#sec:latex-options>) as the only -% argument. This argument is optional for the \envmref{markdown} environment -% and mandatory for the \envmref{markdown*} environment. +% The interface exposes the \envmdef{markdown}, \envmdef{markdown*}, and +% \envmdef{yaml} \LaTeX{} environments, and redefines the \mref{markinline}, +% \mref{markdownInput}, and \mref{yamlInput} commands. +% +%#### Typesetting Markdown and YAML directly +% +% The \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are +% aliases for the macros \mref{markdownBegin} and \mref{markdownEnd} exposed +% by the plain \TeX{} interface. % % The \envmref{markdown*} environment has been deprecated and will be removed % in the next major version of the Markdown package. @@ -21989,26 +22285,25 @@ pdflatex --shell-escape document.tex % \end{macrocode} % \markdownBegin % -% You may prepend your own code to the \mdef{markdown} macro and append your own -% code to the \mref{markdownEnd} macro to produce special effects before and after -% the \envmref{markdown} \LaTeX{} environment (and likewise for the starred -% version). +% Furthermore, both environments accept \LaTeX{} interface options (see Section +% <#sec:latex-options>) as the only argument. This argument is optional for the +% \envmref{markdown} environment and mandatory for the \envmref{markdown*} +% environment. % -% Note that the \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are -% subject to the same limitations as the \mref{markdownBegin} and \mref{markdownEnd} -% macros exposed by the plain \TeX{} interface. +% The \envmref{markdown} and \envmref{markdown*} environments are +% subject to the same limitations as the \mref{markdownBegin} and +% \mref{markdownEnd} macros. % % The following example \LaTeX{} code showcases the usage of the % \envmref{markdown} and \envmref{markdown*} environments: +% % ``` tex % \documentclass{article} \documentclass{article} % \usepackage{markdown} \usepackage{markdown} % \begin{document} \begin{document} -% \% ... \% ... % \begin{markdown}[smartEllipses] \begin{markdown*}{smartEllipses} % _Hello_ **world** ... _Hello_ **world** ... % \end{markdown} \end{markdown*} -% \% ... \% ... % \end{document} \end{document} % ``````` % @@ -22036,12 +22331,16 @@ pdflatex --shell-escape document.tex % ``` % % Specifically, the \mref{markdown} macro must appear at the end of the -% replacement text and must be followed by text that has not yet been ingested -% by \TeX's input processor. Furthermore, using the \mref{markdownEnd} macro is -% optional and only makes a difference if you redefined it to produce special -% effects before and after the \envmref{markdown} \LaTeX{} environment. Lastly, -% you can't nest the other environments. For example, the following definition -% is incorrect: +% replacement before-text and must be followed by text that has not yet been +% ingested by \TeX's input processor. +% +% Furthermore, using the \mref{markdownEnd} macro in of after the replacement +% after-text is optional and only makes a difference if you redefined it to +% produce special effects before and after the \envmref{markdown} \LaTeX{} +% environment. +% +% Lastly, you can't nest the other environments. For example, the following +% definition would be incorrect: % % ``` tex % \newenvironment{bar}{\begin{foo}}{\end{foo}} @@ -22054,37 +22353,187 @@ pdflatex --shell-escape document.tex % \newenvironment{bar}{\markdown[some, options]}{\markdownEnd} % ``` % +% The \envmref{yaml} \LaTeX{} environment is an alias for the macros +% \mref{yamlBegin} and \mref{yamlEnd} exposed by the plain \TeX{} interface. +% +% \end{markdown} +% \begin{macrocode} +\newenvironment{yaml}\relax\relax +% \end{macrocode} +% \begin{markdown} +% +% Furthermore, the environment accepts \LaTeX{} interface options (see Section +% <#sec:latex-options>) as the only optional argument. +% +% The \envmref{yaml} environment is subject to the same limitations as +% the \mref{markdownBegin} and \mref{markdownEnd} macros. +% +% The following example \LaTeX{} code showcases the usage of the +% \envmref{yaml} environment: +% +% ``` tex +% \documentclass{article} +% \usepackage{markdown} +% \begin{document} +% \begin{yaml}[smartEllipses] +% title: _Hello_ **world** ... +% author: John Doe +% \end{yaml} +% \end{document} +% ``````` +% % \end{markdown} % \markdownBegin % -%#### The `\markinline` and `\markdownInput` macros +% The above code has the same effect as the below code: +% +% ``` tex +% \documentclass{article} +% \usepackage{markdown} +% \begin{document} +% \begin{markdown}[ +% jekyllData, +% expectJekyllData, +% ensureJekyllData, +% smartEllipses, +% ] +% title: _Hello_ **world** ... +% author: John Doe +% \end{markdown} +% \end{document} +% ``````` +% +% You can't directly extend the \envmref{yaml} \LaTeX{} environment by using it +% in other environments. However, you can work around this limitation by using +% the \mref{yaml} and \mref{yamlEnd} macros directly in the definition, +% similarly to the \mref{markdown} and \mref{markdownEnd} macros described +% previously. Unlike with the \mref{markdown} and \mref{markdownEnd} macros, +% The \mref{yamlEnd} macro _must_ be used in or after the replacement after-text. +% % The \mref{markinline} macro accepts a single mandatory parameter containing % inline markdown content and expands to the result of the conversion of the % input markdown document to plain \TeX{}. Unlike the \mref{markinline} macro % provided by the plain \TeX{} interface, this macro also accepts \LaTeX{} % interface options (see Section <#sec:latex-options>) as its optional -% argument. These options will only influnce this markdown content. +% argument. These options will only influence this markdown content. +% +%#### Typesetting Markdown and YAML from external documents % % The \mref{markdownInput} macro accepts a single mandatory parameter containing % the filename of a markdown document and expands to the result of the % conversion of the input markdown document to plain \TeX{}. Unlike the % \mref{markdownInput} macro provided by the plain \TeX{} interface, this macro % also accepts \LaTeX{} interface options (see Section <#sec:latex-options>) -% as its optional argument. These options will only influnce this markdown +% as its optional argument. These options will only influence this markdown % document. % % The following example \LaTeX{} code showcases the usage of the % \mref{markdownInput} macro: +% % ``` tex % \documentclass{article} % \usepackage{markdown} % \begin{document} -% % ... % \markdownInput[smartEllipses]{hello.md} -% % ... % \end{document} % ``````` % +% The \mref{yamlInput} macro accepts a single mandatory parameter containing +% the filename of a \acro{YAML} document and expands to the result of the +% conversion of the input \acro{YAML} document to plain \TeX{}. Unlike the +% \mref{yamlInput} macro provided by the plain \TeX{} interface, this macro +% also accepts \LaTeX{} interface options (see Section <#sec:latex-options>) +% as its optional argument. These options will only influence this \acro{YAML} +% document. +% +% The following example \LaTeX{} code showcases the usage of the +% \mref{yamlInput} macro: +% +% ``` tex +% \documentclass{article} +% \usepackage{markdown} +% \begin{document} +% \yamlInput[smartEllipses]{hello.yml} +% \end{document} +% ``````` +% +% The above code has the same effect as the below code: +% +% ``` tex +% \documentclass{article} +% \usepackage{markdown} +% \begin{document} +% \markdownInput[ +% jekyllData, +% expectJekyllData, +% ensureJekyllData, +% smartEllipses, +% ]{hello.yml} +% \end{document} +% ``````` +% +%### Using \LaTeX{} hooks with the Markdown package +% +% \LaTeX{} provides an intricate hook management system that allows users to +% insert extra material before and after certain \TeX{} macros and \LaTeX{} +% environments, among other things. [@mittelbach24, Section 3.1.2] +% +% The Markdown package is compatible with hooks and allows the use of hooks +% to insert extra material before \TeX{} commands and before/after \LaTeX{} +% environments without restriction: +% +% ``` tex +% \documentclass{article} +% \usepackage{markdown} +% \begin{document} +% \AddToHook{cmd/markdownRendererEmphasis/before}{emphasis: } +% \AddToHook{env/markdown/before}{<markdown>} +% \AddToHook{env/markdown/after}{</markdown>} +% \begin{markdown} +% foo _bar_ baz! +% \end{markdown} +% \end{document} +% ``` +% +% Processing the above example with \LaTeX{} will produce the text +% “<markdown>foo emphasis: _bar_ baz!</markdown>”, as expected. +% +% However, using hooks to insert extra material after \TeX{} commands only works +% for commands with a fixed number of parameters that don't use currying. +% +% If, in the above example, you explicitly defined the renderer for emphasis +% using \mref{markdownSetup} or another method that does not use currying, then +% you would be able to insert extra material even after the renderer: +% +% ``` tex +% \documentclass{article} +% \usepackage{markdown} +% \markdownSetup{renderers={emphasis={\emph{#1}}}} +% \begin{document} +% \AddToHook{cmd/markdownRendererEmphasis/before}{<emphasis>} +% \AddToHook{cmd/markdownRendererEmphasis/after}{</emphasis>} +% \AddToHook{env/markdown/before}{<markdown>} +% \AddToHook{env/markdown/after}{</markdown>} +% \begin{markdown} +% foo _bar_ baz! +% \end{markdown} +% \end{document} +% ``` +% +% Processing the above example with \LaTeX{} will produce the text +% “<markdown>foo <emphasis>_bar_</emphasis> baz!</markdown>”, as expected. +% +% However, the default renderer for emphasis uses currying and calls the +% renderer prototype in a way that prevents the use of hooks to insert extra +% material after the renderer, see Section~<#sec:emphasis-renderers>. In such +% a case, you would need to redefine the renderer in a way that does not use +% currying before you would be able to use hooks to insert extra material +% after it. +% +% Hooks also cannot be used to insert extra material after renderers with a +% variable number of parameters such as the renderer for tables, see +% Section~<#sec:table-renderer>. +% %### Options {#latex-options} % % The \LaTeX{} options are represented by a comma-delimited list of @@ -22500,6 +22949,7 @@ following image: % \begin{macrocode} \AtEndOfPackage{ \markdownLaTeXLoadedtrue +} % \end{macrocode} % \begin{markdown} % @@ -22510,17 +22960,39 @@ following image: % % \end{markdown} % \begin{macrocode} - \markdownIfOption{noDefaults}{}{ - \markdownSetup{theme=witiko/markdown/defaults} +\ExplSyntaxOn +\str_if_eq:VVT + \c_@@_top_layer_tl + \c_@@_option_layer_latex_tl + { + \ExplSyntaxOff + \AtEndOfPackage + { + \@@_if_option:nF + { noDefaults } + { + \@@_if_option:nTF + { experimental } + { + \@@_setup:n + { theme = witiko/markdown/defaults@experimental } + } + { + \@@_setup:n + { theme = witiko/markdown/defaults } + } + } + } + \ExplSyntaxOn } -} +\ExplSyntaxOff % \end{macrocode} % \iffalse %</latex> %<*themes-witiko-markdown-defaults-latex> % \fi % \begin{macrocode} -\ProvidesPackage{markdownthemewitiko_markdown_defaults}[2024/01/03]% +\ProvidesPackage{markdownthemewitiko_markdown_defaults}[2024/10/29]% % \end{macrocode} % \iffalse %</themes-witiko-markdown-defaults-latex> @@ -22633,16 +23105,22 @@ following text: % \noindent It is expected that the special plain \TeX{} characters have the % expected category codes, when `\input`ting the file. % -%### Typesetting Markdown -% The interface exposes the \mdef{startmarkdown} and \mdef{stopmarkdown} macro -% pair for the typesetting of a markdown document fragment, and defines the -% \mdef{inputmarkdown} macro. +%### Typesetting Markdown and YAML +% +% The interface exposes the \mdef{startmarkdown}, \mdef{stopmarkdown}, +% \mdef{startyaml}, \mdef{stopyaml}, \mdef{inputmarkdown}, and \mdef{inputyaml} +% macros. +% +%#### Typesetting Markdown and YAML directly +% +% The \mref{startmarkdown} and \mref{stopmarkdown} macros are aliases for the +% macros \mref{markdownBegin} and \mref{markdownEnd} exposed by the plain +% \TeX{} interface. % % \end{markdown} % \begin{macrocode} \let\startmarkdown\relax \let\stopmarkdown\relax -\let\inputmarkdown\relax % \end{macrocode} % \par % \begin{markdown} @@ -22651,12 +23129,12 @@ following text: % \mref{stopmarkdown} macro to produce special effects before and after the % markdown block. % -% Note that the \mref{startmarkdown} and \mref{stopmarkdown} macros -% are subject to the same limitations as the \mref{markdownBegin} and -% \mref{markdownEnd} macros exposed by the plain \TeX{} interface. +% The macros \mref{startmarkdown} and \mref{stopmarkdown} are subject to the +% same limitations as the \mref{markdownBegin} and \mref{markdownEnd} macros. % % The following example \Hologo{ConTeXt} code showcases the usage of the % \mref{startmarkdown} and \mref{stopmarkdown} macros: +% % ``` tex % \usemodule[t][markdown] % \starttext @@ -22666,22 +23144,117 @@ following text: % \stoptext % ``````` % -% The \mref{inputmarkdown} macro accepts a single mandatory parameter -% containing the filename of a markdown document and expands to the result of -% the conversion of the input markdown document to plain \TeX{}. Unlike the -% \mref{markdownInput} macro provided by the plain \TeX{} interface, this macro -% also accepts \Hologo{ConTeXt} interface options (see Section -% <#sec:context-options>) as its optional argument. These options will only -% influnce this markdown document. +% The \mref{startyaml} and \mref{stopyaml} macros are aliases for the macros +% \mref{yamlBegin} and \mref{yamlEnd} exposed by the plain \TeX{} interface. +% +% \end{markdown} +% \begin{macrocode} +\let\startyaml\relax +\let\stopyaml\relax +% \end{macrocode} +% \par +% \begin{markdown} +% +% You may prepend your own code to the \mref{startyaml} macro and append your +% own code to the \mref{stopyaml} macro to produce special effects before and +% after the \acro{YAML} document. +% +% The macros \mref{startyaml} and \mref{stopyaml} are subject to the same +% limitations as the \mref{markdownBegin} and \mref{markdownEnd} macros. +% +% The following example \Hologo{ConTeXt} code showcases the usage of the +% \mref{startyaml} and \mref{stopyaml} macros: +% +% ``` tex +% \usemodule[t][markdown] +% \starttext +% \startyaml +% title: _Hello_ **world** ... +% author: John Doe +% \stopyaml +% \stoptext +% ``````` +% +% The above code has the same effect as the below code: +% +% ``` tex +% \usemodule[t][markdown] +% \starttext +% \setupyaml[jekyllData, expectJekyllData, ensureJekyllData] +% \startyaml +% title: _Hello_ **world** ... +% author: John Doe +% \stopyaml +% \stoptext +% ``````` +% +%#### Typesetting Markdown and YAML from external documents +% +% The \mref{inputmarkdown} macro aliases the macro \mref{markdownInput} exposed +% by the plain \TeX{} interface. +% +% \end{markdown} +% \begin{macrocode} +\let\inputmarkdown\relax +% \end{macrocode} +% \par +% \begin{markdown} +% +% Furthermore, the \mref{inputmarkdown} macro also accepts \Hologo{ConTeXt} +% interface options (see Section <#sec:context-options>) as its optional +% argument. These options will only influence this markdown document. +% +% The following example \Hologo{ConTeXt} code showcases the usage of the +% \mref{inputmarkdown} macro: % -% The following example \LaTeX{} code showcases the usage of the -% \mref{markdownInput} macro: % ``` tex % \usemodule[t][markdown] % \starttext -% % ... % \inputmarkdown[smartEllipses]{hello.md} -% % ... +% \stoptext +% ``````` +% +% The above code has the same effect as the below code: +% +% ``` tex +% \usemodule[t][markdown] +% \starttext +% \setupmarkdown[smartEllipses] +% \inputmarkdown{hello.md} +% \stoptext +% ``````` +% +% The \mref{inputyaml} macro aliases the macro \mref{yamlInput} exposed by the +% plain \TeX{} interface. +% +% \end{markdown} +% \begin{macrocode} +\let\inputyaml\relax +% \end{macrocode} +% \par +% \begin{markdown} +% +% Furthermore, the \mref{inputyaml} macro also accepts \Hologo{ConTeXt} +% interface options (see Section <#sec:context-options>) as its optional +% argument. These options will only influence this \acro{YAML} document. +% +% The following example \Hologo{ConTeXt} code showcases the usage of the +% \mref{inputyaml} macro: +% +% ``` tex +% \usemodule[t][markdown] +% \starttext +% \inputyaml[smartEllipses]{hello.yml} +% \stoptext +% ``````` +% +% The above code has the same effect as the below code: +% +% ``` tex +% \usemodule[t][markdown] +% \starttext +% \setupyaml[smartEllipses] +% \inputyaml{hello.yml} % \stoptext % ``````` % @@ -22711,7 +23284,17 @@ following text: \@@_setup:n { #1 } } -\ExplSyntaxOff +% \end{macrocode} +% \begin{markdown} +% +% The command \mdef{setupyaml} is also available as an alias for +% the command \mref{setupmarkdown}. +% +% \end{markdown} +% \begin{macrocode} +\cs_gset_eq:NN + \setupyaml + \setupmarkdown % \end{macrocode} % \begin{markdown} % @@ -22722,7 +23305,6 @@ following text: % % \end{markdown} % \begin{macrocode} -\ExplSyntaxOn \cs_new:Nn \@@_caseless:N { \regex_replace_all:nnN @@ -34563,53 +35145,91 @@ end % \begin{macrocode} \ExplSyntaxOn \prop_new:N \g_@@_plain_tex_loaded_themes_linenos_prop +\prop_new:N \g_@@_plain_tex_loaded_themes_versions_prop \cs_new:Nn - \@@_plain_tex_load_theme:nn + \@@_plain_tex_load_theme:nnn { \prop_get:NnNTF \g_@@_plain_tex_loaded_themes_linenos_prop { #1 } \l_tmpa_tl { - \msg_warning:nnnV - { markdown } - { repeatedly-loaded-plain-tex-theme } + \prop_get:NnN + \g_@@_plain_tex_loaded_themes_versions_prop { #1 } - \l_tmpa_tl + \l_tmpb_tl + \str_if_eq:nVTF + { #2 } + \l_tmpb_tl + { + \msg_warning:nnnVn + { markdown } + { repeatedly-loaded-plain-tex-theme } + { #1 } + \l_tmpa_tl + { #2 } + } + { + \msg_error:nnnnVV + { markdown } + { different-versions-of-plain-tex-theme } + { #1 } + { #2 } + \l_tmpb_tl + \l_tmpa_tl + } } { - \msg_info:nnn + \msg_info:nnnn { markdown } { loading-plain-tex-theme } { #1 } + { #2 } \prop_gput:Nnx \g_@@_plain_tex_loaded_themes_linenos_prop { #1 } { \tex_the:D \tex_inputlineno:D } + \prop_gput:Nnn + \g_@@_plain_tex_loaded_themes_versions_prop + { #1 } + { #2 } \file_input:n - { markdown theme #2 } + { markdown theme #3 } } } \msg_new:nnn { markdown } { loading-plain-tex-theme } - { Loading~plain~TeX~Markdown~theme~#1 } + { Loading~version~#2~of~plain~TeX~Markdown~theme~#1 } \msg_new:nnn { markdown } { repeatedly-loaded-plain-tex-theme } { - Plain~TeX~Markdown~theme~#1~was~previously~ + Version~#3~of~plain~TeX~Markdown~theme~#1~was~previously~ loaded~on~line~#2,~not~loading~it~again } +\msg_new:nnn + { markdown } + { different-versions-of-plain-tex-theme } + { + Tried~to~load~version~#2~of~plain~TeX~Markdown~theme~#1~ + but~version~#3~has~already~been~loaded~on~line~#4 + } \cs_generate_variant:Nn \prop_gput:Nnn { Nnx } \cs_gset_eq:NN - \@@_load_theme:nn - \@@_plain_tex_load_theme:nn + \@@_load_theme:nnn + \@@_plain_tex_load_theme:nnn \cs_generate_variant:Nn - \@@_load_theme:nn - { nV } + \@@_load_theme:nnn + { VeV } +\cs_generate_variant:Nn + \msg_error:nnnnnn + { nnnnVV } +\cs_generate_variant:Nn + \msg_warning:nnnnn + { nnnVn } % \end{macrocode} % \begin{markdown} % @@ -34664,16 +35284,17 @@ end % % \end{markdown} % \begin{macrocode} - \@@_plain_tex_load_theme:VV + \@@_plain_tex_load_theme:VeV \l_tmpb_tl + { \markdownThemeVersion } \l_tmpa_str } \cs_generate_variant:Nn \tl_set:Nn { Ne } \cs_generate_variant:Nn - \@@_plain_tex_load_theme:nn - { VV } + \@@_plain_tex_load_theme:nnn + { VeV } \ExplSyntaxOff % \end{macrocode} % \iffalse @@ -35175,8 +35796,16 @@ end \@@_if_option:nF { noDefaults } { - \@@_setup:n - {theme = witiko/markdown/defaults} + \@@_if_option:nTF + { experimental } + { + \@@_setup:n + { theme = witiko/markdown/defaults@experimental } + } + { + \@@_setup:n + { theme = witiko/markdown/defaults } + } } \ExplSyntaxOn } @@ -35997,9 +36626,10 @@ end % \begin{markdown} % % The \mdef{markdownInputPlainTeX} macro is used to store the original plain -% \TeX{} implementation of the \mref{markdownInput} macro. The \mref{markdownInput} -% macro is then redefined to accept an optional argument with options recognized by -% the \LaTeX{} interface (see Section <#sec:latex-options>). +% \TeX{} implementation of the \mref{yamlInput} macro. The \mref{markdownInput} +% and \mref{yamlInput} macros are then redefined to accept an optional argument +% with options recognized by the \LaTeX{} interface (see Section +% <#sec:latex-options>). % % \end{markdown} % \begin{macrocode} @@ -36009,12 +36639,17 @@ end \markdownSetup{#1}% \markdownInputPlainTeX{#2}% \endgroup}% +\renewcommand\yamlInput[2][]{% + \begingroup + \yamlSetup{jekyllData, expectJekyllData, ensureJekyllData, #1}% + \markdownInputPlainTeX{#2}% + \endgroup}% % \end{macrocode} % \par % \begin{markdown} % -% The \envmref{markdown}, and \envmref{markdown*} \LaTeX{} environments are -% implemented using the \mref{markdownReadAndConvert} macro. +% The \envmref{markdown}, \envmref{markdown*}, and \envmref{yaml} \LaTeX{} +% environments are implemented using the \mref{markdownReadAndConvert} macro. % % \end{markdown} % \begin{macrocode} @@ -36133,16 +36768,34 @@ end { markdown* } [ 1 ] { - \msg_warning:nnn - { markdown } - { latex-markdown-star-deprecated } - { #1 } + \@@_if_option:nTF + { experimental } + { + \msg_error:nnn + { markdown } + { latex-markdown-star-deprecated } + { #1 } + } + { + \msg_warning:nnn + { markdown } + { latex-markdown-star-deprecated } + { #1 } + } \@@_setup:n { #1 } \markdownReadAndConvert@ { markdown* } } { \markdownEnd } +\renewenvironment + { yaml } + { + \group_begin: + \yamlSetup{jekyllData, expectJekyllData, ensureJekyllData}% + \markdown + } + { \yamlEnd } \msg_new:nnn { markdown } { latex-markdown-star-deprecated } @@ -36183,8 +36836,10 @@ end % \end{markdown} % \begin{macrocode} \ExplSyntaxOn +\prop_new:N \g_@@_latex_loaded_themes_linenos_prop +\prop_new:N \g_@@_latex_loaded_themes_versions_prop \cs_gset:Nn - \@@_load_theme:nn + \@@_load_theme:nnn { % \end{macrocode} % \par @@ -36208,7 +36863,7 @@ end % \end{markdown} % \begin{macrocode} \file_if_exist:nTF - { markdown theme #2.sty } + { markdown theme #3.sty } { \msg_error:nnn { markdown } @@ -36216,9 +36871,10 @@ end { #1 } } { - \@@_plain_tex_load_theme:nn + \@@_plain_tex_load_theme:nnn { #1 } { #2 } + { #3 } } \else % \end{macrocode} @@ -36231,19 +36887,61 @@ end % \end{markdown} % \begin{macrocode} \file_if_exist:nTF - { markdown theme #2.sty } + { markdown theme #3.sty } { - \msg_info:nnn - { markdown } - { loading-latex-theme } + \prop_get:NnNTF + \g_@@_latex_loaded_themes_linenos_prop { #1 } - \RequirePackage - { markdown theme #2 } + \l_tmpa_tl + { + \prop_get:NnN + \g_@@_latex_loaded_themes_versions_prop + { #1 } + \l_tmpb_tl + \str_if_eq:nVTF + { #2 } + \l_tmpb_tl + { + \msg_warning:nnnVn + { markdown } + { repeatedly-loaded-latex-theme } + { #1 } + \l_tmpa_tl + { #2 } + } + { + \msg_error:nnnnVV + { markdown } + { different-versions-of-latex-theme } + { #1 } + { #2 } + \l_tmpb_tl + \l_tmpa_tl + } + } + { + \msg_info:nnnn + { markdown } + { loading-latex-theme } + { #1 } + { #2 } + \prop_gput:Nnx + \g_@@_latex_loaded_themes_linenos_prop + { #1 } + { \tex_the:D \tex_inputlineno:D } + \prop_gput:Nnn + \g_@@_latex_loaded_themes_versions_prop + { #1 } + { #2 } + \RequirePackage + { markdown theme #3 } + } } { - \@@_plain_tex_load_theme:nn + \@@_plain_tex_load_theme:nnn { #1 } { #2 } + { #3 } } \fi \else @@ -36255,14 +36953,15 @@ end % % \end{markdown} % \begin{macrocode} - \msg_info:nnn + \msg_info:nnnn { markdown } { theme-loading-postponed } { #1 } + { #2 } \AtEndOfPackage { \@@_set_theme:n - { #1 } + { #1 @ #2 } } \fi } @@ -36270,13 +36969,27 @@ end { markdown } { theme-loading-postponed } { - Postponing~loading~Markdown~theme~#1~until~ + Postponing~loading~version~#2~of~Markdown~theme~#1~until~ Markdown~package~has~finished~loading } \msg_new:nnn { markdown } { loading-latex-theme } - { Loading~LaTeX~Markdown~theme~#1 } + { Loading~version~#2~of~LaTeX~Markdown~theme~#1 } +\msg_new:nnn + { markdown } + { repeatedly-loaded-latex-theme } + { + Version~#3~of~LaTeX~Markdown~theme~#1~was~previously~ + loaded~on~line~#2,~not~loading~it~again + } +\msg_new:nnn + { markdown } + { different-versions-of-latex-theme } + { + Tried~to~load~version~#2~of~LaTeX~Markdown~theme~#1~ + but~version~#3~has~already~been~loaded~on~line~#4 + } \cs_generate_variant:Nn \msg_new:nnnn { nnVV } @@ -36565,87 +37278,274 @@ end \markdownIfOption{plain}{\iffalse}{\iftrue} % \end{macrocode} % \par -% \begin{markdown}% +% \begin{markdown} +% +%#### Lists +% % If either the \Opt{tightLists} or the \Opt{fancyLists} Lua option is enabled -% and the current document class is not \pkg{beamer}, then load the -% \pkg{paralist} package. +% and the current document class is not \pkg{beamer}, use a package that +% provides support for tight and fancy lists. +% +% If either the package \pkg{paralist} or the package \pkg{enumitem} have already +% been loaded, use them. Otherwise, if the option \Opt{experimental} or any test +% phase has been enabled, use the package \pkg{enumitem}. Otherwise, use the +% package \pkg{paralist}. % % \end{markdown} % \begin{macrocode} -\@ifclassloaded{beamer}{}{% - \markdownIfOption{tightLists}{\RequirePackage{paralist}}{}% - \markdownIfOption{fancyLists}{\RequirePackage{paralist}}{}% -} +\ExplSyntaxOn +\bool_new:N + \g_@@_tight_or_fancy_lists_bool +\bool_gset_false:N + \g_@@_tight_or_fancy_lists_bool +\@@_if_option:nTF + { tightLists } + { + \bool_gset_true:N + \g_@@_tight_or_fancy_lists_bool + } + { + \@@_if_option:nT + { fancyLists } + { + \bool_gset_true:N + \g_@@_tight_or_fancy_lists_bool + } + } +\bool_new:N + \g_@@_beamer_paralist_or_enumitem_bool +\bool_gset_true:N + \g_@@_beamer_paralist_or_enumitem_bool +\@ifclassloaded + { beamer } + { } + { + \@ifpackageloaded + { paralist } + { } + { + \@ifpackageloaded + { enumitem } + { } + { + \bool_gset_false:N + \g_@@_beamer_paralist_or_enumitem_bool + } + } + } +\bool_if:nT + { + \g_@@_tight_or_fancy_lists_bool && + ! \g_@@_beamer_paralist_or_enumitem_bool + } + { + \bool_if:nTF + { + \bool_lazy_or_p:nn + { + \str_if_eq_p:en + { \markdownThemeVersion } + { experimental } + } + { + \bool_lazy_and_p:nn + { + \prop_if_exist_p:N + \g__pdfmanagement_documentproperties_prop + } + { + \bool_lazy_any_p:n + { + { + \prop_if_in_p:Nn + \g__pdfmanagement_documentproperties_prop + { document / testphase / phase-I } + } + { + \prop_if_in_p:Nn + \g__pdfmanagement_documentproperties_prop + { document / testphase / phase-II } + } + { + \prop_if_in_p:Nn + \g__pdfmanagement_documentproperties_prop + { document / testphase / phase-III } + } + { + \prop_if_in_p:Nn + \g__pdfmanagement_documentproperties_prop + { document / testphase / phase-IV } + } + { + \prop_if_in_p:Nn + \g__pdfmanagement_documentproperties_prop + { document / testphase / phase-V } + } + { + \prop_if_in_p:Nn + \g__pdfmanagement_documentproperties_prop + { document / testphase / phase-VI } + } + } + } + } + } + { + \RequirePackage + { enumitem } + } + { + \RequirePackage + { paralist } + } + } +\ExplSyntaxOff % \end{macrocode} % \par % \begin{markdown} % -% If we loaded the \pkg{paralist} package, define the respective renderer -% prototypes to make use of the capabilities of the package. Otherwise, -% define the renderer prototypes to fall back on the corresponding renderers -% for the non-tight lists. +% If we loaded the \pkg{enumitem} package, define the tight and +% fancy list renderer prototypes to make use of the capabilities of +% the package. % % \end{markdown} % \begin{macrocode} \ExplSyntaxOn -\@ifpackageloaded{paralist}{ - \tl_new:N - \l_@@_latex_fancy_list_item_label_number_style_tl - \tl_new:N - \l_@@_latex_fancy_list_item_label_delimiter_style_tl - \cs_new:Nn +\cs_new:Nn + \@@_latex_fancy_list_item_label_number:nn + { + \str_case:nn + { #1 } + { + { Decimal } { #2 } + { LowerRoman } { \int_to_roman:n { #2 } } + { UpperRoman } { \int_to_Roman:n { #2 } } + { LowerAlpha } { \int_to_alph:n { #2 } } + { UpperAlpha } { \int_to_Alph:n { #2 } } + } + } +\cs_new:Nn + \@@_latex_fancy_list_item_label_delimiter:n + { + \str_case:nn + { #1 } + { + { Default } { . } + { OneParen } { ) } + { Period } { . } + } + } +\cs_new:Nn + \@@_latex_fancy_list_item_label:nnn + { \@@_latex_fancy_list_item_label_number:nn - { - \str_case:nn - { #1 } - { - { Decimal } { #2 } - { LowerRoman } { \int_to_roman:n { #2 } } - { UpperRoman } { \int_to_Roman:n { #2 } } - { LowerAlpha } { \int_to_alph:n { #2 } } - { UpperAlpha } { \int_to_Alph:n { #2 } } - } - } - \cs_new:Nn + { #1 } + { #3 } \@@_latex_fancy_list_item_label_delimiter:n - { - \str_case:nn - { #1 } - { - { Default } { . } - { OneParen } { ) } - { Period } { . } - } - } - \cs_new:Nn - \@@_latex_fancy_list_item_label:nnn - { - \@@_latex_fancy_list_item_label_number:nn + { #2 } + } +\cs_generate_variant:Nn + \@@_latex_fancy_list_item_label:nnn + { VVn } +\tl_new:N + \l_@@_latex_fancy_list_item_label_number_style_tl +\tl_new:N + \l_@@_latex_fancy_list_item_label_delimiter_style_tl +\@ifpackageloaded{enumitem}{ + \markdownSetup{rendererPrototypes={ +% \end{macrocode} +% \begin{markdown} +% +% First, let's define the tight list item renderer prototypes. +% +% \end{markdown} +% \begin{macrocode} + ulBeginTight = { + \begin + { itemize } + [ noitemsep ] + }, + ulEndTight = { + \end + { itemize } + }, + olBeginTight = { + \begin + { enumerate } + [ noitemsep ] + }, + olEndTight = { + \end + { enumerate } + }, + dlBeginTight = { + \begin + { description } + [ noitemsep ] + }, + dlEndTight = { + \end + { description } + }, +% \end{macrocode} +% \begin{markdown} +% +% Second, let's define the fancy list item renderer prototypes. +% +% \end{markdown} +% \begin{macrocode} + fancyOlBegin = { + \group_begin: + \tl_set:Nn + \l_@@_latex_fancy_list_item_label_number_style_tl { #1 } - { #3 } - \@@_latex_fancy_list_item_label_delimiter:n + \tl_set:Nn + \l_@@_latex_fancy_list_item_label_delimiter_style_tl { #2 } - } - \cs_new:Nn - \@@_latex_paralist_style:nn - { - \str_case:nn + \begin + { enumerate } + }, + fancyOlBeginTight = { + \group_begin: + \tl_set:Nn + \l_@@_latex_fancy_list_item_label_number_style_tl { #1 } - { - { Decimal } { 1 } - { LowerRoman } { i } - { UpperRoman } { I } - { LowerAlpha } { a } - { UpperAlpha } { A } - } - \@@_latex_fancy_list_item_label_delimiter:n + \tl_set:Nn + \l_@@_latex_fancy_list_item_label_delimiter_style_tl { #2 } - } - \markdownSetup{rendererPrototypes={ + \begin + { enumerate } + [ noitemsep ] + }, + fancyOlEnd(|Tight) = { + \end { enumerate } + \group_end: + }, + fancyOlItemWithNumber = { + \item + [ + \@@_latex_fancy_list_item_label:VVn + \l_@@_latex_fancy_list_item_label_number_style_tl + \l_@@_latex_fancy_list_item_label_delimiter_style_tl + { #1 } + ] + }, + }} % \end{macrocode} % \par % \begin{markdown} % +% Otherwise, if we loaded the \pkg{paralist} package, define the +% tight and fancy list renderer prototypes to make use of the +% capabilities of the package. +% +% \end{markdown} +% \begin{macrocode} +}{\@ifpackageloaded{paralist}{ + \markdownSetup{rendererPrototypes={ +% \end{macrocode} +% \begin{markdown} +% % Make tight bullet lists a little less compact by adding extra vertical space % above and below them. % @@ -36669,33 +37569,13 @@ end \tl_set:Nn \l_@@_latex_fancy_list_item_label_delimiter_style_tl { #2 } - \@@_if_option:nTF - { startNumber } - { - \tl_set:Nn - \l_tmpa_tl - { \begin{enumerate} } - } - { - \tl_set:Nn - \l_tmpa_tl - { \begin{enumerate}[ } - \tl_put_right:Nx - \l_tmpa_tl - { \@@_latex_paralist_style:nn { #1 } { #2 } } - \tl_put_right:Nn - \l_tmpa_tl - { ] } - } - \tl_use:N - \l_tmpa_tl + \begin{enumerate} }, fancyOlEnd = { \end{enumerate} \group_end: }, % \end{macrocode} -% \par % \begin{markdown} % % Make tight ordered lists a little less compact by adding extra vertical @@ -36721,32 +37601,9 @@ end \tl_set:Nn \l_@@_latex_fancy_list_item_label_delimiter_style_tl { #2 } - \@@_if_option:nTF - { startNumber } - { - \tl_set:Nn - \l_tmpa_tl - { \begin{compactenum} } - } - { - \tl_set:Nn - \l_tmpa_tl - { \begin{compactenum}[ } - \tl_put_right:Nx - \l_tmpa_tl - { \@@_latex_paralist_style:nn { #1 } { #2 } } - \tl_put_right:Nn - \l_tmpa_tl - { ] } - } - \tl_put_left:Nn - \l_tmpa_tl - { - \plpartopsep=\partopsep - \pltopsep=\topsep - } - \tl_use:N - \l_tmpa_tl + \plpartopsep=\partopsep + \pltopsep=\topsep + \begin{compactenum} }, fancyOlEndTight = { \end{compactenum} @@ -36762,7 +37619,6 @@ end ] }, % \end{macrocode} -% \par % \begin{markdown} % % Make tight definition lists a little less compact by adding extra @@ -36779,23 +37635,36 @@ end dlEndTight = { \end{compactdesc} \group_end: - }}} - \cs_generate_variant:Nn - \@@_latex_fancy_list_item_label:nnn - { VVn } + } + }} }{ - \markdownSetup{rendererPrototypes={ - ulBeginTight = {\markdownRendererUlBegin}, - ulEndTight = {\markdownRendererUlEnd}, - fancyOlBegin = {\markdownRendererOlBegin}, - fancyOlEnd = {\markdownRendererOlEnd}, - olBeginTight = {\markdownRendererOlBegin}, - olEndTight = {\markdownRendererOlEnd}, - fancyOlBeginTight = {\markdownRendererOlBegin}, - fancyOlEndTight = {\markdownRendererOlEnd}, - dlBeginTight = {\markdownRendererDlBegin}, - dlEndTight = {\markdownRendererDlEnd}}} -} +% \end{macrocode} +% \par +% \begin{markdown} +% +% Otherwise, if we loaded neither the \pkg{enumitem} package nor the +% \pkg{paralist} package, define the tight and fancy list renderer +% prototypes to fall back on the corresponding renderers for the +% non-tight lists. +% +% \end{markdown} +% \begin{macrocode} + \markdownSetup + { + rendererPrototypes = { + ulBeginTight = \markdownRendererUlBegin, + ulEndTight = \markdownRendererUlEnd, + fancyOlBegin = \markdownRendererOlBegin, + fancyOlEnd = \markdownRendererOlEnd, + olBeginTight = \markdownRendererOlBegin, + olEndTight = \markdownRendererOlEnd, + fancyOlBeginTight = \markdownRendererOlBegin, + fancyOlEndTight = \markdownRendererOlEnd, + dlBeginTight = \markdownRendererDlBegin, + dlEndTight = \markdownRendererDlEnd, + }, + } +}} \ExplSyntaxOff \RequirePackage{amsmath} % \end{macrocode} @@ -36881,15 +37750,6 @@ end } \ExplSyntaxOff \markdownSetup{rendererPrototypes={ - image = {% - \begin{figure}% - \begin{center}% - \includegraphics[alt={#1}]{#3}% - \end{center}% - \ifx\empty#4\empty\else - \caption{#4}% - \fi - \end{figure}}, ulBegin = {\begin{itemize}}, ulEnd = {\end{itemize}}, olBegin = {\begin{enumerate}}, @@ -37040,25 +37900,16 @@ end \ltx@ifpackageloaded { minted } { + \catcode`\%=14\relax \catcode`\#=6\relax \exp_args:NV \inputminted \l_tmpa_tl { #1 } + \catcode`\%=12\relax \catcode`\#=12\relax } { - \ltx@ifpackageloaded - { minted2 } - { - \catcode`\#=6\relax - \exp_args:NV - \inputminted - \l_tmpa_tl - { #1 } - \catcode`\#=12\relax - } - { % \end{macrocode} % \par % \begin{markdown} @@ -37067,9 +37918,9 @@ end % % \end{markdown} % \begin{macrocode} - \ltx@ifpackageloaded - { listings } - { \lstinputlisting[language=\l_tmpa_tl]{#1} } + \ltx@ifpackageloaded + { listings } + { \lstinputlisting[language=\l_tmpa_tl]{#1} } % \end{macrocode} % \par % \begin{markdown} @@ -37079,8 +37930,7 @@ end % % \end{markdown} % \begin{macrocode} - { \markdownRendererInputFencedCode{#1}{}{} } - } + { \markdownRendererInputFencedCode{#1}{}{} } } } } @@ -37687,72 +38537,166 @@ end }, }, } -\ExplSyntaxOff % \end{macrocode} % \par % \begin{markdown} % -%#### Strike-Through -% If the \Opt{strikeThrough} option is enabled, we will load the -% \pkg{soulutf8} package and use it to implement strike-throughs. +%#### Marked Text +% If the \Opt{mark} option is enabled, we will load either the \pkg{soulutf8} +% package or the \pkg{lua-ul} package and use it to implement marked text. % % \end{markdown} % \begin{macrocode} -\markdownIfOption{strikeThrough}{% - \RequirePackage{soulutf8}% - \markdownSetup{ - rendererPrototypes = { - strikeThrough = {% - \st{#1}% - }, - } +\@@_if_option:nT + { mark } + { + \sys_if_engine_luatex:TF + { + \RequirePackage + { luacolor } + \RequirePackage + { lua-ul } + \markdownSetup + { + rendererPrototypes = { + mark = { + \highLight + { #1 } + }, + } + } + } + { + \RequirePackage + { xcolor } + % TODO: Use just package soul after TeX Live 2023. + \IfFormatAtLeastTF + { 2023-02-18 } + { + \RequirePackage + { soul } + } + { + \RequirePackage + { soulutf8 } + } + \markdownSetup + { + rendererPrototypes = { + mark = { + \hl + { #1 } + }, + } + } + } } -}{} % \end{macrocode} % \par % \begin{markdown} % -%#### Marked Text -% If the \Opt{mark} option is enabled, we will load the \pkg{soulutf8} package -% and use it to implement marked text. +%#### Strike-Through +% If the \Opt{strikeThrough} option is enabled, we will load either the +% \pkg{soulutf8} package or the \pkg{lua-ul} package and use it to implement +% strike-throughs. % % \end{markdown} % \begin{macrocode} -\markdownIfOption{mark}{% - \RequirePackage{soulutf8}% - \markdownSetup{ - rendererPrototypes = { - mark = {% - \hl{#1}% - }, - } +\@@_if_option:nT + { strikeThrough } + { + \sys_if_engine_luatex:TF + { + \RequirePackage + { lua-ul } + \markdownSetup + { + rendererPrototypes = { + strikeThrough = { + \strikeThrough + { #1 } + }, + } + } + } + { + % TODO: Use just package soul after TeX Live 2023. + \IfFormatAtLeastTF + { 2023-02-18 } + { + \RequirePackage + { soul } + } + { + \RequirePackage + { soulutf8 } + } + \markdownSetup + { + rendererPrototypes = { + strikeThrough = { + \st + { #1 } + }, + } + } + } } -}{} % \end{macrocode} % \par % \begin{markdown} % -%#### Image Attributes +%#### Images and their attributes % -% If the \Opt{linkAttributes} option is enabled, we will load -% the \pkg{graphicx} package. Furthermore, in image attribute contexts, -% we will make attributes in the form \meta{key}`=`\meta{value} set the -% corresponding keys of the \pkg{graphicx} package to the corresponding -% values. +% We define images to be rendered as floating figures using the command +% `\includegraphics`, where the image label is the alt text and the image +% title is the caption of the figure. +% +% If the \Opt{linkAttributes} option is enabled, we will make attributes in the +% form \meta{key}`=`\meta{value} set the corresponding keys of the +% \pkg{graphicx} package to the corresponding values and we will register any +% identifiers, so that they can be used as \LaTeX{} labels for referencing +% figures. % % \end{markdown} % \begin{macrocode} \ExplSyntaxOn +\seq_new:N + \l_@@_image_identifiers_seq +\markdownSetup { + rendererPrototypes = { + image = { + \begin { figure } + \begin { center } + \includegraphics + [ alt = { #1 } ] + { #3 } + \tl_if_empty:nF + { #4 } + { \caption { #4 } } + \seq_map_inline:Nn + \l_@@_image_identifiers_seq + { \label { ##1 } } + \end { center } + \end { figure } + }, + } +} \@@_if_option:nT { linkAttributes } { - \RequirePackage{graphicx} - \markdownSetup{ + \RequirePackage { graphicx } + \markdownSetup { rendererPrototypes = { imageAttributeContextBegin = { \group_begin: - \markdownSetup{ + \markdownSetup { rendererPrototypes = { + attributeIdentifier = { + \seq_put_right:Nn + \l_@@_image_identifiers_seq + { ##1 } + }, attributeKeyValue = { \setkeys { Gin } @@ -37889,9 +38833,9 @@ end % \begin{markdown} % %### Typesetting Markdown -% The \mref{inputmarkdown} macro is defined to accept an optional argument with -% options recognized by the \Hologo{ConTeXt} interface (see Section -% <#sec:context-options>). +% The \mref{inputmarkdown} and \mref{inputyaml} macros are defined to accept an +% optional argument with options recognized by the \Hologo{ConTeXt} interface +% (see Section <#sec:context-options>). % % \end{markdown} % \begin{macrocode} @@ -37905,11 +38849,18 @@ end \fi \markdownInput{#2}% \endgroup}% +\long\def\inputyaml{% + \dosingleempty + \doinputyaml}% +\long\def\doinputyaml[#1]#2{% + \doinputmarkdown + [jekyllData, expectJekyllData, ensureJekyllData, #1]{#2}}% % \end{macrocode} % \par % \begin{markdown} % -% The \mref{startmarkdown} and \mref{stopmarkdown} macros are implemented using the +% The \mref{startmarkdown}, \mref{stopmarkdown}, \mref{startyaml}, and +% \mref{stopyaml} macros are implemented using the % \mref{markdownReadAndConvert} macro. % % In Knuth's \TeX, trailing spaces are removed very early on when a line is @@ -37943,6 +38894,15 @@ end |gdef|stopmarkdown{% |ctxlua{document.markdown_buffering = false}% |markdownEnd}% + |gdef|startyaml{% + |begingroup + |ctxlua{document.markdown_buffering = true}% + |setupyaml[jekyllData, expectJekyllData, ensureJekyllData]% + |markdownReadAndConvert{\stopyaml}% + {|stopyaml}}% + |gdef|stopyaml{% + |ctxlua{document.markdown_buffering = false}% + |yamlEnd}% |endgroup % \end{macrocode} % \par @@ -37958,8 +38918,10 @@ end % \end{markdown} % \begin{macrocode} \ExplSyntaxOn +\prop_new:N \g_@@_context_loaded_themes_linenos_prop +\prop_new:N \g_@@_context_loaded_themes_versions_prop \cs_gset:Nn - \@@_load_theme:nn + \@@_load_theme:nnn { % \end{macrocode} % \par @@ -37972,26 +38934,82 @@ end % \end{markdown} % \begin{macrocode} \file_if_exist:nTF - { t - markdown theme #2.tex } + { t - markdown theme #3.tex } { - \msg_info:nnn - { markdown } - { loading-context-theme } + \prop_get:NnNTF + \g_@@_context_loaded_themes_linenos_prop { #1 } - \usemodule - [ t ] - [ markdown theme #2 ] + \l_tmpa_tl + { + \prop_get:NnN + \g_@@_context_loaded_themes_versions_prop + { #1 } + \l_tmpb_tl + \str_if_eq:nVTF + { #2 } + \l_tmpb_tl + { + \msg_warning:nnnVn + { markdown } + { repeatedly-loaded-context-theme } + { #1 } + \l_tmpa_tl + { #2 } + } + { + \msg_error:nnnnVV + { markdown } + { different-versions-of-context-theme } + { #1 } + { #2 } + \l_tmpb_tl + \l_tmpa_tl + } + } + { + \msg_info:nnn + { markdown } + { loading-context-theme } + { #1 } + { #2 } + \prop_gput:Nnx + \g_@@_context_loaded_themes_linenos_prop + { #1 } + { \tex_the:D \tex_inputlineno:D } + \prop_gput:Nnn + \g_@@_context_loaded_themes_versions_prop + { #1 } + { #2 } + \usemodule + [ t ] + [ markdown theme #3 ] + } } { - \@@_plain_tex_load_theme:nn + \@@_plain_tex_load_theme:nnn { #1 } { #2 } + { #3 } } } \msg_new:nnn { markdown } { loading-context-theme } - { Loading~ConTeXt~Markdown~theme~#1 } + { Loading~version~#2~of~ConTeXt~Markdown~theme~#1 } +\msg_new:nnn + { markdown } + { repeatedly-loaded-context-theme } + { + Version~#3~of~ConTeXt~Markdown~theme~#1~was~previously~ + loaded~on~line~#2,~not~loading~it~again + } +\msg_new:nnn + { markdown } + { different-versions-of-context-theme } + { + Tried~to~load~version~#2~of~ConTeXt~Markdown~theme~#1~ + but~version~#3~has~already~been~loaded~on~line~#4 + } \ExplSyntaxOff % \end{macrocode} % \iffalse @@ -38330,9 +39348,29 @@ end % % \end{markdown} % \begin{macrocode} -\markdownIfOption{noDefaults}{}{ - \setupmarkdown[theme=witiko/markdown/defaults] -} +\ExplSyntaxOn +\str_if_eq:VVT + \c_@@_top_layer_tl + \c_@@_option_layer_context_tl + { + \ExplSyntaxOff + \@@_if_option:nF + { noDefaults } + { + \@@_if_option:nTF + { experimental } + { + \@@_setup:n + { theme = witiko/markdown/defaults@experimental } + } + { + \@@_setup:n + { theme = witiko/markdown/defaults } + } + } + \ExplSyntaxOn + } +\ExplSyntaxOff \stopmodule \protect % \end{macrocode} diff --git a/macros/generic/markdown/markdown.html b/macros/generic/markdown/markdown.html index ba2a2d34f5..159c5f2cfd 100644 --- a/macros/generic/markdown/markdown.html +++ b/macros/generic/markdown/markdown.html @@ -35,7 +35,7 @@ } @media print { pre > code.sourceCode { white-space: pre-wrap; } - pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; } + pre > code.sourceCode > span { display: inline-block; text-indent: -5em; padding-left: 5em; } } pre.numberSource code { counter-reset: source-line 0; } @@ -93,7 +93,7 @@ <header id="title-block-header"> <h1 class="title">Markdown Package User Manual</h1> <p class="author">Vít Starý Novotný, Andrej Genčur</p> -<p class="date">3.7.1-0-g8e726800 2024-09-30</p> +<p class="date">3.8.0-0-ga4bab835 2024-10-31</p> </header> <nav id="TOC" role="doc-toc"> <ul> @@ -227,10 +227,10 @@ class="tex">T<sub>e</sub>X</span> distribution, you will need to install it.</p> <p>From <a href="https://github.com/witiko/markdown/releases" title="Releases - witiko/markdown">Releases</a>, download <a -href="https://github.com/witiko/markdown/releases/download/3.7.1/markdown.zip" -title="Release 3.7.1 - witiko/markdown">an archive +href="https://github.com/witiko/markdown/releases/download/3.8.0/markdown.zip" +title="Release 3.8.0 - witiko/markdown">an archive <code>markdown.zip</code> for this version of the Markdown package -(3.7.1)</a> or a different version that you wish to install. Then, unzip +(3.8.0)</a> or a different version that you wish to install. Then, unzip the archive. If you downloaded an archive for a different version of the Markdown package, you should now locate a file named <code>markdown.html</code> with the user manual for that version, open @@ -938,8 +938,36 @@ named <code>⟨hash⟩.md.tex</code> should be produced and contain the following code:</p> <div class="sourceCode" id="cb51"><pre class="sourceCode tex"><code class="sourceCode latex"><span id="cb51-1"><a href="#cb51-1" aria-hidden="true" tabindex="-1"></a>Hello <span class="fu">\markdownRendererEmphasis</span>{world}!<span class="fu">\relax</span></span></code></pre></div> -<h4 data-number="2.2.1.2" id="option-singletoncache"><span +<h4 data-number="2.2.1.2" id="option-experimental"><span class="header-section-number">2.2.1.2</span> Option +<code>experimental</code></h4> +<dl> +<dt><code>experimental</code> (default value: <code>false</code>)</dt> +<dd> +<dl> +<dt>true</dt> +<dd> +<p>Experimental features that are planned to be the new default in the +next major release of the Markdown package will be enabled.</p> +<p>At the moment, this just means that the version +<code>experimental</code> of the theme +<code>witiko/markdown/defaults</code> will be loaded and warnings for +hard-deprecated features will become errors. However, the effects may +extend to other areas in the future as well.</p> +</dd> +</dl> +</dd> +<dd> +<dl> +<dt>false</dt> +<dd> +<p>Experimental features will be disabled.</p> +</dd> +</dl> +</dd> +</dl> +<h4 data-number="2.2.1.3" id="option-singletoncache"><span +class="header-section-number">2.2.1.3</span> Option <code>singletonCache</code></h4> <dl> <dt><code>singletonCache</code> (default value: <code>true</code>)</dt> @@ -1003,8 +1031,8 @@ contain the following text:</p> </blockquote> <p>As you can see, the caching causes <code>convert1</code> and <code>convert3</code> to be the same conversion function.</p> -<h4 data-number="2.2.1.3" id="option-unicodenormalization"><span -class="header-section-number">2.2.1.3</span> Option +<h4 data-number="2.2.1.4" id="option-unicodenormalization"><span +class="header-section-number">2.2.1.4</span> Option <code>unicodeNormalization</code></h4> <dl> <dt><code>unicodeNormalization</code> (default value: @@ -1031,8 +1059,8 @@ conversion.</p> </dl> </dd> </dl> -<h4 data-number="2.2.1.4" id="option-unicodenormalizationform"><span -class="header-section-number">2.2.1.4</span> Option +<h4 data-number="2.2.1.5" id="option-unicodenormalizationform"><span +class="header-section-number">2.2.1.5</span> Option <code>unicodeNormalizationForm</code></h4> <dl> <dt><code>unicodeNormalizationForm</code> (default value: @@ -1078,8 +1106,8 @@ Normalization Form KD (NFKD) before conversion.</p> </dl> </dd> </dl> -<h4 data-number="2.2.1.5" id="option-cachedir"><span -class="header-section-number">2.2.1.5</span> Option +<h4 data-number="2.2.1.6" id="option-cachedir"><span +class="header-section-number">2.2.1.6</span> Option <code>cacheDir</code></h4> <dl> <dt><code>cacheDir</code> (default value: <code>"."</code>)</dt> @@ -1211,8 +1239,8 @@ contain the text “Hello <em>world</em>!” A directory named <code>cache</code> containing several cache files of the Markdown package will also be produced as we requested using the <code>cacheDir</code> option.</p> -<h4 data-number="2.2.1.6" id="option-contentblockslanguagemap"><span -class="header-section-number">2.2.1.6</span> Option +<h4 data-number="2.2.1.7" id="option-contentblockslanguagemap"><span +class="header-section-number">2.2.1.7</span> Option <code>contentBlocksLanguageMap</code></h4> <dl> <dt><code>contentBlocksLanguageMap</code> (default value: @@ -1376,8 +1404,8 @@ contain the following text:</p> class="sourceCode tex"><code class="sourceCode latex"><span id="cb78-1"><a href="#cb78-1" aria-hidden="true" tabindex="-1"></a>This is an example code listing in <span class="fu">\ConTeXt</span>.</span></code></pre></div> <p>This is a <em>transcluded markdown document</em>.</p> </blockquote> -<h4 data-number="2.2.1.7" id="option-debugextensionsfilename"><span -class="header-section-number">2.2.1.7</span> Option +<h4 data-number="2.2.1.8" id="option-debugextensionsfilename"><span +class="header-section-number">2.2.1.8</span> Option <code>debugExtensionsFileName</code></h4> <dl> <dt><code>debugExtensionsFileName</code> (default value: @@ -1394,8 +1422,8 @@ syntax extensions (see option <code><strong>extensions</strong></code>) have been applied.</p> </dd> </dl> -<h4 data-number="2.2.1.8" id="option-frozencachefilename"><span -class="header-section-number">2.2.1.8</span> Option +<h4 data-number="2.2.1.9" id="option-frozencachefilename"><span +class="header-section-number">2.2.1.9</span> Option <code>frozenCacheFileName</code></h4> <dl> <dt><code>frozenCacheFileName</code> (default value: @@ -1599,8 +1627,8 @@ contents of the frozen cache using the the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello <em>world</em>!” to “Hi <em>world</em>!” was not reflected.</p> -<h4 data-number="2.2.1.9" id="option-autoidentifiers"><span -class="header-section-number">2.2.1.9</span> Option +<h4 data-number="2.2.1.10" id="option-autoidentifiers"><span +class="header-section-number">2.2.1.10</span> Option <code>autoIdentifiers</code></h4> <dl> <dt><code>autoIdentifiers</code> (default value: @@ -1626,8 +1654,8 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb96-1"><a hre </dl> <p>See also the option <code><strong>gfmAutoIdentifiers</strong></code>.</p> -<h4 data-number="2.2.1.10" id="option-blankbeforeblockquote"><span -class="header-section-number">2.2.1.10</span> Option +<h4 data-number="2.2.1.11" id="option-blankbeforeblockquote"><span +class="header-section-number">2.2.1.11</span> Option <code>blankBeforeBlockquote</code></h4> <dl> <dt><code>blankBeforeBlockquote</code> (default value: @@ -1820,8 +1848,8 @@ contain the following text:</p> </blockquote> <p>A paragraph > Not a quote.</p> </blockquote> -<h4 data-number="2.2.1.11" id="option-blankbeforecodefence"><span -class="header-section-number">2.2.1.11</span> Option +<h4 data-number="2.2.1.12" id="option-blankbeforecodefence"><span +class="header-section-number">2.2.1.12</span> Option <code>blankBeforeCodeFence</code></h4> <dl> <dt><code>blankBeforeCodeFence</code> (default value: @@ -2025,8 +2053,8 @@ contain the following text:</p> <pre><code>A fenced code.</code></pre> <p>A paragraph. <code>Not a fenced code.</code></p> </blockquote> -<h4 data-number="2.2.1.12" id="option-blankbeforedivfence"><span -class="header-section-number">2.2.1.12</span> Option +<h4 data-number="2.2.1.13" id="option-blankbeforedivfence"><span +class="header-section-number">2.2.1.13</span> Option <code>blankBeforeDivFence</code></h4> <dl> <dt><code>blankBeforeDivFence</code> (default value: @@ -2082,8 +2110,8 @@ contain the following text:</p> <p>A paragraph.</p> <p>::: {.identifier} Not a fenced div. :::</p> </blockquote> -<h4 data-number="2.2.1.13" id="option-blankbeforeheading"><span -class="header-section-number">2.2.1.13</span> Option +<h4 data-number="2.2.1.14" id="option-blankbeforeheading"><span +class="header-section-number">2.2.1.14</span> Option <code>blankBeforeHeading</code></h4> <dl> <dt><code>blankBeforeHeading</code> (default value: @@ -2276,8 +2304,8 @@ contain the following text:</p> <h1 id="a-heading.-3">A heading.</h1> <p>A paragraph. Not a heading. ==============</p> </blockquote> -<h4 data-number="2.2.1.14" id="option-blankbeforelist"><span -class="header-section-number">2.2.1.14</span> Option +<h4 data-number="2.2.1.15" id="option-blankbeforelist"><span +class="header-section-number">2.2.1.15</span> Option <code>blankBeforeList</code></h4> <dl> <dt><code>blankBeforeList</code> (default value: @@ -2470,8 +2498,8 @@ contain the following text:</p> </ul> <p>A paragraph. - not a list</p> </blockquote> -<h4 data-number="2.2.1.15" id="option-bracketedspans"><span -class="header-section-number">2.2.1.15</span> Option +<h4 data-number="2.2.1.16" id="option-bracketedspans"><span +class="header-section-number">2.2.1.16</span> Option <code>bracketedSpans</code></h4> <dl> <dt><code>bracketedSpans</code> (default value: <code>false</code>)</dt> @@ -2543,8 +2571,8 @@ contain the following text:</p> <blockquote> <p>Here is some <span style="color: red">colored text</span>.</p> </blockquote> -<h4 data-number="2.2.1.16" id="option-breakableblockquotes"><span -class="header-section-number">2.2.1.16</span> Option +<h4 data-number="2.2.1.17" id="option-breakableblockquotes"><span +class="header-section-number">2.2.1.17</span> Option <code>breakableBlockquotes</code></h4> <dl> <dt><code>breakableBlockquotes</code> (default value: @@ -2765,8 +2793,8 @@ contain the following text:</p> <p>Another block quote.</p> </blockquote> </blockquote> -<h4 data-number="2.2.1.17" id="option-citationnbsps"><span -class="header-section-number">2.2.1.17</span> Option +<h4 data-number="2.2.1.18" id="option-citationnbsps"><span +class="header-section-number">2.2.1.18</span> Option <code>citationNbsps</code></h4> <dl> <dt><code>citationNbsps</code> (default value: <code>true</code>)</dt> @@ -2832,8 +2860,8 @@ non-breaking space:</p> <p>[1] Donald·Ervin Knuth. <em>The TeXbook, volume A of Computers and typesetting.</em> Addison-Wesley, 1984.</p> </blockquote> -<h4 data-number="2.2.1.18" id="option-citations"><span -class="header-section-number">2.2.1.18</span> Option +<h4 data-number="2.2.1.19" id="option-citations"><span +class="header-section-number">2.2.1.19</span> Option <code>citations</code></h4> <dl> <dt><code>citations</code> (default value: <code>false</code>)</dt> @@ -2911,8 +2939,8 @@ contain the following text:</p> class="tex">T<sub>e</sub>X</span>book, volume A of Computers and typesetting.</em> Addison-Wesley, 1984.</p> </blockquote> -<h4 data-number="2.2.1.19" id="option-codespans"><span -class="header-section-number">2.2.1.19</span> Option +<h4 data-number="2.2.1.20" id="option-codespans"><span +class="header-section-number">2.2.1.20</span> Option <code>codeSpans</code></h4> <dl> <dt><code>codeSpans</code> (default value: <code>true</code>)</dt> @@ -3101,8 +3129,8 @@ contain the following text:</p> span.’’</p> <p>“This is a quote.” “This is another quote.”</p> </blockquote> -<h4 data-number="2.2.1.20" id="option-contentblocks"><span -class="header-section-number">2.2.1.20</span> Option +<h4 data-number="2.2.1.21" id="option-contentblocks"><span +class="header-section-number">2.2.1.21</span> Option <code>contentBlocks</code></h4> <dl> <dt><code>contentBlocks</code> (default value: <code>false</code>)</dt> @@ -3275,8 +3303,8 @@ contain the following text:</p> class="sourceCode tex"><code class="sourceCode latex"><span id="cb196-1"><a href="#cb196-1" aria-hidden="true" tabindex="-1"></a>This is an example code listing in <span class="fu">\ConTeXt</span>.</span></code></pre></div> <p>This is a <em>transcluded markdown document</em>.</p> </blockquote> -<h4 data-number="2.2.1.21" id="option-contentlevel"><span -class="header-section-number">2.2.1.21</span> Option +<h4 data-number="2.2.1.22" id="option-contentlevel"><span +class="header-section-number">2.2.1.22</span> Option <code>contentLevel</code></h4> <dl> <dt><code>contentLevel</code> (default value: <code>block</code>)</dt> @@ -3387,8 +3415,8 @@ contain the following text:</p> </ul> <p>- this is - a text</p> </blockquote> -<h4 data-number="2.2.1.22" id="option-debugextensions"><span -class="header-section-number">2.2.1.22</span> Option +<h4 data-number="2.2.1.23" id="option-debugextensions"><span +class="header-section-number">2.2.1.23</span> Option <code>debugExtensions</code></h4> <dl> <dt><code>debugExtensions</code> (default value: @@ -3510,8 +3538,8 @@ class="sourceCode json"><code class="sourceCode json"><span id="cb208-1"><a href <span id="cb208-37"><a href="#cb208-37" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div> <p>This output shows us that our user-defined syntax extension has been correctly inserted to the grammar of markdown.</p> -<h4 data-number="2.2.1.23" id="option-definitionlists"><span -class="header-section-number">2.2.1.23</span> Option +<h4 data-number="2.2.1.24" id="option-definitionlists"><span +class="header-section-number">2.2.1.24</span> Option <code>definitionLists</code></h4> <dl> <dt><code>definitionLists</code> (default value: @@ -3627,8 +3655,8 @@ contain the following text:</p> </dd> </dl> </blockquote> -<h4 data-number="2.2.1.24" id="option-ensurejekylldata"><span -class="header-section-number">2.2.1.24</span> Option +<h4 data-number="2.2.1.25" id="option-ensurejekylldata"><span +class="header-section-number">2.2.1.25</span> Option <code>ensureJekyllData</code></h4> <dl> <dt><code>ensureJekyllData</code> (default value: @@ -3658,8 +3686,8 @@ error is produced.</p> </dl> </dd> </dl> -<h4 data-number="2.2.1.25" id="option-expectjekylldata"><span -class="header-section-number">2.2.1.25</span> Option +<h4 data-number="2.2.1.26" id="option-expectjekylldata"><span +class="header-section-number">2.2.1.26</span> Option <code>expectJekyllData</code></h4> <dl> <dt><code>expectJekyllData</code> (default value: @@ -3758,8 +3786,8 @@ contain the following text:</p> <blockquote> <p>Jane Doe is 99 years old.</p> </blockquote> -<h4 data-number="2.2.1.26" id="option-extensions"><span -class="header-section-number">2.2.1.26</span> Option +<h4 data-number="2.2.1.27" id="option-extensions"><span +class="header-section-number">2.2.1.27</span> Option <code>extensions</code></h4> <dl> <dt><code>extensions</code> (default value: <code>{}</code>)</dt> @@ -3818,8 +3846,8 @@ contain the following text:</p> <blockquote> <p>This is <del>a lunar roving vehicle</del> strike-through text.</p> </blockquote> -<h4 data-number="2.2.1.27" id="option-fancylists"><span -class="header-section-number">2.2.1.27</span> Option +<h4 data-number="2.2.1.28" id="option-fancylists"><span +class="header-section-number">2.2.1.28</span> Option <code>fancyLists</code></h4> <dl> <dt><code>fancyLists</code> (default value: <code>false</code>)</dt> @@ -3899,8 +3927,8 @@ contain the following text:</p> <li>third item</li> </ol> </blockquote> -<h4 data-number="2.2.1.28" id="option-fencedcode"><span -class="header-section-number">2.2.1.28</span> Option +<h4 data-number="2.2.1.29" id="option-fencedcode"><span +class="header-section-number">2.2.1.29</span> Option <code>fencedCode</code></h4> <dl> <dt><code>fencedCode</code> (default value: <code>true</code>)</dt> @@ -4035,8 +4063,8 @@ class="sourceCode html"><code class="sourceCode html"><span id="cb237-1"><a href <span id="cb237-7"><a href="#cb237-7" aria-hidden="true" tabindex="-1"></a> <span class="dt"></</span><span class="kw">code</span><span class="dt">></span></span> <span id="cb237-8"><a href="#cb237-8" aria-hidden="true" tabindex="-1"></a><span class="dt"></</span><span class="kw">pre</span><span class="dt">></span></span></code></pre></div> </blockquote> -<h4 data-number="2.2.1.29" id="option-fencedcodeattributes"><span -class="header-section-number">2.2.1.29</span> Option +<h4 data-number="2.2.1.30" id="option-fencedcodeattributes"><span +class="header-section-number">2.2.1.30</span> Option <code>fencedCodeAttributes</code></h4> <dl> <dt><code>fencedCodeAttributes</code> (default value: @@ -4112,8 +4140,8 @@ class="sourceCode js linenos"><code class="sourceCode javascript"><span id="cb24 <span id="cb241-2"><a href="#cb241-2" aria-hidden="true" tabindex="-1"></a><span class="fl">2.</span> <span class="fu">moveShip</span>(<span class="dv">5</span> <span class="op">*</span> gravity<span class="op">,</span> DOWN)<span class="op">;</span></span> <span id="cb241-3"><a href="#cb241-3" aria-hidden="true" tabindex="-1"></a><span class="fl">3.</span> }</span></code></pre></div> </blockquote> -<h4 data-number="2.2.1.30" id="fenced-divs"><span -class="header-section-number">2.2.1.30</span> Option +<h4 data-number="2.2.1.31" id="fenced-divs"><span +class="header-section-number">2.2.1.31</span> Option <code>fencedDivs</code></h4> <dl> <dt><code>fencedDivs</code> (default value: <code>false</code>)</dt> @@ -4168,8 +4196,8 @@ contain the following text:</p> <blockquote> <p>Here is a special paragraph.</p> </blockquote> -<h4 data-number="2.2.1.31" id="option-finalizecache"><span -class="header-section-number">2.2.1.31</span> Option +<h4 data-number="2.2.1.32" id="option-finalizecache"><span +class="header-section-number">2.2.1.32</span> Option <code>finalizeCache</code></h4> <dl> <dt><code>finalizeCache</code> (default value: <code>false</code>)</dt> @@ -4300,8 +4328,8 @@ contents of the frozen cache using the the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello <em>world</em>!” to “Hi <em>world</em>!” was not reflected.</p> -<h4 data-number="2.2.1.32" id="option-frozencachecounter"><span -class="header-section-number">2.2.1.32</span> Option +<h4 data-number="2.2.1.33" id="option-frozencachecounter"><span +class="header-section-number">2.2.1.33</span> Option <code>frozenCacheCounter</code></h4> <dl> <dt><code>frozenCacheCounter</code> (default value: <code>0</code>)</dt> @@ -4341,8 +4369,8 @@ class="sourceCode sh"><code class="sourceCode bash"><span id="cb258-1"><a href=" contain the text “Hello <em>world</em>!” A frozen cache with two entries will also be produced as we requested using the <code>frozenCacheCounter</code> option.</p> -<h4 data-number="2.2.1.33" id="option-gfmautoidentifiers"><span -class="header-section-number">2.2.1.33</span> Option +<h4 data-number="2.2.1.34" id="option-gfmautoidentifiers"><span +class="header-section-number">2.2.1.34</span> Option <code>gfmAutoIdentifiers</code></h4> <dl> <dt><code>gfmAutoIdentifiers</code> (default value: @@ -4369,8 +4397,8 @@ extension.</p> </dl> <p>See also the option <code><strong>autoIdentifiers</strong></code>.</p> -<h4 data-number="2.2.1.34" id="option-hashenumerators"><span -class="header-section-number">2.2.1.34</span> Option +<h4 data-number="2.2.1.35" id="option-hashenumerators"><span +class="header-section-number">2.2.1.35</span> Option <code>hashEnumerators</code></h4> <dl> <dt><code>hashEnumerators</code> (default value: @@ -4472,8 +4500,8 @@ contain the following text:</p> <li>Parish</li> </ol> </blockquote> -<h4 data-number="2.2.1.35" id="header-attributes"><span -class="header-section-number">2.2.1.35</span> Option +<h4 data-number="2.2.1.36" id="header-attributes"><span +class="header-section-number">2.2.1.36</span> Option <code>headerAttributes</code></h4> <dl> <dt><code>headerAttributes</code> (default value: @@ -4502,8 +4530,8 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb265-1"><a hr </dl> </dd> </dl> -<h4 data-number="2.2.1.36" id="option-html"><span -class="header-section-number">2.2.1.36</span> Option +<h4 data-number="2.2.1.37" id="option-html"><span +class="header-section-number">2.2.1.37</span> Option <code>html</code></h4> <dl> <dt><code>html</code> (default value: <code>true</code>)</dt> @@ -4593,7 +4621,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb268-1"><a href class="sourceCode html"><code class="sourceCode html"><span id="cb269-1"><a href="#cb269-1" aria-hidden="true" tabindex="-1"></a><span class="dt"><</span><span class="kw">div</span><span class="dt">></span></span> <span id="cb269-2"><a href="#cb269-2" aria-hidden="true" tabindex="-1"></a>*Is there block tag support?*</span> <span id="cb269-3"><a href="#cb269-3" aria-hidden="true" tabindex="-1"></a><span class="dt"></</span><span class="kw">div</span><span class="dt">></span></span> -<span id="cb269-4"><a href="#cb269-4" aria-hidden="true" tabindex="-1"></a>*Is there <span class="dt"><</span><span class="kw">inline</span> <span class="er">tag</span><span class="ot">=</span><span class="st">"tag"</span><span class="dt">></</span><span class="kw">inline</span><span class="dt">></span> support?*</span> +<span id="cb269-4"><a href="#cb269-4" aria-hidden="true" tabindex="-1"></a>*Is there <span class="dt"><</span><span class="kw">inline</span><span class="ot"> tag</span><span class="op">=</span><span class="st">"tag"</span><span class="dt">></</span><span class="kw">inline</span><span class="dt">></span> support?*</span> <span id="cb269-5"><a href="#cb269-5" aria-hidden="true" tabindex="-1"></a>_Is there <span class="co"><!-- comment --></span> support?_</span> <span id="cb269-6"><a href="#cb269-6" aria-hidden="true" tabindex="-1"></a>_Is there <span class="kw"><?</span> HTML instruction <span class="kw">?></span> support?_</span></code></pre></div> <p>Next, invoke LuaTeX from the terminal:</p> @@ -4740,8 +4768,8 @@ comment –> support. There is no <? HTML instruction ?> support.</p> <p>There is support. There is support. There is support.</p> </blockquote> -<h4 data-number="2.2.1.37" id="option-hybrid"><span -class="header-section-number">2.2.1.37</span> Option +<h4 data-number="2.2.1.38" id="option-hybrid"><span +class="header-section-number">2.2.1.38</span> Option <code>hybrid</code></h4> <dl> <dt><code>hybrid</code> (default value: <code>false</code>)</dt> @@ -4980,8 +5008,8 @@ contain the following text:</p> <p><math><msqrt><mo>−</mo><mn>1</mn></msqrt></math> <em>equals</em> <math><mi>i</mi></math>.</p> </blockquote> -<h4 data-number="2.2.1.38" id="option-inlinecodeattributes"><span -class="header-section-number">2.2.1.38</span> Option +<h4 data-number="2.2.1.39" id="option-inlinecodeattributes"><span +class="header-section-number">2.2.1.39</span> Option <code>inlineCodeAttributes</code></h4> <dl> <dt><code>inlineCodeAttributes</code> (default value: @@ -5055,8 +5083,8 @@ contain the following text:</p> <p>Here is some <span style="color: red"><code>colored text</code></span>.</p> </blockquote> -<h4 data-number="2.2.1.39" id="option-inlinenotes"><span -class="header-section-number">2.2.1.39</span> Option +<h4 data-number="2.2.1.40" id="option-inlinenotes"><span +class="header-section-number">2.2.1.40</span> Option <code>inlineNotes</code></h4> <dl> <dt><code>inlineNotes</code> (default value: <code>false</code>)</dt> @@ -5129,8 +5157,8 @@ contain the following text:</p> <p>Here is an inline note.<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a></p> </blockquote> -<h4 data-number="2.2.1.40" id="option-jekylldata"><span -class="header-section-number">2.2.1.40</span> Option +<h4 data-number="2.2.1.41" id="option-jekylldata"><span +class="header-section-number">2.2.1.41</span> Option <code>jekyllData</code></h4> <dl> <dt><code>jekyllData</code> (default value: <code>false</code>)</dt> @@ -5268,8 +5296,8 @@ contain the following text:</p> <blockquote> <p>Jane Doe is 99 years old.</p> </blockquote> -<h4 data-number="2.2.1.41" id="option-linkattributes"><span -class="header-section-number">2.2.1.41</span> Option +<h4 data-number="2.2.1.42" id="option-linkattributes"><span +class="header-section-number">2.2.1.42</span> Option <code>linkAttributes</code></h4> <dl> <dt><code>linkAttributes</code> (default value: <code>false</code>)</dt> @@ -5340,8 +5368,8 @@ class="sourceCode sh"><code class="sourceCode bash"><span id="cb308-1"><a href=" contain an example image (from <a href="https://ctan.org/pkg/mwe" title="mwe – Packages and image files for MWEs">Martin Scharrer’s mwe package</a>) displayed at size 5cm × 4cm.</p> -<h4 data-number="2.2.1.42" id="option-lineblocks"><span -class="header-section-number">2.2.1.42</span> Option +<h4 data-number="2.2.1.43" id="option-lineblocks"><span +class="header-section-number">2.2.1.43</span> Option <code>lineBlocks</code></h4> <dl> <dt><code>lineBlocks</code> (default value: <code>false</code>)</dt> @@ -5353,11 +5381,11 @@ class="header-section-number">2.2.1.42</span> Option href="https://pandoc.org/MANUAL.html#extension-line_blocks">line block syntax extension</a>:</p> <div class="sourceCode" id="cb309"><pre -class="sourceCode md"><code class="sourceCode markdown"><span id="cb309-1"><a href="#cb309-1" aria-hidden="true" tabindex="-1"></a>| this is a line block that</span> -<span id="cb309-2"><a href="#cb309-2" aria-hidden="true" tabindex="-1"></a>| spans multiple</span> -<span id="cb309-3"><a href="#cb309-3" aria-hidden="true" tabindex="-1"></a>| even</span> +class="sourceCode md"><code class="sourceCode markdown"><span id="cb309-1"><a href="#cb309-1" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> this is a line block that</span> +<span id="cb309-2"><a href="#cb309-2" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> spans multiple</span> +<span id="cb309-3"><a href="#cb309-3" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> even</span> <span id="cb309-4"><a href="#cb309-4" aria-hidden="true" tabindex="-1"></a> discontinuous</span> -<span id="cb309-5"><a href="#cb309-5" aria-hidden="true" tabindex="-1"></a>| lines</span></code></pre></div> +<span id="cb309-5"><a href="#cb309-5" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> lines</span></code></pre></div> </dd> </dl> </dd> @@ -5447,8 +5475,8 @@ But I, being poor, have only my dreams;<br /> I have spread my dreams under your feet;<br /> Tread softly because you tread on my dreams.</div> </blockquote> -<h4 data-number="2.2.1.43" id="option-mark"><span -class="header-section-number">2.2.1.43</span> Option +<h4 data-number="2.2.1.44" id="option-mark"><span +class="header-section-number">2.2.1.44</span> Option <code>mark</code></h4> <dl> <dt><code>mark</code> (default value: <code>false</code>)</dt> @@ -5460,7 +5488,7 @@ class="header-section-number">2.2.1.43</span> Option href="https://pandoc.org/MANUAL.html#extension-mark">mark syntax extension</a>:</p> <div class="sourceCode" id="cb316"><pre -class="sourceCode md"><code class="sourceCode markdown"><span id="cb316-1"><a href="#cb316-1" aria-hidden="true" tabindex="-1"></a>This ==is highlighted text.==</span></code></pre></div> +class="sourceCode md"><code class="sourceCode markdown"><span id="cb316-1"><a href="#cb316-1" aria-hidden="true" tabindex="-1"></a>This <span class="al">==is highlighted text.==</span></span></code></pre></div> </dd> </dl> </dd> @@ -5495,8 +5523,8 @@ contain the following text:</p> <blockquote> <p>This <mark>is highlighted text.</mark></p> </blockquote> -<h4 data-number="2.2.1.44" id="option-notes"><span -class="header-section-number">2.2.1.44</span> Option +<h4 data-number="2.2.1.45" id="option-notes"><span +class="header-section-number">2.2.1.45</span> Option <code>notes</code></h4> <dl> <dt><code>notes</code> (default value: <code>false</code>)</dt> @@ -5627,8 +5655,8 @@ work like multi-paragraph list items.</code></pre> <p>This paragraph won’t be part of the note, because it isn’t indented.</p> </blockquote> -<h4 data-number="2.2.1.45" id="pipe-tables"><span -class="header-section-number">2.2.1.45</span> Option +<h4 data-number="2.2.1.46" id="pipe-tables"><span +class="header-section-number">2.2.1.46</span> Option <code>pipeTables</code></h4> <dl> <dt><code>pipeTables</code> (default value: <code>false</code>)</dt> @@ -5638,11 +5666,11 @@ class="header-section-number">2.2.1.45</span> Option <dd> <p>Enable the <abbr>PHP</abbr> Markdown pipe table syntax extension:</p> <div class="sourceCode" id="cb328"><pre -class="sourceCode md"><code class="sourceCode markdown"><span id="cb328-1"><a href="#cb328-1" aria-hidden="true" tabindex="-1"></a>| Right | Left | Default | Center |</span> -<span id="cb328-2"><a href="#cb328-2" aria-hidden="true" tabindex="-1"></a>|------:|:-----|---------|:------:|</span> -<span id="cb328-3"><a href="#cb328-3" aria-hidden="true" tabindex="-1"></a>| 12 | 12 | 12 | 12 |</span> -<span id="cb328-4"><a href="#cb328-4" aria-hidden="true" tabindex="-1"></a>| 123 | 123 | 123 | 123 |</span> -<span id="cb328-5"><a href="#cb328-5" aria-hidden="true" tabindex="-1"></a>| 1 | 1 | 1 | 1 |</span></code></pre></div> +class="sourceCode md"><code class="sourceCode markdown"><span id="cb328-1"><a href="#cb328-1" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> Right <span class="pp">|</span> Left <span class="pp">|</span> Default <span class="pp">|</span> Center <span class="pp">|</span></span> +<span id="cb328-2"><a href="#cb328-2" aria-hidden="true" tabindex="-1"></a><span class="pp">|------:|:-----|---------|:------:|</span></span> +<span id="cb328-3"><a href="#cb328-3" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span></span> +<span id="cb328-4"><a href="#cb328-4" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span></span> +<span id="cb328-5"><a href="#cb328-5" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span></span></code></pre></div> </dd> </dl> </dd> @@ -5762,8 +5790,8 @@ contain the following text:</p> </tbody> </table> </blockquote> -<h4 data-number="2.2.1.46" id="option-preservetabs"><span -class="header-section-number">2.2.1.46</span> Option +<h4 data-number="2.2.1.47" id="option-preservetabs"><span +class="header-section-number">2.2.1.47</span> Option <code>preserveTabs</code></h4> <dl> <dt><code>preserveTabs</code> (default value: <code>true</code>)</dt> @@ -5784,8 +5812,8 @@ class="header-section-number">2.2.1.46</span> Option </dl> </dd> </dl> -<h4 data-number="2.2.1.47" id="option-rawattribute"><span -class="header-section-number">2.2.1.47</span> Option +<h4 data-number="2.2.1.48" id="option-rawattribute"><span +class="header-section-number">2.2.1.48</span> Option <code>rawAttribute</code></h4> <dl> <dt><code>rawAttribute</code> (default value: <code>false</code>)</dt> @@ -5852,8 +5880,8 @@ contain the following text:</p> <blockquote> <p>H<sub>2</sub>O is a liquid.</p> </blockquote> -<h4 data-number="2.2.1.48" id="option-relativereferences"><span -class="header-section-number">2.2.1.48</span> Option +<h4 data-number="2.2.1.49" id="option-relativereferences"><span +class="header-section-number">2.2.1.49</span> Option <code>relativeReferences</code></h4> <dl> <dt><code>relativeReferences</code> (default value: @@ -5917,8 +5945,8 @@ contain the following text:</p> <p>In this paper, we have discovered that most grandmas would rather eat dinner with their grandchildren than get eaten. Begone, wolf!</p> </blockquote> -<h4 data-number="2.2.1.49" id="option-shiftheadings"><span -class="header-section-number">2.2.1.49</span> Option +<h4 data-number="2.2.1.50" id="option-shiftheadings"><span +class="header-section-number">2.2.1.50</span> Option <code>shiftHeadings</code></h4> <dl> <dt><code>shiftHeadings</code> (default value: <code>0</code>)</dt> @@ -6019,8 +6047,8 @@ contain the following text:</p> <h2 id="a-section-7">A section</h2> <h3 id="a-section-8">A section</h3> </blockquote> -<h4 data-number="2.2.1.50" id="option-slice"><span -class="header-section-number">2.2.1.50</span> Option +<h4 data-number="2.2.1.51" id="option-slice"><span +class="header-section-number">2.2.1.51</span> Option <code>slice</code></h4> <dl> <dt><code>slice</code> (default value: <code>^ $</code>)</dt> @@ -6187,8 +6215,8 @@ contain the following text:</p> <h2 id="act-v-2">Act V</h2> <p>Hamlet dies.</p> </blockquote> -<h4 data-number="2.2.1.51" id="option-smartellipses"><span -class="header-section-number">2.2.1.51</span> Option +<h4 data-number="2.2.1.52" id="option-smartellipses"><span +class="header-section-number">2.2.1.52</span> Option <code>smartEllipses</code></h4> <dl> <dt><code>smartEllipses</code> (default value: <code>false</code>)</dt> @@ -6371,8 +6399,8 @@ contain the following text:</p> <p>These are just three regular dots …</p> <p>. . . and this is a victorian ellipsis.</p> </blockquote> -<h4 data-number="2.2.1.52" id="option-startnumber"><span -class="header-section-number">2.2.1.52</span> Option +<h4 data-number="2.2.1.53" id="option-startnumber"><span +class="header-section-number">2.2.1.53</span> Option <code>startNumber</code></h4> <dl> <dt><code>startNumber</code> (default value: <code>true</code>)</dt> @@ -6490,8 +6518,8 @@ markup:</p> <li>fifth item</li> </ol> </blockquote> -<h4 data-number="2.2.1.53" id="option-strikethrough"><span -class="header-section-number">2.2.1.53</span> Option +<h4 data-number="2.2.1.54" id="option-strikethrough"><span +class="header-section-number">2.2.1.54</span> Option <code>strikeThrough</code></h4> <dl> <dt><code>strikeThrough</code> (default value: <code>false</code>)</dt> @@ -6584,8 +6612,8 @@ contain the following text:</p> <blockquote> <p>This is <del>a lunar roving vehicle</del> strike-through text.</p> </blockquote> -<h4 data-number="2.2.1.54" id="option-stripindent"><span -class="header-section-number">2.2.1.54</span> Option +<h4 data-number="2.2.1.55" id="option-stripindent"><span +class="header-section-number">2.2.1.55</span> Option <code>stripIndent</code></h4> <dl> <dt><code>stripIndent</code> (default value: <code>false</code>)</dt> @@ -6667,8 +6695,8 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb383-1"><a href class="sourceCode sh"><code class="sourceCode bash"><span id="cb384-1"><a href="#cb384-1" aria-hidden="true" tabindex="-1"></a><span class="ex">context</span> <span class="at">--luatex</span> document.tex</span></code></pre></div> <p>A PDF document named <code>document.pdf</code> should be produced and contain the text “Hello <em>world</em>!”</p> -<h4 data-number="2.2.1.55" id="option-subscripts"><span -class="header-section-number">2.2.1.55</span> Option +<h4 data-number="2.2.1.56" id="option-subscripts"><span +class="header-section-number">2.2.1.56</span> Option <code>subscripts</code></h4> <dl> <dt><code>subscripts</code> (default value: <code>false</code>)</dt> @@ -6733,8 +6761,8 @@ contain the following text:</p> <blockquote> <p>H<sub>2</sub>O is a liquid.</p> </blockquote> -<h4 data-number="2.2.1.56" id="option-superscripts"><span -class="header-section-number">2.2.1.56</span> Option +<h4 data-number="2.2.1.57" id="option-superscripts"><span +class="header-section-number">2.2.1.57</span> Option <code>superscripts</code></h4> <dl> <dt><code>superscripts</code> (default value: <code>false</code>)</dt> @@ -6799,8 +6827,8 @@ contain the following text:</p> <blockquote> <p>2<sup>10</sup> is 1024.</p> </blockquote> -<h4 data-number="2.2.1.57" id="option-tableattributes"><span -class="header-section-number">2.2.1.57</span> Option +<h4 data-number="2.2.1.58" id="option-tableattributes"><span +class="header-section-number">2.2.1.58</span> Option <code>tableAttributes</code></h4> <dl> <dt><code>tableAttributes</code> (default value: @@ -6812,11 +6840,11 @@ class="header-section-number">2.2.1.57</span> Option <p>Enable the assignment of HTML attributes to <a href="#table-captions">table captions</a>.</p> <div class="sourceCode" id="cb395"><pre -class="sourceCode md"><code class="sourceCode markdown"><span id="cb395-1"><a href="#cb395-1" aria-hidden="true" tabindex="-1"></a>| Right | Left | Default | Center |</span> -<span id="cb395-2"><a href="#cb395-2" aria-hidden="true" tabindex="-1"></a>|------:|:-----|---------|:------:|</span> -<span id="cb395-3"><a href="#cb395-3" aria-hidden="true" tabindex="-1"></a>| 12 | 12 | 12 | 12 |</span> -<span id="cb395-4"><a href="#cb395-4" aria-hidden="true" tabindex="-1"></a>| 123 | 123 | 123 | 123 |</span> -<span id="cb395-5"><a href="#cb395-5" aria-hidden="true" tabindex="-1"></a>| 1 | 1 | 1 | 1 |</span> +class="sourceCode md"><code class="sourceCode markdown"><span id="cb395-1"><a href="#cb395-1" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> Right <span class="pp">|</span> Left <span class="pp">|</span> Default <span class="pp">|</span> Center <span class="pp">|</span></span> +<span id="cb395-2"><a href="#cb395-2" aria-hidden="true" tabindex="-1"></a><span class="pp">|------:|:-----|---------|:------:|</span></span> +<span id="cb395-3"><a href="#cb395-3" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span></span> +<span id="cb395-4"><a href="#cb395-4" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span></span> +<span id="cb395-5"><a href="#cb395-5" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span></span> <span id="cb395-6"><a href="#cb395-6" aria-hidden="true" tabindex="-1"></a></span> <span id="cb395-7"><a href="#cb395-7" aria-hidden="true" tabindex="-1"></a> : Demonstration of pipe table syntax. {#example-table}</span></code></pre></div> </dd> @@ -6922,8 +6950,8 @@ contain the following text:</p> </tbody> </table> </blockquote> -<h4 data-number="2.2.1.58" id="table-captions"><span -class="header-section-number">2.2.1.58</span> Option +<h4 data-number="2.2.1.59" id="table-captions"><span +class="header-section-number">2.2.1.59</span> Option <code>tableCaptions</code></h4> <dl> <dt><code>tableCaptions</code> (default value: <code>false</code>)</dt> @@ -6936,11 +6964,11 @@ href="https://pandoc.org/MANUAL.html#extension-table_captions">table caption syntax extension</a> for <a href="#pipe-tables">pipe tables</a>.</p> <div class="sourceCode" id="cb398"><pre -class="sourceCode md"><code class="sourceCode markdown"><span id="cb398-1"><a href="#cb398-1" aria-hidden="true" tabindex="-1"></a>| Right | Left | Default | Center |</span> -<span id="cb398-2"><a href="#cb398-2" aria-hidden="true" tabindex="-1"></a>|------:|:-----|---------|:------:|</span> -<span id="cb398-3"><a href="#cb398-3" aria-hidden="true" tabindex="-1"></a>| 12 | 12 | 12 | 12 |</span> -<span id="cb398-4"><a href="#cb398-4" aria-hidden="true" tabindex="-1"></a>| 123 | 123 | 123 | 123 |</span> -<span id="cb398-5"><a href="#cb398-5" aria-hidden="true" tabindex="-1"></a>| 1 | 1 | 1 | 1 |</span> +class="sourceCode md"><code class="sourceCode markdown"><span id="cb398-1"><a href="#cb398-1" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> Right <span class="pp">|</span> Left <span class="pp">|</span> Default <span class="pp">|</span> Center <span class="pp">|</span></span> +<span id="cb398-2"><a href="#cb398-2" aria-hidden="true" tabindex="-1"></a><span class="pp">|------:|:-----|---------|:------:|</span></span> +<span id="cb398-3"><a href="#cb398-3" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span> 12 <span class="pp">|</span></span> +<span id="cb398-4"><a href="#cb398-4" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span> 123 <span class="pp">|</span></span> +<span id="cb398-5"><a href="#cb398-5" aria-hidden="true" tabindex="-1"></a><span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span> 1 <span class="pp">|</span></span> <span id="cb398-6"><a href="#cb398-6" aria-hidden="true" tabindex="-1"></a></span> <span id="cb398-7"><a href="#cb398-7" aria-hidden="true" tabindex="-1"></a> : Demonstration of pipe table syntax.</span></code></pre></div> </dd> @@ -7071,8 +7099,8 @@ contain the following text:</p> </tbody> </table> </blockquote> -<h4 data-number="2.2.1.59" id="option-tasklists"><span -class="header-section-number">2.2.1.59</span> Option +<h4 data-number="2.2.1.60" id="option-tasklists"><span +class="header-section-number">2.2.1.60</span> Option <code>taskLists</code></h4> <dl> <dt><code>taskLists</code> (default value: <code>false</code>)</dt> @@ -7161,8 +7189,8 @@ contain the following text:</p> <li>Yes I can!</li> </ul> </blockquote> -<h4 data-number="2.2.1.60" id="option-texcomments"><span -class="header-section-number">2.2.1.60</span> Option +<h4 data-number="2.2.1.61" id="option-texcomments"><span +class="header-section-number">2.2.1.61</span> Option <code>texComments</code></h4> <dl> <dt><code>texComments</code> (default value: <code>false</code>)</dt> @@ -7248,8 +7276,8 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb413-1"><a href class="sourceCode sh"><code class="sourceCode bash"><span id="cb414-1"><a href="#cb414-1" aria-hidden="true" tabindex="-1"></a><span class="ex">context</span> <span class="at">--luatex</span> document.tex</span></code></pre></div> <p>A PDF document named <code>document.pdf</code> should be produced and contain the text “Hello <em>world</em>!”</p> -<h4 data-number="2.2.1.61" id="option-texmathdollars"><span -class="header-section-number">2.2.1.61</span> Option +<h4 data-number="2.2.1.62" id="option-texmathdollars"><span +class="header-section-number">2.2.1.62</span> Option <code>texMathDollars</code></h4> <dl> <dt><code>texMathDollars</code> (default value: <code>false</code>)</dt> @@ -7432,8 +7460,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p> <p><span class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p> </blockquote> -<h4 data-number="2.2.1.62" id="option-texmathdoublebackslash"><span -class="header-section-number">2.2.1.62</span> Option +<h4 data-number="2.2.1.63" id="option-texmathdoublebackslash"><span +class="header-section-number">2.2.1.63</span> Option <code>texMathDoubleBackslash</code></h4> <dl> <dt><code>texMathDoubleBackslash</code> (default value: @@ -7617,8 +7645,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p> <p><span class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p> </blockquote> -<h4 data-number="2.2.1.63" id="option-texmathsinglebackslash"><span -class="header-section-number">2.2.1.63</span> Option +<h4 data-number="2.2.1.64" id="option-texmathsinglebackslash"><span +class="header-section-number">2.2.1.64</span> Option <code>texMathSingleBackslash</code></h4> <dl> <dt><code>texMathSingleBackslash</code> (default value: @@ -7802,8 +7830,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p> <p><span class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p> </blockquote> -<h4 data-number="2.2.1.64" id="option-tightlists"><span -class="header-section-number">2.2.1.64</span> Option +<h4 data-number="2.2.1.65" id="option-tightlists"><span +class="header-section-number">2.2.1.65</span> Option <code>tightLists</code></h4> <dl> <dt><code>tightLists</code> (default value: <code>true</code>)</dt> @@ -7899,8 +7927,8 @@ contain the following text:</p> <li><p>third item</p></li> </ul> </blockquote> -<h4 data-number="2.2.1.65" id="option-underscores"><span -class="header-section-number">2.2.1.65</span> Option +<h4 data-number="2.2.1.66" id="option-underscores"><span +class="header-section-number">2.2.1.66</span> Option <code>underscores</code></h4> <dl> <dt><code>underscores</code> (default value: <code>true</code>)</dt> @@ -9421,7 +9449,7 @@ class="math inline"><em>s</em></span>. If any <code><strong>kpathsea</strong></code><a href="#fn3" class="footnote-ref" id="fnref3" role="doc-noteref"><sup>3</sup></a> contains a record <span -class="math inline">(<em>k</em>,<em>v</em>)</span>, then a +class="math inline">(<em>k</em>, <em>v</em>)</span>, then a non-online-image content block with the filename extension <span class="math inline"><em>s</em>, <em>s</em></span><code>:lower()</code><span class="math inline"> = <em>k</em></span> is considered to be in a known @@ -12320,13 +12348,13 @@ class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5> class="sourceCode tex"><code class="sourceCode latex"><span id="cb653-1"><a href="#cb653-1" aria-hidden="true" tabindex="-1"></a><span class="bu">\documentclass</span>{<span class="ex">article</span>}</span> <span id="cb653-2"><a href="#cb653-2" aria-hidden="true" tabindex="-1"></a><span class="bu">\usepackage</span>[texMathDollars]{<span class="ex">markdown</span>}</span> <span id="cb653-3"><a href="#cb653-3" aria-hidden="true" tabindex="-1"></a><span class="bu">\usepackage</span>{<span class="ex">amsmath</span>}</span> -<span id="cb653-4"><a href="#cb653-4" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererInlineMath</span>#1{<span class="kw">\begin</span>{<span class="ex">math</span>}<span class="ss">#1</span><span class="sc">\dots\end</span><span class="ss">{math}}</span></span> -<span id="cb653-5"><a href="#cb653-5" aria-hidden="true" tabindex="-1"></a><span class="sc">\def\markdownRendererDisplayMath</span><span class="ss">#1{</span><span class="kw">\begin</span>{<span class="ex">equation</span>}<span class="ss">#1</span><span class="sc">\end</span><span class="ss">{equation}}</span></span> +<span id="cb653-4"><a href="#cb653-4" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererInlineMath</span>#1{<span class="kw">\begin</span>{<span class="ex">math</span>}<span class="ss">#1</span><span class="sc">\dots</span><span class="kw">\end</span>{<span class="ex">math</span>}}</span> +<span id="cb653-5"><a href="#cb653-5" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererDisplayMath</span>#1{<span class="kw">\begin</span>{<span class="ex">equation</span>}<span class="ss">#1</span><span class="kw">\end</span>{<span class="ex">equation</span>}}</span> <span id="cb653-6"><a href="#cb653-6" aria-hidden="true" tabindex="-1"></a><span class="kw">\begin</span>{<span class="ex">document</span>}</span> <span id="cb653-7"><a href="#cb653-7" aria-hidden="true" tabindex="-1"></a><span class="kw">\begin</span>{<span class="ex">markdown</span>}</span> -<span id="cb653-8"><a href="#cb653-8" aria-hidden="true" tabindex="-1"></a><span class="er">$</span><span class="ss">E=mc^2</span><span class="er">$</span></span> +<span id="cb653-8"><a href="#cb653-8" aria-hidden="true" tabindex="-1"></a><span class="ss">$E=mc^2$</span></span> <span id="cb653-9"><a href="#cb653-9" aria-hidden="true" tabindex="-1"></a></span> -<span id="cb653-10"><a href="#cb653-10" aria-hidden="true" tabindex="-1"></a><span class="er">$$</span><span class="sc">\hat</span><span class="ss">{f} </span><span class="sc">\left</span><span class="ss"> ( </span><span class="sc">\xi</span><span class="ss"> </span><span class="sc">\right</span><span class="ss"> )= </span><span class="sc">\int</span><span class="ss">_{-</span><span class="sc">\infty</span><span class="ss">}^{</span><span class="sc">\infty</span><span class="ss">} f</span><span class="sc">\left</span><span class="ss"> ( x </span><span class="sc">\right</span><span class="ss"> ) e^{-i2</span><span class="sc">\pi</span><span class="ss"> </span><span class="sc">\xi</span><span class="ss"> x} dx</span><span class="er">$$</span></span> +<span id="cb653-10"><a href="#cb653-10" aria-hidden="true" tabindex="-1"></a><span class="ss">$$</span><span class="sc">\hat</span><span class="ss">{f} </span><span class="sc">\left</span><span class="ss"> ( </span><span class="sc">\xi</span><span class="ss"> </span><span class="sc">\right</span><span class="ss"> )= </span><span class="sc">\int</span><span class="ss">_{-</span><span class="sc">\infty</span><span class="ss">}^{</span><span class="sc">\infty</span><span class="ss">} f</span><span class="sc">\left</span><span class="ss"> ( x </span><span class="sc">\right</span><span class="ss"> ) e^{-i2</span><span class="sc">\pi</span><span class="ss"> </span><span class="sc">\xi</span><span class="ss"> x} dx$$</span></span> <span id="cb653-11"><a href="#cb653-11" aria-hidden="true" tabindex="-1"></a><span class="kw">\end</span>{<span class="ex">markdown</span>}</span> <span id="cb653-12"><a href="#cb653-12" aria-hidden="true" tabindex="-1"></a><span class="kw">\end</span>{<span class="ex">document</span>}</span></code></pre></div> <p>Next, invoke LuaTeX from the terminal:</p> @@ -12914,7 +12942,7 @@ contain the following text:</p> <blockquote> <p>Jane Doe is 99 years old.</p> </blockquote> -<aside id="footnotes" class="footnotes footnotes-end-of-document" +<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes"> <hr /> <ol> @@ -12929,6 +12957,6 @@ class="footnote-back" role="doc-backlink">↩︎</a></p></li> <code>contentBlocksLanguageMap</code> Lua option.<a href="#fnref3" class="footnote-back" role="doc-backlink">↩︎</a></p></li> </ol> -</aside> +</section> </body> </html> diff --git a/macros/generic/markdown/markdown.pdf b/macros/generic/markdown/markdown.pdf Binary files differindex bf3807990a..d77534db1b 100644 --- a/macros/generic/markdown/markdown.pdf +++ b/macros/generic/markdown/markdown.pdf diff --git a/macros/latex-dev/base/README.md b/macros/latex-dev/base/README.md index a22c57ad24..8e74772593 100644 --- a/macros/latex-dev/base/README.md +++ b/macros/latex-dev/base/README.md @@ -1,7 +1,7 @@ The LaTeX kernel ================ -Release 2024-11-01 pre-release 4 +Release 2025-06-01 pre-release 0 Overview -------- diff --git a/macros/latex-dev/base/alltt.pdf b/macros/latex-dev/base/alltt.pdf Binary files differindex 26c6b0e171..bd3211998e 100644 --- a/macros/latex-dev/base/alltt.pdf +++ b/macros/latex-dev/base/alltt.pdf diff --git a/macros/latex-dev/base/cfgguide.pdf b/macros/latex-dev/base/cfgguide.pdf Binary files differindex e8b7788146..7bf7bd0b18 100644 --- a/macros/latex-dev/base/cfgguide.pdf +++ b/macros/latex-dev/base/cfgguide.pdf diff --git a/macros/latex-dev/base/changes.txt b/macros/latex-dev/base/changes.txt index 5f0a4f5014..6321cf6fd8 100644 --- a/macros/latex-dev/base/changes.txt +++ b/macros/latex-dev/base/changes.txt @@ -6,6 +6,55 @@ to completeness or accuracy and it contains some references to files that are not part of the distribution. ================================================================================ +================================================================================ +All changes above are only part of the development branch for the next release. +================================================================================ + +######################### +# 2024-11-01 Release +######################### + +2024-10-29 Yukai Chou <muzimuzhi@gmail.com> + * lthooks.dtx (subsection{Setting rules for hooks code}): + Skip mapping over undeclared \g__hook_<hook>_code_prop (gh/1513). + +2024-10-27 Marcel Krüger <Marcel.Krueger@latex-project.org> + * lttagging.dtx + Change tagging sockets with two arguments to drop the first argument + but return the second argument when the socket is disabled with \SuspendTagging. + Add expandable versions of tagging socket use commands. + * ltsocket.dtx + Add expandable versions of \socket_use_expandable:n. + Make internal plug definitions non-protected to allow expandable use. + +2024-10-26 Yukai Chou <muzimuzhi@gmail.com> + * ltcounts.dtx (subsection{Environment Counter Macros}): + Fully expand counter name in \theH<counter> commands (gh/1508) + +2024-10-23 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * doc.dtx: + A rollback comment leaked into the documentation (gh1418) + +2024-10-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * ltcmdhooks.dtx: + Some clarification why not all + commands allow generic cmd hooks (gh/1091, gh/1430 and gh/1501) + +2024-10-22 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * ltshipout.dtx: correct documentation (gh/1470). + + 2024-10-21 Matthew Bertucci <bertucci@math.utah.edu> + * lthooks.dtx + Define \IfHookEmptyT, \IfHookEmptyF + * ltmarks.dtx + Define \IfMarksEqualT, \IfMarksEqualF + * ltproperties.dtx + Define \IfPropertyRecordedT, \IfPropertyRecordedF + +2024-10-18 Clea Rees <reesc21@cf.ac.uk> + * lttextcomp.dtx + Fix typo in \ProvidesFile + 2024-10-12 Joseph Wright <Joseph.Wright@latex-project.org> * ltmiscen.dtx Define \begin as an engine-protected macro @@ -15,7 +64,7 @@ not part of the distribution. Correct passing of token list content using \KeyValue 2024-10-02 Ulrike Fischer <Ulrike.Fischer@latex-project.org> - * lttagging.dtx: restore also paratagging in the para/restore socket, + * lttagging.dtx: restore also paratagging in the para/restore socket, see https://github.com/latex3/tagging-project/issues/723 2024-09-25 Matthew Bertucci <bertucci@math.utah.edu> @@ -25,7 +74,6 @@ not part of the distribution. * lttagging.dtx: dummy for \tag_suspend:n and \tag_resume:n * lttagging.dtx: declare tagging sockets for floats and caption. - 2024-09-21 Ulrike Fischer <Ulrike.Fischer@latex-project.org> * ltcounts.dtx (subsection{Environment Counter Macros}): @@ -34,7 +82,6 @@ not part of the distribution. Use sockets in \refstepcounter for target and tagging support. * ltmeta.dtx: move patches and change of \MakeLinkTarget from latex-lab. * lttagging.dtx: add tagging socket for targets. - 2024-09-15 Joseph Wright <Joseph.Wright@latex-project.org> * lttemplates-doc.tex, lttemplates-code.tex: @@ -125,12 +172,6 @@ not part of the distribution. (subsection{Declaring commands and environments}): Simplify \__cmd_declare_env:nnnn, use space-trimmed envname directly -2024-06-23 Yukai Chou <muzimuzhi@gmail.com> - - * ltpara.dtx - Append \everypar toks to \g__parar_standard_everypar_tl, rollback - 2023/06/01 (gh/1386) - 2024-06-24 Frank Mittelbach <Frank.Mittelbach@latex-project.org> * ltlists.dtx: @@ -198,9 +239,15 @@ not part of the distribution. * lttemplates.dtx: Fix markup typos. -================================================================================ -All changes above are only part of the development branch for the next release. -================================================================================ +######################### +# 2024-06-01 PL2 Release +######################### + +2024-06-23 Yukai Chou <muzimuzhi@gmail.com> + + * ltpara.dtx + Append \everypar toks to \g__parar_standard_everypar_tl, rollback + 2023/06/01 (gh/1386) ######################### # 2024-06-01 PL1 Release diff --git a/macros/latex-dev/base/classes.pdf b/macros/latex-dev/base/classes.pdf Binary files differindex 094b379cb6..a43910f485 100644 --- a/macros/latex-dev/base/classes.pdf +++ b/macros/latex-dev/base/classes.pdf diff --git a/macros/latex-dev/base/clsguide-historic.pdf b/macros/latex-dev/base/clsguide-historic.pdf Binary files differindex c5b07e748b..76ce49be4b 100644 --- a/macros/latex-dev/base/clsguide-historic.pdf +++ b/macros/latex-dev/base/clsguide-historic.pdf diff --git a/macros/latex-dev/base/clsguide.pdf b/macros/latex-dev/base/clsguide.pdf Binary files differindex 526a571cd2..1658b6168e 100644 --- a/macros/latex-dev/base/clsguide.pdf +++ b/macros/latex-dev/base/clsguide.pdf diff --git a/macros/latex-dev/base/cmfonts.pdf b/macros/latex-dev/base/cmfonts.pdf Binary files differindex 60aef6e282..89de0c3ef6 100644 --- a/macros/latex-dev/base/cmfonts.pdf +++ b/macros/latex-dev/base/cmfonts.pdf diff --git a/macros/latex-dev/base/cyrguide.pdf b/macros/latex-dev/base/cyrguide.pdf Binary files differindex 0f643e3122..b5f914d9e2 100644 --- a/macros/latex-dev/base/cyrguide.pdf +++ b/macros/latex-dev/base/cyrguide.pdf diff --git a/macros/latex-dev/base/doc-code.pdf b/macros/latex-dev/base/doc-code.pdf Binary files differindex 60072bde43..d361838381 100644 --- a/macros/latex-dev/base/doc-code.pdf +++ b/macros/latex-dev/base/doc-code.pdf diff --git a/macros/latex-dev/base/doc.dtx b/macros/latex-dev/base/doc.dtx index 4cb8dd6b1c..a6af48b88a 100644 --- a/macros/latex-dev/base/doc.dtx +++ b/macros/latex-dev/base/doc.dtx @@ -34,7 +34,7 @@ %\catcode`\<=14 %<+package|shortvrb>\NeedsTeXFormat{LaTeX2e}[1994/12/01] %<+package> -% Any rollback request before 2016-02-15 we try to fulfill with the 2016 version: +% ^^A Any rollback request before 2016-02-15 we try to fulfill with the 2016 version: %<+package>\DeclareRelease{}{1994-06-01} %<+package> {doc-2016-02-15.sty} %<+package>\DeclareRelease{v2.1g}{2016-02-15} @@ -45,7 +45,7 @@ %<+package> %<+package>\ProvidesPackage{doc} %<+shortvrb>\ProvidesPackage{shortvrb} -%<+package|shortvrb> [2024/06/29 v3.0q +%<+package|shortvrb> [2024/10/23 v3.0q %<+package|shortvrb> Standard LaTeX documentation package V3 (FMi)] %\catcode`\<=12 % diff --git a/macros/latex-dev/base/doc.pdf b/macros/latex-dev/base/doc.pdf Binary files differindex 65ebc473e3..817c4c5a5e 100644 --- a/macros/latex-dev/base/doc.pdf +++ b/macros/latex-dev/base/doc.pdf diff --git a/macros/latex-dev/base/docstrip.pdf b/macros/latex-dev/base/docstrip.pdf Binary files differindex 2080f1d0cf..91ac058a5d 100644 --- a/macros/latex-dev/base/docstrip.pdf +++ b/macros/latex-dev/base/docstrip.pdf diff --git a/macros/latex-dev/base/encguide.pdf b/macros/latex-dev/base/encguide.pdf Binary files differindex 773c3a208e..e01c09a6e3 100644 --- a/macros/latex-dev/base/encguide.pdf +++ b/macros/latex-dev/base/encguide.pdf diff --git a/macros/latex-dev/base/exscale.pdf b/macros/latex-dev/base/exscale.pdf Binary files differindex c26625bac2..fceeac65e7 100644 --- a/macros/latex-dev/base/exscale.pdf +++ b/macros/latex-dev/base/exscale.pdf diff --git a/macros/latex-dev/base/fix-cm.pdf b/macros/latex-dev/base/fix-cm.pdf Binary files differindex e63ddf44a8..dfa6f18896 100644 --- a/macros/latex-dev/base/fix-cm.pdf +++ b/macros/latex-dev/base/fix-cm.pdf diff --git a/macros/latex-dev/base/fntguide.pdf b/macros/latex-dev/base/fntguide.pdf Binary files differindex 1e7ef27095..4788f8aa5e 100644 --- a/macros/latex-dev/base/fntguide.pdf +++ b/macros/latex-dev/base/fntguide.pdf diff --git a/macros/latex-dev/base/graphpap.pdf b/macros/latex-dev/base/graphpap.pdf Binary files differindex 54bcbc0c10..7988bac004 100644 --- a/macros/latex-dev/base/graphpap.pdf +++ b/macros/latex-dev/base/graphpap.pdf diff --git a/macros/latex-dev/base/ifthen.pdf b/macros/latex-dev/base/ifthen.pdf Binary files differindex aacaf95452..19a244e1d3 100644 --- a/macros/latex-dev/base/ifthen.pdf +++ b/macros/latex-dev/base/ifthen.pdf diff --git a/macros/latex-dev/base/inputenc.pdf b/macros/latex-dev/base/inputenc.pdf Binary files differindex da79e23b16..9f855b1da3 100644 --- a/macros/latex-dev/base/inputenc.pdf +++ b/macros/latex-dev/base/inputenc.pdf diff --git a/macros/latex-dev/base/lamport-manual.pdf b/macros/latex-dev/base/lamport-manual.pdf Binary files differindex 5451a4e7dc..c9edf04efd 100644 --- a/macros/latex-dev/base/lamport-manual.pdf +++ b/macros/latex-dev/base/lamport-manual.pdf diff --git a/macros/latex-dev/base/latexrelease.pdf b/macros/latex-dev/base/latexrelease.pdf Binary files differindex 6a68894e03..f4d6211ea4 100644 --- a/macros/latex-dev/base/latexrelease.pdf +++ b/macros/latex-dev/base/latexrelease.pdf diff --git a/macros/latex-dev/base/latexsym.pdf b/macros/latex-dev/base/latexsym.pdf Binary files differindex 2c2f9185b5..fef1fb9d98 100644 --- a/macros/latex-dev/base/latexsym.pdf +++ b/macros/latex-dev/base/latexsym.pdf diff --git a/macros/latex-dev/base/lb2.pdf b/macros/latex-dev/base/lb2.pdf Binary files differindex 2ba307919b..0f5e8979fe 100644 --- a/macros/latex-dev/base/lb2.pdf +++ b/macros/latex-dev/base/lb2.pdf diff --git a/macros/latex-dev/base/letter.pdf b/macros/latex-dev/base/letter.pdf Binary files differindex d27d0b009f..a7f8eb532a 100644 --- a/macros/latex-dev/base/letter.pdf +++ b/macros/latex-dev/base/letter.pdf diff --git a/macros/latex-dev/base/lgc2.pdf b/macros/latex-dev/base/lgc2.pdf Binary files differindex d77ecbbf98..acbc7ab359 100644 --- a/macros/latex-dev/base/lgc2.pdf +++ b/macros/latex-dev/base/lgc2.pdf diff --git a/macros/latex-dev/base/lppl.pdf b/macros/latex-dev/base/lppl.pdf Binary files differindex 9e356ca732..3f025cadbb 100644 --- a/macros/latex-dev/base/lppl.pdf +++ b/macros/latex-dev/base/lppl.pdf diff --git a/macros/latex-dev/base/ltcmdhooks-code.pdf b/macros/latex-dev/base/ltcmdhooks-code.pdf Binary files differindex 8aca1f3bec..cdf9a60b5b 100644 --- a/macros/latex-dev/base/ltcmdhooks-code.pdf +++ b/macros/latex-dev/base/ltcmdhooks-code.pdf diff --git a/macros/latex-dev/base/ltcmdhooks-doc.pdf b/macros/latex-dev/base/ltcmdhooks-doc.pdf Binary files differindex 7eadbbbdc8..ebd2c3780b 100644 --- a/macros/latex-dev/base/ltcmdhooks-doc.pdf +++ b/macros/latex-dev/base/ltcmdhooks-doc.pdf diff --git a/macros/latex-dev/base/ltcmdhooks.dtx b/macros/latex-dev/base/ltcmdhooks.dtx index e8793817df..0d14ebfe6b 100644 --- a/macros/latex-dev/base/ltcmdhooks.dtx +++ b/macros/latex-dev/base/ltcmdhooks.dtx @@ -20,7 +20,7 @@ %<*driver> % \fi \ProvidesFile{ltcmdhooks.dtx} - [2024/07/08 v1.0j LaTeX Kernel (Command hooks)] + [2024/10/22 v1.0j LaTeX Kernel (Command hooks)] % \iffalse % \documentclass{l3doc} @@ -68,7 +68,15 @@ % supported % for all types of commands, see section~\ref{sec:look-ahead} for % the restrictions that apply and what happens if one tries to use -% this with commands for which this is not supported.} These are: +% this with commands for which this is not supported.} +% +% However, this is only true \enquote{in theory}. In practice there +% are a number of restrictions that makes it impossible to use such +% generic command hooks in a number of cases, so please read all +% of section~\ref{sec:restrictions} to understand what may prevent +% you from using them successfully. +% +% The generic command hooks are: % \begin{description} % \item[\hook{cmd/\meta{name}/before}] % @@ -152,7 +160,55 @@ % and \TeX{} doesn't have a reliable way to see that, so some guesswork % has to be employed. % -% \subsection{Patching} +% We can do this in most cases when commands are defined using +% \cs{NewDocumentCommand} or \cs{newcommand} (with a few exceptions). +% For commands defined with \tn{def} the situation is less good. +% Common cases where the command hooks will not work are: +% \begin{itemize} +% \item +% +% Commands that use special catcode settings within their +% definition. In that case it is usually not possible to augment the +% definition (see~\ref{sec:patching}). +% +% \item +% +% If a command is defined while \cs{ExplSyntaxOn} is in force +% \textbf{and} the command contains \verb=~= characters to represent +% spaces, then it can't be patched to include the command hooks. In +% fact in some very special circumstances you might even get a +% low-level error rather than the information that the command can't +% be patched (see, for example, +% \url{https://github.com/latex3/latex2e/issues/1430}. +% +% \item +% +% Commands that have arguments as far as the user is concerned +% (e.g., \cs{section} or \cs{caption}), but are defined in a way that these +% arguments are not read by the user level command but only later +% during the processing. In that case the \texttt{after} hook +% doesn't work at all. The \text{before} hook only works with +% \cs{AddToHook} but not with \cs{AddToHookWithArguments} because the +% arguments haven't been read at that point where the hook is +% patched in. See +% section~\ref{sec:look-ahead}. +% +% +% \item +% Adding a specific generic command hook is only attempted once per +% command, thus after redefining a command such hooks will no longer +% be there and will also not being re-added, see section~\ref{sec:timing}. +% +% \end{itemize} +% All this means that you have to have a good understanding of how +% commands are defined when you attempt to make use of such hooks and +% something goes wrong. +% What can help in that case is to turn on \cs{DebugHooksOn} in which +% case you get much more (low-level) details on why something fails and +% what was tried to enable the hooks. +% +% +% \subsection{Patching}\label{sec:patching} % % The code here tries to find out if a command was defined with % \tn{newcommand} or \tn{DeclareRobustCommand} or @@ -172,7 +228,7 @@ % catcode settings are not the same as the ones at the time of command's % definition, so not always adding a hook to a command will work. % -% \subsubsection{Timing} +% \subsubsection{Timing}\label{sec:timing} % % When \cs{AddToHook} (or its \pkg{expl3} equivalent) is called with % a generic |cmd| hook, say, \hook{cmd/foo/before}, for the first time @@ -211,12 +267,14 @@ % hooks attached to them. % % One good example is the \tn{section} command. You can add something -% to the \hook{cmd/section/before} hook, but if you try to add something -% to the \hook{cmd/section/after} hook, \tn{section} will no longer -% work. That happens because the \tn{section} macro takes no argument, -% but instead calls a few internal \LaTeX{} macros to look for the -% optional and mandatory arguments. By adding code to the -% \hook{cmd/section/after} hook, you get in the way of that scanning. +% to the \hook{cmd/section/before} hook (but only with \cs{AddToHook} +% not \cs{AddToHookWithArguments}), +% but if you try to add anything to the \hook{cmd/section/after} +% hook, \tn{section} will no longer work at all. That happens because the +% \tn{section} macro takes no argument, but instead calls a few +% internal \LaTeX{} macros to look for the optional and mandatory +% arguments. By adding code to the \hook{cmd/section/after} hook, you +% get in the way of that scanning. % % In such a case, where it is known that a specific generic command % hook does not work if code is added to it, the package author can diff --git a/macros/latex-dev/base/ltcounts.dtx b/macros/latex-dev/base/ltcounts.dtx index 9417769d73..1d3f202489 100644 --- a/macros/latex-dev/base/ltcounts.dtx +++ b/macros/latex-dev/base/ltcounts.dtx @@ -33,7 +33,7 @@ %<*driver> % \fi \ProvidesFile{ltcounts.dtx} - [2024/09/20 v1.1o LaTeX Kernel (Counters)] + [2024/10/26 v1.1p LaTeX Kernel (Counters)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltcounts.dtx} @@ -310,6 +310,7 @@ % \changes{v1.1n}{2023/11/07}{Do not change \cs{the...} if already defined (gh/823)} % \changes{v1.1o}{2024/09/20}{define theHfoo (used for internal links)} % \begin{macrocode} +% \changes{v1.1p}{2024/10/26}{Fully expand counter name in theHfoo commands (gh/1508)} %</2ekernel> %<latexrelease>\IncludeInRelease{2024/11/01}{\@definecounter} %<latexrelease> {provide theHfoo commands}% @@ -319,7 +320,8 @@ \global\expandafter\let\csname cl@#1\endcsname\@empty \@addtoreset{#1}{@ckpt}% \global\expandafter\let\csname p@#1\endcsname\@empty - \expandafter\gdef\csname theH#1\endcsname{\the\value{#1}}% + \expandafter\xdef\csname theH#1\endcsname{% + \noexpand\the\noexpand\value{#1}}% % \end{macrocode} % If \cs{the\#1} is undefined or \cs{relax} we define it with the % standard definition for counters, otherwise we warn. This will @@ -360,6 +362,7 @@ % % \begin{macro}{\@addtoreset} % \changes{v1.1o}{2024/09/20}{add the parent theHfoo if a counter is reset} +% \changes{v1.1p}{2024/10/26}{Fully expand counter name in theHfoo commands (gh/1508)} % If a counter is reset when a parent counter changes it no longer has an unique value % across the document. As |\theH<counter>| should be unique % this representation is changed to include also the @@ -371,7 +374,9 @@ %<latexrelease> {provide theHfoo commands}% %<*2ekernel|latexrelease> \def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}% - \expandafter\gdef\csname theH#1\endcsname{\csname theH#2\endcsname.\the\value{#1}}% + \expandafter\xdef\csname theH#1\endcsname{% + \expandafter\noexpand\csname theH#2\endcsname.% + \noexpand\the\noexpand\value{#1}}% } %<latexrelease>\EndIncludeInRelease %</2ekernel|latexrelease> diff --git a/macros/latex-dev/base/ltfilehook-code.pdf b/macros/latex-dev/base/ltfilehook-code.pdf Binary files differindex 1269635a4a..18f398e257 100644 --- a/macros/latex-dev/base/ltfilehook-code.pdf +++ b/macros/latex-dev/base/ltfilehook-code.pdf diff --git a/macros/latex-dev/base/ltfilehook-doc.pdf b/macros/latex-dev/base/ltfilehook-doc.pdf Binary files differindex e6d556b0a9..fd8a9f3758 100644 --- a/macros/latex-dev/base/ltfilehook-doc.pdf +++ b/macros/latex-dev/base/ltfilehook-doc.pdf diff --git a/macros/latex-dev/base/lthooks-code.pdf b/macros/latex-dev/base/lthooks-code.pdf Binary files differindex a340bcdedd..419be940ec 100644 --- a/macros/latex-dev/base/lthooks-code.pdf +++ b/macros/latex-dev/base/lthooks-code.pdf diff --git a/macros/latex-dev/base/lthooks-doc.pdf b/macros/latex-dev/base/lthooks-doc.pdf Binary files differindex b3f605cbec..d05d264308 100644 --- a/macros/latex-dev/base/lthooks-doc.pdf +++ b/macros/latex-dev/base/lthooks-doc.pdf diff --git a/macros/latex-dev/base/lthooks.dtx b/macros/latex-dev/base/lthooks.dtx index 9e4450d628..0c33c022e3 100644 --- a/macros/latex-dev/base/lthooks.dtx +++ b/macros/latex-dev/base/lthooks.dtx @@ -32,7 +32,7 @@ %<*driver> % \fi \ProvidesFile{lthooks.dtx} - [2024/08/09 v1.1i LaTeX Kernel (hooks)] + [2024/10/29 v1.1k LaTeX Kernel (hooks)] % \iffalse % \documentclass{l3doc} @@ -405,11 +405,17 @@ % Removes any code labeled by \meta{label} from the \meta{hook}. % When the optional argument \meta{label} is not provided, the % \meta{default label} is used (see section~\ref{sec:default-label}). +% \end{function} % % If there is no code under the \meta{label} in the \meta{hook}, % or if the \meta{hook} does not exist, a warning is issued when % you attempt to \cs{RemoveFromHook}, and the command is ignored. -% \cs{RemoveFromHook} should be used only when you know exactly what +% \cs{RemoveFromHook}\marginpar{\raggedleft\rightskip5pt\itshape +% \textbf{Important:}\break The \cs{RemoveFromHook} command should be +% only used if one has full control over the code chunk to be removed. +% In particular it should not be used to remove code chunks from other +% packages! For this the \texttt{voids} relation is provided.} +% should be used only when you know exactly what % labels are in a hook. Typically this will be when some code gets added to a hook % by a package, then later this code is removed by that same package. % If you want to prevent the execution of code from another @@ -423,16 +429,15 @@ % The \meta{hook} and \meta{label} can be specified using the % dot-syntax to denote the current package name. % See section~\ref{sec:default-label}. -% \end{function} -% -% \medskip % -% In contrast to the \texttt{voids} relationship between two labels +% In contrast to the \texttt {voids} relationship between two labels % in a \cs{DeclareHookRule} this is a destructive operation as the % labeled code is removed from the hook data structure, whereas the % relationship setting can be undone by providing a different % relationship later. % +% \medskip +% % A useful application for this declaration inside the document body % is when one wants to temporarily add code to hooks and later remove % it again, e.g., @@ -538,7 +543,6 @@ % % % -% % \subsubsection{Hook names and default labels} % \label{sec:default-label} % @@ -894,7 +898,7 @@ % some variant thereof. Generic hooks such as \hook{file} and \hook{env} hooks are % automatically declared when code is added to them. % -% \begin{function}[EXP]{\IfHookEmptyTF} +% \begin{function}[EXP]{\IfHookEmptyTF,\IfHookEmptyT,\IfHookEmptyF} % \begin{syntax} % \cs{IfHookEmptyTF} \Arg{hook} \Arg{true code} \Arg{false code} % \end{syntax} @@ -6174,6 +6178,8 @@ } % \end{macrocode} % +% \changes{v1.1k}{2024/10/29} +% {Skip mapping over undeclared \cs{g_@@_\meta{hook}_code_prop} (gh/1513)} % \begin{macrocode} \@@_if_usable:nF {#1} { \@@_log_line:x { The~hook~is~not~declared. } } @@ -6183,7 +6189,9 @@ { #2 { The~hook~is~empty } } { \@@_log_line:x { Code~chunks: } - \prop_if_empty:cTF { g_@@_#1_code_prop } + \bool_lazy_or:nnTF + { ! \prop_if_exist_p:c { g_@@_#1_code_prop } } + { \prop_if_empty_p:c { g_@@_#1_code_prop } } { \@@_log_line_indent:x { --- } } { \prop_map_inline:cn { g_@@_#1_code_prop } @@ -6445,19 +6453,24 @@ % |#2|${}={}$\meta{label_1}\verb=|=\meta{label_2}, % and |#3|${}={}$\meta{hook} (the latter may be the argument |#1| to % \cs{@@_list_rules:nn}, or \texttt{??} if it is a default rule). +% \changes{v1.1k}{2024/10/29} +% {Skip mapping over undeclared \cs{g_@@_\meta{hook}_code_prop} (gh/1513)} % \begin{macrocode} \cs_new_protected:Npn \@@_list_rules:nn #1 #2 { - \cs_set_protected:Npn \@@_tmp:w ##1 ##2 ##3 {#2} - \prop_map_inline:cn { g_@@_#1_code_prop } + \prop_if_exist:cT { g_@@_#1_code_prop } { + \cs_set_protected:Npn \@@_tmp:w ##1 ##2 ##3 {#2} \prop_map_inline:cn { g_@@_#1_code_prop } { - \@@_if_label_case:nnnnn {##1} {####1} - { \prop_map_break: } - { \@@_list_one_rule:nnn {##1} {####1} } - { \@@_list_one_rule:nnn {####1} {##1} } - {#1} + \prop_map_inline:cn { g_@@_#1_code_prop } + { + \@@_if_label_case:nnnnn {##1} {####1} + { \prop_map_break: } + { \@@_list_one_rule:nnn {##1} {####1} } + { \@@_list_one_rule:nnn {####1} {##1} } + {#1} + } } } } @@ -7764,13 +7777,16 @@ % \end{macro} % % -% \begin{macro}[EXP]{\IfHookEmptyTF} +% \begin{macro}[EXP]{\IfHookEmptyTF,\IfHookEmptyT,\IfHookEmptyF} +% \changes{v1.1j}{2024/10/21}{Define \cs{IfHookEmptyT}, \cs{IfHookEmptyF}} % Here we avoid the overhead of \pkg{xparse}, since \cs{IfHookEmptyTF} % is used in \cs{end} (that is, every \LaTeX{} environment). As a % further optimization, use \cs{let} rather than \cs{def} to avoid one % expansion step. % \begin{macrocode} \cs_new_eq:NN \IfHookEmptyTF \hook_if_empty:nTF +\cs_new_eq:NN \IfHookEmptyT \hook_if_empty:nT +\cs_new_eq:NN \IfHookEmptyF \hook_if_empty:nF % \end{macrocode} % \end{macro} % diff --git a/macros/latex-dev/base/ltluatex.pdf b/macros/latex-dev/base/ltluatex.pdf Binary files differindex 6886ca4fa0..992ee68de4 100644 --- a/macros/latex-dev/base/ltluatex.pdf +++ b/macros/latex-dev/base/ltluatex.pdf diff --git a/macros/latex-dev/base/ltmarks-code.pdf b/macros/latex-dev/base/ltmarks-code.pdf Binary files differindex cf1a13a38e..61b65bbe12 100644 --- a/macros/latex-dev/base/ltmarks-code.pdf +++ b/macros/latex-dev/base/ltmarks-code.pdf diff --git a/macros/latex-dev/base/ltmarks-doc.pdf b/macros/latex-dev/base/ltmarks-doc.pdf Binary files differindex 567d98b29b..30a1f71773 100644 --- a/macros/latex-dev/base/ltmarks-doc.pdf +++ b/macros/latex-dev/base/ltmarks-doc.pdf diff --git a/macros/latex-dev/base/ltmarks.dtx b/macros/latex-dev/base/ltmarks.dtx index f71bfab9b6..f769a09324 100644 --- a/macros/latex-dev/base/ltmarks.dtx +++ b/macros/latex-dev/base/ltmarks.dtx @@ -17,7 +17,7 @@ %<*driver> % \fi \ProvidesFile{ltmarks.dtx} - [2024/07/08 v1.0g LaTeX Kernel (Marks)] + [2024/10/22 v1.0h LaTeX Kernel (Marks)] % \iffalse % \documentclass{l3doc} @@ -257,7 +257,7 @@ % running headers and footers and shipout out both in one % go.\footnote{As of now that scenario is not yet officially supported.} % -% \begin{function}[EXP]{\IfMarksEqualTF,\mark_if_eq:nnnnTF,\mark_if_eq:nnnnnnTF} +% \begin{function}[EXP]{\IfMarksEqualTF,\IfMarksEqualT,\IfMarksEqualF,\mark_if_eq:nnnnTF,\mark_if_eq:nnnnnnTF} % \begin{syntax} % \cs{IfMarksEqualTF} \oarg{region} \Arg{class} \Arg{pos_1} \Arg{pos_2} \Arg{true} \Arg{false} % \cs{mark_if_eq:nnnnTF} \Arg{region} \Arg{class} \Arg{pos_1} \Arg{pos_2} \Arg{true} \Arg{false} @@ -676,7 +676,8 @@ % and adds suitable \cs{mark_insert:nn} in the two token % lists. These token lists can then be executed at the right place % to reinsert the marks, e.g., directly after the box. This is, for -% example, used by \pkg{multicol} when a short balanced +% example, going to be used\footnote{Probably not before 2025, though.} +% by \pkg{multicol} when a short balanced % \env{multicols} is returned to the galley for typesetting. % % If the \meta{source} consists of a single vertical box (plus @@ -1799,8 +1800,9 @@ % % % -% \begin{macro}[EXP]{\IfMarksEqualTF} -% We only provide a CamelCase command for the case with one region +% \begin{macro}[EXP]{\IfMarksEqualTF,\IfMarksEqualT,\IfMarksEqualF} +% \changes{v1.0h}{2024/10/21}{Define \cs{IfMarksEqualT}, \cs{IfMarksEqualF}} +% We only provide CamelCase commands for the case with one region % (optional) and one class. One could think of also providing a % version for the general case with several optional arguments, but % use cases for this are most likely rare, so not done yet. @@ -1808,6 +1810,12 @@ \NewExpandableDocumentCommand \IfMarksEqualTF {O{page}mmm} { \mark_if_eq:nnnnTF {#1}{#2}{#3}{#4} } +\NewExpandableDocumentCommand \IfMarksEqualT {O{page}mmm} { + \mark_if_eq:nnnnT {#1}{#2}{#3}{#4} +} +\NewExpandableDocumentCommand \IfMarksEqualF {O{page}mmm} { + \mark_if_eq:nnnnF {#1}{#2}{#3}{#4} +} % \end{macrocode} % \end{macro} % diff --git a/macros/latex-dev/base/ltnews.pdf b/macros/latex-dev/base/ltnews.pdf Binary files differindex c678cd2b29..fc920d24d4 100644 --- a/macros/latex-dev/base/ltnews.pdf +++ b/macros/latex-dev/base/ltnews.pdf diff --git a/macros/latex-dev/base/ltnews.tex b/macros/latex-dev/base/ltnews.tex index af21aad00b..7756497289 100644 --- a/macros/latex-dev/base/ltnews.tex +++ b/macros/latex-dev/base/ltnews.tex @@ -40,7 +40,7 @@ \ProvidesFile{ltnews.tex}% [2022/06/10 v1.4e Master file for ltnews*.tex (LaTeX Project)] -\providecommand*{\lastissue}{40} +\providecommand*{\lastissue}{41} \InputIfFileExists{ltnews-lastissue.cfg}{}{} diff --git a/macros/latex-dev/base/ltnews01.pdf b/macros/latex-dev/base/ltnews01.pdf Binary files differindex 3fc3020d72..5fdbbf0d8e 100644 --- a/macros/latex-dev/base/ltnews01.pdf +++ b/macros/latex-dev/base/ltnews01.pdf diff --git a/macros/latex-dev/base/ltnews02.pdf b/macros/latex-dev/base/ltnews02.pdf Binary files differindex 5f7fd7cf48..482b092195 100644 --- a/macros/latex-dev/base/ltnews02.pdf +++ b/macros/latex-dev/base/ltnews02.pdf diff --git a/macros/latex-dev/base/ltnews03.pdf b/macros/latex-dev/base/ltnews03.pdf Binary files differindex 349ec0769d..3c231187b9 100644 --- a/macros/latex-dev/base/ltnews03.pdf +++ b/macros/latex-dev/base/ltnews03.pdf diff --git a/macros/latex-dev/base/ltnews04.pdf b/macros/latex-dev/base/ltnews04.pdf Binary files differindex bc48b28219..b0f68211d5 100644 --- a/macros/latex-dev/base/ltnews04.pdf +++ b/macros/latex-dev/base/ltnews04.pdf diff --git a/macros/latex-dev/base/ltnews05.pdf b/macros/latex-dev/base/ltnews05.pdf Binary files differindex d5fd084578..5e8372a988 100644 --- a/macros/latex-dev/base/ltnews05.pdf +++ b/macros/latex-dev/base/ltnews05.pdf diff --git a/macros/latex-dev/base/ltnews06.pdf b/macros/latex-dev/base/ltnews06.pdf Binary files differindex 11c2f135d6..b6b3d6465c 100644 --- a/macros/latex-dev/base/ltnews06.pdf +++ b/macros/latex-dev/base/ltnews06.pdf diff --git a/macros/latex-dev/base/ltnews07.pdf b/macros/latex-dev/base/ltnews07.pdf Binary files differindex eb9f3a9493..741dd1c092 100644 --- a/macros/latex-dev/base/ltnews07.pdf +++ b/macros/latex-dev/base/ltnews07.pdf diff --git a/macros/latex-dev/base/ltnews08.pdf b/macros/latex-dev/base/ltnews08.pdf Binary files differindex b611e667af..2c2d934244 100644 --- a/macros/latex-dev/base/ltnews08.pdf +++ b/macros/latex-dev/base/ltnews08.pdf diff --git a/macros/latex-dev/base/ltnews09.pdf b/macros/latex-dev/base/ltnews09.pdf Binary files differindex 372cd9a26a..f20a22d717 100644 --- a/macros/latex-dev/base/ltnews09.pdf +++ b/macros/latex-dev/base/ltnews09.pdf diff --git a/macros/latex-dev/base/ltnews10.pdf b/macros/latex-dev/base/ltnews10.pdf Binary files differindex eaa67dc4ee..8f5a1e7806 100644 --- a/macros/latex-dev/base/ltnews10.pdf +++ b/macros/latex-dev/base/ltnews10.pdf diff --git a/macros/latex-dev/base/ltnews11.pdf b/macros/latex-dev/base/ltnews11.pdf Binary files differindex ad17c6ffdf..7120d140b7 100644 --- a/macros/latex-dev/base/ltnews11.pdf +++ b/macros/latex-dev/base/ltnews11.pdf diff --git a/macros/latex-dev/base/ltnews12.pdf b/macros/latex-dev/base/ltnews12.pdf Binary files differindex a1871c4aeb..0086ef464e 100644 --- a/macros/latex-dev/base/ltnews12.pdf +++ b/macros/latex-dev/base/ltnews12.pdf diff --git a/macros/latex-dev/base/ltnews13.pdf b/macros/latex-dev/base/ltnews13.pdf Binary files differindex 582736ea05..65ccc95c39 100644 --- a/macros/latex-dev/base/ltnews13.pdf +++ b/macros/latex-dev/base/ltnews13.pdf diff --git a/macros/latex-dev/base/ltnews14.pdf b/macros/latex-dev/base/ltnews14.pdf Binary files differindex 0d088afec9..4151f2e058 100644 --- a/macros/latex-dev/base/ltnews14.pdf +++ b/macros/latex-dev/base/ltnews14.pdf diff --git a/macros/latex-dev/base/ltnews15.pdf b/macros/latex-dev/base/ltnews15.pdf Binary files differindex a20c4970a4..068ffb4a79 100644 --- a/macros/latex-dev/base/ltnews15.pdf +++ b/macros/latex-dev/base/ltnews15.pdf diff --git a/macros/latex-dev/base/ltnews16.pdf b/macros/latex-dev/base/ltnews16.pdf Binary files differindex 888372ba70..b0563d1876 100644 --- a/macros/latex-dev/base/ltnews16.pdf +++ b/macros/latex-dev/base/ltnews16.pdf diff --git a/macros/latex-dev/base/ltnews17.pdf b/macros/latex-dev/base/ltnews17.pdf Binary files differindex 71240c09c6..5eed24de70 100644 --- a/macros/latex-dev/base/ltnews17.pdf +++ b/macros/latex-dev/base/ltnews17.pdf diff --git a/macros/latex-dev/base/ltnews18.pdf b/macros/latex-dev/base/ltnews18.pdf Binary files differindex 4d55619b98..ffa8c6ba01 100644 --- a/macros/latex-dev/base/ltnews18.pdf +++ b/macros/latex-dev/base/ltnews18.pdf diff --git a/macros/latex-dev/base/ltnews19.pdf b/macros/latex-dev/base/ltnews19.pdf Binary files differindex 16c0c62911..d33fbb3fb8 100644 --- a/macros/latex-dev/base/ltnews19.pdf +++ b/macros/latex-dev/base/ltnews19.pdf diff --git a/macros/latex-dev/base/ltnews20.pdf b/macros/latex-dev/base/ltnews20.pdf Binary files differindex a585544562..05f877fba5 100644 --- a/macros/latex-dev/base/ltnews20.pdf +++ b/macros/latex-dev/base/ltnews20.pdf diff --git a/macros/latex-dev/base/ltnews21.pdf b/macros/latex-dev/base/ltnews21.pdf Binary files differindex b9dfe73338..2654d394fd 100644 --- a/macros/latex-dev/base/ltnews21.pdf +++ b/macros/latex-dev/base/ltnews21.pdf diff --git a/macros/latex-dev/base/ltnews22.pdf b/macros/latex-dev/base/ltnews22.pdf Binary files differindex 91027fe345..4023a9680f 100644 --- a/macros/latex-dev/base/ltnews22.pdf +++ b/macros/latex-dev/base/ltnews22.pdf diff --git a/macros/latex-dev/base/ltnews23.pdf b/macros/latex-dev/base/ltnews23.pdf Binary files differindex 1db85acf71..d5f7d765bd 100644 --- a/macros/latex-dev/base/ltnews23.pdf +++ b/macros/latex-dev/base/ltnews23.pdf diff --git a/macros/latex-dev/base/ltnews24.pdf b/macros/latex-dev/base/ltnews24.pdf Binary files differindex b75c2b8054..7393a550ff 100644 --- a/macros/latex-dev/base/ltnews24.pdf +++ b/macros/latex-dev/base/ltnews24.pdf diff --git a/macros/latex-dev/base/ltnews25.pdf b/macros/latex-dev/base/ltnews25.pdf Binary files differindex 7443c1edf1..c056f4458e 100644 --- a/macros/latex-dev/base/ltnews25.pdf +++ b/macros/latex-dev/base/ltnews25.pdf diff --git a/macros/latex-dev/base/ltnews26.pdf b/macros/latex-dev/base/ltnews26.pdf Binary files differindex efafea05cf..bb8440029b 100644 --- a/macros/latex-dev/base/ltnews26.pdf +++ b/macros/latex-dev/base/ltnews26.pdf diff --git a/macros/latex-dev/base/ltnews27.pdf b/macros/latex-dev/base/ltnews27.pdf Binary files differindex 81e0108ef9..bbca3fcd86 100644 --- a/macros/latex-dev/base/ltnews27.pdf +++ b/macros/latex-dev/base/ltnews27.pdf diff --git a/macros/latex-dev/base/ltnews28.pdf b/macros/latex-dev/base/ltnews28.pdf Binary files differindex 92b00f2885..d1f7332f07 100644 --- a/macros/latex-dev/base/ltnews28.pdf +++ b/macros/latex-dev/base/ltnews28.pdf diff --git a/macros/latex-dev/base/ltnews29.pdf b/macros/latex-dev/base/ltnews29.pdf Binary files differindex 8a09f387e8..a320b2e899 100644 --- a/macros/latex-dev/base/ltnews29.pdf +++ b/macros/latex-dev/base/ltnews29.pdf diff --git a/macros/latex-dev/base/ltnews30.pdf b/macros/latex-dev/base/ltnews30.pdf Binary files differindex 706fa88cba..a7765966ab 100644 --- a/macros/latex-dev/base/ltnews30.pdf +++ b/macros/latex-dev/base/ltnews30.pdf diff --git a/macros/latex-dev/base/ltnews31.pdf b/macros/latex-dev/base/ltnews31.pdf Binary files differindex 0a89ed7361..dd27b7e52b 100644 --- a/macros/latex-dev/base/ltnews31.pdf +++ b/macros/latex-dev/base/ltnews31.pdf diff --git a/macros/latex-dev/base/ltnews32.pdf b/macros/latex-dev/base/ltnews32.pdf Binary files differindex 63e78248ae..a585387999 100644 --- a/macros/latex-dev/base/ltnews32.pdf +++ b/macros/latex-dev/base/ltnews32.pdf diff --git a/macros/latex-dev/base/ltnews33.pdf b/macros/latex-dev/base/ltnews33.pdf Binary files differindex e7b2c447cb..ff8b3685b7 100644 --- a/macros/latex-dev/base/ltnews33.pdf +++ b/macros/latex-dev/base/ltnews33.pdf diff --git a/macros/latex-dev/base/ltnews34.pdf b/macros/latex-dev/base/ltnews34.pdf Binary files differindex c1b7881021..60af644363 100644 --- a/macros/latex-dev/base/ltnews34.pdf +++ b/macros/latex-dev/base/ltnews34.pdf diff --git a/macros/latex-dev/base/ltnews35.pdf b/macros/latex-dev/base/ltnews35.pdf Binary files differindex 487a850ff3..5dfb4fd316 100644 --- a/macros/latex-dev/base/ltnews35.pdf +++ b/macros/latex-dev/base/ltnews35.pdf diff --git a/macros/latex-dev/base/ltnews36.pdf b/macros/latex-dev/base/ltnews36.pdf Binary files differindex 2fe5308173..7cb9f129f8 100644 --- a/macros/latex-dev/base/ltnews36.pdf +++ b/macros/latex-dev/base/ltnews36.pdf diff --git a/macros/latex-dev/base/ltnews37.pdf b/macros/latex-dev/base/ltnews37.pdf Binary files differindex 52f03a43ed..d7e1a7d554 100644 --- a/macros/latex-dev/base/ltnews37.pdf +++ b/macros/latex-dev/base/ltnews37.pdf diff --git a/macros/latex-dev/base/ltnews38.pdf b/macros/latex-dev/base/ltnews38.pdf Binary files differindex 2849e8c898..38985af42d 100644 --- a/macros/latex-dev/base/ltnews38.pdf +++ b/macros/latex-dev/base/ltnews38.pdf diff --git a/macros/latex-dev/base/ltnews39.pdf b/macros/latex-dev/base/ltnews39.pdf Binary files differindex 3fc09b75fb..0101d6d37b 100644 --- a/macros/latex-dev/base/ltnews39.pdf +++ b/macros/latex-dev/base/ltnews39.pdf diff --git a/macros/latex-dev/base/ltnews40.pdf b/macros/latex-dev/base/ltnews40.pdf Binary files differindex eb7d8d5579..f41370e623 100644 --- a/macros/latex-dev/base/ltnews40.pdf +++ b/macros/latex-dev/base/ltnews40.pdf diff --git a/macros/latex-dev/base/ltnews40.tex b/macros/latex-dev/base/ltnews40.tex index a1067731d6..cbb04bcb40 100644 --- a/macros/latex-dev/base/ltnews40.tex +++ b/macros/latex-dev/base/ltnews40.tex @@ -141,7 +141,8 @@ \tubcommand{\input{tubltmac}} \publicationmonth{November} -\publicationyear{2024 --- DRAFT version for upcoming release} +%\publicationyear{2024 --- DRAFT version for upcoming release} +\publicationyear{2024} \publicationissue{40} @@ -155,147 +156,320 @@ \medskip -\section{Introduction} -\emph{to write \ldots\ 30th aniversary of \LaTeXe{} this year btw} +\section{Thirty years of \LaTeXe{}} + +In summer 1994, i.e., thirty years ago, \LaTeXe{} saw its first public +release. Back then it was meant to be an intermediate version (hence +the $\epsilon$) on the way to a major new version (the mythical +\LaTeX3) that we expected to take a couple of more years to reach +maturity. It took much more than that in the end\Dash nominally, +\LaTeXe{} is still with us today. + +However, under the hood, \LaTeXe{} changed a lot throughout these +thirty years, as one can see, for example, when looking through the +forty newsletters~\cite{40:ltnews} that accompanied the \LaTeX{} +releases that happened in the meantime. + +During the first two decades, the \LaTeX{} kernel was kept largely +stable with only minimal bug fix activities. During that period +additional functionality was mostly provided through new or +extended packages that could be loaded in the document preamble. This +included many of the ideas targeted for \LaTeX3{}, e.g., \pkg{expl3} +(\LaTeX3 programming language), \pkg{xparse} (new document command +interface), \pkg{xtemplate} (a configuration mechanism), and many +others. + +Initially, this approach worked well and provided good backward +compatibility; however, over time it became apparent that keeping all +developments confined to packages was more and more problematical. +Features or bug fixes that should have been generally available, i.e., +part of the kernel, were only available in packages, so a lot of +dependencies between packages were introduced and resulted in +convoluted code that was difficult to manage. For example, +\pkg{hyperref} had to rewrite a lot of kernel (and package) macros, so +the code and behavior of other packages had to change depending on +whether or not \pkg{hyperref} was loaded or not. + +Thus, in 2015 the \LaTeX{} team decided to change the policy and +(re)start active kernel development, see~\cite{40:ltnews22}. To ensure +continuous backward compatibility we introduced at the same time the +\pkg{latexrelease} package that enables users to roll back changes to +the \LaTeX{} kernel to an earlier release, in case this is necessary +to successfully rerun a document produced at that time. + +As a consequence of this policy change the last decade saw a larger +number of enhancements and corrections that were made part of the +\LaTeX{} kernel. Overall, we can confidently say that the new +approach has worked well and enabled us to modernize \LaTeX{} and ensure +that it remains relevant without compromising one of the cornerstones +of \LaTeX{}: its outstanding ability to reprocess old documents +written many years ago. + +Being able to update and modernize the kernel sources allowed us to +embark in 2019 on the multi-year \enquote{\LaTeX{} Tagged PDF} project +with the goal of automatically providing accessible PDF documents with +\LaTeX{}. While there are several more project phases to complete, the +milestones already reached allow users to generate PDF/UA compliant +documents if the input is restricted to a (growing) subset of packages +and document classes; see next section and previous newsletters. + + A big change happened with the 2020-02-02 release as part of the project activity, + albeit somewhat obfuscated by us as \enquote{Improved load-times for + \pkg{expl3}}. While technically correct, what it really meant is + that we had finally integrated the programming layer of \LaTeX3, + i.e., the ideas originally sketched out around 1992. Or saying it + differently: with that date the original ideas for \LaTeX3 became a + reality as part of the standard \LaTeX{} kernel. + + With the programming layer available under the hood we were then able to + provide new concepts and extensions as part of \LaTeX{}, + e.g., the hook management system, a new mark mechanism, core + functionality for tagging and PDF resource management, a consistent + key/value interface, and more recently the socket and plug mechanism. + + More will follow while we continue to work on modernizing \LaTeX{} and + bringing the Tagged PDF project to a truly successful completion\Dash so + stay tuned and watch this space for future announcements in the next + newsletters. + + -\section{Switch to T1 as default encoding in documents using \cs{DocumentMetadata}} +\section{News from the \enquote{\LaTeX{} Tagged PDF} project} -As it is well known the font encoding \texttt{OT1} supports only 128 characters and -has various problems and quirks notably for languages different to English. -Nevertheless \texttt{OT1} is the default encoding in \LaTeX{} and this can not be easily -changed without affecting many documents as the \texttt{T1} version of the fonts have slightly different metrics. +\subsection{Engine support:\ An important update} -The introduction of the \cs{DocumentMetadata} command, which announces -\emph{new} code and changes that can also affect the layout gives us now the -opportunity to make this step. So with this version a use of -\cs{DocumentMetadata} with (pdf)\LaTeX{} will setup \texttt{T1} as default -font encoding\footnote{The Unicode engines will continue to use \texttt{TU} -as encoding.}. To ensure that scalable fonts are used, the package -\pkg{cm-super} has to be installed. Users who want to revert to the -\texttt{OT1} encoding in their document can do so with -\verb+\usepackage[OT1]{fontenc}+. +As detailed below, work is progressing on the Tagged PDF +project. There are many drivers for this work, including legal changes +in many places which will increasingly require well-tagged PDFs +including full support for mathematics. As part of the work on this, +we are looking at the technical abilities of the \TeX{} engines. +With \XeTeX{}, it is impossible to reliably produce tagged PDFs due to +engine limitations. The increasing importance of tagged PDFs means +that this requires a move away from \XeTeX{}. We will continue to +address issues with \XeTeX{} support in team-maintained \LaTeX{} code +on a best-effort basis. No \emph{new} functionality will be added for +\XeTeX{} by the \LaTeX{} team. It is likely that over time +functionality may become more restricted, and users are urged to +migrate \XeTeX{} documents to \LuaTeX{}. +For \pdfTeX{}, tagging is available and we are able to support +mathematics by including relevant \TeX{} source or by using +externally-generated MathML. Only \LuaTeX{} is capable of +\emph{automatic} generation of MathML as part of a \LaTeX{} run. Thus +\pdfTeX{} continues to be supported for existing material, but for new +documents, moving to \LuaTeX{} is recommended. -\section{News from the \enquote{\LaTeX{} Tagged PDF} project} +We cannot make statements about the support for other engines such as +(u)p\TeX{}, as we don't use these programs nor have in depth knowledge +of their functionalities. To the best of our knowledge, core \LaTeX{} +works well with these engines, but if and to what extent tagging can +be supported will remain to be seen. If relevant information becomes +available to us we will provide an update in future editions of the +\LaTeX{} newsletter. + + +\subsection{Tagging support for external packages} + +At \url{https://latex3.github.io/tagging-project/tagging-status/} we +show the status of many \LaTeX{} packages and classes with respect to +PDF tagging. We also started to improve tagging support in external +packages. If the \texttt{firstaid} key is used in addition to the +\texttt{phase-III} key basic commands of several packages, including +\pkg{amsthm} and \pkg{fancyvrb}, can now be used. + + +\subsection{Improved table tagging} The tagging of tabulars has been extended: it is now possible to tag -also row headers and to create cells that span more than one row. +row headers and to create cells that span more than one row. + +The interface to this functionality is not finalized but can be +accessed in the current release by specifying the row and columns to +be treated as headers. For example +% +\begin{verbatim} + \tagpdfsetup{ + table/header-rows={1,2}, + table/header-columns={1} } +\end{verbatim} +would specify that in the following tables the first two rows and +first column of each row should be tagged as heading entries. + +Similarly you may add a RowSpan attributes to tag a cell that spans +two rows using: +\begin{verbatim} + \tagpdfsetup{table/multirow={2}} +\end{verbatim} + + +\subsection{Automatic MathML tagging} + +When Lua\LaTeX{} is being used, and the \pkg{luamml} package is +available, and if the document uses the \pkg{unicode-math} package, +then the math module will automatically convert each math formula to +MathML and use it to attach MathML associated files (or MathML +Structure elements) to the tagged PDF. This new feature can be +disabled with \verb+\tagpdfsetup{math/mathml/luamml/load=false}+. More +options to configure MathML tagging can be found in the documentation +of \pkg{latex-lab-math}. + + +\subsection{Change behavior of tagging sockets with two arguments} + +When calling tagging sockets with two arguments using +\cs{UseTaggingSocket} when tagging is suspended, previous versions of +\LaTeXe{} dropped both arguments. This behavior has been changed to +drop the first argument and preserve the second one instead, thereby +allowing tagging sockets to be used to wrap existing content which +should still appear in a non-tagging context. + +Since no tagging sockets currently provided by \LaTeX{} use two +arguments we do not expect this change to affect any existing +documents, but if a custom tagging socket has been defined outside of +the kernel it might need to be adapted to be compatible with the new +behavior. +% +\githubissue{1500} -\emph{write more details ...} -The math module will automatically generate a MathML file and use it to -attach MathML associated files to the structure if lua\LaTeX{} and -the \pkg{unicode-math} package are used and the \pkg{luamml} is found. -This new feature can be disabled with \verb+\tagpdfsetup{math/mathml/luamml=false}+ -More details can be found in the documentation of \pkg{latex-lab-math}. -At \url{https://latex3.github.io/tagging-project/tagging-status/} we show the status of many \LaTeX{} Packages and Classes with respect to PDF tagging. -We also started to improve tagging support in external packages. If the -\texttt{firstaid} key is used in addition to the \texttt{phase-III} key -basic commands of packages like \pkg{amsthm} and \pkg{fancyvrb} can now be used. +\section{Changes to the \LaTeX{} kernel} -\section{Handling paragraph continuation} +\subsection{Handling paragraph continuation} -Already \LaTeX~2.09 offered some automatism to detect whether or not +Already \LaTeX~2.09 offered some automation to detect whether or not text after a list or some other display environment is meant to be a continuation of the current paragraph or should start a new one. The document-level syntax for this is that a blank line after such an -environment signals to \LaTeX{} that it should start a new paragraph; whilst -no blank line signals that there should be no new paragraph and the -text should be considered a continuation. +environment signals to \LaTeX{} that it should start a new paragraph; +whilst no blank line signals that there should be no new paragraph and +the text should be considered a continuation. -Unfortunately, there are a number of cases where the original 2.09 +Unfortunately, there were a number of cases where the original 2.09 approach failed, e.g., with \begin{flushleft} \ttfamily -\{\meta{local customizations}\\ -\cs{begin}\{equation\} a<b \cs{end}\{equation\}\} \\ -\meta{some text} +\ \ \{\meta{local customizations}\\ +\ \ \cs{begin}\{equation\} a<b \cs{end}\{equation\}\} \\ +\ \ \meta{some text} \end{flushleft} the \meta{some text} incorrectly started a new paragraph. Bug reports about this behavior can be traced back to the time \LaTeXe{} was developed, e.g., one test file from 1992 has a note that the above -case was unfortunately not resolvable despite some improvements made back -then. The main cause of the issue (as you probably guessed) is that -the mechanism failed whenever the environment was executed within a -group (\texttt{\{...\}}, \cs{begingroup}/\cs{endgroup}, or +case was unfortunately not resolvable despite some improvements made +back then. The main cause of the issue (as you probably guessed) is +that the mechanism failed whenever the environment was executed within +a group (\texttt{\{...\}}, \cs{begingroup}/\cs{endgroup}, or \cs{bgroup}/\cs{egroup} pair) that was closed before the next blank line was reached. -While most of the time this could be visually corrected by adding some +While most of the time this could be visually corrected by adding some explicit \cs{noindent}, the situation got worse when we tried to implement tagged PDFs resulting in incorrect structures or worse. We therefore made a new attempt to resolve this problem in every -situation and this new solution is rolled out in the current -release. +situation and this new solution is rolled out in the current release. -\section{New or improved commands} - \subsection{Avoid bogus \enquote{no item} error} The commands \cs{addvspace} and \cs{addpenalty} generated the famous -error message \enquote{Something's wrong--perhaps a missing \cs{item}} -when they were encountered outside vertical mode. Most of the time this -error was bogus and if not, then it was generated several times rather -than once. +error message \enquote{Something's wrong---perhaps a missing \cs{item}} +when they were encountered outside vertical mode. Most of the time +this error was bogus and if not, then it was generated several times +rather than once. Once upon a time (in \LaTeX{}~2.09) it was necessary that these commands were used only in vertical mode, but with \LaTeXe{} in 1994, we changed the internals but simply overlooked that this error message -then had become useless. In this release, i.e.,~30 years too late, we have -finally lifted the ban and from now on this error should only show -up if there is indeed a missing \cs{item}. +then had become useless. In this release, i.e.,~30 years too late, we +have finally lifted the ban and from now on this error should only +show up if there is indeed a missing \cs{item}. % \githubissue{1460} +\subsection[Switch to T1 as default encoding in documents + using \cs{DocumentMetadata}] + {Switch to T1 as default encoding in documents\\\mbox\qquad + using \cs{DocumentMetadata}} + +As it is well known, the font encoding \texttt{OT1} supports only 128 +characters and has various problems and quirks notably for languages +different to English. Nevertheless \texttt{OT1} is the default +encoding in \LaTeX{} and this cannot be easily changed without +affecting many documents as the \texttt{T1} version of the fonts have +slightly different metrics. + +The introduction of the \cs{DocumentMetadata} command, which announces +\emph{new} code and changes that can also affect the layout gives us +now the opportunity to make this step. So with this version a use of +\cs{DocumentMetadata} with (pdf)\LaTeX{} will setup \texttt{T1} as +default font encoding.\footnote{The Unicode engines will continue to +use \texttt{TU} as the encoding.} To ensure that scalable fonts are used, +the package \pkg{cm-super} has to be installed. Users who want to +revert to the \texttt{OT1} encoding in their document can do so with +\verb+\usepackage[OT1]{fontenc}+. + + + + \section{Code improvements} -\subsection{Avoiding keyval option clashes between classes and packages} - -In \LaTeX{} News~35~\cite{40:ltnews35} we introduced keyval option processing -to the kernel. Following the standard for \LaTeXe{} options, keyval options -given to the \cs{documentclass} line were treated as global and so parsed by -every package. However, with keyvals, the likelihood of a name clash between a -class-specific option and one used by a package is much higher than it is with -simple strings. We have therefore refined the mechanism in the current release. - -When a class uses the kernel keyval processor, any options it recognises are -recorded and any packages using the keyval processor will then \emph{skip} -these \enquote{global} options. To allow for the case where a class directly -uses an option which should be global (for example \texttt{draft}), a new key -property \texttt{.pass-to-packages} has been added. This can then be set to -indicate that this key is not to be skipped. For example +\subsection[Avoiding key--value option clashes between classes and packages] + {Avoiding key--value option clashes between classes\\\mbox\qquad and packages} + +In \LaTeX{} News~35~\cite{40:ltnews35} we introduced key--value option +processing to the kernel. Following the standard for \LaTeXe{} +options, keyval options given to the \cs{documentclass} line were +treated as global and so parsed by every package. However, with +keyvals, the likelihood of a name clash between a class-specific +option and one used by a package is much higher than it is with simple +strings. We have therefore refined the mechanism in the current +release. + +When a class uses the kernel keyval processor, any options it +recognizes are recorded and any packages using the keyval processor +will then \emph{skip} these \enquote{global} options. To allow for the +case where a class directly uses an option which should be global (for +example \texttt{draft}), a new key property \texttt{.pass-to-packages} +has been added. This can then be set to indicate that this key is not +to be skipped. For example \begin{verbatim} -\DeclareKeys{ - draft .if = {ifl@cls@draft}, - draft .pass-to-packages = true, - mode .store = \cls@mode -} + \DeclareKeys{ + draft .if = {ifl@cls@draft}, + draft .pass-to-packages = true, + mode .store = \cls@mode + } \end{verbatim} -in a class would create two options, \texttt{draft} and \texttt{mode}. The -\texttt{draft} option will be treated in the normal way by packages using -keyvals, but they will ignore the \texttt{mode} option: it is effectively -marked as \enquote{private} to the class. +in a class would create two options, \texttt{draft} and +\texttt{mode}. The \texttt{draft} option will be treated in the normal +way by packages using keyvals, but they will ignore the \texttt{mode} +option: it is effectively marked as \enquote{private} to the class. % \githubissue{1279} +\subsection{Improvement to \textup{\XeTeX}\ \cs{showhyphens}} + +When using \cs{showhyphens} with \XeTeX, missing character warnings +would be generated for any character not in Latin Modern. This has +been corrected and the warnings are suppressed. +% +\githubissue{1380} \subsection{Improved error raised by empty hook} -When using the hook management, both hook and label names (if specified) -should be non-empty. Before empty hook and empty label both raised the -same label-specific error. +When using the hook management, both hook and label names (if +specified) should be non-empty. Before, empty hook and empty label names both +raised the same label-specific error: \begin{verbatim} ! LaTeX hooks Error: Empty code label on line .... Using 'top-level' instead. \end{verbatim} -This has now been improved. Now empty hook raises +This has now been improved. Now an empty hook raises \begin{verbatim} ! LaTeX hooks Error: Empty hook on line .... \end{verbatim} @@ -304,24 +478,25 @@ This has now been improved. Now empty hook raises \subsection{Provide counter representations for link targets} -To create unique target names for links the package -\pkg{hyperref} uses a special counter representation -\verb+\theH+\meta{counter}. To ensure that this -counter representation exists, \pkg{hyperref} redefined the -commands \verb+\@definecounter+, \verb+\@addtoreset+ -and \verb+\refstepcounter+. This counter representation is also -needed for the Tagged PDF project and and so these augmented command definitions -have now been incorporated -into the kernel. -Thus from now on every \verb+\newcounter{+\meta{counter}\verb+}+ will not -only define \verb+\the+\meta{counter} but also \verb+\theH+\meta{counter}. +To create unique target names for links the package \pkg{hyperref} +uses a special counter representation \verb+\theH+\meta{counter}. To +ensure that this counter representation exists, \pkg{hyperref} +redefined the commands \verb+\@definecounter+, \verb+\@addtoreset+ and +\verb+\refstepcounter+. This counter representation is also needed for +the Tagged PDF project and so these augmented command definitions +have now been incorporated into the kernel. Thus from now on every +\verb+\newcounter{+\meta{counter}\verb+}+ will not only define +\verb+\the+\meta{counter} but also \verb+\theH+\meta{counter}. \subsection{Extending \cs{refstepcounter}} -The package \pkg{hyperref} redefines since many years \verb+\refstepcounter+ and -adds code that creates link targets. The kernel definition has now been extended -with socket interfaces that will allow \pkg{hyperref} to avoid the redefinitions. The new interfaces are also used by the Tagged PDF code that needs target names to resolve -references between structures. +For many years, the package \pkg{hyperref} had been redefining +\verb+\refstepcounter+ and adding code that creates link targets. The +kernel definition has now been extended with socket interfaces that +will allow \pkg{hyperref} to avoid the redefinitions. The new +interfaces are also used by the Tagged PDF code that needs target +names to resolve references between structures. + \section{Bug fixes} @@ -340,48 +515,51 @@ LaTeX Warning: Suspicious rollback/min-date \end{verbatim} In some cases this message showed a wrong file type, i.e., -\verb|document class '<pkgname>'| or \verb|package '<clsname>'|. -This has now been corrected. +\verb|document class '<pkgname>'| or \verb|package '<clsname>'|. This +has now been corrected. % \githubissue{870} \subsection*{Fix existence check of document environments} -\cs{NewDocumentEnvironment} and friends define (or redefine) a document -environment using the space-trimmed \meta{envname}, but the existence -check for \meta{envname} was done without space trimming. Thus when the -user-specified \meta{envname} consists of leading and/or trailing -space(s), it may lead to erroneously silent environment declaration. -For example, in -\begin{verbatim} - \NewDocumentEnvironment{myenv}{}{begin}{end} - \NewDocumentEnvironment{ myenv }{}{begin}{end} -\end{verbatim} + +\cs{NewDocumentEnvironment} and friends define (or redefine) a +document environment using the space-trimmed \meta{envname}, but the +existence check for \meta{envname} was done without space +trimming. Thus when the user-specified \meta{envname} consists of +leading and/or trailing space(s), it may lead to erroneously silent +environment declaration. For example, in +\begin{flushleft} +\ttfamily +\ \ \verb=\NewDocumentEnvironment{myenv}{}{begin}{end}=\\ +\ \ \verb*=\NewDocumentEnvironment{ myenv }{}{begin}{end}=\kern-1cm +\end{flushleft} the first line defines a new environment \env{myenv} but the second -line would check existence for \env{ myenv } (which is not yet defined), -then redefine \env{myenv} environment without raising any errors. -This has now been corrected. +line would check existence for \verb*| myenv | (which is not yet +defined), then redefine \env{myenv} environment without raising any +errors. This has now been corrected. % \githubissue{1399} \subsection{Handling of global keys with spaces} If the global (class) options contained spaces around key names, -\cs{ProcessKeyOptions} would fail to remove known keys from the -list of unused global options and \cs{OptionNotUsed} would mistakenly -add space-surrounded key names to that list. -These has been corrected as a hotfix in patch level 1 of the November 2023 -release (but unfortunately not mentioned in~\cite{40:ltnews38}) and -the current release, respectively. +\cs{ProcessKeyOptions} would fail to remove known keys from the list +of unused global options and \cs{OptionNotUsed} would mistakenly add +space-surrounded key names to that list. The first issue was corrected as +a hotfix in patch level 1 of the November 2023 release (but +unfortunately not mentioned in~\cite{40:ltnews38}) and the second in the current +release. % \githubissue{1238} \subsection{File list entries for rolled back packages/classes} -When the rollback mechanism for packages and classes was introduced -in 2018~\cite{40:ltnews28}, loading of the selected historic release -was not recorded in the file list used by \cs{listfiles}. -This has now been corrected so that the extended usage~\cite{40:ltnews39} + +When the rollback mechanism for packages and classes was introduced in +2018~\cite{40:ltnews28}, loading of the selected historic release was +not recorded in the file list used by \cs{listfiles}. This has now +been corrected so that the extended usage~\cite{40:ltnews39} \begin{verbatim} -\listfiles[hashes,sizes] + \listfiles[hashes,sizes] \end{verbatim} now gives more complete and less confusing info. % @@ -389,56 +567,61 @@ now gives more complete and less confusing info. \subsection{\pkg{doc}:\ \cs{PrintDescribeMacro} in preamble} -In \pkg{doc} version 2 it was possible alter the definition of +In \pkg{doc} version 2 it was possible to alter the definition of \cs{PrintDescribeMacro} and similar commands in preamble. In version 3 -this stopped working because they go reset at the end of the +this stopped working because they were reset at the end of the preamble. This has now been implemented differently and changes in the preamble are possible again. % \githubissue{1000} -\section{Improvement to \XeTeX\ \cs{showhyphens}} -When using \cs{showhyphens} with \XeTeX, missing character warnings -would be generated for any character not in Latin Modern. This has been -corrected and the warnings are suppressed. -% -\githubissue{1380} +\subsection{Avoid low-level error if \cs{ShowHooks} is used late} +If \cs{ShowHooks} was used to examine a package hook after the +package was loaded, a low level error resulted. This has now been +corrected. +% +\githubissue{1513} -\section{Avoid code duplication in rollback} +\subsection{Avoid code duplication in rollback} -When the kernel uses \cs{AddToHook} in a region that might be -rolled back (which happens in a few places) and a document requests a -rollback, then we have the situation that the hook already contains code to which we added the same -(or slightly different) code during the -rollback; this results in code duplication or, worse, in errors. This has -now been corrected by dropping any such code chunk (if there is one) prior to -adding the rollback code. +When the kernel uses \cs{AddToHook} in a region that might be rolled +back (which happens in a few places) and a document requests a +rollback, then we have the situation that the hook already contains +code to which we added the same (or slightly different) code during +the rollback; this results in code duplication or, worse, in +errors. This has now been corrected by dropping any such code chunk +(if there is one) prior to adding the rollback code. % \githubissue{1407} -\section{Passing template keys using \cs{KeyValue}} -With the move of the template code to the kernel, some internal efficiencies -were also made. However, there was an oversight in how passing key values from -one setting to another was implemented, meaning that using \cs{KeyValue} could -result in an infinite loop. This has now been fixed. +\subsection{Passing template keys using \cs{KeyValue}} + +With the move of the template code to the kernel, internal +functions were reviewed to improve efficiency. However, there +was an oversight in how +passing key values from one setting to another was implemented, +such that using \cs{KeyValue} could result in an infinite +loop. This has now been fixed. % \githubissue{1486} + + \section{Changes to packages in the \pkg{amsmath} category} -\section{Extend support for \cs{dots}} +\subsection{Extend support for \cs{dots}} The implementation of \cs{dots} in \pkg{amsmath} has the feature that it selects different dots depending on the symbol that follows: e.g., dots between commas would normally be on the baseline, while dots -between binary or relational symols would be raised. However, when symbols such -as \cs{cong} were protected from expansion in moving arguments (so -that they worked in places such as headings) it had the unfortunate -side-effect that the \cs{dots} magic stopped working for them. This -has now been corrected. +between binary or relational symbols would be raised. However, when +symbols such as \cs{cong} were protected from expansion in moving +arguments (so that they worked in places such as headings) it had the +unfortunate side-effect that the \cs{dots} magic stopped working for +them. This has now been corrected. % \githubissue{1265} @@ -450,15 +633,29 @@ has now been corrected. \subsection{Modification to generation of the \file{.tex} from \pkg{fileerr}} -The \pkg{fileerr} extraction has been modified to write \texttt{rename-to-empty-base.tex} -rather than \texttt{.tex} to comply with an expected security change in texlive 2025. -\texttt{build.lua} has been modified to rename \texttt{rename-to-empty-base.tex} to \texttt{.tex} -after unpacking. However if using \textsf{docstrip} directly rather than using \textsf{l3build} -or the unpacked zip file from \CTAN{}, the user must now rename the file and install as \texttt{.tex}. +The \pkg{fileerr} extraction has been modified to write +\texttt{rename-to-empty-base.tex} rather than \texttt{.tex} to comply +with an expected security change in \TeX{}~Live 2025. The +\texttt{build.lua} file for the \pkg{tools} has been modified to +rename \texttt{rename-to-empty-base.tex} to \texttt{.tex} after +unpacking. However if using \textsf{docstrip} directly rather than +using \textsf{l3build} or the unpacked zip file from \CTAN{}, the user +must now rename the file and install as \texttt{.tex}. % \githubissue{1412} -\subsection{\pkg{array}: Tagging support for \cs{cline}} + +\subsection{\pkg{array}:\ Improve \texttt{>\{...\}} specifier} + +If the argument of \texttt{>\{...\}} ended with a command accepting a +trailing optional argument, e.g., defined for example with +\verb=\NewDocumentCommand\foo{o}{...}=, one could get low-level +parsing errors. This has now been corrected. +% +\githubissue{1468} + + +\subsection{\pkg{array}:\ Tagging support for \cs{cline}} In the last release we added tagging support for \pkg{array}, \pkg{longtable} and other tabular packages, but we overlooked that the @@ -468,40 +665,55 @@ artifact. Furthermore, the processing of a \cs{cline} looks to the algorithm as if another row is added (which is technically what happens), thus it was also necessary to decrement the internal row counter to get a correct row count. This has now been corrected in -\pkg{array} which is automatically loaded for tagging, so that all +\pkg{array}, which is automatically loaded for tagging, so that all these packages are now fully compatible with the tagging code if it is turned on. % \taggingissue{134} -\subsection{\pkg{longtable}: Extend caption type} -The \pkg{longtable} has been extended and now provides the command \cs{LTcaptype} -(stemming from the \pkg{ltcaption} package) to change -the counter and caption type used by the \cs{caption} command from longtable. -So with \verb+\renewcommand\LTcaptype{figure}+, a longtable will step the -figure counter instead of the table counter and produce an -entry in the list of figures. An empty definition, \verb+\renewcommand\LTcaptype{}+, -will suppress increasing of the counter. This makes it easy to define an -unnumbered variant of longtable: +\subsection{\pkg{longtable}:\ Extend caption type} + +The \pkg{longtable} package has been extended and now provides the command +\cs{LTcaptype} (stemming from the \pkg{ltcaption} package) to change +the counter and caption type used by the \cs{caption} command from +longtable. So with \verb+\renewcommand\LTcaptype{figure}+, a +longtable will step the figure counter instead of the table counter +and produce an entry in the list of figures. An empty definition, +\verb+\renewcommand\LTcaptype{}+, will suppress increasing of the +counter. This makes it easy to define an unnumbered variant of +longtable: \begin{verbatim} -\newenvironment{longtable*} - {\renewcommand\LTcaptype{}\longtable} - {\endlongtable} + \newenvironment{longtable*} + {\renewcommand\LTcaptype{}\longtable} + {\endlongtable} \end{verbatim} +\subsection{\pkg{longtable}:\ Prevent \cs{pagegoal} exceeding maximum value} -\subsection{\pkg{array}: Improve \texttt{>\{...\}} specifier} - -If the argument of \texttt{>\{...\}} ended with a command accepting a -trailing optional argument, e.g., defined for example with -\verb=\NewDocumentCommand\foo{o}{...}=, one could get low-level -parsing errors. This has now been corrected. +An internal guard has been added to avoid \TeX\ errors if +\verb=\pagegoal= is increased beyond the maximum value for a +\TeX\ dimension. % -\githubissue{1468} +\githubissue{1495} + +\section{Changes to \pkg{l3build}} + +To support third-party developers testing their code against pre-release +\LaTeX{}, a new switch \verb|--dev| has been added to \pkg{l3build}. +This allows the developer to run +\begin{verbatim} + l3build check +\end{verbatim} +to run their test suite against the current release of \LaTeX{} and +\begin{verbatim} + l3build check --dev +\end{verbatim} +to run exactly the same tests using the development release of +\LaTeX{}. %\section{Changes to files in the \pkg{cyrillic} category} @@ -518,9 +730,13 @@ Leslie Lamport. \newblock Reprinted with corrections in 1996. \bibitem{40:ltnews} \LaTeX{} Project Team. - \emph{\LaTeXe{} news 1--39}. June, 2024. + \emph{\LaTeXe{} news 1--39}. June 2024. \url{https://latex-project.org/news/latex2e-news/ltnews.pdf} +\bibitem{40:ltnews22} \LaTeX{} Project Team. + \emph{\LaTeXe{} news 22}. January 2015. + \url{https://latex-project.org/news/latex2e-news/ltnews22.pdf} + \bibitem{40:ltnews28} \LaTeX{} Project Team. \emph{\LaTeXe{} news 28}. April 2018. \url{https://latex-project.org/news/latex2e-news/ltnews28.pdf} diff --git a/macros/latex-dev/base/ltnews41.pdf b/macros/latex-dev/base/ltnews41.pdf Binary files differnew file mode 100644 index 0000000000..aa6c674964 --- /dev/null +++ b/macros/latex-dev/base/ltnews41.pdf diff --git a/macros/latex-dev/base/ltnews41.tex b/macros/latex-dev/base/ltnews41.tex new file mode 100644 index 0000000000..0c9751704a --- /dev/null +++ b/macros/latex-dev/base/ltnews41.tex @@ -0,0 +1,190 @@ +% \iffalse meta-comment +% +% Copyright 2024 +% The LaTeX Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% -—————————————— +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2008 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews41.tex +% +% This is issue 41 of LaTeX News. + +\NeedsTeXFormat{LaTeX2e}[2020-02-02] + +\documentclass{ltnews} + +%% Maybe needed only for Chris' inadequate system: +\providecommand\Dash {\unskip \textemdash} + +%% NOTE: Chris' preferred hyphens! +%% \showhyphens{parameters} +%% \hyphenation{because} + +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\usepackage{csquotes} +\usepackage{multicol} +\usepackage{color} + +\providecommand\hook[1]{\texttt{#1}} + +\providecommand\meta[1]{$\langle$\textrm{\itshape#1}$\rangle$} +\providecommand\option[1]{\texttt{#1}} +\providecommand\env[1]{\texttt{#1}} +\providecommand\Arg[1]{\texttt\{\meta{#1}\texttt\}} + + +\providecommand\eTeX{\hologo{eTeX}} +\providecommand\XeTeX{\hologo{XeTeX}} +\providecommand\LuaTeX{\hologo{LuaTeX}} +\providecommand\pdfTeX{\hologo{pdfTeX}} +\providecommand\MiKTeX{\hologo{MiKTeX}} +\providecommand\CTAN{\textsc{ctan}} +\providecommand\TL{\TeX\,Live} + + +\providecommand\githubissue[2][]{\ifhmode\unskip\fi + \quad\penalty500\strut\nobreak\hfill + \mbox{\small\slshape(% + \href{https://github.com/latex3/latex2e/issues/\getfirstgithubissue#2 \relax}% + {github issue#1 #2}% + )}% + \par\smallskip} +%% But Chris has to mostly disable \href for his TEXPAD app: +%% \def\href #1#2{#2} % Only For Chris' deficient TeX engine + +% simple solution right now (just link to the first issue if there are more) +\def\getfirstgithubissue#1 #2\relax{#1} + +\providecommand\sxissue[1]{\ifhmode\unskip + \else + % githubissue preceding + \vskip-\smallskipamount + \vskip-\parskip + \fi + \quad\penalty500\strut\nobreak\hfill + \mbox{\small\slshape(\url{https://tex.stackexchange.com/#1})}\par} + +\providecommand\gnatsissue[2]{\ifhmode\unskip\fi + \quad\penalty500\strut\nobreak\hfill + \mbox{\small\slshape(% + \href{https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=#1\%2F\getfirstgithubissue#2 \relax}% + {gnats issue #1/#2}% + )}% + \par} + +\let\cls\pkg +\providecommand\env[1]{\texttt{#1}} +\providecommand\acro[1]{\textsc{#1}} + +\vbadness=1400 % accept slightly empty columns + + +\let\finalpagebreak\pagebreak % for TUB (if they use it) +\let\finalvspace\vspace % for document layout fixes + +\makeatletter +% maybe not the greatest design but normally we wouldn't have subsubsections +\renewcommand{\subsubsection}{% + \@startsection {subsubsection}{2}{0pt}{1.5ex \@plus 1ex \@minus .2ex}% + {-1em}{\@subheadingfont\colonize}% +} +\providecommand\colonize[1]{#1:} +\makeatother + + +% Undo ltnews's \verbatim@font with active < and > +\makeatletter +\def\verbatim@font{\normalsize\ttfamily} +\makeatother + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\providecommand\tubcommand[1]{} +\tubcommand{\input{tubltmac}} + +\publicationmonth{June} +\publicationyear{2025 --- DRAFT version for upcoming release} + +\publicationissue{41} + +\begin{document} + +\maketitle +{\hyphenpenalty=10000 \exhyphenpenalty=10000 \spaceskip=3.33pt \hbadness=10000 +\tableofcontents} + +\setlength\rightskip{0pt plus 3em} + +\medskip + +\section{Introduction} + +% To write + +\section{New or improved commands} + +\section{Code improvements} + +\section{Bug fixes} + +%\subsection{A fix} + +%% Some text +% +%%\githubissue{XXXX} + +%\section{Changes to packages in the \pkg{amsmath} category} + +%\section{Changes to packages in the \pkg{graphics} category} + +%\section{Changes to packages in the \pkg{tools} category} + +%\section{Changes to files in the \pkg{cyrillic} category} + +\begin{thebibliography}{9}\frenchspacing + +%\fontsize{9.3}{11.3}\selectfont + +\bibitem{41:Lamport} +Leslie Lamport. +\newblock \emph{{\LaTeX}: {A} Document Preparation System: User's Guide and Reference + Manual}. +\newblock \mbox{Addison}-Wesley, Reading, MA, USA, 2nd edition, 1994. +\newblock ISBN 0-201-52983-1. +\newblock Reprinted with corrections in 1996. + +\bibitem{41:ltnews} \LaTeX{} Project Team. + \emph{\LaTeXe{} news 1--39}. June, 2024. + \url{https://latex-project.org/news/latex2e-news/ltnews.pdf} + +\bibitem{41:ltnews40} \LaTeX{} Project Team. + \emph{\LaTeXe{} news 40}. November 2024. + \url{https://latex-project.org/news/latex2e-news/ltnews40.pdf} + +\end{thebibliography} + +\end{document} diff --git a/macros/latex-dev/base/ltpara-code.pdf b/macros/latex-dev/base/ltpara-code.pdf Binary files differindex 538b23b3ac..9fd9d61978 100644 --- a/macros/latex-dev/base/ltpara-code.pdf +++ b/macros/latex-dev/base/ltpara-code.pdf diff --git a/macros/latex-dev/base/ltpara-doc.pdf b/macros/latex-dev/base/ltpara-doc.pdf Binary files differindex 9a28b40b5b..2400146a3d 100644 --- a/macros/latex-dev/base/ltpara-doc.pdf +++ b/macros/latex-dev/base/ltpara-doc.pdf diff --git a/macros/latex-dev/base/ltproperties-code.pdf b/macros/latex-dev/base/ltproperties-code.pdf Binary files differindex 88e4b154b1..6ef1abd4fb 100644 --- a/macros/latex-dev/base/ltproperties-code.pdf +++ b/macros/latex-dev/base/ltproperties-code.pdf diff --git a/macros/latex-dev/base/ltproperties-doc.pdf b/macros/latex-dev/base/ltproperties-doc.pdf Binary files differindex 9075c499b8..7411dda4c3 100644 --- a/macros/latex-dev/base/ltproperties-doc.pdf +++ b/macros/latex-dev/base/ltproperties-doc.pdf diff --git a/macros/latex-dev/base/ltproperties.dtx b/macros/latex-dev/base/ltproperties.dtx index 23a38c43af..77d36a43a9 100644 --- a/macros/latex-dev/base/ltproperties.dtx +++ b/macros/latex-dev/base/ltproperties.dtx @@ -30,7 +30,7 @@ %<*driver> % \fi \ProvidesFile{ltproperties.dtx} - [2024/09/25 v1.0g LaTeX Kernel (Properties)] + [2024/10/21 v1.0h LaTeX Kernel (Properties)] % \iffalse % \documentclass[full]{l3doc} @@ -363,7 +363,7 @@ % has been set with the standard \cs{label} command. % \end{function} % -% \begin{function}{\IfPropertyRecordedTF} +% \begin{function}{\IfPropertyRecordedTF,\IfPropertyRecordedT,\IfPropertyRecordedF} % \begin{syntax} % \cs{IfPropertyRecordedTF} \Arg{label} \Arg{property} \Arg{true code} \Arg{false code} % \end{syntax} @@ -805,9 +805,12 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\IfPropertyRecordedTF} +% \begin{macro}{\IfPropertyRecordedTF,\IfPropertyRecordedT,\IfPropertyRecordedF} +% \changes{v1.0h}{2024-10-21}{Define \cs{IfPropertyRecordedT}, \cs{IfPropertyRecordedF}} % \begin{macrocode} -\cs_new_eq:NN \IfPropertyRecordedTF \property_if_recorded:eeTF +\cs_new_eq:NN \IfPropertyRecordedTF \property_if_recorded:eeTF +\cs_new:Npn \IfPropertyRecordedT #1#2#3 { \property_if_recorded:eeTF {#1}{#2}{#3}{} } +\cs_new:Npn \IfPropertyRecordedF #1#2#3 { \property_if_recorded:eeTF {#1}{#2}{}{#3} } % \end{macrocode} % \end{macro} % diff --git a/macros/latex-dev/base/ltshipout-code.pdf b/macros/latex-dev/base/ltshipout-code.pdf Binary files differindex 8800cc981a..ed0017f6a5 100644 --- a/macros/latex-dev/base/ltshipout-code.pdf +++ b/macros/latex-dev/base/ltshipout-code.pdf diff --git a/macros/latex-dev/base/ltshipout-doc.pdf b/macros/latex-dev/base/ltshipout-doc.pdf Binary files differindex 8b6ba93c8a..3f179f3f17 100644 --- a/macros/latex-dev/base/ltshipout-doc.pdf +++ b/macros/latex-dev/base/ltshipout-doc.pdf diff --git a/macros/latex-dev/base/ltshipout.dtx b/macros/latex-dev/base/ltshipout.dtx index 0c9113ce93..c2e70ba6d5 100644 --- a/macros/latex-dev/base/ltshipout.dtx +++ b/macros/latex-dev/base/ltshipout.dtx @@ -34,7 +34,7 @@ %<*driver> % \fi \ProvidesFile{ltshipout.dtx} - [2024/02/11 v1.0n LaTeX Kernel (Shipout)] + [2024/10/22 v1.0n LaTeX Kernel (Shipout)] % \iffalse % \documentclass{l3doc} @@ -469,7 +469,7 @@ % % \begin{variable}{\PreviousTotalPages} % \begin{syntax} -% \cs{thetotalpages}/\cs{PreviousTotalPages} +% \cs{PreviousTotalPages} % \end{syntax} % Command that expands to the number of total pages from the % previous run. If there was no previous run or if used in the diff --git a/macros/latex-dev/base/ltsockets-code.pdf b/macros/latex-dev/base/ltsockets-code.pdf Binary files differindex 017fcd6d1e..db17620914 100644 --- a/macros/latex-dev/base/ltsockets-code.pdf +++ b/macros/latex-dev/base/ltsockets-code.pdf diff --git a/macros/latex-dev/base/ltsockets-doc.pdf b/macros/latex-dev/base/ltsockets-doc.pdf Binary files differindex 37df65d4d7..0328fa8758 100644 --- a/macros/latex-dev/base/ltsockets-doc.pdf +++ b/macros/latex-dev/base/ltsockets-doc.pdf diff --git a/macros/latex-dev/base/ltsockets.dtx b/macros/latex-dev/base/ltsockets.dtx index c77c74b57f..a977f8f6aa 100644 --- a/macros/latex-dev/base/ltsockets.dtx +++ b/macros/latex-dev/base/ltsockets.dtx @@ -33,7 +33,7 @@ %<*driver> % \fi \ProvidesFile{ltsockets.dtx} - [2024/06/29 v0.9a LaTeX Kernel (Sockets)] + [2024/10/27 v0.9b LaTeX Kernel (Sockets)] % \iffalse % \documentclass{l3doc} @@ -371,7 +371,7 @@ % number of inputs = 2 % available plugs = noop, plug-A, plug-B % current plug = plug-B -% definition = \protected\long macro:#1#2->\begin {quote}\sffamily +% definition = \long macro:#1#2->\begin {quote}\sffamily % foo-B: #2\textsuperscript {2}\end {quote} % \end{verbatim} % \LogSocket{foo} @@ -617,6 +617,22 @@ % \end{function} % % +% \begin{function}[EXP]{\socket_use_expandable:nw,\socket_use_expandable:n} +% \begin{syntax} +% \cs{socket_use_expandable:n} \Arg{socket-name} +% \end{syntax} +% Fully expandable variant of \cs{socket_use:n}. This can be used in macro code +% to retrieve code from sockets which need to appear in an expandable context. +% +% This usually requires the plug to only contain expandable code and should therefore +% only be used for sockets which are clearly documented to be used in an expandable context. +% This command does not print any debugging info when \cs{DebugSocketsOn} is active +% and should therefore be avoided whenever possible. +% +% For performance reasons there is no explicit check that the socket was declared! +% \end{function} +% +% % \begin{function}{\ShowSocket,\LogSocket,\socket_show:n,\socket_log:n} % \begin{syntax} % \cs{ShowSocket} \Arg{socket-name} @@ -820,6 +836,7 @@ % % % \begin{macro}{\socket_new_plug:nnn,\socket_set_plug:nnn} +% \changes{v0.9b}{2024/10/27}{Make plug definition non-protected} % % Declaring a code for a socket is just making a definition, taking % the number of arguments from the saved int. @@ -834,7 +851,7 @@ { \cs_generate_from_arg_count:cNnn { @@_#1_plug_#2:w } - \cs_new_protected:Npn + \cs_new:Npn { \int_use:c { c_@@_#1_args_int } } {#3} % \end{macrocode} @@ -862,7 +879,7 @@ { \cs_generate_from_arg_count:cNnn { @@_#1_plug_#2:w } - \cs_set_protected:Npn + \cs_set:Npn { \int_use:c { c_@@_#1_args_int } } {#3} \@@_debug_term:n @@ -942,6 +959,17 @@ % \fmi{Implement?} % \end{macro} % +% \begin{macro}{\socket_use_expandable:nw,\socket_use_expandable:n} +% \changes{v0.9b}{2024/10/27}{Added \cs{socket_use_expandable:n}} +% The same as the non-expandable code, except for the missing debug output. +% \begin{macrocode} +\cs_new:Npn \socket_use_expandable:nw #1 { + \use:c { @@_#1_plug_ \str_use:c { l_@@_#1_plug_str } :w } +} +\cs_new_eq:NN \socket_use_expandable:n \socket_use_expandable:nw % socket with no inputs +% \end{macrocode} +% \end{macro} +% % % % diff --git a/macros/latex-dev/base/lttagging.dtx b/macros/latex-dev/base/lttagging.dtx index 74735a3762..6b68cd0e05 100644 --- a/macros/latex-dev/base/lttagging.dtx +++ b/macros/latex-dev/base/lttagging.dtx @@ -33,7 +33,7 @@ %<*driver> % \fi \ProvidesFile{lttagging.dtx} - [2024/10/11 v1.0j LaTeX Kernel (tagging support)] + [2024/10/21 v1.0k LaTeX Kernel (tagging support)] % \iffalse \documentclass{l3doc} \GetFileInfo{lttagging.dtx} @@ -78,7 +78,7 @@ % \DescribeMacro\tag_suspend:n % \DescribeMacro\tag_resume:n -% +% % The are places in code where it is import top stop any tagging % activities, e.g., when we are doing trial typesetting that it is % done several times. In such a case one must tag only the final @@ -107,46 +107,51 @@ % \DescribeMacro\UseTaggingSocket % \DescribeMacro\tag_socket_use:n % \DescribeMacro\tag_socket_use:nn -% To support tagging in packages we use sockets with names starting -% with \texttt{tagsupport/}. Usually, these sockets have exactly two -% plugs defined: -% \plug{noop} (when no tagging is requested or tagging is not wanted -% for some reason) and a second plug that enables the tagging. There -% may be more, e.g., tagging with special debugging, etc., but right -% now it is usually just on or off. -% -% Given that we sometimes have to suspend tagging, it would be fairly -% inefficient to put different plugs into these sockets whenever that -% happens. We therefore offer \cs{UseTaggingSocket} which is like -% \cs{UseSocket} except that the socket name is specified without -% \texttt{tagsupport/}, i.e., +% \DescribeMacro\tag_socket_use:nnn +% Given that we sometimes have to suspend tagging, it would be fairly +% inefficient to put different plugs into these sockets whenever that +% happens. We therefore offer \cs{UseTaggingSocket} which is like +% \cs{UseSocket} except that is expects a socket starting with +% \texttt{tagsupport/} but the socket name is specified without +% this prefix, i.e., % \begin{quote} % \verb=\UseTaggingSocket{foo}= $\to$ % \verb=\UseSocket{tagsupport/foo}= -% \end{quote} -% Beside being slightly shorter, the big advantage is that this way -% we can change \cs{UseTaggingSocket} to do nothing when tagging is -% suspended with \cs{SuspendTagging} instead of changing the plugs of -% the tagging support sockets back and forth. -% -% This means that with \cs{SuspendTagging} in force all socket -% arguments are ignored (including the case when there is a single -% one), i.e., all sockets used with \cs{UseTaggingSocket} behave as -% if the \text{noop} plug is assigned. -% -% It is possible to use the tagging support sockets with -% \cs{UseSocket} instead of \cs{UseTaggingSocket}, but in this case -% the socket remains active if \cs{SuspendTagging} is in force. There -% may be reasons for doing that, but in general we expect to always -% use \cs{UseTaggingSocket}. -% -% The L3 programming layer versions \cs{tag_socket_use:n} and -% \cs{tag_socket_use:nn} are slightly more efficient than +% \end{quote}. +% +% Beside being slightly shorter, the big advantage is that this way +% we can change \cs{UseTaggingSocket} to do nothing by switching a boolean +% instead of changing the plugs of the tagging support sockets back and forth. +% +% Usually, these sockets have (beside the default plug defined for every socket) +% one additional plug defined and directly assigned. This plug is used when +% tagging is active. +% There may be more plugs, e.g., tagging with special debugging or special behaviour +% depending on the class or PDF version etc., but right now it is usually just on or off. +% +% When tagging is suspended they all have the same predefined behaviour: +% The sockets with zero arguments do nothing. The sockets with one argument +% gobble their argument. The sockets with two arguments +% will drop their first argument and pass the second unchanged. +% +% It is possible to use the tagging support sockets with +% \cs{UseSocket} directly, but in this case the socket remains active +% if \cs{SuspendTagging} is in force. There may be reasons for doing +% that but in general we expect to always use \cs{UseTaggingSocket}. +% +% \DescribeMacro\UseExpandableTaggingSocket +% \DescribeMacro\tag_socket_use_expandable:n +% For special cases like in some \cs{halign} contexts we need a fully expandable +% version of the commend. For these cases, \cs{UseExpandableTaggingSocket} can be +% used. To allow being expandable, it does not output any debugging information +% if \cs{DebugSocketsOn} is in effect and therefore should be avoided whenever possible. +% +% The L3 programming layer versions \cs{tag_socket_use_expandable:n}, +% \cs{tag_socket_use:n}, \cs{tag_socket_use:nn}, and \cs{tag_socket_use:nnn} +% are slightly more efficient than % \cs{UseTaggingSocket} because they do not have to determine how -% many arguments the socket takes when disabling it, so in code that -% is using the L3 programming layer we recommend to use them instead -% of the CamelCase command. -% +% many arguments the socket takes when disabling it. +% % % \MaybeStop{} % @@ -156,12 +161,12 @@ % % % \begin{macro}{\tag_suspend:n,\tag_resume:n,\SuspendTagging,\ResumeTagging} -% +% % In the kernel, these commands get dummy definitions so that % they can be used without harm in packages. The real definition is % used when tagging gets enabled. % \begin{macrocode} -\cs_new_eq:NN \tag_suspend:n \use_none:n +\cs_new_eq:NN \tag_suspend:n \use_none:n \cs_new_eq:NN \tag_resume:n \use_none:n \cs_new_protected:Npn \SuspendTagging #1 { \tag_suspend:n {#1} } \cs_new_protected:Npn \ResumeTagging #1 { \tag_resume:n {#1} } @@ -170,7 +175,10 @@ % % \begin{macro}{\tag_socket_use:n, % \tag_socket_use:nn, +% \tag_socket_use:nnn, +% \tag_socket_use_expandable:n, % \UseTaggingSocket, +% \UseExpandableTaggingSocket, % } % Again this is not the final definition for the kernel; it is just % a version to get going while some parts of the kernel support are @@ -187,19 +195,21 @@ % % Dummy definitions in the kernel. % These definitions will get updated in \pkg{tagpdf}. +% The default in the kernel is just to get rid of the first argument, the second is preserved if present: +% \changes{v1.0k}{2024/10/21}{Changed behavior of two argument tagging sockets when disabled.} +% \changes{v1.0k}{2024/10/21}{Added expandable variants} % \begin{macrocode} +\cs_new:Npn \tag_socket_use_expandable:n #1 { } \cs_new_protected:Npn \tag_socket_use:n #1 { } \cs_new_protected:Npn \tag_socket_use:nn #1#2 { } -% \end{macrocode} -% The default in the kernel is just to get rid of the argument: -% \begin{macrocode} +\cs_new_protected:Npn \tag_socket_use:nnn #1#2#3 { #3 } \cs_new_protected:Npn \UseTaggingSocket #1 { \int_case:nnF { \int_use:c { c__socket_tagsupport/#1_args_int } } { 0 \prg_do_nothing: 1 \use_none:n - 2 \use_none:nn + 2 \use_ii:nn % \end{macrocode} % We do not expect tagging sockets with more than one or two % arguments, so for now we only provide those. @@ -208,15 +218,28 @@ \ERRORusetaggingsocket % that should get a proper error message } % \end{macrocode} +% The same as an expandable command: +% \begin{macrocode} +\cs_new:Npn \UseExpandableTaggingSocket #1 { + \int_case:nnF + { \int_use:c { c__socket_tagsupport/#1_args_int } } + { + 0 \prg_do_nothing: + 1 \use_none:n + 2 \use_ii:nn + } + \ERRORusetaggingsocket % that should get a proper error message +} +% \end{macrocode} % % \end{macro} % % \subsection{Tagging sockets} % This collects tagging sockets that should be generally available -% so that they can also be used even if the tagging code is not loaded. -% +% so that they can also be used even if the tagging code is not loaded. +% % \subsubsection{Tagging support for paragraph setup} -% +% % Paragraphs are tagged through the code in the para/hooks. This code is sometimes % adjusted, e.g. to produce a \enquote{flattened} paragraph or to use a different tag. % Sockets related to such code parts are collected here. @@ -225,22 +248,22 @@ % The block code needs to know if they are nested blockenvs inside % a flattened environment. For this it uses a counter. Inside some contexts, % e.g. at the begin of a minipage or a footnote this counter must be reset. -% We therefore define the counter here so that we can use it in the following -% socket. +% We therefore define the counter here so that we can use it in the following +% socket. % \begin{macrocode} \int_new:N \l__tag_block_flattened_level_int % \end{macrocode} % \end{macro} -% +% % \begin{socketdecl}{tagsupport/para/restore} % This socket restores the para related settings to their default. It % should be used in places where ``normal'' paragraph tagging must be ensured, for example -% at the begin of a footnote. +% at the begin of a footnote. % \begin{macrocode} \NewSocket{tagsupport/para/restore}{0} % \end{macrocode} % \end{socketdecl} -% +% % \begin{plugdecl}{default} % \changes{v1.0i}{2024/10/10}{Restore also paratagging (tagging/723)} % \begin{macrocode} @@ -255,7 +278,7 @@ \AssignSocketPlug{tagsupport/para/restore}{default} % \end{macrocode} % \end{plugdecl} -% +% % \begin{socketdecl}{tagsupport/para/begin,tagsupport/para/end} % These sockets are currently defined in tagpdf. They overwrite % definitions in the latex-lab-block code. There is also a simpler @@ -273,22 +296,22 @@ \NewSocket{tagsupport/recordtarget}{0} % \end{macrocode} % \end{socketdecl} -% +% % \begin{plugdecl}{kernel (tagsupport/recordtarget)} % \begin{macrocode} -% +% \NewSocketPlug{tagsupport/recordtarget}{kernel} { \tl_if_blank:VF \@currentHref { - \prop_gput:Nee - \g__tag_struct_dest_num_prop + \prop_gput:Nee + \g__tag_struct_dest_num_prop {\@currentHref} - {\tag_get:n{struct_num}} + {\tag_get:n{struct_num}} } } -\AssignSocketPlug{tagsupport/recordtarget}{kernel} -\ExplSyntaxOff +\AssignSocketPlug{tagsupport/recordtarget}{kernel} +\ExplSyntaxOff % \end{macrocode} % \end{plugdecl} % \subsubsection{Tagging sockets for toc} @@ -307,28 +330,28 @@ % \begin{socketdecl}{tagsupport/toc/starttoc/before, % tagsupport/toc/starttoc/after} % Tagging sockets for the begin and end of start of \cs{@starttoc}. -% They take one argument, the extension. +% They take one argument, the extension. % \begin{macrocode} \NewSocket{tagsupport/toc/starttoc/before}{1} \NewSocket{tagsupport/toc/starttoc/after}{1} % \end{macrocode} % \end{socketdecl} -% +% % \begin{socketdecl}{tagsupport/toc/leaders/before, % tagsupport/toc/leaders/after} % Tagging sockets to make the dot leaders an artifact. -% They do not take an argument. +% They do not take an argument. % \begin{macrocode} \NewSocket{tagsupport/toc/leaders/before}{0} \NewSocket{tagsupport/toc/leaders/after}{0} % \end{macrocode} % \end{socketdecl} -% +% % \subsubsection{Tagging support for table/tabular packages} % % The code uses a number of sockets to inject the tagging % commands. These can be easily set to a noop-plug in case the -% automated tagging is not wanted. +% automated tagging is not wanted. % % \begin{socketdecl}{tagsupport/tbl/cell/begin, % tagsupport/tbl/cell/end, @@ -463,10 +486,10 @@ % \end{socketdecl} % % \subsubsection{Tagging Support for floats} -% +% % \begin{socketdecl}{tagsupport/float/hmode/begin, % tagsupport/float/hmode/end} -% These sockets are used if the float is called in +% These sockets are used if the float is called in % hmode. % \changes{v1.0h}{2024/09/13}{Sockets for floats added} % \begin{macrocode} @@ -484,38 +507,38 @@ % \end{macrocode} % \end{socketdecl} % -% +% % \begin{socketdecl}{tagsupport/caption/begin, % tagsupport/caption/end} % These sockets are used in \cs{@makecaption}. % They open and close the \texttt{Caption} structure. -% Their default plugs assume that they are used in +% Their default plugs assume that they are used in % vmode. The argument of the begin socket is % the structure number of the parent float. If it is -% empty the current structure number is used. +% empty the current structure number is used. % \begin{macrocode} \NewSocket{tagsupport/caption/begin}{1} \NewSocket{tagsupport/caption/end}{0} % \end{macrocode} % \end{socketdecl} -% +% % \begin{socketdecl}{tagsupport/caption/label/begin, % tagsupport/caption/label/end} % These sockets are used in \cs{@makecaption} around the -% label. Their default plugs ensure that -% the label is outside the paragraph and that +% label. Their default plugs ensure that +% the label is outside the paragraph and that % the rest of the caption uses flattened para mode. If the -% caption is not in a hbox, the \texttt{para/begin} -% socket should follow to properly start the paragraph. +% caption is not in a hbox, the \texttt{para/begin} +% socket should follow to properly start the paragraph. % \begin{macrocode} \NewSocket{tagsupport/caption/label/begin}{0} -\NewSocket{tagsupport/caption/label/end}{0} +\NewSocket{tagsupport/caption/label/end}{0} % \end{macrocode} % \end{socketdecl} -% +% % \section{For lttab.dtx parked here for now} % -% +% % \begin{macrocode} %<@@=tbl> \ExplSyntaxOn @@ -536,7 +559,7 @@ % \g_@@_row_int, % \g_@@_span_tl, % \g_@@_table_cols_tl} -% +% % \cs{g_@@_row_int} holds the current row number in the table. The % value \texttt{0} means we haven't yet processed the table % preamble (or in case of longtable are just in front of the next @@ -606,14 +629,14 @@ % \subsection{Tracing/debugging} % % \begin{macro}{\DebugTablesOn,\DebugTablesOff} -% +% % \begin{macrocode} \def\DebugTablesOn{ \cs_set_eq:NN \@@_trace:n \typeout -} +} \def\DebugTablesOff{ \cs_set_eq:NN \@@_trace:n \use_none:n -} +} % \end{macrocode} % % \begin{macrocode} @@ -663,7 +686,7 @@ % % % \begin{macro}{\l_@@_tmpa_seq} -% +% % \begin{macrocode} \seq_new:N \l_@@_tmpa_seq % \end{macrocode} @@ -672,7 +695,7 @@ % % % \begin{macro}{\tbl_count_missing_cells:n} -% +% % We might have the situation that some table package has not % implemented the \cs{tbl_count_table_cols:} in which case % \cs{g_@@_table_cols_tl} would always be zero and we would get an @@ -708,7 +731,7 @@ % % % \begin{macro}{\tbl_save_outer_table_cols:} -% +% % \begin{macrocode} \cs_new_protected:Npn \tbl_save_outer_table_cols: { \tl_set_eq:NN \l_@@_saved_table_cols_tl \g_@@_table_cols_tl @@ -718,7 +741,7 @@ % % % \begin{macro}{\tbl_init_cell_data_for_table:} -% +% % \begin{macrocode} \cs_new_protected:Npn \tbl_init_cell_data_for_table: { \tl_set:No \l_@@_saved_col_tl {\int_use:N \g_@@_col_int } @@ -832,14 +855,14 @@ % % % \begin{macro}{\tbl_restore_outer_cell_data:} -% +% % \begin{macrocode} \cs_new_protected:Npn \tbl_restore_outer_cell_data: { \int_gset:Nn \g_@@_col_int { \l_@@_saved_col_tl } \int_gset:Nn \g_@@_row_int { \l_@@_saved_row_tl } \tl_gset_eq:NN \g_@@_span_tl \l_@@_saved_span_tl \tl_gset_eq:NN \g_@@_table_cols_tl \l_@@_saved_table_cols_tl - \UseTaggingSocket{tbl/restore/celldata} + \UseTaggingSocket{tbl/restore/celldata} \@@_trace:n { ==>~ restored~cell~data:~ \int_use:N \g_@@_row_int, \int_use:N \g_@@_col_int, @@ -901,7 +924,7 @@ % the macro \cs{tbl_count_missing_cells:n} is executed and % then the row is finished with a final \cs{cr}. % \begin{macrocode} -\cs_new:Npn \tbl_crcr:n #1 { +\cs_new:Npn \tbl_crcr:n #1 { \int_compare:nNnT \g_@@_col_int > 0 { \tbl_count_missing_cells:n {#1} @@ -928,7 +951,7 @@ % \changes{v1.0h}{2024/09/20}{moved \cs{@kernel@refstepcounter} into ltxref} % This is needed for \pkg{longtable} because \cs{refstepcounter} is % setting up a target when \pkg{hyperref} is loaded and we don't -% want that in \pkg{longtable}.%% +% want that in \pkg{longtable}.%% % Prevent longtable patching by hyperref until hyperref does so automatically: % \begin{macrocode} \def\hyper@nopatch@longtable{} diff --git a/macros/latex-dev/base/lttemplates-code.pdf b/macros/latex-dev/base/lttemplates-code.pdf Binary files differindex 2a2ede340d..aa3b6f9c56 100644 --- a/macros/latex-dev/base/lttemplates-code.pdf +++ b/macros/latex-dev/base/lttemplates-code.pdf diff --git a/macros/latex-dev/base/lttemplates-doc.pdf b/macros/latex-dev/base/lttemplates-doc.pdf Binary files differindex b828c74d87..76c00342a5 100644 --- a/macros/latex-dev/base/lttemplates-doc.pdf +++ b/macros/latex-dev/base/lttemplates-doc.pdf diff --git a/macros/latex-dev/base/lttextcomp.dtx b/macros/latex-dev/base/lttextcomp.dtx index 7f247747d6..1ee4a18b7a 100644 --- a/macros/latex-dev/base/lttextcomp.dtx +++ b/macros/latex-dev/base/lttextcomp.dtx @@ -2357,8 +2357,8 @@ % \changes{v1.1a}{2024/01/27}{Added check file for encoding subset} % \begin{macrocode} %<*TS1check> -\Providesfile{checkencodingsubset.tex} - [2024/01/27 v0.5a Figure out safe TS1 encoding subsets] +\ProvidesFile{checkencodingsubset.tex} + [2024/10/18 v0.5b Figure out safe TS1 encoding subsets] % \end{macrocode} % % \begin{macrocode} diff --git a/macros/latex-dev/base/ltvers.dtx b/macros/latex-dev/base/ltvers.dtx index 50c8b9a91f..76a16e3528 100644 --- a/macros/latex-dev/base/ltvers.dtx +++ b/macros/latex-dev/base/ltvers.dtx @@ -112,10 +112,10 @@ %</2ekernel> %<latexrelease>\edef\latexreleaseversion %<*2ekernel|latexrelease> - {2024-11-01} + {2025-06-01} %</2ekernel|latexrelease> %<*2ekernel> -\def\patch@level{-4} +\def\patch@level{0} % \end{macrocode} % % \begin{macro}{\development@branch@name} diff --git a/macros/latex-dev/base/ltx3info.pdf b/macros/latex-dev/base/ltx3info.pdf Binary files differindex c9d6243144..ea8d21b55f 100644 --- a/macros/latex-dev/base/ltx3info.pdf +++ b/macros/latex-dev/base/ltx3info.pdf diff --git a/macros/latex-dev/base/ltxdoc.pdf b/macros/latex-dev/base/ltxdoc.pdf Binary files differindex bf34a6158d..f0034affb5 100644 --- a/macros/latex-dev/base/ltxdoc.pdf +++ b/macros/latex-dev/base/ltxdoc.pdf diff --git a/macros/latex-dev/base/makeindx.pdf b/macros/latex-dev/base/makeindx.pdf Binary files differindex 17b55b3b69..7be9058ba3 100644 --- a/macros/latex-dev/base/makeindx.pdf +++ b/macros/latex-dev/base/makeindx.pdf diff --git a/macros/latex-dev/base/manifest.txt b/macros/latex-dev/base/manifest.txt index 21b3c0bff3..e393012417 100644 --- a/macros/latex-dev/base/manifest.txt +++ b/macros/latex-dev/base/manifest.txt @@ -76,7 +76,8 @@ % ltnews37.tex -- What was new in the release dated 2023/06. % ltnews38.tex -- What was new in the release dated 2023/11. % ltnews39.tex -- What was new in the release dated 2024/06. -% +% ltnews40.tex -- What was new in the release dated 2024/11. +% ltnews41.tex -- What was new in the release dated 2025/06. % % ltx3info.tex -- Information about the LaTeX3 project. % diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf Binary files differindex b2f9b603d3..a176dd214f 100644 --- a/macros/latex-dev/base/modguide.pdf +++ b/macros/latex-dev/base/modguide.pdf diff --git a/macros/latex-dev/base/nfssfont.pdf b/macros/latex-dev/base/nfssfont.pdf Binary files differindex daeb13bff5..06fcd085a8 100644 --- a/macros/latex-dev/base/nfssfont.pdf +++ b/macros/latex-dev/base/nfssfont.pdf diff --git a/macros/latex-dev/base/proc.pdf b/macros/latex-dev/base/proc.pdf Binary files differindex f3df0c2e37..5a14431bdd 100644 --- a/macros/latex-dev/base/proc.pdf +++ b/macros/latex-dev/base/proc.pdf diff --git a/macros/latex-dev/base/slides.pdf b/macros/latex-dev/base/slides.pdf Binary files differindex 22f5e97d71..8297e59343 100644 --- a/macros/latex-dev/base/slides.pdf +++ b/macros/latex-dev/base/slides.pdf diff --git a/macros/latex-dev/base/slifonts.pdf b/macros/latex-dev/base/slifonts.pdf Binary files differindex f9e8e569e9..e1c640709a 100644 --- a/macros/latex-dev/base/slifonts.pdf +++ b/macros/latex-dev/base/slifonts.pdf diff --git a/macros/latex-dev/base/source2e.pdf b/macros/latex-dev/base/source2e.pdf Binary files differindex 618ab9f305..87c4de96db 100644 --- a/macros/latex-dev/base/source2e.pdf +++ b/macros/latex-dev/base/source2e.pdf diff --git a/macros/latex-dev/base/syntonly.pdf b/macros/latex-dev/base/syntonly.pdf Binary files differindex 46ee8c1e14..a711c567f2 100644 --- a/macros/latex-dev/base/syntonly.pdf +++ b/macros/latex-dev/base/syntonly.pdf diff --git a/macros/latex-dev/base/tlc2.pdf b/macros/latex-dev/base/tlc2.pdf Binary files differindex dcf6ce6c2e..2174d9c5d3 100644 --- a/macros/latex-dev/base/tlc2.pdf +++ b/macros/latex-dev/base/tlc2.pdf diff --git a/macros/latex-dev/base/tlc3.pdf b/macros/latex-dev/base/tlc3.pdf Binary files differindex 978b713fb6..f7c206a692 100644 --- a/macros/latex-dev/base/tlc3.pdf +++ b/macros/latex-dev/base/tlc3.pdf diff --git a/macros/latex-dev/base/tulm.pdf b/macros/latex-dev/base/tulm.pdf Binary files differindex c146c31e21..d3a865fe6c 100644 --- a/macros/latex-dev/base/tulm.pdf +++ b/macros/latex-dev/base/tulm.pdf diff --git a/macros/latex-dev/base/usrguide-historic.pdf b/macros/latex-dev/base/usrguide-historic.pdf Binary files differindex 0a1b81b425..2ebb782a01 100644 --- a/macros/latex-dev/base/usrguide-historic.pdf +++ b/macros/latex-dev/base/usrguide-historic.pdf diff --git a/macros/latex-dev/base/usrguide.pdf b/macros/latex-dev/base/usrguide.pdf Binary files differindex c33ac4a591..4cdaff2fa3 100644 --- a/macros/latex-dev/base/usrguide.pdf +++ b/macros/latex-dev/base/usrguide.pdf diff --git a/macros/latex-dev/base/usrguide.tex b/macros/latex-dev/base/usrguide.tex index 2b9e959627..e4ea6e4e0c 100644 --- a/macros/latex-dev/base/usrguide.tex +++ b/macros/latex-dev/base/usrguide.tex @@ -43,7 +43,7 @@ \texttt{usrguide.tex} for full details.}% } -\date{2024-05-24} +\date{2024-10-22} \NewDocumentCommand\cs{m}{\texttt{\textbackslash\detokenize{#1}}} \NewDocumentCommand\marg{m}{\arg{#1}} @@ -265,7 +265,16 @@ These commands work in the same way as \cs{NewDocumentCommand}, etc.\@, but create environments (\cs{begin}\arg{env} \ldots{} \cs{end}\arg{env}). Both the \meta{beg-code} and \meta{end-code} may access the arguments as defined by \meta{arg spec}. The arguments will be -given following \cs{begin}\arg{env}. +given following \cs{begin}\arg{env}. Any spaces at the start and end of the +\arg{env} are removed before the definition takes place, thus +\begin{verbatim} +\NewDocumentEnvironment{foo} +\end{verbatim} +and +\begin{verbatim} +\NewDocumentEnvironment{ foo } +\end{verbatim} +both create the same \enquote{\texttt{foo}} environment. \subsection{Optional arguments} \label{sec:cmd:opt} diff --git a/macros/latex-dev/base/utf8ienc.pdf b/macros/latex-dev/base/utf8ienc.pdf Binary files differindex b7f8f1da07..fee976bcfa 100644 --- a/macros/latex-dev/base/utf8ienc.pdf +++ b/macros/latex-dev/base/utf8ienc.pdf diff --git a/macros/latex-dev/base/webcomp.pdf b/macros/latex-dev/base/webcomp.pdf Binary files differindex d570bb43fe..5796eaeff8 100644 --- a/macros/latex-dev/base/webcomp.pdf +++ b/macros/latex-dev/base/webcomp.pdf diff --git a/macros/latex-dev/required/amsmath/README.md b/macros/latex-dev/required/amsmath/README.md index b29a93e5a6..d63a3303ad 100644 --- a/macros/latex-dev/required/amsmath/README.md +++ b/macros/latex-dev/required/amsmath/README.md @@ -1,7 +1,7 @@ The amsmath bundle for LaTeX ============================ -Release 2024-11-01 pre-release 4 +Release 2025-06-01 pre-release 0 Overview -------- diff --git a/macros/latex-dev/required/amsmath/amsbsy.pdf b/macros/latex-dev/required/amsmath/amsbsy.pdf Binary files differindex 37b48d18d7..e3e14d49b6 100644 --- a/macros/latex-dev/required/amsmath/amsbsy.pdf +++ b/macros/latex-dev/required/amsmath/amsbsy.pdf diff --git a/macros/latex-dev/required/amsmath/amscd.pdf b/macros/latex-dev/required/amsmath/amscd.pdf Binary files differindex f3821c58aa..11815c1cee 100644 --- a/macros/latex-dev/required/amsmath/amscd.pdf +++ b/macros/latex-dev/required/amsmath/amscd.pdf diff --git a/macros/latex-dev/required/amsmath/amsgen.pdf b/macros/latex-dev/required/amsmath/amsgen.pdf Binary files differindex 34d070702e..e3f799a338 100644 --- a/macros/latex-dev/required/amsmath/amsgen.pdf +++ b/macros/latex-dev/required/amsmath/amsgen.pdf diff --git a/macros/latex-dev/required/amsmath/amsldoc.pdf b/macros/latex-dev/required/amsmath/amsldoc.pdf Binary files differindex 3148107f77..4730fee5fa 100644 --- a/macros/latex-dev/required/amsmath/amsldoc.pdf +++ b/macros/latex-dev/required/amsmath/amsldoc.pdf diff --git a/macros/latex-dev/required/amsmath/amsmath.dtx b/macros/latex-dev/required/amsmath/amsmath.dtx index 41a5c64863..9d45cc2f9d 100644 --- a/macros/latex-dev/required/amsmath/amsmath.dtx +++ b/macros/latex-dev/required/amsmath/amsmath.dtx @@ -81,11 +81,11 @@ Bug reports can be opened (category \texttt{#1}) at\\% % \begin{macrocode} \DeclareRelease{}{1994-06-01}{amsmath-2018-12-01.sty} \DeclareRelease{}{2018-12-01}{amsmath-2018-12-01.sty} -\DeclareCurrentRelease{}{2019-04-01} +\DeclareCurrentRelease{}{2024-10-30} % \end{macrocode} % % \begin{macrocode} -\ProvidesPackage{amsmath}[2024/08/11 v2.17r AMS math features] +\ProvidesPackage{amsmath}[2024/10/30 v2.17s AMS math features] % \end{macrocode} % % \section{Catcode defenses} @@ -1002,6 +1002,10 @@ Foreign command \@backslashchar#1;\MessageBreak \let\DOTSI\relax \let\DOTSB\relax \let\DOTSX\relax +% \end{macrocode} +% In the definitions below, special \cs{uccode}s are used to generate macros +% with arguments delimited by catcode 12 letters as returned by \cs{meaning}. +% \begin{macrocode} {\uccode`7=`\\ \uccode`8=`m \uccode`9=`a \uccode`0=`t \uccode`!=`h \uppercase{% \gdef\math@#1#2#3#4#5#6\math@{\gtest@false\ifx 7#1\ifx 8#2% @@ -1039,6 +1043,13 @@ Foreign command \@backslashchar#1;\MessageBreak } \fi % \end{macrocode} +% \changes{v2.17s}{2024/10/30}{guard against primitive if (gh/1448)} +% \begin{macrocode} +{\uccode`7=`\\ \uccode`(=`i \uccode`)=`f + \uppercase{\gdef\testif@#1#2#3#4\testif@{% + \ifx7#1\ifx(#2\ifx)#3\@tempswafalse\fi\fi\fi} +}} +% \end{macrocode} % \begin{macrocode} \newcount\classnum@ \def\getmathch@#1.#2\getmathch@{\classnum@#1 \divide\classnum@4096 @@ -1159,11 +1170,17 @@ Foreign command \@backslashchar#1;\MessageBreak % \changes{v2.15d}{2016/06/28}{Add space token to prevent runaway % argument error} % \changes{v2.17r}{2024/06/29}{Drop \cs{protect} if present (gh/1265)} -% \begin{macrocode} - \begingroup - \def\protect{\protect}% % make it a quark - \xdef\meaning@{\@xp\stripprotect@\@let@token.........\stripprotect@. .........}% - \endgroup +% \changes{v2.17s}{2024/10/30}{skip protect testif detect primitive if (gh/1448)} +% \begin{macrocode} + \xdef\meaning@{\meaning\@let@token. .........}% + \@tempswatrue + \@xp\testif@\meaning@....\testif@ + \if@tempswa + \begingroup + \def\protect{\protect}% % make it a quark + \xdef\meaning@{\@xp\stripprotect@\@let@token.........\stripprotect@. .........}% + \endgroup + \fi % \end{macrocode} % In previous versions \verb|\long| macros were not seen by the lookahead. % That was bad as this file uses \verb|\(re)newcommand| for \verb|\implies| etc. diff --git a/macros/latex-dev/required/amsmath/amsmath.pdf b/macros/latex-dev/required/amsmath/amsmath.pdf Binary files differindex 8b8d9897e4..dbe7953966 100644 --- a/macros/latex-dev/required/amsmath/amsmath.pdf +++ b/macros/latex-dev/required/amsmath/amsmath.pdf diff --git a/macros/latex-dev/required/amsmath/amsopn.pdf b/macros/latex-dev/required/amsmath/amsopn.pdf Binary files differindex 38ed676628..91b1e68ce8 100644 --- a/macros/latex-dev/required/amsmath/amsopn.pdf +++ b/macros/latex-dev/required/amsmath/amsopn.pdf diff --git a/macros/latex-dev/required/amsmath/amstext.pdf b/macros/latex-dev/required/amsmath/amstext.pdf Binary files differindex 3a2b0dc9df..abc6787b01 100644 --- a/macros/latex-dev/required/amsmath/amstext.pdf +++ b/macros/latex-dev/required/amsmath/amstext.pdf diff --git a/macros/latex-dev/required/amsmath/amsxtra.pdf b/macros/latex-dev/required/amsmath/amsxtra.pdf Binary files differindex 93768f90db..eaa368f926 100644 --- a/macros/latex-dev/required/amsmath/amsxtra.pdf +++ b/macros/latex-dev/required/amsmath/amsxtra.pdf diff --git a/macros/latex-dev/required/amsmath/changes.txt b/macros/latex-dev/required/amsmath/changes.txt index a0905fca85..170c7fe0d7 100644 --- a/macros/latex-dev/required/amsmath/changes.txt +++ b/macros/latex-dev/required/amsmath/changes.txt @@ -2,6 +2,10 @@ All changes above are only part of the development branch for the next release. ================================================================================ +######################### +# 2024-11-01 Release +######################### + 2024-08-02 Frank Mittelbach <Frank.Mittelbach@latex-project.org> * amsmath.dtx (section{Ellipsis dots}): diff --git a/macros/latex-dev/required/amsmath/subeqn.pdf b/macros/latex-dev/required/amsmath/subeqn.pdf Binary files differindex 30f72e853f..bcbb801d12 100644 --- a/macros/latex-dev/required/amsmath/subeqn.pdf +++ b/macros/latex-dev/required/amsmath/subeqn.pdf diff --git a/macros/latex-dev/required/amsmath/technote.pdf b/macros/latex-dev/required/amsmath/technote.pdf Binary files differindex 9d4765dff3..8b5b33ae3d 100644 --- a/macros/latex-dev/required/amsmath/technote.pdf +++ b/macros/latex-dev/required/amsmath/technote.pdf diff --git a/macros/latex-dev/required/amsmath/testmath.pdf b/macros/latex-dev/required/amsmath/testmath.pdf Binary files differindex deea104a28..399ff76fdd 100644 --- a/macros/latex-dev/required/amsmath/testmath.pdf +++ b/macros/latex-dev/required/amsmath/testmath.pdf diff --git a/macros/latex-dev/required/firstaid/changes.txt b/macros/latex-dev/required/firstaid/changes.txt index cbabfcbb72..5bfe7f1a53 100644 --- a/macros/latex-dev/required/firstaid/changes.txt +++ b/macros/latex-dev/required/firstaid/changes.txt @@ -1,3 +1,8 @@ +2024-10-16 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + + * latex2e-first-aid-for-external-files.dtx: extend firstaid for cleveref + for issue #1393 and longtable. + 2024-06-25 David Carlisle <David.Carlisle@latex-project.org> * latex2e-first-aid-for-external-files.dtx: add firstaid for arydshln diff --git a/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx b/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx index 4f473276f0..68877bc24d 100644 --- a/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx +++ b/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.dtx @@ -111,8 +111,8 @@ % \end{macrocode} % % \begin{macrocode} -\def\LaTeXFirstAidDate{2024/07/05} -\def\LaTeXFirstAidVersion{v1.1f} +\def\LaTeXFirstAidDate{2024/10/16} +\def\LaTeXFirstAidVersion{v1.1g} % \end{macrocode} % % \begin{macrocode} @@ -717,6 +717,34 @@ {[\@tempb][\arabic{page}][\cref@result]\thepage}{}{}{}}}% <------- five \@esphack}% } +% \end{macrocode} +% \changes{v1.1g}{2024/10/16}{update cleveref data in label hook} +% cleveref patches and redefines \cs{refstepcounter} so that a call updates its data. +% This fails if like e.g. in \pkg{longtable} the counter is stepped with +% \cs{@kernel@refstepcounter}. We therefore move the data setup into the label hook. +% As the hook is in a group we have to smuggle the data out of it. +% \url{https://tex.stackexchange.com/a/722909/2388} and issue \#1393 +% \begin{macrocode} + \newcommand\firstaid@cref@smugglelabel{\let\cref@currentlabel\cref@gcurrentlabel@temp} + \newcommand\firstaid@cref@updatelabeldata[1]{% + \cref@constructprefix{#1}{\cref@result}% + \@ifundefined{cref@#1@alias}% + {\def\@tempa{#1}}% + {\def\@tempa{\csname cref@#1@alias\endcsname}}% + \protected@xdef\cref@gcurrentlabel@temp{% + [\@tempa][\arabic{#1}][\cref@result]% + \csname p@#1\endcsname\csname the#1\endcsname}% + \aftergroup\firstaid@cref@smugglelabel + } +% \end{macrocode} +% we test if \cs{@currentcounter} is empty for unnumbered sections +% \begin{macrocode} + \AddToHook{label}[firstaid/cleveref] + {\ifx + \@currentcounter\@empty + \else + \firstaid@cref@updatelabeldata{\@currentcounter} + \fi} }% } % \end{macrocode} diff --git a/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf b/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf Binary files differindex c80aec8767..4d4e6e27e3 100644 --- a/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf +++ b/macros/latex-dev/required/firstaid/latex2e-first-aid-for-external-files.pdf diff --git a/macros/latex-dev/required/graphics/README.md b/macros/latex-dev/required/graphics/README.md index bb478db049..0160491bb9 100644 --- a/macros/latex-dev/required/graphics/README.md +++ b/macros/latex-dev/required/graphics/README.md @@ -1,7 +1,7 @@ The LaTeX `graphics` bundle =========================== -Release 2024-11-01 pre-release 4 +Release 2025-06-01 pre-release 0 Overview -------- diff --git a/macros/latex-dev/required/graphics/changes.txt b/macros/latex-dev/required/graphics/changes.txt index 5e72561389..d437358079 100644 --- a/macros/latex-dev/required/graphics/changes.txt +++ b/macros/latex-dev/required/graphics/changes.txt @@ -4,15 +4,19 @@ completeness or accuracy and it contains some references to files that are not part of the distribution. ======================================================================= +================================================================================ +All changes above are only part of the development branch for the next release. +================================================================================ + +######################### +# 2024-11-01 Release +######################### + 2024-06-24 Frank Mittelbach <Frank.Mittelbach@latex-project.org> * color.dtx (section{Extra Groups}): Support new @endpe mechanism -================================================================================ -All changes above are only part of the development branch for the next release. -================================================================================ - ######################### # 2024-06-01 Release ######################### diff --git a/macros/latex-dev/required/graphics/color.pdf b/macros/latex-dev/required/graphics/color.pdf Binary files differindex 860fba352c..081cfb5463 100644 --- a/macros/latex-dev/required/graphics/color.pdf +++ b/macros/latex-dev/required/graphics/color.pdf diff --git a/macros/latex-dev/required/graphics/drivers.pdf b/macros/latex-dev/required/graphics/drivers.pdf Binary files differindex 0aadc40619..03dc4fc6b4 100644 --- a/macros/latex-dev/required/graphics/drivers.pdf +++ b/macros/latex-dev/required/graphics/drivers.pdf diff --git a/macros/latex-dev/required/graphics/epsfig.pdf b/macros/latex-dev/required/graphics/epsfig.pdf Binary files differindex 1e6b732805..16b8cc6bdc 100644 --- a/macros/latex-dev/required/graphics/epsfig.pdf +++ b/macros/latex-dev/required/graphics/epsfig.pdf diff --git a/macros/latex-dev/required/graphics/graphics.pdf b/macros/latex-dev/required/graphics/graphics.pdf Binary files differindex 388f721399..24df86ee4e 100644 --- a/macros/latex-dev/required/graphics/graphics.pdf +++ b/macros/latex-dev/required/graphics/graphics.pdf diff --git a/macros/latex-dev/required/graphics/graphicx.pdf b/macros/latex-dev/required/graphics/graphicx.pdf Binary files differindex bcff331baf..bdd0c30cca 100644 --- a/macros/latex-dev/required/graphics/graphicx.pdf +++ b/macros/latex-dev/required/graphics/graphicx.pdf diff --git a/macros/latex-dev/required/graphics/grfguide.pdf b/macros/latex-dev/required/graphics/grfguide.pdf Binary files differindex e6f37c6c57..8a060397b6 100644 --- a/macros/latex-dev/required/graphics/grfguide.pdf +++ b/macros/latex-dev/required/graphics/grfguide.pdf diff --git a/macros/latex-dev/required/graphics/keyval.pdf b/macros/latex-dev/required/graphics/keyval.pdf Binary files differindex 1fda18ddac..ac7d5d5f67 100644 --- a/macros/latex-dev/required/graphics/keyval.pdf +++ b/macros/latex-dev/required/graphics/keyval.pdf diff --git a/macros/latex-dev/required/graphics/lscape.pdf b/macros/latex-dev/required/graphics/lscape.pdf Binary files differindex c4c04b2bf1..9a3b2f72d8 100644 --- a/macros/latex-dev/required/graphics/lscape.pdf +++ b/macros/latex-dev/required/graphics/lscape.pdf diff --git a/macros/latex-dev/required/graphics/mathcolor.pdf b/macros/latex-dev/required/graphics/mathcolor.pdf Binary files differindex e2494110b1..6f843714d6 100644 --- a/macros/latex-dev/required/graphics/mathcolor.pdf +++ b/macros/latex-dev/required/graphics/mathcolor.pdf diff --git a/macros/latex-dev/required/graphics/rotating.pdf b/macros/latex-dev/required/graphics/rotating.pdf Binary files differindex 586b7764d9..9d45e0a40c 100644 --- a/macros/latex-dev/required/graphics/rotating.pdf +++ b/macros/latex-dev/required/graphics/rotating.pdf diff --git a/macros/latex-dev/required/graphics/rotex.pdf b/macros/latex-dev/required/graphics/rotex.pdf Binary files differindex 294a55f7ee..b2b66d505e 100644 --- a/macros/latex-dev/required/graphics/rotex.pdf +++ b/macros/latex-dev/required/graphics/rotex.pdf diff --git a/macros/latex-dev/required/graphics/trig.pdf b/macros/latex-dev/required/graphics/trig.pdf Binary files differindex 23f1cc5587..9edb838d90 100644 --- a/macros/latex-dev/required/graphics/trig.pdf +++ b/macros/latex-dev/required/graphics/trig.pdf diff --git a/macros/latex-dev/required/latex-lab/README.md b/macros/latex-dev/required/latex-lab/README.md index 6090768b17..66bc30af6f 100644 --- a/macros/latex-dev/required/latex-lab/README.md +++ b/macros/latex-dev/required/latex-lab/README.md @@ -1,6 +1,6 @@ # LaTeX laboratory -Release 2024-11-01 pre-release 4 +Release 2025-06-01 pre-release 0 ## Overview diff --git a/macros/latex-dev/required/latex-lab/blocks-code.pdf b/macros/latex-dev/required/latex-lab/blocks-code.pdf Binary files differindex 0241a9ca6c..60623a63de 100644 --- a/macros/latex-dev/required/latex-lab/blocks-code.pdf +++ b/macros/latex-dev/required/latex-lab/blocks-code.pdf diff --git a/macros/latex-dev/required/latex-lab/blocks-doc.pdf b/macros/latex-dev/required/latex-lab/blocks-doc.pdf Binary files differindex efd0d24e7b..7e75622f6b 100644 --- a/macros/latex-dev/required/latex-lab/blocks-doc.pdf +++ b/macros/latex-dev/required/latex-lab/blocks-doc.pdf diff --git a/macros/latex-dev/required/latex-lab/changes.txt b/macros/latex-dev/required/latex-lab/changes.txt index c6a55ee6ad..35c77075d6 100644 --- a/macros/latex-dev/required/latex-lab/changes.txt +++ b/macros/latex-dev/required/latex-lab/changes.txt @@ -1,3 +1,12 @@ +2024-10-25 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: reorganized luamml and mathml options + to support also structure elements and extended the documentation. Corrected + handling of alt-texts. Added examples for the various options. + +2024-10-16 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-firstaid.dtx: correct amsthm firstaid (tagging/733), + remove now unneeded code for cleveref. + 2024-10-12 Joseph Wright <Joseph.Wright@latex-project.org> * latex-lab-math.dtx: Sync with protected-begin status diff --git a/macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf b/macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf Binary files differindex 372c4f2b74..8d04289fae 100644 --- a/macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf +++ b/macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf diff --git a/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf b/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf Binary files differindex 3bd0368a84..316250b84a 100644 --- a/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf +++ b/macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf Binary files differindex 76b741329d..d50132e367 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-bib.pdf b/macros/latex-dev/required/latex-lab/latex-lab-bib.pdf Binary files differindex 4075e6e73b..98add81cad 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-bib.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-bib.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-block.pdf b/macros/latex-dev/required/latex-lab/latex-lab-block.pdf Binary files differindex e46fb892a8..64f79fb74e 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-block.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-block.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx b/macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx index 083cfcdc40..118baccd79 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabfirstaiddate{2024-10-04} -\def\ltlabfirstaidversion{0.85g} +\def\ltlabfirstaiddate{2024-10-16} +\def\ltlabfirstaidversion{0.85h} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -125,6 +125,7 @@ \AddToHook{package/amsthm/after}[latex-lab-testphase-firstaid/amsthm] {\tag_if_active:T{\@@_firstaid_amsthm:}} % \end{macrocode} +% \changes{v0.85h}{2024/10/16}{moved Caption tag into \@begintheorem, tagging issue\#733} % \begin{macrocode} \cs_new_protected:Npn \@@_firstaid_amsthm: { @@ -166,17 +167,27 @@ \def\@begintheorem##1##2[##3]{% % \end{macrocode} % We use the theorem instance. +% \changes{v0.85h}{2024/10/16}{Added pre and post skips tagging/733} % \begin{macrocode} - \UseInstance{blockenv}{theorem}{} + \UseInstance{blockenv}{theorem}{beginsep=\thm@preskip} +% \end{macrocode} +% There is no working key to set the endskip, so we set the skip directly +% similar to what amsthm is doing after the \cs{trivlist}. +% \begin{macrocode} + \skip_set:Nn\l__block_topsepadd_skip { \thm@postskip } % \end{macrocode} % While create the caption/label we disable para-tagging. % \begin{macrocode} \tagpdfparaOff \mode_leave_vertical: % \end{macrocode} -% The anchor for links +% The anchor for links. amsthm allows for unnumbered theorems so we have to test +% for an empty counter. +% \changes{v0.85h}{2024/10/16}{add test if counter is empty tagging/736} % \begin{macrocode} - \MakeLinkTarget{\l__block_thm_current_counter_tl} + \tl_if_empty:NTF \l__block_thm_current_counter_tl + {\MakeLinkTarget[theorem]{}} + {\MakeLinkTarget{\l__block_thm_current_counter_tl}} \group_begin: \normalfont \the\thm@headfont \thm@indent @@ -197,7 +208,10 @@ \@ifempty{##3} {\let\thmnote\@gobble} {\def\thmnote####1{\tag_mc_begin:n{}####1\tag_mc_end:}}% - \thm@swap\swappedhead\thmhead{##1}{##2}{##3}% + \tag_struct_begin:n{tag=Caption} + \thm@swap\swappedhead\thmhead{##1}{##2}{##3}% + \tag_mc_begin:n{}\the\thm@headpunct\tag_mc_end: + \tag_struct_end: \thmheadnl % possibly a newline. \hskip\thm@headsep \group_end: @@ -215,24 +229,17 @@ % to make tagging more easier. % \begin{macrocode} \def\thmhead@plain##1##2##3{% - \tag_struct_begin:n{tag=Caption} \thmname{##1} \thmnumber{ \@ifnotempty{##1}{~}\@upn{##2} }% - \thmnote{\pdffakespace\space{\the\thm@notefont(##3)}} - %moved for easier tagging - \tag_mc_begin:n{}\the\thm@headpunct\tag_mc_end: - \tag_struct_end: + \thmnote{\pdffakespace\space{\the\thm@notefont(##3)}} } \let\thmhead\thmhead@plain \def\swappedhead##1##2##3{% - \tag_struct_begin:n{tag=Caption} \thmnumber{##2} \thmname{\@ifnotempty{##2}{\nobreakspace}##1} \thmnote{\pdffakespace\space{\the\thm@notefont(##3)}} - \tag_mc_begin:n{}\the\thm@headpunct\tag_mc_end: - \tag_struct_end: } \let\swappedhead@plain=\swappedhead % \end{macrocode} @@ -377,7 +384,9 @@ % \subsection{cleveref} % % The cleveref package redefines \cs{@makefntext} and this means that the patches in -% the new footnote code fails. We use a hook instead +% the new footnote code fails. We use a hook instead. +% \changes{v0.85h}{2024/10/16}{Remove redefinition of refstepcounter. It no longer uses +% the hook.} % \begin{macrocode} \AddToHook{package/cleveref/after} { @@ -387,16 +396,6 @@ \protected@edef\cref@currentlabel{% [footnote][\arabic{footnote}][\cref@result]% \p@footnote\@thefnmark}} -% \end{macrocode} -% The second problem is that it redefines \cs{refstepcounter} to use an argument. -% In itself this isn't a problem but as the new definition doesn't grab the arguments -% directly it fails over the generic hook inserted at the end of the definition -% \begin{macrocode} - \RenewDocumentCommand\refstepcounter{om}{% - \IfNoValueTF{#1}% - {\refstepcounter@noarg{#2}}% - {\refstepcounter@optarg[#1]{#2}}% - }% } % \end{macrocode} % diff --git a/macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf b/macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf Binary files differindex 7b53828852..8c65ca2d75 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-float.pdf b/macros/latex-dev/required/latex-lab/latex-lab-float.pdf Binary files differindex 4faef1a417..f15a6f4d42 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-float.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-float.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf b/macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf Binary files differindex d00c806bbd..3c41ce694a 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf b/macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf Binary files differindex f74084f429..ab90c91a27 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf b/macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf Binary files differindex 4bdd12091c..deb9172c2f 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-math.dtx b/macros/latex-dev/required/latex-lab/latex-lab-math.dtx index e8710b60a8..94d31c817b 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-math.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-math.dtx @@ -19,13 +19,13 @@ % for those people who are interested or want to report an issue. % % -\def\ltlabmathdate{2024-10-12} -\def\ltlabmathversion{0.6h} +\def\ltlabmathdate{2024-10-25} +\def\ltlabmathversion{0.6i} % %<*driver> \documentclass{l3doc} \EnableCrossrefs -\CodelineIndex +\CodelineIndex \usepackage{todonotes} @@ -40,7 +40,7 @@ % \title{The \texttt{latex-lab-math} code\thanks{}} % \author{Frank Mittelbach, Joseph Wright, \LaTeX{} Project} % \date{v\ltlabmathversion\ \ltlabmathdate} -% +% % \maketitle % % \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}} @@ -77,21 +77,21 @@ % \tableofcontents % % \section{Introduction} -% \car*{Todo: update all the documentation! Both here and +% \car*{Todo: update all the documentation! Both here and % (what little there is!) in the implementation section.} % % Tagging math involves a variety of tasks that require that math is captured before the % typesetting -% \begin{itemize} -% \item When typesetting the math MC-tags and structure commands must -% be inserted at the begin and the end, and perhaps also around lines -% or other subparts of the equation. +% \begin{itemize} +% \item When typesetting the math MC-tags and structure commands must +% be inserted at the begin and the end, and perhaps also around lines +% or other subparts of the equation. % \item The source and/or a mathml-representation of the source must be available % so that it can be (perhaps after some preprocessing) be used in an associated file % or in an alternate text -% \item It must be possible to measure the math for e.g. a bbox setting. +% \item It must be possible to measure the math for, e.g., a bbox setting. % \end{itemize} -% +% % This file implements capture of all math mode material at the outer % level, i.e., a formula is captured in its entirety with inner text % blocks (possibly containing further math) absorbed as part of the @@ -101,24 +101,24 @@ %\end{verbatim} % would only result in a single capture of the tokens % ``\verb*/a \in A \text{ for all $a<5$}/''. -% +% % % \section{Math capture} \label{sec:mathcapture} -% In the current setup +% In the current setup % \begin{itemize} % \item |$|, |\(...\)| and |$$| grab (through a command in \cs{everymath}/cs{everydisplay}) % if the boolean \cs{l_@@_collected_bool} is false. % If the boolean is true they behave normally and can for example contain verbatim. -% -% \item All (registered) environments grab their body +% +% \item All (registered) environments grab their body % regardless of the state of the boolean. For -% |equation|, |equation*| and |math| this is a change as they no longer can +% |equation|, |equation*| and |math| this is a change as they no longer can % contain verbatim. -% +% % \item BUG: |\[...\]| grabs if \cs{l_@@_collected_bool} is false. If it is -% true it falls back to |equation*| and then errors because this can't find the end. -% \end{itemize} -% +% true it falls back to |equation*| and then errors because this can't find the end. +% \end{itemize} +% % \subsection{Code level interfaces} % % \begin{function}{\math_register_env:n, \math_register_env:nn} @@ -163,51 +163,52 @@ % material. % \end{itemize} % \end{function} -% +% % \section{Math tagging} -% -% The tagging code has to handle +% +% \subsection{Code requirements} +% The tagging code has to handle % \begin{itemize} -% \item the embedding into the surrounding. This means -% \begin{itemize} -% \item closing and reopening MC-chunks +% \item the embedding into the surrounding. This means +% \begin{itemize} +% \item closing and reopening MC-chunks % \item closing and reopening text/P-structures % \item handling interferences of the tagging code with penalties and spacing. % \end{itemize} % \item the actual tagging which means to do some or all of the following tasks: % \begin{itemize} % \item setup content for an associated source file -% \item setup content for an associated mathml file +% \item setup content for an associated mathml file % \item setup content for the /Alt key % \item setup content for the /ActualText key % \item setup attributes -% \item add associated files +% \item add associated files % \item add a Formula structure -% \item surround subparts (e.g. lines) with Formula sub structures +% \item surround subparts (e.g., lines) with Formula sub structures % (perhaps with their own set of additional content) -% \item surround elements of the equation with mathml structure elements +% \item surround elements of the equation with mathml structure elements % (currently only luatex with luamml) % \end{itemize} % \end{itemize} -% +% % \subsection{Inline math} -% +% % The embedding code is added through -% the sockets +% the sockets % \begin{itemize} -% \item |tagsupport/math/inline/begin| +% \item |tagsupport/math/inline/begin| % \item |tagsupport/math/inline/end| -% \end{itemize} +% \end{itemize} % The sockets simply push and pop the MC currently. Without -% tagging they use the noop-plug. -% +% tagging they use the noop-plug. +% % The actual tagging is in done through the sockets % \begin{itemize} % \item |tagsupport/math/inline/formula/begin| % This socket takes the math as argument and its code -% should output it for typesetting. +% should output it for typesetting. % It is not \emph{used} as a tagging socket as the math argument should -% not be lost without tagging, so without tagging the +% not be lost without tagging, so without tagging the % socket uses the identity plug. % The |default| plug of the socket calls these three internal sockets % for the tagging support: @@ -218,62 +219,62 @@ % \item |tagsupport/math/struct/begin| This calls \cs{tag_struct_begin:n}. % It should also write the associated files if needed. % \item |tagsupport/math/substruct/begin| this handles subparts. -% TODO: does it really make sense in inline math to have that?? +% TODO: does it really make sense in inline math to have that?? % \end{itemize} % \item |tagsupport/math/inline/formula/end| % This socket ends the formula structure(s). The |default| % plug calls these internal sockets: % \begin{itemize} % \item |tagsupport/math/substruct/end| -% \item |tagsupport/math/struct/end| +% \item |tagsupport/math/struct/end| % \end{itemize} -% \end{itemize} -% +% \end{itemize} +% % \subsection{Display math} -% +% % \textit{to be written} -% +% % \subsection{Associated Files} -% +% % The current code allows the attachment of two types of associated file to the % Formula structure: -% the \LaTeX\ source and a MathML representation. +% the \LaTeX\ source and a MathML representation. % Technically both can be attached---AF is an array -% of file references---practically there can be problems with PDF consumers: -% e.g. ngpdf used both and so showed the equation twice -% (this has been corrected in the newest version) and +% of file references-----in practice there can be problems with PDF consumers: +% e.g., ngpdf used both and so showed the equation twice +% (this has been corrected in the newest version) and % Foxit seems to see only the first AF in the array (so we attach the % mathml as first file). -% -% The \LaTeX\ source can be (and is) attached automatically. +% +% The \LaTeX\ source can be (and is) attached automatically. % It can be suppressed by an option with -% \texttt{math/tex/AF=false}, see below. -% -% The MathML is attached if the files |\jobname-mathml.html| and/or -% |\jobname-luamml-mathml.html| are found -% and if they contains a suitable MathML snippet for the current formula. +% \texttt{math/tex/AF=false}, see below. +% +% The MathML is attached if the files |\jobname-mathml.html| and/or +% |\jobname-luamml-mathml.html| are found +% and if they contains a suitable MathML snippet for the current formula. % If the files contain more than one suitable snippet (as identified by the hash) -% the first one is used. +% the first one is used. % |\jobname-luamml-mathml.html| is automatically generated (see below section~\ref{sec:luamml}) % and read after |\jobname-mathml.html|. This means that |\jobname-mathml.html| can contain -% improved versions of a formula. -% +% improved versions of a formula. +% % The MathML processing can be suppressed globally by emptying the list of % mathml files with |math/mathml/sources=|. Locally for a formula |math/mathml/AF=false| -% can be used. -% -% For a MathML representation a file with such representations must be provided. -% If the equation is numbered the numbering should be part of the MathML as +% can be used. +% +% For a MathML representation a file with such representations must be provided. +% If the equation is numbered the numbering should be part of the MathML as % the |Lbl| substructure is ignored if an MathML is used (see https://github.com/foxitsoftware/PDF_UA-2). -% -% The MathML representation is given in a special format. +% +% The MathML representation is given in a special format. % It is meant to be a valid html file % that can be viewed in a browser. % For this it can start with |<!DOCTYPE html><html>| and end with |</html>| -% It should have the extension \texttt{.html}. The \meta{mathml} content +% It should have the extension \texttt{.html}. The \meta{mathml} content % is read with special catcodes, so can contain ambersands, hashes, comment chars % and unmatched braces such as |<mo>{</mo>| -% +% % The file should contain a number of representations in this format: % \begin{quote} % |<div>| \\ @@ -287,197 +288,338 @@ % \end{quote} % The keywords |<div>|, |<h2>\mml|, |<p>|, |<math|, |</math>| |</div>| are required as % they are used to delimit the arguments by the \LaTeX{} code. -% +% % \meta{key} and \meta{source} are only used for debugging, they help to identify % the equation referred by this representation. The source should be used correctly escaped % |&| and |<| so that if gives valid html! -% -% \meta{attributes} is not required either, but can e.g. contain attributes +% +% \meta{attributes} is not required either, but can, e.g., contain attributes % to improve the display in a browser: % \begin{verbatim} % <math alttext="\mathbf{G}" class="ltx_Math" display="inline"> % \end{verbatim} % It can also contain the name space declaration: |xmlns="http://www.w3.org/1998/Math/MathML"|% % \footnote{But it is probably not needed and only blows up the PDF.} -% -% -% By default the code tries at the begin of the document -% to read a file |\jobname-mathml.html| in the |html|-format. -% The file name can be changed with |mathml/setfiles={filename1,filename2}| -% (without extension, |html| is added automatically). -% If there is a list, all files are loaded. +% +% +% By default the code tries at the begin of the document +% to read a file |\jobname-mathml.html| in the |html|-format. +% The file name can be changed with |mathml/setfiles={filename1,filename2}| +% (without extension, |html| is added automatically). +% If there is a list, all files are loaded. % If a file doesn't exist it is ignored, only an info is written to the log. -% -% Currently every MathML-snippet from a file is embedded into the PDF, -% it is not checked first if it is actually used (simply writing everything to the PDF -% is a bit easier than keeping everything in memory and also means that -% the snippets are one after the other in the PDF). -% -% As mentioned above the MathML-AF can be suppressed for the equations in a group with +% +% Currently every MathML-snippet from a file is embedded into the PDF, +% it is not checked first if it is actually used (simply writing everything to the PDF +% is a bit easier than keeping everything in memory and also means that +% the snippets are one after the other in the PDF). +% +% As mentioned above the MathML-AF can be suppressed for the equations in a group with % |math/mathml/AF=false|, or -% completely by setting |math/mathml/sources=| in the preamble. -% +% completely by setting |math/mathml/sources=| in the preamble. +% % Files embedded in a PDF can be listed in the attachments panel of a PDF viewer. % This is probably not so useful for lots of small files (but one could create -% collections), but as long as PDF editors or viewers don't offer +% collections), but as long as PDF editors or viewers don't offer % proper support to access the AF it can help so have them there. The MathML are % added by default, but the \LaTeX{} source not. This can be changed with % |viewer/pane/mathsource=true| (anywhere in the document) and |viewer/pane/mathml=false| (in the -% preamble, before the external file is read). -% -% +% preamble, before the external file is read). +% +% % \subsection{Automatic mathml creation with luamml}\label{sec:luamml} -% -% If lualatex is used, if the package \texttt{unicode-math} is used -% and if the package \texttt{luamml} is found -% then it will automatically generate the file |\jobname-luamml-mathml.html| +% +% If lualatex and the package \pkg{unicode-math} is used +% the package \texttt{luamml} is loaded and +% will automatically generate the file |\jobname-luamml-mathml.html| % with mathml representations of all math formulas. -% The generation of the file can be suppressed with |math/mathml/luamml=false|. -% If \texttt{unicode-math} is not used, -% the generation of the file can be forced -% with |math/mathml/luamml=true| or |math/mathml/luamml| but be aware that -% it is then probable that various symbols are mapped to the wrong unicode code -% points. -% The package is still quite experimental and the output should be checked. -% The |\jobname-luamml-mathml.html| file may be previewed in a browser although -% you may need to add additional css or javascript declarations -% to enable browser support for all mathml constructs. -% The file is then used in subsequent compilations and works also with -% pdflatex. +% This file is then used in subsequent compilations and works also with +% pdflatex. % +% The generation of the file can be suppressed (in the preamble) +% with |math/mathml/luamml/write=false|. % -% \subsection{Options} -% -% +% If the package \pkg{unicode-math} is not used, +% the loading of \pkg{luamml} and with it the generation of the file can be forced +% with |math/mathml/luamml/load=true| or |math/mathml/luamml/write=true| +% but be aware that it is then possible that various symbols +% are mapped to the wrong Unicode code points. +% +% The package \pkg{luamml} is still quite experimental and the output should be checked. +% The |\jobname-luamml-mathml.html| file may be previewed in a browser although +% you may need to add additional css or javascript declarations +% to enable browser support for all mathml constructs. +% +% +% \subsection{Summary of math options} +% The following options exist to make math more accessible: +% \begin{description} +% \item[ActualText] An \texttt{ActualText} can be placed on structure elements, +% but can also be added in the stream on a \texttt{BDC} marker with a \texttt{Span} +% tag (normally an independant marker without an MCID number, it is not clear yet +% if it can be used on a MC-chunk). +% The content is a text string, typically one or a few Unicode characters. +% \texttt{ActualText} is meant to replaces the content +% and should only be used on small entities, +% e.g., to define the semantic or the Unicode code point of a symbol. +% \texttt{ActualText} is not supported by all PDF reader. +% It is also unknown where it should be used at best (in a structure element, +% or on an independent Span-BDC) and what happens if it is used in more than +% one place. +% \begin{description} +% \item[enabled by default?] False +% \item[how to enable/disable] No interface yet. +% \texttt{ActualText} can only be added on the Formula structure element by +% changing the \texttt{tagsupport/math/content} or some other socket. +% For a BDC marker one can, e.g., use +% \begin{verbatim} +% \pdf_string_from_unicode:nnN{utf16/hex}{€}\l_tmpa_tl +% \pdf_bdc:ee{Span}{/ActualText\l_tmpa_tl}content\pdf_emc: +% \end{verbatim} +% There should be no pagebreak in the \meta{content} and the BDC should be correctly +% nested into tagging, so, e.g., a \cs{leavevmode} should be issued before the bdc command. +% \item[Consumer support] in part and in part buggy, needs tests \ldots +% \end{description} +% +% \item[Alt] Like \texttt{ActualText} the \texttt{Alt} key can be used on +% structure elements and on \texttt{Span} in the stream. It should contain a description +% of the content and is mainly meant for images. PDF/UA-1, +% which views math formulas as illustrations, mandates the key +% also for \texttt{Formula} structure elements. +% \begin{description} +% \item[enabled by default?] false unless PDF/UA-1 is detected, +% then it is enabled in the begindocument/end hook +% (this will reconsidered when it is clear, that +% the use of \texttt{Alt} does not shadow mathml). It can be enabled for +% all engines and PDF versions. +% \item[enable/disable] \verb+\tagpdfsetup{math/alt/use}+ (local boolean, +% so can be used on individual equations) +% \item[default value] A template text (stored in \cs{l_@@_content_template_tl}) +% starting with \texttt{LaTeX formula starts}. +% \item[user value] No interface currently provided. This needs optional arguments +% or an external setup command. +% See \url{https://github.com/latex3/tagging-project/discussions/717}. +% +% \end{description} +% +% \item[source-AF] The \LaTeX{}-source of the equation can +% be attached as an associated file with mime-type +% application/Fx-tex. The \texttt{AFRelationship} is \texttt{Source}. +% The source is embedded without expansion. This means that targets of +% references and macros are not resolved. +% The files are by default not shown in the EmbeddedFiles pane, +% this can be enabled with |viewer/pane/mathsource=true|. +% If an A-standard is used, it must be one that allows embedded files, e.g., A-4f. +% +% \begin{description} +% \item[enabled by default?] true for all engines and PDF versions +% \item[enable/disable] \verb+\tagpdfsetup{math/tex/AF}+ (local boolean, so can +% be used on individual equations) +% \item[default value] source code including dollars or environment name. +% \item[consumer support] Currently only ngpdf makes +% use of it: if there is no mathml it passes the source to mathjax. +% \end{description} +% +% \item[luamml] The following options make (with lualatex) use +% of the \pkg{luamml} package. \pkg{luamml} is currently automatically +% loaded (at the end of the preamble) if \pkg{unicode-math} has been detected. +% The loading can be forced or suppressed +% with \verb+\tagpdfsetup{math/mathml/luamml/load=true/false}+. +% +% \pkg{luamml} affects all math, locally it can be stopped with |math/mathml/ignore|, +% or by using the commands described in the package. +% +% \item[mathml-AF] A mathml representation of the equation can be attached +% to the structure. The configuration possibilities are rather complex as the +% keys have to control three different tasks: +% The \emph{generation} of the file with the mathml fragments, +% the \emph{reading} and \emph{embedding} of the mathml fragments, +% and the \emph{association} of a mathml fragment to a specific equation. +% +% \begin{description} +% \item[generation] +% With pdf\LaTeX{} mathml fragments can not be generated automatically, +% but a file with dummy fragments for every equation will be written if +% \verb+\tagpdfsetup{math/mathml/write-dummy}+ is issued in the preamble. +% +% With lua\LaTeX{} a file with mathml fragments will be created automatically +% if the package \pkg{luamml} has been loaded (see above). +% +% \item[reading and embedding] +% By default the code will read and embed +% mathml from |\jobname-mathml.html| and |\jobname-luamml-mathml.html| in this order and +% the first fragment with a new hash value will be inserted.% +% The list of sources and their order can be changed with the key +% |math/mathml/sources|, setting that to an empty value suppresses +% the loading mathml associated files completely. For efficiency reasons +% it embeds math fragments directly, there is no check yet if the fragment is +% actually used. +% +% The files are by default shown in the EmbeddedFiles pane, +% this can be disabled with |viewer/pane/mathml=false|. +% +% \item[attaching] A mathml fragment is currently +% attached as an associated file to an Formula if the hash of +% the source matches the hash of the fragment. This is not a perfect test: +% equations with the same source and so the same hash +% can have different mathml representation, e.g., +% if there are references or commands or counters in the equation. This +% will change in a feature version. +% The attachment can be suppressed locally with |math/mathml/AF=false|. +% The mathml fragment will still be embedded in the PDF! +% +% % TODO: adapt test +% \end{description} +% +% \item[mathml structure elements] +% Mathml structure elements can be used in PDF~2.0 directly. +% In PDF~1.7. one could theoretically +% use them if one declares a role mapping first, +% (this can be done with \verb+\tagpdfsetup{role/mathml-tags}+) +% which maps all to \texttt{Span}. But such a role mapping currently breaks reading, +% e.g. in Adobe, and so it is not recommended. +% +% Automatic generation of structure elements is only possible with +% lualatex. It requires that the packages \pkg{luamml} and \pkg{tagpdf} +% have been loaded. +% \begin{description} +% \item[enabled by default?] false +% \item[enable/disable] \verb+\tagpdfsetup{math/mathml/structelem}+ +% (local setting, so can be used with grouping on individual equations). +% \item[consumer support] Needs more tests. +% \end{description} +% +% \end{description} +% +% +% % \section{Known current bugs, etc.} -% \car*{New Section, now with subsections.\\ -% As indicated, these lists are probably incomplete.\\ -% Some of these have been addressed in a more recent branch.} % % \subsection{Capture/grabbing problems} -% +% % \begin{enumerate} -% \item Incorrect grabbing of |$|-math when there is also -% explicit |$|-math within a \textit{text environment} +% \item Incorrect grabbing of |$|-math when there is also +% explicit |$|-math within a \textit{text environment} % that is itself within the math that should all be grabbed. % For example, % \begin{verbatim} % $a\begin{minipage}{1cm}$b$\end{minipage}$ % \end{verbatim} % would only result in the capture of the tokens -% ``\verb*/a\begin {minipage}{1cm}/''. +% ``\verb*/a\begin {minipage}{1cm}/''. % This can be avoided by an additional brace group: % \begin{verbatim} % $a{\begin{minipage}{1cm}$b$\end{minipage}}$ -% \end{verbatim} -% +% \end{verbatim} +% % \item Similar incorrect grabbing with |$$| also. -% +% % \item The grabbing, for all the display environments (and |\) \]|), needs -% to deal with nesting: \pkg{amsmath} contains code for this. -% -% \item The math can't contain verbatim and verbatim-like commands. This is +% to deal with nesting: \pkg{amsmath} contains code for this. +% +% \item The math can't contain verbatim and verbatim-like commands. This is % nothing new for the \pkg{amsmath} environments but changes |$| and |\[\]| -% and |equation*| (see e.g. tagging-project issue \#30). -% +% and |equation*| (see, e.g., tagging-project issue \#30). +% % \item Begin and end of the math or math environment can not be hidden in commands. -% For example \verb+>{$}l<{$}+ in a tabular would lead to errors. -% Defining |\[| to fall back to |equation*| doesn't work if |equation*| is +% For example \verb+>{$}l<{$}+ in a tabular would lead to errors. +% Defining |\[| to fall back to |equation*| doesn't work if |equation*| is % a grabbing environment. -% +% % \item The behaviour of |\[...\]| is faulty. See above. -% \end{enumerate} +% \end{enumerate} % % \subsection{Fake math} -% In a number of places in \LaTeX{} math commands (mainly |$|) is used -% only for technical reason, e.g. to access a math font, to setup a symbol -% or to use \cs{vcenter}. -% +% In a number of places in \LaTeX{} math commands (mainly |$|) is used +% only for technical reason, e.g., to access a math font, to setup a symbol +% or to use \cs{vcenter}. +% % The code identifies such fake math mostly by making use of the \cs{m@th} command % where two methods are used for the automatic detection: -% +% % \begin{itemize} -% \item After grabbing math content the code checks if the content contains the token +% \item After grabbing math content the code checks if the content contains the token % \cs{m@th} and if yes it doesn't call the processor before reinserting % the content and perhaps adding tagging code. % This method requires that the math can be grabbed (e.g. that the end dollar is visible) % and that the \cs{m@th} is visible. It applies for example in \cs{@iiiparbox} where the % code from |$\vcenter| to |\m@th$| is grabbed an put back. It does not work for % example for |tabular| where the dollars and the \cs{m@th} token are spread around -% over three commands. |tabular| needs therefore manual intervention. -% +% over three commands. |tabular| needs therefore manual intervention. +% % A look in the list of usages (in \texttt{usage-of-m@th.md}) justifies this approach. % All usages are either not math at all, or related to small elements that probably -% shouldn't be grabbed and processed on their own. +% shouldn't be grabbed and processed on their own. % % \item \cs{m@th} is redefined so that it sets the boolean \cs{l_@@_collected_bool} % to true. If \cs{m@th} is used inside math that has been grabbed % this doesn't change much as the boolean is set by the grabbing anyway. For usages % outside math the benefit is not so clear: The setting avoids that in \cs{LaTeXe} % the epsilon is processed as math, but it also prevents that the content of the amsmath -% command \cs{boxed} is processed as math. +% command \cs{boxed} is processed as math. % It means that if one wants to reenable math processing inside some (fake) math % one has to do it after \cs{m@th} calls. % \end{itemize} -% -% Open problems +% +% \subsubsection{Open problems} +% % \begin{enumerate} % \item The grabbing code doesn't pass the info that it detected a \cs{m@th} token. % This means that the tagging code has to do the same check (and doesn't do this % in all cases yet). -% -% \item Commands are missing to locally disable the grabbing and processing, e.g. +% +% \item Commands are missing to locally disable the grabbing and processing, e.g., % to handle |tabular|. -% +% % \item It must be checked if setting the boolean in \cs{m@th} really makes sense -% or if commands like \cs{LaTeXe} should be handled manually. -% +% or if commands like \cs{LaTeXe} should be handled manually. +% % \end{enumerate} -% +% % \subsection{Processor} -% +% % The grabbed math is at first passed to the processor. The processor is not called -% in a measuring phase (from the amsmath \cs{ifmeasuring@}) and if the \cs{m@th} -% token is detected. +% in a measuring phase (from the amsmath \cs{ifmeasuring@}) and if the \cs{m@th} +% token is detected. % It is not quite clear what purpose the processor has. As it is a public interface % it can't be used for internal code. And typesetting happens later and the processor % can't really change this. Currently it is mostly used for debugging and messages. % If the \cs{m@th} is found the \cs{l_@@_fakemath_bool} is set, so if the code % is changed this must be preserved. -% +% % \subsection{Other problems} -% -% \begin{enumerate} -% \item +% +% \begin{enumerate} +% \item % The presence of \cs{m@th} in association with \cs{ensuremath} -% does not necessarily indicate fakemath. This is because -% wanting mathsurround to be zero is very reasonable and common, +% does not necessarily indicate fakemath. This is because +% wanting mathsurround to be zero is very reasonable and common, % \emph{even when the math is genuine} (and hence needs to be collected). -% -% TODO: this claim needs some examples. -% -% \item User-defined environments can create problems; but this area, of -% new, copied and changed environments, has not yet been developed. -% +% +% TODO: this claim needs some examples. +% +% \item User-defined environments can create problems; but this area, of +% new, copied and changed environments, has not yet been developed. +% % \car*{Joseph wrote, inter alia:\\ % My thinking [regarding] \cs{RegisterMathEnvironment}\\ % - (New) Math environments should not be created-then-patched, but only -% generated by a [(future)] dedicated command (\cs{DeclareMathEnvironment}, +% generated by a [(future)] dedicated command (\cs{DeclareMathEnvironment}, % presumably)\\ % - Math environments created with \pkg{ltcmd} [commands] should not be copied, . . .\\ % - Package authors should be able to manually set up math environments with a public boolean.} -% \end{enumerate} +% \end{enumerate} % % % \subsection{Other ToDos} % % \begin{enumerate} -% \item Add (some of) the math display commands that were \enquote{lifted from +% \item Add (some of) the math display commands that were \enquote{lifted from % plain}, e.g., \cs{displaylines} \cs{eqalign}(??). % \item The breqn packages changes catcodes and that isn't yet covered % by our mechanism. % \item \cs{intertext} is not correctly taken into account by the -% code splitting multiline math into subformulas. +% code splitting multiline math into subformulas. % \end{enumerate} % % @@ -524,7 +666,7 @@ % neatly. % \begin{macrocode} \AddToHook{begindocument/before}{ \RequirePackage { amsmath } } -% \end{macrocode} +% \end{macrocode} % % % \subsection{Data structures} @@ -532,7 +674,7 @@ % \begin{variable}{\l_@@_collected_bool} % Tracks whether math mode material has been collected, which happens inside % \pkg{amsmath} environments as well as those handled directly here. -% If true following math will not grab and/or process. +% If true following math will not grab and/or process. % See \ref{sec:mathcapture} for details. % \begin{macrocode} \bool_new:N \l_@@_collected_bool @@ -541,7 +683,7 @@ % % \begin{variable}{\l_@@_fakemath_bool} % Tracks whether math mode material has been identified as fake math during -% the grabbing phase, which happens currently if the +% the grabbing phase, which happens currently if the % grabbed contents contains the \cs{m@th} token. % % \begin{macrocode} @@ -562,7 +704,7 @@ \tl_new:N \g_@@_grabbed_math_tl % \end{macrocode} % \end{variable} -% +% % \begin{variable}{\l_@@_tmpa_tl,\l_@@_tmpa_skip,\l_@@_tmpa_str} % Temporary variables % \begin{macrocode} @@ -575,8 +717,8 @@ % \begin{variable}{\l_@@_content_alt_tl, % \l_@@_content_actual_tl, % \l_@@_content_AF_tl} -% Temporary variables to hold math content that should -% be used in actual or alt text and stored as AF. +% Temporary variables to hold math content that should +% be used in actual or alt text and stored as AF. % \begin{macrocode} \tl_new:N \l_@@_content_alt_tl \tl_new:N \l_@@_content_actual_tl @@ -585,15 +727,15 @@ \tl_new:N \l_@@_content_AF_mathml_tl % \end{macrocode} % \end{variable} -% +% % \subsection{Tagging tools} -% The following commands implement small tagging code chunks. +% The following commands implement small tagging code chunks. % This should probably be collected and moved into tagpdf later. % \begin{macro}{\__tag_tool_close_P:} % This closes a P/text-chunk, both the MC and the structure and % increases the counter manually. % \begin{macrocode} -\cs_new_protected:Npn \__tag_tool_close_P: +\cs_new_protected:Npn \__tag_tool_close_P: { \tag_if_active:T { @@ -605,14 +747,14 @@ } % \end{macrocode} % \end{macro} -% -% We add also an attribute. -% \begin{macrocode} +% +% We add also an attribute. +% \begin{macrocode} \tl_new:N\l_@@_attribute_class_tl \tagpdfsetup {role/new-attribute = {inline} {/O /Layout /Placement/Inline}, role/new-attribute = {display} {/O /Layout /Placement/Block}, - } + } % \end{macrocode} % % \subsection{Code related to AF} @@ -640,7 +782,7 @@ \tl_gset:Nn\g__tag_math_luamml_tl {0} % \end{macrocode} % \end{variable} -% +% % \begin{variable}{ % \g_@@_mathml_total_int, % \g_@@_mathml_int, @@ -650,13 +792,13 @@ % } % \cs{g_@@_mml_total_int} records the mathml fragments read in. % \cs{g_@@_mml_int} records the mathml fragments read in with a different hash. -% \cs{g_@@_AF_total_int} records the number of math structures that try to -% attach a mathml AF. +% \cs{g_@@_AF_total_int} records the number of math structures that try to +% attach a mathml AF. % \cs{g_@@_AF_found_int} records the number of math structures for which a fitting -% mathml is found. +% mathml is found. % \cs{g_@@_AF_attached_int} records the number of math structures which got a mathml fragment % (if mathml-AF are not disabled locally this should be the equal to the previous number. -% +% % \begin{macrocode} \int_new:N\g_@@_mathml_total_int \int_new:N\g_@@_mathml_int @@ -668,15 +810,15 @@ % % \begin{variable}{\l__tag_math_mathml_files_clist} % A sequence to store the file list for the mathml. -% If luatex is detected with also check the luamml file. +% We also check the luamml file. % \begin{macrocode} \clist_new:N\l__tag_math_mathml_files_clist -\clist_put_right:Ne\l__tag_math_mathml_files_clist +\clist_put_right:Ne\l__tag_math_mathml_files_clist {\c_sys_jobname_str-mathml,\c_sys_jobname_str-luamml-mathml} % \end{macrocode} % \end{variable} - -% This is the internal variant of the \cs{mml} command. +% +% This is the internal variant of the \cs{mml} command. % \begin{macro}{\@@_AF_mml:nnnn} % \begin{macrocode} \cs_new_protected:Npn \@@_AF_mml:nnnn #1 #2 #3 #4 @@ -692,22 +834,22 @@ % \end{macrocode} % a simple Desc key, take care that it is a valid string! % \begin{macrocode} - \pdfdict_put:nne {l_pdffile/Filespec} {Desc}{(mathml-#1)} + \pdfdict_put:nne {l_pdffile/Filespec} {Desc}{(mathml-#1)} \pdffile_embed_stream:nnN {#4}{mathml-#1.xml}\l_@@_tmpa_tl % \end{macrocode} -% not strictly necessary but makes the files visible in the file attachment -% page +% not strictly necessary but makes the files visible in the file attachment +% page % \begin{macrocode} \bool_if:NT \l__tag_math_mathml_pane_bool {\pdfmanagement_add:nne {Catalog/Names}{EmbeddedFiles}{\l_@@_tmpa_tl}} \tl_new:c{g_@@_mathml_#3_tl} - \tl_gset_eq:cN{g_@@_mathml_#3_tl}\l_@@_tmpa_tl + \tl_gset_eq:cN{g_@@_mathml_#3_tl}\l_@@_tmpa_tl } - } + } % \end{macrocode} % \end{macro} % -% The html reader. +% The html reader. % \begin{macrocode} \cs_new_protected:Npn \@@_AF_html_reader:w#1</h2>#2<p>#3</p>#4<p>#5</p>#6<math{ \begingroup @@ -725,36 +867,36 @@ } % \end{macrocode} % -% As with luatex we write two files we define a few constants for +% As with luatex we write two files we define a few constants for % the shared texts. -% +% % \begin{macro} % {\c_@@_mathml_write_init_tl,\l_@@_mathml_write_before_tl, -% \c_@@_mathml_write_after_tl,\c_@@_mathml_write_final_tl} +% \c_@@_mathml_write_after_tl,\c_@@_mathml_write_final_tl} % \begin{macrocode} -\tl_const:Nn \c_@@_mathml_write_init_tl +\tl_const:Nn \c_@@_mathml_write_init_tl { <!DOCTYPE~html> \iow_newline: <html> \iow_newline: } -\tl_new:N \l_@@_mathml_write_before_tl -\tl_const:Nn \c_@@_mathml_write_after_tl +\tl_new:N \l_@@_mathml_write_before_tl +\tl_const:Nn \c_@@_mathml_write_after_tl { \iow_newline: </div> \iow_newline: - } -\tl_const:Nn \c_@@_mathml_write_final_tl + } +\tl_const:Nn \c_@@_mathml_write_final_tl { </html> - } + } % \end{macrocode} % \end{macro} % \begin{socketdecl}{tagsupport/math/mathml/write/prepare} -% To prepare the hash and the starting command we use a socket, so +% To prepare the hash and the starting command we use a socket, so % that both the dummy and luamml can make use of it. % \begin{macrocode} \socket_new:nn {tagsupport/math/mathml/write/prepare}{0} @@ -768,7 +910,7 @@ \str_set:NV\l_@@_tmpa_str\l_@@_content_AF_source_tl \str_replace_all:Nnn\l_@@_tmpa_str{&}{&} \str_replace_all:Nnn\l_@@_tmpa_str{<}{<} - \tl_set:Nn \l_@@_mathml_write_before_tl + \tl_set:Nn \l_@@_mathml_write_before_tl { <div> \iow_newline: @@ -778,39 +920,62 @@ \iow_newline: <p>\l_@@_content_hash_tl </p> \iow_newline: - } + } } % \end{macrocode} % \end{plugdecl} % -% With luatex we automatically generate mathml with luamml if the package -% can be loaded and unicode-math is detected. +% With luatex we automatically generate mathml with \pkg{luamml} if the package +% can be loaded and \pkg{unicode-math} is detected. % We start the process in the begindocument/end hook % so that the reading from a previous compilation can happen before! +% +% For other engines, for future name changes +% and in case luamml is not loaded we provide +% some commands % \begin{macrocode} -\sys_if_engine_luatex:T - { - \file_if_exist:nT { luamml.sty } +\cs_new_protected:Npn\@@_provide_luamml_commands: + { + \providecommand\luamml_flag_structelem:{} + \cs_if_free:NT \luamml_structelem: { - \RequirePackage { luamml } + \cs_set_eq:NN\luamml_structelem:\luamml_flag_structelem: + } + \providecommand\luamml_flag_process:{} + \cs_if_free:NT \luamml_process: + { + \cs_set_eq:NN\luamml_process:\luamml_flag_process: + } + \providecommand\luamml_flag_ignore:{} + \cs_if_free:NT \luamml_ignore: + { + \cs_set_eq:NN\luamml_ignore:\luamml_flag_ignore: + } + } +% \end{macrocode} +% \begin{macrocode} +\sys_if_engine_luatex:TF + { % \end{macrocode} -% Temporary (!) fixes for endarray +% Temporary (!) fixes for endarray % \begin{macrocode} + \cs_new_protected:Npn \@@_correct_luamml_array_patches: + { \AddToHook{package/array/after} { - \cs_set:Npn \endarray + \cs_set:Npn \endarray { \tbl_crcr:n{endarray} \__luamml_array_save_array: \egroup \UseTaggingSocket{tbl/finalize} - \tbl_restore_outer_cell_data: + \tbl_restore_outer_cell_data: \egroup \mode_if_math:T { \__luamml_array_finalize_array: } \@arrayright \gdef \@preamble {} } - \cs_set:Npn \@classz + \cs_set:Npn \@classz { \@classx \@tempcnta \count@ @@ -881,125 +1046,198 @@ \fi } \prepnext@tok - } - } -% \end{macrocode} -% -% \begin{macrocode} - \AddToHook{begindocument/end} - { - \str_case:on \g__tag_math_luamml_tl - { - { 1 } { - \@@_luamml_activate_write: - \msg_note:nnnn { tag } - { luamml-status }{ enabled }{ create } - } - {-1 } { - \msg_note:nnnn { tag } - { luamml-status }{ disabled }{ not~create } - } - { 0 } - { - \@ifpackageloaded { unicode-math } - { - \@@_luamml_activate_write: - \msg_note:nnnn { tag } - { luamml-status }{ enabled }{ create } + } + } + } +% \end{macrocode} +% +% \begin{macrocode} + \AddToHook{begindocument/before} + { + \str_case:on \g_@@_luamml_load_tl + { + { 1 } { + \RequirePackage { luamml } + \@@_correct_luamml_array_patches: + \AddToHook{begindocument/end} + { + \@@_luamml_activate_write: + } + } + {-1 } { + \AddToHook{begindocument/end} + { + \msg_note:nnnn { tag } + { luamml-status }{ disabled }{ not~create } + } + } + { 0 } + { + \@ifpackageloaded { unicode-math } + { + \RequirePackage { luamml } + \@@_correct_luamml_array_patches: + \AddToHook{begindocument/end} + { + \@@_luamml_activate_write: } - { \msg_warning:nn { tag }{ unicode-math-missing } } - } - } + } + { \msg_warning:nn { tag }{ unicode-math-missing } } + } } + \@@_provide_luamml_commands: } } -\msg_new:nnn { tag }{ luamml-status } + { + \@@_provide_luamml_commands: + } +\msg_new:nnn { tag }{ luamml-status } { luamml~has~been~#1~and~will~#2~an~MathML~file. - } - -\msg_new:nnn { tag }{ unicode-math-missing } + } + +\msg_new:nnn { tag }{ unicode-math-missing } { The~package~unicode-math~is~missing\\ luamml~will~not~create~an~MathML~file.\\ To~avoid~this~warning~load~unicode-math~\\ or~disable~luamml~with~\\ - \tl_to_str:n{\tagpdfsetup{math/mathml/luamml=false}}\\ + \tl_to_str:n{\tagpdfsetup{math/mathml/luamml/load=false}}\\ or~force~luamml~with~\\ - \tl_to_str:n{\tagpdfsetup{math/mathml/luamml=true}} - } + \tl_to_str:n{\tagpdfsetup{math/mathml/luamml/load=true}} + } \cs_new_protected:Npn \@@_luamml_activate_write: { + \bool_if:NT \g_@@_luamml_write_bool + { % \end{macrocode} % to avoid that nothing is written in the first run, we must activate the sockets: % \begin{macrocode} - \bool_gset_true:N\g__tag_math_mathml_AF_bool - \AssignSocketPlug{tagsupport/math/struct/begin}{test-mathml} - \AssignSocketPlug{tagsupport/math/struct/end}{test-mathml} - \AssignSocketPlug{tagsupport/math/substruct/begin}{single} - \AssignSocketPlug{tagsupport/math/substruct/end}{single} - \int_set:Nn \l__luamml_pretty_int { 5 } - \RegisterFamilyMapping\symsymbols{oms} - \RegisterFamilyMapping\symletters{oml} - \AssignSocketPlug{tagsupport/math/mathml/write/prepare}{On} - \iow_new:N \g_@@_luamml_iow - \iow_open:Nn \g_@@_luamml_iow {\c_sys_jobname_str-luamml-mathml.html} - \iow_now:Ne \g_@@_luamml_iow { \c_@@_mathml_write_init_tl } - \cs_new:Npn \@@_luamml_output_hook:n ##1 - { - \tl_if_empty:NF \l_@@_mathml_write_before_tl - { - \iow_now:Ne \g_@@_luamml_iow - { - \l_@@_mathml_write_before_tl - ##1 - \c_@@_mathml_write_after_tl - } - } + \bool_gset_true:N\g__tag_math_mathml_AF_bool + \AssignSocketPlug{tagsupport/math/struct/begin}{mathml-AF} + \AssignSocketPlug{tagsupport/math/struct/end}{mathml-AF} + \AssignSocketPlug{tagsupport/math/substruct/begin}{single} + \AssignSocketPlug{tagsupport/math/substruct/end}{single} + \int_set:Nn \l__luamml_pretty_int { 7 } + \RegisterFamilyMapping\symsymbols{oms} + \RegisterFamilyMapping\symletters{oml} + \AssignSocketPlug{tagsupport/math/mathml/write/prepare}{On} + \iow_new:N \g_@@_luamml_iow + \iow_open:Nn \g_@@_luamml_iow {\c_sys_jobname_str-luamml-mathml.html} + \iow_now:Ne \g_@@_luamml_iow { \c_@@_mathml_write_init_tl } + \cs_new:Npn \@@_luamml_output_hook:n ##1 + { + \tl_if_empty:NF \l_@@_mathml_write_before_tl + { + \iow_now:Ne \g_@@_luamml_iow + { + \l_@@_mathml_write_before_tl + ##1 + \c_@@_mathml_write_after_tl + } + } + } + \__luamml_register_output_hook:N \@@_luamml_output_hook:n +% \end{macrocode} +% At the end of the document we must finish and close the file: +% \begin{macrocode} + \AddToHook{enddocument/afterlastpage} + { + \iow_now:Ne \g_@@_luamml_iow + { \c_@@_mathml_write_final_tl } + \iow_close:N \g_@@_luamml_iow + } + \msg_note:nnnn { tag } + { luamml-status }{ enabled }{ create } } - \__luamml_register_output_hook:N \@@_luamml_output_hook:n + } % \end{macrocode} -% this starts the process and set flag to 3, -% not really needed, as it is the default but set here for clarity: +% And now keys to activate/deactivate luamml feature +% \begin{variable}{\g_@@_luamml_load_tl} +% This variable will be used to suppress the loading of luamml +% altogether. % \begin{macrocode} - \luamml_flag_process: +\tl_new:N \g_@@_luamml_load_tl +\tl_gset:Nn \g_@@_luamml_load_tl {0} % \end{macrocode} -% At the end of the document we must finish and close the file: +% \end{variable} +% \begin{variable}{\g_@@_luamml_write_bool} +% This variable decides if luamml writes a mathml +% altogether. % \begin{macrocode} - \AddToHook{enddocument/afterlastpage} - { - \iow_now:Ne \g_@@_luamml_iow - { \c_@@_mathml_write_final_tl } - \iow_close:N \g_@@_luamml_iow - } - } +\bool_new:N \g_@@_luamml_write_bool +\bool_gset_true:N \g_@@_luamml_write_bool % \end{macrocode} -% And now a key to deactivate luamml +% \end{variable} +% % \begin{macrocode} - +\msg_new:nnn { tag }{ PDF-2.0-recommended } + { + The~key~#1~will~not~work~properly~with~PDF~#2.\\ + Switching~to~PDF~2.0~is~recommended. + } \keys_define:nn { __tag / setup } { - math/mathml/luamml .choice: , - math/mathml/luamml/true .code:n = {\tl_gset:Nn \g__tag_math_luamml_tl{1}}, - math/mathml/luamml/false .code:n = {\tl_gset:Nn \g__tag_math_luamml_tl{-1}}, - math/mathml/luamml .default:n = true, - math/mathml/luamml .usage:n=preamble +% \end{macrocode} +% At first a key to suppress the loading altogether +% \begin{macrocode} + math/mathml/luamml/load .choice: , + math/mathml/luamml/load/true .code:n = {\tl_gset:Nn \g_@@_luamml_load_tl{1}}, + math/mathml/luamml/load/false .code:n = {\tl_gset:Nn \g_@@_luamml_load_tl{-1}}, + math/mathml/luamml/load .default:n = true, + math/mathml/luamml/load .usage:n=preamble, +% \end{macrocode} +% A key to activate math structure elements. It shouldn't +% be issued in the preamble as luamml is not yet loaded. +% \begin{macrocode} + math/mathml/structelem .code:n = + { + \pdf_version_compare:NnT < {2.0} + { + \msg_warning:nnne { tag }{ PDF-2.0-recommended } + { math/mathml/structelem }{ \pdf_version: } + } + \AddToHook{begindocument/end}{\luamml_structelem:} + }, +% \end{macrocode} +% and a key to call the ignore flag. This should only be used locally. +% \begin{macrocode} + math/mathml/ignore .code:n = {\luamml_ignore:}, +% \end{macrocode} +% \begin{macrocode} + math/mathml/luamml/write .choice:, + math/mathml/luamml/write/true .code:n = + { + \tl_gset:Nn \g_@@_luamml_load_tl{1} + \bool_gset_true:N \g_@@_luamml_write_bool + }, + math/mathml/luamml/write/false .code:n = + { + \bool_gset_false:N \g_@@_luamml_write_bool + }, + math/mathml/luamml/write .default:n = true, + math/mathml/luamml/write .usage:n=preamble, +% \end{macrocode} +% alias keys for compatibility +% \begin{macrocode} + math/mathml/luamml .bool_gset:N = \g_@@_luamml_write_bool, + math/mathml/luamml .usage:n=preamble } % \end{macrocode} % \begin{socketdecl}{tagsupport/math/mathml/write} % This writes a html-dummy with the hash and the math content. % This should be optional, so it uses a socket that can be disabled -% +% % \begin{macrocode} \socket_new:nn {tagsupport/math/mathml/write}{0} % \end{macrocode} % \end{socketdecl} -% +% % \begin{plugdecl}{On} % \begin{macrocode} \socket_new_plug:nnn{tagsupport/math/mathml/write}{On} { - \iow_now:Ne \g_@@_writedummy_iow + \iow_now:Ne \g_@@_writedummy_iow { \l_@@_mathml_write_before_tl <math></math> @@ -1013,32 +1251,32 @@ \keys_define:nn { __tag / setup } { - math/mathml/write-dummy .code:n = + math/mathml/write-dummy .code:n = { \bool_gset_true:N \g__tag_math_mathml_AF_bool - \tl_if_exist:NF\g_@@_writedummy_iow + \tl_if_exist:NF\g_@@_writedummy_iow { \iow_new:N \g_@@_writedummy_iow - \iow_open:Nn \g_@@_writedummy_iow - { + \iow_open:Nn \g_@@_writedummy_iow + { \c_sys_jobname_str-mathml-dummy.html } \iow_now:Ne \g_@@_writedummy_iow { \c_@@_mathml_write_init_tl } - \AssignSocketPlug {tagsupport/math/mathml/write/prepare}{On} + \AssignSocketPlug {tagsupport/math/mathml/write/prepare}{On} \AssignSocketPlug {tagsupport/math/mathml/write}{On} \AddToHook{enddocument/afterlastpage} { - \iow_now:Ne \g_@@_writedummy_iow + \iow_now:Ne \g_@@_writedummy_iow { \c_@@_mathml_write_final_tl } \iow_close:N \g_@@_writedummy_iow } - } + } }, - math/mathml/write-dummy .usage:n=preamble - } + math/mathml/write-dummy .usage:n=preamble + } % \end{macrocode} % % \begin{macro}{\@@_AF_process_mathml_files:} @@ -1049,9 +1287,9 @@ \hbox_set:Nn \l_@@_tmpa_box { \pdfdict_put:nnn { l_pdffile/Filespec }{AFRelationship} { /Supplement } - \pdfdict_put:nne - { l_pdffile }{Subtype} - { \pdf_name_from_unicode_e:n{application/mathml+xml} } + \pdfdict_put:nne + { l_pdffile }{Subtype} + { \pdf_name_from_unicode_e:n{application/mathml+xml} } \char_set_catcode_other:N \# \cs_set_eq:NN\mml \@@_AF_html_reader:w \clist_map_inline:Nn \l__tag_math_mathml_files_clist @@ -1065,13 +1303,13 @@ { \typeout{Info:~mathml~file~##1~does~not~exist}%info message } - } + } } \bool_if:NT\g__tag_math_mathml_AF_bool { \typeout{Info:~Activating~mathml~support} - \AssignSocketPlug{tagsupport/math/struct/begin}{test-mathml} - \AssignSocketPlug{tagsupport/math/struct/end}{test-mathml} + \AssignSocketPlug{tagsupport/math/struct/begin}{mathml-AF} + \AssignSocketPlug{tagsupport/math/struct/end}{mathml-AF} % \end{macrocode} % mathml handling doesn't like subparts, so we disable them for now: % \begin{macrocode} @@ -1081,29 +1319,29 @@ { \iow_term:n{MathML~statistic} \iow_term:n{================} - \iow_term:e{==>~\int_use:N\g_@@_mathml_total_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_mathml_total_int\c_space_tl MathML~fragments~read} - \iow_term:e{==>~\int_use:N\g_@@_mathml_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_mathml_int\c_space_tl different~MathML~fragments} - \iow_term:e{==>~\int_use:N\g_@@_math_total_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_math_total_int\c_space_tl math~fragments~found} - \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_found_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_found_int\c_space_tl fitting~MathML~AF~found} - \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_attached_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_attached_int\c_space_tl MathML~AF~attached} } - } + } } -\AddToHook{begindocument}{\@@_AF_process_mathml_files:} +\AddToHook{begindocument}{\@@_AF_process_mathml_files:} % \end{macrocode} % \end{macro} -% +% % \subsection{Mathstyle detection} % In some cases we need to detect the mathstyle used in a \cs{mathchoice} -% command and to disable/enable tagging in the unused branches. +% command and to disable/enable tagging in the unused branches. % This is currently only used in the amstext command \cs{text} % but is perhaps also needed in other cases, so we create a general command. -% +% %\begin{macro}{\l_@@_mathstyle_int,\g_@@_mathchoice_int,mathstyle} % \begin{macrocode} \int_new:N \l_@@_mathstyle_int @@ -1114,12 +1352,12 @@ % For now internal, but perhaps will need a public version. % The command should be used in every branch of a \cs{mathchoice} % (with the correct mathstyle number) and with an unique label (which should -% be the same in every branch). -% \cs{g_@@_mathchoice_int} can be e.g. increased before the mathchoice and +% be the same in every branch). +% \cs{g_@@_mathchoice_int} can be, e.g., increased before the mathchoice and % then used. % \begin{macro}{\@@_tag_if_mathstyle:nn} % \begin{macrocode} -\cs_new_protected:Npn \@@_tag_if_mathstyle:nn #1 #2 +\cs_new_protected:Npn \@@_tag_if_mathstyle:nn #1 #2 %#1 refers to label %#2 is a number for the mathstyle (typically 0,2,4,6) { @@ -1128,29 +1366,50 @@ \int_compare:nNnTF { \property_ref:nn {#1}{ mathstyle} } = { #2 } { \tag_resume:n{\mathchoice} }{ \tag_suspend:n{\mathchoice} } } -\cs_generate_variant:Nn \@@_tag_if_mathstyle:nn {en} +\cs_generate_variant:Nn \@@_tag_if_mathstyle:nn {en} % \end{macrocode} % \end{macro} -% +% % \subsection{Tagging options} % \begin{macrocode} \keys_define:nn { __tag / setup } { math/mathml/sources .clist_set:N = \l__tag_math_mathml_files_clist, - math/alt/use .bool_set:N = \l__tag_math_alt_bool, + math/alt/use .bool_set:N = \l__tag_math_alt_bool, viewer/pane/mathml .bool_set:N = \l__tag_math_mathml_pane_bool, viewer/pane/mathml .initial:n = true, - viewer/pane/mathsource .bool_set:N = \l__tag_math_texsource_pane_bool, + viewer/pane/mathsource .bool_set:N = \l__tag_math_texsource_pane_bool, math/mathml/AF .bool_set:N = \l__tag_math_mathml_AF_bool, math/mathml/AF .initial:n = true, math/tex/AF .bool_set:N = \l__tag_math_texsource_AF_bool, math/tex/AF .initial:n = true - } + } +% \end{macrocode} +% alt is required for pdf/UA-1. +% TODO: l3pdfmeta should support this test. +% \begin{macrocode} +\AddToHook{begindocument/end} + { + \str_if_eq:eeT + {1} + { + \exp_last_unbraced:Ne\use_i:nn + {\GetDocumentProperties{document/pdfstandard-UA}} + \c_empty_tl\c_empty_tl + } + { + \bool_if:NF \l__tag_math_alt_bool + { + \typeout{PDF/UA-1~detected.~Enabling~alt~text~on~Formula} + } + \bool_set_true:N\l__tag_math_alt_bool + } + } % \end{macrocode} % % \subsection{Sockets} % \subsubsection{Main inline math sockets} -% +% % \begin{socketdecl} % { % tagsupport/math/inline/begin, @@ -1159,11 +1418,11 @@ % tagsupport/math/inline/formula/end, % } % The first two sockets are meant to embed inline -% math into the surrounding (so to close/reopen e.g. MC-chunks). -% The other two implement the actual formula structure. +% math into the surrounding (so to close/reopen, e.g., MC-chunks). +% The other two implement the actual formula structure. % The formula sockets are despite their naming not symmetric: -% the begin socket is issued after the math has started, while -% the end socket is after the math! +% the begin socket is issued after the math has started, while +% the end socket is after the math! % \begin{macrocode} \socket_new:nn {tagsupport/math/inline/begin}{0} \socket_new:nn {tagsupport/math/inline/end}{0} @@ -1171,8 +1430,8 @@ \socket_new:nn {tagsupport/math/inline/formula/end}{0} % \end{macrocode} %\end{socketdecl} -% -% +% +% % \begin{plugdecl}{MC} % \begin{macrocode} \socket_new_plug:nnn @@ -1182,10 +1441,10 @@ \socket_new_plug:nnn {tagsupport/math/inline/end} {MC} - {\tag_mc_begin_pop:n{}} + {\tag_mc_begin_pop:n{}} % \end{macrocode} % \end{plugdecl} -% +% % We probably will want to test different tagging recipes. % \begin{plugdecl}{default} % \begin{macrocode} @@ -1195,7 +1454,7 @@ % \end{macrocode} % \changes{v0.6g}{2024-10-02}{disable paratagging, issue \#711} % \begin{macrocode} - { \tagpdfparaOff + { \tagpdfparaOff \tag_socket_use:n{math/content} \tag_socket_use:n{math/struct/begin} % \end{macrocode} @@ -1209,15 +1468,15 @@ \socket_new_plug:nnn {tagsupport/math/inline/formula/end} {default} - { + { \socket_use:n{tagsupport/math/substruct/end} \socket_use:n{tagsupport/math/struct/end} - } + } % \end{macrocode} % \end{plugdecl} -% +% % \subsubsection{Main display math sockets} -% +% % \begin{socketdecl} % { % tagsupport/math/display/begin, @@ -1226,15 +1485,15 @@ % tagsupport/math/display/formula/end, % } % The first two sockets are meant to embed display -% math into the surrounding (so to close/reopen e.g. MC-chunks and +% math into the surrounding (so to close/reopen, e.g., MC-chunks and % P-structure). -% The other two implement the actual formula structure. +% The other two implement the actual formula structure. % The formula sockets are despite their naming not symmetric: -% the begin socket is issued after the math has started, while -% the end socket is after the math! +% the begin socket is issued after the math has started, while +% the end socket is after the math! % The socket |tagsupport/math/display/formula/begin| should similar to % the inline version not be used as tagging socket so that the argument, the math, -% is not lost. +% is not lost. % \begin{macrocode} \socket_new:nn {tagsupport/math/display/begin}{0} \socket_new:nn {tagsupport/math/display/end}{0} @@ -1253,7 +1512,7 @@ {tagsupport/math/display/end} {default} { - } + } % \end{macrocode} % \end{plugdecl} @@ -1263,25 +1522,25 @@ \socket_new_plug:nnn {tagsupport/math/display/formula/begin} {default} - { + { \tag_socket_use:n{math/content} \tag_socket_use:n{math/struct/begin} \tag_socket_use:n{math/substruct/begin} - #1 + #1 \tag_socket_use:n{math/end} } \socket_new_plug:nnn {tagsupport/math/display/formula/end} {default} - { + { \socket_use:n{tagsupport/math/substruct/end} \socket_use:n{tagsupport/math/struct/end} - } + } % \end{macrocode} % \end{plugdecl} % % \subsubsection{Internal sockets} -% +% % \begin{variable}{\l_@@_content_template_tl} % The default text used as alt or actual text. % \begin{macrocode} @@ -1295,7 +1554,7 @@ \c_space_tl \exp_not:N\end{\g_@@_grabbed_env_tl} \c_space_tl LaTeX~ formula~ ends~ - } + } % \end{macrocode} % \end{variable} @@ -1305,7 +1564,7 @@ \tl_new:N\l_@@_texsource_template_tl \tl_const:Nn\c_@@_inline_env_tl {math} \tl_set:Nn \l_@@_texsource_template_tl - { + { \tl_if_eq:NNTF\g_@@_grabbed_env_tl\c_@@_inline_env_tl { $ @@ -1316,29 +1575,29 @@ \exp_not:N\begin{\g_@@_grabbed_env_tl} \exp_not:V\g_@@_grabbed_math_tl \exp_not:N\end{\g_@@_grabbed_env_tl} - } - } + } + } % \end{macrocode} % \end{variable} -% +% % \begin{socketdecl}{tagsupport/math/content} -% The math content is stored in associated files and used for +% The math content is stored in associated files and used for % actual and alternative text. As the exact text is still % unclear we use a socket to be able to test variants. % The socket should set all four tl vars above, if needed -% to identical values. It can use the two variables +% to identical values. It can use the two variables % \cs{g_@@_grabbed_env_tl} and \cs{g_@@_grabbed_math_tl} % \begin{macrocode} \socket_new:nn {tagsupport/math/content}{0} % \end{macrocode} % \end{socketdecl} -% +% % Some default sockets to set the contents. -% TODO: think about naming convention. +% TODO: think about naming convention. % TODO: think how this should organized so that one % has options to change from the outside and so that -% there are less repetitions. +% there are less repetitions. % \begin{plugdecl}{actual+source} % \begin{macrocode} \socket_new_plug:nnn @@ -1348,17 +1607,17 @@ \tl_set:Ne\l_@@_content_actual_tl { \l_@@_content_template_tl - } - \tl_set:Ne \l_@@_content_AF_source_tl + } + \tl_set:Ne \l_@@_content_AF_source_tl { \l_@@_texsource_template_tl - } + } \tl_set:Nn \l_@@_content_AF_mathml_tl {} \tl_set:Nn \l_@@_content_alt_tl {} } % \end{macrocode} -% \end{plugdecl} -% +% \end{plugdecl} +% % \begin{plugdecl}{alt+source} % \begin{macrocode} \socket_new_plug:nnn @@ -1368,26 +1627,26 @@ \tl_set:Ne\l_@@_content_alt_tl { \l_@@_content_template_tl - } - \tl_set:Ne \l_@@_content_AF_source_tl + } + \tl_set:Ne \l_@@_content_AF_source_tl { \l_@@_texsource_template_tl - } + } \tl_set:Nn \l_@@_content_AF_mathml_tl {} \tl_set:Nn \l_@@_content_actual_tl {} } % \end{macrocode} % \end{plugdecl} % \begin{macrocode} -\socket_assign_plug:nn {tagsupport/math/content}{alt+source} +\socket_assign_plug:nn {tagsupport/math/content}{alt+source} % \end{macrocode} % % \begin{socketdecl}{tagsupport/math/struct/begin, % tagsupport/math/struct/end} -% For the main structure we use a socket too. -% This allow e.g. to create a special one for luamml -% which setups additional objects. -% The begin socket can use the two variables +% For the main structure we use a socket too. +% This allows, e.g., to create a special one for luamml +% which setups additional objects. +% The begin socket can use the two variables % \cs{g_@@_grabbed_env_tl} and \cs{g_@@_grabbed_math_tl} % \begin{macrocode} \socket_new:nn {tagsupport/math/struct/begin}{0} @@ -1402,12 +1661,22 @@ {tagsupport/math/struct/begin} {default} { - \bool_if:NTF\l__tag_math_texsource_AF_bool + \bool_if:NTF\l__tag_math_texsource_AF_bool { \tl_set_eq:NN \l_@@_content_AF_source_tmpa_tl \l_@@_content_AF_source_tl } { \tl_clear:N \l_@@_content_AF_source_tmpa_tl } + \tl_if_eq:NnTF\g_@@_grabbed_env_tl {math} + { + \tl_set:Nn\l_@@_attribute_class_tl{inline} + } + { + \tl_set:Nn\l_@@_attribute_class_tl{display} + } + \bool_if:NF\l__tag_math_alt_bool + { \tl_set:Nn \l_@@_content_alt_tl{} } \tag_struct_begin:n { tag=Formula, + attribute-class=\l_@@_attribute_class_tl, texsource = \l_@@_content_AF_source_tmpa_tl, title-o = \g_@@_grabbed_env_tl, actualtext = \l_@@_content_actual_tl, @@ -1418,19 +1687,18 @@ {tagsupport/math/struct/end} {default} { \tag_struct_end: } - -\socket_assign_plug:nn {tagsupport/math/struct/begin}{default} -\socket_assign_plug:nn {tagsupport/math/struct/end}{default} -% \end{macrocode} -% \end{plugdecl} -% -% \begin{plugdecl}{test-mathml} -% This (test-)socket tries to add a mathml-AF to formula. -% It is activated if a mathml.html has been found and loaded. -% Additionally it also sets an attribute -% (this can perhaps be done by default anyway.) -% As it disturbs the reading of the AF it currently deactivates the /Alt key, -% unless it has been reenabled with |math/alt/use=true| + +\socket_assign_plug:nn {tagsupport/math/struct/begin}{default} +\socket_assign_plug:nn {tagsupport/math/struct/end}{default} +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{mathml-AF} +% This socket tries to add a mathml-AF to formula. +% It is activated if a mathml.html has been found and loaded. +% As it disturbs the reading of the AF +% it currently deactivates the /Alt key, +% unless it has been reenabled with |math/alt/use=true| % \begin{macrocode} \cs_generate_variant:Nn \str_mdfive_hash:n {o} \tl_new:N\l_@@_content_hash_tl @@ -1443,49 +1711,52 @@ % \begin{macrocode} \socket_new_plug:nnn {tagsupport/math/struct/begin} - {test-mathml} - { - \int_gincr:N\g_@@_math_total_int - \tl_set:Ne\l_@@_content_hash_tl - {\str_mdfive_hash:o { \l_@@_content_AF_source_tl }} - \tl_set_eq:NN\l_@@_grabbed_math_tl\g_@@_grabbed_math_tl + {mathml-AF} + { + \int_gincr:N\g_@@_math_total_int + \tl_set:Ne\l_@@_content_hash_tl + {\str_mdfive_hash:o { \l_@@_content_AF_source_tl }} + \tl_set_eq:NN\l_@@_grabbed_math_tl\g_@@_grabbed_math_tl \tl_if_eq:NnTF\g_@@_grabbed_env_tl {math} { - \tl_set:Nn\l_@@_attribute_class_tl{inline} + \tl_set:Nn\l_@@_attribute_class_tl{inline} } { \tl_set:Nn\l_@@_attribute_class_tl{display} } \bool_if:NF\l__tag_math_alt_bool - { \tl_set:Nn \l_@@_content_alt_tl{} } + { \tl_set:Nn \l_@@_content_alt_tl{} } % \end{macrocode} % debugging option. TODO: hide in debug key. % \begin{macrocode} \tl_if_exist:cTF { g_@@_mathml_ \l_@@_content_hash_tl _tl } - { - \int_gincr:N\g_@@_mathml_AF_found_int - \bool_if:NTF \l__tag_math_mathml_AF_bool - { - \int_gincr:N\g_@@_mathml_AF_attached_int - \typeout {Inserting~mathml~with~Hash~\l_@@_content_hash_tl} - } - { - \typeout {Ignoring~mathml~with~Hash~\l_@@_content_hash_tl} - } - } - { - \typeout{WARNING:~mathml~missing~for~hash~\l_@@_content_hash_tl} - } - \socket_use:n {tagsupport/math/mathml/write/prepare} - \socket_use:n {tagsupport/math/mathml/write} % write hash if request - \bool_if:NTF\l__tag_math_texsource_AF_bool + { + \int_gincr:N\g_@@_mathml_AF_found_int + \bool_if:NTF \l__tag_math_mathml_AF_bool + { + \int_gincr:N\g_@@_mathml_AF_attached_int + \typeout {Inserting~mathml~with~Hash~\l_@@_content_hash_tl} + } + { + \typeout {Ignoring~mathml~with~Hash~\l_@@_content_hash_tl} + } + } + { + \bool_if:NT \l__tag_math_mathml_AF_bool + { + \typeout {WARNING:~mathml~missing~for~hash~\l_@@_content_hash_tl} + } + } + \socket_use:n {tagsupport/math/mathml/write/prepare} + \socket_use:n {tagsupport/math/mathml/write} % write hash if request + \bool_if:NTF\l__tag_math_texsource_AF_bool { \tl_set_eq:NN \l_@@_content_AF_source_tmpa_tl \l_@@_content_AF_source_tl } - { \tl_clear:N \l_@@_content_AF_source_tmpa_tl } + { \tl_clear:N \l_@@_content_AF_source_tmpa_tl } \tag_struct_begin:n { tag=Formula, attribute-class=\l_@@_attribute_class_tl, % - AFref = + AFref = \bool_if:NT\l__tag_math_mathml_AF_bool { \cs_if_exist_use:c {g_@@_mathml_ \l_@@_content_hash_tl _tl} @@ -1500,13 +1771,13 @@ % \begin{macrocode} \socket_new_plug:nnn {tagsupport/math/struct/end} - {test-mathml} + {mathml-AF} { \tag_struct_end: - } + } % \end{macrocode} % \end{plugdecl} -% +% % \begin{socketdecl}{tagsupport/math/substruct/begin, % tagsupport/math/substruct/end} % This holds the code to handle subparts of the formula. @@ -1515,7 +1786,7 @@ \socket_new:nn {tagsupport/math/substruct/end}{0} % \end{macrocode} % \end{socketdecl} -% +% % \begin{plugdecl}{default} % \begin{macrocode} \socket_new_plug:nnn @@ -1525,16 +1796,16 @@ \socket_new_plug:nnn {tagsupport/math/substruct/end} {default} - { + { \tagmcend \if@subformulas \tagstructend \fi - } -\socket_assign_plug:nn {tagsupport/math/substruct/begin}{default} -\socket_assign_plug:nn {tagsupport/math/substruct/end}{default} -% \end{macrocode} -% \end{plugdecl} + } +\socket_assign_plug:nn {tagsupport/math/substruct/begin}{default} +\socket_assign_plug:nn {tagsupport/math/substruct/end}{default} +% \end{macrocode} +% \end{plugdecl} % \begin{plugdecl}{single} % We need an option to disable subparts as it is unclear @@ -1546,7 +1817,7 @@ { \typeout{====>subpart~splitting~deactivated} \typeout{====>grabbed~math=\meaning\g_@@_grabbed_math_tl} - \tag_mc_begin:n{} + \tag_mc_begin:n{} } \socket_new_plug:nnn {tagsupport/math/substruct/end} @@ -1554,21 +1825,21 @@ { \tag_mc_end:} % \end{macrocode} % \end{plugdecl} -% +% % \begin{socketdecl}{tagsupport/math/end} % A socket used at the end of the math (before the closing dollar(s)) -% which can e.g. set a flag for luamml. +% which can, e.g., set a flag for luamml. % \begin{macrocode} \socket_new:nn {tagsupport/math/end}{0} % \end{macrocode} % \end{socketdecl} - -% + +% % \begin{macro}{\__tag_math_disable:} % Similar to the table code we collect the plugs that should be % assigned to do nothing if we don't want tagging % \begin{macrocode} -\cs_new_protected:Npn \__tag_math_disable: +\cs_new_protected:Npn \__tag_math_disable: { \socket_assign_plug:nn {tagsupport/math/inline/begin}{noop} \socket_assign_plug:nn {tagsupport/math/inline/end}{noop} @@ -1577,16 +1848,16 @@ \socket_assign_plug:nn {tagsupport/math/display/begin}{noop} \socket_assign_plug:nn {tagsupport/math/display/end}{noop} \socket_assign_plug:nn {tagsupport/math/display/formula/begin}{identity} - \socket_assign_plug:nn {tagsupport/math/display/formula/end}{noop} - } + \socket_assign_plug:nn {tagsupport/math/display/formula/end}{noop} + } % \end{macrocode} % \end{macro} -% +% % \begin{macro}{\__tag_math_enable:} % Similar to the table code we collect the default plugs that should be % assigned if we want tagging % \begin{macrocode} -\cs_new_protected:Npn \__tag_math_enable: +\cs_new_protected:Npn \__tag_math_enable: { \socket_assign_plug:nn {tagsupport/math/inline/begin}{MC} \socket_assign_plug:nn {tagsupport/math/inline/end}{MC} @@ -1596,7 +1867,7 @@ \socket_assign_plug:nn {tagsupport/math/display/end}{default} \socket_assign_plug:nn {tagsupport/math/display/formula/begin}{default} \socket_assign_plug:nn {tagsupport/math/display/formula/end}{default} - } + } % \end{macrocode} % \end{macro} % At begin document we can activate: @@ -1667,7 +1938,7 @@ % We do not want math tagging in fakemath or when measuring, % We also do not want math tagging if tagging has been suspended. % \begin{macrocode} - \bool_lazy_any:nTF + \bool_lazy_any:nTF { {\legacy_if_p:n { measuring@ }} { \l_@@_fakemath_bool } @@ -1677,7 +1948,7 @@ #1 $ % $ } { - \tag_socket_use:n {math/inline/begin} %end P-MC + \tag_socket_use:n {math/inline/begin} %end P-MC % \end{macrocode} % We do no use a tagging socket here, so that the argument (the % math) is not lost, tagging-project issue 661. @@ -1700,7 +1971,7 @@ { \@@_grab_dollar:n {#1} } % \end{macrocode} % \end{macro} -% +% % \begin{macro}{\@@_grab_dollardollar:w} % And for the classical \TeX{} display structure. % \begin{macrocode} @@ -1716,11 +1987,11 @@ $$ } % \end{macrocode} -% +% % The end code is added through a \cs{aftergroup} so we % store it inside a command. % \begin{macrocode} -\cs_new_protected:Npn \@@_tag_dollardollar_display_end: +\cs_new_protected:Npn \@@_tag_dollardollar_display_end: { % \typeout{== tag dollarldollar display end} % \ShowTagging{struct-stack} @@ -2126,7 +2397,7 @@ } { % \typeout{==>A3} - \__tag_tool_close_P: + \__tag_tool_close_P: } \socket_use:nn{tagsupport/math/display/formula/begin}{} \tagpdfparaOff @@ -2144,7 +2415,7 @@ \cs_new_protected:Npn \math_register_env:n #1 { \math_register_env:nn {#1} { } } - + \NewDocumentCommand \RegisterMathEnvironment { O{} m } { \math_register_env:nn {#2} {#1} } % \end{macrocode} @@ -2231,7 +2502,7 @@ { \cs_gset_protected:Npn \[ % \] { - \@@_grab_eqn:w + \@@_grab_eqn:w % \bool_if:NTF \l_@@_collected_bool % { \begin { equation* } } % { \@@_grab_eqn:w } @@ -2329,7 +2600,7 @@ % \end{macrocode} % % Tabulars currently contain a \$ that shouldn't trigger math -% tagging. +% tagging. % \begin{macrocode} \RequirePackage{array} \tl_if_in:NnT\@tabular{$} @@ -2338,7 +2609,7 @@ \leavevmode \UseTaggingSocket{tbl/hmode/begin}% \hbox \bgroup - \bool_set_true:N \l_@@_collected_bool + \bool_set_true:N \l_@@_collected_bool $ \bool_set_false:N \l_@@_collected_bool \col@sep\tabcolsep \let\d@llarbegin\begingroup @@ -2363,10 +2634,10 @@ } % \end{macrocode} % \end{macro} -% +% % \subsection{Disable math grabbing in the begindocument hook} % For example amsart uses math to measure text there. -% +% % \begin{macrocode} \tl_gput_right:Nn\@kernel@before@begindocument { @@ -2490,7 +2761,7 @@ \math_register_halign_env:nn {align}{} \math_register_halign_env:nn {align*}{} \math_register_halign_env:nn {alignat}{} - \math_register_halign_env:nn {alignat*}{} + \math_register_halign_env:nn {alignat*}{} \math_register_halign_env:nn {flalign}{} \math_register_halign_env:nn {flalign*}{} \math_register_halign_env:nn {gather}{} @@ -2571,8 +2842,8 @@ % % \begin{macro}{\@@_split_at_nl:NN} -% This splits grabbed math at newlines. -% +% This splits grabbed math at newlines. +% % \begin{macrocode} \cs_new:Npn \@@_split_at_nl:NN #1#2 { \tl_set:Nf \l_@@_tmpa_tl { @@ -2591,14 +2862,14 @@ #2 \\ #3 \s_stop } } - + \cs_new_protected:Npn \@@_split_at_nl_aux:nnNN #1 #2 #3 #4 { \tl_gset:Nn #4 {#1} \tl_gset:Nn #3 {#2} } -\cs_new:Npn \@@_split_chk_if_begin:ww +\cs_new:Npn \@@_split_chk_if_begin:ww #1 \begin #2 #3 \s_mark #4 \\ \q_nil \\ \s_stop { \quark_if_nil:nTF {#2} @@ -2649,11 +2920,11 @@ { \exp_end: { #4 #1 } } { \@@_split_final_cleanup:w #3 \s_mark { #4 #1 #2 } } } - + \cs_new:Npn \@@_split:n #1 { \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop } - -% this looks unused. + +% this looks unused. %\NewDocumentCommand \splitnl { mm +m } % { % \tl_set:Nf \l_@@_tmpa_tl { \split:n {#3} } @@ -2665,12 +2936,12 @@ % % % \begin{macro}{\maybestartnewformulatag} -% +% % \begin{macrocode} \newif\if@subformulas -\tl_new:N \result - +\tl_new:N \result + \cs_new_protected:Npn\grabaformulapartandstart { \@@_split_at_nl:NN \g_@@_grabbed_math_tl \result \typeout{====>first-result=\meaning\result} @@ -2690,7 +2961,7 @@ % but we add a short text to satisfy the pdf/ua-2 validator % \begin{macrocode} % alt=\result, - alt = subformula, + alt = subformula, title-o=\resulttitle } } @@ -2728,7 +2999,7 @@ % \tl_if_empty:NF \g_@@_grabbed_math_tl { - \tagmcend + \tagmcend \tagstructend \grabaformulapartandmayberestart } @@ -2744,21 +3015,21 @@ % \typeout{===>~ in~ hook} % \math_register_halign_env:nn {dmath}{} % \math_register_halign_env:nn {dgroup*}{} -%} +%} % \end{macrocode} -% +% % \begin{macrocode} \ExplSyntaxOff % \end{macrocode} -% +% % \begin{macrocode} %<@@=> % \end{macrocode} -% +% % \begin{macrocode} %</kernel> % \end{macrocode} % % \Finale % -% +% diff --git a/macros/latex-dev/required/latex-lab/latex-lab-math.pdf b/macros/latex-dev/required/latex-lab/latex-lab-math.pdf Binary files differindex eee5ac32b7..fa243be249 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-math.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-math.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf Binary files differindex 6e9fb0bdef..1b8c8c9c5d 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf Binary files differindex 7305dcdaed..808002a82a 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf b/macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf Binary files differindex e95f1eb41d..2bcf0ba455 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf b/macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf Binary files differindex 8ef324775d..1944d86751 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf Binary files differindex 92856ef305..47ea20aff3 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf Binary files differindex b6e77e6834..51a6f6e707 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-sec.pdf b/macros/latex-dev/required/latex-lab/latex-lab-sec.pdf Binary files differindex 06022064d8..14a27d4f1d 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-sec.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-sec.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-table.pdf b/macros/latex-dev/required/latex-lab/latex-lab-table.pdf Binary files differindex 420e056fee..7afc4ddccf 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-table.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-table.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf b/macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf Binary files differindex 20d65c3224..c06a7d9687 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-text.pdf b/macros/latex-dev/required/latex-lab/latex-lab-text.pdf Binary files differindex c8cd388ac1..8a936402cc 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-text.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-text.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-title.pdf b/macros/latex-dev/required/latex-lab/latex-lab-title.pdf Binary files differindex 39c1f41438..ea09bc34bb 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-title.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-title.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf Binary files differindex 0ddfc529ac..c1bebcd1c5 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf Binary files differindex 821d3740a1..acbeb4b619 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf diff --git a/macros/latex-dev/required/latex-lab/latex-lab-toc.pdf b/macros/latex-dev/required/latex-lab/latex-lab-toc.pdf Binary files differindex 27467e7b88..0bd2ab5c15 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-toc.pdf +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc.pdf diff --git a/macros/latex-dev/required/tools/README.md b/macros/latex-dev/required/tools/README.md index 14d895588d..a99116cada 100644 --- a/macros/latex-dev/required/tools/README.md +++ b/macros/latex-dev/required/tools/README.md @@ -1,7 +1,7 @@ The LaTeX `tools` bundle ======================== -Release 2024-11-01 pre-release 4 +Release 2025-06-01 pre-release 0 Overview -------- diff --git a/macros/latex-dev/required/tools/afterpage.pdf b/macros/latex-dev/required/tools/afterpage.pdf Binary files differindex ef1fa72477..debb5d41df 100644 --- a/macros/latex-dev/required/tools/afterpage.pdf +++ b/macros/latex-dev/required/tools/afterpage.pdf diff --git a/macros/latex-dev/required/tools/array.dtx b/macros/latex-dev/required/tools/array.dtx index f141f069e3..f4c8ab28d8 100644 --- a/macros/latex-dev/required/tools/array.dtx +++ b/macros/latex-dev/required/tools/array.dtx @@ -39,7 +39,7 @@ % \begin{macrocode} %<+package>\NeedsTeXFormat{LaTeX2e}[2024/06/01] %<+package>\ProvidesPackage{array} -%<+package> [2024/10/12 v2.6g Tabular extension package (FMi)] +%<+package> [2024/10/17 v2.6g Tabular extension package (FMi)] % % \fi % @@ -259,7 +259,7 @@ % \begin{table}[!t] % \begin{center} % \setlength{\extrarowheight}{1pt} -% \begin{tabular}{|>{\tt}c|m{9cm}|} +% \begin{tabular}{|>{\ttfamily}c|m{9cm}|} % \hline % \multicolumn{2}{|c|}{Unchanged options}\\ % \hline @@ -382,6 +382,20 @@ % \end{itemize} % % +% +% \subsection{A note on the allowed content of \texttt{>\{...\}} and +% \texttt{<\{...\}}} +% +% These specifiers are meant to hold declarations, such as +% \verb=>{\itshape}=. They cannot end in commands that take arguments +% without providing these arguments as part of the \verb={...}=. It +% would be a mistaken assumption that they pick up all or parts of the +% alignment entry data if their argument is not provided. E.g., +% \verb=>{\textbf}= would not make the whole column bold nor would it +% make the first character bold (technically it would try to +% bolden \cs{ignorespaces}). Thus, it would not fail with an error, +% but effectively the output would be wrong and not as expected. +% % \subsection{The behavior of the \texttt{\string\\} command} % % In the basic \texttt{tabular} implementation of \LaTeX{} the \cs{\bslash} @@ -464,16 +478,16 @@ % "\newcolumntype{L}{>{$}l<{$}}" \\ % "\newcolumntype{R}{>{$}r<{$}}" % \end{quote} -% Then we can use \texttt{C} to get centred LR-mode in an -% \texttt{array}, or centred math-mode in a \texttt{tabular}. +% Then we can use \texttt{C} to get centered LR-mode in an +% \texttt{array}, or centered math-mode in a \texttt{tabular}. % -% The example given above for `centred decimal points' could be +% The example given above for `center decimal points' could be % assigned to a \texttt{d} specifier with the following command. % \begin{quote} % "\newcolumntype{d}{>{\centerdots}c<{\endcenterdots}}" % \end{quote} % -% The above solution always centres the dot in the +% The above solution always centers the dot in the % column. This does not look too good if the column consists of large % numbers, but to only a few decimal places. An alternative definition % of a \texttt{d} column is @@ -734,7 +748,7 @@ % user the opportunity of overriding the settings of a % "\newcolumntype" defined using these declarations. For example, % suppose in an \texttt{array} environment we use a \texttt{C} -% column defined as above. The \texttt{C} specifies a centred text +% column defined as above. The \texttt{C} specifies a centered text % column, however ">{\bfseries}C", which re-writes to % ">{\bfseries}>{$}c<{$}" would not specify a bold column as might % be expected, as the preamble would essentially expand to @@ -896,14 +910,14 @@ Bug reports can be opened (category \texttt{#1}) at\\% % % \section{A note on the updates done December 2023} % -% We introduced support for tagged PDf and at the same time we added +% We introduced support for tagged PDF and at the same time we added % code to determine row and column numbers for each cell in % preparation for supporting formatting or type specifications for individual % cells (or group of cells) from the outside, e.g., \enquote{rows 1, % 2, and 10 are header rows} (syntax to be decided). % % This new code is already written with L3 programming layer conventions -% while most of the legay code is still as it was before. This make the code +% while most of the legacy code is still as it was before. This make the code % currently somewhat clattered, unfortunately. Eventually this will all move to L3 % programming layer but this will take time. % @@ -1345,7 +1359,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % of \textsf{token} register $15$ instead of $1$ later on. % % The example above referred to an older version of =\save@decl= which -% inserted a =\relex= inside the token register. This is now moved to +% inserted a =\relax= inside the token register. This is now moved to % the places where the actual token registers are inserted (look for % =\the@toks=) because the old version would still make =@= % expressions to moving arguments since after expanding the second @@ -1386,33 +1400,112 @@ Bug reports can be opened (category \texttt{#1}) at\\% % \begin{macrocode} \UseTaggingSocket{tbl/cell/begin}% % \end{macrocode} -% Here, we assume that the \textsf{count} register +% Next we have to insert the toks register holding the content of +% \verb=>{...}=. Here, we assume that the \textsf{count} register % =\@tempcnta= has saved the value $=\count@= - 1$. % -% To keep \TeX{} happy if there is a look ahead in the tabular preamble -% which uses the Appendix~D trick (for example anything with a trailing -% optional argument defined by \pkg{ltcmd}), we wrap everything here in -% a protected version of \cs{@firstofone}.\footnote{The reason this -% works is not really clear: almost certainly there is a bug in \TeX{} -% here that we are simply avoiding, but as the master counter doesn't -% show up in a trace, a full understanding likely means working through -% the code that implements \cs{halign}!} -% \TeX{} otherwise can get +% To keep \TeX{} happy if there is a look ahead in the tabular +% preamble, i.e., starting in \verb=>{...}=, which uses the +% Appendix~D trick (for example, anything with a trailing optional +% argument defined by \pkg{ltcmd}), we wrap everything here in a +% protected version of \cs{@firstofone}. \TeX{} otherwise can get % confused about the value of the master counter, and we get some -% strange errors. (Quite possibly the underlying issue is a \TeX{} -% bug, but rather than try to fix in 2024 we accept it's there and -% work-around.) As an example, without this approach, something -% like +% strange errors. We suspected that there was an underlying issue +% is the \TeX{} engine, but it turned out to be rather hard to get +% to the bottom of it, because the master counter is not accessible +% through \TeX{}'s tracing tools. Thus, all we could do was +% producing various example documents, observing results, as well +% as staring at a printout of the \TeX{} program. As an example, +% without this approach, something like % \begin{verbatim} -%\NewDocumentCommand\foo{o}{x} -%\begin{tabular}{>{\foo}l} -% Foo -%\end{tabular} +% \NewDocumentCommand\foo{o}{x} +% \begin{tabular}{>{\foo}l} +% Foo +% \end{tabular} % \end{verbatim} -% will fail; that can be fixed by adding a \cs{relax} after the \cs{@tempcnta}, -% but that then leads to issues if you are collecting whole cells (tagging code -% or \\pkg{collcell}), where you can no longer alter the meaning of \cs{cr} -% as the master counter goes wrong. +% failed. That can be fixed by adding a \cs{relax} after the +% \cs{@tempcnta}, but that then leads to issues if you are +% collecting whole cells (tagging code or \pkg{collcell}), where +% you can no longer alter the meaning of \cs{cr} as the master +% counter goes wrong due to an obscure bug (or perhaps, say, an +% undocumented feature of \TeX{}). Eventually, we were able to pin +% down the root cause and really understand why +% \cs{@protected@firstofone} solves the problem, even though it +% looks like a nonsense addition to the code that does nothing +% useful.\footnote{So it is a \TeX{} engine bug that was in there +% from day one, or if you like, it is a hidden feature that is not +% explained; neither in the \TeX{}book nor in the program code. We +% don't really expect this to change in \TeX{} after such a long +% time, other than perhaps documenting it as a feature, so this is +% a proper solution to the problem and not just a workaround.} +% +% The problem is that \TeX{} tries to conserve stack space, and +% when the last token of an existing token list is a macro, then +% this token list is \emph{first} removed from memory (reducing the +% stack) \emph{before} the macro replacement text (as a new +% token list) is given to the parser adding a new stack level. This +% is done using the routine \texttt{end\_token\_list} in the \TeX{} +% program and ending the u-part of an \cs{halign} column with this +% routine immediately sets the \emph{master counter} used by alignments to +% zero (see chapter~22 and Appendix~D of the \TeX{}book). This +% means that technically the expansion of the last token in the u-part (if it +% is a macro) is not executed in the context of the u-part, but in +% the context of the alignment entry in the document. That normally +% doesn't make any difference whatsoever --- unless you play +% around (as we sometimes have to) with tricks like those from +% Appendix~D. +% +% To illustrate the issue we show a bit of strange low-level plain +% \TeX{} code.\footnote{If all of this looks mighty strange to you, +% don't worry. You will be unlikely to need to know about it. It is +% just there so that programmers at some point in the future do not +% have to wonder too much why there is this odd +% \cs{@protected@firstofone} that apparently does nothing +% useful. It took us several nights of head scratching to come up +% with these minimal examples and then some more time to understand +% what the heck is going on inside \TeX{}---thanks to Bruno for the +% right ideas on the latter.} Below are two very special grouping +% commands that are like \cs{bgroup} and \cs{egroup} but also +% affect the alignment master counter when expanded (see +% \TeX{}book p.385). If one of them is used as the +% last macro in the u-part of a column, then you get strange errors +% that you shouldn't get. +% \begin{verbatim} +% \def\bbgroup{{\ifnum0=`}\fi} +% \def\eegroup{\ifnum0=`{\fi}} +% +% % Fails with an error message, but there should be none: +% \halign{% +% \message{u-part^^J}% +% \bbgroup % <-- in the u-part +% \eegroup % <-- in the u-part +% #% +% \message{v-part^^J}% +% \hfill\cr +% \message{body^^J}x +% \cr +% } +% +% % Fails but should work, the v-part is never reached: +% \halign{% +% \message{u-part^^J}% +% \bbgroup % <-- in the u-part +% #% +% \message{v-part^^JJ}% +% \eegroup % <-- in the v-part +% \hfill\cr +% \message{body^^J}x +% \cr +% } +% \end{verbatim} +% +% So the trick we use now is making \cs{@protected@firstofone} the +% last macro in the u-part, i.e., before the \cs{@sharp}. That way +% its argument is always fully expanded as part of the alignment +% entry and not as part of the u-part and this way we know exactly +% what the master counter value is at this point, regardless of the content of +% \verb=>{...}=. +% % \changes{v2.6f}{2024/09/13}{Stop parsing for optional argument (gh/1468)} % \changes{v2.6g}{2024/10/12}{Further work to support optional args in preamble (gh/1468)} % \begin{macrocode} @@ -1429,7 +1522,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % afterwards; in math mode, the latter is suppressed while the % \cs{ignorespaces} makes no difference. % \changes{v2.0e}{1991/02/07}{Added \{\} around \cs{@sharp} for new ftsel} -% \changes{v2.0h}{1992/06/22}{Removed \{\} again in favour of +% \changes{v2.0h}{1992/06/22}{Removed \{\} again in favor of % \cs{d@llarbegin}} % \changes{v2.6b}{2024/04/08}{Do not \cs{unskip} if in math mode (gh/1323)} % \begin{macrocode} @@ -1920,7 +2013,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % For that reason the new implementation does the centering % manually: First we check the height of the cell and if that is % less or equal to =\ht\strutbox= we assume that this is a -% single line cell. In that case we don't do any vertical maneuvre +% single line cell. In that case we don't do any vertical maneuver % and simply output the box, i.e., make it behave like a single % line p-cell. % @@ -2363,7 +2456,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% \lineskip \z@ \baselineskip \z@ % \end{macrocode} -% Don't use \cs{m@th} here as that signals to the math taggingg +% Don't use \cs{m@th} here as that signals to the math tagging % code that this is fake math that should not be tagged. % \changes{v2.6a}{2023/12/11}{Support for tagged PDF} % \begin{macrocode} @@ -2489,7 +2582,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % % We then start a special brace which I have directly % copied from the original definition. It is -% necessary, because the =\futurlet= in =\@ifnextchar= +% necessary, because the =\futurelet= in =\@ifnextchar= % might % expand a following =&= \textsf{token} in a construction like % =\\ &=. This would otherwise end the alignment template at a @@ -2502,7 +2595,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % that a =&= will not be considered belonging to the current % =\halign= while we are looking for a =*= or =[=. % For further information see -% \cite[Appendix D]{bk:knuth}. +% \cite[Appendix~D]{bk:knuth}. % \begin{macrocode} \iffalse{\fi\ifnum 0=`}\fi % \end{macrocode} @@ -2687,7 +2780,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % \section{The Environment Definitions} % % After these preparations we are able to define the environments. They -% only differ in the initialisations of =\d@llar...=, =\col@sep= +% only differ in the initializations of =\d@llar...=, =\col@sep= % and =\@halignto=. % % \begin{macro}{\@halignto} @@ -2702,7 +2795,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % able overwrite the =\@halignto= % setting of a tabular in the main text resulting in a very weird error. % \changes{v2.4d}{2016/10/06}{\cs{@halignto} set locally (pr/4488)} -% \changes{v2.0g}{1992/06/18}{`d@llarbegin defined on toplevel.} +% \changes{v2.0g}{1992/06/18}{`d@llarbegin defined on top-level.} % When the new font selection scheme is in force we have to % we surround all =\halign= entries % with braces. See remarks in TUGboat 10\#2. Actually we are going @@ -2752,7 +2845,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % \begin{macro}{\tabular} % \begin{macro}{\tabular*} % The environments \textsf{tabular} and \textsf{tabular$*$} differ -% only in the initialisation of the command =\@halignto=. Therefore +% only in the initialization of the command =\@halignto=. Therefore % we define % \changes{v2.4d}{2016/10/06}{\cs{@halignto} set locally (pr/4488)} % \begin{macrocode} @@ -3034,7 +3127,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % rewrites (in the token register "\NC@list") will look like % "\NC@do *" "\NC@do C" "\NC@do L". % So we need to define "\NC@do" as a one argument macro which -% initialises the rewriting of the specified column. Let us assume that +% initializes the rewriting of the specified column. Let us assume that % `C' is the argument. % \begin{macrocode} \def\NC@do#1{% @@ -3102,7 +3195,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % \end{macro} % % \subsection{The $*$--form} -% We view the $*$-form as a slight generalisation of the system +% We view the $*$-form as a slight generalization of the system % described in the previous subsection. The idea is to define a $*$ % column by a command of the form: % \begin{verbatim} @@ -3540,7 +3633,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % the cell content is too wide. % \changes{v2.4f}{2017/11/07}{Column type added} % \changes{v2.5a}{2020/04/06}{Use \cs{d@llarbegin} and \cs{d@llarend} so -% that cell is typeset in mathmode inside \texttt{array} (gh/297)} +% that cell is typeset in math mode inside \texttt{array} (gh/297)} % \begin{macrocode} \newcolumntype{W}[2] {>{\begin{lrbox}\ar@cellbox\d@llarbegin}% diff --git a/macros/latex-dev/required/tools/array.pdf b/macros/latex-dev/required/tools/array.pdf Binary files differindex 1ac25134b8..a0c2ac36ee 100644 --- a/macros/latex-dev/required/tools/array.pdf +++ b/macros/latex-dev/required/tools/array.pdf diff --git a/macros/latex-dev/required/tools/bm.pdf b/macros/latex-dev/required/tools/bm.pdf Binary files differindex be782abd2f..8ec653ce6c 100644 --- a/macros/latex-dev/required/tools/bm.pdf +++ b/macros/latex-dev/required/tools/bm.pdf diff --git a/macros/latex-dev/required/tools/calc.pdf b/macros/latex-dev/required/tools/calc.pdf Binary files differindex e21868904e..d9473573a2 100644 --- a/macros/latex-dev/required/tools/calc.pdf +++ b/macros/latex-dev/required/tools/calc.pdf diff --git a/macros/latex-dev/required/tools/changes.txt b/macros/latex-dev/required/tools/changes.txt index 5dc289803d..9a3c944b20 100644 --- a/macros/latex-dev/required/tools/changes.txt +++ b/macros/latex-dev/required/tools/changes.txt @@ -5,6 +5,24 @@ completeness or accuracy and it contains some references to files that are not part of the distribution. ======================================================================= +================================================================================ +All changes above are only part of the development branch for the next release. +================================================================================ + +######################### +# 2024-11-01 Release +######################### + +2024-10-30 David Carlisle <David.Carlisle@latex-project.org> + + * amsmath.dtx: Guard the \protect tests from primitive if tokens + in the definition (gh/1448) + +2024-10-27 David Carlisle <David.Carlisle@latex-project.org> + + * longtable.dtx Guard against increasing \pagegoal past \maxdimen (gh/1495) + + 2024-10-12 Joseph Wright <Joseph.Wright@latex-project.org> * array.dtx (section{The insertion of declarations ...}): @@ -52,10 +70,6 @@ are not part of the distribution. \tolerance=10000 any longer (it did in the early days of LaTeX) (gh/1385) -================================================================================ -All changes above are only part of the development branch for the next release. -================================================================================ - 2024-06-14 David Carlisle <David.Carlisle@latex-project.org> * array.dtx move \ExplSyntaxOff earlier so error message spaces preserved gh/1378 diff --git a/macros/latex-dev/required/tools/dcolumn.pdf b/macros/latex-dev/required/tools/dcolumn.pdf Binary files differindex 0abbd4a820..10f2294281 100644 --- a/macros/latex-dev/required/tools/dcolumn.pdf +++ b/macros/latex-dev/required/tools/dcolumn.pdf diff --git a/macros/latex-dev/required/tools/delarray.pdf b/macros/latex-dev/required/tools/delarray.pdf Binary files differindex 8a9da285c9..4d04a17628 100644 --- a/macros/latex-dev/required/tools/delarray.pdf +++ b/macros/latex-dev/required/tools/delarray.pdf diff --git a/macros/latex-dev/required/tools/enumerate.pdf b/macros/latex-dev/required/tools/enumerate.pdf Binary files differindex 6d6c94aa7e..1ed3d1b597 100644 --- a/macros/latex-dev/required/tools/enumerate.pdf +++ b/macros/latex-dev/required/tools/enumerate.pdf diff --git a/macros/latex-dev/required/tools/fileerr.pdf b/macros/latex-dev/required/tools/fileerr.pdf Binary files differindex c2419beb76..7913b9cf33 100644 --- a/macros/latex-dev/required/tools/fileerr.pdf +++ b/macros/latex-dev/required/tools/fileerr.pdf diff --git a/macros/latex-dev/required/tools/fontsmpl.pdf b/macros/latex-dev/required/tools/fontsmpl.pdf Binary files differindex 3ae2f46c95..59e9847d69 100644 --- a/macros/latex-dev/required/tools/fontsmpl.pdf +++ b/macros/latex-dev/required/tools/fontsmpl.pdf diff --git a/macros/latex-dev/required/tools/ftnright.pdf b/macros/latex-dev/required/tools/ftnright.pdf Binary files differindex 7598c490b8..d26f051387 100644 --- a/macros/latex-dev/required/tools/ftnright.pdf +++ b/macros/latex-dev/required/tools/ftnright.pdf diff --git a/macros/latex-dev/required/tools/hhline.pdf b/macros/latex-dev/required/tools/hhline.pdf Binary files differindex 7e029b1db2..f3cbce3767 100644 --- a/macros/latex-dev/required/tools/hhline.pdf +++ b/macros/latex-dev/required/tools/hhline.pdf diff --git a/macros/latex-dev/required/tools/indentfirst.pdf b/macros/latex-dev/required/tools/indentfirst.pdf Binary files differindex 1ff57ba97a..7a348886f0 100644 --- a/macros/latex-dev/required/tools/indentfirst.pdf +++ b/macros/latex-dev/required/tools/indentfirst.pdf diff --git a/macros/latex-dev/required/tools/l3sys-query.pdf b/macros/latex-dev/required/tools/l3sys-query.pdf Binary files differindex e9528464e2..fa700e08e7 100644 --- a/macros/latex-dev/required/tools/l3sys-query.pdf +++ b/macros/latex-dev/required/tools/l3sys-query.pdf diff --git a/macros/latex-dev/required/tools/layout.pdf b/macros/latex-dev/required/tools/layout.pdf Binary files differindex dec2f91fd9..e289eeceff 100644 --- a/macros/latex-dev/required/tools/layout.pdf +++ b/macros/latex-dev/required/tools/layout.pdf diff --git a/macros/latex-dev/required/tools/longtable.dtx b/macros/latex-dev/required/tools/longtable.dtx index 439542a18c..061d7b5610 100644 --- a/macros/latex-dev/required/tools/longtable.dtx +++ b/macros/latex-dev/required/tools/longtable.dtx @@ -38,7 +38,7 @@ %<driver> \ProvidesFile{longtable.drv} % \fi % \ProvidesFile{longtable.dtx} - [2024-07-06 v4.21 Multi-page Table package (DPC)] + [2024-10-27 v4.22 Multi-page Table package (DPC)] % % \iffalse %<*driver> @@ -1639,15 +1639,20 @@ \LT@final@warn \fi % \end{macrocode} -% Force one more go with the \env{longtable} output routine. +% Force one more go with the \env{longtable} output routine. +% Guard the special start of page value of "\pagegoal". % \changes{v4.14}{2020/02/07} % {Rearrange vertical space tests for tools/3512 (floats on same page)} +% \changes{v4.22}{2024/10/27} +% {Keep \cs{pagegoal} below \cs{maxdimen} gh1495} % \begin{macrocode} \endgraf\penalty -\LT@end@pen \ifvoid\LT@foot\else \global\advance\vsize\ht\LT@foot \global\advance\@colroom\ht\LT@foot - \dimen@\pagegoal\advance\dimen@\ht\LT@foot\pagegoal\dimen@ + \ifdim\pagegoal<\maxdimen + \dimen@\pagegoal\advance\dimen@\ht\LT@foot\pagegoal\dimen@ + \fi \fi % \end{macrocode} % Now close the group to return to the standard routine. diff --git a/macros/latex-dev/required/tools/longtable.pdf b/macros/latex-dev/required/tools/longtable.pdf Binary files differindex ab664a6f3e..ed86fc5b48 100644 --- a/macros/latex-dev/required/tools/longtable.pdf +++ b/macros/latex-dev/required/tools/longtable.pdf diff --git a/macros/latex-dev/required/tools/multicol.pdf b/macros/latex-dev/required/tools/multicol.pdf Binary files differindex 23d07cc936..f363031b49 100644 --- a/macros/latex-dev/required/tools/multicol.pdf +++ b/macros/latex-dev/required/tools/multicol.pdf diff --git a/macros/latex-dev/required/tools/rawfonts.pdf b/macros/latex-dev/required/tools/rawfonts.pdf Binary files differindex 5c33b0ac4d..c616510fa7 100644 --- a/macros/latex-dev/required/tools/rawfonts.pdf +++ b/macros/latex-dev/required/tools/rawfonts.pdf diff --git a/macros/latex-dev/required/tools/shellesc.pdf b/macros/latex-dev/required/tools/shellesc.pdf Binary files differindex 35524a6c5f..d5459e42a1 100644 --- a/macros/latex-dev/required/tools/shellesc.pdf +++ b/macros/latex-dev/required/tools/shellesc.pdf diff --git a/macros/latex-dev/required/tools/showkeys.pdf b/macros/latex-dev/required/tools/showkeys.pdf Binary files differindex ccc9ad6107..907ec14272 100644 --- a/macros/latex-dev/required/tools/showkeys.pdf +++ b/macros/latex-dev/required/tools/showkeys.pdf diff --git a/macros/latex-dev/required/tools/somedefs.pdf b/macros/latex-dev/required/tools/somedefs.pdf Binary files differindex 4ed4d46707..e094300ab8 100644 --- a/macros/latex-dev/required/tools/somedefs.pdf +++ b/macros/latex-dev/required/tools/somedefs.pdf diff --git a/macros/latex-dev/required/tools/tabularx.pdf b/macros/latex-dev/required/tools/tabularx.pdf Binary files differindex 30e19f3956..f26fce05bc 100644 --- a/macros/latex-dev/required/tools/tabularx.pdf +++ b/macros/latex-dev/required/tools/tabularx.pdf diff --git a/macros/latex-dev/required/tools/theorem.pdf b/macros/latex-dev/required/tools/theorem.pdf Binary files differindex 0804a1cdbb..6476a27f32 100644 --- a/macros/latex-dev/required/tools/theorem.pdf +++ b/macros/latex-dev/required/tools/theorem.pdf diff --git a/macros/latex-dev/required/tools/tools-overview.pdf b/macros/latex-dev/required/tools/tools-overview.pdf Binary files differindex 3597b96721..76e1a11505 100644 --- a/macros/latex-dev/required/tools/tools-overview.pdf +++ b/macros/latex-dev/required/tools/tools-overview.pdf diff --git a/macros/latex-dev/required/tools/trace.pdf b/macros/latex-dev/required/tools/trace.pdf Binary files differindex be55094bcd..5d2b59e432 100644 --- a/macros/latex-dev/required/tools/trace.pdf +++ b/macros/latex-dev/required/tools/trace.pdf diff --git a/macros/latex-dev/required/tools/varioref.pdf b/macros/latex-dev/required/tools/varioref.pdf Binary files differindex 6650f5344c..b13fb17b39 100644 --- a/macros/latex-dev/required/tools/varioref.pdf +++ b/macros/latex-dev/required/tools/varioref.pdf diff --git a/macros/latex-dev/required/tools/verbatim.pdf b/macros/latex-dev/required/tools/verbatim.pdf Binary files differindex 374e63d0d9..dc610ac976 100644 --- a/macros/latex-dev/required/tools/verbatim.pdf +++ b/macros/latex-dev/required/tools/verbatim.pdf diff --git a/macros/latex-dev/required/tools/xr.pdf b/macros/latex-dev/required/tools/xr.pdf Binary files differindex 0b9913607e..2b8777235d 100644 --- a/macros/latex-dev/required/tools/xr.pdf +++ b/macros/latex-dev/required/tools/xr.pdf diff --git a/macros/latex-dev/required/tools/xspace.pdf b/macros/latex-dev/required/tools/xspace.pdf Binary files differindex 7792df29c2..5066924d3e 100644 --- a/macros/latex-dev/required/tools/xspace.pdf +++ b/macros/latex-dev/required/tools/xspace.pdf diff --git a/macros/latex/contrib/easybook/README.md b/macros/latex/contrib/easybook/README.md index 9793140a0c..700a5ab5b5 100644 --- a/macros/latex/contrib/easybook/README.md +++ b/macros/latex/contrib/easybook/README.md @@ -1,5 +1,5 @@ # The `easybook` document class -Easily typesetting Chinese theses or books (v2024ex) +Easily typesetting Chinese theses or books (v2024ez) ## Abstract `easybook` is a pure academic template created based on the `ctexbook` book document class. It also has the functions of `book` and `article` document class. Combined with the general framework design of the theses of many universities in China, providing multiple commands and interfaces allows users to easily customize the theses templates. Its basic macro package `easybase` can also be used with `ctex` and standard document classes. diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx index 527731744b..648c8dacd0 100644 --- a/macros/latex/contrib/easybook/easybook.dtx +++ b/macros/latex/contrib/easybook/easybook.dtx @@ -14,7 +14,7 @@ % This work has the LPPL maintenance status `maintained'. %<class|package>\NeedsTeXFormat{LaTeX2e}[2021/11/15] %<*class> -\ProvidesExplClass{easybook}{2024/10/31}{2024ex} +\ProvidesExplClass{easybook}{2024/11/01}{2024ez} {Easily typesetting Chinese theses or books} \bool_new:N \l__eb_compile_draft_bool @@ -302,7 +302,7 @@ %</class> %<*package> \RequirePackage{etoolbox} -\ProvidesExplPackage{easybase}{2024/10/31}{2024ex} +\ProvidesExplPackage{easybase}{2024/11/01}{2024ez} {Easily typesetting Chinese theses or books} \cs_generate_variant:Nn \dim_set:Nn { NV } @@ -596,14 +596,16 @@ \pagenumbering{arabic} } \NewDocumentCommand{\markrule} - {O{\textwidth}D(){ctex@frame}m>{\SplitArgument{1}{|}}O{}} - {\eb_draw_markrule:nnnnn {#1} {#2} {#3} #4} -\cs_new_protected:Npn \eb_draw_markrule:nnnnn #1#2#3#4#5 + {O{\textwidth}D(){ctex@frame}mO{0pt}} { \group_begin: - \tl_if_blank:nF {#4} { \vspace*{#4} } - \color{#2}\hrule\@width #1\@height #3 - \tl_if_novalue:nF {#5} { \vspace*{#5} } + \color{#2} + \exp_last_unbraced:Nx \hrule + { + \@width \dim_eval:n {#1} + \@height \dim_eval:n {#3} + \@depth \dim_eval:n {#4} + } \group_end: } \cs_new:Npn \eb_mark_uppercase_case_init:n @@ -662,7 +664,11 @@ footrule .tl_gset:N = \footrule, footrule .initial:n = { }, footnoterule .tl_gset:N = \footnoterule, - footnoterule .initial:n = \markrule[0.35\textwidth]{\eb@footnote@rule@wd}[|3pt] + footnoterule .initial:n = + { + \markrule[0.35\textwidth]{\eb@footnote@rule@wd} + \vspace*{3pt} + } } \cs_set:Npn \markdouble #1 { \markboth{#1}{\ifbool{@twoside}{#1}{}} } @@ -2967,7 +2973,7 @@ } %</package> %<*tcolorbox> -\ProvidesExplFile{eb-tcolorbox.cfg}{2024/10/31}{2024ex} +\ProvidesExplFile{eb-tcolorbox.cfg}{2024/11/01}{2024ez} {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 Binary files differindex f96776ddf1..7fdd5a016f 100644 --- a/macros/latex/contrib/easybook/easybook.pdf +++ b/macros/latex/contrib/easybook/easybook.pdf diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex index 4b33570c0e..042e47ad25 100644 --- a/macros/latex/contrib/easybook/easybook.tex +++ b/macros/latex/contrib/easybook/easybook.tex @@ -23,8 +23,8 @@ name = easybook, color-scheme = blue, title = EASYBOOK使用手册, - version = v2024ex, - date = 2024/10/31, + version = v2024ez, + date = 2024/11/01, authors = 瞿毅, info = 简便地排版中文学位论文或书籍, email = toquyi@163.com, @@ -781,10 +781,10 @@ $\blacktriangleright$需要注意正确\textbf{编译索引}要增加 \code{-she \makeatother \end{ctexexam} \end{cnltxlist} - \command{markrule}[\oarg{长度}\darg{颜色名}\marg{线宽}\baroarg{上间距,下间距}] - 实线命令 \cs{markrule} 既可在 \meta{横线命令} 中用于绘制页眉页脚横线,也可以在正文中使用。\meta{长度} 默认为版心的宽度,上下间距为横线与上下方部件的间距,带有长度单位,上下间距之间用符号 \code{|} 分开,若只有一部分则表示 \meta{上间距}。下面举一个设置页眉内容的例子: + \command{markrule}[\oarg{长度}\darg{颜色名}\marg{高度}\oarg{深度}] + 实线命令 \cs{markrule} 既可在 \meta{横线命令} 中用于绘制页眉页脚横线,也可以在正文中使用。实线的 \meta{长度} 默认为版心的宽度,\meta{高度} 为线向上的粗细需要指定,\meta{深度} 为线向下的粗细默认为 \code{0pt}。它们均为刚性长度且可以为负值,支持数学表达式,通过控制 \meta{高度} 和 \meta{深度} 的正负值可以决定实线上下偏移量。下面举一个设置页眉内容的例子: \begin{ctexexam}[labelref = exam:markrule] - \ebhdrset{headrule = \markrule(DarkOrchid){0.5pt}[2pt|2pt]} + \ebhdrset{headrule = \markrule(DarkOrchid){2pt + 1pt}[-2pt]} \fancyhead[ER]{\FirstMark{2e-left}} % 来自ltmarks的标记机制 \fancyhead[OL]{\rightmark} \fancyhead[EL,OR]{\textbf{\thepage}} diff --git a/macros/latex/contrib/enumext/README.md b/macros/latex/contrib/enumext/README.md new file mode 100644 index 0000000000..8ead16580f --- /dev/null +++ b/macros/latex/contrib/enumext/README.md @@ -0,0 +1,69 @@ +## enumext — Enumerate exercise sheets + +Release v1.0 \[2024-11-01\] + +## Description + +This package provides enumerated list environments compatible with +_tagging_ PDF for creating “simple exercise sheets” along with +“multiple choice questions”, storing the “answers” to these in memory +using <code>⟨multicol⟩</code> and <code>⟨scontents⟩</code> packages. + +## Requirements + +The minimum requirement is LaTeX release 2024-11-01. Loads and depends +on updated versions of: + +- [scontents](https://ctan.org/pkg/scontents) +- [multicol](https://ctan.org/pkg/multicol) + +## Installation + +The <code>⟨enumext⟩</code> package is present in TeX Live and MiKTeX, use the +package manager to install. + +For manual installation, download [enumext.zip](http://mirrors.ctan.org/macros/latex/contrib/enumext.zip) and unzip it, +then run: + +``` +$ luatex enumext.ins +``` + +and move all files to appropriate locations: + +``` + enumext.sty -> TDS:tex/latex/enumext/enumext.sty + enumext.pdf -> TDS:doc/latex/enumext/enumext.pdf + README.md -> TDS:doc/latex/enumext/README.md + enumext.dtx -> TDS:source/latex/enumext/enumext.dtx + enumext.ins -> TDS:source/latex/enumext/enumext.ins +``` + +then run `mktexlsr`. To produce the documentation with source code run `arara enumext.dtx`. + +## Examples + +The file <code>⟨enumext.pdf⟩</code> contains attached examples, which can be extracted +from the PDF viewer or from the command line by running: + +``` +$ pdfdetach -saveall enumext.pdf +``` + +and then you can use the excellent `arara` tool to compile them. + +## License + +The <code>⟨enumext⟩</code> package may be modified and distributed under the terms and +conditions of the [LaTeX Project Public License](https://www.latex-project.org/lppl/), version 1.3c or greater. + +## Contents + +- ⟨`README.md`⟩ \(this file\) +- ⟨`enumext.pdf`⟩ \(documentation\) +- ⟨`enumext.dtx`⟩ \(master file that produced all files\) +- ⟨`enumext.ins`⟩ \(installer to extract all files\) + +## Author and copyright + +Copyright © 2024 by Pablo González L <pablgonz@educarchile.cl> diff --git a/macros/latex/contrib/enumext/enumext.dtx b/macros/latex/contrib/enumext/enumext.dtx new file mode 100644 index 0000000000..5cc3a17b60 --- /dev/null +++ b/macros/latex/contrib/enumext/enumext.dtx @@ -0,0 +1,15804 @@ +% \iffalse meta-comment +% arara: lualatex: { branch: developer, draft: true } +% arara: clean: { files: [ enumext-01.pdf, enumext-02.pdf, enumext-03.pdf, enumext-04.pdf, enumext-05.pdf ] } +% arara: lualatex: { branch: developer, shell: true } +% arara: clean: { extensions: [ aux, log, out, glo, gls, hd, ind, ilg, idx, toc, atfi ] } +% arara: clean: { files: [ userdoc.idx, userdoc.ilg, userdoc.ind ] } +% arara: halt +% +% File: enumext.dtx +% +% Copyright (C) 2024 by Pablo González L <pablgonz@educarchile.cl> +% +% This work may be distributed and/or modified under the conditions of the +% LaTeX Project Public License, either version 1.3c of this license or (at +% your option) any later version. The latest version of this license is in +% +% https://www.latex-project.org/lppl.txt +% +% and version 1.3c or later is part of all distributions of LaTeX version +% 2005/12/01 or later. +% +% This work is "maintained" (as per the LPPL maintenance status) +% by Pablo González Luengo. +% +% This work consists of the files enumext.dtx and enumext.sty. +% +% \fi +% +% \iffalse +%<*driver> +\documentclass[full]{l3doc} +% Remove `"` and `|` for short verbatim defined in l3doc, then set short |...| +\AtBeginDocument + { + \DeleteShortVerb \" + \DeleteShortVerb \| + \lstMakeShortInline[language=enumext-doc,basicstyle=\ttfamily]\| + } +% imakeidx also opens a write stream for the .idx file, and that conflicts +% with the one opened by l3doc. Here we close that write stream: +\makeatletter +\immediate\closeout\@indexfile +\makeatother +% and later we will copy the write stream opened by imakeidx into \@indexfile +% so that entries written to both streams end up in the same file. +\usepackage[english]{babel} +\usepackage[top=0.5in,bottom=0.3in,left=1.70in,right=0.7in,footskip=0.2in,headheight=1cm,headsep=0.27cm]{geometry} +\usepackage[osf,nomath,mono=false,ScaleSF=0.95,ScaleRM=0.95]{libertinus-otf} +% Set Monospace font, fix 'quotes' in verbatim +\usepackage{sourcecodepro} +\defaultfontfeatures[\ttfamily] + { + Numbers = OldStyle, + Scale = 0.84249, + Extension = .otf, + } +\setmonofont[ + UprightFont = *-Regular, + ItalicFont = *-RegularIt, + BoldFont = *-Semibold, + BoldItalicFont = *-SemiboldIt, + RawFeature = {+zero,+ss01}]{SourceCodePro} +\newfontfamily\mysourcecodeprolight{SourceCodePro-Regular.otf}[ + Scale = 0.80,FakeStretch =0.75, + FontFace = {m}{it}{Font =SourceCodePro-RegularIt.otf,Color=FF0000}] +\RenewDocumentCommand{\MacroLongFont}{} + { + \mysourcecodeprolight\small + } +% The character of visible space is now taken from Latin Modern Mono +% to prevent fonts in T1. The original definition for xetex/luatex is +% \def\verbvisiblespace{\usefont{OT1}{cmtt}{m}{n}\asciispace} +\def\verbvisiblespace{{\fontfamily{lmtt}\selectfont\char"2423}} + +\usepackage{unicode-math} +\setmathfont[Scale = 0.95]{latinmodern-math.otf} +\usepackage{fontawesome5} +\newfontfamily\fetamontotf{ffmw10.otf}[ + Scale = 0.95,% + RawFeature = {+latn,+rand,+kern,+size},% + FontFace = {b}{n}{ffmw10.otf},% fix replace font + ] +\usepackage[svgnames]{xcolor} +\usepackage[sf,bf,compact,medium,pagestyles]{titlesec} +\usepackage{lastpage,microtype,attachfile2} +\usepackage{adjustbox,multicol,listings,accsupp,titletoc} +\usepackage{imakeidx,tikz,enumext} % main +\usepackage{scontents} +\usepackage{shellesc} +\usepackage[contents]{colordoc} +% \show\docCodelineNo +\def\textnew#1{\color{color-def}#1\/} +\def\AltMacroFont{\fontencoding\encodingdefault + \fontfamily\ttdefault + \fontseries\mddefault + \fontshape\updefault + \small + }% +% Patching colordoc.sty to work with l3doc.cls +\ExplSyntaxOn +\cs_new_eq:cN { liii@xmacro@code } \__codedoc_xmacro_code:n +\ExplSyntaxOff +\begingroup +\makeatletter +\catcode`\[\@ne\catcode`\]\tw@ +\@makebracesactive +\gdef{[\@openingbrace[\char'173]] +\gdef}[\@closingbrace[\char'175]] +\catcode`\|\z@\catcode`\%12 +\catcode`\ \active\catcode`\\\active +|gdef|xmacro@code#1% \end{macrocode}[|liii@xmacro@code[#1]|end[macrocode]] +|catcode`| 12|gdef|sxmacro@code#1% \end{macrocode*}[|liii@xmacro@code[#1]|end[macrocode*]] +|endgroup +% Patching colordoc.sty to work with doc v3 (TeX Live 2023 & lualatex-dev) +\usepackage{etoolbox} +\makeatletter +\@ifpackagelater{doc}{2022-06-01}% + {\patchcmd\macro@finish + {\ifnot@excluded % \if + \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}% + \@tempa \fi}% + {\maybe@index@macro \macro@namepart} + {}{\FAILED}% + \let\default@color\current@color + }% + {} +\makeatother + +\EnableCrossrefs +% \PageIndex, \CodelineIndex undoes what \PageIndex does +% \CodelineIndex tries to open another write stream for the index file. We don't +% want that, so we temporarily make \makeindex a no-op: +\let\ORGmakeindex\makeindex +\def\makeindex{} +\CodelineIndex +\let\makeindex\ORGmakeindex +\DoNotIndex{\ , \1,\^} +\expandafter\DoNotIndex\expandafter{\string\{} +\expandafter\DoNotIndex\expandafter{\string\}} +\expandafter\DoNotIndex\expandafter{\string\begin} +\newcommand{\HP}[1]{\emph{\hyperpage{#1}}\normalsize} +\ExplSyntaxOn +\cs_new_protected:Npn \StartImplementation + { \bool_set_true:N \l__codedoc_in_implementation_bool } +\bool_set_false:N \l__codedoc_in_implementation_bool +\cs_new_protected:Npn \MYSortIndex #1 #2 + { + \bool_if:NTF \l__codedoc_in_implementation_bool + { \index{#1\actualchar#2|HP} } + { \index[userdoc]{#1\actualchar#2|HP} } + } +\ExplSyntaxOff +% imakeidx config +\indexsetup{level=\section,firstpagestyle=myheader,othercode=\pagestyle{myheader}} +\makeindex[name=userdoc,options={-q -s gind.ist},columnsep=15pt,title={Index of Documentation}] +\makeindex[options={-q -s gind.ist},columnsep=15pt,title={Index of Implementation}] +% Now, after imakeidx opens the write stream for the index file, we copy +% the reference to \@indexfile: +\makeatletter +\expandafter\let\expandafter\@indexfile\csname \jobname @idxfile\endcsname +\makeatother +% Set \parindent +\setlength{\parindent}{0pt} +% Colors +\definecolor{optcolor}{rgb}{0.281,0.275,0.485} +\definecolor{pkgcolor}{rgb}{0,0.5,0.5} +\definecolor{araracolor}{rgb}{0, 0.72, 0.28} +\definecolor{linkcolor}{rgb}{0.04,0.38,0.04} +\definecolor{rulecolor}{rgb}{0.96,0.96,0.96} +% Only for arara... I like arara :) +\usepackage[scale=0.85]{comfortaa} +\newcommand{\araratext}[1]{{\small\normalfont\comfortaa\color{araracolor}\bfseries#1}} +\newcommand*\arara{\araratext{ar\kern-.03emar\kern-.03ema}} +% User level commands +\ExplSyntaxOn +% Logo +\NewDocumentCommand{\pkglogo}{} + { + \group_begin: + \LibertinusSansOsF{\textcolor{pkgcolor}{enum}\textcolor{OrangeRed}{ext}} + \group_end: + } +% Custom \meta[...]{...}, \marg[...]{...} and \oarg[...]{...} with color +\NewDocumentCommand{\mymeta}{O{}m} + { + \userdoc_meta_generic:Nnn \userdoc_meta:n { #1 } { #2 } + } +\NewDocumentCommand{\mymarg}{O{}m} + { + \userdoc_meta_generic:Nnn \userdoc_marg:n { #1 } { #2 } + } +\NewDocumentCommand{\myoarg}{O{}m} + { + \userdoc_meta_generic:Nnn \userdoc_oarg:n { #1 } { #2 } + } +\NewDocumentCommand{\myparg}{O{}m} + { + \userdoc_meta_generic:Nnn \userdoc_parg:n { #1 } { #2 } + } +% Variables and keys +\tl_new:N \l_userdoc_meta_font_tl +\keys_define:nn { userdoc / mymeta } + { + type .choice:, + type / tt .code:n = \tl_set:Nn \l_userdoc_meta_font_tl { \ttfamily }, + type / rm .code:n = \tl_set:Nn \l_userdoc_meta_font_tl { \rmfamily }, + type .initial:n = tt, + cf .tl_set:N = \l_userdoc_meta_color_tl, + cf .initial:n = optcolor, + ac .tl_set:N = \l_userdoc_meta_anglecolor_tl, + ac .initial:n = lightgray, + sbc .tl_set:N = \l_userdoc_meta_brackcolor_tl, + sbc .initial:n = gray, + cbc .tl_set:N = \l_userdoc_meta_bracecolor_tl, + cbc .initial:n = gray, + pbc .tl_set:N = \l_userdoc_meta_parencolor_tl, + pbc .initial:n = gray, + } +% Internal commands +\cs_new_protected:Npn \userdoc_meta_generic:Nnn #1 #2 #3 + { + \group_begin: + \keys_set:nn { userdoc / mymeta } { #2 } + \color{ \l_userdoc_meta_color_tl } + \l_userdoc_meta_font_tl + #1 { #3 } % #1 is \userdoc_meta:n, \userdoc_marg:n or \userdoc_oarg:n + \group_end: + } +\cs_new_protected:Npn \userdoc_meta:n #1 + { + \userdoc_meta_angle:n { \textlangle } + \userdoc_meta_meta:n { #1 } + \userdoc_meta_angle:n { \textrangle } + } +\cs_new_protected:Npn \userdoc_marg:n #1 + { + \userdoc_meta_brace:n { \textbraceleft } + \userdoc_meta:n { #1 } + \userdoc_meta_brace:n { \textbraceright } + } +\cs_new_protected:Npn \userdoc_oarg:n #1 + { + \userdoc_meta_brack:n { [ } + \userdoc_meta:n { #1 } + \userdoc_meta_brack:n { ] } + } +\cs_new_protected:Npn \userdoc_parg:n #1 + { + \userdoc_meta_brace:n { ( } + \userdoc_meta:n { #1 } + \userdoc_meta_brace:n { ) } + } +\cs_new_protected:Npn \userdoc_meta_meta:n #1 + { + \textnormal{\textit{#1}} + } +\cs_new_protected:Npn \userdoc_meta_angle:n #1 + { + \group_begin: + \fontfamily{lmr}\selectfont + \textcolor{\l_userdoc_meta_anglecolor_tl}{#1} + \group_end: + } +\cs_new_protected:Npn \userdoc_meta_brace:n #1 + { + \group_begin: + \color{\l_userdoc_meta_bracecolor_tl} + #1 + \group_end: + } +\cs_new_protected:Npn \userdoc_meta_brack:n #1 + { + \textcolor{\l_userdoc_meta_brackcolor_tl}{#1} + } +% \envexamp{m} +\newsavebox{\boxexaenv} +\tl_new:N \l_tempc_tl +\NewDocumentCommand \envexamp { m } + { + \tl_set:Nn \l_tempc_tl { #1 } + \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tempc_tl + \begin{lrbox}{\boxexaenv}% + \begin{minipage}[t]{3\marginparwidth}% + \raggedright\ttfamily\small + \textcolor{gray}{\textbackslash begin\{\textcolor{pkgcolor}{{\tl_use:N \l_tempc_tl}}\}\myoarg + [type=tt,sbc=gray,ac=lightgray,cf=optcolor]{keyval ~ list}}\par% + \hspace{0.25cm}\ics*{item}\space\mymeta[ac=lightgray,cf=gray]{item ~ content}\par% + \hspace{0.25cm}\ics*{item}\space\myoarg[sbc=gray,ac=lightgray,cf=optcolor]{custom}\space\mymeta[ac=lightgray,cf=gray]{item ~ content}\par + \hspace{0.25cm}\ics*{item*}\myoarg[sbc=gray,ac=lightgray,cf=optcolor]{symbol}\myoarg[sbc=gray,ac=lightgray,cf=optcolor]{offset}\space\mymeta[ac=lightgray,cf=gray]{item ~ content}\par + \textcolor{gray}{\textbackslash end\{{\textcolor{pkgcolor}{{\tl_use:N \l_tempc_tl}}}\}}\par + \end{minipage}% + \end{lrbox}% + \usebox{\boxexaenv} + } +% \cmdexamp{o m o m o} +\tl_new:N \l_tempd_tl +\NewDocumentCommand \cmdexamp { o m o m o } + { + \group_begin: + \small\ttfamily + \textcolor{pkgcolor}{\textbackslash#2} + \IfValueT{#1}{ \textcolor{MediumOrchid}{#1} } + \IfValueT{#3} + { + % \textnormal{\ttfamily } or \c{texttt}\cB\{ \cE\} + \tl_set:Nn \l_tempd_tl { #3 } + % \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tempd_tl + \regex_replace_once:nnN { (\*) } { \c{texttt}\cB\{\c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} \cE\} } \l_tempd_tl + \myoarg[type=tt,sbc=gray,ac=lightgray,cf=optcolor]{\tl_use:N \l_tempd_tl} + } + \IfValueTF{#5} + { + \mymeta[ac=gray,type=tt,cf=MediumOrchid]{#5}% + \mymeta[type=tt,ac=gray,cf=optcolor]{#4} + \mymeta[ac=gray,type=tt,cf=MediumOrchid]{#5}% + } + { \mymarg[type=tt,cbc=gray,ac=lightgray,cf=optcolor]{#4} } + \par + \group_end: + } +% \keyexamp{s m m m} +\NewDocumentCommand \keyexamp{s m m m } + { + \adjustbox{outer=-\marginparsep}{\textcolor{optcolor}{\small\ttfamily{#2}}} + \IfBooleanTF{#1} + { + \hphantom{\textcolor{white}{\,\bfseries\texttt{=}}\,{}} + \mymeta[type=tt,cbc=gray,ac=lightgray,cf=lightgray]{\small{#3}} + } + { + \textcolor{gray}{\,\bfseries\texttt{=}}\,{} + \mymarg[type=tt,cbc=gray,ac=lightgray,cf=optcolor]{\small{#3}} + } + \hfill\textcolor{gray}{\small\textsf{default}:~\emph{#4}}\par% + \MYSortIndex{Keys}{Keys ~ for ~ environments ~ provide ~ by ~ \pkglogo :>\texttt{#2}} + } +% \keyexampcmd{s m m m o} +\NewDocumentCommand \keyexampcmd{s m m m o} + { + \adjustbox{outer=-\marginparsep}{\textcolor{optcolor}{\small\ttfamily{#2}}} + \IfBooleanTF{#1} + { + \hphantom{\textcolor{white}{\,\bfseries\texttt{=}}\,{}} + \mymeta[type=tt,cbc=gray,ac=lightgray,cf=lightgray]{\small{#3}} + } + { + \textcolor{gray}{\,\bfseries\texttt{=}}\,{} + \mymarg[type=tt,cbc=gray,ac=lightgray,cf=optcolor]{\small{#3}} + } + \hfill\textcolor{gray}{\small\textsf{default}:~\emph{#4}}\par% + \IfValueTF{#5} + { + \MYSortIndex{Keys}{Keys ~ for ~ \texttt{\textbackslash{}#5} ~ provide ~ by ~ \pkglogo :>\texttt{#2}} + } + { + \MYSortIndex{Keys}{Keys ~ for ~ \texttt{\textbackslash{}anskey} ~ provide ~ by ~ \pkglogo :>\texttt{#2}} + \MYSortIndex{Keys}{Keys ~ for ~ \texttt{anskey\textcolor{MediumOrchid}{*}} ~ provide ~ by ~ \pkglogo :>\texttt{#2}} + } + } +% \keyexampenv{s m m m} +\NewDocumentCommand \keyexampenv{s m m m } + { + \adjustbox{outer=-\marginparsep}{\textcolor{optcolor}{\small\ttfamily{#2}}} + \IfBooleanTF{#1} + { + \hphantom{\textcolor{white}{\,\bfseries\texttt{=}}\,{}} + \mymeta[type=tt,cbc=gray,ac=lightgray,cf=lightgray]{\small{#3}} + } + { + \textcolor{gray}{\,\bfseries\texttt{=}}\,{} + \mymarg[type=tt,cbc=gray,ac=lightgray,cf=optcolor]{\small{#3}} + } + \hfill\textcolor{gray}{\small\textsf{default}:~\emph{#4}}\par% + \MYSortIndex{Keys}{Keys ~ for ~ \texttt{anskey\textcolor{MediumOrchid}{*}} ~ provide ~ by ~ \pkglogo :>\texttt{#2}} + } +% \mykey{m} +\NewDocumentCommand \mykey{ m } + { + \tl_set:Nn \l_tmpa_tl { #1 } + \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \textcolor{optcolor}{\ttfamily \tl_use:N \l_tmpa_tl } + %\textcolor{optcolor}{\texttt{#1}} + \MYSortIndex{Keys}{Keys ~ for ~ environments ~ provide ~ by ~ \pkglogo :>\texttt{\tl_use:N \l_tmpa_tl}} + } +% \mykeycmd{o s m} +\NewDocumentCommand \mykeycmd{ o s m } + { + \tl_set:Nn \l_tmpa_tl { #3 } + \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \textcolor{optcolor}{\ttfamily \tl_use:N \l_tmpa_tl } + %\textcolor{optcolor}{\texttt{#1}} + \IfBooleanTF{#2} + { + \MYSortIndex{Keys}{Keys ~ for ~ \texttt{anskey\textcolor{MediumOrchid}{*}} ~ provide ~ by ~ \pkglogo :>\texttt{\tl_use:N \l_tmpa_tl}} + } + { + \IfValueTF{#1} + { + \MYSortIndex{Keys}{Keys ~ for ~ \texttt{\textbackslash{}#1} ~ provide ~ by ~ \pkglogo :>\texttt{\tl_use:N \l_tmpa_tl}} + } + { + \MYSortIndex{Keys}{Keys ~ for ~ \texttt{\textbackslash{}anskey} ~ provide ~ by ~ \pkglogo :>\texttt{\tl_use:N \l_tmpa_tl}} + \MYSortIndex{Keys}{Keys ~ for ~ \texttt{anskey\textcolor{MediumOrchid}{*}} ~ provide ~ by ~ \pkglogo :>\texttt{\tl_use:N \l_tmpa_tl}} + } + } + } +% \mypkg{sm} +\NewDocumentCommand \mypkg { s m } + { + \group_begin: + \IfBooleanTF{#1} + { + \pkglogo + \MYSortIndex{packages}{Packages :>\texttt{#2}} + } + { + \textcolor{OrangeRed}{\texttt{#2}}% + \MYSortIndex{packages}{Packages :>\texttt{#2}}% + } + \group_end: + } +% \myclass{m} +\NewDocumentCommand \myclass { m } + { + \mbox{\texttt{\textcolor{OrangeRed}{#1}}} + \MYSortIndex{class}{Document ~ class :>\texttt{#1}} + } +% \myenv{sm} +\NewDocumentCommand \myenv { s m O{}} + { + \IfBooleanTF{#1} + { + \tl_set:Nn \l_tmpa_tl { #2 } + \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \textcolor{pkgcolor}{\ttfamily{\tl_use:N \l_tmpa_tl}}% + \MYSortIndex{environment}{Environments ~ provide ~ by ~\pkglogo :>\texttt{\tl_use:N \l_tmpa_tl}} + } + { + \textcolor{SlateBlue}{\ttfamily{#2}}% + \MYSortIndex{environment}{Environments :>\texttt{#2}} + } + } +% \ics{sm} +\NewDocumentCommand \ics {s m} + { + \IfBooleanTF{#1} + { + \tl_set:Nn \l_tmpa_tl { #2 } + \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \regex_replace_once:nnN { (!) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \textcolor{pkgcolor}{\ttfamily\textbackslash{\tl_use:N \l_tmpa_tl}} + \MYSortIndex{Commands}{Commands ~ provide ~ by ~ \pkglogo :>\texttt{\textbackslash#2}} + } + { + \textcolor{blue!75}{\ttfamily\textbackslash{#2}} + \MYSortIndex{#2}{\texttt{\textbackslash#2}} + } + } +% \icounter{m} +\NewDocumentCommand \icounter { m } + { + \textcolor{optcolor}{\ttfamily #1} + \MYSortIndex{Counters}{Counters ~ defined ~ by ~ \pkglogo :>\texttt{#1}} + } +% \ilabel{sm} +\NewDocumentCommand \ilabel {s m } + { + \tl_set:Nn \l_tmpb_tl { #2 } + \tl_remove_once:Nn \l_tmpb_tl { . } + \tl_remove_once:Nn \l_tmpb_tl { ) } + \tl_remove_once:Nn \l_tmpb_tl { ( } + \MYSortIndex{Labels}{ Labels ~ provide ~ by ~ \pkglogo :>\texttt{\textbackslash \tl_use:N \l_tmpb_tl }} + \tl_set:Nn \l_tmpa_tl { #2 } + \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \regex_replace_once:nnN { (\.) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \regex_replace_once:nnN { (\() } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \regex_replace_once:nnN { (\)) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \tl_put_left:Nn \l_tmpa_tl { \textbackslash } + \IfBooleanT{#1} + { + \tl_put_left:Nn \l_tmpa_tl { \textcolor{MediumOrchid}{ ( } } + }% + \textcolor{optcolor}{ \ttfamily \tl_use:N \l_tmpa_tl } + } +% \mydim{m} +\NewDocumentCommand \mydim { m } + { + \tl_set:Nn \l_tmpa_tl { #1 } + \regex_replace_all:nnN { (\d) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \regex_replace_all:nnN { (\.) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \textcolor{gray}{ \ttfamily \tl_use:N \l_tmpa_tl } + } +% \myfile{m} +\NewDocumentCommand \myfile { m } + { + \group_begin: + \tl_clear:N \l_tmpa_tl + \tl_set:Nn \l_tmpa_tl { #1 } + \regex_replace_all:nnN { (\d) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \regex_replace_all:nnN { (\.) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \textcolor{gray}{ \ttfamily \tl_use:N \l_tmpa_tl } + \group_end: + } +% \myvarenv{m} +\NewDocumentCommand \myvarenv { s m } + { + \group_begin: + \tl_set:Nn \l_tmpa_tl { #2 } + \regex_replace_once:nnN { @{2} }{ enumext } \l_tmpa_tl + \regex_replace_once:nnN { (\*) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \regex_replace_once:nnN { (\:) } { \c{textcolor}\cB\{MediumOrchid\cE\}\cB\{\1\cE\} } \l_tmpa_tl + \IfBooleanTF{#1} + { + \textcolor{pkgcolor}{ \ttfamily \tl_use:N \l_tmpa_tl } + } + { + \tl_put_left:Nn \l_tmpa_tl { \textbackslash } + \textcolor{gray}{ \ttfamily \tl_use:N \l_tmpa_tl } + } + \group_end: + } +% \aviso +\NewDocumentCommand \aviso { } + { + \par\hspace*{-0.5\marginparsep}% + \makebox[0pt][r] + { + \makebox[\marginparsep][r] + { + \scriptsize\textcolor{pkgcolor}{\reflectbox{\faIcon{tag}}}% tagged PDF + } + } + \hskip 0.5\marginparsep + } +% \bomba +\NewDocumentCommand \bomba { } + { + \par\hspace*{-0.5\marginparsep}% + \makebox[0pt][r] + { + \makebox[\marginparsep][r] + { + \footnotesize\textcolor{pkgcolor}{\faIcon{bomb}} + } + } + \hskip 0.5\marginparsep + } +\NewDocumentEnvironment{important}{ s } + { + \small\sffamily + \IfBooleanTF{#1} + { + \bomba% + } + { \aviso } + }{} + +\ExplSyntaxOff +% email https://tex.stackexchange.com/a/663 +\catcode`\_=11\relax% +\newcommand\email[1]{\_email #1\q_nil}% +\def\_email#1@#2\q_nil{% + \href{mailto:#1@#2}{{\emailfont #1\emailampersat #2}}% +}% +\newcommand\emailfont{\sffamily}% +\newcommand\emailampersat{{\color{optcolor}\footnotesize @}}% +\catcode`\_=8\relax% +% Don't copy numbers in code example +\newcommand*{\noaccsupp}[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}} +% Create a language for documentation +\lstdefinelanguage{enumext-doc}{ + texcsstyle = *,% + escapechar =`,% + extendedchars = true,% + keepspaces = true,% + stringstyle = {\color{red}},% + basicstyle = \ttfamily,% \small + alsoletter = {-,.},% @, +% comments + morecomment = [l]{\%},% + commentstyle = \ttfamily\small\color{lightgray},% +% Important words 1 + keywordstyle = [1]{\color{gray}},% + keywords = [1]{begin,end,Verbatim,env,myseq,false,NewDocumentCommand,newlength, the, red, blue, gray,% + settowidth, dimeval, dimexpr, IfBooleanTF,footnotehyper, DocumentMetadata, % + IfDocumentMetadataTF, RenewDocumentCommand, pt, em, SuspendTagging, ResumeTagging,% + },% +% Other words 2 + keywordstyle = [2]{\color{blue!75}},% + keywords = [2]{usepackage,section,documentclass,input,listparindent,linewidth, emph, textbf,makesavenoteenv, makelabel,% + columnseprule, footnote, footnotemark, footnotetext, raggedcolumns, hspace, parindent, removelastskip, % + subsection, list,endlist,leftmargin, itemindent,bfseries,endminipage, minipage, parskip, raisebox, strut,smash, % , + labelwidth,labelsep,labelindent,label,ref,topsep,parsep,includegraphics, itemize, description, NewCommandCopy, % + multicolsep,leftmargini,leftmarginii, hfill, small, vspace, par, parbox, value, noindent, makebox, textcolor, % + itemindent, labelwidth, leftmarginiii,leftmarginiv,itemindent, itemsep, strutbox, raggedright, cs_new_eq, N, NN,% + labelwidth, fbox, addvspace, Alph, alph, arabic, Roman, roman, partopsep, baselineskip, mode_leave_vertical,% + textbullet, textendash, textasteriskcentered, textperiodcentered, raggedleft, peek_remove_spaces, skip_horizontal, % + triangleright, diamond, circ, parleft, star, centering, ast, hyperlink,hypertarget,IfHyperBoolean,newtheorem, % + aux_i, aux_ii, aux_iii, w, n, N, if@noitemarg, if, if@hyper@item, hyper, noitemarg, skip_vertical, },% +% Other words 3 + keywordstyle = [3]{\color{optcolor!85}},% + keywords = [3]{document,article,setlength,pagestyle,definecolor, chapter,},%, +% Reserved words 4 (enumext pkg) + keywordstyle = [4]{\color{pkgcolor}},% + keywords = [4]{enumext,keyans,keyanspic, getkeyans, anskey, anspic, item, anskey*, itemwidth, enumextmeta, % + setenumext,printkeyans,miniright,labelbx, mywrap, descitemwd,theenumXi,theenumXii,theenumXiii,% + setenumextmeta, foreachkeyans, theenumXiv,theenumXv, theenumXvii, theenumXviii},% +% Reserved words 5 (plain TeX or internal) + keywordstyle = [5]{\color{red}},% + keywords = [5]{makeatletter,makeatother,let,verb,def,prevdepth,glue, if@minipage,% if@noitemarg + splittopskip,showboxdepth,topskip,showoutput,nointerlineskip, ignorespaces, unskip, unkern, lastnodetype,% + rightskip, @rightskip, @flushglue, hbadness, hss},% +% Reserved words 6 (optcolor) KEYS + keywordstyle = [6]{\color{optcolor}},% + keywords = [6]{save-ans,wrap-ans,save-ref,show-pos,show-ans,columns,list-offset, eunumXi,% + nosep,before,after,start, right, item-sym, item-sep, hyperfootnotes, item-star, % + scale,wrap-label,font,first,widest,mini-env,list-indent, no-store, save-key,% + store-env, print-env, write-out, force-eol, write-env, overwrite, unknown, % + midsep, wrapper,label-pos,label-sep, layout-sty, layout-sep, layout-top, lang,% + pdfversion, pdfstandard, testphase, alt},% +% Reserved words 7 (label values) + keywordstyle = [7]{\color{MediumOrchid}},% + keywords = [7]{m,s,M,VIII,viii,v,E,t,l,A,XXIII,true, false,test,sample,above,below,ua-2,phase-III,% + en-US, math, title, table, firstaid },% +% literate + literate =*{\{}{{{\color{gray}{\char`\{}}}}{1} + {\}}{{{\color{gray}{\char`\}}}}}{1} + {\|}{{{\color{gray}{\char`\|}}}}{1} + {\$}{{{\color{gray}{\char`\$}}}}{1} + {\#}{{{\color{optcolor}{\char`\#}}}}{1} + {[}{{\textcolor{gray}{[}}}{1} + {]}{{\textcolor{gray}{]}}}{1} + {,}{{\textcolor{gray}{,}}}{1} + {;}{{\textcolor{gray}{;}}}{1} + {:}{{\textcolor{red}{:}}}{1} + {`}{{\textcolor{gray}{\textasciigrave}}}{1} + {\&}{{\textcolor{gray}{\&}}}{1} + {>}{{\textcolor{OrangeRed}{\guillemotright}}}{1} + {<}{{\textcolor{OrangeRed}{\guillemotleft}}}{1} + {*}{{\textcolor{MediumOrchid}{*}}}{1} + {!}{{\textcolor{MediumOrchid}{!}}}{1} + {@}{{\textcolor{MediumOrchid}{@}}}{1}% + {\^}{{\textcolor{optcolor}{\textasciicircum}}}{1} + {0}{{\textcolor{MediumOrchid}{0}}}{1} + {1}{{\textcolor{MediumOrchid}{1}}}{1} + {2}{{\textcolor{MediumOrchid}{2}}}{1} + {3}{{\textcolor{MediumOrchid}{3}}}{1} + {4}{{\textcolor{MediumOrchid}{4}}}{1} + {5}{{\textcolor{MediumOrchid}{5}}}{1} + {6}{{\textcolor{MediumOrchid}{6}}}{1} + {7}{{\textcolor{MediumOrchid}{7}}}{1} + {8}{{\textcolor{MediumOrchid}{8}}}{1} + {9}{{\textcolor{MediumOrchid}{9}}}{1} + {.0}{{\textcolor{MediumOrchid}{.0}}}{2}% Following is to ensure that only periods + {.1}{{\textcolor{MediumOrchid}{.1}}}{2}% followed by a digit are changed. + {.2}{{\textcolor{MediumOrchid}{.2}}}{2} + {.3}{{\textcolor{MediumOrchid}{.3}}}{2} + {.4}{{\textcolor{MediumOrchid}{.4}}}{2} + {.5}{{\textcolor{MediumOrchid}{.5}}}{2} + {.6}{{\textcolor{MediumOrchid}{.6}}}{2} + {.7}{{\textcolor{MediumOrchid}{.7}}}{2} + {.8}{{\textcolor{MediumOrchid}{.8}}}{2} + {.9}{{\textcolor{MediumOrchid}{.9}}}{2} + {=}{{\textcolor{gray}{=}}}{1},% +}[keywords,tex,comments,strings]% end language + +% \begin{examplecode}[key=val]...\end{examplecode} +\lstnewenvironment{examplecode}[1][]{% +\lstset{ + language = enumext-doc,% + stringstyle = {\color{red}},% + basicstyle = \ttfamily\small,% + columns = fullflexible,% + fontadjust = true,% + aboveskip = 8pt,% + belowskip = 5pt,% + rulecolor = \color{gray!50},% + framesep = \fboxsep,% + framerule = \fboxrule,% + xleftmargin = \dimexpr\fboxsep+\fboxrule\relax,% + xrightmargin= \dimexpr\fboxsep+\fboxrule\relax,% + #1,% + }% close lstset +}{\vspace{-\parskip}}% close examplecode +% \lstinline[style=inline]|...| +\lstdefinestyle{inline} + { + language = enumext-doc,% + upquote = true,% + numbersep = 1em,% + escapechar =`,% + basicstyle =\ttfamily,%\small + numberstyle = \tiny\color{lightgray}\noaccsupp,% + literate =*{\%}{{\textcolor{gray}{\%}}}{1} + {i}{{\textcolor{optcolor}{i}}}{1} + {ii}{{\textcolor{optcolor}{ii}}}{2} + {iii}{{\textcolor{optcolor}{iii}}}{3} + {iv}{{\textcolor{optcolor}{iv}}}{2} + {v}{{\textcolor{optcolor}{v}}}{1} + {vi}{{\textcolor{optcolor}{vi}}}{1} + } +% Set default \lstinline style +\lstset{style=inline} +% Get file info +\GetFileInfo{enumext.sty} +% Config hyperref +\hypersetup + { + allcolors = linkcolor, + colorlinks = true, + linktoc = all, + pdftitle = {.:: The enumext package --- \fileinfo{} ::.}, + pdfauthor = {Pablo González L}, + pdfsubject = {Documentation for \fileversion{} [\filedate] }, + pdfkeywords = {worksheets, multiple choice, expl3, l3prop, l3seq, list, enumerate, store answers, tagged}, + bookmarksopenlevel = 2, + } +% Configuration titleps and titlesec +\settitlemarks{section} +\renewpagestyle{plain}[\color{optcolor}\small\sffamily]{% +\setfoot{\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax% + \parbox{1.93\paperwidth}{\hfil\thepage\,/\,\pageref{LastPage}}}}% + {}% + {}% +} +\newpagestyle{myheader}[\color{optcolor}\small\sffamily]{% +\renewcommand\makeheadrule{% +\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax + \color{rulecolor}\rule[0.3cm]{\paperwidth}{0.7cm}}\hss +} +\setfoot{\rlap{\hskip\dimexpr-\oddsidemargin-1in\relax% + \parbox{1.93\paperwidth}{\hfil\thepage\,/\,\pageref{LastPage}}}}% + {\parbox{\textwidth}{\raggedright \textcolor{gray}{\raisebox{-1pt}{\textcopyright}{}2024 by Pablo González L}}}% + {}% +\sethead{\llap{\raisebox{0.55cm}{\parbox{\dimexpr\oddsidemargin+1in\relax}{\makebox[0pt][l]{\hspace{15pt}\pkglogo\space\fileversion}}}}} + {\raisebox{0.55cm}{\parbox{\textwidth}{\hspace*{-\oddsidemargin}\centering\small\S.\thesection\space\sectiontitle}}}% + {}% +} +\titlecontents{section}[0mm]{}% + {\bfseries\contentspush{\makebox[5mm][l]{\thecontentslabel\hfill}}}% + {\hspace*{-5mm}}% numberless + {\hspace{0.25em}\titlerule*[6pt]{.}\contentspage}% +\titlecontents{subsection}[5mm]{}% + {\contentspush{\makebox[6mm][l]{\thecontentslabel\hfill}}} + {\hspace*{-11mm}}% numberless + {\hspace{0.25em}\titlerule*[6pt]{.}\contentspage}% +\titlecontents{subsubsection}[11mm]{}% + {\contentspush{\makebox[8mm][l]{\thecontentslabel\hfill}}} + {\hspace*{-19mm}}% numberless + {\hspace{0.25em}\titlerule*[6pt]{.}\contentspage}% +% Table of contents +\makeatletter +\renewcommand\tableofcontents{% +\begingroup% +\section*{\contentsname\quad{\color{gray}\leaders\hrule height 5pt depth -4.4pt\hfill}% + \@mkboth{% + \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}% +\vspace*{-14pt} +\setlength{\columnsep}{10pt}% + \begin{multicols}{2}% + \@starttoc{toc}% +\end{multicols}% +\vspace*{-3pt}{\color{gray}\hrule height 0.6pt}% +\vspace*{5pt} +\endgroup +} +\makeatother +% \thanks +\makeatletter +\renewcommand*{\@fnsymbol}[1]{\ensuremath{\ifcase#1\or \textcolor{pkgcolor}{*} +\or \textcolor{pkgcolor}{\dagger} \or \ddagger\or \mathsection +\or \mathparagraph\or \|\or **\or \dagger\dagger +\or \ddagger\ddagger \else\@ctrerr\fi}} +\makeatother +% \usepackage{lua-visual-debug} +\usepackage[font=small,skip=2pt]{caption} +% For input samples +\usepackage{tikzducks,siunitx,amssymb} +\sisetup{output-decimal-marker={,}} +\newcommand*{\myCircled}[1]{% + \begin{tikzpicture}[baseline=(number.base)] + \node[circle, draw=green!10!gray, inner sep=1pt, fill=blue!30!green!10] (number) {#1}; + \end{tikzpicture}% +} +\usetikzlibrary{shapes.geometric} +\newcommand*{\mySquared}[1]{% + \begin{tikzpicture}[baseline=(number.base),square/.style={regular polygon,regular polygon sides=4}] + \node[square, rounded corners=1pt, inner sep=1pt, draw=none, fill=gray!40] (number) {\makebox[\height]{#1}}; + \end{tikzpicture}% +} +% For SAT sample +\newsavebox{\satbox} +\sbox\satbox{\small\textbf{67}}% +\NewDocumentCommand \stylesat { m } + {% + \setlength{\fboxsep}{2pt}% + \raisebox{2\fboxsep}{% + \noindent\colorbox{black}{\textcolor{white}{\makebox[\dimeval{\labelwidth-2\fboxsep}][c]{\small\textbf{\vphantom{67}#1}}}}% + \colorbox{lightgray}{\phantom{\rule[-\dp\satbox]{\dimeval{\linewidth-2\fboxsep}}{\dimeval{\dp\satbox+\ht\satbox}}}}}% + } +% For non-numbered list samples, need ´%´ at end (prevent wrong unwanted spaces) +\NewDocumentCommand \labelbx { s +m } + {% + \IfBooleanTF{#1} + {\strut\smash{\parbox[t]{\labelwidth}{\raggedright{#2}}}}% + {\strut\smash{\parbox[t]{\labelwidth}{\raggedleft{#2}}}}% + } +%%%\ExplSyntaxOn +%%5\NewDocumentCommand \labelbx { s +m } +%% { +%% %% \tag_suspend:n {\parbox} +%% \IfBooleanTF{#1} +%% { \parbox[t]{\labelwidth}{\raggedright{#2}} } +%% { \parbox[t]{\labelwidth}{\raggedleft{#2}} } +%% %% \tag_resume:n {\parbox} +%% } +%%%\ExplSyntaxOff +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{ +% \scalebox{2.67}{\pkglogo}\\[-10pt] +% {\large\textcolor{gray}{\fetamontotf{enumerate exercise sheets}}}\\[0pt] +% \fileversion \quad \filedate\thanks{ +% This file describes a documentation for \fileversion, last revised +% \filedate.}\\[25pt] +% \author{ +% \large +% \raisebox{-1pt}{\textcopyright}{}2024 by Pablo González\thanks{ +% E-mail: \textcolor{OrangeRed}{\textsf{\guillemotleft}}\email{pablgonz@educarchile.cl}\textcolor{OrangeRed}{\textsf{\guillemotright}}. +% }% +% } +% \small +% \textsc{ctan}: \url{https://www.ctan.org/pkg/enumext}\\ +% \textcolor{gray}{\scriptsize\faIcon[regular]{github}}\,\,\,\url{https://github.com/pablgonz/enumext} +% \vspace*{-2cm} +% } +% \date{} +% \maketitle +% +% \begin{abstract} +% This package provides enumerated list environments compatible +% with \emph{tagging} \texttt{PDF} for creating \emph{\enquote{simple +% exercise sheets}} along with \emph{\enquote{multiple choice questions}}, +% storing the \emph{\enquote{answers}} to these in memory using \mypkg{multicol} +% and \mypkg{scontents} packages. +% \end{abstract} +% +% \tableofcontents +% +% \section*{Motivation and acknowledgments} +% +% Usually it is enough to use the classic \myenv{enumerate} environment to +% generate \emph{\enquote{simple exercise sheets}} or +% \emph{\enquote{multiple choice questions}}, the basic idea behind +% \mypkg*{enumext} is to cover three points: +% +% \begin{enumerate}[left=0pt, nosep,labelsep=5pt, label=\small\arabic*.,topsep=2pt] +% \item To have a simple interface to be able to write \emph{\enquote{lists of +% exercises}} with \emph{\enquote{answers}}. +% \item To have a simple interface for writing \emph{\enquote{multiple choice +% questions}}. +% \item To have a simple interface for placing \emph{\enquote{columns}} +% and \emph{\enquote{drawings}} or \emph{\enquote{tables}}. +% \end{enumerate} +% +% This package would not be possible without Phelype Oleinik who has +% collaborated and adapted a large part of the code and all +% \hologo{LaTeX} team for their great work and to the different members +% of the \href{https://tex.stackexchange.com}{TeX-SX} community who have +% provided great answers and ideas. Here a note of the main ones: +% +% \begin{enumerate}[left=0pt, labelsep=5pt, nosep, label=\small\arabic*.,topsep=2pt] +% \item Answer given by Alan Munn in \href{https://tex.stackexchange.com/a/300418}{\textbackslash topsep, \textbackslash itemsep, \textbackslash partopsep, \textbackslash parsep - what do they each mean (and what about the bottom)?} +% +% \item Answer given by Enrico Gregorio in \href{https://tex.stackexchange.com/a/34172}{Understanding minipages - aligning at top} +% +% \item Answer given by Ulrich Diez in \href{https://tex.stackexchange.com/a/553839/7832}{Different mechanics of hyperlink vs. hyperref} +% +% \item Answer given by Enrico Gregorio in \href{https://tex.stackexchange.com/a/294460/7832}{Minipage and multicols, vertical alignment} +% +% \end{enumerate} +% +% \thispagestyle{plain} +% +% \section*{License and Requirements} +% \label{sec:licence} +% +% Permission is granted to copy, distribute and/or modify this software under +% the terms of the LaTeX Project Public License (lppl), version 1.3 or later +% (\url{https://www.latex-project.org/lppl.txt}). +% The software has the status \enquote{maintained}. +% +% The \mypkg*{enumext} package loads and requires \mypkg{multicol}\cite{multicol} +% and \mypkg{scontents}\cite{scontents} packages, need to have a modern \hologo{TeX} distribution such as +% \hologo{TeX} Live or \hologo{MiKTeX}. It has been tested with the standard +% classes provided by \hologo{LaTeX}: \myclass{book}, \myclass{report}, +% \myclass{article} and \myclass{letter} on \mydim{10pt}, \mydim{11pt} and \mydim{12pt}. +% +% \smallskip +% +% \begin{important}* +% The minimum requirement is \hologo{LaTeX} release 2024-11-01. +% \end{important} +% +% \pagestyle{myheader} +% +% \section{Introduction} +% +% In the \hologo{LaTeX} world world there are many useful packages and +% classes for creating \emph{\enquote{lists of exercises}}, \emph{\enquote{worksheets}} or +% \emph{\enquote{multiple choice questions}}, classes like \myclass{exam}\cite{exam} +% and packages like \mypkg{xsim}\cite{xsim} do the job perfectly, but +% they don't always fit the basic day to day needs. +% +% \smallskip +% +% In my work (and in the work of many teachers) it is common to use +% \emph{\enquote{simple exercise sheets}} also known as +% \emph{\enquote{informal lists of exercises}}, as an example: +% +% \smallskip +% +% \begin{enumext}[save-ans=temp2,columns=2,nosep,save-ref=true]% +% \item Factor $x^{2}-2x+1$ \anskey{$\left(x-1\right)^{2}$} +% \item Factor $3x+3y+3z$ \anskey{$3(x+y+z)$} +% \item True False +% \begin{enumext}[nosep] +% \item $\alpha > \delta$ \anskey{False} +% \item \LaTeX2e\ is cool? \anskey{Very True!} +% \end{enumext} +% \item Related to Linux +% \begin{enumext}[nosep] +% \item You use linux? \anskey{Yes} +% \item Usually uses the package manager? \anskey{Yes, \texttt{dnf}} +% \item Rate the following package and class +% \begin{enumext}[nosep] +% \item \texttt{xsim-exam} \anskey{doesn't exist for now :(} +% \item \texttt{xsim} \anskey{very good} +% \item \texttt{exsheets} \anskey{obsolete} +% \end{enumext} +% \end{enumext} +% \end{enumext} +% +% \smallskip +% +% Sometimes we are also interested in showing the \emph{\enquote{answers}} +% along with the questions: +% +% \smallskip +% +% \begin{enumext}[save-ans=worksheet,columns=2,show-ans=true,nosep,save-ref=true] +% \item Factor $x^{2}-2x+1$ \anskey{$\left(x-1\right)^{2}$} +% \item Factor $3x+3y+3z$ \anskey{$3(x+y+z)$} +% \item True False +% \begin{enumext}[nosep] +% \item $\alpha > \delta$ \anskey{False} +% \item \LaTeX2e\ is cool? \anskey{Very True!} +% \end{enumext} +% \item Related to Linux +% \begin{enumext}[nosep] +% \item You use linux? \anskey{Yes} +% \item Usually uses the package manager? \anskey{Yes, \texttt{dnf}} +% \item Rate the following package and class +% \begin{enumext}[nosep] +% \item \texttt{xsim-exam} \anskey{doesn't exist for now :(} +% \item \texttt{xsim} \anskey{very good} +% \item \texttt{exsheets} \anskey{obsolete} +% \end{enumext} +% \end{enumext} +% \end{enumext} +% +% \smallskip +% +% Or we are interested in referring to a specific question and its +% \emph{\enquote{answer}}, for example: +% +% \smallskip +% +% The answer to \ref{worksheet:4} is \enquote{\getkeyans{worksheet:4}} +% and the answer to \ref{worksheet:8} is \enquote{\getkeyans{worksheet:8}}. +% +% \smallskip +% +% Or we are interested in printing all the \emph{\enquote{answers}}: +% +% \smallskip +% +% \printkeyans{worksheet} +% +% \smallskip +% +% Another very common thing to use in my work is \emph{\enquote{multiple choice +% questions}}, for example: +% +% \smallskip +% +% \begin{enumext}[save-ans=mytest,columns=2,nosep,save-ref=true,save-sep={ }] +% \item First type of questions +% \begin{keyans}[columns=2,noitemsep] +% \item value +% \item*[$x=5$] correct +% \item value +% \item value +% \end{keyans} +% \item Second type of questions +% \begin{enumext}[no-store,label=\Roman*.,noitemsep] +% \item $2\alpha+2\delta=90^{\circ}$ +% \item $\alpha=\delta$ +% \item $\angle EDF=45^{\circ}$ +% \end{enumext} +% \begin{keyans}[columns=2,noitemsep] +% \item I only +% \item II only +% \item I and II only +% \item* I and III only +% \item I, II, and III +% \end{keyans} +% \item* Third type of questions +% \begin{enumext}[no-store,list-offset=0.5cm,label=(\arabic*),noitemsep] +% \item $2\alpha+2\delta=90^{\circ}$ +% \item $\angle EDF=45^{\circ}$ +% \end{enumext} +% \begin{keyans}[columns=2,noitemsep] +% \item value +% \item value +% \item*[some note] value +% \item value +% \item value +% \end{keyans} +% +% \item Question with image and label below: +% +% \begin{keyanspic}[label-pos=below, layout-sty={3,2}] +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-b}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic*[A duck]{\includegraphics[scale=0.30]{example-image-duck}} +% \end{keyanspic} +% +% \item Question with image on left side: +% +% \begin{keyans}[mini-env=0.5\linewidth, columns=1,noitemsep] +% \item value +% \item value +% \item value +% \item*[\enquote{other note}] correct +% \item value +% \miniright +% \includegraphics[scale=0.15]{example-image-b} +% \end{keyans} +% \end{enumext} +% +% \smallskip +% +% Where what we are interested in the \mymeta{label} and a +% \emph{\enquote{short note}} that we leave as an explanation, and then +% print them: +% +% \smallskip +% +% \printkeyans{mytest} +% +% \smallskip +% +% The \mypkg*{enumext} package was created and designed to meet these +% small requirements in the creation of \emph{\enquote{simple +% worksheets}} and \emph{\enquote{multiple choice questions}}. +% +% \smallskip +% +% \begin{important}* +% These \emph{\enquote{simple worksheets}} or \emph{\enquote{multiple +% choice questions}} appear to be easy to obtain using a combination of +% the \myenv{enumerate}, \myenv{minipage} and \myenv{multicols} +% environments, but like many things, what \emph{\enquote{looks +% simple}} is not so simple. +% \end{important} +% +% \subsection{Description and usage} +% +% The \mypkg*{enumext} package defines enumerated environments using the +% \myenv{list} environment provided by \hologo{LaTeX}, but +% \emph{\enquote{does not redefine}} any internal commands associated with +% it such as |\list|, |\endlist| or |\item| outside of the +% \emph{\enquote{scope}} in which they are defined. +% +% \smallskip +% +% \begin{important}* +% This package is NOT intend to replace the \myenv{enumerate} environment +% nor replace the powerful \mypkg{enumitem}\cite{enumitem}, the approach +% is intended to work without hindering either of them. +% \end{important} +% +% \smallskip +% +% This package can be used with |xelatex|, |lualatex|, |pdflatex| and +% the classical |latex>dvips>ps2pdf| and is present in \hologo{TeX} Live and \hologo{MiKTeX}, +% use the package manager to install. For manual installation, download +% \href{http://mirrors.ctan.org/macros/latex/contrib/enumext.zip}{enumext.zip} +% and unzip it, run \lstinline[language=enumext-doc,basicstyle=\ttfamily]+luatex enumext.ins+ +% and move all files to appropriate locations, then run |mktexlsr|. To produce the documentation run +% \lstinline[language=enumext-doc,basicstyle=\ttfamily]+arara enumext.dtx+. +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single,language={}] + enumext.sty > TDS:tex/latex/enumext/ + enumext.pdf > TDS:doc/latex/enumext/ + README.md > TDS:doc/latex/enumext/ + enumext.dtx > TDS:source/latex/enumext/ + enumext.ins > TDS:source/latex/enumext/ +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% The package is loaded in the usual way: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\usepackage{enumext} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \subsection{The concept of left margin} +% +% There is a direct relationship between the parameters |\leftmargin|, +% |\itemindent|, \ics{labelwidth} and \ics{labelsep} plus an +% \emph{\enquote{extra space}} that makes it difficult to obtain the +% desired \emph{horizontal spaces} in a \myenv{list} environment. +% Usually we don't want the \myenv{list} to go beyond the left margin of the +% page, but since these four values are related, that causes a problem. +% +% The \mypkg{enumitem}\cite{enumitem} package adds the |\labelindent| parameter to +% solve some of these problems. A simplified representation of this in +% the figure \ref{fig:one}. +% \setlength\intextsep{3pt} +% \begin{figure}[ht] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[<->,color=gray] (-0.5,6.175) --node[below,,text=lightgray,font=\footnotesize\ttfamily]{margin page} (2,6.175); +% \draw[line width=0.5pt,dash pattern=on 2pt off 2pt,color=gray] (2,4.85) -- (2,7.5); +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=blue!75]{\texttt{\textbackslash{}labelindent}} (4.5,7.0); +% \draw[<->,color=gray] (4.5,7.0) --node[above,text=blue!75]{\texttt{\textbackslash{}labelwidth}} (7.5,7.0); +% \draw[<->,color=gray] (7.5,7.0) --node[above,text=blue!75]{\texttt{\textbackslash{}labelsep}} (9.5,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (4.5,6.5) rectangle (7.5,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.5,6.5) rectangle (9.5,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,6.5) rectangle (15,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,6.0) rectangle (15,6.35); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,5.5) rectangle (15,5.85); +% \draw[<->,color=gray] (2.0,5.35) --node[below,text=blue!75]{\texttt{\textbackslash{}leftmargin}} (7.5,5.35); +% \draw[<->,color=gray] (7.5,5.35) --node[below,text=blue!75]{\texttt{\textbackslash{}itemindent}} (9.5,5.35); +% \end{tikzpicture} +% \caption{Representation of horizontal lengths in \mypkg{enumitem}.} +% \label{fig:one} +% \end{figure} +% +% The \mypkg*{enumext} package does NOT provide a user interface to set the values for +% |\leftmargin| and |\itemindent|, instead it provides the keys +% \mykey{list-offset} and \mykey{list-indent} which internally set the +% values for |\leftmargin| and |\itemindent|. The concepts of |\leftmargin| and |\itemindent| +% are different in \mypkg*{enumext}. The figure \ref{fig:two} shows the visual representation of idea. +% +% \begin{figure}[ht] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[<->,color=gray] (-0.5,6.175) --node[below,text=lightgray,font=\footnotesize\ttfamily]{margin page} (2,6.175); +% \draw[line width=0.5pt,dash pattern=on 2pt off 2pt,color=gray] (2,4.85) -- (2,7.5); +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{list-offset}} (4.5,7.0); +% \draw[<->,color=gray] (4.5,7.0) --node[above,text=blue!75]{\vphantom{p}\texttt{\textbackslash{}labelwidth}} (7.5,7.0); +% \draw[<->,color=gray] (7.5,7.0) --node[above,text=blue!75]{\texttt{\textbackslash{}labelsep}} (9.5,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (4.5,6.5) rectangle (7.5,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.5,6.5) rectangle (9.5,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,6.5) rectangle (15,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,6.0) rectangle (15,6.35); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,5.5) rectangle (15,5.85); +% \draw[<->,color=gray] (4.5,5.35) --node[below,text=optcolor]{\texttt{list-indent}} (9.5,5.35); +% \end{tikzpicture} +% \caption{Representation of horizontal lengths concept in \mypkg*{enumext}.} +% \label{fig:two} +% \end{figure} +% +% In this way we reduce a \emph{little} the amount of parameters we have to +% pass. With the default values of keys \mykey{list-offset}, +% \mykey{list-indent}, \mykey{labelwidth} and \mykey{labelsep} the lists +% will have the (usually) expected output for \emph{\enquote{simple +% worksheets}}. The figure \ref{fig:three} shows the visual representation. +% +% \begin{figure}[ht] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[<->,color=gray] (-0.5,6.175) --node[below,text=lightgray,font=\footnotesize\ttfamily]{margin page} (2,6.175); +% \draw [line width=0.5pt,dash pattern=on 2pt off 2pt,color=gray] (2,4.85) -- (2,7.5); +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{labelwidth}} (5.0,7.0); +% \draw[<->,color=gray] (5.0,7.0) --node[above,text=optcolor]{\texttt{labelsep}} (7.0,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,6.5) rectangle (5.0,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,6.5) rectangle (7.0,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.5) rectangle (15,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.0) rectangle (15,6.35); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,5.5) rectangle (15,5.85); +% \draw[<->,color=gray] (2.0,5.35) --node[below,text=optcolor]{\texttt{list-indent}} (7.0,5.35); +% \end{tikzpicture} +% \caption{Default horizontal lengths \mykey{list-offset}=\mydim{0pt}, \mykey{list-indent}=\ics{labelwidth}+\ics{labelsep} in \mypkg*{enumext}.} +% \label{fig:three} +% \end{figure} +% +% \subsection{User interface} +% \label{sec:interface} +% +% The user interface consists of two main list environments |enumext| +% (vertical) and |enumext*| (horizontal), the environment |anskey*| and +% the command |\anskey| to \emph{\enquote{store content}} and the +% environments |keyans|, |keyans*| and |keyanspic| for multiple choice. +% It also provides the commands |\getkeyans| to print individual +% \emph{stored content}, |\printkeyans| and |\foreachkeyans| to print +% all \emph{stored content}, |\miniright| for \myenv{minipage}, |\setenumext| +% and |\setenumextmeta| to config \myoarg{key \textnormal{\textcolor{gray}{=}} val} options. +% +% \subsubsection{Internal counters} +% +% The package \mypkg*{enumext} uses internally the \icounter{enumXi}, +% \icounter{enumXii}, \icounter{enumXiii}, \icounter{enumXiv} counters +% for the four nesting levels of the \myenv*{enumext} environment, the +% \icounter{enumXv} counter for the \myenv*{keyans} environment, the +% \icounter{enumXvi} counter for the \myenv*{keyanspic} environment, +% the counter \icounter{enumXvii} for \myenv*{enumext*} environment and the counter +% \icounter{enumXviii} for \myenv*{keyans*} environment. +% +% \smallskip +% +% \begin{important}* +% If any package defines these counters or they are user-defined +% in the document, the package will return a fatal error and abort the +% load. +% \end{important} +% +% \subsubsection{Public dimension} +% +% The package \mypkg*{enumext} only provides a single public dimension +% |\itemwidth| and is intended for user convenience only and is not +% for internal use as such. The dimension |\itemwidth| is \emph{rigid length} +% and contains the \emph{\enquote{width of the content}} of each |\item| +% regardless of \mykey{labelwidth} and \mykey{labelsep}. +% +% \smallskip +% +% \begin{important}* +% If any package defines |\itemwidth| or they are user-defined |\itemwidth| +% in the document, the package will overwrite it without warning. +% \end{important} +% +% \subsubsection{Support for \pkg{multicol}} +% +% The package provides direct support for using the \mypkg{multicol}\cite{multicol} +% package. This allows to obtain directly a two-column output as shown +% in the figure \ref{fig:fourth}. +% +% \begin{figure}[ht] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{labelwidth}} (5.0,7.0); +% \draw[<->,color=gray] (5.0,7.0) --node[above,text=optcolor]{\texttt{labelsep}} (7.0,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,6.5) rectangle (5.0,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,6.5) rectangle (7.0,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.5) rectangle (17.5,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,5.5) rectangle (11.5,6.35) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{column one} \\ +% \textcolor{blue}{\emph{nested items}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (13.5,5.5) rectangle (17.5,6.35) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{column two} \\ +% \textcolor{blue}{\emph{nested items}} +% \end{tabular}}; +% \draw[<->,color=gray] (2.0,5.35) --node[below,text=optcolor]{\texttt{list-indent}} (7.0,5.35); +% \draw[<->,color=gray] (11.5,5.35) --node[below,text=optcolor]% +% {\begin{tabular}{c} +% \texttt{column-sep} \\ +% \textcolor{blue}{\texttt{\textbackslash{}columnbreak}} +% \end{tabular}} +% (13.5,5.35); +% \end{tikzpicture} +% \caption{Representation of the two column output for a nested level in \myenv*{enumext} environment.} +% \label{fig:fourth} +% \end{figure} +% +% The \emph{\enquote{non starred}} version of the \myenv{multicols} +% environment is always used together with the \ics{raggedcolumns} +% command and is controlled by \mykey{columns} and \mykey{columns-sep} +% keys. It can be used in all nesting levels of the +% environment |enumext| and the environment |keyans| and can +% together with the \mykey{mini-env} key. If you need to force a +% start a new column \ics{columnbreak} must be used (see \S\ref{key:multi}). +% +% \smallskip +% +% \begin{important}* +% The |\columnseprule| command is not available as a key and is set to +% \emph{\enquote{zero}} for the inner levels and the \myenv*{keyans} environment. If the value of +% this is set inside the document, it will affect \emph{\enquote{all environments}} that +% use the \mykey{columns} key. +% \end{important} +% +% \subsubsection{Support for \env{minipage}} +% +% The package provides direct support for \myenv{minipage} +% environment, this allows you to obtain an output like the +% one shown in figure \ref{fig:five}. +% +% \begin{figure}[!htbp] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{labelwidth}} (5.0,7.0); +% \draw[<->,color=gray] (5.0,7.0) --node[above,text=optcolor]{\texttt{labelsep}} (7.0,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,6.5) rectangle (5.0,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,6.5) rectangle (7.0,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.5) rectangle (17.5,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,5.5) rectangle (12.5,6.35) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage left} \\ +% \textcolor{blue}{\emph{nested list}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (14.5,5.5) rectangle (17.5,6.35) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage right} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% \draw[<->,color=gray] (2.0,5.35) --node[below,text=optcolor]{\texttt{list-indent}} (7.0,5.35); +% \draw[<->,color=gray] (7.0,5.35) --node[below,text=optcolor]{\texttt{mini-env}} (12.5,5.35); +% \draw[<->,color=gray] (12.5,5.35) --node[below,text=optcolor]% +% {\begin{tabular}{c} +% \texttt{mini-sep} \\ +% \textcolor{pkgcolor}{\texttt{\textbackslash{}miniright}} +% \end{tabular}} (14.5,5.35); +% \end{tikzpicture} +% \caption{Representation of the \mykey{mini-env} output for a nested level \myenv*{enumext} environment.} +% \label{fig:five} +% \end{figure} +% +% The \myenv{minipage} environments on \emph{\enquote{left side}} and +% \emph{\enquote{right side}} is always used with \emph{\enquote{aligned +% on top}} |[t]|. It can be used in all nesting levels of the +% environment |enumext| and the environment |keyans| and is controlled +% by \mykey{mini-env} and \mykey{mini-sep} keys. In order to switch from +% the \emph{\enquote{left}} side \myenv{minipage} environment to the +% \emph{\enquote{right}} side one must use the command |\miniright| +% (see~\S\ref{key:mini}). +% +% \subsubsection{The \cs[no-index]{label} and \cs[no-index]{ref} system} +% +% This package provides a user interface like the +% \mypkg{enumitem}\cite{enumitem} package to customize the references +% which is activated by the \mykey{ref} key (\S\ref{subsec:label-and-ref}), the standard \hologo{LaTeX} +% \ics{label} and \ics{ref} commands work as usual. +% It also provides an \emph{\enquote{internal reference}} system for the +% \emph{\enquote{stored content}} by means of the key \mykey{save-ref} +% (\S\ref{subsec:label-ref}) when the key \mykey{save-ans} (\S\ref{subsec:storage-keys}) is active. +% +% \subsubsection{Support for \cs[no-index]{footnote}}\label{doc:footnote} +% +% The \myenv*{enumext*} and \myenv*{keyans*} environments and the +% \mykey{mini-env} key use the \myenv{minipage} environment in their +% implementation but in a transparent way for the user, i.e. it is only +% used for typesetting and not directly. The \mypkg*{enumext} package provides an \emph{internal implementation} for the +% command |\footnote| compatible with the \mypkg{hyperref} package to +% work in the same way as if it were used anywhere in the document. +% +% \newpage +% +% Unfortunately, if \emph{tagging} \texttt{PDF} is not enabled, it will +% not produce the expected \emph{\enquote{links}} because the internal +% implementation uses |\footnotetext|\myoarg{number} and |\footnotemark|\myoarg{number}\mymarg{text} +% and support for these is limited by the \mypkg{hyperref} package. +% +% \smallskip +% +% The best way to solve this if \emph{tagged} \texttt{PDF} is NOT active +% is to use Jean-François Burnol \mypkg{footnotehyper}\cite{footnotehyper} +% package, it will support keeping the \emph{\enquote{links}} if +% \mypkg{hyperref} is loaded with the |hyperfootnotes=true| option (default). +% Load it is as follows: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\IfDocumentMetadataTF{ } + { + \usepackage{footnotehyper} + \makesavenoteenv{enumext} + \makesavenoteenv{enumext*} + } +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \begin{important} +% At the moment the \mypkg{footnotehyper} package is not compatible +% with \emph{tagged} \texttt{PDF}. +% \end{important} +% +% \section{The environments provided} +% +% The package \mypkg*{enumext} provides two main list environments, the +% \emph{vertical} environment \myenv*{enumext} and the \emph{horizontal} +% environment \myenv*{enumext*}. +% +% \vspace*{-\baselineskip} +% +% \begin{function}{enumext,enumext*} +% \begin{minipage}[t]{0.45\linewidth} +% \envexamp{enumext} +% \end{minipage}\hfill +% \begin{minipage}[t]{0.45\linewidth} +% \envexamp{enumext*} +% \end{minipage} +% \end{function} +% +% \medskip +% +% \subsection{The environment \texttt{enumext}}\label{sec:envenumext} +% +% The \myenv*{enumext} is an environment that works in the same way as +% the standard \myenv{enumerate} environment provided by \hologo{LaTeX}, +% \ics*{item} and \ics*{item}\myoarg{custom} commands work in +% the usual way. The environment can be nested with at most \emph{\enquote{four levels}} +% and the options can be configured globally using \ics*{setenumext} +% command and locally using \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% in the environment. +% +% \subsubsection*{Example with \texttt{columns=2}} +% +% \begin{enumext}[columns=2, topsep=0pt] +% \item This text is in the first level. +% \begin{enumext} +% \item This text is in the second level. +% \begin{enumext} +% \item This text is in the third level. +% \begin{enumext} +% \item This text is in the fourth level. +% \end{enumext} +% \end{enumext} +% \end{enumext} +% \item[X] This text is in the first level. +% \item* This text is in the first level. +% \end{enumext} +% +% \subsection{The environment \texttt{enumext*}} +% +% The \myenv*{enumext*} is a \emph{horizontal list environment} +% similar to the \myenv{shortenumerate} or \myenv{tasks} environments +% provided by the \mypkg{shortlst}\cite{shortlst} and \mypkg{tasks}\cite{tasks} +% packages, \ics*{item} and \ics*{item}\myoarg{custom} work as usual. +% The options can be configured globally using \ics*{setenumext} command +% and locally using \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% in the environment. +% +% \smallskip +% +% Some considerations to take into account for this environment: +% +% \begin{itemize}[nosep,parsep=1pt,topsep=2pt] +% \item The environment cannot be nested within itself or in the +% environment \myenv*{keyans*}, but it can be nested within +% \myenv*{enumext} and vice versa. +% +% \item Each \emph{\enquote{item content}} in the environment is placed +% within a \myenv{minipage} environment whose \emph{width} is stored +% in the dimension |\itemwidth| that NOT includes \mykey{labelwith}, +% \mykey{labelsep}, only the \emph{width of the content}. +% +% \item You cannot have floating environments like \myenv{figure} or +% \myenv{table} but \ics{footnote} with \mypkg{hyperref} support is +% supported if the \mypkg{footnotehyper} package is loaded (see \S\ref{doc:footnote} for full support). +% +% \item You cannot have any standard list environments like \myenv{itemize}, +% \myenv{enumerate}, \myenv{description}, \myenv{quote}, \myenv{quotation}, +% \myenv{verse}, \myenv{center}, \myenv{flushleft}, \myenv{flushright}, +% \myenv{verbatim}, \myenv{tabbing}, \myenv{trivlist}, \myenv{list} +% and all environments created with |\newtheorem|. +% \end{itemize} +% +% \subsubsection*{Example with \texttt{columns=2}} +% +% \begin{enumext*}[columns=2] +% \item This text is in the first level. +% \item This text is in the first level. +% \item[X] This text is in the first level. +% \item* This text is in the first level. +% \end{enumext*} +% +% \subsection{The command \cs[no-index]{item*}} +% +% \vspace*{-\baselineskip} +% +% \begin{function}{\item*} +% \begin{syntax} +% \ics*{item*}\myoarg{symbol}\myoarg{offset} +% \end{syntax} +% The \ics*{item*}, \ics*{item*}\myoarg{symbol} and \ics*{item*}\myoarg{symbol}\myoarg{offset} +% works like the numbered |\item|, but placing a \mymeta{symbol} to +% the \emph{\enquote{left}} of the \mymeta{label} separated from it by +% the \mymeta{offset} set by the the \emph{second optional argument}. +% +% \smallskip +% +% The \emph{starred argument} ‘|*|’ cannot be separated by spaces +% ‘\verb*| |’ from the command, i.e. \ics*{item*} and the +% \emph{first optional argument} does \enquote{NOT} support +% \emph{verbatim content}. Can be configure with the keys +% \mykey{item-sym*} and \mykey{item-pos*} locally in the environment +% or globally using \ics*{setenumext} command (\S\ref{sec:setenumext}). +% \end{function} +% +% \smallskip +% +% \begin{important}* +% The behavior of \ics*{item*} in the \myenv*{enumext} and \myenv*{enumext*} environments is NOT +% the same as in the \myenv*{keyans} and \myenv*{keyans*} environments. +% \end{important} +% +% \subsubsection{Keys for \cs[no-index]{item*}} +% +% \keyexamp{item-sym\textcolor{MediumOrchid}{*}}{symbol}{\textbackslash{}textasteriskcentered} +% Sets the \emph{symbol} to be displayed in the \emph{\enquote{left}} of the +% box containing the current \mymeta{label} set by \mykey{labelwidth} key for \ics*{item*} in +% \myenv*{enumext} and \myenv*{enumext*}. The \emph{symbol} can be in +% \emph{text} or \emph{math} mode, for example \mykey{item-sym*}|={$\star$}|. +% +% \smallskip +% +% \keyexamp{item-pos\textcolor{MediumOrchid}{*}}{rigid length}{by levels} +% Sets the \emph{offset} between the box containing the +% current \mymeta{label} defined by \mykey{labelwidth} key and the +% \mymeta{symbol} set by \mykey{item-sym*} key. The default values are +% set by \mykey{labelsep} key at each level. If positive values are +% passed it will \emph{offset to the left} and if negative values are +% passed it will \emph{offset to the right}. +% +% \subsection{The command \cs[no-index]{item} in \texttt{enumext*}} +% +% The \ics*{item} command for the \myenv*{enumext*} environment provides +% an \emph{\enquote{first optional argument}} \ics*{item}\myparg{columns} which \emph{\enquote{joins items}} +% between columns. Let's consider the following examples adapted directly from +% the \mypkg{task} package: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\begin{enumext*}[widest=10,columns=4] + \item The first + \item* The second + \item The third + \item The fourth + \item(3)* The fifth item is way too long for this and needs three columns + \item The sixth + \item The seventh + \item(2)[X] The eighth item is way too long for this and needs two columns + (\the\itemwidth) + \item The ninth + \item[Z] The tenth (\the\itemwidth) +\end{enumext*} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \begin{enumext*}[widest=10,columns=4] +% \item The first +% \item* The second +% \item The third +% \item The fourth +% \item(3)* The fifth item is way too long for this and needs three columns +% \item The sixth +% \item The seventh +% \item(2)[X] The eighth item is way too long for this and needs two columns (\the\itemwidth) +% \item The ninth +% \item[Z] The tenth (\the\itemwidth) +% \end{enumext*} +% +% \section{The command \cs{setenumext}} +% \label{sec:setenumext} +% +% \vspace*{-10pt} +% +% \begin{function}{\setenumext} +% \begin{minipage}[t]{0.45\linewidth} +% \cmdexamp{setenumext}{key \textnormal{\textcolor{gray}{=}} val} +% \cmdexamp{setenumext}[enumext\textnormal{\textcolor{gray}{,}} level]{key \textnormal{\textcolor{gray}{=}} val} +% \cmdexamp{setenumext}[enumext*]{key \textnormal{\textcolor{gray}{=}} val} +% \cmdexamp{setenumext}[keyans]{key \textnormal{\textcolor{gray}{=}} val} +% \end{minipage}\hfill +% \begin{minipage}[t]{0.45\linewidth} +% \cmdexamp{setenumext}[keyans*]{key \textnormal{\textcolor{gray}{=}} val} +% \cmdexamp{setenumext}[print\textnormal{\textcolor{gray}{,}} level]{key \textnormal{\textcolor{gray}{=}} val} +% \cmdexamp{setenumext}[print\textnormal{\textcolor{gray}{,}} \textnormal{\textcolor{red}{*}}]{key \textnormal{\textcolor{gray}{=}} val} +% \cmdexamp{setenumext}[print*]{key \textnormal{\textcolor{gray}{=}} val} +% \end{minipage} +% +% \smallskip +% +% The command \ics*{setenumext} sets the \mymeta{keys} on a global basis +% for environments \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans}, +% \myenv*{keyans*} and the \ics*{printkeyans} command. +% It can be used both in the preamble and in the body of the document +% as many times as desired. +% \end{function} +% +% \smallskip +% +% The \mymeta{keys} set in the \emph{optional argument} of environments and +% commands have the \emph{highest precedence}, overriding both +% options passed by \ics*{setenumext}. If the \emph{optional argument} is not +% passed, the first level of the environment \myenv*{enumext} will be +% taken by default. +% +% \smallskip +% +% \begin{important}* +% The key \mykey{save-ans} that activate the \emph{\enquote{storage +% system}} must NOT be passed through this command and must be passed +% directly in the \emph{optional argument} of the \emph{\enquote{first level}} +% of the environment in which they are executed. +% \end{important} +% +% \smallskip +% +% \section{The command \cs[no-index]{setenumextmeta}} +% +% \vspace*{-\baselineskip} +% +% \begin{function}{\setenumextmeta} +% \begin{syntax} +% \ics*{setenumextmeta} \mymarg{key name}\mymarg{key-one \textnormal{\textcolor{gray}{=}} val\textnormal{\textcolor{gray}{,}} key-two \textnormal{\textcolor{gray}{=}} val\textnormal{\textcolor{gray}{,}} \dots} +% \ics*{setenumextmeta}|*|\mymarg{key name}\mymarg{key-one \textnormal{\textcolor{gray}{=}} val\textnormal{\textcolor{gray}{,}} key-two \textnormal{\textcolor{gray}{=}} val\textnormal{\textcolor{gray}{,}} \dots} +% \ics*{setenumextmeta} \myoarg{enumext\textnormal{\textcolor{MediumOrchid}{\texttt{*}}}}\mymarg{key name}\mymarg{key-one \textnormal{\textcolor{gray}{=}} val\textnormal{\textcolor{gray}{,}} key-two \textnormal{\textcolor{gray}{=}} val\textnormal{\textcolor{gray}{,}} \dots} +% \ics*{setenumextmeta} \myoarg{enumext\textnormal{\textcolor{gray}{,}} level}\mymarg{key name}\mymarg{key-one \textnormal{\textcolor{gray}{=}} val\textnormal{\textcolor{gray}{,}} key-two \textnormal{\textcolor{gray}{=}} val\textnormal{\textcolor{gray}{,}} \dots} +% \end{syntax} +% The command \ics*{setenumextmeta} adds a new \emph{\enquote{meta-key}} +% for the environments \myenv*{enumext} and \myenv*{enumext*}, the +% \mymarg{key name} must be different from those defined by the package. +% If the \emph{optional argument} is not passed, the new \emph{\enquote{meta-key}} +% will be created for the \emph{\enquote{first level}} of the environment +% \myenv*{enumext}. +% \end{function} +% +% \smallskip +% +% The \emph{starred argument} ‘|*|’ will create the new \emph{\enquote{meta-key}} +% for the environment \myenv*{enumext*} and for all levels of the +% environment \myenv*{enumext}. For example: |\setenumextmeta*{midsep}{topsep=3pt, partopsep=0pt}| +% will create a new key |midsep| available for all levels of the +% \myenv*{enumext} environment and the \myenv*{enumext*} environment +% and we can use it like any other key so |\begin{enumext}[midsep]| +% and |\begin{enumext*}[midsep]| will be valid. +% +% \section{The \texttt{keyval} system} +% +% The \mymeta{key = val} system used by the \mypkg*{enumext} package is implemented +% using \mypkg{l3keys} so it must be taken into consideration that those +% keys marked as \emph{\enquote{value forbidden}}, that is \mymeta{key} is +% different from \mymeta{key=}. +% +% \smallskip +% +% All \mymeta{keys} described in this section are available for the +% \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans} and \myenv*{keyans*} +% environments with the exception of the keys \mykey{series}, \mykey{resume}, +% \mykey{resume*} which are only available for the \emph{\enquote{first level}} +% of the environments \myenv*{enumext} and \myenv*{enumext*}; and the keys +% \mykey{mini-right}, \mykey{mini-right*} which are only available for +% the \myenv*{enumext*} and \myenv*{keyans*} environments. +% +% \smallskip +% +% All \mymeta{keys} related to vertical or horizontal spacing accept a +% \emph{\enquote{skip}} or \emph{\enquote{dim}} expression if passed +% between braces, i.e. you do not need to use |\dimeval| or |\dimexpr| +% to perform calculations. +% +% \smallskip +% +% \begin{important}* +% It should be kept in mind that using any \mymeta{key} that sets +% a \emph{rubber lengths} or \emph{rigid lengths} for vertical or +% horizontal space on a level will influence the vertical and horizontal +% space for \emph{inners levels} and \myenv*{keyans}, \myenv*{keyans*} and +% \myenv*{keyanspic} environments. +% \end{important} +% +% \smallskip +% +% \subsection{Keys for \texttt{label} and \texttt{ref}}\label{subsec:label-and-ref} +% +% \keyexamp*{mode-box}{value forbidden}{not used} +% This is a \emph{\enquote{switch-key}} that does not receive an +% argument and is \enquote{only} available for the \emph{\enquote{first level}} +% of the \myenv*{enumext} environment and the \myenv*{enumext*} environment. +% When this is set the \mykey{label}, \mykey{font}, \mykey{wrap-label} +% and \mykey{wrap-label*} keys are executed within |\makebox| for the +% \myenv*{enumext} and \myenv*{keyans} environments. +% +% \smallskip +% +% \begin{important} +% This key is intended for compatibility with \emph{tagged} \texttt{PDF} +% and is forcibly \emph{\enquote{enabled}} when |\DocumentMetadata| is +% present. If you want to get the same document output whether |\DocumentMetadata| +% is active or not, you must enable this key. +% \end{important} +% +% \smallskip +% +% \begin{important}* +% In the \myenv*{enumext*} and \myenv*{keyans*} environments |\makelabel| +% are redefined using |\makebox| by default. If \myenv*{enumext} or +% \myenv*{keyans} is used in the \myenv*{enumext*} environment the key +% must be activated manually. +% \end{important} +% +% \smallskip +% +% \keyexamp{label} +% {\textnormal +% {\ilabel{alph*} \textcolor{lightgray}{\textbar} \ilabel{Alph*} +% \textcolor{lightgray}{\textbar} \ilabel{arabic*} +% \textcolor{lightgray}{\textbar} \ilabel{roman*} +% \textcolor{lightgray}{\textbar} \ilabel{Roman*}} +% }{by levels} +% +% \smallskip +% +% Sets the \mymeta{label} that will be printed at the \emph{current +% level}. The default value for the first level of the environments +% \myenv*{enumext} and \myenv*{enumext*} are \ilabel{arabic*.}, for +% second level are \ilabel*{alph*)}, for third level are \ilabel{roman*.} +% and for fourth level are \ilabel{Alph*.}. For \myenv*{keyans} +% and \myenv*{keyans*} environments the default value is \ilabel{Alph*)}. +% +% \smallskip +% +% \begin{important}* +% This key is intended to give the basic structure with which the +% \mymeta{label} will be displayed, and the form in which it is +% used by standard \emph{\enquote{label and ref}} and the +% \emph{\enquote{internal label and ref}} system with the +% \mykey{save-ref} key. You cannot use commands with \mymeta{label} as an +% argument, for example |\emph|\mymarg{\textnormal{\ilabel{alph*}}} will return an +% error. For full customization of how \mymeta{label} is displayed use +% the \mykey{font}, \mykey{wrap-label} and/or \mykey{wrap-label*} keys. +% \end{important} +% +% \smallskip +% +% \keyexamp{labelsep}{rigid length}{\mydim{0.3333}em} +% Sets the \emph{horizontal space} between the box containing the +% current \mymeta{label} defined by \mykey{label} key and the text of an +% item on the first line. Internally sets the value of \ics{labelsep} for +% the current level. +% +% \smallskip +% +% \keyexamp{labelwidth}{rigid length}{by label} +% Sets the \emph{width} of the box containing the current \mymeta{label} set +% by \mykey{label} key. Internally sets the value of \ics{labelwidth} for the current +% level. The default values are calculated by means of the \emph{width} +% of a box by setting a \emph{value} to the current counter using ‘\mydim{0}’ for +% \ilabel{arabic*}, ‘|M|’ for \ilabel{Alph*}, ‘|m|’ for \ilabel{alph*}, ‘|VIII|’ +% for \ilabel{Roman*} and ‘|viii|’ for \ilabel{roman*}. +% +% \smallskip +% +% \keyexamp{widest}{integer \textnormal{\textcolor{lightgray}{\textbar}} string}{empty} +% Sets the \mykey{labelwidth} key pass the \mymeta{integer} or converting +% the \mymeta{string} of the form |\Alph|, |\alph|, |\Roman| or |\roman| +% to a \emph{value} for the current counter defined by \mykey{label} key, +% then calculating the \emph{width} by means of a box. For example |widest={XXIII}| +% or |widest={23}| are equivalent. This key is useful when the default +% values of the \mykey{labelwidth} key are smaller than those actually used. +% +% \smallskip +% +% \keyexamp{font}{font commands}{empty} +% Sets the \emph{font style} for the current \mymeta{label} defined by \mykey{label} key. +% For example |font={\bfseries\small}|. +% +% \smallskip +% +% \keyexamp{align}{left \textnormal{\textcolor{lightgray}{\textbar}} right \textnormal{\textcolor{lightgray}{\textbar}} center}{left} +% Sets the \emph{aligned} of \mymeta{label} defined by \mykey{label} +% key on the current level in the label box. +% +% \smallskip +% +% \newsavebox{\hashbox} +% \begin{lrbox}{\hashbox} +% \lstinline[language=enumext-doc,basicstyle=\ttfamily]+{#1}+ +% \end{lrbox} +% +% \keyexamp{wrap-label}{code{} \space\usebox{\hashbox} more code}{empty} +% +% \smallskip +% +% Wraps the \emph{current} \mymeta{label} defined by \mykey{label} key referenced by |{#1}|. +% The \mymarg{code} must be passed between braces. +% This key does not modify the value set by the \mykey{labelwidth} key +% and is applied only on \ics*{item} and \ics*{item*}. +% When using it in the \ics*{setenumext} command it is necessary to use the +% \emph{double hash} ‘|{##1}|’. For example |wrap-label={\fbox{#1}}| +% or you can create a command: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=none] +\NewDocumentCommand \mywrap { s m } + { + \IfBooleanTF{#1} + {\textcolor{red}{\textbf{Q}}\textcolor{blue}{\textbf{.}}\textcolor{gray}{#2}} + {\textcolor{blue}{\textbf{Q}}\textcolor{red}{\textbf{.}}\textcolor{gray}{#2}} + } +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% and then pass it through the key |wrap-label={\mywrap{#1}}| or |wrap-label={\mywrap*{#1}}|. +% +% \smallskip +% +% \keyexamp{wrap-label\textcolor{MediumOrchid}{*}}{code{} \space\usebox{\hashbox} more code}{empty} +% +% \smallskip +% +% The same as the \mykey{wrap-label} key but also applies on \ics*{item}\myoarg{custom}. +% +% \newpage +% +% \newsavebox{\refboxsample} +% \begin{lrbox}{\refboxsample} +% \small\textcolor{gray}{\ttfamily\{}\textnormal{\small\ilabel{alph*}\textcolor{lightgray}{\textbar} \ilabel{Alph*}\textcolor{lightgray}{\textbar} \ilabel{arabic*}\textcolor{lightgray}{\textbar} \ilabel{roman*}\textcolor{lightgray}{\textbar} \ilabel{Roman*}}\textcolor{gray}{\ttfamily\}} +% \end{lrbox} +% \keyexamp{ref}{code{} \space\usebox{\refboxsample} more code}{empty} +% +% Modifies the way \emph{cross references} are displayed. The +% \mykey{label} key sets the default form of the \emph{cross references}, +% by using this key you can define a different format, for example: +% \mykey{ref}|=\emph|\mymarg{\textnormal{\ilabel{alph*}}} is valid. +% +% \smallskip +% +% Internally it renews the command associated with each counter when it +% is executed, i.e., in the environment \myenv*{enumext} the command |\theenumXi| +% is modified when the key is executed at the first level, |\theenumXii| +% when it is executed at the second level and |\theenumXiii| together +% with |\theenumXiv| when it is executed at the +% third and fourth levels. +% +% \smallskip +% +% \begin{important}* +% This must be kept in mind, since the values set by the \mykey{label} and +% \mykey{ref} keys are not cumulative by levels, so if you have used the \mykey{ref} +% key in the first level and then want to associate the counter with +% \mykey{label} or \mykey{ref} in the second level you must use the direct commands, +% i.e. |\arabic{eunumXi}| to indicate the count of the first level +% instead of using |\theenumXi|. +% \end{important} +% +% \subsection{Keys for spaces} +% +% \keyexamp{show-length}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} +% Displays on the terminal the values for \emph{all list parameters} at the current level. +% For \emph{vertical spaces} show the values of |\topsep|, |\itemsep|, |\parsep| and |\partopsep|. +% For \emph{horizontal spaces} show the values of |\labelwidth|, |\labelsep|, |\itemindent|, |\listparindent| and |\leftmargin|. +% +% \subsubsection{Vertical spaces} +% +% \keyexamp{topsep}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{by levels} +% +% \smallskip +% +% Set the \emph{vertical space} added to both the top and bottom of the list. +% Internally sets the value of \ics{topsep} for the current level. +% The default value for the first level of the environments +% \myenv*{enumext} and \myenv*{enumext*} are \mydim{8.0pt plus 2.0pt minus 4.0pt}, +% for second level are \mydim{4.0pt plus 2.0pt minus 1.0pt}, for third and +% fourth level are \mydim{2.0pt plus 1.0pt minus 1.0pt}. For \myenv*{keyans} +% and \myenv*{keyans*} environments the default value is \mydim{4.0pt plus 2.0pt minus 1.0pt}. +% +% \smallskip +% +% \keyexamp{parsep}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{by levels} +% +% \smallskip +% +% Set the \emph{vertical space} between paragraphs within an item. +% Internally sets the value of \ics{parsep} for the current level. +% The default value for the first level of the environments \myenv*{enumext} +% and \myenv*{enumext*} are \mydim{4.0pt plus 2.0pt minus 1.0pt}, +% for second level are \mydim{2.0pt plus 1.0pt minus 1.0pt}, for third and +% fourth level are \mydim{0pt}. For \myenv*{keyans} and \myenv*{keyans*} +% environments the default value is \mydim{2.0pt plus 1.0pt minus 1.0pt}. +% +% \smallskip +% +% \begin{important}* +% In the \myenv*{enumext*} and \myenv*{keyans*} environments this value +% is passed to |\parskip| within the \myenv{minipage} environment where +% \emph{\enquote{item content}} is placed. +% \end{important} +% +% \smallskip +% +% \keyexamp{partopsep}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{by levels} +% +% \smallskip +% +% Set the \emph{vertical space} added, beyond \mykey{topsep}, to the \enquote{top} and \enquote{bottom} +% of the entire environment if the environment instance is preceded by a \emph{\enquote{blank +% line}} or |\par| command. Internally sets the value of \ics{partopsep} for the current level. +% The default values for first and second level in environment +% \myenv*{enumext} are \mydim{2.0pt plus 1.0pt minus 1.0pt}, +% for third and fourth level are \mydim{1.0pt minus 1.0pt}. +% For the \myenv*{keyans} environment the default value is \mydim{2.0pt +% plus 1.0pt minus 1.0pt}, and for the \myenv*{keyans*} and +% \myenv*{enumext*} environments it is available but \emph{without} +% effect. +% +% \smallskip +% +% \begin{important}* +% The value of this parameter also affects the \emph{inner levels} and the +% environments \myenv*{keyans}, \myenv*{keyanspic} and \myenv*{keyans*}. +% Caution should be taken with \emph{\enquote{blank lines}} or |\par| +% command \emph{\enquote{before}} each environment or nested level when +% formatting the source code of document. \hologo{TeX} will enter \mymeta{vertical mode} +% and apply this value to the \enquote{top} and \enquote{bottom} the +% environment or nested level. +% \end{important} +% +% \smallskip +% +% \keyexamp{itemsep}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{by levels} +% Set the \emph{vertical space} between items, beyond the \mykey{parsep}. +% Internally sets the value of \ics{itemsep} for the current level. +% The default value for the first level of the environments \myenv*{enumext} +% and \myenv*{enumext*} are \mydim{4.0pt plus 2.0pt minus 1.0pt}, +% for the rest of the levels are \mydim{2.0pt plus 1.0pt minus 1.0pt}. +% For \myenv*{keyans} and \myenv*{keyans*} environments the default +% value is \mydim{4.0pt plus 2.0pt minus 1.0pt}. +% +% \smallskip +% +% \begin{important}* +% In the \myenv*{enumext*} and \myenv*{keyans*} environments this value +% corresponds to the separation between rows. +% \end{important} +% +% \smallskip +% +% \keyexamp*{noitemsep}{value forbidden}{not used} +% This is a \emph{\enquote{meta-key}} that does not receive an argument. Set +% \mykey{itemsep} and \mykey{parsep} equal to \mydim{0pt} the entire level of environment. +% +% \smallskip +% +% \keyexamp*{nosep}{value forbidden}{not used} +% This is a \emph{\enquote{meta-key}} that does not receive an argument. Sets all keys +% for vertical spacing equal to \mydim{0pt} the entire level of environment. +% +% \smallskip +% +% \keyexamp*{base-fix}{value forbidden}{not used} +% +% \smallskip +% +% This is a \emph{\enquote{switch-key}} that does not receive an +% argument available \emph{only} for the \emph{\enquote{first level}} of environment +% \myenv*{enumext}. Fix the \emph{baseline} when an environment \myenv*{enumext} +% is nested in \myenv*{enumext*} and there is no material between the +% |\item| and the start of the environment for example |\item \begin{enumext}| +% within the environment \myenv*{enumext*}. Internally sets the keys \mykey{topsep}, +% \mykey{above} and \mykey{above}|*| at \mydim{0pt}. +% +% \smallskip +% +% \begin{important}* +% This key is provided as a way to work around this minor issue, but you +% should be aware that if for some reason you have the \mykey{itemindent} +% key set in the \myenv*{enumext*} environment it will be lost and you +% will need to adjust it using the \mykey{list-offset} key in the +% \myenv*{enumext} environment. +% \end{important} +% +% \newpage +% +% \begin{important}* +% The following \mymeta{keys} should be used with \emph{\enquote{caution}}, they +% are intended to be used at the \enquote{top} and \enquote{bottom} of +% the environment when the \mykey{columns} or \mykey{mini-env} keys do +% not provide adequate \emph{vertical spaces}. +% The values passed can be \emph{rubber} or \emph{rigid} lengths, the +% way they are applied is the way you differ, using the \emph{star} ‘|*|’ +% \mymeta{keys} applies |\vspace*| so that \hologo{LaTeX} does +% \emph{not discard} this space at page break. +% \end{important} +% +% \smallskip +% +% \keyexamp{above}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{not used} +% +% \smallskip +% +% Set the \emph{extra vertical space} added, beyond \mykey{topsep}, to +% the top of the entire level of environment. This key is intended to +% give a \emph{\enquote{fine adjustment}} of the vertical space +% \emph{\enquote{above}} the environment without hindering the value of +% the \mykey{topsep} key. The space is added with |\vspace| so is +% \emph{\enquote{discardable}}. +% +% \keyexamp{above\textcolor{MediumOrchid}{*}}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{not used} +% +% \smallskip +% +% Set the \emph{extra vertical space} added, beyond \mykey{topsep}, to +% the top of the entire level of environment. This key is intended to +% give a \emph{\enquote{fine adjustment}} of the vertical space +% \emph{\enquote{above}} the environment without hindering the value of +% the \mykey{topsep} key. The space is added with |\vspace*| so is +% \emph{\enquote{not discardable}}. +% +% \smallskip +% +% \keyexamp{below}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{not used} +% +% \smallskip +% +% Set the \emph{extra vertical space} space added, beyond \mykey{topsep}, to +% the bottom of the entire level of environment. This key is intended to +% give a \emph{\enquote{fine adjustment}} of the vertical space on the +% \emph{\enquote{below}} the environment without hindering the value of +% the \mykey{topsep} key. The space is added with |\vspace| so is +% \emph{\enquote{discardable}}. +% +% \smallskip +% +% \keyexamp{below\textcolor{MediumOrchid}{*}}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{not used} +% +% \smallskip +% +% Set the \emph{extra vertical space} space added, beyond \mykey{topsep}, to +% the bottom of the entire level of environment. This key is intended to +% give a \emph{\enquote{fine adjustment}} of the vertical space on the +% \emph{\enquote{below}} the environment without hindering the value of +% the \mykey{topsep} key. The space is added with |\vspace*| so is +% \emph{\enquote{not discardable}}. +% +% \subsubsection{Horizontal spaces} +% +% \keyexamp{list-offset}{rigid length}{\mydim{0}pt} +% Sets the \emph{horizontal translation} of the entire environment level from the left edge +% of the box defined by the \mykey{labelwidth} key. Internally sets the values of +% |\leftmargin| and |\itemindent| for the current level. +% +% \smallskip +% +% \keyexamp{list-indent}{rigid length}{labelwidth + labelsep} +% Sets the \emph{indentation} of the whole environment under the box defined by +% \mykey{labelwidth} and \mykey{labelsep} keys. Internally sets the value of +% |\leftmargin| and |\itemindent| for the current level. +% If |list-indent=|\mydim{0pt} is set in the environments \myenv*{enumext} +% and \myenv*{keyans} the \mymeta{label} will be part of the text, separated +% by the value of the \mykey{labelsep} key and the \emph{first word}, in +% simple terms it will look like a \emph{\enquote{common paragraph}}. +% +% \smallskip +% +% \begin{important}* +% The \myenv*{enumext*} and \myenv*{keyans*} environments are +% implemented using |\makebox| and \myenv{minipage} which causes +% \emph{\enquote{list indent}} to always be equal to the value passed to +% \mykey{labewdith} plus \mykey{labelsep}. Passing a value to this key is +% equivalent to setting the value for the \mykey{list-offset} key. +% \end{important} +% +% \smallskip +% +% \keyexamp{itemindent}{rigid length}{\mydim{0}pt} +% +% \smallskip +% +% Sets the extra \emph{horizontal indentation}, beyond \mykey{labelsep}, +% of the \emph{\enquote{first line}} off each |\item| that is not followed +% by a \emph{\enquote{blank line}} or the |\par| command . This value must +% be greater than or equal to \mydim{0pt} and is applied internally using +% |\hspace| \emph{without} modifying the value of |\itemindent|. +% +% \smallskip +% +% \begin{important}* +% This key is intended for the \myenv*{enumext*} and \myenv*{keyans*} +% environments where, by their implementation, it is not possible to +% adjust \mykey{labelwidth} and \mykey{list-indent} \emph{without} +% modifying the output. If you use \myenv*{enumext} or \myenv*{keyans} +% and want to get around the \emph{blank line} limitation or the |\par| +% command followed by |\item| you can modify \mykey{labelwidth} and +% \mykey{list-indent} and get the same effect. +% \end{important} +% +% \smallskip +% +% \keyexamp{rightmargin}{rigid length}{\mydim{0}pt} +% +% \smallskip +% +% Set the \emph{horizontal space} between the right margin of the environment and the +% right margin of the enclosing environment, the value it takes must be +% greater than or equal to \mydim{0pt}. Internally sets the value of +% \ics{rightmargin} for the current level. +% +% \smallskip +% +% \keyexamp{listparindent}{rigid length}{\mydim{0}pt} +% Sets the \emph{horizontal space} indentation, beyond \mykey{list-indent}, +% for second and subsequent paragraphs within a list item. Internally +% sets the value of \ics{listparindent} for the current level. +% +% \smallskip +% +% \begin{important}* +% In the \myenv*{enumext*} and \myenv*{keyans*} environments this value +% is passed to |\parindent| within the \myenv{minipage} environment where +% \emph{\enquote{item content}} is placed. +% \end{important} +% +% \smallskip +% +% \subsection{Keys for add \texttt{code}} +% +% The following \mymeta{keys} should be used with \emph{\enquote{caution}}, +% they are intended to inject \mymarg{code} into different parts of the +% defined environments. We must keep in mind that the defined +% environments are based on the \myenv{list} base environment provided by +% \hologo{LaTeX} which is defined (simplified) as plain form |\list|\mymarg{arg one}\mymarg{arg two}. +% Using the \mykey{before*} key does not allow access to the \myenv{list} +% parameters defined by \myoarg{key +% \textnormal{\textcolor{gray}{=}} val}. +% +% \smallskip +% +% \keyexamp{before}{code}{not used} +% Execute \mymarg{code} \emph{\enquote{before}} the +% environment starts. The \mymarg{code} must be passed between braces, is executed +% \emph{\enquote{after}} performing all calculations related to the +% \emph{list parameters} in the environment and the parameters sets by +% \myoarg{key \textnormal{\textcolor{gray}{=}} val} that is, in the second argument of the list after setting all the parameters +% |\begin{list}|\mymarg{arg one}|{|\mymeta{arg two}\mymarg[cbc=pkgcolor,ac=araracolor]{code}|}|. +% +% \smallskip +% +% \keyexamp{before\textcolor{MediumOrchid}{*}}{code}{not used} +% Execute \mymarg{code} \emph{\enquote{before}} the +% environment starts. The \mymarg{code} must be passed between braces, is executed +% \emph{\enquote{before}} performing all calculations related to the \emph{list +% parameters} and \myoarg{key \textnormal{\textcolor{gray}{=}} +% val} sets in the environment that is, +% before the arguments defining the environment are executed: +% \mymarg[type=tt,cbc=pkgcolor,ac=araracolor]{code}|\begin{list}|\mymarg{arg +% one}\mymarg{arg two}. +% +% \smallskip +% +% \keyexamp{first}{code}{not used} +% Executes \mymarg{code} when \emph{\enquote{starting}} the +% environment. The \mymarg{code} must be passed between +% braces, is executed right \emph{\enquote{after}} all \emph{list +% parameters} are done, after the second argument of list, just before the first occurrence of \ics*{item}: +% |\begin{list}|\mymarg{arg one}\mymarg{arg two}\mymarg[cbc=pkgcolor,ac=araracolor]{code}|\item|. +% +% \smallskip +% +% \begin{important}* +% Keep in mind that the code set in this key will affect the entire +% \emph{\enquote{body}} of the environment and therefore the inner levels +% of the list and the \myenv*{keyans} environment. It is recommended to +% set this key per level. +% \end{important} +% +% \smallskip +% +% \begin{important}* +% In the \myenv*{enumext*} and \myenv*{keyans*} environments this key +% is executed after the \mykey{listparindent}, \mykey{parsep} and +% \mykey{itemindent} keys within the \myenv{minipage} environment in +% which the \emph{\enquote{item content}} is placed. +% \end{important} +% +% \smallskip +% +% \keyexamp{after}{code}{not used} +% Execute \mymarg{code} \emph{\enquote{after}} finishing the +% environment. The \mymarg{code} must be passed between braces. +% +% \subsection{Keys for \texttt{start}, \texttt{series} and \texttt{resume}} +% +% \smallskip +% +% \keyexamp{start}{integer \textnormal{\textcolor{lightgray}{\textbar}} integer expression}{\mydim{1}} +% Sets the \emph{start value} of the numbering on the current level. +% The \mymarg{integer expression} must be passed between braces, internally is evaluated and pass +% to the counter defined by \mykey{label} key on the current level, i.e. it is equivalent to enter +% |start={\dimeval{100*\value{chapter}}| or |start={100*\value{chapter}}|. +% +% \smallskip +% +% \keyexamp{start\textcolor{MediumOrchid}{*}}{integer \textnormal{\textcolor{lightgray}{\textbar}} string}{not used} +% Sets the \emph{start value} of the numbering on the current level. +% Internally \mymeta{string} is converted and passed as value to the counter defined by +% \mykey{label} key on the current level, i.e. it is equivalent to enter +% |start=5|, |start=E| or |start=v|. +% +% \smallskip +% +% The following \mymeta{keys} are \emph{\enquote{only}} available for the +% \myenv*{enumext*} environment and the \emph{\enquote{first level}} of +% the \myenv*{enumext} environment and are ignored if set when nested +% within each other. +% +% \keyexamp{series}{series name}{not used} +% +% \smallskip +% +% Stores the \emph{keys} of the \emph{optional argument} of the \emph{\enquote{first level}} +% of the environment in which it is executed in \mymarg{series +% name} which is used as an argument in the key \mykey{resume}. The \mymeta{keys} +% stored in \mymarg{series name} are not cumulative and are overwritten +% if the same \mymarg{series name} is used again. +% +% \smallskip +% +% \keyexamp{resume}{series name}{not used} +% Sets the \emph{start value} and \emph{options} for the \emph{\enquote{first +% level}} continuing the numbering of the environment in which the +% \mykey{series}|=|\mymarg{series name} key was executed. If passed +% \emph{without value} this will only set \emph{start value} continue the +% numbering from the last environment in which \mykey{series}|=|\mymarg{series name} +% or \mykey{resume}|=|\mymarg{series name} is not present and if the +% \mykey{save-ans} key is active it will continue the numbering from the +% last environment in which it was executed. The \emph{start value} can be +% overwritten using \mykey{start} or \mykey{start*} keys. +% +% \smallskip +% +% \keyexamp*{resume\textcolor{MediumOrchid}{*}}{value forbidden}{not used} +% Sets the \emph{start value} and \emph{options} for the +% \emph{\enquote{first level}} continuing the numbering of the +% environment in which the \mykey{series}|=|\mymarg{series name} or +% \mykey{resume}|=|\mymarg{series name} keys are NOT present, if the +% \mykey{save-ans} key is active it will continue the numbering from the +% last environment in which it was executed. The \emph{start value} +% can be overwritten using \mykey{start} or \mykey{start*} keys. +% +% \smallskip +% +% \begin{important}* +% For security reasons the \mykey{series} key will never save in +% \mymarg{series name} the keys \mykey{series}, \mykey{resume}, +% \mykey{resume*}, \mykey{save-ans}, \mykey{save-key}, \mykey{start*} and \mykey{start}. +% When using the key \mykey{resume}|=|\mymarg{series name} it will +% have hierarchy in the \mymeta{keys} that are saved in \mymarg{series +% name}, in order to establish the value of a \mymeta{key} already saved +% in \mymarg{series name} it must be placed to the \emph{\enquote{right}} +% of \mykey{resume}|=|\mymarg{series name}, the same thing happens with +% the \mykey{resume*} key, the exception is the \mykey{save-ans} key +% that must be placed on the \emph{\enquote{left}} if you want to start +% the numbering with its value. +% The \mykey{resume} key passed \emph{\enquote{without value}} must be +% exactly \emph{\enquote{without value}}, i.e. \mykey{resume}|=| cannot +% be used and if executed before \mykey{resume*} it will affect the +% \emph{start value}. +% \end{important} +% +% \subsection{Keys for \env{multicols}}\label{key:multi} +% +% \keyexamp{columns}{integer}{\mydim{1}} +% +% \smallskip +% +% Set the \emph{number of columns} to be used by the \myenv{multicols} +% environment within the environment. The value must be a positive +% integer less than or equal to \mydim{10}. +% +% \smallskip +% +% \keyexamp{columns-sep}{rigid length}{by level} +% +% \smallskip +% +% Set the \emph{space between} columns used by the \myenv{multicols} +% environment within the environment. Internally sets the value of +% \ics{columnsep}, by default its value is equal to the sum of the +% values set in the keys \mykey{labelwidth} and \mykey{labelsep} of the +% current level. +% +% \subsection{Keys for \env{minipage}}\label{key:mini} +% +% \keyexamp{mini-env}{rigid length}{not used} +% +% \smallskip +% +% Sets the \emph{width} of the \myenv{minipage} environment on +% the \emph{\enquote{right side}}. This value added to the value set by +% the \mykey{mini-sep} key to determines the \emph{width} of the +% \myenv{minipage} environment on the \emph{\enquote{left side}}, taking +% \ics{linewidth} as the maximum reference value. +% +% \smallskip +% +% \keyexamp{mini-sep}{rigid length}{\mydim{0.3333}em} +% +% \smallskip +% +% Sets the \emph{space between} the \myenv{minipage} environment on the +% \emph{\enquote{left side}} and the \myenv{minipage} environment on +% the \emph{\enquote{right side}}. This separation is applied together +% with |\hfill|. +% +% \subsubsection{The command \cs[no-index]{miniright}} +% +% \vspace*{-1.0\baselineskip} +% \begin{function}{\miniright} +% \begin{syntax} +% |\begin{enumext}[mini-env=|\mymarg{rigid length}|]| \mymeta[cf=gray]{item's before} |\item \miniright| \mymeta[cf=gray]{content} |\end{enumext}|\par +% |\begin{enumext}[mini-env=|\mymarg{rigid length}|]| \mymeta[cf=gray]{item's before} |\item \miniright*|\mymeta[cf=gray]{content} |\end{enumext}| +% \end{syntax} +% \end{function} +% +% The \ics*{miniright} command close the \myenv{minipage} environment on +% the \emph{\enquote{left side}} and opens the \myenv{minipage} environment +% on the \emph{\enquote{right side}} by starting it with the |\centering| +% command. It must be placed \emph{\enquote{after}} the last \ics*{item} +% of the current environment and \emph{\enquote{before}} starting the +% material to be placed on the \emph{\enquote{right side}}. +% +% \smallskip +% +% The \emph{starred argument} ‘|*|’ inhibits the use of |\centering| +% command i.e. the usual \hologo{LaTeX} justification is maintained in +% the \myenv{minipage} on the \emph{\enquote{right side}}. +% +% \smallskip +% +% \subsubsection{The key \texttt{mini-right}} +% +% In the \emph{horizontal list environments} \myenv*{enumext*} and \myenv*{keyans*} +% it is not possible to use the \ics*{miniright} command and the \mykey{mini-right} +% key must be used instead. +% +% \smallskip +% +% \keyexamp{mini-right}{content}{not used} +% +% \smallskip +% +% Set the \emph{content} for the drawing or tabular to be placed in the +% \myenv{minipage} environment on the \emph{\enquote{right side}} by +% starting it with |\centering|. The \mymarg{content} must be passed between braces. +% +% \smallskip +% +% \keyexamp{mini-right\textcolor{MediumOrchid}{*}}{content}{not used} +% +% \smallskip +% +% Same as above, but \emph{without} starting with |\centering|. +% +% \smallskip +% +% \section{The storage system}\label{sec:storage system} +% +% The entire mechanism for \emph{\enquote{storing content}} it is +% activated according to \mykey{save-ans} key on the +% \emph{\enquote{first level}} of \myenv*{enumext} or \myenv*{enumext*} +% environments and it is ignored if they are established when they are +% nested inside each other. Only when this \mymeta{key} is \emph{\enquote{active}} +% the \ics*{anskey} command and the environments \myenv*{anskey*}, +% \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} are available. +% +% \iffalse +%<*example> +% \fi +\vspace*{-1\baselineskip} +\begin{minipage}[t]{0.45\linewidth} +\centering +\begin{examplecode}[frame=none,mathescape=true] +\begin{enumext}[save-ans=`\mymarg{store name}`] + \item Text \anskey{answer} + \item Text + \begin{keyans} + $\cdots$ + \end{keyans} +\end{enumext} +\end{examplecode} +\end{minipage}\hfill +\begin{minipage}[t]{0.45\linewidth} +\vspace{0pt}\centering +\begin{examplecode}[frame=none,mathescape=true] +\begin{enumext}[save-ans=`\mymarg{store name}`] + \item Text \anskey{answer} + \item Text + \begin{keyanspic} + $\cdots$ + \end{keyanspic} +\end{enumext} +\end{examplecode} +\end{minipage} +% \iffalse +%</example> +% \fi +% +% By executing the key \mykey{save-ans}|=|\mymarg{store name} the entire +% \emph{\enquote{structure}} of the environment (excluding the \emph{first level}) +% including the \emph{optional argument} passed to the inner levels or +% the environment nested in it, along with the \mymeta{content} passed +% to \ics*{anskey} or \myenv*{anskey*}, the current \mymeta{labels} for +% \ics*{item*} and \ics*{anspic}|*| in the environments \myenv*{keyans}, +% \myenv*{keyans*} and \myenv*{keyanspic} will be \emph{\enquote{stored}} +% in a \emph{sequence} \mymarg{store name} and at the same time will be +% \emph{\enquote{stored}} (without the \emph{\enquote{structure}} or +% \emph{optional argument}) in a \emph{prop list} \mymarg{store name}. +% +% \smallskip +% +%^^A \begin{important}* +% For security reasons the \emph{optional argument} of the inner levels +% or the nested environment are \emph{filtered} by excluding all \mymeta{keys} +% related to the \emph{\enquote{storage system}} (\S\ref{subsec:storage-keys}) +% along with the keys \mykey{mini-env}, \mykey{mini-sep}, \mykey{mini-right}, +% \mykey{mini-right*}, \mykey{series}, \mykey{resume} and \mykey{resume*} +% when storing in \emph{sequence} \mymarg{store name} set by \mykey{save-ans} key. +%^^A \end{important} +% +% \subsection{Keys for storage system}\label{subsec:storage-keys} +% +% The only \mymeta{keys} available for all levels of the \myenv*{enumext} +% environment and the \myenv*{enumext*} environment are \mykey{no-store} +% and \mykey{save-key}, the rest of the \mymeta{keys} described in this +% section must be passed directly in the \emph{optional argument} of the +% \emph{\enquote{first level}} of the environment in which the key +% \mykey{save-ans} is executed. The key \mykey{save-ans} should NOT be passed +% with the command \ics*{setenumext}. +% +% \smallskip +% +% \keyexamp{save-ans}{store name}{not set} +% Sets the \emph{name} of the \emph{sequence} and \emph{prop list} in +% which the \mymarg{contents} will be \emph{\enquote{stored}} by \ics*{anskey} +% and \myenv*{anskey*} in \myenv*{enumext} and \myenv*{enumext*} +% environments and the current \mymeta{labels} for \ics*{item*} and +% \ics*{anspic}|*| in the environments \myenv*{keyans}, \myenv*{keyans*} +% and \myenv*{keyanspic}. If the \emph{sequence} or \emph{prop list} +% \mymarg{store name} does not exist, it will be created globally and +% will not be \emph{overwritten} if the key is used again. +% +% \smallskip +% +% \keyexamp{save-key}{key list}{not set} +% This key \emph{overrides} the default \emph{\enquote{stored keys}} of the +% \emph{optional argument} of the inner levels or nested environment that will +% be passed to the \emph{sequence}. The \mymeta{key list} passed to +% this key ignores any \mymeta{keys} in the \emph{\enquote{stored +% structure}} and must be passed between braces. For example, if we +% execute at a second level: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=none,mathescape=true] +\begin{enumext}[save-ans=`\mymarg{store name}`] + \item Text \anskey{answer} + \item Text + \begin{enumext}[nosep, columns=2, save-key={columns=3}] + $\cdots$ + \end{enumext} +\end{enumext} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% The \emph{\enquote{stored keys}} by default in the \emph{sequence} +% \mymarg{store name} would be |nosep, columns=2|, but using the key +% \mykey{save-key}|={columns=3}| will overwrite and the +% \emph{\enquote{stored key}} in the \emph{sequence} \mymarg{store name} +% are only |columns=3| ignoring all the others. +% +% \smallskip +% +% \keyexamp{save-sep}{text symbol}{\{, \}} +% Sets the \emph{text symbol} that will separate the current \mymeta{label} +% to the \emph{optional argument} passed to the \ics*{item*} and \ics*{anspic}|*| +% in the environments \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} +% and storing them in the \emph{sequence} and \emph{prop list} \mymarg{store name} +% set by \mykey{save-ans} key. +% The \mymarg{text symbol} must always be passed between +% braces, whitespace ‘\verb*+ +’ is preserved within the braces and only +% affects the \emph{\enquote{stored content}} and not what is displayed +% when using the \mykey{show-ans} or \mykey{show-pos} keys. +% +% \subsubsection{Keys for \texttt{label} and \texttt{ref}}\label{subsec:label-ref} +% +% \keyexamp{save-ref}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} +% Activates the \emph{\enquote{internal label and ref}} mechanism for +% referencing \emph{\enquote{stored content}} in \emph{prop list} +% \mymarg{store name} set by \mykey{save-ans} key. To reference the +% location of the \emph{\enquote{stored content}} within the environment +% you must use |\ref|\mymarg{store name \textnormal{\textcolor{red}{:}} position}, +% where \mymeta{position} corresponds to the position occupied by the +% \emph{\enquote{stored content}} in the \emph{prop list} \mymarg{store name} +% returned by the \mykey{show-pos} key. For example |\ref{test:4}| will +% return |3.(b)| which corresponds to the location of the \emph{\enquote{stored content}} +% at position |4| in \emph{prop list} |test| within the environment in +% which the key \mykey{save-ans}|=test| was set. +% +% \smallskip +% +% \keyexamp{mark-ref}{symbol}{\textbackslash{}\textreferencemark} +% Sets the \emph{symbol} that will be displayed by the \ics*{printkeyans} +% command only if the \mypkg{hyperref} package is detected and the +% \mykey{save-ref} key are active. +% This \emph{\enquote{symbol}} is used as a \emph{\enquote{link}} between the environment +% in which the \mykey{save-ans} key was used and the place where the +% command is executed. +% +% \subsubsection{Keys for \texttt{wrap} and \texttt{display}}\label{subsec:wrap-display} +% +% \keyexamp{wrap-ans}{code{} \space\usebox{\hashbox} more code}{\textbackslash{}fbox+\textbackslash{}parbox\{\#1\}} +% Wraps the \emph{argument} passed to the \ics*{anskey} and the \emph{body} in \myenv*{anskey*} environment +% referenced by |{#1}| when using the \mykey{show-ans} or \mykey{show-pos} keys. +% The \mymarg{code} must be passed between braces and only affects the +% \emph{argument} or \emph{body} and NOT the \emph{\enquote{stored +% content}} in the \emph{sequence} and \emph{prop list} \mymarg{store +% name} set by \mykey{save-ans} key. If this key is passed using +% \ics*{setenumext} it is necessary to use double ‘|{##1}|’. +% +% \smallskip +% +% \keyexamp{wrap-opt}{code{} \space\usebox{\hashbox} more code}{[\{\#1\}]} +% Wraps the \emph{optional argument} passed to the +% \ics*{item*} and \ics*{anspic}|*| referenced by |{#1}| +% in the \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} +% environments when using the \mykey{show-ans} or \mykey{show-pos} keys. +% The \mymarg{code} must be passed between braces +% and only affects the current \emph{optional argument} and NOT the +% \emph{\enquote{stored content}} in the \emph{sequence} and \emph{prop list} +% \mymarg{store name} set by \mykey{save-ans} key. +% If this key is passed using \ics*{setenumext} it is necessary to use double ‘|{##1}|’. +% +% \smallskip +% +% \keyexamp{show-ans}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} +% Displays the \emph{argument} passed to the \ics*{anskey}, the +% \emph{body} for \myenv*{anskey*} environment, the \mymeta{label} +% for \ics*{item*} and \ics*{anspic}|*| at the place where it is executed. +% If the \emph{optional argument} is present in \ics*{item*} or \ics*{anspic}|*| it will +% be shown using \mykey{wrap-opt} key. +% +% \smallskip +% +% \keyexamp{mark-ans}{symbol}{\textbackslash{}textasteriskcentered} +% Sets the \emph{symbol} to be displayed in the left margin for +% \ics*{anskey}, \myenv*{anskey*}, \ics*{item*} and \ics*{anspic}|*| in the place +% where they are executed when using the key \mykey{show-ans}. +% +% \smallskip +% +% \keyexamp{mark-pos}{left \textnormal{\textcolor{lightgray}{\textbar}} right}{left} +% Sets the \emph{aligned} of the symbol defined by \mykey{mark-ans} key. The +% \emph{\enquote{symbol}} is aligned in a box with the same dimensions of the label box +% defined by \mykey{labelwidth} key on the current level and separated by the value of the +% \mykey{labelsep} key. +% +% \subsubsection{Keys for debug and checking} +% +% \keyexamp{show-pos}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} +% +% \smallskip +% +% Displays the \emph{position} occupied by the \emph{\enquote{stored content}} by +% \ics*{anskey}, \myenv*{anskey*}, \ics*{item*} and \ics*{anspic}|*| in the +% \emph{prop list} \mymarg{store name} set by \mykey{save-ans} key. +% This position is used by the \ics*{getkeyans} command and by the |\ref| +% command if the \mykey{save-ref} key is active. +% +% \smallskip +% +% \keyexamp{check-ans}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} +% +% \smallskip +% +% Enables the \emph{checking answer} mechanism displaying an +% appropriate message on the terminal. This key works under the logic +% that each \ics*{item} or \ics*{item*} that does not open an +% inner level or nested environment contains \emph{\enquote{only one +% answer}} or \emph{\enquote{only one execution}} of the \ics*{anskey} +% or \myenv*{anskey*}. It is intended to be used in conjunction with the +% \mykey{no-store} key. +% +% \smallskip +% +% \keyexamp*{no-store}{value forbidden}{not used} +% +% \smallskip +% +% This is a \emph{\enquote{switch-key}} that does not receive an argument +% and disables the \emph{\enquote{stored structure}} in the \emph{sequence} +% \mymarg{store name} set by \mykey{save-ans} key at the entire level +% or a nested environment in which it runs. This key +% is intended for use in internal levels or nested \myenv*{enumext} or +% \myenv*{enumext*} environments in which +% you want to use \myenv*{enumext} or \myenv*{enumext*} but \emph{\enquote{without}} using +% the \ics*{anskey},\emph{\enquote{without}} use \myenv*{anskey*}, \emph{\enquote{without}} interfering with the +% \mykey{check-ans} key and \emph{\enquote{without}} storing an unwanted +% structure in the \emph{sequence} \mymarg{store name}. +% +% \subsection{The command \cs[no-index]{anskey}} +% \label{sec:anskey} +% +% \vspace*{-\baselineskip} +% +% \begin{function}{\anskey} +% \begin{syntax} +% \cmdexamp{anskey}[keys]{content} +% \end{syntax} +% The command \ics*{anskey} takes a mandatory non empty argument \mymarg{content} +% and \emph{\enquote{stores}} it in the \emph{sequence} and \emph{prop +% list} \mymarg{store name} set by \mykey{save-ans} key. +% By design the command cannot be nested or passed \emph{verbatim material} in the +% argument and it is assumed that each \emph{numbered} |\item| or |\item*| within the +% environment in which it is active it has a \emph{\enquote{single +% execution}} of |\anskey| unless |\item| or |\item*| open a nested level +% or use the \mykey{no-store} key. +% +% \smallskip +% +% If \mykey{save-ref} key are active and the +% \mypkg{hyperref}\cite{hyperref} package is detected, |\hyperlink| and +% |\hypertarget| will be used, otherwise the usual \emph{\enquote{label +% and ref}} system provided by \hologo{LaTeX} will be used. +% \end{function} +% +% \smallskip +% +% The \ics*{anskey} command is available for all levels of the +% \myenv*{enumext} environment and the \myenv*{enumext*} environment, but +% is disabled for the \myenv*{keyans}, \myenv*{keyans*} and +% \myenv*{keyanspic} environments. +% +% \subsubsection{Keys for \cs[no-index]{anskey}} +% +% By default the \mymarg{content} passed to |\anskey| when +% \emph{\enquote{storing}} in the \emph{sequence} \mymarg{store name} has +% the form |\item| \mymeta{content}, the following \mymeta{keys} allow +% modifying the way in which it is \emph{\enquote{stored}} in the +% \emph{sequence}. +% +% \smallskip +% +% \keyexampcmd*{break-col}{value forbidden}{not used} +% +% \smallskip +% +% Stores \mymarg{content} in the \emph{sequence} \mymarg{store name} of +% the form \ics{columnbreak} |\item| \mymeta{content}. +% +% \smallskip +% +% \keyexampcmd{item-join}{columns}{not set} +% +% \smallskip +% +% Set the \emph{number of columns} to be used for |\item|\myparg{columns} and stores \mymarg{content} in the \emph{sequence} +% \mymarg{store name} of the form |\item|\myparg{columns} \mymeta{content}. +% +% \smallskip +% +% \keyexampcmd*{item-star}{value forbidden}{not used} +% +% \smallskip +% +% Stores \mymarg{content} in the \emph{sequence} \mymarg{store name} of +% the form |\item*| \mymeta{content}. +% +% \keyexampcmd{item-sym\textcolor{MediumOrchid}{*}}{symbol}{not set} +% +% \smallskip +% +% Sets the \emph{symbol} for |\item*| when using the key +% \mykeycmd{item-star} and stores \mymarg{content} in the \emph{sequence} +% \mymarg{store name} of the form |\item*|\myoarg{symbol} \mymeta{content}. +% The \emph{symbol} can be in text or math mode, for example +% \mykeycmd{item-sym*}|={$\ast$}| stores |\item*||[$\ast$]| \mymeta{content}. +% +% \smallskip +% +% \keyexampcmd{item-pos\textcolor{MediumOrchid}{*}}{rigid length}{not set} +% Sets the \emph{offset} for |\item*| when using the keys +% \mykeycmd{item-star} and \mykeycmd{item-sym*} and stores \mymarg{content} in the \emph{sequence} +% \mymarg{store name} of the form |\item*|\myoarg{symbol}\myoarg{offset} \mymeta{content}. +% +% \subsubsection*{Example} +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\begin{enumext}[save-ans=test,show-ans=true] + \item* Text containing our instructions or questions. `\ics*{anskey}\mymarg{first answer}` + \item Text containing our instructions or questions. + \begin{enumext} + \item Question.`\ics*{anskey}\mymarg{second answer}` + \end{enumext} + \item Text containing our instructions or questions. `\ics*{anskey}\mymarg{third answer}` + \item Text containing our instructions or questions. `\ics*{anskey}\mymarg{fourth answer}` +\end{enumext} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \begin{enumext}[save-ans=test,show-ans=true,columns=2,nosep] +% \item* Text containing our instructions or questions.\anskey{first answer} +% \item Text containing our instructions or questions. +% \begin{enumext} +% \item Question.\anskey{second answer} +% \end{enumext} +% \item Text containing our instructions or questions. \anskey{third answer} +% \item Text containing our instructions or questions. \anskey{fourth answer} +% \end{enumext} +% +% \subsection{The environment \env{anskey*}} +% +% \vspace*{-\baselineskip} +% +% \begin{function}{anskey*} +% \begin{syntax} +% |\begin{anskey*}|\myoarg{key \textnormal{\textcolor{gray}{=}} val} \mymeta{body content} |\end{anskey*}| +% \end{syntax} +% The environment \myenv*{anskey*} takes a mandatory \mymarg{body content} +% and \emph{\enquote{stores it}} in the \emph{sequence} and \emph{prop +% list} \mymarg{store name} set by \mykey{save-ans} key. If \mykey{save-ref} +% key are active and the \mypkg{hyperref}\cite{hyperref} package is +% detected |\hyperlink| and |\hypertarget| will be used, otherwise the +% usual \emph{\enquote{label and ref}} system provided by \hologo{LaTeX} will be used. +% By design the environment cannot be nested but full supports \emph{\enquote{verbatim material}} in the +% body and it is assumed that each numbered|\item| or |\item*| within the +% environment in which it is active it has a \emph{\enquote{single +% execution}} unless |\item| or |\item*| open a nested level +% or use the \mykey{no-store} key. +% \end{function} +% +% The \myenv*{anskey*} environment is implemented using the \mypkg{scontents} +% package, for the correct operation |\begin{anskey*}| and |\end{anskey*}| +% must be in different lines, all \mymeta{keys} must be passed separated by +% commas and \enquote{without separation} of the start of the environment. +% Comments \enquote{\textcolor{gray}{\%}} or \enquote{any character} +% after |\begin{anskey*}| or \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% on the same line are NOT supported, the package \mypkg{scontents} will return an +% \enquote{error} message if this happens. In a similar way comments +% \enquote{\textcolor{gray}{\%}} or \enquote{any character} after % +% |\end{anskey*}| on the same line the package \mypkg{scontents} will +% return a \enquote{warning} message. +% +% \subsubsection{Keys for \texttt{anskey*}} +% +% The \myenv*{anskey*} environment uses the same \mymeta{keys} as the +% \ics*{anskey} command next to the keys inherited from package \mypkg{scontents}. +% The environment is available for all levels of the +% \myenv*{enumext} environment and the \myenv*{enumext*} environment, but +% it is disabled for the \myenv*{keyans}, \myenv*{keyans*} and +% \myenv*{keyanspic} environments. +% +% \smallskip +% +% \keyexampenv{write-env}{file.ext}{not used} +% +% \smallskip +% +% Sets the name of the \mymeta{external file} in which the \mymeta{contents} of +% the environment will be written. The \mymeta{file.ext} will be created +% in the working directory, relative or absolute paths are not supported. If \mymeta{file.ext} +% does not exist, it will be created or overwritten if the \mykey{overwrite} key is used. +% +% \smallskip +% +% \keyexampenv{overwrite}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} +% Sets whether the \mymeta{file.ext} generated by \mykey{write-env} +% from the \myenv*{anskey*} environment will be rewritten. +% +% \smallskip +% +% \keyexampenv{force-eol}{true \textnormal{\textcolor{lightgray}{\textbar}} false}{false} +% +% \smallskip +% +% Sets if the \emph{end of line} for the \mymeta{stored content} is hidden or not. +% This key is necessary only if the last line is the closing of some +% environment defined by the \mypkg{fancyvrb} package as |\end{|\myenv{Verbatim}|}| +% or another environment that does not support a comments \enquote{\ttfamily\textcolor{gray}{\%}} +% after closing |\end{|\myenv{Verbatim}|}%|. +% +% \smallskip +% +% \begin{important}* +% For security reasons the keys |store-env|, |print-env| and |write-out| +% they have been left disabled. It is recommended that you review the +% \mypkg{scontents}\cite{scontents} documentation to understand how +% the keys described here work. +% \end{important} +% +% \subsubsection*{Example} +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\begin{enumext}[save-ans=test,show-pos=true,start=5] + \item* Text containing our instructions or questions. + \begin{anskey*}[item-star] + `\mymeta{first answer}` + \end{anskey*} + + \item Text containing our instructions or questions. + + \begin{enumext} + \item Question. + \begin{anskey*} + `\mymeta{second answer}` + \end{anskey*} + \end{enumext} + + \item Text containing our instructions or questions. + \begin{anskey*} + `\mymeta{third answer}` + \end{anskey*} + + \item Text containing our instructions or questions. + \begin{anskey*} + `\mymeta{fourth answer}` + \end{anskey*} +\end{enumext} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \begin{enumext}[save-ans=test,show-pos=true,columns=2,nosep,start=5] +% \item* Text containing our instructions or questions. +% \begin{anskey*} +% First answer with \verb+verbatim+ +% \end{anskey*} +% \item Text containing our instructions or questions. +% \begin{enumext} +% \item Question.\anskey{second answer} +% \end{enumext} +% \item Text containing our instructions or questions. \anskey{third answer} +% \item Text containing our instructions or questions. \anskey{fourth answer} +% \end{enumext} +% +% \subsection[The environment \texttt{keyans}]{The environments \env{keyans} and \env{keyans*}} +% +% \vspace*{-\baselineskip} +% +% \begin{function}{keyans,keyans*} +% \begin{syntax} +% |\begin{keyans}|\myoarg{key \textnormal{\textcolor{gray}{=}} val} \ics*{item} \ics*{item}\myoarg{custom} \ics*{item*} \ics*{item*}\myoarg{content} |\end{keyans}|\par +% |\begin{keyans*}|\myoarg{key \textnormal{\textcolor{gray}{=}} val} \ics*{item} \ics*{item}\myoarg{custom} \ics*{item*} \ics*{item*}\myoarg{content} |\end{keyans*}| +% \end{syntax} +% The \myenv*{keyans} and \myenv*{keyans*} environments are +% \emph{\enquote{enumerated list}} environments designed for +% \emph{\enquote{multiple choice}} questions activated by the \mykey{save-ans} key. +% This environments can NOT be nested and must always be at the +% \emph{\enquote{first level}} of the \myenv*{enumext} environment, the +% commands \ics*{item} and \ics*{item}\myoarg{custom} work in the usual +% and the command |\item|\myparg{columns} is available for the \myenv*{keyans*} environment. +% +% \smallskip +% +% \begin{important}* +% The behavior of |\item*| in \myenv*{keyans} and \myenv*{keyans*} environments +% is NOT the same as in the \myenv*{enumext} or \myenv*{enumext*} environments. +% \end{important} +% \end{function} +% +% \iffalse +%<*example> +% \fi +\vspace*{-1\baselineskip} +\begin{minipage}[t]{0.45\linewidth} +\begin{examplecode}[frame=none] +\begin{enumext}[save-ans=test] + \item `\mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + \begin{keyans}`\myoarg{key \textnormal{\textcolor{gray}{=}} val}` + \item `\mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + \item `\myoarg{custom} \mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + \item* `\mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + `\ics*{item*}\myoarg{content} \mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + \end{keyans} +\end{enumext} +\end{examplecode} +\end{minipage} +\hfill +\begin{minipage}[t]{0.45\linewidth} +\begin{examplecode}[frame=none] +\begin{enumext}[save-ans=test] + \item `\mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + \begin{keyans*}`\myoarg{key \textnormal{\textcolor{gray}{=}} val}` + \item `\mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + \item `\myoarg{custom} \mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + \item* `\mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + `\ics*{item*}\myoarg{content} \mymeta[type=tt,ac=lightgray,cf=gray]{item content}` + \end{keyans*} +\end{enumext} +\end{examplecode} +\end{minipage} +% \iffalse +%</example> +% \fi +% +% The \mymeta{keys} set in the \emph{optional argument} of the environment are the same +% (almost) as those of the \myenv*{enumext} and \myenv*{enumext*} +% environments and have \emph{higher precedence} than those set by +% \ics*{setenumext}\myoarg{keyans}\mymarg{key \textnormal{\textcolor{gray}{=}} val} or +% \ics*{setenumext}\myoarg{keyans\textnormal{\textcolor{MediumOrchid}{\texttt{*}}}}\mymarg{key \textnormal{\textcolor{gray}{=}} val}. +% If the \emph{optional argument} is not passed or the \mymeta{keys} +% are not set by \ics*{setenumext}, the default values will be the same +% as the \emph{\enquote{second level}} of the \myenv*{enumext} environment +% with the difference in the \mymeta{label} which will be set to \mykey{label}=\ilabel{Alph*)}. +% +% \subsubsection[The \texttt{\textbackslash item*} in \texttt{keyans}]{The \cs[no-index]{item*} in \texttt{keyans} and \texttt{keyans*}} +% +% \vspace*{-\baselineskip} +% +% \begin{function}{\item*} +% \begin{syntax} +% \ics*{item*} +% \ics*{item*}\myoarg{content} +% \end{syntax} +% The \ics*{item*} and \ics*{item*}\myoarg{content} command \emph{\enquote{store}} +% the current \mymeta{label} set by \mykey{label} key next to the \emph{optional argument} \mymeta{content} +% in \emph{sequence} and \emph{prop list} \mymarg{store name} set by +% \mykey{save-ans} key in the \emph{\enquote{first level}} of the +% \myenv*{enumext} or \myenv*{enumext*} environments. +% \end{function} +% +% The \emph{starred argument} ‘|*|’ cannot be separated by spaces ‘\verb*| |’ +% from the command, i.e. \ics*{item*} and the \emph{optional argument} +% does \enquote{NOT} support \emph{verbatim content}. By design it is +% assumed that the |\item*| will only appear \emph{\enquote{once}} +% within the environment. +% +% \subsubsection*{Example} +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\begin{enumext}[save-ans=test,columns=2,show-ans=true] + \item Text containing a question. + + \begin{keyans*}[nosep,columns=2] + \item Choice + \item* Correct choice + \item Choice + \item Choice + \item Choice + \end{keyans*} + + \item Text containing a question and image. + + \begin{keyans}[nosep,mini-env={0.4\linewidth}] + \item Choice + \item Choice + \item Choice + \item Choice + `\ics*{item*}\myoarg{note}` Correct choice + \miniright + \includegraphics[scale=0.25]{example-image-a} + Some text + \end{keyans} +\end{enumext} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \begin{enumext}[save-ans=test,show-ans=true,columns=2,nosep] +% \item Text containing a question. +% +% \begin{keyans*}[nosep,columns=2] +% \item Choice +% \item* Correct choice +% \item Choice +% \item Choice +% \item Choice +% \end{keyans*} +% +% \item Text containing a question and image. +% +% \begin{keyans}[nosep,mini-env={0.4\linewidth}] +% \item Choice +% \item Choice +% \item Choice +% \item Choice +% \item*[note] Correct choice +% \miniright +% \includegraphics[scale=0.15]{example-image-a} +% +% Some text +% \end{keyans} +% \end{enumext} +% +% \subsection{The environment \texttt{keyanspic}} +% +% \vspace*{-\baselineskip} +% +% \begin{function}{keyanspic} +% \begin{syntax} +% |\begin{keyanspic}|\myoarg{key \textnormal{\textcolor{gray}{=}} val} \ics*{anspic}|*|\myoarg{content}\mymarg{drawing or tabular} |\end{keyanspic}| +% \end{syntax} +% The \myenv*{keyanspic} environment is an \emph{\enquote{enumerated +% list}} environment activated by the \mykey{save-ans} key that has the +% same configuration for \emph{\enquote{spacing}} and \mymeta{label} +% as the \myenv*{keyans} environment that uses the |\anspic| command +% instead of |\item|. It is intended for placing \emph{drawings or tabular} +% with \mymeta{label} centered \emph{above} or \emph{below} in a \emph{single line} +% or \emph{upper and lower} layout style. +% +% \smallskip +% +% When the \myenv*{keyanspic} environment is used \emph{without keys} +% the \mymeta{labels} are centered \emph{below} the \emph{drawings +% or tabular} in a \emph{single line} layout style. +% \end{function} +% +% A representation of the output can be seen in the figure \ref{fig:keyanspicdoc}. +% +% \begin{figure}[ht] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% % space above +% \draw[color=white] (7.0,6.10) rectangle (17.5,6.5) node[pos=.5,text=black]% +% { \textcolor{lightgray}{\texttt{number of drawings or tabular upper}} }; +% \draw[color=white] (7.0,4.5) rectangle (17.5,4.9) node[pos=.5,text=black]% +% { \textcolor{optcolor}{\texttt{layout-sep}} }; %%%[+itemsep] +% \draw[color=white] (7.0,2.9) rectangle (17.5,3.3) node[pos=.5,text=black]% +% { \textcolor{lightgray}{\texttt{number of drawings or tabular lower}} }; +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{labelwidth}} (5.0,7.0); +% \draw[<->,color=gray] (5.0,7.0) --node[above,text=optcolor]{\texttt{labelsep}} (7.0,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,6.5) rectangle (5.0,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,6.5) rectangle (7.0,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.5) rectangle (17.5,6.85) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \textcolor{blue}{\emph{item text above the keyanspic environment}} +% \end{tabular}};% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,5.25) rectangle (10.5,6.10) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{above one} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,4.9) rectangle (10.5,5.25) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (10.5,5.25) rectangle (14,6.10) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{above two} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (10.5,4.9) rectangle (14,5.25) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (14,5.25) rectangle (17.5,6.10) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{above three} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (14,4.9) rectangle (17.5,5.25) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,3.65) rectangle (12.25,4.5) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{below one} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,3.3) rectangle (12.25,3.65) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (12.25,3.65) rectangle (17.5,4.5) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{below two} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (12.25,3.3) rectangle (17.5,3.65) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,2.55) rectangle (5.0,2.9);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,2.55) rectangle (7.0,2.9);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,2.55) rectangle (17.5,2.9) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \textcolor{blue}{\emph{item text below the keyanspic environment}} +% \end{tabular}};% item width +% \end{tikzpicture} +% \caption{Representation of the \myenv*{keyanspic} environment with \mykey{layout-sty}=\mymarg{3, 2} in \mypkg*{enumext}.} +% \label{fig:keyanspicdoc} +% \end{figure} +% +% \smallskip +% +% This environment cannot be nested and must always be at the +% \emph{\enquote{first level}} of the \myenv*{enumext} environment, the +% \ics*{item} command is disabled and keys cannot be set using +% |\setenumext|. +% +% \subsubsection{Keys for \texttt{keyanspic}} +% +% \keyexamp{label-pos}{above \textnormal{\textcolor{lightgray}{\textbar}} below}{below} +% +% \smallskip +% +% Set the \emph{position} of \mymeta{label} to be centered +% \enquote{above} or \enquote{below} \emph{drawings} or \emph{tabular} +% when the |\anspic| command is executed. +% +% \smallskip +% +% \keyexamp{label-sep}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{internal adjustment} +% +% \smallskip +% +% Set the \emph{vertical spacing} between the \mymeta{label} centered +% \enquote{above} or \enquote{below} and \emph{drawings} or \emph{tabular} +% when running the |\anspic| command. +% +% \keyexamp{layout-sty}{n° upper \textnormal{\textcolor{gray}{,}} n° lower}{not set} +% +% \smallskip +% +% Set the \emph{number} of \emph{drawings} or \emph{tabular} that will be +% distributed \enquote{upper} and \enquote{lower} within the environment +% when executing the |\anspic| command. The value must be passed in braces +% and if not set or the \mymeta{nº lower} is omitted the \emph{drawings} +% or \emph{tabular} will be put on a \emph{single line}. +% +% \smallskip +% +% \keyexamp{layout-sep}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{adjusted parsep from keyans} +% +% \smallskip +% +% Set the \emph{vertical separation} between the number of +% \emph{drawings} or \emph{tabular} placed at the \enquote{upper} and +% \enquote{lower} within the environment when executing the |\anspic| +% command. Internally adjusts the \mykey{parsep} value taken from the +% \myenv*{keyans} environment. +% +% \smallskip +% +% \keyexamp{layout-top}{rubber length \textnormal{\textcolor{lightgray}{\textbar}} rigid length}{adjusted topsep from keyans} +% +% \smallskip +% +% Set the \emph{vertical space} added to both the top and bottom of the environment. +% Internally adjust the value of \mykey{topsep} taken from \myenv*{keyans} environment. +% +% \subsubsection{The command \cs[no-index]{anspic}} +% +% \vspace*{-\baselineskip} +% +% \begin{function}{\anspic} +% \begin{syntax} +% \cmdexamp{anspic}{drawing or tabular} +% \cmdexamp[*]{anspic}[content]{drawing or tabular} +% \end{syntax} +% The \ics*{anspic} command take three arguments, the \emph{starred +% argument} ‘|*|’ store the current \mymeta{label} next to the +% \emph{optional argument} \mymeta{content} in \emph{sequence} and +% \emph{prop list} \mymarg{store name} set by \mykey{save-ans} key. +% \end{function} +% +% \smallskip +% +% The \emph{starred argument} ‘|*|’ cannot be separated by spaces ‘\verb*| |’ +% from the command, i.e. \ics*{anspic}|*| and the \emph{optional argument} +% does \enquote{NOT} support \emph{verbatim content}. By design it +% is assumed that the \emph{starred argument} ‘|*|’ will only +% appear \emph{\enquote{once}} within the environment. +% +% \subsubsection*{Example} +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\begin{enumext}[save-ans=test,show-ans,nosep] + \item Question with images and labels below. + + \begin{keyanspic}[layout-sty={3,2}] + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic{\includegraphics[scale=0.15]{example-image-b}} + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic*[note]{\includegraphics[scale=0.15]{example-image-a}} + \end{keyanspic} + + \item Question with images and labels above. + + \begin{keyanspic}[label-pos=above, layout-sty={3,2},layout-sep=0.25cm] + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic{\includegraphics[scale=0.15]{example-image-b}} + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic*[note]{\includegraphics[scale=0.15]{example-image-a}} + \end{keyanspic} + + \item Question with images and labels below on a single line. + + \begin{keyanspic} + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic{\includegraphics[scale=0.15]{example-image-b}} + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic{\includegraphics[scale=0.15]{example-image-a}} + \anspic*[note]{\includegraphics[scale=0.15]{example-image-a}} + \end{keyanspic} +\end{enumext} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \begin{enumext}[save-ans=test,show-ans=true,nosep, before={\setenumext[keyans]{nosep,parsep=5mm}}] +% \item Question with images and labels below. +% \begin{keyanspic}[layout-sty={3,2}] +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-b}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic*[note]{\includegraphics[scale=0.15]{example-image-a}} +% \end{keyanspic} +% \item Question with images and labels above. +% \begin{keyanspic}[label-pos=above, layout-sty={3,2},layout-sep=0.25cm] +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-b}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic*[note]{\includegraphics[scale=0.15]{example-image-a}} +% \end{keyanspic} +% \item Question with images and labels below on a single line. +% \begin{keyanspic} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-b}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic*[note]{\includegraphics[scale=0.15]{example-image-a}} +% \end{keyanspic} +% \end{enumext} +% +% \smallskip +% +% \begin{important} +% Remember to pass the |alt=|\mymarg{description} key to the |\includegraphics| +% command when creating a \emph{tagged} PDF. +% \end{important} +% +% \subsection{Printing stored content} +% +% \subsubsection{The command \cs[no-index]{getkeyans}} +% \label{sec:getkeyans} +% +% \vspace*{-10pt} +% +% \begin{function}{\getkeyans} +% \begin{syntax} +% \cmdexamp{getkeyans}{store name \textnormal{\textcolor{red}{:}} position} +% \end{syntax} +% The command \ics*{getkeyans} prints the \emph{\enquote{stored content}} +% in \emph{prop list} \mymarg{store name} defined by +% \mykey{save-ans} key in the \mymeta{position} returned by the +% \mykey{show-pos} key. +% The \emph{\enquote{stored content}} can only be accessed \emph{after} +% it is stored, if \mymarg{store name} does not exist the command +% will return an error. +% \end{function} +% +% \smallskip +% +% The form taken by the argument \mymarg{store name \textnormal{\textcolor{red}{:}} position} +% is the same as that used to generate the \emph{\enquote{internal +% label and ref}} system when \mykey{save-ref} key are active, so to +% refer to a \emph{\enquote{stored content}}. For example +% |\getkeyans{test:4}| will return the \emph{\enquote{stored content}} +% at position |4| of the environment in which the key |save-ans=test| +% was set. +% +% \subsubsection{The command \cs{foreachkeyans}}\label{sec:foreachkeyans} +% +% \vspace*{-10pt} +% +% \begin{function}{\foreachkeyans} +% \begin{syntax} +% \cmdexamp{foreachkeyans}[key \textnormal{\textcolor{gray}{=}} val]{store name} +% \end{syntax} +% \end{function} +% +% The command \ics*{foreachkeyans} goes through and executes the command |\getkeyans| +% on the contents in \emph{prop list} \mymarg{store name}. If you pass without options run +% |\getkeyans| on all contents in \emph{prop list} \mymarg{store name}. +% +% \subsubsection*{Options for command} +% \label{sec:optcmdforeach} +% +% \keyexampcmd{sep}{code}{\{; \}}[foreachkeyans] +% +% \smallskip +% +% Establishes the \emph{separation} between \emph{\enquote{each}} \mymarg{content} stored in \emph{prop list} \mymarg{store name}. +% For example, you can use \mykeycmd[foreachkeyans]{sep}|={\\[10pt]}| for vertical separation of stored +% contents. +% +% \smallskip +% +% \keyexampcmd{step}{integer}{\mydim{1}}[foreachkeyans] +% +% \smallskip +% +% Sets the \emph{step} (increment) applied to the value set by key \mykeycmd[foreachkeyans]{start} +% for \emph{\enquote{each}} \mymarg{content} stored in \emph{prop list} \mymarg{store name}. The value must be a +% \mymeta{positive integer}. +% +% \keyexampcmd{start}{integer}{\mydim{1}}[foreachkeyans] +% +% \smallskip +% +% Sets the \emph{position} of the \emph{prop list} \mymarg{store name} from which execution +% will start. The value must be a \mymeta{positive integer}. +% +% \keyexampcmd{stop}{integer}{\mydim{0}}[foreachkeyans] +% +% \smallskip +% +% Sets the \emph{position} of the \emph{prop list} \mymarg{store name} from which execution +% will finish. The value must be a \mymeta{positive integer}. +% +% \keyexampcmd{before}{code}{empty}[foreachkeyans] +% +% \smallskip +% +% Sets the \mymarg{code} that will be executed \mymeta{before} each \mymarg{content} stored +% in \emph{prop list} \mymarg{store name}. The \mymarg[type=tt]{code} must be passed between braces. +% +% \keyexampcmd{after}{code}{empty}[foreachkeyans] +% +% \smallskip +% +% Sets the \mymarg{code} that will be executed \mymeta{after} each \mymarg{content} stored +% in \emph{prop list} \mymarg{store name}. The \mymarg{code} must be passed between braces. +% +% \keyexampcmd{wrapper}{code{} \space\usebox{\hashbox} more code}{empty}[foreachkeyans] +% +% \smallskip +% +% Wraps the \mymarg{content} stored in \emph{prop list} \mymarg{store name} referenced by |{#1}|. +% The \mymarg{code} must be passed between braces. For example +% |\foreachkeyans[wrapper={\makebox[1em][l]{#1}}]|\mymarg{store name}. +% +% \subsubsection{The command \cs[no-index]{printkeyans}}\label{sec:printkeyans} +% +% \vspace*{-10pt} +% +% \begin{function}{\printkeyans} +% \begin{syntax} +% \cmdexamp{printkeyans}{store name} +% \cmdexamp{printkeyans}[keys]{store name} +% \cmdexamp[*]{printkeyans}[keys]{store name} +% \end{syntax} +% The command \ics*{printkeyans} prints \emph{\enquote{all stored content}} +% in \emph{sequence} \mymarg{store name} defined by \mykey{save-ans} +% key placing this inside the \myenv*{enumext} or \myenv*{enumext*} +% environment if the \emph{starred argument} ‘|*|’ is used. +% +% \smallskip +% +% The \emph{\enquote{stored content}} can only be accessed \emph{after} it is +% stored in the \emph{sequence}, if \mymarg{store name} does not exist the +% command will return an error. +% \end{function} +% +% \smallskip +% +% The \emph{optional argument} allows managing the \mymeta{keys} in the +% \emph{\enquote{first level}} of the environment in which the +% \emph{\enquote{stored content}} of the \emph{sequence} \mymarg{store +% name} will be printed, if the \emph{starred argument} ‘|*|’ is used it will be +% \myenv*{enumext*} otherwise \myenv*{enumext}. +% +% \smallskip +% +% The default values for the \emph{\enquote{first level}} are the +% same as the default values for the \myenv*{enumext} and \myenv*{enumext*} +% environments along with the keys |nosep,first=\small,font=\small| and |columns=2|. +% For the inner levels of the environment \myenv*{enumext} saved in the +% \emph{sequence} \mymarg{store name} the default values are the same +% as those established for the second, third and fourth levels plus the +% keys |nosep,first=\small,font=\small|. If the environment \myenv*{enumext*} +% is saved within the \emph{sequence} \mymarg{store name} it will have +% the same default values plus the keys |nosep,first=\small, font=\small|. +% +% \smallskip +% +% Since the command encapsulates by default the \myenv*{enumext} +% environment or the \myenv*{enumext*} environment, we must take some +% considerations: +% +%\begin{itemize}[topsep=0pt] +% \item If we execute |\printkeyans*|\mymarg{store name} and the \emph{sequence} +% \mymarg{store name} already contains any \myenv*{enumext*} environment +% an error will be returned as we cannot nest. +% +% \item If we execute |\printkeyans*|\mymarg{store name} and the \emph{sequence} +% \mymarg{store name} contains any \myenv*{enumext} environments, they +% will start with the \mymeta{keys} set for the first level unless they +% are set in the \emph{optional argument} or \mykey{save-key} is used to modify it. +% +% \item If we execute |\printkeyans|\mymarg{store name} and the \emph{sequence} +% \mymarg{store name} contains any environment \myenv*{enumext*}, they +% will start with the \mymeta{keys} set by default unless they are set +% in the \emph{optional argument} or \mykey{save-key} is used to modify it. +%\end{itemize} +% +% The default values for the \emph{\enquote{first level}} of |\printkeyans| commands and +% |\printkeyans*| are established using \ics*{setenumext}\myoarg{print \textnormal{\textcolor{gray}{,}} \textcolor{MediumOrchid}{1}}\mymarg{keys} and +% \ics*{setenumext}\myoarg{print\textnormal{\textcolor{MediumOrchid}{\texttt{*}}}}\mymarg{keys}. +% +% \smallskip +% +% If we need to set the \mymeta{keys} for the environment +% \myenv*{enumext} \enquote{saved} in the \emph{sequence} \mymarg{store +% name} we will use \ics*{setenumext}\myoarg{print +% \textnormal{\textcolor{gray}{,}} level}\mymarg{keys} and if we need to +% set the \mymeta{keys} for the environment \myenv*{enumext*} +% \enquote{saved} in the \emph{sequence} \mymarg{store name} we will use +% \ics*{setenumext}\myoarg{print \textnormal{\textcolor{gray}{,}} +% \textnormal{\textcolor{MediumOrchid}{\texttt{*}}}}\mymarg{keys}. +% +% \subsubsection*{Example} +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\begin{enumext}[save-ans=sample,columns=1,show-pos=true,nosep,save-ref=true] + \item Factor $3x+3y+3z$. \anskey{$3(x+y+z)$} + \item True False + + \begin{enumext}[nosep] + \item \LaTeX2e\ is cool? \anskey{Very True!} + \end{enumext} + + \item Related to Linux + + \begin{enumext}[nosep] + \item You use linux? \anskey{Yes} + \item Rate the following package and class + \begin{enumext}[nosep] + \item \texttt{xsim} \anskey{very good} + \item \texttt{exsheets} \anskey{obsolete} + \end{enumext} + \end{enumext} +\end{enumext} + +The answer to \ref{sample:4} is \getkeyans{sample:4} and the answers to +all the worksheets are as follows: + +\printkeyans{sample} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \begin{enumext}[save-ans=sampleXX,columns=1,show-pos=true,nosep,save-ref=true] +% \item Factor $3x+3y+3z$. \anskey{$3(x+y+z)$} +% \item True False +% \begin{enumext}[nosep] +% \item \LaTeX2e\ is cool? \anskey{Very True!} +% \end{enumext} +% \item Related to Linux +% \begin{enumext}[nosep] +% \item You use linux? \anskey{Yes} +% \item Rate the following package and class +% \begin{enumext}[nosep] +% \item \texttt{xsim} \anskey{very good} +% \item \texttt{exsheets} \anskey{obsolete} +% \end{enumext} +% \end{enumext} +% \end{enumext} +% +% \medskip +% +% The answer to \ref{sampleXX:4} is \getkeyans{sampleXX:4} and the answers to +% all the worksheets are as follows: +% +% \medskip +% +% \printkeyans[columns=1]{sampleXX} +% +% \section{Full examples} +% +% Here I will leave as an example some adaptations questions taken from \href{https://tex.stackexchange.com}{TeX-SX}. +% The examples are attached to this documentation and can be extracted +% from your PDF viewer or from the command line by running: +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +$ pdfdetach -saveall enumext.pdf +\end{examplecode} +% \iffalse +%</example> +% \fi +% and then you can use the excellent \arara\footnote{The cool \TeX\ automation tool: +% \url{https://www.ctan.org/pkg/arara}} tool to compile them. +% +% \subsubsection*{Example 1} +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-exa-1.tex} +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log] } +\documentclass{article} +\usepackage{siunitx,amssymb,enumext} +\sisetup{output-decimal-marker={,}} +\DeclareSIUnit{\angstrom}{\textup{\AA}} +\pagestyle{empty} +\begin{document} +\setenumext[keyans]{label=\Alph*,labelsep=10pt,font=\small,nosep,itemsep=2pt,wrap-label={\fbox{\makebox[\height]{##1}}}} +\begin{enumext}[mode-box,columns=2,columns-sep=1cm,save-ans=sabastiano] + \item La velocità di \qty{1,00e2}{m/s} espressa in \unit{km/h} è: + \begin{keyans} + \item \qty{36}{km/h}. + \item* \qty{360}{km/h}. + \item \qty{27,8}{km/h}. + \item \qty{3,60e8}{km/h}. + \end{keyans} + + \item In fisica nucleare si usa l'angstrom (simbolo: + $\qty{1}{\angstrom} = \qty{1e-10}{m}$) e il fermi o femtometro + ($\qty{1}{fm} = \qty{1e-15}{m}$). Qual è la relazione tra queste due + unità di misura? + \begin{keyans} + \item* $\qty{1}{\angstrom}=\qty{1e5}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e-5}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e-15}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e3}{fm}$. + \end{keyans} + + \item La velocità di \qty{1,00e2}{m/s} espressa in \unit{km/h} è: + \begin{keyans} + \item \qty{36}{km/h}. + \item* \qty{360}{km/h}. + \item \qty{27,8}{km/h}. + \item \qty{3,60e8}{km/h}. + \end{keyans} + + \item In fisica nucleare si usa l'angstrom (simbolo: + $\qty{1}{\angstrom} = \qty{1e-10}{m}$) e il fermi o femtometro + ($\qty{1}{fm} = \qty{1e-15}{m}$). Qual è la relazione tra queste due + unità di misura? + \begin{keyans} + \item* $\qty{1}{\angstrom}=\qty{1e5}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e-5}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e-15}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e3}{fm}$. + \end{keyans} +\end{enumext} + +\printkeyans[columns=4]{sabastiano} +\end{document} +\end{filecontents*} +% \iffalse +%</example> +% \fi +% +% Adapted from the response given by Enrico Gregorio in \href{https://tex.stackexchange.com/q/461730/7832}{Squares for answer choice options and perfect alignment to mathematical answers} +% \textattachfile[color=red,print=false]{enumext-exa-1.tex}{\faFile*[regular]}. +% +% \setenumext[keyans]{label=\Alph*,font=\small,nosep,wrap-label={\fbox{\makebox[\height]{##1}}}} +% \begin{enumext}[columns=2,save-ans=sabastiano,itemsep=0pt, topsep=0pt,below*={8pt}] +% \item La velocità di \SI{1,00e2}{m/s} espressa in \si{km/h} è: +% +% \begin{keyans} +% \item \SI{36}{km/h}. +% \item* \SI{360}{km/h}. +% \item \SI{27,8}{km/h}. +% \item \SI{3,60e8}{km/h}. +% \end{keyans} +% +% \item In fisica nucleare si usa l'angstrom (simbolo: +% $\SI{1}{\angstrom} = \SI{1e-10}{m}$) e il fermi o femtometro +% ($\SI{1}{fm} = \SI{1e-15}{m}$). Qual è la relazione tra queste due +% unità di misura? +% \begin{keyans} +% \item* $\SI{1}{\angstrom}=\SI{1e5}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e-5}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e-15}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e3}{fm}$. +% \end{keyans} +% +% \item La velocità di \SI{1,00e2}{m/s} espressa in \si{km/h} è: +% +% \begin{keyans} +% \item \SI{36}{km/h}. +% \item* \SI{360}{km/h}. +% \item \SI{27,8}{km/h}. +% \item \SI{3,60e8}{km/h}. +% \end{keyans} +% +% \item In fisica nucleare si usa l'angstrom (simbolo: +% $\SI{1}{\angstrom} = \SI{1e-10}{m}$) e il fermi o femtometro +% ($\SI{1}{fm} = \SI{1e-15}{m}$). Qual è la relazione tra queste due +% unità di misura? +% \begin{keyans} +% \item* $\SI{1}{\angstrom}=\SI{1e5}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e-5}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e-15}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e3}{fm}$. +% \end{keyans} +% \end{enumext} +% +% \printkeyans[columns=4]{sabastiano} +% +% \subsubsection*{Example 2} +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-exa-2.tex} +% arara: lualatex: { branch: developer } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +\documentclass{article} +\usepackage[colorlinks]{hyperref} +\usepackage{siunitx,amssymb,tikz,enumext} +\usetikzlibrary{shapes.geometric} +\sisetup{output-decimal-marker={,}} +\DeclareSIUnit{\angstrom}{\textup{\AA}} +\newcommand*{\mySquared}[1]{% + \begin{tikzpicture}[baseline=(number.base),square/.style={regular polygon,regular polygon sides=4}] + \node[square, rounded corners=1pt, inner sep=1pt, draw=none, fill=gray!40] (number) {\makebox[\height]{#1}}; + \end{tikzpicture}% +} +\pagestyle{empty} +\begin{document} +\setenumext[keyans]{label=\Alph*,font=\small,nosep,wrap-label={\mySquared{##1}}} +\begin{enumext}[columns=1,save-ans=sabastiano2,mark-pos=left,mark-ans=$\checkmark$,save-ref=true,show-ans=true,itemsep=0pt] + \item La velocità di \qty{1,00e2}{m/s} espressa in \unit{km/h} è: + \begin{keyans} + \item \qty{36}{km/h}. + \item* \qty{360}{km/h}. + \item \qty{27,8}{km/h}. + \item \qty{3,60e8}{km/h}. + \end{keyans} + + \item In fisica nucleare si usa l'angstrom (simbolo: + $\qty{1}{\angstrom} = \qty{1e-10}{m}$) e il fermi o femtometro + ($\qty{1}{fm} = \qty{1e-15}{m}$). Qual è la relazione tra queste due + unità di misura? + \begin{keyans} + \item* $\qty{1}{\angstrom}=\qty{1e5}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e-5}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e-15}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e3}{fm}$. + \end{keyans} + + \item La velocità di \qty{1,00e2}{m/s} espressa in \unit{km/h} è: + \begin{keyans} + \item \qty{36}{km/h}. + \item* \qty{360}{km/h}. + \item \qty{27,8}{km/h}. + \item \qty{3,60e8}{km/h}. + \end{keyans} + + \item In fisica nucleare si usa l'angstrom (simbolo: + $\qty{1}{\angstrom} = \qty{1e-10}{m}$) e il fermi o femtometro + ($\qty{1}{fm} = \qty{1e-15}{m}$). Qual è la relazione tra queste due + unità di misura? + \begin{keyans} + \item* $\qty{1}{\angstrom}=\qty{1e5}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e-5}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e-15}{fm}$. + \item $\qty{1}{\angstrom}=\qty{1e3}{fm}$. + \end{keyans} +\end{enumext} + +\printkeyans[columns=4]{sabastiano2} +\end{document} +\end{filecontents*} +% \iffalse +%</example> +% \fi +% +% Adapted from the response given by Florent Rougon in \href{https://tex.stackexchange.com/q/529034/7832}{Multiple choice questions with proposed answers in random order — addition of automatic correction (cross mark)} +% \textattachfile[color=red,print=false]{enumext-exa-2.tex}{\faFile*[regular]}. +% \setenumext[keyans]{label=\Alph*,font=\small,nosep,wrap-label={\mySquared{##1}}} +% \begin{enumext}[columns=2,save-ans=sabastiano2,mark-pos=left,mark-ans=$\checkmark$,save-ref=true,show-ans=true,itemsep=0pt] +% \item La velocità di \SI{1,00e2}{m/s} espressa in \si{km/h} è: +% \begin{keyans} +% \item \SI{36}{km/h}. +% \item* \SI{360}{km/h}. +% \item \SI{27,8}{km/h}. +% \item \SI{3,60e8}{km/h}. +% \end{keyans} +% +% \item In fisica nucleare si usa l'angstrom (simbolo: +% $\SI{1}{\angstrom} = \SI{1e-10}{m}$) e il fermi o femtometro +% ($\SI{1}{fm} = \SI{1e-15}{m}$). Qual è la relazione tra queste due +% unità di misura? +% \begin{keyans} +% \item* $\SI{1}{\angstrom}=\SI{1e5}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e-5}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e-15}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e3}{fm}$. +% \end{keyans} +% +% \item La velocità di \SI{1,00e2}{m/s} espressa in \si{km/h} è: +% \begin{keyans} +% \item \SI{36}{km/h}. +% \item* \SI{360}{km/h}. +% \item \SI{27,8}{km/h}. +% \item \SI{3,60e8}{km/h}. +% \end{keyans} +% +% \item In fisica nucleare si usa l'angstrom (simbolo: +% $\SI{1}{\angstrom} = \SI{1e-10}{m}$) e il fermi o femtometro +% ($\SI{1}{fm} = \SI{1e-15}{m}$). Qual è la relazione tra queste due +% unità di misura? +% \begin{keyans} +% \item* $\SI{1}{\angstrom}=\SI{1e5}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e-5}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e-15}{fm}$. +% \item $\SI{1}{\angstrom}=\SI{1e3}{fm}$. +% \end{keyans} +% \end{enumext} +% +% \printkeyans*[columns=2]{sabastiano2} +% +% \subsubsection*{Example 3} +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-exa-3.tex} +% arara: lualatex: { branch: developer } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +\documentclass{article} +\usepackage[margin=2cm]{geometry} +\usepackage{tikz} +\newcommand*{\myCircled}[1]{% + \begin{tikzpicture}[baseline=(number.base)] + \node[circle, draw=green!10!gray, inner sep=1pt, fill=blue!30!green!10] (number) {#1}; + \end{tikzpicture}% +} +\usepackage[colorlinks]{hyperref} +\usepackage{enumext} +\pagestyle{empty} +\begin{document} +\setenumext[keyans]{labelsep=8pt,label=\Alph*,font=\small,nosep,wrap-label={\myCircled{##1}}} +\setenumext[keyans*]{labelsep=8pt,label=\Alph*,font=\small,nosep,wrap-label={\myCircled{##1}}} +\setenumextmeta[enumext,2]{myroman}{no-store, label=\Roman*., noitemsep} +\setenumextmeta[enumext,2]{myarabic}{no-store,list-offset=0.5cm,label=(\arabic*),noitemsep} +\begin{enumext}[mode-box,save-ans=simplemc,columns=1,nosep,save-ref=true] +\item First type of questions + \begin{keyans*}[columns=1,noitemsep] + \item value + \item*[$x=5$] correct + \item value + \item value + \end{keyans*} +\item Second type of questions + \begin{enumext}[myroman] + \item $2\alpha+2\delta=90^{\circ}$ + \item $\alpha=\delta$ + \item $\angle EDF=45^{\circ}$ + \end{enumext} + \begin{keyans}[columns=2,noitemsep] + \item I only + \item II only + \item I and II only + \item* I and III only + \item I, II, and III + \end{keyans} +\item Third type of questions + \begin{enumext}[myarabic] + \item $2\alpha+2\delta=90^{\circ}$ + \item $\angle EDF=45^{\circ}$ + \end{enumext} +\begin{keyans}[columns=2,noitemsep] + \item value + \item value + \item*[some note] value + \item value + \item value +\end{keyans} + +\item Question with image and label below: +\begin{keyanspic}[layout-sty={3,2},label-sep=3pt] +\anspic{\includegraphics[scale=0.15]{example-image-a}} +\anspic{\includegraphics[scale=0.15]{example-image-b}} +\anspic{\includegraphics[scale=0.15]{example-image-a}} +\anspic{\includegraphics[scale=0.15]{example-image-a}} +\anspic*[A duck]{\includegraphics[scale=0.32]{example-image-duck}} +\end{keyanspic} + +\item Question with image on left side: +\begin{keyans}[mini-env=0.5\linewidth, columns=1,noitemsep] + \item value + \item value + \item value + \item*[other note] correct + \item value + \miniright + \includegraphics[scale=0.15]{example-image-b} +\end{keyans} +\end{enumext} + +\medskip + +Test keys + +\printkeyans{simplemc} +\end{document} +\end{filecontents*} +% \iffalse +%</example> +% \fi +% +% A \emph{\enquote{simple multiple choice}} test \textattachfile[color=red,print=false]{enumext-exa-3.tex}{\faFile*[regular]}. +% \setenumext[keyans]{label=\Alph*,font=\small,nosep,wrap-label={\myCircled{##1}}} +% \begin{enumext}[save-ans=simplemc,columns=1,nosep,save-ref=true] +% \item First type of questions +% \begin{keyans*}[columns=2,noitemsep] +% \item value +% \item*[$x=5$] correct +% \item value +% \item value +% \end{keyans*} +% \item Second type of questions +% \begin{enumext}[no-store,label=\Roman*.,nosep] +% \item $2\alpha+2\delta=90^{\circ}$ +% \item $\alpha=\delta$ +% \item $\angle EDF=45^{\circ}$ +% \end{enumext} +% \begin{keyans}[columns=2,noitemsep] +% \item I only +% \item II only +% \item I and II only +% \item* I and III only +% \item I, II, and III +% \end{keyans} +% \item Third type of questions +% \begin{enumext}[no-store,list-offset=0.5cm,label=(\arabic*),nosep] +% \item $2\alpha+2\delta=90^{\circ}$ +% \item $\angle EDF=45^{\circ}$ +% \end{enumext} +% \begin{keyans}[columns=2,noitemsep] +% \item value +% \item value +% \item*[some note] value +% \item value +% \item value +% \end{keyans} +% +% \item Question with image and label below: +% \begin{keyanspic} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-b}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic{\includegraphics[scale=0.15]{example-image-a}} +% \anspic*[A duck]{\includegraphics[scale=0.32]{example-image-duck}} +% \end{keyanspic} +% +% \item Question with image on left side: +% \begin{keyans}[mini-env=0.5\linewidth, columns=1,noitemsep] +% \item value +% \item value +% \item value +% \item*[other note] correct +% \item value +% \miniright +% \includegraphics[scale=0.15]{example-image-b} +% \end{keyans} +% \end{enumext} +% +% \smallskip +% +% Test keys +% +% \printkeyans[columns=2]{simplemc} +% +% \subsubsection*{Example 4} +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-exa-4.tex} +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +\documentclass{article} +\usepackage[top=2cm,bottom=2cm,left=2cm,right=2cm]{geometry}% +\usepackage[osf]{libertinus} +\usepackage{unicode-math,tikzducks,graphicx,hyperref,enumext} +\begin{document} +\begin{enumext}[mode-box,save-ans=simplews,labelsep=10pt,columns=2,check-ans=true,show-ans=true,nosep,save-ref=true,wrap-label={\tikz[scale=0.25]\duck[signpost=\scalebox{0.6}{#1}];}] + \item Factor $x^{2}-2x+1$ \anskey{$\left(x-1\right)^{2}$} + \item Factor $3x+3y+3z$ \anskey{$3(x+y+z)$} + \item True False + \begin{enumext}[nosep] + \item $\alpha > \delta$ \anskey{False} + \item \LaTeX2e\ is cool? \anskey{Very True!} + \end{enumext} + \item Related to Linux + \begin{enumext}[nosep] + \item You use linux? \anskey{Yes} + \item Usually uses the package manager? \anskey{Yes, \texttt{dnf}} + \item Rate the following package and class + \begin{enumext}[nosep] + \item \texttt{xsim-exam} \anskey{doesn't exist for now :(} + \item \texttt{xsim} \anskey{very good} + \item \texttt{exsheets} \anskey{obsolete} + \end{enumext} + \end{enumext} +\end{enumext} + +The answer to \ref{simplews:1} is \getkeyans{simplews:1} and the answer +to \ref{simplews:3} is \getkeyans{simplews:3}. + +\printkeyans[columns=2]{simplews} +\end{document} +\end{filecontents*} +% \iffalse +%</example> +% \fi +% +% A \emph{\enquote{simple worksheet}} using ducks :) \textattachfile[color=red,print=false]{enumext-exa-4.tex}{\faFile*[regular]}. +% +% \begin{enumext}[save-ans=simplews,columns=1,check-ans=true,nosep,save-ref=true,wrap-label={\tikz[scale=0.25]\duck[signpost=\scalebox{0.6}{#1}];}] +% \item Factor $x^{2}-2x+1$ \anskey{$\left(x-1\right)^{2}$} +% \item Factor $3x+3y+3z$ \anskey{$3(x+y+z)$} +% \item[] The following questions need to be cuaqtified :) +% \item True False +% \begin{enumext}[nosep] +% \item $\alpha > \delta$ \anskey{False} +% \item \LaTeX2e\ is cool? \anskey{Very True!} +% \end{enumext} +% \item Related to Linux +% \begin{enumext}[nosep] +% \item You use linux? \anskey{Yes} +% \item Usually uses the package manager? \anskey{Yes, \texttt{dnf}} +% \item Rate the following package and class +% \begin{enumext}[nosep] +% \item \texttt{xsim-exam} \anskey{doesn't exist for now :(} +% \item \texttt{xsim} \anskey{very good} +% \item \texttt{exsheets} \anskey{obsolete} +% \end{enumext} +% \end{enumext} +% \end{enumext} +% +% The answer to \ref{simplews:1} is \getkeyans{simplews:1} and the answer +% to \ref{simplews:3} is \getkeyans{simplews:3}. +% +% \printkeyans[columns=2]{simplews} +% +% \subsubsection*{Example 5} +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-exa-5.tex} +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +% arara: move: { files: [ enumext-exa-5-luamml-mathml.html ], target: 'enumext-exa-5-mathml.html' } +\DocumentMetadata{ + lang=en-US, + pdfversion=2.0, + pdfstandard=ua-2, + testphase={phase-III,math,title,table,firstaid}, + } +\documentclass{article} +\usepackage[top=2cm,bottom=2cm,left=2cm,right=2cm]{geometry}% +\usepackage[osf]{libertinus} +\usepackage{unicode-math,xcolor,graphicx,hyperref,enumext} +\hypersetup + { + colorlinks = true, + pdftitle = {Test tagged PDF for SAT style enumext package}, + } +\newsavebox{\satbox} +\sbox\satbox{\small\textbf{67}}% +\NewDocumentCommand \stylesat { m } + {% + \setlength{\fboxsep}{2pt}% + \raisebox{7\fboxsep}{% + \noindent\colorbox{black}{\textcolor{white}{\makebox[\dimeval{\labelwidth-2\fboxsep}][c]{\small\textbf{\vphantom{67}#1}}}}% + \colorbox{lightgray}{\phantom{\rule[-\dp\satbox]{\dimeval{\linewidth-2\fboxsep}}{\dimeval{\dp\satbox+\ht\satbox}}}}}% + } +\begin{document} +\setenumext[keyans]{label=\Alph*),nosep,below*={0.3cm}} +\begin{enumext}[mode-box,label=\arabic*,labelwidth=20pt,labelsep=0pt,columns=2,columns-sep=30pt,save-ans=stylesat, wrap-label={\stylesat{#1}}] + \item Which choice best describes what happens in the passage? + \begin{keyans} + \item* One character argues with another character who intrudes on her home. + \item One character receives a surprising request from another character. + \item One character reminisces about choices she has made over the years. + \item One character criticizes another character for pursuing an unexpected course of action. + \end{keyans} + + \item Which choice best describes what happens in the passage? + \begin{keyans} + \item One character argues with another character who intrudes on her home. + \item One character receives a surprising request from another character. + \item* One character reminisces about choices she has made over the years. + \item One character criticizes another character for pursuing an unexpected course of action. + \end{keyans} + + \item Which choice best describes what happens in the passage? + \begin{keyans} + \item One character argues with another character who intrudes on her home. + \item* One character receives a surprising request from another character. + \item One character reminisces about choices she has made over the years. + \item One character criticizes another character for pursuing an unexpected course of action. + \end{keyans} + + \item Which choice best describes what happens in the passage? + \begin{keyans} + \item One character argues with another character who intrudes on her home. + \item One character receives a surprising request from another character. + \item One character reminisces about choices she has made over the years. + \item* One character criticizes another character for pursuing an unexpected course of action. + \end{keyans} +\end{enumext} + +\printkeyans[columns=4]{stylesat} +\end{document} +\end{filecontents*} +% \iffalse +%</example> +% \fi +% +% Adapted from the response given by Stephen in \href{https://tex.stackexchange.com/a/691544}{SAT like question format} +% \textattachfile[color=red,print=false]{enumext-exa-5.tex}{\faFile*[regular]}. +% \setenumext[keyans]{label=\Alph*),font=\small,nosep,wrap-label={##1}} +% \begin{enumext}[label=\arabic*,labelwidth=20pt,labelsep=0pt,columns=2,save-ans=stylesat, wrap-label={\stylesat{#1}}] +% \item Which choice best describes what happens in the passage? +% \begin{keyans} +% \item* One character argues with another character who intrudes on her home. +% \item One character receives a surprising request from another character. +% \item One character reminisces about choices she has made over the years. +% \item One character criticizes another character for pursuing an unexpected course of action. +% \end{keyans} +% +% \item Which choice best describes what happens in the passage? +% \begin{keyans} +% \item One character argues with another character who intrudes on her home. +% \item One character receives a surprising request from another character. +% \item* One character reminisces about choices she has made over the years. +% \item One character criticizes another character for pursuing an unexpected course of action. +% \end{keyans} +% +% \item Which choice best describes what happens in the passage? +% \begin{keyans} +% \item One character argues with another character who intrudes on her home. +% \item* One character receives a surprising request from another character. +% \item One character reminisces about choices she has made over the years. +% \item One character criticizes another character for pursuing an unexpected course of action. +% \end{keyans} +% +% \item Which choice best describes what happens in the passage? +% \begin{keyans} +% \item One character argues with another character who intrudes on her home. +% \item One character receives a surprising request from another character. +% \item One character reminisces about choices she has made over the years. +% \item* One character criticizes another character for pursuing an unexpected course of action. +% \end{keyans} +% \end{enumext} +% +% \printkeyans[columns=4]{stylesat} +% +% \section{Tagged PDF examples} +% +% This section is just to show the compatibility of \mypkg*{enumext} with +% \emph{tagged} \texttt{PDF} using |lualatex|. The attached files here +% are just for testing and are intended as examples and, in a way, to +% simplify the time of Matthew Bertucci (\texttt{@mbertucci}) when he sees this +% excellent package and adds it to \href{https://github.com/latex3/tagging-project}{The LaTeX Tagged PDF repository}. +% +% \smallskip +% +% To compile the tests with |lualatex-dev| the packages \mypkg{multicol}, +% \mypkg{scontents}, \mypkg{unicode-math}, \mypkg{geometry}, \mypkg{graphicx}, \mypkg{luamml} +% and \mypkg{hyperref} are required along with the line: +% +% \smallskip +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=single] +\DocumentMetadata + { + lang = en-US, pdfversion = 2.0, pdfstandard = `\mydim{ua-2}`, + testphase = {phase-III, math, title, table, firstaid}, + } +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% \smallskip +% +% \begin{important} +% All examples have been checked using \href{https://dev.verapdf-rest.duallab.com}{\texttt{veraPDF}} +% together with \href{https://ngpdf.com}{\texttt{ngpdf}}. +% \end{important} +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-01.tex} +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +% arara: move: { files: [ enumext-01-luamml-mathml.html ], target: 'enumext-01-mathml.html' } +\DocumentMetadata + { + lang=en-US, + pdfversion=2.0, + pdfstandard=ua-2, + testphase={phase-III,math,title,table,firstaid}, + %uncompress, + } +\documentclass{article} +\usepackage[top=2cm,bottom=2cm,left=1cm,right=1cm]{geometry} +\usepackage{unicode-math,hyperref,enumext} +\hypersetup + { + colorlinks = true, + pdftitle = {Test tagged PDF for enumext package}, + } +\begin{document} +\section{only enumext} +Some text here + +\begin{enumext}[labelwidth=1cm,labelsep=0.25cm,align=left, wrap-label=\textbf{(#1}, label=\arabic*.)] + \item This text is in the first level.\label{A} + \begin{enumext} + \item This text is in the second level.\footnote{foot note in enumext} + \begin{enumext} + \item This text is in the third level. + \begin{enumext} + \item This text is in the fourth level.\footnotemark[20] + \end{enumext} + \end{enumext} + \end{enumext} + \item[X] This text is in the first level. + \item* This text is in the first level. +\end{enumext} + +Some ref here \ref{A}\footnotetext[20]{foot note in enumext [20]} + +\section{only enumext*} + +Some text here + +\begin{enumext*}[columns=2,labelwidth=1cm,labelsep=0.25cm,align=left, wrap-label=\textbf{#1)}, label=(\arabic*.] + \item This text is in the first level.\label{B} + \item[X] This text is in the first level.\footnotemark[30] + \item* This text is in the first level.\footnote{foot note in enumext*} + \item This text is in the first level. +\end{enumext*} + +Some ref here \ref{B}\footnotetext[30]{foot note in enumext* [30]} + +\section{enumext nested in enumext*} + +Some text here + +\begin{enumext*} + \item This text is in the first level.\label{C} + \item \begin{enumext}[base-fix] + \item This text is in nested enumext.\label{D}\footnote{foot note in neseted enumext} + \item This text is in nested enumext.\footnotemark[40] + \end{enumext} + \item This text is in the first level. +\end{enumext*} + +Some refs here \ref{C} and \ref{D} \footnotetext[40]{foot note in neseted enumext [40]} + +\section{enumext* nested in enumext} + +\begin{enumext} + \item This text is in the first level. \label{E} + \item \begin{enumext*}[label=\roman*.] + \item This text is in nested enumext*.\label{F}\footnotemark[50] + \item This text is in nested enumext*.\footnote{foot note in neseted enumext*} + \end{enumext*} + \item This text is in the first level. +\end{enumext} + +Some refs here \ref{E} and \ref{F} \footnotetext[50]{foot note in neseted enumext* [50]} + +\section{Custom ref} + +\begin{enumext}[ref={enumext-level-\arabic*}] + \item This text is in the first level. \label{G} + \item \begin{enumext*}[label=\roman*., ref={nested-\arabic{enumXi}.\roman*}] + \item This text is in nested enumext*.\label{H} + \item This text is in nested enumext*. + \end{enumext*} + \item This text is in the first level. +\end{enumext} + +Some refs here \ref{G} and \ref{H} +\end{document} +\end{filecontents*} +\IfFileExists{enumext-01.pdf}{}{\ShellEscape{arara enumext-01.tex}} +% \iffalse +%</example> +% \fi +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-02.tex} +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +% arara: move: { files: [ enumext-02-luamml-mathml.html ], target: 'enumext-02-mathml.html' } +\DocumentMetadata + { + lang=en-US, + pdfversion=2.0, + pdfstandard=ua-2, + testphase={phase-III,math,title,table,firstaid}, + %uncompress, + } +\documentclass{article} +\usepackage[top=2cm,bottom=2cm,left=1cm,right=1cm]{geometry} +\usepackage{unicode-math,hyperref,enumext} +\hypersetup + { + colorlinks = true, + pdftitle = {Test tagged PDF for enumext package}, + } +\begin{document} +\section{enumext + multicols} +Some text here + +\begin{enumext}[columns=2, labelwidth=1cm,labelsep=0.25cm,align=left, wrap-label=\textbf{(#1}, label=\arabic*.),partopsep=0.5cm] + \item This text is in the first level. + \item This text is in the first level. + \item This text is in the first level. + \item This text is in the first level. + \item[X] This text is in the first level. + \item* This text is in the first level. +\end{enumext} + +Some text here + +\section{enumext + minipage} + +Some text here + +\begin{enumext}[labelwidth=1cm,labelsep=0.25cm,align=left,partopsep=0.5cm,mini-env=0.4\linewidth] + \item This text is in the first level. + \item This text is in the first level. + \item This text is in the first level. + \item This text is in the first level. + \miniright + This text is in minipage. +\end{enumext} + +\section{enumext + minipage + multicols} + +Some text here + +\begin{enumext}[columns=2,labelwidth=1cm,labelsep=0.25cm,align=left,partopsep=0.5cm,mini-env=0.4\linewidth] + \item This text is in the first level. + \item This text is in the first level. + \item This text is in the first level. + \item This text is in the first level. + \miniright + This text is in minipage. +\end{enumext} + +Some text here + +\section{enumext* + minipage} + +Some text here + +\begin{enumext*}[columns=2,labelwidth=1cm,labelsep=0.25cm,align=left,partopsep=0.5cm,mini-env=0.4\linewidth, mini-right = {This text is in minipage.}] + \item This text is in the first level. + \item This text is in the first level. + \item This text is in the first level. + \item This text is in the first level. +\end{enumext*} +\end{document} +\end{filecontents*} +\IfFileExists{enumext-02.pdf}{}{\ShellEscape{arara enumext-02.tex}} +% \iffalse +%</example> +% \fi +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-03.tex} +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +% arara: move: { files: [ enumext-03-luamml-mathml.html ], target: 'enumext-03-mathml.html' } +\DocumentMetadata + { + lang=en-US, + pdfversion=2.0, + pdfstandard=ua-2, + testphase={phase-III,math,title,table,firstaid}, + %uncompress, + } +\documentclass{article} +\usepackage[top=2cm,bottom=2cm,left=1cm,right=1cm]{geometry} +\usepackage{unicode-math,graphicx,hyperref,enumext} +\hypersetup + { + colorlinks = true, + pdftitle = {Test tagged PDF for enumext package}, + } +\begin{document} +\section{enumext+keyanspic} + +Some text here + +\begin{enumext}[save-ans=test,save-sep={ },save-ref = true] + \item Question with images. + \begin{keyanspic}[layout-sty={3,2}] + \anspic{\includegraphics[scale=0.30, alt={Un pato de color amarillo}]{example-image-duck}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula A}]{example-image-a}} + \anspic*{\includegraphics[scale=0.15, alt={Una letra mayuscula B}]{example-image-b}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula C}]{example-image-c}} + \anspic{\includegraphics[scale=0.15, alt={La palabra Image}]{example-image}} + \end{keyanspic} + \item Question with images.\label{dos} + \begin{keyanspic}[label-pos=above, layout-sty={3,2}] + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula A}]{example-image-a}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula B}]{example-image-b}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula C}]{example-image-c}} + \anspic{\includegraphics[scale=0.15, alt={La palabra Image}]{example-image}} + \anspic*[A duck]{\includegraphics[scale=0.30, alt={Un pato de color amarillo}]{example-image-duck}} + \end{keyanspic} + \item Question with images. + \begin{keyanspic} + \anspic*[La letra A]{\includegraphics[scale=0.15, alt={Una letra mayuscula A}]{example-image-a}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula B}]{example-image-b}} + \anspic{\includegraphics[scale=0.30, alt={Un pato de color amarillo}]{example-image-duck}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula C}]{example-image-c}} + \anspic{\includegraphics[scale=0.15, alt={La palabra Image}]{example-image}} + \end{keyanspic} + \item Question with images. + \begin{keyanspic}[label-pos=above] + \anspic{\includegraphics[scale=0.30, alt={Un pato de color amarillo}]{example-image-duck}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula A}]{example-image-a}} + \anspic*{\includegraphics[scale=0.15, alt={Una letra mayuscula B}]{example-image-b}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula C}]{example-image-c}} + \anspic{\includegraphics[scale=0.15, alt={La palabra Image}]{example-image}} + \end{keyanspic} +\end{enumext} + +The answer to question \ref{dos} is \getkeyans{test:2} + +\printkeyans*{test} +\end{document} +\end{filecontents*} +\IfFileExists{enumext-03.pdf}{}{\ShellEscape{arara enumext-03.tex}} +% \iffalse +%</example> +% \fi +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-04.tex} +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +% arara: move: { files: [ enumext-04-luamml-mathml.html ], target: 'enumext-04-mathml.html' } +\listfiles +\DocumentMetadata + { + lang=en-US, + pdfversion=2.0, + pdfstandard=ua-2, + testphase={phase-III,math,title,table,firstaid}, + %uncompress, + } +\documentclass{article} +\usepackage[top=2cm,bottom=2cm,left=1cm,right=1cm]{geometry} +\usepackage{unicode-math,graphicx,hyperref,enumext} +\hypersetup + { + colorlinks = true, + pdftitle = {Test tagged PDF for enumext package}, + } +\begin{document} +\section{enumext + anskey + anskey*} + +Some text here + +\begin{enumext}[save-ans=test,save-sep={ },save-ref = true] + \item Question A. \anskey{Answer A} + \item Question B. \anskey{Answer B} + \item Question C. + \begin{anskey*} + Answer whit \verb+code+ and more + \begin{verbatim} + Some code here + \end{verbatim} + And text + \end{anskey*} +\end{enumext} + +The answer to question \ref{test:2} is \getkeyans{test:2} + +\printkeyans*{test} + +\section{enumext* + anskey + anskey*} + +Some text here + +\begin{enumext*}[save-ans=test-2,save-sep={ },save-ref = true] + \item Question A. \anskey{Answer A} + \item Question B. \anskey{Answer B} + \item Question C. + \begin{anskey*} + Answer whit \verb+code+ and more + \begin{verbatim} + Some code here + \end{verbatim} + And text + \end{anskey*} +\end{enumext*} + +\printkeyans{test-2} +\end{document} +\end{filecontents*} +\IfFileExists{enumext-04.pdf}{}{\ShellEscape{arara enumext-04.tex}} +% \iffalse +%</example> +% \fi +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-05.tex} +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +% arara: move: { files: [ enumext-05-luamml-mathml.html ], target: 'enumext-05-mathml.html' } +\DocumentMetadata{ + lang=en-US, + pdfversion=2.0, + pdfstandard=ua-2, + testphase={phase-III,math,title,table,firstaid}, + %uncompress, + } +\documentclass{article} +\usepackage[top=2cm,bottom=2cm,left=1cm,right=1cm]{geometry} +\usepackage{unicode-math,graphicx,hyperref,enumext} +\hypersetup + { + colorlinks = true, + pdftitle = {Test tagged PDF for enumext package}, + } +\setenumext[print,1]{columns=2, columns-sep=1cm, font=\bfseries} +\setenumext[print*]{columns=2, columns-sep=1cm,first=\bfseries} +\setenumext[enumext,1]{columns=2,nosep,save-ref=true,save-sep={ },wrap-opt=\fbox{##1}, show-ans=true} +\setenumext[keyans]{columns=2,noitemsep} +\setenumext[keyans*]{columns=2,noitemsep} +\setenumextmeta[enumext,2]{myroman}{no-store, label=\Roman*., noitemsep} +\setenumextmeta[enumext,2]{myarabic}{no-store,list-offset=0.5cm,label=(\arabic*),noitemsep} +\begin{document} +\section{The enumext package in action} + +\begin{enumext}[save-ans=mytest] +\item First type of questions + \begin{keyans*} + \item value + \item*[$x=5$] correct + \item value + \item value + \end{keyans*} +\item Second type of questions + \begin{enumext}[myroman] + \item $2\alpha+2\delta=90^{\circ}$ + \item $\alpha=\delta$ + \item $\angle EDF=45^{\circ}$ + \end{enumext} + \begin{keyans} + \item I only + \item II only + \item I and II only + \item* I and III only + \item I, II, and III + \end{keyans} +\item* Third type of questions + \begin{enumext}[myarabic] + \item $2\alpha+2\delta=90^{\circ}$ + \item $\angle EDF=45^{\circ}$ + \end{enumext} + \begin{keyans} + \item value + \item value + \item*[some note $y$] value + \item value + \item value + \end{keyans} +\item Question with image and label above: + \begin{keyanspic}[label-pos=above, layout-sty={3,2}] + \anspic*[La letra A]{\includegraphics[scale=0.15, alt={Una letra mayuscula A}]{example-image-a}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula B}]{example-image-b}} + \anspic{\includegraphics[scale=0.30, alt={Un pato de color amarillo}]{example-image-duck}} + \anspic{\includegraphics[scale=0.15, alt={Una letra mayuscula C}]{example-image-c}} + \anspic{\includegraphics[scale=0.15, alt={La palabra Image}]{example-image}} + \end{keyanspic} +\item A question + \begin{keyans}[mini-env=0.5\linewidth, columns=1] + \item value + \item value + \item value + \item*[other note] correct + \item value + \miniright + \includegraphics[scale=0.15,alt={Una letra mayuscula B}]{example-image-b} + \end{keyans} +\item Question with image on left side: \anskey[item-star]{Mucak} +\end{enumext} + +Some text here +\section{printkeyans} +Some text here + +\printkeyans{mytest} + +\section{printkeyans*} +Some text here + +\printkeyans*{mytest} + +\section{foreachkeyans} +Some text here + +\foreachkeyans[sep={\par}]{mytest} + +Some text here +\end{document} +\end{filecontents*} +\IfFileExists{enumext-05.pdf}{}{\ShellEscape{arara enumext-05.tex}} +% \iffalse +%</example> +% \fi +% +% +% \iffalse +%<*example> +% \fi +\begin{filecontents*}[overwrite]{enumext-06.tex} +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer, draft: true } +% arara: lualatex: { branch: developer } +% arara: clean: { extensions: [ aux, log, out] } +% arara: move: { files: [ enumext-06-luamml-mathml.html ], target: 'enumext-06-mathml.html' } +\DocumentMetadata + { + lang=en-US, + pdfversion=2.0, + pdfstandard=ua-2, + testphase={phase-III,math,title,table,firstaid}, + %uncompress, + } +\documentclass{article} +\usepackage[top=2cm,bottom=2cm,left=3cm,right=3cm]{geometry} +\usepackage{unicode-math,graphicx,hyperref,enumext} +\hypersetup + { + colorlinks = true, + pdftitle = {Test tagged PDF for enumext package}, + } +\newlength{\descitemwd} +\NewDocumentCommand \labelbx { s +m } + {% + \SuspendTagging{\parbox}% + \IfBooleanTF{#1}% + {\strut\smash{\parbox[t]{\labelwidth}{\raggedright{#2}}}}% + {\strut\smash{\parbox[t]{\labelwidth}{\raggedleft{#2}}}}% + \ResumeTagging{\parbox} + } +\begin{document} + +\section{Fake \texttt{itemize} environment} + +\noindent\begin{minipage}[t]{0.45\linewidth} +\begin{enumext}[nosep, label=\textbullet] + \item First level item + \begin{enumext}[nosep,label=\normalfont\bfseries\textendash] + \item Second level item + \begin{enumext}[nosep,label=\textasteriskcentered] + \item Third level item + \begin{enumext}[nosep,label=\textperiodcentered] + \item Fourth level item + \end{enumext} + \end{enumext} + \end{enumext} + \item First level item +\end{enumext} +\end{minipage}\hfill +\begin{minipage}[t]{0.45\linewidth} +\begin{enumext}[nosep, label=$\ast$] + \item First level item + \begin{enumext}[nosep,label=$\diamond$] + \item Second level item + \begin{enumext}[nosep,label=$\circ$] + \item Third level item + \begin{enumext}[nosep,label=$\star$] + \item Fourth level item + \end{enumext} + \end{enumext} + \end{enumext} + \item First level item +\end{enumext} +\end{minipage} + +\section{Fake \texttt{description} environment} + +\settowidth{\descitemwd}{\textbf{Something long}} +\begin{enumext}[label={},labelwidth=\descitemwd,font=\bfseries,noitemsep,topsep=3pt] + \item[SomeThing] A short one-line description. + \item[] This is an entry \emph{without} a label. + \item[Something] A short \emph{one-line} description text. + \item[Something long] A much \emph{longer} description text may take + more than one line or more than one paragraph. + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +\end{enumext} + +\begin{enumext*}[label={},labelwidth=\descitemwd,font=\bfseries,noitemsep,topsep=3pt] + \item[SomeThing] A short one-line description. + \item[] This is an entry \emph{without} a label. + \item[Something] A short \emph{one-line} description text. + \item[Something long] A much \emph{longer} description text may take + more than one line or more than one paragraph. + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +\end{enumext*} + +\begin{enumext}[label={},labelwidth=\descitemwd,list-indent=0pt,font=\bfseries,noitemsep,topsep=3pt] + \item[SomeThing] A short one-line description. + \item[] This is an entry \emph{without} a label. + \item[Something] A short \emph{one-line} description text. + \item[Something long] A much \emph{longer} description text may take + more than one line or more than one paragraph. + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +\end{enumext} + +\begin{enumext*}[label={},labelwidth=\descitemwd,list-indent=0pt,font=\bfseries,noitemsep,topsep=3pt] + \item[SomeThing] A short one-line description. + \item[] This is an entry \emph{without} a label. + \item[Something] A short \emph{one-line} description text. + \item[Something long] A much \emph{longer} description text may take + more than one line or more than one paragraph. + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +\end{enumext*} + +\section{Fake \texttt{description} environment in margin} + +\begin{enumext}[align=right, label={},labelsep=4pt,labelwidth=\descitemwd,list-offset={-\descitemwd-4pt}, font=\bfseries,noitemsep,topsep=3pt] + \item[SomeThing] A short one-line description. + \item This is an entry \textit{without} a label. + \item[Something] A short one-line description. + \item[Something long] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. + Curabitur dictum gravida mauris. +\end{enumext} + +\begin{enumext*}[align=right, label={},labelsep=4pt,labelwidth=\descitemwd,list-offset={-\descitemwd-4pt}, font=\bfseries,noitemsep,topsep=3pt] + \item[SomeThing] A short one-line description. + \item This is an entry \textit{without} a label. + \item[Something] A short one-line description. + \item[Something long] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. + Curabitur dictum gravida mauris. +\end{enumext*} + +\section{Fake \texttt{description} with multi-line labels} + +\begin{enumext}[label={},labelsep=4pt,labelwidth=\descitemwd,list-offset=-\dimeval{\descitemwd+4pt}, wrap-label*={\labelbx{#1}}, font=\bfseries,noitemsep,topsep=3pt] + \item[SomeThing] A short one-line description. + \item This is an entry \textit{without} a label. + \item[Something] A short one-line description. + \item[Something \\ long] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. + Curabitur dictum gravida mauris. + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. + Curabitur dictum gravida mauris. + + \item[SoMeThInG \\ LoNg] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. + Curabitur dictum gravida mauris. + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. + Curabitur dictum gravida mauris. +\end{enumext} +\end{document} +\end{filecontents*} +\IfFileExists{enumext-06.pdf}{}{\ShellEscape{arara enumext-06.tex}} +% \iffalse +%</example> +% \fi +% +% \begin{itemize}[topsep=1pt,partopsep=0pt,parsep=1pt,itemsep=1pt] +% \item The file \myfile{enumext-01.tex} contains the basic tests for the +% \myenv*{enumext} and \myenv*{enumext*} environments and the nesting +% between them plus the use of the \mykey{label}, \mykey{labelwidth}, +% \mykey{labelsep}, \mykey{ref}, \mykey{align} and \mykey{wrap-label} keys. +% \IfFileExists{enumext-01.pdf}{Source file \textattachfile[color=red,print=false]{enumext-01.tex}{\faFile*[regular]} +% and \emph{tagged} \texttt{PDF} \textattachfile[color=red,print=false]{enumext-01.pdf}{\faFilePdf[regular]}}{}.% +% +% \item The file \myfile{enumext-02.tex} contains the tests for the \myenv*{enumext} +% and \myenv*{enumext*} environments and the support for \myenv{minipage} +% and \myenv{multicols} environments using the keys \mykey{columns}, +% \mykey{columns-sep}, \mykey{mini-env}, \mykey{mini-right} and +% |\miniright| command. \IfFileExists{enumext-02.pdf}{Source file \textattachfile[color=red,print=false]{enumext-02.tex}{\faFile*[regular]} +% and \emph{tagged} \texttt{PDF} \textattachfile[color=red,print=false]{enumext-02.pdf}{\faFilePdf[regular]}}{}.% +% +% \item The file \myfile{enumext-03.tex} contains the tests for the \myenv*{enumext} +% and \myenv*{keyanspic} environments activated by the \mykey{save-ans} +% key together with the \mykey{save-sep} and \mykey{save-ref} keys and +% the |\printkeyans| command. +% \IfFileExists{enumext-03.pdf}{Source file \textattachfile[color=red,print=false]{enumext-03.tex}{\faFile*[regular]} +% and \emph{tagged} \texttt{PDF} \textattachfile[color=red,print=false]{enumext-03.pdf}{\faFilePdf[regular]}}{}.% +% +% \item The file \myfile{enumext-04.tex} contains the tests for the |\anskey| +% command and the \myenv*{anskey*} environment activated by the +% \mykey{save-ans} key along with the |\getkeyans| and |\printkeyans| commands. +% \IfFileExists{enumext-04.pdf}{Source file \textattachfile[color=red,print=false]{enumext-04.tex}{\faFile*[regular]} +% and \emph{tagged} \texttt{PDF} \textattachfile[color=red,print=false]{enumext-04.pdf}{\faFilePdf[regular]}}{}.% +% +% \item The file \myfile{enumext-05.tex} contains the tests for the environments +% \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} activated by the key +% \mykey{save-ans} together with the keys \mykey{no-store} and \mykey{show-ans} +% and the commands |\setenumext|, |\setenumextmeta|, |\printkeyans| and |\foreachkeyans|. +% \IfFileExists{enumext-05.pdf}{Source file \textattachfile[color=red,print=false]{enumext-05.tex}{\faFile*[regular]} +% and \emph{tagged} \texttt{PDF} \textattachfile[color=red,print=false]{enumext-05.pdf}{\faFilePdf[regular]}}{}.% +% +% \item The file \myfile{enumext-06.tex} contains the tests for the environments +% \myenv*{enumext} and \myenv*{enumext*} for \emph{fake} \myenv{itemize} and \myenv{description}. +% \IfFileExists{enumext-06.pdf}{Source file \textattachfile[color=red,print=false]{enumext-06.tex}{\faFile*[regular]} +% and \emph{tagged} \texttt{PDF} \textattachfile[color=red,print=false]{enumext-06.pdf}{\faFilePdf[regular]}}{}.% +% \end{itemize} +% +% \section{The way of non-enumerated lists} +% +% It is possible to use (or abuse) the \myenv*{enumext} and \myenv*{enumext*} environments to +% mimic \emph{non-enumerated} list environments such as \myenv{itemize} and +% \myenv{description}, clearly the \mymeta{keys} to \emph{\enquote{store answers}}, +% the \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} environments lose their +% sense and it is not the focus of \mypkg*{enumext} package, but, why not +% to do it?. +% +% \smallskip +% +% Here I leave as an example other uses of the \myenv*{enumext} +% environment that can be helpful for specific purposes. The \emph{trick} +% to generate these \emph{\enquote{fake environments}} is set \mykey{label}|={}| +% or \mykey{label}|=|\mymarg{some} and play with the |list-indent|, |list-offset|, +% |font| and |wrap-label| keys. +% +% \subsection*{Fake \texttt{itemize} environment} +% +% Here we set the \mykey{label} key using the default settings in +% \hologo{LaTeX} for the four levels |\textbullet|, |\textendash|, |\textasteriskcentered| +% and |\textperiodcentered| together with the +% \mykey{nosep} key to reduce the vertical spaces in the left side example and set the +% \mykey{label} key in \emph{mathematical mode} for the right side as +% |\ast|, |\diamond|, |\circ| and |\star| for the four levels +% together with the \mykey{nosep} key +% +% \noindent\begin{minipage}[t]{0.45\linewidth} +% \begin{enumext}[nosep, label=\textbullet] +% \item First level item +% \begin{enumext}[nosep,label=\normalfont\bfseries\textendash] +% \item Second level item +% \begin{enumext}[nosep,label=\textasteriskcentered] +% \item Third level item +% \begin{enumext}[nosep,label=\textperiodcentered] +% \item Fourth level item +% \end{enumext} +% \end{enumext} +% \end{enumext} +% \item First level item +% \end{enumext} +% \end{minipage}\hfill +% \begin{minipage}[t]{0.45\linewidth} +% \begin{enumext}[nosep, label=$\ast$] +% \item First level item +% \begin{enumext}[nosep,label=$\diamond$] +% \item Second level item +% \begin{enumext}[nosep,label=$\circ$] +% \item Third level item +% \begin{enumext}[nosep,label=$\star$] +% \item Fourth level item +% \end{enumext} +% \end{enumext} +% \end{enumext} +% \item First level item +% \end{enumext} +% \end{minipage} +% +% \subsection*{Fake \texttt{description} environment} +% +% Here we set \mykey{label}|={}| and |list-indent=2.5em,font=\bfseries|. +% +% \begin{enumext}[label={},list-indent=2.5em,font=\bfseries,noitemsep,topsep=3pt] +% \item[SomeThing] A short one-line description. +% \item[] This is an entry \emph{without} a label. +% \item[Something] A short \emph{one-line} description text. +% \item[Something long] A much \emph{longer} description text may take +% more than one line or more than one paragraph. +% +% Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod +% tempor incididunt ut labore et dolore magna aliqua. +% \end{enumext} +% +% If we add |list-indent=0pt| you get \emph{widest style}: +% +% \begin{enumext}[label={},list-indent=0pt,font=\bfseries,noitemsep,topsep=3pt] +% \item[SomeThing] A short one-line description. +% \item[] This is an entry \emph{without} a label. +% \item[Something] A short \emph{one-line} description text. +% \item[Something long] A much \emph{longer} description text may take +% more than one line or more than one paragraph. +% +% Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod +% tempor incididunt ut labore et dolore magna aliqua. +% \end{enumext} +% +% \begin{important}* +% The small space at the beginning of the \emph{\enquote{unlabeled entry}} corresponds to +% |\labelsep| and can be removed using |\hspace{-\labelsep}| at the +% beginning of the line. +% \end{important} +% +% \smallskip +% +% \begin{important} +% When \emph{tagged} PDF is active the default \myenv{description} style +% is NOT available due to the redefinition of |\makelabel| for the +% \mykey{align} key which uses |\makebox| in this case, meaning that +% |\item|\myoarg{content} will not extend beyond |\labelwidth| which +% causes overlaps, +% \end{important} +% +% \subsection*{Description indented by label} +% +% Here we set \mykey{label}|={}| and we will give a convenient value to +% \mykey{labelsep} and \mykey{labelwidth}, for example we can take as reference our +% \emph{longest label} and pass it as value using: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=none] +\newlength{\descitemwd} +\settowidth{\descitemwd}{\textbf{Something long}} +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% and then use \mykey{labelsep}|=4pt,|\mykey{labelwidth}|=\descitemwd,font=\bfseries|. +% +% \newlength{\descitemwd} +% \settowidth{\descitemwd}{\textbf{Something long}} +% \begin{enumext}[label={},labelsep=4pt,labelwidth=\descitemwd,font=\bfseries,noitemsep,topsep=3pt] +% \item[SomeThing] A short one-line description. +% \item[] This is an entry \textit{without} a label. +% \item[Something] A short one-line description. +% \item[Something long] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +% Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. +% Curabitur dictum gravida mauris. +% \end{enumext} +% +% The environment can be translated so that the \mymeta{labels} are on +% the left margin calculating the value passed to the \mykey{list-offset} +% key, in this case it will be equal to the sum of the values set by the +% \mykey{labelwidth} and \mykey{labelsep} keys finally resulting as +% \mykey{list-offset}|={-\descitemwd - 4pt}|. +% +% \begin{enumext}[label={},labelsep=4pt,labelwidth=\descitemwd,list-offset={-\descitemwd-4pt}, font=\bfseries,noitemsep,topsep=3pt] +% \item[SomeThing] A short one-line description. +% \item This is an entry \textit{without} a label. +% \item[Something] A short one-line description. +% \item[Something long] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +% Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. +% Curabitur dictum gravida mauris. +% \end{enumext} +% +% If we add \mykey{align}|=right| it will look like this: +% +% \begin{enumext}[label={},align=right,labelsep=4pt,labelwidth=\descitemwd,list-offset={-\descitemwd - 4pt}, font=\bfseries,noitemsep,topsep=3pt] +% \item[SomeThing] A short one-line description. +% \item This is an entry \textit{without} a label. +% \item[Something] A short one-line description. +% \item[Something long] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +% Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. +% Curabitur dictum gravida mauris. +% \end{enumext} +% +% \begin{important}* +% At this point we have used \mykey{list-offset}|={-\descitemwd - 4pt}| instead of +% |list-offset={-\labelwidth - \labelsep}|, +% this is because the parameters |\labelwidth| and |\labelsep| take the +% default values, as if we had not set \mykey{label}. +% \end{important} +% +% \subsection*{Description with multi-line labels} +% +% The \mykey{label} key does not accept \emph{multiline material}, this +% is where the \mykey{wrap-label} and \mykey{wrap-label*} keys comes into +% play. Unlike the \mypkg{enumitem} package, the \mykey{align} key only +% supports three options, so what we will do is create a command in the +% style |\parleft| of \mypkg{enumitem} that allows us to place \emph{multiline labels} +% using |\parbox|. +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=none] +\NewDocumentCommand \labelbx { s +m } + {% + \SuspendTagging{\parbox}% + \IfBooleanTF{#1} + {\strut\smash{\parbox[t]{\labelwidth}{\raggedright{#2}}}}% + {\strut\smash{\parbox[t]{\labelwidth}{\raggedleft{#2}}}}% + \ResumeTagging{\parbox}% + } +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% Now we just need to set |wrap-label*={\labelbx{#1}}|.%^^A |mode-box| and +% +% \begin{enumext}[mode-box,label={},labelsep=4pt,labelwidth=\descitemwd,list-offset=-\dimeval{\descitemwd+4pt}, wrap-label*={\labelbx{#1}}, font=\bfseries,noitemsep,topsep=3pt] +% \item[SomeThing] A short one-line description. +% \item This is an entry \textit{without} a label. +% \item[Something] A short one-line description. +% \item[Something \\ long] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +% Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. +% Curabitur dictum gravida mauris. +% +% Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +% Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. +% Curabitur dictum gravida mauris. +% +% \item[SoMeThInG \\ LoNg] A much longer description. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. +% Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. +% Curabitur dictum gravida mauris. +% \end{enumext} +% +% \section*{Final notes} +% +% The original implementation (if you can call it that) of the ideas that +% led to the creation of \mypkg*{enumext} were some macros using the \mypkg{enumerate}\cite{enumerate} +% package for personal use created in early 2003, the code was quite +% questionable, but functional for these simple requirements. +% +% \medskip +% +% With the great answers given by Christian Hupfer in +% \href{https://tex.stackexchange.com/a/364763/7832}{Create a fake label ref +% using list} and the answer given by David Carlisle in +% \href{https://tex.stackexchange.com/a/363963/7832}{Change the use of label +% ref by data save in an array (list)} I managed to create a more solid +% code than the original version, now using the \mypkg{l3prop}\cite{inter3} and \mypkg{l3seq}\cite{inter3} +% modules together with the \mypkg{hyperref}\cite{hyperref} and \mypkg{enumitem}\cite{enumitem} packages, which did +% the job, but with some limitations. +% +% \smallskip +% +% As time went by I took these limitations as a personal challenge which +% I called \emph{\enquote{reinventing the wheel}}, since there were packages and classes +% that did more or less what I was looking for, but did not fit my simple +% requirements. This \emph{\enquote{reinventing the wheel}} finally ended up becoming +% \mypkg*{enumext}. +% +% \subsubsection*{Why list environments?} +% +% The answer is simple, first I love the beauty of its syntax and many of +% what I had already written used the \myenv{enumerate} environment or +% lists created using the \mypkg{enumitem} package. In my mind I thought: +% how complicated could it be to write a package that looked like +% \mypkg{enumitem}? It seemed simple enough, of course I didn't have in +% mind the mess I was getting into working with \myenv{list} +% environments, \myenv{minipage} and adding support for the +% \mypkg{multicol} and \mypkg{hyperref} packages. +% +% Of course, seeing the final result of the experiment +% \emph{\enquote{reinventing the wheel}} I am quite satisfied. +% +% \subsubsection*{Why not random questions and other utilities} +% +% The \emph{\enquote{random}} type questions I love and hate them at the +% same time, although they simplify a lot the work when creating a +% multiple choice test, but you lose the beauty of typessetting a +% document with \hologo{LaTeX}, that is to say the output does not always +% look as nice as it should, even if they are only alternatives these +% must follow a certain order when presented either numerical or +% presentation, that said handling that using \emph{nested lists} is quite +% complicated so I do not classify to be implemented. +% +% \subsubsection*{Why has it taken so long?} +% +% One of the setbacks, beyond my laziness, was including compatibility +% with \emph{tagged} \texttt{PDF}. To be honest, it's something I never +% considered at any point, but I firmly believe that being able to create +% \emph{accessible documents} provides a great opportunity in the world of +% mathematics education. From my perspective as a \emph{high school} teacher, +% beyond theorems and deep mathematics, the use of exercise lists is one +% of the most common things. Being able to open the way to work in +% parallel with those who have different abilities is really important +% and I regret not having looked into this in the past. I hope that +% \mypkg*{enumext} serves this purpose and inspires more users and +% authors to follow this path. +% +% \let\stdsection\section +% \def\section*#1{\stdsection{#1}} +% +% \begin{thebibliography}{10} +% +% \bibitem{exam} \textsc{Hirschhorn, Philip}. \enquote{Using the +% \textsf{exam} document class}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/exam}, 2023. +% +% \bibitem{xsim} \textsc{Niederberger, Clemens}. \enquote{\textsf{xsim} – eXercise +% Sheets IMproved}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/xsim}, 2023. +% +% \bibitem{multicol} \textsc{Mittelbach, Frank}. \enquote{An +% environment for \textsf{multicolumn} output}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/multicol}, 2024. +% +% \bibitem{scontents} \textsc{González, Pablo}. \enquote{\textsf{scontents} - Stores +% \hologo{LaTeX} contents in memory or files}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/scontents}, 2024. +% +% \bibitem{enumerate} The \hologo{LaTeX} Project. \enquote{\textsf{enumerate} – Enumerate +% with redefinable labels}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/enumerate}, 2024. +% +% \bibitem{enumitem} \textsc{Bezos, Javier}. \enquote{Customizing lists +% with the \textsf{enumitem} package}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/enumitem}, 2019 +% +% \bibitem{latexref} \textsc{Berry, Karl}. \enquote{\hologo{LaTeX2e}: An +% Unofficial Reference Manual}. Available from \textsc{ctan}, +% \url{https://ctan.org/pkg/latex2e-help-texinfo}, 2024. +% +% \bibitem{hyperref} The \hologo{LaTeX} Project. \enquote{Extensive support +% for hypertext in \hologo{LaTeX}}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/hyperref}, 2024. +% +% \bibitem{footnotehyper} \textsc{Burnol, Jean-François}. \enquote{The \textsf{footnotehyper} +% package}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/footnotehyper}, 2021. +% +% \bibitem{expl3} The \hologo{LaTeX} Project. \enquote{The \textsf{expl3} +% package}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/l3kernel}, 2024. +% +% \bibitem{inter3} The \hologo{LaTeX} Project. \enquote{The \hologo{LaTeX}3 +% Interfaces}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/l3kernel}, 2024. +% +% \bibitem{latex2e} The \hologo{LaTeX} Project. \enquote{The \hologo{LaTeX2e} +% sources}. Available from +% \textsc{ctan}, \url{https://ctan.org/tex-archive/macros/latex/base}, 2024. +% +% \bibitem{userguide} The \hologo{LaTeX} Project. \enquote{\hologo{LaTeX} for authors +% current version}. Available from +% \textsc{ctan}, \url{https://ctan.org/pkg/latex-base}, 2024. +% +% \bibitem{luavisual} \textsc{Gundlach, Patrick}. \enquote{The \textsf{lua-visual-debug} +% package}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/lua-visual-debug}, 2023. +% +% \bibitem{shortlst} \textsc{Lemvig, Mogens}. \enquote{The \textsf{shortlst} +% package}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/shortlst}, 1998. +% +% \bibitem{tasks} \textsc{Niederberger, Clemens}. \enquote{\textsf{tasks} – Horizontally +% columned lists}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/tasks}, 2022. +% +% \bibitem{tagpdf} \textsc{Fischer, Ulrike}. \enquote{\textsf{tagpdf} – \hologo{LaTeX} +% kernel code for PDF tagging}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/tagpdf}, 2024. +% +% \bibitem{latexlab} The \hologo{LaTeX} Project. \enquote{\textsf{latex-lab} – \hologo{LaTeX} +% laboratory}. Available from +% \textsc{ctan}, \url{https://www.ctan.org/pkg/latex-lab}, 2024. +% +% \bibitem{ltsockets} \textsc{Mittelbach, Frank}. \enquote{\hologo{LaTeX}’s +% socket management}. Available from +% \textsc{ctan}, \url{https://ctan.org/tex-archive/macros/latex/base}, 2024. +% +% \end{thebibliography} +% +% \let\section\stdsection +% +% \section{Change history} +% \label{sec:changes} +% +% \setlist[itemize,1]{label=\textendash,wide=0.5em,nosep,noitemsep,leftmargin=10pt} +% \newlength\descrwidth +% \settowidth{\descrwidth}{\textsf{v1.0a, --- 2023-08-18} } +% +% \begin{description}[font=\small\sffamily,wide=0pt,style=multiline,leftmargin=1.1\descrwidth,nosep,noitemsep] +% \item [\fileversion{} \, \filedate] +% \begin{itemize} +% \item First public release. +% \end{itemize} +% \end{description} +% +% \newpage +% +% \indexprologue{ +% The italic numbers denote the pages where the corresponding entry is +% described.} +% +% \printindex[userdoc] +% +% \newpage +% +% \StartImplementation +% +% \StopEventually{^^A +% \newgeometry{top=0.5in,bottom=0.3in,left=1.0in,right=0.5in,footskip=0.2in,headheight=1cm,headsep=0.27cm} +% \addtocontents{toc}{\protect\setcounter{tocdepth}{2}} +% \cleardoublepage +% \phantomsection +% \indexprologue{ +% The italic numbers denote the pages where the corresponding entry is +% described, the numbers underlined and all others indicate the line on +% which they are implemented in the package code. +% } +% \printindex +% } +% +% \newgeometry{top=0.5in,bottom=0.3in,left=1.95in,right=0.5in,footskip=0.2in,headheight=1cm,headsep=0.27cm} +% +% \section{Implementation} +% \label{sec:Implementation} +% \addtocontents{toc}{\protect\setcounter{tocdepth}{0}} +% +% The most recent publicly released version of \mypkg*{enumext} is +% available at \textsc{ctan}: \url{https://www.ctan.org/pkg/enumext}. +% While general feedback via email is welcomed, specific bugs or +% feature requests should be reported through the issue +% tracker: \textcolor{gray}{\scriptsize\faIcon[regular]{github}} \url{https://github.com/pablgonz/enumext/issues}. +% +% \smallskip +% +% \begin{important}* +% The documentation presented here is far from professional, it contains +% a lot of obvious information that to the eye of a \hologo{TeX}pert are +% superfluous, but, after so many years developing this project is the +% only way to remember what does what. +% \end{important} +% +% \subsection{General conventions} +% +% Variables containing \lstinline+i+, \lstinline+ii+, \lstinline+iii+ and +% \lstinline+iv+ are associated by level with the \myenv*{enumext} +% environment, variables containing \lstinline+v+ are associated with the +% \myenv*{keyans} environment, variables containing \lstinline+vi+ are +% associated with the \myenv*{keyanspic} environment, variables +% containing \lstinline+vii+ are associated with the \myenv*{enumext*} +% environment and variables containing \lstinline+viii+ are associated +% with the \myenv*{keyans*} environment. +% +% \medskip +% +% To simplify writing and documentation some variables and functions that +% are common to the different levels of the environments are described +% using a capital \enquote{\texttt{\textcolor{optcolor}{X}}}. +% +% \medskip +% +% The temporary function \myvarenv{__@@_tmp:n} is used in +% different parts of the package code for variable creation or execution +% of other functions that are grouped into this one. +% +% \medskip +% +% All variables and functions defined in this package are private and +% are NOT intended to work or be used by another package or module. +% +% \subsection{Initial set up} +% +% Start the \pkg{DocStrip} guards. +% \begin{macrocode} +%<*package> +% \end{macrocode} +% Identify the internal prefix (\LaTeX3 \pkg{DocStrip} convention) for +% \pkg{l3doc} class. +% \begin{macrocode} +%<@@=enumext> +% \end{macrocode} +% +% \subsection{Declaration of the package} +% +% First we will make sure we have a minimum (super updated) version of +% \hologo{LaTeX} to work correctly. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[2024-11-01] +% \end{macrocode} +% Now declare the \mypkg*{enumext} package. +% \begin{macrocode} +\ProvidesExplPackage {enumext} {2024-11-01} {1.0} {Enumerate exercise sheets} +% \end{macrocode} +% Finally check if the \mypkg{multicol} and \mypkg{scontents} packages +% are loaded, if not we load it. +% \begin{macrocode} +\hook_gput_code:nnn {begindocument} {enumext} + { + \IfPackageLoadedTF { multicol } + { + \msg_info:nnn { enumext } { package-load } { multicol } + } + { + \msg_info:nnn { enumext } { package-not-load } { multicol } + \RequirePackage{multicol}[2024-05-23] + } + \IfPackageLoadedTF { scontents } + { + \msg_info:nnn { enumext } { package-load } { scontents } + } + { + \msg_info:nnn { enumext } { package-not-load } { scontents } + \RequirePackage{scontents} + } + } +% \end{macrocode} +% +% \subsection{Definition of variables} +% +% Variables that do not appear in this section are created by means of +% \cs[no-index]{keys_define:nn} or some function described below. +% +% \begin{variable}[int]{\l_@@_level_int, \l_@@_level_h_int, \l_@@_anskey_level_int, +% \l_@@_keyans_level_int, \l_@@_keyans_level_h_int, +% \l_@@_keyans_pic_level_int,} +% Integer variables will control the nesting levels of the environments +% and |\anskey| command. +% \iffalse +%% Variable for levels and nesting off all environments and \anskey. +% \fi +% \begin{macrocode} +\int_new:N \l_@@_level_int +\int_new:N \l_@@_level_h_int +\int_new:N \l_@@_anskey_level_int +\int_new:N \l_@@_keyans_level_int +\int_new:N \l_@@_keyans_level_h_int +\int_new:N \l_@@_keyans_pic_level_int +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_starred_bool, \g_@@_starred_bool, \l_@@_starred_first_bool, +% \l_@@_standar_bool, \g_@@_standar_bool, \l_@@_standar_first_bool, +% \l_@@_anskey_env_bool, \l_@@_keyans_env_bool,\g_@@_start_line_tl, +% \g_@@_envir_name_tl, \l_@@_envir_name_tl} +% Internal variables used by functions \cs{@@_is_not_nested:}, +% \cs{@@_is_on_first_level:} and \cs{@@_keyans_name_and_start:} (\S\ref{fun:utilities}). +% \iffalse +%% Internal vars for levels and nesting off all environments. +% \fi +% \begin{macrocode} +\bool_new:N \l_@@_starred_bool +\bool_new:N \g_@@_starred_bool +\bool_new:N \l_@@_starred_first_bool +\bool_new:N \l_@@_standar_bool +\bool_new:N \g_@@_standar_bool +\bool_new:N \l_@@_standar_first_bool +\bool_new:N \l_@@_anskey_env_bool +\bool_new:N \l_@@_keyans_env_bool +\tl_new:N \g_@@_start_line_tl +\tl_new:N \g_@@_envir_name_tl +\tl_new:N \l_@@_envir_name_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_counter_i_tl, \l_@@_counter_ii_tl, +% \l_@@_counter_iii_tl, \l_@@_counter_iv_tl, +% \l_@@_counter_v_tl,\l_@@_counter_vi_tl, +% \l_@@_counter_vii_tl,\l_@@_counter_viii_tl} +% +% Variables to store the \emph{\enquote{name of the counters}} +% \icounter{enumXi}, \icounter{enumXii}, \icounter{enumXiii} and +% \icounter{enumXiv} for \myenv*{enumext} environment, +% \icounter{enumXv} for \myenv*{keyans} environment and +% \icounter{enumXvi} for the \myenv*{keyanspic} environment. +% The counters \icounter{enumXvii} and \icounter{enumXviii} are used +% by \myenv*{enumext*} and \myenv*{keyans*} environments. +% +% \smallskip +% +% The initial values of these variables are set by the function +% \cs{@@_define_counters:Nn} (\S\ref{int:counters}) and then modified by the function +% \cs{@@_label_style:Nnn} used by \mykey{label} key (\S\ref{key:label-ref}). +% \iffalse +%% Variable for counters +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \tl_new:c { l_@@_counter_#1_tl } + } +\clist_map_inline:nn { i, ii, iii, iv, v, vi, vii, viii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\c_@@_counter_style_tl, \l_@@_ref_key_arg_tl, +% \l_@@_ref_the_count_tl, \l_@@_the_counter_X_tl, +% \l_@@_renew_the_count_X_tl, } +% Internal variables used by \mykey{ref} key (\S\ref{key:label-ref}). +% \iffalse +%% Variables used by |ref| key. +% \fi +% \begin{macrocode} +\tl_const:Nn \c_@@_counter_style_tl + { { arabic } { roman } { Roman } { alph } { Alph } } +\tl_new:N \l_@@_ref_key_arg_tl +\tl_new:N \l_@@_ref_the_count_tl +\cs_set_protected:Npn \@@_tmp:n #1 + { + \tl_new:c { l_@@_renew_the_count_#1_tl } + \tl_new:c { l_@@_the_counter_#1_tl } + \tl_set:ce { l_@@_the_counter_#1_tl } { \exp_not:c { theenumX#1 } } + } +\clist_map_inline:nn { i, ii, iii, iv, v, vi, vii, viii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_resume_int, \g_@@_resume_vii_int, \l_@@_resume_name_tl, +% \l_@@_resume_active_bool, \g_@@_starred_series_tl, +% \g_@@_standar_series_tl,} +% +% Internal variables used by \mykey{resume}, \mykey{resume*} and +% \mykey{series} keys (\S\ref{key:series}). +% \iffalse +%% Variables used by |series|, |resume| and |resume*| keys implementation. +% \fi +% \begin{macrocode} +\int_new:N \g_@@_resume_int +\int_new:N \g_@@_resume_vii_int +\tl_new:N \l_@@_resume_name_tl +\bool_new:N \l_@@_resume_active_bool +\tl_new:N \g_@@_standar_series_tl +\tl_new:N \g_@@_starred_series_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_current_widest_dim, \g_@@_counter_styles_tl, +% \g_@@_widest_label_tl, \l_@@_label_width_by_box} +% The variable \cs{l_@@_current_widest_dim} stores the current +% label width, the variable \cs{g_@@_counter_styles_tl} stores +% the default \mymeta{label style} and the variable +% \cs{g_@@_widest_label_tl} the label width. These variables are +% used by \mykey{widest} (\S\ref{key:start-widest}) and \mykey{label} (\S\ref{key:label}) keys. +% \iffalse +%% Variables used by |label|, |ref| and |widest| keys. +% \fi +% \begin{macrocode} +\dim_new:N \l_@@_current_widest_dim +\tl_new:N \g_@@_counter_styles_tl +\tl_new:N \g_@@_widest_label_tl +\box_new:N \l_@@_label_width_by_box +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_leftmargin_tmp_X_bool, \l_@@_leftmargin_tmp_X_dim, +% \l_@@_leftmargin_X_dim, \l_@@_itemindent_X_dim,} +% The boolean variable \myvarenv{l__@@_leftmargin_tmp_X_bool} and the +% dimensional variable \myvarenv{l__@@_leftmargin_tmp_X_dim} +% are used by the \mykey{list-indent} key (\S\ref{key:list-indent}). +% The variables \myvarenv{l__@@_leftmargin_X_dim} and +% \myvarenv{l__@@_itemindent_X_dim} are used and set by the function +% \myvarenv{__@@_calc_hspace:NNNNNNNNNNNN} (\S\ref{int:leftmargin}). +% \iffalse +%% Add \l__enumext_leftmargin_tmp_X_bool, \l__enumext_leftmargin_tmp_X_dim, +%% \l__enumext_leftmargin_X_dim, \l__enumext_itemindent_X_dim used by the +%% function \enumext_calc_hspace:NNNNNNNNNNNN and |list-indent| key. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \bool_new:c { l_@@_leftmargin_tmp_#1_bool } + \dim_new:c { l_@@_leftmargin_tmp_#1_dim } + \dim_new:c { l_@@_leftmargin_#1_dim } + \dim_new:c { l_@@_itemindent_#1_dim } + } +\clist_map_inline:nn { i, ii, iii, iv, v, vi, vii, viii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{ \l_@@_multicols_above_X_skip, \l_@@_multicols_below_X_skip, +% \g_@@_multicols_right_X_skip, \l_@@_align_label_pos_X_str,} +% Internal variables used by \mykey{columns} key (\S\ref{vspace:multi}) +% and \mykey{align} key (\S\ref{key:label}). +% \iffalse +%% Variables used by |columns| and |align| keys in |enumext| and |keyans| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \skip_new:c { l_@@_multicols_above_#1_skip } + \skip_new:c { l_@@_multicols_below_#1_skip } + \skip_new:c { g_@@_multicols_right_#1_skip } + \str_new:c { l_@@_align_label_pos_#1_str } + } +\clist_map_inline:nn { i, ii, iii, iv, v } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\g_@@_minipage_stat_int, \l_@@_minipage_temp_skip, +% \l_@@_minipage_left_skip, \l_@@_minipage_right_skip, +% \l_@@_minipage_after_skip, \g_@@_minipage_right_skip, +% \g_@@_minipage_after_skip, \l_@@_minipage_left_X_dim, +% \l_@@_minipage_active_X_bool,} +% Internal variables used by \ics*{miniright} command (\S\ref{cmd:miniright}) +% and the keys \mykey{mini-right}, \mykey{mini-right*}, \mykey{mini-env} +% and \mykey{mini-sep} (\S\ref{key:mini-multi}, \S\ref{vspace:minipage}). +% \iffalse +%% Variables used by |miniright|, |mini-env|, |mini-sep| and |\miniright|. +% \fi +% \begin{macrocode} +\int_new:N \g_@@_minipage_stat_int +\skip_new:N \l_@@_minipage_temp_skip +\skip_new:N \l_@@_minipage_left_skip +\skip_new:N \l_@@_minipage_right_skip +\skip_new:N \l_@@_minipage_after_skip +\skip_new:N \g_@@_minipage_right_skip +\skip_new:N \g_@@_minipage_after_skip +\cs_set_protected:Npn \@@_tmp:n #1 + { + \dim_new:c { l_@@_minipage_left_#1_dim } + \bool_new:c { l_@@_minipage_active_#1_bool } + } +\clist_map_inline:nn { i, ii, iii, iv, v, vii, viii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_wrap_label_X_bool, \l_@@_wrap_label_opt_X_bool, +% \l_@@_start_X_int, \l_@@_fake_item_indent_X_tl, \l_@@_label_fill_left_X_tl, +% \l_@@_label_fill_right_X_tl, \l_@@_vspace_a_star_X_bool, +% \l_@@_vspace_b_star_X_bool,} +% The bool vars \myvarenv{l__@@_wrap_label_X_bool} and +% \myvarenv{l__@@_wrap_label_opt_X_bool} are used by \mykey{wrap-label} +% and \mykey{wrap-label*} keys (\S\ref{key:label}), the integer +% \myvarenv{l__@@_start_X_int} are used by the \mykey{start} and \mykey{start*} keys (\S\ref{key:start-widest}), +% the token list \myvarenv{l__@@_fake_item_indent_X_tl } is used by \mykey{itemindent} key (\S\ref{key:fake-indent}), +% the variables \myvarenv{l__@@_label_fill_left_X_tl} and \myvarenv{l__@@_label_fill_left_X_tl} are used by the +% \mykey{align} key (\S\ref{key:label}). The boolean vars \myvarenv{l__@@_vspace_a_star_X_bool}, +% \myvarenv{l__@@_vspace_b_star_X_bool} are used by \mykey{above}, +% \mykey{above*}, \mykey{below} and \mykey{below*} keys (\S\ref{key:before}). +% \iffalse +%% Internal variables used by |wrap-label|, |start*|, |start|, |align|, |above| and |below| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \bool_new:c { l_@@_wrap_label_#1_bool } + \bool_new:c { l_@@_wrap_label_opt_#1_bool } + \int_new:c { l_@@_start_#1_int } + \tl_new:c { l_@@_fake_item_indent_#1_tl } + \tl_new:c { l_@@_label_fill_left_#1_tl } + \tl_new:c { l_@@_label_fill_right_#1_tl } + \bool_new:c { l_@@_vspace_a_star_#1_bool } + \bool_new:c { l_@@_vspace_b_star_#1_bool } + } +\clist_map_inline:nn { i, ii, iii, iv, v, vii, viii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_store_active_bool, \l_@@_store_name_tl, +% \g_@@_store_name_tl, \l_@@_store_anskey_arg_tl, +% \l_@@_store_anskey_env_tl, \l_@@_store_anskey_opt_tl, +% \l_@@_store_current_label_tl, \l_@@_store_current_opt_arg_tl, +% \l_@@_store_current_label_tmp_tl,} +% +% The variable \cs{l_@@_store_active_bool} setting by +% \mykey{save-ans} key (\S\ref{key:save-ans}) activates all the +% mechanism related to \ics*{anskey}, \myenv*{anskey*}, \myenv*{keyans}, +% \myenv*{keyans*} and \myenv*{keyanspic} environments. +% +% \smallskip +% +% The variable \cs{l_@@_store_name_tl} saves the \mymarg{store name} +% set by the \mykey{save-ans} key of the \emph{sequence} and \emph{prop +% list} in which we will store, the variable \cs{g_@@_store_name_tl} +% it's just a global copy of \mymarg{store name} used by different functions. +% +% \smallskip +% +% The variable \cs{l_@@_store_anskey_arg_tl} save the +% \emph{argument} of \ics*{anskey} (\S\ref{cmd:anskey}) and the variables +% \cs{l_@@_store_anskey_env_tl} and \cs{l_@@_store_anskey_opt_tl} save the +% \mymeta{body} and the \mymeta{keys} of the environment \myenv*{anskey*} (\S\ref{env:anskey}). +% +% \smallskip +% +% The variables \cs{l_@@_store_current_label_tl} and +% \cs{l_@@_store_current_opt_arg_tl} save the \emph{current label} and +% \emph{optional argument} of \ics*{item*} (\S\ref{cmd:item-starred}) and \ics*{anspic*} +% (\S\ref{cmd:anspic}) for the \myenv*{keyans}, \myenv*{keyans*} and +% \myenv*{keyanspic} environments. +% +% \smallskip +% +% The variable \cs{l_@@_store_current_label_tmp_tl} is a temporary variable used +% by \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} at various points. +% \iffalse +%% Variables used by |save-ans| key. +% \fi +% \begin{macrocode} +\bool_new:N \l_@@_store_active_bool +\tl_new:N \l_@@_store_name_tl +\tl_new:N \g_@@_store_name_tl +\tl_new:N \l_@@_store_anskey_arg_tl +\tl_new:N \l_@@_store_anskey_env_tl +\tl_new:N \l_@@_store_anskey_opt_tl +\tl_new:N \l_@@_store_current_label_tl +\tl_new:N \l_@@_store_current_opt_arg_tl +\tl_new:N \l_@@_store_current_label_tmp_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_setkey_tmpa_tl, \l_@@_setkey_tmpb_tl, +% \l_@@_setkey_tmpa_int, \l_@@_setkey_tmpa_seq, +% \l_@@_setkey_tmpb_seq,} +% Internal variables used by the command \ics*{setenumext} (\S\ref{cmd:setenumext}). +% \iffalse +%% Variables used by |\setenumext|. +% \fi +% \begin{macrocode} +\tl_new:N \l_@@_setkey_tmpa_tl +\tl_new:N \l_@@_setkey_tmpb_tl +\int_new:N \l_@@_setkey_tmpa_int +\seq_new:N \l_@@_setkey_tmpa_seq +\seq_new:N \l_@@_setkey_tmpb_seq +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_meta_path_tl, \l_@@_foreach_print_seq, +% \l_@@_foreach_name_prop_tl, \g_@@_foreach_default_keys_tl,} +% Internal variables used by the |\printkeyans| command (\S\ref{cmd:printkeyans}) +% and |\foreachkeyans| command (\S\ref{cmd:foreachkeyans}). +% \begin{macrocode} +\tl_new:N \l_@@_meta_path_tl +\seq_new:N \l_@@_foreach_print_seq +\tl_new:N \l_@@_foreach_name_prop_tl +\tl_new:N \g_@@_foreach_default_keys_tl +% \end{macrocode} +% \end{variable} +% +% +% \begin{variable}[int]{\l_@@_print_keyans_starred_tl, \l_@@_print_keyans_star_bool, +% \l_@@_mark_position_str, \g_@@_item_symbol_aux_tl, +% \l_@@_print_keyans_X_tl, \l_@@_store_save_key_X_tl, +% \l_@@_store_save_key_X_bool, \l_@@_store_upper_level_X_bool,} +% Internal variables used by command \ics*{printkeyans} +% (\S\ref{cmd:printkeyans}), \mykey{show-pos} key (\S\ref{int:storage-system}), +% \mykey{item-sym*} key (\S\ref{key:item-starred}), \mykey{save-key} key +% (\S\ref{key:save-key}) and \emph{\enquote{storing structure}}. +% \iffalse +%% Variables used by |\printkeyans|, |mark-pos|, |item-sym*|, |save-key| and storing structure in |enumext| and |enumext*|. +% \fi +% \begin{macrocode} +\tl_new:N \l_@@_print_keyans_starred_tl +\bool_new:N \l_@@_print_keyans_star_bool +\str_new:N \l_@@_mark_position_str +\tl_new:N \g_@@_item_symbol_aux_tl +\cs_set_protected:Npn \@@_tmp:n #1 + { + \tl_new:c { l_@@_print_keyans_#1_tl } + \tl_new:c { l_@@_store_save_key_#1_tl } + \bool_new:c { l_@@_store_save_key_#1_bool } + \bool_new:c { l_@@_store_upper_level_#1_bool } + } +\clist_map_inline:nn { i, ii, iii, iv, vii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_anspic_args_seq, \l_@@_anspic_mini_width_dim, +% \l_@@_anspic_above_int,\l_@@_anspic_below_int, +% \l_@@_anspic_label_above_bool, \l_@@_anspic_mini_pos_str, +% \g_@@_keyans_pic_parsep_skip, \l_@@_anspic_label_box, \l_@@_anspic_body_box, +% \l_@@_anspic_label_htdp_dim, \l_@@_anspic_body_htdp_dim,} +% Internal variables used by \myenv*{keyanspic} environment and +% \ics*{anspic} command (\S\ref{env:keyanspic}). +% \iffalse +%% Variables used by |\anspic| and |keyanspic|. +% \fi +% \begin{macrocode} +\seq_new:N \l_@@_anspic_args_seq +\dim_new:N \l_@@_anspic_mini_width_dim +\int_new:N \l_@@_anspic_above_int +\int_new:N \l_@@_anspic_below_int +\bool_new:N \l_@@_anspic_label_above_bool +\str_new:N \l_@@_anspic_mini_pos_str +\skip_new:N \g_@@_keyans_pic_parsep_skip +\box_new:N \l_@@_anspic_label_box +\box_new:N \l_@@_anspic_body_box +\dim_new:N \l_@@_anspic_label_htdp_dim +\dim_new:N \l_@@_anspic_body_htdp_dim +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_check_answers_bool,\g_@@_check_ans_key_bool, +% \l_@@_check_start_line_env_tl, \g_@@_check_starred_cmd_int, +% \g_@@_item_anskey_int, \g_@@_item_number_int, +% \g_@@_item_number_bool, \g_@@_item_answer_diff_int,} +% Internal variables used by \emph{\enquote{internal check answer}} mechanism +% (\S\ref{int:check-answer}) used by the \mykey{check-ans} and +% \mykey{no-store} keys and check for starred commands \ics*{item*} +% in \myenv*{keyans} and \myenv*{keyans*} environments and \ics*{anspic*} +% in \myenv*{keyanspic} environment. +% \iffalse +%% Variables used by check-answer mechanism, |check-ans| and |no-store| keys. +% \fi +% \begin{macrocode} +\bool_new:N \l_@@_check_answers_bool +\bool_new:N \g_@@_check_ans_key_bool +\tl_new:N \l_@@_check_start_line_env_tl +\int_new:N \g_@@_check_starred_cmd_int +\int_new:N \g_@@_item_anskey_int +\int_new:N \g_@@_item_number_int +\bool_new:N \l_@@_item_number_bool +\int_new:N \g_@@_item_answer_diff_int +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_hyperref_bool, \l_@@_footnotes_key_bool,} +% The boolean variable \cs{l_@@_hyperref_bool} will determine if the +% \mypkg{hyperref} package is present or load in memory +% (\S\ref{pkg:hyperref}). The boolean variable \cs{l_@@_footnotes_key_bool} +% determine if \mypkg{hyperref} is load with key |hyperfootnotes=true|. +% +% \iffalse +%% Variables used for hyperref detection. +% \fi +% \begin{macrocode} +\bool_new:N \l_@@_hyperref_bool +\bool_new:N \l_@@_footnotes_key_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{ \l_@@_newlabel_arg_one_tl, \l_@@_newlabel_arg_two_tl, +% \l_@@_write_aux_file_tl, \l_@@_label_copy_X_tl, } +% +% Internal variables used by \mykey{save-ref} key (\S\ref{int:storage-system}). +% The variables \myvarenv{l__@@_label_copy_X_tl} correspond to temporary +% copies of the \mymeta{labels} defined by level on which operations will be performed. +% +% \smallskip +% +% The variables \cs{l_@@_newlabel_arg_one_tl} and \cs{l_@@_newlabel_arg_two_tl} +% will be used to form the arguments passed to the function +% \cs{@@_newlabel:nn} (\S\ref{fun:newlabel}) and the variable \cs{l_@@_write_aux_file_tl} +% will be in charge of executing the writing code in the |.aux| file. +% \iffalse +%% Variables used by |save-ref| key (internal label and ref). +% \fi +% \begin{macrocode} +\tl_new:N \l_@@_newlabel_arg_one_tl +\tl_new:N \l_@@_newlabel_arg_two_tl +\tl_new:N \l_@@_write_aux_file_tl +\cs_set_protected:Npn \@@_tmp:n #1 + { + \tl_new:c { l_@@_label_copy_#1_tl } + } +\clist_map_inline:nn { i, ii, iii, iv, v, vi, vii, viii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{ \g_@@_footnote_standar_int, \g_@@_footnote_starred_int, +% \g_@@_footnote_standar_arg_seq, \g_@@_footnote_starred_arg_seq, +% \g_@@_footnote_standar_int_seq, \g_@@_footnote_starred_int_seq} +% Internal variables used for redefinition of |\footnote| (\S\ref{ltx:footnote}). +% \iffalse +%% Variables used by |footnote| redefinition. +% \fi +% \begin{macrocode} +\int_new:N \g_@@_footnote_standar_int +\int_new:N \g_@@_footnote_starred_int +\seq_new:N \g_@@_footnote_standar_arg_seq +\seq_new:N \g_@@_footnote_starred_arg_seq +\seq_new:N \g_@@_footnote_standar_int_seq +\seq_new:N \g_@@_footnote_starred_int_seq +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_item_starred_X_bool, l_@@_item_column_pos_X_int, +% \g_@@_item_count_all_X_int, \l_@@_joined_item_X_int, +% \l_@@_joined_item_aux_X_int, \l_@@_tmpa_X_int, \l_@@_tmpa_X_dim, +% \l_@@_item_text_X_box, \l_@@_joined_width_X_dim, +% \l_@@_item_width_X_dim, \g_@@_item_symbol_aux_X_tl, +% \l_@@_align_label_X_str, \g_@@_minipage_active_X_bool, +% \l_@@_miniright_code_X_box , \g_@@_minipage_center_X_bool, +% \g_@@_minipage_right_X_dim, \g_@@_minipage_right_X_skip,} +% Internal variables used by \myenv*{enumext*} and \myenv*{keyans*} environments. +% \iffalse +%% Variables used by |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \bool_new:c { l_@@_item_starred_#1_bool } + \int_new:c { l_@@_item_column_pos_#1_int } + \int_new:c { g_@@_item_count_all_#1_int } + \int_new:c { l_@@_joined_item_#1_int } + \int_new:c { l_@@_joined_item_aux_#1_int } + \int_new:c { l_@@_tmpa_#1_int } + \dim_new:c { l_@@_tmpa_#1_dim } + \box_new:c { l_@@_item_text_#1_box } + \dim_new:c { l_@@_joined_width_#1_dim } + \dim_new:c { l_@@_item_width_#1_dim } + \tl_new:c { g_@@_item_symbol_aux_#1_tl } + \str_new:c { l_@@_align_label_#1_str } + \bool_new:c { g_@@_minipage_active_#1_bool } + \box_new:c { l_@@_miniright_code_#1_box } + \bool_new:c { g_@@_minipage_center_#1_bool } + \dim_new:c { g_@@_minipage_right_#1_dim } + \skip_new:c { g_@@_minipage_right_#1_skip } + } +\clist_map_inline:nn { vii, viii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\c_@@_all_envs_clist,} +% An internal |clist-var| variable to run with \myvarenv{__@@_tmp:n}. +% \begin{macrocode} +\clist_const:Nn \c_@@_all_envs_clist + { + {level-1}{i}, {level-2}{ii}, {level-3}{iii}, {level-4}{iv}, + {keyans}{v}, {enumext*}{vii}, {keyans*}{viii} + } +% \end{macrocode} +% \end{variable} +% +% \subsection{Some utility functions} +% +% \begin{macro}[int]{\keys_precompile:neN, \seq_use:NV,} +% Non-standard kernel variants used by the |\printkeyans| command +% (\S\ref{cmd:printkeyans}) and |\foreachkeyans| command (\S\ref{cmd:foreachkeyans}). +% \begin{macrocode} +\cs_generate_variant:Nn \keys_precompile:nnN { neN } +\cs_generate_variant:Nn \seq_use:Nn { NV } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_at_begin_document:n} +% A internal \emph{\enquote{hook}} function used for copying plain +% \myenv{list} and \myenv{minipage} environments definition and +% \mypkg{hyperref} detection. +% \iffalse +%% A internal "hooks" functions used for copying and execute code. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_at_begin_document:n #1 + { + \hook_gput_code:nnn {begindocument} {enumext} { #1 } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_after_env:nn, \@@_before_env:nn} +% A internal \emph{\enquote{hook}} functions for execute code \mykey{mini-right} +% and \mykey{mini-right*} keys outside the \myenv*{enumext*} and +% \myenv*{keyans*} environments and print \mykey{check-ans} outside the +% \myenv*{enumext} and \myenv*{enumext*} environments. +% \begin{macrocode} +\cs_new_protected:Npn \@@_after_env:nn #1 #2 + { + \hook_gput_code:nnn {env/#1/after} {enumext} {#2} + } +\cs_new_protected:Npn \@@_before_env:nn #1 #2 + { + \hook_gput_code:nnn {env/#1/before} {enumext} {#2} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_level:} +% Function for check current level in \myenv*{enumext}. +% \iffalse +%% Function to check current level. +% \fi +% \begin{macrocode} +\cs_new:Nn \@@_level: + { + \int_to_roman:n { \l_@@_level_int } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_if_is_int:nT, \@@_if_is_int:nF, \@@_if_is_int:nTF} +% A conditional function to know if the variable we are passing is +% an integer used by \mykey{start} and \mykey{widest} keys. +% This function is taken directly from the answer given by Henri Menke +% in \href{https://tex.stackexchange.com/a/427559}{How to test if an expl3 function argument is an integer expression?}. +% \iffalse +%% Function to check integer variables used by |start| and |widest| keys. +% \fi +% \begin{macrocode} +\prg_new_protected_conditional:Npnn \@@_if_is_int:n #1 { T, F, TF } + { + \regex_match:nnTF { ^[\+\-]?[\d]+$ } {#1} % $ + { \prg_return_true: } + { \prg_return_false: } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_regex_counter_style:} +% The internal function \cs{@@_regex_counter_style:} replace the ‘|*|’ +% with the actual counter of the running level and is used by +% the \mykey{ref} key. +% It loops through the defined counter styles in \cs{c_@@_counter_style_tl} +% and replace ‘|*|’ by real command, for example, looking for \ilabel{arabic*} +% and replacing that by \ics{arabic}\mymarg{counter} defined +% on the current level. +% \iffalse +%% Regex for replace '*' for |ref| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_regex_counter_style: + { + \tl_map_inline:Nn \c_@@_counter_style_tl + { + \regex_replace_once:nnN { \c{##1}\* } + { \c{##1}\cB{\u{l_@@_ref_the_count_tl}\cE} } \l_@@_ref_key_arg_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_show_length:nnn} +% Internal function used by \mykey{show-length} key to show +% \emph{\enquote{all lengths}} calculated and use in +% \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans} and +% \myenv*{keyans*} environments. +% \iffalse +%% Function to show list lengths used by |show-length| key. +% \fi +% \begin{macrocode} +\cs_new:Npn \@@_show_length:nnn #1 #2 #3 + { + * ~ #2 + \prg_replicate:nn { 14 - \str_count:n {#2} } { ~ } + = ~ \use:c { #1_use:c } { l_@@_#2_#3_#1 } \\ + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_unskip_unkern:} +% The function \cs{@@_unskip_unkern:} will remove the last \mymeta{skip} +% or \mymeta{kern} at execution time using the values \mydim{11} and +% \mydim{12} of |\lastnodetype| to apply |\unskip| or |\unkern| according +% to the case. +% \iffalse +%% Remove last skip or kern. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_unskip_unkern: + { + \int_case:nnT { \lastnodetype } + { + { 11 }{ \unskip } + { 12 }{ \unkern } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Utilities for environments and levels}\label{fun:utilities} +% +% \begin{macro}{\@@_is_not_nested:, \@@_is_on_first_level:} +% The function \cs{@@_is_not_nested:} set the variables \cs{g_@@_standar_bool} +% and \cs{g_@@_starred_bool} to \emph{\enquote{true}} only if the +% environments \myenv*{enumext} and \myenv*{enumext*} are NOT nested +% in each other and save the environment name in \cs{l_@@_envir_name_tl}. +% \iffalse +%% Function to check/set current environment for |enumext| and |enumext*|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_is_not_nested: + { + \str_case:en { \@currenvir } + { + {enumext} + { + \tl_set:Nn \l_@@_envir_name_tl { enumext } + \bool_lazy_and:nnT + { \bool_not_p:n { \g_@@_standar_bool } } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 0 } } + { + \bool_gset_true:N \g_@@_standar_bool + } + } + {enumext*} + { + \tl_set:Nn \l_@@_envir_name_tl { enumext* } + \bool_lazy_and:nnT + { \bool_not_p:n { \g_@@_starred_bool } } + { \int_compare_p:nNn { \l_@@_level_int } = { 0 } } + { + \bool_gset_true:N \g_@@_starred_bool + } + } + } + } +% \end{macrocode} +% The function \cs{@@_is_on_first_level:} will set the variables +% \cs{l_@@_standar_first_bool} (\S\ref{key:save-ans}), +% \cs{l_@@_starred_first_bool} (\S\ref{key:save-ans}) and +% \cs{l_@@_anskey_env_bool} (\S\ref{env:anskey}) to \emph{\enquote{true}} +% only if the environment is not nested and we are in the \emph{\enquote{first level}} +% of it . We will also save the \emph{start line number} of each environment +% in the variable \cs{g_@@_start_line_tl} and the \emph{name} of each +% environment in the variable \cs{g_@@_envir_name_tl} to use in messages +% related to the \mykey{check-ans} key and |.log| file. +% \iffalse +%% Function to check/set first level vars for |enumext| and |enumext*|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_is_on_first_level: + { + \bool_lazy_all:nT + { + { \bool_if_p:N \g_@@_standar_bool } + { \int_compare_p:nNn { \l_@@_level_int } = { 1 } } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 0 } } + } + { + \bool_set_true:N \l_@@_standar_first_bool + \bool_set_true:N \l_@@_anskey_env_bool + \tl_gset:Nn \g_@@_envir_name_tl { enumext } + \tl_gset:Ne \g_@@_start_line_tl + { + on ~ line ~ \exp_not:V \inputlineno + } + } + \bool_lazy_all:nT + { + { \bool_if_p:N \g_@@_starred_bool } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 1 } } + { \int_compare_p:nNn { \l_@@_level_int } = { 0 } } + } + { + \bool_set_true:N \l_@@_starred_first_bool + \bool_set_true:N \l_@@_anskey_env_bool + \tl_gset:Nn \g_@@_envir_name_tl { enumext* } + \tl_gset:Ne \g_@@_start_line_tl + { + on ~ line ~ \exp_not:V \inputlineno + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_keyans_name_and_start:} +% The function \cs{@@_keyans_name_and_start:} will save the start line +% number and name of the environments \myenv*{keyans}, \myenv*{keyans*} and +% \myenv*{keyanspic} in the variables \cs{l_@@_check_start_line_env_tl} +% and \cs{l_@@_envir_name_tl} to use in the \cs{@@_check_starred_cmd:n} function. +% \iffalse +%% Function to save the current name and start line for |keyans|, |keyans*| and |keyanspic|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_name_and_start: + { + \str_case:en { \@currenvir } + { + {keyans} + { + \tl_set:Nn \l_@@_envir_name_tl { keyans } + \tl_set:Ne \l_@@_check_start_line_env_tl + { + in ~ 'keyans' ~ start ~ on ~ line ~ \exp_not:V \inputlineno + } + } + {keyans*} + { + \tl_set:Nn \l_@@_envir_name_tl { keyans* } + \tl_set:Ne \l_@@_check_start_line_env_tl + { + in ~ 'keyans*' ~ start ~ on ~ line ~ \exp_not:V \inputlineno + } + } + {keyanspic} + { + \tl_set:Nn \l_@@_envir_name_tl { keyanspic } + \tl_set:Ne \l_@@_check_start_line_env_tl + { + in ~ 'keyanspic' ~ start ~ on ~ line ~ \exp_not:V \inputlineno + } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Utilities for log and terminal} +% +% \begin{macro}{\@@_reset_global_vars:, \@@_reset_global_int:, +% \@@_reset_global_bool:, \@@_reset_global_tl:,} +% The function \cs{@@_reset_global_vars:} will be passed to the function +% \cs{@@_execute_after_env:} and will return the global variables to +% their default values after being used. +% \iffalse +%% Reset all global vars after use in hook function. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_reset_global_vars: + { + \@@_reset_global_int: + \@@_reset_global_bool: + \@@_reset_global_tl: + } +\cs_new_protected:Nn \@@_reset_global_int: + { + \int_gzero:N \g_@@_item_number_int + \int_gzero:N \g_@@_item_anskey_int + \int_gzero:N \g_@@_item_answer_diff_int + } +\cs_new_protected:Nn \@@_reset_global_bool: + { + \bool_gset_false:N \g_@@_check_ans_key_bool + \bool_gset_false:N \g_@@_standar_bool + \bool_gset_false:N \g_@@_starred_bool + } +\cs_new_protected:Nn \@@_reset_global_tl: + { + \tl_gclear:N \g_@@_store_name_tl + \tl_gclear:N \g_@@_start_line_tl + \tl_gclear:N \g_@@_envir_name_tl + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_log_global_vars:, \@@_log_answer_vars:} +% The function \cs{@@_log_global_vars:} will be passed to the function +% \cs{@@_execute_after_env:} and write to the |.log| file the number of +% elements saved in the \emph{prop list} and \emph{sequence} created by the +% \mykey{save-ans} key along with the value of the integer variable +% created for the \mykey{resume} key. +% \iffalse +%% Write all global vars after use in hook function. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_log_global_vars: + { + \msg_log:nneeee { enumext } { prop-seq-int-hook } + { \g_@@_store_name_tl } + { \prop_count:c { g_@@_ \g_@@_store_name_tl _prop } } + { \seq_count:c { g_@@_ \g_@@_store_name_tl _seq } } + { \int_use:c { g_@@_resume_ \g_@@_store_name_tl _int } } + } +% \end{macrocode} +% The function \cs{@@_log_answer_vars:} will be passed to the function +% \cs{@@_execute_after_env:} and write to the |.log| file the number +% of items and answers along with the difference between them. +% \iffalse +%% Write all global vars for check-answer after use in hook function. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_log_answer_vars: + { + \msg_log:nneee { enumext } { item-answer-hook } + { \int_use:N \g_@@_item_number_int } + { \int_use:N \g_@@_item_anskey_int } + { \int_eval:n { \g_@@_item_number_int - \g_@@_item_anskey_int} } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Copying \env{list} and \env{minipage} environments} +% +% The \myenv{list} environment provided by \hologo{LaTeX} has the +% following plain form: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=none] +\list`\mymarg{arg one}\mymarg{arg two}` + \item`\myoarg{opt}` +\endlist +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% And \myenv{minipage} environment provided by \hologo{LaTeX} has the +% following (simplified) plain form: +% +% \iffalse +%<*example> +% \fi +\begin{examplecode}[frame=none] +\minipage`\myoarg{pos}\myoarg{height}\myoarg{inner-pos}\mymarg{width}` + `\mymeta{internal implement}` +\endminipage +\end{examplecode} +% \iffalse +%</example> +% \fi +% +% As a precaution we copy them using \cs{@@_at_begin_document:n} in +% case any package redefines the \myenv{list} environment or a related +% command. +% +% \smallskip +% +% \begin{important} +% For compatibility with \emph{tagged} \texttt{PDF} we should use +% |\NewCommandCopy| and not |\cs_new_eq:NN| for |\item|. When +% \emph{tagged} \texttt{PDF} is active |\item| is redefined using +% \mypkg{ltcmd} (see \mypkg{latex-lab-block}\cite{latexlab}). +% \end{important} +% +% \smallskip +% +% \begin{macro}{\@@_start_list:nn, \@@_stop_list:, \@@_item_std:w, +% \@@_minipage:w, \@@_endminipage:,} +% The functions \cs{@@_start_list:nn} and \cs{@@_stop_list:} correspond +% to copies of |\list| and |\endlist| from plain definition of \myenv{list} +% environment, the function \cs{@@_item_std:w} is a copy of the |\item| command. +% \iffalse +%% Copy |list| environment and |\item| command. +% \fi +% \begin{macrocode} +\@@_at_begin_document:n + { + \cs_new_eq:NN \@@_start_list:nn \list + \cs_new_eq:NN \@@_stop_list: \endlist + \NewCommandCopy \@@_item_std:w \item + } +% \end{macrocode} +% The functions \cs{@@_minipage:w} and \cs{@@_endminipage:} correspond +% to copies of |\minipage| and |\endminipage| from plain definition of +% \myenv{minipage} environment. +% \iffalse +%% Copy |minipage| environment. +% \fi +% \begin{macrocode} +\@@_at_begin_document:n + { + \cs_new_eq:NN \@@_minipage:w \minipage + \cs_new_eq:NN \@@_endminipage: \endminipage + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Compatibility with hyperref and footnotehyper}\label{pkg:hyperref} +% +% \begin{macro}{\@@_after_hyperref:, \@@_hypertarget:nn, \@@_phantomsection:} +% First we define the necessary rules using \emph{\enquote{hooks}} to +% determine if the \mypkg{hyperref} package is loaded. +% \iffalse +%% Detection off |hyperref| package with |hyperfootnotes=true|. +% \fi +% \begin{macrocode} +\hook_gput_code:nnn { begindocument } { enumext } { \@@_after_hyperref: } +\hook_gset_rule:nnnn { begindocument } { enumext } { after } { hyperref } +% \end{macrocode} +% The function \cs{@@_after_hyperref:} sets the state of the boolean +% variable \cs{l_@@_hyperref_bool} to \enquote{true} if the package is +% loaded. At this point we will use the public macro |\IfHyperBoolean| +% to determine if the |hyperfootnotes=true| key is present, if so, we +% set the state of the boolean variable \cs{@@_footnotes_key_bool} to +% \enquote{true}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_after_hyperref: + { + \IfPackageLoadedTF { hyperref } + { + \msg_info:nnn { enumext } { package-load } { hyperref } + \bool_set_true:N \l_@@_hyperref_bool + \IfHyperBoolean{hyperfootnotes} + { + \bool_set_true:N \l_@@_footnotes_key_bool + } + { } + } + { } +% \end{macrocode} +% If the state of the variable \cs{l_@@_footnotes_key_bool} is true we +% will check if the package \mypkg{footnotehyper} is loaded, in case it +% is not present, we will set the value of \cs{l_@@_footnotes_key_bool} +% to false and we will redefine |\footnote|. +% \iffalse +%% Detection off |footnotehyper| package. +% \fi +% \begin{macrocode} + \bool_if:NT \l_@@_footnotes_key_bool + { + \IfPackageLoadedTF { footnotehyper } + { + \msg_info:nnn { enumext } { package-load } { footnotehyper } + } + { + \bool_set_false:N \l_@@_footnotes_key_bool + } + } +% \end{macrocode} +% The functions \cs{@@_hypertarget:nn} and \cs{@@_phantomsection:} +% correspond to the internal copies of \ics{hypertarget} and +% \ics{phantomsection}. If the boolean variable \cs{l_@@_hyperref_bool} +% is false the functions \cs{@@_hypertarget:nn} and \cs{@@_phantomsection:} +% will be disabled. +% \begin{macrocode} + \bool_if:NTF \l_@@_hyperref_bool + { + \cs_new_eq:NN \@@_hypertarget:nn \hypertarget + \cs_new_eq:NN \@@_phantomsection: \phantomsection + } + { + \cs_new_eq:NN \@@_hypertarget:nn \use_none:nn + \cs_new_eq:NN \@@_phantomsection: \prg_do_nothing: + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_newlabel:nn,}\label{fun:newlabel} +% The function \cs{@@_newlabel:nn} write the information to the |.aux| +% file when using the \mykey{save-ref} key. The arguments taken by the +% function are: +% +% \begin{arguments} +% \item \cs{l_@@_newlabel_arg_one_tl} +% \item \cs{l_@@_newlabel_arg_two_tl} +% \end{arguments} +% +% \smallskip +% +% \begin{important}* +% The trick here is to manage the number of arguments passed to +% \ics{newlabel}|{#1}{#2}| according to the presence of the \mypkg{hyperref} +% package. +% \end{important} +% +% \smallskip +% +% \iffalse +%% Write internal |label| in |.aux| file for |save-ref| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_newlabel:nn #1 #2 + { + \protected@write \@auxout { } + { + \token_to_str:N \newlabel {#1} + { + {#2} + \bool_if:NT \l_@@_hyperref_bool + { { \thepage } {#2} {#1} } + { } + } + } + \@@_hypertarget:nn {#1} { } + \@@_phantomsection: + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Internal redefining \cs{footnote} command}\label{ltx:footnote} +% +% To keep the correct numbering of \ics{footnote} and to make it work +% correctly in the \myenv*{enumext*} and \myenv*{keyans*} environments +% and \mykey{mini-env} key it is necessary to redefine the |\footnote| command. +% This implementation is adapted from the answer given by Clea F. Rees (\texttt{@cfr}) +% in \href{https://tex.stackexchange.com/a/700092}{footnotes in boxes compatible with hyperref}. +% +% \begin{macro}[int]{\@@_footnotetext:nn, \@@_renew_footnote:, +% \@@_print_footnote:, \@@_renew_footnote_mini:, +% \@@_print_footnote_mini:,} +% Redefinition of the |\footnote| command using |\footnotetext| and +% |\footnotemark| for the \mykey{mini-env} key in the \myenv*{enumext} and +% \myenv*{keyans} environments. +% \iffalse +%% Redefining |\footnote| for key |mini-env| in |enumext| and |keyans| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_footnotetext:nn + { + \footnotetext[#1]{#2} + } +\cs_new_protected:Nn \@@_renew_footnote: + { + \RenewDocumentCommand \footnote { o +m } + { + \tl_if_novalue:nTF {##1} + { + \stepcounter{footnote} + \int_gset_eq:Nc \g_@@_footnote_standar_int { c@footnote } + } + { + \int_gset:Nn \g_@@_footnote_standar_int { ##1 } + } + \footnotemark [ \g_@@_footnote_standar_int ] + \seq_gput_right:Nn \g_@@_footnote_standar_arg_seq { ##2 } + \seq_gput_right:NV + \g_@@_footnote_standar_int_seq \g_@@_footnote_standar_int + } + } +\cs_new_protected:Nn \@@_print_footnote: + { + \seq_if_empty:NF \g_@@_footnote_standar_int_seq + { + \seq_map_pairwise_function:NNN + \g_@@_footnote_standar_int_seq + \g_@@_footnote_standar_arg_seq + \@@_footnotetext:nn + } + \seq_gclear:N \g_@@_footnote_standar_arg_seq + \seq_gclear:N \g_@@_footnote_standar_int_seq + } +% \end{macrocode} +% The \myenv*{enumext*} and \myenv*{keyans*} environments are implemented +% using \myenv{minipage} so we must also redefine |\footnote| to keep +% these numbering as if it were part of the document. +% \iffalse +%% Redefining |\footnote| for |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_renew_footnote_mini: + { + \RenewDocumentCommand \footnote { o +m } + { + \tl_if_novalue:nTF {##1} + { + \stepcounter{footnote} + \int_gset_eq:Nc \g_@@_footnote_starred_int { c@footnote } + } + { + \int_gset:Nn \g_@@_footnote_starred_int { ##1 } + } + \footnotemark [ \g_@@_footnote_starred_int ] + \seq_gput_right:Nn \g_@@_footnote_starred_arg_seq { ##2 } + \seq_gput_right:NV + \g_@@_footnote_starred_int_seq \g_@@_footnote_starred_int + } + } +\cs_new_protected:Nn \@@_print_footnote_mini: + { + \seq_if_empty:NF \g_@@_footnote_starred_int_seq + { + \seq_map_pairwise_function:NNN + \g_@@_footnote_starred_int_seq + \g_@@_footnote_starred_arg_seq + \@@_footnotetext:nn + } + \seq_gclear:N \g_@@_footnote_starred_arg_seq + \seq_gclear:N \g_@@_footnote_starred_int_seq + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_renew_footnote_standar:,\@@_print_footnote_standar:, +% \@@_renew_footnote_starred:,\@@_print_footnote_starred:,} +% We encapsulate the redefinition of |\footnote| to pass it to internal +% \myvarenv*{__@@_mini_page} environment used by the \mykey{mini-env} +% key in the \myenv*{enumext} and \myenv*{keyans} environments. We will +% run the redefinition when \emph{tagged} \texttt{PDF} is active or when +% the \mypkg{footnotehyper} package is not loaded. +% \begin{macrocode} +\cs_new_protected:Nn \@@_renew_footnote_standar: + { + \bool_if:NT \g_@@_standar_bool + { + \IfDocumentMetadataTF + { + \@@_renew_footnote: + } + { + \bool_if:NF \l_@@_footnotes_key_bool + { + \@@_renew_footnote: + } + } + } + } +\cs_new_protected:Nn \@@_print_footnote_standar: + { + \bool_if:NT \g_@@_standar_bool + { + \IfDocumentMetadataTF + { + \@@_print_footnote: + } + { + \bool_if:NF \l_@@_footnotes_key_bool + { + \@@_print_footnote: + } + } + } + } +% \end{macrocode} +% We encapsulate the redefinition of |\footnote| to pass it to the +% \myenv*{enumext*} and \myenv*{keyans*} environments. We will run the +% redefinition when \emph{tagged} \texttt{PDF} is active or when the +% \mypkg{footnotehyper} package is not loaded. +% \begin{macrocode} +\cs_new_protected:Nn \@@_renew_footnote_starred: + { + \IfDocumentMetadataTF + { + \@@_renew_footnote_mini: + } + { + \bool_if:NF \l_@@_footnotes_key_bool + { + \@@_renew_footnote_mini: + } + } + } +\cs_new_protected:Nn \@@_print_footnote_starred: + { + \IfDocumentMetadataTF + { + \@@_print_footnote_mini: + } + { + \bool_if:NF \l_@@_footnotes_key_bool + { + \@@_print_footnote_mini: + } + } + } +% \end{macrocode} +% In \myenv*{enumext*} and \myenv*{keyans*} environments we need to use +% \emph{\enquote{hooks}} to print |\footnote| with support for +% \emph{tagged} \texttt{PDF}. +% \begin{macrocode} +\@@_after_env:nn { enumext* } + { + \@@_print_footnote_starred: + } +\@@_after_env:nn { keyans* } + { + \@@_print_footnote_starred: + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The internal \env{minipage} environment} +% +% \begin{macro}[int]{\@@_internal_mini_page:, @@_mini_env*} +% The function \cs{@@_internal_mini_page:} creates a internal +% \myvarenv*{__@@_mini_page} environment (\emph{custom version} of +% \myenv{minipage}) setting the |\if@minipage| switch to \emph{\enquote{false}} +% to allow spaces at the \emph{\enquote{above}} of the environment, +% plus we will add |\skip_vertical:N \c_zero_skip| to maintain alignment +% on \emph{\enquote{top}} in the first part and |\skip_vertical:N \c_zero_skip| +% in the second part to allow spaces \emph{\enquote{below}}. This environment +% will be used internally by the \mykey{mini-env} key, it is NOT documented +% in the user interface and is for internal use only. Within this environment +% we redefine |\footnote| to make them look the same as if they were +% elsewhere in the document. This function is passed to the function +% \cs{@@_safe_exec:} in the \myenv*{enumext} environment definition (\S\ref{env:enumext}) +% and \cs{@@_safe_exec_vii:} in the \myenv*{enumext*} environment +% definition (\S\ref{env:starred}) +% \iffalse +%% Function for define a internal |minipage| environment with |\footnote| support. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_internal_mini_page: + { + \int_compare:nNnT { \l_@@_level_int } = { 0 } + { + \DeclareDocumentEnvironment{@@_mini_page}{ m } + { + \@@_renew_footnote_standar: + \@@_minipage:w [ t ] { ##1 } + \legacy_if_gset_false:n { @minipage } + \skip_vertical:N \c_zero_skip + } + { + \skip_vertical:N \c_zero_skip + \@@_endminipage: + \@@_print_footnote_standar: + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Definition of public dimension}\label{dim:public} +% +% The package \mypkg*{enumext} only provides a single public dimension +% |\itemwidth| and is intended for user convenience only and is not +% for internal use as such. This dimension is set in all environments +% and is only used by the \mykey{wrap-ans} key at its default value. +% \iffalse +%% Public dimension |\itemwidth| +% \fi +% \begin{macrocode} +\dim_zero_new:N \itemwidth +% \end{macrocode} +% +% \subsection{Definition of counters}\label{int:counters} +% +% \begin{macro}[int]{\@@_define_counters:Nn,enumXi, enumXii, enumXiii, +% enumXiv, enumXv, enumXvi, enumXvii, enumXviii} +% To create the necessary \emph{\enquote{counters}} we must first +% make sure that they are not already defined by the user or a +% package such as \mypkg{enumitem}, otherwise a error will be +% returned and the package loading will be aborted. The arguments +% taken by the function are: +% +% \begin{arguments} +% \item A token list \myvarenv{l__@@_counter_X_tl} for \emph{\enquote{store}} the counter's name. +% \item The counter's name. +% \end{arguments} +% +% \iffalse +%% Definition of counters. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_define_counters:Nn #1 #2 + { + \cs_if_exist:cTF { c@ #2 } + { \msg_fatal:nnn { enumext } { counters }{ #2 } } + { + \tl_set:Nn #1 { #2 } + \newcounter { #2 } + } + } +% \end{macrocode} +% The counters created here are \icounter{enumXi}, \icounter{enumXii}, +% \icounter{enumXiii} and \icounter{enumXiv} for \myenv*{enumext} +% environment, \icounter{enumXv} for \myenv*{keyans} environment, +% \icounter{enumXvi} for \myenv*{keyanspic} environment, \icounter{enumXvii} for +% \myenv*{enumext*} and \icounter{enumXviii} for the \myenv*{keyans*} +% environments. +% \begin{macrocode} +\@@_define_counters:Nn \l_@@_counter_i_tl { enumXi } +\@@_define_counters:Nn \l_@@_counter_ii_tl { enumXii } +\@@_define_counters:Nn \l_@@_counter_iii_tl { enumXiii } +\@@_define_counters:Nn \l_@@_counter_iv_tl { enumXiv } +\@@_define_counters:Nn \l_@@_counter_v_tl { enumXv } +\@@_define_counters:Nn \l_@@_counter_vi_tl { enumXvi } +\@@_define_counters:Nn \l_@@_counter_vii_tl { enumXvii } +\@@_define_counters:Nn \l_@@_counter_viii_tl { enumXviii } +% \end{macrocode} +% \end{macro} +% +% \subsection{Definition of labels} +% +% This part of the code is inspired by the \mypkg{enumitem} package. The +% idea is to be able to access the counters using \ilabel{arabic*}, +% \ilabel{Alph*}, \ilabel{alph*}, \ilabel{Roman*} and \ilabel{roman*} +% to use them in the \mykey{label} key. +% +% \begin{macro}{\@@_register_counter_style:Nn} +% These \mymeta{counters} will be used as default \mymeta{labels} if +% the \mykey{label} key is not used for the different levels of the +% \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans} and \myenv*{keyans*} +% environments, so it is necessary to get a default value for \mykey{labelwidth} +% from these \mymeta{labels} at the same time. +% \iffalse +%% Register of counters style. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_register_counter_style:Nn #1 #2 + { + \tl_const:cn { c_@@_widest_ \cs_to_str:N #1 _tl } {#2} + \tl_gput_right:Nn \g_@@_counter_styles_tl {#1} + } +\@@_register_counter_style:Nn \arabic { 0 } +\@@_register_counter_style:Nn \Alph { M } +\@@_register_counter_style:Nn \alph { m } +\@@_register_counter_style:Nn \Roman { VIII } +\@@_register_counter_style:Nn \roman { viii } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_label_width_by_box:Nn, \@@_label_width_by_box:cv} +% The function \cs{@@_label_width_by_box:Nn} set the default \ics{labelwidth} +% using a box width if no \mykey{labelwidth} key is passed. +% \iffalse +%% Set default label width using a box width. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_label_width_by_box:Nn #1 #2 + { + \hbox_set:Nn \l_@@_label_width_by_box {#2} + \dim_set:Nn #1 { \box_wd:N \l_@@_label_width_by_box } + } +\cs_generate_variant:Nn \@@_label_width_by_box:Nn { cv } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_label_style:Nnn, \@@_label_style:cvn} +% The function \cs{@@_label_style:Nnn} is used by the \mykey{label} +% key to creates the variables containing the \mymeta{label style} +% and will allow to use \ilabel{arabic*}, \ilabel{Alph*}, \ilabel{alph*}, +% \ilabel{Roman*} and \ilabel{roman*} as arguments. +% +% It loops through the defined counter styles in \cs{g_@@_counter_styles_tl} +% (\ics{arabic}, \ics{alph}, \ics{Alph}, \ics{roman}, and \ics{Roman}) for example, +% looking for \ilabel{roman*} and replacing that by \ics{roman}\mymarg{counter}, +% and doing the same for the \cs{g_@@_widest_label_tl} to keep both in sync. +% \iffalse +%% Function to support |*| in |label| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_label_style:Nnn #1 #2 #3 + { + \tl_clear_new:N #1 + \tl_put_right:Ne #1 { \tl_trim_spaces:n {#3} } + \tl_gset_eq:NN \g_@@_widest_label_tl #1 + \tl_map_inline:Nn \g_@@_counter_styles_tl + { + \tl_replace_all:Nne #1 { ##1* } { \exp_not:N ##1 {#2} } + \tl_greplace_all:Nne \g_@@_widest_label_tl { ##1* } + { \tl_use:c { c_@@_widest_ \cs_to_str:N ##1 _tl } } + } + \@@_label_width_by_box:Nn \l_@@_current_widest_dim + { \tl_use:N \g_@@_widest_label_tl } + \tl_set_eq:cN { the #2 } #1 + } +\cs_generate_variant:Nn \@@_label_style:Nnn { cvn } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting keys associated with label}\label{key:label} +% +% When \emph{tagged} \texttt{PDF} is active |\makelabel| is redefined using +% |\makebox| to work correctly (\S\ref{env:item-starred-enumext}). From +% the user side it is convenient to have a key that allows using this +% redefinition with |\makebox| without having |\IfDocumentMetadataTF| active. +% +% \begin{macro}[int]{mode-box} +% We define the key \mykey{mode-box} only for the \emph{\enquote{first level}} +% of \myenv*{enumext} and \myenv*{enumext*} environments. +% \iffalse +%% Add |mode-box| key only on first level off |enumext| and |enumext*| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / #1 } + { + mode-box .bool_set:N = \l_@@_mode_box_bool, + mode-box .initial:n = false, + mode-box .value_forbidden:n = true, + } + } +\clist_map_inline:nn { level-1, enumext* } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{font, labelsep, labelwidth, wrap-label,wrap-label*} +% Definition of keys \mykey{font}, \mykey{labelsep}, \mykey{labelwidth}, +% \mykey{wrap-label} and \mykey{wrap-label*} keys for \myenv*{enumext} +% and \myenv*{keyans} environments. +% \iffalse +%% Add |font|, |labelsep|, |labelwidth|, |wrap-label| and |wrap-label*| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + font .tl_set:c = { l_@@_label_font_style_#2_tl }, + font .value_required:n = true, + labelsep .dim_set:c = { l_@@_labelsep_#2_dim }, + labelsep .initial:n = {0.3333em}, + labelsep .value_required:n = true, + labelwidth .dim_set:c = { l_@@_labelwidth_#2_dim }, + labelwidth .value_required:n = true, + wrap-label .cs_set_protected:cp = { @@_wrapper_label_#2:n } ##1, + wrap-label .initial:n = {##1}, + wrap-label .value_required:n = true, + wrap-label* .code:n = { + \bool_set_true:c { l_@@_wrap_label_opt_#2_bool } + \keys_set:nn { enumext / #1 } { wrap-label = {##1} } + }, + wrap-label* .value_required:n = true, + } + } +\clist_map_inline:Nn \c_@@_all_envs_clist { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{align} +% The \mykey{align} key is implemented differently for \emph{\enquote{starred}} +% and \emph{\enquote{non starred}} environments. For compatibility with +% \emph{tagged} \texttt{PDF} we must set \myvarenv{l__@@_align_label_pos_X_str}. +% \iffalse +%% Add |align| key for |enumext| and |keyans| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + align .choice:, + align / left .code:n = + { + \tl_clear:c { l_@@_label_fill_left_#2_tl } + \tl_set:cn { l_@@_label_fill_right_#2_tl } { \hfill } + \str_set:cn { l_@@_align_label_pos_#2_str } { l } + }, + align / right .code:n = + { + \tl_set:cn { l_@@_label_fill_left_#2_tl } { \hfill } + \tl_clear:c { l_@@_label_fill_right_#2_tl } + \str_set:cn { l_@@_align_label_pos_#2_str } { r } + }, + align / center .code:n = + { + \tl_set:cn { l_@@_label_fill_left_#2_tl } { \hfill } + \tl_set:cn { l_@@_label_fill_right_#2_tl } { \hfill } + \str_set:cn { l_@@_align_label_pos_#2_str } { c } + }, + align / unknown .code:n = + \msg_error:nneee { enumext } { unknown-choice } + { align } { left, ~ right, ~ center } { \exp_not:n {##1} }, + align .initial:n = left, + align .value_required:n = true, + } + } +\clist_map_inline:nn + { + {level-1}{i}, {level-2}{ii}, {level-3}{iii}, {level-4}{iv}, {keyans}{v} + } + { \@@_tmp:nn #1 } +% \end{macrocode} +% \iffalse +%% Add |align| key for |enummext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + align .choice:, + align / left .code:n = \str_set:cn { l_@@_align_label_#2_str } { l }, + align / right .code:n = \str_set:cn { l_@@_align_label_#2_str } { r }, + align / center .code:n = \str_set:cn { l_@@_align_label_#2_str } { c }, + align / unknown .code:n = + \msg_error:nneee { enumext } { unknown-choice } + { align } { left, ~ right, ~ center } { \exp_not:n {##1} }, + align .initial:n = left, + align .value_required:n = true, + } + } +\clist_map_inline:nn { {enumext*}{vii}, {keyans*}{viii} } { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{label} and \texttt{ref} keys}\label{key:label-ref} +% +% The implementation of the keys \mykey{label} and \mykey{ref} are part +% of the core of the package \mypkg*{enumext}, here the default values +% for \mymeta{label}, the value of the variables \myvarenv{l__@@_label_X_tl}, +% the default values for |\labelwidth| and the \emph{\enquote{label and ref}} system. +% +% \subsubsection{Define and set \texttt{label} and \texttt{ref} keys for \env{enumext} environment} +% +% \begin{macro}[int]{label,ref,\l_@@_label_i_tl,\l_@@_label_ii_tl, \l_@@_label_iii_tl, \l_@@_label_iv_tl} +% Here we set the default \mymeta{labels} of the \emph{four levels} of +% \myenv*{enumext} environment, along with the default value for +% \mykey{labelwidth} key and \mykey{ref} key. +% \iffalse +%% Define and set |label| and |ref| keys for |enumext|. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nnn #1 #2 #3 + { + \keys_define:nn { enumext / #1 } + { + label .code:n = { + \@@_label_style:cvn { l_@@_label_#2_tl } + { l_@@_counter_#2_tl } {##1} + \dim_set_eq:cN { l_@@_labelwidth_#2_dim } + \l_@@_current_widest_dim + }, + label .initial:n = #3, + label .value_required:n = true, + ref .code:n = \@@_standar_ref:n {##1}, + ref .value_required:n = true, + } + } +\@@_tmp:nnn { level-1 } { i } { \arabic*.} +\@@_tmp:nnn { level-2 } { ii } { (\alph*) } +\@@_tmp:nnn { level-3 } { iii } { \roman*. } +\@@_tmp:nnn { level-4 } { iv } { \Alph*. } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_standar_ref:n, \@@_standar_ref:,} +% The \cs{@@_standar_ref:n} first we will pass the key argument to +% \cs{l_@@_ref_key_arg_tl} and we will analyze its state, if it is not +% \emph{empty} we will make a copy of the current counter in \cs{l_@@ _ref_the_count_tl} +% and we will execute the function \cs{@@_regex_counter_style:} which +% will return the modified \cs{l_@@_ref_key_arg_tl} and we make the +% value of \cs{l_@@_ref_the_count_tl} the same as that \myvarenv{l__@@_the_counter_X_tl} +% which contains |\theenumX| and finally we set \myvarenv{l__@@_renew_the_count_X_tl} +% with the renewed command. +% \iffalse +%% Internal function used by |ref| key in enumext environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_standar_ref:n #1 + { + \tl_set:Nn \l_@@_ref_key_arg_tl {#1} + \tl_if_empty:NTF \l_@@_ref_key_arg_tl + { + \msg_error:nnn { enumext } { key-ref-empty } { enumext } + } + { + \tl_set_eq:Nc + \l_@@_ref_the_count_tl { l_@@_counter_ \@@_level: _tl } + \@@_regex_counter_style: + \tl_set_eq:Nc + \l_@@_ref_the_count_tl { l_@@_the_counter_ \@@_level: _tl } + \tl_put_right:ce { l_@@_renew_the_count_ \@@_level: _tl } + { + \exp_not:N \renewcommand { \exp_not:V \l_@@_ref_the_count_tl } { \exp_not:V \l_@@_ref_key_arg_tl } + } + } + } +% \end{macrocode} +% Finally the function \cs{@@_standar_ref:} will execute the +% modification for the reference system in the second argument of the +% environment definition \myenv*{enumext}. +% \iffalse +%% Activate |ref| key in second arg of list for |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_standar_ref: + { + \tl_if_empty:cF { l_@@_renew_the_count_ \@@_level: _tl } + { + \tl_use:c { l_@@_renew_the_count_ \@@_level: _tl } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Define and set \texttt{label} and \texttt{ref} keys for \env{enumext*} and \env{keyans*} environments} +% +% \begin{macro}[int]{label,ref, \l_@@_label_vii_tl, \l_@@_label_viii_tl} +% Here we set the default \mymeta{labels} for \myenv*{enumext*} and +% \myenv*{keyans*} environments, along with the default value for +% \mykey{labelwidth} key and \mykey{ref} key. +% \iffalse +%% Define and set |label| and |ref| keys for starred environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nnn #1 #2 #3 + { + \keys_define:nn { enumext / #1 } + { + label .code:n = { + \@@_label_style:cvn { l_@@_label_#2_tl } + { l_@@_counter_#2_tl } {##1} + \dim_set_eq:cN { l_@@_labelwidth_#2_dim } + \l_@@_current_widest_dim + }, + label .initial:n = #3, + label .value_required:n = true, + ref .code:n = \@@_starred_ref:n {##1}, + ref .value_required:n = true, + } + } +\@@_tmp:nnn { enumext* } { vii } { \arabic*.} +\@@_tmp:nnn { keyans* } { viii } { \Alph*) } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_starred_ref:n, \@@_starred_ref:} +% The implementation of \cs{@@_starred_ref:n} is the same as that +% used for the environment \myenv*{enumext}. +% \iffalse +%% Internal function used by |ref| key in |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_starred_ref:n #1 + { + \tl_set:Nn \l_@@_ref_key_arg_tl {#1} + \int_compare:nNnT { \l_@@_level_h_int } = { 1 } + { + \tl_if_empty:NTF \l_@@_ref_key_arg_tl + { + \msg_error:nnn { enumext } { key-ref-empty } { enumext* } + } + { + \tl_set_eq:NN \l_@@_ref_the_count_tl \l_@@_counter_vii_tl + \@@_regex_counter_style: + \tl_set_eq:NN \l_@@_ref_the_count_tl \l_@@_the_counter_vii_tl + \tl_put_right:Ne \l_@@_renew_the_count_vii_tl + { + \exp_not:N \renewcommand { \exp_not:V \l_@@_ref_the_count_tl } { \exp_not:V \l_@@_ref_key_arg_tl } + } + } + } + \int_compare:nNnT { \l_@@_keyans_level_h_int } = { 1 } + { + \tl_if_empty:NTF \l_@@_ref_key_arg_tl + { + \msg_error:nnn { enumext } { key-ref-empty } { keyans* } + } + { + \tl_set_eq:NN \l_@@_ref_the_count_tl \l_@@_counter_viii_tl + \@@_regex_counter_style: + \tl_set_eq:NN \l_@@_ref_the_count_tl \l_@@_the_counter_viii_tl + \tl_put_right:Ne \l_@@_renew_the_count_viii_tl + { + \exp_not:N \renewcommand { \exp_not:V \l_@@_ref_the_count_tl } { \exp_not:V \l_@@_ref_key_arg_tl } + } + } + } + } +% \end{macrocode} +% Finally the function \cs{@@_starred_ref:} will execute the +% modification for the reference system in the second argument of the +% \myenv*{enumext*} and \myenv*{keyans*} environment definition. +% \iffalse +%% Activate |ref| key in second arg of list for |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_starred_ref: + { + \int_compare:nNnT { \l_@@_level_h_int } = { 1 } + { + \tl_if_empty:NF \l_@@_renew_the_count_vii_tl + { + \tl_use:N \l_@@_renew_the_count_vii_tl + } + } + \int_compare:nNnT { \l_@@_keyans_level_h_int } = { 1 } + { + \tl_if_empty:NF \l_@@_renew_the_count_viii_tl + { + \tl_use:N \l_@@_renew_the_count_viii_tl + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Define and set \texttt{label} and \texttt{ref} keys for \env{keyans} and \env{keyanspic} environments} +% +% \begin{macro}[int]{label, ref} +% \begin{macro}{\l_@@_label_v_tl,\l_@@_label_vi_tl,} +% Here we set the default \mymeta{label} for \myenv*{keyans} +% and \myenv*{keyanspic} environment, along with the default value for +% \mykey{labelwidth} and \mykey{ref} key. The \myenv*{keyanspic} +% environment use the same \mymeta{label} as the \myenv*{keyans} +% environment. +% \iffalse +%% Define and set |label| and |ref| keys for |keyans| and |keyanspic|. +% \fi +% \begin{macrocode} +\keys_define:nn { enumext / keyans } + { + label .code:n = { + \@@_label_style:cvn { l_@@_label_v_tl } + { l_@@_counter_v_tl } {#1} + \dim_set_eq:cN { l_@@_labelwidth_v_dim } + \l_@@_current_widest_dim + \@@_label_style:cvn { l_@@_label_vi_tl } + { l_@@_counter_vi_tl } {#1} + \dim_set_eq:cN { l_@@_labelwidth_v_dim } + \l_@@_current_widest_dim + }, + label .initial:n = \Alph*), + label .value_required:n = true, + ref .code:n = \@@_keyans_ref:n {#1}, + ref .value_required:n = true, + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[int]{\@@_keyans_ref:n, \@@_keyans_ref:} +% The implementation of \cs{@@_keyans_ref:n} is the same as that +% used for the environment \myenv*{enumext}. +% \iffalse +%% Internal function used by |ref| key in |keyans| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_ref:n #1 + { + \tl_set:Nn \l_@@_ref_key_arg_tl {#1} + \tl_if_empty:NTF \l_@@_ref_key_arg_tl + { + \msg_error:nnn { enumext } { key-ref-empty } { keyans } + } + { + \tl_set_eq:NN \l_@@_ref_the_count_tl \l_@@_counter_v_tl + \@@_regex_counter_style: + \tl_set_eq:NN \l_@@_ref_the_count_tl \l_@@_the_counter_v_tl + \tl_put_right:Ne \l_@@_renew_the_count_v_tl + { + \exp_not:N \renewcommand { \exp_not:V \l_@@_ref_the_count_tl } { \exp_not:V \l_@@_ref_key_arg_tl } + } + } + } +% \end{macrocode} +% Finally the function \cs{@@_keyans_ref:} will execute the +% modification for the reference system in the second argument of the +% \myenv*{keyans*} environment definition. +% \iffalse +%% Activate |ref| key in second arg of list for |keyans| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_ref: + { + \tl_if_empty:NF \l_@@_renew_the_count_v_tl + { + \tl_use:N \l_@@_renew_the_count_v_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{start}, \texttt{start*} and \texttt{widest} keys}\label{key:start-widest} +% +% \begin{macro}{\@@_start_from:NNn, \@@_start_from:ccn, \@@_start_from:cce,} +% The function \cs{@@_start_from:NNn} used by \mykey{start} and \mykey{start*} +% keys take three arguments: +% +% \begin{arguments} +% \item \myvarenv{l__@@_label_X_tl} +% \item \myvarenv{l__@@_start_X_int} +% \item \meta{integer or string} +% \end{arguments} +% +% The first argument of this function are the \emph{\enquote{counter style}} set by +% \mykey{label} key, the second argument is returned by the function, +% the third argument can be an \mymeta{integer} or \mymeta{string} of the +% form \ics{Alph}, \ics{alph}, \ics{Roman} or \ics{roman}. +% This effectively allows \mykey{start}|=A| or \mykey{start}|=1| to +% be used. +% \iffalse +%% Internal function for |start| key. +%% #1 \l_enumext_label_X_tl +%% #2 \l_enumext_start_X_int +%% #3 integer or string +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_start_from:NNn #1 #2 #3 + { + \@@_if_is_int:nTF { #3 } + { + \int_set:Nn #2 {#3} + } + { + \regex_match:nVT { \c{Alph} | \c{alph} } {#1} + { \int_set:Nn #2 { \int_from_alph:n {#3} } } + \regex_match:nVT { \c{Roman} | \c{roman} } {#1} + { \int_set:Nn #2 { \int_from_roman:n {#3} } } + } + } +\cs_generate_variant:Nn \@@_start_from:NNn { ccn, cce } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_widest_from:nNNn, \@@_widest_from:nccn} +% The function \cs{@@_widest_from:nNNn} used by the \mykey{widest} +% key take four arguments: +% +% \begin{arguments} +% \item The counter associated with the environment level +% \item \myvarenv{l__@@_label_X_tl} +% \item \myvarenv{l__@@_labelwidth_X_dim} +% \item \meta{integer or string} +% \end{arguments} +% +% The second and third arguments of this function are the values set by +% \mykey{label} and \mykey{labelwidth} keys, the four argument can +% be an \mymeta{integer} or \mymeta{string} of the +% form \ics{Alph}, \ics{alph}, \ics{Roman} or \ics{roman}. +% The value of the four argument is set temporarily for the +% identified counter in this point (level), then the value is expanded +% into a \emph{\enquote{box}} and the \emph{\enquote{width}} of the +% \emph{\enquote{box}} is returned. +% \iffalse +%% Internal function for |widest| key. +%% #1 The counter associated with the environment level +%% #2 \l_enumext_label_X_tl +%% #3 \l_enumext_labelwidth_X_tl +%% #4 integer or string +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_widest_from:nNNn #1 #2 #3 #4 + { + \@@_if_is_int:nTF {#4} + { + \setcounter{enumX#1} { #4 } + } + { + \regex_match:nVT { \c{Alph} | \c{alph} } {#2} + { \setcounter{enumX#1} { \int_from_alph:n {#4} } } + \regex_match:nVT { \c{Roman} | \c{roman} } {#2} + { \setcounter{enumX#1} { \int_from_roman:n {#4} } } + } + \@@_label_width_by_box:cv + { l_@@_labelwidth_#1_dim } { l_@@_label_#1_tl } + } +\cs_generate_variant:Nn \@@_widest_from:nNNn { nccn } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{start, start*, widest,} +% Now define and set \mykey{start*}, \mykey{start} and \mykey{widest} +% keys for \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans} and +% \myenv*{keyans*} environments. +% +% \iffalse +%% Add |start*|, |start| and |widest| key. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + start* .code:n = { + \@@_start_from:ccn + { l_@@_label_#2_tl } + { l_@@_start_#2_int } {##1} + }, + start* .value_required:n = true, + start .code:n = { + \@@_start_from:cce + { l_@@_label_#2_tl } + { l_@@_start_#2_int } { \int_eval:n {##1} } + }, + start .initial:n = 1, + start .value_required:n = true, + widest .code:n = { + \@@_widest_from:nccn {#2} + { l_@@_label_#2_tl } + { l_@@_labelwidth_#2_dim } {##1} + }, + widest .value_required:n = true, + } + } +\clist_map_inline:Nn \c_@@_all_envs_clist { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting keys for vertical spaces} +% +% \begin{macro}[int]{topsep, partopsep, parsep, noitemsep, nosep} +% Define and set \mykey{topsep}, \mykey{partopsep}, \mykey{parsep}, +% \mykey{itemsep}, \mykey{noitemsep} and \mykey{nosep} keys for +% \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans} and +% \myenv*{keyans*} environments. +% +% \iffalse +%% Add |topsep|, |partopsep|, |parsep|, |noitemsep| and |nosep| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nnnnnn #1 #2 #3 #4 #5 #6 + { + \keys_define:nn { enumext / #1 } + { + topsep .skip_set:c = { l_@@_topsep_#2_skip }, + topsep .initial:n = {#3}, + topsep .value_required:n = true, + partopsep .skip_set:c = { l_@@_partopsep_#2_skip }, + partopsep .initial:n = {#4}, + partopsep .value_required:n = true, + parsep .skip_set:c = { l_@@_parsep_#2_skip }, + parsep .initial:n = {#5}, + parsep .value_required:n = true, + itemsep .skip_set:c = { l_@@_itemsep_#2_skip }, + itemsep .initial:n = {#6}, + itemsep .value_required:n = true, + noitemsep .meta:n = { itemsep = 0pt, parsep = 0pt }, + noitemsep .value_forbidden:n = true, + nosep .meta:n = { + itemsep = 0pt, parsep= 0pt, + topsep = 0pt, partopsep = 0pt, + }, + nosep .value_forbidden:n = true, + } + } +% \end{macrocode} +% Now we set the values based on standard \myclass{article} class in +% \mydim{10pt}. +% \begin{macrocode} +\@@_tmp:nnnnnn { level-1 } { i } { 8.0pt plus 2.0pt minus 4.0pt } + { 2.0pt plus 1.0pt minus 1.0pt } { 4.0pt plus 2.0pt minus 1.0pt } + { 4.0pt plus 2.0pt minus 1.0pt } +\@@_tmp:nnnnnn { level-2 } { ii } { 4.0pt plus 2.0pt minus 1.0pt } + { 2.0pt plus 1.0pt minus 1.0pt } { 2.0pt plus 1.0pt minus 1.0pt } + { 2.0pt plus 1.0pt minus 1.0pt } +\@@_tmp:nnnnnn { level-3 } { iii } { 2.0pt plus 1.0pt minus 1.0pt } + { 1.0pt minus 1.0pt }{ 0pt }{ 2.0pt plus 1.0pt minus 1.0pt } +\@@_tmp:nnnnnn { level-4 } { iv } { 2.0pt plus 1.0pt minus 1.0pt } + { 1.0pt minus 1.0pt }{ 0pt }{ 2.0pt plus 1.0pt minus 1.0pt } +\@@_tmp:nnnnnn { keyans } { v }{ 4.0pt plus 2.0pt minus 1.0pt } + { 2.0pt plus 1.0pt minus 1.0pt }{ 2.0pt plus 1.0pt minus 1.0pt } + { 2.0pt plus 1.0pt minus 1.0pt } +\@@_tmp:nnnnnn { enumext* } { vii } { 8.0pt plus 2.0pt minus 4.0pt } + { 2.0pt plus 1.0pt minus 1.0pt } { 4.0pt plus 2.0pt minus 1.0pt } + { 4.0pt plus 2.0pt minus 1.0pt } +\@@_tmp:nnnnnn { keyans* } { viii } { 4.0pt plus 2.0pt minus 1.0pt } + { 2.0pt plus 1.0pt minus 1.0pt } { 2.0pt plus 1.0pt minus 1.0pt } + { 2.0pt plus 1.0pt minus 1.0pt } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{base-fix} key}\label{key:base-fix} +% +% When nesting starting right after |\item| (without material between them) there +% is a problem with the alignment of the \emph{baseline} between the two environments. +% One way to get around this problem is to place |\mode_leave_vertical:| +% apply |\vspace{-\baselineskip}| and set |\topsep=|\mydim{0pt} for +% the \emph{\enquote{first level}} of the nested \myenv*{enumext} environment. +% +% \begin{macro}[int]{base-fix, \@@_nested_base_line_fix:} +% We define the key \mykey{base-fix} only for the \emph{\enquote{first level}} +% of \myenv*{enumext} environment. +% \iffalse +%% Add |base-fix| key only on first level off |enumext| environment. +% \fi +% \begin{macrocode} +\keys_define:nn { enumext / level-1 } + { + base-fix .bool_set:N = \l_@@_base_line_fix_bool, + base-fix .initial:n = false, + base-fix .value_forbidden:n = true, + } +% \end{macrocode} +% The function \cs{@@_nested_base_line_fix:} passed to the \cs{@@_parse_keys:n} +% function in the definition of the \myenv*{enumext} environment (\S\ref{env:enumext}) +% will be responsible for applying the \emph{baseline correction} and +% adjusting the \mymeta{keys} for the \myenv*{enumext} environment and +% the |\printkeyans| with \emph{starred argument} ‘|*|’ (\S\ref{cmd:printkeyans}). +% +% We will first implement the function code from the user side of the +% \mykey{base-fix} key, that is, only the user knows when it is necessary +% to apply it within the document in which case the variable +% \cs{l_@@_print_keyans_star_bool} set by the |\printkeyans| command is +% false and the variable \cs{l_@@_base_line_fix_bool} is true. +% \iffalse +%% Internal function for |base-fix| key in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_nested_base_line_fix: + { + \bool_lazy_all:nT + { + { \bool_if_p:N \l_@@_starred_first_bool } + { \bool_if_p:N \l_@@_base_line_fix_bool } + { \bool_not_p:n { \l_@@_print_keyans_star_bool } } + } + { + \mode_leave_vertical: + \vspace { -\dim_eval:n { \baselineskip + \parsep } } + } +% \end{macrocode} +% When we are running the |\printkeyans| command with the \emph{starred +% argument} ‘|*|’ the variable \cs{l_@@_print_keyans_star_bool} is true +% and we can run a simplified version of |\vspace| using |\skip_vertical:n|. +% \begin{macrocode} + \bool_lazy_and:nnT + { \bool_if_p:N \l_@@_starred_first_bool } + { \bool_if_p:N \l_@@_print_keyans_star_bool } + { + \mode_leave_vertical: + \skip_vertical:n { -\baselineskip } + \skip_vertical:N \c_zero_skip + } +% \end{macrocode} +% Finally we set the values of the keys \mykey{topsep}, \mykey{above} +% and \mykey{above*} for the \emph{\enquote{first level}} of \myenv*{enumext} +% environment equal to \mydim{0pt} and set the variable \cs{l_@@_base_line_fix_bool} +% to false. +% \begin{macrocode} + \keys_set:nn { enumext / level-1 } + { + topsep = 0pt, above = 0pt, above* = 0pt, + } + \bool_set_false:N \l_@@_base_line_fix_bool + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting keys for horizontal spaces}\label{key:list-indent} +% +% \begin{macro}[int]{itemindent, rightmargin, listparindent, list-offset, list-indent} +% Define and set \mykey{itemindent}, \mykey{rightmargin}, \mykey{listparindent}, \mykey{list-offset} +% and \mykey{list-indent} keys for \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans} and +% \myenv*{keyans*} environments. +% \iffalse +%% Add |itemindent|, |rightmargin|, |listparindent|, |list-offset| and |list-indent| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + itemindent .dim_set:c = { l_@@_fake_item_indent_#2_dim }, + itemindent .value_required:n = true, + rightmargin .dim_set:c = { l_@@_rightmargin_#2_dim }, + rightmargin .value_required:n = true, + listparindent .dim_set:c = { l_@@_listparindent_#2_dim }, + listparindent .value_required:n = true, + list-offset .dim_set:c = { l_@@_listoffset_#2_dim }, + list-offset .value_required:n = true, + list-indent .code:n = + \bool_set_true:c { l_@@_leftmargin_tmp_#2_bool } + \dim_set:cn { l_@@_leftmargin_tmp_#2_dim } {##1}, + list-indent .value_required:n = true, + } + } +\clist_map_inline:nn + { + {level-1}{i}, {level-2}{ii}, {level-3}{iii}, {level-4}{iv}, {keyans}{v} + } + { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% For \myenv*{enumext*} and \myenv*{keyans*} environments the situation +% is a bit different, the \mykey{list-indent} key behaves like the \mykey{list-offset} key. +% \iffalse +%% Set |list-offset| and |list-indent| keys for |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + itemindent .dim_set:c = { l_@@_fake_item_indent_#2_dim }, + itemindent .value_required:n = true, + rightmargin .dim_set:c = { l_@@_rightmargin_#2_dim }, + rightmargin .value_required:n = true, + listparindent .dim_set:c = { l_@@_listparindent_#2_dim }, + listparindent .value_required:n = true, + list-offset .dim_set:c = { l_@@_listoffset_#2_dim }, + list-offset .value_required:n = true, + list-indent .meta:n = { list-offset = ##1 }, + list-indent .value_required:n = true, + } + } +\clist_map_inline:nn + { + {enumext*}{vii}, {keyans*}{viii} + } + { \@@_tmp:nn #1 } +% \end{macrocode} +% +% \subsubsection{Functions for setting the fake \texttt{itemindent}}\label{key:fake-indent} +% +% \begin{macro}[int]{\@@_fake_item_indent:,\@@_keyans_fake_item_indent:, +% \@@_fake_item_indent_vii:, \@@_fake_item_indent_viii:,} +% +% The \mykey{itemindent} key does not set the value of |\itemindent|, it only +% sets the value of the \emph{horizontal space} applied using |\skip_horizontal:N|. We will +% store this value in the variable and only apply it when it is greater +% than \mydim{0pt}. Here I will need to place +% |\mode_leave_vertical:| and the plain \hologo{TeX} macro +% |\ignorespaces| to avoid unwanted extra space when using the +% \mykey{itemindent} key. +% \iffalse +%% Internal functions for |itemindent| key. |\mode_leave_vertical:| nor +% \fi +% \begin{macrocode} +\cs_set_protected:Nn \@@_fake_item_indent: + { + \dim_compare:nNnT + { \dim_use:c { l_@@_fake_item_indent_ \@@_level: _dim } } + > + { \c_zero_dim } + { + \tl_set:ce { l_@@_fake_item_indent_ \@@_level: _tl } + { + \exp_not:N \mode_leave_vertical: + \exp_not:n { \skip_horizontal:n } + { \dim_use:c { l_@@_fake_item_indent_ \@@_level: _dim } } + \exp_not:N \ignorespaces + } + } + } +\cs_set_protected:Nn \@@_keyans_fake_item_indent: + { + \dim_compare:nNnT + { \l_@@_fake_item_indent_v_dim } > { \c_zero_dim } + { + \tl_set:Ne \l_@@_fake_item_indent_v_tl + { + \exp_not:N \mode_leave_vertical: + \exp_not:N \skip_horizontal:N \l_@@_fake_item_indent_v_dim + \exp_not:N \ignorespaces + } + } + } +\cs_set_protected:Nn \@@_fake_item_indent_vii: + { + \dim_compare:nNnT + { \l_@@_fake_item_indent_vii_dim } > { \c_zero_dim } + { + \tl_set:Ne \l_@@_fake_item_indent_vii_tl + { + \exp_not:N \skip_horizontal:N \l_@@_fake_item_indent_vii_dim + \exp_not:N \ignorespaces + } + } + } +\cs_set_protected:Nn \@@_fake_item_indent_viii: + { + \dim_compare:nNnT + { \l_@@_fake_item_indent_viii_dim } > { \c_zero_dim } + { + \tl_set:Ne \l_@@_fake_item_indent_viii_tl + { + \exp_not:N \skip_horizontal:N \l_@@_fake_item_indent_viii_dim + \exp_not:N \ignorespaces + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{show-length} key} +% +% \begin{macro}[int]{show-length} +% Define and set \mykey{show-length} key for \myenv*{enumext}, +% \myenv*{enumext*}, \myenv*{keyans} and \myenv*{keyans*} environments. +% The function sets the boolean variable \myvarenv{l__@@_show_length_X_bool} +% used in the definition of all environments to \emph{\enquote{true}} +% and calls the function \cs{@@_show_length:nnn} which prints all the +% values of the \emph{\enquote{vertical}} and \emph{\enquote{horizontal}} +% parameters calculated and used. +% \iffalse +%% Add |show-length| key for all environments.. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + show-length .bool_set:c = { l_@@_show_length_#2_bool }, + show-length .initial:n = false, + } + } +\clist_map_inline:Nn \c_@@_all_envs_clist { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{before}, \texttt{after} and \texttt{first} keys}\label{key:before} +% +% \begin{macro}[int]{before, before*, after, first} +% Define and set \mykey{before}, \mykey{before*}, \mykey{after} and \mykey{first} keys +% for \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans} and \myenv*{keyans*} environments. +% \iffalse +%% Add |before|, |before*|, |after| and |first| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + before .tl_set:c = { l_@@_before_no_starred_key_#2_tl }, + before .value_required:n = true, + before* .tl_set:c = { l_@@_before_starred_key_#2_tl }, + before* .value_required:n = true, + after .tl_set:c = { l_@@_after_stop_list_#2_tl }, + after .value_required:n = true, + first .tl_set:c = { l_@@_after_list_args_#2_tl }, + first .value_required:n = true, + } + } +\clist_map_inline:Nn \c_@@_all_envs_clist { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for \texttt{before}, \texttt{after} and \texttt{first} keys in \env{enumext}} +% +% \begin{macro}{\@@_before_args_exec:,\@@_before_keys_exec:, +% \@@_after_stop_list:,\@@_after_args_exec:,} +% The function \cs{@@_before_args_exec:} executes the \mymarg{code} set by the +% \mykey{before*} key \emph{\enquote{before}} the \myenv*{enumext} +% environment is started. The \mymarg{code} is executed \emph{\enquote{without}} +% knowing any definition of the \mymarg{arg two} of the list: +% \mymarg[cbc=pkgcolor,ac=araracolor]{code}|\list|\mymarg{arg one}\mymarg{arg two}. +% \iffalse +%% Function for |before|, |before*|, |after| and |first| keys in |enumext|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_before_args_exec: + { + \tl_use:c { l_@@_before_starred_key_ \@@_level: _tl } + } +% \end{macrocode} +% The function \cs{@@_before_keys_exec:} executes the \mymarg{code} set by the +% \mykey{before} key \emph{\enquote{before}} the \myenv*{enumext} +% environment is started in \emph{second argument} of the list. The +% \mymarg{code} is executed \emph{\enquote{knowing}} +% all definition and values provides by \mymeta{keys}: +% |\list|\mymarg{arg one}|{|\mymeta{arg two}\mymarg[cbc=pkgcolor,ac=araracolor]{code}|}| +% \begin{macrocode} +\cs_new_protected:Nn \@@_before_keys_exec: + { + \tl_use:c { l_@@_before_no_starred_key_ \@@_level: _tl } + } +% \end{macrocode} +% The function \cs{@@_after_stop_list:} executes the \mymarg{code} set by the +% \mykey{after} key \emph{\enquote{after}} the \myenv*{enumext} +% environment has finished: |\endlist|\mymarg[cbc=pkgcolor,ac=araracolor]{code}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_after_stop_list: + { + \tl_use:c { l_@@_after_stop_list_ \@@_level: _tl } + } +% \end{macrocode} +% The function \cs{@@_after_args_exec:} executes the \mymarg{code} set by the +% \mykey{first} key after the end of the second argument of the list +% defining the \myenv*{enumext} environment, just before the first +% occurrence of |\item|: |\list|\mymarg{arg one}\mymarg{arg two}\mymarg[cbc=pkgcolor,ac=araracolor]{code}|\item|. +% \begin{macrocode} +\cs_new_protected:Nn \@@_after_args_exec: + { + \tl_use:c { l_@@_after_list_args_ \@@_level: _tl } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for \texttt{before}, \texttt{after} and \texttt{first} keys in \env{keyans}} +% +% \begin{macro}{\@@_before_args_exec_v:,\@@_before_keys_exec_v:, +% \@@_after_stop_list_v:, \@@_after_args_exec_v:} +% Same implementation as the one used in the \myenv*{enumext} environment. +% \iffalse +%% Function for |before|, |before*|, |after| and |first| keys in |keyans|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_before_args_exec_v: + { + \tl_use:N \l_@@_before_starred_key_v_tl + } +\cs_new_protected:Nn \@@_before_keys_exec_v: + { + \tl_use:N \l_@@_before_no_starred_key_v_tl + } +\cs_new_protected:Nn \@@_after_stop_list_v: + { + \tl_use:N \l_@@_after_stop_list_v_tl + } +\cs_new_protected:Nn \@@_after_args_exec_v: + { + \tl_use:N \l_@@_after_list_args_v_tl + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for \texttt{before}, \texttt{after} and \texttt{first} keys in \env{enumext*} and \env{keyans*}} +% +% \begin{macro}{\@@_before_args_exec_vii:,\@@_before_keys_exec_vii, +% \@@_after_stop_list_vii:, \@@_after_args_exec_vii:,} +% Same implementation as the one used in the \myenv*{enumext} environment. +% \iffalse +%% Function for |before|, |before*|, |after| and |first| keys in |enumext*| and |keyans*|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_before_args_exec_vii: + { + \tl_use:N \l_@@_before_starred_key_vii_tl + } +\cs_new_protected:Nn \@@_before_args_exec_viii: + { + \tl_use:N \l_@@_before_starred_key_viii_tl + } +\cs_new_protected:Nn \@@_before_keys_exec_vii: + { + \tl_use:N \l_@@_before_no_starred_key_vii_tl + } +\cs_new_protected:Nn \@@_before_keys_exec_viii: + { + \tl_use:N \l_@@_before_no_starred_key_viii_tl + } +\cs_new_protected:Nn \@@_after_stop_list_vii: + { + \tl_use:N \l_@@_after_stop_list_vii_tl + } +\cs_new_protected:Nn \@@_after_stop_list_viii: + { + \tl_use:N \l_@@_after_stop_list_viii_tl + } +\cs_new_protected:Nn \@@_after_args_exec_vii: + { + \tl_use:N \l_@@_after_list_args_vii_tl + } +\cs_new_protected:Nn \@@_after_args_exec_viii: + { + \tl_use:N \l_@@_after_list_args_viii_tl + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting keys for \env{multicols} and \env{minipage}}\label{key:mini-multi} +% +% \begin{macro}[int]{mini-env, mini-sep, columns-sep, columns} +% The default value of the \mykey{columns-sep} key is handled by +% the state of the boolean variable \myvarenv{l__@@_columns_sep_X_bool} +% which is handled in the internal definition of the \myenv*{enumext} +% and \myenv*{keyans} environments. +% Define and set \mykey{mini-env}, \mykey{mini-sep}, \mykey{columns-sep} +% and \mykey{columns} keys for \myenv*{enumext}, \myenv*{enumext*}, \myenv*{keyans} and +% \myenv*{keyans*} environments. +% \iffalse +%% Add |mini-env|, |mini-sep|, |columns-sep| and |columns| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + mini-env .dim_set:c = { l_@@_minipage_right_#2_dim }, + mini-env .value_required:n = true, + mini-sep .dim_set:c = { l_@@_minipage_hsep_#2_dim }, + mini-sep .initial:n = 0.3333em, + mini-sep .value_required:n = true, + columns-sep .dim_set:c = { l_@@_columns_sep_#2_dim }, + columns-sep .value_required:n = true, + columns .int_set:c = { l_@@_columns_#2_int }, + columns .initial:n = 1, + columns .value_required:n = true, + } + } +\clist_map_inline:Nn \c_@@_all_envs_clist { \@@_tmp:nn #1 } +% \end{macrocode} +% +% For \myenv*{enumext*} and \myenv*{keyans*} environments the situation +% is a bit different, the command \ics*{miniright} is not available, so we will add +% the keys \mykey{mini-right} and \mykey{mini-right*} to implement support for +% \myenv{minipage} environment. +% \iffalse +%% Add |mini-right| and |mini-right*| keys for starred environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + mini-right .tl_gset:c = { g_@@_miniright_code_#2_tl }, + mini-right .value_required:n = true, + mini-right* .code:n = { + \bool_gset_true:c { g_@@_minipage_center_#2_bool } + \keys_set:nn { enumext / #1 } { mini-right = {##1} } + }, + mini-right* .value_required:n = true, + } + } +\clist_map_inline:nn { {enumext*}{vii}, {keyans*}{viii} } { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% \subsection{Adjustment of vertical spaces for \env{multicols}} \label{vspace:multi} +% +% When nesting a \emph{\enquote{list environment}} inside the \myenv{multicols} environment, +% the values of the \emph{\enquote{vertical spaces}} are lost, basically the +% \myenv{multicols} environment takes control over them. Graphically it can +% be seen like in the figure \ref{fig:six}. +% +% \begin{figure}[!htbp] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[color=white] (7.0,6.10) rectangle (17.5,6.50) node[pos=.5,text=black] { \textcolor{blue}{\texttt{\textbackslash{}multicolsep [±\textbackslash{}topskip]}} };% space above +% \draw[color=white] (7.0,4.85) rectangle (17.5,5.25) node[pos=.5,text=black] { \textcolor{blue}{\texttt{\textbackslash{}multicolsep [±\textbackslash{}prevdepth?]}} };% space below +% \draw[color=white] (2.0,6.10) rectangle (5,6.50) node[pos=.5,text=optcolor,font=\footnotesize\ttfamily] { topsep };% topsep above +% \draw[color=white] (2.0,4.85) rectangle (5,5.25) node[pos=.5,text=optcolor,font=\footnotesize\ttfamily] { topsep };% topsep below +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{labelwidth}} (5.0,7.0); +% \draw[<->,color=gray] (5.0,7.0) --node[above,text=optcolor]{\texttt{labelsep}} (7.0,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,6.5) rectangle (5.0,6.85);% labelwidth +% \draw[->,color=lightgray,shorten >=3pt] (4.5,6.3) -- (7.0,6.3); % glue space = topsep (above) +% \draw[->,color=lightgray,shorten >=3pt] (4.5,5.05) -- (7.0,5.05); % glue space = topsep (above) +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,6.5) rectangle (7.0,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.5) rectangle (17.5,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,5.25) rectangle (11.5,6.10) node[pos=.5,text=black] +% {\begin{tabular}{c} +% \texttt{column one} \\ +% \textcolor{blue}{\emph{nested list or items}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (13.5,5.25) rectangle (17.5,6.10) node[pos=.5,text=black] +% {\begin{tabular}{c} +% \texttt{column two} \\ +% \textcolor{blue}{\emph{nested list or items}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,4.5) rectangle (5.0,4.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,4.5) rectangle (7.0,4.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,4.5) rectangle (17.5,4.85);% item width +% \end{tikzpicture} +% \caption{Representation of the vertical space in \myenv{multicols} for a nested level.} +% \label{fig:six} +% \end{figure} +% +% To keep the desired spaces \emph{above} and \emph{below} in the \emph{\enquote{list environment}} +% (|\topsep + [\partopsep]|) it is necessary to \emph{\enquote{adjust}} the spaces added +% by the \myenv{multicols} environment. +% The most appropriate option in this case is to use a \emph{\enquote{context sensitive}} +% vertical space with |\addvspace|. +% +% \smallskip +% +% \begin{important}* +% I should make it clear that the implementation here is a \emph{\enquote{bit +% questionable}}. At first glance doing |\multicolsep=\topsep| seemed right, but the results +% were not always as expected. An almost \emph{imperceptible} detail is that in some cases the +% |\itemsep| values of are \emph{\enquote{stretched}}, possibly due to +% the use of |\raggedcolumns| and this affects the lower space when +% closing the environment, which is \emph{\enquote{smaller}} than +% expected. My attempts to find the correct values using |\showoutput| and +% |\showboxdepth| absolutely failed. +% \end{important} +% +% \subsubsection{Adjustment of vertical spaces for \env{multicols} in \env{enumext}} +% +% +% \begin{macro}{\@@_multi_set_vskip:} +% The function \cs{@@_multi_set_vskip:} will take care of determining the +% \emph{\enquote{adjusted spaces}} that we will apply \emph{\enquote{above}} and +% \emph{\enquote{below}} the \myenv{multicols} environment in +% \myenv*{enumext}. +% +% \smallskip +% +% We will set the default values taking into account that \hologo{TeX} is +% in \mymeta{horizontal mode}, then we will make the settings for the +% \mymeta{vertical mode} in which |\partopsep| comes into play. +% +% \smallskip +% +% Set the values of \myvarenv{l__@@_multicols_above_X_skip} and \myvarenv{l__@@_multicols_below_X_skip} +% equal to the value of |\topsep| in the \emph{current level}. +% \iffalse +%% Adjustment of vertical spacing for |multicols| in |enumext|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_multi_set_vskip: + { + \skip_set:cn { l_@@_multicols_above_ \@@_level: _skip } + { + \skip_use:c { l_@@_topsep_ \@@_level: _skip } + } + \skip_set:cn { l_@@_multicols_below_ \@@_level: _skip } + { + \skip_use:c { l_@@_topsep_ \@@_level: _skip } + } + \@@_add_pre_parsep: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_add_pre_parsep:} +% The function \cs{@@_add_pre_parsep:} \emph{\enquote{adjusted}} the value +% of \myvarenv{l__@@_multicols_above_X_skip} detecting the value of +% \ics{parsep} from the previous level. This is necessary since +% \ics{parsep} from the previous level affects the \emph{vertical spaces}. +% \iffalse +%% Detect |\parsep| from previous level and adjust |\l_@@_multicols_above_X_skip| for |multicols| in |enumext|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_add_pre_parsep: + { + \int_case:nn { \l_@@_level_int } + { + { 2 }{ + \skip_if_eq:nnF { \l_@@_parsep_i_skip } { \c_zero_skip } + { + \skip_add:Nn \l_@@_multicols_above_ii_skip + { + \l_@@_parsep_i_skip + } + } + } + { 3 }{ + \skip_if_eq:nnF { \l_@@_parsep_ii_skip } { \c_zero_skip } + { + \skip_add:Nn \l_@@_multicols_above_iii_skip + { + \l_@@_parsep_ii_skip + } + } + } + { 4 }{ + \skip_if_eq:nnF { \l_@@_parsep_iii_skip } { \c_zero_skip } + { + \skip_add:Nn \l_@@_multicols_above_iv_skip + { + \l_@@_parsep_iii_skip + } + } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_multi_addvspace:} +% The function \cs{@@_multi_addvspace:} will apply the spaces set using +% |\addvspace| \emph{\enquote{above}} the \myenv{multicols} environment +% in \myenv*{enumext}, taking into account whether \hologo{TeX} is in +% \mymeta{horizontal mode} or \mymeta{vertical mode}. +% \iffalse +%% Add vertical spacing for |multicols| in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_multi_addvspace: + { + \@@_multi_set_vskip: + \mode_if_vertical:T + { + \skip_add:cn { l_@@_multicols_above_ \@@_level: _skip } + { + \skip_use:c { l_@@_partopsep_ \@@_level: _skip } + } + \skip_add:cn { l_@@_multicols_below_ \@@_level: _skip } + { + \skip_use:c { l_@@_partopsep_ \@@_level: _skip } + } + } + \par\nopagebreak + \addvspace{ \skip_use:c { l_@@_multicols_above_ \@@_level: _skip } } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Adjustment of vertical spaces for \env{multicols} in \env{keyans}} +% +% \begin{macro}{\@@_keyans_multi_set_vskip:, \@@_keyans_multi_addvspace:} +% The function \cs{@@_keyans_multi_set_vskip:} will take care of determining the +% \emph{\enquote{adjusted spaces}} that we will apply \emph{\enquote{above}} and +% \emph{\enquote{below}} the \myenv{multicols} environment in +% \myenv*{keyans}. The implementation of this function is the same +% as the one used in \myenv*{enumext}. +% \iffalse +%% Adjustment of vertical spacing for |multicols| in |keyans| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_multi_set_vskip: + { + \skip_set:Nn \l_@@_multicols_above_v_skip + { + \l_@@_topsep_v_skip + } + \skip_set:Nn \l_@@_multicols_below_v_skip + { + \l_@@_topsep_v_skip + } + } +\cs_new_protected:Nn \@@_keyans_multi_addvspace: + { + \@@_keyans_multi_set_vskip: + \mode_if_vertical:T + { + \skip_add:Nn \l_@@_multicols_above_v_skip + { + \skip_use:N \l_@@_partopsep_v_skip + } + \skip_add:Nn \l_@@_multicols_below_v_skip + { + \skip_use:N \l_@@_partopsep_v_skip + } + } + \par\nopagebreak + \addvspace{ \l_@@_multicols_above_v_skip } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Adjustment of vertical spaces for \env{minipage}}\label{vspace:minipage} +% +% When nesting a \emph{\enquote{list environment}} within the \myenv{minipage} environment, +% the values of the \emph{\enquote{vertical spaces}} are lost. Graphically it can +% be seen like in the figure \ref{fig:seven}. +% +% \begin{figure}[!htbp] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[color=white] (7.0,6.10) rectangle (12.5,6.5) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{space above left}} };% space above left +% \draw[color=white] (13.5,6.10) rectangle (17.5,6.5) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{space above right}} };% space above right +% \draw[color=white] (7.0,4.85) rectangle (17.5,5.25) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{space below minipage's}} };% space below after second +% \draw[color=white] (2.0,6.10) rectangle (5,6.50) node[pos=.5,text=optcolor,font=\footnotesize\ttfamily] { topsep };% topsep above +% \draw[color=white] (2.0,4.85) rectangle (5,5.25) node[pos=.5,text=optcolor,font=\footnotesize\ttfamily] { topsep };% topsep below +% \draw[->,color=lightgray,shorten >=3pt] (4.5,6.3) -- (7.0,6.3); % glue space = topsep (above) +% \draw[->,color=lightgray,shorten >=3pt] (4.5,5.05) -- (7.0,5.05); % glue space = topsep (above) +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{labelwidth}} (5.0,7.0); +% \draw[<->,color=gray] (5.0,7.0) --node[above,text=optcolor]{\texttt{labelsep}} (7.0,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,6.5) rectangle (5.0,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,6.5) rectangle (7.0,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.5) rectangle (17.5,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,5.25) rectangle (12.5,6.10) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage left [t]} \\ +% \textcolor{blue}{\emph{nested list}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (13.5,5.25) rectangle (17.5,6.10) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage right [t]} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,4.5) rectangle (5.0,4.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,4.5) rectangle (7.0,4.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,4.5) rectangle (17.5,4.85);% item width +% \end{tikzpicture} +% \caption{Representation of the \myenv{minipage} spacing adjustment for a nested level.} +% \label{fig:seven} +% \end{figure} +% +% Since we want to keep the \emph{\enquote{left}} and \emph{\enquote{right}} +% environments \emph{\enquote{aligned on top}}, preserving the \ics{baselineskip} +% and keep the desired \emph{\enquote{spaces}} (|\topsep + [\partopsep]|) it is necessary +% to \emph{\enquote{adjust}} the \emph{\enquote{vertical spaces}} +% for \myenv{minipage} environments. +% +% \smallskip +% +% Here there are several complications that we must circumvent, the +% \myenv{minipage} environment eliminates the \enquote{top} spaces, the \myenv{multicols} +% environment can be nested in the \myenv{minipage} environment, the \enquote{top} and +% \enquote{bottom} spaces are affected when |topsep=|\mydim{0pt} and to this is added the +% |\partopsep| parameter that comes into action according to whether \hologo{TeX} +% is in \mymeta{horizontal mode} or \mymeta{vertical mode}. Depending on these cases, small +% adjustments must be made using |\vspace| and |\addvspace| to +% obtain the \emph{\enquote{desired vertical spacing}}. +% +% \smallskip +% +% \begin{important}* +% Again I must make clear that the implementation here is a \emph{\enquote{bit +% questionable}}, but hunting the spaces (|glue|) produced by the \myenv{minipage} +% environment is quite complicated, even more if \myenv{multicols} it is nested. +% The setting of the values was more \emph{\enquote{trial and error}} +% (aprox to |\strutbox|), using the help of the \mypkg{lua-visual-debug}\cite{luavisual} +% package, again my attempts to find the correct values using |\showoutput| and +% |\showboxdepth| absolutely failed. +% \end{important} +% +% \subsubsection{Adjustment of vertical spaces for \env{minipage} in \env{enumext}} +% +% \begin{macro}{\@@_minipage_set_skip:, \@@_minipage_add_space:} +% The function \cs{@@_minipage_set_skip:} will take care of determining the +% \emph{\enquote{adjust}} spaces that we will apply \emph{\enquote{above}} and +% \emph{\enquote{below}} the \myvarenv*{__@@_mini_page} environment in +% \myenv*{enumext}. +% +% \smallskip +% +% First we will set the value of \cs{l_@@_minipage_right_skip} equal to +% |\topsep|, then we will see if \hologo{TeX} is in \mymeta{vertical mode} and we +% will add |\partopsep|, followed by that we set the value of \cs{l_@@_minipage_after_skip}. +% \iffalse +%% Adjustment of vertical spacing for |minipage| in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_minipage_set_skip: + { + \skip_set:Nn \l_@@_minipage_right_skip + { + \skip_use:c { l_@@_topsep_ \@@_level: _skip } + } + \mode_if_vertical:T + { + \skip_add:Nn \l_@@_minipage_right_skip + { + \skip_use:c { l_@@_partopsep_ \@@_level: _skip } + } + } + \skip_set_eq:NN \l_@@_minipage_after_skip \l_@@_minipage_right_skip +% \end{macrocode} +% We will adjust the values \cs[no-index]{l_@@_multicols_above_X_skip} +% and \cs[no-index]{l_@@_multicols_below_X_skip} and call the function +% \cs{@@_pre_itemsep_skip:}. +% \begin{macrocode} + \skip_set_eq:cN + { l_@@_multicols_above_ \@@_level: _skip } \l_@@_minipage_right_skip + \skip_set_eq:cN + { l_@@_multicols_below_ \@@_level: _skip } \l_@@_minipage_right_skip + \@@_pre_itemsep_skip: +% \end{macrocode} +% If the environment \myenv{multicols} is active, we set |\topskip=|\mydim{0pt} +% and then we make |\multicolsep| have the same value as \cs[no-index]{l_@@_multicols_above_X_skip}. +% \begin{macrocode} + \int_compare:nNnT + { \int_use:c { l_@@_columns_ \@@_level: _int } } > { 1 } + { + \skip_zero:N \topskip + \skip_set_eq:Nc \multicolsep { l_@@_multicols_above_ \@@_level: _skip } + } + } +% \end{macrocode} +% The function \cs{@@_minipage_add_space:} will apply the spaces on the \emph{\enquote{left side}} using +% |\addvspace| \emph{\enquote{above}} the \myvarenv*{__@@_mini_page} +% environment, taking into account whether \hologo{TeX} is in +% \mymeta{horizontal mode} or \mymeta{vertical mode}. Here we use the plain \hologo{TeX} macro +% |\nointerlineskip| to prevent baseline \emph{\enquote{glue}} being +% added between the next pair of boxes in a \emph{vertical list}. For the latter we +% will make some adjustments since the |\partopsep| parameter comes into +% play and this affects the \emph{vertical spacing}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_minipage_add_space: + { + \@@_minipage_set_skip: + \@@_unskip_unkern: + \mode_if_vertical:TF + { + \nopagebreak\nointerlineskip + } + { + \par\nopagebreak\nointerlineskip + \skip_zero:c { l_@@_partopsep_ \@@_level: _skip } + } + \int_compare:nNnTF + { \int_use:c { l_@@_columns_ \@@_level: _int } } > { 1 } + { + \addvspace{ 0.445\box_ht:N \strutbox } + } + { + \addvspace{ 0.250\box_ht:N \strutbox } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_pre_itemsep_skip:} +% The function \cs{@@_pre_itemsep_skip:} will adjust the spaces below the +% environment \myenv{minipage} and the environment \myenv{multicols} if +% it is nested in it, taking into account the value of |\itemsep| from +% the previous level. +% \begin{macrocode} +\cs_new_protected:Nn \@@_pre_itemsep_skip: + { + \int_case:nn { \l_@@_level_int } + { + { 2 }{ + \skip_if_eq:nnTF + { \l_@@_itemsep_i_skip } { \l_@@_minipage_after_skip } + { + \skip_set:Nn \l_@@_minipage_after_skip { 0.150\box_ht:N \strutbox } + \skip_set:Nn \l_@@_multicols_below_ii_skip { 0.350\box_ht:N \strutbox } + } + { + \dim_compare:nNnT + { \l_@@_itemsep_i_skip } < { \l_@@_minipage_after_skip } + { + \skip_sub:Nn + \l_@@_minipage_after_skip { \l_@@_itemsep_i_skip } + \skip_sub:Nn + \l_@@_multicols_below_ii_skip { \l_@@_itemsep_i_skip } + \skip_add:Nn + \l_@@_minipage_after_skip { 0.150\box_ht:N \strutbox } + \skip_add:Nn + \l_@@_multicols_below_ii_skip { 0.350\box_ht:N \strutbox } + } + \dim_compare:nNnT + { \l_@@_itemsep_i_skip } > { \l_@@_minipage_after_skip } + { + \skip_set:Nn \l_@@_minipage_temp_skip + { + \l_@@_itemsep_i_skip - \l_@@_minipage_after_skip + } + \skip_sub:Nn + \l_@@_minipage_after_skip { \l_@@_itemsep_i_skip } + \skip_sub:Nn + \l_@@_multicols_below_ii_skip { \l_@@_itemsep_i_skip } + \skip_add:Nn + \l_@@_minipage_after_skip + { 0.150\box_ht:N \strutbox + \l_@@_minipage_temp_skip } + \skip_add:Nn + \l_@@_multicols_below_ii_skip + { 0.350\box_ht:N \strutbox + \l_@@_minipage_temp_skip } + } + } + } + { 3 }{ + \skip_if_eq:nnTF + { \l_@@_itemsep_ii_skip } { \c_zero_skip } + { + \skip_set:Nn \l_@@_minipage_after_skip { 0.150\box_ht:N \strutbox } + \skip_set:Nn \l_@@_multicols_below_iii_skip { 0.350\box_ht:N \strutbox } + } + { + \dim_compare:nNnT + { \l_@@_itemsep_ii_skip } < { \l_@@_minipage_after_skip } + { + \skip_sub:Nn + \l_@@_minipage_after_skip { \l_@@_itemsep_ii_skip } + \skip_sub:Nn + \l_@@_multicols_below_iii_skip { \l_@@_itemsep_ii_skip } + \skip_add:Nn + \l_@@_minipage_after_skip { 0.150\box_ht:N \strutbox } + \skip_add:Nn + \l_@@_multicols_below_iii_skip { 0.350\box_ht:N \strutbox } + } + \dim_compare:nNnT + { \l_@@_itemsep_ii_skip } > { \l_@@_minipage_after_skip } + { + \skip_set:Nn \l_@@_minipage_temp_skip + { + \l_@@_itemsep_ii_skip - \l_@@_minipage_after_skip + } + \skip_sub:Nn + \l_@@_minipage_after_skip { \l_@@_itemsep_ii_skip } + \skip_sub:Nn + \l_@@_multicols_below_iii_skip { \l_@@_itemsep_ii_skip } + \skip_add:Nn + \l_@@_minipage_after_skip + { 0.150\box_ht:N \strutbox + \l_@@_minipage_temp_skip } + \skip_add:Nn + \l_@@_multicols_below_iii_skip + { 0.350\box_ht:N \strutbox + \l_@@_minipage_temp_skip } + } + } + } + { 4 }{ + \skip_if_eq:nnTF { \l_@@_itemsep_iii_skip } { \c_zero_skip } + { + \skip_set:Nn \l_@@_minipage_after_skip { 0.150\box_ht:N \strutbox } + \skip_set:Nn \l_@@_multicols_below_iv_skip { 0.350\box_ht:N \strutbox } + } + { + \dim_compare:nNnT + { \l_@@_itemsep_iii_skip } < { \l_@@_minipage_after_skip } + { + \skip_sub:Nn + \l_@@_minipage_after_skip { \l_@@_itemsep_iii_skip } + \skip_sub:Nn + \l_@@_multicols_below_iv_skip { \l_@@_itemsep_iii_skip } + \skip_add:Nn + \l_@@_minipage_after_skip { 0.150\box_ht:N \strutbox } + \skip_add:Nn + \l_@@_multicols_below_iv_skip { 0.350\box_ht:N \strutbox } + } + \dim_compare:nNnT + { \l_@@_itemsep_iii_skip } > { \l_@@_minipage_after_skip } + { + \skip_set:Nn \l_@@_minipage_temp_skip + { + \l_@@_itemsep_iii_skip - \l_@@_minipage_after_skip + } + \skip_sub:Nn + \l_@@_minipage_after_skip { \l_@@_itemsep_iii_skip } + \skip_sub:Nn + \l_@@_multicols_below_iv_skip { \l_@@_itemsep_iii_skip } + \skip_add:Nn + \l_@@_minipage_after_skip + { 0.150\box_ht:N \strutbox + \l_@@_minipage_temp_skip } + \skip_add:Nn + \l_@@_multicols_below_iv_skip + { 0.350\box_ht:N \strutbox + \l_@@_minipage_temp_skip } + } + } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Adjustment of vertical spaces for \env{minipage} in \env{keyans}} +% +% \begin{macro}{\@@_keyans_minipage_set_skip:, \@@_keyans_minipage_add_space:, \@@_keyans_pre_itemsep_skip:} +% The function \cs{@@_keyans_mini_set_vskip:} will take care of determining the +% \enquote{adjusted} spaces that we will apply \emph{\enquote{above}} and +% \emph{\enquote{below}} the \myvarenv*{__@@_mini_page} environment in +% \myenv*{keyans}. The implementation of this function is the same +% as the one used in \myenv*{enumext}. +% \iffalse +%% Adjustment of vertical spacing for |minipage| in |keyans| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_minipage_set_skip: + { + \skip_zero:N \l_@@_minipage_after_skip + \skip_zero:N \l_@@_minipage_left_skip + \skip_zero:N \l_@@_minipage_right_skip + \skip_set:Nn \l_@@_minipage_right_skip + { + \l_@@_topsep_v_skip + } + \mode_if_vertical:T + { + \skip_add:Nn \l_@@_minipage_right_skip + { + \l_@@_partopsep_v_skip + } + } + \skip_set_eq:NN \l_@@_minipage_after_skip \l_@@_minipage_right_skip + \skip_set_eq:NN \l_@@_multicols_above_v_skip \l_@@_minipage_right_skip + \skip_set_eq:NN \l_@@_multicols_below_v_skip \l_@@_minipage_right_skip + \@@_keyans_pre_itemsep_skip: + \int_compare:nNnT { \l_@@_columns_v_int } > { 1 } + { + \skip_zero:N \topskip + \skip_set_eq:NN \multicolsep \l_@@_minipage_right_skip + } + } +\cs_new_protected:Nn \@@_keyans_minipage_add_space: + { + \@@_keyans_minipage_set_skip: + \@@_unskip_unkern: + \mode_if_vertical:TF + { + \nopagebreak\nointerlineskip + } + { + \par\nopagebreak\nointerlineskip + \skip_zero:N \l_@@_partopsep_v_skip + } + \int_compare:nNnTF { \l_@@_columns_v_int } > { 1 } + { + \addvspace{ 0.445\box_ht:N \strutbox } + } + { + \addvspace{ 0.250\box_ht:N \strutbox } + } + } +\cs_new_protected:Nn \@@_keyans_pre_itemsep_skip: + { + \skip_if_eq:nnTF + { \l_@@_itemsep_i_skip } { \l_@@_minipage_after_skip } + { + \skip_set:Nn \l_@@_minipage_after_skip { 0.150\box_ht:N \strutbox } + \skip_set:Nn \l_@@_multicols_below_v_skip { 0.350\box_ht:N \strutbox } + } + { + \dim_compare:nNnT + { \l_@@_itemsep_i_skip } < { \l_@@_minipage_after_skip } + { + \skip_sub:Nn \l_@@_minipage_after_skip { \l_@@_itemsep_i_skip } + \skip_sub:Nn \l_@@_multicols_below_v_skip { \l_@@_itemsep_i_skip } + \skip_add:Nn \l_@@_minipage_after_skip { 0.150\box_ht:N \strutbox } + \skip_add:Nn \l_@@_multicols_below_v_skip { 0.350\box_ht:N \strutbox } + } + \dim_compare:nNnT + { \l_@@_itemsep_i_skip } > { \l_@@_minipage_after_skip } + { + \skip_set:Nn \l_@@_minipage_temp_skip + { + \l_@@_itemsep_i_skip - \l_@@_minipage_after_skip + } + \skip_sub:Nn \l_@@_minipage_after_skip { \l_@@_itemsep_i_skip } + \skip_sub:Nn \l_@@_multicols_below_v_skip { \l_@@_itemsep_i_skip } + \skip_add:Nn \l_@@_minipage_after_skip + { 0.150\box_ht:N \strutbox + \l_@@_minipage_temp_skip } + \skip_add:Nn \l_@@_multicols_below_v_skip + { 0.350\box_ht:N \strutbox + \l_@@_minipage_temp_skip } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Adjustment of vertical spaces for \env{minipage} in \env{enumext*} and \env{keyans*}} +% +% \begin{macro}{\@@_mini_set_vskip_vii:,\@@_mini_set_vskip_viii:} +% The functions \cs{@@_mini_set_vskip_vii:} and \cs{@@_mini_set_vskip_viii:} will take care of determining the +% \enquote{adjusted} spaces that we will apply \emph{\enquote{above}} and +% \emph{\enquote{below}} the \myvarenv*{__@@_mini_page} environment in +% \myenv*{enumext*} and \myenv*{keyans*}. +% \iffalse +%% Adjustment of vertical spacing for |minipage| in |enumext*| and |keyans*|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_mini_set_vskip_vii: + { + \skip_zero_new:N \l_@@_minipage_left_skip + \skip_gzero_new:N \g_@@_minipage_right_skip + \skip_gzero_new:N \g_@@_minipage_after_skip + \skip_if_eq:nnTF { \l_@@_topsep_vii_skip } { \c_zero_skip } + { + \skip_set:Nn \l_@@_minipage_left_skip { 0.5\box_dp:N \strutbox } + \skip_gset:Nn \g_@@_minipage_right_skip { 0.325\box_dp:N \strutbox } + } + { + \skip_set:Nn \l_@@_minipage_left_skip { 0.5875\box_dp:N \strutbox } + \skip_gset:Nn \g_@@_minipage_right_skip + { + \l_@@_topsep_vii_skip + } + \skip_gset:Nn \g_@@_minipage_after_skip + { + 0.325\box_dp:N \strutbox + \l_@@_topsep_vii_skip + } + } + } +\cs_new_protected:Nn \@@_mini_set_vskip_viii: + { + \skip_zero_new:N \l_@@_minipage_after_skip + \skip_zero_new:N \l_@@_minipage_left_skip + \skip_zero_new:N \l_@@_minipage_right_skip + \skip_if_eq:nnTF { \l_@@_topsep_viii_skip } { \c_zero_skip } + { + \skip_set:Nn \l_@@_minipage_left_skip + { + 0.5\box_dp:N \strutbox + } + \skip_set:Nn \l_@@_minipage_right_skip + { + \l_@@_partopsep_viii_skip + } + \skip_set:Nn \l_@@_minipage_after_skip + { + 1.6\box_dp:N \strutbox + } + } + { + \skip_set:Nn \l_@@_minipage_left_skip + { + 0.5875\box_dp:N \strutbox + } + \skip_set:Nn \l_@@_minipage_right_skip + { + \l_@@_topsep_viii_skip + } + \skip_set:Nn \l_@@_minipage_after_skip + { + 0.325\box_dp:N \strutbox + \l_@@_topsep_viii_skip + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_mini_addvspace_vii:,\@@_mini_addvspace_viii:} +% The functions \cs{@@_mini_addvspace_vii:} and +% \cs{@@_mini_addvspace_viii:} will apply the vertical space +% \emph{\enquote{only above}} the \myvarenv*{__@@_mini_page} environment on +% the \emph{left side} when the \mykey{mini-right} key is active in the +% \myenv*{enumext*} and \myenv*{keyans*} environments. +% +% Here we will NOT take into account whether \hologo{TeX} is in +% \mymeta{horizontal mode} or \mymeta{vertical mode}, since |\partopsep| +% is equal to \mydim{0pt} in both environments. +% \iffalse +%% Apply \addvspace above minipage for |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_mini_addvspace_vii: + { + \@@_mini_set_vskip_vii: + \par\nopagebreak + \addvspace { \l_@@_minipage_left_skip } + } +\cs_new_protected:Nn \@@_mini_addvspace_viii: + { + \@@_mini_set_vskip_viii: + \par\nopagebreak + \addvspace { \l_@@_minipage_left_skip } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The command \cs{miniright}}\label{cmd:miniright} +% +% The command \ics*{miniright} will close the \myvarenv*{__@@_mini_page} +% environment on the \emph{\enquote{left side}}, open the \myvarenv*{__@@_mini_page} +% environment on the \emph{\enquote{right side}} adding the \emph{adjusted vertical space}. +% By default we will add |\centering| when starting the \emph{\enquote{right side}} +% environment. The \emph{starred argument} ‘|*|’ inhibits the use of |\centering| +% command i.e. the usual \hologo{LaTeX} justification is maintained in +% the \myvarenv*{__@@_mini_page} on the \emph{\enquote{right side}}. +% +% \begin{macro}{\miniright} +% First we will perform some checks to prevent the command from being +% executed outside the \myenv*{enumext} environment or somewhere +% inappropriate then we will call the internal functions to execute it in +% the \myenv*{enumext} and \myenv*{keyans} environments. +% \iffalse +%% Definition of |\miniright| command. +% \fi +% \begin{macrocode} +\NewDocumentCommand \miniright { s } + { + \int_compare:nNnT { \l_@@_keyans_pic_level_int } = { 1 } + { + \msg_error:nnn { enumext } { wrong-miniright-place } + } + % outside + \bool_lazy_and:nnT + { \int_compare_p:nNn { \l_@@_level_int } = { 0 } } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 0 } } + { + \msg_error:nnn { enumext } { wrong-miniright-place } + } + % starred env + \bool_lazy_and:nnT + { \bool_if_p:N \g_@@_starred_bool } + { \bool_not_p:n { \l_@@_standar_bool } } + { + \msg_error:nnn { enumext } { wrong-miniright-starred } + } + % exec + \int_compare:nNnTF { \l_@@_keyans_level_int } = { 1 } + { + \@@_keyans_mini_right_cmd:n {#1} + } + { \@@_mini_right_cmd:n {#1} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_mini_right_cmd:n} +% The function \cs{@@_mini_right_cmd:n} takes as argument the \emph{starred} ‘|*|’ +% of the \ics*{miniright} command in the \myenv*{enumext} environment. +% We check if the \mykey{mini-env} key is active via the variable +% \myvarenv{l__@@_minipage_right_X_dim}, if so we close the +% \myenv{multicols} environment with the \myvarenv*{__@@_mini_page} +% environment on the \emph{\enquote{left side}}, then we open the +% \myvarenv*{__@@_mini_page} environment on the \emph{\enquote{right +% side}}, apply our adjusted \emph{\enquote{vertical spaces}}, followed by +% adding the |\centering| command when the \emph{starred argument} ‘|*|’ is not +% present and set zero \myvarenv{g__@@_minipage_stat_int}, otherwise we return an error. +% \iffalse +%% Internal function for |\miniright| command in enumext. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_mini_right_cmd:n #1 + { + \dim_compare:nNnTF + { \dim_use:c { l_@@_minipage_right_ \@@_level: _dim } } > { \c_zero_dim } + { + \@@_multicols_stop: + \int_compare:nNnT + { \int_use:c { l_@@_columns_ \@@_level: _int } } = { 1 } + { + \par\addvspace{ \l_@@_minipage_after_skip } + } + \end@@_mini_page + \hfill + \@@_mini_page{ \dim_use:c { l_@@_minipage_right_ \@@_level: _dim } } + \par\nointerlineskip + \addvspace { \l_@@_minipage_right_skip } + \bool_if:nF {#1} + { + \centering + } + \int_gzero:N \g_@@_minipage_stat_int + } + { \msg_error:nnn { enumext } { wrong-miniright-use } } + % paranoia + \RenewDocumentCommand \miniright { s } + { + \msg_error:nn { enumext } { many-miniright-used } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_keyans_mini_right_cmd:n} +% The function \cs{@@_keyans_mini_right_cmd:n} takes as argument the \emph{starred} ‘|*|’ +% of the \ics*{miniright} command in the \myenv*{keyans} +% environment. The implementation of this function is the same as that of +% the \cs{@@_mini_right_cmd:n} function of the \myenv*{enumext} +% environment. +% \iffalse +%% Internal function for |\miniright| command in keyans. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_mini_right_cmd:n #1 + { + \dim_compare:nNnTF { \l_@@_minipage_right_v_dim } > { \c_zero_dim } + { + \@@_keyans_multicols_stop: + \int_compare:nNnT { \l_@@_columns_v_int } = { 1 } + { + \par\addvspace{ \l_@@_minipage_after_skip } + } + \end@@_mini_page + \hfill + \@@_mini_page{ \l_@@_minipage_right_v_dim } + \par\nointerlineskip + \addvspace { \l_@@_minipage_right_skip } + \bool_if:nF {#1} + { + \centering + } + \int_gzero:N \g_@@_minipage_stat_int + } + { \msg_error:nnn { enumext } { wrong-miniright-use } } + % paranoia + \RenewDocumentCommand \miniright { s } + { + \msg_error:nn { enumext } { many-miniright-used } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{above} and \texttt{below} keys} +% +% While having controlled the \emph{vertical spaces} within +% the \myenv*{enumext} and \myenv*{keyans} environments when using the +% \mykey{columns} or \mykey{mini-env} keys, sometimes the +% \emph{\enquote{vertical spaces above}} or \emph{\enquote{vertical spaces below}} the environments are +% not as expected and it is necessary to be able to apply a +% \emph{\enquote{fine correction}} to these. As I have not been able to +% correct these \emph{glitches}, the best option is to leave a couple of +% \mymeta{keys} dedicated to this purpose, in this case it is best to use +% |\vspace| or |\vspace*| when convenient. +% +% \begin{macro}[int]{above, above*, below, below*} +% Define \mykey{above}, \mykey{above*}, \mykey{below} and \mykey{below*} keys for +% \myenv*{enumext} and \myenv*{keyans} environments. +% \iffalse +%% Add |above| and |below| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + above .skip_set:c = { l_@@_vspace_above_#2_skip }, + above .value_required:n = true, + above* .code:n = \bool_set_true:c { l_@@_vspace_a_star_#2_bool } + \keys_set:nn { enumext / #1 } { above = {##1} }, + above* .value_required:n = true, + below .skip_set:c = { l_@@_vspace_below_#2_skip }, + below .value_required:n = true, + below* .code:n = \bool_set_true:c { l_@@_vspace_b_star_#2_bool } + \keys_set:nn { enumext / #1 } { below = {##1} }, + below* .value_required:n = true, + } + } +\clist_map_inline:Nn \c_@@_all_envs_clist { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for \texttt{above} and \texttt{below} keys in \env{enumext}} +% +% \iffalse +%% Function for |above|, |above*|, |below| and |below*| keys in |enumext|. +% \fi +% \begin{macro}{\@@_vspace_above:,} +% The function \cs{@@_vspace_above:} apply the \emph{vertical space above} +% the \myenv*{enumext} environment set by the \mykey{above*} and \mykey{above} keys. +% \begin{macrocode} +\cs_new_protected:Nn \@@_vspace_above: + { + \skip_if_eq:nnF + { \skip_use:c { l_@@_vspace_above_ \@@_level: _skip } } { \c_zero_skip } + { + \bool_if:cTF { l_@@_vspace_a_star_ \@@_level: _bool } + { + \vspace*{ \skip_use:c { l_@@_vspace_above_ \@@_level: _skip } } + } + { + \vspace { \skip_use:c { l_@@_vspace_above_ \@@_level: _skip } } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_vspace_below:} +% The function \cs{@@_vspace_below:} apply the \emph{vertical space below} +% the \myenv*{enumext} environment set by the \mykey{below*} and \mykey{below} keys. +% \begin{macrocode} +\cs_new_protected:Nn \@@_vspace_below: + { + \skip_if_eq:nnF + { \skip_use:c { l_@@_vspace_below_ \@@_level: _skip } } { \c_zero_skip } + { + \bool_if:cTF { l_@@_vspace_b_star_ \@@_level: _bool } + { + \vspace*{ \skip_use:c { l_@@_vspace_below_ \@@_level: _skip } } + } + { + \vspace { \skip_use:c { l_@@_vspace_below_ \@@_level: _skip } } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for \texttt{above} and \texttt{below} keys in \env{keyans}} +% +% \begin{macro}{\@@_vspace_above_v:,} +% The function \cs{@@_vspace_above_v:} apply the \emph{vertical space above} +% the \myenv*{keyans} environment set by the \mykey{above} and \mykey{above*} keys. +% \iffalse +%% Function for |above|, |above*|, |below| and |below*| keys in |keyans|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_vspace_above_v: + { + \skip_if_eq:nnF { \l_@@_vspace_above_v_skip } { \c_zero_skip } + { + \bool_if:NTF \l_@@_vspace_a_star_v_bool + { + \vspace*{ \l_@@_vspace_above_v_skip } + } + { \vspace { \l_@@_vspace_above_v_skip } } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_vspace_below_v:} +% The function \cs{@@_vspace_below_v:} apply the \emph{vertical space below} +% the \myenv*{keyans} environment set by the \mykey{below*} and \mykey{below} keys. +% \begin{macrocode} +\cs_new_protected:Nn \@@_vspace_below_v: + { + \skip_if_eq:nnF { \l_@@_vspace_below_v_skip } { \c_zero_skip } + { + \bool_if:NTF \l_@@_vspace_b_star_v_bool + { + \vspace*{ \l_@@_vspace_below_v_skip } + } + { \vspace { \l_@@_vspace_below_v_skip } } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for \texttt{above} and \texttt{below} keys in \env{enumext*} \env{keyans*}} +% +% \begin{macro}{\@@_vspace_above_vii:,\@@_vspace_above_viii:} +% The functions \cs{@@_vspace_above_vii:} and \cs{@@_vspace_above_viii:} apply the \emph{vertical space above} +% the \myenv*{enumext*} and \myenv*{keyans*} environments set by the \mykey{above} and \mykey{above*} keys. +% \iffalse +%% Function for |above|, |above*|, |below| and |below*| keys in |enumext*| and |keyans*|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_vspace_above_vii: + { + \skip_if_eq:nnF { \l_@@_vspace_above_vii_skip } { \c_zero_skip } + { + \bool_if:NTF \l_@@_vspace_a_star_vii_bool + { + \vspace*{ \l_@@_vspace_above_vii_skip } + } + { \vspace { \l_@@_vspace_above_vii_skip } } + } + } +\cs_new_protected:Nn \@@_vspace_above_viii: + { + \skip_if_eq:nnF { \l_@@_vspace_above_viii_skip } { \c_zero_skip } + { + \bool_if:NTF \l_@@_vspace_a_star_viii_bool + { + \vspace*{ \l_@@_vspace_above_viii_skip } + } + { \vspace { \l_@@_vspace_above_viii_skip } } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_vspace_below_vii:, \@@_vspace_below_viii:} +% The functions \cs{@@_vspace_below_vii:} and \cs{@@_vspace_below_viii:} +% apply the \emph{vertical space below} the \myenv*{enumext*} and +% \myenv*{keyans*} environments set by the \mykey{below*} and \mykey{below} keys. +% \begin{macrocode} +\cs_new_protected:Nn \@@_vspace_below_vii: + { + \skip_if_eq:nnF { \l_@@_vspace_below_vii_skip } { \c_zero_skip } + { + \bool_if:NTF \l_@@_vspace_b_star_vii_bool + { + \vspace*{ \l_@@_vspace_below_vii_skip } + } + { \vspace { \l_@@_vspace_below_vii_skip } } + } + } +\cs_new_protected:Nn \@@_vspace_below_viii: + { + \skip_if_eq:nnF { \l_@@_vspace_below_viii_skip } { \c_zero_skip } + { + \bool_if:NTF \l_@@_vspace_b_star_viii_bool + { + \vspace*{ \l_@@_vspace_below_viii_skip } + } + { \vspace { \l_@@_vspace_below_viii_skip } } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{series}, \texttt{resume} and \texttt{resume*} keys}\label{key:series} +% +% The \mykey{series} key is responsible for the whole process of the +% \mykey{resume} and \mykey{resume*} keys. The idea behind this is to be +% able to absorb the \mymeta{keys} passed to the \emph{optional argument} of the +% \emph{\enquote{first level}} of the environments \myenv*{enumext} and \myenv*{enumext*}, but, discarding some specific +% \mymeta{keys}. This implementation is adapted directly from the code +% provided by Jonathan P. Spratte \texttt(@Skillmon) in \href{https://chat.stackexchange.com/transcript/41?m=65647962#65647962}{chat-TeX-SX} +% +% \begin{macro}[int]{series, resume, resume*, } +% We define the keys \mykey{series}, \mykey{resume} +% and \mykey{resume*} only for the \emph{\enquote{first level}} +% of \myenv*{enumext} and \myenv*{enumext*}. +% \iffalse +%% Add |series|, |resume| and |resume*| keys only on first level off |enumext| and |enumext*|. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / #1 } + { + series .str_set:N = \l_@@_series_str, + series .value_required:n = true, + resume .code:n = \@@_resume_series:n {##1}, + resume* .code:n = \@@_resume_starred:, + resume* .value_forbidden:n = true, + } + } +\clist_map_inline:nn { level-1, enumext* } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Internal functions for \texttt{series} key} +% +% \begin{macro}{\@@_filter_series:n, \@@_filter_series_key:n, \@@_filter_series_pair:nn} +% The function \cs{@@_filter_series:n} will be in charge of filtering the +% \mymeta{keys} we want to store where |{#1}| represents the \emph{optional argument} passed to the environment. +% \iffalse +%% Internal function for filter keys. +% \fi +% \begin{macrocode} +\cs_new:Npn \@@_filter_series:n #1 + { + \use:e + { + \keyval_parse:NNn + \@@_filter_series_key:n + \@@_filter_series_pair:nn {#1} + } + } +% \end{macrocode} +% The function \cs{@@_filter_series_key:n} will be responsible for +% filtering the \mymeta{keys} that are passed \emph{\enquote{without value}} by +% excluding the \mykey{resume}, \mykey{resume*} and \mykey{base-fix} keys. +% \begin{macrocode} +\cs_new:Npn \@@_filter_series_key:n #1 + { + \str_case:nnF {#1} + { + { resume } {} { resume* } {} { base-fix } {} + } + { , { \exp_not:n {#1} } } + } +% \end{macrocode} +% The function \cs{@@_filter_series_pair:nn} will be responsible for +% filtering the \mymeta{keys} that are passed \emph{\enquote{with value}} by +% excluding the \mykey{series}, \mykey{resume}, \mykey{start}, \mykey{start*}, \mykey{save-ans} and +% \mykey{save-key} keys. +% \begin{macrocode} +\cs_new:Npn \@@_filter_series_pair:nn #1#2 + { + \str_case:nnF {#1} + { + { series } {} { resume } {} { start } {} + { start* } {} { save-ans } {} { save-key } {} + } + { , { \exp_not:n {#1} } = { \exp_not:n {#2} } } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_series:n, \@@_resume_last:n} +% The function \cs{@@_parse_series:n} will be responsible for +% storing the filtered \mymeta{keys} in the global variable +% \myvarenv{g__@@_series_\mymeta[cf=gray]{series name}_tl} along with the +% creation of the integer variable +% \myvarenv{g__@@_series_\mymeta[cf=gray]{series name}_int} when the key +% is passed as an argument; otherwise, it will check the state of the +% boolean variable \cs{l_@@_resume_active_bool} set by the keys +% \mykey{resume} and \mykey{resume*} and will call the function +% \cs{@@_resume_last:n}. +% \begin{important}* +% The value of boolean variable \cs{l_@@_resume_active_bool} is set to +% true by the function \cs{@@_resume_counter:n} which is used by the keys +% \mykey{resume} and \mykey{resume*}, in this case we must Make sure it +% is set to false so that it does not overwrite the default filtered +% \mymeta{keys}. +% This function is passed to the function \cs{@@_parse_keys:n} +% in the \myenv*{enumext} environment definition (\S\ref{env:enumext}) +% and to the function \cs{@@_parse_keys_vii:n} in the \myenv*{enumext*} +% environment definition (\S\ref{env:starred}). +% \end{important} +% \iffalse +%% Internal function for parse filter keys used by |series|, |resume| and |resume*| keys. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_series:n #1 + { + \str_if_empty:NTF \l_@@_series_str + { + \bool_if:NF \l_@@_resume_active_bool + { + \@@_resume_last:n {#1} + } + } + { + \tl_gclear_new:c { g_@@_series_ \l_@@_series_str _tl } + \tl_gset:ce { g_@@_series_ \l_@@_series_str _tl } + { \@@_filter_series:n {#1} } + \int_if_exist:cF { g_@@_series_ \l_@@_series_str _int } + { + \int_new:c { g_@@_series_ \l_@@_series_str _int } + } + } + } +% \end{macrocode} +% The function \cs{@@_resume_last:n} will be in charge +% of saving the filtering \mymeta{keys} when the \mykey{series} key is +% \emph{not used} and will save them in the variable \myvarenv{g__@@_standar_series_tl} for the +% \myenv*{enumext} environment and in the variable \myvarenv{g__@@_starred_series_tl} +% for the \myenv*{enumext*} environment. +% \iffalse +%% Save keys for last environment without |series|, |resume| and |resume*| keys active. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_resume_last:n #1 + { + \bool_if:NT \l_@@_standar_first_bool + { + \tl_gclear:N \g_@@_standar_series_tl + \tl_gset:Ne \g_@@_standar_series_tl { \@@_filter_series:n {#1} } + } + \bool_if:NT \l_@@_starred_first_bool + { + \tl_gclear:N \g_@@_starred_series_tl + \tl_gset:Ne \g_@@_starred_series_tl { \@@_filter_series:n {#1} } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Internal function to save counter value} +% +% \begin{macro}{\@@_resume_save_counter:} +% +% The \cs{@@_resume_save_counter:} function will save the last counter +% value to \myvarenv{g__@@_series_\mymeta[cf=gray]{series name}_int} if +% the \mykey{series}|=|\mymarg{series name} key has been passed, to +% \myvarenv{g__@@_resume_int} if it has passed the key \mykey{resume} +% \emph{without value} and the key \mykey{series} is not active, in +% \myvarenv{g__@@_series_\mymeta[cf=gray]{series name}_int} if the key +% \mykey{resume}|=|\mymarg{series name} has been passed and in +% \myvarenv{g__@@_series_\mymeta[cf=gray]{store name}_int} if the key has +% been passed \mykey{save-ans}|=|\mymarg{store name}. +% +% \smallskip +% +% \begin{important}* +% The variables \cs{l_@@_series_str} and \cs{l_@@__resume_name_tl} +% contain the same \mymarg{series name} but are executed at different +% moments, the integer variable with \cs{l_@@_series_str} sets the value +% when execute \mykey{series}|=|\mymarg{series name} and the +% integer variable with \cs{l_@@__resume_name_tl} sets the subsequent +% values when use \mykey{resume}|=|\mymarg{series name}. +% This function is passed to the \myenv*{enumext} environment definition (\S\ref{env:enumext}) +% and the \myenv*{enumext*} environment definition (\S\ref{env:starred}). +% \end{important} +% \iffalse +%% Internal function to save counter value and set int vars for |series|, |resume| and |resume*| keys. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_resume_save_counter: + { + \bool_if:NT \g_@@_standar_bool + { + \tl_if_empty:NF \l_@@_series_str + { + \int_gset_eq:cN + { g_@@_series_ \l_@@_series_str _int } \value{enumXi} + } + \tl_if_empty:NTF \l_@@_resume_name_tl + { + \str_if_empty:NT \l_@@_series_str + { + \int_gset_eq:NN \g_@@_resume_int \value{enumXi} + } + } + { + \int_if_exist:cT { g_@@_series_ \l_@@_resume_name_tl _int } + { + \int_gset_eq:cN + { g_@@_series_ \l_@@_resume_name_tl _int } \value{enumXi} + } + } + \int_if_exist:cT { g_@@_resume_ \l_@@_store_name_tl _int } + { + \int_gset_eq:cN + { g_@@_resume_ \l_@@_store_name_tl _int } \value{enumXi} + } + } + \bool_if:NT \g_@@_starred_bool + { + \tl_if_empty:NF \l_@@_series_str + { + \int_gset_eq:cN + { g_@@_series_ \l_@@_series_str _int } \value{enumXvii} + } + \tl_if_empty:NTF \l_@@_resume_name_tl + { + \str_if_empty:NT \l_@@_series_str + { + \int_gset_eq:NN \g_@@_resume_vii_int \value{enumXvii} + } + } + { + \int_if_exist:cT { g_@@_series_ \l_@@_resume_name_tl _int } + { + \int_gset_eq:cN + { g_@@_series_ \l_@@_resume_name_tl _int } \value{enumXvii} + } + } + \int_if_exist:cT { g_@@_resume_ \l_@@_store_name_tl _int } + { + \int_gset_eq:cN + { g_@@_resume_ \l_@@_store_name_tl _int } \value{enumXvii} + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Internal functions for \texttt{resume} key} +% +% \begin{macro}{\@@_resume_series:n} +% The function \cs{@@_resume_series:n} will handle the argument +% passed to the \mykey{resume} key in \myenv*{enumext} and \myenv*{enumext*} environments. +% If the key is passed \emph{without value} the function +% \cs{@@_resume_counter:} is executed which will set the counter +% according to the numbering of the last \myenv*{enumext} or \myenv*{enumext*} environments in +% which \mykey{series}|=|\mymarg{series name} key is not present, if +% the \mykey{save-ans} key is active it will set the counter according to +% the value of the integer variable created by that key, otherwise it +% will verify that the \myvarenv{g__@@_series_\mymeta[cf=gray]{series name}_tl} +% variable set by the \mykey{series} key exists, if so it will pass these +% keys to the \emph{first level} of the environment, otherwise it will +% return an error. +% \iffalse +%% Internal function for |resume| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_resume_series:n #1 + { + \tl_if_empty:nTF {#1} + { + \@@_resume_counter:n { } + } + { + \tl_if_exist:cTF { g_@@_series_ \tl_to_str:n {#1} _tl } + { + \@@_resume_counter:n {#1} + \bool_if:NT \g_@@_standar_bool + { + \keys_set:nv { enumext / level-1 } + { g_@@_series_ \tl_to_str:n {#1} _tl } + } + \bool_if:NT \g_@@_starred_bool + { + \keys_set:nv { enumext / enumext* } + { g_@@_series_ \tl_to_str:n {#1} _tl } + } + } + { + \bool_if:NT \g_@@_standar_bool + { + \msg_error:nnn { enumext } { unknown-series } {#1} + } + \bool_if:NT \g_@@_starred_bool + { + \msg_error:nnn { enumext } { unknown-series } {#1} + } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_resume_counter:n, \@@_resume_counter:, \@@_resume_counter_series:, \@@_resume_counter_save_ans:} +% The function \cs{@@_resume_counter:n} will set the variable +% \cs{l_@@_resume_active_bool} to true and pass the value of the key +% \mykey{resume} to the variable \cs{l_@@_series_name_tl} which will +% contain the \mymarg{series name}. If the variable \cs{l_@@_series_name_tl} is +% empty, that is, we are passing the key \mykey{resume} \emph{without value}, we +% will execute the function \cs{@@_resume_counter:} otherwise, when we +% pass \mykey{resume}|=|\mymarg{series name} we will execute the function +% \cs{@@_resume_counter_series:}, finally we will execute the function +% \cs{@@_resume_counter_save_ans:} which is associated with the key +% \mykey{save-ans}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_resume_counter:n #1 + { + \bool_set_true:N \l_@@_resume_active_bool + \tl_set:Nn \l_@@_resume_name_tl {#1} + \tl_if_empty:NTF \l_@@_resume_name_tl + { + \@@_resume_counter: + } + { + \@@_resume_counter_series: + } + \@@_resume_counter_save_ans: + } +% \end{macrocode} +% The \cs{@@_resume_counter:} function is executed when the +% \mykey{resume} key is used \emph{without value}, only the counters for +% the \emph{\enquote{first level}} of the environments will be set. +% \begin{macrocode} +\cs_new_protected:Nn \@@_resume_counter: + { + \bool_if:NT \g_@@_standar_bool + { + \int_gincr:N \g_@@_resume_int + \int_set_eq:NN \l_@@_start_i_int \g_@@_resume_int + } + \bool_if:NT \g_@@_starred_bool + { + \int_gincr:N \g_@@_resume_vii_int + \int_set_eq:NN \l_@@_start_vii_int \g_@@_resume_vii_int + } + } +% \end{macrocode} +% The function \cs{@@_resume_counter_series:} will be executed when the +% \mykey{resume}|=|\mymarg{series name} key is active, setting the +% counters for the \emph{\enquote{first level}} of the environments +% according to the value of the integer variables created by the +% \mykey{series} key. +% \begin{macrocode} +\cs_new_protected:Nn \@@_resume_counter_series: + { + \bool_if:NT \g_@@_standar_bool + { + \int_set:Nn \l_@@_start_i_int + { + \int_use:c { g_@@_series_ \l_@@_resume_name_tl _int } + 1 + } + } + \bool_if:NT \g_@@_starred_bool + { + \int_set:Nn \l_@@_start_vii_int + { + \int_use:c { g_@@_series_ \l_@@_resume_name_tl _int } + 1 + } + } + } +% \end{macrocode} +% The function \cs{@@_resume_counter_save_ans:} will be executed when the +% \mykey{save-ans} key is active along with the \mykey{resume} key, +% setting the counters for the \emph{\enquote{first level}} of the +% environments according to the value of the integer variables created by +% the \mykey{save-ans} key. +% \begin{macrocode} +\cs_new_protected:Nn \@@_resume_counter_save_ans: + { + \bool_lazy_and:nnT + { \bool_if_p:N \l_@@_standar_first_bool } + { \bool_if_p:N \l_@@_store_active_bool } + { + \int_set:Nn \l_@@_start_i_int + { + \int_use:c { g_@@_resume_ \l_@@_store_name_tl _int } + 1 + } + } + \bool_lazy_and:nnT + { \bool_if_p:N \l_@@_starred_first_bool } + { \bool_if_p:N \l_@@_store_active_bool } + { + \int_set:Nn \l_@@_start_vii_int + { + \int_use:c { g_@@_resume_ \l_@@_store_name_tl _int } + 1 + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Internal function for \texttt{resume*} key} +% +% \begin{macro}{\@@_resume_starred:} +% The function \cs{@@_resume_starred:} will handle the \mykey{resume*} +% key in the \myenv*{enumext} and \myenv*{enumext*} environments. This +% function will execute the filtered \mymeta{keys} in the last one and will +% continue with the numbering according to the last execution of the +% environment \myenv*{enumext} or \myenv*{enumext*} in which the keys +% \mykey{resume}|=|\mymarg{series name} or \mykey{series}|=|\mymarg{series name} were not active. +% \iffalse +%% Internal function for |resume*| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_resume_starred: + { + \bool_if:NT \g_@@_standar_bool + { + \tl_if_empty:NF \g_@@_standar_series_tl + { + \@@_resume_counter:n { } + \keys_set:nV { enumext / level-1 } \g_@@_standar_series_tl + } + } + \bool_if:NT \g_@@_starred_bool + { + \tl_if_empty:NF \g_@@_starred_series_tl + { + \@@_resume_counter:n { } + \keys_set:nV { enumext / enumext* } \g_@@_starred_series_tl + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{save-ans}, \texttt{check-ans} and \texttt{no-store} keys} +% +% The key \mykey{save-ans} is directly associated with the keys +% \mykey{check-ans}, \mykey{no-store}, \mykey{resume} and +% \mykey{resume*}, this will activate the entire \emph{\enquote{storage +% system}} in the \mypkg*{enumext} package. +% +% \subsubsection{Setting \texttt{save-ans} key}\label{key:save-ans} +% +% \begin{macro}[int]{save-ans} +% We define the keys \mykey{save-ans} only for the \emph{\enquote{first level}} +% of \myenv*{enumext} and \myenv*{enumext*}. +% \iffalse +%% Add |save-ans| key only on first level off |enumext| and |enumext*|. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / #1 } + { + save-ans .code:n = \@@_storing_set:n {##1}, + save-ans .value_required:n = true, + } + } +\clist_map_inline:nn { level-1, enumext* } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Internal functions for \texttt{save-ans} key} +% +% \begin{macro}{\@@_start_save_ans_msg:, \@@_stop_save_ans_msg:,} +% The functions \cs{@@_start_save_ans_msg:} and \cs{@@_stop_save_ans_msg:} +% will display in the terminal and |.log| file the environment in which +% the \mykey{save-ans} key was executed along with the line at the +% beginning and end of it. The function \cs{@@_start_save_ans_msg:} will +% be passed to \cs{@@_storing_set:n} and the function +% \cs{@@_stop_save_ans_msg:} will be passed to the function +% \cs{@@_execute_after_env:}. +% \iffalse +%% Print/write start and stop environment with |save-ans| key active. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_start_save_ans_msg: + { + \msg_term:nnVV { enumext } { save-ans-log } + \g_@@_envir_name_tl \l_@@_store_name_tl + } +\cs_new_protected:Nn \@@_stop_save_ans_msg: + { + \msg_term:nnVV { enumext } { save-ans-log-hook } + \g_@@_envir_name_tl \g_@@_store_name_tl + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_storing_set:n, \@@_storing_exec:,} +% The function \cs{@@_storing_set:n} first pass the value of the +% \mykey{save-ans} key to the variable \cs{l_@@_store_name_tl} +% which will contain the \mymarg{store name} of the \emph{sequence} +% and \emph{prop list} we will use. If \cs{l_@@_store_name_tl} is +% \emph{empty} we return an error message, otherwise will return the +% appropriate message \cs{@@_start_save_ans_msg:} and proceed to execute +% the function \cs{@@_storing_exec:} for \myenv*{enumext} and +% \myenv*{enumext*} environments. +% \iffalse +%% Function to activate ALL "storing" (and |check-ans|, |no-store|, |resume|, |anskey*|) used by |save-ans| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_storing_set:n #1 + { + \tl_set:Ne \l_@@_store_name_tl {#1} + \tl_if_empty:NTF \l_@@_store_name_tl + { + \bool_lazy_or:nnT + { \l_@@_standar_first_bool } { \l_@@_starred_first_bool } + { + \msg_error:nnV { enumext } { save-ans-empty } \g_@@_envir_name_tl + } + } + { + \bool_lazy_or:nnT + { \l_@@_standar_first_bool } { \l_@@_starred_first_bool } + { + \@@_start_save_ans_msg: + \@@_storing_exec: + } + } + } +% \end{macrocode} +% The function \cs{@@_storing_exec:} will set to true the variable +% \cs{l_@@_store_active_bool} which activates the use of the +% \ics*{anskey} command and the \myenv*{anskey*}, \myenv*{keyans}, +% \myenv*{keyans*} and \myenv*{keyanspic} environments and will set +% to \enquote{true} the variable \cs{l_@@_check_answers_bool} used for +% intenal checking answers mechanism set by the \mykey{check-ans} and \mykey{no-store} +% keys, copy \mymarg{store name} into the variable \cs{g_@@_store_name_tl} +% and execute the function \cs{@@_anskey_env_make:V} creating the environment +% \myenv*{anskey*} (\S\ref{env:anskey}). +% \begin{macrocode} +\cs_new_protected:Nn \@@_storing_exec: + { + \bool_set_true:N \l_@@_store_active_bool + \bool_set_true:N \l_@@_check_answers_bool + \tl_gset:NV \g_@@_store_name_tl \l_@@_store_name_tl + \@@_anskey_env_make:V \l_@@_store_name_tl +% \end{macrocode} +% The \emph{prop list} \myvarenv{g__@@_series_\mymeta[cf=gray]{store +% name}_prop} and the \emph{sequence} \myvarenv{g__@@_series_\mymeta[cf=gray]{store name}_seq} +% will be created globally to \emph{\enquote{store content}} in case +% they do not exist together with the integer variable +% \myvarenv{g__@@_series_\mymeta[cf=gray]{store name}_int} used by the keys +% \mykey{resume} and \mykey{resume*}. +% \begin{macrocode} + \prop_if_exist:cF { g_@@_ \l_@@_store_name_tl _prop } + { + \msg_log:nnV { enumext } { store-prop } \l_@@_store_name_tl + \prop_new:c { g_@@_ \l_@@_store_name_tl _prop } + } + \seq_if_exist:cF { g_@@_ \l_@@_store_name_tl _seq } + { + \msg_log:nnV { enumext } { store-seq } \l_@@_store_name_tl + \seq_new:c { g_@@_ \l_@@_store_name_tl _seq } + } + \int_if_exist:cF { g_@@_resume_ \l_@@_store_name_tl _int } + { + \msg_log:nnV { enumext } { store-int } \l_@@_store_name_tl + \int_new:c { g_@@_resume_ \l_@@_store_name_tl _int } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The check answer mechanism}\label{int:check-answer} +% +% The internal mechanism for \emph{\enquote{checking answers}} follows this +% logic: +% +% \begin{quote} +% If the line begins with |\item| or |\item*| and does NOT +% \emph{open a nested environment}, each |\item| or |\item*| must contain a +% \emph{single} execution of the |\anskey| command, i.e. the counter of the +% executions of the |\anskey| command must be equal to the counter +% associated with the sum of executions of |\item| and |\item*|. +% +% If the line begins with |\item| or |\item*| and \emph{opens a nested +% environment} each |\item| or |\item*| in the nested environment must +% have a \emph{single} execution of the |\anskey| command and the counter +% associated to the sum of |\item| and |\item*| executions must decrementing +% by \emph{\enquote{one}} to maintain equality. +% +% \end{quote} +% +% In order for the mechanism for the check-answer to work (not counting +% \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic}) we need: +% +% \begin{enumerate}[left=0pt,noitemsep, partopsep=0pt, topsep=5pt] +% \item We must keep track of the total number of |\item| and |\item*| (enumerated) that appear within +% the environment including the nested levels. +% \item We must keep track of the total number of |\item| and |\item*| (enumerated) that appear per +% level of nesting. +% \item Keeping track of the number of times the environment nests. +% \end{enumerate} +% +% +% The integer variable associated to the sum of each |\item| and |\item*| +% in the environment \myvarenv{g__@@_item_number_int} must match the +% integer variable \myvarenv{g__@@_item_anskey_int} associated +% to the execution of the command |\anskey|. We analyze the cases: +% +% \begin{enumerate}[label=\alph*),left=0pt,noitemsep, partopsep=0pt, topsep=5pt] +% \item If the list only has one level the number of |\item + \item*| = \ics*{anskey} +% +% \item If the list has \emph{nested levels}, for each level of nesting we need to +% decrementing by one (for the |\item| or |\item*| that opens the nest) so that the account +% remains the same. +%^^A \item If there is the option \mykey{no-store} we must add the items within this +%^^A level plus one to maintain the equality. +% \end{enumerate} +% +% With \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} it is +% enough to increase in one the integer of \ics*{anskey}. The integers +% created must be global if they are not lost in the interior levels of +% nesting and to execute the test we will use a \emph{\enquote{hook}} +% function after closing the \emph{first level} of the environment. +% +% \subsubsection{Setting \texttt{check-ans} and \texttt{no-store} keys}\label{key:check-ans} +% +% \begin{macro}[int]{check-ans, no-store} +% Now we define the keys \mykey{check-ans} and \mykey{no-store} for all +% levels of \myenv*{enumext} and \myenv*{enumext*} environments. +% \iffalse +%% Add |check-ans| and |no-store| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / #1 } + { + check-ans .bool_set:N = \l_@@_check_ans_key_bool, + check-ans .initial:n = false, + check-ans .value_required:n = true, + no-store .code:n = { + \bool_set_false:N \l_@@_check_answers_bool + \bool_set_false:N \l_@@_check_ans_key_bool + }, + no-store .value_forbidden:n = true, + } + } +\clist_map_inline:nn + { + level-1, level-2, level-3, level-4, enumext* + } + { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Set-up check answer mechanism}\label{int:set-check-answer} +% +% \begin{macro}{\@@_check_ans_active:, \@@_check_ans_level:,} +% The function \cs{@@_check_ans_active:} will first check the state of +% the variable \cs{l_@@_store_name_tl}, that is, the \mykey{save-ans} key +% is active, if so it will check the state of the variable +% \cs{l_@@_check_answers_bool} handled by the key \mykey{no-store} and +% will execute the function \cs{@@_check_ans_level:} only if +% \emph{\enquote{true}}, i.e. the key \mykey{no-store} is not active. +% \iffalse +%% Internal function for checking answer mechanism in |enumext| and |enumext*| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_check_ans_active: + { + \tl_if_empty:NF \l_@@_store_name_tl + { + \bool_if:NT \l_@@_check_answers_bool + { + \@@_check_ans_level: + } + } + } +% \end{macrocode} +% The function \cs{@@_check_ans_level:} will decrement by \emph{\enquote{one}} +% the value of the variable \cs{g_@@_item_number_int} which keeps track +% of the executions of |\item| and |\item*| for each level of nesting +% of the environment \myenv*{enumext}, taking into account whether it +% is nested within \myenv*{enumext*} or the opposite and set \cs{l_@@_item_number_bool} +% to \emph{\enquote{false}} . +% \iffalse +%% Decrementing \g_@@_item_number_int for nested level. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_check_ans_level: + { + \int_case:nn { \l_@@_level_int } + { + { 1 }{ + \bool_lazy_all:nT + { + { \bool_if_p:N \g_@@_starred_bool } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 1 } } + } + { + \int_gdecr:N \g_@@_item_number_int + \bool_set_false:N \l_@@_item_number_bool + } + } + { 2 }{ + \int_gdecr:N \g_@@_item_number_int + \bool_set_false:N \l_@@_item_number_bool + } + { 3 }{ + \int_gdecr:N \g_@@_item_number_int + \bool_set_false:N \l_@@_item_number_bool + } + { 4 }{ + \int_gdecr:N \g_@@_item_number_int + \bool_set_false:N \l_@@_item_number_bool + } + } +% \end{macrocode} +% We should only execute this if \myenv*{enumext*} is nested in the +% \emph{\enquote{first level}} of \myenv*{enumext}, for the rest of the +% cases the value of \cs{g_@@_item_number_int} is already decreased. +% \begin{macrocode} + \int_case:nn { \l_@@_level_h_int } + { + { 1 }{ + \bool_lazy_all:nT + { + { \bool_if_p:N \g_@@_standar_bool } + { \int_compare_p:nNn { \l_@@_level_int } = { 1 } } + } + { + \int_gdecr:N \g_@@_item_number_int + \bool_set_false:N \l_@@_item_number_bool + } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_check_ans_key_hook:} +% The function \cs{@@_check_ans_key_hook:} will \emph{export} the status +% of the local variable \cs{l_@@_check_ans_key_bool} to the global variable +% \cs{g_@@_check_ans_key_bool} only if the key \mykey{check-ans} is active. +% \iffalse +%% Function to export \l_@@_check_ans_key_bool for |check-ans| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_check_ans_key_hook: + { + \bool_lazy_and:nnT + { \bool_if_p:N \l_@@_check_ans_key_bool } + { \bool_if_p:N \g_@@_standar_bool } + { + \bool_gset_true:N \g_@@_check_ans_key_bool + } + \bool_lazy_and:nnT + { \bool_if_p:N \l_@@_check_ans_key_bool } + { \bool_if_p:N \g_@@_starred_bool } + { + \bool_gset_true:N \g_@@_check_ans_key_bool + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_item_answer_diff:} +% The function \cs{@@_item_answer_diff:} will set the value of the +% variable \cs{g_@@_item_answer_diff_int} which is used by the functions +% \cs{@@_check_ans_show:} for the key \mykey{save-ans} and by the +% function \cs{@@_check_ans_log:} by the internal \emph{\enquote{check answer}} +% mechanism. This function will be passed to the function +% \cs{@@_execute_after_env:}. +% \iffalse +%% Set \g_@@_item_answer_diff_int for |check-ans| key and internal. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_item_answer_diff: + { + \int_gset:Nn \g_@@_item_answer_diff_int + { + \int_sign:n { \g_@@_item_number_int - \g_@@_item_anskey_int } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_check_ans_show:, \@@_check_ans_msg_less:, +% \@@_check_ans_msg_same_ok:, \@@_check_ans_msg_greater:} +% The function \cs{@@_check_ans_show:} will be executed within the +% function \cs{@@_execute_after_env:} when the key \mykey{check-ans} is +% active, that is, when \cs{g_@@_check_ans_key_bool} is \emph{\enquote{true}} +% and will return the appropriate message according to the value of +% \cs{g_@@_item_answer_diff_int} set by the function \cs{@@_item_answer_diff:}. +% \iffalse +%% Function to print |check-ans| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_check_ans_show: + { + \int_case:nn { \g_@@_item_answer_diff_int } + { + { -1 }{ \@@_check_ans_msg_less: } + { 0 }{ \@@_check_ans_msg_same_ok: } + { 1 }{ \@@_check_ans_msg_greater: } + } + } +\cs_new_protected:Nn \@@_check_ans_msg_less: + { + \msg_warning:nneee { enumext } { item-less-answer } { \g_@@_store_name_tl } + { \g_@@_envir_name_tl } { \g_@@_start_line_tl } + } +\cs_new_protected:Nn \@@_check_ans_msg_same_ok: + { + \msg_term:nneee { enumext } { items-same-answer } { \g_@@_store_name_tl } + { \g_@@_envir_name_tl } { \g_@@_start_line_tl } + } +\cs_new_protected:Nn \@@_check_ans_msg_greater: + { + \msg_warning:nneee { enumext } { item-greater-answer } { \g_@@_store_name_tl } + { \g_@@_envir_name_tl } { \g_@@_start_line_tl } + } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@_check_ans_log:, \@@_check_ans_log_msg_less:, +% \@@_check_ans_log_msg_same_ok:, \@@_check_ans_log_msg_greater:} +% The function \cs{@@_check_ans_log:} will be executed within the +% function \cs{@@_execute_after_env:} when the key \mykey{check-ans} is +% not active, that is, when \cs{g_@@_check_ans_key_bool} is \emph{\enquote{false}} +% and write in the log the appropriate message according to the value of +% \cs{g_@@_item_answer_diff_int} set by the function +% \cs{@@_item_answer_diff:}. +% \iffalse +%% Function to log check-answer mechanisms. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_check_ans_log: + { + \int_case:nn { \g_@@_item_answer_diff_int } + { + { -1 }{ \@@_check_ans_log_msg_less: } + { 0 }{ \@@_check_ans_log_msg_same_ok: } + { 1 }{ \@@_check_ans_log_msg_greater: } + } + } +\cs_new_protected:Nn \@@_check_ans_log_msg_less: + { + \msg_log:nneee { enumext } { item-less-answer } { \g_@@_store_name_tl } + { \g_@@_envir_name_tl } { \g_@@_start_line_tl } + } +\cs_new_protected:Nn \@@_check_ans_log_msg_same_ok: + { + \msg_log:nneee { enumext } { items-same-answer } { \g_@@_store_name_tl } + { \g_@@_envir_name_tl } { \g_@@_start_line_tl } + } +\cs_new_protected:Nn \@@_check_ans_log_msg_greater: + { + \msg_log:nneee { enumext } { item-greater-answer } { \g_@@_store_name_tl } + { \g_@@_envir_name_tl } { \g_@@_start_line_tl } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Check for \cs{item*} and \cs{anspic*} commands} +% +% \begin{macro}{\@@_check_starred_cmd:n,} +% The function \cs{@@_check_starred_cmd:n} performs an \emph{extra check} +% for the \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} environments. +% Unlike the \emph{check} executed by \mykey{check-ans} key this one +% is not controlled by any key, it is intended to prevent the forgetting +% of \ics*{item*} or \ics*{anspic*} in these environments. +% \iffalse +%% Function for check |\item*| and |\anspic*| commands. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_check_starred_cmd:n #1 + { + \int_compare:nNnT + { \g_@@_check_starred_cmd_int } = { 0 } + { + \msg_warning:nnnV + { enumext } { missing-starred }{ #1 } \l_@@_check_start_line_env_tl + } + \int_compare:nNnT + { \g_@@_check_starred_cmd_int } > { 1 } + { + \msg_warning:nnnV + { enumext } { many-starred }{ #1 } \l_@@_check_start_line_env_tl + } + \int_gzero:N \g_@@_check_starred_cmd_int + \tl_clear:N \l_@@_check_start_line_env_tl + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Keys and functions associated with storage}\label{int:storage-system} +% +% \begin{macro}[int]{wrap-ans, wrap-opt, save-sep,mark-ans, mark-pos, show-ans, mark-ref, save-ref} +% We add the keys \mykey{wrap-ans}, \mykey{wrap-opt}, \mykey{save-sep}, +% \mykey{mark-ans}, \mykey{mark-pos}, \mykey{show-ans}, \mykey{show-pos}, +% \mykey{mark-ref} and \mykey{save-ref} related to the \emph{\enquote{storage system}} +% and internal mechanism of \emph{\enquote{label and ref}} only at +% the \emph{first level} of \myenv*{enumext} and \myenv*{enumext*}. +% \iffalse +%% Add keys associated with storage on first level of |enumext| and |enumext*|. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / #1 } + { + wrap-ans .cs_set_protected:Np = \@@_anskey_wrapper:n ##1, + wrap-ans .initial:n = + { + \fbox{\parbox[t]{\dimeval{\itemwidth -2\fboxsep -2\fboxrule}}{##1}} + }, + wrap-ans .value_required:n = true, + wrap-opt .cs_set_protected:Np = \@@_keyans_wrapper_opt:n ##1, + wrap-opt .initial:n = [{##1}], + wrap-opt .value_required:n = true, + save-sep .tl_set:N = \l_@@_store_keyans_item_opt_sep_tl, + save-sep .initial:n = {, ~ }, + save-sep .value_required:n = true, + mark-ans .tl_set:N = \l_@@_mark_answer_sym_tl, + mark-ans .initial:n = \textasteriskcentered, + mark-ans .value_required:n = true, + mark-pos .choice:, + mark-pos / left .code:n = \str_set:Nn \l_@@_mark_position_str { l }, + mark-pos / right .code:n = \str_set:Nn \l_@@_mark_position_str { r }, + mark-pos / unknown .code:n = + \msg_error:nneee { enumext } { unknown-choice } + { mark-pos } { left, ~ right } { \exp_not:n {##1} }, + mark-pos .initial:n = right, + mark-pos .value_required:n = true, + show-ans .bool_set:N = \l_@@_show_answer_bool, + show-ans .initial:n = false, + show-ans .value_required:n = true, + show-pos .bool_set:N = \l_@@_show_position_bool, + show-pos .initial:n = false, + show-pos .value_required:n = true, + mark-ref .tl_set:N = \l_@@_mark_ref_sym_tl, + mark-ref .initial:n = \textreferencemark, + mark-ref .value_required:n = true, + save-ref .bool_set:N = \l_@@_store_ref_key_bool, + save-ref .initial:n = false, + save-ref .value_required:n = true, + } + } +\clist_map_inline:nn { level-1, enumext* } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{mark-pos, show-ans, show-pos} +% For the \myenv*{keyans} and \myenv*{keyans*} environments we will +% only add the keys \mykey{mark-pos}, \mykey{show-ans} and \mykey{show-pos}. +% \iffalse +%% Add keys |mark-pos|, |show-pos| and |show-ans| keys for |keyans| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / #1 } + { + mark-pos .choice:, + mark-pos / left .code:n = \str_set:Nn \l_@@_mark_position_str { l }, + mark-pos / right .code:n = \str_set:Nn \l_@@_mark_position_str { r }, + mark-pos .initial:n = right, + mark-pos .value_required:n = true, + show-ans .bool_set:N = \l_@@_show_answer_bool, + show-ans .initial:n = false, + show-ans .value_required:n = true, + show-pos .bool_set:N = \l_@@_show_position_bool, + show-pos .initial:n = false, + show-pos .value_required:n = true, + } + } +\clist_map_inline:nn { keyans, keyans* } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Storing structure of the environments} +% +% The idea behind \emph{\enquote{storing structure}} in the \emph{sequence} is +% to have a copy of the \emph{structure of the environment} in which the key +% \mykey{save-ans} is being executed so we must capture the \emph{optional +% argument} passed to the levels of the environment in which it is +% executed and \emph{\enquote{storing}} this in the \emph{sequence}. +% +% \begin{macro}{\@@_store_active_keys:n, \@@_store_active_keys_vii:n,} +% The functions \cs{@@_store_active_keys:n} and \cs{@@_store_active_keys_vii:n} +% will be responsible for the \emph{\enquote{storing keys}} filtered +% from the \emph{optional argument} of the environment in which the +% key \mykey{save-ans} is executed and the levels within this for the \myenv*{enumext} and +% \myenv*{enumext*} environments. We will execute this function only if +% the variable \cs{l_@@_store_save_key_X_bool} is false, that is, the key +% \mykey{store-key} is not active, establishing the variable +% \cs{l_@@_store_save_key_X_tl} with the filtered \mymeta{keys}. +% \iffalse +%% Internal function for store optional arguments of the environments in seq. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_active_keys:n #1 + { + \bool_if:cF { l_@@_store_save_key_ \@@_level: _bool } + { + \tl_clear:c { l_@@_save_key_ \@@_level: _tl } + \tl_set:ce + { l_@@_store_save_key_ \@@_level: _tl } + { \@@_filter_save_key:n {#1} } + } + } +\cs_new_protected:Npn \@@_store_active_keys_vii:n #1 + { + \bool_if:NF \l_@@_store_save_key_vii_bool + { + \tl_clear:N \l_@@_store_save_key_vii_tl + \tl_set:Ne \l_@@_store_save_key_vii_tl { \@@_filter_save_key:n {#1} } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Setting \texttt{save-key} key}\label{key:save-key} +% +% Since this \emph{\enquote{storing structure}} in the \emph{sequence} +% established by the \mykey{save-ans} key when executing \ics*{anskey} or \myenv*{anskey*}, +% we will not be able to modify it. The best thing here is to have a key +% that allows you to modify the \emph{optional argument} of the \emph{\enquote{storing structure}} in +% the \emph{sequence}. +% +% \begin{macro}[int]{save-key} +% The values set by this key passed in the \emph{optional argument} of the +% \myenv*{enumext} and \myenv*{enumext*} environments will override the +% values of the \cs{l_@@_store_save_key_X_tl} variable set by the +% functions \cs{@@_store_active_keys:n} and \cs{@@_store_active_keys_vii:n}. +% Now define the key \mykey{save-key} for all levels of +% \myenv*{enumext} and \myenv*{enumext*} environments. +% \iffalse +%% Add |save-key| key for |enumext| and |enumext*| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / enumext* } + { + save-key .code:n = \@@_parse_save_key_vii:n {##1}, + save-key .value_required:n = true, + } + \keys_define:nn { enumext / #1 } + { + save-key .code:n = \@@_parse_save_key:n {##1}, + save-key .value_required:n = true, + } + } +\clist_map_inline:nn { level-1, level-2, level-3, level-4 } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_save_key:n, \@@_parse_save_key_vii:n,} +% The functions \cs{@@_parse_save_key:n} and \cs{@@_parse_save_key_vii:n} +% will be responsible for \emph{\enquote{storing keys}} in the variable +% \myvarenv{l__@@_store_save_key_X_tl} for \myenv*{enumext} and \myenv*{enumext*}. +% \iffalse +%% Internal function for |save-key| key. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_save_key:n #1 + { + \bool_set_true:c { l_@@_store_save_key_ \@@_level: _bool } + \tl_clear:c { l_@@_save_key_ \@@_level: _tl } + \tl_set:ce + { l_@@_store_save_key_ \@@_level: _tl } + { \@@_filter_save_key:n {#1} } + } +\cs_new_protected:Npn \@@_parse_save_key_vii:n #1 + { + \bool_set_true:N \l_@@_store_save_key_vii_bool + \tl_clear:N \l_@@_store_save_key_vii_tl + \tl_set:Ne \l_@@_store_save_key_vii_tl { \@@_filter_save_key:n {#1} } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Internal functions to store optional arguments} +% +% \begin{macro}{\@@_filter_save_key:n, \@@_filter_save_key_key:n, \@@_filter_save_key_pair:nn} +% The function \cs{@@_filter_save_key:n} will be in charge of +% \emph{\enquote{filtering keys}} we want to \emph{stored} in +% \emph{sequence} where |{#1}| represents the \emph{optional argument} +% passed to the environment. +% \iffalse +%% Internal function for "filter keys" for |save-key| key. +% \fi +% \begin{macrocode} +\cs_new:Npn \@@_filter_save_key:n #1 + { + \use:e + { + \keyval_parse:NNn + \@@_filter_save_key_key:n + \@@_filter_save_key_pair:nn {#1} + } + } +% \end{macrocode} +% The function \cs{@@_filter_save_key_key:n} will be responsible for +% \emph{\enquote{filtering keys}} that are passed \emph{\enquote{without value}} by +% excluding the \mykey{resume}, \mykey{resume*}, \mykey{no-store} and \mykey{base-fix} keys. +% \begin{macrocode} +\cs_new:Npn \@@_filter_save_key_key:n #1 + { + \str_case:nnF {#1} + { + { resume } {} { resume* } {} { no-store } {} { base-fix } {} + } + { , { \exp_not:n {#1} } } + } +% \end{macrocode} +% The function \cs{@@_filter_save_key_pair:nn} will be responsible for +% \emph{\enquote{filtering keys}} that are passed \emph{\enquote{with value}} by +% excluding the \mykey{series}, \mykey{resume}, \mykey{save-ans}, \mykey{save-ref}, \mykey{check-ans}, +% \mykey{show-ans}, \mykey{save-pos}, \mykey{wrap-ans}, \mykey{mark-ans}, +% \mykey{wrap-opt}, \mykey{save-sep}, \mykey{mark-ref}, \mykey{mini-env}, \mykey{mini-sep}, +% \mykey{mini-right} and \mykey{mini-right*} keys. +% \begin{macrocode} +\cs_new:Npn \@@_filter_save_key_pair:nn #1#2 + { + \str_case:nnF {#1} + { + { series } {} { resume } {} { save-ans } {} { save-ref } {} + { save-key } {} { check-ans } {} { show-ans } {} { show-pos } {} + { wrap-ans } {} { mark-ans } {} { wrap-opt } {} { save-sep } {} + { mark-ref } {} { mini-env } {} { mini-sep } {} { mini-right } {} + { mini-right* } {} + } + { , { \exp_not:n {#1} } = { \exp_not:n {#2} } } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Function for storing content in prop list} +% +% \begin{macro}{\@@_store_addto_prop:n, \@@_store_addto_prop:V} +% The function \cs{@@_store_addto_prop:n} stores the \mymarg{content} in +% \emph{prop list} defined by \mykey{save-ans} key. The \emph{\enquote{stored +% content}} is retrieved by means of the \ics*{getkeyans} command. +% +% \smallskip +% +% The form in which the \mymarg{content} is \emph{\enquote{stored}} in the +% \emph{prop list} is \mymarg{position}\mymarg{content}. This +% function is used by \ics*{anskey} in \myenv*{enumext} and \myenv*{enumext*} +% environments, \ics*{item*} in \myenv*{keyans} and \myenv*{keyans*} +% environments and \ics*{anspic*} in \myenv*{keyanspic} environment. +% \iffalse +%% Function for store content to prop list. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_addto_prop:n #1 + { + \prop_gput_if_not_in:cen { g_@@_ \l_@@_store_name_tl _prop } + { + \int_eval:n { \prop_count:c { g_@@_ \l_@@_store_name_tl _prop } + 1 } + } + { #1 } + } +\cs_generate_variant:Nn \@@_store_addto_prop:n { V } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Function for storing content in sequence} +% +% \begin{macro}{\@@_store_addto_seq:n, \@@_store_addto_seq:v, \@@_store_addto_seq:V} +% The function \cs{@@_store_addto_seq:n} stores the \mymarg{content} in +% \emph{sequence} defined by \mykey{save-ans} key. This function +% is used by \ics*{anskey} in \myenv*{enumext}, \ics*{item*} in +% \myenv*{keyans} and \ics*{anspic} in \myenv*{keyanspic}. +% +% \smallskip +% +% The form in which the \mymarg{content} is stored in \emph{sequence} is in +% a internal \myenv*{enumext} or \myenv*{enumext*} environments with +% the \emph{\enquote{same structure}} in which the command was executed. +% +% The \emph{\enquote{stored content}} is retrieved by means of the +% \ics*{printkeyans} command. +% \iffalse +%% Function for store content to sequence. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_addto_seq:n #1 + { + \seq_gput_right:cn { g_@@_ \l_@@_store_name_tl _seq } { #1 } + } +\cs_generate_variant:Nn \@@_store_addto_seq:n { v, V } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for storing structure in the sequence} +% +% \begin{macro}{\@@_store_level_open:, \@@_store_level_close:,} +% The \emph{\enquote{storing structure}} is handled by the functions +% \cs{@@_store_level_open:} and \cs{@@_store_level_close:} which are +% executed per level within the \myenv*{enumext} environment. +% \iffalse +%% Function for storing structure level execution of |\anskey| on |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_store_level_open: + { + \bool_if:NT \l_@@_check_answers_bool + { + \tl_if_empty:cTF { l_@@_store_save_key_ \@@_level: _tl } + { + \@@_store_addto_seq:n + { + \item \begin{enumext} + } + } + { + \tl_put_left:cn { l_@@_store_save_key_ \@@_level: _tl } + { + \item \begin{enumext} [ + } + \tl_put_right:cn { l_@@_store_save_key_ \@@_level: _tl } + { + ] + } + \@@_store_addto_seq:v { l_@@_store_save_key_ \@@_level: _tl } + } + } + } +\cs_new_protected:Nn \@@_store_level_close: + { + \bool_if:NT \l_@@_check_answers_bool + { + \@@_store_addto_seq:n { \end{enumext} } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_store_level_open_vii:, \@@_store_level_close_vii:,} +% The \emph{\enquote{storing structure}} is handled by the functions +% \cs{@@_store_level_open_vii:} and \cs{@@_store_level_close_vii:} +% which are executed in the \myenv*{enumext*} environment. +% +% \iffalse +%% Function storing structure level execution of |\anskey| and |anskey*| on |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_store_level_open_vii: + { + \bool_if:NT \l_@@_check_answers_bool + { + \tl_if_empty:NTF \l_@@_store_save_key_vii_tl + { + \@@_store_addto_seq:n + { + \item \begin{enumext*} + } + } + { + \tl_put_left:Nn \l_@@_store_save_key_vii_tl + { + \item \begin{enumext*}[ + } + \tl_put_right:Nn \l_@@_store_save_key_vii_tl + { + ] + } + \@@_store_addto_seq:V \l_@@_store_save_key_vii_tl + } + } + } +\cs_new_protected:Nn \@@_store_level_close_vii: + { + \bool_if:NT \l_@@_check_answers_bool + { + \@@_store_addto_seq:n { \end{enumext*} } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Function for show marks and position} +% +% \begin{macro}{\@@_print_keyans_box:NN, \@@_print_keyans_box:cc } +% The function \cs{@@_print_keyans_box:NN} print a box in the left +% margin with \cs{l_@@_mark_answer_sym_tl} used by the \mykey{wrap-ans}, +% \mykey{show-ans} and \mykey{show-pos} keys. The function takes two +% arguments: +% +% \smallskip +% +% \begin{arguments} +% \item \myvarenv{l__@@_labelwidth_X_dim} +% \item \myvarenv{l__@@_labelsep_X_dim} +% \end{arguments} +% +% \iffalse +%% Function for put content in box on left margin. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_print_keyans_box:NN + { + \mode_leave_vertical: + \skip_horizontal:n { -\dim_use:N #2 } + \makebox[0pt][ r ] + { + \makebox[ \dim_use:N #1 ][ \l_@@_mark_position_str ] + { + \tl_use:N \l_@@_mark_answer_sym_tl + } + } + \skip_horizontal:n { \dim_use:N #2 } + } +\cs_generate_variant:Nn \@@_print_keyans_box:NN { cc } +% \end{macrocode} +% \end{macro} +% +% \subsection{The internal label and ref}\label{fun:internal-label-ref} +% +% The function \cs{@@_store_internal_ref:} handles the +% \emph{\enquote{internal label and ref}} system used by the \mykey{save-ref} +% and \mykey{mark-ref} keys for \ics*{anskey} will allow to execute +% \ics{ref}\mymarg{store name \textnormal{\textcolor{red}{:}} position} and +% will return |1||.(a)||.i||.A|. +% +% \begin{macro}{\@@_store_internal_ref:} +% First we will remove the dots \enquote{\textcolor{red}{.}} from +% the current \mymeta{labels}, we do not want to get double dots in +% our references, then we will place this in the variable +% \cs{l_@@_newlabel_arg_two_tl}. +% \iffalse +%% Internal label and ref function for |\anskey| and |anskey*|. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_store_internal_ref: + { + \cs_set_protected:Npn \@@_tmp:n ##1 + { + \tl_set_eq:cc { l_@@_label_copy_##1_tl } { l_@@_label_##1_tl } + \tl_reverse:c { l_@@_label_copy_##1_tl } + \tl_remove_once:cn { l_@@_label_copy_##1_tl } { . } + \tl_reverse:c { l_@@_label_copy_##1_tl } + } + \clist_map_inline:nn { i, ii, iii, iv, vii } { \@@_tmp:n {##1} } + \cs_set:Npn \@@_tmp:n ##1 + { . \tl_use:c { l_@@_label_copy_ \int_to_roman:n {##1} _tl } } +% \end{macrocode} +% Here we need to analyse the cases where the environment is started with +% \myenv*{enumext*} and if \ics*{anskey} or \myenv*{anskey*} is running +% alone in it or if it is running in a nested \myenv*{enumext} environment +% within the starting environment. +% \begin{macrocode} + \bool_lazy_all:nT + { + { \bool_if_p:N \g_@@_starred_bool } + { \int_compare_p:nNn { \l_@@_level_int } = { 0 } } + } + { + \tl_put_right:Ne \l_@@_newlabel_arg_two_tl + { \tl_use:N \l_@@_label_copy_vii_tl } + } + \bool_lazy_all:nT + { + { \bool_not_p:n { \g_@@_standar_bool } } + { \bool_if_p:N \l_@@_standar_bool } + { \int_compare_p:nNn { \l_@@_level_int } > { 0 } } + } + { + \tl_put_right:Ne \l_@@_newlabel_arg_two_tl + { + \tl_use:N \l_@@_label_copy_vii_tl + \int_step_function:nnN { 1 } { \l_@@_level_int } \@@_tmp:n + } + } +% \end{macrocode} +% If started with \myenv*{enumext} and if \ics*{anskey} or \myenv*{anskey*} +% is running alone in it or if it is running in a nested \myenv*{enumext*} +% environment within the starting environment. +% \begin{macrocode} + \bool_lazy_all:nT + { + { \bool_if_p:N \g_@@_standar_bool } + { \int_compare_p:nNn { \l_@@_level_int } > { 0 } } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 0 } } + } + { + \tl_put_right:Ne \l_@@_newlabel_arg_two_tl + { + \tl_use:N \l_@@_label_copy_i_tl + \int_step_function:nnN { 2 } { \l_@@_level_int } \@@_tmp:n + } + } + \cs_set:Npn \@@_tmp:n ##1 + { \tl_use:c { l_@@_label_copy_ \int_to_roman:n {##1} _tl } . } + \bool_lazy_all:nT + { + { \bool_if_p:N \g_@@_standar_bool } + { \bool_if_p:N \l_@@_starred_bool } + { \int_compare_p:nNn { \l_@@_level_int } > { 0 } } + } + { + \tl_put_right:Ne \l_@@_newlabel_arg_two_tl + { + \int_step_function:nnN { 1 } { \l_@@_level_int } \@@_tmp:n + \tl_use:N \l_@@_label_copy_vii_tl + } + } +% \end{macrocode} +% Now we set the variable \cs{l_@@_newlabel_arg_one_tl} which will +% contain \mymarg{store name \textnormal{\textcolor{red}{:}} position}. +% \begin{macrocode} + \tl_put_right:Ne \l_@@_newlabel_arg_one_tl + { + \l_@@_store_name_tl \c_colon_str + \int_eval:n { \prop_count:c { g_@@_ \l_@@_store_name_tl _prop } } + } +% \end{macrocode} +% Now execute the function \cs{@@_newlabel:nn} and save the result in +% the variable \cs{l_@@_write_aux_file_tl} and finally we write in the +% |.aux| file. +% \begin{macrocode} + \tl_put_right:Ne \l_@@_write_aux_file_tl + { + \@@_newlabel:nn + { \exp_not:V \l_@@_newlabel_arg_one_tl } + { \l_@@_newlabel_arg_two_tl } + } + \l_@@_write_aux_file_tl + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Common functions for \cs{anskey} and \texttt{anskey*} environment} +% +% \begin{macro}{\@@_store_anskey_code:n} +% The internal function \cs{@@_store_anskey_code:n} first we pass the +% \mymarg{argument} to the \emph{prop list}, then checks the +% state of the variable \cs{l_@@_store_ref_key_bool} handled by the +% \mykey{save-ref} key and will call the function \cs{@@_store_internal_ref:} +% for the \emph{\enquote{internal label and ref}} system. Followed by +% this if the \mykey{show-ans} or \mykey{show-pos} keys are active we +% will show the \emph{\enquote{wrapped}} \mymarg{argument}. +% \iffalse +%% Internal function of |\anskey| for store content. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_anskey_code:n #1 + { + \int_gincr:N \g_@@_item_anskey_int + \@@_store_addto_prop:n {#1} + \bool_if:NT \l_@@_store_ref_key_bool + { + \@@_store_internal_ref: + } + \@@_anskey_show_wrap_left:n { #1 } +% \end{macrocode} +% Now we start processing the \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% passed to the command to build our |\item| in the variable \cs{l_@@_store_anskey_arg_tl} +% which we will \emph{\enquote{store}} in the \emph{sequence}. +% First we clear the variable \cs{l_@@_store_anskey_arg_tl} and process +% the \mymeta{keys}, if the \mykeycmd{break-col} key is present and +% the command is running under \myenv*{enumext} (not in \myenv*{enumext*}) +% we will add \ics{columnbreak} and then |\item|. +% \begin{macrocode} + \tl_clear:N \l_@@_store_anskey_arg_tl + \bool_lazy_and:nnT + { \bool_if_p:N \l_@@_store_columns_break_bool } + { \bool_not_p:n { \l_@@_starred_bool } } + { + \tl_put_left:Nn \l_@@_store_anskey_arg_tl { \columnbreak } + } + \tl_put_right:Nn \l_@@_store_anskey_arg_tl { \item } +% \end{macrocode} +% If the \mykeycmd{item-join} key is present and the command is running under +% \myenv*{enumext*} we will add \myparg{number} to \cs{l_@@_store_anskey_arg_tl}. +% \begin{macrocode} + \bool_lazy_and:nnT + { \bool_not_p:n { \l_@@_starred_bool } } + { \int_compare_p:nNn { \l_@@_store_item_join_int } > { 1 } } + { + \tl_put_right:Ne \l_@@_store_anskey_arg_tl + { + ( \exp_not:V \l_@@_store_item_join_int ) + } + } +% \end{macrocode} +% And now we will review the keys \mykeycmd{item-star}, \mykeycmd{item-sym*} and +% \mykeycmd{item-pos*} and pass them to \cs{l_@@_store_anskey_arg_tl} +% along with the \mymarg{argument} for |\anskey| or \mymeta{body} for |anskey*|. +% \begin{macrocode} + \bool_if:NTF \l_@@_store_item_star_bool + { + \tl_put_right:Nn \l_@@_store_anskey_arg_tl { * } + \tl_if_empty:NF \l_@@_store_item_symbol_tl + { + \tl_put_right:Ne \l_@@_store_anskey_arg_tl + { + [ \exp_not:V \l_@@_store_item_symbol_tl ] + } + } + \dim_compare:nT + { + \l_@@_store_item_symbol_sep_dim != \c_zero_dim + } + { + \tl_put_right:Ne \l_@@_store_anskey_arg_tl + { + [ \exp_not:V \l_@@_store_item_symbol_sep_dim ] + } + } + \tl_put_right:Nn \l_@@_store_anskey_arg_tl {#1} + } + { + \tl_put_right:Nn \l_@@_store_anskey_arg_tl {#1} + } +% \end{macrocode} +% Finally we check if the \mykey{save-ref} key are active along with the +% \mypkg{hyperref} package load, if both conditions are met, it will +% create the \ics{hyperlink} with \emph{\enquote{symbol}} set by \mykey{mark-ref} +% key and then store in \emph{sequence}. +% \begin{macrocode} + \bool_lazy_and:nnT + { \bool_if_p:N \l_@@_store_ref_key_bool } + { \bool_if_p:N \l_@@_hyperref_bool } + { + \tl_put_right:Ne \l_@@_store_anskey_arg_tl + { + \hfill \exp_not:N \hyperlink { \exp_not:V \l_@@_newlabel_arg_one_tl } + { \exp_not:V \l_@@_mark_ref_sym_tl } + } + } + \@@_store_addto_seq:V \l_@@_store_anskey_arg_tl + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_anskey_show_wrap_arg:n,} +% The function \cs{@@_anskey_show_wrap_arg:n} \emph{\enquote{wraps}} +% the \mymarg{argument} passed to \ics*{anskey} and the \mymeta{body} +% for \myenv*{anskey*} when using the \mykey{wrap-ans} key. +% \iffalse +%% Internal |wrap-ans| implementation for |\anskey| and |anskey*|. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_anskey_show_wrap_arg:n #1 + { + \par + \bool_if:NTF \l_@@_starred_bool + { + \@@_print_keyans_box:NN + \l_@@_labelwidth_vii_dim \l_@@_labelsep_vii_dim + } + { + \@@_print_keyans_box:cc + { l_@@_labelwidth_ \@@_level: _dim } + { l_@@_labelsep_ \@@_level: _dim } + } + \@@_anskey_wrapper:n { #1 } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ \@@_anskey_show_wrap_left:n } +% The function \cs{@@_anskey_show_wrap_left:n} will show the +% \emph{\enquote{mark}} defined by the \mykey{mark-ans} key or the +% \emph{\enquote{position}} of the \mymarg{content} stored in the \emph{prop list} +% when using the \mykey{show-pos} key on the left margin next to the +% \emph{\enquote{wraps}} \mymarg{argument} passed to \ics*{anskey} and +% the \mymeta{body} in \myenv*{anskey*} on the right side when using +% the \mykey{show-ans} key. +% \iffalse +%% Internal |show-ans| and |show-pos| implementation for |\anskey| and |anskey*|. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_anskey_show_wrap_left:n #1 + { + \bool_if:NT \l_@@_show_answer_bool + { + \@@_anskey_show_wrap_arg:n { #1 } + } + \bool_if:NT \l_@@_show_position_bool + { + \tl_set:Ne \l_@@_mark_answer_sym_tl + { + \group_begin: + \exp_not:N \normalfont + \exp_not:N \footnotesize [ \int_eval:n + { + \prop_count:c { g_@@_ \l_@@_store_name_tl _prop } + } + ] + \group_end: + } + \@@_anskey_show_wrap_arg:n { #1 } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The command \cs{anskey}}\label{cmd:anskey} +% +% Since we will be \emph{\enquote{storing content}} in a \myenv{list} environment +% within \emph{sequences} and can (more or less) manage the options +% passed to each level, it is necessary that we have a little more +% control over |\item| when storing. +% +% \smallskip +% +% The \ics*{anskey} command will cover this point and give it similar +% behaviour to that of |\item| in the \myenv*{enumext} and \myenv*{enumext*} +% environments executed as follows \ics*{anskey}\myoarg{key \textnormal{\textcolor{gray}{=}} val}\mymarg{content}. +% +% \begin{macro}{\@@_anskey_unknown:n, \@@_anskey_unknown:nn} +% First we'll add the keys \mykeycmd{break-col}, \mykeycmd{item-join}, +% \mykeycmd{item-star}, \mykeycmd{item-sym*} and \mykeycmd{item-pos*}. +% \iffalse +%% Add |key=val| for |\anskey|. +% \fi +% \begin{macrocode} +\keys_define:nn { enumext / anskey } + { + break-col .bool_set:N = \l_@@_store_columns_break_bool, + break-col .default:n = true, + break-col .value_forbidden:n = true, + item-join .int_set:N = \l_@@_store_item_join_int, + item-join .value_required:n = true, + item-star .bool_set:N = \l_@@_store_item_star_bool, + item-star .default:n = true, + item-star .value_forbidden:n = true, + item-sym* .tl_set:N = \l_@@_store_item_symbol_tl, + item-sym* .value_required:n = true, + item-pos* .dim_set:N = \l_@@_store_item_symbol_sep_dim, + item-pos* .value_required:n = true, + unknown .code:n = { \@@_anskey_unknown:n {#1} }, + } +% \end{macrocode} +% The \mymeta{keys} are stored in \cs{l_keys_key_str} and the value +% (if any) is passed as an argument to the function \cs{@@_anskey_unknown:n}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_anskey_unknown:n #1 + { + \exp_args:NV \@@_anskey_unknown:nn \l_keys_key_str {#1} + } +\cs_new_protected:Npn \@@_anskey_unknown:nn #1 #2 + { + \tl_if_blank:nTF {#2} + { + \msg_error:nnn { enumext } { anskey-cmd-key-unknown } {#1} + } + { + \msg_error:nnnn { enumext } { anskey-cmd-key-value-unknown } {#1} {#2} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{important}* +% The \ics*{anskey} command will only be present when using the +% \mykey{save-ans} key in \myenv*{enumext} and \myenv*{enumext*} +% environments, otherwise it will return an error. +% \end{important} +% +% \begin{macro}{\anskey} +% We will first call the function \cs{@@_anskey_safe_outer:} to be +% sure where we execute the command, then we will check the state of the +% variable \cs{l_@@_check_answers_bool} set by the key \mykey{no-store}, +% if is true we will increment \cs{g_@@_item_anskey_int} for the internal +% \emph{\enquote{check answer}} system and execute the function +% \cs{@@_anskey_safe_inner:n} to ensure that the command is not +% nested and that the argument is not empty, finally search the +% \myoarg{key \textnormal{\textcolor{gray}{=}} val} and call the +% function \cs{@@_store_anskey_code:n}. +% \iffalse +%% Define the user command |\anskey|. +% \fi +% \begin{macrocode} +\NewDocumentCommand \anskey { o +m } + { + \@@_anskey_safe_outer: + \group_begin: + \bool_if:NT \l_@@_check_answers_bool + { + \tl_if_novalue:nF {#1} + { + \keys_set:nn { enumext / anskey } {#1} + } + \tl_if_blank:nTF {#2} + { + \msg_error:nn { enumext } { anskey-empty-arg } + } + { + \@@_anskey_safe_inner: + \@@_store_anskey_code:n {#2} + } + } + \group_end: + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Internal functions for the command} +% +% \begin{macro}{\@@_anskey_safe_outer:, \@@_anskey_safe_inner:} +% The \cs{@@_store_anskey_safe_outer:} function will return the +% appropriate messages when the command is executed outside the +% environment in which the \mykey{save-ans} key was activated. +% \iffalse +%% Internal function for msg when |\anskey| is outer. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_anskey_safe_outer: + { + \bool_if:NF \l_@@_store_active_bool + { + \msg_error:nnnn { enumext } { anskey-wrong-place }{ anskey }{ enumext } + } + \int_compare:nNnT { \l_@@_keyans_level_int } = { 1 } + { + \msg_error:nnnn { enumext } { command-wrong-place }{ anskey }{ keyans } + } + \int_compare:nNnT { \l_@@_keyans_level_h_int } = { 1 } + { + \msg_error:nnnn { enumext } { command-wrong-place }{ anskey }{ keyans* } + } + \int_compare:nNnT { \l_@@_keyans_pic_level_int } = { 1 } + { + \msg_error:nnnn { enumext } { command-wrong-place }{ anskey }{ keyanspic } + } + } +% \end{macrocode} +% The \cs{@@_anskey_safe_inner:} function will first check if the +% command is nested, if preceded by a not numbered |\item| or if it is +% in \emph{math mode} returning the appropriate messages. +% \iffalse +%% Internal function for msg when |\anskey| is inner, math-mode or arg is empty. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_anskey_safe_inner: + { + \int_incr:N \l_@@_anskey_level_int + \int_compare:nNnT { \l_@@_anskey_level_int } > { 1 } + { + \msg_error:nn { enumext } { anskey-nested } + } + \bool_if:NF \l_@@_item_number_bool + { + \msg_error:nn { enumext } { anskey-unnumber-item } + } + \mode_if_math:T + { + \msg_error:nne { enumext } { anskey-math-mode } { \c_backslash_str anskey } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The environment \env{anskey*}}\label{env:anskey} +% +% Managing \emph{verbatim content} in an environment is quite complicated, I +% learned that when creating the \mypkg{scontents} package, so to be able +% to have support at this point it is best to play a little with the +% internal code of \mypkg{scontents} and \emph{hooks}. +% Some considerations I should have here before implementing this: +% +% \begin{itemize}[left=10pt,nosep, topsep=2pt] +% \item If some package, class or user has defined the environment with the +% same name somewhere in the document it would be a problem, you would +% not know what argument has been passed to |store-env|, if you are using +% the key |print-env| or the |write-out| key, sure, I can detect and +% modify it within the \myenv*{enumext} and \myenv*{enumext*} +% environments, but it would look strange not to have some keys available +% when running within these environments. +% +% \item A better (perhaps a bit paranoid) option is to define it within the +% environment in which the |save-ans| key is executed. and have it +% available only when that key is executed, here I would have absolute +% control of the \mymeta{keys} and I make sure that |write-out| is not used, then +% using \emph{hooks after} I undefine it and using \emph{hook before} I check if it has +% been created by any package, class or user and I return a error, +% then the user will have to see how to solve the problem. +% \end{itemize} +% +% \begin{macro}[int]{\@@_undefine_anskey_env:,} +% The function \cs{@@_undefine_anskey_env:} will undefine the environment +% \myenv*{anskey*} and will be passed to the function +% \cs{@@_execute_after_env:} (\S\ref{fun:exec-after-env}) which is +% executed after the environment in which the key \mykey{save-ans} is active. +% \begin{macrocode} +\cs_new_protected:Nn \@@_undefine_anskey_env: + { + \cs_undefine:c { anskey* } + \cs_undefine:c { endanskey* } + \cs_undefine:c { __scontents_anskey*_env_begin: } + \cs_undefine:c { __scontents_anskey*_env_end: } + } +% \end{macrocode} +% Detection of the \myenv*{anskey*} environment outside the +% \myenv*{enumext} and \myenv*{enumext*} environments. +% \iffalse +%% Hooks for |anskey*| environment out off |enumext| and |enumext*| environments. +% \fi +% \begin{macrocode} +\@@_before_env:nn { enumext } + { + \bool_lazy_and:nnT + { \int_compare_p:nNn { \l_@@_level_int } = { 0 } } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 0 } } + { + \cs_if_free:cF { __scontents_anskey*_env_begin: } + { + \msg_error:nnn { enumext } { anskey-env-error } { anskey* } + } + } + } +\@@_before_env:nn { enumext* } + { + \bool_lazy_and:nnT + { \int_compare_p:nNn { \l_@@_level_int } = { 0 } } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 0 } } + { + \cs_if_free:cF { __scontents_anskey*_env_begin: } + { + \msg_error:nnn { enumext } { anskey-env-error } { anskey* } + } + } + } +% \end{macrocode} +% Detection of the \myenv*{anskey*} environment inside the \myenv*{keyans}, +% \myenv*{keyans*} and \myenv*{keyanspic} environments, if preceded by +% a not numbered |\item| or if it is in \emph{math mode} returning +% the appropriate messages. +% \iffalse +%% Hooks for |anskey*| inside the |keyans|, |keyans*| and |keyanspic| environments, math-mode ans not number |\item|. +% \fi +% \begin{macrocode} +\@@_before_env:nn { anskey* } + { + \int_compare:nNnT { \l_@@_keyans_level_int } = { 1 } + { + \msg_error:nnn { enumext } { anskey-env-wrong }{ keyans } + } + \int_compare:nNnT { \l_@@_keyans_level_h_int } = { 1 } + { + \msg_error:nnn { enumext } { anskey-env-wrong } { keyans* } + } + \int_compare:nNnT { \l_@@_keyans_pic_level_int } = { 1 } + { + \msg_error:nnn { enumext } { anskey-env-wrong } { keyanspic } + } + \bool_if:NF \l_@@_item_number_bool + { + \msg_error:nn { enumext } { anskey-unnumber-item } + } + \mode_if_math:T + { + \msg_error:nnn { enumext } { anskey-math-mode } { anskey* } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{anskey*, \@@_anskey_env_make:n, \@@_anskey_env_make:V, +% \@@_anskey_env_define_keys:, \@@_anskey_env_unknown:n, +% \@@_anskey_env_unknown:nn, \@@_anskey_env_reset_keys:, +% \@@_rescan_anskey_env:n,} +% The function \cs{@@_anskey_env_make:n} creates the environment +% \myenv*{anskey*} (\emph{custom version} of \myenv{scontents} +% environment) by setting the initial keys |store-env=|\mymarg{store name} +% and |print-env=false|. +% +% To maintain the \emph{scope} of the environment and that it is only active +% when the key \mykey{save-ans} is active we will pass this function to +% the function \cs{@@_storing_exec:} (\S\ref{key:save-ans}) and we +% will execute it only if the variable \cs{l_@@_anskey_env_bool} is true, +% with this we prevent it from being executed again when the environment +% is nested and the key \mykey{save-ans} is active, which returns an +% error for part of the package \mypkg{scontents}. +% \iffalse +%% Function for define |anskey*| environment using scontents. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_anskey_env_make:n #1 + { + \bool_if:NT \l_@@_anskey_env_bool + { + \newenvsc{anskey*}[store-env=#1,print-env=false] + \@@_anskey_env_exec: + } + } +\cs_generate_variant:Nn \@@_anskey_env_make:n { V } +% \end{macrocode} +% The function \cs{@@_anskey_env_define_keys:} will add the keys +% \mykeycmd{break-col}, \mykeycmd{item-join}, \mykeycmd{item-join}, +% \mykeycmd{item-star}, \mykeycmd{item-sym*} and \mykeycmd{item-pos*} +% and will leave the keys |print-env|, |store-env| and |write-out| +% undefined. We will apply this function using the \emph{hook} function +% \cs{@@_before_env:nn}. +% \iffalse +%% Define keys for |anskey*| environment using scontents PATH. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_anskey_env_define_keys: + { + \keys_define:nn { scontents / scontents } + { + break-col .bool_gset:N = \g_@@_store_columns_break_bool, + break-col .default:n = true, + break-col .value_forbidden:n = true, + item-join .int_gset:N = \g_@@_store_item_join_int, + item-join .value_required:n = true, + item-star .bool_gset:N = \g_@@_store_item_star_bool, + item-star .default:n = true, + item-star .value_forbidden:n = true, + item-sym* .tl_gset:N = \g_@@_store_item_symbol_tl, + item-sym* .value_required:n = true, + item-pos* .dim_gset:N = \g_@@_store_item_symbol_sep_dim, + item-pos* .value_required:n = true, + print-env .undefine:, + store-env .undefine:, + write-out .undefine:, + unknown .code:n = { \@@_anskey_env_unknown:n {##1} }, + } + } +% \end{macrocode} +% The \mymeta{keys} are stored in \cs{l_keys_key_str} and the value +% (if any) is passed as an argument to the function \cs{@@_anskey_env_unknown:n}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_anskey_env_unknown:n #1 + { + \exp_args:NV \@@_anskey_env_unknown:nn \l_keys_key_str {#1} + } +\cs_new_protected:Npn \@@_anskey_env_unknown:nn #1#2 + { + \tl_if_blank:nTF {#2} + { + \msg_error:nnn { enumext } { anskey-env-key-unknown } {#1} + } + { + \msg_error:nnnn { enumext } { anskey-env-key-value-unknown } {#1} {#2} + } + } +% \end{macrocode} +% The function \cs{@@_anskey_env_reset_keys:} will leave the keys +% \mykeycmd{break-col}, \mykeycmd{item-join}, \mykeycmd{item-join}, +% \mykeycmd{item-star}, \mykeycmd{item-sym*} and \mykeycmd{item-pos*} +% undefined. We will apply this function using the \emph{hook} function +% \cs{@@_after_env:nn}. +% \iffalse +%% Restore keys for |scontents| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_anskey_env_reset_keys: + { + \keys_define:nn { scontents / scontents } + { + break-col .undefine:, + item-join .undefine:, + item-star .undefine:, + item-sym* .undefine:, + item-pos* .undefine:, + write-out .code:n = { + \bool_set_false:N \l__scontents_storing_bool + \bool_set_true:N \l__scontents_writing_bool + \tl_set:Nn \l__scontents_fname_out_tl {##1} + }, + write-out .value_required:n = true, + print-env .meta:nn = { scontents } { print-env = ##1 }, + print-env .default:n = true, + store-env .meta:nn = { scontents } { store-env = ##1 }, + unknown .code:n = { \__scontents_parse_environment_keys:n {##1} }, + } + } +% \end{macrocode} +% The function \cs{@@_rescan_anskey_env:n} will be responsible for +% bringing the \mymeta{body} of the environment saved in the sequence +% \myvarenv{g__scontents_name_\mymeta[cf=gray]{store name}_seq} to +% pass it to our \emph{sequence} and \emph{prop list}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_rescan_anskey_env:n #1 + { + \group_begin: + \int_set:Nn \tex_newlinechar:D { `\^^J } + \__scontents_rescan_tokens:x + { + \endgroup % This assumes \catcode`\\=0... Things might go off otherwise. + #1 + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_anskey_env_exec:,} +% The function \cs{@@_anskey_env_exec:} will be responsible for +% processing all the code necessary for the execution of the environment. +% The first thing will be to add our \mymeta{keys}. +% \iffalse +%% Function for exec all code for |anskey*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_anskey_env_exec: + { + \@@_before_env:nn { anskey* } + { + \@@_anskey_env_define_keys: + } +% \end{macrocode} +% Now we will execute our actions after the \myenv*{anskey*} +% environment is closed. We'll fetch the contents of the +% \emph{environment body} that is now saved in +% \myvarenv{g__scontents_name_\mymeta[cf=gray]{store name}_seq} and store it in +% the variable \cs{l_@@_store_anskey_env_tl} then we execute the rest of the functions. +% \begin{macrocode} + \hook_if_empty:nF {env/anskey*/after} + { + \hook_gremove_code:nn {env/anskey*/after} { * } + } + \@@_after_env:nn { anskey* } + { + \@@_anskey_env_save_keys: + \tl_clear:N \l_@@_store_anskey_env_tl + \tl_clear:N \l_@@_store_anskey_opt_tl + \bool_if:NT \l_@@_check_answers_bool + { + \tl_gset:Ne \l_@@_store_anskey_env_tl + { + \seq_item:ce { g__scontents_name_ \l_@@_store_name_tl _seq } { -1 } + } + \regex_match:nVTF + { ^\s* \z | ^\s* \u{c__scontents_hidden_space_str} \z } + \l_@@_store_anskey_env_tl + { + \msg_error:nn { enumext } { anskey-empty-arg } + } + { + \@@_anskey_env_store: + } + } + \@@_anskey_env_clean_vars: + \@@_anskey_env_reset_keys: + } + } +% \end{macrocode} +% \begin{important}* +% The use of \cs{hook_gremove_code:nn} is necessary here, otherwise the +% \mymarg{code} passed to \cs{@@_after_env:nn}|{anskey*}| will be accumulated +% for each execution. +% The last function \cs{@@_anskey_env_reset_keys:} is necessary so as +% not to hinder any \myenv{scontents} environment running within +% \myenv*{enumext} or \myenv*{enumext*}. +% \end{important} +% \end{macro} +% +% \begin{macro}[int]{\@@_anskey_env_save_keys:, \@@_anskey_env_store:, +% \@@_anskey_env_clean_vars:, } +% The function \cs{@@_anskey_env_save_keys:} processing the \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% passed to the environment and save this in the variable \cs{l_@@_store_anskey_opt_tl}. +% If the \mykeycmd{break-col} key is present and the environment is +% running under \myenv*{enumext} (not in \myenv*{enumext*}) +% we will add the key \mykeycmd{break-col}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_anskey_env_save_keys: + { + \bool_lazy_and:nnT + { \bool_if_p:N \g_@@_store_columns_break_bool } + { \bool_not_p:n { \l_@@_starred_bool } } + { + \tl_put_left:Ne \l_@@_store_anskey_opt_tl { ,break-col, } + } +% \end{macrocode} +% If the \mykeycmd{item-join} key is present and the command is running under +% \myenv*{enumext*} we will add to \cs{l_@@_store_anskey_opt_tl}. +% \begin{macrocode} + \bool_lazy_and:nnT + { \bool_not_p:n { \l_@@_starred_bool } } + { \int_compare_p:nNn { \g_@@_store_item_join_int } > { 1 } } + { + \tl_put_left::Ne \l_@@_store_anskey_opt_tl + { + ,item-join = \exp_not:V \g_@@_store_item_join_int, + } + } +% \end{macrocode} +% And now we will review the keys \mykeycmd{item-star}, \mykeycmd{item-sym*} and +% \mykeycmd{item-pos*} and pass them to \cs{l_@@_store_anskey_opt_tl}. +% \begin{macrocode} + \bool_if:NT \g_@@_store_item_star_bool + { + \tl_put_left:Ne \l_@@_store_anskey_opt_tl + { + ,item-star, + } + \tl_if_empty:NF \g_@@_store_item_symbol_tl + { + \tl_put_left:Ne \l_@@_store_anskey_opt_tl + { + ,item-sym* = \exp_not:V \g_@@_store_item_symbol_tl, + } + } + \dim_compare:nT + { + \g_@@_store_item_symbol_sep_dim != \c_zero_dim + } + { + \tl_put_left:Ne \l_@@_store_anskey_opt_tl + { + ,item-pos* = \exp_not:V \g_@@_store_item_symbol_sep_dim, + } + } + } + } +% \end{macrocode} +% The function \cs{@@_anskey_env_store:} will be responsible for storing +% the content of the environment using the functions \cs{@@_store_anskey_code:n} +% and \cs{@@_rescan_anskey_env:n}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_anskey_env_store: + { + \group_begin: + \tl_if_empty:NTF \l_@@_store_anskey_opt_tl + { + \exp_args:Ne + \@@_store_anskey_code:n + { + \@@_rescan_anskey_env:n { \l_@@_store_anskey_env_tl } + } + } + { + \keys_set_known:nV { enumext / anskey } \l_@@_store_anskey_opt_tl + \exp_args:Ne + \@@_store_anskey_code:n + { + \@@_rescan_anskey_env:n { \l_@@_store_anskey_env_tl } + } + } + \group_end: + } +% \end{macrocode} +% The function \cs{@@_anskey_env_clean_vars:} will return the global +% variables used by the \mymeta{keys} to their initial state. +% \begin{macrocode} +\cs_new_protected:Nn \@@_anskey_env_clean_vars: + { + \bool_gset_false:N \g_@@_store_columns_break_bool + \int_gzero:N \g_@@_store_item_join_int + \bool_gset_false:N \g_@@_store_item_star_bool + \tl_gclear:N \g_@@_store_item_symbol_tl + \dim_gzero:N \g_@@_store_item_symbol_sep_dim + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Executing \texttt{anskey*}, \texttt{check-ans} and write \texttt{.log}}\label{fun:exec-after-env} +% +% \begin{macro}{\@@_execute_after_env:} +% The \cs{@@_execute_after_env:} function will first return the +% appropriate message for the end of the environment in which the +% \mykey{save-ans} key is being executed, then call the +% \cs{@@_item_answer_diff:} function and then will write the values of +% the global variables used to the |.log| file. If the key +% \mykey{check-ans} is active it will execute the function +% \cs{@@_check_ans_show:} and show the result in the terminal, otherwise +% it will execute the function \cs{@@_check_ans_log:} and write the +% results in the |.log| file, undefine the environment \myenv*{anskey*} (\S\ref{env:anskey}) +% through the function \cs{@@_undefine_anskey_env:} and finally we execute the function +% \cs{@@_reset_global_vars:} returning the used variables to their +% original state. +% \iffalse +%% Function internal checking answer mechanism, clean vars and undefine |anskey*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_execute_after_env: + { + \int_compare:nNnT { \l_@@_level_int } = { 0 } + { + \tl_if_empty:NF \g_@@_store_name_tl + { + \@@_stop_save_ans_msg: + \@@_item_answer_diff: + \@@_log_global_vars: + \@@_log_answer_vars: + \bool_if:NTF \g_@@_check_ans_key_bool + { + \@@_check_ans_show: + } + { \@@_check_ans_log: } + \@@_undefine_anskey_env: + } + \@@_reset_global_vars: + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{important}* +% This function is passed to the function \cs{@@_after_env:nn} for the +% environments \myenv*{enumext} (\S\ref{env:enumext}) and \myenv*{enumext*} (\S\ref{env:starred}) +% and it is executed only when the environments are not nested or at some level of these.. +% \end{important} +% +% \subsection{Common functions for \env{keyans}, \env{keyans*} and \env{keyanspic}} +% +% \subsubsection{Storing content in prop list} +% +% \begin{macro}{\@@_keyans_addto_prop:n} +% The function \cs{@@_keyans_addto_prop:n} will pass the the current \mymeta{label} for |\item*| +% in \myenv*{keyans} environment and the current \mymeta{label} for +% |\anspic*| in \myenv*{keyanspic} environment followed by the +% \mymeta{contents} of the \emph{optional argument} of both commands +% to the \cs{l_@@_store_current_label_tl} variable, which will be stored +% to the \emph{prop list} defined by the \mykey{save-ans} key using the +% function \cs{@@_store_addto_prop:V}. +% \iffalse +%% Function for storing in prop list for |keyans| and |keyanspic| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_addto_prop:n #1 + { + \tl_clear:N \l_@@_store_current_label_tl + \int_compare:nNnTF { \l_@@_keyans_pic_level_int } = { 1 } + { + \tl_put_right:Ne \l_@@_store_current_label_tl { \l_@@_label_vi_tl } + } + { + \tl_put_right:Ne \l_@@_store_current_label_tl { \l_@@_label_v_tl } + } +% \end{macrocode} +% If the \emph{optional argument} is present and the \mykey{save-sep} +% key is not empty, we save it. +% \begin{macrocode} + \tl_if_novalue:nF { #1 } + { + \tl_if_empty:NF \l_@@_store_keyans_item_opt_sep_tl + { + \tl_put_right:Ne \l_@@_store_current_label_tl + { + \l_@@_store_keyans_item_opt_sep_tl + } + } + \tl_put_right:Ne \l_@@_store_current_label_tl { #1 } + } + \@@_store_addto_prop:V \l_@@_store_current_label_tl + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The \texttt{save-ref} key for \env{keyans}, \env{keyans*} and \env{keyanspic}}\label{fun:save-ref-keyans} +% +% The \emph{\enquote{internal label and ref}} system for the \myenv*{keyans}, +% \myenv*{keyans*} and \myenv*{keyanspic} environments has \emph{slight differences} +% with the one implemented for \ics*{anskey} basically because in this +% environments the interest is in the current \mymeta{label} for |\item*| +% and |\anspic*| with the \mymeta{contents} of the \emph{optional argument}. The mechanism +% defined here will allow to execute \ics{ref}\mymarg{store name \textcolor{red}{:} position} and +% will return |1.(A)|. +% +% \begin{macro}{\@@_keyans_store_ref:, \@@_keyans_store_ref_aux_i:, +% \@@_keyans_store_ref_aux_ii:,} +% The function \cs{@@_keyans_store_ref:} handles the +% \emph{\enquote{internal label and ref}} system used by the +% \mykey{save-ref} key for \ics*{item*} and \ics*{anspic*} commands. +% First we will create copies of the current \mymeta{labels} and remove +% the dots \enquote{\textcolor{red}{\texttt{.}}} from them, we do not +% want to get double dots in references. +% \iffalse +%% Internal label and ref function for |keyans|, |keyans*| and |keyanspic| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_store_ref: + { + \bool_if:NT \l_@@_store_ref_key_bool + { + \cs_set_protected:Npn \@@_tmp:n ##1 + { + \tl_set_eq:cc { l_@@_label_copy_##1_tl } { l_@@_label_##1_tl } + \tl_reverse:c { l_@@_label_copy_##1_tl } + \tl_remove_once:cn { l_@@_label_copy_##1_tl } { . } + \tl_reverse:c { l_@@_label_copy_##1_tl } + } + \clist_map_inline:nn { i, v, vi, vii, viii } { \@@_tmp:n {##1} } + \@@_keyans_store_ref_aux_i: + } + } +% \end{macrocode} +% The auxiliary function \cs{@@_keyans_store_ref_aux_i:} set the +% variable \cs{l_@@_newlabel_arg_one_tl} which will contain +% \mymarg{store name \textcolor{red}{:} position} analyzing whether +% the environment in which they are executed is \myenv*{enumext*} or +% \myenv*{enumext}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_store_ref_aux_i: + { + \bool_if:NT \g_@@_starred_bool + { + \tl_set_eq:NN \l_@@_label_copy_i_tl \l_@@_label_copy_vii_tl + } + \int_compare:nNnT { \l_@@_keyans_pic_level_int } = { 1 } + { + \tl_put_right:Ne \l_@@_newlabel_arg_two_tl + { \l_@@_label_copy_i_tl . \l_@@_label_copy_vi_tl } + } + \int_compare:nNnT { \l_@@_keyans_level_int } = { 1 } + { + \tl_put_right:Ne \l_@@_newlabel_arg_two_tl + { \l_@@_label_copy_i_tl . \l_@@_label_copy_v_tl } + } + \int_compare:nNnT { \l_@@_keyans_level_h_int } = { 1 } + { + \tl_put_right:Ne \l_@@_newlabel_arg_two_tl + { \l_@@_label_copy_i_tl . \l_@@_label_copy_viii_tl } + } + \tl_put_right:Ne \l_@@_newlabel_arg_one_tl + { + \l_@@_store_name_tl \c_colon_str + \int_eval:n { \prop_count:c { g_@@_ \l_@@_store_name_tl _prop } } + } + \@@_keyans_store_ref_aux_ii: + } +% \end{macrocode} +% Now auxiliary function \cs{@@_keyans_store_ref_aux_ii:} save the +% result in the variable \cs{l_@@_write_aux_file_tl} and finally we +% write in the |.aux| file. +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_store_ref_aux_ii: + { + \tl_put_right:Ne \l_@@_write_aux_file_tl + { + \@@_newlabel:nn + { \exp_not:V \l_@@_newlabel_arg_one_tl } + { \l_@@_newlabel_arg_two_tl } + } + \l_@@_write_aux_file_tl + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Storing content in sequence} +% +% \begin{macro}{\@@_keyans_addto_seq:n, \@@_keyans_addto_seq_link:} +% The function \cs{@@_keyans_addto_seq:n} will pass the +% contents of the current \mymeta{label} \cs{l_@@_label_v_tl} for the +% \myenv*{keyans} environment and the \cs{l_@@_label_vi_tl} for the \myenv*{keyanspic} environment when using +% \ics*{item*} and \ics*{anspic*}, followed by the \mymeta{contents} of the +% \emph{optional argument} of both commands to the \cs{l_@@_store_current_label_tl} +% variable to the sequence defined by the \mykey{save-ans} key. +% \iffalse +%% Function for storing in sequence for |keyans| and |keyanspic| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_addto_seq:n #1 + { + \tl_clear:N \l_@@_store_current_label_tl + \int_compare:nNnTF { \l_@@_keyans_pic_level_int } = { 1 } + { + \tl_put_right:Ne \l_@@_store_current_label_tl { \item \l_@@_label_vi_tl } + } + { + \tl_put_right:Ne \l_@@_store_current_label_tl { \item \l_@@_label_v_tl } + } + \tl_if_novalue:nF { #1 } + { + \tl_if_empty:NF \l_@@_store_keyans_item_opt_sep_tl + { + \tl_put_right:Ne \l_@@_store_current_label_tl + { + \l_@@_store_keyans_item_opt_sep_tl + } + } + \tl_put_right:Ne \l_@@_store_current_label_tl { #1 } + } + \@@_keyans_addto_seq_link: + } +% \end{macrocode} +% Checks if the \mykey{save-ref} key is active along with the +% \mypkg{hyperref} package load, if both conditions are met, it will +% create the \ics{hyperlink} and then store using the +% \cs{@@_store_addto_seq:V} function. +% Finally, copy the contents of the variable \cs{l_@@_store_current_label_tl} +% into the global variable \cs{g_@@_check_ans_item_tl} to be used +% by the function \cs{@@_check_starred_cmd:n} and increment +% the value of the integer variable \cs{g_@@_item_anskey_int} handled +% by the \mykey{check-ans} key. +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_addto_seq_link: + { + \bool_lazy_and:nnT + { \bool_if_p:N \l_@@_store_ref_key_bool } + { \bool_if_p:N \l_@@_hyperref_bool } + { + \tl_put_right:Ne \l_@@_store_current_label_tl + { + \hfill \exp_not:N \hyperlink + { + \exp_not:V \l_@@_newlabel_arg_one_tl + } + { \exp_not:V \l_@@_mark_ref_sym_tl } + } + } + \@@_store_addto_seq:V \l_@@_store_current_label_tl + \bool_if:NT \l_@@_check_answers_bool + { + \int_gincr:N \g_@@_item_anskey_int + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The \texttt{show-ans} and \texttt{show-pos} keys for \env{keyans} and \env{keyanspic}} +% +% The code is very similar to the \ics*{anskey} code, but, if I change +% the order of the operations the counter off \mymeta{label} are incorrect. +% +% \begin{macro}{\@@_keyans_show_left:n,\@@_keyans_show_ans:, \@@_keyans_show_pos:, \@@_keyans_show_item_opt:,} +% Common function to show \emph{starred commands} |\item*| and \mymeta{position} of +% stored content in \emph{prop list} for \myenv*{keyans} and +% \myenv*{keyanspic}. Need add |1| to \myvarenv{g__@@_\mymeta[cf=gray]{store name}_prop} for \mykey{show-pos} key. +% \iffalse +%% Function for |show-ans| and |show-pos| keys for |keyans| and |keyanspic| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_show_left:n #1 + { + \tl_if_novalue:nF { #1 } + { + \tl_set:Ne \l_@@_store_current_opt_arg_tl { #1 } + } + \bool_if:NT \l_@@_show_answer_bool + { + \@@_keyans_show_ans: + } + \bool_if:NT \l_@@_show_position_bool + { + \@@_keyans_show_pos: + } + } +\cs_new_protected:Nn \@@_keyans_show_item_opt: + { + \tl_if_empty:NF \l_@@_store_current_opt_arg_tl + { + \bool_lazy_or:nnT + { \bool_if_p:N \l_@@_show_answer_bool } + { \bool_if_p:N \l_@@_show_position_bool } + { + \@@_keyans_wrapper_opt:n { \l_@@_store_current_opt_arg_tl } \c_space_tl + } + } + } +\cs_new_protected:Nn \@@_keyans_show_ans: + { + \bool_if:NT \l_@@_starred_bool + { + \dim_set_eq:NN \l_@@_labelwidth_i_dim \l_@@_labelwidth_vii_dim + \dim_set_eq:NN \l_@@_labelsep_i_dim \l_@@_labelsep_vii_dim + } + \tl_put_left:Nn \l_@@_label_v_tl + { + \@@_print_keyans_box:NN + \l_@@_labelwidth_i_dim \l_@@_labelsep_i_dim + } + } +\cs_new_protected:Nn \@@_keyans_show_pos: + { + \bool_if:NT \l_@@_starred_bool + { + \dim_set_eq:NN \l_@@_labelwidth_i_dim \l_@@_labelwidth_vii_dim + \dim_set_eq:NN \l_@@_labelsep_i_dim \l_@@_labelsep_vii_dim + } + \int_compare:nNnTF { \l_@@_keyans_pic_level_int } = { 1 } + { + \tl_set:Ne \l_@@_mark_answer_sym_tl + { + \group_begin: + \exp_not:N \normalfont + \exp_not:N \footnotesize [ \int_eval:n + { + \prop_count:c { g_@@_ \l_@@_store_name_tl _prop } + } + ] + \group_end: + } + } + { + \tl_set:Ne \l_@@_mark_answer_sym_tl + { + \group_begin: + \exp_not:N \normalfont + \exp_not:N \footnotesize [ \int_eval:n + { + \prop_count:c { g_@@_ \l_@@_store_name_tl _prop } + 1 + } + ] + \group_end: + } + } + \tl_put_left:Nn \l_@@_label_v_tl + { + \@@_print_keyans_box:NN + \l_@@_labelwidth_i_dim \l_@@_labelsep_i_dim + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Redefining \cs{item} and \cs{makelabel} in \env{enumext}}\label{env:item-starred-enumext} +% +% Redefining the |\item| command is not as simple as I thought. This +% command works in conjunction with the \ics{makelabel} command so I have +% to redefine both of them, in addition to this, we will have to use a +% couple of \emph{global} variables to pass the values from one command +% to the other. +% +% \smallskip +% +% When \emph{labeling} \texttt{PDF} is active |\makelabel| is redefined +% as |\hss #1| and the only way to get the \mykey{align} key to work +% correctly is to redefine |\makelabel| using |\makebox|. The best way to +% implement this is to use the conditional command |\IfDocumentMetadataTF| +% to force this redefinition and the dedicated \mykey{mode-box} key to +% manually activate it by the user. +% +% \smallskip +% +% The \ics*{item} and \ics*{item}\myoarg{custom} commands work in the +% usual way on \myenv*{enumext} and we will add \ics*{item*}, \ics*{item*}\myoarg{symbol} and +% \ics*{item*}\myoarg{symbol}\myoarg{offset}. +% +% \begin{macro}[int]{\@@_default_item:n} +% First we will see if the \emph{optional argument} is present, if it is NOT +% present we will check the state of the variable \cs{l_@@_check_answers_bool} +% set by the key \mykey{no-store}, set the boolean variable +% \myvarenv{l__@@_wrap_label_X_bool} to \enquote{true} for the key \mykey{wrap-label} +% and execute \cs{@@_item_std:w} and the key \mykey{itemindent}, otherwise we will check the state +% of the boolean variable \myvarenv{l__@@_wrap_label_opt_X_bool} set +% by the key \mykey{wrap-label*} and execute \cs{@@_item_std:w} with +% the \emph{optional argument} and the key \mykey{itemindent}. +% \iffalse +%% Internal function for |\item| whit check-answer mechanism in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_default_item:n #1 + { + \tl_if_novalue:nTF {#1} + { + \bool_if:NT \l_@@_check_answers_bool + { + \int_gincr:N \g_@@_item_number_int + \bool_set_true:N \l_@@_item_number_bool + } + \bool_set_true:c { l_@@_wrap_label_ \@@_level: _bool } + \@@_item_std:w \tl_use:c { l_@@_fake_item_indent_ \@@_level: _tl } + } + { + \bool_set_eq:cc + { l_@@_wrap_label_ \@@_level: _bool } + { l_@@_wrap_label_opt_ \@@_level: _bool } + \@@_item_std:w [#1] \tl_use:c { l_@@_fake_item_indent_ \@@_level: _tl } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_starred_item:nn, \@@_item_star_exec:,} +% The \ics*{item*}, \ics*{item*}\myoarg{symbol} and \ics*{item*}\myoarg{symbol}\myoarg{offset} +% works like the \emph{numbered} |\item|, but placing a \mymeta{symbol} +% to the \emph{\enquote{left}} of the \mymeta{label} separated from +% it by the value the second \emph{optional argument} \mymeta{offset}. +% +% \begin{arguments} +% \item \myvarenv{l__@@_item_symbol_X_tl} +% \item \myvarenv{l__@@_item_symbol_sep_X_dim} +% \end{arguments} +% +% First we will make a copy of \myvarenv{l__@@_item_symbol_X_tl} which is +% set by the key \mykey{item-sym*} or passed as \emph{\enquote{first}} \emph{optional argument} in +% the global variable \cs{g_@@_item_symbol_aux_tl}, followed by setting the +% variable \myvarenv{l__@@_item_symbol_sep_X_dim} set by the key +% \mykey{item-pos*} or by the \emph{\enquote{second}} \emph{optional argument}, +% then we will see the state of the variable \cs{l_@@_check_answers_bool} +% set by the key \mykey{no-store}, set the boolean variable +% \myvarenv{l__@@_wrap_label_X_bool} to \enquote{true} for the key \mykey{wrap-label} +% and execute \cs{@@_item_std:w} and the key \mykey{itemindent}. +% \iffalse +%% Internal function for |\item*[symb][sep]| whit check-answer mechanism in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_starred_item:nn #1 #2 + { + \tl_if_novalue:nTF {#1} + { + \tl_gset_eq:Nc + \g_@@_item_symbol_aux_tl { l_@@_item_symbol_ \@@_level: _tl } + } + { + \tl_gset:Nn \g_@@_item_symbol_aux_tl {#1} + } + \tl_if_novalue:nTF {#2} + { + \dim_set_eq:cc + { l_@@_item_symbol_sep_ \@@_level: _dim } + { l_@@_labelsep_ \@@_level: _dim } + } + { + \dim_set:cn { l_@@_item_symbol_sep_ \@@_level: _dim } {#2} + } + \bool_if:NT \l_@@_check_answers_bool + { + \int_gincr:N \g_@@_item_number_int + \bool_set_true:N \l_@@_item_number_bool + } + \bool_set_true:c { l_@@_wrap_label_ \@@_level: _bool } + \@@_item_std:w \tl_use:c { l_@@_fake_item_indent_ \@@_level: _tl } + } +% \end{macrocode} +% The function \cs{@@_item_star_exec:} will be responsible for +% executing |\item*| for the \myenv*{enumext} environment. +% \iffalse +%% Function for |\item*[sym][sep]| in |\makelabel| for |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_item_star_exec: + { + \tl_if_empty:cF { l_@@_item_symbol_ \@@_level: _tl } + { + \mode_leave_vertical: + \skip_horizontal:n { -\dim_use:c { l_@@_item_symbol_sep_ \@@_level: _dim } } + \hbox_overlap_left:n { \g_@@_item_symbol_aux_tl } + \skip_horizontal:n { \dim_use:c { l_@@_item_symbol_sep_ \@@_level: _dim } } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_redefine_item:} +% The function \cs{@@_redefine_item:} will redefine the |\item| +% command in the \myenv*{enumext} environment adding |\item*|. +% This function are passed to \myvarenv{__@@_list_arg_two_X:} used +% in the definition of the \myenv*{enumext} environment (\S\ref{env:enumext}). +% \iffalse +%% Redefinition of |\item| for |\item*[sym][sep]| in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_redefine_item: + { + \RenewDocumentCommand \item { s o o } + { + \bool_if:nTF {##1} + { + \@@_starred_item:nn {##2} {##3} + } + { \@@_default_item:n {##2} } + } + } +% \end{macrocode} +% \end{macro} +% +% \medskip +% +% \begin{macro}{\@@_make_label:,\@@_make_label_std:,\@@_make_label_box:} +% The function \cs{@@_make_label:} redefine \ics{makelabel} for the keys +% \mykey{mode-box}, \mykey{align}, \mykey{font}, \mykey{wrap-label}, +% \mykey{wrap-label*} and |\item*| for \myenv*{enumext} environment. +% This function are passed to \myvarenv{__@@_list_arg_two_X:} used +% in the definition of the \myenv*{enumext} environment (\S\ref{env:enumext}). +% \iffalse +%% Redefinition of |\makelabel| for |\item| and |\item*[sym][sep]| in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_make_label: + { + \IfDocumentMetadataTF + { + \@@_make_label_box: + } + { + \bool_if:NTF \l_@@_mode_box_bool + { + \@@_make_label_box: + } + { + \@@_make_label_std: + } + } + } +% \end{macrocode} +% Standard definition when |\DocumentMetadata| is not active. +% \begin{macrocode} +\cs_new_protected:Nn \@@_make_label_std: + { + \RenewDocumentCommand \makelabel { m } + { + \tl_use:c { l_@@_label_fill_left_ \@@_level: _tl } + \tl_use:c { l_@@_label_font_style_ \@@_level: _tl } + \bool_if:cTF { l_@@_wrap_label_ \@@_level: _bool } + { + \@@_item_star_exec: + \use:c { @@_wrapper_label_ \@@_level: :n } { ##1 } + } + { ##1 } + \tl_use:c { l_@@_label_fill_right_ \@@_level: _tl } + \tl_gclear:N \g_@@_item_symbol_aux_tl + } + } +% \end{macrocode} +% Definition using |\makebox| when |\DocumentMetadata| is active or +% \mykey{mode-box} is active. +% +% \begin{important} +% Here it is necessary to use |\strut\smash| to maintain text \emph{alignment} +% in case the user wants to use |\labelbx| for example. In my experiments +% with \emph{mimicking} the \myenv{description} environment it was the only way +% out and it seems to have no adverse effects and may serve in the future +% as a basis for a more generic \myenv{list} environment package than +% \mypkg*{enumext}. +% \end{important} +% +% \begin{macrocode} +\cs_new_protected:Nn \@@_make_label_box: + { + \RenewDocumentCommand \makelabel { m } + { + \strut\smash + { + \makebox + [ \dim_use:c { l_@@_labelwidth_ \@@_level: _dim } ] + [ \str_use:c { l_@@_align_label_pos_ \@@_level: _str } ] + { + \tl_use:c { l_@@_label_font_style_ \@@_level: _tl } + \bool_if:cTF { l_@@_wrap_label_ \@@_level: _bool } + { + \@@_item_star_exec: + \use:c { @@_wrapper_label_ \@@_level: :n } { ##1 } + } + { ##1 } + \tl_gclear:N \g_@@_item_symbol_aux_tl + } + } % close smash + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting \texttt{item-sym*} and \texttt{item-pos*} keys}\label{key:item-starred} +% +% In order to have a cleaner implementation of |\item*| for the +% \myenv*{enumext} and \myenv*{enumext*} environments it is best to +% define a couple of keys that allow us to control and set by default the +% \mymeta{symbol} and its \mymeta{offset}. +% +% \begin{macro}[int]{item-sym*, item-pos*} +% Define and set \mykey{item-sym*} and \mykey{item-pos*} keys for +% \myenv*{enumext} and \myenv*{enumext*}. +% \iffalse +%% Add |item-sym*| and |item-sep*| keys. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:nn #1 #2 + { + \keys_define:nn { enumext / #1 } + { + item-sym* .tl_set:c = { l_@@_item_symbol_#2_tl }, + item-sym* .value_required:n = true, + item-sym* .initial:n = {\textasteriskcentered}, + item-pos* .dim_set:c = { l_@@_item_symbol_sep_#2_dim }, + item-pos* .value_required:n = true, + } + } +\clist_map_inline:nn + { + {level-1}{i}, {level-2}{ii}, {level-3}{iii}, {level-4}{iv}, {enumext*}{vii} + } + { \@@_tmp:nn #1 } +% \end{macrocode} +% \end{macro} +% +% \subsection{Handling unknown keys}\label{key:unknown-keys} +% +% At this point in the code I already know that I will not add more +% \mymeta{keys} and since I have already been quite \emph{paranoid and +% restrictive} with the definitions of environments and commands, the +% only thing left to do is do it with the \mymeta{keys} (you have to be +% consistent in life). +% +% \subsubsection{Handling unknown keys for \env{keyans}, \env{keyans*} and \env{keyanspic}}\label{key:unknown-keys-keyans} +% +% \begin{macro}[int]{unknown, \@@_keyans_unknown_keys:n, \@@_keyans_unknown_keys:nn} +% Define and set |unknown| key for \myenv*{keyans}, \myenv*{keyans*} +% and \myenv*{keyanspic} environments. +% \iffalse +%% Add keys |unknown| for |keyans|, |keyans*| and |keyanspic| environments. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / #1 } + { + unknown .code:n = { \@@_keyans_unknown_keys:n {##1} } + } + } +\clist_map_inline:nn { keyans, keyans*, keyanspic } { \@@_tmp:n {#1} } +% \end{macrocode} +% Internal functions for handling |unknown| key. +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_unknown_keys:n #1 + { + \exp_args:NV \@@_keyans_unknown_keys:nn \l_keys_key_str {#1} + } +\cs_new_protected:Npn \@@_keyans_unknown_keys:nn #1#2 + { + \tl_if_blank:nTF {#2} + { + \msg_error:nnn { enumext } { keyans-unknown-key } {#1} + } + { + \msg_error:nnnn { enumext } { keyans-unknown-key-value } {#1} {#2} + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Handling unknown keys for \env{enumext*}}\label{key:unknown-keys-starred} +% +% \begin{macro}[int]{unknown, \@@_starred_unknown_keys:n, \@@_starred_unknown_keys:nn} +% Define and set |unknown| key for \myenv*{enumext*} environment. +% \iffalse +%% Add keys |unknown| for |enumext*| environment. +% \fi +% \begin{macrocode} +\keys_define:nn { enumext / enumext* } + { + unknown .code:n = { \@@_starred_unknown_keys:n {#1} } + } +% \end{macrocode} +% Internal functions for handling |unknown| key. +% \begin{macrocode} +\cs_new_protected:Npn \@@_starred_unknown_keys:n #1 + { + \exp_args:NV \@@_starred_unknown_keys:nn \l_keys_key_str {#1} + } +\cs_new_protected:Npn \@@_starred_unknown_keys:nn #1#2 + { + \tl_if_blank:nTF {#2} + { + \msg_error:nnn { enumext } { starred-unknown-key } {#1} + } + { + \msg_error:nnnn { enumext } { starred-unknown-key-value } {#1} {#2} + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Handling unknown keys for \env{enumext}}\label{key:unknown-keys-standar} +% +% \begin{macro}[int]{unknown, \@@_standar_unknown_keys:n, \@@_standar_unknown_keys:nn} +% Defines and set the key |unknown| for \myenv*{enumext} environment. +% \iffalse +%% Add keys |unknown| for |enumext| environment. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \keys_define:nn { enumext / #1 } + { + unknown .code:n = { \@@_standar_unknown_keys:n {##1} } + } + } +\clist_map_inline:nn { level-1,level-2,level-3,level-4 } { \@@_tmp:n {#1} } +% \end{macrocode} +% Internal functions for handling |unknown| key. +% \begin{macrocode} +\cs_new_protected:Npn \@@_standar_unknown_keys:n #1 + { + \exp_args:NV \@@_standar_unknown_keys:nn \l_keys_key_str {#1} + } +\cs_new_protected:Npn \@@_standar_unknown_keys:nn #1#2 + { + \tl_if_blank:nTF {#2} + { + \msg_error:nnn { enumext } { standar-unknown-key } {#1} + } + { + \msg_error:nnnn { enumext } { standar-unknown-key-value } {#1} {#2} + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Redefining \cs{item} and \cs{makelabel} in \env{keyans}}\label{cmd:item-starred} +% +% The \ics*{item} and \ics*{item}\myoarg{custom} commands work in the +% usual way in \myenv*{keyans}, but the \ics*{item*} and \ics*{item*}\myoarg{content} +% commands \emph{store} the current \mymeta{label} next to the \mymeta{content} +% if it is present in the \emph{sequence} and \emph{prop list} defined by +% \mykey{save-ans} key. +% +% \begin{macro}{\@@_keyans_default_item:n,} +% The function \cs{@@_keyans_default_item:n} executes the original +% behavior of the \ics*{item} along with the keys \mykey{wrap-label}, +% \mykey{wrap-label*} and \mykey{itemindent}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_default_item:n #1 + { + \tl_if_novalue:nTF { #1 } + { + \bool_set_true:N \l_@@_wrap_label_v_bool + \@@_item_std:w \tl_use:N \l_@@_fake_item_indent_v_tl + } + { + \bool_set_eq:NN \l_@@_wrap_label_v_bool \l_@@_wrap_label_opt_v_bool + \@@_item_std:w [#1] \tl_use:N \l_@@_fake_item_indent_v_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_keyans_starred_item:n} +% The function \cs{@@_keyans_starred_item:n} which will make a temporary +% copy of the current \mymeta{label}, execute the \mykey{show-ans} +% or \mykey{show-pos} keys using the function \cs{@@_keyans_show_left:n} +% and will display the \mymeta{contents} of that item using the internal +% copy \cs{@@_item_std:w}, this is necessary to prevent incrementing +% the current \emph{\enquote{counter}} of the original \mymeta{label}, +% followed by this it will execute function \cs{@@_keyans_show_item_opt:} +% handled by \mykey{wrap-opt} key. +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_starred_item:n #1 + { + \tl_set_eq:NN \l_@@_store_current_label_tmp_tl \l_@@_label_v_tl + \@@_keyans_show_left:n { #1 } + \bool_set_true:N \l_@@_wrap_label_v_bool + \@@_item_std:w \tl_use:N \l_@@_fake_item_indent_v_tl + \@@_keyans_show_item_opt: +% \end{macrocode} +% Recover the original value of the current \mymeta{label} and \emph{store} +% it first in the \emph{prop list} (including the \emph{optional argument}), +% run the internal \emph{\enquote{label and ref}} system if the +% \mykey{save-ref} key is active, \emph{store} it in the \emph{sequence} +% and finally increments \cs{g_@@_check_starred_cmd_int} for internal +% check system. +% \begin{macrocode} + \tl_set_eq:NN \l_@@_label_v_tl \l_@@_store_current_label_tmp_tl + \@@_keyans_addto_prop:n { #1 } + \@@_keyans_store_ref: + \@@_keyans_addto_seq:n { #1 } + \int_gincr:N \g_@@_check_starred_cmd_int + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\item*,\@@_keyans_redefine_item:} +% The function \cs{@@_keyans_redefine_item:} is responsible for adding +% the \emph{starred argument} and \emph{optional argument} by the +% \cs{@@_list_arg_two_v:} function in the definition of the +% \myenv*{keyans} environment. Here we need to use +% |\peek_remove_spaces:n| to prevent an unwanted space when using +% |\item*| in conjunction with the \mykey{itemindent} key. +% This function are passed to \myvarenv{__@@_list_arg_two_v:} used +% in the definition of the \myenv*{keyans} environment (\S\ref{ltx:second-arg}). +% \iffalse +%% Redefine |\item| for |keyans| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_redefine_item: + { + \RenewDocumentCommand \item { s o } + { + \bool_if:nTF {##1} + { + \peek_remove_spaces:n + { + \@@_keyans_starred_item:n {##2} + } + } + { + \@@_keyans_default_item:n {##2} + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_keyans_make_label:,\@@_keyans_make_label_std:,\@@_keyans_make_label_box:} +% The function \cs{@@_keyans_make_label:} redefine \ics{makelabel} +% for the keys \mykey{mode-box}, \mykey{align}, \mykey{font}, +% \mykey{wrap-label}, \mykey{wrap-label*} and |\item*| for \myenv*{keyans} +% environment. +% This function are passed to \myvarenv{__@@_list_arg_two_v:} used +% in the definition of the \myenv*{keyans} environment (\S\ref{ltx:second-arg}). +% \iffalse +%% Redefine |\makelabel| for |keyans| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_make_label: + { + \IfDocumentMetadataTF + { + \@@_keyans_make_label_box: + } + { + \bool_if:NTF \l_@@_mode_box_bool + { + \@@_keyans_make_label_box: + } + { + \@@_keyans_make_label_std: + } + } + } +% \end{macrocode} +% Standard definition when |\DocumentMetadata| is not active. +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_make_label_std: + { + \RenewDocumentCommand \makelabel { m } + { + \tl_use:N \l_@@_label_fill_left_v_tl + \tl_use:N \l_@@_label_font_style_v_tl + \bool_if:NTF \l_@@_wrap_label_v_bool + { + \@@_wrapper_label_v:n { ##1 } + } + { ##1 } + \tl_use:N \l_@@_label_fill_right_v_tl + } + } +% \end{macrocode} +% Definition using |\makebox| when |\DocumentMetadata| is active or +% \mykey{mode-box} is active. +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_make_label_box: + { + \RenewDocumentCommand \makelabel { m } + { + \strut\smash + { + \makebox[ \l_@@_labelwidth_v_dim ][ \l_@@_align_label_pos_v_str ] + { + \tl_use:N \l_@@_label_font_style_v_tl + \bool_if:NTF \l_@@_wrap_label_v_bool + { + \@@_wrapper_label_v:n { ##1 } + } + { ##1 } + } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Second argument of the lists}\label{ltx:second-arg} +% +% At this point of the code we have already programmed most the necessary +% tools to create a custom \myenv{list} environment, remember that the function +% \cs{@@_start_list:nn} takes two arguments, the first one we have +% ready, the second one we will define for all the levels of the +% environment \myenv*{enumext} and the environment \myenv*{keyans}. +% +% \subsubsection{Calculation of \cs{leftmargin} and \cs{itemindent}}\label{int:leftmargin} +% +% Consider the figure \ref{fig:eight} where the default margins (on the +% left) of a list are represented. +% +% \begin{figure}[!htbp] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[<->,color=gray] (-0.5,6.175) --node[below,text=lightgray,font=\footnotesize\ttfamily]{margin page} (2,6.175); +% \draw[line width=0.5pt,dash pattern=on 2pt off 2pt,color=gray] (2,4.85) -- (2,7.5); +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{list-offset}} (4.5,7.0); +% \draw[<->,color=gray] (4.5,7.0) --node[above,text=blue!75]{\vphantom{p}\texttt{\textbackslash{}labelwidth}} (7.5,7.0); +% \draw[<->,color=gray] (7.5,7.0) --node[above,text=blue!75]{\texttt{\textbackslash{}labelsep}} (9.5,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (4.5,6.5) rectangle (7.5,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.5,6.5) rectangle (9.5,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,6.5) rectangle (15,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,6.0) rectangle (15,6.35); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,5.5) rectangle (15,5.85); +% \draw[<->,color=gray] (1.25,5.35) --node[below,text=blue!75]% +% {\begin{tabular}{c} +% \texttt{\textbackslash{}leftmargin + \textbackslash{}itemindent} \\ +% \textcolor{optcolor}{\texttt{list-indent}} +% \end{tabular}} (9.5,5.35); +% \end{tikzpicture} +% \caption{Representation of standard horizontal lengths in \myenv{list} environment.} +% \label{fig:eight} +% \end{figure} +% +% The idea is to have control over these margins so that our list does +% not overlap the left margin of the page. The \emph{key} relationship is that +% the right edge of the |\labelsep| equals the right edge of the |\itemindent|, +% so that the left edge of the \emph{label box} is at |\leftmargin+\itemindent| minus |\labelwidth+\labelsep|. +% Thus, the handling of the margins by the package will be as shown in +% the figure \ref{fig:nine}. +% +% \begin{figure}[!htbp] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[<->,color=gray] (-0.5,6.175) --node[below,text=lightgray,font=\footnotesize\ttfamily]{margin page} (2,6.175); +% \draw[line width=0.5pt,dash pattern=on 2pt off 2pt,color=gray] (2,4.85) -- (2,7.5); +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{list-offset}} (4.5,7.0); +% \draw[<->,color=gray] (4.5,7.0) --node[above,text=blue!75]{\vphantom{p}\texttt{\textbackslash{}labelwidth}} (7.5,7.0); +% \draw[<->,color=gray] (7.5,7.0) --node[above,text=blue!75]{\texttt{\textbackslash{}labelsep}} (9.5,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (4.5,6.5) rectangle (7.5,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.5,6.5) rectangle (9.5,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,6.5) rectangle (15,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,6.0) rectangle (15,6.35); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (9.5,5.5) rectangle (15,5.85); +% \draw[<->,color=gray] (4.5,5.35) --node[below,text=blue!75]% +% {\begin{tabular}{c} +% \texttt{\textbackslash{}leftmargin + \textbackslash{}itemindent} \\ +% \textcolor{optcolor}{\texttt{list-indent}} +% \end{tabular}} (9.5,5.35); +% \end{tikzpicture} +% \caption{Representation of horizontal lengths concept in list in \mypkg*{enumext}.} +% \label{fig:nine} +% \end{figure} +% +% Where the default values will look like in the figure \ref{fig:last}. +% +% \begin{figure}[htbp] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% \draw[<->,color=gray] (-0.5,6.175) --node[below,text=lightgray,font=\footnotesize\ttfamily]{margin page} (2,6.175); +% \draw [line width=0.5pt,dash pattern=on 2pt off 2pt,color=gray] (2,4.85) -- (2,7.5); +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=blue!75]{\vphantom{p}\texttt{labelwidth}} (5.0,7.0); +% \draw[<->,color=gray] (5.0,7.0) --node[above,text=blue!75]{\texttt{labelsep}} (7.0,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,6.5) rectangle (5.0,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,6.5) rectangle (7.0,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.5) rectangle (15,6.85);% item width +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.0) rectangle (15,6.35); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,5.5) rectangle (15,5.85); +% \draw[<->,color=gray] (2.0,5.35) --node[below,text=blue!75]% +% {\begin{tabular}{c} +% \texttt{\textbackslash{}leftmargin + \textbackslash{}itemindent} \\ +% \textcolor{optcolor}{\texttt{list-indent}} +% \end{tabular}} +% (7.0,5.35); +% \end{tikzpicture} +% \caption{Default horizontal lengths in \mypkg*{enumext}.} +% \label{fig:last} +% \end{figure} +% +% \begin{macro}{\@@_calc_hspace:NNNNNNN, \@@_calc_hspace:ccccccc} +% The function \cs{@@_calc_hspace:NNNNNNN} takes seven arguments to be +% able to determine horizontal spaces for all list environment: +% +% \begin{verbatim} +% #1: \l__enumext_labelwidth_X_dim #2: \l__enumext_labelsep_X_dim +% #3: \l__enumext_listoffset_X_dim #4: \l__enumext_leftmargin_tmp_X_dim +% #5: \l__enumext_leftmargin_X_dim #6: \l__enumext_itemindent_X_dim +% #7: \l__enumext_leftmargin_tmp_X_bool +% \end{verbatim} +% +% And returns the \emph{\enquote{adjusted}} values of |\leftmargin| +% and |\itemindent|. +% +% \smallskip +% +% This function is passed to \myvarenv{__@@_list_arg_two_X:} which +% is used in the definition of the \myenv*{enumext} and \myenv*{keyans} +% environments (\S\ref{ltx:second-arg}). +% \iffalse +%% Function to calc of horizontal length for all list environment. +%% #1: \l__enumext_labelwidth_X_dim #2: \l__enumext_labelsep_X_dim +%% #3: \l__enumext_listoffset_X_dim #4: \l__enumext_leftmargin_tmp_X_dim +%% #5: \l__enumext_leftmargin_X_dim #6: \l__enumext_itemindent_X_dim +%% #7: \l__enumext_leftmargin_tmp_X_bool +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_calc_hspace:NNNNNNN #1 #2 #3 #4 #5 #6 #7 + { + \dim_compare:nNnT { #1 } < { \c_zero_dim } + { + \msg_warning:nnnV { enumext } { width-non-positive }{ labelwidth }{ #1 } + \dim_set:Nn #1 { \dim_abs:n { #1 } } + } + \dim_compare:nNnT { #2 } < { \c_zero_dim } + { + \msg_warning:nnnV { enumext } { width-negative }{ labelsep }{ #2 } + \dim_set:Nn #2 { \dim_abs:n { #2 } } + } +% \end{macrocode} +% If no value has been passed to the \mykey{labelwidth} and \mykey{labelsep} keys we +% set the default values for \myvarenv{l__@@_leftmargin_tmp_X_dim}. +% \begin{macrocode} + \bool_if:nF #7 { \dim_set:Nn #4 { #1 + #2} } +% \end{macrocode} +% We now analyze the cases and set the values for \ics{leftmargin} and +% \ics{itemindent}. +% \begin{macrocode} + \dim_compare:nNnTF { #4 } < { \c_zero_dim } + { + \dim_set:Nn #6 { #1 + #2 - #4} + \dim_set:Nn #5 { #1 + #2 + #3 - #6 } + } + { + \dim_compare:nNnT { #4 } = { #1 + #2 } + { \dim_set:Nn #6 { \c_zero_dim } } + \dim_compare:nNnT { #4 } < { #1 + #2 } + { \dim_set:Nn #6 { #1 + #2 - #4} } + \dim_compare:nNnT { #4 } > { #1 + #2 } + { + \dim_set:Nn #6 { -#1 - #2 + #4} + \dim_set:Nn #6 { #6*-1} + } + \dim_set:Nn #5 { #1 + #2 + #3 - #6 } + } + } +\cs_generate_variant:Nn \@@_calc_hspace:NNNNNNN { ccccccc } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Setting second argument of the lists} +% +% \begin{macro}{\@@_list_arg_two_i:,\@@_list_arg_two_ii:,\@@_list_arg_two_iii:, +% \@@_list_arg_two_iv:,\@@_list_arg_two_v:,} +% We will \enquote{not set} |\leftmargini|, |\leftmarginii|, |\leftmarginiii| or +% |\leftmarginiv|, in this case, we will directly set the parameters +% for vertical and horizontal list spacing per level. +% \iffalse +%% Define "second arg" of list for |enumext| and |keyans|. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \cs_new_protected:cpn { @@_list_arg_two_#1: } + { + \@@_calc_hspace:ccccccc + { l_@@_labelwidth_#1_dim } { l_@@_labelsep_#1_dim } + { l_@@_listoffset_#1_dim } { l_@@_leftmargin_tmp_#1_dim } + { l_@@_leftmargin_#1_dim } { l_@@_itemindent_#1_dim } + { l_@@_leftmargin_tmp_#1_bool } + \clist_map_inline:nn + { labelsep, labelwidth, itemindent, leftmargin, rightmargin, listparindent } + { \dim_set_eq:cc {####1} { l_@@_####1_#1_dim } } + \clist_map_inline:nn { topsep, parsep, partopsep, itemsep } + { \skip_set_eq:cc {####1} { l_@@_####1_#1_skip } } + \usecounter { enumX#1 } + \setcounter { enumX#1 } { \int_eval:n { \int_use:c { l_@@_start_#1_int } - 1 } } + \str_if_eq:nnTF {#1} { v } + { + \@@_keyans_redefine_item: + \@@_keyans_make_label: + \@@_keyans_ref: + \@@_keyans_fake_item_indent: + \bool_if:cT { l_@@_show_length_#1_bool } + { + \msg_term:nnnn { enumext } { list-lengths-not-nested } { v } { keyans } + } + } + { + \@@_redefine_item: + \@@_make_label: + \@@_standar_ref: + \@@_fake_item_indent: + \bool_if:cT { l_@@_show_length_#1_bool } + { + \msg_term:nnne { enumext } { list-lengths } {#1} + { \int_use:N \l_@@_level_int } + } + } + } + } +\clist_map_inline:nn { i, ii, iii, iv, v } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_list_arg_two_vii:,\@@_list_arg_two_viii:,} +% For the horizontal environments \myenv*{enumext*} and \myenv*{keyans*} +% the implementation is similar, but, the value of |\partopsep| is always +% \mydim{0pt}. At this point we will modify the \mykey{parsep} key to +% make it take the value of the \mykey{itemsep} key and later, in the +% environment definition, we will modify \mykey{parindent} to make it set +% the value of \mykey{lisparindent} and \mykey{parsep} to set the value +% of |\parskip| locally. +% \iffalse +%% Define "second arg" of list for |enumext*| and |keyans*|. +% \fi +% \begin{macrocode} +\cs_set_protected:Npn \@@_tmp:n #1 + { + \cs_new_protected:cpn { @@_list_arg_two_#1: } + { + \bool_set_true:c { l_@@_leftmargin_tmp_#1_bool } + \dim_zero:c { l_@@_leftmargin_tmp_#1_dim } + \@@_calc_hspace:ccccccc + { l_@@_labelwidth_#1_dim } { l_@@_labelsep_#1_dim } + { l_@@_listoffset_#1_dim } { l_@@_leftmargin_tmp_#1_dim } + { l_@@_leftmargin_#1_dim } { l_@@_itemindent_#1_dim } + { l_@@_leftmargin_tmp_#1_bool } + \clist_map_inline:nn + { labelsep, labelwidth, itemindent, leftmargin, rightmargin, listparindent } + { \dim_set_eq:cc {####1} { l_@@_####1_#1_dim } } + \clist_map_inline:nn { topsep, parsep, partopsep, itemsep } + { \skip_set_eq:cc {####1} { l_@@_####1_#1_skip } } + \skip_set_eq:Nc \parsep { l_@@_itemsep_#1_skip } + \skip_zero:N \partopsep + \usecounter { enumX#1 } + \setcounter { enumX#1 } { \int_eval:n { \int_use:c { l_@@_start_#1_int } - 1 } } + \@@_starred_ref: + \str_if_eq:nnTF {#1} { vii } + { + \@@_fake_item_indent_vii: + \bool_if:cT { l_@@_show_length_vii_bool } + { \msg_term:nnnn { enumext } { list-lengths-not-nested } { vii } { enumext* } } + } + { + \@@_fake_item_indent_viii: + \bool_if:cT { l_@@_show_length_#1_bool } + { \msg_term:nnnn { enumext } { list-lengths-not-nested } { #1 } { keyans* } } + } + } + } +\clist_map_inline:nn { vii, viii } { \@@_tmp:n {#1} } +% \end{macrocode} +% \end{macro} +% +% \subsection{The environment \env{enumext}}\label{env:enumext} +% +% \begin{macro}{\@@_safe_exec:}\label{fun:enumext:safe-exe} +% The \cs{@@_safe_exec:} function first call the function \cs{@@_is_not_nested:} +% which sets \cs{g_@@_standar_bool} to \emph{\enquote{true}} if we +% are NOT nested within \myenv*{enumext*}, then call the function +% \cs{@@_internal_mini_page:} to create the environment \myvarenv*{__@@_mini_page}, +% we will increment \cs{l_@@_level_int} to restrict nesting of the +% environment, set \cs{l_@@_standar_bool} to \emph{\enquote{true}} and +% finally call the function \cs{@@_is_on_first_level:} which sets +% \cs{l_@@_standar_first_bool} to \emph{\enquote{true}} only if the +% environment is NOT nested and we are at the \emph{\enquote{first level}}. +% \iffalse +%% Safe exec for |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_safe_exec: + { + \@@_is_not_nested: + \@@_internal_mini_page: + \int_incr:N \l_@@_level_int + \int_compare:nNnT { \l_@@_level_int } > { 4 } + { \msg_fatal:nn { enumext } { list-too-deep } } + \bool_set_true:N \l_@@_standar_bool + \bool_set_false:N \l_@@_starred_bool + \@@_is_on_first_level: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_keys:n} +% The \cs{@@_parse_store_keys:n} function first we will clear the +% variable \cs{l_@@_series_str} used by the key \mykey{series} and then +% we check if we are at the \emph{\enquote{first level}}, if so we +% process the \mymeta{keys} and then execute the function +% \cs{@@_parse_series:n} used by the key \mykey{series} and call the +% function \cs{@@_nested_base_line_fix:} used by the key +% \mykey{base-fix}, otherwise we will pass the \mymeta{keys} to the inner +% levels of the environment then we execute the function \cs{@@_store_active_keys:n} +% and reprocess the \mymeta{keys} to pass them to the \emph{sequence} +% if the key \mykey{save-key} is not active. +% \iffalse +%% Parse |key=val| and set default series and store keys in seq-name for \printkeyans for |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_keys:n #1 + { + \tl_if_novalue:nF {#1} + { + \str_clear:N \l_@@_series_str + \int_compare:nNnTF { \l_@@_level_int } = { 1 } + { + \keys_set:nn { enumext / level-1 } {#1} + \@@_parse_series:n {#1} + \@@_nested_base_line_fix: + } + { + \exp_args:Ne \keys_set:nn + { enumext / level-\int_use:N \l_@@_level_int } {#1} + } + \@@_store_active_keys:n {#1} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_start_store_level:} +% The \cs{@@_start_store_level:} function activate the \emph{\enquote{storing structure}} +% mechanism in the \emph{sequence} for the command +% \ics*{anskey} and the environment \myenv*{anskey*}. +% \iffalse +%% Start storing structure in sequence for |save-ans| key in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_start_store_level: + { + \bool_lazy_all:nT + { + { \bool_if_p:N \l_@@_store_active_bool } + { \bool_not_p:n { \l_@@_keyans_env_bool } } + { \bool_if_p:N \g_@@_standar_bool } + } + { + \int_compare:nNnT { \l_@@_level_int } > { 1 } + { + \bool_set_true:c { l_@@_store_upper_level_ \@@_level: _bool } + \@@_store_level_open: + } + } +% \end{macrocode} +% If \myenv*{enumext} are nested in \myenv*{enumext*} add \cs{@@_store_level_open:} +% to preserve the \emph{\enquote{storing structure}}. +% \begin{macrocode} + \bool_lazy_all:nT + { + { \bool_if_p:N \l_@@_store_active_bool } + { \bool_not_p:n { \l_@@_keyans_env_bool } } + { \int_compare_p:nNn { \l_@@_level_h_int } = { 1 } } + } + { + \int_compare:nNnT { \l_@@_level_int } > { 0 } + { + \bool_set_true:c { l_@@_store_upper_level_ \@@_level: _bool } + \@@_store_level_open: + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_stop_store_level:} +% The \cs{@@_stop_store_level:} function stop the \emph{\enquote{storing structure}} +% mechanism in the \emph{sequence} for the command +% \ics*{anskey} and the environment \myenv*{anskey*}. +% \iffalse +%% Stop storing structure in sequence for |save-ans| key in |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_stop_store_level: + { + \bool_if:cT { l_@@_store_upper_level_ \@@_level: _bool } + { + \@@_store_level_close: + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_multicols_start:} +% The function \cs{@@_multicols_start:} will start the +% \myenv{multicols} environment according to the value passed by the +% \mykey{columns} key, then set the default value for +% \ics{columnsep} when \mykey{columns-sep}=\mydim{0pt} and set the +% value of \ics{multicolsep} equal to zero and leave \ics{columnseprule} +% equal to zero for inner levels. +% \begin{macrocode} +\cs_new_protected:Nn \@@_multicols_start: + { + \int_compare:nNnT + { \int_use:c { l_@@_columns_ \@@_level: _int } } > { 1 } + { + \dim_compare:nNnT + { \dim_use:c { l_@@_columns_sep_ \@@_level: _dim } } = { \c_zero_dim } + { + \dim_set:cn { l_@@_columns_sep_ \@@_level: _dim } + { + ( \dim_use:c { l_@@_labelwidth_ \@@_level: _dim } + + \dim_use:c { l_@@_labelsep_ \@@_level: _dim } + ) / \int_use:c { l_@@_columns_ \@@_level: _int } + - \dim_use:c { l_@@_listoffset_ \@@_level: _dim } + } + } + \dim_set_eq:Nc \columnsep { l_@@_columns_sep_ \@@_level: _dim } + \int_compare:nNnT { \l_@@_level_int } > { 1 } + { + \dim_zero:N \columnseprule + } +% \end{macrocode} +% We will calculate the \emph{vertical spacing} settings for the +% \myenv{multicols} environment using the function \cs{@@_multi_addvspace:}, +% apply our \emph{\enquote{vertical adjust spacing}}, then start the +% \myenv{multicols} environment. +% \begin{macrocode} + \bool_if:cF { l_@@_minipage_active_ \@@_level: _bool } + { + \skip_zero:N \multicolsep + \@@_multi_addvspace: + } + \raggedcolumns + \begin{multicols}{ \int_use:c { l_@@_columns_ \@@_level: _int } } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_multicols_stop:} +% The function \cs{@@_multicols_stop:} will stop the \myenv{multicols} +% environment and apply our \emph{\enquote{vertical adjust}} spacing. +% For compatibility with \emph{tagged} \texttt{PDF}, the closing of the +% \myenv{list} environment is executed here along with \cs{@@_stop_store_level:}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_multicols_stop: + { + \int_compare:nNnTF + { \int_use:c { l_@@_columns_ \@@_level: _int } } > { 1 } + { + \@@_stop_list: + \@@_stop_store_level: + \end{multicols} + \@@_unskip_unkern: + \@@_unskip_unkern: + \par\addvspace{ \skip_use:c { l_@@_multicols_below_ \@@_level: _skip } } + } + { + \@@_stop_list: + \@@_stop_store_level: + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_before_list:} +% The function \cs{@@_before_list:} first calls the function +% \cs{@@_vspace_above:} used by the keys \mykey{above} and +% \mykey{above*}, then calls the function \cs{@@_before_args_exec:} +% used by the key \mykey{before*} and finally execute the function +% \cs{@@_check_ans_active:} for the check answer mechanism. +% \begin{macrocode} +\cs_new_protected:Nn \@@_before_list: + { + \@@_vspace_above: + \@@_before_args_exec: + \@@_check_ans_active: +% \end{macrocode} +% When the \mykey{mini-env} key is active it will set the value of the +% \myvarenv{l__@@_minipage_right_X_dim} to be the \emph{width} of the \myvarenv*{__@@_mini_page} +% environment on the \emph{\enquote{right side}}, using this value together with the value +% of the \myvarenv{l__@@_minipage_hsep_X_dim} set by the \mykey{mini-sep} key, +% the value of \myvarenv{l__@@_minipage_left_X_dim} will be set, which will be +% the \emph{width} of \myvarenv*{__@@_mini_page} environment on the +% \emph{\enquote{left side}}, always having a current \ics{linewidth} +% as \emph{maximum width} between them. +% \iffalse +%% Set |mini-env| width value. +% \fi +% \begin{macrocode} + \dim_compare:nNnT + { \dim_use:c { l_@@_minipage_right_ \@@_level: _dim } } > { \c_zero_dim } + { + \dim_set:cn { l_@@_minipage_left_ \@@_level: _dim } + { + \linewidth + - \dim_use:c { l_@@_minipage_right_ \@@_level: _dim } + - \dim_use:c { l_@@_minipage_hsep_ \@@_level: _dim } + } +% \end{macrocode} +% The boolean variable \myvarenv{l__@@_minipage_active_X_bool} will be +% activated and the integer variable \cs{g_@@_minipage_stat_int} +% used by the \ics*{miniright} command will be incremented, then +% the function \cs{@@_minipage_add_space:} is called and the +% \myvarenv*{__@@_mini_page} environment on the \emph{\enquote{left +% side}} will be initialized followed by the \emph{\enquote{vertical spacing}} +% applied to preserve the \emph{\enquote{baseline}} between the \emph{left} +% and \emph{right} side environments. +% After these actions, the function \cs{@@_multicols_start:} is +% called to handle the \myenv{multicols} environment. +% \iffalse +%% Use internal minipage with |\nointerlineskip| and |\addvspace| here +% \fi +% \begin{macrocode} + \bool_set_true:c { l_@@_minipage_active_ \@@_level: _bool } + \int_gincr:N \g_@@_minipage_stat_int + \@@_minipage_add_space: + \noindent + \@@_mini_page{ \dim_use:c { l_@@_minipage_left_ \@@_level: _dim } } + } + \@@_multicols_start: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_second_part:} +% The function \cs{@@_second_part:} first check the state of +% the boolean variable \myvarenv{l__@@_minipage_active_X_bool}, if it is +% \enquote{true} a small test will be executed to check if we have +% omitted the use of \ics*{miniright} (the \myvarenv*{__@@_mini_page} +% environment has not been closed), then close \myvarenv*{__@@_mini_page} +% and add the \emph{adjusted vertical space} \cs{l_@@_minipage_after_skip}, +% otherwise we will close the \myenv{multicols} environment. +% \begin{macrocode} +\cs_new_protected:Nn \@@_second_part: + { + \bool_if:cTF { l_@@_minipage_active_ \@@_level: _bool } + { + \int_compare:nNnT { \g_@@_minipage_stat_int } = { 1 } + { + \msg_warning:nn { enumext } { missing-miniright } + \miniright + } + \int_gzero:N \g_@@_minipage_stat_int + \@@_unskip_unkern: % remove topsep + [partopsep] + \end@@_mini_page + } + { + \@@_multicols_stop: + } +% \end{macrocode} +% Now we will execute the functions \cs{@@_after_stop_list:} used by +% the key \mykey{after}, \cs{@@_check_ans_key_hook:} used by the key +% \mykey{check-ans}, \cs{@@_vspace_below:} used by the keys \mykey{below} +% and \mykey{below*}. Finally set \cs{l_@@_standar_bool} to false and call +% the function \cs{@@_resume_save_counter:} used by the \mykey{series}, +% \mykey{resume} and \mykey{resume*} keys. +% \begin{macrocode} + \@@_after_stop_list: + \@@_check_ans_key_hook: + \@@_vspace_below: + \bool_set_false:N \l_@@_standar_bool + \@@_resume_save_counter: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_set_item_width:}\label{dim:item-width-enumext} +% The function \cs{@@_set_item_width:} will set the value of |\itemwidth| +% taking into account the value established by the \mykey{list-offset} +% key for each level of the environment. +% \iffalse +%% Set |\itemwidth| for |enumext| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_set_item_width: + { + \dim_set:Nn \itemwidth { \linewidth } + \dim_compare:nT + { + \dim_use:c { l_@@_listoffset_ \_@@_level: _dim } != \c_zero_dim + } + { + \dim_sub:Nn \itemwidth + { + \dim_use:c { l_@@_listoffset_ \_@@_level: _dim } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{enumext} +% Now create the \myenv*{enumext} environment based on \myenv{list} +% environment by levels. +% \iffalse +%% Definition of |enumext| environment. +% \fi +% \begin{macrocode} +\NewDocumentEnvironment{enumext}{ O{} } + { + \@@_safe_exec: + \@@_parse_keys:n {#1} + \@@_before_list: + \@@_start_store_level: + \@@_start_list:nn + { \tl_use:c { l_@@_label_ \@@_level: _tl } } + { + \use:c { @@_list_arg_two_ \@@_level: : } + \@@_before_keys_exec: + } + \@@_set_item_width: + \@@_after_args_exec: + } + { + \@@_second_part: + } +% \end{macrocode} +% \end{macro} +% +% As we don't want our check to be executed \mykey{check-ans} by levels +% but on the complete list, we will take it out of the \myenv*{enumext} +% environment using the \emph{\enquote{hook}} function \cs{@@_after_env:nn}. +% \iffalse +%% Execute |check-ans| key out of |enumext| environment. +% \fi +% \begin{macrocode} +\@@_after_env:nn {enumext} + { + \@@_execute_after_env: + } +% \end{macrocode} +% +% \subsection{The environment \env{keyans}}\label{env:keyans} +% +% The environment \myenv*{keyans} also based on lists. +% The main differences with the \myenv*{enumext} environment are the +% \emph{nesting} and the way the \emph{answers} (choice) will be stored and checked, this +% environment is intended exclusively for \emph{\enquote{multiple choice questions}}. +% +% \begin{macro}{\@@_keyans_safe_exec:} +% The \myenv*{keyans} environment will only be available if the +% \mykey{save-ans} key is active and can only be used at the +% \emph{\enquote{first level}} within the \myenv*{enumext} environment. +% We do not want the environment to be nested, so we will set a maximum at this point. +% If the conditions are not met, an error message will be returned. +% \iffalse +%% Function for check nested level in |keyans| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_safe_exec: + { + \bool_if:NF \l_@@_store_active_bool + { + \msg_error:nnnn { enumext } { wrong-place }{ keyans }{ save-ans } + } + \int_incr:N \l_@@_keyans_level_int + \bool_set_true:N \l_@@_keyans_env_bool + \@@_keyans_name_and_start: + % Set false for interfering with enumext nested in keyans (yes, its possible and crayze) + \bool_set_false:N \l_@@_store_active_bool + \int_compare:nNnT { \l_@@_keyans_level_int } > { 1 } + { + \msg_error:nn { enumext } { keyans-nested } + } + \int_compare:nNnT { \l_@@_level_int } > { 1 } + { + \msg_error:nn { enumext } { keyans-wrong-level } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_keyans_parse_keys:n} +% Parse \myoarg{key \textnormal{\textcolor{gray}{=}} val} for +% \myenv*{keyans} environment. +% \iffalse +%% Function for parse |key=val| in |keyans|. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_parse_keys:n #1 + { + \keys_set:nn { enumext / keyans } {#1} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_before_list_v:, \@@_keyans_multicols_start:, +% \@@_keyans_multicols_stop:, \@@_second_part_v:} +% Same implementation as the one used in the \myenv*{enumext} environment. +% \iffalse +%% Internal functions for |keyans| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_before_list_v: + { + \@@_vspace_above_v: + \@@_before_args_exec_v: + \dim_compare:nNnT { \l_@@_minipage_right_v_dim } > { \c_zero_dim } + { + \dim_set:Nn \l_@@_minipage_left_v_dim + { + \linewidth - \l_@@_minipage_right_v_dim - \l_@@_minipage_hsep_v_dim + } + \bool_set_true:N \l_@@_minipage_active_v_bool + \int_gincr:N \g_@@_minipage_stat_int + \@@_keyans_minipage_add_space: + \@@_mini_page{ \l_@@_minipage_left_v_dim } + } + \@@_keyans_multicols_start: + } +\cs_new_protected:Nn \@@_keyans_multicols_start: + { + \int_compare:nNnT { \l_@@_columns_v_int } > { 1 } + { + \dim_compare:nNnT { \l_@@_columns_sep_v_dim } = { \c_zero_dim } + { + \dim_set:Nn \l_@@_columns_sep_v_dim + { + ( + \l_@@_labelwidth_v_dim + \l_@@_labelsep_v_dim + ) / \l_@@_columns_v_int + - \l_@@_listoffset_v_dim + } + } + \dim_set_eq:NN \columnsep \l_@@_columns_sep_v_dim + \dim_zero:N \columnseprule % no rule here + \bool_if:NF \l_@@_minipage_active_v_bool + { + \skip_zero:N \multicolsep + \@@_keyans_multi_addvspace: + } + \raggedcolumns + \begin{multicols}{ \l_@@_columns_v_int } + } + } +\cs_new_protected:Nn \@@_keyans_multicols_stop: + { + \int_compare:nNnTF { \l_@@_columns_v_int } > { 1 } + { + \@@_stop_list: + \end{multicols} + \@@_unskip_unkern: + \@@_unskip_unkern: + \par\addvspace{ \l_@@_multicols_below_v_skip } + } + { + \@@_stop_list: + } + } +\cs_new_protected:Nn \@@_second_part_v: + { + \bool_if:NTF \l_@@_minipage_active_v_bool + { + \int_compare:nNnT { \g_@@_minipage_stat_int } = { 1 } + { + \msg_warning:nn { enumext } { missing-miniright } + \miniright + } + \int_gzero:N \g_@@_minipage_stat_int + \@@_unskip_unkern: % remove \topsep + [\partopsep] + \end@@_mini_page + \par\addvspace{ \l_@@_minipage_after_skip } + } + { + \@@_keyans_multicols_stop: + } + \bool_set_false:N \l_@@_keyans_env_bool + \@@_after_stop_list_v: + \@@_vspace_below_v: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_keyans_set_item_width:}\label{dim:item-width-keyans} +% The function \cs{@@_keyans_set_item_width:} will set the value of |\itemwidth| +% taking into account the value established by the \mykey{list-offset} +% key. +% \iffalse +%% Set |\itemwidth| for |keyans| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_set_item_width: + { + \dim_set:Nn \itemwidth { \linewidth } + \dim_compare:nT + { + \l_@@_listoffset_v_dim != \c_zero_dim + } + { + \dim_sub:Nn \itemwidth { \l_@@_listoffset_v_dim } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{keyans} +% Now we define the environment \myenv*{keyans} also based on lists. +% \iffalse +%% Definition of |keyans| environment. +% \fi +% \begin{macrocode} +\NewDocumentEnvironment{keyans}{ O{} } + { + \@@_keyans_safe_exec: + \@@_keyans_parse_keys:n {#1} + \@@_before_list_v: + \@@_start_list:nn + { \tl_use:N \l_@@_label_v_tl } + { + \@@_list_arg_two_v: + \@@_before_keys_exec_v: + } + \@@_keyans_set_item_width: + \@@_after_args_exec_v: + } + { + \@@_check_starred_cmd:n { item } + \@@_second_part_v: + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Tagging PDF support for non-standart list environments}\label{ltx:tag-nonestandarlist} +% +% The \hologo{LaTeX} release 2022-06-01 brings automatic support for +% \emph{tagged} \texttt{PDF} in several aspects, including the standard \emph{list environments} +% and the \myenv{list} environment. Unfortunately non-standard \emph{list environments} +% like \myenv*{keyanspic} or the horizontal list environments +% \myenv*{enumext*} and \myenv*{keyans*} are not structured in a nice +% way, i.e. the expected result in the \texttt{PDF} file is the expected +% one, but the underlying structure is not correct. In simple terms, for +% \emph{tagged} \texttt{PDF} a \myenv{list} environment is a \myenv{list} environment, no matter +% what it looks like in the \texttt{PDF} file. +% +% \smallskip +% +% To maintain a correct \myenv{list} structure when |\DocumentMetadata| is +% active, it is necessary to do some things manually using +% \mypkg{tagpdf}\cite{tagpdf} and \mypkg{ltsockets}\cite{ltsockets}. +% This implementation is an adaptation of my answer thanks to Ulrike Fischer's +% comments in \href{https://tex.stackexchange.com/a/725902}{How can I modify my \texttt{\textbackslash item} redefinition to be compatible with \texttt{tagging-pdf}}. +% +% \subsubsection{Socket for tagging support in \env{enumext*} and \env{keyans*}} +% +% \begin{macro}[int]{start-list-tags, stop-start-tags, stop-list-tags, +% \@@_start_list_tag:n,\@@_stop_start_list_tag:, +% \@@_stop_list_tag:n} +% We will first define the necessary \texttt{sockets} and their +% behavior for \myenv*{enumext*} and \myenv*{keyans*}. +% \iffalse +%% Implement socket for tagging support in |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\socket_new:nn {tagsupport/@@/starred}{ 1 } +\socket_new_plug:nnn {tagsupport/@@/starred} {start-list-tags} + { + \tag_resume:n {#1} + \tag_mc_end_push: + \tag_struct_begin:n {tag=LI} + \tag_struct_begin:n {tag=Lbl} + \tag_mc_begin:n {tag=Lbl} + } +\socket_new_plug:nnn {tagsupport/@@/starred} {stop-start-tags} + { + \tag_mc_end: + \tag_struct_end:n {tag=Lbl} + \tag_struct_begin:n {tag=LBody} + \tag_struct_begin:n {tag=text-unit} + \tag_struct_begin:n {tag=text} + } +\socket_new_plug:nnn {tagsupport/@@/starred} {stop-list-tags} + { + \tag_struct_end:n {tag=text} + \tag_struct_end:n {tag=text-unit} + \tag_struct_end:n {tag=LBody} + \tag_struct_end:n {tag=LI} + \tag_mc_begin_pop:n {} + \tag_suspend:n {#1} + } +% \end{macrocode} +% +% And now we'll wrap them so that they're only active when |\DocumentMetadata| is present. +% \iffalse +%% Wrap socket in conditional functions for tagging |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_start_list_tag:n #1 + { + \IfDocumentMetadataTF + { + \socket_assign_plug:nn {tagsupport/@@/starred} {start-list-tags} + \socket_use:nn {tagsupport/@@/starred} {#1} + } {} + } +\cs_new_protected_nopar:Nn \@@_stop_start_list_tag: + { + \IfDocumentMetadataTF + { + \socket_assign_plug:nn {tagsupport/@@/starred} {stop-start-tags} + \socket_use:nn {tagsupport/@@/starred} { } + } {} + } +\cs_new_protected_nopar:Npn \@@_stop_list_tag:n #1 + { + \IfDocumentMetadataTF + { + \socket_assign_plug:nn {tagsupport/@@/starred} {stop-list-tags} + \socket_use:nn {tagsupport/@@/starred} {#1} + } {} + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Socket for tagging support in \env{keyanspic}} +% +% \begin{macro}[int]{start-list-tags, stop-start-tags, stop-list-tags, +% \@@_anspic_start_list_tag:,\@@_anspic_stop_start_list_tag:, +% \@@_anspic_stop_list_tag:} +% We will first define the necessary \texttt{sockets} and their +% behavior for \myenv*{keyanspic} environment. +% \iffalse +%% Implement socket for tagging support in |keyanspic| environment. +% \fi +% \begin{macrocode} +\socket_new:nn {tagsupport/@@/keyanspic}{ 0 } +\socket_new_plug:nnn {tagsupport/@@/keyanspic} {start-list-tags} + { + \tag_resume:n {keyanspic} + \tag_mc_end_push: + \tag_struct_begin:n {tag=LI} + \tag_struct_begin:n {tag=Lbl} + \tag_mc_begin:n {tag=Lbl} + } +\socket_new_plug:nnn {tagsupport/@@/keyanspic} {stop-start-tags} + { + \tag_mc_end: + \tag_struct_end:n {tag=Lbl} + \tag_struct_begin:n {tag=LBody} + \tag_struct_begin:n {tag=text-unit} + \tag_struct_begin:n {tag=text} + \tag_mc_begin:n {tag=text} + } +\socket_new_plug:nnn {tagsupport/@@/keyanspic} {stop-list-tags} + { + \tag_mc_end: + \tag_struct_end:n {tag=text} + \tag_struct_end:n {tag=text-unit} + \tag_struct_end:n {tag=LBody} + \tag_struct_end:n {tag=LI} + \tag_mc_begin_pop:n {} + \tag_suspend:n {keyanspic} + } +% \end{macrocode} +% And now we'll wrap them so that they're only active when +% |\DocumentMetadata| is present. +% \iffalse +%% Wrap socket in conditional functions for tagging |keyanspic| environment. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Nn \@@_anspic_start_list_tag: + { + \IfDocumentMetadataTF + { + \socket_assign_plug:nn {tagsupport/@@/keyanspic} {start-list-tags} + \socket_use:n {tagsupport/@@/keyanspic} + } {} + } +\cs_new_protected_nopar:Nn \@@_anspic_stop_start_list_tag: + { + \IfDocumentMetadataTF + { + \socket_assign_plug:nn {tagsupport/@@/keyanspic} {stop-start-tags} + \socket_use:n {tagsupport/@@/keyanspic} + } {} + } +\cs_new_protected_nopar:Nn \@@_anspic_stop_list_tag: + { + \IfDocumentMetadataTF + { + \socket_assign_plug:nn {tagsupport/@@/keyanspic} {stop-list-tags} + \socket_use:n {tagsupport/@@/keyanspic} + } {} + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The environment \env{keyanspic} and \cs{anspic}} +% +% The \myenv*{keyanspic} environment is a \myenv{list} based environment that +% uses the same configuration for \emph{\enquote{spacing}} and \mymeta{label} +% as the \myenv*{keyans} environment, but it does not use |\item|. +% The \mymeta{contents} are passed to the environment by means of the +% \ics*{anspic} command as replacement for |\item| command and placed +% inside \myenv{minipage} environments, with the \mymeta{label} +% centered \emph{\enquote{above}} or \emph{\enquote{below}}, adjusting +% \emph{widths} and \emph{position} according to the options passed to +% the environment. +% +% \begin{figure}[ht] +% \centering +% \begin{tikzpicture}[line cap=round,line join=round,x=0.8cm,y=0.8cm,every node/.style={font=\footnotesize}] +% % space above +% \draw[color=white] (7.0,6.10) rectangle (17.5,6.5) node[pos=.5,text=black]% +% { \textcolor{optcolor}{\texttt{layout-top}} }; +% % space between +% \draw[color=white] (7.0,4.5) rectangle (17.5,4.9) node[pos=.5,text=black]% +% { \textcolor{optcolor}{\texttt{layout-sep}} }; +% % space below +% \draw[color=white] (7.0,2.9) rectangle (17.5,3.3) node[pos=.5,text=black]% +% { \textcolor{optcolor}{\texttt{layout-top}} }; +% % labelwidth +% \draw[<->,color=gray] (2.0,7.0) --node[above,text=optcolor]{\vphantom{p}\texttt{labelwidth}} (5.0,7.0); +% \draw[<->,color=gray] (5.0,7.0) --node[above,text=optcolor]{\texttt{labelsep}} (7.0,7.0); +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,6.5) rectangle (5.0,6.85);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,6.5) rectangle (7.0,6.85);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,6.5) rectangle (17.5,6.85);% item width +% % minipage one +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,5.25) rectangle (10.5,6.10) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage one} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% % label one +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,4.9) rectangle (10.5,5.25) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% % minipage two +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (10.5,5.25) rectangle (14,6.10) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage two} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% % label two +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (10.5,4.9) rectangle (14,5.25) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% % minipage three +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (14,5.25) rectangle (17.5,6.10) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage three} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% % label three +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (14,4.9) rectangle (17.5,5.25) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% % minipage four +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,3.65) rectangle (12.25,4.5) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage four} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% % label four +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,3.3) rectangle (12.25,3.65) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% % minipage five +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (12.25,3.65) rectangle (17.5,4.5) node[pos=.5,text=black]% +% {\begin{tabular}{c} +% \texttt{minipage five} \\ +% \textcolor{blue}{\emph{drawing or tabular}} +% \end{tabular}}; +% % label five +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (12.25,3.3) rectangle (17.5,3.65) node[pos=.5,text=black]% +% { \textcolor{blue}{\texttt{label}} }; +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (2.0,2.55) rectangle (5.0,2.9);% labelwidth +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (5.0,2.55) rectangle (7.0,2.9);% labelsep +% \draw[color=lightgray,fill=lightgray,fill opacity=0.15] (7.0,2.55) rectangle (17.5,2.9);% item width +% \end{tikzpicture} +% \caption{Representation of the \myenv*{keyanspic} spacing in \mypkg*{enumext}.} +% \label{fig:keyanspic} +% \end{figure} +% +% \smallskip +% +% In order for the \myenv*{keyanspic} environment and the |\anspic| +% command to work correctly, we need to set and export some variables in +% the first part of the environment definition and pass them to |\anspic| +% which is executed in the second part of the environment. This +% implementation is adapted from the answer given by Enrico Gregorio +% (\texttt{@egreg}) in \href{https://tex.stackexchange.com/a/577705/7832}{How to process the body of an environment and divide it by a \textbackslash macro?}. +% +% \subsubsection{The environment \env{keyanspic}}\label{env:keyanspic} +% +% \begin{macro}[int]{label-pos, label-sep, layout-sty, layout-sep, +% layout-top,} +% First we define the key that allows us to process the position of the +% \mymeta{label} centered \enquote{above} or \enquote{below} which will be \mykey{label-pos}, +% the vertical separation of these from \emph{drawing or tabular} will be +% handled with the key \mykey{label-sep}. +% The \emph{\enquote{layout style}} will be handled with the key +% \mykey{layout-sty} will take two values separated by comma \mymarg{n° +% upper, n° lower} and will determine the number of \myenv{minipage} +% environments in which all arguments of |\anspic| will be printed at the +% \enquote{upper} and \enquote{lower} within the environments separated +% by the value of the key \mykey{layout-sep}. The vertical space +% \enquote{top} and \enquote{bottom} of the environment will be handled +% with the key \mykey{layout-top}. +% \iffalse +%% Add keys for |keyanspic| environment. +% \fi +% \begin{macrocode} +\keys_define:nn { enumext / keyanspic } + { + label-pos .choice:, + label-pos / above .code:n = + \bool_set_true:N \l_@@_anspic_label_above_bool + \str_set:Nn \l_@@_anspic_mini_pos_str { t }, + label-pos / below .code:n = + \bool_set_false:N \l_@@_anspic_label_above_bool + \str_set:Nn \l_@@_anspic_mini_pos_str { b }, + label-pos / unknown .code:n = + \msg_error:nneee { enumext } { unknown-choice } + { label-pos } { above,~ below } { \exp_not:n {#1} }, + label-pos .initial:n = below, + label-pos .value_required:n = true, + label-sep .skip_set:N = \l_@@_anspic_label_sep_skip, + label-sep .value_required:n = true, + layout-sty .tl_set:N = \l_@@_anspic_layout_style_tl, + layout-sty .value_required:n = true, + layout-sep .code:n = \keys_set:nn { enumext / keyans } + { parsep = #1 }, + layout-sep .value_required:n = true, + layout-top .code:n = \keys_set:nn { enumext / keyans } + { topsep = #1 }, + layout-top .value_required:n = true, + unknown .code:n = { \@@_keyans_unknown_keys:n {#1} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_keyans_pic_safe_exec:, \@@_keyans_pic_parse_keys:n, +% \@@_keyans_pic_skip_abs:N, \@@_keyans_pic_arg_two:,} +% The function \cs{@@_keyans_pic_safe_exec:} check the nested level +% position inside the \myenv*{enumext} environment. +% \iffalse +%% Internal check code for |keyanspic| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_keyans_pic_safe_exec: + { + \int_incr:N \l_@@_keyans_pic_level_int + \int_compare:nNnT { \l_@@_keyans_pic_level_int } > { 1 } + { + \msg_error:nn { enumext } { keyanspic-nested } + } + \@@_keyans_name_and_start: + } +% \end{macrocode} +% Parse \myoarg{key \textnormal{\textcolor{gray}{=}} val} for +% \myenv*{keyanspic} environment. +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_pic_parse_keys:n #1 + { + \tl_if_novalue:nF {#1} + { + \keys_set:nn { enumext / keyanspic } {#1} + } + } +% \end{macrocode} +% The function \cs{@@_keyans_pic_skip_abs:N} will return a positive +% value \ics{parsep} from \myenv*{keyans} environment. +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_pic_skip_abs:N #1 + { + \dim_compare:nNnT { #1 } < { \c_zero_dim } + { + \skip_set:Nn #1 { -#1 } + } + } +% \end{macrocode} +% The \cs{@@_keyans_pic_arg_two:} function will be used in the +% \emph{second argument} of the \myenv{list} environment that defines +% the \myenv*{keyanspic} environment, with this we will take the +% configuration of the \emph{\enquote{spaces}} and the keys +% \mykey{label}, \mykey{wrap-label}, \mykey{parsep} and \mykey{topsep} +% from the \myenv*{keyans} environment. +% The first thing we need to do is set the boolean variable +% \cs{l_@@_leftmargin_tmp_v_bool} handled by the \mykey{list-indent} key +% to \enquote{false}, then copy the definition of the second list argument +% from the \myenv*{keyans} environment definition and make sure that +% |\parsep| does not have a negative value. +% \begin{macrocode} +\cs_new_protected:Npn \@@_keyans_pic_arg_two: + { + \bool_set_false:N \l_@@_leftmargin_tmp_v_bool + \@@_list_arg_two_v: + \@@_keyans_pic_skip_abs:N \parsep +% \end{macrocode} +% Now we increment the counter |enumXv| of the \myenv*{keyans} environment +% and save the \emph{total height} of the \mymeta{label} in +% \cs{l_@@_anspic_label_htdp_dim} used by |\anspic| and we will adjust +% the values of |\parsep| only if the key \mykey{label-pos} is set to \emph{below}. +% \begin{macrocode} + \bool_if:NF \l_@@_anspic_label_above_bool + { + \stepcounter { enumXv } + \hbox_set:Nn \l_@@_anspic_label_box { \l_@@_label_v_tl } + \dim_set:Nn \l_@@_anspic_label_htdp_dim + { + \box_ht_plus_dp:N \l_@@_anspic_label_box + } + \skip_add:Nn \parsep + { + \l_@@_anspic_label_htdp_dim + + \box_dp:N \strutbox + + \l_@@_anspic_label_sep_skip + } + } +% \end{macrocode} +% Finally we \emph{adjust} the value of |\leftmargin| and |\topsep| +% then set |\listparindent|, |\partopsep| and |\itemsep| to zero so that +% the \emph{horizontal} and \emph{vertical} space is not affected. +% \begin{macrocode} + \dim_add:Nn \leftmargin { -\labelwidth - \labelsep } + \skip_add:Nn \topsep { 0.5\box_dp:N \strutbox } + \dim_zero:N \listparindent + \skip_zero:N \partopsep + \skip_zero:N \itemsep + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{keyanspic} +% Now we define the environment \myenv*{keyanspic}. For compatibility +% with \emph{tagged} \texttt{PDF} we must use the |\begin{|\myenv{list}|}| +% form and a lot of conditional code using |\IfDocumentMetadataTF|. +% We will first stop the code for automatic \emph{tagged} \texttt{PDF} +% for \myenv{list} environments, redefine |\item| so that it cannot be +% used, and stop the code for automatic \emph{tagged} \texttt{PDF} for +% the \myenv*{keyanspic} environment. +% \iffalse +%% Define |keyanspic| environment. +% \fi +% \begin{macrocode} +\NewDocumentEnvironment{keyanspic}{ o } + { + \@@_keyans_pic_safe_exec: + \@@_keyans_pic_parse_keys:n {#1} + \begin{list} { } { \@@_keyans_pic_arg_two: } + \IfDocumentMetadataTF + { + \tag_suspend:n {list} + }{} + \item[] \scan_stop: + \RenewDocumentCommand \item {} + { + \msg_error:nn { enumext } { keyanspic-item-cmd } + } + \IfDocumentMetadataTF + { + \tag_resume:n {keyanspic} + \tag_tool:n {para/tagging=false} + \tag_suspend:n {keyanspic} + } { } + } +% \end{macrocode} +% In the second part of the environment definition we will manually place +% our code for \emph{tagged} \texttt{PDF} and execute the command +% |\anspic| using the \cs{@@_anspic_exec:} function. +% \begin{macrocode} + { + \IfDocumentMetadataTF + { + \tag_resume:n {keyanspic} + \tag_mc_end_push: + \tag_struct_begin:n {tag=L,attribute=enumerate} + } { } + \@@_anspic_exec: + \IfDocumentMetadataTF + { + \tag_suspend:n {keyanspic} + } { } + \end{list} + \IfDocumentMetadataTF + { + \tag_struct_end:n {tag=L} + \tag_mc_begin_pop:n {} + \tag_struct_end:n {tag=L} + \tag_mc_begin_pop:n {} + } { } +% \end{macrocode} +% Finally we check if \ics*{anspic*} has been used, set the counter |enumXvi| +% to zero and apply our \enquote{adjusted} vertical space bottom. +% \begin{macrocode} + \@@_check_starred_cmd:n { anspic } + \setcounter { enumXvi } { 0 } + \bool_if:NTF \l_@@_anspic_label_above_bool + { + \par\addvspace{ 0.5\box_dp:N \strutbox } + } + { + \par + \addvspace + { + \dim_eval:n + { + \l_@@_anspic_label_htdp_dim + \box_ht_plus_dp:N \strutbox + + \l_@@_anspic_label_sep_skip + \l_@@_topsep_v_skip + } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The command \cs{anspic}}\label{cmd:anspic} +% The \ics*{anspic} command take three arguments, the \emph{starred versions} \ics*{anspic*}\myoarg{content} +% \emph{store} the current \mymeta{label} next to the \emph{optional argument} +% \myoarg{content} in the \emph{sequence} and \emph{prop list} +% defined by \mykey{save-ans} key. The third \emph{mandatory argument} +% \mymarg{drawing or tabular} is NOT \emph{stored} in the \emph{sequence} or +% \emph{prop list}. +% +% \begin{important} +% One of the complications here to make the \myenv*{keyanspic} +% environment compatible with \emph{tagged} PDF is the position of +% \mymeta{label}, the \ics*{anspic} command processes the arguments in +% order, where |#1| and |#2| correspond to \mymeta{label} and |#3| to the +% mandatory argument and puts all this inside a \myenv{minipage} +% environment. If |#1| and |#2|, that is \mymeta{label}, is above |#3| +% there are no problems with \emph{tagged} PDF, but if |#3| comes first +% the list created with \emph{tagged} PDF will not be correct. +% \end{important} +% +% \begin{macro}{\anspic, \@@_anspic_body_dim:n, \@@_anspic_label:nn, +% \@@_anspic_label_pos:nnn, \@@_anspic_args:nnn, +% \@@_anspic_print:n, \@@_anspic_print:e, \@@_anspic_print:V, +% \@@_anspic_row:n, @@_anspic_exec:,} +% We check that the command is active in the \myenv*{keyanspic} +% environment only if the \mykey{save-ans} key is present, otherwise +% we return an error. +% The three arguments are handled by the function \cs{@@_anspic_args:nnn} +% and stored in the sequence \cs{l_@@_anspic_args_seq} which is processed +% by the \myenv*{keyanspic} environment. +% \iffalse +%% Define |\anspic| for |keyanspic| environment. +% \fi +% \begin{macrocode} +\NewDocumentCommand \anspic { s o +m } + { + \bool_if:NF \l_@@_store_active_bool + { + \msg_error:nnnn { enumext } { wrong-place }{ keyanspic }{ save-ans } + } + \int_compare:nNnT { \l_@@_level_int } > { 1 } + { + \msg_error:nn { enumext } { keyanspic-wrong-level } + } + \int_compare:nNnT { \l_@@_keyans_level_int } = { 1 } + { + \msg_error:nnnn { enumext } { command-wrong-place }{ anspic }{ keyans } + } + \seq_put_right:Nn \l_@@_anspic_args_seq + { + \@@_anspic_args:nnn { #1 } { #2 } { #3 } + } + } +% \end{macrocode} +% The \cs{@@_anspic_body_dim:n} function will set the value of +% \cs{l_@@_anspic_body_htdp_dim} equal to the \enquote{height plus depth} +% of the \emph{mandatory argument} if the key \mykey{label-pos} is set +% \enquote{below}. +% \iffalse +%% Set the height plus depth off body arg in dim var for |\anspic|. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_anspic_body_dim:n #1 + { + \bool_if:NF \l_@@_anspic_label_above_bool + { + \IfDocumentMetadataTF + { + \tag_suspend:n {keyanspic} + } { } + \vbox_set:Nn \l_@@_anspic_body_box { #1 } + \dim_set:Nn \l_@@_anspic_body_htdp_dim + { + \box_ht_plus_dp:N \l_@@_anspic_body_box + } + \IfDocumentMetadataTF + { + \tag_resume:n {keyanspic} + } { } + } + } +% \end{macrocode} +% The \cs{@@_anspic_label:nn} function will process inside |\makebox| the +% \emph{starred argument} ‘|*|’ and \emph{optional argument} passed +% to the command. Here we will store the \mymeta{label} and +% \emph{optional argument} in \emph{prop list} and \emph{sequence} +% and execute the \mykey{show-ans}, \mykey{show-pos}, \mykey{font}, +% \mykey{wrap-label} and \mykey{wrap-opt} keys. +% \iffalse +%% Process and store label and [opt] for |\anspic|. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_anspic_label:nn #1 #2 + { + \makebox[ \l_@@_anspic_mini_width_dim ][ c ] + { + \bool_if:nT { #1 } + { + \@@_keyans_addto_prop:n { #2 } + \@@_keyans_store_ref: + \@@_keyans_addto_seq:n { #2 } + \int_gincr:N \g_@@_check_starred_cmd_int + \bool_lazy_or:nnT + { \bool_if_p:N \l_@@_show_answer_bool } + { \bool_if_p:N \l_@@_show_position_bool } + { + \tl_set_eq:NN \l_@@_label_v_tl \l_@@_label_vi_tl + \@@_keyans_show_left:n { #2 } + \tl_set_eq:NN \l_@@_label_vi_tl \l_@@_label_v_tl + } + } + \tl_use:N \l_@@_label_font_style_v_tl + \@@_wrapper_label_v:n { \l_@@_label_vi_tl } + \@@_keyans_show_item_opt: + } + } +% \end{macrocode} +% The function \cs{@@_anspic_label_pos:nnn} will be in charge of +% handling the \emph{\enquote{counter}} and the position of the \mymeta{label}, +% set by \mykey{label-pos} key which will have the same configuration +% as the \myenv*{keyans} environment. +% \iffalse +%% Set position of labels for |\anspic|. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_anspic_label_pos:nnn #1 #2 #3 + { + \stepcounter { enumXvi } + \@@_anspic_body_dim:n { #3 } + \bool_if:NTF \l_@@_anspic_label_above_bool + { + \@@_anspic_label:nn { #1 } { #2 } + } + { + \raisebox + { + -\dim_eval:n + { + \l_@@_anspic_label_htdp_dim + + \l_@@_anspic_body_htdp_dim + + \box_dp:N \strutbox + + \l_@@_anspic_label_sep_skip + } + } + [ 0pt ] [ 0pt ] + { + \@@_anspic_label:nn { #1 } { #2 } + } + } + } +% +% \end{macrocode} +% The \cs{@@_anspic_args:nnn} function will be responsible for placing +% the code compatible with \emph{tagged} \texttt{PDF} and the arguments +% within the \cs{l_@@_anspic_args_seq} sequence which will be processed +% by the \cs{@@_anspic_print:n} function in the second part of the +% definition of the \myenv*{keyanspic} environment. +% \iffalse +%% Process all code for |\anspic| with tagging PDF support. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_anspic_args:nnn + { + \@@_anspic_start_list_tag: + \@@_anspic_label_pos:nnn { #1 } { #2 } { #3 } + \@@_anspic_stop_start_list_tag: + \bool_if:NTF \l_@@_anspic_label_above_bool + { + \\[\l_@@_anspic_label_sep_skip] #3 + } + { + \\ #3 + } + \@@_anspic_stop_list_tag: + } +% \end{macrocode} +% The value \mymarg{n° upper, n° lower} passed to the \mykey{layout-sty} +% key is split by comma and is handled directly by the function +% \cs{@@_anspic_print:n} and passed to the function \cs{@@_anspic_row:n}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_anspic_print:n + { + \clist_map_function:nN { #1 } \@@_anspic_row:n + } +\cs_generate_variant:Nn \@@_anspic_print:n { e, V } +% \end{macrocode} +% The function \cs{@@_anspic_row:n} will set the \emph{widths} for the +% \myenv{minipage} environments and place \emph{all arguments} passed +% to |\anspic| \emph{saved} in the \cs{l_@@_anspic_args_seq} sequence +% inside them. +% \begin{macrocode} +\cs_new_protected:Nn \@@_anspic_row:n + { + \dim_set:Nn \l_@@_anspic_mini_width_dim { \linewidth / #1 } + \int_set:Nn \l_@@_anspic_above_int { \l_@@_anspic_below_int } + \int_set:Nn \l_@@_anspic_below_int { \l_@@_anspic_above_int + #1 } + \int_step_inline:nnn + { \l_@@_anspic_above_int + 1 } + { \l_@@_anspic_below_int } + { + \IfDocumentMetadataTF + { + \tag_suspend:n {minipage} + } { } + \begin{minipage}[ \l_@@_anspic_mini_pos_str ]{ \l_@@_anspic_mini_width_dim } + \centering + \seq_item:Nn \l_@@_anspic_args_seq { ##1 } + \end{minipage} + \IfDocumentMetadataTF + { + \tag_resume:n {minipage} + } { } + } + \par + } +% \end{macrocode} +% The \cs{@@_anspic_exec:} function will execute all the code in the +% |\anspic| command in the second argument of the |keyanspic| environment +% definition. If the key \mykey{layout-sty} is not set, everything will +% be printed on a \emph{single line}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_anspic_exec: + { + \tl_if_empty:NTF \l_@@_anspic_layout_style_tl + { + \@@_anspic_print:e { \seq_count:N \l_@@_anspic_args_seq } + } + { + \@@_anspic_print:V \l_@@_anspic_layout_style_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The horizontal environments}\label{env:horizontal} +% +% Generating \emph{horizontal list environments} is NOT as simple as standard +% \hologo{LaTeX} list environments. The fundamental part of the code is adapted +% from the \mypkg{shortlst} package to a more modern version using \mypkg{expl3}. +% It is not possible to redefine |\item| and \ics{makelabel} using |\RenewDocumentCommand| as in +% the vertical \emph{non starred} versions. +% +% \smallskip +% +% To achieve the \emph{horizontal list environments} we will capture the |\item| +% command and the \mymeta{content} of this in \emph{horizontal box} using \ics{makebox} for +% the \mykey{label} and a \myenv{minipage} environment for the \mymeta{content} passed to +% |\item|, we will also add the \emph{optional argument} \myparg{number} to |\item| +% to be able to \emph{join columns} horizontally, in simple terms, we want +% |\item| to behave in the same way as in the \myenv*{enumext} environment but +% adding an \emph{first optional argument} \myparg{number}. +% +% \smallskip +% +% A side effect is the limitation of using |\item| in this way \emph{without} +% using |\RenewDocumentCommand|, which loses the original definition and +% affects the \emph{standard list environments} provided by \hologo{LaTeX} +% and any environment defined using base \myenv{list} environment, including: +% \myenv{itemize}, \myenv{enumerate}, \myenv{description}, \myenv{quote}, +% \myenv{quotation}, \myenv{verse}, \myenv{center}, \myenv{flushleft}, +% \myenv{flushright}, \myenv{verbatim}, \myenv{tabbing}, \myenv{trivlist}, +% \myenv{list} and all environments created with |\newtheorem|. +% +% \smallskip +% +% \begin{important}* +% One way to get around this is to use something like: +% +% \begin{Verbatim} +% \AddToHook{env/enumerate/before}{recover original \item definition} +% \end{Verbatim} +% +% inside \myenv{minipage}, but in my partial tests this does not have the +% desired effect and the vertical and horizontal spacing is distorted. +% For now this will remain as a limitation and I will see if it is +% feasible to implement it in the future. +% \end{important} +% +% \smallskip +% +% \begin{important} +% For compatibility with the \emph{tagged} \texttt{PDF} we close +% the environments according to the presence or not of the \mykey{mini-env} key. +% \end{important} +% +% \subsubsection{Functions for item box width} +% +% \begin{macro}{\@@_starred_columns_set_vii:, \@@_starred_columns_set_viii:,} +% We set the default value for the \emph{width of the box} containing the +% \mymeta{content} of the items for \myenv*{enumext*} environment. +% \iffalse +%% Define default item width (columns width) for |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_starred_columns_set_vii: + { + \dim_compare:nNnT { \l_@@_columns_sep_vii_dim } = { \c_zero_dim } + { + \dim_set:Nn \l_@@_columns_sep_vii_dim + { + ( \l_@@_labelwidth_vii_dim + \l_@@_labelsep_vii_dim ) + / \l_@@_columns_vii_int + } + } + \int_set:Nn \l_@@_tmpa_vii_int { \l_@@_columns_vii_int - 1 } + \dim_set:Nn \l_@@_item_width_vii_dim + { + ( \linewidth - \l_@@_columns_sep_vii_dim * \l_@@_tmpa_vii_int ) + / \l_@@_columns_vii_int + - \l_@@_labelwidth_vii_dim + - \l_@@_labelsep_vii_dim + } +% \end{macrocode} +% When the key \mykey{rightmargin} is active we must adjust the values. +% \begin{macrocode} + \dim_compare:nNnT { \l_@@_rightmargin_vii_dim } > { \c_zero_dim } + { + \dim_sub:Nn \l_@@_item_width_vii_dim + { + ( \l_@@_rightmargin_vii_dim * \l_@@_tmpa_vii_int ) + / \l_@@_columns_vii_int + } + \dim_add:Nn \l_@@_columns_sep_vii_dim + { + \l_@@_rightmargin_vii_dim + } + } + } +% \end{macrocode} +% Same implementation for the \myenv*{keyans*} environment. +% \begin{macrocode} +\cs_new_protected:Nn \@@_starred_columns_set_viii: + { + \dim_compare:nNnT { \l_@@_columns_sep_viii_dim } = { \c_zero_dim } + { + \dim_set:Nn \l_@@_columns_sep_viii_dim + { + ( \l_@@_labelwidth_viii_dim + \l_@@_labelsep_viii_dim ) + / \l_@@_columns_viii_int + } + } + \int_set:Nn \l_@@_tmpa_viii_int { \l_@@_columns_viii_int - 1 } + \dim_set:Nn \l_@@_item_width_viii_dim + { + ( \linewidth - \l_@@_columns_sep_viii_dim * \l_@@_tmpa_viii_int ) + / \l_@@_columns_viii_int + - \l_@@_labelwidth_viii_dim + - \l_@@_labelsep_viii_dim + } + \dim_compare:nNnT { \l_@@_rightmargin_viii_dim } > { \c_zero_dim } + { + \dim_sub:Nn \l_@@_item_width_viii_dim + { + ( \l_@@_rightmargin_viii_dim * \l_@@_tmpa_vii_int ) + / \l_@@_columns_viii_int + } + \dim_add:Nn \l_@@_columns_sep_viii_dim + { + \l_@@_rightmargin_viii_dim + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for join item columns} +% +% \begin{macro}{\@@_starred_joined_item_vii:n, \@@_starred_joined_item_viii:n,} +% The functions \cs{@@_starred_joined_item_vii:n} and \cs{@@_starred_joined_item_viii:n} +% will set the \emph{width} of the box in which the \mymeta{content} +% passed to \ics*{item}\myparg{columns} will be stored together with +% the value of |\itemwidth| for the \myenv*{enumext*} environment. +% \iffalse +%% Set width for joined item's for |enumext*| and |keyans*| environments. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_starred_joined_item_vii:n #1 + { + \int_set:Nn \l_@@_joined_item_vii_int {#1} + \int_compare:nNnT { \l_@@_joined_item_vii_int } > { \l_@@_columns_vii_int } + { + \msg_warning:nnee { enumext } { item-joined } + { \int_use:N \l_@@_joined_item_vii_int } + { \int_use:N \l_@@_columns_vii_int } + \int_set:Nn \l_@@_joined_item_vii_int + { + \l_@@_columns_vii_int - \l_@@_item_column_pos_vii_int + 1 + } + } + \int_compare:nNnT + { \l_@@_joined_item_vii_int } + > + { \l_@@_columns_vii_int - \l_@@_item_column_pos_vii_int + 1 } + { + \msg_warning:nnee { enumext } { item-joined-columns } + { \int_use:N \l_@@_joined_item_vii_int } + { + \int_eval:n + { \l_@@_columns_vii_int - \l_@@_item_column_pos_vii_int + 1 } + } + \int_set:Nn \l_@@_joined_item_vii_int + { + \l_@@_columns_vii_int - \l_@@_item_column_pos_vii_int + 1 + } + } + \int_compare:nNnTF { \l_@@_joined_item_vii_int } > { 1 } + { + \int_set_eq:NN \l_@@_joined_item_aux_vii_int \l_@@_joined_item_vii_int + \int_decr:N \l_@@_joined_item_aux_vii_int + \int_add:Nn \l_@@_item_column_pos_vii_int { \l_@@_joined_item_aux_vii_int } + \int_gadd:Nn \g_@@_item_count_all_vii_int { \l_@@_joined_item_aux_vii_int } + \dim_set:Nn \l_@@_joined_width_vii_dim + { + \l_@@_item_width_vii_dim * \l_@@_joined_item_vii_int + + ( \l_@@_labelwidth_vii_dim + \l_@@_labelsep_vii_dim + + \l_@@_columns_sep_vii_dim + )*\l_@@_joined_item_aux_vii_int + } + \dim_set_eq:NN \itemwidth \l_@@_joined_width_vii_dim + } + { + \dim_set_eq:NN \l_@@_joined_width_vii_dim \l_@@_item_width_vii_dim + \dim_set_eq:NN \itemwidth \l_@@_item_width_vii_dim + } + } +% \end{macrocode} +% Same implementation for the \myenv*{keyans*} environment. +% \begin{macrocode} +\cs_new_protected:Npn \@@_starred_joined_item_viii:n #1 + { + \int_set:Nn \l_@@_joined_item_viii_int {#1} + \int_compare:nNnT { \l_@@_joined_item_viii_int } > { \l_@@_columns_viii_int } + { + \msg_warning:nnee { enumext } { item-joined } + { \int_use:N \l_@@_joined_item_viii_int } + { \int_use:N \l_@@_columns_viii_int } + \int_set:Nn \l_@@_joined_item_viii_int + { + \l_@@_columns_viii_int - \l_@@_item_column_pos_viii_int + 1 + } + } + \int_compare:nNnT + { \l_@@_joined_item_viii_int } + > + { \l_@@_columns_viii_int - \l_@@_item_column_pos_viii_int + 1 } + { + \msg_warning:nnee { enumext } { item-joined-columns } + { \int_use:N \l_@@_joined_item_viii_int } + { + \int_eval:n + { \l_@@_columns_viii_int - \l_@@_item_column_pos_viii_int + 1 } + } + \int_set:Nn \l_@@_joined_item_viii_int + { + \l_@@_columns_viii_int - \l_@@_item_column_pos_viii_int + 1 + } + } + \int_compare:nNnTF { \l_@@_joined_item_viii_int } > { 1 } + { + \int_set_eq:NN \l_@@_joined_item_aux_viii_int \l_@@_joined_item_viii_int + \int_decr:N \l_@@_joined_item_aux_viii_int + \int_add:Nn \l_@@_item_column_pos_viii_int { \l_@@_joined_item_aux_viii_int } + \int_gadd:Nn \g_@@_item_count_all_viii_int { \l_@@_joined_item_aux_viii_int } + \dim_set:Nn \l_@@_joined_width_viii_dim + { + \l_@@_item_width_viii_dim * \l_@@_joined_item_viii_int + + ( \l_@@_labelwidth_viii_dim + \l_@@_labelsep_viii_dim + + \l_@@_columns_sep_viii_dim + )*\l_@@_joined_item_aux_viii_int + } + \dim_set_eq:NN \itemwidth \l_@@_joined_width_viii_dim + } + { + \dim_set_eq:NN \l_@@_joined_width_viii_dim \l_@@_item_width_viii_dim + \dim_set_eq:NN \itemwidth \l_@@_item_width_viii_dim + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Functions for \texttt{mini-env}, \texttt{mini-right} and \texttt{mini-right*} keys}\label{env:starred:key:mini-env} +% +% \begin{macro}{\@@_start_mini_vii:, \@@_stop_mini_vii:} +% The implementation of the \mykey{mini-env} key support is almost +% identical to the one used in the \myenv*{enumext} and \myenv*{keyans} +% environments, the difference is that the \myvarenv*{__@@_mini_page} +% environment on the \emph{\enquote{right side}} is executed +% \emph{\enquote{after}} closing the environment, so it is necessary to +% make a global copy of the variable \cs{l_@@_minipage_right_vii_dim} in +% the variable \cs{g_@@_minipage_right_vii_dim}.% +% \iffalse +%% Start support for |mini-env| key in |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_start_mini_vii: + { + \dim_compare:nNnT { \l_@@_minipage_right_vii_dim } > { \c_zero_dim } + { + \dim_set:Nn \l_@@_minipage_left_vii_dim + { + \linewidth + - \l_@@_minipage_right_vii_dim + - \l_@@_minipage_hsep_vii_dim + } + \bool_set_true:N \l_@@_minipage_active_vii_bool + \dim_gset_eq:NN + \g_@@_minipage_right_vii_dim + \l_@@_minipage_right_vii_dim + \@@_mini_addvspace_vii: + \nointerlineskip\noindent + \@@_mini_page{ \l_@@_minipage_left_vii_dim } + } + } +% \end{macrocode} +% The function \cs{@@_stop_mini_vii:} closes the \myvarenv*{__@@_mini_page} +% environment on the \emph{\enquote{left side}}, applies |\hfill| and +% set the variable \cs{g_@@_minipage_active_vii_bool} to \emph{\enquote{true}} +% which will be used in the function \cs{@@_after_env:nn} to execute +% the \myenv{minipage} on the \emph{\enquote{right side}}. At this point +% we will execute the \cs{@@_stop_list:} and \cs{@@_stop_store_level_vii:} +% functions stopping the \myenv{list} environment and the level saving +% mechanism for storage in \emph{sequence} of the |\anskey| command +% and |anskey*| environment. This function is passed to the +% \cs{@@_after_list_vii:} function in the second part of the \myenv*{enumext*} +% environment definition (\S\ref{env:starred}). +% \iffalse +%% Stop support for |mini-env| key ans stop |list| in |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_stop_mini_vii: + { + \bool_if:NTF \l_@@_minipage_active_vii_bool + { + \@@_stop_list: + \@@_stop_store_level_vii: + \IfDocumentMetadataTF { \tag_resume:n {enumext*} } { } + \end@@_mini_page + \hfill + \bool_gset_true:N \g_@@_minipage_active_vii_bool + } + { + \@@_stop_list: + \@@_stop_store_level_vii: + } + } +% \end{macrocode} +% \end{macro} +% +% Finally we execute the \mymarg{code} passed to the \mykey{mini-right} +% or \mykey{mini-right*} keys stored in the variable \cs{g_@@_miniright_code_vii_tl} +% in the \myenv{minipage} environment on the \emph{\enquote{right +% side}}. For compatibility with the \mypkg{caption} package and possibly +% other \mymarg{code} passed to this key, we will pass it to a box and +% then print it. +% \iffalse +%% Exec |mini-right|, |mini-right*| keys in |enumext*| environment. +% \fi +% \begin{macrocode} +\@@_after_env:nn {enumext*} + { + \bool_if:NT \g_@@_minipage_active_vii_bool + { + \@@_minipage:w [ t ] { \g_@@_minipage_right_vii_dim } + \legacy_if_gset_false:n { @minipage } + \skip_vertical:N \c_zero_skip + \par\addvspace { \g_@@_minipage_right_skip } + \bool_if:NF \g_@@_minipage_center_vii_bool + { + \tl_put_left:Nn \g_@@_miniright_code_vii_tl + { + \centering + } + } + \vbox_set_top:Nn \l_@@_miniright_code_vii_box + { + \tl_use:N \g_@@_miniright_code_vii_tl + } + \box_use_drop:N \l_@@_miniright_code_vii_box + \skip_vertical:N \c_zero_skip + \@@_endminipage: + \par\addvspace{ \g_@@_minipage_after_skip } + } + \bool_gset_false:N \g_@@_minipage_active_vii_bool + \bool_gset_true:N \g_@@_minipage_center_vii_bool + \tl_gclear:N \g_@@_miniright_code_vii_tl + \dim_gzero:N \g_@@_minipage_right_vii_dim + \bool_gset_false:N \g_@@_starred_bool + } +% \end{macrocode} +% +% \begin{macro}{\@@_start_mini_viii:,\@@_stop_mini_viii:} +% The implementation of the \mykey{mini-env}, \mykey{mini-right} and +% \mykey{mini-right*} keys is identical to the one used in the +% \myenv*{enumext*} environment. +% \iffalse +%% Support for |mini-env|, |mini-right| and |mini-right*| key in |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_start_mini_viii: + { + \dim_compare:nNnT { \l_@@_minipage_right_viii_dim } > { \c_zero_dim } + { + \dim_set:Nn \l_@@_minipage_left_viii_dim + { + \linewidth + - \l_@@_minipage_right_viii_dim + - \l_@@_minipage_hsep_viii_dim + } + \bool_set_true:N \l_@@_minipage_active_viii_bool + \dim_gset_eq:NN + \g_@@_minipage_right_viii_dim + \l_@@_minipage_right_viii_dim + \@@_mini_addvspace_viii: + \nointerlineskip\noindent + \@@_mini_page{ \l_@@_minipage_left_viii_dim } + } + } +\cs_new_protected:Nn \@@_stop_mini_viii: + { + \bool_if:NTF \l_@@_minipage_active_viii_bool + { + \@@_stop_list: + \IfDocumentMetadataTF { \tag_resume:n {keyans*} } { } + \end@@_mini_page + \hfill + \bool_gset_true:N \g_@@_minipage_active_viii_bool + } + { + \@@_stop_list: + } + } +\@@_after_env:nn {keyans*} + { + \bool_if:NT \g_@@_minipage_active_viii_bool + { + \@@_mini_page{ \g_@@_minipage_right_viii_dim } + \par\addvspace { \g_@@_minipage_right_skip } + \bool_if:NF \g_@@_minipage_center_viii_bool + { + \tl_put_left:Nn \g_@@_miniright_code_viii_tl + { + \centering + } + } + \vbox_set_top:Nn \l_@@_miniright_code_viii_box + { + \tl_use:N \g_@@_miniright_code_viii_tl + } + \box_use_drop:N \l_@@_miniright_code_viii_box + \end@@_mini_page + \par\addvspace{ \g_@@_minipage_after_skip } + } + \bool_gset_false:N \g_@@_minipage_active_viii_bool + \bool_gset_true:N \g_@@_minipage_center_viii_bool + \tl_gclear:N \g_@@_miniright_code_viii_tl + \dim_gzero:N \g_@@_minipage_right_viii_dim + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The environment \env{enumext*}}\label{env:starred} +% +% \begin{macro}{enumext*} +% First we will generate the environment and we will give a +% temporary definition to \cs{@@_stop_item_tmp_vii:} equal to +% \cs{@@_first_item_tmp_vii:} and next to |\item| equal to \cs{@@_start_item_tmp_vii:} +% which we will redefine later. Unlike the implementation used by +% the \mypkg{shortlst} package, we will not set the values of +% |\rightskip| and |\@rightskip| equal to |\@flushglue| whose value is +% \mydim{0.0pt plus 1.0 fil}, in the tests I have performed this fails in +% some circumstances and different results are obtained when using +% \hologo{pdfTeX} and \hologo{LuaTeX}. +% \iffalse +%% Define |enumext*| +% \fi +% \begin{macrocode} +\NewDocumentEnvironment{enumext*}{ o } + { + \@@_safe_exec_vii: + \@@_parse_keys_vii:n {#1} + \@@_before_list_vii: + \@@_start_store_level_vii: + \@@_start_list:nn { } + { + \@@_list_arg_two_vii: + \@@_before_keys_exec_vii: + } + \IfDocumentMetadataTF { \tag_suspend:n {enumext*} } { } + \@@_starred_columns_set_vii: + \item[] \scan_stop: + \cs_set_eq:NN \@@_stop_item_tmp_vii: \@@_first_item_tmp_vii: + \cs_set_eq:NN \item \@@_start_item_tmp_vii: + \ignorespaces + } + { + \IfDocumentMetadataTF { \tag_struct_end:n {tag=text-unit} } { } + \@@_stop_item_tmp_vii: + \@@_remove_extra_parsep_vii: + \@@_after_list_vii: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_safe_exec_vii:}\label{fun:starred:safe-exe} +% We will first call the function \cs{@@_is_not_nested:} which sets +% \cs{g_@@_starred_bool} to true if we are NOT nested within \myenv*{enumext}, +% then call the function \cs{@@_internal_mini_page:} to create the +% environment \myvarenv*{__@@_mini_page}, we will increment +% \cs{l_@@_level_h_int} to restrict nesting of the environment, set +% \cs{l_@@_starred_bool} to true and finally call the function +% \cs{@@_is_on_first_level:} which sets \cs{l_@@_starred_first_bool} to +% true if we are not nested, allowing the \emph{\enquote{storage system}} +% to be used. +% \iffalse +%% Safe exec for |enumext*| environment (set vars for storage system). +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_safe_exec_vii: + { + \@@_is_not_nested: + \@@_internal_mini_page: + \int_incr:N \l_@@_level_h_int + \int_compare:nNnT { \l_@@_level_h_int } > { 1 } + { + \msg_error:nn { enumext } { nested } + } + \int_compare:nNnT { \l_@@_keyans_level_h_int } = { 1 } + { + \msg_error:nnn { enumext } { nested-horizontal } { keyans*} + } + \bool_set_true:N \l_@@_starred_bool + \bool_set_false:N \l_@@_standar_bool + \@@_is_on_first_level: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_keys_vii:n} +% First we will clear the variable \cs{l_@@_series_str} used by the key +% \mykey{series}, process the environment \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% and execute the function \cs{@@_parse_series:n} and used by the key +% \mykey{series}, then we execute the function \cs{@@_store_active_keys_vii:n} +% and reprocess the \mymeta{keys} to pass them to the storage \emph{sequence} +% if the key \mykey{save-key} is not active. +%^^A and finally we call the function +%^^A \cs{@@_nested_base_line_fix:} used by the key \mykey{base-fix}. +% \iffalse +%% Parse |key=val| and store keys for |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_keys_vii:n #1 + { + \tl_if_novalue:nF {#1} + { + \str_clear:N \l_@@_series_str + \keys_set:nn { enumext / enumext* } {#1} + \@@_parse_series:n {#1} + \@@_store_active_keys_vii:n {#1} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_before_list_vii:} +% The function \cs{@@_before_list_vii:} first calls the function +% \cs{@@_vspace_above_vii:} used by the keys \mykey{above} and +% \mykey{above*}, then calls the function \cs{@@_check_ans_active:} for +% the check answer mechanism and finally calls the functions +% \cs{@@_before_args_exec:} and \cs{@@_start_mini_vii:} used by the +% keys \mykey{before*}, \mykey{mini-env}, \mykey{mini-right} and +% \mykey{mini-right*}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_before_list_vii: + { + \@@_vspace_above_vii: + \@@_check_ans_active: + \@@_before_args_exec_vii: + \@@_start_mini_vii: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_after_list_vii:} +% The function \cs{@@_after_list_vii:} first calls the function +% \cs{@@_stop_mini_vii:} which internally calls \cs{@@_stop_list:} and +% \cs{@@_stop_store_level_vii:} (\S\ref{env:starred:key:mini-env}) used +% by the keys \mykey{mini-env}, \mykey{mini-right} and \mykey{mini-right*}, +% then to the functions \cs{@@_after_stop_list_vii:} used by the key +% \mykey{after}, \cs{@@_check_ans_key_hook:} used by the key \mykey{check-ans}, +% \cs{@@_vspace_below_vii:} used by the keys \mykey{below} and +% \mykey{below*}. Finally set \cs{l_@@_starred_bool} to false and call +% the \cs{@@_resume_save_counter:} function used by the \mykey{series}, +% \mykey{resume} and \mykey{resume*} keys. +% \begin{macrocode} +\cs_new_protected:Nn \@@_after_list_vii: + { + \@@_stop_mini_vii: + \@@_after_stop_list_vii: + \@@_check_ans_key_hook: + \@@_vspace_below_vii: + \bool_set_false:N \l_@@_starred_bool + \@@_resume_save_counter: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_start_store_level_vii:, \@@_stop_store_level_vii:} +% The \cs{@@_start_store_level_vii:} and \cs{@@_stop_store_level_vii:} +% functions activate the \emph{\enquote{storing structure}} mechanism +% in \emph{sequence} for \ics*{anskey} command and \myenv*{anskey*} +% environment if \myenv*{enumext*} are nested in \myenv*{enumext}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_start_store_level_vii: + { + \bool_if:NT \l_@@_store_active_bool + { + \int_compare:nNnT { \l_@@_level_int } > { 0 } + { + \@@_store_level_open_vii: + } + } + } +\cs_new_protected:Nn \@@_stop_store_level_vii: + { + \bool_if:NT \l_@@_store_active_bool + { + \int_compare:nNnT { \l_@@_level_int } > { 0 } + { + \@@_store_level_close_vii: + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The command \cs{item} in \env{enumext*}}\label{cmd:item-boxed-vii} +% +% \begin{macro}{\@@_first_item_tmp_vii:} +% +% The \cs{@@_first_item_tmp_vii:} function will remove horizontal space +% equal to |\labelwidth| plus |\labelsep| to the left of the \emph{\enquote{first}} +% |\item| in the environment at the point of execution of this function, +% where it is equal to the \cs{@@_stop_item_tmp_vii:} function inside the +% environment body definition. +% \iffalse +%% Remove |\labelwidth+\labelsep| on left in first |\item| for |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Nn \@@_first_item_tmp_vii: + { + \skip_horizontal:n + { + -\l_@@_labelwidth_vii_dim - \l_@@_labelsep_vii_dim + } + \ignorespaces + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_start_item_tmp_vii:, \@@_item_peek_args_vii:, +% \@@_joined_item_vii:w, \@@_standar_item_vii:w, +% \@@_starred_item_vii:w, \@@_starred_item_vii_aux_i:w, +% \@@_starred_item_vii_aux_ii:w, \@@_starred_item_vii_aux_iii:w,} +% First we will call the function \cs{@@_stop_item_tmp_vii:} that we +% will redefine later, we will increment the value of +% \cs{l_@@_item_column_pos_vii_int} that will count the item's by rows and +% the value of \cs{g_@@_item_count_all_vii_int} that will count the +% total of item's in the environment. After that we will call the +% function \cs{@@_item_peek_args_vii:} that will handle the +% arguments passed to \ics*{item}. +% \iffalse +%% Start boxed item's for |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Nn \@@_start_item_tmp_vii: + { + \@@_stop_item_tmp_vii: + \int_incr:N \l_@@_item_column_pos_vii_int + \int_gincr:N \g_@@_item_count_all_vii_int + \@@_item_peek_args_vii: + } +% \end{macrocode} +% The function \cs{@@_item_peek_args_vii:} will handle the \ics*{item}\myparg{number}. +% Look for the argument \enquote{\textcolor{MediumOrchid}{\ttfamily (}}, +% if it is present we will call the function \cs{@@_joined_item_vii:w} \myparg{number}, +% which is in charge of joining the item's in the same row, in case they +% are not present we will set the default value \textcolor{gray}{\ttfamily(\mydim{1})}. +% \iffalse +%% Peek argument for \item()*[][] for |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_item_peek_args_vii: + { + \peek_meaning:NTF ( + { \@@_joined_item_vii:w } + { \@@_joined_item_vii:w (1) } + } +% \end{macrocode} +% The function \cs{@@_joined_item_vii:w} will first call the +% function \cs{@@_starred_joined_item_vii:n} in charge of setting the +% \emph{width} of the box that will store the content passed to \ics*{item}. Then we +% will look for the argument \enquote{\textcolor{MediumOrchid}{\ttfamily *}}, if it is present we will call the +% function \cs{@@_starred_item_vii:w} otherwise we will call the +% function \cs{@@_standar_item_vii:w}. +% \iffalse +%% Joined item's for |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_joined_item_vii:w (#1) + { + \@@_starred_joined_item_vii:n {#1} + \peek_meaning_remove:NTF * + { \@@_starred_item_vii:w } + { \@@_standar_item_vii:w } + } +% \end{macrocode} +% The function \cs{@@_standar_item_vii:w} will first look for the +% argument “|[|”, if present it will set the state of the variable +% \cs{l_@@_wrap_label_opt_vii_bool} equal to the state of the variable +% \cs{l_@@_wrap_label_opt_vii_bool} handled by the key +% \mykey{wrap-label*} and finally execute the \emph{non-enumerated} +% version \ics*{item}\myoarg{custom} by means of the function +% \cs{@@_start_item_vii:w}, otherwise we will set the value of the +% variable \cs{l_@@_wrap_label_vii_bool} handled by the +% \mykey{wrap-label} key to true and set the switch |\if@noitemarg| to +% true to execute the enumerated version of \ics*{item} by means of the +% function \cs{@@_start_item_vii:w} |[| \myvarenv{l__@@_label_vii_tl} |]|. +% \iffalse +%% Set \item[opt] for |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_standar_item_vii:w + { + \bool_set_false:N \l_@@_item_starred_vii_bool + \peek_meaning:NTF [ + { + \bool_set_eq:NN \l_@@_wrap_label_vii_bool \l_@@_wrap_label_opt_vii_bool + \@@_start_item_vii:w + } + { + \bool_set_true:N \l_@@_wrap_label_vii_bool + \legacy_if_set_true:n { @noitemarg } + \@@_start_item_vii:w [ \l_@@_label_vii_tl ] \ignorespaces + } + } +% \end{macrocode} +% The function \cs{@@_starred_item_vii:w} together with the specified +% auxiliary functions |aux_i:w|, |aux_ii:w|, and |aux_iii:w| execute \ics*{item*}, +% \ics*{item*}\myoarg{symbol} and \ics*{item*}\myoarg{symbol}\myoarg{offset}. +% \iffalse +%% Set \item*[sym][sep] for |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_starred_item_vii:w + { + \bool_set_true:N \l_@@_item_starred_vii_bool + \bool_set_true:N \l_@@_wrap_label_vii_bool + \peek_meaning:NTF [ + { \@@_starred_item_vii_aux_i:w } + { \@@_starred_item_vii_aux_ii:w } + } +\cs_new_protected:Npn \@@_starred_item_vii_aux_i:w [#1] + { + \tl_gset:Nn \g_@@_item_symbol_aux_vii_tl {#1} + \@@_starred_item_vii_aux_ii:w + } +\cs_new_protected:Npn \@@_starred_item_vii_aux_ii:w + { + \peek_meaning:NTF [ + { \@@_starred_item_vii_aux_iii:w } + { + \dim_set_eq:NN \l_@@_item_symbol_sep_vii_dim \l_@@_labelsep_vii_dim + \legacy_if_set_true:n { @noitemarg } + \@@_start_item_vii:w [ \l_@@_label_vii_tl ] \ignorespaces + } + } +\cs_new_protected:Npn \@@_starred_item_vii_aux_iii:w [#1] + { + \dim_set:Nn \l_@@_item_symbol_sep_vii_dim {#1} + \legacy_if_set_true:n { @noitemarg } + \@@_start_item_vii:w [ \l_@@_label_vii_tl ] \ignorespaces + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fake_make_label_vii:n} +% The \cs{@@_fake_make_label_vii:n} function will be in charge of +% handling our definition of |\item|. First we increment the counter +% \icounter{enumXvii} for the enumerated items and activate support for +% the \emph{check answers} mechanism, followed by support for +% \ics*{item*}\myoarg{symbol}\myoarg{offset} if present, then the +% \mykey{wrap-label} and \mykey{wrap-label*} keys which we execute using +% |\makebox| whose width will be given by the \mykey{labelwidth} key and +% position by the \mykey{align} key, inside the argument of this we will +% execute the \mykey{font} key together with the function defined by the +% \mykey{wrap-label} or \mykey{wrap-label*} keys. Finally we execute the +% \mykey{labelsep} key applying a |\skip_horizontal:N| and |\ignorespaces|. +% +% \smallskip +% +% \begin{important} +% For compatibility with \emph{tagged} \texttt{PDF} and \mypkg{hyperref} +% when an environment \myenv*{enumext} is nested in \myenv*{enumext*} +% and the key \mykey{save-ans} is not active need setting the |\if@hyper@item| +% switch to \emph{\enquote{true}}. The explanation for this is given +% by the master Heiko Oberdiek on \href{https://tex.stackexchange.com/a/404911}{\textbackslash +% refstepcounter\{enumi\} twice (or more) creates destination with the +% same identifier}. +% This patch is only needed if you are running |pdflatex| and not if +% you are running |lualatex| +% \end{important} +% +% \iffalse +%% Fake \makelabel definition for |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_fake_make_label_vii:n #1 + { + \legacy_if:nT { @noitemarg } + { + \legacy_if_set_false:n { @noitemarg } + \legacy_if:nT { @nmbrlist } + { + \IfDocumentMetadataTF + { + \bool_if:NT \l_@@_hyperref_bool + { + \legacy_if_set_true:n { @hyper@item } + } + } { } + \refstepcounter{enumXvii} + \bool_if:NT \l_@@_check_answers_bool + { + \int_gincr:N \g_@@_item_number_int + \bool_set_true:N \l_@@_item_number_bool + } + } + } + \bool_if:NT \l_@@_item_starred_vii_bool + { + \tl_if_blank:VT \g_@@_item_symbol_aux_vii_tl + { + \tl_gset_eq:NN + \g_@@_item_symbol_aux_vii_tl \l_@@_item_symbol_vii_tl + } + \mode_leave_vertical: + \skip_horizontal:n { -\l_@@_item_symbol_sep_vii_dim } + \hbox_overlap_left:n { \g_@@_item_symbol_aux_vii_tl } + \skip_horizontal:N \l_@@_item_symbol_sep_vii_dim + \tl_gclear:N \g_@@_item_symbol_aux_vii_tl + } + \makebox[ \l_@@_labelwidth_vii_dim ][ \l_@@_align_label_vii_str ] + { + \tl_use:N \l_@@_label_font_style_vii_tl + \bool_if:NTF \l_@@_wrap_label_vii_bool + { + \@@_wrapper_label_vii:n {#1} + } + { #1 } + } + \skip_horizontal:N \l_@@_labelsep_vii_dim \ignorespaces + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Real definition of \cs{item} in \env{enumext*}} +% +% The functions \cs{@@_start_item_vii:w} and \cs{@@_stop_item_vii:} executing +% the true definition of \ics*{item} inside the \myenv*{enumext*} environment, unlike +% the implementation in \mypkg{shortlst} we will NOT use an extra group +% and the plain form of the \myenv{lrbox} environment. +% +% \begin{macro}{\@@_start_item_vii:w, \@@_stop_item_vii:} +% The first thing we will do is set the value of \cs{@@_stop_item_tmp_vii:} equal to +% \cs{@@_stop_item_vii:} which we will define later, after that we will +% start capturing |\item| and \emph{\enquote{item content}} in a \emph{horizontal box} +% where the width will be |\itemwidth| plus |\labelwidth| plus |\labelsep|. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_start_item_vii:w [#1] + { + \cs_set_eq:NN \@@_stop_item_tmp_vii: \@@_stop_item_vii: + \hbox_set_to_wd:Nnw \l_@@_item_text_vii_box + { + \l_@@_joined_width_vii_dim + + \l_@@_labelwidth_vii_dim + + \l_@@_labelsep_vii_dim + } +% \end{macrocode} +% Redefine the |\footnote| command. +% \begin{macrocode} + \@@_renew_footnote_starred: +% \end{macrocode} +% Now we insert our \emph{sockets} for \emph{tagging} \texttt{PDF} +% support and run |\item|. +% \begin{macrocode} + \@@_start_list_tag:n {enumext*} + \@@_fake_make_label_vii:n {#1} + \@@_stop_start_list_tag: +% \end{macrocode} +% Finally we open the \myenv{minipage} environment, capture the +% \emph{\enquote{item content}}, make |\parindent| take the value of the +% key \mykey{listparindent} and |\parskip| take the value of the key +% \mykey{parsep}, then execute the keys \mykey{itemindent} and +% \mykey{first}. +% +% \smallskip +% +% \begin{important}* +% Here the use of |\unskip| and |\skip_horizontal:n| with the value of +% \mykey{listparindent} is necessary, otherwise an unwanted space is +% created when using |\item|\myoarg{opt} and the value passed to the key +% \mykey{itemindent} is incremented. +% \end{important} +% +% \smallskip +% +% \begin{macrocode} + \@@_minipage:w [ t ]{ \l_@@_joined_width_vii_dim } + \dim_set_eq:NN \parindent \l_@@_listparindent_vii_dim + \skip_set_eq:NN \parskip \l_@@_parsep_vii_skip + \@@_unskip_unkern: + \@@_unskip_unkern: + \skip_horizontal:n { -\l_@@_listparindent_vii_dim } \ignorespaces + \tl_use:N \l_@@_fake_item_indent_vii_tl + \tl_use:N \l_@@_after_list_args_vii_tl + } +% \end{macrocode} +% The \cs{@@_stop_item_vii:} function will finish the fetching |\item| +% and \emph{\enquote{item content}} by closing the \myenv{minipage} +% environment, the \emph{sockets} for \emph{tagging} \texttt{PDF} and the +% \emph{horizontal box}. +% \begin{macrocode} +\cs_new_protected_nopar:Nn \@@_stop_item_vii: + { + \@@_endminipage: + \@@_stop_list_tag:n {enumext*} + \hbox_set_end: +% \end{macrocode} +% Here we will reduce the \emph{warnings} a bit by setting the value +% of |\hbadness| to \mydim{10000}, print |\item| and \emph{\enquote{item content}} +% from the \emph{horizontal box},. +% \begin{macrocode} + \int_set:Nn \hbadness { 10000 } + \box_use_drop:N \l_@@_item_text_vii_box +% \end{macrocode} +% Finally apply the \emph{vertical space} between rows set by \mykey{itemsep} +% key passed to |\parsep| using |\par\noindent| and \emph{horizontal space} +% between columns set by \mykey{columns-sep} key using |\skip_horizontal:N|. +% \begin{macrocode} + \int_compare:nNnTF + { \l_@@_item_column_pos_vii_int } = { \l_@@_columns_vii_int } + { + \par\noindent + \int_zero:N \l_@@_item_column_pos_vii_int + } + { + \skip_horizontal:N \l_@@_columns_sep_vii_dim + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_remove_extra_parsep_vii:} +% Remove the extra \emph{vertical space} equal to |\parsep=\itemsep| when the +% total number of |\item| is divisible by the number of |\item| in the last +% row of the environment. Here the use of |\unskip| or |\removelastskip| +% fails and does not obtain the expected result, using |\vspace| is +% the option and in this case, we can use a simplified version since +% we are always in \mymeta{vertical mode}. +% \iffalse +%% Remove extra \parsep in |enumext*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_remove_extra_parsep_vii: + { + \int_compare:nNnT + { + \int_mod:nn + { \g_@@_item_count_all_vii_int } { \l_@@_columns_vii_int } + } + = + { 0 } + { + \para_end: + \skip_vertical:n { -\l_@@_itemsep_vii_skip } + \skip_vertical:N \c_zero_skip + \int_gzero:N \g_@@_item_count_all_vii_int + } + } +% \end{macrocode} +% \end{macro} +% +% \smallskip +% +% As we don't want our check to be executed \mykey{check-ans} by levels +% but on the complete list, we will take it out of the \myenv*{enumext*} +% environment using the \emph{\enquote{hook}} function \cs{@@_after_env:nn}. +% \iffalse +%% Execute |check-ans| key out of |enumext*| environment. +% \fi +% \begin{macrocode} +\@@_after_env:nn {enumext*} + { + \@@_execute_after_env: + } +% \end{macrocode} +% +% \subsection{The environment \env{keyans*}}\label{env:keyans-starred} +% +% \begin{macro}{keyans*} +% The implementation of \myenv*{keyans*} environment is the +% similar as that used by the \myenv*{enumext*} environment except for the +% \cs{@@_check_starred_cmd:n} function added in the second part. +% \iffalse +%% Define |keyans*| environment. +% \fi +% \begin{macrocode} +\NewDocumentEnvironment{keyans*}{ o } + { + \@@_safe_exec_viii: + \@@_parse_keys_viii:n {#1} + \@@_before_list_viii: + \@@_start_list:nn { } + { + \@@_list_arg_two_viii: + \@@_before_keys_exec_viii: + } + \IfDocumentMetadataTF { \tag_suspend:n {keyans*} } { } + \@@_starred_columns_set_viii: + \item[] \scan_stop: + \cs_set_eq:NN \@@_stop_item_tmp_viii: \@@_first_item_tmp_viii: + \cs_set_eq:NN \item \@@_start_item_tmp_viii: + \ignorespaces + } + { + \IfDocumentMetadataTF { \tag_struct_end:n {tag=text-unit} } { } + \@@_stop_item_tmp_viii: + \@@_remove_extra_parsep_viii: + \@@_check_starred_cmd:n { item } + \@@_after_list_viii: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_safe_exec_viii:} +% The \cs{@@_safe_exec_viii:} function will first check if the +% \mykey{save-ans} key is active and only when this is true the +% environment will be available, it will increment the value of +% \cs{l_@@_keyans_level_h_int} and return an error message when we are +% nesting the environment, then it will call the +% \cs{@@_keyans_name_and_start:} function in charge of saving the name of +% the environment and the line it is running on, then it will check if we +% are trying to nest \myenv*{keyans*} in \myenv*{enumext*} returning an +% error and we will set \cs{l_@@_starred_bool} to true, finally we will +% check if we are within the appropriate level within the +% \myenv*{enumext} environment. +% \iffalse +%% Test deep-level for |keyans*| environment and set bool vars. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_safe_exec_viii: + { + \bool_if:NF \l_@@_store_active_bool + { + \msg_error:nnnn { enumext } { wrong-place }{ keyans* }{ save-ans } + } + \int_incr:N \l_@@_keyans_level_h_int + \int_compare:nNnT { \l_@@_keyans_level_h_int } > { 1 } + { + \msg_error:nn { enumext } { nested } + } + \@@_keyans_name_and_start: + \bool_if:NT \l_@@_starred_bool + { + \msg_error:nnn { enumext } { nested-horizontal } { enumext* } + } + \bool_set_true:N \l_@@_starred_bool + % Set false for interfering with enumext nested in keyans* (yes, its possible and crayze) + \bool_set_false:N \l_@@_store_active_bool + \int_compare:nNnT { \l_@@_level_int } > { 1 } + { + \msg_error:nn { enumext } { keyans-wrong-level } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_keys_viii:n} +% Parse \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% for \myenv*{keyans*}. +% \iffalse +%% Parse |key=val| and store keys for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_keys_viii:n #1 + { + \tl_if_novalue:nF {#1} + { + \keys_set:nn { enumext / keyans* } {#1} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_before_list_viii:} +% The function \cs{@@_before_list_viii:} will add the vertical +% spacing on the environment if the \mykey{above} key is active next to +% the \mymarg{code} defined by the \mykey{before*} key if +% it is active, the call the function \cs{@@_start_mini_viii:} handle by +% \mykey{mini-env}. +% \begin{macrocode} +\cs_new_protected:Nn \@@_before_list_viii: + { + \@@_vspace_above_viii: + \@@_before_args_exec_viii: + \@@_start_mini_viii: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_after_list_viii:} +% The function \cs{@@_after_list_viii:} first call the function \cs{@@_stop_mini_viii:}, +% then apply the \mymarg{code} handled by the \mykey{after} key +% together with the \emph{vertical space} handled by the \mykey{below} key if +% they are present. +% \begin{macrocode} +\cs_new_protected:Nn \@@_after_list_viii: + { + \@@_stop_mini_viii: + \@@_after_stop_list_viii: + \@@_vspace_below_viii: + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The command \cs{item} in \env{keyans*}}\label{cmd:item-boxed-viii} +% +% The idea here is to make the |\item| command behave in the same way as +% in the \myenv*{keyans} environment with the difference of the \emph{optional argument} +% \myparg{number} which works in the same way as in the \myenv*{enumext*} +% environment. +% +% In simple terms we want to store the \mymeta{label} next to the \myoarg{content} if it is present +% in the \emph{sequence} and \emph{prop list} defined by \mykey{save-ans} key for +% |\item*|, |\item*|\myoarg{content}, |\item|\myparg{number}|*| and +% |\item|\myparg{number}|*|\myoarg{content} commands. +% +% \begin{macro}{\@@_first_item_tmp_viii:} +% The \cs{@@_first_item_tmp_viii:} function will remove horizontal space +% equal to |\labelwidth| plus |\labelsep| to the left of the \emph{\enquote{first}} +% |\item| in the environment at the point of execution of this function, +% where it is equal to the \cs{@@_stop_item_tmp_viii:} function inside the +% environment body definition. +% \iffalse +%% Remove |\labelwidth+\labelsep| on left in first |\item| for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Nn \@@_first_item_tmp_viii: + { + \skip_horizontal:n + { + -\l_@@_labelwidth_viii_dim - \l_@@_labelsep_viii_dim + } + \ignorespaces + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_start_item_tmp_viii:, \@@_item_peek_args_viii:, +% \@@_joined_item_viii:w, \@@_standar_item_viii:w} +% First we will call the function \cs{@@_stop_item_tmp_viii:} that we +% will redefine later, we will increment the value of +% \cs{l_@@_item_column_pos_viii_int} that will count the item's by rows and +% the value of \cs{g_@@_item_count_all_viii_int} that will count the +% total of item's in the environment. After that we will call the +% function \cs{@@_item_peek_args_viii:} that will handle the +% arguments passed to \ics*{item}. +% \iffalse +%% Start boxed item's for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Nn \@@_start_item_tmp_viii: + { + \@@_stop_item_tmp_viii: + \int_incr:N \l_@@_item_column_pos_viii_int + \int_gincr:N \g_@@_item_count_all_viii_int + \@@_item_peek_args_viii: + } +% \end{macrocode} +% The function \cs{@@_item_peek_args_viii:} will handle the \ics*{item}\myparg{number}. +% Look for the argument \enquote{\textcolor{MediumOrchid}{\ttfamily (}}, if it is +% present we will call the function \cs{@@_joined_item_viii:w} \myparg{number}, which is in charge of joining the item's +% in the same row, in case they are not present we will set the default +% value \textcolor{gray}{\ttfamily(\mydim{1})}. +% \iffalse +%% Peek argument for \item(number)*[opt] for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_item_peek_args_viii: + { + \peek_meaning:NTF ( + { \@@_joined_item_viii:w } + { \@@_joined_item_viii:w (1) } + } +% \end{macrocode} +% The function \cs{@@_joined_item_viii:w} will first call the +% function \cs{@@_starred_joined_item_viii:n} in charge of setting the +% \emph{width} of the box that will store the content passed to \ics*{item}. Then we +% will look for the argument \enquote{\textcolor{MediumOrchid}{\ttfamily *}}, if it is present we will call the +% function \cs{@@_starred_item_viii:w} otherwise we will call the +% function \cs{@@_standar_item_viii:w}. +% \iffalse +%% Joined item's for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_joined_item_viii:w (#1) + { + \@@_starred_joined_item_viii:n {#1} + \peek_meaning_remove:NTF * + { \@@_starred_item_viii:w } + { \@@_standar_item_viii:w } + } +% \end{macrocode} +% The function \cs{@@_standar_item_viii:w} will first look for the +% argument “|[|”, if present it will set the state of the variable +% \cs{l_@@_wrap_label_opt_viii_bool} equal to the state of the variable +% \cs{l_@@_wrap_label_opt_viii_bool} handled by the key +% \mykey{wrap-label*} and finally execute the \emph{non-enumerated} +% version \ics*{item}\myoarg{custom} by means of the function +% \cs{@@_start_item_viii:w}, otherwise we will set the value of the +% variable \cs{l_@@_wrap_label_viii_bool} handled by the +% \mykey{wrap-label} key to true and set the switch |\if@noitemarg| to +% true to execute the enumerated version of \ics*{item} by means of the +% function \cs{@@_start_item_viii:w} |[| \myvarenv{l__@@_label_viii_tl} |]|. +% \iffalse +%% Set standard \item[opt] for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_standar_item_viii:w + { + \bool_set_false:N \l_@@_item_starred_viii_bool + \peek_meaning:NTF [ + { + \bool_set_eq:NN \l_@@_wrap_label_viii_bool \l_@@_wrap_label_opt_viii_bool + \@@_start_item_viii:w + } + { + \bool_set_true:N \l_@@_wrap_label_viii_bool + \legacy_if_set_true:n { @noitemarg } + \@@_start_item_viii:w [ \l_@@_label_viii_tl ] \ignorespaces + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_starred_item_viii:w, \@@_starred_item_viii_aux_i:w, +% \@@_starred_item_viii_aux_ii:w, \@@_starred_item_exec:} +% The function \cs{@@_starred_item_viii:w} together with the specified +% auxiliary functions |aux_i:w| and |aux_ii:w| execute \ics*{item*} +% and \ics*{item*}\myoarg{content}. +% \iffalse +%% Set \item*[content] for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_starred_item_viii:w + { + \bool_set_true:N \l_@@_item_starred_viii_bool + \bool_set_true:N \l_@@_wrap_label_viii_bool + \peek_meaning:NTF [ + { \@@_starred_item_viii_aux_i:w } + { \@@_starred_item_viii_aux_ii:w } + } +% \end{macrocode} +% The function \cs{@@_starred_item_viii_aux_i:w} will save the +% \emph{optional argument} to |\item*| in \cs{l_@@_store_current_opt_arg_tl} +% and will save this argument along with the spacing set by the key \mykey{save-sep} in +% variable \cs{l_@@_store_current_label_tl} if present, then call the +% function \cs{@@_starred_item_viii_aux_ii:w}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_starred_item_viii_aux_i:w [#1] + { + \tl_clear:N \l_@@_store_current_label_tl + \tl_if_novalue:nF { #1 } + { + \tl_if_empty:NF \l_@@_store_keyans_item_opt_sep_tl + { + \tl_put_right:Ne \l_@@_store_current_label_tl + { + \l_@@_store_keyans_item_opt_sep_tl + } + \tl_put_right:Ne \l_@@_store_current_label_tl { #1 } + } + \tl_set:Ne \l_@@_store_current_opt_arg_tl { #1 } + } + \@@_starred_item_viii_aux_ii:w + } +\cs_new_protected:Npn \@@_starred_item_viii_aux_ii:w + { + \legacy_if_set_true:n { @noitemarg } + \@@_start_item_viii:w [ \l_@@_label_viii_tl ] \ignorespaces + } +% \end{macrocode} +% The function \cs{@@_starred_item_exec:} will be in charge of storing +% the current \mymeta{label} for \ics*{item*} followed by the +% \myoarg{content} for \ics*{item*}\myoarg{content} if +% present in the \emph{sequence} and \emph{prop list} set by the +% \mykey{save-ans} key. In this same function the keys \mykey{show-ans}, +% \mykey{show-pos} and \mykey{save-ref} are implemented. +% \iffalse +%% Set \item*[content] for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_starred_item_exec: + { + \tl_put_left:Ne \l_@@_store_current_label_tl { \l_@@_label_viii_tl } + \@@_store_addto_prop:V \l_@@_store_current_label_tl + \@@_keyans_store_ref: + \tl_put_left:Ne \l_@@_store_current_label_tl { \item } + \@@_keyans_addto_seq_link: + \int_gincr:N \g_@@_check_starred_cmd_int + \bool_if:NT \l_@@_show_answer_bool + { + \@@_print_keyans_box:NN \l_@@_labelwidth_i_dim \l_@@_labelsep_i_dim + } + \bool_if:NT \l_@@_show_position_bool + { + \tl_set:Ne \l_@@_mark_answer_sym_tl + { + \group_begin: + \exp_not:N \normalfont + \exp_not:N \footnotesize [ \int_eval:n + { + \prop_count:c { g_@@_ \l_@@_store_name_tl _prop } + } + ] + \group_end: + } + \@@_print_keyans_box:NN \l_@@_labelwidth_i_dim \l_@@_labelsep_i_dim + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_fake_make_label_viii:n} +% The implementation at this is very similar to that of the +% \myenv*{enumext*} environment. +% \iffalse +%% Define a fake |\makelabel| for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_fake_make_label_viii:n #1 + { + \legacy_if:nT { @noitemarg } + { + \legacy_if_set_false:n { @noitemarg } + \legacy_if:nT { @nmbrlist } + { + \refstepcounter{enumXviii} + } + } + \bool_if:NT \l_@@_item_starred_viii_bool + { + \@@_starred_item_exec: + } + \makebox[ \l_@@_labelwidth_viii_dim ][ \l_@@_align_label_viii_str ] + { + \tl_use:N \l_@@_label_font_style_viii_tl + \bool_if:NTF \l_@@_wrap_label_viii_bool + { + \@@_wrapper_label_viii:n {#1} + } + { #1 } + } + \skip_horizontal:N \l_@@_labelsep_viii_dim \ignorespaces + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Real definition of \cs{item} in \env{keyans*}} +% +% \begin{macro}{\@@_start_item_viii:w, \@@_stop_item_viii:} +% The implementation at this is very similar to that of the +% \myenv*{enumext*} environment. +% \iffalse +%% Real |\item| definition for |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_start_item_viii:w [#1] + { + \cs_set_eq:NN \@@_stop_item_tmp_viii: \@@_stop_item_viii: + \hbox_set_to_wd:Nnw \l_@@_item_text_viii_box + { + \l_@@_joined_width_viii_dim + + \l_@@_labelwidth_viii_dim + + \l_@@_labelsep_viii_dim + } + \@@_renew_footnote_starred: + \@@_start_list_tag:n {keyans*} + \@@_fake_make_label_viii:n {#1} + \@@_stop_start_list_tag: + \@@_minipage:w [ t ]{ \l_@@_joined_width_viii_dim } + \dim_set_eq:NN \parindent \l_@@_listparindent_viii_dim + \skip_set_eq:NN \parskip \l_@@_parsep_viii_skip + \@@_unskip_unkern: + \@@_unskip_unkern: + \skip_horizontal:n { -\l_@@_listparindent_viii_dim } \ignorespaces + \tl_use:N \l_@@_fake_item_indent_viii_tl + \bool_if:NT \l_@@_item_starred_viii_bool + { + \@@_keyans_show_item_opt: + } + \tl_use:N \l_@@_after_list_args_viii_tl + } +\cs_new_protected_nopar:Nn \@@_stop_item_viii: + { + \@@_endminipage: + \@@_stop_list_tag:n {keyans*} + \hbox_set_end: + \int_set:Nn \hbadness { 10000 } + \box_use_drop:N \l_@@_item_text_viii_box + \int_compare:nNnTF + { \l_@@_item_column_pos_viii_int } = { \l_@@_columns_viii_int } + { + \par\noindent + \int_zero:N \l_@@_item_column_pos_viii_int + } + { + \skip_horizontal:N \l_@@_columns_sep_viii_dim + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_remove_extra_parsep_viii:} +% The implementation at this is very similar to that of the +% \myenv*{enumext*} environment. +% \iffalse +%% Remove extra \parsep in |keyans*| environment. +% \fi +% \begin{macrocode} +\cs_new_protected:Nn \@@_remove_extra_parsep_viii: + { + \int_compare:nNnT + { + \int_mod:nn + { \g_@@_item_count_all_viii_int } + { \l_@@_columns_viii_int } + } + = + { 0 } + { + \para_end: + \skip_vertical:n { -\l_@@_itemsep_viii_skip } + \skip_vertical:N \c_zero_skip + \int_gzero:N \g_@@_item_count_all_viii_int + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The command \cs{getkeyans}}\label{cmd:getkeyans} +% +% \begin{macro}{\getkeyans, \@@_getkeyans_aux:n, \@@_getkeyans:nn} +% The \ics*{getkeyans} command takes a \emph{mandatory argument} of the +% form \mymarg{store name \textcolor{red}{:} position}. +% Retrieve a \emph{\enquote{single content}} stored by \ics*{anskey}, \ics*{anspic*} +% and \ics*{item*} and \myenv*{anskey*} from \emph{prop list} defined by \mykey{save-ans} key. +% \iffalse +%% Define |\getkeyans|. +% \fi +% \begin{macrocode} +\NewDocumentCommand \getkeyans { m } + { + \exp_args:Ne \@@_getkeyans_aux:n + { \tl_to_str:e { \text_expand:n {#1} } } + } +% \end{macrocode} +% The internal function \cs{@@_getkeyans_aux:n} is in charge of +% \emph{splitting} the \emph{mandatory argument} using \enquote{\textcolor{red}{:}}. +% If \enquote{\textcolor{red}{:}} is omitted it will return an error. +% \iffalse +%% Internal functions for |\getkeyans|. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_getkeyans_aux:n #1 + { + \str_if_in:nnTF {#1} { : } + { + \use:e + { + \cs_set:Npn \exp_not:N \@@_tmp:w ##1 \c_colon_str ##2 \scan_stop: + { {##1} {##2} } + } + \exp_after:wN \@@_getkeyans:nn \@@_tmp:w #1 \scan_stop: + } + { \msg_error:nnn { enumext } { missing-colon } {#1} } + } +% \end{macrocode} +% The internal function \cs{@@_getkeyans:nn} will check for the existence +% of the \emph{prop list}, if it does not exist it will return an error +% message, then it will fetch the content specified by the \emph{second argument} +% from \emph{prop list}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_getkeyans:nn #1 #2 + { + \prop_if_exist:cTF { g_@@_#1_prop } + { + \prop_item:cn { g_@@_#1_prop }{#2} + } + { + \msg_error:nnn { enumext } { undefined-storage-anskey } {#1} + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The command \cs{printkeyans}}\label{cmd:printkeyans} +% +% The \ics*{printkeyans} command prints \emph{\enquote{all stored +% content}} in the \emph{sequence} defined by the \mykey{save-ans} key. +% +% The first thing we will do is define a set of \mymeta{filtered keys} with +% which we will control the options of the different nesting levels for +% the environment \myenv*{enumext} and \myenv*{enumext*} by storing their +% values in the list of tokens \myvarenv{l__@@_print_keyans_X_tl}. +% +% \smallskip +% +% The variable \cs{l_@@_print_keyans_starred_tl} will have the default \mymeta{keys} +% for \ics*{printkeyans*} and will be set by |\setenumext|\myoarg{print\textnormal{\textcolor{MediumOrchid}{\texttt{*}}}} +% and the variable \cs{l__@@_print_keyans_vii_tl} will have the default +% keys for the environment \myenv*{enumext*} nested within the \emph{sequence} +% and will be set by |\setenumext|\myoarg{print \textnormal{\textcolor{gray}{,}}\textnormal{\textcolor{MediumOrchid}{\texttt{*}}}}, +% the rest of the variables will be for the environment \myenv*{enumext} and will be set +% by |\setenumext|\myoarg{print \textnormal{\textcolor{gray}{,}} level}. +% +% \iffalse +%% Add keys for |\printkeyans|. +% \fi +% \begin{macrocode} +\keys_define:nn { enumext / print } + { + print* .code:n = \keys_precompile:neN { enumext / enumext* } + { \@@_filter_save_key:n {#1} } + \l_@@_print_keyans_starred_tl, % starred cmd + print* .initial:n = { nosep, label=\arabic*., columns=2, first=\small, font=\small }, + print-1 .code:n = \keys_precompile:neN { enumext / level-1 } + { \@@_filter_save_key:n {#1} } + \l_@@_print_keyans_i_tl, + print-1 .initial:n = { nosep, label=\arabic*., columns=2, first=\small, font=\small }, + print-2 .code:n = \keys_precompile:neN { enumext / level-2 } + { \@@_filter_save_key:n {#1} } + \l_@@_print_keyans_ii_tl, + print-2 .initial:n = { nosep, label=(\alph*), first=\small, font=\small }, + print-3 .code:n = \keys_precompile:neN { enumext / level-3 } + { \@@_filter_save_key:n {#1} } + \l_@@_print_keyans_iii_tl, + print-3 .initial:n = { nosep, label=\roman*., first=\small, font=\small }, + print-4 .code:n = \keys_precompile:neN { enumext / level-4 } + { \@@_filter_save_key:n {#1} } + \l_@@_print_keyans_iv_tl, + print-4 .initial:n = { nosep, label=\Alph*., first=\small, font=\small }, + print-* .code:n = \keys_precompile:neN { enumext / enumext* } + { \@@_filter_save_key:n {#1} } + \l_@@_print_keyans_vii_tl, % starred nested + print-* .initial:n = { nosep, label=\arabic*., first=\small, font=\small }, + } +% \end{macrocode} +% +% \begin{important}* +% The reason for storing \mymeta{keys} in token lists using +% \cs{keys_precompile:neN} is because the keys are set via +% \ics*{setenumext} but are later executed by running the command +% \ics*{printkeyans} and they are not handled directly by its +% \emph{optional argument}, except those related to the \emph{first} +% opening level. +% \end{important} +% +% \begin{macro}{\printkeyans, \@@_printkeyans:nnn} +% Create a user command to print \emph{\enquote{all stored content}} +% in \emph{sequence} for \ics*{anskey}, \myenv*{anskey*}, \ics*{item*} and \ics*{anspic*}. +% Within a group we will run our \emph{\enquote{precompiled keys}} and +% then call the internal function \cs{@@_printkeyans:nnn}. +% \iffalse +%% Define |\printkeyans|. +% \fi +% \begin{macrocode} +\NewDocumentCommand \printkeyans { s O{} m } + { + \group_begin: + \tl_use:N \l_@@_print_keyans_i_tl + \tl_use:N \l_@@_print_keyans_ii_tl + \tl_use:N \l_@@_print_keyans_iii_tl + \tl_use:N \l_@@_print_keyans_iv_tl + \tl_use:N \l_@@_print_keyans_vii_tl + \@@_printkeyans:nnn { #1 } { #2 } { #3 } + \group_end: + } +% \end{macrocode} +% The internal function \cs{@@_printkeyans:nnn} will check +% for the existence of the \emph{sequence}, if it does not exist +% it will return an error message, then it will check if not empty. +% \iffalse +%% Internal function for |\printkeyans|. +% \fi +% \begin{macrocode} +\cs_new_protected:Npn \@@_printkeyans:nnn #1 #2 #3 + { + \seq_if_exist:cTF { g_@@_#3_seq } + { + \seq_if_empty:cF { g_@@_#3_seq } + { +% \end{macrocode} +% If the \emph{starred argument} ‘|*|’ is present we will check that +% the environment \myenv*{enumext*} is not saved in the \emph{sequence}, +% then execute the variable \cs{l_@@_print_keyans_starred_tl} that +% contains the default \mymeta{keys} for the environment \myenv*{enumext*}, +% we set \cs{l_@@_base_line_fix_bool} and \cs{l_@@_print_keyans_star_bool} +% to true for \emph{baseline correction}, open the \myenv*{enumext*} +% environment passing the \emph{optional argument} and map the \emph{sequence}, +% then set \cs{l_@@_base_line_fix_bool} and \cs{l_@@_print_keyans_star_bool} +% to false. +% \begin{macrocode} + \bool_if:nTF {#1} + { + \seq_if_in:cnTF { g_@@_#3_seq } { \end{enumext*} } + { + \msg_error:nnnn { enumext } { print-starred } {#3} { enumext* } + } + { + \tl_use:N \l_@@_print_keyans_starred_tl + \bool_set_true:N \l_@@_base_line_fix_bool + \bool_set_true:N \l_@@_print_keyans_star_bool + \begin{enumext*}[#2] + \seq_map_inline:cn { g_@@_#3_seq } { ##1 } + \end{enumext*} + \bool_set_false:N \l_@@_base_line_fix_bool + \bool_set_false:N \l_@@_print_keyans_star_bool + } + } +% \end{macrocode} +% Otherwise it will open the environment \myenv*{enumext} passing +% the \emph{optional argument} to the \emph{\enquote{first level}} +% then map the \emph{sequence}. +% \begin{macrocode} + { + \begin{enumext}[#2] + \seq_map_inline:cn { g_@@_#3_seq } { ##1 } + \end{enumext} + } + } + } + { + \msg_error:nnn { enumext } { undefined-storage-anskey } {#3} + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{The command \cs{setenumext}}\label{cmd:setenumext} +% +% The command |\setenumext| will be in charge of managing the +% \mymeta{keys} passed to all environments and to the |\printkeyans| +% command. We must take precautions with the \myenv*{enumext*} +% environment and \emph{\enquote{first level}} of the \myenv*{enumext} +% environment so as not to capture \mymeta{keys} that complicate us. +% +% \begin{macro}{\@@_filter_first_level:n, \@@_filter_first_level_key:n, +% \@@_filter_first_level_pair:nn,} +% The function \cs{@@_filter_first_level:n} will be in charge of +% filtering the \mymeta{keys} passed to the environment \myenv*{enumext*} +% and \emph{\enquote{first level}} of the environment \myenv*{enumext}. +% \iffalse +%% Internal function for filter keys in |\setenumext| for first level. +% \fi +% \begin{macrocode} +\cs_new:Npn \@@_filter_first_level:n #1 + { + \use:e + { + \keyval_parse:NNn + \@@_filter_first_level_key:n + \@@_filter_first_level_pair:nn {#1} + } + } +% \end{macrocode} +% The function \cs{@@_filter_first_level_key:n} will be responsible for +% filtering the \mymeta{keys} that are passed \emph{\enquote{without value}} by +% excluding the keys \mykey{resume} and \mykey{resume*}. +% \begin{macrocode} +\cs_new:Npn \@@_filter_first_level_key:n #1 + { + \str_case:nnF {#1} + { + { resume } {} + { resume* } {} + } + { , { \exp_not:n {#1} } } + } +% \end{macrocode} +% The function \cs{@@_filter_first_level_pair:nn} will be responsible for +% filtering the \mymeta{keys} that are passed \emph{\enquote{with value}} by +% excluding the \mykey{series}, \mykey{resume} and \mykey{save-ans} keys. +% \begin{macrocode} +\cs_new:Npn \@@_filter_first_level_pair:nn #1#2 + { + \str_case:nnF {#1} + { + { series } {} + { resume } {} + { save-ans } {} + } + { , { \exp_not:n {#1} } = { \exp_not:n {#2} } } + } +% \end{macrocode} +% \end{macro} +% +% Now define a \emph{\enquote{meta families}} of \mymeta{keys} +% to access from \ics*{setenumext}. +% +% \iffalse +%% Add keys for |\setenumext|. +% \fi +% \begin{macrocode} +\keys_define:nn { enumext / meta-families } + { + enumext-1 .code:n = + { + \keys_set:ne { enumext / level-1 } + { + \@@_filter_first_level:n {#1} + } + } , + enumext-2 .code:n = { \keys_set:nn { enumext / level-2 } {#1} } , + enumext-3 .code:n = { \keys_set:nn { enumext / level-3 } {#1} } , + enumext-4 .code:n = { \keys_set:nn { enumext / level-4 } {#1} } , + keyans .code:n = { \keys_set:nn { enumext / keyans } {#1} } , + enumext* .code:n = + { + \keys_set:ne { enumext / enumext* } + { + \@@_filter_first_level:n {#1} + } + } , + keyans* .code:n = { \keys_set:nn { enumext / keyans* } {#1} } , + print* .code:n = { \keys_set:nn { enumext / print } { print* = {#1} } } , + print-1 .code:n = { \keys_set:nn { enumext / print } { print-1 = {#1} } } , + print-2 .code:n = { \keys_set:nn { enumext / print } { print-2 = {#1} } } , + print-3 .code:n = { \keys_set:nn { enumext / print } { print-3 = {#1} } } , + print-4 .code:n = { \keys_set:nn { enumext / print } { print-4 = {#1} } } , + print-* .code:n = { \keys_set:nn { enumext / print } { print-* = {#1} } } , + unknown .code:n = { \msg_error:nn { enumext } { unknown-key-family } } , + } +% \end{macrocode} +% We store them in the constant sequence \cs{c_@@_all_families_seq} +% separated by commas. +% \begin{macrocode} +\seq_const_from_clist:Nn \c_@@_all_families_seq + { + enumext-1, enumext-2, enumext-3, enumext-4, keyans, enumext*, + keyans*, print-1, print-2, print-3, print-4, print-*, print*, + } +% \end{macrocode} +% +% \begin{macro}{\setenumext, \@@_set_parse:n, \@@_set_error:nn,} +% Now we define the user command \ics*{setenumext}. +% \iffalse +%% Define |\setenumext|. +% \fi +% \begin{macrocode} +\NewDocumentCommand \setenumext { O{enumext,1} +m } + { + \seq_clear:N \l_@@_setkey_tmpa_seq + \seq_set_from_clist:Nn \l_@@_setkey_tmpb_seq {#1} + \int_set:Nn \l_@@_setkey_tmpa_int + { + \seq_count:N \l_@@_setkey_tmpb_seq + } + \int_compare:nNnTF { \l_@@_setkey_tmpa_int } > { 1 } + { + \seq_pop_left:NN \l_@@_setkey_tmpb_seq \l_@@_setkey_tmpa_tl + \seq_map_function:NN \l_@@_setkey_tmpb_seq \@@_set_parse:n + \seq_set_map_e:NNn \l_@@_setkey_tmpa_seq \l_@@_setkey_tmpa_seq + { + \tl_use:N \l_@@_setkey_tmpa_tl - ##1 + } + } + { + \seq_put_right:Ne \l_@@_setkey_tmpa_seq { \tl_trim_spaces:n {#1} } + } + \seq_if_empty:NTF \l_@@_setkey_tmpa_seq + { \seq_map_inline:Nn \c_@@_all_families_seq } + { \seq_map_inline:Nn \l_@@_setkey_tmpa_seq } + { + \keys_set:nn { enumext / meta-families } { ##1 = {#2} } + } + } +% \end{macrocode} +% Internal functions used by the \ics*{setenumext} command. +% \begin{macrocode} +\cs_new_protected:Npn \@@_set_parse:n #1 + { + \tl_set:Ne \l_@@_setkey_tmpb_tl { \tl_trim_spaces:n {#1} } + \clist_map_inline:nn { 0, 1, 2, 3, 4, * } % <- max level + { \tl_remove_all:Nn \l_@@_setkey_tmpb_tl {##1} } + \tl_if_empty:NTF \l_@@_setkey_tmpb_tl + { + \seq_put_right:Ne \l_@@_setkey_tmpa_seq + { \tl_trim_spaces:n {#1} } + } + { \@@_set_error:nn {#1} { } } + } +\cs_new_protected:Npn \@@_set_error:nn #1 #2 + { \msg_error:nnn { enumext } { invalid-key } {#1} {#2} } +% \end{macrocode} +% \end{macro} +% +% \subsection{The command \cs{setenumextmeta}}\label{cmd:setenumextmeta} +% +% The command \ics*{setenumextmeta} will be responsible for adding new +% \emph{\enquote{meta-keys}} for the \myenv*{enumext} and \myenv*{enumext*} environments. +% The implementation code was given by Jonathan P. Spratte \texttt{(@Skillmon)} +% answer in \href{https://tex.stackexchange.com/a/721079}{Add \texttt{.meta} key to existing keys (l3keys)}. +% +% \begin{macro}{\setenumextmeta, \c_@@_meta_paths_prop, +% \@@_add_meta_key:nnn, \@@_def_meta_key:nnn, +% \@@_def_meta_key:Vnn } +% First we will create a prop list \cs{c_@@_meta_paths_prop} to +% handle the \emph{optional argument}. +% \iffalse +%% Define |\setenumextmeta|. +% \fi +% \begin{macrocode} +\prop_const_from_keyval:Nn \c_@@_meta_paths_prop + { + {enumext,1} = level-1, + {enumext,2} = level-2, + {enumext,3} = level-3, + {enumext,4} = level-4, + {enumext*} = enumext* + } +% \end{macrocode} +% Now we create the user command taking care that \texttt{unknown} +% cannot be passed as an argument. +% \begin{macrocode} +\NewDocumentCommand \setenumextmeta { s O{enumext,1} m +m } + { + \str_if_eq:eeTF { \tl_trim_spaces:n {#3} } { unknown } + { \msg_error:nn { enumext } { prohibited-unknown } } + { + \bool_if:nTF {#1} + { + \int_step_inline:nn { 4 } + { \@@_add_meta_key:nnn { enumext, ##1 } {#3} {#4} } + \@@_add_meta_key:nnn { enumext* } {#3} {#4} + } + { \@@_add_meta_key:nnn {#2} {#3} {#4} } + } + } +% \end{macrocode} +% The internal functions \cs{@@_add_meta_key:nnn} and \cs{@@_def_meta_key:nnn} +% will check the \emph{optional argument} and create the \emph{\enquote{meta-key}}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_add_meta_key:nnn #1 + { + \tl_set:Nn \l_@@_meta_path_tl {#1} + \tl_replace_all:Nnn \l_@@_meta_path_tl { ~ } {} + \prop_get:NVNTF + \c_@@_meta_paths_prop \l_@@_meta_path_tl \l_@@_meta_path_tl + { \@@_def_meta_key:Vnn \l_@@_meta_path_tl } + { + \msg_error:nnn { enumext } { unknown-set } {#1} + \use_none:nn + } + } +\cs_new_protected:Npn \@@_def_meta_key:nnn #1#2#3 + { + \bool_lazy_or:nnTF + { \keys_if_exist_p:nn { enumext / #1 } {#2} } + { \keys_if_exist_p:nn { enumext / enumext* } {#2} } + { \msg_error:nnn { enumext } { already-defined } {#2} } + { + \keys_define:nn { enumext / #1 } + { + #2 .meta:n = {#3}, + #2 .value_forbidden:n = true + } + } + } +\cs_generate_variant:Nn \@@_def_meta_key:nnn { V } +% \end{macrocode} +% \end{macro} +% +% \subsection{The command \cs{foreachkeyans}}\label{cmd:foreachkeyans} +% +% The command \ics*{foreachkeyans} will execute a \emph{loop} over the \emph{prop list} and return its contents. +% The implementation code is adapted from the answer provided by Enrico Gregorio \texttt{(@egreg)} in +% \href{https://tex.stackexchange.com/a/721130}{Expand a \texttt{.cs} defined by key inside the function}. +% +% \begin{macro}{\foreachkeyans, \@@_parse_foreach_keys:nn, +% \@@_parse_foreach_keys:n, \@@_foreach_keyans:nn, +% \@@_foreach_add_body:n} +% We define a set of \mymeta{keys} for command and we will save the +% default values of these in \cs{g_@@_foreach_default_keys_tl} to avoid +% the use of group. +% \iffalse +%% Define |\foreachkeyans|. +% \fi +% \begin{macrocode} +\keys_define:nn { enumext / foreach } + { + before .tl_set:N = \l_@@_foreach_before_tl, + before .value_required:n = true, + after .tl_set:N = \l_@@_foreach_after_tl, + after .value_required:n = true, + start .int_set:N = \l_@@_foreach_start_int, + start .value_required:n = true, + stop .int_set:N = \l_@@_foreach_stop_int, + stop .value_required:n = true, + step .int_set:N = \l_@@_foreach_step_int, + step .value_required:n = true, + wrapper .cs_set_protected:Np = \@@_foreach_wrapper:n #1, + wrapper .value_required:n = true, + sep .tl_set:N = \l_@@_foreach_sep_tl, + sep .value_required:n = true, + unknown .code:n = { \@@_parse_foreach_keys:n {#1} } + } +\keys_precompile:nnN { enumext / foreach } + { + before={},after={},start=1,step=1,stop=0,wrapper=#1,sep={; } + } + \g_@@_foreach_default_keys_tl +% \end{macrocode} +% Functions for handling unknown \mymeta{keys}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_foreach_keys:nn #1#2 + { + \tl_if_blank:nTF {#2} + { + \msg_error:nnn { enumext } { for-key-unknown } {#1} + } + { + \msg_error:nnnn { enumext } { for-key-value-unknown } {#1} {#2} + } + } +\cs_new_protected:Npn \@@_parse_foreach_keys:n #1 + { + \exp_args:NV \@@_parse_foreach_keys:nn \l_keys_key_str {#1} + } +% \end{macrocode} +% We create the command. +% \begin{macrocode} +\NewDocumentCommand \foreachkeyans { +O{} m } + { + \@@_foreach_keyans:nn {#1} {#2} + } +% \end{macrocode} +% Finally the internal functions \cs{@@_foreach_keyans:nn} and +% \cs{@@_foreach_add_body:n} will loop through the prop list and print +% the contents. +% \begin{macrocode} +\cs_new_protected:Npn \@@_foreach_keyans:nn #1 #2 + { + \tl_use:N \g_@@_foreach_default_keys_tl + \keys_set:nn { enumext / foreach } {#1} + \tl_set:Nn \l_@@_foreach_name_prop_tl {#2} + \prop_if_exist:cF { g_@@_#2_prop } + { + \msg_error:nnn { enumext } { undefined-storage-anskey } {#2} + } + \int_compare:nNnT { \l_@@_foreach_stop_int } = { 0 } + { + \int_set:Nn \l_@@_foreach_stop_int + { \prop_count:c { g_@@_#2_prop } } + } + \seq_clear:N \l_@@_foreach_print_seq + \int_step_function:nnnN + { \l_@@_foreach_start_int } + { \l_@@_foreach_step_int } + { \l_@@_foreach_stop_int } + \@@_foreach_add_body:n + \seq_use:NV \l_@@_foreach_print_seq \l_@@_foreach_sep_tl + } +\cs_new_protected:Npn \@@_foreach_add_body:n #1 + { + \seq_put_right:Ne \l_@@_foreach_print_seq + { + \exp_not:V \l_@@_foreach_before_tl + \@@_foreach_wrapper:n + { + \prop_item:cn { g_@@_ \l_@@_foreach_name_prop_tl _prop }{#1} + } + \exp_not:V \l_@@_foreach_after_tl + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Messages} +% +% \iffalse +%% Messages. +% \fi +% Message used by package-load for \mypkg{multicol} and \mypkg{hyperref} +% packages. +% \begin{macrocode} +\msg_new:nnn { enumext } { package-load } + { + The ~ '#1' ~ package ~ is ~ already ~ loaded. + } +\msg_new:nnn { enumext } { package-not-load } + { + The ~ '#1' ~ package ~ will ~ be ~ loaded ~ as ~ a ~ dependency. + } +\msg_new:nnn { enumext } { package-load-foot } + { + The ~ '#1' ~ package ~ is ~ loaded ~ with ~ the ~ option ~ '#2'. + } +% \end{macrocode} +% +% Message used in the creation of counters by \mypkg*{enumext} package. +% \begin{macrocode} +\msg_new:nnn { enumext } { counters } + { + The ~ counter ~ '#1' ~ is ~ already ~ defined ~ by ~ some ~ \\ + package ~ or ~ macro, ~ it ~ cannot ~ be ~ continued. + } +% \end{macrocode} +% +% Message used by \mykey{align} and \mykey{mark-pos} keys. +% \begin{macrocode} +\msg_new:nnn { enumext } { unknown-choice } + { + The ~ value ~ '#3' ~ for ~ '#1' ~ key ~ is ~ invalid ~ use ~ ('#2'). + } +% \end{macrocode} +% +% Message used by reserved \myenv*{anskey*} environment by \mypkg*{enumext} +% package. +% \begin{macrocode} +\msg_new:nnnn { enumext } { anskey-env-error } + { + The ~ '#1' ~ environment ~is ~ reserved ~ by ~\\ + 'enumext' ~ package, ~ It~ is~ already~ defined. + } + { + The ~ anskey* ~ environment ~ is ~ defined ~ internally ~ + for ~ the ~ 'save-ans' ~ key.\\ + } +% \end{macrocode} +% +% Message used in the creation of \emph{prop list} by \mypkg*{enumext} +% package. +% \begin{macrocode} +\msg_new:nnn { enumext } { store-prop } + { + * ~ Package ~ enumext: ~ Creating ~ + \c_backslash_str g_@@_#1_prop ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { store-seq } + { + * ~ Package ~ enumext: ~ Creating ~ + \c_backslash_str g_@@_#1_seq ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { store-int } + { + * ~ Package ~ enumext: ~ Creating ~ + \c_backslash_str g_@@_resume_#1_int ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { prop-seq-int-hook } + { + * ~ Package ~ enumext: ~ Elements ~ in ~ + \c_backslash_str g_@@_#1_prop ~ = ~ #2.\\ + * ~ Package ~ enumext: ~ Elements ~ in ~ + \c_backslash_str g_@@_#1_seq ~ = ~ #3.\\ + * ~ Package ~ enumext: ~ Value ~ off ~ + \c_backslash_str g_@@_resume_#1_int ~ = ~ #4. + } +\msg_new:nnn { enumext } { item-answer-hook } + { + * ~ Package ~ enumext: ~ Value ~ off ~ + \c_backslash_str g_@@_item_number_int ~ = ~ #1.\\ + * ~ Package ~ enumext: ~ Value ~ off ~ + \c_backslash_str g_@@_item_anskey_int ~ = ~ #2.\\ + * ~ Package ~ enumext: ~ Difference ~ item_number_int ~ - ~ item_anskey_int ~ = ~ #3. + } +% \end{macrocode} +% +% Message used by \myoarg{key \textnormal{\textcolor{gray}{=}} val} +% system and \ics*{setenumext} command. +% \begin{macrocode} +\msg_new:nnn { enumext } { invalid-key } + { + The ~ key ~ '#1' ~ is ~ not ~ know ~ the ~ level ~ #2. + } +\msg_new:nnn { enumext } { unknown-key-family } + { + Unknown~key~family~`\l_keys_key_str'~for~enumext. + } +% \end{macrocode} +% Messages used in length calculation. +% \begin{macrocode} +\msg_new:nnn { enumext } { width-negative } + { + Ignoring ~ negative ~ value ~ '#1=#2' ~ \msg_line_context:.\\ + The ~ key ~ '#1'~ accepts ~ values ~ >= ~ 0pt. + } +\msg_new:nnn { enumext } { width-zero } + { + Invalid ~ '#1=#2' ~ \msg_line_context:.\\ + The ~ key ~ '#1'~ accepts ~ values ~ > ~ 0pt. + } +% \end{macrocode} +% Messages used by \mykey{show-length} key in \myenv*{enumext}. +% \begin{macrocode} +\msg_new:nnn { enumext } { list-lengths } + { + **** ~ Lengths ~ used ~ by ~ 'enumext' ~ level ~ '#2' ~ \msg_line_context:~\c_space_tl ****\\ + \@@_show_length:nnn { dim } { labelsep } {#1} + \@@_show_length:nnn { dim } { labelwidth } {#1} + \@@_show_length:nnn { dim } { itemindent } {#1} + \@@_show_length:nnn { dim } { leftmargin } {#1} + \@@_show_length:nnn { dim } { rightmargin } {#1} + \@@_show_length:nnn { dim } { listparindent } {#1} + \@@_show_length:nnn { skip } { topsep } {#1} + \@@_show_length:nnn { skip } { parsep } {#1} + \@@_show_length:nnn { skip } { partopsep } {#1} + \@@_show_length:nnn { skip } { itemsep } {#1} + **************************************************** + } +% \end{macrocode} +% +% Messages used by \mykey{show-length} key in \myenv*{enumext*}, +% \myenv*{keyans*} and \myenv*{keyans}. +% \begin{macrocode} +\msg_new:nnn { enumext } { list-lengths-not-nested } + { + **** ~ Lengths ~ used ~ by ~ '#2' ~ environment ~ \msg_line_context:~\c_space_tl ****\\ + \@@_show_length:nnn { dim } { labelsep } {#1} + \@@_show_length:nnn { dim } { labelwidth } {#1} + \@@_show_length:nnn { dim } { itemindent } {#1} + \@@_show_length:nnn { dim } { leftmargin } {#1} + \@@_show_length:nnn { dim } { rightmargin } {#1} + \@@_show_length:nnn { dim } { listparindent } {#1} + \@@_show_length:nnn { skip } { topsep } {#1} + \@@_show_length:nnn { skip } { parsep } {#1} + \@@_show_length:nnn { skip } { partopsep } {#1} + \@@_show_length:nnn { skip } { itemsep } {#1} + **************************************************** + } +% \end{macrocode} +% +% Messages used by \mykey{ref} key. +% \begin{macrocode} +\msg_new:nnn { enumext } { key-ref-empty } + { + Key ~ 'ref' ~ need ~ a ~ value ~ in ~ '#1'~ \msg_line_context:. + } +% \end{macrocode} +% +% Messages used by \mykey{save-ans} key. +% \begin{macrocode} +\msg_new:nnn { enumext } { save-ans-empty } + { + Key ~ 'save-ans' ~ need ~ a ~ value ~ in ~ '#1'~ \msg_line_context:. + } +\msg_new:nnn { enumext } { save-ans-log } + { + * ~ Package ~ enumext: ~ Start ~ #1\c_space_tl with ~ save-ans=#2 ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { save-ans-log-hook } + { + * ~ Package ~ enumext: ~ Stop ~ #1\c_space_tl with ~ save-ans=#2 ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { save-ans-hook } + { + Stop ~ storing ~ for ~ 'save-ans=#1' ~ \msg_line_context:. + } +% \end{macrocode} +% +% Messages used by the internal system to check answer used by +% \mykey{check-ans} key. +% \begin{macrocode} +\msg_new:nnn { enumext } { need-save-ans } + { + Key ~ '#1'~ works ~ only ~ with ~ the ~ 'save-ans' ~ key ~ in ~ '#2'~ \msg_line_context:. + } +\msg_new:nnn { enumext } { items-same-answer } + { + ****************************************\\ + * ~ Package ~ enumext: ~ Checking ~ answers ~ in ~ '#1' ~ + for ~ \c_left_brace_str #2 \c_right_brace_str\\ + * ~ started ~ #3 ~ and ~ close ~ \msg_line_context: : ~ + 'OK', ~ all ~ items ~ with ~ answer.\\ + **************************************** + } +\msg_new:nnn { enumext } { item-greater-answer } + { + Checking ~ answers ~ in ~ '#1' ~ for ~ \c_left_brace_str #2 \c_right_brace_str\\ + started ~ #3 ~ and ~ close ~ \msg_line_context: : ~'NOT ~ OK'\\ + Items ~ > ~ Answers. + } +\msg_new:nnn { enumext } { item-less-answer } + { + Checking ~ answers ~ in ~ '#1' ~ for ~ \c_left_brace_str #2 \c_right_brace_str\\ + started ~ #3 ~ and ~ close ~ \msg_line_context: : ~'NOT ~ OK'\\ + Items ~ < ~ Answers. + } +% \end{macrocode} +% Messages used by the internal system to check for +% \emph{\enquote{starred}} |\item*| and |\anspic*| commands. +% \begin{macrocode} +\msg_new:nnn { enumext } { missing-starred } + { + Missing ~ '\c_backslash_str #1*' ~ #2. + } +\msg_new:nnn { enumext } { many-starred } + { + Many ~ '\c_backslash_str #1*' ~ #2. + } +% \end{macrocode} +% Messages used by |\printkeyans*| command. +% \begin{macrocode} +\msg_new:nnn { enumext } { print-starred } + { + \c_backslash_str printkeyans*:~ The ~ sequence ~ '#1' ~ already ~ contains ~ + #2 ~ environment ~ \msg_line_context:. + } +% \end{macrocode} +% Message for the nesting depth of the environment \myenv*{enumext}. +% \begin{macrocode} +\msg_new:nnn { enumext } { list-too-deep } + { + Too ~ deep ~ nesting ~ for ~ 'enumext' ~ \msg_line_context:.~ \\ + The ~ maximum ~ level ~ of ~ nesting ~ is ~ 4. + } +% \end{macrocode} +% Messages used by \ics*{anskey}, \myenv*{anskey*} and \ics*{anspic} commands. +% \begin{macrocode} +\msg_new:nnn { enumext } { anskey-unnumber-item } + { + Can't ~ store ~ with ~ a ~ unnumbered ~ \c_backslash_str item ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { anskey-already-stored } + { + Content ~ already ~ stored ~ for ~ this ~ \c_backslash_str item ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { anskey-empty-arg } + { + Can't ~ store ~ empty ~ content ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { anskey-wrong-place } + { + Wrong ~ place ~ for ~ command ~ '\c_backslash_str #1' ~ \msg_line_context:.~ \\ + '\c_backslash_str #1' ~ works ~ in ~ the ~ environment ~ '#2'. + } +\msg_new:nnn { enumext } { anskey-nested } + { + The ~ command ~ \c_backslash_str anskey~ can't ~ be ~ nested ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { anskey-math-mode } + { + #1 ~ can't ~ work ~ in ~ math ~ mode ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { anskey-env-wrong } + { + The ~ environment ~ anskey* ~ cannot ~ use ~ in ~ '#1' ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { anspic-wrong-place } + { + Wrong ~ place ~ for ~ command ~ '\c_backslash_str #1' ~ \msg_line_context:.~ \\ + '\c_backslash_str #1' ~ works ~ in ~ the ~ environment ~ '#2'. + } +\msg_new:nnn { enumext } { command-wrong-place } + { + Wrong ~ place ~ for ~ command ~ '\c_backslash_str #1' ~ \msg_line_context:.~ \\ + '\c_backslash_str #1' ~ works ~ outside ~ the ~ environment ~ '#2'. + } +\msg_new:nnnn { enumext } { anskey-env-key-unknown } + { + The ~ key ~ '#1' ~ is ~ unknown ~ by ~ environment~ + 'anskey*' ~ and ~ is ~ being ~ ignored. + } + { + The ~ environment ~ 'anskey*' ~ does ~ not ~ have ~ a ~ key ~ called ~'#1'.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +\msg_new:nnnn { enumext } { anskey-env-key-value-unknown } + { + The ~ key ~ '#1=#2' ~ is ~ unknown ~ by ~ environment ~ + 'anskey*' ~ and ~ is ~ being ~ ignored. + } + { + The ~ environment ~ 'anskey*' ~ does ~ not ~ have ~ a ~ key ~ called ~'#1'.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +\msg_new:nnnn { enumext } { anskey-cmd-key-unknown } + { The ~ key ~'#1'~ is ~ unknown ~ by ~ '\c_backslash_str anskey' ~ and ~ is ~ being ~ ignored.} + { + The ~ command ~'\c_backslash_str anskey' ~ does ~ not ~ have ~ a ~ key ~ called ~'#1'.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +\msg_new:nnnn { enumext } { anskey-cmd-key-value-unknown } + { The ~ key ~ '#1=#2' ~ is ~ unknown ~ by ~ '\c_backslash_str anskey' ~ and ~ is ~ being ~ ignored. } + { + The ~ command ~ '\c_backslash_str anskey' ~ does ~ not ~ have ~ a ~ key ~ called ~'#1'.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +% \end{macrocode} +% +% Messages used by \myenv*{keyans}, \myenv*{keyans*} and \myenv*{keyanspic} +% environment. +% \begin{macrocode} +\msg_new:nnn { enumext } { keyans-nested } + { + The ~ environment ~ 'keyans' ~ can't ~ be ~ nested ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { keyans-wrong-level } + { + Wrong ~ level ~ position ~ for ~ 'keyans' ~ \msg_line_context:.~ \\ + The ~ environment ~ 'keyans' ~ can ~ only ~ be ~ in ~ the ~ first ~ level. + } +\msg_new:nnn { enumext } { wrong-place } + { + Wrong ~ place ~ for ~ '#1' ~ environment ~\msg_line_context:.~ \\ + '#1' ~ is ~ only ~ found ~ with ~ '#2' ~ in ~ 'enumext. + } +\msg_new:nnn { enumext } { keyanspic-nested } + { + The ~ environment ~ 'keyanspic' ~ can't ~ be ~ nested~ \msg_line_context:.~. + } +\msg_new:nnn { enumext } { keyanspic-wrong-level } + { + Wrong ~ level ~ position ~ for ~ 'keyanspic' ~ \msg_line_context:.~ \\ + The ~ environment ~ 'keyans' ~ can ~ only ~ be ~ in ~ the ~ first ~ level. + } +\msg_new:nnn { enumext } { keyanspic-item-cmd } + { + Can't ~ use ~ \c_backslash_str item ~ in ~ keyanspic ~ \msg_line_context:. + } +\msg_new:nnnn { enumext } { keyans-unknown-key } + { + The ~ key ~ '#1' ~ is ~ unknown ~ by ~ environment~ + '\l_@@_envir_name_tl' ~ and ~ is ~ being ~ ignored. + } + { + The ~ environment ~ '\l_@@_envir_name_tl' ~ does ~ not + ~ have ~ a ~ key ~ called ~'#1'.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +\msg_new:nnnn { enumext } { keyans-unknown-key-value } + { + The ~ key ~ '#1=#2' ~ is ~ unknown ~ by ~ environment ~ + '\l_@@_envir_name_tl' ~ and ~ is ~ being ~ ignored. + } + { + The ~ environment ~ '\l_@@_envir_name_tl' ~ does ~ not + ~ have ~ a ~ key ~ called ~'#1'.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +% \end{macrocode} +% +% Message used by unknown \mymeta{keys} in \myenv*{enumext*}. +% environment. +% \begin{macrocode} +\msg_new:nnnn { enumext } { starred-unknown-key } + { + The ~ key ~ '#1' ~ is ~ unknown ~ by ~ environment~ + '\l_@@_envir_name_tl' ~ and ~ is ~ being ~ ignored. + } + { + The ~ environment ~ '\l_@@_envir_name_tl' ~ does ~ not + ~ have ~ a ~ key ~ called ~'#1'.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +\msg_new:nnnn { enumext } { starred-unknown-key-value } + { + The ~ key ~ '#1=#2' ~ is ~ unknown ~ by ~ environment ~ + '\l_@@_envir_name_tl' ~ and ~ is ~ being ~ ignored. + } + { + The ~ environment ~ '\l_@@_envir_name_tl' ~ does ~ not + ~ have ~ a ~ key ~ called ~'#1'.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +% \end{macrocode} +% Message used by unknown \mymeta{keys} in \myenv*{enumext} +% environment. +% \begin{macrocode} +\msg_new:nnnn { enumext } { standar-unknown-key } + { + The ~ key ~ '#1' ~ is ~ unknown ~ by ~ environment ~ '\l_@@_envir_name_tl' \c_space_tl + ~ on ~ level ~ \int_use:N \l_@@_level_int \c_space_tl and ~ is ~ being ~ ignored. + } + { + The ~ environment ~ '\l_@@_envir_name_tl' ~ does ~ not + ~ have ~ a ~ key ~ called ~'#1' ~ on ~ level ~ \int_use:N \l_@@_level_int.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +\msg_new:nnnn { enumext } { standar-unknown-key-value } + { + The ~ key ~ '#1=#2' ~ is ~ unknown ~ by ~ environment ~ '\l_@@_envir_name_tl' \c_space_tl + ~ on ~ level ~ \int_use:N \l_@@_level_int \c_space_tl and ~ is ~ being ~ ignored. + } + { + The ~ environment ~ '\l_@@_envir_name_tl' ~ does ~ not + ~ have ~ a ~ key ~ called ~'#1' ~ on ~ level ~ \int_use:N \l_@@_level_int.\\ + Check ~ that ~ you ~ have ~ spelled ~ the ~ key ~ name ~ correctly. + } +% \end{macrocode} +% Message used by unknown \mymeta{keys} in \ics*{foreachkeyans}. +% \begin{macrocode} +\msg_new:nnnn { enumext } { for-key-unknown } + { The~key~'#1'~is~unknown~by~'\c_backslash_str foreachkeyans'~and~is~being~ignored.} + { + The~command~'\c_backslash_str foreachkeyans'~does~not~have~a~key~called~'#1'.\\ + Check~that~you~have~spelled~the~key~name~correctly. + } +\msg_new:nnnn { enumext } { for-key-value-unknown } + { The~key~'#1=#2'~is~unknown~by~'\c_backslash_str foreachkeyans'~and~is~being~ignored. } + { + The~command~'\c_backslash_str foreachkeyans'~does~not~have~a~key~called~'#1'.\\ + Check~that~you~have~spelled~the~key~name~correctly. + } +% \end{macrocode} +% +% Messages used by \ics*{getkeyans} command. +% \begin{macrocode} +\msg_new:nnn { enumext } { undefined-storage-anskey } + { + Storage ~ named ~ '#1' ~ is ~ not ~ defined ~ \msg_line_context:. + } +% \end{macrocode} +% +% Messages used by \ics*{miniright} command. +% \begin{macrocode} +\msg_new:nnn { enumext } { missing-miniright } + { + Missing ~ '\c_backslash_str miniright' ~ in ~ \msg_line_context:.\\ + The ~ key ~ 'mini-env' ~ need ~ '\c_backslash_str miniright'. + } +\msg_new:nnn { enumext } { wrong-miniright-place } + { + Wrong ~ place ~ for ~ '\c_backslash_str miniright' ~ \msg_line_context:.~ \\ + Works ~ in ~ 'enumext' ~ and ~ 'keyans' ~ with ~ key ~ 'mini-env'. + } +\msg_new:nnn { enumext } { wrong-miniright-use } + { + Wrong ~ use ~ for ~ '\c_backslash_str miniright' ~ \msg_line_context:.~ \\ + '\c_backslash_str miniright' ~ need ~ a ~ key ~ 'mini-env'. + } +\msg_new:nnn { enumext } { wrong-miniright-starred } + { + Can't ~ use ~ \c_backslash_str miniright ~ in ~ starred ~ environments ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { many-miniright-used } + { + Can't ~ use ~ \c_backslash_str miniright ~ more ~ than ~ once ~ \msg_line_context:. + } +% \end{macrocode} +% Messages used by \ics*{setenumextmeta} command. +% \begin{macrocode} +\msg_new:nnn { enumext } { unknown-set } + { + Argument ~ [#1] ~ is ~ unknown ~ by ~ \c_backslash_str setenumextmeta ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { already-defined } + { + The ~ key ~ '#1' ~ is ~ already ~ defined ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { prohibited-unknown } + { + The ~ name ~ 'unknown' ~ can't ~ be ~ chosen~ for ~ a ~ meta ~ key ~ \msg_line_context:. + } +% \end{macrocode} +% Messages used by \myenv*{enumext*} and \myenv*{keyans*} environments. +% \begin{macrocode} +\msg_new:nnn { enumext } { nested } + { + The ~ environment ~ \l_@@_envir_name_tl \c_space_tl can't ~ be ~ nested ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { nested-horizontal } + { + The ~ environment ~ \l_@@_envir_name_tl \c_space_tl can't ~ be ~ nested ~ in ~ '#1' ~ \msg_line_context:. + } +\msg_new:nnn { enumext } { item-joined } + { + Items ~ joined ~ (#1) ~ > ~ #2 ~ columns ~\msg_line_context:. + } +\msg_new:nnn { enumext } { item-joined-columns } + { + Not ~ space ~ to ~ join ~ items ~ (#1) ~ > ~ #2 ~\msg_line_context:. + } +% \end{macrocode} +% \subsection{Finish package} +% +% Finish package implementation. +% +% \begin{macrocode} +\file_input_stop: +%</package> +% \end{macrocode} +% \Finale diff --git a/macros/latex/contrib/enumext/enumext.ins b/macros/latex/contrib/enumext/enumext.ins new file mode 100644 index 0000000000..f4c4500149 --- /dev/null +++ b/macros/latex/contrib/enumext/enumext.ins @@ -0,0 +1,53 @@ +\input docstrip.tex +\keepsilent +\askforoverwritefalse +\preamble + +Copyright (C) 2024 by Pablo González L <pablgonz@educarchile.cl> + +This work may be distributed and/or modified under the conditions of the +LaTeX Project Public License, either version 1.3c of this license or (at +your option) any later version. The latest version of this license is in + + https://www.latex-project.org/lppl.txt + +and version 1.3c or later is part of all distributions of LaTeX version +2005/12/01 or later. + +This work is "maintained" (as per the LPPL maintenance status) +by Pablo González Luengo. + +This work consists of the files enumext.pdf , enumext.ins, enumext.dtx +and the files generated from them. + +The released version of this package is available from CTAN. + +------------------------------------------------------------------------ + +The development version of the package can be found at + + https://github.com/pablgonz/enumext/ + +for those people who are interested. + +------------------------------------------------------------------------ + +\endpreamble +% Stop docstrip adding \endinput (from l3doc.dtx) +\postamble +\endpostamble +\usedir{tex/latex/enumext}% +\generate{\file{enumext.sty}{\from{enumext.dtx}{package}}}% +\Msg{*****************************************************************}% +\Msg{*} +\Msg{* To finish the installation you have to move the files into a } +\Msg{* TDS directory searched by your TeX distribution.} +\Msg{*} +\Msg{* To produce the documentation with source code run arara }% +\Msg{* on file enumext.dtx }% +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*} +\Msg{*****************************************************************}% + +\endbatchfile diff --git a/macros/latex/contrib/enumext/enumext.pdf b/macros/latex/contrib/enumext/enumext.pdf Binary files differnew file mode 100644 index 0000000000..0a70a539d5 --- /dev/null +++ b/macros/latex/contrib/enumext/enumext.pdf diff --git a/macros/latex/contrib/href-ul/README.md b/macros/latex/contrib/href-ul/README.md index d5a941ed61..9a697503df 100644 --- a/macros/latex/contrib/href-ul/README.md +++ b/macros/latex/contrib/href-ul/README.md @@ -1,13 +1,16 @@ +# LaTeX Hyperlinks Underscored as in Web + [](https://github.com/yegor256/href-ul/actions/workflows/l3build.yml) [](https://ctan.org/pkg/href-ul) [](https://github.com/yegor256/href-ul/blob/master/LICENSE.txt) -This LaTeX package makes hyperlinks underlined. -The package uses [`hyperref`](https://ctan.org/pkg/hyperref) +This LaTeX package makes hyperlinks underlined. +The package uses [`hyperref`](https://ctan.org/pkg/hyperref) and [`ulem`](https://ctan.org/pkg/ulem) packages. -First, [install it](https://en.wikibooks.org/wiki/LaTeX/Installing_Extra_Packages) -from [CTAN](https://ctan.org/pkg/href-ul) +First, +[install it](https://en.wikibooks.org/wiki/LaTeX/Installing_Extra_Packages) +from [CTAN](https://ctan.org/pkg/href-ul) and then use in the preamble: ```tex @@ -18,10 +21,12 @@ Go to \href{https://www.google.com}{Google}! \end{document} ``` -Otherwise, you can download [`href-ul.sty`](https://yegor256.github.io/href-ul/href-ul.sty) and add to your project. +Otherwise, you can download [`href-ul.sty`][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. It should compile everything without errors. If not, submit an issue and wait. Otherwise, make your changes and then run `l3build ctan` again. If the build is still clean, submit a pull request. + +[sty]: https://yegor256.github.io/href-ul/href-ul.sty diff --git a/macros/latex/contrib/href-ul/href-ul.dtx b/macros/latex/contrib/href-ul/href-ul.dtx index e0c410d9cc..8f35447d1a 100644 --- a/macros/latex/contrib/href-ul/href-ul.dtx +++ b/macros/latex/contrib/href-ul/href-ul.dtx @@ -50,7 +50,7 @@ %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{href-ul} %<*package> -[09.01.20240 0.4.0 Underlined Hyperlinks] +[2024/11/01 0.4.1 Underlined Hyperlinks] %</package> %<*driver> \documentclass{ltxdoc} @@ -159,6 +159,7 @@ % Then, we include the |hyperref| package for PDF hyperlinks: % \begin{macrocode} \PassOptionsToPackage{hidelinks}{hyperref} +\PassOptionsToPackage{hyphens}{url} \RequirePackage{hyperref} % \end{macrocode} diff --git a/macros/latex/contrib/href-ul/href-ul.pdf b/macros/latex/contrib/href-ul/href-ul.pdf Binary files differindex 53dc60a20b..66c7e4897d 100644 --- a/macros/latex/contrib/href-ul/href-ul.pdf +++ b/macros/latex/contrib/href-ul/href-ul.pdf diff --git a/macros/latex/contrib/jsonparse/README.md b/macros/latex/contrib/jsonparse/README.md index 193df70511..bd5ce77ebd 100644 --- a/macros/latex/contrib/jsonparse/README.md +++ b/macros/latex/contrib/jsonparse/README.md @@ -1,4 +1,4 @@ - +  diff --git a/macros/latex/contrib/jsonparse/jsonparse-doc.pdf b/macros/latex/contrib/jsonparse/jsonparse-doc.pdf Binary files differindex 02477b4217..59584db16b 100644 --- a/macros/latex/contrib/jsonparse/jsonparse-doc.pdf +++ b/macros/latex/contrib/jsonparse/jsonparse-doc.pdf diff --git a/macros/latex/contrib/jsonparse/jsonparse-doc.tex b/macros/latex/contrib/jsonparse/jsonparse-doc.tex index 279ea209a6..24ebe4ecdf 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.9.5} -\def\jsonparsefiledate{27 October 2024} +\def\jsonparsefileversion{0.9.6} +\def\jsonparsefiledate{31 October 2024} \usepackage[T1]{fontenc} \usepackage{Alegreya} @@ -204,6 +204,7 @@ \changes{v0.9.1}{2024/09/21}{Added functions to test for valid JSON numbers.} \changes{v0.9.3}{2024/10/24}{Fixed a bug that prevented tabs in source from being parsed properly.} \changes{v0.9.5}{2024/10/27}{Streamlining of code, clarification of explanations in documentation.} +\changes{v0.9.6}{2024/10/31}{Allowing for multiple return values when mapping over arrays.} \begin{document} \vspace*{-1cm} @@ -354,21 +355,20 @@ For example, let us assume the following JSON data structure is parsed into the ] } \end{codeexample} +\JSONParse{\myJSONdata}{ { "array" : [ { "key_a" : "one" , "key_b" : "two" } , { "key_a" : "three" , "key_b" : "four" } ] } } -Then, when using \macro{\JSONParseArrayValues{\myJSONdata}{array}[key_a]{, }}, `one, three' is typeset to the document. +Then, when using \macro{\JSONParseArrayValues{\myJSONdata}{array}[key_a]{, }}, `\JSONParseArrayValues{\myJSONdata}{array}[key_a]{, }' is typeset to the document. The first optional argument can be used to pass options to the command, such as \macro{escape} or \macro{rescan}, that are then applied locally. \begin{macrodef} |\JSONParseArrayValuesMap|[<options>]{<token variable>}{<key>}[<subkey>] - {<command name>} + {<command name>}[<before code>][<after code>] \end{macrodef} -The command \macro{\JSONParseArrayValuesMap} takes the same first three arguments as the command \macro{\JSONParseArrayValues} and works in a similar way. However, instead of a string that is added between the array items, it takes a command name as fourth argument. This command can be defined beforehand and will be called for every array item. Inside its definition, the commands \macro{\JSONParseArrayIndex}, \macro{\JSONParseArrayKey} and \macro{\JSONParseArrayValue} can be used which are updated for each item and output the index, the key and the value of the current item respectively. +The command \macro{\JSONParseArrayValuesMap} takes the same first three arguments as the command \macro{\JSONParseArrayValues} and works in a similar way. However, instead of a string that is added between the array items, it takes a command name as fourth argument. This command can be defined beforehand and will be called for every array item. Inside its definition, the commands \macro{\JSONParseArrayIndex}, \macro{\JSONParseArrayKey} and \macro{\JSONParseArrayValue} can be used which are updated for each item and output the index, the key and the value of the current item respectively. Note that these commands are defined globally to make accessing them as easy as possible. For example, let us assume the same JSON data structure as defined above parsed into the token variable \macro{\myJSONdata}. Then, the following can be done: -\JSONParse{\myJSONdata}{ { "array" : [ { "key_a" : "one" , "key_b" : "two" } , { "key_a" : "three" , "key_b" : "four" } ] } } - \begin{codeexamplecolumns} \newcommand{\myJSONitem}{ \item \emph{\JSONParseArrayValue} @@ -380,7 +380,43 @@ For example, let us assume the same JSON data structure as defined above parsed \end{itemize} \end{codeexamplecolumns} -The first optional argument can be used to pass options to the command, such as \macro{escape} or \macro{rescan}, that are then applied locally. +It is possible to make use of multiple subkeys by passing them as a comma separated list as third argument to the command. Inside the command that is called for every array item, the different keys and values can be access via commands numbered with uppercase Roman numerals such as \macro{\JSONParseArrayKeyI}, \macro{\JSONParseArrayKeyII}, \macro{\JSONParseArrayKeyIII} etc.\ and \macro{\JSONParseArrayValueI}, \macro{\JSONParseArrayValueII}, \macro{\JSONParseArrayValueIII} etc. + +We can extend the above example in the following way: + +\begin{codeexamplecolumns} +\newcommand{\myJSONitem}{ + \item \emph{\JSONParseArrayValueI :} + \JSONParseArrayValueII +} + +\begin{itemize} + \JSONParseArrayValuesMap{\myJSONdata} + {array}[key_a,key_b]{myJSONitem} +\end{itemize} +\end{codeexamplecolumns} + +The command additionally takes two optional arguments at sixth and seventh position. These arguments can be used to place code before and after the output that is generated by the command called for every array item, for example for typesetting tabular contents. To this end, the command \macro{\JSONParseArrayNewline} can be used to make sure that tabular newlines are typeset properly. + +Typesetting the above example in a tabular way can be achieved as follows: + +\begin{codeexamplecolumns} +\newcommand{\myJSONitem}{ + \JSONParseArrayValueI & + \JSONParseArrayValueII + \JSONParseArrayNewline +} + +\JSONParseArrayValuesMap{\myJSONdata} + {array}[key_a,key_b]{myJSONitem} + [\begin{tabular}{ c c } + \textbf{key a} & + \textbf{key b} \\ \hline] + [\\ \hline + \end{tabular}] +\end{codeexamplecolumns} + +Finally, the first optional argument of the command can be used to pass options to the command, such as \macro{escape} or \macro{rescan}, that are then applied locally. \begin{macrodef} |\JSONParseArrayCount|{<token variable>}{<key>} @@ -498,6 +534,11 @@ The command \macro{\jsonparse_parse_to_prop:Nn} creates the token variable given The command \macro{\jsonparse_parse_to_prop:Nn} processes the token variable given as the first arguments as property list and filters it according to the key given as second argument. Filtering means that for every entry in the property list, the key of this entry is compared against the key given to the command. If the key in the property list starts with the given key, the matching part is removed from the key in the property list. If the keys do not match, the entry is completely removed from the property list. \begin{macrodef} +|\jsonparse_array_count:NN| <token variable> <integer variable> +\end{macrodef} +The command \macro{\jsonparse_array_count:NN} processes the token variable given as the first arguments as property list and, assuming that it is an array, counts its items and stores the result in the integer variable. If the token variable does not expand to a key that represents an array item, that is if the key does not start with the character defined by \macro{separator/array left}, the command will return an error. The command \macro{\JSONParseArrayCount} serves as a wrapper of this command. + +\begin{macrodef} |\jsonparse_if_num:nTF| {<string>} {<true code>} {<false code>} |\jsonparse_if_num:nT| {<string>} {<true code>} |\jsonparse_if_num:nF| {<string>} {<false code>} diff --git a/macros/latex/contrib/jsonparse/jsonparse.sty b/macros/latex/contrib/jsonparse/jsonparse.sty index 6d545f5486..7205ec1c8b 100644 --- a/macros/latex/contrib/jsonparse/jsonparse.sty +++ b/macros/latex/contrib/jsonparse/jsonparse.sty @@ -1,23 +1,23 @@ -% File: jsonparse.sty +% File: jsonparse.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 `jsonparse' package (The Work in LPPL) % and all files in that bundle must be distributed together. -% +% % This work has the LPPL maintenance status `maintained'. -% -\ProvidesExplPackage {jsonparse} {2024-10-27} {0.9.5} +% +\ProvidesExplPackage {jsonparse} {2024-10-31} {0.9.6} {A handy way to parse, store and access JSON data from files or strings in LaTeX documents} \bool_new:N \l__jsonparse_debug_mode_bool -\keys_define:nn { jsonparse / global } { +\keys_define:nn { jsonparse / global } { debug .bool_set:N = \l__jsonparse_debug_mode_bool , debug .default:n = { true } , - debug .initial:n = { false } + debug .initial:n = { false } } \ProcessKeyOptions [ jsonparse / global ] @@ -28,13 +28,13 @@ \msg_new:nnn { jsonparse } { parsing-error } { \msg_error_text:n { jsonparse } \iow_newline: Could ~ not ~ parse ~ JSON. \iow_newline: - Parsing ~ error ~ at ~ key ~ `#1` ~ with ~ value ~ `#2`. + Parsing ~ error ~ at ~ key ~ `#1` ~ with ~ value ~ `#2`. } \msg_new:nnn { jsonparse } { nested-non-expandable } { \msg_error_text:n { jsonparse } \iow_newline: Nested ~ use ~ of ~ \token_to_str:N \JSONParseValue \c_space_tl not ~ allowed. \iow_newline: - Use ~ \token_to_str:N \JSONParseExpandableValue \c_space_tl instead. + Use ~ \token_to_str:N \JSONParseExpandableValue \c_space_tl instead. } \msg_new:nnn { jsonparse } { file-not-found } { @@ -44,7 +44,7 @@ \msg_new:nnn { jsonparse } { file-exists } { \msg_error_text:n { jsonparse } \iow_newline: - File ~ #1 ~ already ~ existing. + File ~ #1 ~ already ~ existing. } \msg_new:nnn { jsonparse } { escape-in-key } { @@ -72,6 +72,11 @@ Loading ~ from ~ external ~ file: ~ #1. } +\msg_new:nnn { jsonparse } { not-array-item } { + \msg_info_text:n { jsonparse } \iow_newline: + Key ~ does ~ not ~ represent ~ an ~ array ~ item: ~ #1 +} + % === \str_new:N \l_jsonparse_externalize_prefix_str @@ -100,12 +105,12 @@ \clist_const:Nn \c__jsonparse_escape_tex_chars_clist { number_sign , - dollar_sign , + dollar_sign , percent_sign , ampersand , - circumflex_accent , - low_line , - tilde + circumflex_accent , + low_line , + tilde } \str_new:N \l__jsonparse_escape_temp_str @@ -120,7 +125,7 @@ externalize ~ prefix .str_set:N = \l_jsonparse_externalize_prefix_str , externalize ~ prefix .initial:n = { } , externalize ~ file ~ name .tl_set:N = \l__jsonparse_externalize_file_name_tl , - externalize ~ file ~ name .initial:n = { + externalize ~ file ~ name .initial:n = { \l_jsonparse_externalize_prefix_str \c_sys_jobname_str \c_underscore_str \l_jsonparse_current_prop_str } , separator .code:n = { \keys_set:nn { jsonparse / parse / separator } {#1} } , @@ -142,7 +147,7 @@ replace / false .str_set:N = \l__jsonparse_false_str , replace / false .initial:n = { false } , replace / null .str_set:N = \l__jsonparse_null_str , - replace / null .initial:n = { null } + replace / null .initial:n = { null } } \keys_define:nn { jsonparse / typeset } { @@ -157,13 +162,13 @@ replace / carriage ~ return .initial:n = { ~ } , replace / horizontal ~ tab .str_set:N = \l__jsonparse_horizontal_tab_str , replace / horizontal ~ tab .initial:n = { ~ } , - escape .code:n = { - \str_case:nnF {#1} { + escape .code:n = { + \str_case:nnF {#1} { { all } { \clist_map_inline:Nn \c__jsonparse_escape_tex_chars_clist { \bool_set_true:c { l__jsonparse_escape_ ##1 _bool } } - } + } { none } { \clist_map_inline:Nn \c__jsonparse_escape_tex_chars_clist { \bool_set_false:c { l__jsonparse_escape_ ##1 _bool } @@ -176,7 +181,7 @@ \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} { + \str_case:nnF {##1} { { hash } { \bool_set_true:c { l__jsonparse_escape_number_sign_bool } } @@ -211,20 +216,20 @@ \clist_map_inline:Nn \l__jsonparse_unused_keys_clist { \msg_warning:nne { jsonparse } { unknown-key } { ##1 - } + } } } \NewDocumentCommand { \JSONParseSet } { m } { \keys_set_known:nnN { jsonparse / global } {#1} \l__jsonparse_unused_keys_clist - \keys_set_known:noN { jsonparse / parse } { \l__jsonparse_unused_keys_clist } \l__jsonparse_unused_keys_clist + \keys_set_known:noN { jsonparse / parse } { \l__jsonparse_unused_keys_clist } \l__jsonparse_unused_keys_clist \keys_set_known:noN { jsonparse / typeset } { \l__jsonparse_unused_keys_clist } \l__jsonparse_unused_keys_clist \__jsonparse_warning_unused_keys: } % === -\cs_if_exist:NF \str_casefold:n { +\cs_if_exist:NF \str_casefold:n { \cs_new:Npn \str_casefold:n { \str_foldcase:n } } @@ -258,7 +263,7 @@ \prg_generate_conditional_variant:Nnn \tl_if_eq:nn { en } { T } \prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN { oN } { T , TF } \prg_generate_conditional_variant:Nnn \tl_if_in:nn { nV } { F } -\prg_generate_conditional_variant:Nnn \str_if_eq:nn { en , eV } { T , TF } +\prg_generate_conditional_variant:Nnn \str_if_eq:nn { en , eV } { T , F , TF } \prop_new:N \g_jsonparse_entries_prop \prop_new:N \l__jsonparse_temp_prop @@ -277,6 +282,9 @@ \int_new:N \l__jsonparse_array_count_int \int_new:N \l__jsonparse_array_count_last_int +\int_new:N \l__jsonparse_array_keys_index_int +\tl_new:N \l__jsonparse_array_keys_index_roman_tl + \bool_new:N \l__jsonparse_prop_map_first_bool \bool_new:N \l__jsonparse_externalize_load_bool @@ -298,38 +306,38 @@ \tl_new:N \l__jsonparse_num_input_tl \tl_new:N \l__jsonparse_num_remainder_tl \tl_new:N \l__jsonparse_num_input_last_tl -\bool_new:N \l__jsonparse_num_bool -\bool_new:N \l__jsonparse_num_zero_seen_bool -\bool_new:N \l__jsonparse_num_plus_minus_seen_bool -\bool_new:N \l__jsonparse_num_fraction_seen_bool +\bool_new:N \l__jsonparse_num_bool +\bool_new:N \l__jsonparse_num_zero_seen_bool +\bool_new:N \l__jsonparse_num_plus_minus_seen_bool +\bool_new:N \l__jsonparse_num_fraction_seen_bool \bool_new:N \l__jsonparse_num_exponent_seen_bool \clist_const:Nn \c__jsonparse_num_digits_clist { - 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 + 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } \clist_const:Ne \c__jsonparse_num_others_clist { - \tl_to_str:n { + } , - \tl_to_str:n { - } , - \tl_to_str:n { . } , - \tl_to_str:n { e } , + \tl_to_str:n { + } , + \tl_to_str:n { - } , + \tl_to_str:n { . } , + \tl_to_str:n { e } , \tl_to_str:n { E } } \prg_new_conditional:Npnn \jsonparse_if_num:n #1 { p , T , F , TF } { - \bool_set_true:N \l__jsonparse_num_bool + \bool_set_true:N \l__jsonparse_num_bool \bool_set_false:N \l__jsonparse_num_zero_seen_bool \bool_set_false:N \l__jsonparse_num_plus_minus_seen_bool \bool_set_false:N \l__jsonparse_num_fraction_seen_bool \bool_set_false:N \l__jsonparse_num_exponent_seen_bool \tl_set:Nn \l__jsonparse_num_remainder_tl { #1 } \tl_if_empty:NTF \l__jsonparse_num_remainder_tl { - \bool_set_false:N \l__jsonparse_num_bool + \bool_set_false:N \l__jsonparse_num_bool } { \__jsonparse_parse_num:n {#1} } \clist_if_in:NVT \c__jsonparse_num_others_clist \l__jsonparse_num_input_last_tl { - \bool_set_false:N \l__jsonparse_num_bool + \bool_set_false:N \l__jsonparse_num_bool } \bool_if:NTF \l__jsonparse_num_bool { \prg_return_true: @@ -341,43 +349,43 @@ \cs_new:Npn \__jsonparse_parse_num:n #1 { \tl_set:Ne \l__jsonparse_num_input_tl { \tl_trim_spaces:e {#1} } \tl_if_empty:NF \l__jsonparse_num_input_tl { - \cs_if_exist_use:cTF { __jsonparse_parse_num_ \str_head_ignore_spaces:o { \l__jsonparse_num_input_tl } :w } { + \cs_if_exist_use:cTF { __jsonparse_parse_num_ \str_head_ignore_spaces:o { \l__jsonparse_num_input_tl } :w } { \l__jsonparse_num_input_tl \q_stop } { - \exp_last_unbraced:No - \__jsonparse_parse_num_other:w \l__jsonparse_num_input_tl \q_stop + \exp_last_unbraced:No + \__jsonparse_parse_num_other:w \l__jsonparse_num_input_tl \q_stop } } } \cs_new:cpn { __jsonparse_parse_num_ + :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_num_plus_minus:w #1 \q_stop } \cs_new:cpn { __jsonparse_parse_num_ - :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_num_plus_minus:w #1 \q_stop } \cs_new:cpn { __jsonparse_parse_num_ . :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_num_fraction:w #1 \q_stop } \cs_new:cpn { __jsonparse_parse_num_ e :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_num_exponent:w #1 \q_stop } \cs_new:cpn { __jsonparse_parse_num_ E :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_num_exponent:w #1 \q_stop } \clist_map_inline:Nn \c__jsonparse_num_digits_clist { \cs_new:cpn { __jsonparse_parse_num_ #1 :w } ##1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_num_digit:w ##1 \q_stop } } @@ -395,7 +403,7 @@ } { \clist_if_in:NVT \c__jsonparse_num_others_clist \l__jsonparse_num_input_last_tl { \tl_set:Nn \l__jsonparse_num_remainder_tl { } - \bool_set_false:N \l__jsonparse_num_bool + \bool_set_false:N \l__jsonparse_num_bool } } } @@ -416,7 +424,7 @@ } { \clist_if_in:NVT \c__jsonparse_num_others_clist \l__jsonparse_num_input_last_tl { \tl_set:Nn \l__jsonparse_num_remainder_tl { } - \bool_set_false:N \l__jsonparse_num_bool + \bool_set_false:N \l__jsonparse_num_bool } } } @@ -439,7 +447,7 @@ } { \clist_if_in:NVT \c__jsonparse_num_others_clist \l__jsonparse_num_input_last_tl { \tl_set:Nn \l__jsonparse_num_remainder_tl { } - \bool_set_false:N \l__jsonparse_num_bool + \bool_set_false:N \l__jsonparse_num_bool } } } @@ -455,14 +463,14 @@ \cs_new:Npn \__jsonparse_parse_num_digit:w #1 \q_stop { \bool_lazy_any:nTF { { \tl_if_empty_p:N \l__jsonparse_num_input_last_tl } - { \bool_lazy_and_p:nn + { \bool_lazy_and_p:nn { \str_if_eq_p:Vn \l__jsonparse_num_input_last_tl { - } } { \bool_not_p:n { \l__jsonparse_num_exponent_seen_bool } } } } { \str_if_eq:enT { \tl_head:n {#1} } { 0 } { \bool_set_true:N \l__jsonparse_num_zero_seen_bool - } + } } { \bool_if:NT \l__jsonparse_num_zero_seen_bool { \tl_set:Nn \l__jsonparse_num_remainder_tl { } @@ -476,7 +484,7 @@ \cs_new:Npn \__jsonparse_parse_num_other:w #1 \q_stop { \tl_set:Nn \l__jsonparse_num_remainder_tl { } - \bool_set_false:N \l__jsonparse_num_bool + \bool_set_false:N \l__jsonparse_num_bool } % === @@ -484,69 +492,69 @@ \cs_new_protected:Npn \jsonparse_parse_to_prop:Nn #1#2 { \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { - \iow_newline: - Parsing ~ JSON ~ ... - } + \iow_newline: + Parsing ~ JSON ~ ... + } } \prop_gclear:N \g_jsonparse_entries_prop \jsonparse_parse:n {#2} - \prop_gset_eq:NN #1 \g_jsonparse_entries_prop + \prop_gset_eq:NN #1 \g_jsonparse_entries_prop \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { - JSON ~ parsing ~ done. \iow_newline: - } + JSON ~ parsing ~ done. \iow_newline: + } } } \cs_new_protected:Npn \jsonparse_parse:n #1 { \tl_set:Ne \l__jsonparse_input_tl { \tl_trim_spaces:e {#1} } - \cs_if_exist_use:cTF { __jsonparse_parse_ \str_head_ignore_spaces:o { \l__jsonparse_input_tl } :w } { + \cs_if_exist_use:cTF { __jsonparse_parse_ \str_head_ignore_spaces:o { \l__jsonparse_input_tl } :w } { \l__jsonparse_input_tl \q_stop } { % other - \exp_last_unbraced:No - \__jsonparse_parse_other:w \l__jsonparse_input_tl \q_stop + \exp_last_unbraced:No + \__jsonparse_parse_other:w \l__jsonparse_input_tl \q_stop } } % === \cs_new:cpn { __jsonparse_parse_ \c_left_brace_str :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_object_begin:w #1 \q_stop } \cs_new:cpn { __jsonparse_parse_ \c_right_brace_str :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_object_end:w #1 \q_stop } \cs_new:cpn { __jsonparse_parse_ [ :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_array_begin:w #1 \q_stop } \cs_new:cpn { __jsonparse_parse_ ] :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_array_end:w #1 \q_stop } \cs_new:cpn { __jsonparse_parse_ " :w } #1 \q_stop { - \exp_last_unbraced:No + \exp_last_unbraced:No \__jsonparse_parse_string_key:w #1 \q_stop } \cs_new:Npn \__jsonparse_array_key_set: { - \str_if_eq:eVT { - \tl_range:Nen \l__jsonparse_prefix_tl { - \int_eval:n { - -1 * \tl_count:N \l__jsonparse_array_sep_left_str - } + \str_if_eq:eVT { + \tl_range:Nen \l__jsonparse_prefix_tl { + \int_eval:n { + -1 * \tl_count:N \l__jsonparse_array_sep_left_str + } } { -1 } } \l__jsonparse_array_sep_left_str { \int_incr:N \l__jsonparse_array_index_int - \tl_set:Ne \l__jsonparse_key_tl { - \l__jsonparse_prefix_tl \int_use:N \l__jsonparse_array_index_int \l__jsonparse_array_sep_right_str + \tl_set:Ne \l__jsonparse_key_tl { + \l__jsonparse_prefix_tl \int_use:N \l__jsonparse_array_index_int \l__jsonparse_array_sep_right_str } } } @@ -558,11 +566,11 @@ % object begin \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nnn { jsonparse } { debug-info } { - (obj ~ begin) - } + (obj ~ begin) + } } \tl_if_empty:NTF \l__jsonparse_key_tl { - \tl_set_eq:NN \l__jsonparse_object_array_key_tl \l__jsonparse_child_sep_str + \tl_set_eq:NN \l__jsonparse_object_array_key_tl \l__jsonparse_child_sep_str } { \tl_set_eq:NN \l__jsonparse_object_array_key_tl \l__jsonparse_key_tl \tl_set:Ne \l__jsonparse_prefix_tl { \l__jsonparse_key_tl \l__jsonparse_child_sep_str } @@ -572,27 +580,27 @@ } \exp_last_unbraced:NNo \cs_new:Npn \__jsonparse_parse_object_end:w \c_right_brace_str #1 \q_stop { - \tl_set:Ne \l__jsonparse_object_array_val_tl { + \tl_set:Ne \l__jsonparse_object_array_val_tl { \tl_range:Nne \l__jsonparse_object_array_val_tl { 1 } { \int_eval:n { -1 * \tl_count:n {#1} - 1 } } } - \prop_gput:Nee \g_jsonparse_entries_prop + \prop_gput:Nee \g_jsonparse_entries_prop { \l__jsonparse_object_array_key_tl } { \l__jsonparse_object_array_val_tl } \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { (key) ~ \str_use:N \l__jsonparse_object_array_key_tl : \iow_newline: - \iow_char:N \ \iow_char:N \ (obj) ~ \str_use:N \l__jsonparse_object_array_val_tl - } - } + \iow_char:N \ \iow_char:N \ (obj) ~ \str_use:N \l__jsonparse_object_array_val_tl + } + } \group_end: % object end \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nnn { jsonparse } { debug-info } { - (obj ~ end) - } + (obj ~ end) + } } \tl_set:Nn \l__jsonparse_remainder_tl {#1} \__jsonparse_parse_remainder: @@ -605,7 +613,7 @@ % array begin \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nnn { jsonparse } { debug-info } { - (arr ~ begin) + (arr ~ begin) } } \int_zero:N \l__jsonparse_array_index_int @@ -619,27 +627,27 @@ } \cs_new:Npn \__jsonparse_parse_array_end:w ] #1 \q_stop { - \tl_set:Ne \l__jsonparse_object_array_val_tl { + \tl_set:Ne \l__jsonparse_object_array_val_tl { \tl_range:Nne \l__jsonparse_object_array_val_tl { 1 } { \int_eval:n { -1 * \tl_count:n {#1} - 1 } } } - \prop_gput:Nee \g_jsonparse_entries_prop + \prop_gput:Nee \g_jsonparse_entries_prop { \l__jsonparse_object_array_key_tl } { \l__jsonparse_object_array_val_tl } \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { (key) ~ \str_use:N \l__jsonparse_object_array_key_tl : \iow_newline: \iow_char:N \ \iow_char:N \ (arr) ~ \str_use:N \l__jsonparse_object_array_val_tl - } - } + } + } \group_end: % array end \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nnn { jsonparse } { debug-info } { - (arr ~ end) - } + (arr ~ end) + } } \tl_set:Nn \l__jsonparse_remainder_tl {#1} \__jsonparse_parse_remainder: @@ -650,18 +658,18 @@ \tl_set:Ne \l__jsonparse_remainder_tl { \tl_trim_spaces:n {#2} } % key or string? \tl_if_head_eq_charcode:oNTF { \l__jsonparse_remainder_tl } : { - \tl_remove_once:NV \l__jsonparse_remainder_tl \c_colon_str + \tl_remove_once:NV \l__jsonparse_remainder_tl \c_colon_str \tl_set:Ne \l__jsonparse_key_tl { \l__jsonparse_prefix_tl #1 } } { \tl_set:Nn \l__jsonparse_val_tl {#1} - \prop_gput:Nee \g_jsonparse_entries_prop + \prop_gput:Nee \g_jsonparse_entries_prop { \l__jsonparse_key_tl } { \l__jsonparse_val_tl } % string \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { (key) ~ \str_use:N \l__jsonparse_key_tl : \iow_newline: \iow_char:N \ \iow_char:N \ (str) ~ \str_use:N \l__jsonparse_val_tl - } + } } } \__jsonparse_parse_remainder: @@ -681,40 +689,40 @@ \tl_set:Ne \l__jsonparse_temp_tl { \tl_trim_spaces:n {#1} } \cs_if_exist_use:cF { __jsonparse_parse_ \str_casefold:o { \l__jsonparse_temp_tl } : } { \bool_if:NTF \l__jsonparse_check_num_bool { - \jsonparse_if_num:nTF {#1} { + \jsonparse_if_num:nTF {#1} { \tl_set:Nn \l__jsonparse_val_tl {#1} - \prop_gput:Nee \g_jsonparse_entries_prop + \prop_gput:Nee \g_jsonparse_entries_prop { \l__jsonparse_key_tl } { \l__jsonparse_val_tl } % number \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { (key) ~ \str_use:N \l__jsonparse_key_tl : \iow_newline: \iow_char:N \ \iow_char:N \ (num) ~ \str_use:N \l__jsonparse_val_tl - } + } } - } { + } { % not a valid JSON fp \msg_error:nnoo { jsonparse } { parsing-error } { \l__jsonparse_key_tl } {#1} - } + } } { \tl_set:Nn \l__jsonparse_val_tl {#1} - \prop_gput:Nee \g_jsonparse_entries_prop + \prop_gput:Nee \g_jsonparse_entries_prop { \l__jsonparse_key_tl } { \l__jsonparse_val_tl } % number \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { (key) ~ \str_use:N \l__jsonparse_key_tl : \iow_newline: \iow_char:N \ \iow_char:N \ (num) ~ \str_use:N \l__jsonparse_val_tl - } + } } } } \tl_set:Ne \l__jsonparse_remainder_tl { \tl_trim_spaces:e { \l__jsonparse_remainder_tl } } - \tl_set:Ne \l__jsonparse_remainder_tl { - \tl_range:Nen \l__jsonparse_remainder_tl { + \tl_set:Ne \l__jsonparse_remainder_tl { + \tl_range:Nen \l__jsonparse_remainder_tl { \int_eval:n { - \tl_count:n {#1} + 1 + \tl_count:n {#1} + 1 } } { -1 } } @@ -722,41 +730,41 @@ } \cs_new:Npn \__jsonparse_parse_true: { - \tl_set_eq:NN \l__jsonparse_val_tl \l__jsonparse_true_str - \prop_gput:Nee \g_jsonparse_entries_prop + \tl_set_eq:NN \l__jsonparse_val_tl \l__jsonparse_true_str + \prop_gput:Nee \g_jsonparse_entries_prop { \l__jsonparse_key_tl } { \l__jsonparse_val_tl } % true \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { (key) ~ \str_use:N \l__jsonparse_key_tl : \iow_newline: \iow_char:N \ \iow_char:N \ (tru) ~ \str_use:N \l__jsonparse_val_tl - } + } } } \cs_new:Npn \__jsonparse_parse_false: { - \tl_set_eq:NN \l__jsonparse_val_tl \l__jsonparse_false_str - \prop_gput:Nee \g_jsonparse_entries_prop + \tl_set_eq:NN \l__jsonparse_val_tl \l__jsonparse_false_str + \prop_gput:Nee \g_jsonparse_entries_prop { \l__jsonparse_key_tl } { \l__jsonparse_val_tl } % false \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { (key) ~ \str_use:N \l__jsonparse_key_tl : \iow_newline: \iow_char:N \ \iow_char:N \ (fal) ~ \str_use:N \l__jsonparse_val_tl - } + } } } \cs_new:Npn \__jsonparse_parse_null: { \tl_set_eq:NN \l__jsonparse_val_tl \l__jsonparse_null_str - \prop_gput:Nee \g_jsonparse_entries_prop + \prop_gput:Nee \g_jsonparse_entries_prop { \l__jsonparse_key_tl } { \l__jsonparse_val_tl } % null \bool_if:NT \l__jsonparse_debug_mode_bool { \msg_log:nne { jsonparse } { debug-info } { (key) ~ \str_use:N \l__jsonparse_key_tl : \iow_newline: \iow_char:N \ \iow_char:N \ (nul) ~ \str_use:N \l__jsonparse_val_tl - } + } } } @@ -773,16 +781,16 @@ \cs_new_protected:Npn \jsonparse_filter:Nn #1#2 { \prop_clear:N \l__jsonparse_temp_prop \prop_map_inline:Nn #1 { - \str_case_e:en { - \tl_range:nne {##1} { 1 } { \int_eval:n { \tl_count:n {#2} + 1 } } + \str_case_e:en { + \tl_range:nne {##1} { 1 } { \int_eval:n { \tl_count:n {#2} + 1 } } } { { #2 \l__jsonparse_child_sep_str } { - \prop_put:Nen \l__jsonparse_temp_prop - { \tl_range:nen {##1} { \int_eval:n { \tl_count:n {#2} + 2 } } { -1 } } {##2} + \prop_put:Nen \l__jsonparse_temp_prop + { \tl_range:nen {##1} { \int_eval:n { \tl_count:n {#2} + 2 } } { -1 } } {##2} } { #2 \l__jsonparse_array_sep_left_str } { - \prop_put:Nen \l__jsonparse_temp_prop - { \tl_range:nen {##1} { \int_eval:n { \tl_count:n {#2} + 1 } } { -1 } } {##2} + \prop_put:Nen \l__jsonparse_temp_prop + { \tl_range:nen {##1} { \int_eval:n { \tl_count:n {#2} + 1 } } { -1 } } {##2} } } } @@ -793,8 +801,8 @@ \NewDocumentCommand { \JSONParsePut } { m m +v } { \prop_if_exist:NF #1 { - \prop_new:N #1 - } + \prop_new:N #1 + } \prop_gput:Nnn #1 {#2} {#3} } @@ -828,7 +836,7 @@ \group_begin: \str_set:Ne \l_jsonparse_current_prop_str { \cs_to_str:N #2 } \keys_set_known:nnN { jsonparse / global } {#1} \l__jsonparse_unused_keys_clist - \keys_set_known:noN { jsonparse / parse } { \l__jsonparse_unused_keys_clist } \l__jsonparse_unused_keys_clist + \keys_set_known:noN { jsonparse / parse } { \l__jsonparse_unused_keys_clist } \l__jsonparse_unused_keys_clist \__jsonparse_warning_unused_keys: \bool_set_false:N \l__jsonparse_externalize_load_bool \bool_if:NT \l__jsonparse_externalize_bool { @@ -855,8 +863,8 @@ \cs_set:Npn \u { \exp_not:N \u } \__json_nested_construct_cs:Noo \x \c_left_brace_str \c_right_brace_str \tl_set:Nn \obeyedline { ~ } - \tl_gset_rescan:Nne \g__jsonparse_json_tl { \cctab_select:N \c__jsonparse_json_escape_cctab } {#3} - \exp_args:NNe \jsonparse_parse_to_prop:Nn #2 { \g__jsonparse_json_tl } + \tl_gset_rescan:Nne \g__jsonparse_json_tl { \cctab_select:N \c__jsonparse_json_escape_cctab } {#3} + \exp_args:NNe \jsonparse_parse_to_prop:Nn #2 { \g__jsonparse_json_tl } \group_end: \bool_if:NT \l__jsonparse_externalize_bool { \__jsonparse_externalize:Nn #2 { \l__jsonparse_externalize_file_name_tl .jsonparse } @@ -873,8 +881,8 @@ \group_begin: \str_set:Ne \l_jsonparse_current_prop_str { \cs_to_str:N #2 } \keys_set_known:nnN { jsonparse / global } {#1} \l__jsonparse_unused_keys_clist - \keys_set_known:noN { jsonparse / parse } { \l__jsonparse_unused_keys_clist } \l__jsonparse_unused_keys_clist - \__jsonparse_warning_unused_keys: + \keys_set_known:noN { jsonparse / parse } { \l__jsonparse_unused_keys_clist } \l__jsonparse_unused_keys_clist + \__jsonparse_warning_unused_keys: \bool_set_false:N \l__jsonparse_externalize_load_bool \bool_if:NT \l__jsonparse_externalize_bool { \file_if_exist:eT { \l__jsonparse_externalize_file_name_tl .jsonparse } { @@ -899,7 +907,7 @@ \cs_set:Npn \t { \exp_not:N \t } \cs_set:Npn \u { \exp_not:N \u } \file_get:nnN {#3} { \cctab_select:N \c__jsonparse_json_escape_cctab } \g__jsonparse_json_tl - \exp_args:NNe \jsonparse_parse_to_prop:Nn #2 { \g__jsonparse_json_tl } + \exp_args:NNe \jsonparse_parse_to_prop:Nn #2 { \g__jsonparse_json_tl } \group_end: \bool_if:NT \l__jsonparse_externalize_bool { \__jsonparse_externalize:Nn #2 { \l__jsonparse_externalize_file_name_tl .jsonparse } @@ -909,7 +917,7 @@ } \NewExpandableDocumentCommand { \JSONParseExpandableValue } { m m } { - \prop_item:Ne #1 {#2} + \prop_item:Ne #1 {#2} } \cs_set_eq:NN \__jsonparse_tex_quote: \" @@ -932,7 +940,7 @@ \cs_set_eq:NN \u \__jsonparse_unicode_char:NNNN \tl_set:Ne \l__jsonparse_temp_tl {#1} \cs_set_eq:NN \" \__jsonparse_tex_quote: - \cs_set_eq:NN \\ \__jsonparse_tex_backslash: + \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 } } @@ -963,7 +971,7 @@ \keys_set_known:nn { jsonparse / typeset } {#1} \l__jsonparse_unused_keys_clist \__jsonparse_warning_unused_keys: \bool_if:NTF \l__jsonparse_rescan_bool { - \exp_args:Ne \__jsonparse_rescan:n { \prop_item:Ne #2 {#3} } + \exp_args:Ne \__jsonparse_rescan:n { \prop_item:Ne #2 {#3} } } { \prop_item:Ne #2 {#3} } @@ -977,93 +985,232 @@ \bool_set_true:N \l__jsonparse_prop_map_first_bool \tl_set:Nn \l__jsonparse_temp_tl { [ } \prop_map_inline:Nn #1 { - \tl_if_in:nVF {##1} \l__jsonparse_child_sep_str { - \bool_if:NTF \l__jsonparse_prop_map_first_bool { + \tl_if_in:nVF {##1} \l__jsonparse_child_sep_str { + \bool_if:NTF \l__jsonparse_prop_map_first_bool { \bool_set_false:N \l__jsonparse_prop_map_first_bool } { - \tl_put_right:Nn \l__jsonparse_temp_tl { , } + \tl_put_right:Nn \l__jsonparse_temp_tl { , } } \tl_put_right:Nn \l__jsonparse_temp_tl { " ##1 " } } } - \tl_put_right:Nn \l__jsonparse_temp_tl { ] } + \tl_put_right:Nn \l__jsonparse_temp_tl { ] } \tl_set_eq:NN #2 \l__jsonparse_temp_tl } -\NewDocumentCommand { \JSONParseArrayValues } { O{} m m O{} m } { - \group_begin: - \keys_set_known:nn { jsonparse / typeset } {#1} \l__jsonparse_unused_keys_clist - \__jsonparse_warning_unused_keys: - \tl_set:Nn \l__jsonparse_temp_tl {#2} - \jsonparse_filter:Nn \l__jsonparse_temp_tl {#3} - \bool_set_true:N \l__jsonparse_prop_map_first_bool - \prop_map_inline:Nn \l__jsonparse_temp_tl { - \str_if_eq:enT { - \tl_range:nen {##1} { \int_eval:n { -1 * \tl_count:n {#4} } } { -1 } - } {#4} { - \bool_if:NTF \l__jsonparse_prop_map_first_bool { - \bool_set_false:N \l__jsonparse_prop_map_first_bool - } { - #5 - } - \bool_if:NTF \l__jsonparse_rescan_bool { - \__jsonparse_rescan:n {##2} - } { - ##2 - } - } - } - \group_end: -} - \cs_new:Npn \__jsonparse_get_array_index:w [ #1 ] #2 \q_stop { #1 } +\cs_new_protected:Npn \jsonparse_array_count:NN #1#2 { + \int_zero:N #2 + \int_set:Nn \l__jsonparse_array_count_last_int { -1 } + \prop_map_inline:Nn #1 { + \str_if_eq:eVF { \tl_head:n {##1} } \l__jsonparse_array_sep_left_str { + \msg_error:nnn { jsonparse } { not-array-item } + {##1} + } + \int_compare:nNnF { + \__jsonparse_get_array_index:w ##1 \q_stop + } = { \l__jsonparse_array_count_last_int } { + \int_incr:N #2 + } + \int_set:Nn \l__jsonparse_array_count_last_int { + \__jsonparse_get_array_index:w ##1 \q_stop + } + } +} + \NewDocumentCommand { \JSONParseArrayCount } { m m } { \group_begin: - \jsonparse_filter:Nn #1 {#2} - \int_zero:N \l__jsonparse_array_count_int - \int_set:Nn \l__jsonparse_array_count_last_int { -1 } - \prop_map_inline:Nn #1 { - \int_compare:nNnF { - \__jsonparse_get_array_index:w ##1 \q_stop - } = { \l__jsonparse_array_count_last_int } { - \int_incr:N \l__jsonparse_array_count_int + \tl_set:Nn \l__jsonparse_temp_tl {#1} + \jsonparse_filter:Nn \l__jsonparse_temp_tl {#2} + \jsonparse_array_count:NN \l__jsonparse_temp_tl \l__jsonparse_array_count_int + \int_use:N \l__jsonparse_array_count_int + \group_end: +} + +\NewDocumentCommand { \JSONParseArrayValues } { O{} m m o m } { + \group_begin: + \keys_set_known:nn { jsonparse / typeset } {#1} \l__jsonparse_unused_keys_clist + \__jsonparse_warning_unused_keys: + \tl_set:Nn \l__jsonparse_temp_tl {#2} + \jsonparse_filter:Nn \l__jsonparse_temp_tl {#3} + \jsonparse_array_count:NN \l__jsonparse_temp_tl \l__jsonparse_array_count_int + \bool_set_true:N \l__jsonparse_prop_map_first_bool + \int_step_inline:nn { \l__jsonparse_array_count_int } { + \bool_if:NTF \l__jsonparse_prop_map_first_bool { + \bool_set_false:N \l__jsonparse_prop_map_first_bool + } { + #5 } - \int_set:Nn \l__jsonparse_array_count_last_int { - \__jsonparse_get_array_index:w ##1 \q_stop + \bool_if:NTF \l__jsonparse_rescan_bool { + \exp_args:Ne \__jsonparse_rescan:n { + \prop_item:Ne \l__jsonparse_temp_tl { + \l__jsonparse_array_sep_left_str + \bool_if:NTF \l__jsonparse_zero_based_bool { + \int_eval:n { ##1 - 1 } + } { + ##1 + } + \l__jsonparse_array_sep_right_str + \IfValueT {#4} { + \l__jsonparse_child_sep_str + #4 + } + } + } + } { + \prop_item:Ne \l__jsonparse_temp_tl { + \l__jsonparse_array_sep_left_str + \bool_if:NTF \l__jsonparse_zero_based_bool { + \int_eval:n { ##1 - 1 } + } { + ##1 + } + \l__jsonparse_array_sep_right_str + \IfValueT {#4} { + \l__jsonparse_child_sep_str + #4 + } + } } - } - \int_use:N \l__jsonparse_array_count_int + } \group_end: } -\tl_new:N \JSONParseArrayIndex -\tl_new:N \JSONParseArrayKey +\tl_new:N \JSONParseArrayNewline +\tl_new:N \JSONParseArrayIndex +\tl_new:N \JSONParseArrayKey \tl_new:N \JSONParseArrayValue -\NewDocumentCommand { \JSONParseArrayValuesMap } { O{} m m O{} m } { - \group_begin: +\NewDocumentCommand { \JSONParseArrayValuesMap } { O{} m m o m O{} O{} } { + \group_begin: \keys_set_known:nn { jsonparse / typeset } {#1} \l__jsonparse_unused_keys_clist \__jsonparse_warning_unused_keys: - \jsonparse_filter:Nn #2 {#3} - \prop_map_inline:Nn #2 { - \str_if_eq:enT { - \tl_range:nen {##1} { \int_eval:n { -1 * \tl_count:n {#4} } } { -1 } - } {#4} { - \int_incr:N \l__jsonparse_array_index_int - \tl_set:Ne \JSONParseArrayIndex { \__jsonparse_get_array_index:w ##1 \q_stop } - \tl_set:Nn \JSONParseArrayKey {##1} + \tl_set:Nn \l__jsonparse_temp_tl {#2} + \jsonparse_filter:Nn \l__jsonparse_temp_tl {#3} + \jsonparse_array_count:NN \l__jsonparse_temp_tl \l__jsonparse_array_count_int + \IfValueT {#4} { + \int_zero:N \l__jsonparse_array_keys_index_int + \clist_map_inline:nn {#4} { + \int_incr:N \l__jsonparse_array_keys_index_int + \tl_set:Ne \l__jsonparse_array_keys_index_roman_tl { + \int_to_Roman:n { \l__jsonparse_array_keys_index_int } + } + \tl_if_exist:cF { JSONParseArrayKey \l__jsonparse_array_keys_index_roman_tl } { + \tl_new:c { JSONParseArrayKey \l__jsonparse_array_keys_index_roman_tl } + } + \tl_if_exist:cF { JSONParseArrayValue \l__jsonparse_array_keys_index_roman_tl } { + \tl_new:c { JSONParseArrayValue \l__jsonparse_array_keys_index_roman_tl } + } + } + } + #6 + \tl_gset:Nn \JSONParseArrayNewline { \tabularnewline } + \int_step_inline:nn { \l__jsonparse_array_count_int } { + \bool_if:NTF \l__jsonparse_zero_based_bool { + \tl_gset:Nn \JSONParseArrayIndex { \int_eval:n { ##1 - 1 } } + } { + \tl_gset:Nn \JSONParseArrayIndex {##1} + } + \IfValueTF {#4} { + \int_zero:N \l__jsonparse_array_keys_index_int + \clist_map_inline:nn {#4} { + \int_incr:N \l__jsonparse_array_keys_index_int + \tl_set:Ne \l__jsonparse_array_keys_index_roman_tl { + \int_to_Roman:n { \l__jsonparse_array_keys_index_int } + } + \tl_gset:ce { JSONParseArrayKey \l__jsonparse_array_keys_index_roman_tl } { + \l__jsonparse_array_sep_left_str + \bool_if:NTF \l__jsonparse_zero_based_bool { + \int_eval:n { ##1 - 1 } + } { + ##1 + } + \l__jsonparse_array_sep_right_str + \l__jsonparse_child_sep_str + ####1 + } + \bool_if:NTF \l__jsonparse_rescan_bool { + \tl_gset:cn { JSONParseArrayValue \l__jsonparse_array_keys_index_roman_tl } { + \exp_args:Ne \__jsonparse_rescan:n { + \prop_item:Ne \l__jsonparse_temp_tl { + \l__jsonparse_array_sep_left_str + \bool_if:NTF \l__jsonparse_zero_based_bool { + \int_eval:n { ##1 - 1 } + } { + ##1 + } + \l__jsonparse_array_sep_right_str + \l__jsonparse_child_sep_str + ####1 + } + } + } + } { + \tl_gset:ce { JSONParseArrayValue \l__jsonparse_array_keys_index_roman_tl } { + \prop_item:Ne \l__jsonparse_temp_tl { + \l__jsonparse_array_sep_left_str + \bool_if:NTF \l__jsonparse_zero_based_bool { + \int_eval:n { ##1 - 1 } + } { + ##1 + } + \l__jsonparse_array_sep_right_str + \l__jsonparse_child_sep_str + ####1 + } + } + } + } + \tl_gset_eq:NN \JSONParseArrayKey \JSONParseArrayKeyI + \tl_gset_eq:NN \JSONParseArrayValue \JSONParseArrayValueI + } { + \tl_gset:Ne \JSONParseArrayKey { + \l__jsonparse_array_sep_left_str + \bool_if:NTF \l__jsonparse_zero_based_bool { + \int_eval:n { ##1 - 1 } + } { + ##1 + } + \l__jsonparse_array_sep_right_str + } \bool_if:NTF \l__jsonparse_rescan_bool { - \tl_set:Nn \JSONParseArrayValue { \exp_args:Ne \__jsonparse_rescan:n { \prop_item:Nn #2 {##1} } } + \tl_gset:Nn \JSONParseArrayValue { + \exp_args:Ne \__jsonparse_rescan:n { + \prop_item:Ne \l__jsonparse_temp_tl { + \l__jsonparse_array_sep_left_str + \bool_if:NTF \l__jsonparse_zero_based_bool { + \int_eval:n { ##1 - 1 } + } { + ##1 + } + \l__jsonparse_array_sep_right_str + } + } + } } { - \tl_set:Nn \JSONParseArrayValue { \prop_item:Nn #2 {##1} } + \tl_gset:Ne \JSONParseArrayValue { + \prop_item:Ne \l__jsonparse_temp_tl { + \l__jsonparse_array_sep_left_str + \bool_if:NTF \l__jsonparse_zero_based_bool { + \int_eval:n { ##1 - 1 } + } { + ##1 + } + \l__jsonparse_array_sep_right_str + } + } } - \use:c {#5} } - } - \group_end: + \int_compare:nNnT {##1} = { \l__jsonparse_array_count_int } { + \tl_gset:Nn \JSONParseArrayNewline { } + } + \use:c {#5} + } + #7 + \group_end: } % EOF diff --git a/macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-1.ogg b/macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-1.ogg Binary files differindex bdf7b5f7cc..cc0ac97383 100644 --- a/macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/Example/example-spel/1.0.0.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-1.ogg b/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-1.ogg Binary files differindex f8fae21be9..d3e307663a 100644 --- a/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-2.ogg b/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-2.ogg Binary files differindex 96b69ea840..cc3d6f6140 100644 --- a/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-3.ogg b/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-3.ogg Binary files differindex d60e2ba905..1ff0bad991 100644 --- a/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/Example/example-spel/2.1.0.0.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0-1.ogg b/macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0-1.ogg Binary files differindex f794c8140b..7e4a820b0d 100644 --- a/macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/Example/example-spel/2.3.0.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/Example/example.pdf b/macros/latex/contrib/spelatex/Example/example.pdf Binary files differindex cf3f1d79db..002b9816e1 100644 --- a/macros/latex/contrib/spelatex/Example/example.pdf +++ b/macros/latex/contrib/spelatex/Example/example.pdf diff --git a/macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-1.ogg Binary files differindex d45b7eb367..0596f06bbb 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/0.0.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-1.ogg Binary files differindex 706d7fec65..f0194764e3 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-2.ogg Binary files differindex f451a0ddd4..2af4750075 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-3.ogg Binary files differindex fd7fb39aaf..58ebce6cbd 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.1.0.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-1.ogg Binary files differindex 67b45b1f3a..96a05bf03f 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-2.ogg Binary files differindex c3aa2bfcc9..bece48eafa 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-3.ogg Binary files differindex 3c4db3afde..902435b2b8 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.2.1.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-1.ogg Binary files differindex cefdd66a35..f516bba0b6 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-2.ogg Binary files differindex e475a09b0b..1ce32adf2d 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.2.2.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-1.ogg Binary files differindex 46124694f5..121ad080df 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-10.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-10.ogg Binary files differindex 316674ba27..2d6f1219c9 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-10.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-10.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-11.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-11.ogg Binary files differindex e845fbfbb0..308152e10c 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-11.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-11.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-2.ogg Binary files differindex 727787fc27..ea679aff58 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-3.ogg Binary files differindex eb32419d97..6d18873f65 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-4.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-4.ogg Binary files differindex b31204ccb8..d91b0a075a 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-4.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-4.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-8.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-8.ogg Binary files differindex 8c33f3cc8c..3875e79c5a 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-8.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-8.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-9.ogg b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-9.ogg Binary files differindex 13b95ad07c..a8fde7a44e 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-9.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/1.3.0.0.0-9.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.m3u b/macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.m3u index 1487f62e77..a637467d28 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.m3u +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.0.0.0.0.m3u @@ -9,12 +9,14 @@ https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0 https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-5.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-1.ogg +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-2.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg -https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-3.ogg +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-4.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-6.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-1.ogg Binary files differindex 3d4b783af4..83ac3316b8 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg Binary files differindex 129d9995f6..0348deb29d 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.m3u b/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.m3u index a090328aba..296094a70d 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.m3u +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0.m3u @@ -7,4 +7,5 @@ https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0 https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-4.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-5.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.1.0.0.0-6.ogg -https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-1.ogg
\ No newline at end of file +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-1.ogg +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg
\ No newline at end of file diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.m3u b/macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.m3u index 8cc006355c..ec97d1b98f 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.m3u +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.0.0.0.m3u @@ -5,7 +5,8 @@ https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0 https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-2.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg -https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-3.ogg +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-4.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-6.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg Binary files differindex 4627fc6c64..3d4f89fadf 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg Binary files differindex d51010f671..355172e89d 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg Binary files differindex 3730a263a0..dd7b27ecc7 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg Binary files differindex f6d2ec2a3d..12303266f4 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-8.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-8.ogg Binary files differindex 882271a2f9..85a9734365 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-8.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-8.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.m3u b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.m3u index d13d4ba944..7cb5682e5b 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.m3u +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0.m3u @@ -4,7 +4,8 @@ https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0 https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-1.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-2.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-3.ogg -https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-3.ogg +https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/footnote-4.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-4.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-5.ogg https://ctan.org/tex-archive/macros/latex/contrib/spelatex/spelatex-spel/2.2.1.0.0-6.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-1.ogg Binary files differindex c8fa8ecb58..d844ed9d1e 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-2.ogg Binary files differindex 4467facf76..cd2856bc46 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-3.ogg Binary files differindex 6c30d096f0..43a28cfb0c 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.2.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-1.ogg Binary files differindex 6fd74fd9f5..a99ba7689d 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-2.ogg Binary files differindex 95ffb0b988..d311b1a572 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-5.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-5.ogg Binary files differindex ca7c035dc6..66c0c266a8 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-5.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-5.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-6.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-6.ogg Binary files differindex e7f7528a6c..0b37d3daf4 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-6.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.3.0.0-6.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-1.ogg Binary files differindex 77e5806347..eb761b9689 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-2.ogg Binary files differindex cef6b409c5..fc28e9115b 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-3.ogg Binary files differindex ca8effdb4d..5f7de20d02 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.2.4.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-1.ogg Binary files differindex 920c695ba0..eadac92031 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-2.ogg Binary files differindex 1401ff6b3a..28ddb1cbc6 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.3.0.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-1.ogg Binary files differindex 608c52f217..95fdcca17f 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/2.4.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-1.ogg Binary files differindex ead0073e85..bb5b47e77a 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-2.ogg Binary files differindex f0baab0387..95ddea0872 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-3.ogg Binary files differindex 0c218c7956..1c1e04dca8 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.1.0.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-1.ogg Binary files differindex 455c142159..b09f0e9da7 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-2.ogg Binary files differindex 292deb50b5..cd82a168e6 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-3.ogg Binary files differindex e151c0003f..ce197d5d07 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-4.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-4.ogg Binary files differindex 60b2302847..0158aa1a25 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-4.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-4.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-5.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-5.ogg Binary files differindex 701953fdc4..03ad4013e4 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-5.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.2.1.0.0-5.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-3.ogg Binary files differindex 49f1d3f79f..740b113f76 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-6.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-6.ogg Binary files differindex 85e7c5a0bb..9f57ec1746 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-6.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.2.2.0.0-6.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0-1.ogg Binary files differindex 8ee26f5c14..b26bdeb2dd 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.3.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-1.ogg Binary files differindex 1a5e199543..2f1cd79c68 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-2.ogg Binary files differindex 0c1243bb5e..9c661de201 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-3.ogg Binary files differindex e569e88aef..677b6c81b7 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/3.4.0.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-2.ogg Binary files differindex 61b116002e..52cfa6538b 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.0.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-1.ogg Binary files differindex 75fd27a313..b2372b8993 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-2.ogg Binary files differindex 346cefc755..b9a7aeb8bd 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.1.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-1.ogg Binary files differindex 7275f04af9..ea5c6aba0e 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-2.ogg Binary files differindex 5f7ea29e9e..e4c713fe08 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.2.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-1.ogg Binary files differindex 4af0644be6..f7cd56b794 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-2.ogg Binary files differindex 70429b98f6..a4a1f7a5d3 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.4.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-1.ogg Binary files differindex 125b5c53e8..9cb84600f8 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-2.ogg Binary files differindex 4d1fde8824..1282cf646f 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-3.ogg Binary files differindex 350142b864..1eb5d06cf5 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/4.1.7.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-1.ogg Binary files differindex 54745ef221..da959c392b 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-2.ogg Binary files differindex dac080258c..44ec885932 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-3.ogg Binary files differindex 7b28b18fbc..84805426f7 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-3.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/6.2.1.0.0-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-1.ogg b/macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-1.ogg Binary files differindex d3443b1947..018eaedf09 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-1.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/6.6.2.0.0-1.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-5.ogg b/macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-5.ogg Binary files differindex 2b1f795b1a..d6c36c73e1 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-5.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/6.7.0.0.0-5.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/date.ogg b/macros/latex/contrib/spelatex/spelatex-spel/date.ogg Binary files differindex 6ae2a6fd24..60d079af3b 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/date.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/date.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg b/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg Binary files differindex cfea7a5f06..578bd9e634 100644 --- a/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg +++ b/macros/latex/contrib/spelatex/spelatex-spel/footnote-2.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/footnote-3.ogg b/macros/latex/contrib/spelatex/spelatex-spel/footnote-3.ogg Binary files differnew file mode 100644 index 0000000000..cfea7a5f06 --- /dev/null +++ b/macros/latex/contrib/spelatex/spelatex-spel/footnote-3.ogg diff --git a/macros/latex/contrib/spelatex/spelatex-spel/footnote-4.ogg b/macros/latex/contrib/spelatex/spelatex-spel/footnote-4.ogg Binary files differnew file mode 100644 index 0000000000..cfea7a5f06 --- /dev/null +++ b/macros/latex/contrib/spelatex/spelatex-spel/footnote-4.ogg diff --git a/macros/latex/contrib/spelatex/spelatex.dtx b/macros/latex/contrib/spelatex/spelatex.dtx index 68962e505b..46946464c5 100644 --- a/macros/latex/contrib/spelatex/spelatex.dtx +++ b/macros/latex/contrib/spelatex/spelatex.dtx @@ -32,12 +32,13 @@ \ProvidesFile{spelatex.dtx} %</driver> %<*package> - [2024/10/23 v0.93 SpeLaTeX - Speech-enabled LaTeX (DMW and LVP)] + [2024/11/01 v0.94 SpeLaTeX - Speech-enabled LaTeX (DMW and LVP)] %</package> -\def\fileversion{0.93} -\def\filedate{2024/10/23} +\def\fileversion{0.94} +\def\filedate{2024/11/01} %<*driver> -\documentclass[10pt]{ltxdoc} +\documentclass[11pt,a4paper]{ltxdoc} +\usepackage[margin=1in,left=2in]{geometry} \usepackage{makeidx} \usepackage{alltt} \usepackage[english]{babel} @@ -56,6 +57,12 @@ \StopEventually{\PrintChanges\PrintIndex} \spelmacad{DescribeEnv}[1]{#1} \spelmacad{DescribeMacro}[1]{#1} +\def\MacroFont{\footnotesize + \usefont\encodingdefault + \ttdefault + \mddefault + \shapedefault +}% \begin{document} \DocInput{spelatex.dtx} \end{document} @@ -91,6 +98,14 @@ % - introduced markers for non-area-links\\ % - implemented audio on server\\ % - implemented <\kern-0.5ex<\kern-0.5ex<-macro as a shorthand} +% \changes{v0.93}{2024/10/23}{. Major overhaul:\\ +% - improvements to allow for TeX-ing of full course of Walter\\ +% - introduced shorthand macro \textbackslash<<<\\ +% - switching between math and text mode fixed} +% \changes{v0.94}{2024/11/01}{. Bug fixes for TUGboat article +% - removed all 'dropped character warnings' +% - the logo now has a hyphenation point +% - increased font size of documentation} % % \GetFileInfo{spelatex.dtx} % @@ -305,7 +320,7 @@ % way to go, in order to bundle the efforts % for a better speech-enabled \LaTeX{}. % } -% \clearpage +% % \section{Introduction} % % \subsection{Target audience} @@ -958,8 +973,8 @@ % % \subsubsection{Use the shorthand \texttt{\textbackslash <<<}-macro} % -% \<<<{ % \DescribeMacro{\<<<} +% \<<<{ % This macro takes the text to be read-out loud as an % argument. It is a shorthand for the |spelchunk| % environment. Options you would have given to the |spelchunk| @@ -1614,6 +1629,7 @@ % text). % \end{spelchunk} % +% % \iffalse % \begin{macrocode} %<*package> @@ -1676,7 +1692,7 @@ % \begin{macro}{\spelatex} % This is the official \spelatex{} logo. % \begin{macrocode} -\DeclareRobustCommand{\spelatex}{S\kern-0.3ex\raisebox{-0.1ex}{\rotatebox{-15}{p}}\kern-0.25ex\raisebox{0.1ex}{\rotatebox{10}{e}}\kern-0.1ex\LaTeX} +\DeclareRobustCommand{\spelatex}{S\kern-0.3ex\raisebox{-0.1ex}{\rotatebox{-15}{p}}\kern-0.25ex\raisebox{0.1ex}{\rotatebox{10}{e}}\kern-0.1ex\-\LaTeX} % \end{macrocode} % \end{macro} % \begin{macro}{\spelpl} @@ -2009,7 +2025,8 @@ \href{\linksdir/\spel@@optpart\thesubparagraph.\spel@format}{#8}\hfill% \href{\linksdir/\spel@@optpart\thesubparagraph.m3u} {\textcolor{spel@color@right}{$\triangleright$}}}% - \def\spel@@label{\ifnum #2>\c@secnumdepth paragraph\else#1 \csname the#1\endcsname\fi} + \def\spel@@label{% + \ifnum #2>\c@secnumdepth paragraph\else#1 \csname the#1\endcsname\fi} \spel@idxwrite{\spel@@label}{\spel@@optpart\thesubparagraph}% \spel@chunkwrite{\spel@@optpart\thesubparagraph}{#8}% } @@ -2026,8 +2043,8 @@ \stepcounter{spel@ssect}% %\setcounter{spel@chunk}{0}% need this because counter resetting fails \spel@@ssect{#1}{#2}{#3}{#4}{% - \href{\linksdir/\spel@@optpart\thesubparagraph-star-\thespel@ssect.\spel@format}% - {#5}}% +\href{\linksdir/\spel@@optpart\thesubparagraph-star-\thespel@ssect.\spel@format}% + {#5}}% \spel@idxwrite{section}{\spel@@optpart\thesubparagraph-star-\thespel@ssect}% \spel@chunkwrite{\spel@@optpart\thesubparagraph-star-\thespel@ssect}{#5}% } @@ -2049,7 +2066,8 @@ \settowidth\spel@mptboxwidth{\usebox\spel@mptbox}% \spel@@fntext{% \hspace*{-\spel@mptboxwidth}% - \href{\linksdir/footnote-\thespel@footnote.\spel@format}{\usebox\spel@mptbox}#1}% + \href{\linksdir/footnote-\thespel@footnote.\spel@format} + {\usebox\spel@mptbox}#1}% \spel@idxwrite{footnote}{footnote-\thespel@footnote}% \spel@chunkwrite{footnote-\thespel@footnote}{#1}% } @@ -2090,7 +2108,9 @@ \settowidth\spel@mptboxwidth{\usebox\spel@mptbox}% \spel@idxwrite{item}{\spel@@optpart\thesubparagraph-\thespel@chunk}% \spel@chunkwrite{\spel@@optpart\thesubparagraph-\thespel@chunk}{#1}% - \item \hspace*{-\spel@mptboxwidth}\href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format}{\usebox\spel@mptbox}#1} + \item \hspace*{-\spel@mptboxwidth}% + \href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format} + {\usebox\spel@mptbox}#1} % \end{macrocode} % \end{macro} % @@ -2103,7 +2123,9 @@ \settowidth\spel@mptboxwidth{\usebox\spel@mptbox}% \spel@idxwrite{item}{\spel@@optpart\thesubparagraph-\thespel@chunk}% \spel@chunkwrite{\spel@@optpart\thesubparagraph-\thespel@chunk}{#1 . #2}% -\item[#1] \hspace*{-\spel@mptboxwidth}\href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format}{\usebox\spel@mptbox}#2} + \item[#1] \hspace*{-\spel@mptboxwidth}% + \href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format} + {\usebox\spel@mptbox}#2} % \end{macrocode} % \end{macro} % @@ -2119,8 +2141,8 @@ \spel@idxwrite{caption}{\spel@@optpart\thesubparagraph-\thespel@chunk}% \spel@chunkwrite{\spel@@optpart\thesubparagraph-\thespel@chunk}{#2}% \caption[#1]{% - \protect\href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format} - {#2}} +\protect\href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format} + {#2}} } \fi % \end{macrocode} @@ -2215,7 +2237,8 @@ \newlength\spel@mptboxwidth \newsavebox\spel@mptbox \savebox\spel@mptbox{% - \textcolor{spel@color@left}{\quad\strut\tiny\raisebox{0.4ex}{$\triangleright$}\,}% + \textcolor{spel@color@left} + {\quad\strut\tiny\raisebox{0.4ex}{$\triangleright$}\,}% } \newif\ifspel@chunkarealink \define@key{spelchunk}{arealink}[]{\spel@chunkarealinktrue} @@ -2229,8 +2252,8 @@ \@ifnextchar[{\catcode`\^^M=5\spelchunk@opt}{\catcode`\^^M=5\spelchunk@int}}% \fi \ifspel@disabled\def\endspelchunk{}\else -\def\endspelchunk{% - \end{VerbatimOut}% +\def\endspelchunk{ + \end{VerbatimOut} \catcode`\^^M=5\relax% \ifspel@chunkarealink% \href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format} @@ -2239,7 +2262,8 @@ \settowidth\spel@mptboxwidth{\usebox\spel@mptbox}% \hspace*{-\spel@mptboxwidth}% \href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format} - {\usebox\spel@mptbox}\input{./\chunkdir/\spel@@optpart\thesubparagraph-\thespel@chunk}% + {\usebox\spel@mptbox}% + \input{./\chunkdir/\spel@@optpart\thesubparagraph-\thespel@chunk}% \fi% \spel@chunkarealinkfalse% }% @@ -2250,7 +2274,7 @@ % The environment above checks if it is called with optional arguments % or not. % \begin{macro}{\spelchunk@opt} -% This is macro that deals with the optional arguments of the +% This is macro that deals with the oatptional arguments of the % |spelchunk| envronment. % \begin{macrocode} \def\spelchunk@opt[#1]{\setkeys{spelchunk}{#1}\spelchunk@int} @@ -2270,19 +2294,18 @@ % \end{macro} % % \begin{macrocode} -\ExplSyntaxOn -\NewDocumentCommand{\spelchunkatom}{O{}m}{% +\NewDocumentCommand{\spelchunkatom}{O{}+m}{% \ifspel@disabled #2\else% \stepcounter{spel@chunk}% \spel@idxwrite{chunk}{\spel@@optpart\thesubparagraph-\thespel@chunk}% \setkeys{spelchunk}{#1}% + \makeatletter% \scantokens{% - \makeatletter% - \begin{spelverbatimwrite}{\chunkdir/\spel@@optpart\thesubparagraph-\thespel@chunk.tex} - #2 - \end{spelverbatimwrite} - \makeatother +\begin{spelverbatimwrite}{\chunkdir/\spel@@optpart\thesubparagraph-\thespel@chunk.tex} + #2 +\end{spelverbatimwrite} }% + \makeatother \ifspel@chunkarealink% \href{\linksdir/\spel@@optpart\thesubparagraph-\thespel@chunk.\spel@format} {\input{./\chunkdir/\spel@@optpart\thesubparagraph-\thespel@chunk}}% @@ -2297,18 +2320,18 @@ } \def\spelverbatimwrite#1{% - \@bsphack + \@bsphack% \openoutputfile{#1}{chunk}% \def\verbatim@processline{\addtostream{chunk}{\the\verbatim@line}}% \let\do\@makeother\dospecials \catcode`\^^M\active \catcode`\^^I=12 \verbatim@start}% \def\endspelverbatimwrite{ - \closeoutputstream{chunk}% - \@esphack% + \verbatim@finish + \closeoutputstream{chunk} + \@esphack } \def\<<<{\spelchunkatom} -\ExplSyntaxOff % \end{macrocode} % % \subsubsection{Explicit spelchunks} diff --git a/macros/latex/contrib/spelatex/spelatex.pdf b/macros/latex/contrib/spelatex/spelatex.pdf Binary files differindex 957c6dd72f..1d4724a231 100644 --- a/macros/latex/contrib/spelatex/spelatex.pdf +++ b/macros/latex/contrib/spelatex/spelatex.pdf diff --git a/macros/latex/required/amsmath/README.md b/macros/latex/required/amsmath/README.md index 38e4da1427..d3432970d2 100644 --- a/macros/latex/required/amsmath/README.md +++ b/macros/latex/required/amsmath/README.md @@ -1,7 +1,7 @@ The amsmath bundle for LaTeX ============================ -Release 2024-06-01 patch level 0 +Release 2024-11-01 Overview -------- diff --git a/macros/latex/required/amsmath/amsbsy.pdf b/macros/latex/required/amsmath/amsbsy.pdf Binary files differindex 28e261f75d..4e33855357 100644 --- a/macros/latex/required/amsmath/amsbsy.pdf +++ b/macros/latex/required/amsmath/amsbsy.pdf diff --git a/macros/latex/required/amsmath/amscd.pdf b/macros/latex/required/amsmath/amscd.pdf Binary files differindex 7f052e0bda..46c639df89 100644 --- a/macros/latex/required/amsmath/amscd.pdf +++ b/macros/latex/required/amsmath/amscd.pdf diff --git a/macros/latex/required/amsmath/amsgen.pdf b/macros/latex/required/amsmath/amsgen.pdf Binary files differindex 230bbd5e06..930477d17c 100644 --- a/macros/latex/required/amsmath/amsgen.pdf +++ b/macros/latex/required/amsmath/amsgen.pdf diff --git a/macros/latex/required/amsmath/amsldoc.pdf b/macros/latex/required/amsmath/amsldoc.pdf Binary files differindex 87aff77bd5..e600454b7a 100644 --- a/macros/latex/required/amsmath/amsldoc.pdf +++ b/macros/latex/required/amsmath/amsldoc.pdf diff --git a/macros/latex/required/amsmath/amsmath.dtx b/macros/latex/required/amsmath/amsmath.dtx index ec44957a89..9d45cc2f9d 100644 --- a/macros/latex/required/amsmath/amsmath.dtx +++ b/macros/latex/required/amsmath/amsmath.dtx @@ -81,11 +81,11 @@ Bug reports can be opened (category \texttt{#1}) at\\% % \begin{macrocode} \DeclareRelease{}{1994-06-01}{amsmath-2018-12-01.sty} \DeclareRelease{}{2018-12-01}{amsmath-2018-12-01.sty} -\DeclareCurrentRelease{}{2019-04-01} +\DeclareCurrentRelease{}{2024-10-30} % \end{macrocode} % % \begin{macrocode} -\ProvidesPackage{amsmath}[2024/05/23 v2.17q AMS math features] +\ProvidesPackage{amsmath}[2024/10/30 v2.17s AMS math features] % \end{macrocode} % % \section{Catcode defenses} @@ -166,7 +166,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Flush-left equations [DMJ]} % -% The left margin of math enviroments is controlled by +% The left margin of math environments is controlled by % \cs{@mathmargin}. This can be set to \cs{@centering} to % implement the default behaviour, i.e., centered equations, and to % something else to implement the flushleft style. @@ -208,7 +208,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % % The next question is what happens when amsmath is used with % one of the standard classes. Unfortunately, \latex/ implements -% \opt{fleqn} somewhat clumsily; instead of paramaterizing the +% \opt{fleqn} somewhat clumsily; instead of parameterizing the % definitions of the math structures (as I've attempted to do % here), \fn{fleqn.clo} declares a dimen \cn{mathindent} that is % much like my \cs{@mathmargin} and then redefines \cn\[, \cn\], @@ -653,7 +653,7 @@ Foreign command \@backslashchar#1;\MessageBreak % % the |withdelims| primitives do not work in xetex with OpenType % fonts, and the relevant font dimen parameters are often not set -% in luatex as theer are no matching values in the OpenType Math +% in luatex as there are no matching values in the OpenType Math % table, so here we use variants that use the font parameters if % they are set, but scale using |\left\right| rather than the % |withdelims| primitives. @@ -1002,6 +1002,10 @@ Foreign command \@backslashchar#1;\MessageBreak \let\DOTSI\relax \let\DOTSB\relax \let\DOTSX\relax +% \end{macrocode} +% In the definitions below, special \cs{uccode}s are used to generate macros +% with arguments delimited by catcode 12 letters as returned by \cs{meaning}. +% \begin{macrocode} {\uccode`7=`\\ \uccode`8=`m \uccode`9=`a \uccode`0=`t \uccode`!=`h \uppercase{% \gdef\math@#1#2#3#4#5#6\math@{\gtest@false\ifx 7#1\ifx 8#2% @@ -1039,6 +1043,13 @@ Foreign command \@backslashchar#1;\MessageBreak } \fi % \end{macrocode} +% \changes{v2.17s}{2024/10/30}{guard against primitive if (gh/1448)} +% \begin{macrocode} +{\uccode`7=`\\ \uccode`(=`i \uccode`)=`f + \uppercase{\gdef\testif@#1#2#3#4\testif@{% + \ifx7#1\ifx(#2\ifx)#3\@tempswafalse\fi\fi\fi} +}} +% \end{macrocode} % \begin{macrocode} \newcount\classnum@ \def\getmathch@#1.#2\getmathch@{\classnum@#1 \divide\classnum@4096 @@ -1087,6 +1098,14 @@ Foreign command \@backslashchar#1;\MessageBreak \ifx9#2 \@xp\@xp\@xp\zap@to@space\fi}}} \def\zap@to@space#1 {} % \end{macrocode} +% +% \changes{v2.17r}{2024/06/29}{macro added to strip \cs{protected} (gh/1265)} +% \begin{macrocode} +{\uccode`9=`\p % + \uppercase{\gdef\stripprotected@#1#2#3\relax{% + \ifx9#2 \@xp\@xp\@xp\zap@to@space\fi}}} +% \end{macrocode} +% % \begin{macrocode} \def\keybin@{\gtest@true \ifx\@let@token+\else\ifx\@let@token=\else @@ -1139,15 +1158,43 @@ Foreign command \@backslashchar#1;\MessageBreak \gdef\thedots@{\dotsb@}% \else % \end{macrocode} -% \changes{v2.15d}{2016/06/28}{Add space token to prevent runaway argument error} +% In case \cs{@let@token} is a robust \LaTeXe{} command, i.e., +% expands to \cs{protect} +% \verb*=\somename =, we save the \cs{meaning} of +% \verb*=\somename = in \cs{meaning@} (possibly followed by some dots that have +% not been consumed as arguments during the expansion). +% Otherwise, we save the +% \cs{meaning} of \cs{@let@token} in \cs{meaning@}. The dots at the end +% as well as the space are +% used in later parts of the checking (this could probably be cleaned up a bit). +% \changes{v2.15d}{2016/06/28}{Add space token to prevent runaway +% argument error} +% \changes{v2.17r}{2024/06/29}{Drop \cs{protect} if present (gh/1265)} +% \changes{v2.17s}{2024/10/30}{skip protect testif detect primitive if (gh/1448)} % \begin{macrocode} \xdef\meaning@{\meaning\@let@token. .........}% -% \end{macrocode} -% In previous versions \verb|\long| macros were not seen by the lokkahead. + \@tempswatrue + \@xp\testif@\meaning@....\testif@ + \if@tempswa + \begingroup + \def\protect{\protect}% % make it a quark + \xdef\meaning@{\@xp\stripprotect@\@let@token.........\stripprotect@. .........}% + \endgroup + \fi +% \end{macrocode} +% In previous versions \verb|\long| macros were not seen by the lookahead. % That was bad as this file uses \verb|\(re)newcommand| for \verb|\implies| etc. % \begin{macrocode} \xdef\meaning@@{\@xp\striplong@\meaning@\relax\meaning@}% % \end{macrocode} +% Until now \cs{protected} macros also stopped the lookahead, e.g., +% $\cong$ wasn't recognized correctly for that reason. +% +% \changes{v2.17r}{2024/06/29}{Handle \cs{protected} macros in +% lookahead for dots (gh/1265)} +% \begin{macrocode} + \xdef\meaning@@{\@xp\stripprotected@\meaning@@\relax\meaning@@}% +% \end{macrocode} % \begin{macrocode} \@xp\math@\meaning@\math@ \ifgtest@ % if \mathxxx test @@ -1208,6 +1255,15 @@ Foreign command \@backslashchar#1;\MessageBreak \thedots@} % \end{macrocode} % +% The helper to generate the meaning of \cs{\@let@token}, or of its +% first-level expansion with \cs{protect} removed. +% \changes{v2.17r}{2024/06/29}{Drop \cs{protect} if present (gh/1265)} +% \begin{macrocode} +\def\stripprotect@#1#2\stripprotect@{\ifx#1\protect + \meaning#2\else \meaning\@let@token \fi} + +% \end{macrocode} +% % The \qc{\=} character is necessary in the two \cs{let} assignments % in \cs{boldsymboldots@}, because the symbol we are making % bold might be an \qc{\=} sign. @@ -3363,7 +3419,7 @@ ill-advised in LaTeX.% % \end{macro} % % \begin{macro}{\column@plus} -% \cs{\column@plus} is a useful abbreviation. +% \cs{column@plus} is a useful abbreviation. % \begin{macrocode} \def\column@plus{% \global\advance\column@\@ne @@ -3786,7 +3842,7 @@ and fix things up.} % (In earlier versions of the code anything other than \texttt{b} % or \texttt{t} was interpreted as \texttt{c} and the data was % otherwise dropped.) -% \changes{v2.17g}{2020/03/10}{Explicity test for b/t/c and return +% \changes{v2.17g}{2020/03/10}{Explicitly test for b/t/c and return % optional argument is different (gh/5)} % \begin{macrocode} \def\ams@start@box#1{% @@ -3919,7 +3975,7 @@ and fix things up.} % \end{macrocode} % If we picked up a bracket group by mistake here is the place to % return it for processing. -% \changes{v2.17g}{2020/03/10}{Explicity test for b/t/c and return +% \changes{v2.17g}{2020/03/10}{Explicitly test for b/t/c and return % optional argument is different (gh/5)} % \begin{macrocode} \ams@return@opt@arg @@ -4018,7 +4074,7 @@ and fix things up.} \crcr % \end{macrocode} % And put a mistaking picked up bracket group back: -% \changes{v2.17g}{2020/03/10}{Explicity test for b/t/c and return +% \changes{v2.17g}{2020/03/10}{Explicitly test for b/t/c and return % optional argument is different (gh/5)} % \begin{macrocode} \ams@return@opt@arg @@ -4592,7 +4648,7 @@ trying to recover with `aligned'% % \env{alignat} (i.e., the $n$th field of \cs{maxcolumn@widths}.) % It expands to a \<dimen>, so it can be used as the right-hand % side of a \<variable assignment> or \<arithmetic> statement. -% It's argument can be any \<number>, \<integer variable> or macro +% Its argument can be any \<number>, \<integer variable> or macro % that expands to one of these. [Check to make sure this is true.] % % This is subtler than it looks. @@ -5041,7 +5097,7 @@ trying to recover with `aligned'% % Next we consider the case when equations are flush-left, but tags % are on the right. This case is somewhat more complicated than % the previous one, since we can adjust the right margin by varying -% the inter-align separatin. Thus, when a tag is found to be too +% the inter-align separation. Thus, when a tag is found to be too % close to its equation, we first attempt to decrease % \cs{alignsep@} enough to move the equation off to an acceptable % distance. Only if that would require a value of \cs{alignsep@} @@ -5078,7 +5134,7 @@ trying to recover with `aligned'% % \cs{alignsep@} are both~0. To get the number of align % structures, we first count the number of columns by counting the % number of entries in the \cs{fieldlengths@} for the current row. -% The effective length is calcuated by \cs{x@rcalc@width} and put +% The effective length is calculated by \cs{x@rcalc@width} and put % in the temporary register \cs{@tempdimc}, using \cs{@tempdimb} as % an auxiliary variable. % \begin{macrocode} @@ -5500,7 +5556,7 @@ trying to recover with `aligned'% % might occur at the beginning of the current line. More % specifically, we first set \cs{count@} equal to the number of % interalign spaces preceding the current field (namely, $\lfloor -% (\cs{\column@}-1)/2 \rfloor$), and then subtract \cs{count@} from +% (\cs{column@}-1)/2 \rfloor$), and then subtract \cs{count@} from % both \cs{@tempcnta} and \cs{@tempcntb}. The rationale is that % for the purposes of adjusting the spacing between the tag and the % equation, the only flexible interalign spaces are those after @@ -5523,7 +5579,7 @@ trying to recover with `aligned'% % \end{macro} % % \begin{macro}{\place@tag} -% \cs{place@tag} takes care of the placment of tags in the +% \cs{place@tag} takes care of the placement of tags in the % \env{align} environments. % \begin{macrocode} \def\place@tag{% @@ -6187,7 +6243,7 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}% % in his \fn{amstex.doc} Spivak indicates those commands should never % be used on a first or last line. Perhaps better to leave the % question open unless/until real-life examples turn up. -% \changes{v2.17m}{2022/02/03}{Make \cs{shoveright} robust (if def is not trival)} +% \changes{v2.17m}{2022/02/03}{Make \cs{shoveright} robust (if def is not trivial)} % \begin{macrocode} \iftagsleft@ \protected\def\shoveright#1{% @@ -6212,7 +6268,7 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}% } \fi % \end{macrocode} -% \changes{v2.17m}{2022/02/03}{Make \cs{shoveleft} robust (if def is not trival)} +% \changes{v2.17m}{2022/02/03}{Make \cs{shoveleft} robust (if def is not trivial)} % \begin{macrocode} \if@fleqn \def\shoveleft#1{#1}% @@ -6576,14 +6632,14 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}% \def\mathdisplay@@pop{\the\mathdisplay@stack} % \end{macrocode} %\changes{v2.17k}{2021/08/24}{Move the counter inside the equation and guard -% with a mathopen for better compability with hyperref, issue gh/652} +% with a mathopen for better compatibility with hyperref, issue gh/652} % As with hyperref incrementing the counter creates a box to raise the anchor % it should be in a place where is doesn't affect spacing. % Currently the code from hyperref is used to avoid this problem: % If fleqn isn't active the counter is set inside the equation and the potential % box guarded by a mathopen to avoid side effects on following unary symbols. % If fleqn is activated it has to be outside to avoid problems with labels. -% This solution is temporary and not necessarly the best. +% This solution is temporary and not necessarily the best. % \begin{macrocode} \if@fleqn \renewenvironment{equation}{% @@ -6637,7 +6693,7 @@ Cannot use `split' here;\MessageBreak trying to recover with `aligned'}% % % \section{Credits} % -% Much of the code for the \pkg{amsmath} package had its orgin in +% Much of the code for the \pkg{amsmath} package had its origin in % \fn{amstex.tex}, written by Michael Spivak. The initial work of % porting \fn{amstex.tex} to \fn{amstex.sty} was done in 1988--1989 % by Frank Mittelbach and Rainer Sch\"opf. In 1994 David M. Jones diff --git a/macros/latex/required/amsmath/amsmath.pdf b/macros/latex/required/amsmath/amsmath.pdf Binary files differindex 185206a8b2..838fe9ccb0 100644 --- a/macros/latex/required/amsmath/amsmath.pdf +++ b/macros/latex/required/amsmath/amsmath.pdf diff --git a/macros/latex/required/amsmath/amsopn.pdf b/macros/latex/required/amsmath/amsopn.pdf Binary files differindex a6901ac7c4..9798217f6b 100644 --- a/macros/latex/required/amsmath/amsopn.pdf +++ b/macros/latex/required/amsmath/amsopn.pdf diff --git a/macros/latex/required/amsmath/amstext.pdf b/macros/latex/required/amsmath/amstext.pdf Binary files differindex 6735db64f6..792b7e3dea 100644 --- a/macros/latex/required/amsmath/amstext.pdf +++ b/macros/latex/required/amsmath/amstext.pdf diff --git a/macros/latex/required/amsmath/amsxtra.pdf b/macros/latex/required/amsmath/amsxtra.pdf Binary files differindex 7df65cd7f9..b5815f1f81 100644 --- a/macros/latex/required/amsmath/amsxtra.pdf +++ b/macros/latex/required/amsmath/amsxtra.pdf diff --git a/macros/latex/required/amsmath/changes.txt b/macros/latex/required/amsmath/changes.txt index 588e7d36d0..170c7fe0d7 100644 --- a/macros/latex/required/amsmath/changes.txt +++ b/macros/latex/required/amsmath/changes.txt @@ -3,7 +3,17 @@ All changes above are only part of the development branch for the next release. ================================================================================ ######################### -# 2023-11-01 Release +# 2024-11-01 Release +######################### + +2024-08-02 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * amsmath.dtx (section{Ellipsis dots}): + Support special \dots magic in case of robust symbols protected with + \protected or via \DeclareRobustCommand (gh/1265) + +######################### +# 2024-06-01 Release ######################### 2024-05-23 Frank Mittelbach <Frank.Mittelbach@latex-project.org> diff --git a/macros/latex/required/amsmath/subeqn.pdf b/macros/latex/required/amsmath/subeqn.pdf Binary files differindex 18be7c3be5..d8cc65b799 100644 --- a/macros/latex/required/amsmath/subeqn.pdf +++ b/macros/latex/required/amsmath/subeqn.pdf diff --git a/macros/latex/required/amsmath/technote.pdf b/macros/latex/required/amsmath/technote.pdf Binary files differindex a563ee67d6..0961de1fd4 100644 --- a/macros/latex/required/amsmath/technote.pdf +++ b/macros/latex/required/amsmath/technote.pdf diff --git a/macros/latex/required/amsmath/testmath.pdf b/macros/latex/required/amsmath/testmath.pdf Binary files differindex 1c4a265eb3..7ddc2526f1 100644 --- a/macros/latex/required/amsmath/testmath.pdf +++ b/macros/latex/required/amsmath/testmath.pdf diff --git a/macros/latex/required/firstaid/changes.txt b/macros/latex/required/firstaid/changes.txt index cbabfcbb72..5bfe7f1a53 100644 --- a/macros/latex/required/firstaid/changes.txt +++ b/macros/latex/required/firstaid/changes.txt @@ -1,3 +1,8 @@ +2024-10-16 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + + * latex2e-first-aid-for-external-files.dtx: extend firstaid for cleveref + for issue #1393 and longtable. + 2024-06-25 David Carlisle <David.Carlisle@latex-project.org> * latex2e-first-aid-for-external-files.dtx: add firstaid for arydshln diff --git a/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx b/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx index 5615d3f697..68877bc24d 100644 --- a/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx +++ b/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.dtx @@ -111,8 +111,8 @@ % \end{macrocode} % % \begin{macrocode} -\def\LaTeXFirstAidDate{2024/06/25} -\def\LaTeXFirstAidVersion{v1.1f} +\def\LaTeXFirstAidDate{2024/10/16} +\def\LaTeXFirstAidVersion{v1.1g} % \end{macrocode} % % \begin{macrocode} @@ -343,7 +343,7 @@ % It will be replaced when the ``configuration points'' interface % for \LaTeX{} becomes available. At that point the package will be % able to set up a different strategy for doing shipouts and -% without the need to overrite a primitive (which it did in the +% without the need to overwrite a primitive (which it did in the % past and which we do below) and then this code here can be taken % out again. % \begin{macrocode} @@ -446,7 +446,7 @@ % the classic \TeX{} implementation but with the extended % allocation possibilities of all modern engines is no longer the % case and there is a point where the allocations take a ``jump'' -% breaking the odering assumption. These days we are fairly close +% breaking the ordering assumption. These days we are fairly close % to that point and depending on how many packages are loaded % before \pkg{bigfoot} the package breaks. % @@ -717,6 +717,34 @@ {[\@tempb][\arabic{page}][\cref@result]\thepage}{}{}{}}}% <------- five \@esphack}% } +% \end{macrocode} +% \changes{v1.1g}{2024/10/16}{update cleveref data in label hook} +% cleveref patches and redefines \cs{refstepcounter} so that a call updates its data. +% This fails if like e.g. in \pkg{longtable} the counter is stepped with +% \cs{@kernel@refstepcounter}. We therefore move the data setup into the label hook. +% As the hook is in a group we have to smuggle the data out of it. +% \url{https://tex.stackexchange.com/a/722909/2388} and issue \#1393 +% \begin{macrocode} + \newcommand\firstaid@cref@smugglelabel{\let\cref@currentlabel\cref@gcurrentlabel@temp} + \newcommand\firstaid@cref@updatelabeldata[1]{% + \cref@constructprefix{#1}{\cref@result}% + \@ifundefined{cref@#1@alias}% + {\def\@tempa{#1}}% + {\def\@tempa{\csname cref@#1@alias\endcsname}}% + \protected@xdef\cref@gcurrentlabel@temp{% + [\@tempa][\arabic{#1}][\cref@result]% + \csname p@#1\endcsname\csname the#1\endcsname}% + \aftergroup\firstaid@cref@smugglelabel + } +% \end{macrocode} +% we test if \cs{@currentcounter} is empty for unnumbered sections +% \begin{macrocode} + \AddToHook{label}[firstaid/cleveref] + {\ifx + \@currentcounter\@empty + \else + \firstaid@cref@updatelabeldata{\@currentcounter} + \fi} }% } % \end{macrocode} diff --git a/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf b/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf Binary files differindex 789de4f3e2..12b3d30be9 100644 --- a/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf +++ b/macros/latex/required/firstaid/latex2e-first-aid-for-external-files.pdf diff --git a/macros/latex/required/latex-lab/README.md b/macros/latex/required/latex-lab/README.md index d87f6fedf9..89d8d9f659 100644 --- a/macros/latex/required/latex-lab/README.md +++ b/macros/latex/required/latex-lab/README.md @@ -1,6 +1,6 @@ # LaTeX laboratory -Release 2024-06-01 patch level 0 +Release 2024-11-01 ## Overview diff --git a/macros/latex/required/latex-lab/blocks-code.pdf b/macros/latex/required/latex-lab/blocks-code.pdf Binary files differindex f4898a522c..6ed0532584 100644 --- a/macros/latex/required/latex-lab/blocks-code.pdf +++ b/macros/latex/required/latex-lab/blocks-code.pdf diff --git a/macros/latex/required/latex-lab/blocks-doc.pdf b/macros/latex/required/latex-lab/blocks-doc.pdf Binary files differindex 90b0bd984c..421ff15cd0 100644 --- a/macros/latex/required/latex-lab/blocks-doc.pdf +++ b/macros/latex/required/latex-lab/blocks-doc.pdf diff --git a/macros/latex/required/latex-lab/changes.txt b/macros/latex/required/latex-lab/changes.txt index cd53086b2b..35c77075d6 100644 --- a/macros/latex/required/latex-lab/changes.txt +++ b/macros/latex/required/latex-lab/changes.txt @@ -1,12 +1,154 @@ +2024-10-25 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: reorganized luamml and mathml options + to support also structure elements and extended the documentation. Corrected + handling of alt-texts. Added examples for the various options. + +2024-10-16 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-firstaid.dtx: correct amsthm firstaid (tagging/733), + remove now unneeded code for cleveref. + +2024-10-12 Joseph Wright <Joseph.Wright@latex-project.org> + * latex-lab-math.dtx: Sync with protected-begin status + +2024-10-11 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-toc.dtx, latex-lab-sec.dtx, latex-lab-toc-kernel-changes: move target + handling (\MakeLinkTarget patches) into the kernel. + +2024-10-11 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * latex-lab-block.dtx (subsubsection{verse environment}): + Update \@itemlabel in \l_@@_legacy_env_params_tl and not at the start of + the environment (tagging/730) + + Set the defaults for \@itemlabel, \@listctr and @nmbrlist early in the + block code before the setup code gets executed (tagging/730) + + (subsubsection{Implementation of list templates ...): + Correct logic for setting up the list counter (tagging/730) + +2024-10-04 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-firstaid.dtx: add first support for fancyvrb environments. + +2024-10-04 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-sec.dtx (subsection{Sockets}): + add missing braces around optional arg (tagging/725) + +2024-10-03 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * latex-lab-block.dtx (subsubsection{Implementation of list templates ...}): + Pass user keys on list to \item for evaluation + +2024-10-02 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx (subsection{Sockets}): + disable paratagging in inline math (tagging/711) + +2024-09-30 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-footnotes.dtx: remove unneeded NonStruct structure. + +2024-09-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * latex-lab-math.dtx (subsection{Content grabbing}): + Correct logic for inserting below skips after displays (tagging/721) + +2024-09-26 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-firstaid.dtx: add support for theorems declared with + amsthm, amsart, amsbook, amsproc. + +2024-09-24 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-sec.dtx,latex-lab-footnotes.dtx: + correct and improve footnotes in longtable + +2024-09-24 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-toc.dtx,latex-lab-footnotes.dtx: adapt Ref handling to tagpdf 0.99f + +2024-09-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-amsmath.dtx,latex-lab-graphic.dtc, + latex-lab-marginpar.dtx,latex-lab-math.dtx,latex-lab-mathtools.dtx, + latex-lab-minipage.dtx,latex-lab-sec.dtx,latex-lab-table.dtx,latex-lab-text.dtx: + switch to \tag_suspend:n and \tag_resume:n + +2024-09-17 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-float.dtx: switch to tagging sockets + +2024-09-13 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * documentmetadata-support.dtx: change warning to error if pdfstandard is unknown, + see https://github.com/latex3/pdfresources/issues/77#issuecomment-2329522654. + +2024-09-03 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * documentmetadata-support.dtx: switch to T1 encoding by default for non-Unicode + engines. + +2024-09-02 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * latex-lab-block.dtx (subsubsection{List tags}): + Do not close LI and LBody if they were never opened because of a + missing \item (issue tagging/641) + + (subsubsection{Implementation of \cs{item} template(s)}): + Set @newlist to false after the first \item (issue tagging/36) + + Call \@noitemerr in para/begin hook if hmode is started before + the first item + + (subsubsection{Implementation of block templates \ldots}): + Drop \@noitemerr from \addvspace and \addpenalty + +2024-08-29 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: avoid loosing math if tagging is suspended, + tagging-project issue #661 + +2024-08-22 Joseph Wright <Joseph.Wright@latex-project.org> + * latex-lab-math.dtx: correct handling of empty math processing + +2024-08-21 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: correct luamml patches for array, + allow to use luamml without unicode-math + +2024-08-14 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: add luamml support for automatic mathml generation + +2024-08-12 Joseph Wright <Joseph.Wright@latex-project.org> + * latex-lab-math.dtx: add support for math in tabulars + +2024-08-11 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-firstaid.dtx: amsproc support, discussion in PR #517 + +2024-08-11 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-block.dtx: preset verbatim para-instance, issue #119 + +2024-08-10 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-block.dtx, latex-lab-table.dtx: reset flattened level in para/restore, issue #544 + +2024-08-08 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-minipage.dtx, latex-lab-table.dtx: improve support for minipage in tables. + handle issue #37 + +2024-08-06 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-table.dtx: add support for header-columns + * latex-lab-table.dtx: add support for multirows + * latex-lab-table.dtx: handle issue #432 + * latex-lab-marginpar.dtx: handle issue #444 + +2024-07-11 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-footnote.dtx: restore paragraph defaults at the begin of the footnote + tagging-project#262 + +2024-07-13 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * latex-lab-table.dtx (subsection{Tagging support sockets}): + add plugs for tbl/leaders/begin and /end + (subsection{Misc stuff}): drop unused socket + +2024-07-11 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-toc.dtx, latex-lab-toc-kernel-changes: switch from configuration points + to sockets. + 2024-05-25 Ulrike Fischer <Ulrike.Fischer@latex-project.org> * latex-lab-table.dtx: disable table headers in presentation tables. 2024-05-25 Ulrike Fischer <Ulrike.Fischer@latex-project.org> - * latex-lab-firstaid.dtx: add firstaid for booktabs cmidrules, + * latex-lab-firstaid.dtx: add firstaid for booktabs cmidrules, see tagging-issue 69. 2024-04-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org> - * documentmetadata-support.dtx: change handling of default language. + * documentmetadata-support.dtx: change handling of default language. The code now tries to detect languages set by babel/polyglossia. 2024-04-16 Ulrike Fischer <Ulrike.Fischer@latex-project.org> diff --git a/macros/latex/required/latex-lab/documentmetadata-support-code.pdf b/macros/latex/required/latex-lab/documentmetadata-support-code.pdf Binary files differindex 9720f83a60..5fec54a3cb 100644 --- a/macros/latex/required/latex-lab/documentmetadata-support-code.pdf +++ b/macros/latex/required/latex-lab/documentmetadata-support-code.pdf diff --git a/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf b/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf Binary files differindex e45892165c..562f8d98bc 100644 --- a/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf +++ b/macros/latex/required/latex-lab/documentmetadata-support-doc.pdf diff --git a/macros/latex/required/latex-lab/documentmetadata-support.dtx b/macros/latex/required/latex-lab/documentmetadata-support.dtx index a629d9c551..6752e8098a 100644 --- a/macros/latex/required/latex-lab/documentmetadata-support.dtx +++ b/macros/latex/required/latex-lab/documentmetadata-support.dtx @@ -18,8 +18,8 @@ % for those people who are interested or want to report an issue. % % \begin{macrocode} -\def\documentmetadatasupportversion{1.0h} -\def\documentmetadatasupportdate{2024-03-26} +\def\documentmetadatasupportversion{1.0j} +\def\documentmetadatasupportdate{2024-09-13} % \end{macrocode} % % @@ -314,6 +314,19 @@ { \tl_new:N \g_@@_testphase_tl } % \end{macrocode} % \end{variable} +% +% \subsection{Kernel changes with \cs{DocumentMetadata}} +% \begin{macro}{\@kernel@before@DocumentMetadata} +% \begin{macrocode} +\cs_new_protected:Npn \@kernel@before@DocumentMetadata + { + \ifx\Umathcode\@undefined + \fontencoding{T1} + \renewcommand\encodingdefault{T1} + \fi + } +% \end{macrocode} +% \end{macro} % \subsection{\cs{DocumentMetadata}} % @@ -330,6 +343,10 @@ { \msg_error:nn { meta } { after-class } } { % \end{macrocode} +% Load general format changes +% \begin{macrocode} + \@kernel@before@DocumentMetadata +% \end{macrocode} % % The wanted backend must be detected first, we read the init % key and then force the loading of the backend. @@ -481,7 +498,7 @@ } ,_pdfstandard / unknown .code:n = { - \msg_warning:nnn{pdf}{unknown-standard}{#1} + \msg_error:nnn{pdf}{unknown-standard}{#1} } ,testphase .multichoice: ,testphase / tagpdf .code:n = diff --git a/macros/latex/required/latex-lab/latex-lab-amsmath.dtx b/macros/latex/required/latex-lab/latex-lab-amsmath.dtx index 57e27067cb..8591b39b39 100644 --- a/macros/latex/required/latex-lab/latex-lab-amsmath.dtx +++ b/macros/latex/required/latex-lab/latex-lab-amsmath.dtx @@ -66,7 +66,7 @@ % \subsection{File declaration} % \begin{macrocode} \ProvidesFile{latex-lab-amsmath.ltx} - [2024-02-12 v0.1b amsmath adaptions] + [2024-09-18 v0.1c amsmath adaptions] % \end{macrocode} % \subsection{Tagpdf support} % To make the code independent from tagging being loaded and active @@ -99,7 +99,7 @@ % \end{macrocode} % Stop tagging when measuring: % \begin{macrocode} - \ifmeasuring@\tag_stop:\fi + \ifmeasuring@\tag_suspend:n{\measuring}\fi \normalbaselines \ifdim\linewidth=\columnwidth \else \parshape\@ne \@totalleftmargin \linewidth @@ -174,7 +174,7 @@ \def\text@#1 {{ \int_gincr:N\g__math_mathchoice_int - \tag_stop: + \tag_suspend:n{\text@} \mathchoice { \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{0} @@ -200,8 +200,8 @@ % \end{macrocode} % % \subsection{\cs{pmb}} -% \cs{pmb} prints is argument three times. For tagging we must mark -% two of occurences as artifact. +% \cs{pmb} prints its argument three times. For tagging we must mark +% two of occurrences as artifact. % For luatex the attributes in the box must be reset, for this % we switch to expl3-boxes. % \begin{macrocode} diff --git a/macros/latex/required/latex-lab/latex-lab-amsmath.pdf b/macros/latex/required/latex-lab/latex-lab-amsmath.pdf Binary files differindex bb5a689c31..828677fe17 100644 --- a/macros/latex/required/latex-lab/latex-lab-amsmath.pdf +++ b/macros/latex/required/latex-lab/latex-lab-amsmath.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-bib.dtx b/macros/latex/required/latex-lab/latex-lab-bib.dtx index e8ee192a7b..9d336aba20 100644 --- a/macros/latex/required/latex-lab/latex-lab-bib.dtx +++ b/macros/latex/required/latex-lab/latex-lab-bib.dtx @@ -16,7 +16,7 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabbibdate{2024-02-12} +\def\ltlabbibdate{2024-07-05} \def\ltlabbibversion{0.81b} %<*driver> \documentclass{l3doc} @@ -128,7 +128,7 @@ % % \begin{function}{\@extra@binfo,\@extra@b@citeb} % -% These are taken from hyperref, they are for chapterbib compability (and also +% These are taken from hyperref, they are for chapterbib compatibility (and also % signal to chapterbib not to change the citation commands) % \end{function} % @@ -157,7 +157,7 @@ % \end{macrocode} % \begin{macro}{\@extra@binfo,\@extra@b@citeb} -% These are taken from hyperref, they are for chapterbib compability (and also +% These are taken from hyperref, they are for chapterbib compatibility (and also % signal to chapterbib not to change the citation commands) % \begin{macrocode} \providecommand*\@extra@binfo{}% @@ -270,7 +270,7 @@ % \end{macrocode} % Now we add the tagging structure. % TODO: with the next tagpdf version it should no longer be -% needed to exand the ref key. +% needed to expand the ref key. % \begin{macrocode} \AddToHookWithArguments{bibcite/before} { @@ -305,7 +305,7 @@ % We need in part different code for both systems: % with biblatex we have to take care that only the first % structure sets a label, and if -% hyperref is not loaded (or deactived) we will need additional code +% hyperref is not loaded (or deactivated) we will need additional code % but this currently doesn't exist. % We assume that no document loads both package -- that will probably break. % \begin{macrocode} diff --git a/macros/latex/required/latex-lab/latex-lab-bib.pdf b/macros/latex/required/latex-lab/latex-lab-bib.pdf Binary files differindex 7befa83ed9..507ada06ef 100644 --- a/macros/latex/required/latex-lab/latex-lab-bib.pdf +++ b/macros/latex/required/latex-lab/latex-lab-bib.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-block.dtx b/macros/latex/required/latex-lab/latex-lab-block.dtx index 7d08b270d2..74d68c495a 100644 --- a/macros/latex/required/latex-lab/latex-lab-block.dtx +++ b/macros/latex/required/latex-lab/latex-lab-block.dtx @@ -9,8 +9,8 @@ % % https://www.latex-project.org/lppl.txt % -\def\ltlabblockdate{2024-03-23} -\def\ltlabblockversion{0.8n} +\def\ltlabblockdate{2024-10-11} +\def\ltlabblockversion{0.8v} %<*driver> \documentclass[kernel]{l3doc} \usepackage{amstext} @@ -331,6 +331,8 @@ % \TemplateKey{par-skip}{skip}{}{\cs{parsep}} % \TemplateKey{end-skip}{skip}{}{\valuefrom{beginsep}} % \TemplateKey{end-par-skip}{skip}{}{\valuefrom{begin-par-skip}} +% \TemplateKey{item-skip}{skip}{The space in front of an item if the +% block is a list; if not the setting has no effect}{\cs{itemsep}} % \TemplateKey{beginpenalty}{integer}{}{\cs{@beginparpenalty}} % \TemplateKey{endpenalty}{integer}{}{\cs{@endparpenalty}} % \TemplateKey{leftmargin}{length}{}{\cs{leftmargin}} @@ -341,7 +343,7 @@ % % The idea of a \key{heading} key needs some further % thoughts. Maybe instead the object type should accept a second -% argument and receive input for such a headding from the document +% argument and receive input for such a heading from the document % level instead. % % The names of the keys need further thoughts and some @@ -390,7 +392,7 @@ % {Instance of type \texttt{item} to be used to format % the label string}{basic} % \TemplateKey{item-skip}{skip}{The space in front of an item in the -% list.\fmi{May need to be on a different template level}}{\cs{itemsep}} +% list. If not specified the value specified in the block template instance is used}{} % \TemplateKey{item-indent}{length}{Horizontal displacement of the item.}{0pt} % \TemplateKey{item-penalty}{integer} % {Penalty for breaking before an @@ -474,7 +476,7 @@ % \>\>\> The paragraph text before the display element \ldots\\ % \>\> \struct{/text}\\ % \>\> \struct{display element structure}\\ -% \>\>\> Content of the display structure possiblly involving inner \struct{text-unit} tags\\ +% \>\>\> Content of the display structure possibly involving inner \struct{text-unit} tags\\ % \>\> \struct{/display element structure}\\ % \>\> \struct{text}\\ % \>\>\> \ldots{} continuing the outer paragraph text\\ @@ -722,7 +724,7 @@ blockenv implementation] % \end{macrocode} % -% Generell kernel changes, also loaded by the sec and toc code. +% General kernel changes, also loaded by the sec and toc code. % \begin{macrocode} \RequirePackage{latex-lab-kernel-changes} % \end{macrocode} @@ -756,8 +758,9 @@ % % % -% \begin{macro}{\@doendpe} +% \begin{macro}{\@doendpe,\__kernel_displayblock_doendpe:} % The original \LaTeXe{} command is augmented to allow for tagging. +% TODO: use sockets for this and move to the kernel eventually. % \begin{macrocode} \def\@doendpe{\@endpetrue \def\par @@ -792,15 +795,10 @@ % \begin{macrocode} \cs_new_eq:NN \__kernel_displayblock_doendpe: \prg_do_nothing: % \end{macrocode} -% The flag itself should be set globally not locally.\fmi{verify -% that this claim is actually correct!} -% \begin{macrocode} -\def\@endpetrue {\global\let\if@endpe\iftrue} -\def\@endpefalse{\global\let\if@endpe\iffalse} -% \end{macrocode} -% \end{macro} % % +% \end{macro} +% % % \subsection{Object and template interfaces} % @@ -847,6 +845,7 @@ % % \begin{template}{block display} % +% \changes{v0.8s}{2024/10/03}{Offer item-skip key also on block templates} % \begin{macrocode} \DeclareTemplateInterface{block}{display}{1} { @@ -856,6 +855,7 @@ par-skip : skip = \parsep , end-skip : skip = \KeyValue{beginsep} , % conflict with name below end-par-skip : skip = \KeyValue{begin-par-skip} , + item-skip : skip = \itemsep , beginpenalty : integer = \UseName{@beginparpenalty} , endpenalty : integer = \UseName{@endparpenalty} , leftmargin : length = \leftmargin , @@ -1269,9 +1269,15 @@ % We do this by storing them away and then call the list % instance. Inside this instance the \texttt{setup-code} key % contains \cs{legacylistsetupcode}, which makes use of the stored values. +% \changes{v0.8v}{2024/10/11}{Update \cs{@itemlabel} in +% \cs{l_@@_legacy_env_params_tl} and not at the start of the +% environment (tagging/730)} % \begin{macrocode} - \tl_set:Nn \@itemlabel {#2} - \tl_set:Nn \l_@@_legacy_env_params_tl {#3} + \tl_set:Nn \l_@@_legacy_env_params_tl + { + \tl_set:Nn \@itemlabel {#2} + #3 + } % \end{macrocode} % % \begin{macrocode} @@ -1285,14 +1291,6 @@ % % % -% \begin{variable}{\l_@@_env_params_tl} -% Declare the variable for the parameter argument; \cs{@itemlabel} -% is already declared in \LaTeXe{}. -% \begin{macrocode} -\tl_new:N \l_@@_env_params_tl -% \end{macrocode} -% \end{variable} -% % % \begin{macro}{\legacylistsetupcode} % @@ -1308,10 +1306,14 @@ \dim_zero:N \itemindent % \end{macrocode} % -% By default a \env{list} environment is not numbered: +% By default a \env{list} environment is not numbered, but this +% happens already in the block template. +% \changes{v0.8v}{2024/10/11}{Set the defaults for \cs{@itemlabel}, +% \cs{@listctr} and \texttt{@nmbrlist} early in the block code +% before the setup code gets executed (tagging/730)} % \begin{macrocode} - \tl_set:Nn \@listctr {} - \legacy_if_set_false:n { @nmbrlist } % needed if lists are nested +% \tl_set:Nn \@listctr {} +% \legacy_if_set_false:n { @nmbrlist } % needed if lists are nested % \end{macrocode} % By default there is a simple definition for \cs{makelabel}. It can be % overwritten in the second mandatory argument to the list @@ -1569,7 +1571,7 @@ % \end{macrocode} % We need to know later if we have nested blockenvs inside % a flattened environment. Whenever we start a new blockenv we -% increment \cs{\l_@@_flattened_level_int} if it is already +% increment \cs{l__tag_block_flattened_level_int} if it is already % different from zero. If it is zero we increment it if flattening % is requested. % Thus a value of \texttt{0} means no flattening requested so far @@ -1578,14 +1580,14 @@ % is surrounded by a \texttt{text-unit} tag, while for any value above % \texttt{1} we have to omit the \texttt{text-unit}. % \begin{macrocode} - \int_compare:nNnTF \l_@@_flattened_level_int > 0 + \int_compare:nNnTF \l__tag_block_flattened_level_int > 0 { - \int_incr:N \l_@@_flattened_level_int + \int_incr:N \l__tag_block_flattened_level_int } { \bool_if:NT \l__tag_para_flattened_bool { - \int_incr:N \l_@@_flattened_level_int + \int_incr:N \l__tag_block_flattened_level_int } } % @@ -1623,6 +1625,23 @@ % \begin{macrocode} \tag_if_active:T { \use:c { @@_recipe_ \l_@@_tagging_recipe_tl : } } % \end{macrocode} +% The default for \env{list} environments is that they have an +% empty label and are not numbered (something that is then +% overwritting by the setup of a specific list). We ensure +% this here even for non-lists, because we need a defined state +% that then can be overwritting by the legacy setup code for +% the \env{list} environment in \cs{l_@@_setup_code_tl}. +% This is needed in case lists are nested as they otherwise would +% inherit outer values (and suddenly an \env{itemize} would start +% incrementing an outer \env{enumerate} counter, etc. +% \changes{v0.8v}{2024/10/11}{Set the defaults for \cs{@itemlabel}, +% \cs{@listctr} and \texttt{@nmbrlist} early in the block code +% before the setup code gets executed (tagging/730)} +% \begin{macrocode} + \tl_clear:N \@itemlabel + \tl_clear:N \@listctr + \legacy_if_set_false:n { @nmbrlist } +% \end{macrocode} % Then run the setup code if any is given in the instance. % \begin{macrocode} \l_@@_setup_code_tl @@ -1681,11 +1700,15 @@ % \end{template} % % -% \begin{macro}{\l_@@_flattened_level_int} +% \begin{macro}{\l__tag_block_flattened_level_int} % Count the levels of nested blockenvs starting with the first that -% is \enquote{flattened}. +% is \enquote{flattened}. The counter is defined in lttagging.dtx, +% but until the next release 11/24 we set it up here too % \begin{macrocode} -\int_new:N \l_@@_flattened_level_int +\int_if_exist:NF \l__tag_block_flattened_level_int + { + \int_new:N \l__tag_block_flattened_level_int + } % \end{macrocode} % \end{macro} % @@ -1725,15 +1748,19 @@ \legacy_if_gset_false:n { @inlabel } } % \end{macrocode} -% In a pure ``displayblock'' scenario \texttt{@newlist} will be -% always false and the code bypassed, but we may have an outer list -% followed immediately by a displayblock (with the \cs{item} missing) +% If we are ending a list environment and we have not seen any +% \cs{item}, i.e., \texttt{@newlist} is still true, we raise an +% error. In basic a ``displayblock'' scenario \texttt{@newlist} will +% always be false, but if such an environment appears inside an outer +% list then \cs{noitemerr} could still be triggered and that is undesirable +% (as the missing item will be detected at the wrong point and again later, +% during the outer list processing). We +% therefore run it only if the current environment is a list. +% \changes{v0.8q}{2024/09/03}{Raise a \cs{@noitemerr} if appropriate} +% \begin{macrocode} + \@@_if_list:T { \legacy_if:nT { @newlist } { \@noitemerr } } +% \end{macrocode} % \begin{macrocode} - \legacy_if:nT { @newlist } - { - \@noitemerr - \legacy_if_gset_false:n { @newlist } - } \mode_if_horizontal:TF { \@@_skip_remove_last: \@@_skip_remove_last: \par } { \@inmatherr{\end{\@currenvir}} } @@ -1743,6 +1770,13 @@ % \begin{macrocode} \__kernel_displayblock_end: % \end{macrocode} +% Resetting the \texttt{@newlist} switch is also only done if the +% current enviornment is a list and not unconditionally. +% \changes{v0.8q}{2024/09/03}{Setting \texttt{@newlist} to false +% moved after tagging code if in a list} +% \begin{macrocode} + \@@_if_list:T { \legacy_if_gset_false:n { @newlist } } +% \end{macrocode} % What to do in terms of vertical spacing in different situations % is still somewhat open to debate, right now this is more or less % implementing what \LaTeXe{} list environment have been @@ -1789,6 +1823,19 @@ % \end{macro} % % +% \begin{macro}{\@@_if_list:T} +% The following code may need some redesigning, as there is no good test for \enquote{is +% this environment a \enquote{list} that has \cs{item}s}. For now +% this here does the trick well enough.\fmi{revisit} +% \changes{v0.8q}{2024/09/03}{Provide a test for: Am I in a list?} +% \begin{macrocode} +\cs_new:Npn \@@_if_list:T + { \tl_if_eq:NnT \l_@@_block_instance_tl {list} } +% \end{macrocode} +% \end{macro} +% +% +% % \begin{macro}{\__kernel_displayblock_end:} % The kernel hook for tagging at the end of the block. % \begin{macrocode} @@ -1814,9 +1861,13 @@ % and should not inherit the setting from the outer environment. % \begin{macrocode} \socket_new_plug:nnn{tagsupport/block-endpe}{on} - { \legacy_if_gset_true:n { @endpe } } +% \end{macrocode} +% We can't use \cs{legacy_if_gset_true:n} because this is now doing +% more than setting the legacy switch +% \begin{macrocode} + { \@endpetrue } \socket_new_plug:nnn{tagsupport/block-endpe}{off} - { \legacy_if_gset_false:n { @endpe } } + { \@endpefalse } % \end{macrocode} % % \begin{macrocode} @@ -1864,6 +1915,7 @@ % % \begin{template}{block display} % +% \changes{v0.8s}{2024/10/03}{Offer item-skip key also on block templates} % \begin{macrocode} \DeclareTemplateCode{block}{display}{1} { @@ -1873,6 +1925,7 @@ par-skip = \parsep , end-skip = \l_@@_botsep_skip , end-par-skip = \l_@@_parbotsep_skip , + item-skip = \itemsep , beginpenalty = \@beginparpenalty , endpenalty = \@endparpenalty , rightmargin = \rightmargin , @@ -1981,7 +2034,7 @@ % \cs{parskip} and some other housekeeping, unless this block is inside a list and the list % \cs{item} has not yet placed. In that case the vertical % space and penalty us suppressed. This -% is controled through the legacy switches \texttt{@noparitem}, +% is controlled through the legacy switches \texttt{@noparitem}, % \texttt{minipage}, and \texttt{@nobreak}. % \begin{macrocode} \legacy_if:nTF { @noparitem } @@ -2028,7 +2081,6 @@ % \end{template} % % -% % \begin{macro}{\__kernel_displayblock_begin:, % \__kernel_displayblock_beginpar_hmode:w, % \__kernel_displayblock_beginpar_vmode:} @@ -2073,6 +2125,40 @@ % % % +% \begin{macro}{\@@_evaluate_saved_user_keys:nn} +% Keys set on individual list environments may be intended to alter +% the behavior of the template instance that defines the \cs{item} +% command. If meant to alter only a single \cs{item} command one +% would specify them in the optional argument of the \cs{item}, but +% if they should alter all items the right place would be the list +% environment. For this reason we need to store the values and then +% set them inside the \cs{item} template code using +% \cs{SetTemplateKeys} in the appropriate context (template type +% and template name). This is done in +% \cs{@@_evaluate_saved_user_keys:nn}. The context is provided in +% the two arguments (because different list environments may use +% different \cs{item} instances based on different templates. By +% default the command does +% nothing because most environments do not have user key settings. +% \changes{v0.8s}{2024/10/03}{Pass user keys on list to \cs{item} for +% evaluation} +% \begin{macrocode} +\cs_new_eq:NN \@@_evaluate_saved_user_keys:nn \use_none:nn +% \end{macrocode} +% Maybe something like this should become a public function, but +% for now this is a one-off for the \cs{item} command and therefore +% coded inline and internal to the block code. +% \begin{macrocode} +%\cs_new:Npn \@@_save_user_keys:n #1 { +% \tl_if_empty:nTF {#1} +% { \cs_set_eq:NN \@@_evaluate_saved_user_keys:nn \use_none:nn } +% { +% \cs_set:Npe \@@_evaluate_saved_user_keys:nn ##1##2 +% { \SetTemplateKeys{##1}{##2}{ \exp_not:n{#1} } } +% } +%} +% \end{macrocode} +% \end{macro} % % % \begin{template}{list std} @@ -2098,36 +2184,48 @@ { \@@_debug_typeout:n{template:list:std} % - \tl_if_empty:nF {#1} { \SetTemplateKeys{list}{std}{#1} } +% \end{macrocode} +% We start by looking at the user supplied keys in \texttt{\#1}. If +% there aren't any we reset \cs{@@_evaluate_saved_user_keys:nn} to +% do nothing. Otherwise we evaluate and set the keys in the contect +% of the current list template. In addition we prepare +% \cs{@@_evaluate_saved_user_keys:nn} for execution in the +% template for \cs{item}. +% \changes{v0.8s}{2024/10/03}{Prepare \cs{@@_evaluate_saved_user_keys:nn} +% for use in \cs{item}} +% \begin{macrocode} + \tl_if_empty:nTF {#1} + { \cs_set_eq:NN \@@_evaluate_saved_user_keys:nn \use_none:nn } + { + \SetTemplateKeys{list}{std}{#1} + \cs_set:Npe \@@_evaluate_saved_user_keys:nn ##1##2 + { \SetTemplateKeys{##1}{##2}{ \exp_not:n{#1} } } + } % \end{macrocode} % Has this list a counter name defined in the instance? % \begin{macrocode} \tl_if_empty:NTF \l_@@_counter_tl { % \end{macrocode} -% If not we check if \cs{@listctr} has a non-empty value to be used -% for the list counter. -% -% We better test for blank not empty in case somebody had defined -% \cs{@listctr} using \cs{renewcommand} or \cs{cs_set:Npn}. +% If not we check if \cs{@nmbrlist} is true which may be the case +% in legacy environments that used \cs{usecounter} in the argument +% to the \env{list} environment. +% \changes{v0.8v}{2024/10/11}{Correct logic for setting up the list +% counter (tagging/730)} % \begin{macrocode} - \tl_if_blank:oF \@listctr - { + \legacy_if:nT { @nmbrlist } + { % \end{macrocode} -% In that case \texttt{@nmbrlist} should have been set too, for -% example, through \cs{usecounter}, so we do not set it -% explicitly. However, we check if we should resume a previous list. +% In that case we only check if we should resume a previous list +% (\cs{@listctr} should be set in that case through the legacy +% method as well so we should be able to use it). % \begin{macrocode} \bool_if:NF \l_@@_resume_bool { \int_gset:cn{ c@ \@listctr } { \l_@@_counter_start_int - 1 } } - } -% \end{macrocode} -% If \cs{@listctr} is not set then we have definitely an unnumbered list. -% \begin{macrocode} - { \@nmbrlistfalse } + } } % \end{macrocode} % If a counter is set in the list instance we use that @@ -2157,12 +2255,28 @@ \tl_set_eq:NN \@itemlabel \l_@@_item_label_tl } % \end{macrocode} -% finally, we signal that we are at the start of a new list (which -% effects how the first \cs{item} is handled and how \cs{par} +% Finally, we signal that we are at the start of a new list (which +% affects how the first \cs{item} is handled and how \cs{par} % commands are interpreted. % \begin{macrocode} \legacy_if_gset_true:n { @newlist } % \end{macrocode} +% If we encounter horizontal material before the first \cs{item} we +% do want a \cs{@noitemerr} straight away, because afterwards we +% end up with tagging structure faults whose cause is the +% missing \cs{item}. So we setup up \cs{@@_item_everypar:} to test +% for this; when the first \cs{item} is encountered this will get +% reset. This is only relevant for vertical lists, when dealing with +% inline lists one would need to test for something else to +% identify that there is horizontal material between the start of the list and +% the first \cs{item} (maybe some \cs{spacefactor} trick could be +% used then, or the material is boxed first and the width is +% inspected as suggested by Joseph).\fmi{Think about a better +% implementation at some point.} +% \changes{v0.8q}{2024/09/02}{} +% \begin{macrocode} + \cs_set_eq:NN \@@_item_everypar: \@@_item_everypar_first: +% \end{macrocode} % % \begin{macrocode} \@@_debug_typeout:n{template:list:std~end} @@ -2251,8 +2365,19 @@ % was given. % \begin{macrocode} \tl_set_eq:NN \l_@@_label_given_tl \c_novalue_tl +% \end{macrocode} +% First we evaluate and set any keys specified on the list +% environment by calling +% \cs{@@_evaluate_saved_user_keys:nn}. Then we do the same +% with all keys specified on this \cs{item} command (which may +% overwrite one or the other setting just made). +% \changes{v0.8s}{2024/10/03}{Use \cs{@@_evaluate_saved_user_keys:nn} +% to make use of user keys on the list level} +% \begin{macrocode} + \@@_evaluate_saved_user_keys:nn {item}{std} \tl_if_empty:nF{#1}{ \SetTemplateKeys{item}{std}{#1} } % \end{macrocode} +% % If no optional argument was given then \cs{l_@@_label_given_tl} % is still equal to \cs{c_novalue_tl} and so we can distinuish % that from \verb=\item[]=. @@ -2404,16 +2529,16 @@ % % % -% \begin{macro}{\@@_item_everypar:, \@@_item_everypar_std:} +% \begin{macro}{\@@_item_everypar:, \@@_item_everypar_std:, \@@_item_everypar_first:} % The \cs{@@_item_everypar:} command is executed as part of \hook{para/begin} % but most of the time does nothing, i.e., it has the following -% default definition. +% default definition outside of lists (and most of the time within lists). % \begin{macrocode} \cs_new_eq:NN \@@_item_everypar: \prg_do_nothing: % \end{macrocode} -% +% % \begin{macrocode} -\AddToHook{para/begin}[lists]{\@@_item_everypar:} +\AddToHook{para/begin}[items]{\@@_item_everypar:} % \end{macrocode} % % Note that we have to make sure that the above code is executed @@ -2421,9 +2546,9 @@ % \texttt{@inlabel} to make a decision. % % By the end of the day both should probably move into the kernel -% hook instead! +% hook instead or, better, into sockets. % \begin{macrocode} -\DeclareHookRule{para/begin}{lists}{after}{tagpdf} +\DeclareHookRule{para/begin}{items}{after}{tagpdf} % \end{macrocode} % % @@ -2475,6 +2600,16 @@ } % \end{macrocode} % +% This is the definition of \cs{@@_item_everypar:} before the first +% \cs{item} is encountered. +% \changes{v0.8q}{2024/09/02}{Call \cs{@noitemerr} if hmode is +% started before the first item} +% \begin{macrocode} +\cs_new:Npn \@@_item_everypar_first: { + \legacy_if:nT { @newlist } { \@noitemerr } +} +% \end{macrocode} +% % \end{macro} % % @@ -2520,7 +2655,7 @@ % % \begin{macro}{\item} % Here we already have all the building blocks. Complain in math -% mode. Distingusih between first item (do necessary tagging) and +% mode. Distinguish between first item (do necessary tagging) and % later items \cs{@@_inter_item:} to % cleanly close what's before, then call \cs{@@_item_instance:n} (which % calls \cs{UseInstance}\{item\}\marg{instance}) to prepare the @@ -2541,8 +2676,16 @@ } { \legacy_if:nTF { @newlist } - { \__kernel_list_item_begin: } - { \@@_inter_item: } + { + \__kernel_list_item_begin: +% \end{macrocode} +% The first item of a list also has to change the \texttt{@newlist} switch. +% \changes{v0.8q}{2024/09/02}{Set \texttt{@newlist} to false after +% the first \cs{item}} +% \begin{macrocode} + \legacy_if_gset_false:n { @newlist } + } + { \@@_inter_item: } % \end{macrocode} % To avoid unnecessary key/val processing we make a quick check if % there was an optional argument. @@ -2751,7 +2894,7 @@ \socket_assign_plug:nn{tagsupport/block-endpe}{on} % \end{macrocode} % -% Handle the tag name and attribute classess using the key values +% Handle the tag name and attribute classes using the key values % from the current list instance. % \begin{macrocode} \tl_if_empty:NTF \l_@@_tag_name_tl @@ -2994,6 +3137,7 @@ block-instance = verbatimblock , inner-instance = , final-code = \legacyverbatimsetup , + para-instance = justify } % \end{macrocode} % \end{instance} @@ -3173,7 +3317,7 @@ % block quoteblock-4, % block quoteblock-5, % block quoteblock-6 } -% Default layout is to indent equaly from both side. +% Default layout is to indent equally from both sides. % \begin{macrocode} \DeclareInstance{block}{quoteblock-1}{display} { rightmargin = \KeyValue{leftmargin} } @@ -3468,7 +3612,7 @@ % then have to avoid adding another \texttt{text-unit}. % \begin{macrocode} { - \int_compare:nNnT \l_@@_flattened_level_int < 2 + \int_compare:nNnT \l__tag_block_flattened_level_int < 2 { \__tag_gincr_para_main_begin_int: \tag_struct_begin:n @@ -3917,15 +4061,37 @@ % Finally, at the list end we have to close the open % \texttt{LBody}, \texttt{LI}, \texttt{L}, and possibly a % \struct{text} if the last item ends with a list. +% However, if the user forgot to add an \cs{item} then there will be no +% \texttt{LI} and \texttt{LBody} open, so we check for the status +% of \texttt{@newlist}. The corresponding no-item error was +% generated earlier outside the tagging code. +% +% One could argue that it doesn't matter if the tagging is wrong +% after a \cs{@noitemerr} was issued. However, there is one case +% where it isn't an error: In the \texttt{thebibliography} +% environment (which is internally a list) it is often the case +% that documents start out with an empty environment, not +% containing any \cs{bibitem}s. For that reason \cs{@noitemerr} is +% redefined inside that environment to only produce a warning; +% hence we have to produce correct tag structures in that case. +% \changes{v0.8q}{2024/09/02}{Do not close LI and LBody if they +% never were opened.} % \begin{macrocode} \cs_set:Npn \@@_list_end: { - \legacy_if:nT { @endpe } +% \end{macrocode} +% If \texttt{@newlist} is true (i.e., when we have an error or warning +% situation) there is not much to close. +% \begin{macrocode} + \legacy_if:nF { @newlist } { - \__tag_gincr_para_main_end_int: - \tagstructend % text-unit - \@@_debug_typeout:n{Structure-end~ P~ at~ list-end \on@line } + \legacy_if:nT { @endpe } + { + \__tag_gincr_para_main_end_int: + \tagstructend % text-unit + \@@_debug_typeout:n{Structure-end~ P~ at~ list-end \on@line } + } + \tagstructend\tagstructend % end LBody, LI } - \tagstructend\tagstructend % end LBody, LI \tagstructend % end L } % \end{macrocode} diff --git a/macros/latex/required/latex-lab/latex-lab-block.pdf b/macros/latex/required/latex-lab/latex-lab-block.pdf Binary files differindex 34e2a248fa..4b0855a05d 100644 --- a/macros/latex/required/latex-lab/latex-lab-block.pdf +++ b/macros/latex/required/latex-lab/latex-lab-block.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-firstaid.dtx b/macros/latex/required/latex-lab/latex-lab-firstaid.dtx index ce0d46f815..118baccd79 100644 --- a/macros/latex/required/latex-lab/latex-lab-firstaid.dtx +++ b/macros/latex/required/latex-lab/latex-lab-firstaid.dtx @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabfirstaiddate{2024-05-25} -\def\ltlabfirstaidversion{0.85d} +\def\ltlabfirstaiddate{2024-10-16} +\def\ltlabfirstaidversion{0.85h} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -53,7 +53,9 @@ % % Similar to the main firstaid package the goal is to remove the % patches once the packages have been updated. - +% +% \changes{v0.85g}{2024/10/04}{Removed firstaid for blindtext. No longer needed with new doenpe-code.} +% \changes{v0.85g}{2024/10/04}{Added firstaid for fancyvrb.} % \section{Implementation} % % \begin{macrocode} @@ -87,12 +89,11 @@ } } \exp_args:Ncx\str_if_eq:onT{ver@#1.#2}{#3} } -\ExplSyntaxOff % \end{macrocode} % \end{macro} % \subsection{ams classes} -% The amsart and amsbook classes do not use \cs{@author} to store the author list +% The amsart, amsbook and amsproc classes do not use \cs{@author} to store the author list % but a command \cs{authors}. To be able to nevertheless use the authors in the % xmp-metadata we map \cs{@author} to this new command. % @@ -101,9 +102,179 @@ {\def\@author{\authors}} \AddToHook{class/amsbook/after} {\def\@author{\authors}} +\AddToHook{class/amsproc/after} + {\def\@author{\authors}} % \end{macrocode} % +% \subsection{ams classes and amsthm} +% The amsart, amsbook and amsproc classes redefine the theorem code +% and this breaks the tagging added by the block code. The following +% reenables tagging. It does \emph{not} give a completly identical output +% (similar to the new theorem code, +% see \url{https://github.com/latex3/tagging-project/issues/715}). +% The code also does not try to use sockets yet, as the theorem definitions +% in the block code don't do that yet either. % +% \begin{macrocode} +\AddToHook{class/amsart/after}[latex-lab-testphase-firstaid/amsthm] + {\tag_if_active:T{\@@_firstaid_amsthm:}} +\AddToHook{class/amsbook/after}[latex-lab-testphase-firstaid/amsthm] + {\tag_if_active:T{\@@_firstaid_amsthm:}} +\AddToHook{class/amsproc/after}[latex-lab-testphase-firstaid/amsthm] + {\tag_if_active:T{\@@_firstaid_amsthm:}} +\AddToHook{package/amsthm/after}[latex-lab-testphase-firstaid/amsthm] + {\tag_if_active:T{\@@_firstaid_amsthm:}} +% \end{macrocode} +% \changes{v0.85h}{2024/10/16}{moved Caption tag into \@begintheorem, tagging issue\#733} +% \begin{macrocode} +\cs_new_protected:Npn \@@_firstaid_amsthm: + { +% \end{macrocode} +% \cs{@endtheorem} must use the endblock code +% \begin{macrocode} + \def\@endtheorem{\endblockenv} +% \end{macrocode} +% In \cs{@thm} we have to remove the \cs{trivlist} +% \begin{macrocode} + \RenewDocumentCommand\@thm{mmmO{}}{% + \ifhmode\unskip\unskip\par\fi + \normalfont + \let\thmheadnl\relax + \let\thm@swap\@gobble + \thm@notefont{\fontseries\mddefault\upshape}% + \thm@headpunct{.}% add period after heading + \thm@headsep 5\p@ plus\p@ minus\p@\relax + \thm@space@setup + ##1% style overrides + \@topsep \thm@preskip % used by thm head + \@topsepadd \thm@postskip % used by \@endparenv +% \end{macrocode} +% We store the counter name so that the anchor can make use of it. +% \begin{macrocode} + \tl_set:Nn \l__block_thm_current_counter_tl{##2} + \tl_if_empty:nTF{##2} + { + \@begintheorem{##3}{}[##4] + } + { + \@kernel@refstepcounter{##2} + \@begintheorem{##3}{\csname the##2\endcsname}[##4] + } + } +% \end{macrocode} +% \cs{@begintheorem} has a larger number of changes +% \begin{macrocode} + \def\@begintheorem##1##2[##3]{% +% \end{macrocode} +% We use the theorem instance. +% \changes{v0.85h}{2024/10/16}{Added pre and post skips tagging/733} +% \begin{macrocode} + \UseInstance{blockenv}{theorem}{beginsep=\thm@preskip} +% \end{macrocode} +% There is no working key to set the endskip, so we set the skip directly +% similar to what amsthm is doing after the \cs{trivlist}. +% \begin{macrocode} + \skip_set:Nn\l__block_topsepadd_skip { \thm@postskip } +% \end{macrocode} +% While create the caption/label we disable para-tagging. +% \begin{macrocode} + \tagpdfparaOff + \mode_leave_vertical: +% \end{macrocode} +% The anchor for links. amsthm allows for unnumbered theorems so we have to test +% for an empty counter. +% \changes{v0.85h}{2024/10/16}{add test if counter is empty tagging/736} +% \begin{macrocode} + \tl_if_empty:NTF \l__block_thm_current_counter_tl + {\MakeLinkTarget[theorem]{}} + {\MakeLinkTarget{\l__block_thm_current_counter_tl}} + \group_begin: + \normalfont + \the\thm@headfont \thm@indent + \@ifempty{##1} + {\let\thmname\@gobble} +% \end{macrocode} +% we insert the MC and the Lbl structure into \cs{thmname}, +% \cs{thmnumber} and \cs{thmnote}. This will also work +% with new theorem style as long as they use these command. +% \begin{macrocode} + {\def\thmname####1{\tag_mc_begin:n {}####1\tag_mc_end:}}% + \@ifempty{##2} + {\let\thmnumber\@gobble} + {\def\thmnumber####1 + {\tag_struct_begin:n{tag=Lbl}\tag_mc_begin:n {} + ####1 + \tag_mc_end:\tag_struct_end:}}% + \@ifempty{##3} + {\let\thmnote\@gobble} + {\def\thmnote####1{\tag_mc_begin:n{}####1\tag_mc_end:}}% + \tag_struct_begin:n{tag=Caption} + \thm@swap\swappedhead\thmhead{##1}{##2}{##3}% + \tag_mc_begin:n{}\the\thm@headpunct\tag_mc_end: + \tag_struct_end: + \thmheadnl % possibly a newline. + \hskip\thm@headsep + \group_end: +% \end{macrocode} +% Now we restart para tagging and start a paragraph. The socket +% is currently defined in tagpdf, so the code should only +% be used if tagging is active! +% \begin{macrocode} + \tagpdfparaOn + \UseTaggingSocket{para/begin} % + \ignorespaces} +% \end{macrocode} +% This redefines the standard styles for the theorem heads. +% \cs{thm@headpunct} has been moved into the head code +% to make tagging more easier. +% \begin{macrocode} + \def\thmhead@plain##1##2##3{% + \thmname{##1} + \thmnumber{ + \@ifnotempty{##1}{~}\@upn{##2} + }% + \thmnote{\pdffakespace\space{\the\thm@notefont(##3)}} + } + \let\thmhead\thmhead@plain + \def\swappedhead##1##2##3{% + \thmnumber{##2} + \thmname{\@ifnotempty{##2}{\nobreakspace}##1} + \thmnote{\pdffakespace\space{\the\thm@notefont(##3)}} + } + \let\swappedhead@plain=\swappedhead +% \end{macrocode} +% At last some adjustments for the proof environment. +% The qed symbols use a drawn box by default. We add an actualtext. +% \begin{macrocode} + \renewcommand{\openbox}{\leavevmode + \hbox to.77778em{\pdf_bdc:nn{Span}{/ActualText<FEFF220E>}% + \pdffakespace\hfil\vrule + \vbox to.675em{\hrule width.6em\vfil\hrule}% + \vrule\hfil\pdf_emc:}} +% \end{macrocode} +% And redefine proof to no longer use a trivlist. +% \begin{macrocode} + \renewenvironment{proof}[1][\proofname]{\par + \pushQED{\qed}% + \UseInstance{blockenv}{theorem}{beginsep=6\p@\@plus6\p@} + \normalfont + \tagpdfparaOff + \AddToHookNext{para/begin} + {\tag_struct_begin:n{tag=Caption} + \tag_mc_begin:n{}% + \textit{##1\@addpunct{.}}% + \tag_mc_end: + \tag_struct_end: + \tagpdfparaOn + \UseTaggingSocket{para/begin} + \pdffakespace\hspace{\labelsep}} + \ignorespaces + }{% + \popQED\endblockenv\par + } + } +\ExplSyntaxOff +% \end{macrocode} % % \subsection{verse} % @@ -210,54 +381,12 @@ %\end{verbatim} % % -% \subsection{blindtext} -% -% The blindtext package generates lists with nested \cs{loop} command. -% The inner loop introduces a group around the list which error when lists are tagged -% as \cs{@doendpe} is lost. -% \begin{macrocode} -\AddToHook{file/blindtext.sty/after}[latex-lab-firstaid]{% - \FirstAidNeededT{blindtext}{sty}{\blindfiledate\space\blindfileversion\space% - blindtext-Package}% - {% - \renewcommand{\blind@items}{% - \setcounter{blind@listcount}{1}% - \loop - \ifblind@optional - \ifblind@long - \item[\blindtext@countitem] \blindtext@text - \else - \item[\blindtext@count] \blindtext@item - \fi - \else % \blind@optionalfalse - \ifblind@long - \item \blindtext@text - \else - \item \blindtext@countitem - \fi - \fi % \ifblind@optional - {% - \loop - \ifnum\value{blindlistlevel}>\value{blindlist@level}% - \stepcounter{blind@levelcount}% - \blind@list[\value{blindlist}]\relax - \addtocounter{blind@levelcount}{-1}% - \setcounter{blind@listcount}{1}% - \repeat - \expandafter}\if@endpe\@doendpe\fi % <----------changed - \ifnum\value{blind@listcount}<\value{blindlist}% - \stepcounter{blind@listcount}% - \repeat - } - }% - } -% \end{macrocode} -% -% % \subsection{cleveref} % % The cleveref package redefines \cs{@makefntext} and this means that the patches in -% the new footnote code fails. We use a hook instead +% the new footnote code fails. We use a hook instead. +% \changes{v0.85h}{2024/10/16}{Remove redefinition of refstepcounter. It no longer uses +% the hook.} % \begin{macrocode} \AddToHook{package/cleveref/after} { @@ -267,16 +396,6 @@ \protected@edef\cref@currentlabel{% [footnote][\arabic{footnote}][\cref@result]% \p@footnote\@thefnmark}} -% \end{macrocode} -% The second problem is that it redefines \cs{refstepcounter} to use an argument. -% In itself this isn't a problem but as the new definition doesn't grab the arguments -% directly it fails over the generic hook inserted at the end of the definition -% \begin{macrocode} - \RenewDocumentCommand\refstepcounter{om}{% - \IfNoValueTF{#1}% - {\refstepcounter@noarg{#2}}% - {\refstepcounter@optarg[#1]{#2}}% - }% } % \end{macrocode} % @@ -290,6 +409,7 @@ % See also issue \url{https://github.com/latex3/tagging-project/issues/69} % % +% \begin{macrocode} \ExplSyntaxOn \AddToHook{package/booktabs/after} { @@ -314,8 +434,145 @@ \tag_mc_end: \int_gdecr:N \g__tbl_row_int \cr} } -\ExplSyntaxOff +\ExplSyntaxOff +% \end{macrocode} + % +% \subsection{fancyvrb} +% The firstaid adds first partial tagging support to the environments +% of fancyvrb (inline verbatim is untested). +% This supports then also packages like minted which internally uses fancyvrb +% and classes like l3doc (where currently the verbatim environment based on fancyvrb +% is overwritten by the block code). +% The environments are surrounded by a \texttt{verbatim} structure, +% every line by a \texttt{codeline} +% structure (this requires the block code, but firstaid should be used only with +% phase-III anyway). Line numbers are tagged as Lbl, currently outside of the +% \texttt{codeline} structure. The frame lines are marked as artifact. +% +% \begin{macro}{\FV@LeaveVMode} +% If we are in vmode we have to open a text-unit structure, if we are +% in hmode we have to set para mode to flattened before the fancyhdr code +% issues the\cs{par}. The closing of the text-unit structure is handled by the +% doendpe code in the block code. +% \begin{macrocode} +\ExplSyntaxOn +\AddToHook{package/fancyvrb/after} +{ + \def\FV@LeaveVMode{% + \if@noskipsec + \leavevmode + \else + \if@FV@ResetMargins\if@inlabel\leavevmode\fi\fi + \fi + \ifvmode + \@noparlisttrue + \__tag_gincr_para_main_begin_int: + \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl} + \else + \bool_set_true:N\l__tag_para_flattened_bool + \@noparlistfalse + \unskip\par + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FV@List} +% At the begin of the list code we have to tag the frame as artifact +% and start the \texttt{verbatim} structure +% \begin{macrocode} + \def\FV@List#1{% + \begingroup + \FV@UseKeyValues + \FV@LeaveVMode + \if@inlabel\else\setbox\@labels=\box\voidb@x\fi + \FV@ListNesting{#1}% + \FV@ListParameterHook + \FV@ListVSpace + \FV@SetLineWidth + \FV@InterLinePenalty + \let\FV@ProcessLine\FV@ListProcessLine@i + \FV@CatCodes + \FV@FormattingPrep + \FV@ObeyTabsInit + \cs_if_exist:NT \FV@BeginListFrame + { + \tag_mc_begin:n{artifact} + \FV@BeginListFrame + \tag_mc_end: + } + \tag_struct_begin:n{tag=verbatim} + } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\FV@EndList} +% At the end of the list code we close the \texttt{verbatim} structure and +% tag the frame as artifact. +% \begin{macrocode} + \def\FV@EndList{% + \FV@ListProcessLastLine + \tag_struct_end: + \cs_if_exist:NT \FV@EndListFrame + { + \tag_mc_begin:n{artifact} + \FV@EndListFrame + \tag_mc_end: + } + \@endparenv + \endgroup + \@endpetrue + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FV@ListProcessLine} +% At last the tagging of the code lines. Here we have to tag also +% numbers and frame parts if they exist. +% \begin{macrocode} + \def\FV@ListProcessLine#1{% + \hbox to \hsize{% + \kern\leftmargin + \hbox to \linewidth{% + \cs_if_exist:NT \FV@LeftListNumber + { + \tag_struct_begin:n{tag=Lbl} + \tag_mc_begin:n{} + \FV@LeftListNumber + \tag_mc_end: + \tag_struct_end: + } + \cs_if_exist:NT \FV@LeftListFrame + { + \tag_mc_begin:n{artifact} + \FV@LeftListFrame + \tag_mc_end: + } + \tag_struct_begin:n{tag=codeline} + \tag_mc_begin:n{}% + \FancyVerbFormatLine{#1}% + \tag_mc_end: + \tag_struct_end:\hss + \cs_if_exist:NT \FV@RightListFrame + { + \tag_mc_begin:n{artifact} + \FV@RightListFrame + \tag_mc_end: + } + \cs_if_exist:NT \FV@RightListNumber + { + \tag_struct_begin:n{tag=Lbl} + \tag_mc_begin:n{} + \FV@RightListNumber + \tag_mc_begin:n{} + \tag_struct_end: + } + } + \hss}} + } +\ExplSyntaxOff +% \end{macrocode} +% \end{macro} % \begin{macrocode} %</package> % \end{macrocode} diff --git a/macros/latex/required/latex-lab/latex-lab-firstaid.pdf b/macros/latex/required/latex-lab/latex-lab-firstaid.pdf Binary files differindex 5df8b1cf4e..a43b493f7d 100644 --- a/macros/latex/required/latex-lab/latex-lab-firstaid.pdf +++ b/macros/latex/required/latex-lab/latex-lab-firstaid.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-float.dtx b/macros/latex/required/latex-lab/latex-lab-float.dtx index a817133713..536aa09cfa 100644 --- a/macros/latex/required/latex-lab/latex-lab-float.dtx +++ b/macros/latex/required/latex-lab/latex-lab-float.dtx @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabfloatdate{2024-03-23} -\def\ltlabfloatversion{0.81e} +\def\ltlabfloatdate{2024-09-20} +\def\ltlabfloatversion{0.81f} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -43,6 +43,9 @@ % customizations}} % % \providecommand\hook[1]{\texttt{#1}} +% \ProvideDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl} +% \ProvideDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl} +% % \begin{documentation} % \begin{abstract} % The following code implements a first draft for the tagging of float @@ -64,7 +67,7 @@ % % A special type, called a H-float, (provided by the float package) % is always placed in the main text stream and does not -% necessarly preserve the order with normal floats of the same type: It is basically +% necessarily preserve the order with normal floats of the same type: It is basically % a minipage with a caption. % % Floats typically contain a figure (or a table, etc.) and a caption, @@ -125,7 +128,10 @@ % % \section{Kernel commands} % \begin{function}{\@current@float@struct} -% This variable holds the structure number of current float structure. +% This variable holds the number of the current float structure. With tagging +% this is the structure number, without tagging a unique counter. A float +% can contain more than one float structure (e.g. if there is more than one +% caption). % \end{function} % % \begin{function}{\@makecaption} @@ -146,22 +152,28 @@ {Code related to the tagging of floats} % \end{macrocode} % \subsection{Variables} -% We rolemap to float to Aside, and float sections to Sect. +% We rolemap floats to Aside, and float sections to Sect. % % \begin{variable}{ % \g_@@_float_sect_prop, % \g_@@_float_types_seq, -% \@current@float@struct +% \@current@float@struct, +% \g_@@_float_int % } % These variables will hold the structure number for the float container % and the list of float types. Currently only figure and table are supported % TODO: interface to declare new float types. +% To set the target for links we need also a unique counter. +% With tagging we could use the structure number, but +% the structure commands now are hidden inside tagging sockets +% so we use a dedicated counter. % \begin{macrocode} \prop_new:N \g_@@_float_sect_prop \seq_new:N \g_@@_float_types_seq \seq_gput_right:Nn \g_@@_float_types_seq {figure} \seq_gput_right:Nn \g_@@_float_types_seq {table} \tl_new:N\@current@float@struct +\int_new:N\g_@@_float_int % \end{macrocode} % \end{variable} % @@ -176,6 +188,19 @@ % \end{macrocode} % \end{variable} % +% \begin{macro}{\@@_float_init:} +% To be able to set unique targets for links, we +% need a counter outside the tagging sockets. +% TODO: check if this command should be public or +% a socket or a hook. +% \begin{macrocode} +\cs_new_protected:Npn \@@_float_init: + { + \int_gincr:N \g_@@_float_int + \tl_set:Ne \@current@float@struct { \int_use:N \g_@@_float_int} + } +% \end{macrocode} +% \end{macro} % %\subsection{Moving float structures} % @@ -260,15 +285,71 @@ { split-float .code:n = { - \@@_float_end: - \@@_float_begin: - \MakeLinkTarget*{floatstructure.\int_use:N\c@g__tag_struct_abs_int} + \UseTaggingSocket{float/end} + \@@_float_init: + \UseTaggingSocket{float/begin} + \MakeLinkTarget*{floatstructure.\@current@float@struct} } } % \end{macrocode} % \end{macro} - -% \subsection{Patching} +% +% \subsection{Tagging sockets} +% For now we test if the sockets are already defined +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/float/begin_plug_str } + { + \NewSocket{tagsupport/float/hmode/begin}{0} + \NewSocket{tagsupport/float/hmode/end}{0} + \NewSocket{tagsupport/float/begin}{0} + \NewSocket{tagsupport/float/end}{0} + } +% \end{macrocode} +% +% \begin{plugdecl}{default (tagsupport/float/hmode/begin)} +% This plug should be used if a float is called in hmode. +% In then closes the MC-chunks and starts the structure. +% \begin{macrocode} +\NewSocketPlug {tagsupport/float/hmode/begin}{default} + { + \@@_float_stop_par: + } +\AssignSocketPlug{tagsupport/float/hmode/begin}{default} +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{default (tagsupport/float/hmode/end)} +% This plug should be used if a float is called in hmode +% and the end of the float it then restarts the MC. +% \begin{macrocode} +\NewSocketPlug{tagsupport/float/hmode/end}{default} + { + \@@_float_start_par: + } +\AssignSocketPlug{tagsupport/float/hmode/end}{default} +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{default (tagsupport/float/begin)} +% \begin{macrocode} +\NewSocketPlug{tagsupport/float/begin}{default} + { + \@@_float_begin: + } +\AssignSocketPlug{tagsupport/float/begin}{default} +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{default (tagsupport/float/end)} +% \begin{macrocode} +\NewSocketPlug{tagsupport/float/end}{default} + { + \@@_float_end: + } +\AssignSocketPlug{tagsupport/float/end}{default} +% \end{macrocode} +% \end{plugdecl} +% % \begin{macro}{\@@_float_stop_par:,\@@_float_start_par:} % if a float is in a par, we need commands to stop and restart the P-mc % \begin{macrocode} @@ -287,8 +368,7 @@ \tag_struct_begin:n{tag=text}% } \tag_mc_begin:n{tag=P} - } - + } % \end{macrocode} % \end{macro} % These commands are the main commands to start and end the float tagging. @@ -315,6 +395,7 @@ \cs_new_protected:Npn\@@_float_end:{\tag_struct_end:} %end Aside % \end{macrocode} +% \subsection{Patching} % This patches the main command \cs{@xfloat}. % There is a : in the code, so we disable expl3 syntax % \begin{macrocode} @@ -337,7 +418,7 @@ % \end{macrocode} % If the float is in hmode we have to interrupt the P % \begin{macrocode} - \@nameuse{@@_float_stop_par:}% <---end P + \UseTaggingSocket{float/hmode/begin}% \@floatpenalty -\@Mii \else \@floatpenalty-\@Miii @@ -383,7 +464,8 @@ % \end{macrocode} % This starts the structure for the float. % \begin{macrocode} - \@nameuse{@@_float_begin:}% + \csname @@_float_init:\endcsname + \UseTaggingSocket{float/begin}% \global \setbox\@currbox \color@vbox \normalcolor @@ -394,14 +476,14 @@ % \end{macrocode} % We add a target for links. TODO: check that it doesn't affect spacing!! % \begin{macrocode} - \MakeLinkTarget*{floatstructure.\number\value{g__tag_struct_abs_int}}% + \MakeLinkTarget*{\@captype.struct.\@current@float@struct}% }% % \end{macrocode} % The end code of the float ... % \begin{macrocode} \def\end@float{% \@endfloatbox - \@nameuse{@@_float_end:}% + \UseTaggingSocket{float/end}% \ifnum\@floatpenalty <\z@ \@largefloatcheck \@cons\@currlist\@currbox @@ -413,7 +495,7 @@ \penalty\@floatpenalty \else \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack - \@nameuse{@@_float_start_par:}% restart P safe here?? + \UseTaggingSocket{float/hmode/end}% \fi \fi } @@ -423,7 +505,7 @@ \def\end@dblfloat{% \if@twocolumn \@endfloatbox - \@nameuse{@@_float_end:}% + \UseTaggingSocket{float/end}% \ifnum\@floatpenalty <\z@ \@largefloatcheck \global\dp\@currbox1sp % @@ -436,7 +518,7 @@ \penalty\@floatpenalty \else \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack - \@nameuse{@@_float_start_par:}% restart P safe here?? + \UseTaggingSocket{float/hmode/end}% \fi \fi \else @@ -453,10 +535,113 @@ \def\hyper@nopatch@caption{} % \end{macrocode} % +% \subsubsection{(Tagging) sockets} +% +% First some temporary sockets. +% These sockets are in lttagging. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/caption/begin_plug_str } + { + \NewSocket{tagsupport/caption/begin}{1} + \NewSocket{tagsupport/caption/end}{0} + \NewSocket{tagsupport/caption/label/begin}{0} + \NewSocket{tagsupport/caption/label/end}{0} + } +% \end{macrocode} +% These socket are currently defined in tagpdf. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/para/begin_plug_str } + { + \NewSocket{tagsupport/para/begin} + \NewSocket{tagsupport/para/end} + } +% \end{macrocode} +% +% \begin{socketdecl}{caption/label} +% This socket is a lightweight start for +% some interface to format the label or add a font command. +% The argument is the label text. +% The default plug \texttt{kernel} adds a colon +% and a space. +% TODO: revisit after checking float and caption packages +% to identify which sockets and hooks are needed. +% \begin{macrocode} +\NewSocket{caption/label}{1} +% \end{macrocode} +% \end{socketdecl} +% +% \begin{plugdecl}{kernel (caption/label)} +% The standard label formatting from the kernel. +% \begin{macrocode} +\NewSocketPlug{caption/label}{kernel} + { + #1:~ + } +\AssignSocketPlug{caption/label}{kernel} +% \end{macrocode} +% \end{plugdecl} +% \begin{plugdecl}{default} +% The caption begin socket takes an argument: the structure number of +% the parent float. If the argument is empty, the current structure is used. +% TODO: a tagpdf key that moves a structure to the begin of the parent. +% The caption is moved to the first position with the firstkid option. +% \begin{macrocode} +\NewSocketPlug {tagsupport/caption/begin}{default} + { + \tl_if_empty:eTF {#1} + { + \tag_struct_begin:n{tag=Caption,firstkid} + } + { + \tag_struct_begin:n{tag=Caption,parent=#1,firstkid} + } + \bool_set_true:N \l__tag_para_flattened_bool + } +\AssignSocketPlug{tagsupport/caption/begin}{default} +% \end{macrocode} +% \end{plugdecl} +% \begin{plugdecl}{default} +% \begin{macrocode} +\NewSocketPlug {tagsupport/caption/end}{default} + { + \tag_struct_end: + } +\AssignSocketPlug{tagsupport/caption/end}{default} +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{default (tagsupport/caption/label/begin)} +% \begin{macrocode} +\NewSocketPlug {tagsupport/caption/label/begin}{default} + { +% \end{macrocode} +% suppress para tagging at the begin. +% \begin{macrocode} + \tagpdfparaOff + \tag_struct_begin:n{tag=Lbl} + \tag_mc_begin:n{} + } +\AssignSocketPlug{tagsupport/caption/label/begin}{default} +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{default (tagsupport/caption/label/end)} +% \begin{macrocode} +\NewSocketPlug {tagsupport/caption/label/end}{default} + { + \tag_mc_end: + \tag_struct_end: + \tagpdfparaOn + } +\AssignSocketPlug{tagsupport/caption/label/end}{default} +% \end{macrocode} +% \end{plugdecl} +% +% \subsubsection{Redefinitions} +% % With hyperref that means that the \cs{refstepcounter} now can affect spacing so we % change that to the kernel refstepcounter: % \begin{macrocode} -\let\@kernel@refstepcounter\refstepcounter %as long it is not in the kernel \def\caption{% \ifx\@captype\@undefined \@latex@error{\noexpand\caption\c_space_tl outside~float}\@ehd @@ -474,22 +659,16 @@ \@kernel@refstepcounter\@captype % \end{macrocode} % we need to reset the target for \cs{addcontentsline}. +% We use \cs{@captype} to support autoref. % \begin{macrocode} - \xdef\@currentHref{floatstructure.\@current@float@struct}% + \xdef\@currentHref{\@captype.struct.\@current@float@struct}% } \expandafter\@firstofone \fi {\@dblarg{\@caption\@captype}}% } % \end{macrocode} -% As we will use the structure number in the target, we need to provide a -% theH-representation. (Once the kernel will create -% theH-representation generally this will be provided automatically, as tagpdf uses -% \cs{newcounter}) -% \begin{macrocode} -\providecommand\theHg__tag_struct_abs_int{\int_use:N\c@g__tag_struct_abs_int} -% \end{macrocode} - +% % \begin{macro}{\@makecaption} % \cs{@makecaption} is defined by the classes so we overwrite it for now % at begin document. @@ -501,53 +680,36 @@ % \end{macrocode} % we don't want tagging when storing the caption for the singleline check % \begin{macrocode} - \tag_stop:n{caption} + \SuspendTagging{\@makecaption} \sbox\@tempboxa{#1:~#2}% - \tag_start:n{caption} + \ResumeTagging{\@makecaption} % \end{macrocode} -% we stop paratagging. TODO: check +% We pass \cs{@current@float@struct} as parent structure +% number. If that is empty the socket will use the parent structure and hope ... % \begin{macrocode} - \tagtool{para=false} -% \end{macrocode} -% if caption is used outside a float there is perhaps no number, then we use -% the parent structure and hope ... -% \begin{macrocode} - \tl_if_empty:NT \@current@float@struct - { \tl_set:Ne \@current@float@struct {\tag_get:n{struct_num}} } - \tag_struct_begin:n{tag=Caption,parent=\@current@float@struct} -% \end{macrocode} -% move the caption to the begin of the float structure: -% \begin{macrocode} - \tag_if_active:T - { - \seq_gpop_right:cN {g__tag_struct_kids_\@current@float@struct _seq}\l_@@_tmpa_tl - \seq_gput_left:cV {g__tag_struct_kids_\@current@float@struct _seq}\l_@@_tmpa_tl - } + \UseTaggingSocket{caption/begin}{\@current@float@struct} \ifdim \wd\@tempboxa >\hsize - \tag_struct_begin:n{tag=Lbl} - \tag_mc_begin:n{} - #1:~ - \tag_mc_end: - \tag_struct_end: - \tag_mc_begin:n{} - #2\par - \tag_mc_end: + \UseTaggingSocket{caption/label/begin} + \UseSocket{caption/label}{#1} + \UseTaggingSocket{caption/label/end} + \UseTaggingSocket{para/begin} + #2 + \par \else % \end{macrocode} % we don't reuse the box as it doesn't contain tagging, but set the text explicitly. % \begin{macrocode} \global \@minipagefalse \hb@xt@\hsize{\hfil - \tag_struct_begin:n{tag=Lbl} - \tag_mc_begin:n{} - #1:~ - \tag_mc_end: - \tag_struct_end: - \tag_mc_begin:n{} + \UseTaggingSocket{caption/label/begin} + \UseSocket{caption/label}{#1} + \UseTaggingSocket{caption/label/end} + \UseTaggingSocket{para/begin} #2 - \tag_mc_end:\hfil}% + \UseTaggingSocket{para/end} + \hfil}% \fi - \tag_struct_end: %caption + \UseTaggingSocket{caption/end} \vskip\belowcaptionskip} } % \end{macrocode} diff --git a/macros/latex/required/latex-lab/latex-lab-float.pdf b/macros/latex/required/latex-lab/latex-lab-float.pdf Binary files differindex ecba3f3d17..3915910cc0 100644 --- a/macros/latex/required/latex-lab/latex-lab-float.pdf +++ b/macros/latex/required/latex-lab/latex-lab-float.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-footnotes.dtx b/macros/latex/required/latex-lab/latex-lab-footnotes.dtx index a3d044ab87..f4ad7edd9d 100644 --- a/macros/latex/required/latex-lab/latex-lab-footnotes.dtx +++ b/macros/latex/required/latex-lab/latex-lab-footnotes.dtx @@ -17,8 +17,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabfootnotedate{2024-03-12} -\def\ltlabfootnoteversion{0.8d} +\def\ltlabfootnotedate{2024-09-30} +\def\ltlabfootnoteversion{0.8g} %<*driver> \documentclass{l3doc} @@ -228,7 +228,8 @@ % % To cater for different layout configurations there are four % sockets that can be set by a package or -% class but there should be only one per document setting them, i.e., if two packages/classes set them they are mutually +% class but there should be only one per document setting them, +% i.e., if two packages/classes set them they are mutually % incompatible (or rather the last one wins most likely). % These are: % \begin{description} @@ -491,11 +492,21 @@ % \subsection{Technical details for the tagging} % % The following sockets are set up for kernel use, when doing tagging: +% There name and/or function will probably change as they currently +% mix tagging with the link support. +% +% TODO: review this sockets % \begin{description} % \item[\socket{tagsupport/fnmark} (1 argument)] % % \DescribeSocket[noprint]{tagsupport/fnmark} -% +% +% The socket is used in \cs{@footnotemark}/\cs{fnote_footnotemark:} +% and takes \cs{@makefnmark} as argument. It prints the mark in the text +% and surrounds it with a tagging structure and a link. As such it is +% not solely for tagging and so should not be used with \cs{UseTaggingSocket} +% as this would swallow the argument and loose the link support. +% % \fmi{describe and decide on names} % % @@ -503,31 +514,45 @@ % % \DescribeSocket[noprint]{tagsupport/fntext/begin} % +% This socket is used before the main processing socket +% (so before the \cs{insert} command). It opens the FEnote structure. +% As it sets also the tl-var for the current structure and this is used +% in destinations it should not use as tagging socket. +% % % \item[\socket{tagsupport/fntext/end} (no argument)] % % \DescribeSocket[noprint]{tagsupport/fntext/end} % +% This socket is used after the main processing socket +% (so after the \cs{insert} command). It closes the FEnote structure. % % \item[\socket{tagsupport/fntext/mark} (1 argument)] % % \DescribeSocket[noprint]{tagsupport/fntext/mark} -% +% +% This socket is used around the mark in the footnote text. +% It adds tagging support but also link support, so like the other +% tagsupport sockets it should be always active. % % \item[\socket{tagsupport/fntext/text} (1 argument)] % % \DescribeSocket[noprint]{tagsupport/fntext/text} % +% This socket handles mc-chunks around the text of the footnote. As it +% takes an argument (the text) is should not be use as tagging socket either. % % \end{description} % % % The \emph{footnotemark} should create a \texttt{/Lbl} structure\footnote{to make it easier -% to identify the role we use \texttt{/footnotemark} which we rolemap to \texttt{/Lbl}} that should contain a \texttt{/Ref} entry pointing +% to identify the role we use \texttt{/footnotemark} which we rolemap to \texttt{/Lbl}} +% that should contain a \texttt{/Ref} entry pointing % to the structure of the \emph{footnotetext}. % -% The \emph{footnotetext} should create a \texttt{/FENote}\footnote{We tag it as \texttt{/footnote} and role map it.} -% structure with a \texttt{/Ref} +% The \emph{footnotetext} should create a \texttt{/FENote}% +% \footnote{We tag it as \texttt{/footnote} and role map it.} +% structure with a \texttt{/Ref} % entry pointing to the structures of \emph{all} marks related to the note. % The mark at the begin of the % note is in a \texttt{/Lbl}\footnote{We tag it as \texttt{/footnotelabel}.} @@ -582,8 +607,8 @@ % with their own structure number as a key in a property. % % A following \cs{footnotetext} compares its own \cs{@thefnmark} with the values in -% the prop. If there is a match it stores the structure numbers and removes the entries -% from the properties (so in a normal document the property will never contain more than +% the prop. If there is one or more match it stores the structure numbers and removes the entries +% from the property (so in a normal document the property will never contain more than % a few entries). % % This works well as long as the \cs{footnotemark} commands are issued before the \cs{footnotetext} and @@ -626,9 +651,9 @@ % % \subsubsection{\cs{footref}} % -% \cs{footref} use internally the same command to set the mark as \cs{footnotemark}, it only +% \cs{footref} uses internally the same command to set the mark as \cs{footnotemark}, it only % defines \cs{@thefnmark} differently. This \cs{@thefnmark} is not suitable for the method described -% above, as it contains a reference command it can't be used to match a note, also \cs{footref} can +% above: as it contains a reference command it can't be used to match a note, also \cs{footref} can % be used after the note has already been set. \cs{footref} disables therefore the automatic detection. % % Instead the \cs{label} command is @@ -636,7 +661,7 @@ % number to setup the reference and the link. % % The structure related to the \cs{footref} is added to the end of the \texttt{/Ref} array of the note and so the -% \texttt{/Ref} array doesn't necessarly reflect the order of the marks in the document. It would probably +% \texttt{/Ref} array doesn't necessarily reflect the order of the marks in the document. It would probably % be possible to change this, but it is not clear if it actually matters and so it worth the additional coding % and processing. % @@ -672,7 +697,7 @@ % % A \cs{footnotetext} creates a bunch of destinations (in most cases this sums up to % two destinations): one for every structure number in the \texttt{/Ref} (used as target -% by the mark commands) and one for the structure number of the footnotetest itself +% by the mark commands) and one for the structure number of the footnotetext itself % (used as target by \cs{footref}s commands). % % \subsection{Implementation details regarding tagging} @@ -899,8 +924,8 @@ % This is used to pass the structure number of the note around, e.g. % to a label inside the note. % \begin{macrocode} -\tl_new:N \l_@@_currentstruct_tl -\tl_set:Nn \l_@@_currentstruct_tl {1} +\tl_new:N \l_@@_currentstruct_tl +\tl_set:Nn \l_@@_currentstruct_tl {2} % \end{macrocode} % % @@ -1150,6 +1175,21 @@ % % % \begin{macro}{\fnote_footnotetext:n} +% We temporarily test for the tagging socket until it is in the next release: +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/para/restore_plug_str } + { + \NewSocket{tagsupport/para/restore}{0} + \NewSocketPlug{tagsupport/para/restore}{default} + { + \tl_set:Nn \l__tag_para_main_tag_tl {text-unit} + \tl_set_eq:NN \l__tag_para_tag_tl\l__tag_para_tag_default_tl + \bool_set_false:N\l__tag_para_flattened_bool + } + \AssignSocketPlug{tagsupport/para/restore}{default} + } +% \end{macrocode} +% % \begin{macrocode} \cs_new_protected:Npn \fnote_footnotetext:n #1 { \@@_debug_footnotetext: @@ -1191,6 +1231,7 @@ \floatingpenalty \@MM \hsize\columnwidth \@parboxrestore + \UseTaggingSocket{para/restore} \parindent 1em % typical default used in \@makefntext moved up here \def\@currentcounter{footnote} \protected@edef \@currentlabel { \p@footnote \@thefnmark } @@ -1673,7 +1714,7 @@ % % \subsubsection{\pkg{memoir}} % The \pkg{memoir} class redefines various internal commands to inject its -% hooks and addtional code. The following reinstates the kernel command and +% hooks and additional code. The following reinstates the kernel command and % so probably breaks various options of \pkg{memoir}, but without the % changes it errors anyway. The \pkg{footmisc} package should be used to change % for example to para footnotes. @@ -1937,10 +1978,7 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_gput_ref:nn #1 #2 %#1 the structure number receiving the ref #2 { - \tag_if_active:T - { - \tag_struct_gput:nne {#1}{ref}{\tag_struct_object_ref:e { #2 }} - } + \tag_struct_gput:nnn {#1}{ref_num}{#2} } \cs_new_protected:Npn \fnote_gput_refs:nn #1 #2 % pair of numbers { @@ -1951,11 +1989,7 @@ % \end{macrocode} % \end{macro} % -% \begin{macrocode} -\tl_new:N \l_@@_dflt_struct_tl -\tl_set:Nn \l_@@_dflt_struct_tl {1} -% \end{macrocode} -% kernel hooks for taggin +% kernel hooks for tagging % this sets the structure around the whole text % % @@ -1965,25 +1999,30 @@ { \tag_mc_end_push: % \end{macrocode} -% test if a footnote is allowed, if not move up to the document structure. +% test if a footnote is allowed, if not move up to the next sect or +% the document structure. % \begin{macrocode} \tag_check_child:nnTF {FENote}{pdf2} { \tag_struct_begin:n { tag=footnote } } { - \tag_struct_begin:n { tag=footnote,parent=\l_@@_dflt_struct_tl } + \tag_struct_begin:n + { + tag=footnote, +% \end{macrocode} +% We add 0 for now to ensure to get a number even if the sec code is not loaded +% or if the seq is empty (which it shouldn't unless there is an coding error) +% \begin{macrocode} + parent=\int_max:nn{2}{\tag_get:n{current_Sect}+0} + } } % \end{macrocode} % Store the current structure number for labels. % \begin{macrocode} \tl_set:Ne \l_@@_currentstruct_tl { \tag_get:n{struct_num} } % \end{macrocode} -% We want to move the label structure here. So we provide a container -% It number is |\l__fnote_currentstruct_tl| plus 1. -% \begin{macrocode} - \tag_struct_begin:n { tag=footnotelabel }\tag_struct_end: -% \end{macrocode} +% % after we have opened the structure we can use the structure number to % try to detect the connected marks. As with the marks we assume that sometimes % no auto detection is done. @@ -2066,12 +2105,9 @@ \MakeLinkTarget*{footnote*.\l_@@_currentstruct_tl} % \end{macrocode} % Now we add the tagging commands. We move the structure of the label to -% to the container at the begin of the note. -% \begin{NOTE}{UF} -% Check if the NonStruct is really needed. Perhaps we can simply move the mc. -% \end{NOTE} +% the begin of the footnote structure. % \begin{macrocode} - \tag_struct_begin:n { tag=NonStruct,parent=\l_@@_currentstruct_tl +1 } + \tag_struct_begin:n { tag=footnotelabel,parent=\l_@@_currentstruct_tl,firstkid } \tag_mc_begin:n { tag=Lbl } #1 \tag_mc_end: @@ -2446,7 +2482,7 @@ % This can use the default interface, except that a negative value for % \footnotemargin makes little sense, so we test for this and warn if -% necessary. But -\maxdimen is ok again, so would need to be a litte bit more elaborate. +% necessary. But -\maxdimen is ok again, so would need to be a little bit more elaborate. % %\AddToHook{fntext/para}{ @@ -2483,7 +2519,7 @@ \leavevmode % \end{macrocode} % Typesetting the mark twice means that one can't have any material -% inside that gets unhappy in that case. Tha shouldn't be a +% inside that gets unhappy in that case. That shouldn't be a % problem, but perhaps we have to come up with a more elaborate % solution in the end. % \begin{macrocode} diff --git a/macros/latex/required/latex-lab/latex-lab-footnotes.pdf b/macros/latex/required/latex-lab/latex-lab-footnotes.pdf Binary files differindex b949e4680c..c928060b5f 100644 --- a/macros/latex/required/latex-lab/latex-lab-footnotes.pdf +++ b/macros/latex/required/latex-lab/latex-lab-footnotes.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-graphic.dtx b/macros/latex/required/latex-lab/latex-lab-graphic.dtx index 5ea4a2db9c..b3ee3eb6c6 100644 --- a/macros/latex/required/latex-lab/latex-lab-graphic.dtx +++ b/macros/latex/required/latex-lab/latex-lab-graphic.dtx @@ -15,8 +15,8 @@ % https://github.com/latex3/latex2e/required/latex-lab % % for those people who are interested or want to report an issue. -\def\ltlabgraphicdate{2024-03-13} -\def\ltlabgraphicversion{0.80d} +\def\ltlabgraphicdate{2024-09-18} +\def\ltlabgraphicversion{0.80e} % %<*driver> \documentclass{l3doc} @@ -78,7 +78,7 @@ % The value of a \texttt{BBox} is an array of four numbers that gives the % coordinates of the left, bottom, right, and top edges % of the structure element’s bounding box. That is the rectangle that completely encloses -% its \emph{visible} content so not necessarly the TeX bounding box: +% its \emph{visible} content so not necessarily the TeX bounding box: % if \texttt{viewport} or \texttt{trim} is used and the % graphic is not clipped, the visible content can be larger. % @@ -146,8 +146,8 @@ % \item[\texttt{artifact}] When used the graphic will be tagged as artifact. This doesn't % require a \texttt{BBox} and so works also in some of the not yet supported cases described % above. -% \item[\texttt{false}] When used tagging will be stopped completly. It is then the -% responsability of the surrounding code to add appropriate tagging commands. +% \item[\texttt{false}] When used tagging will be stopped completely. It is then the +% responsibility of the surrounding code to add appropriate tagging commands. % \item[\meta{name}] Other values will be used as tag names in the structure. If the tag is not % known as a structure tag you will get an warning from tagpdf. The default name is currently % \texttt{Figure} @@ -291,7 +291,7 @@ % ,\l_@@_graphic_trim_uy_fp % } % A bunch of fp-variables (we don't use tl-vars, -% to avoid to have to take care about minus signs everwhere) +% to avoid to have to take care about minus signs everywhere) % \begin{macrocode} \fp_new:N\l_@@_graphic_sin_fp \fp_new:N\l_@@_graphic_cos_fp @@ -489,7 +489,7 @@ \bool_set_true:N \l_@@_graphic_artifact_bool \bool_set_false:N \l_@@_graphic_BBox_bool } - {false}{\tag_stop:} + {false}{\tag_suspend:n{Gin}} } {\tl_set:Nn\l_@@_graphic_struct_tl{#1}} } @@ -528,7 +528,7 @@ \bool_set_true:N \l_@@_graphic_artifact_bool \bool_set_false:N \l_@@_graphic_BBox_bool } - {false}{\tag_stop:} + {false}{\tag_suspend:n{picture}} } {\tl_set:Nn\l_@@_graphic_struct_tl{#1}} } @@ -1012,7 +1012,7 @@ \@defaultunitsset\@tempdimc{#1}\unitlength \Gin@tag@struct@begin \setbox\@picbox\hb@xt@\@tempdimc\bgroup - \tag_stop: %do not tag inside the picture box + \tag_suspend:n{\@picture} %do not tag inside the picture box \@defaultunitsset\@tempdimc{#3}\unitlength \hskip -\@tempdimc \@defaultunitsset\@tempdimc{#4}\unitlength diff --git a/macros/latex/required/latex-lab/latex-lab-graphic.pdf b/macros/latex/required/latex-lab/latex-lab-graphic.pdf Binary files differindex 18ae18a5a1..48065014f2 100644 --- a/macros/latex/required/latex-lab/latex-lab-graphic.pdf +++ b/macros/latex/required/latex-lab/latex-lab-graphic.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-marginpar.dtx b/macros/latex/required/latex-lab/latex-lab-marginpar.dtx index ca79d8a67f..2f293ee492 100644 --- a/macros/latex/required/latex-lab/latex-lab-marginpar.dtx +++ b/macros/latex/required/latex-lab/latex-lab-marginpar.dtx @@ -18,8 +18,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabmarginpardate{2024-02-12} -\def\ltlabmarginparversion{0.85b} +\def\ltlabmarginpardate{2024-09-18} +\def\ltlabmarginparversion{0.85d} %<*driver> \documentclass[kernel]{l3doc} @@ -72,7 +72,7 @@ % They can be tagged either as artifacts (if they are merely distracting decoration), % as small headings before the paragraph, or as |Aside|. Unlike the PDF 1.7 fallback |Note| % the structure |Aside| is not allowed inside |P|, -% so if |Aside| is used, it must be placed before or after the current |P| in the surounding |text-unit|, +% so if |Aside| is used, it must be placed before or after the current |P| in the surrounding |text-unit|, % or it must split the |P|. Splitting is probably not so good as % |\marginpar| is often used somewhere in the middle of sentence. % The best default is probably to use |Aside|, find the parent |text-unit| and add it there. @@ -153,13 +153,38 @@ \socket_new:nn {tagsupport/marginpar/end}{0} % \end{macrocode} % \end{socketdecl} +% +% \begin{macro}{\@@_get_marginpar_parent:N,\@@_get_marginpar_parent_aux:nn} +% In a paragraph we must retrieve +% the structure number of the surrounding Part structure +% TODO: if this is needed in more places this should +% go into tagpdf. +% \begin{macrocode} +\cs_new_protected:Npn\@@_get_marginpar_parent_aux:nn #1 #2 + { + \str_if_eq:eeT{\use_ii:nn #1}{Part}{\seq_put_right:Nn\l_@@_tmpa_seq {#2}} + } +\cs_new_protected:Npn \@@_get_marginpar_parent:N #1 + { + \seq_clear:N\l_@@_tmpa_seq + \seq_map_pairwise_function:NNN + \g_@@_struct_tag_stack_seq + \g_@@_struct_stack_seq + \@@_get_marginpar_parent_aux:nn + \seq_put_right:Nn\l_@@_tmpa_seq {2} + \seq_get_left:NN \l_@@_tmpa_seq #1 + } +\cs_generate_variant:Nn \tag_struct_begin:n {e} +% \end{macrocode} +% \end{macro} % \begin{plugdecl}{tagsupport/marginpar/begin,tagsupport/marginpar/end} % \begin{macrocode} \socket_new_plug:nnn {tagsupport/marginpar/begin}{default} { \if_mode_horizontal: - \tag_mc_end: - \tag_struct_begin:n{tag=Aside,parent=\g__tag_para_main_struct_tl}% + \tag_mc_end: + \@@_get_marginpar_parent:N \l_@@_tmpa_tl + \tag_struct_begin:e{tag=Aside,parent=\l_@@_tmpa_tl}% \else: \tag_struct_begin:n{tag=Aside}% \fi: @@ -202,9 +227,9 @@ \long\def\@ympar#1{% \@savemarbox\@marbox{#1}% \global\setbox\@currbox\copy\@marbox - \tag_stop: + \tag_suspend:n{\@ympar} \@xympar - \tag_start:} + \tag_resume:n{\@ympar}} % \end{macrocode} % \end{macro} % @@ -223,9 +248,9 @@ \property_record:ee { tag_marginpar-opt-\int_use:N\g__kernel_marginpar_int }{page} }% - \tag_stop: + \tag_suspend:n{\@xmpar} \@savemarbox\@currbox{#2}% - \tag_start: + \tag_resume:n{\@xmpar} } % \end{macrocode} % order matters! the tagged box should be first so that it can pick up @@ -233,15 +258,15 @@ % \begin{macrocode} { \@savemarbox\@currbox{#2}% - \tag_stop: + \tag_suspend:n{\@xmpar} \@savemarbox\@marbox{#1 \property_record:ee { tag_marginpar-opt-\int_use:N\g__kernel_marginpar_int }{page}} - \tag_start: + \tag_resume:n{\@xmpar} } - \tag_stop: + \tag_suspend:n{\@xmpar} \@xympar - \tag_start: + \tag_resume:n{\@xmpar} } %</package> % \end{macrocode} diff --git a/macros/latex/required/latex-lab/latex-lab-marginpar.pdf b/macros/latex/required/latex-lab/latex-lab-marginpar.pdf Binary files differindex 5379c2d640..9db1bd0b70 100644 --- a/macros/latex/required/latex-lab/latex-lab-marginpar.pdf +++ b/macros/latex/required/latex-lab/latex-lab-marginpar.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-math.dtx b/macros/latex/required/latex-lab/latex-lab-math.dtx index 0dbc591185..94d31c817b 100644 --- a/macros/latex/required/latex-lab/latex-lab-math.dtx +++ b/macros/latex/required/latex-lab/latex-lab-math.dtx @@ -19,13 +19,13 @@ % for those people who are interested or want to report an issue. % % -\def\ltlabmathdate{2024-04-16} -\def\ltlabmathversion{0.5j} +\def\ltlabmathdate{2024-10-25} +\def\ltlabmathversion{0.6i} % %<*driver> \documentclass{l3doc} \EnableCrossrefs -\CodelineIndex +\CodelineIndex \usepackage{todonotes} @@ -40,7 +40,7 @@ % \title{The \texttt{latex-lab-math} code\thanks{}} % \author{Frank Mittelbach, Joseph Wright, \LaTeX{} Project} % \date{v\ltlabmathversion\ \ltlabmathdate} -% +% % \maketitle % % \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}} @@ -77,21 +77,21 @@ % \tableofcontents % % \section{Introduction} -% \car*{Todo: update all the documentation! Both here and +% \car*{Todo: update all the documentation! Both here and % (what little there is!) in the implementation section.} % % Tagging math involves a variety of tasks that require that math is captured before the % typesetting -% \begin{itemize} -% \item When typesetting the math MC-tags and structure commands must -% be inserted at the begin and the end, and perhaps also around lines -% or other subparts of the equation. +% \begin{itemize} +% \item When typesetting the math MC-tags and structure commands must +% be inserted at the begin and the end, and perhaps also around lines +% or other subparts of the equation. % \item The source and/or a mathml-representation of the source must be available % so that it can be (perhaps after some preprocessing) be used in an associated file % or in an alternate text -% \item It must be possible to measure the math for e.g. a bbox setting. +% \item It must be possible to measure the math for, e.g., a bbox setting. % \end{itemize} -% +% % This file implements capture of all math mode material at the outer % level, i.e., a formula is captured in its entirety with inner text % blocks (possibly containing further math) absorbed as part of the @@ -101,24 +101,24 @@ %\end{verbatim} % would only result in a single capture of the tokens % ``\verb*/a \in A \text{ for all $a<5$}/''. -% +% % % \section{Math capture} \label{sec:mathcapture} -% In the current setup +% In the current setup % \begin{itemize} % \item |$|, |\(...\)| and |$$| grab (through a command in \cs{everymath}/cs{everydisplay}) % if the boolean \cs{l_@@_collected_bool} is false. % If the boolean is true they behave normally and can for example contain verbatim. -% -% \item All (registered) environments grab their body +% +% \item All (registered) environments grab their body % regardless of the state of the boolean. For -% |equation|, |equation*| and |math| this is a change as they no longer can +% |equation|, |equation*| and |math| this is a change as they no longer can % contain verbatim. -% +% % \item BUG: |\[...\]| grabs if \cs{l_@@_collected_bool} is false. If it is -% true it falls back to |equation*| and then errors because this can't find the end. -% \end{itemize} -% +% true it falls back to |equation*| and then errors because this can't find the end. +% \end{itemize} +% % \subsection{Code level interfaces} % % \begin{function}{\math_register_env:n, \math_register_env:nn} @@ -163,49 +163,52 @@ % material. % \end{itemize} % \end{function} -% +% % \section{Math tagging} -% -% The tagging code has to handle +% +% \subsection{Code requirements} +% The tagging code has to handle % \begin{itemize} -% \item the embedding into the surrounding. This means -% \begin{itemize} -% \item closing and reopening MC-chunks +% \item the embedding into the surrounding. This means +% \begin{itemize} +% \item closing and reopening MC-chunks % \item closing and reopening text/P-structures % \item handling interferences of the tagging code with penalties and spacing. % \end{itemize} % \item the actual tagging which means to do some or all of the following tasks: % \begin{itemize} % \item setup content for an associated source file -% \item setup content for an associated mathml file +% \item setup content for an associated mathml file % \item setup content for the /Alt key % \item setup content for the /ActualText key % \item setup attributes -% \item add associated files +% \item add associated files % \item add a Formula structure -% \item surround subparts (e.g. lines) with Formula sub structures +% \item surround subparts (e.g., lines) with Formula sub structures % (perhaps with their own set of additional content) -% \item surround elements of the equation with mathml structure elements +% \item surround elements of the equation with mathml structure elements % (currently only luatex with luamml) % \end{itemize} % \end{itemize} -% +% % \subsection{Inline math} -% +% % The embedding code is added through -% the sockets +% the sockets % \begin{itemize} -% \item |tagsupport/math/inline/begin| +% \item |tagsupport/math/inline/begin| % \item |tagsupport/math/inline/end| -% \end{itemize} +% \end{itemize} % The sockets simply push and pop the MC currently. Without -% tagging they use the noop-plug. -% +% tagging they use the noop-plug. +% % The actual tagging is in done through the sockets % \begin{itemize} % \item |tagsupport/math/inline/formula/begin| % This socket takes the math as argument and its code -% should output it for typesetting. Without tagging the +% should output it for typesetting. +% It is not \emph{used} as a tagging socket as the math argument should +% not be lost without tagging, so without tagging the % socket uses the identity plug. % The |default| plug of the socket calls these three internal sockets % for the tagging support: @@ -216,55 +219,62 @@ % \item |tagsupport/math/struct/begin| This calls \cs{tag_struct_begin:n}. % It should also write the associated files if needed. % \item |tagsupport/math/substruct/begin| this handles subparts. -% TODO: does it really make sense in inline math to have that?? +% TODO: does it really make sense in inline math to have that?? % \end{itemize} % \item |tagsupport/math/inline/formula/end| % This socket ends the formula structure(s). The |default| % plug calls these internal sockets: % \begin{itemize} % \item |tagsupport/math/substruct/end| -% \item |tagsupport/math/struct/end| +% \item |tagsupport/math/struct/end| % \end{itemize} -% \end{itemize} -% +% \end{itemize} +% % \subsection{Display math} -% +% % \textit{to be written} -% +% % \subsection{Associated Files} -% +% % The current code allows the attachment of two types of associated file to the % Formula structure: -% the \LaTeX\ source and a MathML representation. +% the \LaTeX\ source and a MathML representation. % Technically both can be attached---AF is an array -% of file references---practically there can be problems with PDF consumers: -% e.g. ngpdf used both and so showed the equation twice -% (this has been corrected in the newest version) and +% of file references-----in practice there can be problems with PDF consumers: +% e.g., ngpdf used both and so showed the equation twice +% (this has been corrected in the newest version) and % Foxit seems to see only the first AF in the array (so we attach the % mathml as first file). -% -% The \LaTeX\ source can be (and is) attached automatically. +% +% The \LaTeX\ source can be (and is) attached automatically. % It can be suppressed by an option with -% \texttt{math/tex/AF=false}, see below. -% -% The MathML is attached if a file |\jobname-mathml.html| is found and -% if it contains a suitable MathML snippet for the current formula. +% \texttt{math/tex/AF=false}, see below. +% +% The MathML is attached if the files |\jobname-mathml.html| and/or +% |\jobname-luamml-mathml.html| are found +% and if they contains a suitable MathML snippet for the current formula. +% If the files contain more than one suitable snippet (as identified by the hash) +% the first one is used. +% |\jobname-luamml-mathml.html| is automatically generated (see below section~\ref{sec:luamml}) +% and read after |\jobname-mathml.html|. This means that |\jobname-mathml.html| can contain +% improved versions of a formula. +% % The MathML processing can be suppressed globally by emptying the list of % mathml files with |math/mathml/sources=|. Locally for a formula |math/mathml/AF=false| -% can be used. -% -% For a MathML representation a file with such representations must be provided. -% If the equation is numbered the numbering should be part of the MathML as +% can be used. +% +% For a MathML representation a file with such representations must be provided. +% If the equation is numbered the numbering should be part of the MathML as % the |Lbl| substructure is ignored if an MathML is used (see https://github.com/foxitsoftware/PDF_UA-2). -% -% The MathML representation is given in a special format. +% +% The MathML representation is given in a special format. % It is meant to be a valid html file % that can be viewed in a browser. % For this it can start with |<!DOCTYPE html><html>| and end with |</html>| -% It should have the extension \texttt{.html}. The \meta{mathml} content +% It should have the extension \texttt{.html}. The \meta{mathml} content % is read with special catcodes, so can contain ambersands, hashes, comment chars % and unmatched braces such as |<mo>{</mo>| -% +% % The file should contain a number of representations in this format: % \begin{quote} % |<div>| \\ @@ -278,176 +288,338 @@ % \end{quote} % The keywords |<div>|, |<h2>\mml|, |<p>|, |<math|, |</math>| |</div>| are required as % they are used to delimit the arguments by the \LaTeX{} code. -% +% % \meta{key} and \meta{source} are only used for debugging, they help to identify % the equation referred by this representation. The source should be used correctly escaped % |&| and |<| so that if gives valid html! -% -% \meta{attributes} is not required either, but can e.g. contain attributes +% +% \meta{attributes} is not required either, but can, e.g., contain attributes % to improve the display in a browser: % \begin{verbatim} % <math alttext="\mathbf{G}" class="ltx_Math" display="inline"> % \end{verbatim} % It can also contain the name space declaration: |xmlns="http://www.w3.org/1998/Math/MathML"|% % \footnote{But it is probably not needed and only blows up the PDF.} -% -% -% By default the code tries at the begin of the document -% to read a file |\jobname-mathml.html| in the |html|-format. -% The file name can be changed with |mathml/setfiles={filename1,filename2}| -% (without extension, |html| is added automatically). -% If there is a list, all files are loaded. +% +% +% By default the code tries at the begin of the document +% to read a file |\jobname-mathml.html| in the |html|-format. +% The file name can be changed with |mathml/setfiles={filename1,filename2}| +% (without extension, |html| is added automatically). +% If there is a list, all files are loaded. % If a file doesn't exist it is ignored, only an info is written to the log. -% -% Currently every MathML-snippet from a file is embedded into the PDF, -% it is not checked first if it is actually used (simply writing everything to the PDF -% is a bit easier than keeping everything in memory and also means that -% the snippets are one after the other in the PDF). -% -% As mentioned above the MathML-AF can be suppressed for the equations in a group with +% +% Currently every MathML-snippet from a file is embedded into the PDF, +% it is not checked first if it is actually used (simply writing everything to the PDF +% is a bit easier than keeping everything in memory and also means that +% the snippets are one after the other in the PDF). +% +% As mentioned above the MathML-AF can be suppressed for the equations in a group with % |math/mathml/AF=false|, or -% completly by setting |math/mathml/sources=| in the preamble. -% +% completely by setting |math/mathml/sources=| in the preamble. +% % Files embedded in a PDF can be listed in the attachments panel of a PDF viewer. % This is probably not so useful for lots of small files (but one could create -% collections), but as long as PDF editors or viewers don't offer +% collections), but as long as PDF editors or viewers don't offer % proper support to access the AF it can help so have them there. The MathML are % added by default, but the \LaTeX{} source not. This can be changed with % |viewer/pane/mathsource=true| (anywhere in the document) and |viewer/pane/mathml=false| (in the -% preamble, before the external file is read). +% preamble, before the external file is read). +% +% +% \subsection{Automatic mathml creation with luamml}\label{sec:luamml} +% +% If lualatex and the package \pkg{unicode-math} is used +% the package \texttt{luamml} is loaded and +% will automatically generate the file |\jobname-luamml-mathml.html| +% with mathml representations of all math formulas. +% This file is then used in subsequent compilations and works also with +% pdflatex. +% +% The generation of the file can be suppressed (in the preamble) +% with |math/mathml/luamml/write=false|. % -% \subsection{Options} -% -% +% If the package \pkg{unicode-math} is not used, +% the loading of \pkg{luamml} and with it the generation of the file can be forced +% with |math/mathml/luamml/load=true| or |math/mathml/luamml/write=true| +% but be aware that it is then possible that various symbols +% are mapped to the wrong Unicode code points. +% +% The package \pkg{luamml} is still quite experimental and the output should be checked. +% The |\jobname-luamml-mathml.html| file may be previewed in a browser although +% you may need to add additional css or javascript declarations +% to enable browser support for all mathml constructs. +% +% +% \subsection{Summary of math options} +% The following options exist to make math more accessible: +% \begin{description} +% \item[ActualText] An \texttt{ActualText} can be placed on structure elements, +% but can also be added in the stream on a \texttt{BDC} marker with a \texttt{Span} +% tag (normally an independant marker without an MCID number, it is not clear yet +% if it can be used on a MC-chunk). +% The content is a text string, typically one or a few Unicode characters. +% \texttt{ActualText} is meant to replaces the content +% and should only be used on small entities, +% e.g., to define the semantic or the Unicode code point of a symbol. +% \texttt{ActualText} is not supported by all PDF reader. +% It is also unknown where it should be used at best (in a structure element, +% or on an independent Span-BDC) and what happens if it is used in more than +% one place. +% \begin{description} +% \item[enabled by default?] False +% \item[how to enable/disable] No interface yet. +% \texttt{ActualText} can only be added on the Formula structure element by +% changing the \texttt{tagsupport/math/content} or some other socket. +% For a BDC marker one can, e.g., use +% \begin{verbatim} +% \pdf_string_from_unicode:nnN{utf16/hex}{€}\l_tmpa_tl +% \pdf_bdc:ee{Span}{/ActualText\l_tmpa_tl}content\pdf_emc: +% \end{verbatim} +% There should be no pagebreak in the \meta{content} and the BDC should be correctly +% nested into tagging, so, e.g., a \cs{leavevmode} should be issued before the bdc command. +% \item[Consumer support] in part and in part buggy, needs tests \ldots +% \end{description} +% +% \item[Alt] Like \texttt{ActualText} the \texttt{Alt} key can be used on +% structure elements and on \texttt{Span} in the stream. It should contain a description +% of the content and is mainly meant for images. PDF/UA-1, +% which views math formulas as illustrations, mandates the key +% also for \texttt{Formula} structure elements. +% \begin{description} +% \item[enabled by default?] false unless PDF/UA-1 is detected, +% then it is enabled in the begindocument/end hook +% (this will reconsidered when it is clear, that +% the use of \texttt{Alt} does not shadow mathml). It can be enabled for +% all engines and PDF versions. +% \item[enable/disable] \verb+\tagpdfsetup{math/alt/use}+ (local boolean, +% so can be used on individual equations) +% \item[default value] A template text (stored in \cs{l_@@_content_template_tl}) +% starting with \texttt{LaTeX formula starts}. +% \item[user value] No interface currently provided. This needs optional arguments +% or an external setup command. +% See \url{https://github.com/latex3/tagging-project/discussions/717}. +% +% \end{description} +% +% \item[source-AF] The \LaTeX{}-source of the equation can +% be attached as an associated file with mime-type +% application/Fx-tex. The \texttt{AFRelationship} is \texttt{Source}. +% The source is embedded without expansion. This means that targets of +% references and macros are not resolved. +% The files are by default not shown in the EmbeddedFiles pane, +% this can be enabled with |viewer/pane/mathsource=true|. +% If an A-standard is used, it must be one that allows embedded files, e.g., A-4f. +% +% \begin{description} +% \item[enabled by default?] true for all engines and PDF versions +% \item[enable/disable] \verb+\tagpdfsetup{math/tex/AF}+ (local boolean, so can +% be used on individual equations) +% \item[default value] source code including dollars or environment name. +% \item[consumer support] Currently only ngpdf makes +% use of it: if there is no mathml it passes the source to mathjax. +% \end{description} +% +% \item[luamml] The following options make (with lualatex) use +% of the \pkg{luamml} package. \pkg{luamml} is currently automatically +% loaded (at the end of the preamble) if \pkg{unicode-math} has been detected. +% The loading can be forced or suppressed +% with \verb+\tagpdfsetup{math/mathml/luamml/load=true/false}+. +% +% \pkg{luamml} affects all math, locally it can be stopped with |math/mathml/ignore|, +% or by using the commands described in the package. +% +% \item[mathml-AF] A mathml representation of the equation can be attached +% to the structure. The configuration possibilities are rather complex as the +% keys have to control three different tasks: +% The \emph{generation} of the file with the mathml fragments, +% the \emph{reading} and \emph{embedding} of the mathml fragments, +% and the \emph{association} of a mathml fragment to a specific equation. +% +% \begin{description} +% \item[generation] +% With pdf\LaTeX{} mathml fragments can not be generated automatically, +% but a file with dummy fragments for every equation will be written if +% \verb+\tagpdfsetup{math/mathml/write-dummy}+ is issued in the preamble. +% +% With lua\LaTeX{} a file with mathml fragments will be created automatically +% if the package \pkg{luamml} has been loaded (see above). +% +% \item[reading and embedding] +% By default the code will read and embed +% mathml from |\jobname-mathml.html| and |\jobname-luamml-mathml.html| in this order and +% the first fragment with a new hash value will be inserted.% +% The list of sources and their order can be changed with the key +% |math/mathml/sources|, setting that to an empty value suppresses +% the loading mathml associated files completely. For efficiency reasons +% it embeds math fragments directly, there is no check yet if the fragment is +% actually used. +% +% The files are by default shown in the EmbeddedFiles pane, +% this can be disabled with |viewer/pane/mathml=false|. +% +% \item[attaching] A mathml fragment is currently +% attached as an associated file to an Formula if the hash of +% the source matches the hash of the fragment. This is not a perfect test: +% equations with the same source and so the same hash +% can have different mathml representation, e.g., +% if there are references or commands or counters in the equation. This +% will change in a feature version. +% The attachment can be suppressed locally with |math/mathml/AF=false|. +% The mathml fragment will still be embedded in the PDF! +% +% % TODO: adapt test +% \end{description} +% +% \item[mathml structure elements] +% Mathml structure elements can be used in PDF~2.0 directly. +% In PDF~1.7. one could theoretically +% use them if one declares a role mapping first, +% (this can be done with \verb+\tagpdfsetup{role/mathml-tags}+) +% which maps all to \texttt{Span}. But such a role mapping currently breaks reading, +% e.g. in Adobe, and so it is not recommended. +% +% Automatic generation of structure elements is only possible with +% lualatex. It requires that the packages \pkg{luamml} and \pkg{tagpdf} +% have been loaded. +% \begin{description} +% \item[enabled by default?] false +% \item[enable/disable] \verb+\tagpdfsetup{math/mathml/structelem}+ +% (local setting, so can be used with grouping on individual equations). +% \item[consumer support] Needs more tests. +% \end{description} +% +% \end{description} +% +% +% % \section{Known current bugs, etc.} -% \car*{New Section, now with subsections.\\ -% As indicated, these lists are probably incomplete.\\ -% Some of these have been addressed in a more recent branch.} % % \subsection{Capture/grabbing problems} -% +% % \begin{enumerate} -% \item Incorrect grabbing of |$|-math when there is also -% explicit |$|-math within a \textit{text environment} +% \item Incorrect grabbing of |$|-math when there is also +% explicit |$|-math within a \textit{text environment} % that is itself within the math that should all be grabbed. % For example, % \begin{verbatim} % $a\begin{minipage}{1cm}$b$\end{minipage}$ % \end{verbatim} % would only result in the capture of the tokens -% ``\verb*/a\begin {minipage}{1cm}/''. +% ``\verb*/a\begin {minipage}{1cm}/''. % This can be avoided by an additional brace group: % \begin{verbatim} % $a{\begin{minipage}{1cm}$b$\end{minipage}}$ -% \end{verbatim} -% +% \end{verbatim} +% % \item Similar incorrect grabbing with |$$| also. -% +% % \item The grabbing, for all the display environments (and |\) \]|), needs -% to deal with nesting: \pkg{amsmath} contains code for this. -% -% \item The math can't contain verbatim and verbatim-like commands. This is +% to deal with nesting: \pkg{amsmath} contains code for this. +% +% \item The math can't contain verbatim and verbatim-like commands. This is % nothing new for the \pkg{amsmath} environments but changes |$| and |\[\]| -% and |equation*| (see e.g. tagging-project issue \#30). -% +% and |equation*| (see, e.g., tagging-project issue \#30). +% % \item Begin and end of the math or math environment can not be hidden in commands. -% For example \verb+>{$}l<{$}+ in a tabular would lead to errors. -% Defining |\[| to fall back to |equation*| doesn't work if |equation*| is +% For example \verb+>{$}l<{$}+ in a tabular would lead to errors. +% Defining |\[| to fall back to |equation*| doesn't work if |equation*| is % a grabbing environment. -% +% % \item The behaviour of |\[...\]| is faulty. See above. -% \end{enumerate} +% \end{enumerate} % % \subsection{Fake math} -% In a number of places in \LaTeX{} math commands (mainly |$|) is used -% only for technical reason, e.g. to access a math font, to setup a symbol -% or to use \cs{vcenter}. -% +% In a number of places in \LaTeX{} math commands (mainly |$|) is used +% only for technical reason, e.g., to access a math font, to setup a symbol +% or to use \cs{vcenter}. +% % The code identifies such fake math mostly by making use of the \cs{m@th} command % where two methods are used for the automatic detection: -% +% % \begin{itemize} -% \item After grabbing math content the code checks if the content contains the token +% \item After grabbing math content the code checks if the content contains the token % \cs{m@th} and if yes it doesn't call the processor before reinserting % the content and perhaps adding tagging code. % This method requires that the math can be grabbed (e.g. that the end dollar is visible) % and that the \cs{m@th} is visible. It applies for example in \cs{@iiiparbox} where the % code from |$\vcenter| to |\m@th$| is grabbed an put back. It does not work for % example for |tabular| where the dollars and the \cs{m@th} token are spread around -% over three commands. |tabular| needs therefore manual intervention. -% +% over three commands. |tabular| needs therefore manual intervention. +% % A look in the list of usages (in \texttt{usage-of-m@th.md}) justifies this approach. % All usages are either not math at all, or related to small elements that probably -% shouldn't be grabbed and processed on their own. +% shouldn't be grabbed and processed on their own. % % \item \cs{m@th} is redefined so that it sets the boolean \cs{l_@@_collected_bool} % to true. If \cs{m@th} is used inside math that has been grabbed % this doesn't change much as the boolean is set by the grabbing anyway. For usages % outside math the benefit is not so clear: The setting avoids that in \cs{LaTeXe} % the epsilon is processed as math, but it also prevents that the content of the amsmath -% command \cs{boxed} is processed as math. +% command \cs{boxed} is processed as math. % It means that if one wants to reenable math processing inside some (fake) math % one has to do it after \cs{m@th} calls. % \end{itemize} -% -% Open problems +% +% \subsubsection{Open problems} +% % \begin{enumerate} % \item The grabbing code doesn't pass the info that it detected a \cs{m@th} token. % This means that the tagging code has to do the same check (and doesn't do this % in all cases yet). -% -% \item Commands are missing to locally disable the grabbing and processing, e.g. +% +% \item Commands are missing to locally disable the grabbing and processing, e.g., % to handle |tabular|. -% +% % \item It must be checked if setting the boolean in \cs{m@th} really makes sense -% or if commands like \cs{LaTeXe} should be handled manually. -% +% or if commands like \cs{LaTeXe} should be handled manually. +% % \end{enumerate} -% +% % \subsection{Processor} -% +% % The grabbed math is at first passed to the processor. The processor is not called -% in a measuring phase (from the amsmath \cs{ifmeasuring@}) and if the \cs{m@th} -% token is detected. +% in a measuring phase (from the amsmath \cs{ifmeasuring@}) and if the \cs{m@th} +% token is detected. % It is not quite clear what purpose the processor has. As it is a public interface % it can't be used for internal code. And typesetting happens later and the processor % can't really change this. Currently it is mostly used for debugging and messages. % If the \cs{m@th} is found the \cs{l_@@_fakemath_bool} is set, so if the code % is changed this must be preserved. -% +% % \subsection{Other problems} -% -% \begin{enumerate} -% \item +% +% \begin{enumerate} +% \item % The presence of \cs{m@th} in association with \cs{ensuremath} -% does not necessarily indicate fakemath. This is because -% wanting mathsurround to be zero is very reasonable and common, +% does not necessarily indicate fakemath. This is because +% wanting mathsurround to be zero is very reasonable and common, % \emph{even when the math is genuine} (and hence needs to be collected). -% -% TODO: this claim needs some examples. -% -% \item User-defined environments can create problems; but this area, of -% new, copied and changed environments, has not yet been developed. -% +% +% TODO: this claim needs some examples. +% +% \item User-defined environments can create problems; but this area, of +% new, copied and changed environments, has not yet been developed. +% % \car*{Joseph wrote, inter alia:\\ % My thinking [regarding] \cs{RegisterMathEnvironment}\\ % - (New) Math environments should not be created-then-patched, but only -% generated by a [(future)] dedicated command (\cs{DeclareMathEnvironment}, +% generated by a [(future)] dedicated command (\cs{DeclareMathEnvironment}, % presumably)\\ % - Math environments created with \pkg{ltcmd} [commands] should not be copied, . . .\\ % - Package authors should be able to manually set up math environments with a public boolean.} -% \end{enumerate} +% \end{enumerate} % % % \subsection{Other ToDos} % % \begin{enumerate} -% \item Add (some of) the math display commands that were \enquote{lifted from +% \item Add (some of) the math display commands that were \enquote{lifted from % plain}, e.g., \cs{displaylines} \cs{eqalign}(??). % \item The breqn packages changes catcodes and that isn't yet covered % by our mechanism. % \item \cs{intertext} is not correctly taken into account by the -% code splitting multiline math into subformulas. +% code splitting multiline math into subformulas. % \end{enumerate} % % @@ -494,7 +666,7 @@ % neatly. % \begin{macrocode} \AddToHook{begindocument/before}{ \RequirePackage { amsmath } } -% \end{macrocode} +% \end{macrocode} % % % \subsection{Data structures} @@ -502,7 +674,7 @@ % \begin{variable}{\l_@@_collected_bool} % Tracks whether math mode material has been collected, which happens inside % \pkg{amsmath} environments as well as those handled directly here. -% If true following math will not grab and/or process. +% If true following math will not grab and/or process. % See \ref{sec:mathcapture} for details. % \begin{macrocode} \bool_new:N \l_@@_collected_bool @@ -511,7 +683,7 @@ % % \begin{variable}{\l_@@_fakemath_bool} % Tracks whether math mode material has been identified as fake math during -% the grabbing phase, which happens currently if the +% the grabbing phase, which happens currently if the % grabbed contents contains the \cs{m@th} token. % % \begin{macrocode} @@ -532,20 +704,21 @@ \tl_new:N \g_@@_grabbed_math_tl % \end{macrocode} % \end{variable} -% +% % \begin{variable}{\l_@@_tmpa_tl,\l_@@_tmpa_skip,\l_@@_tmpa_str} % Temporary variables % \begin{macrocode} \tl_new:N \l_@@_tmpa_tl \skip_new:N \l_@@_tmpa_skip +\str_new:N \l_@@_tmpa_str % \end{macrocode} % \end{variable} % % \begin{variable}{\l_@@_content_alt_tl, % \l_@@_content_actual_tl, % \l_@@_content_AF_tl} -% Temporary variables to hold math content that should -% be used in actual or alt text and stored as AF. +% Temporary variables to hold math content that should +% be used in actual or alt text and stored as AF. % \begin{macrocode} \tl_new:N \l_@@_content_alt_tl \tl_new:N \l_@@_content_actual_tl @@ -554,15 +727,15 @@ \tl_new:N \l_@@_content_AF_mathml_tl % \end{macrocode} % \end{variable} -% +% % \subsection{Tagging tools} -% The following commands implement small tagging code chunks. +% The following commands implement small tagging code chunks. % This should probably be collected and moved into tagpdf later. % \begin{macro}{\__tag_tool_close_P:} % This closes a P/text-chunk, both the MC and the structure and % increases the counter manually. % \begin{macrocode} -\cs_new_protected:Npn \__tag_tool_close_P: +\cs_new_protected:Npn \__tag_tool_close_P: { \tag_if_active:T { @@ -574,14 +747,14 @@ } % \end{macrocode} % \end{macro} -% -% We add also an attribute. -% \begin{macrocode} +% +% We add also an attribute. +% \begin{macrocode} \tl_new:N\l_@@_attribute_class_tl \tagpdfsetup {role/new-attribute = {inline} {/O /Layout /Placement/Inline}, role/new-attribute = {display} {/O /Layout /Placement/Block}, - } + } % \end{macrocode} % % \subsection{Code related to AF} @@ -592,8 +765,12 @@ % \l__tag_math_mathml_AF_bool, % \g__tag_math_mathml_AF_bool, % \l__tag_math_mathml_pane_bool, -% \l__tag_math_alt_bool +% \l__tag_math_alt_bool, +% \g__tag_math_luamml_tl, % } +% The variable \cs{g__tag_math_luamml_tl} is initially 0 and +% the user key can set it to -1 or 1. This allows to distinguish +% the unset case from a value set by the user. % \begin{macrocode} \bool_new:N\l__tag_math_texsource_AF_bool \bool_new:N\l__tag_math_texsource_pane_bool @@ -601,9 +778,11 @@ \bool_new:N\g__tag_math_mathml_AF_bool \bool_new:N\l__tag_math_mathml_pane_bool \bool_new:N\l__tag_math_alt_bool +\tl_new:N\g__tag_math_luamml_tl +\tl_gset:Nn\g__tag_math_luamml_tl {0} % \end{macrocode} % \end{variable} -% +% % \begin{variable}{ % \g_@@_mathml_total_int, % \g_@@_mathml_int, @@ -613,13 +792,13 @@ % } % \cs{g_@@_mml_total_int} records the mathml fragments read in. % \cs{g_@@_mml_int} records the mathml fragments read in with a different hash. -% \cs{g_@@_AF_total_int} records the number of math structures that try to -% attach a mathml AF. +% \cs{g_@@_AF_total_int} records the number of math structures that try to +% attach a mathml AF. % \cs{g_@@_AF_found_int} records the number of math structures for which a fitting -% mathml is found. +% mathml is found. % \cs{g_@@_AF_attached_int} records the number of math structures which got a mathml fragment % (if mathml-AF are not disabled locally this should be the equal to the previous number. -% +% % \begin{macrocode} \int_new:N\g_@@_mathml_total_int \int_new:N\g_@@_mathml_int @@ -631,13 +810,15 @@ % % \begin{variable}{\l__tag_math_mathml_files_clist} % A sequence to store the file list for the mathml. +% We also check the luamml file. % \begin{macrocode} \clist_new:N\l__tag_math_mathml_files_clist -\clist_put_right:Ne\l__tag_math_mathml_files_clist {\c_sys_jobname_str-mathml} +\clist_put_right:Ne\l__tag_math_mathml_files_clist + {\c_sys_jobname_str-mathml,\c_sys_jobname_str-luamml-mathml} % \end{macrocode} % \end{variable} - -% This is the internal variant of the \cs{mml} command. +% +% This is the internal variant of the \cs{mml} command. % \begin{macro}{\@@_AF_mml:nnnn} % \begin{macrocode} \cs_new_protected:Npn \@@_AF_mml:nnnn #1 #2 #3 #4 @@ -653,22 +834,22 @@ % \end{macrocode} % a simple Desc key, take care that it is a valid string! % \begin{macrocode} - \pdfdict_put:nne {l_pdffile/Filespec} {Desc}{(mathml-#1)} + \pdfdict_put:nne {l_pdffile/Filespec} {Desc}{(mathml-#1)} \pdffile_embed_stream:nnN {#4}{mathml-#1.xml}\l_@@_tmpa_tl % \end{macrocode} -% not strictly necessary but makes the files visible in the file attachment -% page +% not strictly necessary but makes the files visible in the file attachment +% page % \begin{macrocode} \bool_if:NT \l__tag_math_mathml_pane_bool {\pdfmanagement_add:nne {Catalog/Names}{EmbeddedFiles}{\l_@@_tmpa_tl}} \tl_new:c{g_@@_mathml_#3_tl} - \tl_gset_eq:cN{g_@@_mathml_#3_tl}\l_@@_tmpa_tl + \tl_gset_eq:cN{g_@@_mathml_#3_tl}\l_@@_tmpa_tl } - } + } % \end{macrocode} % \end{macro} % -% The html reader. +% The html reader. % \begin{macrocode} \cs_new_protected:Npn \@@_AF_html_reader:w#1</h2>#2<p>#3</p>#4<p>#5</p>#6<math{ \begingroup @@ -685,39 +866,382 @@ \@@_AF_mml:nnnn{#1}{#2}{#3}{#4} } % \end{macrocode} +% +% As with luatex we write two files we define a few constants for +% the shared texts. +% +% \begin{macro} +% {\c_@@_mathml_write_init_tl,\l_@@_mathml_write_before_tl, +% \c_@@_mathml_write_after_tl,\c_@@_mathml_write_final_tl} +% \begin{macrocode} +\tl_const:Nn \c_@@_mathml_write_init_tl + { + <!DOCTYPE~html> + \iow_newline: + <html> + \iow_newline: + } +\tl_new:N \l_@@_mathml_write_before_tl +\tl_const:Nn \c_@@_mathml_write_after_tl + { + \iow_newline: + </div> + \iow_newline: + } +\tl_const:Nn \c_@@_mathml_write_final_tl + { + </html> + } +% \end{macrocode} +% \end{macro} +% \begin{socketdecl}{tagsupport/math/mathml/write/prepare} +% To prepare the hash and the starting command we use a socket, so +% that both the dummy and luamml can make use of it. +% \begin{macrocode} +\socket_new:nn {tagsupport/math/mathml/write/prepare}{0} +% \end{macrocode} +% \end{socketdecl} +% +% \begin{plugdecl}{On} +% \begin{macrocode} +\socket_new_plug:nnn{tagsupport/math/mathml/write/prepare}{On} + { + \str_set:NV\l_@@_tmpa_str\l_@@_content_AF_source_tl + \str_replace_all:Nnn\l_@@_tmpa_str{&}{&} + \str_replace_all:Nnn\l_@@_tmpa_str{<}{<} + \tl_set:Nn \l_@@_mathml_write_before_tl + { + <div> + \iow_newline: + <h2>\c_backslash_str mml\c_space_tl \int_use:N \g_@@_math_total_int </h2> + \iow_newline: + <p>\l_@@_tmpa_str</p> + \iow_newline: + <p>\l_@@_content_hash_tl </p> + \iow_newline: + } + } +% \end{macrocode} +% \end{plugdecl} +% +% With luatex we automatically generate mathml with \pkg{luamml} if the package +% can be loaded and \pkg{unicode-math} is detected. +% We start the process in the begindocument/end hook +% so that the reading from a previous compilation can happen before! % +% For other engines, for future name changes +% and in case luamml is not loaded we provide +% some commands +% \begin{macrocode} +\cs_new_protected:Npn\@@_provide_luamml_commands: + { + \providecommand\luamml_flag_structelem:{} + \cs_if_free:NT \luamml_structelem: + { + \cs_set_eq:NN\luamml_structelem:\luamml_flag_structelem: + } + \providecommand\luamml_flag_process:{} + \cs_if_free:NT \luamml_process: + { + \cs_set_eq:NN\luamml_process:\luamml_flag_process: + } + \providecommand\luamml_flag_ignore:{} + \cs_if_free:NT \luamml_ignore: + { + \cs_set_eq:NN\luamml_ignore:\luamml_flag_ignore: + } + } +% \end{macrocode} +% \begin{macrocode} +\sys_if_engine_luatex:TF + { +% \end{macrocode} +% Temporary (!) fixes for endarray +% \begin{macrocode} + \cs_new_protected:Npn \@@_correct_luamml_array_patches: + { + \AddToHook{package/array/after} + { + \cs_set:Npn \endarray + { + \tbl_crcr:n{endarray} + \__luamml_array_save_array: + \egroup + \UseTaggingSocket{tbl/finalize} + \tbl_restore_outer_cell_data: + \egroup + \mode_if_math:T { \__luamml_array_finalize_array: } + \@arrayright + \gdef \@preamble {} + } + \cs_set:Npn \@classz + { + \@classx + \@tempcnta \count@ + \prepnext@tok + \@addtopreamble { + \ifcase \@chnum + \hfil + \hskip 1sp + \d@llarbegin + \cs_if_eq:NNTF \d@llarbegin \begingroup { + \insert@column + \d@llarend + } { + \__luamml_array_init_col: + \insert@column + \luamml_flag_save:nn {} {mtd} + \d@llarend + \__luamml_array_finalize_col:w 0~ + } + \do@row@strut + \hfil + \or + \hskip 1sp + \d@llarbegin + \cs_if_eq:NNTF \d@llarbegin \begingroup { + \insert@column + \d@llarend + } { + \__luamml_array_init_col: + \insert@column + \luamml_flag_save:nn {} {mtd} + \d@llarend + \__luamml_array_finalize_col:w 1~ + } + \do@row@strut + \hfil + \or + \hfil + \hskip 1sp + \d@llarbegin + \cs_if_eq:NNTF \d@llarbegin \begingroup { + \insert@column + \d@llarend + } { + \__luamml_array_init_col: + \insert@column + \luamml_flag_save:nn {} {mtd} + \d@llarend + \__luamml_array_finalize_col:w 2~ + } + \do@row@strut + \or + \setbox \ar@mcellbox \vbox \@startpbox { \@nextchar } + \insert@pcolumn + \@endpbox + \ar@align@mcell + \do@row@strut + \or + \vtop \@startpbox { \@nextchar } + \insert@pcolumn + \@endpbox + \do@row@strut + \or + \vbox \@startpbox { \@nextchar } + \insert@pcolumn + \@endpbox + \do@row@strut + \fi + } + \prepnext@tok + } + } + } +% \end{macrocode} +% +% \begin{macrocode} + \AddToHook{begindocument/before} + { + \str_case:on \g_@@_luamml_load_tl + { + { 1 } { + \RequirePackage { luamml } + \@@_correct_luamml_array_patches: + \AddToHook{begindocument/end} + { + \@@_luamml_activate_write: + } + } + {-1 } { + \AddToHook{begindocument/end} + { + \msg_note:nnnn { tag } + { luamml-status }{ disabled }{ not~create } + } + } + { 0 } + { + \@ifpackageloaded { unicode-math } + { + \RequirePackage { luamml } + \@@_correct_luamml_array_patches: + \AddToHook{begindocument/end} + { + \@@_luamml_activate_write: + } + } + { \msg_warning:nn { tag }{ unicode-math-missing } } + } + } + \@@_provide_luamml_commands: + } + } + { + \@@_provide_luamml_commands: + } +\msg_new:nnn { tag }{ luamml-status } + { + luamml~has~been~#1~and~will~#2~an~MathML~file. + } + +\msg_new:nnn { tag }{ unicode-math-missing } + { + The~package~unicode-math~is~missing\\ + luamml~will~not~create~an~MathML~file.\\ + To~avoid~this~warning~load~unicode-math~\\ + or~disable~luamml~with~\\ + \tl_to_str:n{\tagpdfsetup{math/mathml/luamml/load=false}}\\ + or~force~luamml~with~\\ + \tl_to_str:n{\tagpdfsetup{math/mathml/luamml/load=true}} + } +\cs_new_protected:Npn \@@_luamml_activate_write: + { + \bool_if:NT \g_@@_luamml_write_bool + { +% \end{macrocode} +% to avoid that nothing is written in the first run, we must activate the sockets: +% \begin{macrocode} + \bool_gset_true:N\g__tag_math_mathml_AF_bool + \AssignSocketPlug{tagsupport/math/struct/begin}{mathml-AF} + \AssignSocketPlug{tagsupport/math/struct/end}{mathml-AF} + \AssignSocketPlug{tagsupport/math/substruct/begin}{single} + \AssignSocketPlug{tagsupport/math/substruct/end}{single} + \int_set:Nn \l__luamml_pretty_int { 7 } + \RegisterFamilyMapping\symsymbols{oms} + \RegisterFamilyMapping\symletters{oml} + \AssignSocketPlug{tagsupport/math/mathml/write/prepare}{On} + \iow_new:N \g_@@_luamml_iow + \iow_open:Nn \g_@@_luamml_iow {\c_sys_jobname_str-luamml-mathml.html} + \iow_now:Ne \g_@@_luamml_iow { \c_@@_mathml_write_init_tl } + \cs_new:Npn \@@_luamml_output_hook:n ##1 + { + \tl_if_empty:NF \l_@@_mathml_write_before_tl + { + \iow_now:Ne \g_@@_luamml_iow + { + \l_@@_mathml_write_before_tl + ##1 + \c_@@_mathml_write_after_tl + } + } + } + \__luamml_register_output_hook:N \@@_luamml_output_hook:n +% \end{macrocode} +% At the end of the document we must finish and close the file: +% \begin{macrocode} + \AddToHook{enddocument/afterlastpage} + { + \iow_now:Ne \g_@@_luamml_iow + { \c_@@_mathml_write_final_tl } + \iow_close:N \g_@@_luamml_iow + } + \msg_note:nnnn { tag } + { luamml-status }{ enabled }{ create } + } + } +% \end{macrocode} +% And now keys to activate/deactivate luamml feature +% \begin{variable}{\g_@@_luamml_load_tl} +% This variable will be used to suppress the loading of luamml +% altogether. +% \begin{macrocode} +\tl_new:N \g_@@_luamml_load_tl +\tl_gset:Nn \g_@@_luamml_load_tl {0} +% \end{macrocode} +% \end{variable} +% \begin{variable}{\g_@@_luamml_write_bool} +% This variable decides if luamml writes a mathml +% altogether. +% \begin{macrocode} +\bool_new:N \g_@@_luamml_write_bool +\bool_gset_true:N \g_@@_luamml_write_bool +% \end{macrocode} +% \end{variable} +% +% \begin{macrocode} +\msg_new:nnn { tag }{ PDF-2.0-recommended } + { + The~key~#1~will~not~work~properly~with~PDF~#2.\\ + Switching~to~PDF~2.0~is~recommended. + } +\keys_define:nn { __tag / setup } + { +% \end{macrocode} +% At first a key to suppress the loading altogether +% \begin{macrocode} + math/mathml/luamml/load .choice: , + math/mathml/luamml/load/true .code:n = {\tl_gset:Nn \g_@@_luamml_load_tl{1}}, + math/mathml/luamml/load/false .code:n = {\tl_gset:Nn \g_@@_luamml_load_tl{-1}}, + math/mathml/luamml/load .default:n = true, + math/mathml/luamml/load .usage:n=preamble, +% \end{macrocode} +% A key to activate math structure elements. It shouldn't +% be issued in the preamble as luamml is not yet loaded. +% \begin{macrocode} + math/mathml/structelem .code:n = + { + \pdf_version_compare:NnT < {2.0} + { + \msg_warning:nnne { tag }{ PDF-2.0-recommended } + { math/mathml/structelem }{ \pdf_version: } + } + \AddToHook{begindocument/end}{\luamml_structelem:} + }, +% \end{macrocode} +% and a key to call the ignore flag. This should only be used locally. +% \begin{macrocode} + math/mathml/ignore .code:n = {\luamml_ignore:}, +% \end{macrocode} +% \begin{macrocode} + math/mathml/luamml/write .choice:, + math/mathml/luamml/write/true .code:n = + { + \tl_gset:Nn \g_@@_luamml_load_tl{1} + \bool_gset_true:N \g_@@_luamml_write_bool + }, + math/mathml/luamml/write/false .code:n = + { + \bool_gset_false:N \g_@@_luamml_write_bool + }, + math/mathml/luamml/write .default:n = true, + math/mathml/luamml/write .usage:n=preamble, +% \end{macrocode} +% alias keys for compatibility +% \begin{macrocode} + math/mathml/luamml .bool_gset:N = \g_@@_luamml_write_bool, + math/mathml/luamml .usage:n=preamble + } +% \end{macrocode} % \begin{socketdecl}{tagsupport/math/mathml/write} % This writes a html-dummy with the hash and the math content. % This should be optional, so it uses a socket that can be disabled -% +% % \begin{macrocode} \socket_new:nn {tagsupport/math/mathml/write}{0} % \end{macrocode} % \end{socketdecl} -% +% % \begin{plugdecl}{On} % \begin{macrocode} \socket_new_plug:nnn{tagsupport/math/mathml/write}{On} { - \str_set:NV\l_@@_tmpa_str\l_@@_content_AF_source_tl - \str_replace_all:Nnn\l_@@_tmpa_str{&}{&} - \str_replace_all:Nnn\l_@@_tmpa_str{<}{<} - \iow_now:Ne \g_@@_writedummy_iow + \iow_now:Ne \g_@@_writedummy_iow { - \iow_newline: - <div> - \iow_newline: - <h2>\c_backslash_str mml\c_space_tl \int_use:N \g_@@_math_total_int </h2> - \iow_newline: - <p>\l_@@_tmpa_str</p> - \iow_newline: - <p>\l_@@_content_hash_tl </p> - \iow_newline: + \l_@@_mathml_write_before_tl <math></math> - \iow_newline: - </div> - \iow_newline: + \c_@@_mathml_write_after_tl } } % \end{macrocode} @@ -727,32 +1251,32 @@ \keys_define:nn { __tag / setup } { - math/mathml/write-dummy .code:n = + math/mathml/write-dummy .code:n = { \bool_gset_true:N \g__tag_math_mathml_AF_bool - \tl_if_exist:NF\g_@@_writedummy_iow + \tl_if_exist:NF\g_@@_writedummy_iow { \iow_new:N \g_@@_writedummy_iow - \iow_open:Nn \g_@@_writedummy_iow - { + \iow_open:Nn \g_@@_writedummy_iow + { \c_sys_jobname_str-mathml-dummy.html } \iow_now:Ne \g_@@_writedummy_iow { - <!DOCTYPE~html> - \iow_newline: - <html> + \c_@@_mathml_write_init_tl } + \AssignSocketPlug {tagsupport/math/mathml/write/prepare}{On} \AssignSocketPlug {tagsupport/math/mathml/write}{On} \AddToHook{enddocument/afterlastpage} { - \iow_now:Nn \g_@@_writedummy_iow {</html>} + \iow_now:Ne \g_@@_writedummy_iow + { \c_@@_mathml_write_final_tl } \iow_close:N \g_@@_writedummy_iow } - } + } }, - math/mathml/write-dummy .usage:n=preamble - } + math/mathml/write-dummy .usage:n=preamble + } % \end{macrocode} % % \begin{macro}{\@@_AF_process_mathml_files:} @@ -763,9 +1287,9 @@ \hbox_set:Nn \l_@@_tmpa_box { \pdfdict_put:nnn { l_pdffile/Filespec }{AFRelationship} { /Supplement } - \pdfdict_put:nne - { l_pdffile }{Subtype} - { \pdf_name_from_unicode_e:n{application/mathml+xml} } + \pdfdict_put:nne + { l_pdffile }{Subtype} + { \pdf_name_from_unicode_e:n{application/mathml+xml} } \char_set_catcode_other:N \# \cs_set_eq:NN\mml \@@_AF_html_reader:w \clist_map_inline:Nn \l__tag_math_mathml_files_clist @@ -779,13 +1303,13 @@ { \typeout{Info:~mathml~file~##1~does~not~exist}%info message } - } + } } \bool_if:NT\g__tag_math_mathml_AF_bool { \typeout{Info:~Activating~mathml~support} - \AssignSocketPlug{tagsupport/math/struct/begin}{test-mathml} - \AssignSocketPlug{tagsupport/math/struct/end}{test-mathml} + \AssignSocketPlug{tagsupport/math/struct/begin}{mathml-AF} + \AssignSocketPlug{tagsupport/math/struct/end}{mathml-AF} % \end{macrocode} % mathml handling doesn't like subparts, so we disable them for now: % \begin{macrocode} @@ -795,29 +1319,29 @@ { \iow_term:n{MathML~statistic} \iow_term:n{================} - \iow_term:e{==>~\int_use:N\g_@@_mathml_total_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_mathml_total_int\c_space_tl MathML~fragments~read} - \iow_term:e{==>~\int_use:N\g_@@_mathml_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_mathml_int\c_space_tl different~MathML~fragments} - \iow_term:e{==>~\int_use:N\g_@@_math_total_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_math_total_int\c_space_tl math~fragments~found} - \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_found_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_found_int\c_space_tl fitting~MathML~AF~found} - \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_attached_int\c_space_tl + \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_attached_int\c_space_tl MathML~AF~attached} } - } + } } -\AddToHook{begindocument}{\@@_AF_process_mathml_files:} +\AddToHook{begindocument}{\@@_AF_process_mathml_files:} % \end{macrocode} % \end{macro} -% +% % \subsection{Mathstyle detection} % In some cases we need to detect the mathstyle used in a \cs{mathchoice} -% command and to disable/enable tagging in the unused branches. +% command and to disable/enable tagging in the unused branches. % This is currently only used in the amstext command \cs{text} % but is perhaps also needed in other cases, so we create a general command. -% +% %\begin{macro}{\l_@@_mathstyle_int,\g_@@_mathchoice_int,mathstyle} % \begin{macrocode} \int_new:N \l_@@_mathstyle_int @@ -828,43 +1352,64 @@ % For now internal, but perhaps will need a public version. % The command should be used in every branch of a \cs{mathchoice} % (with the correct mathstyle number) and with an unique label (which should -% be the same in every branch). -% \cs{g_@@_mathchoice_int} can be e.g. increased before the mathchoice and +% be the same in every branch). +% \cs{g_@@_mathchoice_int} can be, e.g., increased before the mathchoice and % then used. % \begin{macro}{\@@_tag_if_mathstyle:nn} % \begin{macrocode} -\cs_new_protected:Npn \@@_tag_if_mathstyle:nn #1 #2 +\cs_new_protected:Npn \@@_tag_if_mathstyle:nn #1 #2 %#1 refers to label %#2 is a number for the mathstyle (typically 0,2,4,6) { \int_set:Nn \l_@@_mathstyle_int {#2} \property_record:nn {#1} { mathstyle } \int_compare:nNnTF { \property_ref:nn {#1}{ mathstyle} } = { #2 } - { \tag_start: }{ \tag_stop: } + { \tag_resume:n{\mathchoice} }{ \tag_suspend:n{\mathchoice} } } -\cs_generate_variant:Nn \@@_tag_if_mathstyle:nn {en} +\cs_generate_variant:Nn \@@_tag_if_mathstyle:nn {en} % \end{macrocode} % \end{macro} -% +% % \subsection{Tagging options} % \begin{macrocode} \keys_define:nn { __tag / setup } { math/mathml/sources .clist_set:N = \l__tag_math_mathml_files_clist, - math/alt/use .bool_set:N = \l__tag_math_alt_bool, + math/alt/use .bool_set:N = \l__tag_math_alt_bool, viewer/pane/mathml .bool_set:N = \l__tag_math_mathml_pane_bool, viewer/pane/mathml .initial:n = true, - viewer/pane/mathsource .bool_set:N = \l__tag_math_texsource_pane_bool, + viewer/pane/mathsource .bool_set:N = \l__tag_math_texsource_pane_bool, math/mathml/AF .bool_set:N = \l__tag_math_mathml_AF_bool, math/mathml/AF .initial:n = true, math/tex/AF .bool_set:N = \l__tag_math_texsource_AF_bool, math/tex/AF .initial:n = true - } + } +% \end{macrocode} +% alt is required for pdf/UA-1. +% TODO: l3pdfmeta should support this test. +% \begin{macrocode} +\AddToHook{begindocument/end} + { + \str_if_eq:eeT + {1} + { + \exp_last_unbraced:Ne\use_i:nn + {\GetDocumentProperties{document/pdfstandard-UA}} + \c_empty_tl\c_empty_tl + } + { + \bool_if:NF \l__tag_math_alt_bool + { + \typeout{PDF/UA-1~detected.~Enabling~alt~text~on~Formula} + } + \bool_set_true:N\l__tag_math_alt_bool + } + } % \end{macrocode} % % \subsection{Sockets} % \subsubsection{Main inline math sockets} -% +% % \begin{socketdecl} % { % tagsupport/math/inline/begin, @@ -873,11 +1418,11 @@ % tagsupport/math/inline/formula/end, % } % The first two sockets are meant to embed inline -% math into the surrounding (so to close/reopen e.g. MC-chunks). -% The other two implement the actual formula structure. +% math into the surrounding (so to close/reopen, e.g., MC-chunks). +% The other two implement the actual formula structure. % The formula sockets are despite their naming not symmetric: -% the begin socket is issued after the math has started, while -% the end socket is after the math! +% the begin socket is issued after the math has started, while +% the end socket is after the math! % \begin{macrocode} \socket_new:nn {tagsupport/math/inline/begin}{0} \socket_new:nn {tagsupport/math/inline/end}{0} @@ -885,8 +1430,8 @@ \socket_new:nn {tagsupport/math/inline/formula/end}{0} % \end{macrocode} %\end{socketdecl} -% -% +% +% % \begin{plugdecl}{MC} % \begin{macrocode} \socket_new_plug:nnn @@ -896,39 +1441,42 @@ \socket_new_plug:nnn {tagsupport/math/inline/end} {MC} - {\tag_mc_begin_pop:n{}} + {\tag_mc_begin_pop:n{}} % \end{macrocode} % \end{plugdecl} -% -% We probably will want to test different tagging receipes. +% +% We probably will want to test different tagging recipes. % \begin{plugdecl}{default} % \begin{macrocode} \socket_new_plug:nnn {tagsupport/math/inline/formula/begin} {default} - { - \socket_use:n{tagsupport/math/content} - \socket_use:n{tagsupport/math/struct/begin} +% \end{macrocode} +% \changes{v0.6g}{2024-10-02}{disable paratagging, issue \#711} +% \begin{macrocode} + { \tagpdfparaOff + \tag_socket_use:n{math/content} + \tag_socket_use:n{math/struct/begin} % \end{macrocode} % TODO: does inline math need subformula handling? % \begin{macrocode} % inner formula if multiple parts (not really implemented yet) - \socket_use:n{tagsupport/math/substruct/begin} + \tag_socket_use:n{math/substruct/begin} #1 - \socket_use:n{tagsupport/math/end} + \tag_socket_use:n{math/end} } \socket_new_plug:nnn {tagsupport/math/inline/formula/end} {default} - { + { \socket_use:n{tagsupport/math/substruct/end} \socket_use:n{tagsupport/math/struct/end} - } + } % \end{macrocode} % \end{plugdecl} -% +% % \subsubsection{Main display math sockets} -% +% % \begin{socketdecl} % { % tagsupport/math/display/begin, @@ -937,12 +1485,15 @@ % tagsupport/math/display/formula/end, % } % The first two sockets are meant to embed display -% math into the surrounding (so to close/reopen e.g. MC-chunks and +% math into the surrounding (so to close/reopen, e.g., MC-chunks and % P-structure). -% The other two implement the actual formula structure. +% The other two implement the actual formula structure. % The formula sockets are despite their naming not symmetric: -% the begin socket is issued after the math has started, while -% the end socket is after the math! +% the begin socket is issued after the math has started, while +% the end socket is after the math! +% The socket |tagsupport/math/display/formula/begin| should similar to +% the inline version not be used as tagging socket so that the argument, the math, +% is not lost. % \begin{macrocode} \socket_new:nn {tagsupport/math/display/begin}{0} \socket_new:nn {tagsupport/math/display/end}{0} @@ -961,7 +1512,7 @@ {tagsupport/math/display/end} {default} { - } + } % \end{macrocode} % \end{plugdecl} @@ -971,25 +1522,25 @@ \socket_new_plug:nnn {tagsupport/math/display/formula/begin} {default} - { - \socket_use:n{tagsupport/math/content} - \socket_use:n{tagsupport/math/struct/begin} - \socket_use:n{tagsupport/math/substruct/begin} - #1 - \socket_use:n{tagsupport/math/end} + { + \tag_socket_use:n{math/content} + \tag_socket_use:n{math/struct/begin} + \tag_socket_use:n{math/substruct/begin} + #1 + \tag_socket_use:n{math/end} } \socket_new_plug:nnn {tagsupport/math/display/formula/end} {default} - { + { \socket_use:n{tagsupport/math/substruct/end} \socket_use:n{tagsupport/math/struct/end} - } + } % \end{macrocode} % \end{plugdecl} % % \subsubsection{Internal sockets} -% +% % \begin{variable}{\l_@@_content_template_tl} % The default text used as alt or actual text. % \begin{macrocode} @@ -1003,7 +1554,7 @@ \c_space_tl \exp_not:N\end{\g_@@_grabbed_env_tl} \c_space_tl LaTeX~ formula~ ends~ - } + } % \end{macrocode} % \end{variable} @@ -1013,7 +1564,7 @@ \tl_new:N\l_@@_texsource_template_tl \tl_const:Nn\c_@@_inline_env_tl {math} \tl_set:Nn \l_@@_texsource_template_tl - { + { \tl_if_eq:NNTF\g_@@_grabbed_env_tl\c_@@_inline_env_tl { $ @@ -1024,29 +1575,29 @@ \exp_not:N\begin{\g_@@_grabbed_env_tl} \exp_not:V\g_@@_grabbed_math_tl \exp_not:N\end{\g_@@_grabbed_env_tl} - } - } + } + } % \end{macrocode} % \end{variable} -% +% % \begin{socketdecl}{tagsupport/math/content} -% The math content is stored in associated files and used for +% The math content is stored in associated files and used for % actual and alternative text. As the exact text is still % unclear we use a socket to be able to test variants. % The socket should set all four tl vars above, if needed -% to identical values. It can use the two variables +% to identical values. It can use the two variables % \cs{g_@@_grabbed_env_tl} and \cs{g_@@_grabbed_math_tl} % \begin{macrocode} \socket_new:nn {tagsupport/math/content}{0} % \end{macrocode} % \end{socketdecl} -% +% % Some default sockets to set the contents. -% TODO: think about naming convention. +% TODO: think about naming convention. % TODO: think how this should organized so that one % has options to change from the outside and so that -% there are less repetitions. +% there are less repetitions. % \begin{plugdecl}{actual+source} % \begin{macrocode} \socket_new_plug:nnn @@ -1056,17 +1607,17 @@ \tl_set:Ne\l_@@_content_actual_tl { \l_@@_content_template_tl - } - \tl_set:Ne \l_@@_content_AF_source_tl + } + \tl_set:Ne \l_@@_content_AF_source_tl { \l_@@_texsource_template_tl - } + } \tl_set:Nn \l_@@_content_AF_mathml_tl {} \tl_set:Nn \l_@@_content_alt_tl {} } % \end{macrocode} -% \end{plugdecl} -% +% \end{plugdecl} +% % \begin{plugdecl}{alt+source} % \begin{macrocode} \socket_new_plug:nnn @@ -1076,26 +1627,26 @@ \tl_set:Ne\l_@@_content_alt_tl { \l_@@_content_template_tl - } - \tl_set:Ne \l_@@_content_AF_source_tl + } + \tl_set:Ne \l_@@_content_AF_source_tl { \l_@@_texsource_template_tl - } + } \tl_set:Nn \l_@@_content_AF_mathml_tl {} \tl_set:Nn \l_@@_content_actual_tl {} } % \end{macrocode} % \end{plugdecl} % \begin{macrocode} -\socket_assign_plug:nn {tagsupport/math/content}{alt+source} +\socket_assign_plug:nn {tagsupport/math/content}{alt+source} % \end{macrocode} % % \begin{socketdecl}{tagsupport/math/struct/begin, % tagsupport/math/struct/end} -% For the main structure we use a socket too. -% This allow e.g. to create a special one for luamml -% which setups additional objects. -% The begin socket can use the two variables +% For the main structure we use a socket too. +% This allows, e.g., to create a special one for luamml +% which setups additional objects. +% The begin socket can use the two variables % \cs{g_@@_grabbed_env_tl} and \cs{g_@@_grabbed_math_tl} % \begin{macrocode} \socket_new:nn {tagsupport/math/struct/begin}{0} @@ -1110,12 +1661,22 @@ {tagsupport/math/struct/begin} {default} { - \bool_if:NTF\l__tag_math_texsource_AF_bool + \bool_if:NTF\l__tag_math_texsource_AF_bool { \tl_set_eq:NN \l_@@_content_AF_source_tmpa_tl \l_@@_content_AF_source_tl } { \tl_clear:N \l_@@_content_AF_source_tmpa_tl } + \tl_if_eq:NnTF\g_@@_grabbed_env_tl {math} + { + \tl_set:Nn\l_@@_attribute_class_tl{inline} + } + { + \tl_set:Nn\l_@@_attribute_class_tl{display} + } + \bool_if:NF\l__tag_math_alt_bool + { \tl_set:Nn \l_@@_content_alt_tl{} } \tag_struct_begin:n { tag=Formula, + attribute-class=\l_@@_attribute_class_tl, texsource = \l_@@_content_AF_source_tmpa_tl, title-o = \g_@@_grabbed_env_tl, actualtext = \l_@@_content_actual_tl, @@ -1126,19 +1687,18 @@ {tagsupport/math/struct/end} {default} { \tag_struct_end: } - -\socket_assign_plug:nn {tagsupport/math/struct/begin}{default} -\socket_assign_plug:nn {tagsupport/math/struct/end}{default} -% \end{macrocode} -% \end{plugdecl} -% -% \begin{plugdecl}{test-mathml} -% This (test-)socket tries to add a mathml-AF to formula. -% It is activated if a mathml.html has been found and loaded. -% Additionally it also sets an attribute -% (this can perhaps be done by default anyway.) -% As it disturbs the reading of the AF it currently deactivates the /Alt key, -% unless it has been reenabled with |math/alt/use=true| + +\socket_assign_plug:nn {tagsupport/math/struct/begin}{default} +\socket_assign_plug:nn {tagsupport/math/struct/end}{default} +% \end{macrocode} +% \end{plugdecl} +% +% \begin{plugdecl}{mathml-AF} +% This socket tries to add a mathml-AF to formula. +% It is activated if a mathml.html has been found and loaded. +% As it disturbs the reading of the AF +% it currently deactivates the /Alt key, +% unless it has been reenabled with |math/alt/use=true| % \begin{macrocode} \cs_generate_variant:Nn \str_mdfive_hash:n {o} \tl_new:N\l_@@_content_hash_tl @@ -1151,48 +1711,52 @@ % \begin{macrocode} \socket_new_plug:nnn {tagsupport/math/struct/begin} - {test-mathml} - { - \int_gincr:N\g_@@_math_total_int - \tl_set:Ne\l_@@_content_hash_tl - {\str_mdfive_hash:o { \l_@@_content_AF_source_tl }} - \tl_set_eq:NN\l_@@_grabbed_math_tl\g_@@_grabbed_math_tl + {mathml-AF} + { + \int_gincr:N\g_@@_math_total_int + \tl_set:Ne\l_@@_content_hash_tl + {\str_mdfive_hash:o { \l_@@_content_AF_source_tl }} + \tl_set_eq:NN\l_@@_grabbed_math_tl\g_@@_grabbed_math_tl \tl_if_eq:NnTF\g_@@_grabbed_env_tl {math} { - \tl_set:Nn\l_@@_attribute_class_tl{inline} + \tl_set:Nn\l_@@_attribute_class_tl{inline} } { \tl_set:Nn\l_@@_attribute_class_tl{display} } \bool_if:NF\l__tag_math_alt_bool - { \tl_set:Nn \l_@@_content_alt_tl{} } + { \tl_set:Nn \l_@@_content_alt_tl{} } % \end{macrocode} % debugging option. TODO: hide in debug key. % \begin{macrocode} \tl_if_exist:cTF { g_@@_mathml_ \l_@@_content_hash_tl _tl } - { - \int_gincr:N\g_@@_mathml_AF_found_int - \bool_if:NTF \l__tag_math_mathml_AF_bool - { - \int_gincr:N\g_@@_mathml_AF_attached_int - \typeout {Inserting~mathml~with~Hash~\l_@@_content_hash_tl} - } - { - \typeout {Ignoring~mathml~with~Hash~\l_@@_content_hash_tl} - } - } - { - \typeout{WARNING:~mathml~missing~for~hash~\l_@@_content_hash_tl} - } - \socket_use:n {tagsupport/math/mathml/write} % write hash if request - \bool_if:NTF\l__tag_math_texsource_AF_bool + { + \int_gincr:N\g_@@_mathml_AF_found_int + \bool_if:NTF \l__tag_math_mathml_AF_bool + { + \int_gincr:N\g_@@_mathml_AF_attached_int + \typeout {Inserting~mathml~with~Hash~\l_@@_content_hash_tl} + } + { + \typeout {Ignoring~mathml~with~Hash~\l_@@_content_hash_tl} + } + } + { + \bool_if:NT \l__tag_math_mathml_AF_bool + { + \typeout {WARNING:~mathml~missing~for~hash~\l_@@_content_hash_tl} + } + } + \socket_use:n {tagsupport/math/mathml/write/prepare} + \socket_use:n {tagsupport/math/mathml/write} % write hash if request + \bool_if:NTF\l__tag_math_texsource_AF_bool { \tl_set_eq:NN \l_@@_content_AF_source_tmpa_tl \l_@@_content_AF_source_tl } - { \tl_clear:N \l_@@_content_AF_source_tmpa_tl } + { \tl_clear:N \l_@@_content_AF_source_tmpa_tl } \tag_struct_begin:n { tag=Formula, attribute-class=\l_@@_attribute_class_tl, % - AFref = + AFref = \bool_if:NT\l__tag_math_mathml_AF_bool { \cs_if_exist_use:c {g_@@_mathml_ \l_@@_content_hash_tl _tl} @@ -1207,13 +1771,13 @@ % \begin{macrocode} \socket_new_plug:nnn {tagsupport/math/struct/end} - {test-mathml} + {mathml-AF} { \tag_struct_end: - } + } % \end{macrocode} % \end{plugdecl} -% +% % \begin{socketdecl}{tagsupport/math/substruct/begin, % tagsupport/math/substruct/end} % This holds the code to handle subparts of the formula. @@ -1222,7 +1786,7 @@ \socket_new:nn {tagsupport/math/substruct/end}{0} % \end{macrocode} % \end{socketdecl} -% +% % \begin{plugdecl}{default} % \begin{macrocode} \socket_new_plug:nnn @@ -1232,16 +1796,16 @@ \socket_new_plug:nnn {tagsupport/math/substruct/end} {default} - { + { \tagmcend \if@subformulas \tagstructend \fi - } -\socket_assign_plug:nn {tagsupport/math/substruct/begin}{default} -\socket_assign_plug:nn {tagsupport/math/substruct/end}{default} -% \end{macrocode} -% \end{plugdecl} + } +\socket_assign_plug:nn {tagsupport/math/substruct/begin}{default} +\socket_assign_plug:nn {tagsupport/math/substruct/end}{default} +% \end{macrocode} +% \end{plugdecl} % \begin{plugdecl}{single} % We need an option to disable subparts as it is unclear @@ -1253,7 +1817,7 @@ { \typeout{====>subpart~splitting~deactivated} \typeout{====>grabbed~math=\meaning\g_@@_grabbed_math_tl} - \tag_mc_begin:n{} + \tag_mc_begin:n{} } \socket_new_plug:nnn {tagsupport/math/substruct/end} @@ -1261,21 +1825,21 @@ { \tag_mc_end:} % \end{macrocode} % \end{plugdecl} -% +% % \begin{socketdecl}{tagsupport/math/end} % A socket used at the end of the math (before the closing dollar(s)) -% which can e.g. set a flag for luamml. +% which can, e.g., set a flag for luamml. % \begin{macrocode} \socket_new:nn {tagsupport/math/end}{0} % \end{macrocode} % \end{socketdecl} - -% + +% % \begin{macro}{\__tag_math_disable:} % Similar to the table code we collect the plugs that should be % assigned to do nothing if we don't want tagging % \begin{macrocode} -\cs_new_protected:Npn \__tag_math_disable: +\cs_new_protected:Npn \__tag_math_disable: { \socket_assign_plug:nn {tagsupport/math/inline/begin}{noop} \socket_assign_plug:nn {tagsupport/math/inline/end}{noop} @@ -1284,16 +1848,16 @@ \socket_assign_plug:nn {tagsupport/math/display/begin}{noop} \socket_assign_plug:nn {tagsupport/math/display/end}{noop} \socket_assign_plug:nn {tagsupport/math/display/formula/begin}{identity} - \socket_assign_plug:nn {tagsupport/math/display/formula/end}{noop} - } + \socket_assign_plug:nn {tagsupport/math/display/formula/end}{noop} + } % \end{macrocode} % \end{macro} -% +% % \begin{macro}{\__tag_math_enable:} % Similar to the table code we collect the default plugs that should be % assigned if we want tagging % \begin{macrocode} -\cs_new_protected:Npn \__tag_math_enable: +\cs_new_protected:Npn \__tag_math_enable: { \socket_assign_plug:nn {tagsupport/math/inline/begin}{MC} \socket_assign_plug:nn {tagsupport/math/inline/end}{MC} @@ -1303,7 +1867,7 @@ \socket_assign_plug:nn {tagsupport/math/display/end}{default} \socket_assign_plug:nn {tagsupport/math/display/formula/begin}{default} \socket_assign_plug:nn {tagsupport/math/display/formula/end}{default} - } + } % \end{macrocode} % \end{macro} % At begin document we can activate: @@ -1349,49 +1913,65 @@ % \subsection{Content grabbing} % % \begin{macro}{\@@_grab_dollar:w} -% Grab up to a single |$|, for inline math mode, suppressing -% any processing if the token is \tn{m@th} found in the content. -% -% \fmi{what's that test doing?} -% -% \car{It is some kind of fix, to avoid the remote -% possibility that the math is empty, making the code -% produce an unwanted \texttt{\$\$}.} -% -%\car{cf.~the code for this in \cs{@ensuredmath}} -% -%\car{It is harmless but unnecessary in the dollardollar grabbing below.} -% +% \begin{macro}{\@@_grab_dollar:n} +% \changes{v0.6c}{2024-08-22}{Correct handling of empty math segments} +% Top-level function to handle grabbing of inline math mode delimited by +% |$| tokens. We provide two different ways to do that: a token-by-token +% one that can be used everywhere, and a fast delimited one that does not +% work anywhere that the end |$| token may be hidden, most obviously in +% tabulars. The function here is therefore set up as a variable starting +% point. % \begin{macrocode} -\cs_new_protected:Npn \@@_grab_dollar:w % $ - #1 $ +\cs_new_protected:Npn \@@_grab_dollar:w { \@@_grab_dollar_delim:w } +% \end{macrocode} +% After grabbing inline math material, there is again common processing +% independent of mechanism of collection. +% \begin{macrocode} +\cs_new_protected:Npn \@@_grab_dollar:n #1 { % \end{macrocode} -% \fmi{what's that test doing?} +% We need to do processing first as this picks up \enquote{fake} math mode: +% that information is needed below. % \begin{macrocode} - \tl_if_blank:nF {#1} - { - \@@_process:nn { math } {#1} % $ + \@@_process:nn { math } {#1} % \end{macrocode} % We do not want math tagging in fakemath or when measuring, % We also do not want math tagging if tagging has been suspended. % \begin{macrocode} - \bool_lazy_or:nnTF - {\legacy_if_p:n { measuring@ }} - { \l_@@_fakemath_bool } - { #1 $ } + \bool_lazy_any:nTF + { + {\legacy_if_p:n { measuring@ }} + { \l_@@_fakemath_bool } + { \tl_if_blank_p:n {#1} } + } + { + #1 $ % $ + } { - \tag_socket_use:n {math/inline/begin} %end P-MC - \tag_socket_use:nn {math/inline/formula/begin}{#1} - $ + \tag_socket_use:n {math/inline/begin} %end P-MC +% \end{macrocode} +% We do no use a tagging socket here, so that the argument (the +% math) is not lost, tagging-project issue 661. +% \begin{macrocode} + \socket_use:nn {tagsupport/math/inline/formula/begin}{#1} + $ % $ \tag_socket_use:n {math/inline/formula/end} \tag_socket_use:n {math/inline/end} % restart P-MC - } - } + } } % \end{macrocode} % \end{macro} -% +% \end{macro} +% +% \begin{macro}{\@@_grab_dollar_delim:w} +% Grab up to a single |$|, for inline math mode, suppressing +% any processing if the token is \tn{m@th} found in the content. +% \begin{macrocode} +\cs_new_protected:Npn \@@_grab_dollar_delim:w #1 $ % $ + { \@@_grab_dollar:n {#1} } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\@@_grab_dollardollar:w} % And for the classical \TeX{} display structure. % \begin{macrocode} @@ -1401,17 +1981,17 @@ \tl_if_blank:nF {#1} { \@@_process:nn { equation* } {#1} - \socket_use:n {tagsupport/math/display/begin} + \tag_socket_use:n {math/display/begin} \socket_use:nn{tagsupport/math/display/formula/begin}{#1} - $$ } + $$ } % \end{macrocode} -% +% % The end code is added through a \cs{aftergroup} so we % store it inside a command. % \begin{macrocode} -\cs_new_protected:Npn \@@_tag_dollardollar_display_end: +\cs_new_protected:Npn \@@_tag_dollardollar_display_end: { % \typeout{== tag dollarldollar display end} % \ShowTagging{struct-stack} @@ -1420,15 +2000,30 @@ % TODO why is that needed? where is para-tagging disabled? % \begin{macrocode} \tagpdfparaOn +% \end{macrocode} +% The \cs{postdisplaypenalty} was temporarily set to 10000 inside +% the display and the \cs{belowdisplayskip} and the +% \cs{belowdisplayshortskip} was negated, so whatever was inserted +% it should have been a negative skip. Whatever skip was added we +% pick it ups value up here, so that we can correct the spacing +% after the tagging code was inserted. +% \begin{macrocode} \l_@@_tmpa_skip \lastskip - \socket_use:n{tagsupport/math/display/formula/end} - \penalty \postdisplaypenalty + \tag_socket_use:n{math/display/formula/end} % \end{macrocode} -% This reinserts the below display skips. It must be doubled to -% get the right amount: +% Now we add a skip without indroducing a page break possibility, +% that should bring the current vertical position back to the point +% where \TeX{} would add the penalty and the \enquote{below skip}. +% \changes{v0.6f}{2024-09-30}{Correct logic for inserting below skips +% after displays (tagging/721)} % \begin{macrocode} - \skip_vertical:n { -\l_@@_tmpa_skip * 2 } -% + \nobreak + \skip_vertical:n { -\l__math_tmpa_skip } % remove the negative belowdisplayskip +% \end{macrocode} +% Then we finally add the real stuff: +% \begin{macrocode} + \penalty \postdisplaypenalty + \skip_vertical:n { -\l__math_tmpa_skip } % insert the correct skip \@doendpe % this has no \end{...} to take care of it } @@ -1463,6 +2058,164 @@ % \end{macrocode} % \end{macro} % +% \subsection{Token-by-token inline grabbing} +% +% Grabbing inline math token-by-token is more involved. The mechanism here +% is essentially a simplified version of that originally seen in +% \pkg{collcell} and refined in \pkg{siunitx}. We make use of the fact that +% in math mode spaces are ignored, so we have to deal with only \texttt{N}-type +% tokens and groups. Furthermore, there is no need to look inside groups, so +% the only special cases are a small selection of \texttt{N}-type tokens. +% +% \begin{variable}{\l_@@_grabbed_tl} +% For collection of the material piecewise. +% \begin{macrocode} +\tl_new:N \l_@@_grabbed_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_grab_env_int} +% Needed to count up the number of nested environments encountered. +% \begin{macrocode} +\int_new:N \l_@@_grab_env_int +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_grab_dollar_loop:} +% \begin{macro}{\@@_grab_loop:} +% The lead-off here establishes a group: we need that as we will have to +% be careful in the way \tn{cr} is handled and ensure this is only +% manipulated whilst grabbing. The main loop is then started. +% \begin{macrocode} +\cs_new_protected:Npn \@@_grab_dollar_loop: + { + \group_begin: + \tl_clear:N \l_@@_grabbed_tl + \@@_grab_loop: + } +\cs_new_protected:Npn \@@_grab_loop: + { + \peek_remove_spaces:n + { + \peek_meaning:NTF \c_group_begin_token + { \@@_grab_loop_group:n } + { \@@_grab_loop_token:N } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_grab_loop_group:n} +% \begin{macro}{\@@_grab_loop_store:n} +% Handling of grabbed groups is pretty easy. +% \begin{macrocode} +\cs_new_protected:Npn \@@_grab_loop_group:n #1 + { \@@_grab_loop_store:n { {#1} } } +\cs_new_protected:Npn \@@_grab_loop_store:n #1 + { + \tl_put_right:Nn \l_@@_grabbed_tl {#1} + \@@_grab_loop: + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_grab_loop_token:N} +% \begin{macro} +% { +% \@@_grab_loop_$: , +% \@@_grab_loop_\\: , +% \@@_grab_loop_\begin: , +% \@@_grab_loop_\end: , +% \@@_grab_loop_\ignorespaces: , +% \@@_grab_loop_\unskip: , +% \@@_grab_loop_\textonly@unskip: +% } +% Filter out the special cases: for performance reasons, use a hash table +% approach rather than a loop (\emph{cf.}~\pkg{collcell}). +% \begin{macrocode} +\cs_new_protected:Npn \@@_grab_loop_token:N #1 + { + \cs_if_exist_use:cF + { @@_grab_loop_ \token_to_str:N #1 : } + { \@@_grab_loop_store:n {#1} } + } +\cs_new_protected:cpn { @@_grab_loop_ \token_to_str:N $ : } + { \@@_grab_loop_end: } +\cs_new_protected:cpn { @@_grab_loop_ \token_to_str:N \\ : } + { + \int_compare:nNnTF \l_@@_grab_env_int = 0 + { \@@_grab_loop_newline: } + { \@@_grab_loop_store:n { \\ } } + } +% \end{macrocode} +% In contrast to \pkg{collcell}, nesting is tracked by counting +% \cs{begin}/\cs{end} pairs: this is needed in case there is a tabular-like +% construct containing |\\| inside a cell. As a result, the end-of-tabular +% can be detected without checking the name argument: if \cs{end} is +% encountered at nesting level~0, we've hit the end of a cell. In that case, +% end the row and leave the environment to clean up. +% \begin{macrocode} +\cs_new_protected:cpn { @@_grab_loop_ \token_to_str:N \begin : } + { + \int_incr:N \l_@@_grab_env_int + \@@_grab_loop_store:n { \begin } + } +\cs_new_protected:cpn { @@_grab_loop_ \token_to_str:N \end : } + { + \int_compare:nNnTF \l_@@_grab_env_int = 0 + { + \@@_grab_loop_newline: + \end + } + { + \int_decr:N \l_@@_grab_env_int + \@@_grab_loop_store:n { \end } + } + } +\tl_map_inline:nn { \ignorespaces \unskip \textonly@unskip } + { + \cs_new_protected:cpn { @@_grab_loop_ \token_to_str:N #1 : } + { \@@_grab_loop: } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_grab_loop_newline:} +% To allow collection of tokens in the part of the \tn{halign} template after +% |#|, we need \TeX{} to see the primitive with the loop token in the right +% place. That is done by re-defining \tn{cr} at present. Ideally there would +% be a socket in the definition of \texttt{tabular}, etc., to handle this: +% there is also the need to examine in interaction with \pkg{longtable}, which +% also redefines \tn{cr}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_grab_loop_newline: + { + \if_false: { \fi: + \cs_set_protected:Npn \cr + { + \@@_grab_loop: + \tex_cr:D + } + \if_false: } \fi: + \\ + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_grab_loop_end:} +% Clean up and pass on. +% \begin{macrocode} +\cs_new_protected:Npn \@@_grab_loop_end: + { + \exp_args:NNV \group_end: + \@@_grab_dollar:n \l_@@_grabbed_tl + } +% \end{macrocode} +% \end{macro} +% % \subsection{Marking math environments} % % A general mechanism for math mode environments that do not grab their @@ -1644,7 +2397,7 @@ } { % \typeout{==>A3} - \__tag_tool_close_P: + \__tag_tool_close_P: } \socket_use:nn{tagsupport/math/display/formula/begin}{} \tagpdfparaOff @@ -1662,7 +2415,7 @@ \cs_new_protected:Npn \math_register_env:n #1 { \math_register_env:nn {#1} { } } - + \NewDocumentCommand \RegisterMathEnvironment { O{} m } { \math_register_env:nn {#2} {#1} } % \end{macrocode} @@ -1749,7 +2502,7 @@ { \cs_gset_protected:Npn \[ % \] { - \@@_grab_eqn:w + \@@_grab_eqn:w % \bool_if:NTF \l_@@_collected_bool % { \begin { equation* } } % { \@@_grab_eqn:w } @@ -1847,7 +2600,7 @@ % \end{macrocode} % % Tabulars currently contain a \$ that shouldn't trigger math -% tagging. +% tagging. % \begin{macrocode} \RequirePackage{array} \tl_if_in:NnT\@tabular{$} @@ -1856,11 +2609,15 @@ \leavevmode \UseTaggingSocket{tbl/hmode/begin}% \hbox \bgroup - \bool_set_true:N \l_@@_collected_bool + \bool_set_true:N \l_@@_collected_bool $ \bool_set_false:N \l_@@_collected_bool \col@sep\tabcolsep \let\d@llarbegin\begingroup \let\d@llarend\endgroup +% \end{macrocode} +% A proper switching mechanism is needed: for the present, do directly. +% \begin{macrocode} + \cs_set_protected:Npn \@@_grab_dollar:w { \@@_grab_dollar_loop: } \@tabarray} } % \end{macrocode} @@ -1877,10 +2634,10 @@ } % \end{macrocode} % \end{macro} -% +% % \subsection{Disable math grabbing in the begindocument hook} % For example amsart uses math to measure text there. -% +% % \begin{macrocode} \tl_gput_right:Nn\@kernel@before@begindocument { @@ -1996,7 +2753,7 @@ % \end{macrocode} % Also for "false?" % \begin{macrocode} -\def\measuring@true{\let\ifmeasuring@\iftrue\tag_stop:} +\def\measuring@true{\let\ifmeasuring@\iftrue\tag_suspend:n{\measuring}} % \end{macrocode} % % \begin{macrocode} @@ -2004,7 +2761,7 @@ \math_register_halign_env:nn {align}{} \math_register_halign_env:nn {align*}{} \math_register_halign_env:nn {alignat}{} - \math_register_halign_env:nn {alignat*}{} + \math_register_halign_env:nn {alignat*}{} \math_register_halign_env:nn {flalign}{} \math_register_halign_env:nn {flalign*}{} \math_register_halign_env:nn {gather}{} @@ -2085,8 +2842,8 @@ % % \begin{macro}{\@@_split_at_nl:NN} -% This splits grabbed math at newlines. -% +% This splits grabbed math at newlines. +% % \begin{macrocode} \cs_new:Npn \@@_split_at_nl:NN #1#2 { \tl_set:Nf \l_@@_tmpa_tl { @@ -2105,14 +2862,14 @@ #2 \\ #3 \s_stop } } - + \cs_new_protected:Npn \@@_split_at_nl_aux:nnNN #1 #2 #3 #4 { \tl_gset:Nn #4 {#1} \tl_gset:Nn #3 {#2} } -\cs_new:Npn \@@_split_chk_if_begin:ww +\cs_new:Npn \@@_split_chk_if_begin:ww #1 \begin #2 #3 \s_mark #4 \\ \q_nil \\ \s_stop { \quark_if_nil:nTF {#2} @@ -2163,11 +2920,11 @@ { \exp_end: { #4 #1 } } { \@@_split_final_cleanup:w #3 \s_mark { #4 #1 #2 } } } - + \cs_new:Npn \@@_split:n #1 { \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop } - -% this looks unused. + +% this looks unused. %\NewDocumentCommand \splitnl { mm +m } % { % \tl_set:Nf \l_@@_tmpa_tl { \split:n {#3} } @@ -2179,12 +2936,12 @@ % % % \begin{macro}{\maybestartnewformulatag} -% +% % \begin{macrocode} \newif\if@subformulas -\tl_new:N \result - +\tl_new:N \result + \cs_new_protected:Npn\grabaformulapartandstart { \@@_split_at_nl:NN \g_@@_grabbed_math_tl \result \typeout{====>first-result=\meaning\result} @@ -2204,7 +2961,7 @@ % but we add a short text to satisfy the pdf/ua-2 validator % \begin{macrocode} % alt=\result, - alt = subformula, + alt = subformula, title-o=\resulttitle } } @@ -2242,7 +2999,7 @@ % \tl_if_empty:NF \g_@@_grabbed_math_tl { - \tagmcend + \tagmcend \tagstructend \grabaformulapartandmayberestart } @@ -2258,21 +3015,21 @@ % \typeout{===>~ in~ hook} % \math_register_halign_env:nn {dmath}{} % \math_register_halign_env:nn {dgroup*}{} -%} +%} % \end{macrocode} -% +% % \begin{macrocode} \ExplSyntaxOff % \end{macrocode} -% +% % \begin{macrocode} %<@@=> % \end{macrocode} -% +% % \begin{macrocode} %</kernel> % \end{macrocode} % % \Finale % -% +% diff --git a/macros/latex/required/latex-lab/latex-lab-math.pdf b/macros/latex/required/latex-lab/latex-lab-math.pdf Binary files differindex 728777fa58..fb2a43437f 100644 --- a/macros/latex/required/latex-lab/latex-lab-math.pdf +++ b/macros/latex/required/latex-lab/latex-lab-math.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-mathpkg.pdf b/macros/latex/required/latex-lab/latex-lab-mathpkg.pdf Binary files differindex 19f9fbbb03..d16a507e01 100644 --- a/macros/latex/required/latex-lab/latex-lab-mathpkg.pdf +++ b/macros/latex/required/latex-lab/latex-lab-mathpkg.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-mathtools.dtx b/macros/latex/required/latex-lab/latex-lab-mathtools.dtx index aa27cbf01d..ed8b6e467e 100644 --- a/macros/latex/required/latex-lab/latex-lab-mathtools.dtx +++ b/macros/latex/required/latex-lab/latex-lab-mathtools.dtx @@ -18,12 +18,14 @@ % % for those people who are interested or want to report an issue. % +\def\ltlabmathtoolsdate{2024-09-18} +\def\ltlabmathtoolsversion{0.80a} %<*driver> \documentclass{l3doc} \EnableCrossrefs \CodelineIndex \begin{document} - \DocInput{latex-lab-amsmath.dtx} + \DocInput{latex-lab-mathtools.dtx} \end{document} %</driver> % @@ -32,7 +34,7 @@ % % \title{The \texttt{latex-lab-mathtools} code\thanks{}} % \author{\LaTeX{} Project} -% +% \date{v\ltlabmathtoolsversion\ \ltlabmathtoolsdate} % \maketitle % % \newcommand\fmi[1]{\begin{quote} TODO: \itshape #1\end{quote}} @@ -66,7 +68,7 @@ % \subsection{File declaration} % \begin{macrocode} \ProvidesFile{latex-lab-mathtools.ltx} - [2023-01-05 v0.1a mathtools adaptions] + [2024-07-13 v0.1a mathtools adaptions] % \end{macrocode} % \subsection{Tagpdf support} % To make the code independent from tagging being loaded and active @@ -117,7 +119,7 @@ % \end{macrocode} % Stop tagging when measuring: % \begin{macrocode} - \ifmeasuring@\tag_stop:\fi + \ifmeasuring@\tag_suspend:n{\measuring}\fi \normalbaselines \ifdim \ifdim\@totalleftmargin=\z@ @@ -156,7 +158,7 @@ \noalign{% \penalty\postdisplaypenalty\vskip\abovedisplayshortskip \vbox{% - \ifmeasuring@\tag_stop:\fi + \ifmeasuring@\tag_suspend:n{\measuring}\fi \normalbaselines \MH_if_dim:w \MH_if_dim:w \@totalleftmargin=\z@ @@ -185,7 +187,7 @@ \vskip\normallineskiplimit \vskip\l_MT_above_shortintertext_sep \vbox{% - \ifmeasuring@\tag_stop:\fi + \ifmeasuring@\tag_suspend:n{\measuring}\fi \normalbaselines \MH_if_dim:w \MH_if_dim:w \@totalleftmargin=\z@ diff --git a/macros/latex/required/latex-lab/latex-lab-mathtools.pdf b/macros/latex/required/latex-lab/latex-lab-mathtools.pdf Binary files differindex d89429b3d2..3eb43692cb 100644 --- a/macros/latex/required/latex-lab/latex-lab-mathtools.pdf +++ b/macros/latex/required/latex-lab/latex-lab-mathtools.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-minipage.dtx b/macros/latex/required/latex-lab/latex-lab-minipage.dtx index ffbe5357e7..eed595a531 100644 --- a/macros/latex/required/latex-lab/latex-lab-minipage.dtx +++ b/macros/latex/required/latex-lab/latex-lab-minipage.dtx @@ -18,8 +18,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabminipagedate{2023-10-30} -\def\ltlabminipageversion{0.81c} +\def\ltlabminipagedate{2024-09-18} +\def\ltlabminipageversion{0.81e} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -120,12 +120,18 @@ % \end{macrocode} % insert the socket % \begin{macrocode} - \socket_use:n{tagsupport/minipage/before}% new + \UseTaggingSocket{minipage/before}% new \setbox\@tempboxa\vbox\bgroup \color@begingroup \hsize\@tempdima \textwidth\hsize \columnwidth\hsize \@parboxrestore +% \end{macrocode} +% minipages are perhaps used in environments where the tagging of paragraphs +% has been altered. So we try to restore this. TODO: this should +% perhaps be done in \cs{@parboxrestore} directly. +% \begin{macrocode} + \UseTaggingSocket{para/restore} \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ \socket_assign_plug:nn{fntext/process}{mp}% \let\@listdepth\@mplistdepth \@mplistdepth\z@ @@ -150,10 +156,10 @@ % As the parbox command is called, we must prevent that it adds its % additional tagging commands: % \begin{macrocode} - \tag_stop:n{minipage} + \tag_suspend:n{minipage} \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}% - \tag_start:n{minipage} - \socket_use:n{tagsupport/minipage/after} %new end ... + \tag_resume:n{minipage} + \UseTaggingSocket{minipage/after} %new end ... } % \end{macrocode} % @@ -164,8 +170,15 @@ \leavevmode \@pboxswfalse \setlength\@tempdima{#4}% - \socket_use:n{tagsupport/parbox/before} - \@begin@tempboxa\vbox{\hsize\@tempdima\@parboxrestore#5\@@par}% + \UseTaggingSocket{parbox/before} + \@begin@tempboxa\vbox{\hsize\@tempdima\@parboxrestore +% \end{macrocode} +% parbox are perhaps used in environments where the tagging of paragraphs +% has been altered. So we try to restore this. TODO: this should +% perhaps be done in \cs{@parboxrestore} directly. +% \begin{macrocode} + \UseTaggingSocket{para/restore} + #5\@@par}% \ifx\relax#2\else \setlength\@tempdimb{#2}% \edef\@parboxto{to\the\@tempdimb}% @@ -179,7 +192,7 @@ \csname bm@#3\endcsname}% \if@pboxsw \m@th$\fi \@end@tempboxa% - \socket_use:n{tagsupport/parbox/after} + \UseTaggingSocket{parbox/after} } % \end{macrocode} % @@ -191,9 +204,11 @@ \socket_new_plug:nnn{tagsupport/minipage/before}{tag/dflt} { % \end{macrocode} -% As there was a \cs{leavevmode} before that is a P/text open that we have to close. +% As there was a \cs{leavevmode} before that is a P/text open that we have to close +% if para tagging is active: % \begin{macrocode} - \tag_mc_end_push:\tag_struct_end: + \tag_mc_end_push: + \bool_if:NT \l__tag_para_bool {\tag_struct_end:} % \end{macrocode} % TODO: the P can be further up, we need a proper method to test and handle this. % \begin{macrocode} @@ -203,13 +218,25 @@ % similar for the other sockets: % \begin{macrocode} \socket_new_plug:nnn{tagsupport/minipage/after}{tag/dflt} - {\tag_struct_end:\tag_struct_begin:n{tag=\l__tag_para_tag_tl}\tag_mc_begin_pop:n{}} + { + \tag_struct_end: + \bool_if:NT \l__tag_para_bool {\tag_struct_begin:n{tag=\l__tag_para_tag_tl}} + \tag_mc_begin_pop:n{} + } \socket_new_plug:nnn{tagsupport/parbox/before}{tag/dflt} - {\tag_mc_end_push:\tag_struct_end:\tag_struct_begin:n{tag=\l__ltboxes_tag_tl}} + { + \tag_mc_end_push: + \bool_if:NT \l__tag_para_bool {\tag_struct_end:} + \tag_struct_begin:n{tag=\l__ltboxes_tag_tl} + } \socket_new_plug:nnn{tagsupport/parbox/after}{tag/dflt} - {\tag_struct_end:\tag_struct_begin:n{tag=\l__tag_para_tag_tl}\tag_mc_begin_pop:n{}} + { + \tag_struct_end: + \bool_if:NT \l__tag_para_bool {\tag_struct_begin:n{tag=\l__tag_para_tag_tl}} + \tag_mc_begin_pop:n{} + } % \end{macrocode} % Activate the default tagging plug % \begin{macrocode} diff --git a/macros/latex/required/latex-lab/latex-lab-minipage.pdf b/macros/latex/required/latex-lab/latex-lab-minipage.pdf Binary files differindex 9eaffaeb9b..7878bcfd34 100644 --- a/macros/latex/required/latex-lab/latex-lab-minipage.pdf +++ b/macros/latex/required/latex-lab/latex-lab-minipage.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-namespace.dtx b/macros/latex/required/latex-lab/latex-lab-namespace.dtx index cfc06c7b09..d76dd8d489 100644 --- a/macros/latex/required/latex-lab/latex-lab-namespace.dtx +++ b/macros/latex/required/latex-lab/latex-lab-namespace.dtx @@ -26,7 +26,7 @@ % \fi % \title{Prototype reimplementation of \LaTeXe{}'s role mapping} % \author{\LaTeX{} Project, initial implementation Ulrike Fischer} -% \date{v0.8b 2024-03-24} +% \date{v0.8b 2024-07-05} % % \maketitle % @@ -37,7 +37,7 @@ % \section{Introduction} % % This short file collects tag names from the \LaTeX{} namespace and their role mapping used -% in the latex-lab files. The names and the roles are not necessarly the final ones! +% in the latex-lab files. The names and the roles are not necessarily the final ones! % % Later settings of the same tag overwrite previous settings. % The syntax of a line is a list of three strings ending with commas: diff --git a/macros/latex/required/latex-lab/latex-lab-namespace.pdf b/macros/latex/required/latex-lab/latex-lab-namespace.pdf Binary files differindex 2dfea04dee..3792133f44 100644 --- a/macros/latex/required/latex-lab/latex-lab-namespace.pdf +++ b/macros/latex/required/latex-lab/latex-lab-namespace.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-new-or-1.pdf b/macros/latex/required/latex-lab/latex-lab-new-or-1.pdf Binary files differindex dbfef1a84c..b80a1c4b15 100644 --- a/macros/latex/required/latex-lab/latex-lab-new-or-1.pdf +++ b/macros/latex/required/latex-lab/latex-lab-new-or-1.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-new-or-2.pdf b/macros/latex/required/latex-lab/latex-lab-new-or-2.pdf Binary files differindex 6a354382ac..24491f9568 100644 --- a/macros/latex/required/latex-lab/latex-lab-new-or-2.pdf +++ b/macros/latex/required/latex-lab/latex-lab-new-or-2.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-sec.dtx b/macros/latex/required/latex-lab/latex-lab-sec.dtx index f3786c2ddb..936eee9ed2 100644 --- a/macros/latex/required/latex-lab/latex-lab-sec.dtx +++ b/macros/latex/required/latex-lab/latex-lab-sec.dtx @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabsecdate{2024-02-12} -\def\ltlabsecversion{0.84c} +\def\ltlabsecdate{2024-10-04} +\def\ltlabsecversion{0.84f} %<*driver> \documentclass[kernel]{l3doc} \EnableCrossrefs @@ -121,7 +121,7 @@ % commands must be at the right grouping level. % \end{itemize} % -% \subsection{Funktions and keys} +% \subsection{Functions and keys} % % \begin{function}{\tag_tool:n,\tagtool} % @@ -138,7 +138,7 @@ % to allow e.g. to put an epigraph or similar in front. % % \item The number in \cs{part} and \cs{chapter} is currently not correctly -% tagged as a \texttt{Lbl} as this requires to redefine the internal (class dependant) +% tagged as a \texttt{Lbl} as this requires to redefine the internal (class dependent) % commands too. % % \end{itemize} @@ -198,28 +198,31 @@ % We must ensure that manual targets (e.g. in unnumbered sections) % correctly update \cs{@currentHref}. For this we extend the kernel definition of % \cs{MakeLinkTarget} -% +% TODO: remove after release 2024/11 % \begin{macrocode} %<*kernelchange> \ExplSyntaxOn -\int_new:N\g__kernel_target_int -\RenewDocumentCommand\MakeLinkTarget{sO{}m} - {% - \ifvmode - \special{}% - \else - \@savsf\spacefactor - \smash{}% - \spacefactor\@savsf - \fi - \IfBooleanTF {#1} - { - \tl_gset:Ne \@currentHref {#3} +\str_if_exist:cF { l__socket_tagsupport/recordtarget_plug_str } + { + \int_new:N\g__kernel_target_int + \RenewDocumentCommand\MakeLinkTarget{sO{}m} + {% + \ifvmode + \special{}% + \else + \@savsf\spacefactor + \smash{}% + \spacefactor\@savsf + \fi + \IfBooleanTF {#1} + { + \tl_gset:Ne \@currentHref {#3} + } + { + \int_gincr:N\g__kernel_target_int + \tl_gset:Ne \@currentHref {target*.\int_use:N\g__kernel_target_int} + } } - { - \int_gincr:N\g__kernel_target_int - \tl_gset:Ne \@currentHref {target*.\int_use:N\g__kernel_target_int} - } } \ExplSyntaxOff %</kernelchange> @@ -227,45 +230,56 @@ % % \begin{macrocode} %<*package> +%<@@=tag> % \end{macrocode} % \subsubsection{Tagging commands} % % -% \begin{variable}{\g__tag_sec_stack_seq} -% The stack holds the tag and the level. +% \begin{variable}{\g_@@_sec_stack_seq} +% The stack holds the tag, the level and the structure number. % \begin{macrocode} -\seq_new:N \g__tag_sec_stack_seq -\seq_gpush:Nn\g__tag_sec_stack_seq {{Document}{-100}} +\seq_new:N \g_@@_sec_stack_seq +\seq_gpush:Nn\g_@@_sec_stack_seq {{Document}{-100}{2}} % \end{macrocode} % \end{variable} % -% \begin{variable}{\l__tag_sec_Sect_bool} +% \begin{macro}{\@@_get_data_current_Sect:} +% This allows to retrieve the number of the current Sect structure (or +% Document if we are outside any Sect) with |\tag_get:n{current_Sect}| +% \begin{macrocode} +\cs_new:Npn \@@_get_data_current_Sect: + { + \exp_last_unbraced:Ne\use_iii:nnn{\seq_item:Nn\g_@@_sec_stack_seq{1}} + } +% \end{macrocode} +% \end{macro} +% \begin{variable}{\l_@@_sec_Sect_bool} % This boolean controls if a Sect structure is opened. % \begin{macrocode} -\bool_new:N \l__tag_sec_Sect_bool -\bool_set_true:N\l__tag_sec_Sect_bool +\bool_new:N \l_@@_sec_Sect_bool +\bool_set_true:N\l_@@_sec_Sect_bool % \end{macrocode} % \end{variable} - -% -% \begin{macro}{\__tag_sec_begin:nn} +% +% \begin{macro}{\@@_sec_begin:nn} % This starts a sectioning structure. % Currently the tag is fix, either Sect or Part, depending on the level, % but this will perhaps change. The second argument is currently unused. % \begin{macrocode} -\cs_new_protected:Npn\__tag_sec_begin:nn #1 #2 %#1 level #2 keyval +\cs_new_protected:Npn\@@_sec_begin:nn #1 #2 %#1 level #2 keyval { \tag_struct_begin:n { tag= {\int_compare:nNnTF {#1}={-1}{Part}{Sect}} ,#2 } - \seq_gpush:Ne \g__tag_sec_stack_seq {{\g__tag_struct_tag_tl}{\int_eval:n{#1}}} + \seq_gpush:Ne \g_@@_sec_stack_seq + {{\g_@@_struct_tag_tl}{\int_eval:n{#1}}{\g_@@_struct_stack_current_tl}} } % \end{macrocode} % \end{macro} % -% \begin{macro}{\__tag_sec_end:n} +% \begin{macro}{\@@_sec_end:n} % \begin{macrocode} \msg_new:nnn { tag } {wrong-sect-nesting} { @@ -273,65 +287,65 @@ It~is~not~equal~to~the~current~structure~#2~on~the~main~stack } -\cs_new_protected:Npn\__tag_sec_end:n #1 % #1 level +\cs_new_protected:Npn\@@_sec_end:n #1 % #1 level { - \seq_get:NN \g__tag_sec_stack_seq \l__tag_tmpa_tl - \int_compare:nNnT {#1}<{\exp_last_unbraced:NV\use_ii:nn\l__tag_tmpa_tl+1} + \seq_get:NN \g_@@_sec_stack_seq \l_@@_tmpa_tl + \int_compare:nNnT {#1}<{\exp_last_unbraced:NV\use_ii:nnn\l_@@_tmpa_tl+1} { - \seq_get:NN\g__tag_struct_tag_stack_seq \l__tag_tmpb_tl + \seq_get:NN\g_@@_struct_tag_stack_seq \l_@@_tmpb_tl \exp_args:Nee \tl_if_eq:nnTF - {\exp_last_unbraced:NV\use_i:nn\l__tag_tmpa_tl} - {\exp_last_unbraced:NV\use_i:nn\l__tag_tmpb_tl} + {\exp_last_unbraced:NV\use_i:nnn\l_@@_tmpa_tl} + {\exp_last_unbraced:NV\use_i:nn\l_@@_tmpb_tl} { - \seq_gpop:NN \g__tag_sec_stack_seq \l__tag_tmpa_tl + \seq_gpop:NN \g_@@_sec_stack_seq \l_@@_tmpa_tl \tag_struct_end: - \__tag_sec_end:n {#1} + \@@_sec_end:n {#1} } { \msg_warning:nnee {tag}{wrong-sect-nesting} - { \exp_last_unbraced:NV\use_i:nn \l__tag_tmpa_tl } - { \exp_last_unbraced:NV\use_i:nn \l__tag_tmpb_tl } + { \exp_last_unbraced:NV\use_i:nnn \l_@@_tmpa_tl } + { \exp_last_unbraced:NV\use_i:nn \l_@@_tmpb_tl } } } } % \end{macrocode} % \end{macro} -% \begin{macro}{\__tag_tool_para_split:} +% \begin{macro}{\@@_tool_para_split:} % Runin-sectioning command must separate the heading from the following text. % % \begin{macrocode} -\cs_new_protected:Npn \__tag_tool_para_split: +\cs_new_protected:Npn \@@_tool_para_split: { \tag_mc_end: \tag_struct_end: - \tag_struct_begin:n{tag=\l__tag_para_tag_default_tl} + \tag_struct_begin:n{tag=\l_@@_para_tag_default_tl} \tag_mc_begin:n{} - \__tag_setup_restore_para_default: + \@@_setup_restore_para_default: } % \end{macrocode} % \end{macro} -% \begin{macro}{\__tag_setup_restore_para_default:} +% \begin{macro}{\@@_setup_restore_para_default:} % We change the para tagging in the sectioning code. % This here restores the default. Currently it only resets the % the tag, but perhaps more will be needed later. % \begin{macrocode} -\cs_new_protected:Npn \__tag_setup_restore_para_default: +\cs_new_protected:Npn \@@_setup_restore_para_default: { - \tl_set:Nn \l__tag_para_main_tag_tl {text-unit} - \tl_set_eq:NN\l__tag_para_tag_tl\l__tag_para_tag_default_tl + \tl_set:Nn \l_@@_para_main_tag_tl {text-unit} + \tl_set_eq:NN\l_@@_para_tag_tl\l_@@_para_tag_default_tl } % \end{macrocode} % \end{macro} % -% \begin{macro}{\__tag_sec_end_display:} +% \begin{macro}{\@@_sec_end_display:} % \begin{macrocode} -\cs_new_protected:Npn \__tag_sec_end_display: +\cs_new_protected:Npn \@@_sec_end_display: { \tag_struct_end: %P = Hn - \__tag_setup_restore_para_default: + \@@_setup_restore_para_default: } % \end{macrocode} % \end{macro} @@ -339,17 +353,17 @@ % Open sec structures should be closed at the end of the document. This should % be done before tagpdf closes the Document structure. % \begin{macrocode} -\hook_gput_code:nnn{tagpdf/finish/before}{tagpdf/sec}{\__tag_sec_end:n{-10}} +\hook_gput_code:nnn{tagpdf/finish/before}{tagpdf/sec}{\@@_sec_end:n{-10}} \hook_gset_rule:nnnn {tagpdf/finish/before}{tagpdf/sec}{before}{tagpdf} % \end{macrocode} % % The commands \cs{mainmatter}, \cs{backmatter}, \cs{frontmatter} and % \cs{appendix} close all \texttt{Sect} and \texttt{Part} structures. % \begin{macrocode} -\AddToHook{cmd/frontmatter/before}{\__tag_sec_end:n{-10}} -\AddToHook{cmd/mainmatter/before} {\__tag_sec_end:n{-10}} -\AddToHook{cmd/backmatter/before} {\__tag_sec_end:n{-10}} -\AddToHook{cmd/appendix/before} {\__tag_sec_end:n{-10}} +\AddToHook{cmd/frontmatter/before}{\@@_sec_end:n{-10}} +\AddToHook{cmd/mainmatter/before} {\@@_sec_end:n{-10}} +\AddToHook{cmd/backmatter/before} {\@@_sec_end:n{-10}} +\AddToHook{cmd/appendix/before} {\@@_sec_end:n{-10}} % \end{macrocode} % % \subsection{Tagging tools} @@ -368,57 +382,57 @@ { ,sec-start-part .code:n = { - \bool_if:NT\l__tag_sec_Sect_bool + \bool_if:NT\l_@@_sec_Sect_bool { - \__tag_sec_end:n {-1} - \__tag_sec_begin:nn{-1}{tag=Part} + \@@_sec_end:n {-1} + \@@_sec_begin:nn{-1}{tag=Part} } \tag_struct_begin:n{tag=part,title=#1} % \end{macrocode} % We remap here the text-unit from the paragraph to NonStruct. -% It would be better to suppress it completly as with the other +% It would be better to suppress it completely as with the other % sectioning commands, but this would require to redefine \cs{@spart} % and \cs{@part}, as there is the grouping, and these commands are % all slightly different in the standard classes. So this is delayed % to the time when sectioning commands are redefined with templates. % \begin{macrocode} - \tl_set:Nn\l__tag_para_main_tag_tl {NonStruct} - \tl_set:Nn\l__tag_para_tag_tl {Span} + \tl_set:Nn\l_@@_para_main_tag_tl {NonStruct} + \tl_set:Nn\l_@@_para_tag_tl {Span} } - ,sec-stop-part .code:n = {\__tag_sec_end_display:} + ,sec-stop-part .code:n = {\@@_sec_end_display:} ,sec-start-chapter .code:n = { - \bool_if:NT\l__tag_sec_Sect_bool + \bool_if:NT\l_@@_sec_Sect_bool { - \__tag_sec_end:n {0} - \__tag_sec_begin:nn{0}{tag=Sect} + \@@_sec_end:n {0} + \@@_sec_begin:nn{0}{tag=Sect} } \tag_struct_begin:n{tag=chapter,title=#1} % \end{macrocode} % similar to part we remap to NonStruct for now ... % \begin{macrocode} - \tl_set:Nn\l__tag_para_main_tag_tl {NonStruct} - \tl_set:Nn\l__tag_para_tag_tl {Span} + \tl_set:Nn\l_@@_para_main_tag_tl {NonStruct} + \tl_set:Nn\l_@@_para_tag_tl {Span} } ,sec-stop-chapter .meta:n = { sec-stop-part} ,sec-start .code:n = % #1 is a name like "section" { - \bool_if:NT\l__tag_sec_Sect_bool + \bool_if:NT\l_@@_sec_Sect_bool { - \__tag_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0} - \__tag_sec_begin:nn {\cs_if_exist_use:c{toclevel@#1}+0}{tag=Sect} + \@@_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0} + \@@_sec_begin:nn {\cs_if_exist_use:c{toclevel@#1}+0}{tag=Sect} } - \tl_set:Nn\l__tag_para_tag_tl{#1} + \tl_set:Nn\l_@@_para_tag_tl{#1} } ,sec-start .value_required:n = true - ,sec-split-para .code:n = {\__tag_tool_para_split:} - ,restore-para .code:n = {\__tag_setup_restore_para_default:} + ,sec-split-para .code:n = {\@@_tool_para_split:} + ,restore-para .code:n = {\@@_setup_restore_para_default:} ,sec-stop .code:n = { - \par\__tag_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0} + \par\@@_sec_end:n {\cs_if_exist_use:c{toclevel@#1}+0} } ,sec-stop .value_required:n = true - ,sec-add-grouping .bool_set:N = \l__tag_sec_Sect_bool + ,sec-add-grouping .bool_set:N = \l_@@_sec_Sect_bool } % \end{macrocode} % @@ -433,6 +447,7 @@ % The tagging inside relies on the para tagging. % We do not yet use keyval in the optional argument, as this requires latex-dev % and the naming of the keys and their key family is unclear. +% \changes{v0.84f}{2024/10/04}{Added braces around optional arg (tagging/725)} % \begin{macrocode} \AddToHook{class/after} { @@ -476,7 +491,7 @@ \IfBooleanTF {#1} { \@spart {#3} } - { \@part [#2]{#3} } + { \@part [{#2}]{#3} } % \end{macrocode} % and now the closing command for the tagging of the title. % \begin{macrocode} @@ -528,7 +543,7 @@ \IfBooleanTF {#1} { \@schapter {#3} } - { \@chapter [#2]{#3} } + { \@chapter [{#2}]{#3} } % \end{macrocode} % and now the closing command for the tagging of the title. % \begin{macrocode} @@ -583,7 +598,7 @@ \IfBooleanTF {#1} { \@spart {#3} } - { \@part [#2]{#3} } + { \@part [{#2}]{#3} } % \end{macrocode} % and now the closing command for the tagging of the title. % \begin{macrocode} @@ -669,8 +684,8 @@ % \begin{macrocode} \cs_new_protected:Npn \@kernel@tag@hangfrom #1 { - \tagstructbegin{tag=\l__tag_para_tag_tl} - \cs_if_exist_use:N \__tag_gincr_para_begin_int: + \tagstructbegin{tag=\l_@@_para_tag_tl} + \cs_if_exist_use:N \@@_gincr_para_begin_int: \tagstructbegin{tag=Lbl} \setbox\@tempboxa \hbox @@ -680,7 +695,7 @@ % \begin{macrocode} \bool_lazy_and:nnT {\tag_if_active_p:} - {\g__tag_mode_lua_bool} + {\g_@@_mode_lua_bool} {\tagmcbegin{tag=Lbl}} {#1} } @@ -689,12 +704,12 @@ % the paratagging. We do not disable paratagging completely, to % avoid that the numbering goes wrong. % \begin{macrocode} - \tag_stop:n{hangfrom} + \tag_suspend:n{hangfrom} \hangindent \wd\@tempboxa\noindent % \end{macrocode} % Restart tagging and insert the box. % \begin{macrocode} - \tag_start:n{hangfrom} + \tag_resume:n{hangfrom} \tagmcbegin{}\box\@tempboxa\tagmcend\tagstructend\tagmcbegin{}} % \end{macrocode} % This command is used to tag the numbers of runin. We do not try @@ -715,6 +730,7 @@ % \cs{@sect} is only changed to replace the hyperref patches % and to use the new \cs{@kernel@tag@hangfrom} and \cs{@kernel@tag@svsec} % \begin{macrocode} +%<@@=> \def\@sect#1#2#3#4#5#6[#7]#8{% \ifnum #2>\c@secnumdepth \def\@svsec{\@hyp@section@target@nnn{[section]}{}{#3}} @@ -727,7 +743,7 @@ \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup - \tagtool{para-flattened=true} % or \bool_set_true\l__tag_para_flattened_bool + \tagtool{para-flattened=true} % or \bool_set_true\l_@@_para_flattened_bool #6{% \ifnum #2>\c@secnumdepth \@hangfrom {\hskip #3\relax\@svsec}% diff --git a/macros/latex/required/latex-lab/latex-lab-sec.pdf b/macros/latex/required/latex-lab/latex-lab-sec.pdf Binary files differindex 6471291a8a..22a509f3ec 100644 --- a/macros/latex/required/latex-lab/latex-lab-sec.pdf +++ b/macros/latex/required/latex-lab/latex-lab-sec.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-table.dtx b/macros/latex/required/latex-lab/latex-lab-table.dtx index 38596478ae..c65667e8ed 100644 --- a/macros/latex/required/latex-lab/latex-lab-table.dtx +++ b/macros/latex/required/latex-lab/latex-lab-table.dtx @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabtbldate{2024-05-25} -\def\ltlabtblversion{0.85i} +\def\ltlabtbldate{2024-09-18} +\def\ltlabtblversion{0.85n} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -100,6 +100,7 @@ % support for the tagging of tables. A list of the known limitations % is shown below. % +% \subsection{Loading} % The module is not loaded automatically (i.e., not yet integrated % into any \texttt{phase-XX}) and by itself it doesn't activate % tagging. For experimenting with table tagging it is therefore best @@ -113,7 +114,26 @@ % It will then automatically tag all table environments it already supports with % the exception of tables in the header and footer of the page (where tagging is disabled). % Such tables can be nested. +% +% Inside cells the automatic tagging of paragraphs is disabled with the exception of +% p/m/b-type cells. % +% Rows do not need to contain a full number of \&, missing cells are automatically +% added with an empty TD-structure. +% +% You should not insert meaningful text with \verb+!{...}+ or \verb+@{...}+ or \cs{noalign} +% between the rows or columns of the table. +% With pdflatex such text will be unmarked, with lualatex it will be marked as artifact. +% Either case means that it will be currently ignored in the +% structure.\footnote{While it is theoretically possible +% to collect such text and move it into a structure it would require manual markup +% from the author to clarify where this text belongs too.} +% +% As mentioned below the \pkg{colortbl} doesn't work fully with the tagging, +% but when it does, colors inside the table are currently ignored. If such a color +% has a semantic meaning (like \enquote{important value}) this meaning will be lost. +% +% \subsection{Untagged and presentation tables} % If a table should not be tagged as table, for example because it is merely used % as a layout to ensure that the content is properly aligned % or because it is a not yet (fully) supported table structure, @@ -130,41 +150,43 @@ % The key should currently only be used in a group as there is no key (yet) to reset to the default % tag names. % -% Inside cells the automatic tagging of paragraphs is disabled with the exception of -% p/m/b-type cells. -% -% Rows do not need to contain a full number of \&, missing cells are automatically -% added with an empty TD-structure. -% +% \subsection{Header rows and columns} % There is some basic support\footnote{This is not meant to be the % final interface, though.} for headers. With\footnote{The old key name \texttt{table-header-rows} still % works but is deprecated.} % \begin{quote} % \verb|\tagpdfsetup{table/header-rows={|\meta{list of row numbers}\verb|}| +% \verb|\tagpdfsetup{table/header-columns={|\meta{list of column numbers}\verb|}| % \end{quote} % you can -% declare which (absolute) row numbers should be tagged as header rows. -% It applies to all tables until it is changed to a different list of row numbers or undone by setting -% the key to \meta{empty}. -% A row number can be -% negative, then the counting starts from the end of the table. There is no support -% for header columns yet. In a \env{longtable} the code will currently use the \cs{endhead} or +% declare which (absolute) row and column numbers should be tagged as header rows and header columns. +% It applies to all tables until it is changed to a different list of row or +% columns numbers or undone by setting +% the keys to \meta{empty}. +% A row or column number can be +% negative, then the counting starts from the end of the table. +% In a \env{longtable} the code will currently use the \cs{endhead} or % \cs{endfirsthead} rows as header if one of these commands has been % used and in that case the code % ignores a \texttt{table/header-rows} setting. % -% You should not insert meaningful text with \verb+!{...}+ or \verb+@{...}+ or \cs{noalign} -% between the rows or columns of the table. -% With pdflatex such text will be unmarked, with lualatex it will be marked as artifact. -% Either case means that it will be currently ignored in the -% structure.\footnote{While it is theoretically possible -% to collect such text and move it into a structure it would require manual markup -% from the author to clarify where this text belongs too.} +% \subsection{Spanning of cells} % -% As mentioned below the \pkg{colortbl} doesn't yet work properly with the tagging, -% but once it does, then colors inside the table will probably be -% simply ignored (at least initially). If such a color -% has a semantic meaning (like \enquote{important value}) this meaning will be lost. +% \cs{multicolumn} is supported out of the box and will create a structure with a +% suitable \texttt{ColSpan} attribute\footnote{The code uses actually an attribute \emph{class}. +% The validator PAC doesn't handle this correctly currently and complains about a missing attribute.} +% +% For cells spanning rows some preliminary support exists\footnote{The interface is bound to change!}: +% If you add +% \begin{quote} +% \verb|\tagpdfsetup{table/multirow={|\meta{number of rows}\verb|}| +% \end{quote} +% to a cell the code will add the suitable \texttt{RowSpan} attribute and suppress the tagging of affected +% cells in the following rows. This will also work if the current cell is a \cs{multicolumn}, then +% the cell will span both rows and columns. It is the duty of the author to +% ensure that all cells below and covered by a \texttt{RowSpan} are empty! +% The code neither checks that nor does +% it tries to suppress content. % % Feedback and problems with the code can be reported at % \url{https://github.com/latex3/tagging-project} either in form of @@ -183,19 +205,19 @@ % \item the \env{array} environment is assumed to be part of math and tagging as a table is disabled for % it. % -% \item Row spans are not yet supported (and the \pkg{multirow} package is untested). +% \item Row spans can only be added manually (the \pkg{multirow} package is untested). % -% \item The \pkg{colortbl} package breaks tagging if there are nested tables. It also breaks -% the filling up of incomplete rows. +% \item The \pkg{colortbl} package breaks tagging if there are nested tables. % % \item The \pkg{tabularray} package use a completed different % method to create tables and will not be supported by this code. % % \item The \pkg{nicematrix} package is currently incompatible. % -% \item Most other packages related to tables in \LaTeX{} are not yet tested, +% \item Most other packages related to tables in \LaTeX{} are not fully tested, % that includes packages that change rules like \pkg{booktabs}, \pkg{hhline}, -% \pkg{arydshln}, \pkg{hvdashln}. +% \pkg{arydshln}, \pkg{hvdashln}. Some problems have been resolved, either +% in the packages or through a firstaid which can be loaded the \verb+testphase=firstaid+. % % \item \env{longtable} currently only works with lualatex. % With other engines it breaks as its output @@ -208,9 +230,9 @@ % the tagging of the table must be deactivated with \verb|\tagpdfsetup{table/tagging=false}| % or \verb|\tagpdfsetup{table/tagging=presentation}|. % -% \item Only simple header rows are currently supported. Columns and complex headers with +% \item Only simple header rows and columns are currently supported. Complex headers with % subheaders will be handled later as that needs some syntax changes. Tables -% with more than one header row are probably not pdf/UA as the headers array in +% with more than one header row or column are probably not pdf/UA as the headers array in % the cells is missing. % % \item A \pkg{longtable} \cs{caption} is currently simply formatted as a multicolumn and @@ -259,9 +281,6 @@ % % \item Longtable captions should be properly supported. % -% \item Handle p-cells better. para-tagging should probably be enabled, -% but Part can't be a child of TD, so this should probably be changed to Div here. -% Also there is a stray MC somewhere. % % \item More packages must be tested. % \end{itemize} @@ -292,8 +311,8 @@ % ,\l_@@_cellattribute_tl % ,\l_@@_rowattribute_tl % ,\l_@@_tmpa_clist -% ,\l_@@_tmpa_seq % ,\l_@@_tmpa_tl +% ,\l_@@_tmpa_str % } % This is for the celltag, e.g. TD or TH: % \begin{macrocode} @@ -319,10 +338,16 @@ \tl_new:N \l_@@_rowattribute_tl \tl_set:Nn \l_@@_rowattribute_tl {} % \end{macrocode} +% Variable to store cell info like which cell must be skipped when tagging multirows. +% \begin{macrocode} +\prop_new:N\g_@@_untagged_cells_prop +\prop_new:N\l_@@_saved_untagged_cells_prop +% \end{macrocode} % Temp variables % \begin{macrocode} \clist_new:N \l_@@_tmpa_clist \tl_new:N \l_@@_tmpa_tl +\str_new:N \l_@@_tmpa_str % \end{macrocode} % \end{macro} % @@ -330,7 +355,41 @@ % % % This are the standard plugs for tagging of cells and rows. -% +% +% The following two sockets are defined in lttagging, but we check +% for their existence until the release 11/2024. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/tbl/init/celldata_plug_str } + { + \NewSocket{tagsupport/tbl/init/celldata}{0} + \NewSocket{tagsupport/tbl/restore/celldata}{0} + } +% \end{macrocode} +% \begin{plugdecl}{default} +% This socket is used inside \cs{tbl_init_cell_data_for_table} for the +% case that this a nested table in a cell. +% \begin{macrocode} +\NewSocketPlug{tagsupport/tbl/init/celldata}{default} + { + \prop_set_eq:NN\l_@@_saved_untagged_cells_prop \g_@@_untagged_cells_prop + \prop_gclear:N \g_@@_untagged_cells_prop + } +\AssignSocketPlug{tagsupport/tbl/init/celldata}{default} +% \end{macrocode} +% \end{plugdecl} + +% \begin{plugdecl}{default} +% This socket is used inside \cs{tbl_restore_outer_cell_data:} and restores +% values when a nested table is ended. +% \begin{macrocode} +\NewSocketPlug{tagsupport/tbl/restore/celldata}{default} + { + \prop_gset_eq:NN\g_@@_untagged_cells_prop \l_@@_saved_untagged_cells_prop + } +\AssignSocketPlug{tagsupport/tbl/restore/celldata}{default} +% \end{macrocode} +% \end{plugdecl} +% % \begin{plugdecl}{TD} % \begin{macrocode} \NewSocketPlug{tagsupport/tbl/cell/begin}{TD} @@ -340,21 +399,44 @@ % always even if the noop plug is in force this needs a different solution. % \begin{macrocode} \@@_show_curr_cell_data: - \tag_struct_begin:n +% \end{macrocode} +% We test if the cell should be tagged at all. +% \begin{macrocode} + \@@_if_tag_cell:nnT {\g_@@_row_int } { \g_@@_col_int } { - tag =\l_@@_celltag_tl, - attribute-class =\l_@@_cellattribute_tl - } - \seq_gput_right:Ne \g_@@_struct_cur_seq { \tag_get:n {struct_num} } +% \end{macrocode} +% this sets row headers +% \begin{macrocode} + \clist_if_in:NVT \l_@@_header_columns_clist\g_@@_col_int + { + \tl_set:Nn \l_@@_celltag_tl {TH} + \tl_set:Ne \l_@@_cellattribute_tl {\l_@@_cellattribute_tl,TH-row} + } +% \end{macrocode} +% Here we handle negative value for row headers: +% \begin{macrocode} + \tl_set:Ne \l_@@_tmpa_tl {\int_eval:n { \g_@@_col_int - 1 - \g_@@_table_cols_tl }} + \clist_if_in:NoT \l_@@_header_columns_clist { \l_@@_tmpa_tl } + { + \tl_set:Nn \l_@@_celltag_tl {TH} + \tl_set:Ne \l_@@_cellattribute_tl {\l_@@_cellattribute_tl,TH-row} + } + \tag_struct_begin:n + { + tag =\l_@@_celltag_tl, + attribute-class ={\l_@@_cellattribute_tl} + } + \seq_gput_right:Ne \g_@@_struct_cur_seq { \tag_get:n {struct_num} } % \end{macrocode} % we store the cells of multicolumns as negative number. This allow to skip them % or to use them as needed. % \begin{macrocode} - \int_step_inline:nn { \g_@@_span_tl - 1 } - { - \seq_gput_right:Ne \g_@@_struct_cur_seq { -\tag_get:n {struct_num} } - } - \tag_mc_begin:n{} + \int_step_inline:nn { \g_@@_span_tl - 1 } + { + \seq_gput_right:Ne \g_@@_struct_cur_seq { -\tag_get:n {struct_num} } + } + \tag_mc_begin:n{} + } } % \end{macrocode} % \end{plugdecl} @@ -363,8 +445,11 @@ % \begin{macrocode} \NewSocketPlug{tagsupport/tbl/cell/end}{TD} { - \tag_mc_end: - \tag_struct_end: + \@@_if_tag_cell:nnT {\g__tbl_row_int } { \g__tbl_col_int } + { + \tag_mc_end: + \tag_struct_end: + } } % \end{macrocode} % \end{plugdecl} @@ -376,18 +461,26 @@ \NewSocketPlug{tagsupport/tbl/pcell/begin}{TDpbox} { \@@_show_curr_cell_data: - \tag_struct_begin:n + \@@_if_tag_cell:nnT {\g__tbl_row_int } { \g__tbl_col_int } { - tag =\l__tbl_pcelltag_tl, - attribute-class =\l__tbl_cellattribute_tl - } - \seq_gput_right:Ne \g__tbl_struct_cur_seq { \tag_get:n {struct_num} } - \int_step_inline:nn { \g__tbl_span_tl - 1 } - { - \seq_gput_right:Ne \g__tbl_struct_cur_seq { -\tag_get:n {struct_num} } - } - \tagpdfparaOn - \tl_set:Nn \l__tag_para_main_tag_tl {Div} + \clist_if_in:NVT \l_@@_header_columns_clist\g_@@_col_int + { + \tl_set:Nn \l_@@_celltag_tl {TH} + \tl_set:Ne \l_@@_cellattribute_tl {\l_@@_cellattribute_tl,TH-row} + } + \tag_struct_begin:n + { + tag =\l_@@_pcelltag_tl, + attribute-class ={\l_@@_cellattribute_tl} + } + \seq_gput_right:Ne \g_@@_struct_cur_seq { \tag_get:n {struct_num} } + \int_step_inline:nn { \g_@@_span_tl - 1 } + { + \seq_gput_right:Ne \g_@@_struct_cur_seq { -\tag_get:n {struct_num} } + } + \tagpdfparaOn + \tl_set:Nn \l__tag_para_main_tag_tl {Div} + } } % \end{macrocode} % \end{plugdecl} @@ -396,7 +489,12 @@ % \begin{macrocode} \NewSocketPlug{tagsupport/tbl/pcell/end}{TDpbox} { - \tag_struct_end: + \@@_if_tag_cell:nnT {\g_@@_row_int } { \g_@@_col_int } + { + \tag_struct_end: + \legacy_if:nT {@endpe}{\par} + \mode_if_vertical:T{ \tagpdfparaOff } + } } % \end{macrocode} % \end{plugdecl} @@ -432,7 +530,7 @@ { \@@_trace:n {==>~ - stucture~stored~for~row~\int_use:N\g_@@_row_int :~ + structure~stored~for~row~\int_use:N\g_@@_row_int :~ \seq_use:Nn \g_@@_struct_cur_seq {,} } } @@ -447,21 +545,49 @@ % normal tables which can also be used inline and nested and % \enquote{vmode} tables like longtable. % +% \begin{macro}{\l__tag_block_flattened_level_int} +% Count the levels of nested blockenvs starting with the first that +% is \enquote{flattened}. The counter is defined in lttagging.dtx, +% but until the next release 11/24 we set it up here too so that we can +% use it in the following socket +% \begin{macrocode} +\int_if_exist:NF \l__tag_block_flattened_level_int + { + \int_new:N \l__tag_block_flattened_level_int + } +% \end{macrocode} +% \end{macro} +% +% \begin{plugdecl}{Table} +% Inside a TD or TR Part is not allowed as child. For structures that restore +% paragraph settings we therefore need a special plug that adjust the settings. +% Currently we set the para main tag to Div. This leads to double Div-structures +% but flattening the paragraph doesn't work, it errors if there is a list inside. +% \begin{macrocode} +\NewSocketPlug{tagsupport/para/restore}{Table} + { + \tl_set:Nn \l__tag_para_main_tag_tl {Div} + \tl_set_eq:NN \l__tag_para_tag_tl\l__tag_para_tag_default_tl + \bool_set_true:N \l__tag_para_bool + \bool_set_false:N \l__tag_para_flattened_bool + \int_zero:N \l__tag_block_flattened_level_int + } +% \end{macrocode} +% \end{plugdecl} +% % \begin{plugdecl}{Table} % Inside a table we currently only disable paratagging. We assume -% that these sockets are in an environment group, so there is no +% that these sockets are called in a group, so there is no % need to reenable paratagging. % \begin{macrocode} \NewSocketPlug{tagsupport/tbl/init}{Table} { - \tag_if_active:T - { - \bool_set_false:N \l__tag_para_bool + \bool_set_false:N \l__tag_para_bool + \AssignSocketPlug{tagsupport/para/restore}{Table} % \end{macrocode} % We also initialize the structure data variables a this point. % \begin{macrocode} - \@@_init_struct_data: - } + \@@_init_struct_data: } % \end{macrocode} % \end{plugdecl} @@ -573,7 +699,7 @@ \prop_if_exist:cT { g__tag_struct_ \l_@@_tmpa_tl _prop } { - \exp_args:No \__tag_struct_prop_gput:nnn {\l_@@_tmpa_tl} {S}{/Artifact} + \__tag_struct_prop_gput:onn { \l_@@_tmpa_tl } {S}{/Artifact} } } } @@ -664,7 +790,7 @@ \prop_if_exist:cT { g__tag_struct_ \l_@@_tmpa_tl _prop } { - \exp_args:No\__tag_struct_prop_gput:nnn {\l_@@_tmpa_tl} {S}{/Artifact} + \__tag_struct_prop_gput:onn {\l_@@_tmpa_tl} {S}{/Artifact} } } } @@ -711,7 +837,7 @@ \tag_mc_end_push: % \end{macrocode} % Close the P-chunk. This assumes that para-tagging is active. -% For nested tables that is not necessarly true, so we test for it. +% For nested tables that is not necessarily true, so we test for it. % \begin{macrocode} \bool_lazy_and:nnT { \bool_if_exist_p:N \l__tag_para_bool } { \l__tag_para_bool } @@ -729,7 +855,7 @@ \tag_struct_end: % \end{macrocode} % reopen the P-chunk. This assumes that para-tagging is active. -% For nested tables that is not necessarly true, so we test for it. +% For nested tables that is not necessarily true, so we test for it. % \begin{macrocode} \bool_lazy_and:nnT { \bool_if_exist_p:N \l__tag_para_bool } { \l__tag_para_bool } @@ -778,15 +904,32 @@ {/O /Table /ColSpan~\int_eval:n{#1}} } \tl_set:Ne \l_@@_cellattribute_tl - {colspan-\int_eval:n{#1}} + {\l_@@_cellattribute_tl,colspan-\int_eval:n{#1}} } } % \end{macrocode} -% TODO: move to tagpdf +% \end{plugdecl} +% +% +% +% +% \begin{plugdecl}{code} +% The sockets will be in lttagging.dtx, but that may only happen in +% the next main release, so for now we test if they are in the +% format and if not define them now. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/tbl/leaders/end_plug_str } + { + \NewSocket{tagsupport/tbl/leaders/begin}{0} + \NewSocket{tagsupport/tbl/leaders/end}{0} + } +% \end{macrocode} +% % \begin{macrocode} -\tag_if_active:T - { \cs_generate_variant:Nn \__tag_attr_new_entry:nn {ee} } - +\NewSocketPlug{tagsupport/tbl/leaders/begin}{code} + { \tag_mc_begin:n{artifact} } +\NewSocketPlug{tagsupport/tbl/leaders/end}{code} + { \tag_mc_end: } % \end{macrocode} % \end{plugdecl} % @@ -810,8 +953,7 @@ % \subsection{Interfaces to tagging} % % \subsubsection{Tagging helper commands} -% -% + % \subsubsection{Disabling/enabling} % % For now we have only the option true/false but this will probably be extended @@ -839,6 +981,8 @@ \AssignSocketPlug{tagsupport/tbl/vmode/begin}{noop} \AssignSocketPlug{tagsupport/tbl/vmode/end}{noop} \AssignSocketPlug{tagsupport/tbl/colspan}{noop} + \AssignSocketPlug{tagsupport/tbl/leaders/begin}{noop} + \AssignSocketPlug{tagsupport/tbl/leaders/end}{noop} } % \end{macrocode} % \end{macro} @@ -866,6 +1010,8 @@ \AssignSocketPlug{tagsupport/tbl/vmode/begin}{Table} \AssignSocketPlug{tagsupport/tbl/vmode/end}{Table} \AssignSocketPlug{tagsupport/tbl/colspan}{code} + \AssignSocketPlug{tagsupport/tbl/leaders/begin}{code} + \AssignSocketPlug{tagsupport/tbl/leaders/end}{code} } % \end{macrocode} % \end{macro} @@ -886,14 +1032,15 @@ \tl_set:Nn\l_@@_pcelltag_tl {NonStruct} \tl_set:Nn\l_@@_celltag_tl {text} \tl_set:Nn\l_@@_tabletag_tl {Div} - \clist_clear:N \l_@@_header_rows_clist + \clist_clear:N \l_@@_header_rows_clist + \clist_clear:N \l_@@_header_columns_clist }, table/tagging .default:n = true, table/tagging .initial:n = true } % \end{macrocode} % This are the old key names kept for now for -% compability. They will got at some time. +% compatibility. They will got at some time. % \begin{macrocode} \keys_define:nn { __tag / setup } { @@ -955,11 +1102,12 @@ % \end{macrocode} % -% \begin{variable}{\l_@@_header_rows_clist} -% This holds the numbers of the header rows. Negative numbers are +% \begin{variable}{\l_@@_header_rows_clist,\l_@@_header_columns_clist} +% This holds the numbers of the header rows and columns. Negative numbers are % possible and count from the last column backwards. % \begin{macrocode} \clist_new:N \l_@@_header_rows_clist +\clist_new:N \l_@@_header_columns_clist % \end{macrocode} % \end{variable} % @@ -982,14 +1130,26 @@ { \__tag_struct_prop_gput:nnn{ ####1 }{S}{/TH} % \end{macrocode} -% This need refinement once row headers (and perhaps other attributes) -% are used too, but for now it should be ok. +% This sets the scope class. If the header has already a row attribute +% we replace by TH-both. % \begin{macrocode} \prop_get:cnNTF { g__tag_struct_####1_prop } { C } \l_@@_tmpa_tl - {\__tag_struct_prop_gput:nne{ ####1 }{C}{[/TH-col~\l_@@_tmpa_tl]} } + { + \str_set:Ne \l_@@_tmpa_str {\l_@@_tmpa_tl} + \str_remove_once:Nn \l_@@_tmpa_str {[} + \str_remove_once:Nn \l_@@_tmpa_str {]} + \str_if_in:NnTF\l_@@_tmpa_str{/TH-row} + { + \str_replace_once:Nnn \l_@@_tmpa_str {/TH-row}{/TH-both} + \__tag_struct_prop_gput:nne{ ####1 }{C}{[\l_@@_tmpa_str]} + } + { + \__tag_struct_prop_gput:nne{ ####1 }{C}{[/TH-col~\l_@@_tmpa_str]} + } + } {\__tag_struct_prop_gput:nnn{ ####1 }{C}{/TH-col}} } } @@ -1004,6 +1164,7 @@ \keys_define:nn { __tag / setup } { table/header-rows .clist_set:N = \l_@@_header_rows_clist, + table/header-columns .clist_set:N = \l_@@_header_columns_clist, % \end{macrocode} % obsolete older name: % \begin{macrocode} @@ -1011,8 +1172,114 @@ } % \end{macrocode} % +% \subsection{Multirow support} +% +% \begin{macro}{\@@_multirow:n} +% This command makes the current cell into a multirow cell: +% it creates, if needed, an RowSpan-attribute, adds it to the attributes +% of the cell structure, and marks all following cells spanned by the multirow +% as cells that should not be tagged. The argument is the number of spanned row +% (including the current row). +% \begin{macrocode} +\cs_if_exist:NT \__tag_struct_prop_gput:nnn + { + \cs_generate_variant:Nn \__tag_struct_prop_gput:nnn {one} + } +\cs_new_protected:Npn \@@_multirow:n #1 + { +% \end{macrocode} +% Create an attribute if needed: +% \begin{macrocode} + \prop_get:NeNF \g__tag_attr_entries_prop + {rowspan-\int_eval:n{#1}} + \l_@@_tmpa_tl + { + \__tag_attr_new_entry:ee + {rowspan-\int_eval:n{#1}} + {/O /Table /RowSpan~\int_eval:n{#1}} + } +% \end{macrocode} +% ensure that the attribute is marked as used: +% \begin{macrocode} + \seq_gput_left:Ne\g__tag_attr_class_used_seq + {\pdf_name_from_unicode_e:n{rowspan-\int_eval:n{#1}}} +% \end{macrocode} +% Get the structure number of the current cell +% \begin{macrocode} + \seq_get_right:NN\g_@@_struct_cur_seq \l_@@_tmpb_tl +% \end{macrocode} +% If we are in a multicolumn the number can be negative and +% this must be changed +% \begin{macrocode} + \tl_set:Ne \l_@@_tmpb_tl { \int_abs:n{\l_@@_tmpb_tl} } +% \end{macrocode} +% no we must update an existing attribute. +% TODO: simplify this ... (see also colspan handling). +% \begin{macrocode} + \prop_get:cnNTF + { g__tag_struct_\l_@@_tmpb_tl _prop } + { C } + \l_@@_tmpa_tl + { + \tl_remove_once:Nn \l_@@_tmpa_tl {[} + \tl_remove_once:Nn \l_@@_tmpa_tl {]} + \__tag_struct_prop_gput:one{ \l_@@_tmpb_tl } + {C} + {[/rowspan-\int_eval:n{#1}~\l_@@_tmpa_tl]} + } + { + \__tag_struct_prop_gput:one{ \l_@@_tmpb_tl } + {C} + {[/rowspan-\int_eval:n{#1}]} + } +% \end{macrocode} +% Now mark the spanned cells that should be ignored. +% \begin{macrocode} + \@@_gset_untagged_row_cells:nn {#1-1}{\g_@@_span_tl} + } +% \end{macrocode} +% \end{macro} % +% \begin{macrocode} +\keys_define:nn{ __tag / setup } + { table/multirow .code:n = {\@@_multirow:n {#1} } + ,table/multirow .default:n = 1 + } +% \end{macrocode} % +% \begin{macro}{\@@_gset_untagged_row_cells:nn} +% This command stores the row and column numbers of the cells in the following row(s) +% that should not be tagged as they are a part of a rowspan. +% \begin{macrocode} +\cs_new_protected:Npn \@@_gset_untagged_row_cells:nn #1 #2 % #1 number of rows, #2 number of columns + { + \int_step_inline:nn {#1} + { + \int_step_inline:nn {#2} + { + \prop_gput:Nee \g_@@_untagged_cells_prop + { \int_eval:n {\g_@@_row_int + ##1},\int_eval:n{\g_@@_col_int + ####1 -1 } }{} + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_if_tag_cell:nn} +% We must be able to detect if a cell should be tagged. For this +% we define a conditional --- if more options are needed it can be extended. +% \begin{macrocode} +\prg_new_protected_conditional:Npnn\@@_if_tag_cell:nn #1 #2 %#1 row, #2 col + { T,TF } + { + \prop_get:NeNTF \g_@@_untagged_cells_prop + {\int_eval:n{#1},\int_eval:n{#2}}\l__tbl_tmpa_tl + { \prg_return_false:} + { \prg_return_true: } + } +% \end{macrocode} +% \end{macro} +% % \subsection{Misc stuff} % % \begin{macro}{\@@_show_curr_cell_data:} @@ -1037,13 +1304,6 @@ % cell of a row, but still inside that cell, so we use two % commands. The one adding is used in the row/end socket. % \begin{macrocode} -\NewSocket{tbl/celldata/missingcount}{1} -\NewSocketPlug{tbl/celldata/missingcount}{code}{\tbl_count_missing_cells:n{#1}} -\AssignSocketPlug{tbl/celldata/missingcount}{code} - -% \end{macrocode} -% -% \begin{macrocode} \cs_new:Npn \@@_add_missing_cells: { % \end{macrocode} @@ -1058,6 +1318,7 @@ additional~cell(s)~into~previous~row:} \int_step_inline:nn { \g_@@_missing_cells_int } { + \int_gincr:N\g_@@_col_int \UseTaggingSocket{tbl/cell/begin} \UseTaggingSocket{tbl/cell/end} } @@ -1164,9 +1425,9 @@ } \hbox to\z@{\hss\parbox[t]\LTcapwidth{% \reset@font - \tag_stop:n{caption} + \tag_suspend:n{caption} \sbox\@tempboxa{#1{#2:~}#3}% - \tag_start:n{caption} + \tag_resume:n{caption} \ifdim\wd\@tempboxa>\hsize #1{#2:~}#3% \else diff --git a/macros/latex/required/latex-lab/latex-lab-table.pdf b/macros/latex/required/latex-lab/latex-lab-table.pdf Binary files differindex 11416f56ac..8476deafbd 100644 --- a/macros/latex/required/latex-lab/latex-lab-table.pdf +++ b/macros/latex/required/latex-lab/latex-lab-table.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-testphase.dtx b/macros/latex/required/latex-lab/latex-lab-testphase.dtx index f0a6fe65d0..1134654cd6 100644 --- a/macros/latex/required/latex-lab/latex-lab-testphase.dtx +++ b/macros/latex/required/latex-lab/latex-lab-testphase.dtx @@ -47,7 +47,7 @@ % % Currently the values |phase-I|, |phase-II|, |phase-III| and |new-or| (bundles |new-or-1| % and |new-or-2|) are provided. -% |tagpdf| is an undocumented alias for |phase-II| which is kept for compability. +% |tagpdf| is an undocumented alias for |phase-II| which is kept for compatibility. % The value |math| combines various math related files. % % \StopEventually{\setlength\IndexMin{200pt} \PrintIndex } diff --git a/macros/latex/required/latex-lab/latex-lab-testphase.pdf b/macros/latex/required/latex-lab/latex-lab-testphase.pdf Binary files differindex be1f2e220f..cd840f015f 100644 --- a/macros/latex/required/latex-lab/latex-lab-testphase.pdf +++ b/macros/latex/required/latex-lab/latex-lab-testphase.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-text.dtx b/macros/latex/required/latex-lab/latex-lab-text.dtx index fe9b6ababc..7ca99191dc 100644 --- a/macros/latex/required/latex-lab/latex-lab-text.dtx +++ b/macros/latex/required/latex-lab/latex-lab-text.dtx @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabtextdate{2023-07-20} -\def\ltlabtextversion{0.85a} +\def\ltlabtextdate{2024-09-18} +\def\ltlabtextversion{0.85b} %<*driver> \documentclass{l3doc} @@ -78,11 +78,11 @@ \tag_mc_end_push: \tag_struct_begin:n{tag=Span,actualtext=LaTeX} \tag_mc_begin:n{} - \tag_stop:n{LaTeX} + \tag_suspend:n{LaTeX} } \AddToHook{cmd/LaTeX/after} { - \tag_start:n{LaTeX} + \tag_resume:n{LaTeX} \tag_mc_end: \tag_struct_end: \tag_mc_begin_pop:n{} diff --git a/macros/latex/required/latex-lab/latex-lab-text.pdf b/macros/latex/required/latex-lab/latex-lab-text.pdf Binary files differindex 7a3ae27c86..fc808ba24f 100644 --- a/macros/latex/required/latex-lab/latex-lab-text.pdf +++ b/macros/latex/required/latex-lab/latex-lab-text.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-title.pdf b/macros/latex/required/latex-lab/latex-lab-title.pdf Binary files differindex 957ba9f7a3..c81bcd9eb8 100644 --- a/macros/latex/required/latex-lab/latex-lab-title.pdf +++ b/macros/latex/required/latex-lab/latex-lab-title.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.pdf b/macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.pdf Binary files differindex ab8469f7f6..329c0beb36 100644 --- a/macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.pdf +++ b/macros/latex/required/latex-lab/latex-lab-toc-hyperref-changes.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.dtx b/macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.dtx index bb88ffdcb0..2934a26168 100644 --- a/macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.dtx +++ b/macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.dtx @@ -17,8 +17,8 @@ % for those people who are interested or want to report an issue. % % dates for latex-lab-kernel-changes.sty (pulled from various sources, see ins) -\def\ltlabkerneldate{2024-02-12} -\def\ltlabkernelversion{0.85c} +\def\ltlabkerneldate{2024-07-11} +\def\ltlabkernelversion{0.85d} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -44,6 +44,11 @@ % % \providecommand\hook[1]{\texttt{#1}} % +% +% \ProvideDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl} +% \ProvideDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl} +% \ProvideDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl} +% % \begin{abstract} % \end{abstract} % @@ -68,67 +73,14 @@ % \end{macrocode} % % \subsection{Providing the counter representation \cs{theHxx} generally} -% [kernel?] -% -% The \cs{theHxx} representation allows to create a unique representation of a counter -% that is for example used to create destination names. It will also be needed -% to add |/Ref| keys to various tagging structures. It makes therefore sense -% to provide it by default as soon as a counter is created. The |\@addtoreset| change -% (taken also from hyperref) tries to ensure the counter stays unique if it is reset. -% -% At first we suppress the patches from hyperref: +% +% This has been moved to base. +% +% We still suppress the patches from hyperref: % \begin{macrocode} \def\hyper@nopatch@counter{} % \end{macrocode} -% -% \begin{macrocode} -\def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname - \setcounter{#1}\z@ - \global\expandafter\let\csname cl@#1\endcsname\@empty - \@addtoreset{#1}{@ckpt}% - \global\expandafter\let\csname p@#1\endcsname\@empty - \expandafter\gdef\csname theH#1\endcsname{\the\value{#1}}%new - \expandafter - \gdef\csname the#1\expandafter\endcsname\expandafter - {\expandafter\@arabic\csname c@#1\endcsname}} -\def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}% - \expandafter\gdef\csname theH#1\endcsname{\csname theH#2\endcsname.\the\value{#1}}% -} -% \end{macrocode} -% The following counters are defined in the kernel -% \begin{macrocode} -\gdef\theHenumi{\the\value{enumi}} -\gdef\theHenumii{\the\value{enumii}} -\gdef\theHenumiii{\the\value{enumiii}} -\gdef\theHenumiv{\the\value{enumiv}} -\gdef\theHequation{\the\value{equation}} -\gdef\theHfootnote{\the\value{footnote}} -\gdef\theHmpfootnote{\the\value{mpfootnote}} -% \end{macrocode} -% -% \subsection{Providing and updating \cs{@currentHref}} -% [kernel?] -% -% \cs{@currentHref} contains the current unique representation of a counter. -% It is useful also without hyperref as it allows to connect with a |/Ref| -% key a toc entry with the heading it refers too. So \cs{refstepcounter} -% is extended to update the command. This is done at the begin so that the -% hyperref code can still adapt it later (using the cmd/refstepcounter/after hook -% would be too late, and could also break with cleverref.) -% -% We also provide a kernel version that hyperref doesn't touch and so will never -% set a target. -% \begin{macrocode} -\def\@currentHref{} -\def\refstepcounter#1{\stepcounter{#1}% - \edef\@currentcounter{#1}% - \xdef\@currentHref {#1.\csname theH#1\endcsname}% - \protected@edef\@currentlabel - {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}% -} -\let\@kernel@refstepcounter\refstepcounter -% \end{macrocode} -% + % \subsection{Assigning the headings level numbers} % [kernel?] % @@ -160,17 +112,21 @@ % catch as much as possible, see also tagging issue \#20. This should work also % without hyperref. The property is defined in tagpdf-base, so the code would % work also without tagging but we add a test anyway, this is probably faster. +% TODO: remove % \begin{macrocode} \ExplSyntaxOn -\AddToHookWithArguments{cmd/MakeLinkTarget/after} - { - \tag_if_active:T - { - \tl_if_blank:VF \@currentHref - { - \prop_gput:Nee \g__tag_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} - } - } +\str_if_exist:cF { l__socket_tagsupport/recordtarget_str } + { + \AddToHookWithArguments{cmd/MakeLinkTarget/after} + { + \tag_if_active:T + { + \tl_if_blank:VF \@currentHref + { + \prop_gput:Nee \g__tag_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} + } + } + } } \ExplSyntaxOff % \end{macrocode} @@ -187,12 +143,24 @@ % \subsection{\cs{contentsline} extension} % [latex-lab] % The tagging code must add code at the begin and end of \cs{contentsline}. -% This code must have access to the arguments. We set it up as config point -% for now. +% This code must have access to the arguments. They are passed +% together in tagging socket. +% \begin{socketdecl}{tagsupport/toc/contentsline/before, +% tagsupport/toc/contentsline/after} +% Tagging sockets at the begin and end of contentsline. +% They receive \emph{all} contentsline arguments as one argument +% in four brace groups. The socket code should then use the parts it needs. +% The sockets will be in lttagging.dtx, but that may only happen in +% the next main release, so for now we test if they are in the +% format and if not define them now. % \begin{macrocode} -\def\@contentsline@cfgpoint@before#1#2#3#4{} -\def\@contentsline@cfgpoint@after#1#2#3#4{} +\str_if_exist:cF { l__socket_tagsupport/toc/contentsline/before_plug_str } + { + \NewSocket{tagsupport/toc/contentsline/before}{1} + \NewSocket{tagsupport/toc/contentsline/after}{1} + } % \end{macrocode} +% \end{socketdecl} % for the hooks we need that the \cs{l@XX} pass also the destination and % that \cs{l@XX} takes three arguments. % TODO: test that, if there are two many problems we should pass the @@ -200,10 +168,10 @@ % \begin{macrocode} \def\contentsline#1#2#3#4% {% - \@contentsline@cfgpoint@before{#1}{#2}{#3}{#4}% + \UseTaggingSocket{toc/contentsline/before}{{#1}{#2}{#3}{#4}}% \gdef\@contentsline@destination{#4}% \csname l@#1\endcsname{#2}{#3}% - \@contentsline@cfgpoint@after{#1}{#2}{#3}{#4}% + \UseTaggingSocket{toc/contentsline/after}{{#1}{#2}{#3}{#4}}% } % \end{macrocode} % @@ -225,17 +193,33 @@ % \subsection{\cs{@starttoc}} % [kernel?] % -% We add a configuration point before and after reading the file +% We add a tagging socket before and after reading the file % for the tagging. +% \begin{socketdecl}{tagsupport/toc/starttoc/before, +% tagsupport/toc/starttoc/after} +% Tagging sockets for the begin and end of start of \cs{@starttoc}. +% They take one argument, the extension. +% The sockets will be in lttagging.dtx, but that may only happen in +% the next main release, so for now we test if they are in the +% format and if not define them now. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/toc/starttoc/before_plug_str } + { + \NewSocket{tagsupport/toc/starttoc/before}{1} + \NewSocket{tagsupport/toc/starttoc/after}{1} + } +% \end{macrocode} +% \begin{macrocode} +% \end{macrocode} +% \end{socketdecl} +% % \begin{macrocode} -\def\@starttoc@cfgpoint@before#1{} -\def\@starttoc@cfgpoint@after#1{} \def\@starttoc#1{% \begingroup \makeatletter - \@starttoc@cfgpoint@before{#1}% + \UseTaggingSocket{toc/starttoc/before}{#1}% \@input{\jobname.#1}% - \@starttoc@cfgpoint@after{#1}% + \UseTaggingSocket{toc/starttoc/after}{#1}% \if@filesw \expandafter\newwrite\csname tf@#1\endcsname \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax @@ -269,15 +253,32 @@ \NewMirroredHookPairWithArguments{contentsline/page/before}{contentsline/page/after}{4}% % \end{macrocode} % -% The dot in the leader must be set as artifact. +% The dots in the leader must be set as artifact. % But luatex requires that the mc are set outside the leaders. -% So we need a config point. +% So we need sockets. % % \cs{@dottedtocline} needs hooks and formatting commands. -% We add a sixth argument so that it can grab the destination too. +% To make the leaders into artifact we use tagging sockets. +% The declaration should perhaps be moved into lttagging so that +% it can be used also by external packages even if the tagging code is not +% loaded? +% \begin{socketdecl}{tagsupport/toc/leaders/before, +% tagsupport/toc/leaders/after} +% Tagging sockets to make the dot leaders an artifact. +% They do not take an argument. +% The sockets will be in lttagging.dtx, but that may only happen in +% the next main release, so for now we test if they are in the +% format and if not define them now. +% \begin{macrocode} +\str_if_exist:cF { l__socket_tagsupport/toc/leaders/before_plug_str } + { + \NewSocket{tagsupport/toc/leaders/before}{0} + \NewSocket{tagsupport/toc/leaders/after}{0} + } +% \end{macrocode} +% \end{socketdecl} +% The destination is accessed through \cs{@contentsline@destination}. % \begin{macrocode} -\def\@dottedtocline@cfgpoint@leaders#1{#1} - \def\@dottedtocline#1#2#3#4#5{% \ifnum #1>\c@tocdepth \else \vskip \z@ \@plus.2\p@ @@ -291,10 +292,11 @@ \csname contentsline@text@#1@format\endcsname{#4}% \UseHookWithArguments{contentsline/text/after}{4}{#1}{#4}{#5}{\@contentsline@destination}% \nobreak - \@dottedtocline@cfgpoint@leaders{% + \UseTaggingSocket{toc/leaders/before}\SuspendTagging{toc/leaders}% \leaders\hbox{$\m@th \mkern \@dotsep mu\hbox{.}\mkern \@dotsep - mu$}\hfill}% + mu$}\hfill + \ResumeTagging{toc/leaders}\UseTaggingSocket{toc/leaders/after}% \nobreak \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor \UseHookWithArguments{contentsline/page/before}{4}{#1}{#4}{#5}{\@contentsline@destination}% diff --git a/macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.pdf b/macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.pdf Binary files differindex 386a193381..2c3d82f7fe 100644 --- a/macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.pdf +++ b/macros/latex/required/latex-lab/latex-lab-toc-kernel-changes.pdf diff --git a/macros/latex/required/latex-lab/latex-lab-toc.dtx b/macros/latex/required/latex-lab/latex-lab-toc.dtx index 7235eb9ed9..15dd403bdf 100644 --- a/macros/latex/required/latex-lab/latex-lab-toc.dtx +++ b/macros/latex/required/latex-lab/latex-lab-toc.dtx @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabtocdate{2023-10-16} -\def\ltlabtocversion{0.85b} +\def\ltlabtocdate{2024-09-26} +\def\ltlabtocversion{0.85e} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -42,7 +42,10 @@ % \newcommand{\docclass}{document class \marginpar{\raggedright document class % customizations}} % -% \providecommand\hook[1]{\texttt{#1}} +% +% \ProvideDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl} +% \ProvideDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl} +% \ProvideDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl} % % \begin{abstract} % \end{abstract} @@ -111,66 +114,32 @@ % Defined by tagpdf. % \end{variable} % -% \cs{refstepcounter} doesn't use \cs{MakeLinkTarget} (yet) so -% we have to patch it too to store the relation between -% destination names/\cs{@currentHref} and structure numbers +% We have to to store the relation between +% destination names/\cs{@currentHref} and structure numbers. +% With a current kernel this is done in \cs{refstepcounter} +% through the |recordtarget| socket. If that doesn't exist yet +% we patch: % -% The property is set up in tagpdf-test so that one -% doesn't has to check if the prop exists or not. +% TODO remove after release 2024/11 % \begin{macrocode} -\AddToHook{cmd/refstepcounter/after} - { - \tl_if_blank:VF \@currentHref - { - \prop_gput:Nee \g_@@_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} - } - } -\AddToHook{cmd/H@refstepcounter/after} - { - \tl_if_blank:VF \@currentHref - { - \prop_gput:Nee \g_@@_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} - } - } -% \end{macrocode} -% \begin{variable}{\g_@@_struct_ref_by_dest_prop} -% This variable contains structures whose Ref key should be updated -% at the end to point to structured related with this destination. -% As this is probably need in other places too, it is not only a toc-variable. -% Moved into tagpdf! -% \end{variable} -% -% \begin{macro}{\g_@@_struct_ref_by_dest:} -% This command is executed and update the Ref keys -% of the structures listed in |\g_@@_struct_ref_by_dest_prop|. -% It is currently only relevant for the |TOCI|. But other structures -% could need that later too. -% The command is executed in the |tagpdf/finish/before| hook. -% \begin{macrocode} -\msg_new:nnn { tag } {struct-dest-unknown} - { - Destination~#1~has~no~related~structure.\\ - /Ref~for~structure~#2~not~updated - } - -\cs_new_protected:Npn \g_@@_struct_ref_by_dest: +\str_if_exist:cF { l__socket_tagsupport/recordtarget_plug_str } { - \prop_map_inline:Nn\g_@@_struct_ref_by_dest_prop - { - \prop_get:NnNTF \g_@@_struct_dest_num_prop {##2} \l_@@_tmpa_tl - { - \@@_struct_gput_data_ref:ee - { ##1 } - { \tag_struct_object_ref:e{ \l_@@_tmpa_tl }} - } - { - \msg_warning:nnnn {tag}{struct-dest-unknown}{##2}{ ##1} - } - } - } -\hook_gput_code:nnn {tagpdf/finish/before}{tagpdf/struct/Ref}{\g_@@_struct_ref_by_dest:} + \AddToHook{cmd/refstepcounter/after} + { + \tl_if_blank:VF \@currentHref + { + \prop_gput:Nee \g_@@_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} + } + } + \AddToHook{cmd/H@refstepcounter/after} + { + \tl_if_blank:VF \@currentHref + { + \prop_gput:Nee \g_@@_struct_dest_num_prop {\@currentHref}{\tag_get:n{struct_num}} + } + } + } % \end{macrocode} -% \end{macro} % % \section{Toc code} % \begin{variable}{\g_@@_toc_level_int,\g_@@_toc_stack_seq} @@ -196,14 +165,17 @@ \tag_struct_begin:n{tag=TOC,title=#1} } % \end{macrocode} -% Now map it into the config point: +% \end{macro} +% Now define the tagging plug and assign it to the socket. +% \begin{plugdecl}{default} % \begin{macrocode} -\cs_set_protected:Npn\@starttoc@cfgpoint@before#1 - { - \@@_toc_starttoc_init:n{#1} - } +\NewSocketPlug{tagsupport/toc/starttoc/before}{default} + { + \@@_toc_starttoc_init:n{#1} + } +\AssignSocketPlug{tagsupport/toc/starttoc/before}{default} % \end{macrocode} -% \end{macro} +% \end{plugdecl} % \begin{macro}{\@@_toc_starttoc_finalize:} % \begin{macrocode} \cs_new_protected:Npn \@@_toc_starttoc_finalize: @@ -215,15 +187,18 @@ \seq_gclear:N \g_@@_toc_stack_seq } % \end{macrocode} -% Now map it into the config point: +% \end{macro} +% Now define the tagging plug and assign it to the socket. +% \begin{plugdecl}{default} % \begin{macrocode} -\cs_set_protected:Npn\@starttoc@cfgpoint@after#1 - { - \@@_toc_starttoc_finalize: - } +\NewSocketPlug{tagsupport/toc/starttoc/after}{default} + { + \@@_toc_starttoc_finalize: + } +\AssignSocketPlug{tagsupport/toc/starttoc/after}{default} % \end{macrocode} -% \end{macro} - +% \end{plugdecl} +% % \begin{macro}{\@@_toc_end:n} % This commands ends all TOC on the stack with a level higher than the argument % \begin{macrocode} @@ -249,10 +224,11 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_toc_contentsline_begin:nnn} +% \begin{macro}{\@@_toc_contentsline_begin:nnnn} % This is main command executed at the begin of a |\contentsline|. % \begin{macrocode} -\cs_new_protected:Npn \@@_toc_contentsline_begin:nnn #1 #2 #3 %#1 level, #2 content, #3 destination +\cs_new_protected:Npn \@@_toc_contentsline_begin:nnnn #1 #2 #3 #4 + %#1 level, #2 content, #3 page number (unused) #4 destination { \tag_if_active:T { @@ -298,40 +274,44 @@ % \begin{macrocode} \group_begin: \text_declare_expand_equivalent:Nn \numberline \use_none:n - \exp_args:Ne \tag_struct_begin:n{tag=TOCI,title={\text_purify:n {#2}}} + \exp_args:Ne + \tag_struct_begin:n{tag=TOCI,title={\text_purify:n {#2}}} % \end{macrocode} -% The TOCI structure should get a /Ref, so we put a request with its destination -% name into the prop. +% The TOCI structure should get a /Ref, we use a destination +% to retrieve it. % \begin{NOTE}{UF} % This only works with hyperref currently. Without hyperref we % need to store fake names. % \end{NOTE} % \begin{macrocode} - \prop_gput:Nee \g_@@_struct_ref_by_dest_prop - { \tag_get:n {struct_num} }{#3} + \tag_struct_gput:nnn { \tag_get:n {struct_num} }{ref_dest}{#4} \seq_gpush:Ne \g_@@_toc_stack_seq {{TOCI}\use:c{toclevel@#1}} \group_end: } } } % \end{macrocode} -% Now map it into the config point: +% \end{macro} +% Now define the tagging plug and assign it to the socket. +% \begin{plugdecl}{default} % \begin{macrocode} -\cs_set_protected:Npn\@contentsline@cfgpoint@before#1#2#3#4 +\NewSocketPlug{tagsupport/toc/contentsline/before}{default} { - \@@_toc_contentsline_begin:nnn {#1}{#2}{#4} - } + \@@_toc_contentsline_begin:nnnn #1 + } +\AssignSocketPlug{tagsupport/toc/contentsline/before}{default} % \end{macrocode} -% \end{macro} +% \end{plugdecl} % -% \begin{macro}{\@@_toc_contentsline_end:n} +% \begin{macro}{\@@_toc_contentsline_end:nnnn} % This is the closing code of a |\contentsline|. % If the contentsline was actually printed, the code has to % close the TOCI structure and to update the stack. % \begin{macrocode} \msg_new:nnn {tag}{toc-no-TOCI}{Missing~TOCI~structure~on~toc~stack} -\cs_new_protected:Npn \@@_toc_contentsline_end:n #1 %#1 level name +\cs_new_protected:Npn \@@_toc_contentsline_end:nnnn #1 #2 #3 #4 +% #1 level, #2 content (unused), #3 page number (unused) #4 destination (unused) { \int_compare:nNnF { \use:c{toclevel@#1} } > {\use:c{c@tocdepth}} { @@ -348,14 +328,17 @@ } } % \end{macrocode} -% Now we map it to the config point +% \end{macro} +% Now define the tagging plug and assign it to the socket. +% \begin{plugdecl}{default} % \begin{macrocode} -\cs_set_protected:Npn \@contentsline@cfgpoint@after #1#2#3#4 - { - \@@_toc_contentsline_end:n {#1} - } +\NewSocketPlug{tagsupport/toc/contentsline/after}{default} + { + \@@_toc_contentsline_end:nnnn #1 + } +\AssignSocketPlug{tagsupport/toc/contentsline/after}{default} % \end{macrocode} -% \end{macro} +% \end{plugdecl} % % \subsection{Tagging of the content} % This need discussion. @@ -380,12 +363,16 @@ \tag_struct_end: \tag_mc_begin:n{tag=Reference}} % \end{macrocode} -% +% \begin{plugdecl}{artifact} % \begin{macrocode} -\def\@dottedtocline@cfgpoint@leaders#1{% - \tag_mc_begin:n{artifact}\tag_stop:n{leaders}\nobreak#1\nobreak\tag_start:n{leaders}\tag_mc_end:} +\NewSocketPlug{tagsupport/toc/leaders/before}{artifact} + {\tag_mc_begin:n{artifact}\nobreak} +\NewSocketPlug{tagsupport/toc/leaders/after}{artifact} + {\nobreak\tag_mc_end:} +\AssignSocketPlug{tagsupport/toc/leaders/before}{artifact} +\AssignSocketPlug{tagsupport/toc/leaders/after}{artifact} % \end{macrocode} - +% \end{plugdecl} % % \begin{macrocode} %</package> diff --git a/macros/latex/required/latex-lab/latex-lab-toc.pdf b/macros/latex/required/latex-lab/latex-lab-toc.pdf Binary files differindex fe8b2a89ac..071c82c763 100644 --- a/macros/latex/required/latex-lab/latex-lab-toc.pdf +++ b/macros/latex/required/latex-lab/latex-lab-toc.pdf diff --git a/macros/unicodetex/latex/fontsetup/README b/macros/unicodetex/latex/fontsetup/README index c39d73a4c4..0149a32d71 100644 --- a/macros/unicodetex/latex/fontsetup/README +++ b/macros/unicodetex/latex/fontsetup/README @@ -1,5 +1,5 @@ The fontsetup package - (Version 2.2.1, GPL3) + (Version 2.3.0, GPL3) This simple package makes it trivial to switch quickly between different quality fonts supporting Mathematics. diff --git a/macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.pdf b/macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.pdf Binary files differindex 4fc24f90f5..42fce8c982 100644 --- a/macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.pdf +++ b/macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.pdf diff --git a/macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.tex b/macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.tex index 133138d421..5491fa1391 100644 --- a/macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.tex +++ b/macros/unicodetex/latex/fontsetup/doc/fontsetup-doc.tex @@ -15,8 +15,8 @@ \textit{by}\\[1ex] {\large Antonis Tsolomitis}\\ University of the Aegean\\ Department of Mathematics\\[1ex] - \textsc{9} September \textsc{2024}\\[1ex] - Version 2.2.1, \textsc{gpl3} + \textsc{1} November \textsc{2024}\\[1ex] + Version 2.3.0, \textsc{gpl3} \end{center} This package is a simple wrapper-type package that makes the setup of fonts easy and @@ -108,6 +108,8 @@ NewComputerModern font family. \end{itemize} \item[olddefault] Loads the NewComputerModern fonts (in Regular weight) similarly to the default option. + \item[sansdefault] Loads the NewComputerModern Sans Serif fonts (in Regular weight) + similarly to the default option with Sans Math. \item[cambria] Loads the Cambria fonts of Microsoft. These must be already installed as a system font (in \verb|C:\Windows\Fonts| in MS-Windows, in \verb|/home/user/.fonts/| in Linux or elsewhere by the system administratior). This option works only if @@ -217,18 +219,24 @@ Samples for the free fonts follow. Samples for the nonfree fonts can be found in \begin{center} -{\Large ComputerModern fonts (Book weight): option \verb|default|}\\[1cm] +{\Large NewComputerModern fonts (Book weight): option \verb|default|}\\[1cm] \includegraphics[scale=1.2]{fspsample-newdefault.pdf} \end{center} \newpage \begin{center} -{\Large ComputerModern fonts (old Regular weight): option \verb|olddefault|}\\[1cm] +{\Large NewComputerModern fonts (old Regular weight): option \verb|olddefault|}\\[1cm] \includegraphics[scale=1.2]{fspsample-cmr.pdf} \end{center} \newpage \begin{center} +{\Large NewComputerModern Sans fonts (Regular weight): option \verb|sansdefault|}\\[1cm] +\includegraphics[scale=1.2]{fspsample-sansdefault.pdf} +\end{center} + +\newpage +\begin{center} {\Large Concrete fonts: option \verb|concrete|}\\[1cm] \includegraphics[scale=1.2]{fspsample-concrete.pdf} \end{center} diff --git a/macros/unicodetex/latex/fontsetup/doc/fspsample-sansdefault.pdf b/macros/unicodetex/latex/fontsetup/doc/fspsample-sansdefault.pdf Binary files differnew file mode 100644 index 0000000000..8047ace464 --- /dev/null +++ b/macros/unicodetex/latex/fontsetup/doc/fspsample-sansdefault.pdf diff --git a/macros/unicodetex/latex/fontsetup/doc/fspsample.tex b/macros/unicodetex/latex/fontsetup/doc/fspsample.tex index c012dad299..9ca9075c0b 100644 --- a/macros/unicodetex/latex/fontsetup/doc/fspsample.tex +++ b/macros/unicodetex/latex/fontsetup/doc/fspsample.tex @@ -13,8 +13,9 @@ \setdefaultlanguage{english} \setotherlanguage{greek} -%\usepackage[default]{fontsetup}%upint, newcmbb -\usepackage[gfsartemisia]{fontsetup} +\usepackage[default]{fontsetup}%upint, newcmbb +%\usepackage[sansdefault]{fontsetup}%upint, newcmbb +%\usepackage[gfsartemisia]{fontsetup} %\usepackage[gfsdidot]{fontsetup} %\usepackage[gfsdidotclassic]{fontsetup} %\usepackage[gfsneohellenic]{fontsetup} diff --git a/macros/unicodetex/latex/fontsetup/tex/fontsetup.sty b/macros/unicodetex/latex/fontsetup/tex/fontsetup.sty index 659263a529..2d3308fff3 100644 --- a/macros/unicodetex/latex/fontsetup/tex/fontsetup.sty +++ b/macros/unicodetex/latex/fontsetup/tex/fontsetup.sty @@ -1,4 +1,4 @@ -\ProvidesPackage{fontsetup}[2024/9/11 v2.2.1 For easily using font families with mathematics] +\ProvidesPackage{fontsetup}[2024/11/01 v2.3.0 For easily using font families with mathematics] \RequirePackage{iflang} \RequirePackage{iftex} % Provide a test to know if a 16bits TeX is used. @@ -46,40 +46,91 @@ \if@varnothing \if@newcmbb \setmathfont[StylisticSet=2,StylisticSet=3,CharacterVariant=1]{NewCMMath-\regularorbook.otf}% - \setmathfont[version=bold,StylisticSet=2,StylisticSet=3,CharacterVariant=1]{NewCMMath-Bold.otf}% + \setmathfont{NewCMMath-Bold.otf}[version=bold,StylisticSet=2,StylisticSet=3,CharacterVariant=1]% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-\regularorbook.otf} \else \setmathfont[StylisticSet=2,CharacterVariant=1]{NewCMMath-\regularorbook.otf}% - \setmathfont[version=bold,StylisticSet=2,CharacterVariant=1]{NewCMMath-Bold.otf}% + \setmathfont{NewCMMath-Bold.otf}[version=bold,StylisticSet=2,CharacterVariant=1]% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-\regularorbook.otf} \fi \else \if@newcmbb \setmathfont[StylisticSet=2,StylisticSet=3]{NewCMMath-\regularorbook.otf}% - \setmathfont[version=bold,StylisticSet=2,StylisticSet=3]{NewCMMath-Bold.otf}% + \setmathfont{NewCMMath-Bold.otf}[version=bold,StylisticSet=2,StylisticSet=3]% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-\regularorbook.otf} \else \setmathfont[StylisticSet=2]{NewCMMath-\regularorbook.otf}% - \setmathfont[version=bold,StylisticSet=2]{NewCMMath-Bold.otf}% + \setmathfont{NewCMMath-Bold.otf}[version=bold,StylisticSet=2]% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-\regularorbook.otf} \fi \fi \else \if@varnothing \if@newcmbb \setmathfont[StylisticSet=3,CharacterVariant=1]{NewCMMath-\regularorbook.otf}% - \setmathfont[version=bold,StylisticSet=3,CharacterVariant=1]{NewCMMath-Bold.otf}% + \setmathfont{NewCMMath-Bold.otf}[version=bold,StylisticSet=3,CharacterVariant=1]% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-\regularorbook.otf} \else - \setmathfont[CharacterVariant=1]{NewCMMath-\regularorbook.otf}% - \setmathfont[version=bold,CharacterVariant=1]{NewCMMath-Bold.otf}% + \setmathfont[CharacterVariant=1]{NewCMMath-\regularorbook.otf}%\ + \setmathfont{NewCMMath-Bold.otf}[version=bold,CharacterVariant=1]% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-\regularorbook.otf} \fi \else \if@newcmbb \setmathfont[StylisticSet=3]{NewCMMath-\regularorbook.otf}% - \setmathfont[version=bold,StylisticSet=3]{NewCMMath-Bold.otf}% + \setmathfont{NewCMMath-Bold.otf}[version=bold,StylisticSet=3]% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-\regularorbook.otf} \else \setmathfont{NewCMMath-\regularorbook.otf}% - \setmathfont[version=bold]{NewCMMath-Bold.otf}% + \setmathfont{NewCMMath-Bold.otf}[version=bold]% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-\regularorbook.otf} \fi \fi \fi \IfLanguageName{greek}{\cvfoursetup}{\@ifpackageloaded{xgreek}{\cvfoursetup}{}}} +% +% sansdefault +\newcommand*\ncmsanssetup{% + \if@upint + \if@varnothing + \if@newcmbb + \setmathfont[StylisticSet=2,StylisticSet=3,CharacterVariant=1]{NewCMSansMath-Regular.otf}% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + \else + \setmathfont[StylisticSet=2,CharacterVariant=1]{NewCMSansMath-Regular.otf}% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + \fi + \else + \if@newcmbb + \setmathfont[StylisticSet=2,StylisticSet=3]{NewCMSansMath-Regular.otf}% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + \else + \setmathfont[StylisticSet=2]{NewCMSansMath-Regular.otf}% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + \fi + \fi + \else + \if@varnothing + \if@newcmbb + \setmathfont[StylisticSet=3,CharacterVariant=1]{NewCMSansMath-Regular.otf}% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + \else + \setmathfont[CharacterVariant=1]{NewCMSansMath-Regular.otf}%\ + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + \fi + \else + \if@newcmbb + \setmathfont[StylisticSet=3]{NewCMSansMath-Regular.otf}% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + \else + \setmathfont{NewCMSansMath-Regular.otf}% + \setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + \fi + \fi + \fi + \IfLanguageName{greek}{\cvfoursetup}{\@ifpackageloaded{xgreek}{\cvfoursetup}{}}} +% +% \DeclareOption{upint}{\@upinttrue} \DeclareOption{varnothing}{\@varnothingtrue} \DeclareOption{newcmbb}{\@newcmbbtrue} @@ -99,6 +150,13 @@ \endgroup \@packagewithoptionstrue } +\DeclareOption{sansdefault}{% + \input{fspsansdefault}% + \begingroup + \ncmsanssetup + \endgroup + \@packagewithoptionstrue +} % Install Cambria as a system font. % cambria.ttc, cambriai.ttf, cambriab.ttf, cambriaz.ttf \DeclareOption{cambria}{\input{fspcambria}\@packagewithoptionstrue} diff --git a/macros/unicodetex/latex/fontsetup/tex/fspdefault.tex b/macros/unicodetex/latex/fontsetup/tex/fspdefault.tex index 7b72ba65e4..6453568639 100644 --- a/macros/unicodetex/latex/fontsetup/tex/fspdefault.tex +++ b/macros/unicodetex/latex/fontsetup/tex/fspdefault.tex @@ -94,8 +94,8 @@ SmallCapsFeatures={Numbers=OldStyle}]{NewCMMono10-Book.otf} ]{NewCMUncial10-Book.otf} \newcommand{\textuncial}[1]{{\uncial #1}} \setmathfont{NewCMMath-Book.otf} -\setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-Book.otf} \setmathfont{NewCMMath-Bold.otf}[version=bold] +\setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-Book.otf} \newcommand{\tttextsc}[1]{{\ttscshape#1}} % \let\prosgegrammeni=\undefined diff --git a/macros/unicodetex/latex/fontsetup/tex/fspolddefault.tex b/macros/unicodetex/latex/fontsetup/tex/fspolddefault.tex index 4b27d42e45..796f3c2133 100644 --- a/macros/unicodetex/latex/fontsetup/tex/fspolddefault.tex +++ b/macros/unicodetex/latex/fontsetup/tex/fspolddefault.tex @@ -98,8 +98,8 @@ SmallCapsFeatures={Numbers=OldStyle}]{NewCMMono10-Regular.otf} \newcommand{\textuncial}[1]{{\uncial #1}} \setmathfont{NewCMMath-Regular.otf} -\setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-Regular.otf} \setmathfont{NewCMMath-Bold.otf}[version=bold] +\setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMMath-Regular.otf} \newcommand{\tttextsc}[1]{{\ttscshape#1}} % diff --git a/macros/unicodetex/latex/fontsetup/tex/fspsansdefault.tex b/macros/unicodetex/latex/fontsetup/tex/fspsansdefault.tex new file mode 100644 index 0000000000..34ab282422 --- /dev/null +++ b/macros/unicodetex/latex/fontsetup/tex/fspsansdefault.tex @@ -0,0 +1,599 @@ +%% (C) Antonis Tsolomitis, GPL3. +\setsansfont[% + SizeFeatures={% +{Size=-8, Font=NewCM08-Regular.otf, + ItalicFont=NewCM08-Italic.otf,% + BoldFont=NewCM10-Bold.otf,% + BoldItalicFont=NewCM10-BoldItalic.otf,% + SlantedFont=NewCM08-Regular.otf,% + BoldSlantedFont=NewCM10-Bold.otf,% + SmallCapsFeatures={Numbers=OldStyle}}, +{Size=8, Font=NewCM08-Regular.otf, + ItalicFont=NewCM08-Italic.otf,% + BoldFont=NewCM10-Bold.otf,% + BoldItalicFont=NewCM10-BoldItalic.otf,% + SlantedFont=NewCM08-Regular.otf,% + BoldSlantedFont=NewCM10-Bold.otf,% + SmallCapsFeatures={Numbers=OldStyle}}, +{Size= 9-, Font = NewCM10-Regular.otf, + ItalicFont=NewCM10-Italic.otf,% + BoldFont=NewCM10-Bold.otf,% + BoldItalicFont=NewCM10-BoldItalic.otf,% + SlantedFont=NewCM10-Regular.otf,% + BoldSlantedFont=NewCM10-Bold.otf,% + SmallCapsFeatures={Numbers=OldStyle}}% + },% + SmallCapsFeatures={Numbers=OldStyle},% + BoldSlantedFont=NewCM10-Bold.otf,% + SlantedFont=NewCM10-Regular.otf,% + BoldItalicFont=NewCM10-BoldItalic.otf,% + BoldFont=NewCM10-Bold.otf,% + ItalicFont=NewCM10-Italic.otf,% + SlantedFeatures={FakeSlant=0.25},% + BoldSlantedFeatures={FakeSlant=0.25},% +]{NewCM10-Regular.otf} + +\setmainfont[% + SizeFeatures={% +{Size= -8, Font=NewCMSans08-Regular.otf,% + ItalicFont=NewCMSans08-Oblique.otf,% + BoldFont=NewCMSans10-Bold.otf,% + BoldItalicFont=NewCMSans10-BoldOblique.otf,% + SmallCapsFeatures={Numbers=OldStyle},% +}, +{Size= 8, Font=NewCMSans08-Regular.otf,% + ItalicFont=NewCMSans08-Oblique.otf,% + BoldFont=NewCMSans10-Bold.otf,% + BoldItalicFont=NewCMSans10-BoldOblique.otf,% + SmallCapsFeatures={Numbers=OldStyle},% +}, +{Size= 9-, Font=NewCMSans10-Regular.otf,% + ItalicFont=NewCMSans10-Oblique.otf,% + BoldFont=NewCMSans10-Bold.otf,% + BoldItalicFont=NewCMSans10-BoldOblique.otf,% + SmallCapsFeatures={Numbers=OldStyle},% +}}, + ItalicFont=NewCMSans10-Oblique.otf,% + BoldFont=NewCMSans10-Bold.otf,% + BoldItalicFont=NewCMSans10-BoldOblique.otf,% + SmallCapsFeatures={Numbers=OldStyle},% + SlantedFont=NewCMSans10-Oblique.otf,% + BoldSlantedFont=NewCMSans10-BoldOblique.otf,% +]{NewCMSans10-Regular.otf} + +\setmonofont[% +ItalicFont=NewCMMono10-Italic.otf,% +BoldFont=NewCMMono10-Bold.otf,% +BoldItalicFont=NewCMMono10-BoldOblique.otf,% +SlantedFont=NewCMMono10-Regular.otf,% +SlantedFeatures={FakeSlant=0.25}, +BoldSlantedFont=NewCMMono10-Bold.otf,% +BoldSlantedFeatures={FakeSlant=0.25}, +SmallCapsFeatures={Numbers=OldStyle}]{NewCMMono10-Regular.otf} + +\newfontfamily\uncial[% + SizeFeatures={% +{Size=-8, Font=NewCMUncial08-Regular.otf, + BoldFont=NewCMUncial10-Bold.otf,% + SlantedFont=NewCMUncial08-Regular.otf,% + BoldSlantedFont=NewCMUncial10-Bold.otf,% + }, +{Size=8, Font=NewCMUncial08-Regular.otf, + BoldFont=NewCMUncial08-Bold.otf,% + SlantedFont=NewCMUncial08-regular.otf,% + BoldSlantedFont=NewCMUncial10-Bold.otf,% + }, +{Size= 9-, Font = NewCMUncial10-Regular.otf, + BoldFont=NewCMUncial10-Bold.otf,% + SlantedFont=NewCMUncial10-Regular.otf,% + BoldSlantedFont=NewCMUncial10-Bold.otf,% + }% + },% + BoldSlantedFont=NewCMUncial10-Bold.otf,% + SlantedFont=NewCMUncial10-Regular.otf,% + BoldFont=NewCMUncial10-Bold.otf,% + SlantedFeatures={FakeSlant=0.25},% + BoldSlantedFeatures={FakeSlant=0.25},% + ]{NewCMUncial10-Regular.otf} + +\newcommand{\textuncial}[1]{{\uncial #1}} +\setmathfont{NewCMSansMath-Regular.otf} +\setmathfont[range={\mathscr,\mathbfscr},StylisticSet=1]{NewCMSansMath-Regular.otf} + + +\newcommand{\tttextsc}[1]{{\ttscshape#1}} +% +\let\prosgegrammeni=\undefined +\newcommand{\prosgegrammeni}{\addfontfeature{StylisticSet=1}} +\newcommand{\textprosgegrammeni}[1]{{\prosgegrammeni#1}} +% +%\newfontfamily{\ivbce}[StylisticSet=2]{NewCMSans10-Regular.otf} +\newcommand{\ivbce}{\sffamily\addfontfeature{StylisticSet=2}} +\newcommand{\textivbce}[1]{{\ivbce#1}} +% +%\newfontfamily{\ivbcealt}[StylisticSet=3]{NewCMSans10-Regular.otf} +\newcommand{\ivbcealt}{\sffamily\addfontfeature{StylisticSet=3}} +\newcommand{\textivbcealt}[1]{{\ivbcealt#1}} +% +%\newfontfamily{\vibce}[StylisticSet=4]{NewCMSans10-Regular.otf} +\newcommand{\vibce}{\sffamily\addfontfeature{StylisticSet=4}} +\newcommand{\textvibce}[1]{{\vibce#1}} +% +%% math (upright) sans Greek +\newcommand*{\msansAlpha}{\char"E000} +\newcommand*{\msansBeta}{\char"E001} +\newcommand*{\msansGamma}{\char"E002} +\newcommand*{\msansDelta}{\char"E003} +\newcommand*{\msansEpsilon}{\char"E004} +\newcommand*{\msansZeta}{\char"E005} +\newcommand*{\msansEta}{\char"E006} +\newcommand*{\msansTheta}{\char"E007} +\newcommand*{\msansIota}{\char"E008} +\newcommand*{\msansKappa}{\char"E009} +\newcommand*{\msansLambda}{\char"E00A} +\newcommand*{\msansMu}{\char"E00B} +\newcommand*{\msansNu}{\char"E00C} +\newcommand*{\msansXi}{\char"E00D} +\newcommand*{\msansOmicron}{\char"E00E} +\newcommand*{\msansPi}{\char"E00F} +\newcommand*{\msansRho}{\char"E010} +\newcommand*{\msansSigma}{\char"E011} +\newcommand*{\msansTau}{\char"E012} +\newcommand*{\msansUpsilon}{\char"E013} +\newcommand*{\msansPhi}{\char"E014} +\newcommand*{\msansChi}{\char"E015} +\newcommand*{\msansPsi}{\char"E016} +\newcommand*{\msansOmega}{\char"E017} +\newcommand*{\msansalpha}{\char"E018} +\newcommand*{\msansbeta}{\char"E019} +\newcommand*{\msansgamma}{\char"E01A} +\newcommand*{\msansdelta}{\char"E01B} +\newcommand*{\msansepsilon}{\char"E01C} +\newcommand*{\msanszeta}{\char"E01D} +\newcommand*{\msanseta}{\char"E01E} +\newcommand*{\msanstheta}{\char"E01F} +\newcommand*{\msansiota}{\char"E020} +\newcommand*{\msanskappa}{\char"E021} +\newcommand*{\msanslambda}{\char"E022} +\newcommand*{\msansmu}{\char"E023} +\newcommand*{\msansnu}{\char"E024} +\newcommand*{\msansxi}{\char"E025} +\newcommand*{\msansomicron}{\char"E026} +\newcommand*{\msanspi}{\char"E027} +\newcommand*{\msansrho}{\char"E028} +\newcommand*{\msansvarsigma}{\char"E029} +\newcommand*{\msanssigma}{\char"E02A} +\newcommand*{\msanstau}{\char"E02B} +\newcommand*{\msansupsilon}{\char"E02C} +\newcommand*{\msansphi}{\char"E02D} +\newcommand*{\msanschi}{\char"E02E} +\newcommand*{\msanspsi}{\char"E02F} +\newcommand*{\msansomega}{\char"E030} +\newcommand*{\msansvarepsilon}{\char"E031} +% math italic sans Greek +\newcommand*{\mitsansAlpha}{\char"E041} +\newcommand*{\mitsansBeta}{\char"E042} +\newcommand*{\mitsansGamma}{\char"E043} +\newcommand*{\mitsansDelta}{\char"E044} +\newcommand*{\mitsansEpsilon}{\char"E045} +\newcommand*{\mitsansZeta}{\char"E046} +\newcommand*{\mitsansEta}{\char"E047} +\newcommand*{\mitsansTheta}{\char"E048} +\newcommand*{\mitsansIota}{\char"E049} +\newcommand*{\mitsansKappa}{\char"E04A} +\newcommand*{\mitsansLambda}{\char"E04B} +\newcommand*{\mitsansMu}{\char"E04C} +\newcommand*{\mitsansNu}{\char"E04D} +\newcommand*{\mitsansXi}{\char"E04E} +\newcommand*{\mitsansOmicron}{\char"E04F} +\newcommand*{\mitsansPi}{\char"E050} +\newcommand*{\mitsansRho}{\char"E051} +\newcommand*{\mitsansSigma}{\char"E052} +\newcommand*{\mitsansTau}{\char"E053} +\newcommand*{\mitsansUpsilon}{\char"E054} +\newcommand*{\mitsansPhi}{\char"E055} +\newcommand*{\mitsansChi}{\char"E056} +\newcommand*{\mitsansPsi}{\char"E057} +\newcommand*{\mitsansOmega}{\char"E058} +\newcommand*{\mitsansalpha}{\char"E059} +\newcommand*{\mitsansbeta}{\char"E05A} +\newcommand*{\mitsansgamma}{\char"E05B} +\newcommand*{\mitsansdelta}{\char"E05C} +\newcommand*{\mitsansepsilon}{\char"E05D} +\newcommand*{\mitsanszeta}{\char"E05E} +\newcommand*{\mitsanseta}{\char"E05F} +\newcommand*{\mitsanstheta}{\char"E060} +\newcommand*{\mitsansiota}{\char"E061} +\newcommand*{\mitsanskappa}{\char"E062} +\newcommand*{\mitsanslambda}{\char"E063} +\newcommand*{\mitsansmu}{\char"E064} +\newcommand*{\mitsansnu}{\char"E065} +\newcommand*{\mitsansxi}{\char"E066} +\newcommand*{\mitsansomicron}{\char"E067} +\newcommand*{\mitsanspi}{\char"E068} +\newcommand*{\mitsansrho}{\char"E069} +\newcommand*{\mitsansvarsigma}{\char"E06A} +\newcommand*{\mitsanssigma}{\char"E06B} +\newcommand*{\mitsanstau}{\char"E06C} +\newcommand*{\mitsansupsilon}{\char"E06D} +\newcommand*{\mitsansphi}{\char"E06E} +\newcommand*{\mitsanschi}{\char"E06F} +\newcommand*{\mitsanspsi}{\char"E070} +\newcommand*{\mitsansomega}{\char"E071} +\newcommand*{\mitsansvarepsilon}{\char"E072} +% Ancient Greek Numerals u10140-u1018E +\newcommand*{\atticonequarter}{\char"10140} +\newcommand*{\atticonehalf}{\char"10141} +\newcommand*{\atticonedrachma}{\char"10142} +\newcommand*{\atticfive}{\char"10143} +\newcommand*{\atticfifty}{\char"10144} +\newcommand*{\atticfivehundred}{\char"10145} +\newcommand*{\atticfivethousand}{\char"10146} +\newcommand*{\atticfiftythousand}{\char"10147} +\newcommand*{\atticfivetalents}{\char"10148} +\newcommand*{\attictentalents}{\char"10149} +\newcommand*{\atticfiftytalents}{\char"1014A} +\newcommand*{\atticonehundredtalents}{\char"1014B} +\newcommand*{\atticfivehundredtalents}{\char"1014C} +\newcommand*{\atticonethousandtalents}{\char"1014D} +\newcommand*{\atticfivethousandtalents}{\char"1014E} +\newcommand*{\atticfivestaters}{\char"1014F} +\newcommand*{\attictenstaters}{\char"10150} +\newcommand*{\atticfiftystaters}{\char"10151} +\newcommand*{\atticonehundredstaters}{\char"10152} +\newcommand*{\atticfivehundredstaters}{\char"10153} +\newcommand*{\atticonethousandstaters}{\char"10154} +\newcommand*{\attictenthousandstaters}{\char"10155} +\newcommand*{\atticfiftythousandstaters}{\char"10156} +\newcommand*{\attictenmnas}{\char"10157} +\newcommand*{\heraleumoneplethron}{\char"10158} +\newcommand*{\thespianone}{\char"10159} +\newcommand*{\ermionianone}{\char"1015A} +\newcommand*{\epidauriantwo}{\char"1015B} +\newcommand*{\thespiantwo}{\char"1015C} +\newcommand*{\cyrenaictwodrachmas}{\char"1015D} +\newcommand*{\epidauriantwodrachmas}{\char"1015E} +\newcommand*{\troezenianfive}{\char"1015F} +\newcommand*{\troezenianten}{\char"10160} +\newcommand*{\troezeniantenalt}{\char"10161} +\newcommand*{\hermionianten}{\char"10162} +\newcommand*{\messenianten}{\char"10163} +\newcommand*{\thespianten}{\char"10164} +\newcommand*{\thespianthirty}{\char"10165} +\newcommand*{\troezenianfifty}{\char"10166} +\newcommand*{\troezenianfiftyalt}{\char"10167} +\newcommand*{\hermionianfifty}{\char"10168} +\newcommand*{\thespianfifty}{\char"10169} +\newcommand*{\thespianonehundred}{\char"1016A} +\newcommand*{\thespianthreehundred}{\char"1016B} +\newcommand*{\epidaurianfivehundred}{\char"1016C} +\newcommand*{\troezenianfivehundred}{\char"1016D} +\newcommand*{\thespianfivehundred}{\char"1016E} +\newcommand*{\carystianfivehundred}{\char"1016F} +\newcommand*{\naxianfivehundred}{\char"10170} +\newcommand*{\thespianonethousand}{\char"10171} +\newcommand*{\thespianfivethousand}{\char"10172} +\newcommand*{\delphicfivemnas}{\char"10173} +\newcommand*{\stratianfiftymnas}{\char"10174} +\newcommand*{\greekonehalfsign}{\char"10175} +\newcommand*{\greekonehalfsignalt}{\char"10176} +\newcommand*{\greektwothirdssign}{\char"10177} +\newcommand*{\greekthreequarterssign}{\char"10178} +\newcommand*{\greekyearsign}{\char"10179} +\newcommand*{\greektalentsign}{\char"1017A} +\newcommand*{\greekdrachmasign}{\char"1017B} +\newcommand*{\greekobolsign}{\char"1017C} +\newcommand*{\greektwoobolssign}{\char"1017D} +\newcommand*{\greekthreeobolssign}{\char"1017E} +\newcommand*{\greekfourobolssign}{\char"1017F} +\newcommand*{\greekfiveobolssign}{\char"10180} +\newcommand*{\greekmetretessign}{\char"10181} +\newcommand*{\greekkyathosbasesign}{\char"10182} +\newcommand*{\greeklytrasign}{\char"10183} +\newcommand*{\greekounkiasign}{\char"10184} +\newcommand*{\greekxestessign}{\char"10185} +\newcommand*{\greekartabesign}{\char"10186} +\newcommand*{\greekarourasign}{\char"10187} +\newcommand*{\greekgrammasign}{\char"10188} +\newcommand*{\greektryblionbasesign}{\char"10189} +\newcommand*{\greekzerosign}{\char"1018A} +\newcommand*{\greekonequartersign}{\char"1018B} +\newcommand*{\greeksinusoidsign}{\char"1018C} +\newcommand*{\greekindictionsign}{\char"1018D} +\newcommand*{\nomismasign}{\char"1018E} +% +% some math symbols +\DeclareRobustCommand*\nrightrightarrows{\mathrel{\char"E033}} +\DeclareRobustCommand*\nleftleftarrows{\mathrel{\char"E032}} +\DeclareRobustCommand*\twoheadhookrightarrow{\mathrel{\char"E034}} +\DeclareRobustCommand*\twoheadhookleftarrow{\mathrel{\char"E035}} +% +%%% declare the convolution operator %%%%%%%%%%%%%%% +\DeclareMathOperator*{\convolution}{\mathchoice{\char"E037}{\char"E036}{\char"E038}{\char"E039}} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% select ss02 lookup table for IPA symbols +%\newfontfamily{\ipatext}[StylisticSet=5,% +%BoldFont=NewCM10-Bold.otf,% +%SlantedFont=NewCM10-Regular.otf,% +%SlantedFeatures={FakeSlant=0.25}, +%BoldSlantedFont=NewCM10-Bold.otf,% +%BoldSlantedFeatures={FakeSlant=0.25}, +%SmallCapsFeatures={Numbers=OldStyle}]{NewCM10-Regular.otf} +\newcommand{\ipatext}{\addfontfeature{StylisticSet=5}} +\newcommand{\textipa}[1]{{\ipatext#1}} +\newcommand{\oldipatext}{\addfontfeature{StylisticSet=5,RawFeature=+lipa}} +\newcommand{\textoldipa}[1]{{\oldipatext#1}} +%\newfontfamily{\ipatextsans}[StylisticSet=5,% +%ItalicFont=NewCMSans10-Oblique.otf,% +%BoldFont=NewCMSans10-Bold.otf,% +%BoldItalicFont=NewCMSans10-BoldOblique.otf,% +%SlantedFont=NewCMSans10-Oblique.otf,% +%BoldSlantedFont=NewCMSans10-BoldOblique.otf,% +%SmallCapsFeatures={Numbers=OldStyle}]{NewCMSans10-Regular.otf} +%\newcommand{\ipatextsans}{\sffamily\addfontfeature{StylisticSet=5}} +%\newcommand{\textsansipa}[1]{{\ipatextsans#1}} +% +% Up versions for chemistry +\newcommand*{\chemalpha}{\textrm{α}} +\newcommand*{\chembeta}{\textrm{β}} +\newcommand*{\chemgamma}{\textrm{γ}} +\newcommand*{\chemdelta}{\textrm{δ}} +\newcommand*{\chemepsilon}{\textrm{ε}} +\newcommand*{\chemzeta}{\textrm{ζ}} +\newcommand*{\chemeta}{\textrm{η}} +\newcommand*{\chemtheta}{\textrm{θ}} +\newcommand*{\chemiota}{\textrm{ι}} +\newcommand*{\chemkappa}{\textrm{\char"03F0}} +\newcommand*{\chemlambda}{\textrm{λ}} +\newcommand*{\chemmu}{\textrm{μ}} +\newcommand*{\chemnu}{\textrm{ν}} +\newcommand*{\chemxi}{\textrm{ξ}} +\newcommand*{\chemomicron}{\textrm{ο}} +\newcommand*{\chempi}{\textrm{π}} +\newcommand*{\chemrho}{\textrm{ρ}} +\newcommand*{\chemrhoalt}{\textrm{\char"03F1}} +\newcommand*{\chemsigma}{\textrm{σ}} +\newcommand*{\chemsigmaalt}{\textrm{ς}} +\newcommand*{\chemtau}{\textrm{τ}} +\newcommand*{\chemupsilon}{\textrm{υ}} +\newcommand*{\chemphi}{\textrm{φ}} +\newcommand*{\chemchi}{\textrm{χ}} +\newcommand*{\chempsi}{\textrm{ψ}} +\newcommand*{\chemomega}{\textrm{ω}} +% +\newcommand*{\chemAlpha}{\textrm{Α}} +\newcommand*{\chemBeta}{\textrm{Β}} +\newcommand*{\chemGamma}{\textrm{Γ}} +\newcommand*{\chemDelta}{\textrm{Δ}} +\newcommand*{\chemEpsilon}{\textrm{Ε}} +\newcommand*{\chemZeta}{\textrm{Ζ}} +\newcommand*{\chemEta}{\textrm{Η}} +\newcommand*{\chemTheta}{\textrm{Θ}} +\newcommand*{\chemIota}{\textrm{Ι}} +\newcommand*{\chemKappa}{\textrm{Κ}} +\newcommand*{\chemLambda}{\textrm{Λ}} +\newcommand*{\chemMu}{\textrm{Μ}} +\newcommand*{\chemNu}{\textrm{Ν}} +\newcommand*{\chemXi}{\textrm{Ξ}} +\newcommand*{\chemOmicron}{\textrm{Ο}} +\newcommand*{\chemPi}{\textrm{Π}} +\newcommand*{\chemRho}{\textrm{Ρ}} +\newcommand*{\chemSigma}{\textrm{Σ}} +\newcommand*{\chemTau}{\textrm{Τ}} +\newcommand*{\chemUpsilon}{\textrm{Υ}} +\newcommand*{\chemPhi}{\textrm{Φ}} +\newcommand*{\chemChi}{\textrm{Χ}} +\newcommand*{\chemPsi}{\textrm{Ψ}} +\newcommand*{\chemOmega}{\textrm{Ω}} +% +%% Next block enables Devanagari letters as variables in Math font +\Umathcode "0900 7 \symoperators "0900% +\Umathcode "0901 7 \symoperators "0901% +\Umathcode "0902 7 \symoperators "0902% +\Umathcode "0903 7 \symoperators "0903% +\Umathcode "0904 7 \symoperators "0904% +\Umathcode "0905 7 \symoperators "0905% +\Umathcode "0906 7 \symoperators "0906% +\Umathcode "0907 7 \symoperators "0907% +\Umathcode "0908 7 \symoperators "0908% +\Umathcode "0909 7 \symoperators "0909% +\Umathcode "090A 7 \symoperators "090A% +\Umathcode "090B 7 \symoperators "090B% +\Umathcode "090C 7 \symoperators "090C% +\Umathcode "090D 7 \symoperators "090D% +\Umathcode "090E 7 \symoperators "090E% +\Umathcode "090F 7 \symoperators "090F% +% +\Umathcode "0910 7 \symoperators "0910% +\Umathcode "0911 7 \symoperators "0911% +\Umathcode "0912 7 \symoperators "0912% +\Umathcode "0913 7 \symoperators "0913% +\Umathcode "0914 7 \symoperators "0914% +\Umathcode "0915 7 \symoperators "0915% +\Umathcode "0916 7 \symoperators "0916% +\Umathcode "0917 7 \symoperators "0917% +\Umathcode "0918 7 \symoperators "0918% +\Umathcode "0919 7 \symoperators "0919% +\Umathcode "091A 7 \symoperators "091A% +\Umathcode "091B 7 \symoperators "091B% +\Umathcode "091C 7 \symoperators "091C% +\Umathcode "091D 7 \symoperators "091D% +\Umathcode "091E 7 \symoperators "091E% +\Umathcode "091F 7 \symoperators "091F% +% +\Umathcode "0920 7 \symoperators "0920% +\Umathcode "0921 7 \symoperators "0921% +\Umathcode "0922 7 \symoperators "0922% +\Umathcode "0923 7 \symoperators "0923% +\Umathcode "0924 7 \symoperators "0924% +\Umathcode "0925 7 \symoperators "0925% +\Umathcode "0926 7 \symoperators "0926% +\Umathcode "0927 7 \symoperators "0927% +\Umathcode "0928 7 \symoperators "0928% +\Umathcode "0929 7 \symoperators "0929% +\Umathcode "092A 7 \symoperators "092A% +\Umathcode "092B 7 \symoperators "092B% +\Umathcode "092C 7 \symoperators "092C% +\Umathcode "092D 7 \symoperators "092D% +\Umathcode "092E 7 \symoperators "092E% +\Umathcode "092F 7 \symoperators "092F% +% +\Umathcode "0930 7 \symoperators "0930% +\Umathcode "0931 7 \symoperators "0931% +\Umathcode "0932 7 \symoperators "0932% +\Umathcode "0933 7 \symoperators "0933% +\Umathcode "0934 7 \symoperators "0934% +\Umathcode "0935 7 \symoperators "0935% +\Umathcode "0936 7 \symoperators "0936% +\Umathcode "0937 7 \symoperators "0937% +\Umathcode "0938 7 \symoperators "0938% +\Umathcode "0939 7 \symoperators "0939% +\Umathcode "093A 7 \symoperators "093A% +\Umathcode "093B 7 \symoperators "093B% +\Umathcode "093C 7 \symoperators "093C% +\Umathcode "093D 7 \symoperators "093D% +\Umathcode "093E 7 \symoperators "093E% +\Umathcode "093F 7 \symoperators "093F% +% +\Umathcode "0940 7 \symoperators "0940% +\Umathcode "0941 7 \symoperators "0941% +\Umathcode "0942 7 \symoperators "0942% +\Umathcode "0943 7 \symoperators "0943% +\Umathcode "0944 7 \symoperators "0944% +\Umathcode "0945 7 \symoperators "0945% +\Umathcode "0946 7 \symoperators "0946% +\Umathcode "0947 7 \symoperators "0947% +\Umathcode "0948 7 \symoperators "0948% +\Umathcode "0949 7 \symoperators "0949% +\Umathcode "094A 7 \symoperators "094A% +\Umathcode "094B 7 \symoperators "094B% +\Umathcode "094C 7 \symoperators "094C% +\Umathcode "094D 7 \symoperators "094D% +\Umathcode "094E 7 \symoperators "094E% +\Umathcode "094F 7 \symoperators "094F% +% +\Umathcode "0950 7 \symoperators "0950% +\Umathcode "0951 7 \symoperators "0951% +\Umathcode "0952 7 \symoperators "0952% +\Umathcode "0953 7 \symoperators "0953% +\Umathcode "0954 7 \symoperators "0954% +\Umathcode "0955 7 \symoperators "0955% +\Umathcode "0956 7 \symoperators "0956% +\Umathcode "0957 7 \symoperators "0957% +\Umathcode "0958 7 \symoperators "0958% +\Umathcode "0959 7 \symoperators "0959% +\Umathcode "095A 7 \symoperators "095A% +\Umathcode "095B 7 \symoperators "095B% +\Umathcode "095C 7 \symoperators "095C% +\Umathcode "095D 7 \symoperators "095D% +\Umathcode "095E 7 \symoperators "095E% +\Umathcode "095F 7 \symoperators "095F% +% +\Umathcode "0960 7 \symoperators "0960% +\Umathcode "0961 7 \symoperators "0961% +\Umathcode "0962 7 \symoperators "0962% +\Umathcode "0963 7 \symoperators "0963% +\Umathcode "0964 7 \symoperators "0964% +\Umathcode "0965 7 \symoperators "0965% +\Umathcode "0966 7 \symoperators "0966% +\Umathcode "0967 7 \symoperators "0967% +\Umathcode "0968 7 \symoperators "0968% +\Umathcode "0969 7 \symoperators "0969% +\Umathcode "096A 7 \symoperators "096A% +\Umathcode "096B 7 \symoperators "096B% +\Umathcode "096C 7 \symoperators "096C% +\Umathcode "096D 7 \symoperators "096D% +\Umathcode "096E 7 \symoperators "096E% +\Umathcode "096F 7 \symoperators "096F% +% +\Umathcode "0970 7 \symoperators "0970% +\Umathcode "0971 7 \symoperators "0971% +\Umathcode "0972 7 \symoperators "0972% +\Umathcode "0973 7 \symoperators "0973% +\Umathcode "0974 7 \symoperators "0974% +\Umathcode "0975 7 \symoperators "0975% +\Umathcode "0976 7 \symoperators "0976% +\Umathcode "0977 7 \symoperators "0977% +\Umathcode "0978 7 \symoperators "0978% +\Umathcode "0979 7 \symoperators "0979% +\Umathcode "097A 7 \symoperators "097A% +\Umathcode "097B 7 \symoperators "097B% +\Umathcode "097C 7 \symoperators "097C% +\Umathcode "097D 7 \symoperators "097D% +\Umathcode "097E 7 \symoperators "097E% +\Umathcode "097F 7 \symoperators "097F% +%\Umathcode `ज 7 \symoperators "091C% +%\Umathcode `अ 7 \symoperators "0905% +%\Umathcode "0905 7 \symoperators "0905% +%\Umathcode `क 7 \symoperators "0915% +%\Umathcode `ख 7 \symoperators "0916% +%\Umathcode `२ 7 \symoperators "0968% +%\count255="0900 +% \loop\ifnum\count255<"097F +% \advance\count255 by 1 +% \Umathcode \count255 7 \symoperators \count255\fi +% \repeat +%%%%%%%%%%%%%%% End Devanagari Variables block %%%%%%%% + + +%%%%%%%%%% Begin Aegean Numbers ####################### +\newcommand*{\aegeanseparator}{\textsf{\char"10100}} +\newcommand*{\aegeanseparatordot}{\textsf{\char"10101}} +\newcommand*{\aegeancheckmark}{\textsf{\char"10102}} +\newcommand*{\aegeanone}{\textsf{\char"10107}} +\newcommand*{\aegeantwo}{\textsf{\char"10108}} +\newcommand*{\aegeanthree}{\textsf{\char"10109}} +\newcommand*{\aegeanfour}{\textsf{\char"1010A}} +\newcommand*{\aegeanfive}{\textsf{\char"1010B}} +\newcommand*{\aegeansix}{\textsf{\char"1010C}} +\newcommand*{\aegeanseven}{\textsf{\char"1010D}} +\newcommand*{\aegeaneight}{\textsf{\char"1010E}} +\newcommand*{\aegeanine}{\textsf{\char"1010F}} +\newcommand*{\aegeanten}{\textsf{\char"10110}} +\newcommand*{\aegeantwenty}{\textsf{\char"10111}} +\newcommand*{\aegeanthirty}{\textsf{\char"10112}} +\newcommand*{\aegeanfourty}{\textsf{\char"10113}} +\newcommand*{\aegeanfifty}{\textsf{\char"101114}} +\newcommand*{\aegeansixty}{\textsf{\char"10115}} +\newcommand*{\aegeanseventy}{\textsf{\char"10116}} +\newcommand*{\aegeaneighty}{\textsf{\char"10117}} +\newcommand*{\aegeanninety}{\textsf{\char"10118}} +\newcommand*{\aegeanonehundred}{\textsf{\char"10119}} +\newcommand*{\aegeantwohundred}{\textsf{\char"1011A}} +\newcommand*{\aegeanthreehundred}{\textsf{\char"1011B}} +\newcommand*{\aegeanfourhundred}{\textsf{\char"1011C}} +\newcommand*{\aegeanfivehundred}{\textsf{\char"1011D}} +\newcommand*{\aegeansixhundred}{\textsf{\char"1011E}} +\newcommand*{\aegeansevenhundred}{\textsf{\char"1011F}} +\newcommand*{\aegeaneighthundred}{\textsf{\char"10120}} +\newcommand*{\aegeanninehundred}{\textsf{\char"10121}} +\newcommand*{\aegeanonethousand}{\textsf{\char"10122}} +\newcommand*{\aegeantwothousand}{\textsf{\char"10123}} +\newcommand*{\aegeanthreethousand}{\textsf{\char"10124}} +\newcommand*{\aegeanfourthousand}{\textsf{\char"10125}} +\newcommand*{\aegeanfivethousand}{\textsf{\char"10126}} +\newcommand*{\aegeansixthousand}{\textsf{\char"10127}} +\newcommand*{\aegeanseventhousand}{\textsf{\char"10128}} +\newcommand*{\aegeaneightthousand}{\textsf{\char"10129}} +\newcommand*{\aegeanninethousand}{\textsf{\char"1012A}} +\newcommand*{\aegeantenthousand}{\textsf{\char"1012B}} +\newcommand*{\aegeantwentythousand}{\textsf{\char"1012C}} +\newcommand*{\aegeanthirtythousand}{\textsf{\char"1012D}} +\newcommand*{\aegeanfourtythousand}{\textsf{\char"1012E}} +\newcommand*{\aegeanfiftythousand}{\textsf{\char"1012F}} +\newcommand*{\aegeansixtythousand}{\textsf{\char"10130}} +\newcommand*{\aegeanseventythousand}{\textsf{\char"10131}} +\newcommand*{\aegeaneightythousand}{\textsf{\char"10132}} +\newcommand*{\aegeanninetythousand}{\textsf{\char"10133}} +\newcommand*{\aegeanweightbaseunit}{\textsf{\char"10137}} +\newcommand*{\aegeanweightfirstsubunit}{\textsf{\char"10138}} +\newcommand*{\aegeanweightsecondsubunit}{\textsf{\char"10139}} +\newcommand*{\aegeanweightthirdsubunit}{\textsf{\char"1013A}} +\newcommand*{\aegeanweightfourthsubunit}{\textsf{\char"1013B}} +\newcommand*{\aegeandrymeasurefirstsubunit}{\textsf{\char"1013C}} +\newcommand*{\aegeanliquidmeasurefirstsubunit}{\textsf{\char"1013D}} +\newcommand*{\aegeansecondsubunit}{\textsf{\char"1013E}} +\newcommand*{\aegeanthirdsubunit}{\textsf{\char"1013F}} +%%%%%%%%%%%%%%%% End Aegean Numbers %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl index 77d8e16be4..be1be4b853 100644 --- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl @@ -39,6 +39,7 @@ $mirrors = { }, 'Iran' => { 'http://ctan.asis.ai/' => 1, + 'https://ctan.yazd.ac.ir/' => 1, }, 'Japan' => { 'https://ftp.jaist.ac.jp/pub/CTAN/' => 1, @@ -142,10 +143,10 @@ $mirrors = { 'Poland' => { 'https://ctan.gust.org.pl/tex-archive/' => 1, 'https://polish-mirror.evolution-host.com/ctan/' => 1, + 'https://sunsite.icm.edu.pl/pub/CTAN/' => 1, }, 'Portugal' => { 'https://ftp.eq.uc.pt/software/TeX/' => 1, - 'https://mirrors.up.pt/pub/CTAN/' => 1, }, 'Romania' => { 'https://mirrors.nxthost.com/ctan/' => 1, diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb index 92bf7b0114..41ad694c5b 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb @@ -26,11 +26,11 @@ depend container_split_src_files/1 depend frozen/0 depend minrelease/2016 depend release/2024 -depend revision/72717 +depend revision/72728 name 00texlive.image category TLCore -revision 72692 +revision 72727 shortdesc TeX Live files only in the source repository longdesc The files here are not copied by the installer and containers longdesc are not built for them; they exist only in the source @@ -4965,7 +4965,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd name 00texlive.installer category TLCore -revision 72717 +revision 72728 shortdesc TeX Live standalone installer package longdesc This package defines the files to go into the installer longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the @@ -71239,7 +71239,7 @@ containerchecksum e3802a6b8c5d229be4519f7f717ceb27d68ac5d8d6c566475a39734e919f7a name collection-context category Collection -revision 71879 +revision 72727 shortdesc ConTeXt and packages relocated 1 longdesc Hans Hagen's powerful ConTeXt system, https://pragma-ade.com. @@ -71249,6 +71249,7 @@ depend context depend context-calendar-examples depend context-chat depend context-collating-marks +depend context-companion-fonts depend context-cyrillicnumbers depend context-filter depend context-gnuplot @@ -71268,12 +71269,12 @@ depend context-vim depend context-visualcounter depend jmn depend luajittex -containersize 532 -containerchecksum ce789f2713ee28ab46cf0cbe370fd1e914cd13b749033dfe86509ba44764d07a87f60883f1aca6fb96ef6f3291e9378ff56fbc5873f67040b1af0aecaddfebe5 +containersize 540 +containerchecksum 9e3eaabfef7a7f601551a380fb8c377c773b84151c83033b2466aff45aee63a7313eade10108cf682d73e0c0c288b6d1e30e12ba942776e8ae63fb19893ac963 name collection-fontsextra category Collection -revision 72535 +revision 72727 shortdesc Additional fonts relocated 1 depend aboensis @@ -71367,7 +71368,6 @@ depend comfortaa depend comicneue depend concmath-fonts depend concmath-otf -depend context-companion-fonts depend cookingsymbols depend cooperhewitt depend cormorantgaramond @@ -71642,8 +71642,8 @@ depend yfonts-t1 depend yinit-otf depend ysabeau depend zlmtt -containersize 2084 -containerchecksum 9aa678907bffc04f4e321498ed204114ad3f9eb7c3172fdc0c57a98bc60d1890298685c8d294a096a985046fcd098c239b0dc139ecbc851ad4db4ac9121f14bf +containersize 2072 +containerchecksum 233522e7f8bc9571dae402072ce00c08391cbb2382ca20097bdea100caca52cd6ef8f379cba7bace8fec946658112f951eb2019b43d45df7ec66a1df70f0a648 name collection-fontsrecommended category Collection @@ -107954,7 +107954,7 @@ catalogue-topics notes editorial name easybook category Package -revision 72700 +revision 72725 shortdesc Easily typesetting Chinese theses or books relocated 1 longdesc easybook is a pure academic template created based on the @@ -107965,16 +107965,16 @@ longdesc providing multiple commands and interfaces allows users to longdesc easily customize the thesis template. Its basic macro package longdesc easybase can also be used with CTeX and standard document longdesc classes. -containersize 20260 -containerchecksum 9eaffb57eb8533d2528fc15e61c58ce9b66853cdf4eb2dd8e168ffa3a362324615e1c69b408a74ff976c1a5e132a889988ead7cdb08441791fa9787a204b5b45 -doccontainersize 679640 -doccontainerchecksum cf562320de170b5f77d41f19a748548a3e128db9c77955585dc08321eee776a2a2e5c994d860ca2d5fddcd2205043d82aeaa6619403f11f7ba801f6a2fabcc62 +containersize 20252 +containerchecksum 3a43dc287cb9f55432b57510229b719e65c77bf15b7bdf75ca324bf32a2922e57e4721fc8ee4c6103bb6b6c81d65e4660d98ed8b1c2ffd8d0ce388ecade70a60 +doccontainersize 679632 +doccontainerchecksum 2f325aa5174497cdfa1aa95b57705100953e4094f039aeec68578480525505b17a035a31378626a0d9612b0bc57be5ffca155a41b0b41cb0f2f718ea6be8ec50 docfiles size=188 RELOC/doc/latex/easybook/README.md details="Readme" RELOC/doc/latex/easybook/easybook.pdf details="Package documentation" language="zh" RELOC/doc/latex/easybook/easybook.tex -srccontainersize 20144 -srccontainerchecksum 80e89354e99bf8cf48b5b9194d2f4a497bdfbff433e0468f6b4ac16d1b408d5d022b34e1d75e69997a449b61453e4b6bc5fb4685968f50c6c5f454276c33d155 +srccontainersize 20160 +srccontainerchecksum 3701e895d1ebf0eae94f38865668cfa60c81b943f7cf6c4ca0e01230c7a84415613777dcfe08db8300109aab836d0e1341644b8a347b13dd28f5e89c38eec72e srcfiles size=25 RELOC/source/latex/easybook/easybook.dtx RELOC/source/latex/easybook/easybook.ins @@ -107987,7 +107987,7 @@ catalogue-contact-repository https://gitee.com/texno3/easybook catalogue-ctan /macros/latex/contrib/easybook catalogue-license lppl1.3c catalogue-topics book-pub dissertation class doc-templ chinese expl3 -catalogue-version 2024eu +catalogue-version 2024ex name easydtx category Package @@ -115156,7 +115156,7 @@ catalogue-version 1.2 name eolang category Package -revision 69857 +revision 72724 shortdesc Formulas and graphs for the EO programming language longdesc This LaTeX package helps you write [?] -calculus formulas and longdesc SODG graphs for the EO programming language. @@ -115168,11 +115168,11 @@ depend iexec depend pgf depend pgfopts depend stmaryrd -containersize 9096 -containerchecksum 3581c5da5a97d8158e4fba0d6c6260a39e3b1141dacb63eeba9b4aac26ecf7a8e08bafa9f212bb997527a45a4a45aee051bda0c85e9d9e055a6069b946ccb267 -doccontainersize 1454980 -doccontainerchecksum 6ce37139c0e96fa0516a870e028a80033b878a2651ff36b31e03edfd5f426100eb16513566f6bd970e7b6405baaca65cec31e94e52b453e42b29ff5ee28c6d0d -docfiles size=495 +containersize 8924 +containerchecksum 58d0214df512456616ad835cacdfb4e4ed8da55d1f82dda08ad2a77e4f82dfd428fe89e5c4b2124f7ad16e3097e17ca97dcdb059e47c53302e9c4785ecef55b4 +doccontainersize 1358064 +doccontainerchecksum e2a0f6493feb7d1e06b04791c050637fe3fe37439fed28a31068485139de234b264e798d93fd06e5651a4ffc5a5cf5d4d352c7dee205503bd01a0ff1171d65ca +docfiles size=477 texmf-dist/doc/latex/eolang/DEPENDS.txt texmf-dist/doc/latex/eolang/LICENSE.txt texmf-dist/doc/latex/eolang/README.md details="Readme" @@ -115181,8 +115181,8 @@ docfiles size=495 texmf-dist/doc/latex/eolang/eolang.pdf details="Package documentation" texmf-dist/doc/man/man1/eolang.1 texmf-dist/doc/man/man1/eolang.man1.pdf -srccontainersize 16988 -srccontainerchecksum fb1f8d04a0aeb14a2151304a894fc10c150fedf510427949f2080e94cf124f22f8810a6a39acf884e28ca44357bce6ffab4f8f360e1ead841e59234c44ea68a9 +srccontainersize 16996 +srccontainerchecksum 9bfd779e93fb9e450c9600b1c8153d24db857879b8d628cb98990db1e0d54d408620bf364e7db3e0153dc0366cafe4e12d15f6b6f6f1e926fd8f62a7d894c4f1 srcfiles size=17 texmf-dist/source/latex/eolang/eolang.dtx texmf-dist/source/latex/eolang/eolang.ins @@ -115193,7 +115193,7 @@ catalogue-contact-repository https://github.com/objectionary/eolang.sty catalogue-ctan /macros/latex/contrib/eolang catalogue-license mit catalogue-topics diagram program-doc -catalogue-version 0.18.1 +catalogue-version 0.18.2 name eolang.aarch64-linux category Package @@ -192023,7 +192023,7 @@ catalogue-topics letterspace name letterswitharrows category Package -revision 59993 +revision 72723 shortdesc Draw arrows over math letters relocated 1 longdesc This package provides LaTeX math-mode commands for setting left @@ -192031,19 +192031,20 @@ longdesc and right arrows over mathematical symbols so that the arrows longdesc dynamically scale with the symbols. While it is possible to set longdesc arrows over longer strings of symbols, the focus lies on single longdesc characters. -containersize 3252 -containerchecksum dcfd59b7a51100a4e1d856d3cbc0d4f2ac258e745566b278e275d8ebd0273e7f96fa1431b681d42e10b1c7496596f1ecdd92753b8b58df4fe352c51b9b009bcb -doccontainersize 480964 -doccontainerchecksum a21ff5d9a4c2e409cd7a32207e1e162b263dff46919fdad25bd5fbc1cca86329efebf847ed24ff7401293d8a318bde9fe7fd2c9def69f39740d5e0686c0ab849 -docfiles size=122 +containersize 3392 +containerchecksum aa83d8d3df11c560a7d9e4ef41f9b505b43ace99c94eb7c46cc54af56a66f5f2857718cbae1a297995a9b632c77e27743c917a99b183983b2d7ce4358109c6bb +doccontainersize 468336 +doccontainerchecksum 57225393bbb5ea2032fad4264a1b95583f80fdd32e37d8c5f07eb182eed03de16b4e9ab7f07242f2209f9e08dc6e111f6f4106f8df3f7e7087fcee2aec8a459c +docfiles size=119 RELOC/doc/latex/letterswitharrows/README.txt details="Readme" RELOC/doc/latex/letterswitharrows/letterswitharrows.pdf details="Package documentation" -srccontainersize 5380 -srccontainerchecksum 50e2521b55a238cd6e461b3bcde326c5948573363988bf3bdcc428d04341728dbf73e891d09af65ca1832924cdbd0b0320bd94d662afdf78b3d1039ca3519231 +srccontainersize 5572 +srccontainerchecksum e6a2a07e4caba824d8145599c0b4d09677404ceed566044d53c6a2b0bf83837a54036f0fb973bfcaecf9f4b165cb784b35d29d2530981932f2f115c11c4dfc5f srcfiles size=5 RELOC/source/latex/letterswitharrows/letterswitharrows.dtx runfiles size=3 RELOC/tex/latex/letterswitharrows/letterswitharrows.sty +catalogue-contact-repository https://github.com/max-te/letterswitharrows catalogue-ctan /macros/latex/contrib/letterswitharrows catalogue-license lppl1.3 catalogue-topics maths expl3 pgf-tikz @@ -263896,16 +263897,16 @@ catalogue-version 1.0.2 name pixelarttikz category Package -revision 70964 +revision 72726 shortdesc Work with PixelArts, with TikZ relocated 1 longdesc The package defines commands and an environment for displaying longdesc pixel arts. -containersize 4768 -containerchecksum ec525456932e618735270f098c05b08108524b9e77c66b5a542bb6cae68e4a7e25d2a9efee559dded1c584f1be78b9cd2f78ccc4ae02be3c7159f885fd1bdbf7 -doccontainersize 1286624 -doccontainerchecksum ef091d7df64a57d25b972603c312d957653dcc2db31d56f6d2845adb2bc222daf605df9bc0b9cc665646ba0c0f4943524a98f6f9f312d1ee552325b591fb805d -docfiles size=399 +containersize 4992 +containerchecksum ecbcb639e6663a1b66c44c26e5c210972487f73d390b96a91677a852f5ca1174ab85f06c5aaf397cf4829283fa2b90ac6bd64d23b961767af287139b3426f33e +doccontainersize 1296992 +doccontainerchecksum 74f39bd5ab0291fa3d4ea6ec3f9dc335be091ca4f63d14447cc26c7c0991eac69627f7d3dc60cd9843ae2b79e67b0974ffcd10dc48404a5ee24315e55a062ede +docfiles size=403 RELOC/doc/latex/pixelarttikz/PAkoala.csv RELOC/doc/latex/pixelarttikz/PAsorciere.csv RELOC/doc/latex/pixelarttikz/PAyoda.csv @@ -263917,6 +263918,7 @@ docfiles size=399 RELOC/doc/latex/pixelarttikz/base.csv RELOC/doc/latex/pixelarttikz/cap.csv RELOC/doc/latex/pixelarttikz/test1.csv + RELOC/doc/latex/pixelarttikz/testlist.csv runfiles size=9 RELOC/tex/latex/pixelarttikz/PixelArtTikz.sty catalogue-contact-bugs https://github.com/cpierquet/PixelArtTikz/issues @@ -263924,7 +263926,7 @@ catalogue-contact-repository https://github.com/cpierquet/PixelArtTikz catalogue-ctan /graphics/pgf/contrib/pixelarttikz catalogue-license lppl1.3c catalogue-topics graphics pgf-tikz -catalogue-version 0.1.4 +catalogue-version 0.1.5 name pkfix category Package @@ -271465,7 +271467,7 @@ catalogue-version 1.0 name proflycee category Package -revision 72645 +revision 72722 shortdesc A LaTeX package for French maths teachers in high school relocated 1 longdesc This package provides some commands to help French mathematics @@ -271474,17 +271476,17 @@ longdesc create splines with "derivative control"; longdesc \CalculFormelParametres and \CalculFormelLigne in order to longdesc create an xcas-windows-like; \CodePythonLstFichier to create longdesc code presentation and code execution with pythontex. -containersize 396636 -containerchecksum 256d58efd9f4c835d0a0c1c0a9d8ca842313bcaf919cc1442df94d654e9acb270b5458cb91a9ce8b02634a029e433631fcebb71a018d9484ad681191631ce944 -doccontainersize 2563420 -doccontainerchecksum 1d36f34b73f3ded0b40453c179c0866e9d65b448a432593655c68d488fae1d6aa649d2ee84715112509a2c5a1b237dfaed3f5f7c75293f6caae68999246c2526 -docfiles size=661 +containersize 397156 +containerchecksum 2e554754451b8b73d50727bd2f621ce21b08596d5206eb7271a2364f780f8cd6593aee285ad46c3e58b3643ccfff2c5b4d551c3bd7e735758bbd95cdc9cd8cbc +doccontainersize 2572216 +doccontainerchecksum a58950c48dcdb5c6da7eae4704a33b14954d82089122079685cd5f98500af9e2db9dca1311d6ce3ee95b9c6bf325ba69a7e758ee099bc691b618724755ed5e6d +docfiles size=663 RELOC/doc/latex/proflycee/ProfLycee-doc.pdf details="Package documentation" language="fr" RELOC/doc/latex/proflycee/ProfLycee-docctan.zip RELOC/doc/latex/proflycee/ProfLycee-exemples-pyluatex.pdf details="Examples using pyluatex" language="fr" RELOC/doc/latex/proflycee/ProfLycee-exemples-pythontex.pdf details="Examples using python" language="fr" RELOC/doc/latex/proflycee/README.md details="Readme" -runfiles size=274 +runfiles size=275 RELOC/metapost/proflycee/PfLEspace.mp RELOC/tex/latex/proflycee/ProfLycee-Light.sty RELOC/tex/latex/proflycee/ProfLycee.sty @@ -271531,7 +271533,7 @@ catalogue-contact-repository https://github.com/cpierquet/ProfLycee catalogue-ctan /macros/latex/contrib/proflycee catalogue-license lppl1.3c cc0 cc-by-sa-3 catalogue-topics maths french teaching expl3 pgf-tikz -catalogue-version 3.10e +catalogue-version 3.10f name profmaquette category Package @@ -292122,34 +292124,33 @@ catalogue-topics german legal name rub-kunstgeschichte category Package -revision 72213 +revision 72721 shortdesc A class for the art history institute at Ruhr University Bochum relocated 1 longdesc This package provides a LaTeX class implementing the guidelines longdesc on scientific writing of the art history institute longdesc (Kunstgeschichtliches Institut) at Ruhr University Bochum. -containersize 1596 -containerchecksum f3da2273d073f598e05bbad6416531a9fe34cad44e05f61e63d77d35f772af49fadff994255b5efb2812ae2d8203ba6b974a18985bb2fca8fee07d728504694a -doccontainersize 436836 -doccontainerchecksum 9dfec559a665412c23df13fa97f55671ea7d6f2dd564cecc9e924b2658283dd11cab08f18a59a63990f372770285a63d2b2291a16e77771eae07f9a4ab4dc5bc -docfiles size=117 +containersize 3084 +containerchecksum 7048302ea361e03bc87a8a96acb6baa984da0a781867fd51eececb4b7a0cc10108b03179636ee89edb649a44f5594b9209605017b251271f0ae8f318ed3f08c4 +doccontainersize 482328 +doccontainerchecksum 28dbd642f4aec93428dd8a34e97fb34ec4f77905eab5a6647f7c48e0eab090d94df50e8fcff5bc01cf300a6314594169162b4fabf9ee04e9ec91b86099bd4f0b +docfiles size=128 RELOC/doc/latex/rub-kunstgeschichte/README.md details="Readme" RELOC/doc/latex/rub-kunstgeschichte/rub-kunstgeschichte-example.pdf details="Example document" RELOC/doc/latex/rub-kunstgeschichte/rub-kunstgeschichte-example.tex RELOC/doc/latex/rub-kunstgeschichte/rub-kunstgeschichte.pdf details="Package documentation" -srccontainersize 6156 -srccontainerchecksum 64c3a263a300ee63b747e8ef2a6fedea2b26048b33414a68782dacef0983046b5a6afec671a1188e656325f5ab58948a51f3b444da387b16a069bcf182f134df -srcfiles size=6 +srccontainersize 10244 +srccontainerchecksum d5126854aea6aeae9248f9f32c56df1420e2fb6f936ddbe93197d43039a8d9528b82bd393399d1990bfb38df192f648b996c9bb3bb76d08fa9403707619271d1 +srcfiles size=10 RELOC/source/latex/rub-kunstgeschichte/rub-kunstgeschichte.dtx RELOC/source/latex/rub-kunstgeschichte/rub-kunstgeschichte.ins -runfiles size=1 +runfiles size=3 RELOC/tex/latex/rub-kunstgeschichte/rub-kunstgeschichte.cls -catalogue-contact-bugs https://github.com/rub-kgi/rub-kunstgeschichte-latex/issues catalogue-contact-repository https://github.com/rub-kgi/rub-kunstgeschichte-latex catalogue-ctan /macros/latex/contrib/rub-kunstgeschichte catalogue-license lppl1.3c catalogue-topics class doc-templ std-conform -catalogue-version 0.2.0 +catalogue-version 0.3.0 name rubik category Package @@ -305060,17 +305061,17 @@ catalogue-version 2.8 name spbmark category Package -revision 72710 +revision 72720 shortdesc Customize superscripts and subscripts relocated 1 longdesc This package provides three commands \super, \sub and \supersub longdesc to improve the layout of superscripts and subscripts which can longdesc be adjusted with respect to relative position and format, and longdesc can be used in text and math mode. -containersize 4364 -containerchecksum 0b5523ce2d91bb4a9e283c1ed63c8050cbac3ec9aefa859837b11048e8743f5e125aa432b578f5de5d28453c08fb28fd572fa888248d721b135842167fc94552 -doccontainersize 98976 -doccontainerchecksum ae5cc77b83404bcde2d225cfab44bb513035bff589130882f1b6fc26aebb60cb354fabf29ba1870a1faf8e2bf45516c92280c2221232f2dd6ab341f38cc8ef94 +containersize 4416 +containerchecksum 80145bf0b3874607c946a9362e143c8f83699317158fb842dbfc562a7cb8b62a2bccd61ad2434ad0180d3a179e4bb4461331c89294430486adc1d347a6b038f0 +doccontainersize 99832 +doccontainerchecksum 17567219feed171167178e1e751e3e6cfee91375dfa96136eda7d815645f7cca09a0ff4cc75a72a538ae755ece02b137946244d5a141926d98a4170ff5a7dfa1 docfiles size=31 RELOC/doc/latex/spbmark/README.md details="Readme" RELOC/doc/latex/spbmark/spbmark.pdf details="Package documentation" @@ -305081,7 +305082,7 @@ catalogue-contact-repository https://github.com/texno3/spbmark catalogue-ctan /macros/latex/contrib/spbmark catalogue-license cc-by-4 catalogue-topics subsup-pos expl3 -catalogue-version 1.46r +catalogue-version 1.46t name spectral category Package @@ -330624,7 +330625,7 @@ docfiles size=376 name texlive-scripts category TLCore -revision 72717 +revision 72728 shortdesc TeX Live infrastructure programs longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for longdesc tlmgr to run but still ours. Not included in tlcritical. @@ -330632,11 +330633,11 @@ depend texlive-scripts.ARCH depend texlive.infra execute addMap mathpple.map postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat -containersize 114392 -containerchecksum 02d5c9e8e61ca632a80c397cdb8ec441545342cb84755fb81e1ac2510bc3405255f9ad60b2582d3106945fd760f9f84d8f63fc9aef6162e83bbe886a48960a6b -doccontainersize 438816 -doccontainerchecksum 33490eccb911f3169da04b56760387e60e0ad2fb3505bb46eba6656302fabe89cf466e3b6f123b521092e7eafde7df9748983975d3afe61a3bcaedab85defcf9 -docfiles size=570 +containersize 114408 +containerchecksum 451b3e784802e2272ff534c2ac9167e3b8d8897497b3f2b6f60e2b3baa302143d6c5cef2cd914a7d4c2afe86177cc2137a3e127a10abe5c7004b559ad6a942e7 +doccontainersize 439404 +doccontainerchecksum 05a09c14de98e95ccf06473d7eb6e300adfe68324a32fd4d730554245d016511333c03ebfbe93cb3b0b992e0e105fce825bdb17b99a33ec27c432b34be113042 +docfiles size=572 doc.html texmf-dist/doc/man/man1/fmtutil-sys.1 texmf-dist/doc/man/man1/fmtutil-sys.man1.pdf @@ -349317,16 +349318,16 @@ catalogue-version 1.3a name tutodoc category Package -revision 72696 +revision 72719 shortdesc Typeset tutorial-like documentations relocated 1 longdesc This package provides some macros to write documentation of longdesc LaTeX packages in a tutorial style. -containersize 10800 -containerchecksum 611753b7c31159589cbc77d45531be9ca48fdcdba5e739876d6b2031a40739a3e549fbe6fd4014d8342839371161bc402cbdf464fbc7f385866ec34703b39008 -doccontainersize 1941896 -doccontainerchecksum b288269efe793d355e0f4c01d98deb1e53e2b4f73852ef563beb5b1ea2b947a742e8c684472ddcf6e38479d82f7f36f59f9e8b99bc898df83e203adf4a5d04a5 -docfiles size=583 +containersize 11376 +containerchecksum 1c6aad42c588ce749f5896300de50023a0d1639b3892901034ace4c36e9073278964f44eca00262bf3a691d035dd130eb1c3d48d64f5a5d33bff686f9a2ca81c +doccontainersize 1888144 +doccontainerchecksum 0ffcaeb43412132ce884b3d9ed12004df31bb6713decf77772e0f1c41dbab85e9b343f177e8d536ee70357e01ada831bf5f536de8388e9126ebc9ebefa7a685d +docfiles size=572 RELOC/doc/latex/tutodoc/MANIFEST.md RELOC/doc/latex/tutodoc/README.md details="Readme" RELOC/doc/latex/tutodoc/tutodoc-en.pdf details="Package documentation" language="en" @@ -349362,7 +349363,7 @@ catalogue-contact-repository https://github.com/bc-tools/for-latex catalogue-ctan /macros/latex/contrib/tutodoc catalogue-license gpl3 catalogue-topics doc-tool expl3 -catalogue-version 1.6.1 +catalogue-version 1.6.2 name twemoji-colr category Package diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 index e93f5a5bda..123bbea295 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 @@ -1 +1 @@ -910da2b458709c8be77b6d7e7947ffd6 texlive.tlpdb +9feff8e7a14a3ec7538d11a556907055 texlive.tlpdb diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 index 15db20ca00..ec11a9df51 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 @@ -1 +1 @@ -a017de2196008dc66deb5a107b4c29f33b7099e4f6d37b23387de40b1a077ff4f8dff9ba36dce4d3db8143988121e6d1468a544bbb2f531a2c4285f5852378ce texlive.tlpdb +5a61308ff2762abb58f2eff4d298893e393d66493bd5cbfc3341371d870eb52736b1286518578a83cab3d0c2360c4be2b3ffbf2a2617c3f0487c5d5165b0e241 texlive.tlpdb diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc index 4873335839..e6f6491369 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmci044ACgkQTOGHfhlD -jHABfgf/aGCyF/jN0nAFoQi0Uke03GKiTlW9Abjvzp+V4GpbL7tjtWVrKEofgAXI -Zm6BvrpCtsjlMUZVAp/Yz1kNP0CiDQgDpISduRwZUBpIbHRw+oYPfZgJY/xYNE+p -ZeMJLAQYzU5q1E0MM/TrsTOPNt8PN1miK2C+1p+g/0D9Xd7SOT5OBG4Uwgh2BiC7 -o31i2KBCEkBRU1ijnF8WrsauPGix2Y/E8VDq3VE7/l4YZLdp56m5zNRXJuSnUUjI -59Ih6InTiXZPP04/ZdmB6aATc8PbcmKkuqKx+4zZ+AmxAamqnQfZwwfnrtfptW7S -SOC78td66wVqfUvGP7AdnlIUGFgQRw== -=chnR +iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmckJhUACgkQTOGHfhlD +jHA2CwgAvibTwaZqKUwxyDwSJylHHMJgQBDH56TNQW3ATsDXuVoZ20QlYYpYhsxd +hg399cRBiu73GuZEwY7zXQsp/7hfSuaXB4OSUdHBQ6rkmWyOSHQ15x7i5F0qQqAR +ipHCQlgqkxL/oFcW1Mrc2bNe/YRR+MKO05cqSlJv1VtVY/MyQ3KNkhx7ABpMS9Hu +1ZB/zd9+YK4OzrHjJF87kRh8E1wpuyMeMX2r2cgv3hmZUkm9mJJWSsD1kJmA4RA/ +j6dqqZBbfeq6TmtT8DI1XZFV5qXQUgd8Bn6bcSTRCFwKgjaOhJl58fQ0CYHrV3HO +L9sT7NMo1oKL7q98IxCU28mlgmJkRQ== +=7U// -----END PGP SIGNATURE----- diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz Binary files differindex 4ab69f188c..1cfe3a4184 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz @@ -2,4 +2,4 @@ # The source CTAN of this site's material: irony.dante.de # The year-month-day-hour-minute of this site's material: -2024-11-01-02-02 +2024-11-02-02-02 |