diff options
author | Norbert Preining <norbert@preining.info> | 2024-02-15 03:01:30 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-02-15 03:01:30 +0000 |
commit | 5b6839a58ea5468b40ebd52b579e680b8e62ff13 (patch) | |
tree | 1dfc09f53794115129a07bf566b466cc337606f5 | |
parent | a90336c3069c198b41b7b6eb76e3389610ad5eb7 (diff) |
CTAN sync 202402150301
589 files changed, 17703 insertions, 8581 deletions
diff --git a/FILES.byname b/FILES.byname index 347340e639..45280b76a9 100644 --- a/FILES.byname +++ b/FILES.byname @@ -632,14 +632,14 @@ 1992/07/20 | 484 | biblio/bibtex/contrib/examples/xampl-siam.ltx 1992/07/20 | 488 | biblio/bibtex/contrib/examples/xampl-unsrt.ltx 2005/09/29 | 22158 | biblio/bibtex/contrib/examples.zip -2023/10/28 | 864 | biblio/bibtex/contrib/francais-bst/francaisbst.dbj +2024/02/14 | 864 | biblio/bibtex/contrib/francais-bst/francaisbst.dbj 2023/10/28 | 1466 | biblio/bibtex/contrib/francais-bst/francais-bst.ins -2023/10/28 | 244927 | biblio/bibtex/contrib/francais-bst/francais-bst.mbs -2023/10/28 | 43186 | biblio/bibtex/contrib/francais-bst/francais-bst.pdf -2023/10/28 | 18612 | biblio/bibtex/contrib/francais-bst/francais.dbj -2023/10/28 | 18618 | biblio/bibtex/contrib/francais-bst/francaissc.dbj -2023/10/28 | 5530 | biblio/bibtex/contrib/francais-bst/README.md -2023/10/29 | 114641 | biblio/bibtex/contrib/francais-bst.zip +2024/02/14 | 244660 | biblio/bibtex/contrib/francais-bst/francais-bst.mbs +2024/02/14 | 43765 | biblio/bibtex/contrib/francais-bst/francais-bst.pdf +2024/02/14 | 18612 | biblio/bibtex/contrib/francais-bst/francais.dbj +2024/02/14 | 18618 | biblio/bibtex/contrib/francais-bst/francaissc.dbj +2024/02/14 | 5533 | biblio/bibtex/contrib/francais-bst/README.md +2024/02/14 | 115236 | biblio/bibtex/contrib/francais-bst.zip 2022/10/06 | 8217 | biblio/bibtex/contrib/gbt7714/CHANGELOG.md 2022/10/06 | 126 | biblio/bibtex/contrib/gbt7714/DEPENDS.txt 2022/10/06 | 120983 | biblio/bibtex/contrib/gbt7714/gbt7714.dtx @@ -2077,12 +2077,12 @@ 2023/10/05 | 1710 | biblio/citation-style-language/README.md 2023/10/05 | 12878 | biblio/citation-style-language/vancouver.csl 2023/10/05 | 4531754 | biblio/citation-style-language.zip -2024/02/13 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2024/02/14 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx -2024/02/13 | 2846767 | biblio/ctan-bibdata/ctan.bib -2024/02/13 | 3708800 | biblio/ctan-bibdata/ctan.pdf +2024/02/14 | 2847464 | biblio/ctan-bibdata/ctan.bib +2024/02/14 | 3708800 | biblio/ctan-bibdata/ctan.pdf 2023/01/16 | 1489 | biblio/ctan-bibdata/README -2024/02/13 | 4117312 | biblio/ctan-bibdata.zip +2024/02/14 | 4117477 | 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 @@ -2239,7 +2239,7 @@ 1989/12/11 | 6196 | biblio/tib/tib.man 1989/03/29 | 23265 | biblio/tib/vitaMake 2005/12/15 | 366385 | biblio/tib.zip -2024/01/21 | 18185 | CTAN.sites +2024/02/14 | 18102 | CTAN.sites 1990/10/03 | 5032 | dviware/beebe/00readme.txt 1990/10/03 | 479 | dviware/beebe/doc/00dir.cmd 1990/10/03 | 1209 | dviware/beebe/doc/00dir.lst @@ -5444,7 +5444,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/02/13 | 69020 | FILES.last07days +2024/02/14 | 78421 | 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 @@ -172590,24 +172590,24 @@ 2023/05/28 | 3520 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Ar.tex 2023/05/28 | 14932 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_blocksfamilies.tex 2022/10/08 | 11905 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_buildCelll.tex -2023/02/06 | 17003 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex +2024/02/13 | 17497 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex 2023/05/28 | 5034 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_CS.tex 2023/05/28 | 1415 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DarkMode.tex -2023/05/28 | 5301 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex +2024/02/13 | 5302 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex 2023/02/20 | 6597 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DesignCS.tex 2023/05/28 | 1296 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_DiscY.tex -2023/05/28 | 1880 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex -2023/02/19 | 12752 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex -2023/05/28 | 10410 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex -2023/05/27 | 22864 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex +2024/02/13 | 1923 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex +2024/02/13 | 12785 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex +2024/02/14 | 10404 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex +2024/02/13 | 24731 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex 2023/05/28 | 26973 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_libCS.tex 2023/05/28 | 6076 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_ls.tex -2023/05/28 | 3058 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex +2024/02/11 | 3060 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex 2023/05/28 | 11360 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_OtherCont.tex -2023/05/28 | 5240 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex +2024/02/13 | 5241 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex 2023/05/28 | 12075 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_TitleLegend.tex 2023/05/28 | 10380 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_variations.tex -2023/05/28 | 3905 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex +2024/02/13 | 3906 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex 2022/07/13 | 117440 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_color.pdf 2022/07/13 | 182133 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_colorPicker.pdf 2022/07/12 | 39130 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_general.pdf @@ -172616,29 +172616,37 @@ 2022/07/14 | 115111 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_saveTrailing.pdf 2022/07/13 | 101948 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_set.pdf 2022/07/14 | 117480 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTcolorSchemes_html_trailing.pdf -2023/05/31 | 25778 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex -2023/05/30 | 7248 | graphics/pgf/contrib/pgf-periodictable/myGroupColors.tex +2024/02/13 | 53190 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf +2024/02/13 | 75547 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf +2024/02/11 | 1393 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf +2024/02/11 | 25812 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex +2024/02/13 | 25278 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf +2024/02/13 | 37950 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf +2024/02/11 | 31545 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf +2024/02/11 | 49262 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf +2024/02/13 | 32124 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf +2024/02/14 | 7248 | graphics/pgf/contrib/pgf-periodictable/myGroupColors.tex 2022/10/11 | 87 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.ist -2023/05/30 | 6952517 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf -2023/05/28 | 12409 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex -2023/05/28 | 188338 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty +2024/02/14 | 7456869 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf +2024/02/14 | 20122 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex +2024/02/11 | 208031 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty 2023/02/06 | 21041 | graphics/pgf/contrib/pgf-periodictable/pgfPT.backcolors.keys.tex -2022/10/10 | 19890 | graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex +2024/02/14 | 19892 | graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex 2022/10/10 | 46858 | graphics/pgf/contrib/pgf-periodictable/pgfPTcolorSchemes.html 2022/09/02 | 111753 | graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.pdf 2022/10/10 | 358 | graphics/pgf/contrib/pgf-periodictable/pgfPT.colorSchemes.info.tex 2022/10/10 | 9698 | graphics/pgf/contrib/pgf-periodictable/pgfPT.coordinates.tex -2022/11/07 | 76915 | graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex -2023/02/19 | 76093 | graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex +2024/02/10 | 77977 | graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex +2024/02/11 | 76664 | graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex 2022/11/01 | 8883 | graphics/pgf/contrib/pgf-periodictable/pgfPT.formatNumbers.tex 2023/04/02 | 2322 | graphics/pgf/contrib/pgf-periodictable/pgfPT.input.library.tex -2023/05/27 | 28189 | graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex +2024/02/10 | 30959 | graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex 2023/02/25 | 76975 | graphics/pgf/contrib/pgf-periodictable/pgfPT.library.colorschemes.tex -2023/05/27 | 14569 | graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex -2022/11/01 | 8571 | graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex +2024/02/10 | 17776 | graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex +2024/02/12 | 8844 | graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex 2020/08/16 | 1682 | graphics/pgf/contrib/pgf-periodictable/pgfPT_radio_symbol.pdf 2022/10/10 | 888 | graphics/pgf/contrib/pgf-periodictable/pgfPT_radio_symbol.tex -2023/05/30 | 1884 | graphics/pgf/contrib/pgf-periodictable/README +2024/02/14 | 2778 | graphics/pgf/contrib/pgf-periodictable/README 2022/03/03 | 11004 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec10.pdf 2022/03/03 | 9761 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec11.pdf 2022/03/03 | 9924 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec12.pdf @@ -172736,7 +172744,9 @@ 2022/03/03 | 9908 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec98.pdf 2022/03/03 | 9805 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec99.pdf 2022/03/03 | 10358 | graphics/pgf/contrib/pgf-periodictable/spectra/pgfPT_spec9.pdf -2023/05/31 | 6911467 | graphics/pgf/contrib/pgf-periodictable.zip +2024/02/10 | 10424 | graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex +2024/02/10 | 8133 | graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex +2024/02/14 | 7653968 | graphics/pgf/contrib/pgf-periodictable.zip 2022/06/15 | 426 | graphics/pgf/contrib/pgf-pie/COPYING 2022/06/15 | 104 | graphics/pgf/contrib/pgf-pie/demo/before-after-number.tex 2022/06/15 | 150 | graphics/pgf/contrib/pgf-pie/demo/change-direction.tex @@ -206413,7 +206423,7 @@ 2023/09/30 | 894643 | info/yet-another-guide-latex2e/Yet-Another-Guide-LaTeX2e_v12.pdf 2023/09/30 | 143740 | info/yet-another-guide-latex2e/Yet-Another-Guide-LaTeX2e_v12.tex 2023/10/16 | 902397 | info/yet-another-guide-latex2e.zip -2023/10/28 | 132498 | install/biblio/bibtex/contrib/francais-bst.tds.zip +2024/02/14 | 133094 | install/biblio/bibtex/contrib/francais-bst.tds.zip 2021/02/04 | 4944311 | install/biblio/bibtex/contrib/gost.tds.zip 2023/10/05 | 4539322 | install/biblio/citation-style-language.tds.zip 2022/10/28 | 795249 | install/fonts/accanthis.tds.zip @@ -206766,8 +206776,8 @@ 2024/01/04 | 949878 | install/macros/latex/contrib/l3backend.tds.zip 2024/02/08 | 829326 | install/macros/latex/contrib/l3build.tds.zip 2024/01/04 | 4059172 | install/macros/latex/contrib/l3experimental.tds.zip -2024/01/22 | 14204630 | install/macros/latex/contrib/l3kernel.tds.zip -2023/10/10 | 2257270 | install/macros/latex/contrib/l3packages.tds.zip +2024/02/13 | 14314783 | install/macros/latex/contrib/l3kernel.tds.zip +2024/02/13 | 1758079 | install/macros/latex/contrib/l3packages.tds.zip 2023/10/14 | 606244 | install/macros/latex/contrib/lastpage.tds.zip 2009/09/02 | 556672 | install/macros/latex/contrib/layouts.tds.zip 2008/07/25 | 125603 | install/macros/latex/contrib/lcyw.tds.zip @@ -206914,12 +206924,12 @@ 2020/04/09 | 806385 | install/macros/latex/contrib/zhlipsum.tds.zip 2022/07/14 | 321454 | install/macros/latex/contrib/zhnumber.tds.zip 2023/11/14 | 1622886 | install/macros/latex/contrib/zref-clever.tds.zip -2023/11/01 | 43672902 | install/macros/latex-dev/latex-base-dev.tds.zip +2024/02/14 | 44296835 | install/macros/latex-dev/latex-base-dev.tds.zip 2023/11/01 | 2795764 | install/macros/latex-dev/required/latex-amsmath-dev.tds.zip 2023/11/01 | 268960 | install/macros/latex-dev/required/latex-firstaid-dev.tds.zip 2023/11/01 | 3112054 | install/macros/latex-dev/required/latex-graphics-dev.tds.zip -2023/11/01 | 11456206 | install/macros/latex-dev/required/latex-lab-dev.tds.zip -2023/11/01 | 7343701 | install/macros/latex-dev/required/latex-tools-dev.tds.zip +2024/02/14 | 12314341 | install/macros/latex-dev/required/latex-lab-dev.tds.zip +2024/02/14 | 7679515 | install/macros/latex-dev/required/latex-tools-dev.tds.zip 2024/01/15 | 43672614 | install/macros/latex/latex-base.tds.zip 2020/06/01 | 1578753 | install/macros/latex/required/amscls.tds.zip 2024/02/07 | 3720932 | install/macros/latex/required/babel-base.tds.zip @@ -215218,16 +215228,16 @@ 2015/04/18 | 4795 | macros/generic/lpform/lpform.sty 2014/07/14 | 902 | macros/generic/lpform/README 2015/04/18 | 271086 | macros/generic/lpform.zip -2022/10/24 | 1389 | macros/generic/lt3luabridge/docstrip.cfg -2022/10/24 | 181 | macros/generic/lt3luabridge/example.context -2022/10/24 | 217 | macros/generic/lt3luabridge/example.latex -2022/10/24 | 167 | macros/generic/lt3luabridge/example.plaintex -2022/10/24 | 19105 | macros/generic/lt3luabridge/LICENSE -2022/10/24 | 14380 | macros/generic/lt3luabridge/lt3luabridge.dtx -2022/10/24 | 253 | macros/generic/lt3luabridge/lt3luabridge.ins -2022/10/24 | 494475 | macros/generic/lt3luabridge/lt3luabridge.pdf -2022/10/24 | 896 | macros/generic/lt3luabridge/README.md -2022/10/24 | 492236 | macros/generic/lt3luabridge.zip +2024/02/14 | 1389 | macros/generic/lt3luabridge/docstrip.cfg +2024/02/14 | 181 | macros/generic/lt3luabridge/example.context +2024/02/14 | 217 | macros/generic/lt3luabridge/example.latex +2024/02/14 | 167 | macros/generic/lt3luabridge/example.plaintex +2024/02/14 | 19105 | macros/generic/lt3luabridge/LICENSE +2024/02/14 | 14878 | macros/generic/lt3luabridge/lt3luabridge.dtx +2024/02/14 | 253 | macros/generic/lt3luabridge/lt3luabridge.ins +2024/02/14 | 497075 | macros/generic/lt3luabridge/lt3luabridge.pdf +2024/02/14 | 896 | macros/generic/lt3luabridge/README.md +2024/02/14 | 494613 | macros/generic/lt3luabridge.zip 2023/12/04 | 66238 | macros/generic/ltxcmds/ltxcmds.dtx 2023/12/04 | 419825 | macros/generic/ltxcmds/ltxcmds.pdf 2023/12/04 | 379 | macros/generic/ltxcmds/README.md @@ -233096,17 +233106,17 @@ 2008/06/01 | 200380 | macros/latex/contrib/envlab/envlab.pdf 1997/07/16 | 3824 | macros/latex/contrib/envlab/readme.v12 2008/06/02 | 372141 | macros/latex/contrib/envlab.zip -2024/01/11 | 47687 | macros/latex/contrib/eolang/cactus.pdf -2024/01/11 | 488 | macros/latex/contrib/eolang/DEPENDS.txt -2024/01/11 | 741 | macros/latex/contrib/eolang/eolang.1 -2024/01/11 | 641 | macros/latex/contrib/eolang/eolang.bib -2024/01/11 | 62101 | macros/latex/contrib/eolang/eolang.dtx -2024/01/11 | 2628 | macros/latex/contrib/eolang/eolang.ins -2024/01/11 | 1940589 | macros/latex/contrib/eolang/eolang.pdf -2024/01/11 | 4954 | macros/latex/contrib/eolang/eolang.pl -2024/01/11 | 1083 | macros/latex/contrib/eolang/LICENSE.txt -2024/01/11 | 1300 | macros/latex/contrib/eolang/README.md -2024/01/11 | 1940069 | macros/latex/contrib/eolang.zip +2024/02/14 | 47687 | macros/latex/contrib/eolang/cactus.pdf +2024/02/14 | 488 | macros/latex/contrib/eolang/DEPENDS.txt +2024/02/14 | 741 | macros/latex/contrib/eolang/eolang.1 +2024/02/14 | 641 | macros/latex/contrib/eolang/eolang.bib +2024/02/14 | 62209 | macros/latex/contrib/eolang/eolang.dtx +2024/02/14 | 2628 | macros/latex/contrib/eolang/eolang.ins +2024/02/14 | 1940560 | macros/latex/contrib/eolang/eolang.pdf +2024/02/14 | 4981 | macros/latex/contrib/eolang/eolang.pl +2024/02/14 | 1083 | macros/latex/contrib/eolang/LICENSE.txt +2024/02/14 | 1315 | macros/latex/contrib/eolang/README.md +2024/02/14 | 1940056 | macros/latex/contrib/eolang.zip 1991/01/31 | 1291 | macros/latex/contrib/epic/epic.readme 2009/07/09 | 25846 | macros/latex/contrib/epic/epic.sty 1991/01/31 | 2444 | macros/latex/contrib/epic/misc.sty @@ -237876,14 +237886,14 @@ 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 -2023/09/21 | 677 | macros/latex/contrib/huawei/DEPENDS.txt -2023/09/21 | 253724 | macros/latex/contrib/huawei/huawei-cover-picture.pdf -2023/09/21 | 33619 | macros/latex/contrib/huawei/huawei.dtx -2023/09/21 | 2626 | macros/latex/contrib/huawei/huawei.ins -2023/09/21 | 808894 | macros/latex/contrib/huawei/huawei.pdf -2023/09/21 | 1083 | macros/latex/contrib/huawei/LICENSE.txt -2023/09/21 | 1513 | macros/latex/contrib/huawei/README.md -2023/09/21 | 1051550 | macros/latex/contrib/huawei.zip +2024/02/14 | 677 | macros/latex/contrib/huawei/DEPENDS.txt +2024/02/14 | 253724 | macros/latex/contrib/huawei/huawei-cover-picture.pdf +2024/02/14 | 33660 | macros/latex/contrib/huawei/huawei.dtx +2024/02/14 | 2626 | macros/latex/contrib/huawei/huawei.ins +2024/02/14 | 809033 | macros/latex/contrib/huawei/huawei.pdf +2024/02/14 | 1083 | macros/latex/contrib/huawei/LICENSE.txt +2024/02/14 | 1632 | macros/latex/contrib/huawei/README.md +2024/02/14 | 1051694 | macros/latex/contrib/huawei.zip 2022/10/16 | 327838 | macros/latex/contrib/huaz/huaz.pdf 2022/10/16 | 20294 | macros/latex/contrib/huaz/huaz.sty 2022/10/16 | 21740 | macros/latex/contrib/huaz/huaz.tex @@ -239991,11 +240001,11 @@ 2023/12/14 | 163 | macros/latex/contrib/jnuexam/exam-b-answer.tex 2023/12/18 | 95796 | macros/latex/contrib/jnuexam/exam-b-empty.pdf 2020/11/12 | 163 | macros/latex/contrib/jnuexam/exam-b-empty.tex -2023/12/18 | 44500 | macros/latex/contrib/jnuexam/jnuexam.cls +2024/02/02 | 44517 | macros/latex/contrib/jnuexam/jnuexam.cls 2023/12/18 | 81144 | macros/latex/contrib/jnuexam/jnuexam.pdf 2023/12/14 | 13581 | macros/latex/contrib/jnuexam/jnuexam.tex 2023/12/18 | 176 | macros/latex/contrib/jnuexam/README -2023/12/18 | 500901 | macros/latex/contrib/jnuexam.zip +2024/02/14 | 500903 | macros/latex/contrib/jnuexam.zip 2022/09/24 | 437856 | macros/latex/contrib/jobname-suffix/jobname-suffix.pdf 2022/09/24 | 3170 | macros/latex/contrib/jobname-suffix/jobname-suffix.sty 2022/09/24 | 7142 | macros/latex/contrib/jobname-suffix/jobname-suffix.tex @@ -240745,136 +240755,134 @@ 2024/01/04 | 1624 | macros/latex/contrib/l3experimental/xgalley.ins 2024/01/04 | 299509 | macros/latex/contrib/l3experimental/xgalley.pdf 2024/01/05 | 4023424 | macros/latex/contrib/l3experimental.zip -2024/01/22 | 56750 | macros/latex/contrib/l3kernel/CHANGELOG.md -2024/01/22 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx -2024/01/22 | 623299 | macros/latex/contrib/l3kernel/expl3.pdf -2024/01/22 | 1776513 | macros/latex/contrib/l3kernel/interface3.pdf -2024/01/22 | 2077 | macros/latex/contrib/l3kernel/interface3.tex -2024/01/22 | 135335 | macros/latex/contrib/l3kernel/l3basics.dtx -2024/01/22 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx -2024/01/22 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx -2024/01/22 | 87746 | macros/latex/contrib/l3kernel/l3box.dtx -2024/01/22 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx -2024/01/22 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx -2024/01/22 | 88106 | macros/latex/contrib/l3kernel/l3coffins.dtx -2024/01/22 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx -2024/01/22 | 43808 | macros/latex/contrib/l3kernel/l3debug.dtx -2024/01/22 | 24519 | macros/latex/contrib/l3kernel/l3deprecation.dtx -2024/01/22 | 158926 | macros/latex/contrib/l3kernel/l3doc.dtx -2024/01/22 | 564281 | macros/latex/contrib/l3kernel/l3doc.pdf -2024/01/22 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx -2024/01/22 | 150985 | macros/latex/contrib/l3kernel/l3docstrip.pdf -2024/01/22 | 88671 | macros/latex/contrib/l3kernel/l3expan.dtx -2024/01/22 | 144331 | macros/latex/contrib/l3kernel/l3file.dtx -2024/01/22 | 14100 | macros/latex/contrib/l3kernel/l3flag.dtx -2024/01/22 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx -2024/01/22 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx -2024/01/22 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx -2024/01/22 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx -2024/01/22 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx -2024/01/22 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx -2024/01/22 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx -2024/01/22 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx -2024/01/22 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx -2024/01/22 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx -2024/01/22 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx -2024/01/22 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx -2024/01/22 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx -2024/01/22 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx -2024/01/22 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx -2024/01/22 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx -2024/01/22 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx -2024/01/22 | 6393 | macros/latex/contrib/l3kernel/l3.ins -2024/01/22 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx -2024/01/22 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx -2024/01/22 | 27481 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx -2024/01/22 | 130498 | macros/latex/contrib/l3kernel/l3keys.dtx -2024/01/22 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx -2024/01/22 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx -2024/01/22 | 82300 | macros/latex/contrib/l3kernel/l3msg.dtx -2024/01/22 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx -2024/01/22 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf -2024/01/22 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex -2024/01/22 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf -2024/01/22 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex -2024/01/22 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf -2024/01/22 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex -2024/01/22 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf -2024/01/22 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex -2024/01/22 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf -2024/01/22 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex -2024/01/22 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf -2024/01/22 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex -2024/01/22 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf -2024/01/22 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex -2024/01/22 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf -2024/01/22 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex -2024/01/22 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf -2024/01/22 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex -2024/01/22 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf -2024/01/22 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex -2024/01/22 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf -2024/01/22 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex -2024/01/22 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf -2024/01/22 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex -2024/01/22 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf -2024/01/22 | 4890 | macros/latex/contrib/l3kernel/l3news.tex -2024/01/22 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx -2024/01/22 | 48220 | macros/latex/contrib/l3kernel/l3prefixes.csv -2024/01/22 | 82696 | macros/latex/contrib/l3kernel/l3prefixes.pdf -2024/01/22 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex -2024/01/22 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx -2024/01/22 | 60374 | macros/latex/contrib/l3kernel/l3prop.dtx -2024/01/22 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx -2024/01/22 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx -2024/01/22 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx -2024/01/22 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx -2024/01/22 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx -2024/01/22 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx -2024/01/22 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx -2024/01/22 | 296657 | macros/latex/contrib/l3kernel/l3styleguide.pdf -2024/01/22 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex -2024/01/22 | 242421 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf -2024/01/22 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex -2024/01/22 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx -2024/01/22 | 218315 | macros/latex/contrib/l3kernel/l3term-glossary.pdf -2024/01/22 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex -2024/01/22 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx -2024/01/22 | 48953 | macros/latex/contrib/l3kernel/l3text.dtx -2024/01/22 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx -2024/01/22 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx -2024/01/22 | 64034 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx -2024/01/22 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx -2024/01/22 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx -2024/01/22 | 116345 | macros/latex/contrib/l3kernel/l3token.dtx -2024/01/22 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx -2024/01/22 | 3078 | macros/latex/contrib/l3kernel/README.md -2024/01/22 | 24757 | macros/latex/contrib/l3kernel/source3body.tex -2024/01/22 | 7488727 | macros/latex/contrib/l3kernel/source3.pdf -2024/01/22 | 2282 | macros/latex/contrib/l3kernel/source3.tex -2024/01/22 | 13939563 | macros/latex/contrib/l3kernel.zip -2023/10/10 | 7555 | macros/latex/contrib/l3packages/CHANGELOG.md -2023/10/10 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex -2023/10/10 | 12312 | macros/latex/contrib/l3packages/l3keys2e.dtx -2023/10/10 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins -2023/10/10 | 412557 | macros/latex/contrib/l3packages/l3keys2e.pdf -2023/10/10 | 3463 | macros/latex/contrib/l3packages/README.md -2023/10/10 | 7374 | macros/latex/contrib/l3packages/xfp.dtx -2023/10/10 | 1191 | macros/latex/contrib/l3packages/xfp.ins -2023/10/10 | 332260 | macros/latex/contrib/l3packages/xfp.pdf -2023/10/10 | 39366 | macros/latex/contrib/l3packages/xfrac.dtx -2023/10/10 | 1306 | macros/latex/contrib/l3packages/xfrac.ins -2023/10/10 | 482959 | macros/latex/contrib/l3packages/xfrac.pdf -2023/10/10 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty -2023/10/10 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty -2023/10/10 | 59625 | macros/latex/contrib/l3packages/xparse.dtx -2023/10/10 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex -2023/10/10 | 1272 | macros/latex/contrib/l3packages/xparse.ins -2023/10/10 | 534533 | macros/latex/contrib/l3packages/xparse.pdf -2023/10/10 | 100838 | macros/latex/contrib/l3packages/xtemplate.dtx -2023/10/10 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins -2023/10/10 | 450604 | macros/latex/contrib/l3packages/xtemplate.pdf -2023/10/10 | 2238289 | macros/latex/contrib/l3packages.zip +2024/02/13 | 57438 | macros/latex/contrib/l3kernel/CHANGELOG.md +2024/02/13 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx +2024/02/13 | 610363 | macros/latex/contrib/l3kernel/expl3.pdf +2024/02/13 | 1792513 | macros/latex/contrib/l3kernel/interface3.pdf +2024/02/13 | 1949 | macros/latex/contrib/l3kernel/interface3.tex +2024/02/13 | 137539 | macros/latex/contrib/l3kernel/l3basics.dtx +2024/02/13 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx +2024/02/13 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx +2024/02/13 | 87749 | macros/latex/contrib/l3kernel/l3box.dtx +2024/02/13 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx +2024/02/13 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx +2024/02/13 | 88241 | macros/latex/contrib/l3kernel/l3coffins.dtx +2024/02/13 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx +2024/02/13 | 41847 | macros/latex/contrib/l3kernel/l3debug.dtx +2024/02/13 | 24987 | macros/latex/contrib/l3kernel/l3deprecation.dtx +2024/02/13 | 159767 | macros/latex/contrib/l3kernel/l3doc.dtx +2024/02/13 | 565282 | macros/latex/contrib/l3kernel/l3doc.pdf +2024/02/13 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx +2024/02/13 | 151264 | macros/latex/contrib/l3kernel/l3docstrip.pdf +2024/02/13 | 88794 | macros/latex/contrib/l3kernel/l3expan.dtx +2024/02/13 | 144214 | macros/latex/contrib/l3kernel/l3file.dtx +2024/02/13 | 14100 | macros/latex/contrib/l3kernel/l3flag.dtx +2024/02/13 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx +2024/02/13 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx +2024/02/13 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx +2024/02/13 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx +2024/02/13 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx +2024/02/13 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx +2024/02/13 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx +2024/02/13 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx +2024/02/13 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx +2024/02/13 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx +2024/02/13 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx +2024/02/13 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx +2024/02/13 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx +2024/02/13 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx +2024/02/13 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx +2024/02/13 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx +2024/02/13 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx +2024/02/13 | 6393 | macros/latex/contrib/l3kernel/l3.ins +2024/02/13 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx +2024/02/13 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx +2024/02/13 | 29836 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx +2024/02/13 | 130500 | macros/latex/contrib/l3kernel/l3keys.dtx +2024/02/13 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx +2024/02/13 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx +2024/02/13 | 82874 | macros/latex/contrib/l3kernel/l3msg.dtx +2024/02/13 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx +2024/02/13 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf +2024/02/13 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex +2024/02/13 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf +2024/02/13 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex +2024/02/13 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf +2024/02/13 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex +2024/02/13 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf +2024/02/13 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex +2024/02/13 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf +2024/02/13 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex +2024/02/13 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf +2024/02/13 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex +2024/02/13 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf +2024/02/13 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex +2024/02/13 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf +2024/02/13 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex +2024/02/13 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf +2024/02/13 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex +2024/02/13 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf +2024/02/13 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex +2024/02/13 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf +2024/02/13 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex +2024/02/13 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf +2024/02/13 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex +2024/02/13 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf +2024/02/13 | 4890 | macros/latex/contrib/l3kernel/l3news.tex +2024/02/13 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx +2024/02/13 | 48372 | macros/latex/contrib/l3kernel/l3prefixes.csv +2024/02/13 | 82731 | macros/latex/contrib/l3kernel/l3prefixes.pdf +2024/02/13 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex +2024/02/13 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx +2024/02/13 | 103074 | macros/latex/contrib/l3kernel/l3prop.dtx +2024/02/13 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx +2024/02/13 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx +2024/02/13 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx +2024/02/13 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx +2024/02/13 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx +2024/02/13 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx +2024/02/13 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx +2024/02/13 | 296657 | macros/latex/contrib/l3kernel/l3styleguide.pdf +2024/02/13 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex +2024/02/13 | 231496 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf +2024/02/13 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex +2024/02/13 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx +2024/02/13 | 242296 | macros/latex/contrib/l3kernel/l3term-glossary.pdf +2024/02/13 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex +2024/02/13 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx +2024/02/13 | 48900 | macros/latex/contrib/l3kernel/l3text.dtx +2024/02/13 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx +2024/02/13 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx +2024/02/13 | 62663 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx +2024/02/13 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx +2024/02/13 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx +2024/02/13 | 116935 | macros/latex/contrib/l3kernel/l3token.dtx +2024/02/13 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx +2024/02/13 | 3078 | macros/latex/contrib/l3kernel/README.md +2024/02/13 | 24830 | macros/latex/contrib/l3kernel/source3body.tex +2024/02/13 | 7574815 | macros/latex/contrib/l3kernel/source3.pdf +2024/02/13 | 2282 | macros/latex/contrib/l3kernel/source3.tex +2024/02/14 | 14046736 | macros/latex/contrib/l3kernel.zip +2024/02/13 | 7813 | macros/latex/contrib/l3packages/CHANGELOG.md +2024/02/13 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex +2024/02/13 | 12304 | macros/latex/contrib/l3packages/l3keys2e.dtx +2024/02/13 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins +2024/02/13 | 412717 | macros/latex/contrib/l3packages/l3keys2e.pdf +2024/02/13 | 1005 | macros/latex/contrib/l3packages/README.md +2024/02/13 | 7372 | macros/latex/contrib/l3packages/xfp.dtx +2024/02/13 | 1191 | macros/latex/contrib/l3packages/xfp.ins +2024/02/13 | 332421 | macros/latex/contrib/l3packages/xfp.pdf +2024/02/13 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty +2024/02/13 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty +2024/02/13 | 59622 | macros/latex/contrib/l3packages/xparse.dtx +2024/02/13 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex +2024/02/13 | 1272 | macros/latex/contrib/l3packages/xparse.ins +2024/02/13 | 534182 | macros/latex/contrib/l3packages/xparse.pdf +2024/02/13 | 49753 | macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty +2024/02/13 | 28221 | macros/latex/contrib/l3packages/xtemplate.dtx +2024/02/13 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins +2024/02/13 | 448106 | macros/latex/contrib/l3packages/xtemplate.pdf +2024/02/14 | 1749530 | macros/latex/contrib/l3packages.zip 2008/03/30 | 76250 | macros/latex/contrib/labbook/labboode.pdf 2003/08/06 | 81327 | macros/latex/contrib/labbook/labbook.dtx 2003/06/03 | 1041 | macros/latex/contrib/labbook/labbook.el @@ -256982,306 +256990,310 @@ 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 -2023/11/01 | 7104 | macros/latex-dev/base/alltt.dtx -2023/11/01 | 2890 | macros/latex-dev/base/alltt.ins -2023/11/01 | 223831 | macros/latex-dev/base/alltt.pdf -2023/11/01 | 3282 | macros/latex-dev/base/bugs.txt -2023/11/01 | 264168 | macros/latex-dev/base/cfgguide.pdf -2023/11/01 | 22723 | macros/latex-dev/base/cfgguide.tex -2023/11/01 | 42708 | macros/latex-dev/base/changes.old.txt -2023/11/01 | 404085 | macros/latex-dev/base/changes.txt -2023/11/01 | 156238 | macros/latex-dev/base/classes.dtx -2023/11/01 | 4087 | macros/latex-dev/base/classes.ins -2023/11/01 | 560998 | macros/latex-dev/base/classes.pdf -2023/11/01 | 415615 | macros/latex-dev/base/clsguide-historic.pdf -2023/11/01 | 69439 | macros/latex-dev/base/clsguide-historic.tex -2023/11/01 | 489925 | macros/latex-dev/base/clsguide.pdf -2023/11/01 | 64604 | macros/latex-dev/base/clsguide.tex -2023/11/01 | 5273 | macros/latex-dev/base/cmextra.ins -2023/11/01 | 44531 | macros/latex-dev/base/cmfonts.fdd -2023/11/01 | 4324 | macros/latex-dev/base/cmfonts.ins -2023/11/01 | 292600 | macros/latex-dev/base/cmfonts.pdf -2023/11/01 | 257359 | macros/latex-dev/base/cyrguide.pdf -2023/11/01 | 17782 | macros/latex-dev/base/cyrguide.tex -2023/11/01 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty -2023/11/01 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty -2023/11/01 | 1075915 | macros/latex-dev/base/doc-code.pdf -2023/11/01 | 96 | macros/latex-dev/base/doc-code.tex -2023/11/01 | 242471 | macros/latex-dev/base/doc.dtx -2023/11/01 | 756298 | macros/latex-dev/base/doc.pdf -2023/11/01 | 171396 | macros/latex-dev/base/docstrip.dtx -2023/11/01 | 4273 | macros/latex-dev/base/docstrip.ins -2023/11/01 | 506630 | macros/latex-dev/base/docstrip.pdf -2023/11/01 | 4390 | macros/latex-dev/base/ec.ins -2023/11/01 | 1318576 | macros/latex-dev/base/encguide.pdf -2023/11/01 | 52813 | macros/latex-dev/base/encguide.tex -2023/11/01 | 7216 | macros/latex-dev/base/exscale.dtx -2023/11/01 | 3338 | macros/latex-dev/base/exscale.ins -2023/11/01 | 204708 | macros/latex-dev/base/exscale.pdf -2023/11/01 | 23516 | macros/latex-dev/base/fix-cm.dtx -2023/11/01 | 2892 | macros/latex-dev/base/fix-cm.ins -2023/11/01 | 287727 | macros/latex-dev/base/fix-cm.pdf -2023/11/01 | 517708 | macros/latex-dev/base/fntguide.pdf -2023/11/01 | 108248 | macros/latex-dev/base/fntguide.tex -2023/11/01 | 60321 | macros/latex-dev/base/fontdef.dtx -2023/11/01 | 9887 | macros/latex-dev/base/format.ins -2023/11/01 | 5509 | macros/latex-dev/base/graphpap.dtx -2023/11/01 | 2892 | macros/latex-dev/base/graphpap.ins -2023/11/01 | 161722 | macros/latex-dev/base/graphpap.pdf -2023/11/01 | 2705 | macros/latex-dev/base/idx.tex -2023/11/01 | 18753 | macros/latex-dev/base/ifthen.dtx -2023/11/01 | 2888 | macros/latex-dev/base/ifthen.ins -2023/11/01 | 221219 | macros/latex-dev/base/ifthen.pdf -2023/11/01 | 106904 | macros/latex-dev/base/inputenc.dtx -2023/11/01 | 5714 | macros/latex-dev/base/inputenc.ins -2023/11/01 | 318199 | macros/latex-dev/base/inputenc.pdf -2023/11/01 | 4079 | macros/latex-dev/base/lablst.tex -2023/11/01 | 13759 | macros/latex-dev/base/lamport-manual.err -2023/11/01 | 170876 | macros/latex-dev/base/lamport-manual.pdf -2023/11/01 | 38730 | macros/latex-dev/base/latex209.dtx -2023/11/01 | 4219 | macros/latex-dev/base/latex209.ins -2023/11/01 | 45347 | macros/latex-dev/base/latexrelease.dtx -2023/11/01 | 6145 | macros/latex-dev/base/latexrelease.ins -2023/11/01 | 282095 | macros/latex-dev/base/latexrelease.pdf -2023/11/01 | 6709 | macros/latex-dev/base/latexsym.dtx -2023/11/01 | 5041 | macros/latex-dev/base/latexsym.ins -2023/11/01 | 200759 | macros/latex-dev/base/latexsym.pdf -2023/11/01 | 52887 | macros/latex-dev/base/lb2.err -2023/11/01 | 252497 | macros/latex-dev/base/lb2.pdf -2023/11/01 | 1279 | macros/latex-dev/base/legal.txt -2023/11/01 | 63280 | macros/latex-dev/base/letter.dtx -2023/11/01 | 3372 | macros/latex-dev/base/letter.ins -2023/11/01 | 337852 | macros/latex-dev/base/letter.pdf -2023/11/01 | 21229 | macros/latex-dev/base/lgc2.err -2023/11/01 | 217659 | macros/latex-dev/base/lgc2.pdf -2023/11/01 | 9068 | macros/latex-dev/base/lppl-1-0.txt -2023/11/01 | 14341 | macros/latex-dev/base/lppl-1-1.txt -2023/11/01 | 14421 | macros/latex-dev/base/lppl-1-2.txt -2023/11/01 | 132370 | macros/latex-dev/base/lppl.pdf -2023/11/01 | 23386 | macros/latex-dev/base/lppl.tex -2023/11/01 | 19040 | macros/latex-dev/base/lppl.txt -2023/11/01 | 4298 | macros/latex-dev/base/ltalloc.dtx -2023/11/01 | 17389 | macros/latex-dev/base/ltbibl.dtx -2023/11/01 | 49020 | macros/latex-dev/base/ltboxes.dtx -2023/11/01 | 145334 | macros/latex-dev/base/ltclass.dtx -2023/11/01 | 183132 | macros/latex-dev/base/ltcmd.dtx -2023/11/01 | 755882 | macros/latex-dev/base/ltcmdhooks-code.pdf -2023/11/01 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex -2023/11/01 | 499346 | macros/latex-dev/base/ltcmdhooks-doc.pdf -2023/11/01 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex -2023/11/01 | 67588 | macros/latex-dev/base/ltcmdhooks.dtx -2023/11/01 | 9557 | macros/latex-dev/base/ltcntrl.dtx -2023/11/01 | 24286 | macros/latex-dev/base/ltcounts.dtx -2023/11/01 | 92954 | macros/latex-dev/base/ltdefns.dtx -2023/11/01 | 35984 | macros/latex-dev/base/ltdirchk.dtx -2023/11/01 | 27069 | macros/latex-dev/base/lterror.dtx -2023/11/01 | 19533 | macros/latex-dev/base/ltexpl.dtx -2023/11/01 | 804030 | macros/latex-dev/base/ltfilehook-code.pdf -2023/11/01 | 105 | macros/latex-dev/base/ltfilehook-code.tex -2023/11/01 | 548695 | macros/latex-dev/base/ltfilehook-doc.pdf -2023/11/01 | 241 | macros/latex-dev/base/ltfilehook-doc.tex -2023/11/01 | 67442 | macros/latex-dev/base/ltfilehook.dtx -2023/11/01 | 61493 | macros/latex-dev/base/ltfiles.dtx -2023/11/01 | 51180 | macros/latex-dev/base/ltfinal.dtx -2023/11/01 | 55687 | macros/latex-dev/base/ltfloat.dtx -2023/11/01 | 29267 | macros/latex-dev/base/ltfntcmd.dtx -2023/11/01 | 58547 | macros/latex-dev/base/ltfssaxes.dtx -2023/11/01 | 82917 | macros/latex-dev/base/ltfssbas.dtx -2023/11/01 | 10370 | macros/latex-dev/base/ltfsscmp.dtx -2023/11/01 | 75111 | macros/latex-dev/base/ltfssdcl.dtx -2023/11/01 | 84215 | macros/latex-dev/base/ltfssini.dtx -2023/11/01 | 72475 | macros/latex-dev/base/ltfsstrc.dtx -2023/11/01 | 1258628 | macros/latex-dev/base/lthooks-code.pdf -2023/11/01 | 102 | macros/latex-dev/base/lthooks-code.tex -2023/11/01 | 755246 | macros/latex-dev/base/lthooks-doc.pdf -2023/11/01 | 238 | macros/latex-dev/base/lthooks-doc.tex -2023/11/01 | 301237 | macros/latex-dev/base/lthooks.dtx -2023/11/01 | 4945 | macros/latex-dev/base/lthyphen.dtx -2023/11/01 | 5859 | macros/latex-dev/base/ltidxglo.dtx -2023/11/01 | 19853 | macros/latex-dev/base/ltkeys.dtx -2023/11/01 | 4757 | macros/latex-dev/base/ltlength.dtx -2023/11/01 | 36154 | macros/latex-dev/base/ltlists.dtx -2023/11/01 | 3725 | macros/latex-dev/base/ltlogos.dtx -2023/11/01 | 75286 | macros/latex-dev/base/ltluatex.dtx -2023/11/01 | 325191 | macros/latex-dev/base/ltluatex.pdf -2023/11/01 | 716681 | macros/latex-dev/base/ltmarks-code.pdf -2023/11/01 | 102 | macros/latex-dev/base/ltmarks-code.tex -2023/11/01 | 586808 | macros/latex-dev/base/ltmarks-doc.pdf -2023/11/01 | 238 | macros/latex-dev/base/ltmarks-doc.tex -2023/11/01 | 63142 | macros/latex-dev/base/ltmarks.dtx -2023/11/01 | 42287 | macros/latex-dev/base/ltmath.dtx -2023/11/01 | 6217 | macros/latex-dev/base/ltmeta.dtx -2023/11/01 | 65684 | macros/latex-dev/base/ltmiscen.dtx -2023/11/01 | 169553 | macros/latex-dev/base/ltnews01.pdf -2023/11/01 | 5246 | macros/latex-dev/base/ltnews01.tex -2023/11/01 | 151773 | macros/latex-dev/base/ltnews02.pdf -2023/11/01 | 5462 | macros/latex-dev/base/ltnews02.tex -2023/11/01 | 151324 | macros/latex-dev/base/ltnews03.pdf -2023/11/01 | 5369 | macros/latex-dev/base/ltnews03.tex -2023/11/01 | 152551 | macros/latex-dev/base/ltnews04.pdf -2023/11/01 | 5678 | macros/latex-dev/base/ltnews04.tex -2023/11/01 | 175211 | macros/latex-dev/base/ltnews05.pdf -2023/11/01 | 5699 | macros/latex-dev/base/ltnews05.tex -2023/11/01 | 142867 | macros/latex-dev/base/ltnews06.pdf -2023/11/01 | 5544 | macros/latex-dev/base/ltnews06.tex -2023/11/01 | 138214 | macros/latex-dev/base/ltnews07.pdf -2023/11/01 | 5576 | macros/latex-dev/base/ltnews07.tex -2023/11/01 | 155442 | macros/latex-dev/base/ltnews08.pdf -2023/11/01 | 5732 | macros/latex-dev/base/ltnews08.tex -2023/11/01 | 130028 | macros/latex-dev/base/ltnews09.pdf -2023/11/01 | 5451 | macros/latex-dev/base/ltnews09.tex -2023/11/01 | 169433 | macros/latex-dev/base/ltnews10.pdf -2023/11/01 | 5825 | macros/latex-dev/base/ltnews10.tex -2023/11/01 | 112208 | macros/latex-dev/base/ltnews11.pdf -2023/11/01 | 5529 | macros/latex-dev/base/ltnews11.tex -2023/11/01 | 156764 | macros/latex-dev/base/ltnews12.pdf -2023/11/01 | 5574 | macros/latex-dev/base/ltnews12.tex -2023/11/01 | 182483 | macros/latex-dev/base/ltnews13.pdf -2023/11/01 | 7029 | macros/latex-dev/base/ltnews13.tex -2023/11/01 | 170722 | macros/latex-dev/base/ltnews14.pdf -2023/11/01 | 6424 | macros/latex-dev/base/ltnews14.tex -2023/11/01 | 130328 | macros/latex-dev/base/ltnews15.pdf -2023/11/01 | 5986 | macros/latex-dev/base/ltnews15.tex -2023/11/01 | 138107 | macros/latex-dev/base/ltnews16.pdf -2023/11/01 | 5775 | macros/latex-dev/base/ltnews16.tex -2023/11/01 | 166269 | macros/latex-dev/base/ltnews17.pdf -2023/11/01 | 8970 | macros/latex-dev/base/ltnews17.tex -2023/11/01 | 39839 | macros/latex-dev/base/ltnews18.pdf -2023/11/01 | 1341 | macros/latex-dev/base/ltnews18.tex -2023/11/01 | 225936 | macros/latex-dev/base/ltnews19.pdf -2023/11/01 | 4190 | macros/latex-dev/base/ltnews19.tex -2023/11/01 | 318193 | macros/latex-dev/base/ltnews20.pdf -2023/11/01 | 7244 | macros/latex-dev/base/ltnews20.tex -2023/11/01 | 245228 | macros/latex-dev/base/ltnews21.pdf -2023/11/01 | 9935 | macros/latex-dev/base/ltnews21.tex -2023/11/01 | 318026 | macros/latex-dev/base/ltnews22.pdf -2023/11/01 | 10792 | macros/latex-dev/base/ltnews22.tex -2023/11/01 | 286824 | macros/latex-dev/base/ltnews23.pdf -2023/11/01 | 10791 | macros/latex-dev/base/ltnews23.tex -2023/11/01 | 265497 | macros/latex-dev/base/ltnews24.pdf -2023/11/01 | 12334 | macros/latex-dev/base/ltnews24.tex -2023/11/01 | 205100 | macros/latex-dev/base/ltnews25.pdf -2023/11/01 | 5588 | macros/latex-dev/base/ltnews25.tex -2023/11/01 | 379733 | macros/latex-dev/base/ltnews26.pdf -2023/11/01 | 10798 | macros/latex-dev/base/ltnews26.tex -2023/11/01 | 251283 | macros/latex-dev/base/ltnews27.pdf -2023/11/01 | 5691 | macros/latex-dev/base/ltnews27.tex -2023/11/01 | 376933 | macros/latex-dev/base/ltnews28.pdf -2023/11/01 | 15047 | macros/latex-dev/base/ltnews28.tex -2023/11/01 | 455437 | macros/latex-dev/base/ltnews29.pdf -2023/11/01 | 18944 | macros/latex-dev/base/ltnews29.tex -2023/11/01 | 512240 | macros/latex-dev/base/ltnews30.pdf -2023/11/01 | 23646 | macros/latex-dev/base/ltnews30.tex -2023/11/01 | 526688 | macros/latex-dev/base/ltnews31.pdf -2023/11/01 | 30452 | macros/latex-dev/base/ltnews31.tex -2023/11/01 | 546540 | macros/latex-dev/base/ltnews32.pdf -2023/11/01 | 33243 | macros/latex-dev/base/ltnews32.tex -2023/11/01 | 522757 | macros/latex-dev/base/ltnews33.pdf -2023/11/01 | 33911 | macros/latex-dev/base/ltnews33.tex -2023/11/01 | 508345 | macros/latex-dev/base/ltnews34.pdf -2023/11/01 | 32331 | macros/latex-dev/base/ltnews34.tex -2023/11/01 | 563307 | macros/latex-dev/base/ltnews35.pdf -2023/11/01 | 38226 | macros/latex-dev/base/ltnews35.tex -2023/11/01 | 517934 | macros/latex-dev/base/ltnews36.pdf -2023/11/01 | 19333 | macros/latex-dev/base/ltnews36.tex -2023/11/01 | 456933 | macros/latex-dev/base/ltnews37.pdf -2023/11/01 | 33083 | macros/latex-dev/base/ltnews37.tex -2023/11/01 | 523672 | macros/latex-dev/base/ltnews38.pdf -2023/11/01 | 22948 | macros/latex-dev/base/ltnews38.tex -2023/11/01 | 21488 | macros/latex-dev/base/ltnews.cls -2023/11/01 | 1360066 | macros/latex-dev/base/ltnews.pdf -2023/11/01 | 8051 | macros/latex-dev/base/ltnews.tex -2023/11/01 | 148294 | macros/latex-dev/base/ltoutenc.dtx -2023/11/01 | 3367 | macros/latex-dev/base/ltoutenc.ins -2023/11/01 | 178567 | macros/latex-dev/base/ltoutput.dtx -2023/11/01 | 14091 | macros/latex-dev/base/ltpage.dtx -2023/11/01 | 2728 | macros/latex-dev/base/ltpageno.dtx -2023/11/01 | 672700 | macros/latex-dev/base/ltpara-code.pdf -2023/11/01 | 99 | macros/latex-dev/base/ltpara-code.tex -2023/11/01 | 560578 | macros/latex-dev/base/ltpara-doc.pdf -2023/11/01 | 234 | macros/latex-dev/base/ltpara-doc.tex -2023/11/01 | 54677 | macros/latex-dev/base/ltpara.dtx -2023/11/01 | 6155 | macros/latex-dev/base/ltpar.dtx -2023/11/01 | 69002 | macros/latex-dev/base/ltpictur.dtx -2023/11/01 | 60156 | macros/latex-dev/base/ltplain.dtx -2023/11/01 | 558646 | macros/latex-dev/base/ltproperties-code.pdf -2023/11/01 | 107 | macros/latex-dev/base/ltproperties-code.tex -2023/11/01 | 433141 | macros/latex-dev/base/ltproperties-doc.pdf -2023/11/01 | 243 | macros/latex-dev/base/ltproperties-doc.tex -2023/11/01 | 33306 | macros/latex-dev/base/ltproperties.dtx -2023/11/01 | 33946 | macros/latex-dev/base/ltsect.dtx -2023/11/01 | 821655 | macros/latex-dev/base/ltshipout-code.pdf -2023/11/01 | 104 | macros/latex-dev/base/ltshipout-code.tex -2023/11/01 | 566566 | macros/latex-dev/base/ltshipout-doc.pdf -2023/11/01 | 240 | macros/latex-dev/base/ltshipout-doc.tex -2023/11/01 | 81195 | macros/latex-dev/base/ltshipout.dtx -2023/11/01 | 606454 | macros/latex-dev/base/ltsockets-code.pdf -2023/11/01 | 104 | macros/latex-dev/base/ltsockets-code.tex -2023/11/01 | 489314 | macros/latex-dev/base/ltsockets-doc.pdf -2023/11/01 | 240 | macros/latex-dev/base/ltsockets-doc.tex -2023/11/01 | 37668 | macros/latex-dev/base/ltsockets.dtx -2023/11/01 | 47316 | macros/latex-dev/base/ltspace.dtx -2023/11/01 | 47896 | macros/latex-dev/base/lttab.dtx -2023/11/01 | 90660 | macros/latex-dev/base/lttextcomp.dtx -2023/11/01 | 8731 | macros/latex-dev/base/ltthm.dtx -2023/11/01 | 15383 | macros/latex-dev/base/ltvers.dtx -2023/11/01 | 219358 | macros/latex-dev/base/ltx3info.pdf -2023/11/01 | 18299 | macros/latex-dev/base/ltx3info.tex -2023/11/01 | 27122 | macros/latex-dev/base/ltxcheck.tex -2023/11/01 | 22814 | macros/latex-dev/base/ltxdoc.dtx -2023/11/01 | 244215 | macros/latex-dev/base/ltxdoc.pdf -2023/11/01 | 7528 | macros/latex-dev/base/ltxguide.cls -2023/11/01 | 21882 | macros/latex-dev/base/ltxref.dtx -2023/11/01 | 10601 | macros/latex-dev/base/makeindx.dtx -2023/11/01 | 3434 | macros/latex-dev/base/makeindx.ins -2023/11/01 | 165816 | macros/latex-dev/base/makeindx.pdf -2023/11/01 | 11463 | macros/latex-dev/base/manifest.txt -2023/11/01 | 1941 | macros/latex-dev/base/minimal.cls -2023/11/01 | 257825 | macros/latex-dev/base/modguide.pdf -2023/11/01 | 16500 | macros/latex-dev/base/modguide.tex -2023/11/01 | 4254 | macros/latex-dev/base/newdc.ins -2023/11/01 | 6357 | macros/latex-dev/base/newlfont.dtx -2023/11/01 | 18399 | macros/latex-dev/base/nfssfont.dtx -2023/11/01 | 2893 | macros/latex-dev/base/nfssfont.ins -2023/11/01 | 211171 | macros/latex-dev/base/nfssfont.pdf -2023/11/01 | 3960 | macros/latex-dev/base/olddc.ins -2023/11/01 | 8626 | macros/latex-dev/base/oldlfont.dtx -2023/11/01 | 9345 | macros/latex-dev/base/preload.dtx -2023/11/01 | 13589 | macros/latex-dev/base/proc.dtx -2023/11/01 | 3401 | macros/latex-dev/base/proc.ins -2023/11/01 | 227065 | macros/latex-dev/base/proc.pdf -2023/11/01 | 3100 | macros/latex-dev/base/README.md -2023/11/01 | 7200 | macros/latex-dev/base/sample2e.tex -2023/11/01 | 89727 | macros/latex-dev/base/slides.dtx -2023/11/01 | 6760 | macros/latex-dev/base/slides.ins -2023/11/01 | 375493 | macros/latex-dev/base/slides.pdf -2023/11/01 | 15703 | macros/latex-dev/base/slifonts.fdd -2023/11/01 | 234171 | macros/latex-dev/base/slifonts.pdf -2023/11/01 | 1694 | macros/latex-dev/base/small2e.tex -2023/11/01 | 9401 | macros/latex-dev/base/source2edoc.cls -2023/11/01 | 6150247 | macros/latex-dev/base/source2e.pdf -2023/11/01 | 15431 | macros/latex-dev/base/source2e.tex -2023/11/01 | 9395 | macros/latex-dev/base/syntonly.dtx -2023/11/01 | 2896 | macros/latex-dev/base/syntonly.ins -2023/11/01 | 190255 | macros/latex-dev/base/syntonly.pdf -2023/11/01 | 12520 | macros/latex-dev/base/testpage.tex -2023/11/01 | 173013 | macros/latex-dev/base/tlc2.err -2023/11/01 | 291143 | macros/latex-dev/base/tlc2.pdf -2023/11/01 | 43212 | macros/latex-dev/base/tlc3.err -2023/11/01 | 326462 | macros/latex-dev/base/tlc3.pdf -2023/11/01 | 12246 | macros/latex-dev/base/tulm.fdd -2023/11/01 | 3781 | macros/latex-dev/base/tulm.ins -2023/11/01 | 162773 | macros/latex-dev/base/tulm.pdf -2023/11/01 | 3181 | macros/latex-dev/base/unpack.ins -2023/11/01 | 438602 | macros/latex-dev/base/usrguide-historic.pdf -2023/11/01 | 68735 | macros/latex-dev/base/usrguide-historic.tex -2023/11/01 | 477695 | macros/latex-dev/base/usrguide.pdf -2023/11/01 | 52759 | macros/latex-dev/base/usrguide.tex -2023/11/01 | 92280 | macros/latex-dev/base/utf8ienc.dtx -2023/11/01 | 353655 | macros/latex-dev/base/utf8ienc.pdf -2023/11/01 | 10251 | macros/latex-dev/base/webcomp.err -2023/11/01 | 146199 | macros/latex-dev/base/webcomp.pdf -2023/11/02 | 43093738 | macros/latex-dev/base.zip +2024/02/14 | 7104 | macros/latex-dev/base/alltt.dtx +2024/02/14 | 2890 | macros/latex-dev/base/alltt.ins +2024/02/14 | 223861 | macros/latex-dev/base/alltt.pdf +2024/02/14 | 3282 | macros/latex-dev/base/bugs.txt +2024/02/14 | 264168 | macros/latex-dev/base/cfgguide.pdf +2024/02/14 | 22723 | macros/latex-dev/base/cfgguide.tex +2024/02/14 | 42708 | macros/latex-dev/base/changes.old.txt +2024/02/14 | 408292 | macros/latex-dev/base/changes.txt +2024/02/14 | 156260 | macros/latex-dev/base/classes.dtx +2024/02/14 | 4087 | macros/latex-dev/base/classes.ins +2024/02/14 | 560294 | macros/latex-dev/base/classes.pdf +2024/02/14 | 415956 | macros/latex-dev/base/clsguide-historic.pdf +2024/02/14 | 69441 | macros/latex-dev/base/clsguide-historic.tex +2024/02/14 | 489795 | macros/latex-dev/base/clsguide.pdf +2024/02/14 | 64605 | macros/latex-dev/base/clsguide.tex +2024/02/14 | 5273 | macros/latex-dev/base/cmextra.ins +2024/02/14 | 44531 | macros/latex-dev/base/cmfonts.fdd +2024/02/14 | 4324 | macros/latex-dev/base/cmfonts.ins +2024/02/14 | 292600 | macros/latex-dev/base/cmfonts.pdf +2024/02/14 | 257359 | macros/latex-dev/base/cyrguide.pdf +2024/02/14 | 17782 | macros/latex-dev/base/cyrguide.tex +2024/02/14 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty +2024/02/14 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty +2024/02/14 | 1078428 | macros/latex-dev/base/doc-code.pdf +2024/02/14 | 96 | macros/latex-dev/base/doc-code.tex +2024/02/14 | 241326 | macros/latex-dev/base/doc.dtx +2024/02/14 | 757049 | macros/latex-dev/base/doc.pdf +2024/02/14 | 171410 | macros/latex-dev/base/docstrip.dtx +2024/02/14 | 4273 | macros/latex-dev/base/docstrip.ins +2024/02/14 | 506365 | macros/latex-dev/base/docstrip.pdf +2024/02/14 | 4390 | macros/latex-dev/base/ec.ins +2024/02/14 | 1318576 | macros/latex-dev/base/encguide.pdf +2024/02/14 | 52813 | macros/latex-dev/base/encguide.tex +2024/02/14 | 7216 | macros/latex-dev/base/exscale.dtx +2024/02/14 | 3338 | macros/latex-dev/base/exscale.ins +2024/02/14 | 204708 | macros/latex-dev/base/exscale.pdf +2024/02/14 | 23516 | macros/latex-dev/base/fix-cm.dtx +2024/02/14 | 2892 | macros/latex-dev/base/fix-cm.ins +2024/02/14 | 287727 | macros/latex-dev/base/fix-cm.pdf +2024/02/14 | 517708 | macros/latex-dev/base/fntguide.pdf +2024/02/14 | 108248 | macros/latex-dev/base/fntguide.tex +2024/02/14 | 60422 | macros/latex-dev/base/fontdef.dtx +2024/02/14 | 10072 | macros/latex-dev/base/format.ins +2024/02/14 | 5509 | macros/latex-dev/base/graphpap.dtx +2024/02/14 | 2892 | macros/latex-dev/base/graphpap.ins +2024/02/14 | 161722 | macros/latex-dev/base/graphpap.pdf +2024/02/14 | 2705 | macros/latex-dev/base/idx.tex +2024/02/14 | 18753 | macros/latex-dev/base/ifthen.dtx +2024/02/14 | 2888 | macros/latex-dev/base/ifthen.ins +2024/02/14 | 221219 | macros/latex-dev/base/ifthen.pdf +2024/02/14 | 106906 | macros/latex-dev/base/inputenc.dtx +2024/02/14 | 5714 | macros/latex-dev/base/inputenc.ins +2024/02/14 | 318372 | macros/latex-dev/base/inputenc.pdf +2024/02/14 | 4079 | macros/latex-dev/base/lablst.tex +2024/02/14 | 13759 | macros/latex-dev/base/lamport-manual.err +2024/02/14 | 170876 | macros/latex-dev/base/lamport-manual.pdf +2024/02/14 | 38730 | macros/latex-dev/base/latex209.dtx +2024/02/14 | 4219 | macros/latex-dev/base/latex209.ins +2024/02/14 | 45347 | macros/latex-dev/base/latexrelease.dtx +2024/02/14 | 6202 | macros/latex-dev/base/latexrelease.ins +2024/02/14 | 282095 | macros/latex-dev/base/latexrelease.pdf +2024/02/14 | 6709 | macros/latex-dev/base/latexsym.dtx +2024/02/14 | 5041 | macros/latex-dev/base/latexsym.ins +2024/02/14 | 200759 | macros/latex-dev/base/latexsym.pdf +2024/02/14 | 53334 | macros/latex-dev/base/lb2.err +2024/02/14 | 253116 | macros/latex-dev/base/lb2.pdf +2024/02/14 | 1279 | macros/latex-dev/base/legal.txt +2024/02/14 | 63280 | macros/latex-dev/base/letter.dtx +2024/02/14 | 3372 | macros/latex-dev/base/letter.ins +2024/02/14 | 337772 | macros/latex-dev/base/letter.pdf +2024/02/14 | 21229 | macros/latex-dev/base/lgc2.err +2024/02/14 | 217659 | macros/latex-dev/base/lgc2.pdf +2024/02/14 | 9068 | macros/latex-dev/base/lppl-1-0.txt +2024/02/14 | 14341 | macros/latex-dev/base/lppl-1-1.txt +2024/02/14 | 14421 | macros/latex-dev/base/lppl-1-2.txt +2024/02/14 | 132370 | macros/latex-dev/base/lppl.pdf +2024/02/14 | 23386 | macros/latex-dev/base/lppl.tex +2024/02/14 | 19040 | macros/latex-dev/base/lppl.txt +2024/02/14 | 4298 | macros/latex-dev/base/ltalloc.dtx +2024/02/14 | 17389 | macros/latex-dev/base/ltbibl.dtx +2024/02/14 | 49035 | macros/latex-dev/base/ltboxes.dtx +2024/02/14 | 146153 | macros/latex-dev/base/ltclass.dtx +2024/02/14 | 188047 | macros/latex-dev/base/ltcmd.dtx +2024/02/14 | 752365 | macros/latex-dev/base/ltcmdhooks-code.pdf +2024/02/14 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex +2024/02/14 | 497334 | macros/latex-dev/base/ltcmdhooks-doc.pdf +2024/02/14 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex +2024/02/14 | 67672 | macros/latex-dev/base/ltcmdhooks.dtx +2024/02/14 | 9557 | macros/latex-dev/base/ltcntrl.dtx +2024/02/14 | 24869 | macros/latex-dev/base/ltcounts.dtx +2024/02/14 | 93035 | macros/latex-dev/base/ltdefns.dtx +2024/02/14 | 36003 | macros/latex-dev/base/ltdirchk.dtx +2024/02/14 | 27069 | macros/latex-dev/base/lterror.dtx +2024/02/14 | 19533 | macros/latex-dev/base/ltexpl.dtx +2024/02/14 | 803049 | macros/latex-dev/base/ltfilehook-code.pdf +2024/02/14 | 105 | macros/latex-dev/base/ltfilehook-code.tex +2024/02/14 | 548011 | macros/latex-dev/base/ltfilehook-doc.pdf +2024/02/14 | 241 | macros/latex-dev/base/ltfilehook-doc.tex +2024/02/14 | 67585 | macros/latex-dev/base/ltfilehook.dtx +2024/02/14 | 62897 | macros/latex-dev/base/ltfiles.dtx +2024/02/14 | 51163 | macros/latex-dev/base/ltfinal.dtx +2024/02/14 | 55687 | macros/latex-dev/base/ltfloat.dtx +2024/02/14 | 29270 | macros/latex-dev/base/ltfntcmd.dtx +2024/02/14 | 58548 | macros/latex-dev/base/ltfssaxes.dtx +2024/02/14 | 82917 | macros/latex-dev/base/ltfssbas.dtx +2024/02/14 | 10370 | macros/latex-dev/base/ltfsscmp.dtx +2024/02/14 | 75111 | macros/latex-dev/base/ltfssdcl.dtx +2024/02/14 | 84220 | macros/latex-dev/base/ltfssini.dtx +2024/02/14 | 72493 | macros/latex-dev/base/ltfsstrc.dtx +2024/02/14 | 1248644 | macros/latex-dev/base/lthooks-code.pdf +2024/02/14 | 102 | macros/latex-dev/base/lthooks-code.tex +2024/02/14 | 758273 | macros/latex-dev/base/lthooks-doc.pdf +2024/02/14 | 238 | macros/latex-dev/base/lthooks-doc.tex +2024/02/14 | 304559 | macros/latex-dev/base/lthooks.dtx +2024/02/14 | 4945 | macros/latex-dev/base/lthyphen.dtx +2024/02/14 | 5859 | macros/latex-dev/base/ltidxglo.dtx +2024/02/14 | 20011 | macros/latex-dev/base/ltkeys.dtx +2024/02/14 | 4757 | macros/latex-dev/base/ltlength.dtx +2024/02/14 | 36154 | macros/latex-dev/base/ltlists.dtx +2024/02/14 | 3725 | macros/latex-dev/base/ltlogos.dtx +2024/02/14 | 75392 | macros/latex-dev/base/ltluatex.dtx +2024/02/14 | 325142 | macros/latex-dev/base/ltluatex.pdf +2024/02/14 | 711767 | macros/latex-dev/base/ltmarks-code.pdf +2024/02/14 | 102 | macros/latex-dev/base/ltmarks-code.tex +2024/02/14 | 575242 | macros/latex-dev/base/ltmarks-doc.pdf +2024/02/14 | 238 | macros/latex-dev/base/ltmarks-doc.tex +2024/02/14 | 75109 | macros/latex-dev/base/ltmarks.dtx +2024/02/14 | 42287 | macros/latex-dev/base/ltmath.dtx +2024/02/14 | 6248 | macros/latex-dev/base/ltmeta.dtx +2024/02/14 | 65689 | macros/latex-dev/base/ltmiscen.dtx +2024/02/14 | 169553 | macros/latex-dev/base/ltnews01.pdf +2024/02/14 | 5246 | macros/latex-dev/base/ltnews01.tex +2024/02/14 | 151773 | macros/latex-dev/base/ltnews02.pdf +2024/02/14 | 5462 | macros/latex-dev/base/ltnews02.tex +2024/02/14 | 151324 | macros/latex-dev/base/ltnews03.pdf +2024/02/14 | 5369 | macros/latex-dev/base/ltnews03.tex +2024/02/14 | 152551 | macros/latex-dev/base/ltnews04.pdf +2024/02/14 | 5678 | macros/latex-dev/base/ltnews04.tex +2024/02/14 | 175211 | macros/latex-dev/base/ltnews05.pdf +2024/02/14 | 5699 | macros/latex-dev/base/ltnews05.tex +2024/02/14 | 142867 | macros/latex-dev/base/ltnews06.pdf +2024/02/14 | 5544 | macros/latex-dev/base/ltnews06.tex +2024/02/14 | 138214 | macros/latex-dev/base/ltnews07.pdf +2024/02/14 | 5576 | macros/latex-dev/base/ltnews07.tex +2024/02/14 | 155442 | macros/latex-dev/base/ltnews08.pdf +2024/02/14 | 5732 | macros/latex-dev/base/ltnews08.tex +2024/02/14 | 130028 | macros/latex-dev/base/ltnews09.pdf +2024/02/14 | 5451 | macros/latex-dev/base/ltnews09.tex +2024/02/14 | 169433 | macros/latex-dev/base/ltnews10.pdf +2024/02/14 | 5825 | macros/latex-dev/base/ltnews10.tex +2024/02/14 | 112208 | macros/latex-dev/base/ltnews11.pdf +2024/02/14 | 5529 | macros/latex-dev/base/ltnews11.tex +2024/02/14 | 156764 | macros/latex-dev/base/ltnews12.pdf +2024/02/14 | 5574 | macros/latex-dev/base/ltnews12.tex +2024/02/14 | 182483 | macros/latex-dev/base/ltnews13.pdf +2024/02/14 | 7029 | macros/latex-dev/base/ltnews13.tex +2024/02/14 | 170722 | macros/latex-dev/base/ltnews14.pdf +2024/02/14 | 6424 | macros/latex-dev/base/ltnews14.tex +2024/02/14 | 130328 | macros/latex-dev/base/ltnews15.pdf +2024/02/14 | 5986 | macros/latex-dev/base/ltnews15.tex +2024/02/14 | 138107 | macros/latex-dev/base/ltnews16.pdf +2024/02/14 | 5775 | macros/latex-dev/base/ltnews16.tex +2024/02/14 | 166269 | macros/latex-dev/base/ltnews17.pdf +2024/02/14 | 8970 | macros/latex-dev/base/ltnews17.tex +2024/02/14 | 39839 | macros/latex-dev/base/ltnews18.pdf +2024/02/14 | 1341 | macros/latex-dev/base/ltnews18.tex +2024/02/14 | 225936 | macros/latex-dev/base/ltnews19.pdf +2024/02/14 | 4190 | macros/latex-dev/base/ltnews19.tex +2024/02/14 | 318193 | macros/latex-dev/base/ltnews20.pdf +2024/02/14 | 7244 | macros/latex-dev/base/ltnews20.tex +2024/02/14 | 245228 | macros/latex-dev/base/ltnews21.pdf +2024/02/14 | 9935 | macros/latex-dev/base/ltnews21.tex +2024/02/14 | 318026 | macros/latex-dev/base/ltnews22.pdf +2024/02/14 | 10792 | macros/latex-dev/base/ltnews22.tex +2024/02/14 | 286824 | macros/latex-dev/base/ltnews23.pdf +2024/02/14 | 10791 | macros/latex-dev/base/ltnews23.tex +2024/02/14 | 265497 | macros/latex-dev/base/ltnews24.pdf +2024/02/14 | 12334 | macros/latex-dev/base/ltnews24.tex +2024/02/14 | 205100 | macros/latex-dev/base/ltnews25.pdf +2024/02/14 | 5588 | macros/latex-dev/base/ltnews25.tex +2024/02/14 | 379733 | macros/latex-dev/base/ltnews26.pdf +2024/02/14 | 10798 | macros/latex-dev/base/ltnews26.tex +2024/02/14 | 251283 | macros/latex-dev/base/ltnews27.pdf +2024/02/14 | 5691 | macros/latex-dev/base/ltnews27.tex +2024/02/14 | 376933 | macros/latex-dev/base/ltnews28.pdf +2024/02/14 | 15047 | macros/latex-dev/base/ltnews28.tex +2024/02/14 | 455437 | macros/latex-dev/base/ltnews29.pdf +2024/02/14 | 18944 | macros/latex-dev/base/ltnews29.tex +2024/02/14 | 512240 | macros/latex-dev/base/ltnews30.pdf +2024/02/14 | 23646 | macros/latex-dev/base/ltnews30.tex +2024/02/14 | 526688 | macros/latex-dev/base/ltnews31.pdf +2024/02/14 | 30452 | macros/latex-dev/base/ltnews31.tex +2024/02/14 | 546540 | macros/latex-dev/base/ltnews32.pdf +2024/02/14 | 33243 | macros/latex-dev/base/ltnews32.tex +2024/02/14 | 522757 | macros/latex-dev/base/ltnews33.pdf +2024/02/14 | 33911 | macros/latex-dev/base/ltnews33.tex +2024/02/14 | 508345 | macros/latex-dev/base/ltnews34.pdf +2024/02/14 | 32331 | macros/latex-dev/base/ltnews34.tex +2024/02/14 | 563307 | macros/latex-dev/base/ltnews35.pdf +2024/02/14 | 38226 | macros/latex-dev/base/ltnews35.tex +2024/02/14 | 517934 | macros/latex-dev/base/ltnews36.pdf +2024/02/14 | 19333 | macros/latex-dev/base/ltnews36.tex +2024/02/14 | 456933 | macros/latex-dev/base/ltnews37.pdf +2024/02/14 | 33083 | macros/latex-dev/base/ltnews37.tex +2024/02/14 | 523675 | macros/latex-dev/base/ltnews38.pdf +2024/02/14 | 22946 | macros/latex-dev/base/ltnews38.tex +2024/02/14 | 473345 | macros/latex-dev/base/ltnews39.pdf +2024/02/14 | 25598 | macros/latex-dev/base/ltnews39.tex +2024/02/14 | 21488 | macros/latex-dev/base/ltnews.cls +2024/02/14 | 1390205 | macros/latex-dev/base/ltnews.pdf +2024/02/14 | 8051 | macros/latex-dev/base/ltnews.tex +2024/02/14 | 148564 | macros/latex-dev/base/ltoutenc.dtx +2024/02/14 | 3367 | macros/latex-dev/base/ltoutenc.ins +2024/02/14 | 178567 | macros/latex-dev/base/ltoutput.dtx +2024/02/14 | 14091 | macros/latex-dev/base/ltpage.dtx +2024/02/14 | 2728 | macros/latex-dev/base/ltpageno.dtx +2024/02/14 | 672114 | macros/latex-dev/base/ltpara-code.pdf +2024/02/14 | 99 | macros/latex-dev/base/ltpara-code.tex +2024/02/14 | 560037 | macros/latex-dev/base/ltpara-doc.pdf +2024/02/14 | 234 | macros/latex-dev/base/ltpara-doc.tex +2024/02/14 | 54826 | macros/latex-dev/base/ltpara.dtx +2024/02/14 | 6155 | macros/latex-dev/base/ltpar.dtx +2024/02/14 | 69002 | macros/latex-dev/base/ltpictur.dtx +2024/02/14 | 60434 | macros/latex-dev/base/ltplain.dtx +2024/02/14 | 557051 | macros/latex-dev/base/ltproperties-code.pdf +2024/02/14 | 107 | macros/latex-dev/base/ltproperties-code.tex +2024/02/14 | 432129 | macros/latex-dev/base/ltproperties-doc.pdf +2024/02/14 | 243 | macros/latex-dev/base/ltproperties-doc.tex +2024/02/14 | 33439 | macros/latex-dev/base/ltproperties.dtx +2024/02/14 | 33946 | macros/latex-dev/base/ltsect.dtx +2024/02/14 | 821580 | macros/latex-dev/base/ltshipout-code.pdf +2024/02/14 | 104 | macros/latex-dev/base/ltshipout-code.tex +2024/02/14 | 567728 | macros/latex-dev/base/ltshipout-doc.pdf +2024/02/14 | 240 | macros/latex-dev/base/ltshipout-doc.tex +2024/02/14 | 80747 | macros/latex-dev/base/ltshipout.dtx +2024/02/14 | 598937 | macros/latex-dev/base/ltsockets-code.pdf +2024/02/14 | 104 | macros/latex-dev/base/ltsockets-code.tex +2024/02/14 | 481774 | macros/latex-dev/base/ltsockets-doc.pdf +2024/02/14 | 240 | macros/latex-dev/base/ltsockets-doc.tex +2024/02/14 | 37710 | macros/latex-dev/base/ltsockets.dtx +2024/02/14 | 47308 | macros/latex-dev/base/ltspace.dtx +2024/02/14 | 47896 | macros/latex-dev/base/lttab.dtx +2024/02/14 | 24793 | macros/latex-dev/base/lttagging.dtx +2024/02/14 | 92269 | macros/latex-dev/base/lttemplates.dtx +2024/02/14 | 114225 | macros/latex-dev/base/lttextcomp.dtx +2024/02/14 | 8731 | macros/latex-dev/base/ltthm.dtx +2024/02/14 | 15384 | macros/latex-dev/base/ltvers.dtx +2024/02/14 | 219358 | macros/latex-dev/base/ltx3info.pdf +2024/02/14 | 18299 | macros/latex-dev/base/ltx3info.tex +2024/02/14 | 27122 | macros/latex-dev/base/ltxcheck.tex +2024/02/14 | 22822 | macros/latex-dev/base/ltxdoc.dtx +2024/02/14 | 244141 | macros/latex-dev/base/ltxdoc.pdf +2024/02/14 | 7528 | macros/latex-dev/base/ltxguide.cls +2024/02/14 | 21882 | macros/latex-dev/base/ltxref.dtx +2024/02/14 | 10601 | macros/latex-dev/base/makeindx.dtx +2024/02/14 | 3434 | macros/latex-dev/base/makeindx.ins +2024/02/14 | 165816 | macros/latex-dev/base/makeindx.pdf +2024/02/14 | 11463 | macros/latex-dev/base/manifest.txt +2024/02/14 | 1941 | macros/latex-dev/base/minimal.cls +2024/02/14 | 257825 | macros/latex-dev/base/modguide.pdf +2024/02/14 | 16500 | macros/latex-dev/base/modguide.tex +2024/02/14 | 4254 | macros/latex-dev/base/newdc.ins +2024/02/14 | 6357 | macros/latex-dev/base/newlfont.dtx +2024/02/14 | 18401 | macros/latex-dev/base/nfssfont.dtx +2024/02/14 | 2893 | macros/latex-dev/base/nfssfont.ins +2024/02/14 | 211314 | macros/latex-dev/base/nfssfont.pdf +2024/02/14 | 3960 | macros/latex-dev/base/olddc.ins +2024/02/14 | 8626 | macros/latex-dev/base/oldlfont.dtx +2024/02/14 | 9345 | macros/latex-dev/base/preload.dtx +2024/02/14 | 13589 | macros/latex-dev/base/proc.dtx +2024/02/14 | 3401 | macros/latex-dev/base/proc.ins +2024/02/14 | 227065 | macros/latex-dev/base/proc.pdf +2024/02/14 | 3100 | macros/latex-dev/base/README.md +2024/02/14 | 7200 | macros/latex-dev/base/sample2e.tex +2024/02/14 | 89727 | macros/latex-dev/base/slides.dtx +2024/02/14 | 6760 | macros/latex-dev/base/slides.ins +2024/02/14 | 375493 | macros/latex-dev/base/slides.pdf +2024/02/14 | 15693 | macros/latex-dev/base/slifonts.fdd +2024/02/14 | 233905 | macros/latex-dev/base/slifonts.pdf +2024/02/14 | 1694 | macros/latex-dev/base/small2e.tex +2024/02/14 | 6911 | macros/latex-dev/base/source2edoc.cls +2024/02/14 | 6239225 | macros/latex-dev/base/source2e.pdf +2024/02/14 | 15479 | macros/latex-dev/base/source2e.tex +2024/02/14 | 9398 | macros/latex-dev/base/syntonly.dtx +2024/02/14 | 2896 | macros/latex-dev/base/syntonly.ins +2024/02/14 | 189440 | macros/latex-dev/base/syntonly.pdf +2024/02/14 | 12520 | macros/latex-dev/base/testpage.tex +2024/02/14 | 173013 | macros/latex-dev/base/tlc2.err +2024/02/14 | 291143 | macros/latex-dev/base/tlc2.pdf +2024/02/14 | 44328 | macros/latex-dev/base/tlc3.err +2024/02/14 | 345764 | macros/latex-dev/base/tlc3.pdf +2024/02/14 | 12246 | macros/latex-dev/base/tulm.fdd +2024/02/14 | 3781 | macros/latex-dev/base/tulm.ins +2024/02/14 | 162773 | macros/latex-dev/base/tulm.pdf +2024/02/14 | 3181 | macros/latex-dev/base/unpack.ins +2024/02/14 | 439393 | macros/latex-dev/base/usrguide-historic.pdf +2024/02/14 | 68746 | macros/latex-dev/base/usrguide-historic.tex +2024/02/14 | 483354 | macros/latex-dev/base/usrguide.pdf +2024/02/14 | 55017 | macros/latex-dev/base/usrguide.tex +2024/02/14 | 92294 | macros/latex-dev/base/utf8ienc.dtx +2024/02/14 | 353399 | macros/latex-dev/base/utf8ienc.pdf +2024/02/14 | 10247 | macros/latex-dev/base/webcomp.err +2024/02/14 | 146197 | macros/latex-dev/base/webcomp.pdf +2024/02/14 | 43697199 | macros/latex-dev/base.zip 2023/11/01 | 8663 | macros/latex-dev/required/amsmath/amsbsy.dtx 2023/11/01 | 1505 | macros/latex-dev/required/amsmath/amsbsy.ins 2023/11/01 | 174946 | macros/latex-dev/required/amsmath/amsbsy.pdf @@ -257357,134 +257369,139 @@ 2023/11/01 | 10753 | macros/latex-dev/required/graphics/trig.dtx 2023/11/01 | 199266 | macros/latex-dev/required/graphics/trig.pdf 2023/11/02 | 3074347 | macros/latex-dev/required/graphics.zip -2023/11/01 | 886150 | macros/latex-dev/required/latex-lab/blocks-code.pdf -2023/11/01 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex -2023/11/01 | 440234 | macros/latex-dev/required/latex-lab/blocks-doc.pdf -2023/11/01 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex -2023/11/01 | 6593 | macros/latex-dev/required/latex-lab/changes.txt -2023/11/01 | 523380 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf -2023/11/01 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex -2023/11/01 | 389003 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf -2023/11/01 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex -2023/11/01 | 19447 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx -2023/11/01 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex -2023/11/01 | 3179 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx -2023/11/01 | 357553 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf -2023/11/01 | 14027 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx -2023/11/01 | 411092 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf -2023/11/01 | 135159 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx -2023/11/01 | 886150 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf -2023/11/01 | 4566 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx -2023/11/01 | 272864 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf -2023/11/01 | 16852 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx -2023/11/01 | 444977 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf -2023/11/01 | 87681 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx -2023/11/01 | 815656 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf -2023/11/01 | 34333 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx -2023/11/01 | 496997 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf -2023/11/01 | 6127 | macros/latex-dev/required/latex-lab/latex-lab.ins -2023/11/01 | 37115 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx -2023/11/01 | 612623 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf -2023/11/01 | 2453 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx -2023/11/01 | 302371 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf -2023/11/01 | 6134 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx -2023/11/01 | 357553 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf -2023/11/01 | 7303 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx -2023/11/01 | 280811 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf -2023/11/01 | 2882 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx -2023/11/01 | 234649 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf -2023/11/01 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx -2023/11/01 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf -2023/11/01 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx -2023/11/01 | 632310 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf -2023/11/01 | 26638 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx -2023/11/01 | 527916 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf -2023/11/01 | 65052 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx -2023/11/01 | 621929 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf -2023/11/01 | 4770 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx -2023/11/01 | 298403 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf -2023/11/01 | 3669 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx -2023/11/01 | 307812 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf -2023/11/01 | 12805 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx -2023/11/01 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx -2023/11/01 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf -2023/11/01 | 18464 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx -2023/11/01 | 361084 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf -2023/11/01 | 396817 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf -2023/11/01 | 1156 | macros/latex-dev/required/latex-lab/README.md -2023/11/02 | 11370244 | macros/latex-dev/required/latex-lab.zip -2023/11/01 | 14075 | macros/latex-dev/required/tools/afterpage.dtx -2023/11/01 | 2538 | macros/latex-dev/required/tools/afterpage.ins -2023/11/01 | 198100 | macros/latex-dev/required/tools/afterpage.pdf -2023/11/01 | 11749 | macros/latex-dev/required/tools/array-2016-10-06.sty -2023/11/01 | 12559 | macros/latex-dev/required/tools/array-2020-02-10.sty -2023/11/01 | 128520 | macros/latex-dev/required/tools/array.dtx -2023/11/01 | 517410 | macros/latex-dev/required/tools/array.pdf -2023/11/01 | 61635 | macros/latex-dev/required/tools/bm.dtx -2023/11/01 | 2524 | macros/latex-dev/required/tools/bm.ins -2023/11/01 | 323929 | macros/latex-dev/required/tools/bm.pdf -2023/11/01 | 53167 | macros/latex-dev/required/tools/calc.dtx -2023/11/01 | 370660 | macros/latex-dev/required/tools/calc.pdf -2023/11/01 | 63675 | macros/latex-dev/required/tools/changes.txt -2023/11/01 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx -2023/11/01 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf -2023/11/01 | 6789 | macros/latex-dev/required/tools/delarray.dtx -2023/11/01 | 191058 | macros/latex-dev/required/tools/delarray.pdf -2023/11/01 | 10637 | macros/latex-dev/required/tools/enumerate.dtx -2023/11/01 | 215077 | macros/latex-dev/required/tools/enumerate.pdf -2023/11/01 | 4959 | macros/latex-dev/required/tools/fileerr.dtx -2023/11/01 | 188281 | macros/latex-dev/required/tools/fileerr.pdf -2023/11/01 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx -2023/11/01 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf -2023/11/01 | 39697 | macros/latex-dev/required/tools/ftnright.dtx -2023/11/01 | 387794 | macros/latex-dev/required/tools/ftnright.pdf -2023/11/01 | 11148 | macros/latex-dev/required/tools/hhline.dtx -2023/11/01 | 189678 | macros/latex-dev/required/tools/hhline.pdf -2023/11/01 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx -2023/11/01 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf -2023/11/01 | 32047 | macros/latex-dev/required/tools/layout.dtx -2023/11/01 | 260278 | macros/latex-dev/required/tools/layout.pdf -2023/11/01 | 12133 | macros/latex-dev/required/tools/longtable-2020-01-07.sty -2023/11/01 | 76541 | macros/latex-dev/required/tools/longtable.dtx -2023/11/01 | 2538 | macros/latex-dev/required/tools/longtable.ins -2023/11/01 | 391258 | macros/latex-dev/required/tools/longtable.pdf -2023/11/01 | 3284 | macros/latex-dev/required/tools/manifest.txt -2023/11/01 | 29712 | macros/latex-dev/required/tools/multicol-2017-04-11.sty -2023/11/01 | 31646 | macros/latex-dev/required/tools/multicol-2019-10-01.sty -2023/11/01 | 186367 | macros/latex-dev/required/tools/multicol.dtx -2023/11/01 | 2576 | macros/latex-dev/required/tools/multicol.ins -2023/11/01 | 523618 | macros/latex-dev/required/tools/multicol.pdf -2023/11/01 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx -2023/11/01 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf -2023/11/01 | 1664 | macros/latex-dev/required/tools/README.md -2023/11/01 | 9559 | macros/latex-dev/required/tools/shellesc.dtx -2023/11/01 | 176171 | macros/latex-dev/required/tools/shellesc.pdf -2023/11/01 | 8632 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty -2023/11/01 | 30279 | macros/latex-dev/required/tools/showkeys.dtx -2023/11/01 | 252975 | macros/latex-dev/required/tools/showkeys.pdf -2023/11/01 | 5791 | macros/latex-dev/required/tools/somedefs.dtx -2023/11/01 | 167583 | macros/latex-dev/required/tools/somedefs.pdf -2023/11/01 | 35874 | macros/latex-dev/required/tools/tabularx.dtx -2023/11/01 | 2535 | macros/latex-dev/required/tools/tabularx.ins -2023/11/01 | 287013 | macros/latex-dev/required/tools/tabularx.pdf -2023/11/01 | 43446 | macros/latex-dev/required/tools/theorem.dtx -2023/11/01 | 352315 | macros/latex-dev/required/tools/theorem.pdf -2023/11/01 | 5680 | macros/latex-dev/required/tools/tools.ins -2023/11/01 | 73673 | macros/latex-dev/required/tools/tools-overview.pdf -2023/11/01 | 5211 | macros/latex-dev/required/tools/tools-overview.tex -2023/11/01 | 25146 | macros/latex-dev/required/tools/trace.dtx -2023/11/01 | 222074 | macros/latex-dev/required/tools/trace.pdf -2023/11/01 | 33863 | macros/latex-dev/required/tools/varioref-2016-02-16.sty -2023/11/01 | 114350 | macros/latex-dev/required/tools/varioref.dtx -2023/11/01 | 2531 | macros/latex-dev/required/tools/varioref.ins -2023/11/01 | 393134 | macros/latex-dev/required/tools/varioref.pdf -2023/11/01 | 72132 | macros/latex-dev/required/tools/verbatim.dtx -2023/11/01 | 331003 | macros/latex-dev/required/tools/verbatim.pdf -2023/11/01 | 6219 | macros/latex-dev/required/tools/xr.dtx -2023/11/01 | 170451 | macros/latex-dev/required/tools/xr.pdf -2023/11/01 | 17856 | macros/latex-dev/required/tools/xspace.dtx -2023/11/01 | 257027 | macros/latex-dev/required/tools/xspace.pdf -2023/11/02 | 7252214 | macros/latex-dev/required/tools.zip +2024/02/14 | 871503 | macros/latex-dev/required/latex-lab/blocks-code.pdf +2024/02/14 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex +2024/02/14 | 485950 | macros/latex-dev/required/latex-lab/blocks-doc.pdf +2024/02/14 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex +2024/02/14 | 10215 | macros/latex-dev/required/latex-lab/changes.txt +2024/02/14 | 531721 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf +2024/02/14 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex +2024/02/14 | 419214 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf +2024/02/14 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex +2024/02/14 | 20674 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx +2024/02/14 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex +2024/02/14 | 6220 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx +2024/02/14 | 373342 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf +2024/02/14 | 14373 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx +2024/02/14 | 383259 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf +2024/02/14 | 136797 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx +2024/02/14 | 871503 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf +2024/02/14 | 4973 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx +2024/02/14 | 273812 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf +2024/02/14 | 17978 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx +2024/02/14 | 426817 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf +2024/02/14 | 87681 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx +2024/02/14 | 815072 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf +2024/02/14 | 34457 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx +2024/02/14 | 517737 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf +2024/02/14 | 6601 | macros/latex-dev/required/latex-lab/latex-lab.ins +2024/02/14 | 8891 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx +2024/02/14 | 389702 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf +2024/02/14 | 72603 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx +2024/02/14 | 740461 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf +2024/02/14 | 2453 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx +2024/02/14 | 302442 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf +2024/02/14 | 6266 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx +2024/02/14 | 373342 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf +2024/02/14 | 7315 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx +2024/02/14 | 280811 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf +2024/02/14 | 2894 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx +2024/02/14 | 234649 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf +2024/02/14 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx +2024/02/14 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf +2024/02/14 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx +2024/02/14 | 632196 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf +2024/02/14 | 26699 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx +2024/02/14 | 527096 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf +2024/02/14 | 40120 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx +2024/02/14 | 556861 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf +2024/02/14 | 4819 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx +2024/02/14 | 298373 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf +2024/02/14 | 3674 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx +2024/02/14 | 307812 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf +2024/02/14 | 17010 | macros/latex-dev/required/latex-lab/latex-lab-title.dtx +2024/02/14 | 348117 | macros/latex-dev/required/latex-lab/latex-lab-title.pdf +2024/02/14 | 12805 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx +2024/02/14 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx +2024/02/14 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf +2024/02/14 | 18465 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx +2024/02/14 | 361081 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf +2024/02/14 | 396814 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf +2024/02/14 | 1156 | macros/latex-dev/required/latex-lab/README.md +2024/02/14 | 12222080 | macros/latex-dev/required/latex-lab.zip +2024/02/14 | 14075 | macros/latex-dev/required/tools/afterpage.dtx +2024/02/14 | 2538 | macros/latex-dev/required/tools/afterpage.ins +2024/02/14 | 198100 | macros/latex-dev/required/tools/afterpage.pdf +2024/02/14 | 11749 | macros/latex-dev/required/tools/array-2016-10-06.sty +2024/02/14 | 12559 | macros/latex-dev/required/tools/array-2020-02-10.sty +2024/02/14 | 12667 | macros/latex-dev/required/tools/array-2023-11-01.sty +2024/02/14 | 139685 | macros/latex-dev/required/tools/array.dtx +2024/02/14 | 838028 | macros/latex-dev/required/tools/array.pdf +2024/02/14 | 61642 | macros/latex-dev/required/tools/bm.dtx +2024/02/14 | 2524 | macros/latex-dev/required/tools/bm.ins +2024/02/14 | 323640 | macros/latex-dev/required/tools/bm.pdf +2024/02/14 | 53167 | macros/latex-dev/required/tools/calc.dtx +2024/02/14 | 370660 | macros/latex-dev/required/tools/calc.pdf +2024/02/14 | 64838 | macros/latex-dev/required/tools/changes.txt +2024/02/14 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx +2024/02/14 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf +2024/02/14 | 6789 | macros/latex-dev/required/tools/delarray.dtx +2024/02/14 | 191058 | macros/latex-dev/required/tools/delarray.pdf +2024/02/14 | 10637 | macros/latex-dev/required/tools/enumerate.dtx +2024/02/14 | 215077 | macros/latex-dev/required/tools/enumerate.pdf +2024/02/14 | 4959 | macros/latex-dev/required/tools/fileerr.dtx +2024/02/14 | 187725 | macros/latex-dev/required/tools/fileerr.pdf +2024/02/14 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx +2024/02/14 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf +2024/02/14 | 39697 | macros/latex-dev/required/tools/ftnright.dtx +2024/02/14 | 387253 | macros/latex-dev/required/tools/ftnright.pdf +2024/02/14 | 11148 | macros/latex-dev/required/tools/hhline.dtx +2024/02/14 | 189678 | macros/latex-dev/required/tools/hhline.pdf +2024/02/14 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx +2024/02/14 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf +2024/02/14 | 32047 | macros/latex-dev/required/tools/layout.dtx +2024/02/14 | 260278 | macros/latex-dev/required/tools/layout.pdf +2024/02/14 | 12133 | macros/latex-dev/required/tools/longtable-2020-01-07.sty +2024/02/14 | 85710 | macros/latex-dev/required/tools/longtable.dtx +2024/02/14 | 2538 | macros/latex-dev/required/tools/longtable.ins +2024/02/14 | 400149 | macros/latex-dev/required/tools/longtable.pdf +2024/02/14 | 3284 | macros/latex-dev/required/tools/manifest.txt +2024/02/14 | 29712 | macros/latex-dev/required/tools/multicol-2017-04-11.sty +2024/02/14 | 31646 | macros/latex-dev/required/tools/multicol-2019-10-01.sty +2024/02/14 | 188163 | macros/latex-dev/required/tools/multicol.dtx +2024/02/14 | 2576 | macros/latex-dev/required/tools/multicol.ins +2024/02/14 | 524502 | macros/latex-dev/required/tools/multicol.pdf +2024/02/14 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx +2024/02/14 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf +2024/02/14 | 1664 | macros/latex-dev/required/tools/README.md +2024/02/14 | 9559 | macros/latex-dev/required/tools/shellesc.dtx +2024/02/14 | 176171 | macros/latex-dev/required/tools/shellesc.pdf +2024/02/14 | 8632 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty +2024/02/14 | 30368 | macros/latex-dev/required/tools/showkeys.dtx +2024/02/14 | 252684 | macros/latex-dev/required/tools/showkeys.pdf +2024/02/14 | 5791 | macros/latex-dev/required/tools/somedefs.dtx +2024/02/14 | 167583 | macros/latex-dev/required/tools/somedefs.pdf +2024/02/14 | 37462 | macros/latex-dev/required/tools/tabularx.dtx +2024/02/14 | 2535 | macros/latex-dev/required/tools/tabularx.ins +2024/02/14 | 289601 | macros/latex-dev/required/tools/tabularx.pdf +2024/02/14 | 43446 | macros/latex-dev/required/tools/theorem.dtx +2024/02/14 | 351765 | macros/latex-dev/required/tools/theorem.pdf +2024/02/14 | 5680 | macros/latex-dev/required/tools/tools.ins +2024/02/14 | 73673 | macros/latex-dev/required/tools/tools-overview.pdf +2024/02/14 | 5211 | macros/latex-dev/required/tools/tools-overview.tex +2024/02/14 | 25146 | macros/latex-dev/required/tools/trace.dtx +2024/02/14 | 222074 | macros/latex-dev/required/tools/trace.pdf +2024/02/14 | 33863 | macros/latex-dev/required/tools/varioref-2016-02-16.sty +2024/02/14 | 114350 | macros/latex-dev/required/tools/varioref.dtx +2024/02/14 | 2531 | macros/latex-dev/required/tools/varioref.ins +2024/02/14 | 393134 | macros/latex-dev/required/tools/varioref.pdf +2024/02/14 | 72911 | macros/latex-dev/required/tools/verbatim.dtx +2024/02/14 | 331587 | macros/latex-dev/required/tools/verbatim.pdf +2024/02/14 | 6219 | macros/latex-dev/required/tools/xr.dtx +2024/02/14 | 170451 | macros/latex-dev/required/tools/xr.pdf +2024/02/14 | 17856 | macros/latex-dev/required/tools/xspace.dtx +2024/02/14 | 257027 | macros/latex-dev/required/tools/xspace.pdf +2024/02/14 | 7586835 | 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 @@ -260330,15 +260347,15 @@ 2007/07/13 | 9394 | macros/omega/latex/contrib/tamil-omega/yudit/Tamil2.my 2007/07/13 | 11462 | macros/omega/latex/contrib/tamil-omega/yudit/yudit.properties 2007/12/12 | 900761 | macros/omega/latex/contrib/tamil-omega.zip -2023/06/25 | 6948 | macros/optex/base/alloc.opm -2023/11/11 | 6717 | macros/optex/base/basic-macros.opm +2023/12/10 | 6949 | macros/optex/base/alloc.opm +2023/12/15 | 6717 | macros/optex/base/basic-macros.opm 2023/09/15 | 35427 | macros/optex/base/bib-iso690.opm 2023/09/15 | 6522 | macros/optex/base/bib-simple.opm 2023/06/03 | 13902 | macros/optex/base/cite-bib.opm 2023/09/28 | 20447 | macros/optex/base/colors.opm -2022/12/11 | 15909 | macros/optex/base/doc.opm +2023/12/10 | 15920 | macros/optex/base/doc.opm 2021/04/22 | 657 | macros/optex/base/f-adventor.opm -2023/11/07 | 14021 | macros/optex/base/fams-ini.opm +2024/01/10 | 14394 | macros/optex/base/fams-ini.opm 2021/04/22 | 1156 | macros/optex/base/f-antt.opm 2022/05/02 | 652 | macros/optex/base/f-baskervald.opm 2021/04/22 | 665 | macros/optex/base/f-baskerville.opm @@ -260354,9 +260371,11 @@ 2023/03/23 | 1089 | macros/optex/base/f-draftingmono.opm 2021/04/22 | 1265 | macros/optex/base/f-ebgaramond.opm 2023/02/11 | 971 | macros/optex/base/f-erewhon.opm +2024/01/10 | 815 | macros/optex/base/f-fbb.opm 2023/03/08 | 2443 | macros/optex/base/f-fira.opm 2023/11/07 | 3072 | macros/optex/base/f-fraunces.opm 2021/04/22 | 882 | macros/optex/base/f-garamondl.opm +2023/12/02 | 800 | macros/optex/base/f-gentium.opm 2021/04/22 | 635 | macros/optex/base/f-gfsbodoni.opm 2023/02/23 | 10980 | macros/optex/base/f-heros.opm 2023/05/29 | 655 | macros/optex/base/f-heuristica.opm @@ -260372,16 +260391,16 @@ 2021/04/27 | 1527 | macros/optex/base/f-libertinus.opm 2021/04/22 | 658 | macros/optex/base/f-librecaslon.opm 2021/01/07 | 1536 | macros/optex/base/f-lido.opm -2023/05/12 | 8816 | macros/optex/base/f-lmfonts.opm +2023/12/07 | 8816 | macros/optex/base/f-lmfonts.opm 2021/04/22 | 1200 | macros/optex/base/f-merriweather.opm 2022/07/11 | 1423 | macros/optex/base/f-montserrat.opm 2021/04/27 | 1337 | macros/optex/base/f-newcm.opm 2023/04/15 | 9058 | macros/optex/base/fnotes.opm 2023/06/06 | 679 | macros/optex/base/f-oldstandard.opm 2023/06/05 | 5291 | macros/optex/base/fonts-catalog.opm -2022/02/22 | 9448 | macros/optex/base/fonts-opmac.opm -2022/02/12 | 2423 | macros/optex/base/fonts-preload.opm -2023/11/06 | 16749 | macros/optex/base/fonts-resize.opm +2024/01/25 | 9686 | macros/optex/base/fonts-opmac.opm +2023/12/11 | 2429 | macros/optex/base/fonts-preload.opm +2024/02/12 | 16778 | macros/optex/base/fonts-resize.opm 2023/06/16 | 42783 | macros/optex/base/fonts-select.opm 2022/05/22 | 893 | macros/optex/base/f-overlock.opm 2021/04/22 | 694 | macros/optex/base/f-pagella.opm @@ -260402,43 +260421,43 @@ 2023/03/02 | 9677 | macros/optex/base/hi-syntax.opm 2023/10/25 | 3087 | macros/optex/base/hisyntax-python.opm 2021/01/07 | 1566 | macros/optex/base/hisyntax-tex.opm -2023/04/27 | 9984 | macros/optex/base/hyperlinks.opm -2023/10/17 | 16191 | macros/optex/base/if-macros.opm -2023/10/31 | 5965 | macros/optex/base/keyval.opm +2023/12/23 | 10016 | macros/optex/base/hyperlinks.opm +2023/12/07 | 16251 | macros/optex/base/if-macros.opm +2023/11/25 | 6672 | macros/optex/base/keyval.opm 2023/08/31 | 9237 | macros/optex/base/lang-data.opm 2023/09/19 | 16581 | macros/optex/base/lang-decl.opm 2022/11/18 | 7314 | macros/optex/base/languages.opm 2023/10/20 | 5428 | macros/optex/base/lists.opm -2021/01/11 | 2377 | macros/optex/base/logos.opm +2024/02/12 | 2928 | macros/optex/base/logos.opm 2021/04/06 | 7398 | macros/optex/base/luatex-ini.opm 2023/06/02 | 25765 | macros/optex/base/makeindex.opm 2023/05/01 | 6522 | macros/optex/base/maketoc.opm -2023/05/01 | 5717 | macros/optex/base/margins.opm +2023/12/15 | 5822 | macros/optex/base/margins.opm 2021/04/20 | 13569 | macros/optex/base/mathclass.opm -2023/10/18 | 46628 | macros/optex/base/math-macros.opm +2023/12/22 | 46814 | macros/optex/base/math-macros.opm 2023/07/03 | 11216 | macros/optex/base/math-preload.opm -2023/01/24 | 17853 | macros/optex/base/more-macros.opm +2024/02/10 | 19195 | macros/optex/base/more-macros.opm 2022/11/26 | 6505 | macros/optex/base/multicolumns.opm -2023/11/12 | 4074 | macros/optex/base/optex.ini +2024/02/14 | 4074 | macros/optex/base/optex.ini 2023/07/03 | 28327 | macros/optex/base/optex.lua -2023/11/16 | 30539 | macros/optex/base/optex-tricks.opm -2023/11/15 | 10692 | macros/optex/base/others.opm +2024/02/14 | 31498 | macros/optex/base/optex-tricks.opm +2024/02/13 | 10802 | macros/optex/base/others.opm 2022/11/25 | 4624 | macros/optex/base/outlines.opm 2023/04/29 | 11596 | macros/optex/base/output.opm -2023/09/19 | 27426 | macros/optex/base/parameters.opm +2023/12/10 | 27439 | macros/optex/base/parameters.opm 2022/10/29 | 5518 | macros/optex/base/pdfuni-string.opm -2022/10/14 | 14785 | macros/optex/base/plain-macros.opm -2023/05/11 | 18535 | macros/optex/base/prefixed.opm +2023/12/15 | 15140 | macros/optex/base/plain-macros.opm +2024/02/02 | 18838 | macros/optex/base/prefixed.opm 2022/06/09 | 2309 | macros/optex/base/print-unimath.opm 2023/10/26 | 5533 | macros/optex/base/references.opm 2022/08/30 | 6782 | macros/optex/base/ref-file.opm -2023/05/02 | 21948 | macros/optex/base/sections.opm -2022/12/11 | 13009 | macros/optex/base/slides.opm -2022/01/13 | 2754 | macros/optex/base/styles.opm +2024/01/19 | 22498 | macros/optex/base/sections.opm +2024/01/18 | 13009 | macros/optex/base/slides.opm +2024/01/18 | 2754 | macros/optex/base/styles.opm 2023/06/27 | 28077 | macros/optex/base/table.opm 2022/02/05 | 122830 | macros/optex/base/uni-lcuc.opm -2023/01/17 | 26493 | macros/optex/base/unimath-codes.opm -2023/09/03 | 16622 | macros/optex/base/unimath-macros.opm +2023/12/23 | 26522 | macros/optex/base/unimath-codes.opm +2023/12/22 | 16751 | macros/optex/base/unimath-macros.opm 2022/02/08 | 241449 | macros/optex/base/unimath-table.opm 2023/06/25 | 30123 | macros/optex/base/usebib.opm 2022/10/29 | 17666 | macros/optex/base/verbatim.opm @@ -260447,29 +260466,30 @@ 2021/01/07 | 1192 | macros/optex/demo/op-letter-cs.tex 2021/01/07 | 573 | macros/optex/demo/op-letter-en.tex 2023/08/31 | 2801 | macros/optex/demo/op-letter-he.tex -2021/04/08 | 8265 | macros/optex/demo/op-mathalign.tex +2024/02/12 | 8267 | macros/optex/demo/op-mathalign.tex 2020/05/16 | 512984 | macros/optex/demo/op-ring.png 2020/05/17 | 62385 | macros/optex/demo/op-slides-bg.png 2023/09/19 | 10349 | macros/optex/demo/op-slides.tex 2023/08/01 | 34625 | macros/optex/doc/omls.tex 2020/05/16 | 1460 | macros/optex/doc/optex.1 -2023/11/16 | 1585608 | macros/optex/doc/optex-doc.pdf -2023/11/12 | 4516 | macros/optex/doc/optex-doc.tex +2024/02/14 | 1907216 | macros/optex/doc/optex-doc.pdf +2024/02/14 | 5134 | macros/optex/doc/optex-doc.tex 2023/04/15 | 70994 | macros/optex/doc/optex-math.tex -2022/11/22 | 8487 | macros/optex/doc/optex-techdoc.tex -2023/11/15 | 94049 | macros/optex/doc/optex-userdoc.tex +2023/12/09 | 8505 | macros/optex/doc/optex-techdoc.tex +2024/02/13 | 94210 | macros/optex/doc/optex-userdoc.tex +2023/12/23 | 4688 | macros/optex/doc/primitives.tex 2021/05/02 | 1949 | macros/optex/pkg/emoji.opm 2023/04/15 | 41931 | macros/optex/pkg/math.opm 2022/03/05 | 327 | macros/optex/pkg/minim-mp.opm 2023/11/02 | 7513 | macros/optex/pkg/minim.opm 2022/03/06 | 3196 | macros/optex/pkg/minim-pdf.opm -2022/11/21 | 22083 | macros/optex/pkg/mte.opm +2024/02/11 | 22087 | macros/optex/pkg/mte.opm 2022/02/19 | 1282 | macros/optex/pkg/plain-at.opm 2020/11/11 | 85045 | macros/optex/pkg/qrcode.opm 2023/03/04 | 5289 | macros/optex/pkg/tikz.opm 2023/06/23 | 7542 | macros/optex/pkg/vlna.opm -2023/11/16 | 9775 | macros/optex/README -2023/11/16 | 2628129 | macros/optex.zip +2024/02/14 | 10016 | macros/optex/README +2024/02/14 | 2916644 | macros/optex.zip 2024/01/08 | 732 | macros/pdftex/mptopdf/doc/context/scripts/mkii/mptopdf.man 2024/01/08 | 4557 | macros/pdftex/mptopdf/scripts/context/perl/mptopdf.pl 2024/01/08 | 21474 | macros/pdftex/mptopdf/tex/context/base/mkii/supp-mis.mkii @@ -300667,10 +300687,10 @@ 2015/09/07 | 43353 | support/texlog_extract/texlog_extract.pdf 2015/09/07 | 47810 | support/texlog_extract.zip 2022/10/14 | 19106 | support/texlogfilter/LICENSE -2024/02/13 | 3040 | support/texlogfilter/README -2024/02/13 | 12502 | support/texlogfilter/texlogfilter -2024/02/13 | 3920 | support/texlogfilter/texlogfilter.html -2024/02/13 | 13283 | support/texlogfilter.zip +2024/02/14 | 3111 | support/texlogfilter/README +2024/02/14 | 12655 | support/texlogfilter/texlogfilter +2024/02/14 | 4000 | support/texlogfilter/texlogfilter.html +2024/02/14 | 13356 | support/texlogfilter.zip 2024/01/15 | 35149 | support/texlogsieve/LICENCE.txt 2024/01/15 | 2810 | support/texlogsieve/README.md 2024/01/15 | 210170 | support/texlogsieve/texlogsieve @@ -315956,7 +315976,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/02/13 | 432272 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69818.tar.xz +2024/02/14 | 432272 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69830.tar.xz 2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz 2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz 2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz @@ -315978,7 +315998,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/02/13 | 114048 | systems/texlive/tlnet/archive/texlive-scripts.r69818.tar.xz +2024/02/14 | 114016 | systems/texlive/tlnet/archive/texlive-scripts.r69830.tar.xz 2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz 2023/05/14 | 60312 | systems/texlive/tlnet/archive/texlive-scripts.windows.r67095.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz @@ -317886,16 +317906,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/02/05 | 125030 | systems/texlive/tlnet/install-tl -2024/02/13 | 5750361 | systems/texlive/tlnet/install-tl-unx.tar.gz -2024/02/13 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 -2024/02/13 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2024/02/14 | 5746636 | systems/texlive/tlnet/install-tl-unx.tar.gz +2024/02/14 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2024/02/14 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc 2023/05/13 | 5083 | systems/texlive/tlnet/install-tl-windows.bat -2024/02/13 | 21031685 | systems/texlive/tlnet/install-tl-windows.exe -2024/02/13 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 -2024/02/13 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2024/02/13 | 26035589 | systems/texlive/tlnet/install-tl.zip -2024/02/13 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 -2024/02/13 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2024/02/14 | 21026355 | systems/texlive/tlnet/install-tl-windows.exe +2024/02/14 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2024/02/14 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2024/02/14 | 26035553 | systems/texlive/tlnet/install-tl.zip +2024/02/14 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2024/02/14 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc 2023/03/19 | 1229 | systems/texlive/tlnet/README.md 2023/03/19 | 0 | systems/texlive/tlnet/TEXLIVE_2023 2024/01/02 | 9011 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg @@ -317905,7 +317925,7 @@ 2024/01/02 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg 2024/01/16 | 50726 | systems/texlive/tlnet/tlpkg/installer/config.guess 2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt -2024/02/13 | 7311 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +2024/02/14 | 7219 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2023/12/13 | 226639 | 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 @@ -317947,12 +317967,12 @@ 2023/02/21 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm 2024/01/31 | 5840 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm 2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm -2024/02/13 | 19322816 | systems/texlive/tlnet/tlpkg/texlive.tlpdb -2024/02/13 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2024/02/14 | 19322816 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2024/02/14 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 2024/01/31 | 87229 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm -2024/02/13 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 -2024/02/13 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2024/02/13 | 2547836 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2024/02/14 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2024/02/14 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2024/02/14 | 2545820 | 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 @@ -320659,7 +320679,7 @@ 2024/02/11 | 95286 | systems/texlive/tlnet/tlpkg/translations/fr.po 2024/02/11 | 88795 | systems/texlive/tlnet/tlpkg/translations/it.po 2024/02/11 | 63064 | systems/texlive/tlnet/tlpkg/translations/ja.po -2024/02/13 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot +2024/02/14 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot 2024/02/11 | 59155 | systems/texlive/tlnet/tlpkg/translations/nl.po 2024/02/11 | 68210 | systems/texlive/tlnet/tlpkg/translations/pl.po 2024/02/11 | 83641 | systems/texlive/tlnet/tlpkg/translations/pt_BR.po @@ -329105,7 +329125,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/02/14 | 186 | timestamp +2024/02/15 | 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 d094dcf2aa..e054588b8f 100644 --- a/FILES.byname.gz +++ b/FILES.byname.gz diff --git a/FILES.last07days b/FILES.last07days index 4e9dc847a2..80be2b611a 100644 --- a/FILES.last07days +++ b/FILES.last07days @@ -1,54 +1,611 @@ +2024/02/14 | 99 | macros/latex-dev/base/ltpara-code.tex +2024/02/14 | 9935 | macros/latex-dev/base/ltnews21.tex +2024/02/14 | 96 | macros/latex-dev/base/doc-code.tex +2024/02/14 | 9559 | macros/latex-dev/required/tools/shellesc.dtx +2024/02/14 | 9557 | macros/latex-dev/base/ltcntrl.dtx +2024/02/14 | 9398 | macros/latex-dev/base/syntonly.dtx +2024/02/14 | 9345 | macros/latex-dev/base/preload.dtx +2024/02/14 | 93035 | macros/latex-dev/base/ltdefns.dtx +2024/02/14 | 92294 | macros/latex-dev/base/utf8ienc.dtx +2024/02/14 | 92269 | macros/latex-dev/base/lttemplates.dtx +2024/02/14 | 9068 | macros/latex-dev/base/lppl-1-0.txt +2024/02/14 | 8976 | macros/latex-dev/required/tools/rawfonts.dtx +2024/02/14 | 89727 | macros/latex-dev/base/slides.dtx +2024/02/14 | 8970 | macros/latex-dev/base/ltnews17.tex +2024/02/14 | 896 | macros/generic/lt3luabridge/README.md +2024/02/14 | 8891 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx +2024/02/14 | 87681 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.dtx +2024/02/14 | 8731 | macros/latex-dev/base/ltthm.dtx +2024/02/14 | 871503 | macros/latex-dev/required/latex-lab/latex-lab-block.pdf +2024/02/14 | 871503 | macros/latex-dev/required/latex-lab/blocks-code.pdf +2024/02/14 | 864 | biblio/bibtex/contrib/francais-bst/francaisbst.dbj +2024/02/14 | 8632 | macros/latex-dev/required/tools/showkeys-2014-10-28.sty +2024/02/14 | 8626 | macros/latex-dev/base/oldlfont.dtx +2024/02/14 | 85710 | macros/latex-dev/required/tools/longtable.dtx +2024/02/14 | 84220 | macros/latex-dev/base/ltfssini.dtx +2024/02/14 | 838028 | macros/latex-dev/required/tools/array.pdf +2024/02/14 | 82917 | macros/latex-dev/base/ltfssbas.dtx +2024/02/14 | 821580 | macros/latex-dev/base/ltshipout-code.pdf +2024/02/14 | 815072 | macros/latex-dev/required/latex-lab/latex-lab-footnotes.pdf +2024/02/14 | 809033 | macros/latex/contrib/huawei/huawei.pdf +2024/02/14 | 80747 | macros/latex-dev/base/ltshipout.dtx +2024/02/14 | 8051 | macros/latex-dev/base/ltnews.tex +2024/02/14 | 803049 | macros/latex-dev/base/ltfilehook-code.pdf +2024/02/14 | 7679515 | install/macros/latex-dev/required/latex-tools-dev.tds.zip +2024/02/14 | 7653968 | graphics/pgf/contrib/pgf-periodictable.zip +2024/02/14 | 7586835 | macros/latex-dev/required/tools.zip +2024/02/14 | 758273 | macros/latex-dev/base/lthooks-doc.pdf +2024/02/14 | 757049 | macros/latex-dev/base/doc.pdf +2024/02/14 | 75392 | macros/latex-dev/base/ltluatex.dtx +2024/02/14 | 7528 | macros/latex-dev/base/ltxguide.cls +2024/02/14 | 752365 | macros/latex-dev/base/ltcmdhooks-code.pdf +2024/02/14 | 75111 | macros/latex-dev/base/ltfssdcl.dtx +2024/02/14 | 75109 | macros/latex-dev/base/ltmarks.dtx +2024/02/14 | 7456869 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf +2024/02/14 | 741 | macros/latex/contrib/eolang/eolang.1 +2024/02/14 | 740461 | macros/latex-dev/required/latex-lab/latex-lab-math.pdf +2024/02/14 | 73673 | macros/latex-dev/required/tools/tools-overview.pdf +2024/02/14 | 7315 | macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx +2024/02/14 | 72911 | macros/latex-dev/required/tools/verbatim.dtx +2024/02/14 | 72603 | macros/latex-dev/required/latex-lab/latex-lab-math.dtx +2024/02/14 | 72493 | macros/latex-dev/base/ltfsstrc.dtx +2024/02/14 | 7248 | graphics/pgf/contrib/pgf-periodictable/myGroupColors.tex +2024/02/14 | 7244 | macros/latex-dev/base/ltnews20.tex +2024/02/14 | 7219 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +2024/02/14 | 7216 | macros/latex-dev/base/exscale.dtx +2024/02/14 | 7200 | macros/latex-dev/base/sample2e.tex +2024/02/14 | 711767 | macros/latex-dev/base/ltmarks-code.pdf +2024/02/14 | 7104 | macros/latex-dev/base/alltt.dtx +2024/02/14 | 7029 | macros/latex-dev/base/ltnews13.tex +2024/02/14 | 69441 | macros/latex-dev/base/clsguide-historic.tex +2024/02/14 | 6911 | macros/latex-dev/base/source2edoc.cls +2024/02/14 | 69002 | macros/latex-dev/base/ltpictur.dtx +2024/02/14 | 68746 | macros/latex-dev/base/usrguide-historic.tex +2024/02/14 | 6789 | macros/latex-dev/required/tools/delarray.dtx +2024/02/14 | 677 | macros/latex/contrib/huawei/DEPENDS.txt +2024/02/14 | 67672 | macros/latex-dev/base/ltcmdhooks.dtx +2024/02/14 | 6760 | macros/latex-dev/base/slides.ins +2024/02/14 | 67585 | macros/latex-dev/base/ltfilehook.dtx +2024/02/14 | 672114 | macros/latex-dev/base/ltpara-code.pdf +2024/02/14 | 6709 | macros/latex-dev/base/latexsym.dtx +2024/02/14 | 6601 | macros/latex-dev/required/latex-lab/latex-lab.ins +2024/02/14 | 65689 | macros/latex-dev/base/ltmiscen.dtx +2024/02/14 | 64838 | macros/latex-dev/required/tools/changes.txt +2024/02/14 | 64605 | macros/latex-dev/base/clsguide.tex +2024/02/14 | 6424 | macros/latex-dev/base/ltnews14.tex +2024/02/14 | 641 | macros/latex/contrib/eolang/eolang.bib +2024/02/14 | 6357 | macros/latex-dev/base/newlfont.dtx +2024/02/14 | 63280 | macros/latex-dev/base/letter.dtx +2024/02/14 | 632196 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.pdf +2024/02/14 | 62897 | macros/latex-dev/base/ltfiles.dtx +2024/02/14 | 6266 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx +2024/02/14 | 6248 | macros/latex-dev/base/ltmeta.dtx +2024/02/14 | 6239225 | macros/latex-dev/base/source2e.pdf +2024/02/14 | 6221 | macros/latex-dev/required/latex-lab/glyphtounicode-cmex.tex +2024/02/14 | 6220 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx +2024/02/14 | 62209 | macros/latex/contrib/eolang/eolang.dtx +2024/02/14 | 6219 | macros/latex-dev/required/tools/xr.dtx +2024/02/14 | 6202 | macros/latex-dev/base/latexrelease.ins +2024/02/14 | 61642 | macros/latex-dev/required/tools/bm.dtx +2024/02/14 | 6155 | macros/latex-dev/base/ltpar.dtx +2024/02/14 | 60434 | macros/latex-dev/base/ltplain.dtx +2024/02/14 | 60422 | macros/latex-dev/base/fontdef.dtx +2024/02/14 | 598937 | macros/latex-dev/base/ltsockets-code.pdf +2024/02/14 | 5986 | macros/latex-dev/base/ltnews15.tex +2024/02/14 | 5859 | macros/latex-dev/base/ltidxglo.dtx +2024/02/14 | 58548 | macros/latex-dev/base/ltfssaxes.dtx +2024/02/14 | 5825 | macros/latex-dev/base/ltnews10.tex +2024/02/14 | 5791 | macros/latex-dev/required/tools/somedefs.dtx +2024/02/14 | 5775 | macros/latex-dev/base/ltnews16.tex +2024/02/14 | 575242 | macros/latex-dev/base/ltmarks-doc.pdf +2024/02/14 | 5746636 | systems/texlive/tlnet/install-tl-unx.tar.gz +2024/02/14 | 5733 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx +2024/02/14 | 5732 | macros/latex-dev/base/ltnews08.tex +2024/02/14 | 5714 | macros/latex-dev/base/inputenc.ins +2024/02/14 | 5699 | macros/latex-dev/base/ltnews05.tex +2024/02/14 | 5691 | macros/latex-dev/base/ltnews27.tex +2024/02/14 | 5684 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx +2024/02/14 | 5680 | macros/latex-dev/required/tools/tools.ins +2024/02/14 | 5678 | macros/latex-dev/base/ltnews04.tex +2024/02/14 | 567728 | macros/latex-dev/base/ltshipout-doc.pdf +2024/02/14 | 563307 | macros/latex-dev/base/ltnews35.pdf +2024/02/14 | 560294 | macros/latex-dev/base/classes.pdf +2024/02/14 | 560037 | macros/latex-dev/base/ltpara-doc.pdf +2024/02/14 | 5588 | macros/latex-dev/base/ltnews25.tex +2024/02/14 | 5576 | macros/latex-dev/base/ltnews07.tex +2024/02/14 | 5574 | macros/latex-dev/base/ltnews12.tex +2024/02/14 | 557051 | macros/latex-dev/base/ltproperties-code.pdf +2024/02/14 | 55687 | macros/latex-dev/base/ltfloat.dtx +2024/02/14 | 556861 | macros/latex-dev/required/latex-lab/latex-lab-table.pdf +2024/02/14 | 5544 | macros/latex-dev/base/ltnews06.tex +2024/02/14 | 5533 | biblio/bibtex/contrib/francais-bst/README.md +2024/02/14 | 5529 | macros/latex-dev/base/ltnews11.tex +2024/02/14 | 5509 | macros/latex-dev/base/graphpap.dtx +2024/02/14 | 55017 | macros/latex-dev/base/usrguide.tex +2024/02/14 | 54826 | macros/latex-dev/base/ltpara.dtx +2024/02/14 | 548011 | macros/latex-dev/base/ltfilehook-doc.pdf +2024/02/14 | 546540 | macros/latex-dev/base/ltnews32.pdf +2024/02/14 | 5462 | macros/latex-dev/base/ltnews02.tex +2024/02/14 | 5451 | macros/latex-dev/base/ltnews09.tex +2024/02/14 | 5369 | macros/latex-dev/base/ltnews03.tex +2024/02/14 | 53334 | macros/latex-dev/base/lb2.err +2024/02/14 | 531721 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.pdf +2024/02/14 | 53167 | macros/latex-dev/required/tools/calc.dtx +2024/02/14 | 52813 | macros/latex-dev/base/encguide.tex +2024/02/14 | 5273 | macros/latex-dev/base/cmextra.ins +2024/02/14 | 527096 | macros/latex-dev/required/latex-lab/latex-lab-sec.pdf +2024/02/14 | 526688 | macros/latex-dev/base/ltnews31.pdf +2024/02/14 | 5246 | macros/latex-dev/base/ltnews01.tex +2024/02/14 | 524502 | macros/latex-dev/required/tools/multicol.pdf +2024/02/14 | 523675 | macros/latex-dev/base/ltnews38.pdf +2024/02/14 | 522757 | macros/latex-dev/base/ltnews33.pdf +2024/02/14 | 5211 | macros/latex-dev/required/tools/tools-overview.tex +2024/02/14 | 517934 | macros/latex-dev/base/ltnews36.pdf +2024/02/14 | 517737 | macros/latex-dev/required/latex-lab/latex-lab-graphic.pdf +2024/02/14 | 517708 | macros/latex-dev/base/fntguide.pdf +2024/02/14 | 5134 | macros/optex/doc/optex-doc.tex +2024/02/14 | 512240 | macros/latex-dev/base/ltnews30.pdf +2024/02/14 | 51163 | macros/latex-dev/base/ltfinal.dtx +2024/02/14 | 508345 | macros/latex-dev/base/ltnews34.pdf +2024/02/14 | 506365 | macros/latex-dev/base/docstrip.pdf +2024/02/14 | 5041 | macros/latex-dev/base/latexsym.ins +2024/02/14 | 500903 | macros/latex/contrib/jnuexam.zip +2024/02/14 | 4981 | macros/latex/contrib/eolang/eolang.pl +2024/02/14 | 4973 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.dtx +2024/02/14 | 497334 | macros/latex-dev/base/ltcmdhooks-doc.pdf +2024/02/14 | 497075 | macros/generic/lt3luabridge/lt3luabridge.pdf +2024/02/14 | 4959 | macros/latex-dev/required/tools/fileerr.dtx +2024/02/14 | 494613 | macros/generic/lt3luabridge.zip +2024/02/14 | 4945 | macros/latex-dev/base/lthyphen.dtx +2024/02/14 | 49035 | macros/latex-dev/base/ltboxes.dtx +2024/02/14 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2024/02/14 | 489795 | macros/latex-dev/base/clsguide.pdf +2024/02/14 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2024/02/14 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2024/02/14 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2024/02/14 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2024/02/14 | 488 | macros/latex/contrib/eolang/DEPENDS.txt +2024/02/14 | 485950 | macros/latex-dev/required/latex-lab/blocks-doc.pdf +2024/02/14 | 483354 | macros/latex-dev/base/usrguide.pdf +2024/02/14 | 4819 | macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx +2024/02/14 | 481774 | macros/latex-dev/base/ltsockets-doc.pdf +2024/02/14 | 47896 | macros/latex-dev/base/lttab.dtx +2024/02/14 | 47687 | macros/latex/contrib/eolang/cactus.pdf +2024/02/14 | 4757 | macros/latex-dev/base/ltlength.dtx +2024/02/14 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot +2024/02/14 | 473345 | macros/latex-dev/base/ltnews39.pdf +2024/02/14 | 47308 | macros/latex-dev/base/ltspace.dtx +2024/02/14 | 456933 | macros/latex-dev/base/ltnews37.pdf +2024/02/14 | 455437 | macros/latex-dev/base/ltnews29.pdf +2024/02/14 | 45347 | macros/latex-dev/base/latexrelease.dtx +2024/02/14 | 44531 | macros/latex-dev/base/cmfonts.fdd +2024/02/14 | 44328 | macros/latex-dev/base/tlc3.err +2024/02/14 | 44296835 | install/macros/latex-dev/latex-base-dev.tds.zip +2024/02/14 | 439393 | macros/latex-dev/base/usrguide-historic.pdf +2024/02/14 | 4390 | macros/latex-dev/base/ec.ins +2024/02/14 | 43765 | biblio/bibtex/contrib/francais-bst/francais-bst.pdf +2024/02/14 | 43697199 | macros/latex-dev/base.zip +2024/02/14 | 43446 | macros/latex-dev/required/tools/theorem.dtx +2024/02/14 | 4324 | macros/latex-dev/base/cmfonts.ins +2024/02/14 | 432272 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69830.tar.xz +2024/02/14 | 432129 | macros/latex-dev/base/ltproperties-doc.pdf +2024/02/14 | 4298 | macros/latex-dev/base/ltalloc.dtx +2024/02/14 | 4273 | macros/latex-dev/base/docstrip.ins +2024/02/14 | 42708 | macros/latex-dev/base/changes.old.txt +2024/02/14 | 426817 | macros/latex-dev/required/latex-lab/latex-lab-float.pdf +2024/02/14 | 4254 | macros/latex-dev/base/newdc.ins +2024/02/14 | 42287 | macros/latex-dev/base/ltmath.dtx +2024/02/14 | 4219 | macros/latex-dev/base/latex209.ins +2024/02/14 | 419214 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.pdf +2024/02/14 | 4190 | macros/latex-dev/base/ltnews19.tex +2024/02/14 | 415956 | macros/latex-dev/base/clsguide-historic.pdf +2024/02/14 | 4117477 | biblio/ctan-bibdata.zip +2024/02/14 | 4087 | macros/latex-dev/base/classes.ins +2024/02/14 | 408292 | macros/latex-dev/base/changes.txt +2024/02/14 | 4079 | macros/latex-dev/base/lablst.tex +2024/02/14 | 4074 | macros/optex/base/optex.ini +2024/02/14 | 40120 | macros/latex-dev/required/latex-lab/latex-lab-table.dtx +2024/02/14 | 400149 | macros/latex-dev/required/tools/longtable.pdf +2024/02/14 | 4000 | support/texlogfilter/texlogfilter.html +2024/02/14 | 39839 | macros/latex-dev/base/ltnews18.pdf +2024/02/14 | 39697 | macros/latex-dev/required/tools/ftnright.dtx +2024/02/14 | 396814 | macros/latex-dev/required/latex-lab/latex-lab-toc.pdf +2024/02/14 | 3960 | macros/latex-dev/base/olddc.ins +2024/02/14 | 393134 | macros/latex-dev/required/tools/varioref.pdf +2024/02/14 | 389721 | macros/latex-dev/required/latex-lab/latex-lab-new-or-1.pdf +2024/02/14 | 389702 | macros/latex-dev/required/latex-lab/latex-lab-marginpar.pdf +2024/02/14 | 38730 | macros/latex-dev/base/latex209.dtx +2024/02/14 | 387253 | macros/latex-dev/required/tools/ftnright.pdf +2024/02/14 | 383259 | macros/latex-dev/required/latex-lab/latex-lab-bib.pdf +2024/02/14 | 38226 | macros/latex-dev/base/ltnews35.tex +2024/02/14 | 379733 | macros/latex-dev/base/ltnews26.pdf +2024/02/14 | 3781 | macros/latex-dev/base/tulm.ins +2024/02/14 | 37710 | macros/latex-dev/base/ltsockets.dtx +2024/02/14 | 376933 | macros/latex-dev/base/ltnews28.pdf +2024/02/14 | 375493 | macros/latex-dev/base/slides.pdf +2024/02/14 | 37462 | macros/latex-dev/required/tools/tabularx.dtx +2024/02/14 | 373342 | macros/latex-dev/required/latex-lab/latex-lab-mathtools.pdf +2024/02/14 | 373342 | macros/latex-dev/required/latex-lab/latex-lab-amsmath.pdf +2024/02/14 | 3725 | macros/latex-dev/base/ltlogos.dtx +2024/02/14 | 3708800 | biblio/ctan-bibdata/ctan.pdf +2024/02/14 | 370660 | macros/latex-dev/required/tools/calc.pdf +2024/02/14 | 3674 | macros/latex-dev/required/latex-lab/latex-lab-text.dtx +2024/02/14 | 36154 | macros/latex-dev/base/ltlists.dtx +2024/02/14 | 361081 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.pdf +2024/02/14 | 36003 | macros/latex-dev/base/ltdirchk.dtx +2024/02/14 | 353399 | macros/latex-dev/base/utf8ienc.pdf +2024/02/14 | 351765 | macros/latex-dev/required/tools/theorem.pdf +2024/02/14 | 348117 | macros/latex-dev/required/latex-lab/latex-lab-title.pdf +2024/02/14 | 345764 | macros/latex-dev/base/tlc3.pdf +2024/02/14 | 34457 | macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx +2024/02/14 | 3434 | macros/latex-dev/base/makeindx.ins +2024/02/14 | 3401 | macros/latex-dev/base/proc.ins +2024/02/14 | 33946 | macros/latex-dev/base/ltsect.dtx +2024/02/14 | 33911 | macros/latex-dev/base/ltnews33.tex +2024/02/14 | 33863 | macros/latex-dev/required/tools/varioref-2016-02-16.sty +2024/02/14 | 337772 | macros/latex-dev/base/letter.pdf +2024/02/14 | 3372 | macros/latex-dev/base/letter.ins +2024/02/14 | 3367 | macros/latex-dev/base/ltoutenc.ins +2024/02/14 | 33660 | macros/latex/contrib/huawei/huawei.dtx +2024/02/14 | 33439 | macros/latex-dev/base/ltproperties.dtx +2024/02/14 | 3338 | macros/latex-dev/base/exscale.ins +2024/02/14 | 33243 | macros/latex-dev/base/ltnews32.tex +2024/02/14 | 331587 | macros/latex-dev/required/tools/verbatim.pdf +2024/02/14 | 33083 | macros/latex-dev/base/ltnews37.tex +2024/02/14 | 3284 | macros/latex-dev/required/tools/manifest.txt +2024/02/14 | 3282 | macros/latex-dev/base/bugs.txt +2024/02/14 | 325142 | macros/latex-dev/base/ltluatex.pdf +2024/02/14 | 323640 | macros/latex-dev/required/tools/bm.pdf +2024/02/14 | 32331 | macros/latex-dev/base/ltnews34.tex +2024/02/14 | 32047 | macros/latex-dev/required/tools/layout.dtx +2024/02/14 | 318372 | macros/latex-dev/base/inputenc.pdf +2024/02/14 | 3181 | macros/latex-dev/base/unpack.ins +2024/02/14 | 318193 | macros/latex-dev/base/ltnews20.pdf +2024/02/14 | 318026 | macros/latex-dev/base/ltnews22.pdf +2024/02/14 | 31646 | macros/latex-dev/required/tools/multicol-2019-10-01.sty +2024/02/14 | 31498 | macros/optex/base/optex-tricks.opm +2024/02/14 | 3111 | support/texlogfilter/README +2024/02/14 | 3100 | macros/latex-dev/base/README.md +2024/02/14 | 307812 | macros/latex-dev/required/latex-lab/latex-lab-text.pdf +2024/02/14 | 30499 | macros/latex-dev/base/doc-2021-06-01.sty +2024/02/14 | 304559 | macros/latex-dev/base/lthooks.dtx +2024/02/14 | 30452 | macros/latex-dev/base/ltnews31.tex +2024/02/14 | 30368 | macros/latex-dev/required/tools/showkeys.dtx +2024/02/14 | 302442 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.pdf +2024/02/14 | 29965 | macros/latex-dev/base/doc-2016-02-15.sty +2024/02/14 | 298373 | macros/latex-dev/required/latex-lab/latex-lab-testphase.pdf +2024/02/14 | 29712 | macros/latex-dev/required/tools/multicol-2017-04-11.sty +2024/02/14 | 296124 | macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.pdf +2024/02/14 | 29270 | macros/latex-dev/base/ltfntcmd.dtx +2024/02/14 | 292600 | macros/latex-dev/base/cmfonts.pdf +2024/02/14 | 2916644 | macros/optex.zip +2024/02/14 | 291143 | macros/latex-dev/base/tlc2.pdf +2024/02/14 | 2896 | macros/latex-dev/base/syntonly.ins +2024/02/14 | 289601 | macros/latex-dev/required/tools/tabularx.pdf +2024/02/14 | 2894 | macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx +2024/02/14 | 2893 | macros/latex-dev/base/nfssfont.ins +2024/02/14 | 2892 | macros/latex-dev/base/graphpap.ins +2024/02/14 | 2892 | macros/latex-dev/base/fix-cm.ins +2024/02/14 | 2890 | macros/latex-dev/base/alltt.ins +2024/02/14 | 2888 | macros/latex-dev/base/ifthen.ins +2024/02/14 | 287727 | macros/latex-dev/base/fix-cm.pdf +2024/02/14 | 286824 | macros/latex-dev/base/ltnews23.pdf +2024/02/14 | 2847464 | biblio/ctan-bibdata/ctan.bib +2024/02/14 | 282095 | macros/latex-dev/base/latexrelease.pdf +2024/02/14 | 280811 | macros/latex-dev/required/latex-lab/latex-lab-minipage.pdf +2024/02/14 | 2778 | graphics/pgf/contrib/pgf-periodictable/README +2024/02/14 | 273812 | macros/latex-dev/required/latex-lab/latex-lab-firstaid.pdf +2024/02/14 | 2728 | macros/latex-dev/base/ltpageno.dtx +2024/02/14 | 27122 | macros/latex-dev/base/ltxcheck.tex +2024/02/14 | 27069 | macros/latex-dev/base/lterror.dtx +2024/02/14 | 2705 | macros/latex-dev/base/idx.tex +2024/02/14 | 26699 | macros/latex-dev/required/latex-lab/latex-lab-sec.dtx +2024/02/14 | 265497 | macros/latex-dev/base/ltnews24.pdf +2024/02/14 | 264168 | macros/latex-dev/base/cfgguide.pdf +2024/02/14 | 2628 | macros/latex/contrib/eolang/eolang.ins +2024/02/14 | 2626 | macros/latex/contrib/huawei/huawei.ins +2024/02/14 | 26035553 | systems/texlive/tlnet/install-tl.zip +2024/02/14 | 260278 | macros/latex-dev/required/tools/layout.pdf +2024/02/14 | 257825 | macros/latex-dev/base/modguide.pdf +2024/02/14 | 2576 | macros/latex-dev/required/tools/multicol.ins +2024/02/14 | 257359 | macros/latex-dev/base/cyrguide.pdf +2024/02/14 | 257027 | macros/latex-dev/required/tools/xspace.pdf +2024/02/14 | 25598 | macros/latex-dev/base/ltnews39.tex +2024/02/14 | 2545820 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2024/02/14 | 253 | macros/generic/lt3luabridge/lt3luabridge.ins +2024/02/14 | 2538 | macros/latex-dev/required/tools/longtable.ins +2024/02/14 | 2538 | macros/latex-dev/required/tools/afterpage.ins +2024/02/14 | 253724 | macros/latex/contrib/huawei/huawei-cover-picture.pdf +2024/02/14 | 2535 | macros/latex-dev/required/tools/tabularx.ins +2024/02/14 | 2531 | macros/latex-dev/required/tools/varioref.ins +2024/02/14 | 253116 | macros/latex-dev/base/lb2.pdf +2024/02/14 | 252684 | macros/latex-dev/required/tools/showkeys.pdf +2024/02/14 | 2524 | macros/latex-dev/required/tools/bm.ins +2024/02/14 | 25146 | macros/latex-dev/required/tools/trace.dtx +2024/02/14 | 251283 | macros/latex-dev/base/ltnews27.pdf +2024/02/14 | 24869 | macros/latex-dev/base/ltcounts.dtx +2024/02/14 | 24793 | macros/latex-dev/base/lttagging.dtx +2024/02/14 | 2453 | macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx +2024/02/14 | 245228 | macros/latex-dev/base/ltnews21.pdf +2024/02/14 | 244660 | biblio/bibtex/contrib/francais-bst/francais-bst.mbs +2024/02/14 | 244141 | macros/latex-dev/base/ltxdoc.pdf +2024/02/14 | 243 | macros/latex-dev/base/ltproperties-doc.tex +2024/02/14 | 241 | macros/latex-dev/base/ltfilehook-doc.tex +2024/02/14 | 241326 | macros/latex-dev/base/doc.dtx +2024/02/14 | 240 | macros/latex-dev/base/ltsockets-doc.tex +2024/02/14 | 240 | macros/latex-dev/base/ltshipout-doc.tex +2024/02/14 | 238 | macros/latex-dev/base/ltmarks-doc.tex +2024/02/14 | 238 | macros/latex-dev/base/lthooks-doc.tex +2024/02/14 | 238 | macros/latex-dev/base/ltcmdhooks-doc.tex +2024/02/14 | 23812 | macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx +2024/02/14 | 23646 | macros/latex-dev/base/ltnews30.tex +2024/02/14 | 23516 | macros/latex-dev/base/fix-cm.dtx +2024/02/14 | 234 | macros/latex-dev/base/ltpara-doc.tex +2024/02/14 | 234649 | macros/latex-dev/required/latex-lab/latex-lab-namespace.pdf +2024/02/14 | 233905 | macros/latex-dev/base/slifonts.pdf +2024/02/14 | 23386 | macros/latex-dev/base/lppl.tex +2024/02/14 | 22946 | macros/latex-dev/base/ltnews38.tex +2024/02/14 | 22822 | macros/latex-dev/base/ltxdoc.dtx +2024/02/14 | 22723 | macros/latex-dev/base/cfgguide.tex +2024/02/14 | 227065 | macros/latex-dev/base/proc.pdf +2024/02/14 | 225936 | macros/latex-dev/base/ltnews19.pdf +2024/02/14 | 223861 | macros/latex-dev/base/alltt.pdf +2024/02/14 | 222074 | macros/latex-dev/required/tools/trace.pdf +2024/02/14 | 2219 | macros/latex-dev/required/tools/indentfirst.dtx +2024/02/14 | 221219 | macros/latex-dev/base/ifthen.pdf +2024/02/14 | 221038 | macros/latex-dev/required/tools/dcolumn.pdf +2024/02/14 | 219358 | macros/latex-dev/base/ltx3info.pdf +2024/02/14 | 21882 | macros/latex-dev/base/ltxref.dtx +2024/02/14 | 217 | macros/generic/lt3luabridge/example.latex +2024/02/14 | 217659 | macros/latex-dev/base/lgc2.pdf +2024/02/14 | 215077 | macros/latex-dev/required/tools/enumerate.pdf +2024/02/14 | 21488 | macros/latex-dev/base/ltnews.cls +2024/02/14 | 21229 | macros/latex-dev/base/lgc2.err +2024/02/14 | 211314 | macros/latex-dev/base/nfssfont.pdf +2024/02/14 | 21026355 | systems/texlive/tlnet/install-tl-windows.exe +2024/02/14 | 20674 | macros/latex-dev/required/latex-lab/documentmetadata-support.dtx +2024/02/14 | 205100 | macros/latex-dev/base/ltnews25.pdf +2024/02/14 | 204708 | macros/latex-dev/base/exscale.pdf +2024/02/14 | 20122 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex +2024/02/14 | 200759 | macros/latex-dev/base/latexsym.pdf +2024/02/14 | 20011 | macros/latex-dev/base/ltkeys.dtx +2024/02/14 | 19892 | graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex +2024/02/14 | 198100 | macros/latex-dev/required/tools/afterpage.pdf +2024/02/14 | 19533 | macros/latex-dev/base/ltexpl.dtx +2024/02/14 | 1941 | macros/latex-dev/base/minimal.cls +2024/02/14 | 1940560 | macros/latex/contrib/eolang/eolang.pdf +2024/02/14 | 1940056 | macros/latex/contrib/eolang.zip +2024/02/14 | 19333 | macros/latex-dev/base/ltnews36.tex +2024/02/14 | 19322816 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2024/02/14 | 191 | macros/latex-dev/required/latex-lab/documentmetadata-support-doc.tex +2024/02/14 | 19105 | macros/generic/lt3luabridge/LICENSE +2024/02/14 | 191058 | macros/latex-dev/required/tools/delarray.pdf +2024/02/14 | 1907216 | macros/optex/doc/optex-doc.pdf +2024/02/14 | 19040 | macros/latex-dev/base/lppl.txt +2024/02/14 | 189678 | macros/latex-dev/required/tools/hhline.pdf +2024/02/14 | 18944 | macros/latex-dev/base/ltnews29.tex +2024/02/14 | 189440 | macros/latex-dev/base/syntonly.pdf +2024/02/14 | 188163 | macros/latex-dev/required/tools/multicol.dtx +2024/02/14 | 188047 | macros/latex-dev/base/ltcmd.dtx +2024/02/14 | 187725 | macros/latex-dev/required/tools/fileerr.pdf +2024/02/14 | 18753 | macros/latex-dev/base/ifthen.dtx +2024/02/14 | 18618 | biblio/bibtex/contrib/francais-bst/francaissc.dbj +2024/02/14 | 18612 | biblio/bibtex/contrib/francais-bst/francais.dbj +2024/02/14 | 18465 | macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx +2024/02/14 | 18401 | macros/latex-dev/base/nfssfont.dtx +2024/02/14 | 18299 | macros/latex-dev/base/ltx3info.tex +2024/02/14 | 182483 | macros/latex-dev/base/ltnews13.pdf +2024/02/14 | 181 | macros/generic/lt3luabridge/example.context +2024/02/14 | 18102 | CTAN.sites +2024/02/14 | 17978 | macros/latex-dev/required/latex-lab/latex-lab-float.dtx +2024/02/14 | 17856 | macros/latex-dev/required/tools/xspace.dtx +2024/02/14 | 178567 | macros/latex-dev/base/ltoutput.dtx +2024/02/14 | 17782 | macros/latex-dev/base/cyrguide.tex +2024/02/14 | 176171 | macros/latex-dev/required/tools/shellesc.pdf +2024/02/14 | 175211 | macros/latex-dev/base/ltnews05.pdf +2024/02/14 | 1749530 | macros/latex/contrib/l3packages.zip +2024/02/14 | 17389 | macros/latex-dev/base/ltbibl.dtx +2024/02/14 | 173013 | macros/latex-dev/base/tlc2.err +2024/02/14 | 171410 | macros/latex-dev/base/docstrip.dtx +2024/02/14 | 170876 | macros/latex-dev/base/lamport-manual.pdf +2024/02/14 | 170722 | macros/latex-dev/base/ltnews14.pdf +2024/02/14 | 170451 | macros/latex-dev/required/tools/xr.pdf +2024/02/14 | 17010 | macros/latex-dev/required/latex-lab/latex-lab-title.dtx +2024/02/14 | 169553 | macros/latex-dev/base/ltnews01.pdf +2024/02/14 | 1694 | macros/latex-dev/base/small2e.tex +2024/02/14 | 169433 | macros/latex-dev/base/ltnews10.pdf +2024/02/14 | 167 | macros/generic/lt3luabridge/example.plaintex +2024/02/14 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2024/02/14 | 167583 | macros/latex-dev/required/tools/somedefs.pdf +2024/02/14 | 1664 | macros/latex-dev/required/tools/README.md +2024/02/14 | 166269 | macros/latex-dev/base/ltnews17.pdf +2024/02/14 | 165816 | macros/latex-dev/base/makeindx.pdf +2024/02/14 | 16500 | macros/latex-dev/base/modguide.tex +2024/02/14 | 1632 | macros/latex/contrib/huawei/README.md +2024/02/14 | 162773 | macros/latex-dev/base/tulm.pdf +2024/02/14 | 161722 | macros/latex-dev/base/graphpap.pdf +2024/02/14 | 157352 | macros/latex-dev/required/tools/indentfirst.pdf +2024/02/14 | 15693 | macros/latex-dev/base/slifonts.fdd +2024/02/14 | 156764 | macros/latex-dev/base/ltnews12.pdf +2024/02/14 | 156260 | macros/latex-dev/base/classes.dtx +2024/02/14 | 155442 | macros/latex-dev/base/ltnews08.pdf +2024/02/14 | 15479 | macros/latex-dev/base/source2e.tex +2024/02/14 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2024/02/14 | 15384 | macros/latex-dev/base/ltvers.dtx +2024/02/14 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2024/02/14 | 152551 | macros/latex-dev/base/ltnews04.pdf +2024/02/14 | 151773 | macros/latex-dev/base/ltnews02.pdf +2024/02/14 | 151324 | macros/latex-dev/base/ltnews03.pdf +2024/02/14 | 15047 | macros/latex-dev/base/ltnews28.tex +2024/02/14 | 14878 | macros/generic/lt3luabridge/lt3luabridge.dtx +2024/02/14 | 148564 | macros/latex-dev/base/ltoutenc.dtx +2024/02/14 | 146438 | macros/latex-dev/required/tools/fontsmpl.pdf +2024/02/14 | 146197 | macros/latex-dev/base/webcomp.pdf +2024/02/14 | 146153 | macros/latex-dev/base/ltclass.dtx +2024/02/14 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2024/02/14 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2024/02/14 | 14421 | macros/latex-dev/base/lppl-1-2.txt +2024/02/14 | 14373 | macros/latex-dev/required/latex-lab/latex-lab-bib.dtx +2024/02/14 | 14341 | macros/latex-dev/base/lppl-1-1.txt +2024/02/14 | 142867 | macros/latex-dev/base/ltnews06.pdf +2024/02/14 | 14091 | macros/latex-dev/base/ltpage.dtx +2024/02/14 | 14075 | macros/latex-dev/required/tools/afterpage.dtx +2024/02/14 | 14046736 | macros/latex/contrib/l3kernel.zip +2024/02/14 | 139685 | macros/latex-dev/required/tools/array.dtx +2024/02/14 | 1390205 | macros/latex-dev/base/ltnews.pdf +2024/02/14 | 1389 | macros/generic/lt3luabridge/docstrip.cfg +2024/02/14 | 138956 | macros/latex-dev/required/tools/rawfonts.pdf +2024/02/14 | 138214 | macros/latex-dev/base/ltnews07.pdf +2024/02/14 | 138107 | macros/latex-dev/base/ltnews16.pdf +2024/02/14 | 13759 | macros/latex-dev/base/lamport-manual.err +2024/02/14 | 136797 | macros/latex-dev/required/latex-lab/latex-lab-block.dtx +2024/02/14 | 13589 | macros/latex-dev/base/proc.dtx +2024/02/14 | 1341 | macros/latex-dev/base/ltnews18.tex +2024/02/14 | 13356 | support/texlogfilter.zip +2024/02/14 | 133094 | install/biblio/bibtex/contrib/francais-bst.tds.zip +2024/02/14 | 132370 | macros/latex-dev/base/lppl.pdf +2024/02/14 | 1318576 | macros/latex-dev/base/encguide.pdf +2024/02/14 | 1315 | macros/latex/contrib/eolang/README.md +2024/02/14 | 130328 | macros/latex-dev/base/ltnews15.pdf +2024/02/14 | 130028 | macros/latex-dev/base/ltnews09.pdf +2024/02/14 | 12805 | macros/latex-dev/required/latex-lab/latex-lab-toc.dtx +2024/02/14 | 1279 | macros/latex-dev/base/legal.txt +2024/02/14 | 12706 | macros/latex-dev/required/tools/dcolumn.dtx +2024/02/14 | 12667 | macros/latex-dev/required/tools/array-2023-11-01.sty +2024/02/14 | 12655 | support/texlogfilter/texlogfilter +2024/02/14 | 12559 | macros/latex-dev/required/tools/array-2020-02-10.sty +2024/02/14 | 12520 | macros/latex-dev/base/testpage.tex +2024/02/14 | 1248644 | macros/latex-dev/base/lthooks-code.pdf +2024/02/14 | 12334 | macros/latex-dev/base/ltnews24.tex +2024/02/14 | 12314341 | install/macros/latex-dev/required/latex-lab-dev.tds.zip +2024/02/14 | 12246 | macros/latex-dev/base/tulm.fdd +2024/02/14 | 12222080 | macros/latex-dev/required/latex-lab.zip +2024/02/14 | 12133 | macros/latex-dev/required/tools/longtable-2020-01-07.sty +2024/02/14 | 117 | macros/latex-dev/required/latex-lab/documentmetadata-support-code.tex +2024/02/14 | 11749 | macros/latex-dev/required/tools/array-2016-10-06.sty +2024/02/14 | 1156 | macros/latex-dev/required/latex-lab/README.md +2024/02/14 | 115236 | biblio/bibtex/contrib/francais-bst.zip +2024/02/14 | 11463 | macros/latex-dev/base/manifest.txt +2024/02/14 | 114350 | macros/latex-dev/required/tools/varioref.dtx +2024/02/14 | 114225 | macros/latex-dev/base/lttextcomp.dtx +2024/02/14 | 114016 | systems/texlive/tlnet/archive/texlive-scripts.r69830.tar.xz +2024/02/14 | 112208 | macros/latex-dev/base/ltnews11.pdf +2024/02/14 | 11148 | macros/latex-dev/required/tools/hhline.dtx +2024/02/14 | 108 | macros/latex-dev/required/latex-lab/blocks-code.tex +2024/02/14 | 1083 | macros/latex/contrib/huawei/LICENSE.txt +2024/02/14 | 1083 | macros/latex/contrib/eolang/LICENSE.txt +2024/02/14 | 108248 | macros/latex-dev/base/fntguide.tex +2024/02/14 | 107 | macros/latex-dev/base/ltproperties-code.tex +2024/02/14 | 10798 | macros/latex-dev/base/ltnews26.tex +2024/02/14 | 10792 | macros/latex-dev/base/ltnews22.tex +2024/02/14 | 10791 | macros/latex-dev/base/ltnews23.tex +2024/02/14 | 1078428 | macros/latex-dev/base/doc-code.pdf +2024/02/14 | 10771 | macros/latex-dev/required/tools/fontsmpl.dtx +2024/02/14 | 106906 | macros/latex-dev/base/inputenc.dtx +2024/02/14 | 10637 | macros/latex-dev/required/tools/enumerate.dtx +2024/02/14 | 10601 | macros/latex-dev/base/makeindx.dtx +2024/02/14 | 105 | macros/latex-dev/required/latex-lab/blocks-doc.tex +2024/02/14 | 105 | macros/latex-dev/base/ltfilehook-code.tex +2024/02/14 | 1051694 | macros/latex/contrib/huawei.zip +2024/02/14 | 104 | macros/latex-dev/base/ltsockets-code.tex +2024/02/14 | 104 | macros/latex-dev/base/ltshipout-code.tex +2024/02/14 | 10404 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex +2024/02/14 | 103 | macros/latex-dev/base/ltcmdhooks-code.tex +2024/02/14 | 10370 | macros/latex-dev/base/ltfsscmp.dtx +2024/02/14 | 102 | macros/latex-dev/base/ltmarks-code.tex +2024/02/14 | 102 | macros/latex-dev/base/lthooks-code.tex +2024/02/14 | 10247 | macros/latex-dev/base/webcomp.err +2024/02/14 | 10215 | macros/latex-dev/required/latex-lab/changes.txt +2024/02/14 | 10072 | macros/latex-dev/base/format.ins +2024/02/14 | 10016 | macros/optex/README +2024/02/13 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex 2024/02/13 | 984 | support/arara/scripts/rules/arara-rule-make.yaml 2024/02/13 | 97684 | systems/texlive/tlnet/archive/texinfo.r69818.tar.xz 2024/02/13 | 950 | support/arara/scripts/rules/arara-rule-gnuplot.yaml 2024/02/13 | 9466 | macros/unicodetex/latex/fontspec/fontspec-code-vars.dtx +2024/02/13 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex +2024/02/13 | 9445 | macros/latex/contrib/l3kernel/l3fp-assign.dtx +2024/02/13 | 94210 | macros/optex/doc/optex-userdoc.tex 2024/02/13 | 941616 | macros/latex/contrib/nicematrix/nicematrix.pdf 2024/02/13 | 9398 | macros/unicodetex/latex/fontspec/fontspec-code-feat-aat.dtx 2024/02/13 | 93819 | macros/latex/contrib/spbmark/spbmark.pdf 2024/02/13 | 9351 | macros/unicodetex/latex/fontspec/fontspec-doc-enc.tex 2024/02/13 | 9303 | macros/jptex/latex/jlreq/jlreq-trimmarks-ja.md +2024/02/13 | 92983 | macros/latex/contrib/l3kernel/l3int.dtx +2024/02/13 | 91719 | macros/latex/contrib/l3kernel/l3skip.dtx 2024/02/13 | 915 | support/arara/scripts/rules/arara-rule-move.yaml 2024/02/13 | 911886 | macros/latex/contrib/nicematrix/nicematrix-french.pdf 2024/02/13 | 910 | support/arara/scripts/rules/arara-rule-xindex.yaml 2024/02/13 | 9103 | macros/unicodetex/latex/fontspec/fontspec-doc-intro.tex +2024/02/13 | 88794 | macros/latex/contrib/l3kernel/l3expan.dtx +2024/02/13 | 88241 | macros/latex/contrib/l3kernel/l3coffins.dtx 2024/02/13 | 878 | support/arara/scripts/rules/arara-rule-ghostscript.yaml +2024/02/13 | 87749 | macros/latex/contrib/l3kernel/l3box.dtx 2024/02/13 | 87630 | support/albatross/doc/albatross-manual.pdf +2024/02/13 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex +2024/02/13 | 84789 | macros/latex/contrib/l3kernel/l3fp-basics.dtx +2024/02/13 | 84537 | macros/latex/contrib/l3packages/xparse-2018-04-12.sty 2024/02/13 | 841 | support/arara/scripts/rules/arara-rule-tikzmake.yaml 2024/02/13 | 838 | support/arara/scripts/rules/arara-rule-biber.yaml +2024/02/13 | 83169 | macros/latex/contrib/l3kernel/l3clist.dtx 2024/02/13 | 830 | support/arara/scripts/rules/arara-rule-nomencl.yaml 2024/02/13 | 8304 | macros/unicodetex/latex/fontspec/fontspec-code-msg.dtx +2024/02/13 | 82874 | macros/latex/contrib/l3kernel/l3msg.dtx +2024/02/13 | 82731 | macros/latex/contrib/l3kernel/l3prefixes.pdf +2024/02/13 | 82462 | macros/latex/contrib/l3kernel/l3str.dtx 2024/02/13 | 822 | macros/latex/contrib/xfrac/README.md 2024/02/13 | 812 | support/arara/scripts/rules/arara-rule-songidx.yaml 2024/02/13 | 810 | support/arara/scripts/rules/arara-rule-dvipdfmx.yaml 2024/02/13 | 807 | support/arara/scripts/rules/arara-rule-ps2pdf.yaml 2024/02/13 | 806 | support/arara/scripts/rules/arara-rule-dvipdfm.yaml +2024/02/13 | 80270 | macros/latex/contrib/l3kernel/l3names.dtx +2024/02/13 | 80215 | macros/latex/contrib/l3packages/xparse-generic.tex 2024/02/13 | 797 | support/arara/scripts/rules/arara-rule-dvips.yaml 2024/02/13 | 788 | support/arara/scripts/rules/arara-rule-copy.yaml +2024/02/13 | 7831 | macros/latex/contrib/l3kernel/l3fp-functions.dtx +2024/02/13 | 7813 | macros/latex/contrib/l3packages/CHANGELOG.md 2024/02/13 | 7756 | macros/jptex/latex/jlreq/README.md 2024/02/13 | 7751 | macros/jptex/latex/jlreq/jlreq-trimmarks.md +2024/02/13 | 76534 | macros/latex/contrib/l3kernel/l3fp.dtx +2024/02/13 | 76368 | macros/latex/contrib/l3kernel/l3text-case.dtx 2024/02/13 | 7603 | support/arara/doc/htmlmanualtopdf.sh +2024/02/13 | 7574815 | macros/latex/contrib/l3kernel/source3.pdf +2024/02/13 | 75547 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf 2024/02/13 | 7529 | macros/unicodetex/latex/fontspec/fontspec-doc-style.sty +2024/02/13 | 73845 | macros/latex/contrib/l3kernel/l3fp-trig.dtx +2024/02/13 | 7372 | macros/latex/contrib/l3packages/xfp.dtx 2024/02/13 | 732 | macros/unicodetex/latex/emotion/emotion.sty -2024/02/13 | 7311 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2024/02/13 | 7233 | macros/unicodetex/latex/fontspec/fontspec-code-interfaces.dtx +2024/02/13 | 71193 | macros/latex/contrib/l3kernel/expl3.dtx +2024/02/13 | 70830 | macros/latex/contrib/l3kernel/l3prg.dtx +2024/02/13 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex 2024/02/13 | 680 | support/arara/scripts/rules/arara-rule-sketch.yaml 2024/02/13 | 672898 | macros/unicodetex/latex/fontspec/fontspec-code.pdf +2024/02/13 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex 2024/02/13 | 658541 | macros/latex/contrib/xfrac/xfrac.pdf 2024/02/13 | 6572 | macros/unicodetex/latex/fontspec/fontspec-code-scripts.dtx 2024/02/13 | 6541 | support/arara/doc/resources/manual.css 2024/02/13 | 650 | support/arara/scripts/rules/arara-rule-spix.yaml 2024/02/13 | 648838 | macros/latex/contrib/xfrac.zip +2024/02/13 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex 2024/02/13 | 647 | support/arara/scripts/rules/arara-rule-convert.yaml 2024/02/13 | 646 | support/arara/scripts/rules/arara-rule-makeglossarieslite.yaml +2024/02/13 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex +2024/02/13 | 6393 | macros/latex/contrib/l3kernel/l3.ins +2024/02/13 | 62663 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx 2024/02/13 | 625 | support/arara/scripts/rules/arara-rule-upbibtex.yaml 2024/02/13 | 623 | macros/latex/contrib/xfrac/CHANGELOG.md 2024/02/13 | 6238 | macros/unicodetex/latex/fontspec/fontspec-code-opening.dtx +2024/02/13 | 6219 | macros/latex/contrib/l3kernel/l3syntax-changes.tex 2024/02/13 | 620 | support/arara/scripts/rules/arara-rule-bibtexu.yaml 2024/02/13 | 620 | support/arara/scripts/rules/arara-rule-bibtex8.yaml 2024/02/13 | 620649 | macros/jptex/latex/jlreq.zip +2024/02/13 | 6195 | macros/latex/contrib/l3packages/xparse-2020-10-01.sty +2024/02/13 | 610363 | macros/latex/contrib/l3kernel/expl3.pdf 2024/02/13 | 6049 | graphics/pgf/contrib/pictochrono/doc/pictochrono-doc.tex 2024/02/13 | 5 | support/arara/doc/resources/version.txt 2024/02/13 | 5 | support/albatross/doc/version.tex +2024/02/13 | 59622 | macros/latex/contrib/l3packages/xparse.dtx 2024/02/13 | 595 | support/arara/scripts/rules/arara-rule-pbibtex.yaml 2024/02/13 | 591 | support/arara/scripts/rules/arara-rule-bibtex.yaml 2024/02/13 | 591860 | macros/latex/contrib/nicematrix/nicematrix-code.dtx @@ -58,177 +615,256 @@ 2024/02/13 | 578717 | macros/unicodetex/latex/fontspec/fontspec.pdf 2024/02/13 | 576 | support/arara/scripts/arara.sh 2024/02/13 | 576 | support/albatross/scripts/albatross.sh -2024/02/13 | 5750361 | systems/texlive/tlnet/install-tl-unx.tar.gz +2024/02/13 | 57438 | macros/latex/contrib/l3kernel/CHANGELOG.md +2024/02/13 | 565282 | macros/latex/contrib/l3kernel/l3doc.pdf 2024/02/13 | 549 | macros/unicodetex/latex/fontspec/fontspec.cfg 2024/02/13 | 546 | support/arara/scripts/rules/arara-rule-qpdf.yaml +2024/02/13 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex 2024/02/13 | 5420924 | support/albatross/scripts/albatross.jar +2024/02/13 | 534182 | macros/latex/contrib/l3packages/xparse.pdf +2024/02/13 | 53190 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf +2024/02/13 | 5302 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex 2024/02/13 | 524840 | support/arara/doc/resources/firasans-italic.otf 2024/02/13 | 52445 | support/arara/doc/resources/arara-logo-with-text-bottom.svg +2024/02/13 | 5241 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex 2024/02/13 | 522236 | support/arara/doc/resources/firasans-lightitalic.otf 2024/02/13 | 521796 | support/arara/doc/resources/firasans-bold.otf 2024/02/13 | 5159812 | install/support/albatross.tds.zip 2024/02/13 | 5158188 | support/albatross.zip 2024/02/13 | 51469 | macros/jptex/latex/jlreq/README-ja.md +2024/02/13 | 51091 | macros/latex/contrib/l3kernel/l3fp-extended.dtx 2024/02/13 | 50840 | macros/jptex/latex/jlreq/jlreq-trimmarks.sty 2024/02/13 | 507828 | support/arara/doc/resources/firasans-regular.otf 2024/02/13 | 5065 | macros/unicodetex/latex/fontspec/fontspec-code-xfss.dtx 2024/02/13 | 505308 | support/arara/doc/resources/firasans-light.otf 2024/02/13 | 4980 | support/arara/README.md +2024/02/13 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex +2024/02/13 | 49753 | macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty 2024/02/13 | 4971 | macros/unicodetex/latex/fontspec/fontspec-code-enc.dtx -2024/02/13 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 -2024/02/13 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2024/02/13 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc -2024/02/13 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2024/02/13 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2024/02/13 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex +2024/02/13 | 49321 | macros/latex/contrib/l3kernel/l3fp-expo.dtx +2024/02/13 | 4911 | macros/latex/contrib/l3kernel/l3fp-types.dtx +2024/02/13 | 4890 | macros/latex/contrib/l3kernel/l3news.tex +2024/02/13 | 48900 | macros/latex/contrib/l3kernel/l3text.dtx 2024/02/13 | 48897 | macros/jptex/latex/jlreq/jfm-jlreq.lua -2024/02/13 | 47499 | systems/texlive/tlnet/tlpkg/translations/messages.pot +2024/02/13 | 48372 | macros/latex/contrib/l3kernel/l3prefixes.csv +2024/02/13 | 47237 | macros/latex/contrib/l3kernel/l3fp-aux.dtx +2024/02/13 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex 2024/02/13 | 470306 | macros/latex/contrib/verse.zip 2024/02/13 | 469138 | macros/latex/contrib/verse/verse.pdf 2024/02/13 | 460 | support/arara/scripts/rules/arara-rule-mkdir.yaml 2024/02/13 | 458 | support/arara/scripts/rules/arara-rule-rmdir.yaml +2024/02/13 | 4570 | macros/latex/contrib/l3kernel/l3legacy.dtx +2024/02/13 | 448106 | macros/latex/contrib/l3packages/xtemplate.pdf 2024/02/13 | 44661 | macros/unicodetex/latex/fontspec/fontspec-doc-opentype.tex 2024/02/13 | 4404 | graphics/pgf/contrib/pictochrono/tex/pictochrono.sty 2024/02/13 | 432 | macros/unicodetex/latex/emotion/emotion.def -2024/02/13 | 432272 | systems/texlive/tlnet/archive/texlive-scripts.doc.r69818.tar.xz 2024/02/13 | 4253 | support/arara/scripts/rules/arara-rule-context.yaml 2024/02/13 | 42249 | macros/unicodetex/latex/fontspec/fontspec-code-internal.dtx +2024/02/13 | 41847 | macros/latex/contrib/l3kernel/l3debug.dtx 2024/02/13 | 4169 | macros/unicodetex/latex/fontspec/fontspec-doc-luatex.tex -2024/02/13 | 4117312 | biblio/ctan-bibdata.zip +2024/02/13 | 412717 | macros/latex/contrib/l3packages/l3keys2e.pdf 2024/02/13 | 4079 | macros/unicodetex/latex/fontspec/fontspec-code-fontload.dtx 2024/02/13 | 4074 | support/arara/scripts/rules/arara-rule-datatooltk.yaml +2024/02/13 | 40727 | macros/latex/contrib/l3kernel/l3sort.dtx 2024/02/13 | 4010 | macros/unicodetex/latex/fontspec/fontspec-code-graphite.dtx -2024/02/13 | 3920 | support/texlogfilter/texlogfilter.html +2024/02/13 | 396222 | macros/latex/contrib/l3kernel/l3news.pdf +2024/02/13 | 3906 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex 2024/02/13 | 38703 | macros/latex/contrib/xfrac/xfrac.dtx 2024/02/13 | 3843 | support/arara/doc/resources/gitlab-icon.svg 2024/02/13 | 383391 | macros/jptex/latex/jlreq/jlreq-ja.pdf -2024/02/13 | 3708800 | biblio/ctan-bibdata/ctan.pdf +2024/02/13 | 37950 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf 2024/02/13 | 36791 | macros/unicodetex/latex/emotion.zip 2024/02/13 | 3664 | macros/unicodetex/latex/fontspec/fontspec.dtx +2024/02/13 | 36608 | macros/latex/contrib/l3kernel/l3sys.dtx +2024/02/13 | 35639 | macros/latex/contrib/l3kernel/l3unicode.dtx +2024/02/13 | 35453 | macros/latex/contrib/l3kernel/l3quark.dtx 2024/02/13 | 35241 | support/albatross/doc/albatross-manual.tex 2024/02/13 | 342355 | macros/latex/contrib/exesheet/exesheet.pdf +2024/02/13 | 33772 | macros/latex/contrib/l3kernel/l3cctab.dtx 2024/02/13 | 335 | graphics/pgf/contrib/pictochrono/README.md +2024/02/13 | 332421 | macros/latex/contrib/l3packages/xfp.pdf 2024/02/13 | 3251 | support/arara/scripts/rules/arara-rule-pdfcrop.yaml +2024/02/13 | 32124 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf 2024/02/13 | 320 | support/arara/scripts/rules/arara-rule-halt.yaml 2024/02/13 | 31060 | macros/unicodetex/latex/fontspec/fontspec-doc-fontsel.tex 2024/02/13 | 3099 | macros/unicodetex/latex/fontspec/fontspec-lua.dtx +2024/02/13 | 3078 | macros/latex/contrib/l3kernel/README.md 2024/02/13 | 30692 | macros/unicodetex/latex/fontspec/fontspec-doc-featset.tex 2024/02/13 | 30553 | macros/unicodetex/latex/emotion/doc/emotion-doc.pdf -2024/02/13 | 3040 | support/texlogfilter/README +2024/02/13 | 305486 | macros/latex/contrib/l3kernel/l3regex.dtx +2024/02/13 | 30504 | macros/latex/contrib/l3kernel/l3intarray.dtx 2024/02/13 | 3007 | macros/unicodetex/latex/emotion/doc/emotion-doc.tex 2024/02/13 | 3006687 | macros/latex/contrib/nicematrix.zip 2024/02/13 | 30051 | macros/unicodetex/latex/fontspec/fontspec-code-keyval.dtx 2024/02/13 | 300237 | macros/latex/contrib/exesheet.zip 2024/02/13 | 2990 | support/arara/scripts/rules/arara-rule-indent.yaml +2024/02/13 | 29836 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx 2024/02/13 | 29804 | support/albatross/README.md +2024/02/13 | 296657 | macros/latex/contrib/l3kernel/l3styleguide.pdf 2024/02/13 | 2929 | macros/unicodetex/latex/fontspec/README.md 2024/02/13 | 290031 | macros/jptex/latex/jlreq/jlreq.cls 2024/02/13 | 285336 | support/arara/doc/resources/CascadiaMono-Regular.otf -2024/02/13 | 2846767 | biblio/ctan-bibdata/ctan.bib 2024/02/13 | 282548 | support/arara/doc/resources/CascadiaMono-Light.otf +2024/02/13 | 28221 | macros/latex/contrib/l3packages/xtemplate.dtx +2024/02/13 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex 2024/02/13 | 2757360 | support/arara/doc/arara-7.1.3-docsrc.zip 2024/02/13 | 273200 | support/arara/doc/resources/CascadiaMono-ExtraLight.otf 2024/02/13 | 2728 | macros/latex/contrib/verse/README -2024/02/13 | 26035589 | systems/texlive/tlnet/install-tl.zip 2024/02/13 | 2591 | macros/latex/contrib/verse/verse.ins 2024/02/13 | 258355 | macros/latex/contrib/nicematrix/nicematrix.tex -2024/02/13 | 2547836 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz 2024/02/13 | 2543 | support/arara/scripts/rules/arara-rule-ltx2any.yaml +2024/02/13 | 25278 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf +2024/02/13 | 250159 | macros/latex/contrib/l3kernel/l3news09.pdf +2024/02/13 | 24987 | macros/latex/contrib/l3kernel/l3deprecation.dtx 2024/02/13 | 248570 | macros/latex/contrib/nicematrix/nicematrix-french.tex +2024/02/13 | 24830 | macros/latex/contrib/l3kernel/source3body.tex +2024/02/13 | 24731 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex 2024/02/13 | 2434 | support/arara/scripts/rules/arara-rule-makeglossaries.yaml 2024/02/13 | 2428 | support/arara/doc/htmlquickstarttopdf.sh +2024/02/13 | 242296 | macros/latex/contrib/l3kernel/l3term-glossary.pdf 2024/02/13 | 239299 | graphics/pgf/contrib/pictochrono/doc/pictochrono-doc.pdf 2024/02/13 | 238652 | graphics/pgf/contrib/pictochrono.zip +2024/02/13 | 2384 | macros/latex/contrib/l3kernel/l3docstrip.dtx +2024/02/13 | 23828 | macros/latex/contrib/l3kernel/l3luatex.dtx +2024/02/13 | 23581 | macros/latex/contrib/l3kernel/l3fp-random.dtx 2024/02/13 | 2326087 | macros/latex/contrib/nicematrix/nicematrix-code.pdf +2024/02/13 | 23206 | macros/latex/contrib/l3kernel/l3fp-logic.dtx +2024/02/13 | 231496 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf 2024/02/13 | 23043 | macros/unicodetex/latex/fontspec/CHANGES.md +2024/02/13 | 2282 | macros/latex/contrib/l3kernel/source3.tex 2024/02/13 | 2176 | macros/unicodetex/latex/fontspec/fontspec-code-load.dtx 2024/02/13 | 21600 | macros/unicodetex/latex/fontspec/fontspec-code-opentype.dtx 2024/02/13 | 2147 | macros/unicodetex/latex/fontspec/fontspec.ins 2024/02/13 | 21304035 | support/arara.zip 2024/02/13 | 21259920 | install/support/arara.tds.zip 2024/02/13 | 21198 | macros/jptex/latex/jlreq/jlreq-helpers.sty -2024/02/13 | 21031685 | systems/texlive/tlnet/install-tl-windows.exe 2024/02/13 | 2099 | support/arara/scripts/rules/arara-rule-perltex.yaml 2024/02/13 | 20810 | macros/unicodetex/latex/fontspec/fontspec-code-feat-opentype.dtx +2024/02/13 | 205020 | macros/latex/contrib/l3kernel/l3news12.pdf +2024/02/13 | 20460 | macros/latex/contrib/l3kernel/l3text-purify.dtx +2024/02/13 | 20310 | macros/latex/contrib/l3kernel/l3fp-symbolic.dtx 2024/02/13 | 1985 | support/arara/scripts/rules/arara-rule-frontespizio.yaml 2024/02/13 | 1974 | support/arara/scripts/rules/arara-rule-xindy.yaml 2024/02/13 | 1973 | support/arara/scripts/rules/arara-rule-texindy.yaml -2024/02/13 | 19322816 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2024/02/13 | 19637 | macros/latex/contrib/l3kernel/l3fp-convert.dtx +2024/02/13 | 19547 | macros/latex/contrib/l3kernel/l3bitset.dtx +2024/02/13 | 1949 | macros/latex/contrib/l3kernel/interface3.tex +2024/02/13 | 1923 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex 2024/02/13 | 191524 | support/arara/doc/arara-quickstart.pdf 2024/02/13 | 19106 | macros/unicodetex/latex/fontspec/LICENSE 2024/02/13 | 18998 | macros/latex/contrib/spbmark/spbmark.tex 2024/02/13 | 1883 | support/arara/scripts/rules/arara-rule-latexmk.yaml +2024/02/13 | 18528 | macros/latex/contrib/l3kernel/l3fp-round.dtx 2024/02/13 | 1836 | support/arara/scripts/rules/arara-rule-detex.yaml +2024/02/13 | 1792513 | macros/latex/contrib/l3kernel/interface3.pdf 2024/02/13 | 17612 | macros/unicodetex/latex/fontspec/fontspec-code-user.dtx +2024/02/13 | 1758079 | install/macros/latex/contrib/l3packages.tds.zip 2024/02/13 | 17550 | macros/latex/contrib/spbmark/spbmark.sty +2024/02/13 | 17497 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex 2024/02/13 | 1727 | support/arara/doc/arara.1 2024/02/13 | 1721 | support/arara/scripts/rules/arara-rule-pythontex.yaml +2024/02/13 | 17204 | macros/latex/contrib/l3kernel/l3pdf.dtx 2024/02/13 | 1708 | support/arara/scripts/rules/arara-rule-texcount.yaml +2024/02/13 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf 2024/02/13 | 1687 | macros/unicodetex/latex/fontspec/fontspec-example.tex 2024/02/13 | 168372 | support/arara/doc/resources/CascadiaMono-Italic.otf -2024/02/13 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2024/02/13 | 1671 | support/arara/scripts/rules/arara-rule-fig2dev.yaml 2024/02/13 | 16715492 | support/arara/scripts/arara.jar 2024/02/13 | 167028 | support/arara/doc/resources/CascadiaMono-LightItalic.otf +2024/02/13 | 16624 | macros/latex/contrib/l3kernel/l3text-map.dtx +2024/02/13 | 163484 | macros/latex/contrib/l3kernel/l3news08.pdf 2024/02/13 | 1624 | support/arara/scripts/rules/arara-rule-pdflatex.yaml 2024/02/13 | 1624 | support/arara/scripts/rules/arara-rule-lualatex.yaml 2024/02/13 | 161924 | support/arara/doc/resources/CascadiaMono-ExtraLightItalic.otf 2024/02/13 | 161121 | support/arara/source/arara-7.1.3-src.zip 2024/02/13 | 1609 | support/arara/scripts/rules/arara-rule-latex.yaml +2024/02/13 | 159767 | macros/latex/contrib/l3kernel/l3doc.dtx 2024/02/13 | 1570 | support/arara/scripts/rules/arara-rule-xelatex.yaml -2024/02/13 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 -2024/02/13 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2024/02/13 | 1561 | macros/latex/contrib/l3packages/xtemplate.ins 2024/02/13 | 1521 | support/arara/scripts/rules/arara-rule-uplatex.yaml 2024/02/13 | 1516 | support/arara/scripts/rules/arara-rule-platex.yaml +2024/02/13 | 151591 | macros/latex/contrib/l3kernel/l3news06.pdf +2024/02/13 | 151264 | macros/latex/contrib/l3kernel/l3docstrip.pdf 2024/02/13 | 1511 | support/arara/scripts/rules/arara-rule-xetex.yaml +2024/02/13 | 150919 | macros/latex/contrib/l3kernel/l3news02.pdf +2024/02/13 | 150302 | macros/latex/contrib/l3kernel/l3news10.pdf 2024/02/13 | 1502 | support/arara/scripts/rules/arara-rule-makeindex.yaml +2024/02/13 | 149691 | macros/latex/contrib/l3kernel/l3tl.dtx 2024/02/13 | 1493 | support/albatross/doc/albatross.1 +2024/02/13 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex +2024/02/13 | 148747 | macros/latex/contrib/l3kernel/l3news03.pdf 2024/02/13 | 1477 | support/arara/scripts/rules/arara-rule-asymptote.yaml 2024/02/13 | 1469 | support/arara/scripts/rules/arara-rule-knitr.yaml -2024/02/13 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 -2024/02/13 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 2024/02/13 | 1447 | support/arara/scripts/rules/arara-rule-dvisvgm.yaml +2024/02/13 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex +2024/02/13 | 144214 | macros/latex/contrib/l3kernel/l3file.dtx +2024/02/13 | 14314783 | install/macros/latex/contrib/l3kernel.tds.zip +2024/02/13 | 14100 | macros/latex/contrib/l3kernel/l3flag.dtx 2024/02/13 | 1396 | macros/unicodetex/latex/emotion/README.md 2024/02/13 | 1393093 | install/macros/unicodetex/latex/fontspec.tds.zip +2024/02/13 | 137539 | macros/latex/contrib/l3kernel/l3basics.dtx 2024/02/13 | 13716 | macros/unicodetex/latex/fontspec/fontspec-doc-api.tex 2024/02/13 | 1348 | macros/jptex/latex/jlreq/LICENSE 2024/02/13 | 1344 | macros/latex/contrib/exesheet/README.md 2024/02/13 | 1341 | support/arara/scripts/rules/arara-rule-clean.yaml 2024/02/13 | 1330044 | macros/unicodetex/latex/fontspec.zip -2024/02/13 | 13283 | support/texlogfilter.zip +2024/02/13 | 13250 | macros/latex/contrib/l3kernel/l3tl-build.dtx 2024/02/13 | 1323 | support/arara/scripts/rules/arara-rule-sage.yaml 2024/02/13 | 13206 | support/albatross/source/albatross-0.5.1-src.zip 2024/02/13 | 1306 | macros/latex/contrib/xfrac/xfrac.ins +2024/02/13 | 130500 | macros/latex/contrib/l3kernel/l3keys.dtx +2024/02/13 | 12948 | macros/latex/contrib/l3kernel/l3bootstrap.dtx 2024/02/13 | 12937 | macros/unicodetex/latex/fontspec/fontspec-code-lang.dtx 2024/02/13 | 1288 | macros/unicodetex/latex/fontspec/fontspec.ltx 2024/02/13 | 1283 | support/arara/scripts/rules/arara-rule-pdfcsplain.yaml +2024/02/13 | 128344 | macros/latex/contrib/l3kernel/l3news07.pdf +2024/02/13 | 12832 | macros/latex/contrib/l3kernel/l3fp-traps.dtx 2024/02/13 | 1280 | support/arara/scripts/rules/arara-rule-llmk.yaml +2024/02/13 | 12785 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex 2024/02/13 | 1275 | support/arara/scripts/rules/arara-rule-luahbtex.yaml 2024/02/13 | 1274 | support/arara/scripts/rules/arara-rule-dvipspdf.yaml 2024/02/13 | 1273 | support/arara/scripts/rules/arara-rule-metapost.yaml +2024/02/13 | 1272 | macros/latex/contrib/l3packages/xparse.ins 2024/02/13 | 1271 | support/arara/scripts/rules/arara-rule-csplain.yaml 2024/02/13 | 1267 | support/arara/scripts/rules/arara-rule-pdftex.yaml 2024/02/13 | 1267 | support/arara/scripts/rules/arara-rule-luatex.yaml 2024/02/13 | 1259 | macros/unicodetex/latex/fontspec/fontspec-code-closing.dtx 2024/02/13 | 12507 | macros/unicodetex/latex/fontspec/fontspec-code-api.dtx -2024/02/13 | 12502 | support/texlogfilter/texlogfilter 2024/02/13 | 12321 | macros/unicodetex/latex/fontspec/fontspec-code-math.dtx +2024/02/13 | 12304 | macros/latex/contrib/l3packages/l3keys2e.dtx +2024/02/13 | 122959 | macros/latex/contrib/l3kernel/l3news01.pdf +2024/02/13 | 1228 | macros/latex/contrib/l3packages/l3keys2e.ins 2024/02/13 | 1223 | macros/unicodetex/latex/fontspec/fontspec-code.ltx 2024/02/13 | 121523 | macros/jptex/latex/jlreq/jlreq.pdf 2024/02/13 | 11984 | macros/unicodetex/latex/fontspec/fontspec-doc-xetex.tex 2024/02/13 | 11926 | macros/jptex/latex/jlreq/luajfm2pl.lua +2024/02/13 | 1191 | macros/latex/contrib/l3packages/xfp.ins +2024/02/13 | 11882 | macros/latex/contrib/l3kernel/l3styleguide.tex +2024/02/13 | 11778 | macros/latex/contrib/l3kernel/l3fparray.dtx +2024/02/13 | 116935 | macros/latex/contrib/l3kernel/l3token.dtx 2024/02/13 | 1165 | support/arara/scripts/rules/arara-rule-uptex.yaml 2024/02/13 | 1161 | support/arara/scripts/rules/arara-rule-ptex.yaml 2024/02/13 | 1157784 | support/arara/doc/arara-manual.pdf -2024/02/13 | 114048 | systems/texlive/tlnet/archive/texlive-scripts.r69818.tar.xz +2024/02/13 | 114754 | macros/latex/contrib/l3kernel/l3news04.pdf +2024/02/13 | 113735 | macros/latex/contrib/l3kernel/l3str-convert.dtx 2024/02/13 | 11357 | macros/unicodetex/latex/emotion/LICENSE +2024/02/13 | 112524 | macros/latex/contrib/l3kernel/l3news05.pdf +2024/02/13 | 112260 | macros/latex/contrib/l3kernel/l3color.dtx 2024/02/13 | 1109 | support/arara/scripts/rules/arara-rule-xdvipdfmx.yaml 2024/02/13 | 110765 | macros/latex/contrib/exesheet/exesheet.dtx 2024/02/13 | 1105 | support/arara/scripts/rules/arara-rule-animate.yaml 2024/02/13 | 1104 | support/arara/scripts/rules/arara-rule-authorindex.yaml 2024/02/13 | 10980925 | install/macros/jptex/latex/jlreq.tds.zip +2024/02/13 | 10802 | macros/optex/base/others.opm +2024/02/13 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex 2024/02/13 | 1061 | support/arara/scripts/rules/arara-rule-etex.yaml +2024/02/13 | 105022 | macros/latex/contrib/l3kernel/l3fp-parse.dtx 2024/02/13 | 1049 | support/arara/scripts/rules/arara-rule-tex.yaml +2024/02/13 | 103074 | macros/latex/contrib/l3kernel/l3prop.dtx 2024/02/13 | 101256 | macros/latex/contrib/spbmark.zip +2024/02/13 | 1005 | macros/latex/contrib/l3packages/README.md +2024/02/13 | 100486 | macros/latex/contrib/l3kernel/l3seq.dtx 2024/02/12 | 98392 | usergrps/dante/dtk.zip 2024/02/12 | 951 | macros/luatex/latex/lua-placeholders/doc/lua-placeholders-deps.bib 2024/02/12 | 9516 | macros/luatex/latex/gitinfo-lua/scripts/gitinfo-lua.lua @@ -237,6 +873,8 @@ 2024/02/12 | 89008 | graphics/gastex/gastex.sty 2024/02/12 | 88659 | macros/latex/contrib/easybook/easybook.tex 2024/02/12 | 88547 | info/kaytannollista-latexia/luku-merkintakieli.tex +2024/02/12 | 8844 | graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex +2024/02/12 | 8267 | macros/optex/demo/op-mathalign.tex 2024/02/12 | 8161 | macros/luatex/latex/lua-placeholders/doc/lua-placeholders-example/example.tex 2024/02/12 | 7708 | systems/texlive/tlnet/archive/listofitems.r69774.tar.xz 2024/02/12 | 75689 | macros/latex/contrib/easybook/easybook.dtx @@ -269,6 +907,7 @@ 2024/02/12 | 3078 | macros/luatex/latex/gitinfo-lua/tex/gitinfo-lua.sty 2024/02/12 | 3039 | info/kaytannollista-latexia/kirjallisuutta.bib 2024/02/12 | 29 | info/kaytannollista-latexia/versio.tex +2024/02/12 | 2928 | macros/optex/base/logos.opm 2024/02/12 | 289 | macros/luatex/latex/lua-placeholders/doc/lua-placeholders-example/example.yaml 2024/02/12 | 2856 | macros/luatex/latex/lua-placeholders/tex/lua-placeholders.sty 2024/02/12 | 2709496 | systems/texlive/tlnet/archive/exam-zh.doc.r69803.tar.xz @@ -282,6 +921,7 @@ 2024/02/12 | 1889 | graphics/gastex/README 2024/02/12 | 1744 | systems/texlive/tlnet/archive/tblr-extras.r69776.tar.xz 2024/02/12 | 17275 | usergrps/dante/dtk/dtk.cls +2024/02/12 | 16778 | macros/optex/base/fonts-resize.opm 2024/02/12 | 1665 | support/texshop/texshop527.html 2024/02/12 | 16642 | macros/luatex/latex/gitinfo-lua/doc/gitinfo-lua.tex 2024/02/12 | 16604 | systems/texlive/tlnet/archive/easybook.r69805.tar.xz @@ -308,6 +948,7 @@ 2024/02/11 | 82487 | systems/texlive/tlnet/tlpkg/translations/es.po 2024/02/11 | 81473 | systems/texlive/tlnet/tlpkg/translations/uk.po 2024/02/11 | 7700 | graphics/gastex/gastex-doc.tex +2024/02/11 | 76664 | graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex 2024/02/11 | 71328 | systems/texlive/tlnet/tlpkg/translations/sl.po 2024/02/11 | 71105 | macros/xetex/latex/exam-zh/tex/exam-zh.cls 2024/02/11 | 68210 | systems/texlive/tlnet/tlpkg/translations/pl.po @@ -318,15 +959,21 @@ 2024/02/11 | 59155 | systems/texlive/tlnet/tlpkg/translations/nl.po 2024/02/11 | 58581 | systems/texlive/tlnet/tlpkg/translations/da.po 2024/02/11 | 53112 | macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty +2024/02/11 | 49262 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf 2024/02/11 | 393 | macros/xetex/latex/exam-zh/doc/back/main-changelog.tex 2024/02/11 | 3504556 | macros/latex/contrib/proflycee.zip 2024/02/11 | 34627 | macros/xetex/latex/exam-zh/doc/xdyydoc.cls +2024/02/11 | 31545 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf +2024/02/11 | 3060 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex 2024/02/11 | 3006575 | macros/xetex/latex/exam-zh.zip +2024/02/11 | 25812 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex 2024/02/11 | 25245 | macros/xetex/latex/exam-zh/tex/exam-zh-textfigure.sty 2024/02/11 | 24945 | macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty 2024/02/11 | 23159 | macros/xetex/latex/exam-zh/examples/example-multiple.tex 2024/02/11 | 2212 | macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex +2024/02/11 | 22087 | macros/optex/pkg/mte.opm 2024/02/11 | 2129 | macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex +2024/02/11 | 208031 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty 2024/02/11 | 20720 | macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty 2024/02/11 | 20634 | macros/xetex/latex/exam-zh/tex/exam-zh-font.sty 2024/02/11 | 19106 | macros/xetex/latex/exam-zh/LICENSE @@ -335,6 +982,7 @@ 2024/02/11 | 160276 | macros/xetex/latex/exam-zh/examples/example-multiple.pdf 2024/02/11 | 15513 | macros/xetex/latex/exam-zh/tex/exam-zh-math.sty 2024/02/11 | 148041 | macros/xetex/latex/exam-zh/examples/example-single.pdf +2024/02/11 | 1393 | graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf 2024/02/11 | 134976 | graphics/gastex/gastex-doc.pdf 2024/02/11 | 120405 | macros/xetex/latex/exam-zh/doc/body/usage.tex 2024/02/11 | 11537 | macros/xetex/latex/exam-zh/README.md @@ -367,9 +1015,11 @@ 2024/02/10 | 82021 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma 2024/02/10 | 81721 | systems/win32/miktex/tm/packages/tkz-euclide__source.tar.lzma 2024/02/10 | 81578 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma +2024/02/10 | 8133 | graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex 2024/02/10 | 811480 | systems/win32/miktex/tm/packages/next/files.csv.lzma 2024/02/10 | 810237 | systems/win32/miktex/tm/packages/files.csv.lzma 2024/02/10 | 78317 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma +2024/02/10 | 77977 | graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex 2024/02/10 | 773255 | systems/win32/miktex/tm/packages/ysabeau__doc.tar.lzma 2024/02/10 | 77303 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma 2024/02/10 | 7667 | systems/win32/miktex/tm/packages/contract.tar.lzma @@ -499,6 +1149,7 @@ 2024/02/10 | 31890 | systems/win32/miktex/tm/packages/litetable__source.tar.lzma 2024/02/10 | 31559 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma 2024/02/10 | 3143 | systems/win32/miktex/tm/packages/udepcolor__source.tar.lzma +2024/02/10 | 30959 | graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex 2024/02/10 | 305331 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma 2024/02/10 | 302516 | systems/win32/miktex/tm/packages/latexmk__doc.tar.lzma 2024/02/10 | 3024 | systems/win32/miktex/tm/packages/docshots.tar.lzma @@ -573,6 +1224,7 @@ 2024/02/10 | 196592 | systems/win32/miktex/tm/packages/circuitikz.tar.lzma 2024/02/10 | 195 | macros/generic/listofitems/listofitems.sty 2024/02/10 | 19247 | systems/win32/miktex/tm/packages/dictsym__doc.tar.lzma +2024/02/10 | 19195 | macros/optex/base/more-macros.opm 2024/02/10 | 19166 | systems/win32/miktex/tm/packages/verifiche__source.tar.lzma 2024/02/10 | 1893448 | systems/texlive/tlnet/archive/circuitikz.doc.r69757.tar.xz 2024/02/10 | 1893415 | systems/win32/miktex/tm/packages/circuitikz__doc.tar.lzma @@ -583,6 +1235,7 @@ 2024/02/10 | 18143 | systems/win32/miktex/tm/packages/bodeplot__source.tar.lzma 2024/02/10 | 17876 | systems/win32/miktex/tm/packages/tkz-elements.tar.lzma 2024/02/10 | 178132 | systems/texlive/tlnet/archive/circuitikz.r69757.tar.xz +2024/02/10 | 17776 | graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex 2024/02/10 | 177067 | systems/win32/miktex/tm/packages/beamerthemeamurmaple__source.tar.lzma 2024/02/10 | 1761582 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma 2024/02/10 | 1760 | systems/win32/miktex/tm/packages/leftindex.tar.lzma @@ -649,6 +1302,7 @@ 2024/02/10 | 1051943 | systems/win32/miktex/tm/packages/babel__doc.tar.lzma 2024/02/10 | 1048 | macros/generic/listofitems/README 2024/02/10 | 104428 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma +2024/02/10 | 10424 | graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex 2024/02/10 | 104152 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma 2024/02/10 | 10400 | fonts/cochineal/README 2024/02/10 | 103558 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma @@ -868,111 +1522,3 @@ 2024/02/08 | 1021 | macros/latex/contrib/l3build/README.md 2024/02/08 | 10160 | systems/texlive/tlnet/archive/startex.r69742.tar.xz 2024/02/08 | 10077 | macros/luatex/generic/evangelion-jfm/figure/fig-jp.pdf -2024/02/07 | 9717 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-focus.jpg -2024/02/07 | 92872 | systems/texlive/tlnet/archive/spbmark.doc.r69725.tar.xz -2024/02/07 | 9239 | macros/latex/contrib/siunitx/siunitx-symbol.dtx -2024/02/07 | 8961 | macros/latex/required/babel/base/babel.ins -2024/02/07 | 8866 | macros/latex/contrib/siunitx/siunitx-command.dtx -2024/02/07 | 861564 | systems/texlive/tlnet/archive/verifiche.doc.r69726.tar.xz -2024/02/07 | 800857 | macros/latex/required/babel/base/babel.dtx -2024/02/07 | 79196 | macros/latex/contrib/siunitx/CHANGELOG.md -2024/02/07 | 789511 | graphics/pgf/contrib/bodeplot.zip -2024/02/07 | 7692 | systems/texlive/tlnet/archive/footmisc.r69729.tar.xz -2024/02/07 | 75306 | graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.tex -2024/02/07 | 705436 | macros/latex/contrib/siunitx/siunitx.pdf -2024/02/07 | 647453 | macros/latex/contrib/siunitx/siunitx-code.pdf -2024/02/07 | 647075 | macros/latex/required/babel/base/babel-code.pdf -2024/02/07 | 640 | systems/texlive/tlnet/archive/mnhyphn.doc.r69727.tar.xz -2024/02/07 | 627853 | support/TeX4ht/source/tex4ht-html4.tex -2024/02/07 | 62756 | systems/texlive/tlnet/archive/acmart.source.r69721.tar.xz -2024/02/07 | 616 | systems/texlive/tlnet/archive/collection-langcyrillic.r69727.tar.xz -2024/02/07 | 602 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo_bibliography.bib -2024/02/07 | 5831 | macros/latex/contrib/siunitx/siunitx-locale.dtx -2024/02/07 | 57942 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-titlepage-color.jpg -2024/02/07 | 55728 | macros/latex/contrib/siunitx/siunitx-table.dtx -2024/02/07 | 5340 | systems/texlive/tlnet/archive/verifiche.r69726.tar.xz -2024/02/07 | 514744 | systems/texlive/tlnet/archive/footmisc.doc.r69729.tar.xz -2024/02/07 | 495 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/LICENSE -2024/02/07 | 4862 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo.tex -2024/02/07 | 4748 | macros/latex/contrib/siunitx/siunitx-abbreviations.cfg -2024/02/07 | 473816 | systems/texlive/tlnet/archive/lwarp.source.r69724.tar.xz -2024/02/07 | 4597 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamerinnerthemefocus.sty -2024/02/07 | 45868 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-typeset.jpg -2024/02/07 | 4567020 | systems/texlive/tlnet/archive/acmart.doc.r69721.tar.xz -2024/02/07 | 43869 | macros/latex/contrib/siunitx/siunitx-compound.dtx -2024/02/07 | 431266 | graphics/pgf/contrib/profsio/doc/ProfSio-doc-fr.pdf -2024/02/07 | 42920 | systems/texlive/tlnet/archive/acmart.r69721.tar.xz -2024/02/07 | 42671 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo.pdf -2024/02/07 | 421738 | macros/latex/required/babel/base/babel.pdf -2024/02/07 | 4142 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/README.md -2024/02/07 | 4062 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-logo.pdf -2024/02/07 | 39328 | macros/latex/contrib/siunitx/siunitx-complex.dtx -2024/02/07 | 3857954 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple.zip -2024/02/07 | 378979 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-sidebar.pdf -2024/02/07 | 37836 | macros/latex/contrib/siunitx/siunitx-print.dtx -2024/02/07 | 3720932 | install/macros/latex/required/babel-base.tds.zip -2024/02/07 | 3687 | macros/latex/contrib/siunitx/siunitx.ins -2024/02/07 | 3652 | systems/texlive/tlnet/archive/spbmark.r69725.tar.xz -2024/02/07 | 362787 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-blue.pdf -2024/02/07 | 362637 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-test.pdf -2024/02/07 | 362482 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-green.pdf -2024/02/07 | 362165 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-black.pdf -2024/02/07 | 35777 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-titlepage.jpg -2024/02/07 | 35571 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-subsectionpage.jpg -2024/02/07 | 3527 | macros/latex/required/babel/base/bbidxglo.dtx -2024/02/07 | 35149 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/LICENSE.md -2024/02/07 | 33 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/CHANGELOG.md -2024/02/07 | 336774 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-leftframetitle.pdf -2024/02/07 | 3320404 | systems/texlive/tlnet/archive/lwarp.doc.r69724.tar.xz -2024/02/07 | 32126 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-references.jpg -2024/02/07 | 31812 | macros/latex/contrib/siunitx/siunitx-emulation.dtx -2024/02/07 | 31738 | macros/latex/contrib/siunitx/siunitx-version-1.cfg -2024/02/07 | 31652 | systems/texlive/tlnet/archive/dictsym.r69720.tar.xz -2024/02/07 | 2968 | systems/texlive/tlnet/archive/mnhyphn.r69727.tar.xz -2024/02/07 | 2951 | macros/latex/contrib/siunitx/siunitx-binary.dtx -2024/02/07 | 273398 | macros/latex/contrib/siunitx/siunitx-v2.sty -2024/02/07 | 27131 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/focus-demo/demo-appendix.jpg -2024/02/07 | 270492 | macros/latex/contrib/ucph-revy/ucph-revy-en-doc.pdf -2024/02/07 | 2693 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamercolorthemefocus.sty -2024/02/07 | 268481 | macros/latex/contrib/ucph-revy/ucph-revy-da-doc.pdf -2024/02/07 | 265999 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus.zip -2024/02/07 | 2636 | macros/latex/contrib/siunitx/siunitx-code.tex -2024/02/07 | 2496 | macros/latex/contrib/ucph-revy/README.md -2024/02/07 | 24711 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/tex/beamerthemeAmurmaple.sty -2024/02/07 | 245462 | support/TeX4ht/source/ChangeLog -2024/02/07 | 2365239 | macros/latex/required/babel/base.zip -2024/02/07 | 22852 | systems/texlive/tlnet/archive/asmejour.r69722.tar.xz -2024/02/07 | 22408 | systems/texlive/tlnet/archive/footmisc.source.r69729.tar.xz -2024/02/07 | 222396 | systems/texlive/tlnet/archive/lwarp.r69724.tar.xz -2024/02/07 | 22232 | macros/latex/contrib/siunitx/siunitx.dtx -2024/02/07 | 21890 | macros/latex/required/babel/base/bbcompat.dtx -2024/02/07 | 2161400 | systems/texlive/tlnet/archive/asmejour.doc.r69722.tar.xz -2024/02/07 | 2152 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamerthemefocus.sty -2024/02/07 | 20816 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-doc.tex -2024/02/07 | 2047 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamerfontthemefocus.sty -2024/02/07 | 19788 | systems/texlive/tlnet/archive/dictsym.doc.r69720.tar.xz -2024/02/07 | 1899 | macros/latex/required/babel/base/README.md -2024/02/07 | 18688 | systems/texlive/tlnet/archive/verifiche.source.r69726.tar.xz -2024/02/07 | 18441 | macros/latex/contrib/siunitx/siunitx-angle.dtx -2024/02/07 | 1729 | macros/latex/contrib/siunitx/siunitx-binary.cfg -2024/02/07 | 170260 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/logo.png -2024/02/07 | 169129 | macros/latex/contrib/ucph-revy/ucph-revy-en-man.pdf -2024/02/07 | 168534 | macros/latex/contrib/siunitx/siunitx.tex -2024/02/07 | 164864 | macros/latex/contrib/ucph-revy/ucph-revy-da-man.pdf -2024/02/07 | 1644 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/README.md -2024/02/07 | 1627435 | macros/latex/contrib/beamer-contrib/themes/beamerthemeamurmaple/doc/beamer-amurmaple-doc.pdf -2024/02/07 | 162527 | macros/latex/contrib/siunitx/siunitx-number.dtx -2024/02/07 | 1594222 | install/macros/latex/contrib/siunitx.tds.zip -2024/02/07 | 1546829 | macros/latex/contrib/siunitx.zip -2024/02/07 | 154296 | support/TeX4ht/source/tex4ht-mathml.tex -2024/02/07 | 15311 | macros/latex/contrib/siunitx/siunitx-quantity.dtx -2024/02/07 | 1488 | systems/texlive/tlnet/archive/hvqrurl.r69723.tar.xz -2024/02/07 | 13248 | macros/latex/contrib/beamer-contrib/themes/beamertheme-focus/beamerouterthemefocus.sty -2024/02/07 | 1184694 | support/TeX4ht/source/tex4ht-4ht.tex -2024/02/07 | 1179 | macros/latex/contrib/siunitx/README.md -2024/02/07 | 117728 | systems/texlive/tlnet/archive/hvqrurl.doc.r69723.tar.xz -2024/02/07 | 113044 | graphics/pgf/contrib/profsio/tex/ProfSio.sty -2024/02/07 | 11266 | macros/latex/contrib/siunitx/siunitx-abbreviation.dtx -2024/02/07 | 1086742 | macros/latex/required/babel/base/locale.zip -2024/02/07 | 107080 | macros/latex/contrib/ucph-revy/ucph-revy.dtx -2024/02/07 | 103567 | macros/latex/contrib/siunitx/siunitx-unit.dtx diff --git a/biblio/bibtex/contrib/francais-bst/README.md b/biblio/bibtex/contrib/francais-bst/README.md index 9efba0e990..aab3466fd2 100644 --- a/biblio/bibtex/contrib/francais-bst/README.md +++ b/biblio/bibtex/contrib/francais-bst/README.md @@ -17,7 +17,7 @@ later version. ## Version -2.0 (2023-10-28) +2.0a (2024-02-13) ## Author @@ -93,7 +93,7 @@ auteur-date proposées dans l'ouvrage de référence de Marie Malo, «Guide de la communication écrite au cégep, à l'université et en entreprise» (Québec Amérique, 1996). -Les styles ont été développé à l'origine à l'aide du programme +Les styles ont été développés à l'origine à l'aide du programme `makebst` de Patrick W. Daly. Le fichier maitre de styles bibliographiques dérive étroitement du fichier `merlin.mbs` du paquetage **custom-bib**. @@ -105,7 +105,7 @@ version ultérieure. ## Version -2.0 (2023-10-28) +2.0a (2024-02-13) ## Auteur diff --git a/biblio/bibtex/contrib/francais-bst/francais-bst.mbs b/biblio/bibtex/contrib/francais-bst/francais-bst.mbs index 56a1607481..7a49781733 100644 --- a/biblio/bibtex/contrib/francais-bst/francais-bst.mbs +++ b/biblio/bibtex/contrib/francais-bst/francais-bst.mbs @@ -2,7 +2,7 @@ % % Master bibliography style for francais.bst and francaissc.bst % -% Copyright (C) 2012-2023 Vincent Goulet +% Copyright (C) 2012-2024 Vincent Goulet % % This file may be distributed and/or modified under the conditions % of the LaTeX Project Public License, either version 1.3c of this @@ -30,7 +30,7 @@ % ------------------------------------------------------------------- % Name and version information of the main mbs file: %\fi - % \ProvidesFile{francais-bst.mbs}[2023/10/28 v2.0 (VG, PWD, AO, DPC)] + % \ProvidesFile{francais-bst.mbs}[2024/02/13 v2.0a (VG, PWD, AO, DPC)] %\iffalse %</!tail> %<*a&!a> @@ -49,29 +49,13 @@ %% Le chargement de doc.sty cause des conflits avec memoir. Il faut: %% %% - annuler la définition de l'environnement 'glossary' de memoir; - %% - remettre en place les définitions standards des - %% commandes pour l'index et le glossaire sur lesquelles se base - %% doc.sty. + + %% - remettre en place les définitions standards des commandes pour + %% le glossaire sur lesquelles se base doc.sty (nécessaire aussi + %% pour l'index, mais il n'est pas utilisé). \let\theglossary\relax % avoid conflict with doc.sty \let\endtheglossary\relax % avoid conflict with doc.sty \makeatletter - \def\makeindex{% - \newwrite\@indexfile - \immediate\openout\@indexfile=\jobname.idx - \def\index{\@bsphack\begingroup - \@sanitize - \@wrindex}\typeout - {Writing index file \jobname.idx}% - \let\makeindex\@empty - } - \@onlypreamble\makeindex - \def\@wrindex#1{% - \protected@write\@indexfile{}% - {\string\indexentry{#1}{\thepage}}% - \endgroup - \@esphack} - \def\index{\@bsphack\begingroup \@sanitize\@index} - \def\@index#1{\endgroup\@esphack} \def\makeglossary{% \newwrite\@glossaryfile \immediate\openout\@glossaryfile=\jobname.glo @@ -153,9 +137,11 @@ %% Aligner à gauche l'environnement enumerate \setlist[enumerate]{leftmargin=*,align=left} - %% Configurer du glossaire - \GlossaryPrologue{\section*{Historique des versions}% - \addcontentsline{toc}{section}{Historique des versions}} + %% Configurer le glossaire + \addto\extrasfrench{% + \def\glossaryname{Historique des versions}} + \GlossaryPrologue{\section*{\glossaryname}% + \addcontentsline{toc}{section}{\glossaryname}} \setcounter{GlossaryColumns}{2} \setlength{\GlossaryMin}{5cm} @@ -211,6 +197,8 @@ % données).} % \changes{2.0}{2023-10-28}{La disposition de certains éléments dans % la notice bibliographique a été révisée.} +% \changes{2.0a}{2024-02-13}{Correction de coquilles dans la +% documentation.} % % \title{Styles bibliographiques {\frbst} et {\frscbst}} % \author{Vincent Goulet \\ École d'actuariat, Université Laval} @@ -226,7 +214,7 @@ % référence de Marie Malo, \emph{Guide de la communication écrite au % cégep, à l'université et en entreprise} (Québec Amérique, 1996). % -% Les styles ont été développé à l'origine à l'aide du programme +% Les styles ont été développés à l'origine à l'aide du programme % \code{makebst} de Patrick W.~Daly. Le fichier maitre de styles % bibliographiques \code{\filename} dérive étroitement du fichier % \code{merlin.mbs} du paquetage % @@ -343,7 +331,8 @@ % champs suivants: % \begin{description}[font=\mdseries\ttfamily,style=nextline,leftmargin=3em] % \item[doi] L'identificateur d'objet numérique (DOI) d'une ressource. -% Entrez la valeur sous la forme \code{prefix/suffix} (par exemple: +% Entrez la valeur sous la forme +% \meta{préfixe}\code{/}\meta{suffixe} (par exemple: % \code{10.1000/182}). Les styles créent automatiquement un % hyperlien vers la ressource. % \item[isbn] Le numéro international normalisé du livre (ISBN) d'un @@ -395,7 +384,7 @@ % \code{latex francaisbst.dbj} % \end{quote} % -% \section{Changements par rapport à \code{merlin.mbs}} +% \section{Changements par rapport à \texorpdfstring{\code{merlin.mbs}}{merlin.mbs}} % \label{sec:changements} % % Cette section documente les changements apportés au fichier @@ -422,7 +411,7 @@ % dans votre document pour l'adapter à vos besoins, si désiré. % \item La commande \cmd{\urlprefix} est vide, de sorte que «URL» % n'apparait pas devant les URL dans la bibliographie. De nouveau, -% vous pouvez redéfinir la commande dans votre document ni désiré. +% vous pouvez redéfinir la commande dans votre document si désiré. % \item Les guillemets français «~» sont produits par la commande % \cmd{\frquote} de \pkg{babel-french} (version $\geq$ 3.1) plutôt % qu'avec les commandes \cmd{\guillemotleft} et diff --git a/biblio/bibtex/contrib/francais-bst/francais-bst.pdf b/biblio/bibtex/contrib/francais-bst/francais-bst.pdf Binary files differindex bd71ee574d..2bc8a5d6ab 100644 --- a/biblio/bibtex/contrib/francais-bst/francais-bst.pdf +++ b/biblio/bibtex/contrib/francais-bst/francais-bst.pdf diff --git a/biblio/bibtex/contrib/francais-bst/francais.dbj b/biblio/bibtex/contrib/francais-bst/francais.dbj index 8d5804bbab..137c4d099a 100644 --- a/biblio/bibtex/contrib/francais-bst/francais.dbj +++ b/biblio/bibtex/contrib/francais-bst/francais.dbj @@ -9,7 +9,7 @@ \preamble -Copyright (C) 2012-2023 Vincent Goulet +Copyright (C) 2012-2024 Vincent Goulet This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this diff --git a/biblio/bibtex/contrib/francais-bst/francaisbst.dbj b/biblio/bibtex/contrib/francais-bst/francaisbst.dbj index c177a3dde4..5f6186977e 100644 --- a/biblio/bibtex/contrib/francais-bst/francaisbst.dbj +++ b/biblio/bibtex/contrib/francais-bst/francaisbst.dbj @@ -6,7 +6,7 @@ \preamble -Copyright (C) 2012-2023 Vincent Goulet +Copyright (C) 2012-2024 Vincent Goulet This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this diff --git a/biblio/bibtex/contrib/francais-bst/francaissc.dbj b/biblio/bibtex/contrib/francais-bst/francaissc.dbj index 257e4f99e1..736269ebe6 100644 --- a/biblio/bibtex/contrib/francais-bst/francaissc.dbj +++ b/biblio/bibtex/contrib/francais-bst/francaissc.dbj @@ -9,7 +9,7 @@ \preamble -Copyright (C) 2012-2023 Vincent Goulet +Copyright (C) 2012-2024 Vincent Goulet This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib index ec3fb6c967..70684ab288 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 13-02-2024, 02:00:03 +%% created at 14-02-2024, 02:00:04 %% %% This file is provided under the terms of the LPPL v1.3 or @@ -1402,8 +1402,8 @@ title = {The \texttt{albatross} package}, subtitle = {Find fonts that contain a given glyph}, author = {{Island of TeX}}, - date = {2023-01-27}, - version = {0.5.0}, + date = {2024-02-13}, + version = {0.5.1}, license = {bsd3}, mirror = {https://mirror.ctan.org/support/albatross}, url = {https://ctan.org/pkg/albatross}, @@ -3048,8 +3048,8 @@ title = {The \texttt{arara} package}, subtitle = {Automation of \LaTeX{} compilation}, author = {Paulo Roberto Massa Cereda}, - date = {2023-10-02}, - version = {7.1.2}, + date = {2024-02-13}, + version = {7.1.3}, license = {bsd}, mirror = {https://mirror.ctan.org/support/arara}, url = {https://ctan.org/pkg/arara}, @@ -21969,8 +21969,8 @@ title = {The \texttt{emotion} package}, subtitle = {Make emojis more easy to use in \XeLaTeX{} and LuaLaTeX}, author = {Xuwang Zeng}, - date = {2024-02-12}, - version = {0.1}, + date = {2024-02-13}, + version = {0.2}, license = {apache2}, mirror = {https://mirror.ctan.org/macros/unicodetex/latex/emotion}, url = {https://ctan.org/pkg/emotion}, @@ -24164,8 +24164,8 @@ title = {The \texttt{exesheet} package}, subtitle = {Typesetting exercise or exam sheets}, author = {Antoine Missier}, - date = {2024-02-03}, - version = {2.6}, + date = {2024-02-13}, + version = {2.7}, license = {lppl1.3}, mirror = {https://mirror.ctan.org/macros/latex/contrib/exesheet}, url = {https://ctan.org/pkg/exesheet}, @@ -27108,8 +27108,8 @@ title = {The \texttt{fontspec} package}, subtitle = {Advanced font selection in \XeLaTeX{} and LuaLaTeX}, author = {Will Robertson and {The LaTeX Project Team}}, - date = {2022-05-18}, - version = {2.8a}, + date = {2024-02-13}, + version = {2.9a}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/unicodetex/latex/fontspec}, url = {https://ctan.org/pkg/fontspec}, @@ -35673,7 +35673,7 @@ title = {The \texttt{jlreq} package}, subtitle = {Japanese document class based on requirements for Japanese text layout}, author = {Noriyuki Abe}, - date = {2023-06-18}, + date = {2024-02-13}, version = {}, license = {bsd2}, mirror = {https://mirror.ctan.org/macros/jptex/latex/jlreq}, @@ -37306,7 +37306,7 @@ title = {The \texttt{l3packages} package}, subtitle = {High-level \LaTeX{}3 concepts}, author = {{The LaTeX Project Team}}, - date = {2023-10-10}, + date = {2024-02-13}, version = {}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/l3packages}, @@ -49042,8 +49042,8 @@ title = {The \texttt{nicematrix} package}, subtitle = {Improve the typesetting of mathematical matrices with PGF}, author = {François Pantigny}, - date = {2024-01-25}, - version = {6.26d}, + date = {2024-02-13}, + version = {6.27}, license = {lppl1.3}, mirror = {https://mirror.ctan.org/macros/latex/contrib/nicematrix}, url = {https://ctan.org/pkg/nicematrix}, @@ -53800,6 +53800,17 @@ url = {https://ctan.org/pkg/pictexwd}, } +@manual{ctan-pictochrono, + title = {The \texttt{pictochrono} package}, + subtitle = {Insert “chronometer pictograms” with a duration}, + author = {Cédric Pierquet}, + date = {2024-02-13}, + version = {0.1.0}, + license = {lppl1.3c}, + mirror = {https://mirror.ctan.org/graphics/pgf/contrib/pictochrono}, + url = {https://ctan.org/pkg/pictochrono}, +} + @manual{ctan-picture, title = {The \texttt{picture} package}, subtitle = {Dimens for picture macros}, @@ -64786,8 +64797,8 @@ title = {The \texttt{spbmark} package}, subtitle = {Customize superscripts and subscripts}, author = {Qu Yi}, - date = {2024-02-12}, - version = {1.46c}, + date = {2024-02-13}, + version = {1.46d}, license = {cc-by-4}, mirror = {https://mirror.ctan.org/macros/latex/contrib/spbmark}, url = {https://ctan.org/pkg/spbmark}, @@ -67345,7 +67356,7 @@ title = {The \texttt{tblr-extras} package}, subtitle = {Extra libraries for tabularray for caption and babel compatibility}, author = {Manuel Merino}, - date = {2024-02-10}, + date = {2024-02-13}, version = {1.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/tblr-extras}, @@ -69032,8 +69043,8 @@ title = {The \texttt{texlogfilter} package}, subtitle = {Filter \LaTeX{} engines output or log file}, author = {Julien Labbé}, - date = {2022-03-30}, - version = {1.1}, + date = {2024-02-13}, + version = {1.2}, license = {lppl1.3}, mirror = {https://mirror.ctan.org/support/texlogfilter}, url = {https://ctan.org/pkg/texlogfilter}, @@ -75892,8 +75903,8 @@ title = {The \texttt{verse} package}, subtitle = {Aids for typesetting simple verse}, author = {Will Robertson and Peter R. Wilson}, - date = {2016-06-24}, - version = {2.4b}, + date = {2024-02-13}, + version = {2.4c}, license = {lppl}, mirror = {https://mirror.ctan.org/macros/latex/contrib/verse}, url = {https://ctan.org/pkg/verse}, @@ -78140,13 +78151,18 @@ @manual{ctan-xfrac, title = {The \texttt{xfrac} package}, - subtitle = {Split-level fractions in \LaTeX{}2e*}, - author = {Morten Høgholm and Lars Madsen and Will Robertson and Joseph Wright}, - date = {2023-10-10}, + subtitle = {Split-level fractions}, + author = {Morten Høgholm and Lars Madsen and Will Robertson and Joseph Wright and {The LaTeX Project Team}}, + date = {2024-02-13}, version = {}, license = {lppl1.3c}, - mirror = {https://mirror.ctan.org/macros/latex/contrib/l3packages}, + mirror = {https://mirror.ctan.org/macros/latex/contrib/xfrac}, url = {https://ctan.org/pkg/xfrac}, + annotation = {This package uses the interface defined by \LaTeX{} templates + to provide flexible split-level fractions + the macro. + This is both a demonstration of the power of the template concept + and also a useful addition to the available functionality in \LaTeX{}2e.}, } @manual{ctan-xgalley, diff --git a/graphics/pgf/contrib/pgf-periodictable/README b/graphics/pgf/contrib/pgf-periodictable/README index e3ddefda0a..31f05f7dfa 100644 --- a/graphics/pgf/contrib/pgf-periodictable/README +++ b/graphics/pgf/contrib/pgf-periodictable/README @@ -1,25 +1,39 @@ -This is pgf-PeriodicTable, version 2.0.1 (2023/05/29). +This is pgf-PeriodicTable, version 2.1.0 (2024/02/14). The purpose of this package is to provide the Periodic Table of Elements in a simple way. It relies on pgf/TikZ to offer a full or partial periodic table with a variety of options and displaying the desired data for all the 118 -elements. It can be done in six languages: English, French, German, -Portuguese (from Portugal and from Brazil), Spanish and Italian. +elements. It can be done in different languages: English, French, German, +Portuguese (from Portugal and from Brazil), Spanish, Italian and translations +by user contributions (currently Dutch). ____________________________________________________________ Just typeset \pgfPT to get a Periodic Table of Elements or \pgfPT[<options list>] to do it at your custom way. ____________________________________________________________ -** Requirements: TikZ package. +** Requirements: TikZ and fontenc (pdfLaTeX) or fontspec (XeLaTeX or LuaLaTeX) packages. ** Installation: unpack everything in a directory in the TeX search path and refresh the TeX database. ** Usage: just place \usepackage{pgf-PeriodicTable} in the preamble. ** Contact the author: Hugo Gomes (hugo.parelho@gmail.com) ** Licence: released under the LaTeX Project Public License v1.3 or later, see http://www.latex-project.org/lppl.txt - +____________________________________________________________ ____________________________________________________________ Major changes: + +*** v2.1.0 (14/02/2024) *** +New options for package loading: +- numerals (supporting Devanagari or Mandarin numerals); +- userlang (supporting a user defined language, currently only Dutch translation, provided by Wim De Borggraeve). +New commands: +- \pgfPTdvnfont (provides font selection for use with Devanagari); +- \pgfPTzhfont (provides font selection for use with Mandarin numerals); +- \pgfPTzhnumber (to enable/disable showing the atomic number, period or group number in Mandarin numerals). +Fixed wrong interaction with fontspec and babel packages: font selection schemes and \babelfont usage now work as expected. +Fixed incorrect capitalization of some elements in German. +Correction of the title in Spanish. + *** v2.0.1 (29/05/2023) *** Capitalized element names (in German) and improved German language after suggestions made by Ole Schwen diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex index bce897a17c..b9b76f64d1 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Examples.tex @@ -168,9 +168,9 @@ For the \textbf{\textit{representative elements}} (groups \textbf{1}, \textbf{2} \item identify group 2 elements of the Periodic Table.%: \hrulefill \item identify the elements of the 2\raisebox{3pt}{\scriptsize nd} period of the Periodic Table.%: \hrulefill \item identify group 17 elements of the Periodic Table.%: \hrulefill -\item identify the elements of block s.%: \hrulefill -\item identify the elements of block p.%: \hrulefill -\item identify the elements of block d.%: \hrulefill +\item identify the elements of s-block.%: \hrulefill +\item identify the elements of p-block.%: \hrulefill +\item identify the elements of d-block.%: \hrulefill \item identify the metallic elements.%: \hrulefill \item identify the non-metallic elements.%: \hrulefill \item identify the transition metals.%: \hrulefill @@ -189,9 +189,9 @@ For the \textbf{\textit{representative elements}} (groups \textbf{1}, \textbf{2} \blue{\textit{For the source of this example please see the file} pgf-PeriodicTableManual\_Examples.tex} \vfill% \newpage -\def\xbox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,font=\Large,draw,thick,rounded corners=.5pt,inner sep=0pt] (x) {\vbox to 15pt{\vfil\color{gray}x\vfil}};}}% -\def\obox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,draw,thick,rounded corners=.5pt,inner sep=0pt] (x) {\vbox to 15pt{\vfil\color{gray}$\bigcirc$\vfil}};}}% -\def\dbox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,font=\Large,draw,thick,rounded corners=.5pt,inner sep=0pt] (x) {\vbox to 15pt{\vfil\color{gray}$\Delta$\vfil}};}}% +\def\xbox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,font=\Large,draw,thick,rounded corners=.5pt,inner sep=0pt,fill=white] (x) {\vbox to 15pt{\vfil\color{gray}x\vfil}};}}% +\def\obox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,draw,thick,rounded corners=.5pt,inner sep=0pt,fill=white] (x) {\vbox to 15pt{\vfil\color{gray}$\bigcirc$\vfil}};}}% +\def\dbox{\tikz[baseline=(x.base)]{\node[text width=15pt,text centered,font=\Large,draw,thick,rounded corners=.5pt,inner sep=0pt,fill=white] (x) {\vbox to 15pt{\vfil\color{gray}$\Delta$\vfil}};}}% \mymfbox{% \textbf{\underline{EXERCISE}:} \\ [3pt]Using the following notation, diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex index 74526e352d..3d1f256bd6 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_Z.tex @@ -1,4 +1,4 @@ -\subsubsection{\texorpdfstring{\ding{224} The atomic number}{The atomic number}}\vspace{6pt}% +\subsubsection{\texorpdfstring{\ding{224} The atomic number}{The atomic number}}%\vspace{6pt}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Z backcolor \pgfPTMoption{4}{Z backcolor}{black}{% diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex index dde2c854d7..9e1ba55405 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_commands.tex @@ -189,7 +189,7 @@ Writing a color scheme can be painstaking work, so a \textit{script} is provided \subsection*{}{\normalfont\large\bfseries\raisebox{1.25pt}{$\mathbf{\blacktriangleright}$}\ Utilization of \tmpSection}% \index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTsetLanguage}% \label{command:pgfPTsetLanguage}\addcontentsline{toc}{subsection}{\texorpdfstring{\tmpSection{}}{\textbackslash pgfPTsetLanguage}}% -\\ [4pt]This command globally changes the default language of the Periodic Table. +\\ [4pt]This command globally changes the default language of the Periodic Table. If a user language has been loaded, the corresponding ISO 639-1 code can also be used as a \red{language flag}. \\ [10pt]\pgfPTMsetLanguage{pt}% \pgfPTsetLanguage{pt}% \\ [-4pt]\pgfPTMmacrobox{pgfPT}[]% @@ -199,4 +199,11 @@ Writing a color scheme can be painstaking work, so a \textit{script} is provided \\ [-4pt]\pgfPTMmacrobox{pgfPT}[]% \\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[]}}% \\ [5pt]\pgfPTMline% +\newpage +\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] % +{\small\textcolor{black!50}{\%\ \string\usepackage[userlang=nl]\{pgf-PeriodicTable\}}};}% +\\ [-4pt]\pgfPTMsetLanguage{nl}% +\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPT_nl.pdf}}}% +\\ [5pt]\pgfPTMline% \endinput diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex index 06203b75dd..2a33c0371e 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_density.tex @@ -1,4 +1,4 @@ -\subsubsection{\texorpdfstring{\ding{224} The density}{The density}}\vspace{6pt}% +\subsubsection{\texorpdfstring{\ding{224} The density}{The density}}%\vspace{6pt}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % d color \pgfPTMoption{4}{d color}{black}{% diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex index fc69c471e4..320b2d042c 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_eDist.tex @@ -2,6 +2,7 @@ \subsubsection{\texorpdfstring{\ding{224} \itshape The electron distribution}{The electron distribution}}\vspace{6pt}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % eDist color +\pgfPTresetstyle\pgfPTresetcell% \pgfPTMbuildcellstyle{electron}(6,3)% [(1;1-2;Z),(1;3;radio),(2-3;1.5-3.5;CS),(4;1-3;name), % (5;1-3;eDist),(6;1-3;eConfignl)]% @@ -32,7 +33,8 @@ Sets the separator character between energy levels in electron distribution. \te }% \\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=electron,eDist sep=-]% \\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},cell style=electron,eDist sep=-]}}% -\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=electron,eDist sep={,}]% +\newpage%\\ [10pt] +\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=electron,eDist sep={,}]% \\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},cell style=electron,eDist sep={,}]}}% \\ [0pt]\pgfPTendoption% \endinput diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex index ffa5841e22..2eb989abae 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_exerciselayout.tex @@ -29,7 +29,7 @@ The \red{keys} described in this section enable the \textit{exercise layout} of \\ [5pt]\pgfPTendoption% \vfill% % only cells with periods and group numbers=false -\pgfPTMoption{4}{only cells with periods and group numbers\ \ \ }{false}% +\pgfPTMoption{4}{only cells with periods and group numbers}{false}% {When set to \red{true} the Periodic Table is drawn with only the cells without any contents. The period and group numbers are shown. \\ [10pt]\tikz{\node[text width=\linewidth-.6666em,fill=orange!5!white,draw=orange,rounded corners=2pt] {\textbf{\orange{NOTE}}: \\ The following \red{keys} are also set: \red{back color scheme=solid, show title=false, show legend=false, show MNM line=false}};} diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex index 4c07b00d7a..6658536639 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_generallayout.tex @@ -1,4 +1,4 @@ -\subsubsection{\texorpdfstring{\ding{224} General layout}{General layout}}\vspace{6pt}% +\subsubsection{\texorpdfstring{\ding{224} General layout}{General layout}}%\vspace{6pt}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Z list \label{option_Z list}% @@ -24,7 +24,7 @@ The possible \lblue{name} is one of the following: any \textbf{user defined} name via \pgfPTMmacro{pgfPTnewZlist}[]\{name\}\{list\} \end{itembar}% }% -\\ [-5pt]\pgfPTendoption% +\\ [-10pt]\pgfPTendoption% \newpage\vspace{-34pt}\ % % cell width \label{option_cell width}% @@ -82,14 +82,18 @@ any \textbf{user defined} name via \pgfPTMmacro{pgfPTnewZlist}[]\{name\}\{list\} \\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell={w=40pt,h=50pt,lw=.6pt,lc=blue}]}}% \\ [5pt]\pgfPTendstyle% % font +\vfill% \label{option_font}% -\pgfPTMoption{4}{font}{phv}% -{Sets the font family, via the proper \textit{\textrm{\LaTeX} font name}, to use in the Periodic Table. The \textit{default} font is \textit{phv}, \ie, the Helvetica font. -The value of the \red{font} key can be any \textit{\textrm{\LaTeX} font name} known to the local \textrm{\LaTeX} installation. -\\ \hfill\scriptsize See \textit{\textrm{\LaTeX} font names} below for further details.}% +\pgfPTMoption[\pgfPTchangedinversion{2.1.0}]{4}{font}{phv (\textrm{pdf\LaTeX}); TeX Gyre Heros (\textrm{Xe\LaTeX} or \textrm{Lua\LaTeX})}% +{Sets the font family, via the proper \textit{\textrm{\LaTeX} font name}, to use in the Periodic Table. +\\ [2pt]When \textrm{pdf\LaTeX} is used to typeset the Periodic Table the \textit{default} font is \textit{phv}, \ie, the Helvetica font. In this case the value of the \red{font} key can be any \textit{\textrm{\LaTeX} font name} known to the local \textrm{\LaTeX} installation. +\\ [2pt]When \textrm{Xe\LaTeX} or \textrm{Lua\LaTeX} are used to typeset the Periodic Table the \textit{default} font is \textit{TeX Gyre Heros}, a closest alternative to Helvetica font. In this case the value of the \red{font} key can be any \textit{font name known to your Operating System} and with \textrm{Lua\LaTeX} it can also be any \textit{font name available in your \textrm{TEXMF} tree}. +\\ \hfill\scriptsize See \textit{\textrm{\LaTeX} font names} below or the \href{https://ftp.eq.uc.pt/software/TeX/macros/unicodetex/latex/fontspec/fontspec.pdf\#page=9}{fontspec documentation} for further details.\normalsize\\ \ }% +\\ [10pt]Examples with \textrm{pdf\LaTeX}: \\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=ptm]% \\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},font=ptm]}}% -\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=RobotoSlab-TLF]% +\newpage% +\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=RobotoSlab-TLF]% \\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},font=RobotoSlab-TLF]}}% \\ [10pt]\pgfPTMoptiontxt{% \textit{\textrm{\LaTeX} font names}: @@ -137,14 +141,22 @@ The value of the \red{font} key can be any \textit{\textrm{\LaTeX} font name} kn \makebox[\linewidth][c]{For more information about fonts visit the \href{https://tug.org/FontCatalogue/}{TUG Font Catalogue}} \\ \ % }% +\\ [10pt]Examples with \textrm{Xe\LaTeX} or \textrm{Lua\LaTeX}: +\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=Verdana,CS font=\string\fontspec{Mistral}\string\selectfont]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTfontLuaXeLaTeX1.pdf}}}% +\newpage +\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},font=Arial,CS font=\string\fontspec{LCALLIG.TTF}\string\selectfont]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTfontLuaXeLaTeX2.pdf}}}% \\ [5pt]\pgfPTendoption% % back color scheme \label{option_back color scheme}% +\vfill \pgfPTMoption{4}{back color scheme}{default}% {Sets a \blue{named} back color scheme for the Periodic Table.}% \\ [5pt]\pgfPTMmacrobox{pgfPT}[back color scheme=Soft]% \\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[back color scheme=Soft]}}% -\\ [10pt]\pgfPTMoptiontxt{% +\newpage% +\pgfPTMoptiontxt{% The possible \lblue{name} is one of the following: \begin{itembar} \item\textbf{built-in}: @@ -249,27 +261,30 @@ elements in molecular models. The scheme is named after the CPK molecular models % languages \vfill \label{option_languages}% -\pgfPTMoption{4}{languages}{\{\}}% -{Sets a language list to use in the Periodic Table. It is a comma separated list of language flags: \sq{pt}, \sq{en}, \sq{fr}, \sq{de}, \sq{it}, \sq{es} or \sq{br}. -\textit{This key overrides the default language, that is, the language loaded at package inclusion}.}% -\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},languages=pt]% -\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},languages=pt]}}% -\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=pgfPT2lang,languages={en,fr}]% -\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},cell style=pgfPT2lang,languages={en,fr}]}}% +\pgfPTMoption[\pgfPTchangedinversion{2.1.0}]{4}{languages}{\{\}}% +{Sets a language list to use in the Periodic Table. It is a comma separated list of language flags: \sq{pt}, \sq{en}, \sq{fr}, \sq{de}, \sq{it}, \sq{es} or \sq{br}. If a user language has been loaded, the corresponding ISO 639-1 code can also be used as a language flag. \textit{This key overrides the default language, that is, the language loaded at package inclusion}.\\ \ }% +\\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},languages=pt]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},languages=pt]}}% +\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPT2lang,languages={en,fr}]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPT2lang,languages={en,fr}]}}% \newpage%\\ [10pt] -\pgfPTMmacrobox{pgfPT}[Z list={1,...,54},cell style=pgfPT3lang,languages={pt,fr,it}]% -\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,54},cell style=pgfPT3lang,languages={pt,fr,it}]}}% +\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] % +{\small\textcolor{black!50}{\%\ \string\usepackage[userlang=nl]\{pgf-PeriodicTable\}}};}% +\\ [-4pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPT2lang,languages={nl,en}]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPT_nl_en.pdf}}}% +\\ [10pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},cell style=pgfPT3lang,languages={pt,fr,it}]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},cell style=pgfPT3lang,languages={pt,fr,it}]}}% \\ [10pt]\pgfPTMoptiontxt{% When using a set of languages, space to accommodate the names in each cell must be provided by building a suitable cell - typically one cell row per language. The cell styles used in the two examples above are built-in and serve this purpose. -\vspace{5pt}% +\vspace{2.5pt}% \begin{itembar} -\item\pgfPTpreviewcellstyle[2]{pgfPT2lang}\item\pgfPTpreviewcellstyle[2]{pgfPT3lang} +\item\pgfPTpreviewcellstyle[1.5]{pgfPT2lang}\vspace{-10pt}\item\pgfPTpreviewcellstyle[1.5]{pgfPT3lang} \end{itembar} -\vspace{5pt}% +\vspace{2.5pt}% Also, the space for the title should be taken into account -- if using more then three languages, the legend must be \textit{turned off}, otherwise the title overlaps the legend. }% -\\ [-5pt]\pgfPTendoption% -\vfill% +\\ [-10pt]\pgfPTendoption% +%\newpage%\vfill% % other languages font \label{option_other languages font}% \pgfPTMoption{4}{other languages font}{\string\tiny}% diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex index 14c47b57f9..78f8178826 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_name.tex @@ -11,7 +11,7 @@ Sets the color of the element name. \\ [5pt]\makebox[\linewidth][c]{\scalebox{.6}{\pgfPT[Z list={1,...,36},name color=red]}}% \\ [0pt]\pgfPTendoption% % name font -\pgfPTMoption{4}{name font}{\string\fontseries{l}\string\selectfont\string\tiny}{% +\pgfPTMoption{4}{name font}{\string\fontseries\{l\}\string\selectfont\string\tiny}{% Sets the font of the element name. } \\ [5pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36},name font=\string\itshape\string\tiny]% diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex index fa8b95b530..59e27e553e 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgf-PeriodicTableManual_periodgroup.tex @@ -1,5 +1,5 @@ %\vfill\vfill% -\subsubsection{\texorpdfstring{\ding{224} Periods and Groups}{Periods and Groups}}\vspace{6pt}% +\subsubsection{\texorpdfstring{\ding{224} Periods and Groups}{Periods and Groups}}%\vspace{6pt}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % show period numbers \label{option_show period numbers}% diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf Binary files differnew file mode 100644 index 0000000000..9e380d0dee --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf Binary files differnew file mode 100644 index 0000000000..2eaef9dec3 --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPT_nl_en.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf Binary files differnew file mode 100644 index 0000000000..b8868d5814 --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX1.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf Binary files differnew file mode 100644 index 0000000000..c67788f884 --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTfontLuaXeLaTeX2.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf Binary files differnew file mode 100644 index 0000000000..352e48008c --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTgithub-mark.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex index a62db8b8da..4d672d4b20 100644 --- a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTmanual.macros.tex @@ -1,10 +1,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Definitions for pgf-PeriodicTable Manual +% Hugo Gomes @ 14/02/2024 v2.1.0 % Hugo Gomes @ 29/05/2023 v2.0.1 % Hugo Gomes @ 20/02/2023 v2.0.0 % Hugo Gomes @ 08/11/2022 v1.0.1 % Hugo Gomes @ 10/10/2022 v1.0.0 -\def\pgfPTversion{2.0.1}% +\def\pgfPTversion{2.1.0}% \def\pgfPTnewinversion#1{new in v#1}% \def\pgfPTchangedinversion#1{changed in v#1}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -230,7 +231,7 @@ pdfproducer = {pdfeTeX-1.\the\pdftexversion\pdftexrevision}, % \pgfPTMbuildcellstyle{name}(lines,columns)[entries] \def\pgfPTMbuildcellstyle#1(#2,#3)[#4]{\ignorespaces% \tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] % -{\textcolor{blue!50!black}{\textbackslash pgfPTbuilcellstyle\{}\textcolor{red!50!black}{#1}\textcolor{blue!50!black}{\}}% +{\textcolor{blue!50!black}{\textbackslash pgfPTbuildcellstyle\{}\textcolor{red!50!black}{#1}\textcolor{blue!50!black}{\}}% \textcolor{blue!50!black}{(}\textcolor{red!50!black}{#2,#3}\textcolor{blue!50!black}{)}% \textcolor{black!50}{\% #2\ rows by #3 columns}\\ \textcolor{blue!50!black}{[}% \textcolor{red!50!black}{\detokenize\expandafter{#4}}\textcolor{blue!50!black}{]}};}% diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf Binary files differnew file mode 100644 index 0000000000..e233c94a31 --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumDeva.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf Binary files differnew file mode 100644 index 0000000000..6489e39532 --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand1.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf Binary files differnew file mode 100644 index 0000000000..370116c4e6 --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/manualfiles/pgfPTnumMand2.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty index 1553ecc910..39da6e976c 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty +++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTable.sty @@ -1,18 +1,52 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Hugo Gomes @ 14/02/2024 v2.1.0 % Hugo Gomes @ 29/05/2023 v2.0.1 % Hugo Gomes @ 20/02/2023 v2.0.0 % Hugo Gomes @ 08/11/2022 v1.0.1 % Hugo Gomes @ 10/10/2022 v1.0.0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \NeedsTeXFormat{LaTeX2e}% -\ProvidesPackage{pgf-PeriodicTable}[29/05/2023 pgf-PeriodicTable v2.0.1]%% +\ProvidesPackage{pgf-PeriodicTable}[14/02/2024 pgf-PeriodicTable v2.1.0]%% \RequirePackage{tikz}% \usetikzlibrary{fadings}% \tikzfading[name=aumentax, left color=transparent!80, right color=transparent!1]% \tikzfading[name=diminuix, left color=transparent!1, right color=transparent!80]% \tikzfading[name=aumentay, top color=transparent!80, bottom color=transparent!1]% \tikzfading[name=diminuiy, bottom color=transparent!80, top color=transparent!1]% -\RequirePackage[T1]{fontenc}% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% check the engine and load font packages +\ifx\pdfliteral\undefined\relax% XeLaTeX or LuaLaTeX +\RequirePackage{fontspec}[2020/02/03]\edef\pgfPT@fontspec{1}% +\else% pdfLaTeX +\RequirePackage[T1]{fontenc}\edef\pgfPT@fontspec{0}% +\fi% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% ifs to user language and list of user translations available +\newif\ifpgfPT@user@lang\pgfPT@user@langfalse% +\newif\ifpgfPT@user@lang@isvalid\pgfPT@user@lang@isvalidfalse% +% ISO code language list -------------------------------------> +\def\pggPT@userlanguage@ISOcode@list{nl/Nederlands}% +% ---------------------------------------------------------------- +\def\pggPT@userlanguage@ISOcode@check#1{% +\edef\pgfPT@tmpISOcode{#1}% +\def\pggPT@userlanguage@ISOcode@validate##1/##2\relax{\edef\pggPT@userlanguage@ISOcode@curr{##1}\edef\pggPT@userlanguage@ISOcode@currName{##2}}% +\@for\@pgfPT@tmp:=\pggPT@userlanguage@ISOcode@list\do{\expandafter\pggPT@userlanguage@ISOcode@validate\@pgfPT@tmp\relax% +\ifx\pggPT@userlanguage@ISOcode@curr\pgfPT@tmpISOcode\relax\global\pgfPT@user@lang@isvalidtrue% +\edef\pggPT@userlanguage@ISOcode{\pggPT@userlanguage@ISOcode@curr}% +\edef\pggPT@userlanguage@ISOcode@Name{\pggPT@userlanguage@ISOcode@currName}\fi% +}% END \@for +}% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% ifs to typeset with \zhnumber +\newif\ifpgfPT@zhnumbers@Z\pgfPT@zhnumbers@Zfalse% +\newif\ifpgfPT@zhnumbers@per\pgfPT@zhnumbers@perfalse% +\newif\ifpgfPT@zhnumbers@gr\pgfPT@zhnumbers@grfalse% +% macro to set the zhnumber ifs to true or false +% \pgfPTzhnumber[true|false]{what list} -> default [true] +\def\pgfPTzhnumber{\@ifnextchar[{\@pgfPT@zhnumber}{\@pgfPT@zhnumber[true]}}% +\def\@pgfPT@zhnumber[#1]#2{% +\@for\@pgfPT@tmp:=#2\do{\csname pgfPT@zhnumbers@\@pgfPT@tmp#1\endcsname}% +}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \DeclareOption{pt}{\def\pgfPT@defaultLanguage{pt}}% \DeclareOption{en}{\def\pgfPT@defaultLanguage{en}}% @@ -21,8 +55,75 @@ \DeclareOption{it}{\def\pgfPT@defaultLanguage{it}}% \DeclareOption{es}{\def\pgfPT@defaultLanguage{es}}% \DeclareOption{br}{\def\pgfPT@defaultLanguage{br}}% +\DeclareOption{dvnnumerals}{% +\ifnum\pgfPT@fontspec=0\relax% +\def\pgfPT@dvn@wrn{\PackageError{pgfPT}{package option 'numerals=dvn' (Devanagari Numerals) requires 'fontspec' package with XeLaTeX engine...}}% +\else\ifx\pdfextension\undefined\relax% XeLaTeX% +\newfontfamily\pgfPTdvn[Mapping=devanagarinumerals]{Eczar}% +\def\pgfPTdvnfont{\@ifnextchar[{\@pgfPTdvnfont}{\@pgfPTdvnfont[]}}% +\def\@pgfPTdvnfont[#1]#2{\renewfontfamily\pgfPTdvn[Mapping=devanagarinumerals,#1]{#2}}% +\let\pgfPTnumberfont\pgfPTdvn\let\pgfPT@printnum\relax% +\else\def\pgfPT@dvn@wrn{\PackageError{pgfPT}{package option 'numerals=dvn' (Devanagari Numerals) requires XeLaTeX engine...}}% +\fi\fi% +}% +\DeclareOption{zhnumerals}{% +\ifnum\pgfPT@fontspec=0\relax% +\def\pgfPT@zh@wrn{\PackageError{pgfPT}{package option 'numerals=zh' (Mandarin Numerals) requires 'fontspec' package with XeLaTeX or LuaLaTeX engines...}}% +\else\def\pgfPT@zhnumerals{}\fi}% +\DeclareOption*{% +\edef\pgfPT@processOption@equal{=}\edef\pgfPT@processOption@STOP{}% +\def\pgfPT@processOption#1#2\relax{\edef\pgfPT@processOption@curchar{#1}\edef\pgfPT@processOption@remain{#2}% +\def\pgfPT@getOption##1=##2\relax{% +% option numerals=<dvn|zh> +\edef\pgfPT@tmpOptionA{##1}\edef\pgfPT@tmpOptionB{numerals}\ifx\pgfPT@tmpOptionA\pgfPT@tmpOptionB% +\edef\pgfPT@tmpOptionA{##2}\edef\pgfPT@tmpOptionB{zh}\ifx\pgfPT@tmpOptionA\pgfPT@tmpOptionB\ExecuteOptions{zhnumerals}\else% +\edef\pgfPT@tmpOptionA{##2}\edef\pgfPT@tmpOptionB{dvn}\ifx\pgfPT@tmpOptionA\pgfPT@tmpOptionB\ExecuteOptions{dvnnumerals}\else% +\@latex@error{Unknown value '\pgfPT@tmpOptionA' for option 'numerals' passed to '\@currname'}% +{The option '\CurrentOption' was not declared in \@cls@pkg\space'\@currname', perhaps you\MessageBreak misspelled its name. Try typing \space <return>\space to proceed.}% +\fi\fi% END option numerals +% option userlang=<language ISO code> +\else\edef\pgfPT@tmpOptionB{userlang}\ifx\pgfPT@tmpOptionA\pgfPT@tmpOptionB% +\pggPT@userlanguage@ISOcode@check{##2}% +\ifpgfPT@user@lang@isvalid% +\message{Loading \pggPT@userlanguage@ISOcode@Name\space language data...}% +\pgfPT@user@langtrue\def\pgfPT@defaultLanguage{user}% +\else% +\@latex@error{Unknown language ISO code '\pgfPT@tmpISOcode' for \@cls@pkg\space`\@currname'}% +{The language ISO code '\pgfPT@tmpISOcode' was not declared in \@cls@pkg\space'\@currname', perhaps you\MessageBreak misspelled its name. Try typing \space <return>\space to proceed.}% +\fi% \ifpgfPT@user@lang@isvalid% +\else% +\@latex@error{Unknown option '\pgfPT@tmpOptionA' for \@cls@pkg\space`\@currname'}% +{The option '\CurrentOption' was not declared in \@cls@pkg\space'\@currname', perhaps you\MessageBreak misspelled its name. Try typing \space <return>\space to proceed with the default language (en).}% +\fi\fi% % END option userlang +}% END \pgfPT@getOption +\ifx\pgfPT@processOption@curchar\pgfPT@processOption@equal\relax% +\expandafter\pgfPT@getOption\CurrentOption\relax% +\else\ifx\pgfPT@processOption@remain\pgfPT@processOption@STOP\relax% +\else\expandafter\pgfPT@processOption#2\pgfPT@processOption@STOP\relax\fi\fi% +}% END \pgfPT@processOption +\expandafter\pgfPT@processOption\CurrentOption\pgfPT@processOption@STOP\relax% +}% END \DeclareOption* \ExecuteOptions{en}% \ProcessOptions\relax% +\ifx\pgfPT@dvn@wrn\undefined\relax\else\pgfPT@dvn@wrn\fi% +\ifx\pgfPT@zh@wrn\undefined\relax\else\pgfPT@zh@wrn\fi% +\ifx\pgfPT@zhnumerals\undefined\relax\else% +\RequirePackage{zhnumber}% +\pgfPT@zhnumbers@Ztrue\pgfPT@zhnumbers@pertrue\pgfPT@zhnumbers@grtrue% +\newfontfamily\pgfPTzhnumberfont[Script=CJK,AutoFakeBold=4]{SimSun}% +\def\pgfPTzhfont{\@ifnextchar[{\@pgfPTzhfont}{\@pgfPTzhfont[]}}% +\def\@pgfPTzhfont[#1]#2{\renewfontfamily\pgfPTzhnumberfont[Script=CJK,#1]{#2}}% +\let\pgfPTnumberfont\pgfPTzhnumberfont% +\let\pgfPT@printnum\zhnumber% +\fi% +\ifx\pgfPT@printnum\undefined\relax\let\pgfPT@printnum\relax\let\pgfPTnumberfont\relax\fi% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% process user language +\ifpgfPT@user@lang% +\input{translations/lang.\pggPT@userlanguage@ISOcode.tex}% +\else% +\input{translations/lang.undefined.tex}% +\fi% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcount\pgfPT@counta\newcount\pgfPT@countb% \newcount\pgfPT@countc\newcount\pgfPT@countd% @@ -34,6 +135,7 @@ \newdimen\pgfPT@boxwd% \newdimen\pgfPT@boxht% \newdimen\pgfPT@data@Z@natwd% +\newdimen\pgfPT@data@DiscY@natwd% \newif\ifpgfPT@temp% \newif\ifpgfPT@found% \newif\ifpgfPTis@backcolorsolid% @@ -57,6 +159,8 @@ \newsavebox\pgfPT@tmpbox% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\@pgfPT@setlayers{% +\ifx\@pgfPT@resetlayers\undefined\relax\edef\@pgfPT@resetlayers{\pgf@layerlist}\fi% +\pgfsetlayers{\@pgfPT@resetlayers}% \edef\@pgfPT@layers{pgfPTpaperlayer,pgfPTbacklayer,\pgf@layerlist}% \pgfdeclarelayer{pgfPTbacklayer}% \pgfdeclarelayer{pgfPTpaperlayer}% @@ -113,7 +217,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \@pgfPT@setlayers% \tikz[every node/.append style={inner sep=0pt,below right}]{% \pgfkeys{/pgfPerTable/.cd,#1}% -\fontfamily{\pgfPTglobalfont}\selectfont\renewcommand*\rmdefault{\pgfPTglobalfont}% +% setting the font +\ifnum\pgfPT@fontspec=1\relax% fontspec is loaded +\edef\pgfPT@defaultfont{phv}% +\ifx\pgfPTglobalfont\pgfPT@defaultfont\relax\edef\pgfPTglobalfont{TeX Gyre Heros}\fi% replacing 'phv' by 'TeX Gyre Heros' +\setmainfont{\pgfPTglobalfont}% +\ifx\NoAutoSpacing\undefined\relax\else\NoAutoSpacing\fi% XeLaTeX/LuaLaTeX -> removing extra space before ':' for babel:french +\else% fontenc is loaded (with T1 option) +\fontfamily{\pgfPTglobalfont}\selectfont\renewcommand*\rmdefault{\pgfPTglobalfont}\fi% \edef\pgfPT@doc@fsize{\f@size}% \input{pgfPT.coordinates.tex}% % loading the cell style @@ -205,13 +316,42 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \edef\pgfPT@teststra{Radio}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@processbackcolor{61}\fill[cpgfPTTMP] ([xshift={4/15*\pgfPTcellwd}]xLa) rectangle ++(\pgfPTcellwd/15,-\pgfPTcellht);\draw (xLa) -- ++(\pgfPTcellwd,0);\draw ([yshift=-\pgfPTcellht]xLa) -- ++(\pgfPTcellwd,0);\fi% \edef\pgfPT@teststra{Blocks}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@processbackcolor{58}\fill[cpgfPTTMP] ([xshift={1/15*\pgfPTcellwd}]xLa) rectangle ++(\pgfPTcellwd*14/15,-\pgfPTcellht);\draw (xLa) -- ++(\pgfPTcellwd,0);\fi% \ifpgfPT@Z - \ifpgfZuseboxwidth% - \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% - at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}57--71\hspace{\pgfPTZspace}\vfil}};% - \else% - {\pgfPTZfont\selectfont\pgfmathparse{width("57--71")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% - \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]% - at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil57--71\vfil}};}% + \ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont% + \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber% + \pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax% + \pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}}\hspace{\pgfPTZspace}\vfil}};% + \else% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}\hspace{\pgfPTZspace}\vfil}};% + \fi% + \else\let\pgfPT@printnum\relax% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at (xLa) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{57--71}\hspace{\pgfPTZspace}\vfil}};% + \fi% + }% + \else{% + \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber% + \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}% + \pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi% + \else\let\pgfPT@printnum\relax% + \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \fi% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]% + at (xLa) {% + \ifpgfPT@zhnumbers@Z% + \ifnum\@pgfPT@resizebox=1\relax% + \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}}\vfil}% + \else% + \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{57}\ --\ \pgfPT@printnum{71}\vfil}% + \fi% + \else% + \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{57--71}\vfil}% + \fi% + };}% \fi% \fi% \ifpgfPT@name\pgfPT@setlabels[\pgfPTlanguages]{La}% @@ -247,13 +387,42 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \edef\pgfPT@teststra{PS}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@processbackcolor{93}\fill[cpgfPTTMP] ([xshift={4/15*\pgfPTcellwd}]xAc) rectangle ++(\pgfPTcellwd*11/15,-\pgfPTcellht);\draw (xAc) -- ++(\pgfPTcellwd,0);\draw ([yshift=-\pgfPTcellht]xAc) -- ++(\pgfPTcellwd,0);\fi% \edef\pgfPT@teststra{Blocks}\ifx\pgfPT@teststra\pgfPT@teststrb\pgfPT@processbackcolor{90}\fill[cpgfPTTMP] ([xshift={1/15*\pgfPTcellwd}]xAc) rectangle ++(\pgfPTcellwd*14/15,-\pgfPTcellht);\draw (xAc) -- ++(\pgfPTcellwd,0);\draw ([yshift=-\pgfPTcellht]xAc) -- ++(\pgfPTcellwd,0);\fi% \ifpgfPT@Z% - \ifpgfZuseboxwidth% - \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% - at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}89--103\hspace{\pgfPTZspace}\vfil}};% - \else% - {\pgfPTZfont\selectfont\pgfmathparse{width("89--103")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% - \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]% - at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil89--103\vfil}};}% + \ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont% + \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber% + \pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax% + \pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}}\hspace{\pgfPTZspace}\vfil}};% + \else% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}\hspace{\pgfPTZspace}\vfil}};% + \fi% + \else\let\pgfPT@printnum\relax% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at (xAc) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{89--103}\hspace{\pgfPTZspace}\vfil}};% + \fi% + }% + \else{% + \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber% + \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}% + \pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi% + \else\let\pgfPT@printnum\relax% + \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \fi% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]% + at (xAc) {% + \ifpgfPT@zhnumbers@Z% + \ifnum\@pgfPT@resizebox=1\relax% + \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}}\vfil}% + \else% + \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{89}\ --\ \pgfPT@printnum{103}\vfil}% + \fi% + \else% + \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{89--103}\vfil}% + \fi% + };}% \fi% \fi% \ifpgfPT@name\pgfPT@setlabels[\pgfPTlanguages]{Ac}% @@ -293,13 +462,46 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \draw[fill=cpgfPTTMP,line width=\pgfPTcelllinewd,draw=\pgfPTcelllinecolor] (\Z) rectangle ++(\pgfPTcellwd,-\pgfPTcellht); % append the Z box \ifpgfPT@Z% - \ifpgfZuseboxwidth% - \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% - at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z) {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\Z\hspace{\pgfPTZspace}\vfil}};% + \ifpgfZuseboxwidth{\pgfPTZfont\pgfPTnumberfont% + \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber% + \pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax% + \pgfmathparse{\pgfPT@data@Z@wd-2*\pgfPTZspace-.3333em}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z) + {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{\Z}}\hspace{\pgfPTZspace}\vfil}}; + \else% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z) + {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{\Z}\hspace{\pgfPTZspace}\vfil}}; + \fi% + \else\let\pgfPT@printnum\relax% + \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,align=\pgfPTZalign,text width=\pgfPT@data@Z@wd]% + at ([xshift=.5*\pgfPT@data@Z@x,yshift=-.5*\pgfPT@data@Z@y]\Z) + {\vbox to\pgfPT@data@Z@ht{\vfil\hspace{\pgfPTZspace}\pgfPT@printnum{\Z}\hspace{\pgfPTZspace}\vfil}}; + \fi% + }% \else% - {\pgfPTZfont\pgfmathparse{width(\Z)}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + {% + \ifpgfPT@zhnumbers@Z\let\pgfPT@printnum\zhnumber% + \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \ifdim\pgfPT@data@Z@natwd>\pgfPT@data@Z@wd\relax\edef\@pgfPT@resizebox{1}% + \pgfmathparse{\pgfPT@data@Z@wd-1ex}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}\else\edef\@pgfPT@resizebox{0}\fi% + \else\let\pgfPT@printnum\relax% + \pgfPTZfont\pgfPTnumberfont\pgfmathparse{width("\pgfPT@printnum{\Z}")}\pgfmathsetlength{\pgfPT@data@Z@natwd}{\pgfmathresult}% + \fi% \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,text width=\pgfPT@data@Z@natwd,inner xsep=.5ex]% - at ([xshift=\pgfPT@data@Z@x+.5*\@pgfPT@Zxshift,yshift=-\pgfPT@data@Z@y-.5*\@pgfPT@Zyshift]\Z) {\vbox to\pgfPT@data@Z@ht{\vfil\Z\vfil}};}% + at ([xshift=\pgfPT@data@Z@x+.5*\@pgfPT@Zxshift,yshift=-\pgfPT@data@Z@y-.5*\@pgfPT@Zyshift]\Z) {% + \ifpgfPT@zhnumbers@Z% + \ifnum\@pgfPT@resizebox=1\relax% + \vbox to\pgfPT@data@Z@ht{\vfil\resizebox{\pgfPT@data@Z@natwd}{\height}{\pgfPT@printnum{\Z}}\vfil}% + \else% + \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{\Z}\vfil}% + \fi% + \else% + \vbox to\pgfPT@data@Z@ht{\vfil\pgfPT@printnum{\Z}\vfil}% + \fi% + };}% \fi% \fi% % the Chemical Symbol @@ -318,12 +520,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \@for\pgfPT@tmp:=\pgfPTlanguages\do{% \ifnum\pgfPT@counta=0\relax% \edef\pgfPT@tmp@name@defaultLanguage{\csname pgfPTdata@name@\@roman{\Z}@\pgfPT@tmp\endcsname}% - %\ifpgfPTNames\edef\pgfPT@tmp@name@defaultLanguage{\expandafter\pgfPT@namec@p\pgfPT@tmp@name@defaultLanguage\relax}\fi% v1.0.1 \ifx\pgfPTNames\pgfPT@true\relax\edef\pgfPT@tmp@name@defaultLanguage{\expandafter\pgfPT@namec@p\pgfPT@tmp@name@defaultLanguage\relax}\else% \ifx\pgfPTNames\pgfPT@TRUE\relax\edef\pgfPT@tmp@name@defaultLanguage{\pgfPT@makeUppercase\pgfPT@tmp@name@defaultLanguage\relax}\fi\fi% \else% \edef\pgfPT@tmp@n@me{\csname pgfPTdata@name@\@roman{\Z}@\pgfPT@tmp\endcsname}% - %\ifpgfPTNames\edef\pgfPT@tmp@n@me{\expandafter\pgfPT@namec@p\pgfPT@tmp@n@me\relax}\fi% v1.0.1 \ifx\pgfPTNames\pgfPT@true\relax\edef\pgfPT@tmp@n@me{\expandafter\pgfPT@namec@p\pgfPT@tmp@n@me\relax}\else% \ifx\pgfPTNames\pgfPT@TRUE\relax\edef\pgfPT@tmp@n@me{\pgfPT@makeUppercase\pgfPT@tmp@n@me\relax}\fi\fi% \edef\pgfPT@tmp@name@otherLanguages{\pgfPT@tmp@name@otherLanguages\vskip-\pgfPT@dima\hbox to % @@ -353,7 +553,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT {\vbox to \pgfPT@boxht{\vfil\vbox to \pgfPT@dimb{\vfil\pgfPT@tmp@name@otherLanguages}\vfil}};% \fi% \fi% - \fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document \fi% % the Atomic weight \ifpgfPT@Ar% @@ -797,8 +996,8 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi\fi% \fi% % DiscY -> Discover Year - \ifpgfPT@DiscY\relax% - \node[font=\pgfPTDiscYfont,text=\pgfPTDiscYcolor,text width=\pgfPT@data@DiscY@wd,text centered]% + \ifpgfPT@DiscY\relax + \node[font=\pgfPTDiscYfont,text=\pgfPTDiscYcolor,text width=\pgfPT@data@DiscY@wd,text centered]% at ([xshift=\pgfPT@data@DiscY@x,yshift=-\pgfPT@data@DiscY@y]\Z) {\vbox to\pgfPT@data@DiscY@ht{\vfil\mbox{\pgfPT@data@DiscY}\vfil}};% \fi% % spectra -> spectra @@ -849,8 +1048,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \foreach \Z in \pgfPT@@cellslist {% \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue% \ifpgfPTIUPACMMIX\edef\pgfPT@teststrb{\pgfPTcells}\edef\pgfPT@teststra{d}\ifx\pgfPT@teststra\pgfPT@teststrb\ifnum\Z>48\pgfmathparse{-1.075*\pgfPTcellwd}\edef\pgfPT@perlabel@xshift{\pgfmathresult}\fi\fi\fi% + {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi% \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at% - ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\per};\breakforeach\fi% + ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{\per}};% + }\breakforeach\fi% }% \ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi% }% @@ -878,15 +1079,15 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \advance\pgfPT@counta by 1\relax% }% \pgfPTlabLaAcfont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}% - \pgfmathparse{width("\pgfPT@tmp@label@defaultLanguage")}% + \pgfmathparse{width("\noexpand\pgfPT@tmp@label@defaultLanguage")}% \edef\pgfPT@labelboxwd{\pgfmathresult}% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \foreach \Zsearch in \pgfPT@cells@lanthanoids{% \foreach \Z in \pgfPT@@cellslist {% \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue% - \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {6};% + {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi% + \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{6}};}% \ifpgfPTLaAclabels\pgfPT@processbackcolor{57}% - %\node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt] at ([xshift=\pgfPT@perlabel@xshift]\Z)% - %{\pgfPT@labels@La};\fi% \node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt,text width=\pgfPT@labelboxwd] at ([xshift=\pgfPT@perlabel@xshift]\Z)% {\pgfPT@tmp@label@defaultLanguage\ifnum\pgfPT@counta>1\relax\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont\\ [-1pt]\pgfPT@tmp@labels@otherLanguages\fi};\fi% \breakforeach\fi% @@ -905,12 +1106,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \advance\pgfPT@counta by 1\relax% }% \pgfPTlabLaAcfont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}% - \pgfmathparse{width("\pgfPT@tmp@label@defaultLanguage")}% + \pgfmathparse{width("\noexpand\pgfPT@tmp@label@defaultLanguage")}% \edef\pgfPT@labelboxwd{\pgfmathresult}% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \foreach \Zsearch in \pgfPT@cells@La{% \foreach \Z in \pgfPT@@cellslist {% \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue% - \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {6};% + {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi% + \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{6}};}% \ifpgfPTLaAclabels\pgfPT@processbackcolor{57}% \node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt,text width=\pgfPT@labelboxwd] at ([xshift=\pgfPT@perlabel@xshift]\Z)% {\pgfPT@tmp@label@defaultLanguage\ifnum\pgfPT@counta>1\relax\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont\\ [-1pt]\pgfPT@tmp@labels@otherLanguages\fi};\fi% @@ -918,9 +1121,9 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT }% \ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi% }% - \fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% -\fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% % actinoids --> \global\pgfPTis@labeldrawnfalse% \ifpgfPTIUPACMMIX% @@ -935,12 +1138,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \advance\pgfPT@counta by 1\relax% }% \pgfPTlabLaAcfont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}% - \pgfmathparse{width("\pgfPT@tmp@label@defaultLanguage")}% + \pgfmathparse{width("\noexpand\pgfPT@tmp@label@defaultLanguage")}% \edef\pgfPT@labelboxwd{\pgfmathresult}% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \foreach \Zsearch in \pgfPT@cells@actinoids{% \foreach \Z in \pgfPT@@cellslist {% \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue% - \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {7};% + {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi% + \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{7}};}% \ifpgfPTLaAclabels\pgfPT@processbackcolor{89}% \node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt,text width=\pgfPT@labelboxwd] at ([xshift=\pgfPT@perlabel@xshift]\Z)% {\pgfPT@tmp@label@defaultLanguage\ifnum\pgfPT@counta>1\relax\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont\\ [-1pt]\pgfPT@tmp@labels@otherLanguages\fi};\fi% @@ -960,12 +1165,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \advance\pgfPT@counta by 1\relax% }% \pgfPTlabLaAcfont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}% - \pgfmathparse{width("\pgfPT@tmp@label@defaultLanguage")}% + \pgfmathparse{width("\noexpand\pgfPT@tmp@label@defaultLanguage")}% \edef\pgfPT@labelboxwd{\pgfmathresult}% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \foreach \Zsearch in \pgfPT@cells@Ac{% \foreach \Z in \pgfPT@@cellslist {% \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue% - \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {7};% + {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@per\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi% + \node[left,font=\pgfPTlabfont,text=\pgfPTlabpercolor] at ([xshift=\pgfPT@perlabel@xshift,yshift=\pgfPT@CS@yshift]\Z) {\pgfPT@printnum{7}};}% \ifpgfPTLaAclabels\pgfPT@processbackcolor{89}% \node[below left,font=\pgfPTlabLaAcfont,text=cpgfPTTMP,inner ysep=0pt,text width=\pgfPT@labelboxwd] at ([xshift=\pgfPT@perlabel@xshift]\Z)% {\pgfPT@tmp@label@defaultLanguage\ifnum\pgfPT@counta>1\relax\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont\\ [-1pt]\pgfPT@tmp@labels@otherLanguages\fi};\fi% @@ -973,9 +1180,9 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT }% \ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi% }% - \fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% -\fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % groups --> \ifpgfPTgrlabels% @@ -985,8 +1192,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \edef\pgfPT@@grlist{\csname pgfPT@cells@G\@Roman\group\endcsname}% \foreach \Zsearch in \pgfPT@@grlist{% \foreach \Z in \pgfPT@@cellslist {% - \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue\node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at% - ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\group};\breakforeach\fi% + \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue% + {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi% + \node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at% + ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{\group}};}\breakforeach\fi% }% \ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi% }% @@ -994,8 +1203,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \global\pgfPTis@labeldrawnfalse% \foreach \Zsearch in \pgfPT@cells@GIIILaAc{% \foreach \Z in \pgfPT@@cellslist {% - \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue\node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at% - ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {3};\breakforeach\fi% + \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue% + {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi% + \node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at% + ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{3}};}\breakforeach\fi% }% \ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi% }% @@ -1004,8 +1215,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \edef\pgfPT@@grlist{\csname pgfPT@cells@G\@Roman\group\endcsname}% \foreach \Zsearch in \pgfPT@@grlist{% \foreach \Z in \pgfPT@@cellslist {% - \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue\node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at% - ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\group};\breakforeach\fi% + \ifnum\Z=\Zsearch\global\pgfPTis@labeldrawntrue% + {\pgfPTlabfont\pgfPTnumberfont\ifpgfPT@zhnumbers@gr\let\pgfPT@printnum\zhnumber\else\let\pgfPT@printnum\relax\fi% + \node[above,font=\pgfPTlabfont,text=\pgfPTlabgrcolor] at% + ([xshift=\pgfPT@@xshift,yshift=\pgfPT@grlabel@yshift]\Z) {\pgfPT@printnum{\group}};}\breakforeach\fi% }% \ifpgfPTis@labeldrawn\global\pgfPTis@labeldrawnfalse\breakforeach\fi% }% @@ -1034,7 +1247,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \pgfPTtitlefont\selectfont\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}% \node[font=\pgfPTotherLangFont\fontsize{\pgfPT@dima}{\pgfPT@dima}\selectfont,text=\pgfPTotherLangColor,below,text width=18*\pgfPTcellwd,text centered,inner xsep=0pt] at ([yshift={-.075*\pgfPTcellht}]theTitle.south)% {\vbox{\pgfPT@tmp@titulo@otherLanguages}};% - \fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% \fi% % legend --> @@ -1043,14 +1256,14 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \ifpgfPTlegacro% use acronyms ############################################## \draw[fill=\pgfPTlegendbackcolor,draw=\pgfPTcelllinecolor,line width=\pgfPTcelllinewd] (0) rectangle ++(\pgfPTcellwd,-\pgfPTcellht); % append the Z box - \ifpgfPT@Z\fontfamily{\pgfPTglobalfont}\pgfPTZfont\selectfont% + \ifpgfPT@Z% \node[fill=\pgfPTZback,font=\pgfPTZfont,text=\pgfPTZcolor,below right,inner sep=1.5pt] (LZ)% at ([xshift=\pgfPT@data@Z@x,yshift=-\pgfPT@data@Z@y]0) {Z};% \fi% % the Chemical Symbol \ifpgfPT@CS% \pgfPT@extract@rgb@fill{\pgfPTlegendCScolor}% - \fontfamily{\pgfPTglobalfont}\pgfPTCSfont\selectfont% + \pgfPTCSfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.5*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.35*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{.6*\f@size}\fi\fi% @@ -1067,7 +1280,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \else\pgfmathsetlength{\pgfPT@dima}{.4*\f@size}\fi% \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax% \node[legendpins,% - text width={.7*\pgfPTcellwd+.2*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},font=\fontfamily{\pgfPTglobalfont}\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt] + text width={.7*\pgfPTcellwd+.2*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt]% at ([xshift={\pgfPT@dimc+.2*\pgfPTcellwd},yshift={.25*\pgfPT@data@CS@ht}]LCS.east)% {% \pgfPT@extract@rgb@fill{solido}\pgfPT@pinEstado{solido}% @@ -1096,9 +1309,9 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT }\fi% };% \fi\fi% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% % the Name \ifpgfPT@name% - \fontfamily{\pgfPTglobalfont}\pgfPTnamefont\selectfont% \node[font=\pgfPTnamefont,text=\pgfPTnamecolor,text width=\pgfPT@data@name@wd,align=\pgfPTnamealign,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@name@ht]% at ([xshift=\pgfPT@data@name@x,yshift=-\pgfPT@data@name@y]0)% @@ -1108,7 +1321,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \ifpgfPT@Ar% \edef\pgfPT@tmptest{\pgfPTArlabel}\edef\pgfPT@tmp@m{m}% \ifx\pgfPT@tmptest\pgfPT@tmp@m\relax\let\pgfPT@labels@Ar\pgfPT@labels@Ar@m\else\let\pgfPT@labels@Ar\pgfPT@labels@Ar@w\fi% - \fontfamily{\pgfPTglobalfont}\pgfPTArfont\selectfont% \node[font=\pgfPTArfont,text=\pgfPTArcolor,text width=\pgfPT@data@Ar@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@Ar@ht]% at ([xshift=\pgfPT@data@Ar@x,yshift=-\pgfPT@data@Ar@y]0)% @@ -1117,26 +1329,25 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \ifpgfPT@Arstar% \edef\pgfPT@tmptest{\pgfPTArlabel}\edef\pgfPT@tmp@m{m}% \ifx\pgfPT@tmptest\pgfPT@tmp@m\relax\let\pgfPT@labels@Arstar\pgfPT@labels@Arstar@m\else\let\pgfPT@labels@Arstar\pgfPT@labels@Arstar@w\fi% - \fontfamily{\pgfPTglobalfont}\pgfPTArfont\selectfont% \node[font=\pgfPTArfont,text=\pgfPTArcolor,text width=\pgfPT@data@Arstar@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@Arstar@ht]% at ([xshift=\pgfPT@data@Arstar@x,yshift=-\pgfPT@data@Arstar@y]0)% {Ar};% \fi% % radioactivity - \ifpgfPT@radio\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}% - \fontfamily{\pgfPTglobalfont}\pgfPTotherLangFont\selectfont% + \ifpgfPT@radio% + \pgfPTotherLangFont\selectfont% + \pgfmathsetlength{\pgfPT@dima}{.85*\f@size}% \node[text width=\pgfPT@data@radio@wd,text centered,inner sep=0pt,opacity=.25] (Lradio)% at ([xshift=\pgfPT@data@radio@x,yshift=-\pgfPT@data@radio@y]0) {\includegraphics[height=\pgfPT@data@radio@ht]{pgfPT_radio_symbol.pdf}}; \node[text width=\pgfPT@data@radio@wd,text centered,inner sep=0pt,font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,% text depth=0pt,minimum height=\pgfPT@data@radio@ht,text=\pgfPTlegendradiocolor]% - at ([xshift=\pgfPT@data@radio@x,yshift=-\pgfPT@data@radio@y]0) - {Ra}; + at ([xshift=\pgfPT@data@radio@x,yshift=-\pgfPT@data@radio@y]0) {Ra}; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% - % R -> Atomic Radius (Empirycal) + % R -> Atomic Radius (Empirycal) \ifpgfPT@R% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTRfont,text=\pgfPTRcolor,text width=\pgfPT@data@R@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@R@ht]% at ([xshift=\pgfPT@data@R@x,yshift=-\pgfPT@data@R@y]0)% @@ -1144,7 +1355,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % Rcov -> Covalente Radius \ifpgfPT@Rcov% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTRcovfont,text=\pgfPTRcovcolor,text width=\pgfPT@data@Rcov@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@Rcov@ht]% at ([xshift=\pgfPT@data@Rcov@x,yshift=-\pgfPT@data@Rcov@y]0)% @@ -1152,7 +1362,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % Rion -> Ionic Radius \ifpgfPT@Rion% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTRionfont,text=\pgfPTRioncolor,text width=\pgfPT@data@Rion@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@Rion@ht]% at ([xshift=\pgfPT@data@Rion@x,yshift=-\pgfPT@data@Rion@y]0)% @@ -1160,7 +1369,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % Ei -> First Ionization Energy \ifpgfPT@Ei% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTEifont,text=\pgfPTEicolor,text width=\pgfPT@data@Ei@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@Ei@ht]% at ([xshift=\pgfPT@data@Ei@x,yshift=-\pgfPT@data@Ei@y]0)% @@ -1168,7 +1376,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % eneg -> Electronegativity (Pauling) \ifpgfPT@eneg% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTenegfont,text=\pgfPTenegcolor,text width=\pgfPT@data@eneg@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@eneg@ht]% at ([xshift=\pgfPT@data@eneg@x,yshift=-\pgfPT@data@eneg@y]0)% @@ -1176,7 +1383,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % eaff -> Electroaffinity \ifpgfPT@eaff% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTeafffont,text=\pgfPTeaffcolor,text width=\pgfPT@data@eaff@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@eaff@ht]% at ([xshift=\pgfPT@data@eaff@x,yshift=-\pgfPT@data@eaff@y]0)% @@ -1184,7 +1390,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % O -> Oxidation States \ifpgfPT@O% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTOfont,text=\pgfPTOcolor,text width=\pgfPT@data@O@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@O@ht]% at ([xshift=\pgfPT@data@O@x,yshift=-\pgfPT@data@O@y]0)% @@ -1192,7 +1397,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % Tmelt -> Melting Point (Kelvin) \ifpgfPT@Tmelt% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{Tmelt}% \node[font=\pgfPTTmeltfont,text=\pgfPTTmeltcolor,text width=\pgfPT@data@Tmelt@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@Tmelt@ht]% @@ -1201,7 +1405,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % TmeltC -> Melting Point (degrees Celsius) \ifpgfPT@TmeltC% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{TmeltC}% \node[font=\pgfPTTmeltCfont,text=\pgfPTTmeltCcolor,text width=\pgfPT@data@TmeltC@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@TmeltC@ht]% @@ -1210,7 +1413,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % Tboil -> Boiling Point (Kelvin) \ifpgfPT@Tboil% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{Tboil}% \node[font=\pgfPTTboilfont,text=\pgfPTTboilcolor,text width=\pgfPT@data@Tboil@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@Tboil@ht]% @@ -1219,7 +1421,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % TboilC -> Boiling Point (degrees Celsius) \ifpgfPT@TboilC% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{TboilC}% \node[font=\pgfPTTboilCfont,text=\pgfPTTboilCcolor,text width=\pgfPT@data@TboilC@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@TboilC@ht]% @@ -1228,7 +1429,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % eDist -> Electron Distribuition \ifpgfPT@eDist% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{eDist}% \node[font=\pgfPTeDistfont,text=\pgfPTeDistcolor,text width=\pgfPT@data@eDist@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@eDist@ht]% @@ -1237,7 +1437,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % eConfign -> Electronic Configuration (increasing n) \ifpgfPT@eConfign% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{eConfign}% \node[font=\pgfPTeConfignfont,text=\pgfPTeConfigncolor,text width=\pgfPT@data@eConfign@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@eConfign@ht]% @@ -1246,7 +1445,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % eConfignl -> Electronic Configuration (increasing n+l) \ifpgfPT@eConfignl% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{eConfignl}% \node[font=\pgfPTeConfignlfont,text=\pgfPTeConfignlcolor,text width=\pgfPT@data@eConfignl@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@eConfignl@ht]% @@ -1255,7 +1453,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % d -> Density \ifpgfPT@d% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTdfont,text=\pgfPTdcolor,text width=\pgfPT@data@d@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@d@ht]% at ([xshift=\pgfPT@data@d@x,yshift=-\pgfPT@data@d@y]0)% @@ -1263,7 +1460,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % Cp -> Specific heat capacity (25C, 100kPa) \ifpgfPT@Cp% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTCpfont,text=\pgfPTCpcolor,text width=\pgfPT@data@Cp@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@Cp@ht]% at ([xshift=\pgfPT@data@Cp@x,yshift=-\pgfPT@data@Cp@y]0)% @@ -1271,7 +1467,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % kT -> Thermal Condutivity (25C) \ifpgfPT@kT% - \fontfamily{\pgfPTglobalfont}\selectfont% \node[font=\pgfPTkTfont,text=\pgfPTkTcolor,text width=\pgfPT@data@kT@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@kT@ht]% at ([xshift=\pgfPT@data@kT@x,yshift=-\pgfPT@data@kT@y]0)% @@ -1279,14 +1474,13 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % ls -> Lattice Structure \ifpgfPT@ls% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{ls}% \node[font=\pgfPTlsfont,text=\pgfPTlscolor,text width=\pgfPT@data@ls@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@ls@ht]% at ([xshift=\pgfPT@data@ls@x,yshift=-\pgfPT@data@ls@y]0)% {\pgfPT@theacro};% \ifpgfPTlegendaextra% - \fontfamily{\pgfPTglobalfont}\pgfPTlsfont\selectfont% + \pgfPTlsfont\selectfont% \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.67*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{.78*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.625*\f@size}\fi% \ifpgfPT@DiscC% insere a legenda extra para a estrutura da rede (existindo as bandeiras) @@ -1334,11 +1528,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT }% }; \fi% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% legenda extra \fi% % lsa -> Lattice constant: a \ifpgfPT@lsa% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{lsa}% \node[font=\pgfPTlsafont,text=\pgfPTlsacolor,text width=\pgfPT@data@lsa@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@lsa@ht]% @@ -1347,7 +1541,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % lsb -> Lattice constant: b \ifpgfPT@lsb% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{lsb}% \node[font=\pgfPTlsbfont,text=\pgfPTlsbcolor,text width=\pgfPT@data@lsb@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@lsb@ht]% @@ -1356,7 +1549,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % lsc -> Lattice constant: c \ifpgfPT@lsc% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{lsc}% \node[font=\pgfPTlscfont,text=\pgfPTlsccolor,text width=\pgfPT@data@lsc@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@lsc@ht]% @@ -1365,7 +1557,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % lsca -> Lattice c/a ratio: \ifpgfPT@lsca% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{lsca}% \node[font=\pgfPTlscafont,text=\pgfPTlscacolor,text width=\pgfPT@data@lsca@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@lsca@ht]% @@ -1374,7 +1565,6 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % DiscY -> Discover Year \ifpgfPT@DiscY% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{DiscY}% \node[font=\pgfPTDiscYfont,text=\pgfPTDiscYcolor,text width=\pgfPT@data@DiscY@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@DiscY@ht]% @@ -1383,14 +1573,13 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% % DiscC -> Discover Country \ifpgfPT@DiscC% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{DiscC}% \node[font=\pgfPTDiscCfont,text=\pgfPTDiscCcolor,text width=\pgfPT@data@DiscC@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@DiscC@ht]% at ([xshift=\pgfPT@data@DiscC@x,yshift=-\pgfPT@data@DiscC@y]0)% {\pgfPT@theacro};% \ifpgfPTlegendaextra% - \fontfamily{\pgfPTglobalfont}\pgfPTDiscCfont\selectfont% + \pgfPTDiscCfont\selectfont% \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.67*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}\edef\pgfPT@nodepos{below right}\edef\pgfPT@nodeat{north east}% \else\pgfmathsetlength{\pgfPT@dima}{.78*\f@size}\edef\pgfPT@nodepos{right}\edef\pgfPT@nodeat{east}\fi% \ifpgfPT@ls% insere a legenda extra para as bandeiras (existindo a estrutura da rede) @@ -1448,11 +1637,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT }% }; \fi% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% legenda extra \fi% % spectra -> spectra \ifpgfPT@spectra% - \fontfamily{\pgfPTglobalfont}\selectfont% \pgfPT@setacro[\pgfPTlanguages]{spectra}% \node[font=\pgfPTspectrafont,text=\pgfPTspectracolor,text width=\pgfPT@data@spectra@wd,text centered,inner xsep=0pt,% text depth=0pt,minimum height=\pgfPT@data@spectra@ht]% @@ -1460,11 +1649,12 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT {\pgfPT@theacro};% \fi% % acronyms description - \fontfamily{\pgfPTglobalfont}\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont% + \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.4*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.3*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\fi\fi% - \node[below right,text width={2.5*\pgfPTcellwd+.3*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},inner sep=2pt,font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,% + \node[below right,text width={2.5*\pgfPTcellwd+.3*(\pgfPT@countb-1)*\pgfPTcellwd-4pt},inner sep=2pt,% + font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,% fill=\pgfPTlegendbackcolor,line width=\pgfPTcelllinewd] (legend) % at ([yshift={-\pgfPTcellht-.3*\pgfPT@doc@fsize}]0)% {% @@ -1472,8 +1662,8 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \ifx\pgfPTlegendZcolor\@empty\relax\edef\pgfPTZcolor{\pgfPTZback}\else\edef\pgfPTZcolor{\pgfPTlegendZcolor}\fi% \@for\pgfPT@tmp:=\pgfPT@legend@content\do{% \tikz{\node[text={\csname pgfPT\pgfPT@tmp color\endcsname},text depth=0pt, - font=\fontfamily{\pgfPTglobalfont}\selectfont\csname pgfPT\pgfPT@tmp font\endcsname\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont] % - {\pgfPT@setacro[\pgfPTlanguages]{\pgfPT@tmp}\pgfPT@theacro% + font=\csname pgfPT\pgfPT@tmp font\endcsname\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont] % + {\pgfPT@setacro[\pgfPTlanguages]{\pgfPT@tmp}\pgfPT@theacro% \edef\pgfPT@test@tmp{\pgfPT@tmp}% \ifpgfPT@TboilC\ifpgfPT@Tboil\edef\pgfPT@test@TboilC{TboilC}\ifx\pgfPT@test@tmp\pgfPT@test@TboilC\hspace{.15ex}C\fi\fi\fi% \ifpgfPT@Tboil\ifpgfPT@TboilC\edef\pgfPT@test@Tboil{Tboil}\ifx\pgfPT@test@tmp\pgfPT@test@Tboil\hspace{.15ex}K\fi\fi\fi% @@ -1489,7 +1679,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \path[line width=\pgfPTcelllinewd,legendbox,rounded corners=2pt] % ([xshift=2pt,yshift=-2pt]legend.south east) rectangle ([xshift=-2pt,yshift=2pt]0);% \end{pgfonlayer} - \fontfamily{\pgfPTglobalfont}\selectfont% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \else% use full description ################################################# \pgfPT@count@note=0% \ifnum\pgfPT@countb>1\relax% @@ -1516,43 +1706,46 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \fi% \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax% \draw[fill=\pgfPTlegendbackcolor] (0) rectangle ++({\pgfPT@legendscaleX*\pgfPTcellwd},-\pgfPT@legendscaleY*\pgfPTcellht); - \ifpgfPT@Z\fontfamily{\pgfPTglobalfont}\pgfPTZfont\selectfont\pgfmathsetlength{\pgfPT@dima}{1.5*\pgfPT@loadcell@scaleX*\f@size}% + \ifpgfPT@Z\pgfPTZfont\selectfont\pgfmathsetlength{\pgfPT@dima}{1.5*\pgfPT@loadcell@scaleX*\f@size}% \node[fill=\pgfPTZback,font=\pgfPTZfont\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,text=\pgfPTZcolor,below right,inner sep=1.5pt] (LZ)% at ([xshift=\pgfPT@legendscaleX*\pgfPT@data@Z@x,yshift=-\pgfPT@legendscaleY*\pgfPT@data@Z@y]0) {Z};% - \fontfamily{\pgfPTglobalfont}\pgfPTZfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.5*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.4*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.4*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\fi\fi% \pgfPT@leglabel{Z}% \node[right,font=\pgfPTZfont\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,text=\pgfPTZback,text width=\pgfPT@data@Z@wd,inner xsep=1pt]% at (LZ.east) {\pgfPT@putleglabel{Z}};% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % the Chemical Symbol \ifpgfPT@CS\pgfPT@extract@rgb@fill{\pgfPTlegendCScolor}% - \fontfamily{\pgfPTglobalfont}\pgfPTCSfont\selectfont% + \pgfPTCSfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.5*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.35*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.5*\f@size*\pgfPT@txtscale}\fi\fi% \pgfPT@legend{CS}% \edef\pgfPT@checkf@nt{fmm}\edef\pgfPT@f@nt{\f@family}% \ifx\pgfPT@f@nt\pgfPT@checkf@nt\relax\pgfmathsetlength{\pgfPT@dima}{.65*\pgfPT@dima}\pgfmathparse{-.75*\pgfPT@dima}\edef\pgfPT@extra@shift{\pgfmathresult}\else\edef\pgfPT@extra@shift{0pt}\fi% - \node[font=\fontfamily{\pgfPTglobalfont}\selectfont\pgfPTCSfont\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,text width={\pgfPT@legendscaleX*\pgfPT@data@CS@wd},text centered,text depth=0pt] (LCS)% + \node[font=\pgfPTCSfont\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,text width={\pgfPT@legendscaleX*\pgfPT@data@CS@wd},text centered,text depth=0pt] (LCS)% at ([xshift=\pgfPT@legendscaleX*\pgfPT@data@CS@x,yshift=-\pgfPT@legendscaleY*\pgfPT@data@CS@y+\pgfPT@extra@shift]0) {\pgfPT@lt[\pgfPTCSolwd](\pgfPT@tmp@label@defaultLanguage)(\pgfPT@rs,\pgfPT@gs,\pgfPT@bs)(\pgfPT@rf,\pgfPT@gf,\pgfPT@bf)(\pgfPT@CS@txt@render)% - \ifnum\pgfPT@counta>1\relax\\ %[-.5ex]% + \ifnum\pgfPT@counta>1\relax\\ % {\fontsize{\the\pgfPT@dimb}{\the\pgfPT@dimb}\selectfont% \pgfPT@lt[\pgfPTCSolwd](\pgfPT@tmp@labels@otherLanguages)(\pgfPT@rs,\pgfPT@gs,\pgfPT@bs)(\pgfPT@rf,\pgfPT@gf,\pgfPT@bf)(\pgfPT@CS@txt@render)% }\fi}; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% % pin it... \ifpgfPTlegendapins% \pgfmathsetlength{\pgfPT@dimc}{\pgfPT@data@CS@x+\pgfPT@data@CS@wd}% \ifdim\pgfPT@dimc<\pgfPTcellwd\pgfmathsetlength{\pgfPT@dimc}{\pgfPTcellwd-\pgfPT@dimc}\else\pgfmathsetlength{\pgfPT@dimc}{0pt}\fi% \draw[fill=black!30,line width=.05pt,draw=black!50] (LCS.east) circle(.05*\pgfPTcellwd) ++(.05*\pgfPTcellwd,0) -- ++(\pgfPT@dimc+.35*\pgfPTcellwd,0); - \pgfPTCSfont\selectfont\ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size} + \pgfPTCSfont\selectfont% + \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.3*\f@size} \else\pgfmathsetlength{\pgfPT@dima}{.45*\f@size}\fi% - \fontfamily{\pgfPTglobalfont}\fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% + \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax% \node[legendpins,% - text width={.7*\pgfPT@legendscale*\pgfPTcellwd-4pt},font=\fontfamily{\pgfPTglobalfont}\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt] + text width={.7*\pgfPT@legendscale*\pgfPTcellwd-4pt},font=\fontsize{\the\pgfPT@dima}{\the\pgfPT@dima}\selectfont,inner xsep=2pt,inner ysep=1pt] at ([xshift={\pgfPT@legendscaleX*\pgfPT@dimc+.2*\pgfPTcellwd},yshift={.25*\pgfPT@data@CS@ht}]LCS.east)% {% \pgfPT@extract@rgb@fill{solido}\pgfPT@pinEstado{solido}% @@ -1581,9 +1774,10 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT }\fi% };% \fi\fi% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% % the Name \ifpgfPT@name% - \fontfamily{\pgfPTglobalfont}\pgfPTnamefont\selectfont% + \pgfPTnamefont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1594,12 +1788,13 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT {% \pgfPT@putleglabel{name}% };% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % the Atomic weight \ifpgfPT@Ar% \edef\pgfPT@tmptest{\pgfPTArlabel}\edef\pgfPT@tmp@m{m}% \ifx\pgfPT@tmptest\pgfPT@tmp@m\relax\let\pgfPT@labels@Ar\pgfPT@labels@Ar@m\else\let\pgfPT@labels@Ar\pgfPT@labels@Ar@w\fi% - \fontfamily{\pgfPTglobalfont}\pgfPTArfont\selectfont% + \pgfPTArfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1610,11 +1805,12 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT {% \pgfPT@putleglabel{Ar}% };% + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% \ifpgfPT@Arstar% \edef\pgfPT@tmptest{\pgfPTArlabel}\edef\pgfPT@tmp@m{m}% \ifx\pgfPT@tmptest\pgfPT@tmp@m\relax\let\pgfPT@labels@Arstar\pgfPT@labels@Arstar@m\else\let\pgfPT@labels@Arstar\pgfPT@labels@Arstar@w\fi% - \fontfamily{\pgfPTglobalfont}\pgfPTArfont\selectfont% + \pgfPTArfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1625,6 +1821,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{Arstar}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % radioactivity \ifpgfPT@radio% @@ -1634,7 +1831,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT {\includegraphics[height=\pgfPT@dima]{pgfPT_radio_symbol.pdf}}; % pin it... \ifpgfPTlegendapins% - \fontfamily{\pgfPTglobalfont}\pgfPTotherLangFont\selectfont% + \pgfPTotherLangFont\selectfont% \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.65*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.45*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\fi% \fontsize{\pgfPT@doc@fsize}{\pgfPT@doc@fsize}\selectfont\relax% @@ -1650,11 +1847,12 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \ifnum\pgfPT@counta>1\relax\\ [-.25ex]{\fontsize{\the\pgfPT@dimb}{\the\pgfPT@dimb}\selectfont\color{\pgfPTotherLangColor}% \pgfPT@tmp@labels@otherLanguages}\fi% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% \fi% % R -> Atomic Radius (Empirycal) \ifpgfPT@R% - \fontfamily{\pgfPTglobalfont}\pgfPTRfont\selectfont% + \pgfPTRfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1665,10 +1863,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{R}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % Rcov -> Covalente Radius \ifpgfPT@Rcov% - \fontfamily{\pgfPTglobalfont}\pgfPTRcovfont\selectfont% + \pgfPTRcovfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1679,10 +1878,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@pm]{Rcov}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % Rion -> Ionic Radius \ifpgfPT@Rion% - \fontfamily{\pgfPTglobalfont}\pgfPTRionfont\selectfont% + \pgfPTRionfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1693,10 +1893,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@pm]{Rion}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % Ei -> First Ionization Energy \ifpgfPT@Ei% - \fontfamily{\pgfPTglobalfont}\pgfPTEifont\selectfont% + \pgfPTEifont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1707,10 +1908,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@kJmol]{Ei}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % eneg -> Electronegativity (Pauling) \ifpgfPT@eneg% - \fontfamily{\pgfPTglobalfont}\pgfPTenegfont\selectfont% + \pgfPTenegfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1721,10 +1923,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{eneg}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % eaff -> Electroaffinity \ifpgfPT@eaff% - \fontfamily{\pgfPTglobalfont}\pgfPTeafffont\selectfont% + \pgfPTeafffont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1735,10 +1938,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@kJmol]{eaff}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % O -> Oxidation States \ifpgfPT@O% - \fontfamily{\pgfPTglobalfont}\pgfPTOfont\selectfont% + \pgfPTOfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1749,10 +1953,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{O}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % Tmelt -> Melting Point (Kelvin) \ifpgfPT@Tmelt% - \fontfamily{\pgfPTglobalfont}\pgfPTTmeltfont\selectfont% + \pgfPTTmeltfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1763,10 +1968,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@kelvin]{Tmelt}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % TmeltC -> Melting Point (degrees Celsius) \ifpgfPT@TmeltC% - \fontfamily{\pgfPTglobalfont}\pgfPTTmeltCfont\selectfont% + \pgfPTTmeltCfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1777,10 +1983,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@degC]{TmeltC}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % Tboil -> Boiling Point (Kelvin) \ifpgfPT@Tboil% - \fontfamily{\pgfPTglobalfont}\pgfPTTboilfont\selectfont% + \pgfPTTboilfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1791,10 +1998,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@kelvin]{Tboil}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % TboilC -> Boiling Point (degrees Celsius) \ifpgfPT@TboilC% - \fontfamily{\pgfPTglobalfont}\pgfPTTboilCfont\selectfont% + \pgfPTTboilCfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1805,10 +2013,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@degC]{TboilC}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % eDist -> Electron Distribuition \ifpgfPT@eDist% - \fontfamily{\pgfPTglobalfont}\pgfPTeDistfont\selectfont% + \pgfPTeDistfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1819,10 +2028,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{eDist}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % eConfign -> Electronic Configuration (increasing n) \ifpgfPT@eConfign% - \fontfamily{\pgfPTglobalfont}\pgfPTeConfignfont\selectfont% + \pgfPTeConfignfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1833,10 +2043,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{eConfign}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % eConfignl -> Electronic Configuration (increasing n+l) \ifpgfPT@eConfignl% - \fontfamily{\pgfPTglobalfont}\pgfPTeConfignlfont\selectfont% + \pgfPTeConfignlfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1847,10 +2058,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{eConfignl}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % d -> Density \ifpgfPT@d% - \fontfamily{\pgfPTglobalfont}\pgfPTdfont\selectfont% + \pgfPTdfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1861,10 +2073,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@d]{d}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % Cp -> Specific heat capacity (25C, 100kPa) \ifpgfPT@Cp% - \fontfamily{\pgfPTglobalfont}\pgfPTCpfont\selectfont\advance\pgfPT@count@note by1\relax% + \pgfPTCpfont\selectfont\advance\pgfPT@count@note by1\relax% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1875,10 +2088,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@Cp]{Cp}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % kT -> Thermal Condutivity (25C) \ifpgfPT@kT% - \fontfamily{\pgfPTglobalfont}\pgfPTkTfont\selectfont\advance\pgfPT@count@note by1\relax% + \pgfPTkTfont\selectfont\advance\pgfPT@count@note by1\relax% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -1889,11 +2103,12 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@kT]{kT}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % NOTES for Cp & kT: \ifnum\pgfPT@count@note=1\relax% \ifpgfPT@Cp% - \fontfamily{\pgfPTglobalfont}\pgfPTCpfont\selectfont% + \pgfPTCpfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\fi\fi% @@ -1995,10 +2210,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT @ 25\raisebox{.777ex}{\fontsize{\pgfPT@dimc}{\pgfPT@dimc}\selectfont o}C,100\hspace{.1ex}kPa};% \fi\fi% \fi\fi% \else\ifnum\pgfPT@count@note=2 + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% % END OF NOTES for Cp & kT <------- % ls -> Lattice Structure \ifpgfPT@ls% - \fontfamily{\pgfPTglobalfont}\pgfPTlsfont\selectfont% + \pgfPTlsfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.5*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.3*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.2*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\fi\fi% @@ -2059,10 +2275,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT }; \fi% \fi% legenda extra + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % lsa -> Lattice constant: a \ifpgfPT@lsa% - \fontfamily{\pgfPTglobalfont}\pgfPTlsafont\selectfont% + \pgfPTlsafont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -2073,10 +2290,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@ls]{lsa}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % lsb -> Lattice constant: b \ifpgfPT@lsb% - \fontfamily{\pgfPTglobalfont}\pgfPTlsbfont\selectfont% + \pgfPTlsbfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -2087,10 +2305,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@ls]{lsb}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % lsc -> Lattice constant: c \ifpgfPT@lsc% - \fontfamily{\pgfPTglobalfont}\pgfPTlscfont\selectfont% + \pgfPTlscfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -2101,10 +2320,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel[\pgfPT@labels@unit@ls]{lsc}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % lsca -> Lattice c/a ratio: \ifpgfPT@lsca% - \fontfamily{\pgfPTglobalfont}\pgfPTlscafont\selectfont% + \pgfPTlscafont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -2115,10 +2335,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{lsca}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % DiscY -> Discover Year \ifpgfPT@DiscY% - \fontfamily{\pgfPTglobalfont}\pgfPTDiscYfont\selectfont% + \pgfPTDiscYfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -2129,10 +2350,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{DiscY}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % DiscC -> Discover Country \ifpgfPT@DiscC% - \fontfamily{\pgfPTglobalfont}\pgfPTDiscCfont\selectfont% + \pgfPTDiscCfont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -2202,10 +2424,11 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT }; \fi% \fi% legenda extra + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % spectra -> spectra \ifpgfPT@spectra% - \fontfamily{\pgfPTglobalfont}\pgfPTspectrafont\selectfont% + \pgfPTspectrafont\selectfont% \ifnum\pgfPT@countb=2\relax\pgfmathsetlength{\pgfPT@dima}{.7*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size*\pgfPT@txtscale}% \else\ifnum\pgfPT@countb>2\relax\pgfmathsetlength{\pgfPT@dima}{.6*\f@size*\pgfPT@txtscale}\pgfmathsetlength{\pgfPT@dimb}{.35*\f@size*\pgfPT@txtscale}% \else\pgfmathsetlength{\pgfPT@dima}{.85*\f@size*\pgfPT@txtscale}\fi\fi% @@ -2216,6 +2439,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT { \pgfPT@putleglabel{spectra}% }; + \ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% \global\pgfPT@dima=0pt\relax% \fi\fi% end legend @@ -2240,7 +2464,7 @@ d unit,d precision,E precision,ls unit,ls precision,T precision,Cp precision,kT \ifnum\pgfPT@limits@min=1\relax\ifnum\pgfPT@limits@max=118\relax\ifnum\pgfPT@element@count>87\relax% % draw the blocks \pgfPT@countb=0\relax\@for\pgfPT@tmp:=\pgfPTlanguages\do{\advance\pgfPT@countb by 1\relax}% -\fontfamily{\pgfPTglobalfont}\pgfPTblocksfont\selectfont% +\pgfPTblocksfont\selectfont% \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi% % bloco s @@ -2350,6 +2574,7 @@ at (15*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@de \fi% IUPAC \fi% \fi\fi\fi\fi% END Blocks +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% % % Families \ifpgfPTfamilias% @@ -2358,7 +2583,7 @@ at (15*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@de \ifnum\pgfPT@limits@min=1\relax\ifnum\pgfPT@limits@max=118\relax\ifnum\pgfPT@element@count>87\relax% % draw the families \pgfPT@countb=0\relax\@for\pgfPT@tmp:=\pgfPTlanguages\do{\advance\pgfPT@countb by 1\relax}% -\fontfamily{\pgfPTglobalfont}\pgfPTfamiliesfont\selectfont% +\pgfPTfamiliesfont\selectfont% \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.75*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.55*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi% % elementos representativos @@ -2456,6 +2681,7 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def \fi% \fi% \fi\fi\fi\fi% END Families +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% % Variacoes \edef\@pgfPT@varpage@xshift{0pt}% \edef\@pgfPT@varpage@yshift{0pt}% @@ -2600,7 +2826,7 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def % end of shifts % R var \ifpgfPT@R% -\fontfamily{\pgfPTglobalfont}\pgfPTvarRfont\selectfont% +\pgfPTvarRfont\selectfont% \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.65*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi% \colorlet{pgfPTcolortemp}{\pgfPTvarRcolor}\colorlet{pgfPTfontcolortemp}{\pgfPTvarRfontcolor}% @@ -2630,10 +2856,11 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def at ([xshift=-.0375*\pgfPTcellwd]variacao.south) {\pgfPT@tmp@labels@otherLanguages};\fi% \draw[fill=pgfPTcolortemp!60!black,draw=pgfPTcolortemp!60!black] (-\pgfPTcellwd-\pgfPT@Rvar@shift,\pgfPTcellht+\pgfPT@Rvar@shift) circle(.3125*\pgfPTcellwd) % node[font=\pgfPTvarRfont,text=pgfPTcolortemp!25!white,anchor=mid] {R};% +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % Ei var \ifpgfPT@Ei% -\fontfamily{\pgfPTglobalfont}\pgfPTvarEifont\selectfont% +\pgfPTvarEifont\selectfont% \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.65*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi% \colorlet{pgfPTcolortemp}{\pgfPTvarEicolor}\colorlet{pgfPTfontcolortemp}{\pgfPTvarEifontcolor}% @@ -2663,10 +2890,11 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def at ([xshift=-.0375*\pgfPTcellwd]variacao.south) {\pgfPT@tmp@labels@otherLanguages};\fi% \draw[fill=pgfPTcolortemp!60!black,draw=pgfPTcolortemp!60!black] (-\pgfPTcellwd-\pgfPT@Eivar@shift,\pgfPTcellht+\pgfPT@Eivar@shift) circle(.3125*\pgfPTcellwd) % node[font=\pgfPTvarEifont,text=pgfPTcolortemp!25!white,anchor=mid] {E\raisebox{-.2ex}{i}};% +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% % Eaff var \ifpgfPT@eaff% -\fontfamily{\pgfPTglobalfont}\pgfPTvareafffont\selectfont% +\pgfPTvareafffont\selectfont% \ifnum\pgfPT@countb>1\relax\pgfmathsetlength{\pgfPT@dima}{.85*\f@size}\pgfmathsetlength{\pgfPT@dimb}{.65*\f@size}% \else\pgfmathsetlength{\pgfPT@dima}{\f@size}\fi% \colorlet{pgfPTcolortemp}{\pgfPTvareaffcolor}\colorlet{pgfPTfontcolortemp}{\pgfPTvareafffontcolor}% @@ -2696,6 +2924,7 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def at ([xshift=-.0375*\pgfPTcellwd]variacao.south) {\pgfPT@tmp@labels@otherLanguages};\fi% \draw[fill=pgfPTcolortemp!60!black,draw=pgfPTcolortemp!60!black] (-\pgfPTcellwd-\pgfPT@eaffvar@shift,\pgfPTcellht+\pgfPT@eaffvar@shift) circle(.3125*\pgfPTcellwd) % node[font=\pgfPTvareafffont,text=pgfPTcolortemp!25!white,anchor=mid] {E\raisebox{-.2ex}{ea}};% +\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\fontseries{\seriesdefault}\fontshape{\shapedefault}% \fi% \fi\fi\fi\fi% END Variacoes % @@ -2706,7 +2935,7 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def \pgfPT@dima=0pt\pgfPT@dimb=0pt\relax% \ifpgfPTperlabels% \begin{pgfinterruptpicture}% -\setbox0=\hbox{\fontfamily{\pgfPTglobalfont}\pgfPTlabfont\selectfont7}\global\pgfPT@dima=\wd0% +\setbox0=\hbox{\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\pgfPTlabfont\selectfont7}\global\pgfPT@dima=\wd0% \end{pgfinterruptpicture}% \pgfmathsetlength{\pgfPT@dima}{-\pgfPT@dima+2*\pgfPT@perlabel@xshift}% \else% @@ -2714,13 +2943,13 @@ at (7*\pgfPTcellwd,-1.5*\pgfPTcellht) {\pgfPT@box@zerodepth{\pgfPT@tmp@label@def \fi% pgfPTperlabels \ifpgfPTtitulo% \begin{pgfinterruptpicture}% -\setbox0=\hbox{\fontfamily{\pgfPTglobalfont}\pgfPTtitlefont\selectfont P}\global\pgfPT@dimb=\ht0% +\setbox0=\hbox{\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\pgfPTtitlefont\selectfont P}\global\pgfPT@dimb=\ht0% \end{pgfinterruptpicture}% \pgfmathsetlength{\pgfPT@dimb}{\pgfPT@dimb+.5*\pgfPTcellht+5pt}% \else% \ifpgfPTgrlabels% \begin{pgfinterruptpicture}% -\setbox0=\hbox{\fontfamily{\pgfPTglobalfont}\pgfPTlabfont\selectfont7}\global\pgfPT@dimb=\ht0% +\setbox0=\hbox{\ifnum\pgfPT@fontspec=1\relax\setmainfont{\pgfPTglobalfont}\else\fontfamily{\pgfPTglobalfont}\selectfont\fi\pgfPTlabfont\selectfont7}\global\pgfPT@dimb=\ht0% \end{pgfinterruptpicture}% \pgfmathsetlength{\pgfPT@dimb}{\pgfPT@dimb+5pt}% \else% @@ -2749,7 +2978,8 @@ rectangle \fi% \pgfPT@element@count=118 \fi\fi% min=1 & max 118 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\fontseries{\seriesdefault}\fontshape{\shapedefault}\selectfont% Restoring the font settings to normal mode in the document +\@pgfPT@resetlayers% Restoring pgf layers to those used in the document +\fontseries{\seriesdefault}\fontshape{\shapedefault}\fontfamily{\familydefault}\selectfont% Restoring the font settings to normal mode in the document }% end tikz }% % END !! \pgfPT ----------------------------------------------------------------------------------- diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf Binary files differindex 08ddf4d787..e957a47bae 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf +++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf diff --git a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex index 38f33f1710..659f09fd72 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex +++ b/graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.tex @@ -10,6 +10,7 @@ \date{\today} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document}% +\usefont{T1}{verdana}{m}{n}% \begin{titlepage} \vspace{\stretch{1}}% \maketitle\thispagestyle{empty}% @@ -20,7 +21,7 @@ \makebox[\linewidth][c]{\tikz{% \node[text width=.9\linewidth+.5cm,text justified,draw=blue!10!black,rounded corners=10pt,fill=blue!5] at (0,0) {\color{blue!10!black} \begin{abstract} -\noindent The purpose of this package is to provide the Periodic Table of Elements in a simple way. It relies on pgf/\txttikz{} to offer a full or partial periodic table with a variety of options and displaying the desired data. The data available, from all the actual 118 elements, is: atomic number, element name, chemical symbol, relative atomic mass, standard relative atomic mass, radioactivity, atomic radius (empirycal), covalente radius, ionic radius, first ionization energy, electronegati\-vity (Pauling), electroaffinity, oxidation states, melting point (in Kelvin and Celsius degrees), boiling point (in Kelvin and Celsius degrees), electron distribuition, electronic configuration (increasing $n$ and increasing $n+\ell$), density, specific heat capacity, thermal condutivity, lattice structure, lattice constants (a, b, c and c/a ratio), discovery year, discovery country and visible range spectral lines. It is possible to get the Periodic Table in six languages: English, French, German, Portuguese (from Portugal and from Brazil), Spanish and Italian. +\noindent The purpose of this package is to provide the Periodic Table of Elements in a simple way. It relies on pgf/\txttikz{} to offer a full or partial periodic table with a variety of options and displaying the desired data. The data available, from all the actual 118 elements, is: atomic number, element name, chemical symbol, relative atomic mass, standard relative atomic mass, radioactivity, atomic radius (empirycal), covalente radius, ionic radius, first ionization energy, electronegati\-vity (Pauling), electroaffinity, oxidation states, melting point (in Kelvin and Celsius degrees), boiling point (in Kelvin and Celsius degrees), electron distribuition, electronic configuration (increasing $n$ and increasing $n+\ell$), density, specific heat capacity, thermal condutivity, lattice structure, lattice constants (a, b, c and c/a ratio), discovery year, discovery country and visible range spectral lines. It is possible to get the Periodic Table in different languages: English, French, German, Portuguese (from Portugal and from Brazil), Spanish, Italian and translations provided by user contributions -- currently in Dutch only. \\ [6pt] \end{abstract} };}} @@ -35,22 +36,93 @@ \newpage\setcounter{page}{1}% \pagestyle{pgfPTManual}% \ \vfill% -\section{Installation and usage} +\section{Getting started} +\subsection{Installation} \noindent -\pack{} is placed under the terms of the \textrm{\LaTeX} Project Public License, version 1.3 or later (http://www.latex-project.org/lppl.txt). \pack{} loads and only requires the \href{https://www.ctan.org/pkg/pgf}{\txttikz{}} package. +\pack{} is placed under the terms of the \textrm{\LaTeX} Project Public License, version 1.3 or later (http://www.latex-project.org/lppl.txt). \pack{} loads and requires the \href{https://www.ctan.org/pkg/pgf}{\txttikz{}} and \href{https://ctan.org/pkg/fontenc}{fontenc} or \href{https://ctan.org/pkg/fontspec}{fontspec} (at least v2.7h -- 2020/02/03) packages. \\ [6pt]You need to put the package files (pgf-PeriodicTable.sty \&\ \textit{friends}) in a location where \textrm{PDF\LaTeX}, \textrm{Lua\LaTeX} or \textrm{Xe\LaTeX} can find them. According to the TDS conventions this may be a subdirectory named \textit{tex/latex/pgf-PeriodicTable/} or \textit{tex/latex/misc/} in your (site specific) installation tree (insert your appropriate directory delimiter instead of /, if needed). -\\ [6pt]If you are using \textrm{PDF\LaTeX}, \textrm{Lua\LaTeX} or \textrm{Xe\LaTeX} you can just simply include the style file without any option via the \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}} command, \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} -\\ [6pt]It can also be loaded with \textit{one option} to select the desired language:\\ \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{language flag}\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} +\subsection{Package loading and options} +If you are using \textrm{PDF\LaTeX}, \textrm{Lua\LaTeX} or \textrm{Xe\LaTeX} you can just simply include the style file without any option via the \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}} command, \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} +\\ [6pt]It can also be loaded with a comma separated list of \textit{options} to select the desired default language or to use Devanagari or Mandarin numerals in the Atomic Number, Periods and/or Groups. +\subsubsection{Language Option} +There are six \textit{built-in }languages -- English, French, German, Portuguese (from Portugal and Brazil), Spanish and Italian. The default language used in the package may be selected at package loading: +\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{language flag}\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} \\ [6pt]\textit{The \textcolor{brown!60!black}{language flags} available are:} +\vspace{2pt}\hrule\vspace{4pt} +\begin{minipage}[t]{.5\linewidth} \begin{itemize} \item[$\checkmark$]\textbf{en} for English (default), \item[$\checkmark$]\textbf{fr} for French, \item[$\checkmark$]\textbf{de} for German, \item[$\checkmark$]\textbf{pt} for Portuguese (Portugal), +\end{itemize}\end{minipage}\begin{minipage}[t]{.5\linewidth} +\begin{itemize} \item[$\checkmark$]\textbf{br} for Portuguese (Brazil), \item[$\checkmark$]\textbf{es} for Spanish and \item[$\checkmark$]\textbf{it} for Italian. -\end{itemize} +\end{itemize}\end{minipage} +\vspace{4pt}\hrule\vspace{12pt} +A \textit{user language} can also be chosen as default language loading the package with the following option syntax: +\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{userlang=<ISO 639-1 CODE>}\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} +\\ [6pt]In the present version only a Dutch translation is available. It can be loaded by: +\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{userlang=nl}% +\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} +\\ [6pt]\tikz{\node[text width=\linewidth-6mm,draw=green!70,rounded corners=2pt,fill=black!10!green!10,inner sep=3mm] {Anyone who wishes to contribute with translations for use in this package can go to the \tikz[baseline=(b.base)]{\node[inner sep=0pt] (a) {\includegraphics[height=10pt]{manualfiles/pgfPTgithub-mark.pdf}}; \node[right,inner sep=0pt,xshift=.1em] (b) at (a.east) {\href{https://github.com/HugoPGomes/pgf-periodictable}{pgf-periodictable}};} project page.};} +\\ [6pt]\textbf{Note that the \textit{built-in} languages are always available for the \textcolor{red!60!black}{languages} option of the \bs{pgfPT} command, but the \textit{user language} is only available if loaded with the package.} +\subsubsection{Devanagari numerals} +It is possible to get some numbers in the Periodic Table with Devanagari numerals: the atomic number and the numeration of periods and groups. To get this feature enabled the package must be loaded with the option \textit{numerals} set to \textbf{dvn}: +\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{numerals=dvn}% +\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} +\\ [6pt]\tikz{\node[text width=\linewidth-6mm,draw=orange!70,rounded corners=2pt,fill=black!10!orange!10,inner sep=3mm] { +This option requires the \textrm{Xe\LaTeX} engine to typeset the document.};} +\\ [10pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] % +{\small\textcolor{black!50}{\%\ \string\usepackage[numerals=dvn]\{pgf-PeriodicTable\}}};}% +\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTnumDeva.pdf}}}% +\\ [3pt]\pgfPTMline +\\ [6pt]It is also possible to load a font for the Devanagari numerals using the following command: +\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTdvnfont}% +\\ [3pt]\bs{pgfPTdvnfont}\lp\red{font options}\rp\lb\red{font name}\rb +\\ [3pt]The default font is \textit{Eczar}. +\vfill +\subsubsection{Mandarin numerals} +To get some numbers of the Periodic Table with Mandarin numerals (the atomic number and the numeration of periods and groups) the package must be loaded with the above option \textit{numerals} set to \textbf{zh}: +\\ [3pt]\texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{numerals=zh}% +\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} +\\ [6pt]\tikz{\node[text width=\linewidth-6mm,draw=orange!70,rounded corners=2pt,fill=black!10!orange!10,inner sep=3mm] { +This option works with the \textrm{Xe\LaTeX} and \textrm{Lua\LaTeX} engines to typeset the document and requires the \texttt{\large zhnumber} package, which is automatically loaded.};} +\newpage%\\ [10pt] +\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] % +{\small\textcolor{black!50}{\%\ \string\usepackage[numerals=zh]\{pgf-PeriodicTable\}}};}% +\\ [-4pt]\pgfPTMmacrobox{pgfPT}[]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTnumMand1.pdf}}}% +\\ [3pt]\pgfPTMline +\\ [6pt]As with the Devanagari numerals, the following command loads the specified font for the Mandarin numerals: +\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhfont}% +\\ [3pt]\bs{pgfPTzhfont}\lp\red{font options}\rp\lb\red{font name}\rb +\\ [3pt]The default font is \textit{SimSun} loaded with the \textit{AutoFakeBold=4} option. +\\ [6pt]It is also possible to enable or disable the numbers shown in Mandarin with the command: +\\ [3pt]\bs{pgfPTzhnumber}\lp\red{<true|false>}\rp\lb\red{comma separated list}\rb +\\ [3pt] The list can have \red{Z} for the atomic number, \red{per} for the period numbers and \red{gr} for the group numbers. At package loading, with this option, they are set to \red{true}. +\index{COMMANDS@\textbf{COMMANDS}!\textbackslash pgfPTzhnumber}% +\\ [10pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=left,fill=black!10,rounded corners=2pt] % +{\small\textcolor{black!50}{\%\ \string\usepackage[numerals=zh]\{pgf-PeriodicTable\}}};}% +\\ [-4pt]\tikz{\node[text width=\linewidth-8pt,inner xsep=4pt,align=center,fill=black!10,rounded corners=2pt] % +{\bs{pgfPTzhnumber}\lp\red{false}\rp\lb\red{Z}\rb};}% +\\ [-4pt]\pgfPTMmacrobox{pgfPT}[Z list={1,...,36}]% +\\ [10pt]\makebox[\linewidth][c]{\scalebox{.6}{\includegraphics{manualfiles/pgfPTnumMand2.pdf}}}% +\\ [3pt]\pgfPTMline +\subsection{Interaction with other packages} +\subsubsection{fontspec} +To correctly set the font in each cell contents the command \bs{fontspec} must be used. For example if you want to use \textit{Arial} for the \red{name font}, it must be set using \red{font name=\bs{fontspec}\lb Arial\rb\bs{selectfont}}.\\ All other font selection commands, \eg, \bs{large}, \mbox{\bs{itshape}}, are used as usual. For example if you want to use \textit{Arial}\hfil\ in\hfil\ \textit{large}\hfil\ size\hfil\ and\hfil\ \textit{bold}\hfil\ weight\hfil\ for\hfil\ the \red{name font}, then you type +\\ \makebox[\linewidth][s]{\red{font name=\bs{large}\bs{bfseries}\bs{fontspec}\lb Arial\rb\bs{selectfont}}\hfil\ or\hfil\ \red{font name=\bs{fontspec}\lb Arial\rb}} +\\ \bs{large}\bs{bfseries}\bs{selectfont}. +\subsubsection{ragged2e} +Using \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}\textcolor{blue!70!black}{[}\textcolor{brown!60!black}{document}% +\textcolor{blue!70!black}{]}\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{ragged2e}\textcolor{purple!40!black}{\}}} and \texttt{\large\textcolor{green!40!black}{\textbackslash usepackage}% +\textcolor{purple!70!black}{\{}\textcolor{blue!70!black}{pgf-PeriodicTable}\textcolor{purple!40!black}{\}}} together, the Periodic Table will be completely fractured and out of the page. +\\ [6pt]\textit{Solution}: +\vspace{4pt}\hrule\vspace{4pt}Use a local group: \{\bs{justifying}\bs{pgfPT}\}\vspace{4pt}\hrule \vfill\vfill\vfill\newpage\ \vfill% \section{The data} The data available in \pack{} was mainly compiled with selected and filtered data from Wikipedia, taken from November 2021 to July 2022. @@ -73,7 +145,7 @@ Commission on Isotopic Abundances and Atomic Weights,\newline\bfseries\textsf{\t \\ [-1pt]\linhapar{TboilC}{Boiling Point}{$\mathsf{^oC}$}{at standard pressure (Wikidata @21/dez/2021)}% \\ [-1pt]\linhaimpar{eDist}{Electron Distribution}{}{(Wikidata @01/nov/2021)}% \\ [-1pt]\linhapar{eConfign}{Electronic Configuration (increasing n)}{}{(Wikidata @01/nov/2021)}% -\\ [-1pt]\linhaimpar{eConfign}{Electronic Configuration (increasing $\mathsf{n+\ell}$)}{}{(Wikidata @01/nov/2021)}% +\\ [-1pt]\linhaimpar{eConfignl}{Electronic Configuration (increasing $\mathsf{n+\ell}$)}{}{(Wikidata @01/nov/2021)}% \\ [-1pt]\linhapar{d}{Density}{$\mathsf{g\cdot dm^{-3}}$ {\tiny for gases}\newline$\mathsf{g\cdot cm^{-3}}$ {\tiny all other physical states}}{physical state at $\mathsf{25^oC, 1\,atm}$ (Wikidata @01/nov/2021)}% \\ [-1pt]\linhaimpar{Cp}{Specific heat capacity}{$\mathsf{J\cdot mol^{-1}\cdot K^{-1}}$}{at $\mathsf{25^oC}$ and $\mathsf{100\,kPa}$ (Wikidata @20/nov/2021)}% \\ [-1pt]\linhapar{kT}{Thermal Conductivity}{$\mathsf{W\cdot m^{-1}\cdot K^{-1}}$}{at $\mathsf{25^oC}$ (Wikidata @21/nov/2021)}% diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex index 3567ca1be3..a9a3699c36 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex +++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.buildcell.tex @@ -326,8 +326,8 @@ at (-.5*\pgfPT@cell@collumnwd+\pgfPT@cell@collumnwd*\coluna,\pgfPT@cell@lineht) \newif\ifpgfPT@spectra\pgfPT@spectrafalse% %\newif\ifpgfPT@DiscBy\pgfPT@DiscByfalse% % -------------------------------------------------------------------------------------------------- -\def\loadcell#1{Loading cell data\\ --\ #1\ -- CONTENTS\pgfPT@loadcell[#1]% DEBUG -\@for\@tmp:=\pgfPT@load@cellcontents\do{\\ \@tmp}}% DEBUG +%\def\loadcell#1{Loading cell data\\ --\ #1\ -- CONTENTS\pgfPT@loadcell[#1]% DEBUG +%\@for\@tmp:=\pgfPT@load@cellcontents\do{\\ \@tmp}}% DEBUG % -------------------------------------------------------------------------------------------------- \def\pgfPT@loadcell[#1]{\ignorespaces% \edef\pgfPT@testa{#1}% diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex index da64b41a06..62d62e0f89 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex +++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.data.tex @@ -3,6 +3,7 @@ % -------------------------------------------------------------------------------------------------- % the data of the elements of the Periodic Table --------------------------------------------- % -------------------------------------------------------------------------------------------------- +% v2.1.0: Added support for user language % % data available for each element: % Z: Atomic Number @@ -76,52 +77,52 @@ \def\pgfPT@set@country#1{% \edef\pgfPT@country@flag{pgfPT_flag#1}% \ifcase#1% -% 0: Asia Minor -\def\pgfPT@country@name@pt{\'{A}sia Menor}\def\pgfPT@country@name@en{Asia Minor}\def\pgfPT@country@name@fr{Asie Mineure}\def\pgfPT@country@name@de{Kleinasien}\def\pgfPT@country@name@it{Asia minore}\def\pgfPT@country@name@es{Asia Menor}\def\pgfPT@country@name@br{\'{A}sia Menor}% -\or% 1: Austria -\def\pgfPT@country@name@pt{\'{A}ustria}\def\pgfPT@country@name@en{Austria}\def\pgfPT@country@name@fr{Autriche}\def\pgfPT@country@name@de{\"{O}sterreich}\def\pgfPT@country@name@it{Austria}\def\pgfPT@country@name@es{Austria}\def\pgfPT@country@name@br{\'{A}ustria}% -\or% 2: Denmark -\def\pgfPT@country@name@pt{Dinamarca}\def\pgfPT@country@name@en{Denmark}\def\pgfPT@country@name@fr{Danemark}\def\pgfPT@country@name@de{D\"{a}nemark}\def\pgfPT@country@name@it{Danimarca}\def\pgfPT@country@name@es{Dinamarca}\def\pgfPT@country@name@br{Dinamarca}% -\or% 3: Egypt -\def\pgfPT@country@name@pt{Egito}\def\pgfPT@country@name@en{Egypt}\def\pgfPT@country@name@fr{Egypte}\def\pgfPT@country@name@de{\"{A}gypten}\def\pgfPT@country@name@it{Egitto}\def\pgfPT@country@name@es{Egipto}\def\pgfPT@country@name@br{Egito}% -\or% 4: Finland -\def\pgfPT@country@name@pt{Finl\^{a}ndia}\def\pgfPT@country@name@en{Finland}\def\pgfPT@country@name@fr{Finlande}\def\pgfPT@country@name@de{Finnland}\def\pgfPT@country@name@it{Finlandia}\def\pgfPT@country@name@es{Finlandia}\def\pgfPT@country@name@br{Finl\^{a}ndia}% -\or% 5: France -\def\pgfPT@country@name@pt{Fran\c{c}a}\def\pgfPT@country@name@en{France}\def\pgfPT@country@name@fr{France}\def\pgfPT@country@name@de{Frankreich}\def\pgfPT@country@name@it{Francia}\def\pgfPT@country@name@es{Francia}\def\pgfPT@country@name@br{Fran\c{c}a}% +% 0: Asia Minor AM +\def\pgfPT@country@name@pt{\'{A}sia Menor}\def\pgfPT@country@name@en{Asia Minor}\def\pgfPT@country@name@fr{Asie Mineure}\def\pgfPT@country@name@de{Kleinasien}\def\pgfPT@country@name@it{Asia minore}\def\pgfPT@country@name@es{Asia Menor}\def\pgfPT@country@name@br{\'{A}sia Menor}\def\pgfPT@country@name@user{\pgfPT@user@country@AM}% +\or% 1: Austria au +\def\pgfPT@country@name@pt{\'{A}ustria}\def\pgfPT@country@name@en{Austria}\def\pgfPT@country@name@fr{Autriche}\def\pgfPT@country@name@de{\"{O}sterreich}\def\pgfPT@country@name@it{Austria}\def\pgfPT@country@name@es{Austria}\def\pgfPT@country@name@br{\'{A}ustria}\def\pgfPT@country@name@user{\pgfPT@user@country@au}% +\or% 2: Denmark dn +\def\pgfPT@country@name@pt{Dinamarca}\def\pgfPT@country@name@en{Denmark}\def\pgfPT@country@name@fr{Danemark}\def\pgfPT@country@name@de{D\"{a}nemark}\def\pgfPT@country@name@it{Danimarca}\def\pgfPT@country@name@es{Dinamarca}\def\pgfPT@country@name@br{Dinamarca}\def\pgfPT@country@name@user{\pgfPT@user@country@dn}% +\or% 3: Egypt eg +\def\pgfPT@country@name@pt{Egito}\def\pgfPT@country@name@en{Egypt}\def\pgfPT@country@name@fr{Egypte}\def\pgfPT@country@name@de{\"{A}gypten}\def\pgfPT@country@name@it{Egitto}\def\pgfPT@country@name@es{Egipto}\def\pgfPT@country@name@br{Egito}\def\pgfPT@country@name@user{\pgfPT@user@country@eg}% +\or% 4: Finland fl +\def\pgfPT@country@name@pt{Finl\^{a}ndia}\def\pgfPT@country@name@en{Finland}\def\pgfPT@country@name@fr{Finlande}\def\pgfPT@country@name@de{Finnland}\def\pgfPT@country@name@it{Finlandia}\def\pgfPT@country@name@es{Finlandia}\def\pgfPT@country@name@br{Finl\^{a}ndia}\def\pgfPT@country@name@user{\pgfPT@user@country@fl}% +\or% 5: France fr +\def\pgfPT@country@name@pt{Fran\c{c}a}\def\pgfPT@country@name@en{France}\def\pgfPT@country@name@fr{France}\def\pgfPT@country@name@de{Frankreich}\def\pgfPT@country@name@it{Francia}\def\pgfPT@country@name@es{Francia}\def\pgfPT@country@name@br{Fran\c{c}a}\def\pgfPT@country@name@user{\pgfPT@user@country@fr}% \or% 6: France and Germany \or% 7: France and The United Kingdom -\or% 8: Germany -\def\pgfPT@country@name@pt{Alemanha}\def\pgfPT@country@name@en{Germany}\def\pgfPT@country@name@fr{Allemagne}\def\pgfPT@country@name@de{Deutschland}\def\pgfPT@country@name@it{Germania}\def\pgfPT@country@name@es{Alemania}\def\pgfPT@country@name@br{Alemanha}% +\or% 8: Germany de +\def\pgfPT@country@name@pt{Alemanha}\def\pgfPT@country@name@en{Germany}\def\pgfPT@country@name@fr{Allemagne}\def\pgfPT@country@name@de{Deutschland}\def\pgfPT@country@name@it{Germania}\def\pgfPT@country@name@es{Alemania}\def\pgfPT@country@name@br{Alemanha}\def\pgfPT@country@name@user{\pgfPT@user@country@de}% \or% 9: Germany and Sweden \or% 10: Germany and The United Kingdom -\or% 11: Italy -\def\pgfPT@country@name@pt{It\'{a}lia}\def\pgfPT@country@name@en{Italy}\def\pgfPT@country@name@fr{Italie}\def\pgfPT@country@name@de{Italien}\def\pgfPT@country@name@it{Italia}\def\pgfPT@country@name@es{Italia}\def\pgfPT@country@name@br{It\'{a}lia}% -\or% 12: Middle East -\def\pgfPT@country@name@pt{M\'{e}dio Oriente}\def\pgfPT@country@name@en{Middle East}\def\pgfPT@country@name@fr{Moyen-Orient}\def\pgfPT@country@name@de{Mittlerer Osten}\def\pgfPT@country@name@it{Medio Oriente}\def\pgfPT@country@name@es{Medio Oriente}\def\pgfPT@country@name@br{M\'{e}dio Oriente}% -\or% 13: Peru -\def\pgfPT@country@name@pt{Peru}\def\pgfPT@country@name@en{Peru}\def\pgfPT@country@name@fr{P\'{e}rou}\def\pgfPT@country@name@de{Peru}\def\pgfPT@country@name@it{Per\`{u}}\def\pgfPT@country@name@es{Per\'{u}}\def\pgfPT@country@name@br{Peru}% -\or% 14: Romania -\def\pgfPT@country@name@pt{Rom\'{e}nia}\def\pgfPT@country@name@en{Romania}\def\pgfPT@country@name@fr{Roumanie}\def\pgfPT@country@name@de{Rum\"{a}nien}\def\pgfPT@country@name@it{Romania}\def\pgfPT@country@name@es{Rumania}\def\pgfPT@country@name@br{Rom\^{e}nia}% -\or% 15: Russia -\def\pgfPT@country@name@pt{R\'{u}ssia}\def\pgfPT@country@name@en{Russia}\def\pgfPT@country@name@fr{Russie}\def\pgfPT@country@name@de{Russland}\def\pgfPT@country@name@it{Russia}\def\pgfPT@country@name@es{Rusia}\def\pgfPT@country@name@br{R\'{u}ssia}% +\or% 11: Italy it +\def\pgfPT@country@name@pt{It\'{a}lia}\def\pgfPT@country@name@en{Italy}\def\pgfPT@country@name@fr{Italie}\def\pgfPT@country@name@de{Italien}\def\pgfPT@country@name@it{Italia}\def\pgfPT@country@name@es{Italia}\def\pgfPT@country@name@br{It\'{a}lia}\def\pgfPT@country@name@user{\pgfPT@user@country@it}% +\or% 12: Middle East ME +\def\pgfPT@country@name@pt{M\'{e}dio Oriente}\def\pgfPT@country@name@en{Middle East}\def\pgfPT@country@name@fr{Moyen-Orient}\def\pgfPT@country@name@de{Mittlerer Osten}\def\pgfPT@country@name@it{Medio Oriente}\def\pgfPT@country@name@es{Medio Oriente}\def\pgfPT@country@name@br{M\'{e}dio Oriente}\def\pgfPT@country@name@user{\pgfPT@user@country@ME}% +\or% 13: Peru pe +\def\pgfPT@country@name@pt{Peru}\def\pgfPT@country@name@en{Peru}\def\pgfPT@country@name@fr{P\'{e}rou}\def\pgfPT@country@name@de{Peru}\def\pgfPT@country@name@it{Per\`{u}}\def\pgfPT@country@name@es{Per\'{u}}\def\pgfPT@country@name@br{Peru}\def\pgfPT@country@name@user{\pgfPT@user@country@pe}% +\or% 14: Romania ro +\def\pgfPT@country@name@pt{Rom\'{e}nia}\def\pgfPT@country@name@en{Romania}\def\pgfPT@country@name@fr{Roumanie}\def\pgfPT@country@name@de{Rum\"{a}nien}\def\pgfPT@country@name@it{Romania}\def\pgfPT@country@name@es{Rumania}\def\pgfPT@country@name@br{Rom\^{e}nia}\def\pgfPT@country@name@user{\pgfPT@user@country@ro}% +\or% 15: Russia ru +\def\pgfPT@country@name@pt{R\'{u}ssia}\def\pgfPT@country@name@en{Russia}\def\pgfPT@country@name@fr{Russie}\def\pgfPT@country@name@de{Russland}\def\pgfPT@country@name@it{Russia}\def\pgfPT@country@name@es{Rusia}\def\pgfPT@country@name@br{R\'{u}ssia}\def\pgfPT@country@name@user{\pgfPT@user@country@ru}% \or% 16: Russia and The United States -\or% 17: Spain -\def\pgfPT@country@name@pt{Espanha}\def\pgfPT@country@name@en{Spain}\def\pgfPT@country@name@fr{Espagne}\def\pgfPT@country@name@de{Spanien}\def\pgfPT@country@name@it{Spagna}\def\pgfPT@country@name@es{Espa\~{n}a}\def\pgfPT@country@name@br{Espanha}% -\or% 18: Sweden -\def\pgfPT@country@name@pt{Su\'{e}cia}\def\pgfPT@country@name@en{Sweden}\def\pgfPT@country@name@fr{Su\`{e}de}\def\pgfPT@country@name@de{Schweden}\def\pgfPT@country@name@it{Svezia}\def\pgfPT@country@name@es{Suecia}\def\pgfPT@country@name@br{Su\'{e}cia}% +\or% 17: Spain es +\def\pgfPT@country@name@pt{Espanha}\def\pgfPT@country@name@en{Spain}\def\pgfPT@country@name@fr{Espagne}\def\pgfPT@country@name@de{Spanien}\def\pgfPT@country@name@it{Spagna}\def\pgfPT@country@name@es{Espa\~{n}a}\def\pgfPT@country@name@br{Espanha}\def\pgfPT@country@name@user{\pgfPT@user@country@es}% +\or% 18: Sweden sw +\def\pgfPT@country@name@pt{Su\'{e}cia}\def\pgfPT@country@name@en{Sweden}\def\pgfPT@country@name@fr{Su\`{e}de}\def\pgfPT@country@name@de{Schweden}\def\pgfPT@country@name@it{Svezia}\def\pgfPT@country@name@es{Suecia}\def\pgfPT@country@name@br{Su\'{e}cia}\def\pgfPT@country@name@user{\pgfPT@user@country@sw}% \or% 19: Sweden and The United Kingdom -\or% 20: Switzerland -\def\pgfPT@country@name@pt{Su\'{i}\c{c}a}\def\pgfPT@country@name@en{Switzerland}\def\pgfPT@country@name@fr{Suisse}\def\pgfPT@country@name@de{Schweiz}\def\pgfPT@country@name@it{Svizzera}\def\pgfPT@country@name@es{Suiza}\def\pgfPT@country@name@br{Su\'{i}\c{c}a}% -\or% 21: The United Kingdom -\def\pgfPT@country@name@pt{Reino Unido}\def\pgfPT@country@name@en{The United Kingdom}\def\pgfPT@country@name@fr{Royaume-Uni}\def\pgfPT@country@name@de{Vereinigtes K\"{o}nigreich}\def\pgfPT@country@name@it{Regno Unito}\def\pgfPT@country@name@es{Reino Unido}\def\pgfPT@country@name@br{Reino Unido}% -\or% 22: The United States -\def\pgfPT@country@name@pt{Estados Unidos}\def\pgfPT@country@name@en{The United States}\def\pgfPT@country@name@fr{\'{E}tats-Unis}\def\pgfPT@country@name@de{Vereinigte Staaten}\def\pgfPT@country@name@it{Stati Uniti}\def\pgfPT@country@name@es{Estados Unidos}\def\pgfPT@country@name@br{Estados Unidos}% +\or% 20: Switzerland ch +\def\pgfPT@country@name@pt{Su\'{i}\c{c}a}\def\pgfPT@country@name@en{Switzerland}\def\pgfPT@country@name@fr{Suisse}\def\pgfPT@country@name@de{Schweiz}\def\pgfPT@country@name@it{Svizzera}\def\pgfPT@country@name@es{Suiza}\def\pgfPT@country@name@br{Su\'{i}\c{c}a}\def\pgfPT@country@name@user{\pgfPT@user@country@ch}% +\or% 21: The United Kingdom uk +\def\pgfPT@country@name@pt{Reino Unido}\def\pgfPT@country@name@en{The United Kingdom}\def\pgfPT@country@name@fr{Royaume-Uni}\def\pgfPT@country@name@de{Vereinigtes K\"{o}nigreich}\def\pgfPT@country@name@it{Regno Unito}\def\pgfPT@country@name@es{Reino Unido}\def\pgfPT@country@name@br{Reino Unido}\def\pgfPT@country@name@user{\pgfPT@user@country@uk}% +\or% 22: The United States us +\def\pgfPT@country@name@pt{Estados Unidos}\def\pgfPT@country@name@en{The United States}\def\pgfPT@country@name@fr{\'{E}tats-Unis}\def\pgfPT@country@name@de{Vereinigte Staaten}\def\pgfPT@country@name@it{Stati Uniti}\def\pgfPT@country@name@es{Estados Unidos}\def\pgfPT@country@name@br{Estados Unidos}\def\pgfPT@country@name@user{\pgfPT@user@country@us}% \or% 23: Mexico and Sweden \or% 24: Sweden and The United States -\or% 25: Mexico (and Sweden) -\def\pgfPT@country@name@pt{M\'{e}xico}\def\pgfPT@country@name@en{Mexico}\def\pgfPT@country@name@fr{Mexique}\def\pgfPT@country@name@de{Mexico}\def\pgfPT@country@name@it{Messico}\def\pgfPT@country@name@es{M\'{e}xico}\def\pgfPT@country@name@br{M\'{e}xico}% +\or% 25: Mexico (and Sweden) mx +\def\pgfPT@country@name@pt{M\'{e}xico}\def\pgfPT@country@name@en{Mexico}\def\pgfPT@country@name@fr{Mexique}\def\pgfPT@country@name@de{Mexico}\def\pgfPT@country@name@it{Messico}\def\pgfPT@country@name@es{M\'{e}xico}\def\pgfPT@country@name@br{M\'{e}xico}\def\pgfPT@country@name@user{\pgfPT@user@country@mx}% \else% 100: -\def\pgfPT@country@name@pt{}\def\pgfPT@country@name@en{}\def\pgfPT@country@name@fr{}\def\pgfPT@country@name@de{}\def\pgfPT@country@name@it{}\def\pgfPT@country@name@es{}\def\pgfPT@country@name@br{}% +\def\pgfPT@country@name@pt{}\def\pgfPT@country@name@en{}\def\pgfPT@country@name@fr{}\def\pgfPT@country@name@de{}\def\pgfPT@country@name@it{}\def\pgfPT@country@name@es{}\def\pgfPT@country@name@br{}\def\pgfPT@country@name@user{}% \fi% }% % -------------------------------------------------------------------------------------------------- diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex index 18620fea26..8c09f620e1 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex +++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.drawing.keys.tex @@ -4,11 +4,9 @@ % -------------------------------------------------------------------------------------------------- % The keys for the layout and drawing the Periodic Table ------------------------------------ % -------------------------------------------------------------------------------------------------- -%% defining PGF keys: language list to use in the Periodic Table ------------------------------ \pgfkeys{/pgfPerTable/.cd,% -languages/.get=\pgfPTlanguages,% -languages/.store in=\pgfPTlanguages,% -languages/.default=\pgfPT@defaultLanguage,% +languages/.code=\pgfPT@otherlanguages{#1},% v2.1.0 +languages/.default=\pgfPT@defaultLanguage,% v2.1.0 other languages font/.get=\pgfPTotherLangFont,% other languages font/.store in=\pgfPTotherLangFont,% other languages font/.default=\tiny,% @@ -18,6 +16,20 @@ other languages color/.default=black!70,% other lang/.code=\pgfPT@otherlangstyle{#1},% other lang/.default={f=\tiny,c=black!70}% }% +% replace user ISO flag, if found, with 'user' (v2.1.0) ------------------------------------- +\newcount\pgfPT@nlang@count% +\def\pgfPT@otherlanguages#1{% +\pgfPT@nlang@count=0\relax% +\edef\pgfPTlanguages{}% +\@for\pgfPT@tmp:=#1\do{\advance\pgfPT@nlang@count by1\relax% +\ifnum\pgfPT@nlang@count=1\relax% +\ifx\pggPT@userlanguage@ISOcode\pgfPT@tmp\relax\edef\pgfPTlanguages{user}% +\else\edef\pgfPTlanguages{\pgfPT@tmp}\fi% +\else% +\ifx\pggPT@userlanguage@ISOcode\pgfPT@tmp\relax\edef\pgfPTlanguages{\pgfPTlanguages,user}% +\else\edef\pgfPTlanguages{\pgfPTlanguages,\pgfPT@tmp}\fi% +\fi}% +}% ------------------------------------------------------------------------------------------------- % setting key with default value ----------------------------------------------------------------- \pgfkeys{/pgfPerTable/.cd,languages,other languages font,other languages color}% % end !! PGF keys: language to use in the Periodic Table --------------------------------------- diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex index 809899c684..d4e5586f3e 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex +++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.labels.tex @@ -3,55 +3,56 @@ % -------------------------------------------------------------------------------------------------- % The language labels to use in the title and the legend of the Periodic Table -------------- % v2.0.1: Improved German language after suggestions made by Ole Schwen +% v2.1.0: Added support for user language % -------------------------------------------------------------------------------------------------- % -% The labels available in pt, en, fr, de, it, es, br are: +% The labels available in pt, en, fr, de, it, es, br, user are: % titulo, La, Ac, solido, liquido, gasoso, sintetico, % Z, name, CS, Ar, Arstar, radio, R, Rcov, Rion, % Ei, eneg, eaff, O, Tmelt, TmeltC, Tboil, TboilC, eDist, eConfign, % eConfignl, d, Cp, kT, ls, lsa, lsb, lsc, lsca, DiscY, DiscC, spectra % % -------------------------------------------------------------------------------------------------- -\def\pgfPT@labels@titulo{Tabela Peri\'{o}dica dos Elementos/pt,Periodic Table of Elements/en,Tableau P\'{e}riodique des \'{E}l\'{e}ments/fr,Periodensystem der Elemente/de,Tavola Periodica degli Elementi/it,Tabla Periodica de los Elementos/es,Tabela Peri\'{o}dica dos Elementos/br}% -\def\pgfPT@labels@La{lantan\'{o}ides/pt,lanthanoids/en,lanthano\"{i}des/fr,Lanthanoide/de,lantanoidi/it,lantanoides/es,lantan\'{o}ides/br}% -\def\pgfPT@labels@Ac{actin\'{o}ides/pt,actinoids/en,actino\"{i}de/fr,Actinoide/de,actinoidi/it,actinoides/es,actin\'{o}ides/br}% -\def\pgfPT@labels@solido{s\'{o}lido/pt,solid/en,solide/fr,fest/de,solido/it,s\'{o}lido/es,s\'{o}lido/br}% -\def\pgfPT@labels@liquido{l\'{i}quido/pt,liquid/en,liquide/fr,fl\"{u}ssig/de,liquido/it,l\'{i}quido/es,l\'{i}quido/br}% -\def\pgfPT@labels@gasoso{gasoso/pt,gaseous/en,gazeux/fr,gasf\"{o}rmig/de,gassoso/it,gaseoso/es,gasoso/br}% -\def\pgfPT@labels@sintetico{sint\'{e}tico/pt,synthetic/en,synth\'{e}tique/fr,synthetisch/de,sintetico/it,sint\'{e}tico/es,sint\'{e}tico/br}% +\def\pgfPT@labels@titulo{Tabela Peri\'{o}dica dos Elementos/pt,Periodic Table of Elements/en,Tableau P\'{e}riodique des \'{E}l\'{e}ments/fr,Periodensystem der Elemente/de,Tavola Periodica degli Elementi/it,Tabla Peri\'{o}dica de los Elementos/es,Tabela Peri\'{o}dica dos Elementos/br,\pgfPT@user@labels@titulo/user}% +\def\pgfPT@labels@La{lantan\'{o}ides/pt,lanthanoids/en,lanthano\"{i}des/fr,Lanthanoide/de,lantanoidi/it,lantanoides/es,lantan\'{o}ides/br,\pgfPT@user@labels@La/user}% +\def\pgfPT@labels@Ac{actin\'{o}ides/pt,actinoids/en,actino\"{i}de/fr,Actinoide/de,actinoidi/it,actinoides/es,actin\'{o}ides/br,\pgfPT@user@labels@Ac/user}% +\def\pgfPT@labels@solido{s\'{o}lido/pt,solid/en,solide/fr,fest/de,solido/it,s\'{o}lido/es,s\'{o}lido/br,\pgfPT@user@labels@solido/user}% +\def\pgfPT@labels@liquido{l\'{i}quido/pt,liquid/en,liquide/fr,fl\"{u}ssig/de,liquido/it,l\'{i}quido/es,l\'{i}quido/br,\pgfPT@user@labels@liquido/user}% +\def\pgfPT@labels@gasoso{gasoso/pt,gaseous/en,gazeux/fr,gasf\"{o}rmig/de,gassoso/it,gaseoso/es,gasoso/br,\pgfPT@user@labels@gasoso/user}% +\def\pgfPT@labels@sintetico{sint\'{e}tico/pt,synthetic/en,synth\'{e}tique/fr,synthetisch/de,sintetico/it,sint\'{e}tico/es,sint\'{e}tico/br,\pgfPT@user@labels@sintetico/user}% % -\def\pgfPT@labels@Z{N\'{u}mero At\'{o}mico/pt,Atomic \mbox{Number}/en,Num\'{e}ro \mbox{Atomique}/fr,Ord\-nungs\-zahl/de,Numero \mbox{Atomico}/it,N\'{u}mero \mbox{At\'{o}mico}/es,N\'{u}mero At\^{o}mico/br}% -\def\pgfPT@labels@name{Nome/pt,Name/en,Nom/fr,Name/de,Nome/it,Nombre/es,Nome/br}% -\def\pgfPT@labels@CS{S\'{i}mbolo Qu\'{i}mico/pt,Chemical Symbol/en,Symbole Chimique/fr,Chemisches Symbol/de,Simbolo Chimico/it,S\'{i}mbolo Qu\'{i}mico/es,S\'{i}mbolo Qu\'{i}mico/br}% -\def\pgfPT@labels@Ar@m{Massa \mbox{At\'{o}mica} Relativa/pt,Relative \mbox{Atomic} Mass/en,Masse \mbox{Atomique} Relative/fr,Relative Atom\-masse/de,Massa \mbox{Atomica} Relativa/it,Masa \mbox{At\'{o}mica} Relativa/es,Massa \mbox{At\^{o}mica} Relativa/br}% -\def\pgfPT@labels@Arstar@m{Massa At\'{o}mica Relativa Padr\~{a}o/pt,Standard Relative Atomic Mass/en,Masse Atomique Relative Standard/fr,Relative Standard\-atommasse/de,Massa Atomica Relativa Standard/it,Masa At\'{o}mica Relativa Est\'{a}ndar/es,Massa At\^{o}mica Relativa Padr\~{a}o/br}% -\def\pgfPT@labels@Ar@w{Peso At\'{o}mico/pt,Atomic Weight/en,Poids Atomique/fr,Atom\-gewicht/de,Peso Atomico/it,Peso At\'{o}mico/es,Peso At\^{o}mico/br}% -\def\pgfPT@labels@Arstar@w{Peso At\'{o}mico Padr\~{a}o/pt,Standard Atomic Weight/en,Standard\-atomgewicht/de,Poids Atomique Standard/fr,Peso Atomico Standard/it,Peso At\'{o}mico Est\'{a}ndar/es,Peso At\^{o}mico Padr\~{a}o/br}% -\def\pgfPT@labels@radio{Radioativo/pt,Radioactive/en,Radioactif/fr,radioaktiv/de,Radioattivo/it,Radioactivo/es,Radioativo/br}% -\def\pgfPT@labels@R{Raio At\'{o}mico/pt,Atomic Radius/en,Rayon Ato\-mi\-que/fr,Atom\-radius/de,Raggio Atomico/it,Radio At\'{o}mico/es,Raio At\^{o}mico/br}% -\def\pgfPT@labels@Rcov{Raio \mbox{Covalente}/pt,Covalente Radius/en,Rayon Covalent/fr,Kovalenz\-radius/de,Raggio Covalente/it,Radio Covalente/es,Raio Covalente/br}% -\def\pgfPT@labels@Rion{Raio I\'{o}nico/pt,Ionic Radius/en,Rayon ionique/fr,Ionen\-radius/de,Raggio Ionico/it,Radio I\'{o}nico/es,Raio I\^{o}nico/br}% -\def\pgfPT@labels@Ei{Energia de Ioniza\c{c}\~{a}o/pt,Ionization Energy/en,\'{E}nergie d'Ionisation/fr,Ionisierungs\-energie/de,Energia di Ionizzazione/it,Energ\'{i}a de Ionizaci\'{o}n/es,Energia de Ioniza\c{c}\~{a}o/br}% -\def\pgfPT@labels@eneg{Eletrone\-gatividade/pt,Electrone\-gativity/en,\'{E}lectron\'{e}\-gativit\'{e}/fr,Elektro\-negativit\"{a}t/de,Elettrone\-gativit\`{a}/it,Electrone\-gatividad/es,Eletrone\-gatividade/br}% -\def\pgfPT@labels@eaff{Eletro\-afinidade/pt,Electro\-affinity/en,\'{E}lectro\-affinit\'{e}/fr,Elektro\-affinit\"{a}t/de,Elettro\-affinit\`{a}/it,Electro\-afinidad/es,Eletro\-afinidade/br}% -\def\pgfPT@labels@O{Estados de Oxida\c{c}\~{a}o/pt,Oxidation States/en,\'{E}tats d'Oxydation/fr,Oxidations\-zust\"{a}nde/de,Stati di \mbox{ossidazione}/it,Estados de Oxidaci\'{o}n/es,Estados de Oxida\c{c}\~{a}o/br}% -\def\pgfPT@labels@Tmelt{Ponto de Fus\~{a}o/pt,Melting Point/en,Point de Fusion/fr,Schmelz\-punkt/de,Punto di Fusione/it,Punto de Fusi\'{o}n/es,Ponto de Fus\~{a}o/br}% -\def\pgfPT@labels@TmeltC{Ponto de Fus\~{a}o/pt,Melting Point/en,Point de Fusion/fr,Schmelz\-punkt/de,Punto di Fusione/it,Punto de Fusi\'{o}n/es,Ponto de Fus\~{a}o/br}% -\def\pgfPT@labels@Tboil{Ponto de Ebuli\c{c}\~{a}o/pt,Boiling Point/en,Point d'\'{E}bullition/fr,Siede\-punkt/de,Punto di Ebollizione/it,Punto de Ebullici\'{o}n/es,Ponto de Ebuli\c{c}\~{a}o/br}% -\def\pgfPT@labels@TboilC{Ponto de Ebuli\c{c}\~{a}o/pt,Boiling Point/en,Point d'\'{E}bullition/fr,Siede\-punkt/de,\mbox{Punto di} \mbox{Ebollizione}/it,\mbox{Punto de} \mbox{Ebullici\'{o}n}/es,Ponto de Ebuli\c{c}\~{a}o/br}% -\def\pgfPT@labels@eDist{Distribui\c{c}\~{a}o Eletr\'{o}nica/pt,Electron \mbox{Distribuition}/en,Distribution d'\'{E}lectrons/fr,Elektronen\-verteilung/de,Distribuzione degli Elettroni/it,Distribuci\'{o}n de Electrones/es,Distribui\c{c}\~{a}o de El\'{e}trons/br}% -\def\pgfPT@labels@eConfig{Configura\c{c}\~{a}o Eletr\'{o}nica/pt,Electronic Configuration/en,Configuration \'{E}lectronique/fr,Elektronen\-konfiguration/de,Configurazione Elettronica/it,Configuraci\'{o}n Electr\'{o}nica/es,Configura\c{c}\~{a}o Eletr\^{o}nica/br}% +\def\pgfPT@labels@Z{N\'{u}mero At\'{o}mico/pt,Atomic \mbox{Number}/en,Num\'{e}ro \mbox{Atomique}/fr,Ord\-nungs\-zahl/de,Numero \mbox{Atomico}/it,N\'{u}mero \mbox{At\'{o}mico}/es,N\'{u}mero At\^{o}mico/br,\pgfPT@user@labels@Z/user}% +\def\pgfPT@labels@name{Nome/pt,Name/en,Nom/fr,Name/de,Nome/it,Nombre/es,Nome/br,\pgfPT@user@labels@name/user}% +\def\pgfPT@labels@CS{S\'{i}mbolo Qu\'{i}mico/pt,Chemical Symbol/en,Symbole Chimique/fr,Chemisches Symbol/de,Simbolo Chimico/it,S\'{i}mbolo Qu\'{i}mico/es,S\'{i}mbolo Qu\'{i}mico/br,\pgfPT@user@labels@CS/user}% +\def\pgfPT@labels@Ar@m{Massa \mbox{At\'{o}mica} Relativa/pt,Relative \mbox{Atomic} Mass/en,Masse \mbox{Atomique} Relative/fr,Relative Atom\-masse/de,Massa \mbox{Atomica} Relativa/it,Masa \mbox{At\'{o}mica} Relativa/es,Massa \mbox{At\^{o}mica} Relativa/br,\pgfPT@user@labels@Ar@m/user}% +\def\pgfPT@labels@Arstar@m{Massa At\'{o}mica Relativa Padr\~{a}o/pt,Standard Relative Atomic Mass/en,Masse Atomique Relative Standard/fr,Relative Standard\-atommasse/de,Massa Atomica Relativa Standard/it,Masa At\'{o}mica Relativa Est\'{a}ndar/es,Massa At\^{o}mica Relativa Padr\~{a}o/br,\pgfPT@user@labels@Arstar@m/user}% +\def\pgfPT@labels@Ar@w{Peso At\'{o}mico/pt,Atomic Weight/en,Poids Atomique/fr,Atom\-gewicht/de,Peso Atomico/it,Peso At\'{o}mico/es,Peso At\^{o}mico/br,\pgfPT@user@labels@Ar@w/user}% +\def\pgfPT@labels@Arstar@w{Peso At\'{o}mico Padr\~{a}o/pt,Standard Atomic Weight/en,Standard\-atomgewicht/de,Poids Atomique Standard/fr,Peso Atomico Standard/it,Peso At\'{o}mico Est\'{a}ndar/es,Peso At\^{o}mico Padr\~{a}o/br,\pgfPT@user@labels@Arstar@w/user}% +\def\pgfPT@labels@radio{Radioativo/pt,Radioactive/en,Radioactif/fr,radioaktiv/de,Radioattivo/it,Radioactivo/es,Radioativo/br,\pgfPT@user@labels@radio/user}% +\def\pgfPT@labels@R{Raio At\'{o}mico/pt,Atomic Radius/en,Rayon Ato\-mi\-que/fr,Atom\-radius/de,Raggio Atomico/it,Radio At\'{o}mico/es,Raio At\^{o}mico/br,\pgfPT@user@labels@R/user}% +\def\pgfPT@labels@Rcov{Raio \mbox{Covalente}/pt,Covalente Radius/en,Rayon Covalent/fr,Kovalenz\-radius/de,Raggio Covalente/it,Radio Covalente/es,Raio Covalente/br,\pgfPT@user@labels@Rcov/user}% +\def\pgfPT@labels@Rion{Raio I\'{o}nico/pt,Ionic Radius/en,Rayon ionique/fr,Ionen\-radius/de,Raggio Ionico/it,Radio I\'{o}nico/es,Raio I\^{o}nico/br,\pgfPT@user@labels@Rion/user}% +\def\pgfPT@labels@Ei{Energia de Ioniza\c{c}\~{a}o/pt,Ionization Energy/en,\'{E}nergie d'Ionisation/fr,Ionisierungs\-energie/de,Energia di Ionizzazione/it,Energ\'{i}a de Ionizaci\'{o}n/es,Energia de Ioniza\c{c}\~{a}o/br,\pgfPT@user@labels@Ei/user}% +\def\pgfPT@labels@eneg{Eletrone\-gatividade/pt,Electrone\-gativity/en,\'{E}lectron\'{e}\-gativit\'{e}/fr,Elektro\-negativit\"{a}t/de,Elettrone\-gativit\`{a}/it,Electrone\-gatividad/es,Eletrone\-gatividade/br,\pgfPT@user@labels@eneg/user}% +\def\pgfPT@labels@eaff{Eletro\-afinidade/pt,Electro\-affinity/en,\'{E}lectro\-affinit\'{e}/fr,Elektro\-affinit\"{a}t/de,Elettro\-affinit\`{a}/it,Electro\-afinidad/es,Eletro\-afinidade/br,\pgfPT@user@labels@eaff/user}% +\def\pgfPT@labels@O{Estados de Oxida\c{c}\~{a}o/pt,Oxidation States/en,\'{E}tats d'Oxydation/fr,Oxidations\-zust\"{a}nde/de,Stati di \mbox{ossidazione}/it,Estados de Oxidaci\'{o}n/es,Estados de Oxida\c{c}\~{a}o/br,\pgfPT@user@labels@O/user}% +\def\pgfPT@labels@Tmelt{Ponto de Fus\~{a}o/pt,Melting Point/en,Point de Fusion/fr,Schmelz\-punkt/de,Punto di Fusione/it,Punto de Fusi\'{o}n/es,Ponto de Fus\~{a}o/br,\pgfPT@user@labels@Tmelt/user}% +\def\pgfPT@labels@TmeltC{Ponto de Fus\~{a}o/pt,Melting Point/en,Point de Fusion/fr,Schmelz\-punkt/de,Punto di Fusione/it,Punto de Fusi\'{o}n/es,Ponto de Fus\~{a}o/br,\pgfPT@user@labels@TmeltC/user}% +\def\pgfPT@labels@Tboil{Ponto de Ebuli\c{c}\~{a}o/pt,Boiling Point/en,Point d'\'{E}bullition/fr,Siede\-punkt/de,Punto di Ebollizione/it,Punto de Ebullici\'{o}n/es,Ponto de Ebuli\c{c}\~{a}o/br,\pgfPT@user@labels@Tboil/user}% +\def\pgfPT@labels@TboilC{Ponto de Ebuli\c{c}\~{a}o/pt,Boiling Point/en,Point d'\'{E}bullition/fr,Siede\-punkt/de,\mbox{Punto di} \mbox{Ebollizione}/it,\mbox{Punto de} \mbox{Ebullici\'{o}n}/es,Ponto de Ebuli\c{c}\~{a}o/br,\pgfPT@user@labels@TboilC/user}% +\def\pgfPT@labels@eDist{Distribui\c{c}\~{a}o Eletr\'{o}nica/pt,Electron \mbox{Distribution}/en,Distribution d'\'{E}lectrons/fr,Elektronen\-verteilung/de,Distribuzione degli Elettroni/it,Distribuci\'{o}n de Electrones/es,Distribui\c{c}\~{a}o de El\'{e}trons/br,\pgfPT@user@labels@eDist/user}% +\def\pgfPT@labels@eConfig{Configura\c{c}\~{a}o Eletr\'{o}nica/pt,Electronic Configuration/en,Configuration \'{E}lectronique/fr,Elektronen\-konfiguration/de,Configurazione Elettronica/it,Configuraci\'{o}n Electr\'{o}nica/es,Configura\c{c}\~{a}o Eletr\^{o}nica/br,\pgfPT@user@labels@eConfig/user}% \let\pgfPT@labels@eConfign\pgfPT@labels@eConfig% \let\pgfPT@labels@eConfignl\pgfPT@labels@eConfig% -\def\pgfPT@labels@d{Densidade/pt,Density/en,Densit\'{e}/fr,Dichte/de,Densit\`{a}/it,Densidad/es,Densidade/br}% -\def\pgfPT@labels@Cp{Calor \mbox{Espec\'{i}fico}/pt,\mbox{Specific Heat} Capacity/en,Capacit\'{e} \mbox{Thermique} \mbox{Sp\'{e}cifique}/fr,Spezifische \mbox{W\"{a}rme\-kapazit\"{a}t}/de,Calore specifico/it,Calor \mbox{Espec\'{i}fico}/es,Calor \mbox{Espec\'{i}fico}/br}% -\def\pgfPT@labels@kT{Condutividade T\'{e}rmica/pt,Thermal \mbox{Condutivity}/en,Conductivit\'{e} \mbox{Thermique}/fr,W\"{a}rme\-leit\-f\"{a}higkeit/de,Conducibilit\`{a} Termica/it,Condutividad T\'{e}rmica/es,Condutividade T\'{e}rmica/br}% -\def\pgfPT@labels@ls{Estrutura da Rede Cristalina/pt,Lattice Structure/en,Structure de R\'{e}seau Cristaline/fr,Gitter\-struktur/de,Struttura Reticolare/it,Estructura Reticular/es,Estrutura da Rede Cristalina/br}% -\def\pgfPT@labels@lsa{Constante da Rede: a/pt,Lattice constant: a/en,Constante \mbox{de R\'{e}seau}: a/fr,Gitter\-konstante: a/de,Costante \mbox{Reticolare}: a/it,Constante de la Reticula: a/es,Constante da Rede: a/br}% -\def\pgfPT@labels@lsb{Constante da Rede: b/pt,Lattice constant: b/en,Constante \mbox{de R\'{e}seau}: b/fr,Gitter\-konstante: b/de,Costante \mbox{Reticolare}: b/it,Constante de la Reticula: b/es,Constante da Rede: b/br}% -\def\pgfPT@labels@lsc{Constante da Rede: c/pt,Lattice constant: c/en,Constante \mbox{de R\'{e}seau}: c/fr,Gitter\-konstante: c/de,Costante \mbox{Reticolare}: c/it,Constante de la Reticula: c/es,Constante da Rede: c/br}% -\def\pgfPT@labels@lsca{Raz\~{a}o c\mbox{/}a da Rede/pt,Lattice c\mbox{/}a ratio/en,Rapport c\mbox{/}a du R\'{e}seau/fr,Gitter c\mbox{/}a-Verh\"{a}ltnis/de,Rapporto c\mbox{/}a del Reticolo/it,Relaci\'{o}n c\mbox{/}a de la Reticula/es,Raz\~{a}o c\mbox{/}a da Rede/br}% -\def\pgfPT@labels@DiscY{Ano da \mbox{Descoberta}/pt,Year of \mbox{Discovery}/en,\mbox{Ann\'{e}e de la} \mbox{D\'{e}couverte}/fr,Jahr der Entdeckung/de,\mbox{Anno della} Scoperta/it,A\~{n}o del Descubri\-miento/es,Ano da \mbox{Descoberta}/br}% +\def\pgfPT@labels@d{Densidade/pt,Density/en,Densit\'{e}/fr,Dichte/de,Densit\`{a}/it,Densidad/es,Densidade/br,\pgfPT@user@labels@d/user}% +\def\pgfPT@labels@Cp{Calor \mbox{Espec\'{i}fico}/pt,\mbox{Specific Heat} Capacity/en,Capacit\'{e} \mbox{Thermique} \mbox{Sp\'{e}cifique}/fr,Spezifische \mbox{W\"{a}rme\-kapazit\"{a}t}/de,Calore specifico/it,Calor \mbox{Espec\'{i}fico}/es,Calor \mbox{Espec\'{i}fico}/br,\pgfPT@user@labels@Cp/user}% +\def\pgfPT@labels@kT{Condutividade T\'{e}rmica/pt,Thermal \mbox{Conductivity}/en,Conductivit\'{e} \mbox{Thermique}/fr,W\"{a}rme\-leit\-f\"{a}higkeit/de,Conducibilit\`{a} Termica/it,Condutividad T\'{e}rmica/es,Condutividade T\'{e}rmica/br,\pgfPT@user@labels@kT/user}% +\def\pgfPT@labels@ls{Estrutura da Rede Cristalina/pt,Lattice Structure/en,Structure de R\'{e}seau Cristaline/fr,Gitter\-struktur/de,Struttura Reticolare/it,Estructura Reticular/es,Estrutura da Rede Cristalina/br,\pgfPT@user@labels@ls/user}% +\def\pgfPT@labels@lsa{Constante da Rede: a/pt,Lattice constant: a/en,Constante \mbox{de R\'{e}seau}: a/fr,Gitter\-konstante: a/de,Costante \mbox{Reticolare}: a/it,Constante de la Reticula: a/es,Constante da Rede: a/br,\pgfPT@user@labels@lsa/user}% +\def\pgfPT@labels@lsb{Constante da Rede: b/pt,Lattice constant: b/en,Constante \mbox{de R\'{e}seau}: b/fr,Gitter\-konstante: b/de,Costante \mbox{Reticolare}: b/it,Constante de la Reticula: b/es,Constante da Rede: b/br,\pgfPT@user@labels@lsb/user}% +\def\pgfPT@labels@lsc{Constante da Rede: c/pt,Lattice constant: c/en,Constante \mbox{de R\'{e}seau}: c/fr,Gitter\-konstante: c/de,Costante \mbox{Reticolare}: c/it,Constante de la Reticula: c/es,Constante da Rede: c/br,\pgfPT@user@labels@lsc/user}% +\def\pgfPT@labels@lsca{Raz\~{a}o c\mbox{/}a da Rede/pt,Lattice c\mbox{/}a ratio/en,Rapport c\mbox{/}a du R\'{e}seau/fr,Gitter c\mbox{/}a-Verh\"{a}ltnis/de,Rapporto c\mbox{/}a del Reticolo/it,Relaci\'{o}n c\mbox{/}a de la Reticula/es,Raz\~{a}o c\mbox{/}a da Rede/br,\pgfPT@user@labels@lsca/user}% +\def\pgfPT@labels@DiscY{Ano da \mbox{Descoberta}/pt,Year of \mbox{Discovery}/en,\mbox{Ann\'{e}e de la} \mbox{D\'{e}couverte}/fr,Jahr der Entdeckung/de,\mbox{Anno della} Scoperta/it,A\~{n}o del Descubri\-miento/es,Ano da \mbox{Descoberta}/br,\pgfPT@user@labels@DiscY/user}% \def\pgfPT@labels@BC@en{BC}% \def\pgfPT@labels@BC@pt{a.C.}% \def\pgfPT@labels@BC@fr{av.J-C.}% @@ -59,71 +60,72 @@ \def\pgfPT@labels@BC@it{a.C.}% \def\pgfPT@labels@BC@es{a.C.}% \def\pgfPT@labels@BC@br{a.C.}% -\def\pgfPT@labels@DiscC{Pa\'{i}s da \mbox{Descoberta}/pt,\mbox{Country of} \mbox{Discovery}/en,Pays de \mbox{D\'{e}couverte}/fr,Land der Entdeckung/de,Paese di Scoperta/it,Pa\'{i}s de Descubri\-miento/es,Pa\'{i}s da \mbox{Descoberta}/br}% -\def\pgfPT@labels@spectra{Espetro de Emiss\~{a}o/pt,Emission Spectrum/en,Spectre d'\'{E}mission/fr,Emissions\-spektrum/de,Spettro di \mbox{Emissione}/it,Espectro de Emisi\'{o}n/es,Espectro de Emiss\~{a}o/br}% +\def\pgfPT@labels@BC@user{\pgfPT@user@labels@BC}% +\def\pgfPT@labels@DiscC{Pa\'{i}s da \mbox{Descoberta}/pt,\mbox{Country of} \mbox{Discovery}/en,Pays de \mbox{D\'{e}couverte}/fr,Land der Entdeckung/de,Paese di Scoperta/it,Pa\'{i}s de Descubri\-miento/es,Pa\'{i}s da \mbox{Descoberta}/br,\pgfPT@user@labels@DiscC/user}% +\def\pgfPT@labels@spectra{Espetro de Emiss\~{a}o/pt,Emission Spectrum/en,Spectre d'\'{E}mission/fr,Emissions\-spektrum/de,Spettro di \mbox{Emissione}/it,Espectro de Emisi\'{o}n/es,Espectro de Emiss\~{a}o/br,\pgfPT@user@labels@spectra/user}% % acronyms for legend: -\def\pgfPT@acr@Z{Z/pt,Z/en,Z/fr,Z/de,Z/it,Z/es,Z/br}% -\def\pgfPT@acr@name{N/pt,N/en,N/fr,N/de,N/it,N/es,N/br}% -\def\pgfPT@acr@CS{SQ/pt,CS/en,SC/fr,CS/de,SC/it,SQ/es,SQ/br}% -\def\pgfPT@acr@Ar{Ar/pt,Ar/en,Ar/fr,Ar/de,Ar/it,Ar/es,Ar/br}% -\def\pgfPT@acr@Arstar{Ar/pt,Ar/en,Ar/fr,Ar/de,Ar/it,Ar/es,Ar/br}% -\def\pgfPT@acr@radio{Ra/pt,Ra/en,Ra/fr,Ra/de,Ra/it,Ra/es,Ra/br}% -\def\pgfPT@acr@R{R/pt,R/en,R/fr,R/de,R/it,R/es,R/br}% -\def\pgfPT@acr@Rcov{Rc/pt,Rc/en,Rc/fr,Rc/de,Rc/it,Rc/es,Rc/br}% -\def\pgfPT@acr@Rion{Ri/pt,Ri/en,Ri/fr,Ri/de,Ri/it,Ri/es,Ri/br}% -\def\pgfPT@acr@Ei{Ei/pt,Ei/en,Ei/fr,Ei/de,Ei/it,Ei/es,Ei/br}% -\def\pgfPT@acr@eneg{en/pt,en/en,en/fr,en/de,en/it,en/es,en/br}% -\def\pgfPT@acr@eaff{Eea/pt,Eea/en,Eea/fr,Eea/de,Eea/it,Eea/es,Eea/br}% -\def\pgfPT@acr@O{O/pt,O/en,O/fr,O/de,O/it,O/es,O/br}% -\def\pgfPT@acr@Tmelt{Pf/pt,MP/en,Pf/fr,smp/de,Pf/it,Pf/es,Pf/br}% -\def\pgfPT@acr@TmeltC{Pf/pt,MP/en,Pf/fr,smp/de,Pf/it,Pf/es,Pf/br}% -\def\pgfPT@acr@Tboil{Pe/pt,BP/en,Pe/fr,sdp/de,Pe/it,Pe/es,Pe/br}% -\def\pgfPT@acr@TboilC{Pe/pt,BP/en,Pe/fr,sdp/de,Pe/it,Pe/es,Pe/br}% -\def\pgfPT@acr@eDist{de/pt,ed/en,de/fr,ev/de,de/it,de/es,de/br}% -\def\pgfPT@acr@eConfign{ce/pt,ec/en,ce/fr,ek/de,ce/it,ce/es,ce/br}% -\def\pgfPT@acr@eConfignl{ce/pt,ec/en,ce/fr,ek/de,ce/it,ce/es,ce/br}% -\def\pgfPT@acr@d{d/pt,d/en,d/fr,d/de,d/it,d/es,d/br}% -\def\pgfPT@acr@Cp{Cp/pt,Cp/en,Cp/fr,Cp/de,Cp/it,Cp/es,Cp/br}% -\def\pgfPT@acr@kT{kT/pt,kT/en,kT/fr,kT/de,kT/it,kT/es,kT/br}% -\def\pgfPT@acr@ls{er/pt,ls/en,sr/fr,gs/de,sr/it,er/es,er/br}% -\def\pgfPT@acr@lsa{er a/pt,ls a/en,sr a/fr,gs a/de,sr a/it,er a/es,er a/br}% -\def\pgfPT@acr@lsb{er b/pt,ls b/en,sr b/fr,gs b/de,sr b/it,er b/es,er b/br}% -\def\pgfPT@acr@lsc{er c/pt,ls c/en,sr c/fr,gs c/de,sr c/it,er c/es,er c/br}% -\def\pgfPT@acr@lsca{er ca/pt,ls ca/en,sr ca/fr,gs ca/de,sr ca/it,er ca/es,er ca/br}% -\def\pgfPT@acr@DiscY{ad/pt,yd/en,ad/fr,je/de,as/it,ad/es,ad/br}% -\def\pgfPT@acr@DiscC{pd/pt,cd/en,pa/fr,le/de,ps/it,pd/es,pd/br}% -\def\pgfPT@acr@spectra{ee/pt,es/en,se/fr,es/de,se/it,ee/es,ee/br}% +\def\pgfPT@acr@Z{Z/pt,Z/en,Z/fr,Z/de,Z/it,Z/es,Z/br,Z/user}% +\def\pgfPT@acr@name{N/pt,N/en,N/fr,N/de,N/it,N/es,N/br,\pgfPT@user@acr@name/user}% +\def\pgfPT@acr@CS{SQ/pt,CS/en,SC/fr,CS/de,SC/it,SQ/es,SQ/br,\pgfPT@user@acr@CS/user}% +\def\pgfPT@acr@Ar{Ar/pt,Ar/en,Ar/fr,Ar/de,Ar/it,Ar/es,Ar/br,Ar/user}% +\def\pgfPT@acr@Arstar{Ar/pt,Ar/en,Ar/fr,Ar/de,Ar/it,Ar/es,Ar/br,Ar/user}% +\def\pgfPT@acr@radio{Ra/pt,Ra/en,Ra/fr,Ra/de,Ra/it,Ra/es,Ra/br,\pgfPT@user@acr@radio/user}% +\def\pgfPT@acr@R{R/pt,R/en,R/fr,R/de,R/it,R/es,R/br,R/user}% +\def\pgfPT@acr@Rcov{Rc/pt,Rc/en,Rc/fr,Rc/de,Rc/it,Rc/es,Rc/br,Rc/user}% +\def\pgfPT@acr@Rion{Ri/pt,Ri/en,Ri/fr,Ri/de,Ri/it,Ri/es,Ri/br,Ri/user}% +\def\pgfPT@acr@Ei{Ei/pt,Ei/en,Ei/fr,Ei/de,Ei/it,Ei/es,Ei/br,Ei/user}% +\def\pgfPT@acr@eneg{en/pt,en/en,en/fr,en/de,en/it,en/es,en/br,en/user}% +\def\pgfPT@acr@eaff{Eea/pt,Eea/en,Eea/fr,Eea/de,Eea/it,Eea/es,Eea/br,Eaa/user}% +\def\pgfPT@acr@O{O/pt,O/en,O/fr,O/de,O/it,O/es,O/br,O/user}% +\def\pgfPT@acr@Tmelt{Pf/pt,MP/en,Pf/fr,smp/de,Pf/it,Pf/es,Pf/br,\pgfPT@user@acr@Tmelt/user}% +\def\pgfPT@acr@TmeltC{Pf/pt,MP/en,Pf/fr,smp/de,Pf/it,Pf/es,Pf/br,\pgfPT@user@acr@Tmelt/user}% +\def\pgfPT@acr@Tboil{Pe/pt,BP/en,Pe/fr,sdp/de,Pe/it,Pe/es,Pe/br,\pgfPT@user@acr@Tboil/user}% +\def\pgfPT@acr@TboilC{Pe/pt,BP/en,Pe/fr,sdp/de,Pe/it,Pe/es,Pe/br,\pgfPT@user@acr@Tboil/user}% +\def\pgfPT@acr@eDist{de/pt,ed/en,de/fr,ev/de,de/it,de/es,de/br,\pgfPT@user@acr@eDist/user}% +\def\pgfPT@acr@eConfign{ce/pt,ec/en,ce/fr,ek/de,ce/it,ce/es,ce/br,\pgfPT@user@acr@eConfign/user}% +\def\pgfPT@acr@eConfignl{ce/pt,ec/en,ce/fr,ek/de,ce/it,ce/es,ce/br,\pgfPT@user@acr@eConfign/user}% +\def\pgfPT@acr@d{d/pt,d/en,d/fr,d/de,d/it,d/es,d/br,d/user}% +\def\pgfPT@acr@Cp{Cp/pt,Cp/en,Cp/fr,Cp/de,Cp/it,Cp/es,Cp/br,Cp/user}% +\def\pgfPT@acr@kT{kT/pt,kT/en,kT/fr,kT/de,kT/it,kT/es,kT/br,kT/user}% +\def\pgfPT@acr@ls{er/pt,ls/en,sr/fr,gs/de,sr/it,er/es,er/br,\pgfPT@user@acr@ls/user}% +\def\pgfPT@acr@lsa{er a/pt,ls a/en,sr a/fr,gs a/de,sr a/it,er a/es,er a/br,\pgfPT@user@acr@lsa/user}% +\def\pgfPT@acr@lsb{er b/pt,ls b/en,sr b/fr,gs b/de,sr b/it,er b/es,er b/br,\pgfPT@user@acr@lsb/user}% +\def\pgfPT@acr@lsc{er c/pt,ls c/en,sr c/fr,gs c/de,sr c/it,er c/es,er c/br,\pgfPT@user@acr@lsc/user}% +\def\pgfPT@acr@lsca{er ca/pt,ls ca/en,sr ca/fr,gs ca/de,sr ca/it,er ca/es,er ca/br,\pgfPT@user@acr@lsca/user}% +\def\pgfPT@acr@DiscY{ad/pt,yd/en,ad/fr,je/de,as/it,ad/es,ad/br,\pgfPT@user@acr@DiscY/user}% +\def\pgfPT@acr@DiscC{pd/pt,cd/en,pa/fr,le/de,ps/it,pd/es,pd/br,\pgfPT@user@acr@DiscC/user}% +\def\pgfPT@acr@spectra{ee/pt,es/en,se/fr,es/de,se/it,ee/es,ee/br,\pgfPT@user@acr@spectra/user}% % BLOCOS -\def\pgfPT@labels@blocos{Bloco s/pt,s-block/en,Bloc s/fr,s-Block/de,Blocco s/it,Bloque s/es,Bloco s/br}% -\def\pgfPT@labels@blocop{Bloco p/pt,p-block/en,Bloc p/fr,p-Block/de,Blocco p/it,Bloque p/es,Bloco p/br}% -\def\pgfPT@labels@blocod{Bloco d/pt,d-block/en,Bloc d/fr,d-Block/de,Blocco d/it,Bloque d/es,Bloco d/br}% -\def\pgfPT@labels@blocof{Bloco f/pt,f-block/en,Bloc f/fr,f-Block/de,Blocco f/it,Bloque f/es,Bloco f/br}% +\def\pgfPT@labels@blocos{Bloco s/pt,s-block/en,Bloc s/fr,s-Block/de,Blocco s/it,Bloque s/es,Bloco s/br,\pgfPT@user@labels@blocos/user}% +\def\pgfPT@labels@blocop{Bloco p/pt,p-block/en,Bloc p/fr,p-Block/de,Blocco p/it,Bloque p/es,Bloco p/br,\pgfPT@user@labels@blocop/user}% +\def\pgfPT@labels@blocod{Bloco d/pt,d-block/en,Bloc d/fr,d-Block/de,Blocco d/it,Bloque d/es,Bloco d/br,\pgfPT@user@labels@blocod/user}% +\def\pgfPT@labels@blocof{Bloco f/pt,f-block/en,Bloc f/fr,f-Block/de,Blocco f/it,Bloque f/es,Bloco f/br,\pgfPT@user@labels@blocof/user}% % FAMILIAS -\def\pgfPT@labels@blocor{ELEMENTOS REPRESENTATIVOS/pt,REPRESENTATIVE ELEMENTS/en,\'{E}L\'{E}MENTS DU GROUPE PRINCIPAL/fr,HAUPTGRUPPENELEMENTE/de,ELEMENTI RAPPRESENTATIVI/it,ELEMENTOS REPRESENTATIVOS/es,ELEMENTOS REPRESENTATIVOS/br}% -\def\pgfPT@labels@blocot{METAIS DE TRANSI\c{C}\~{A}O/pt,TRANSITION METALS/en,M\'{E}TAUX DE TRANSITION/fr,\"{U}BERGANGSMETALLE/de,METALLI DI TRANSIZIONE/it,METALES DE TRANSICI\'{O}N/es,METAIS DE TRANSI\c{C}\~{A}O/br}% -\def\pgfPT@labels@blocoi{METAIS DE TRANSI\c{C}\~{A}O INTERNOS/pt,INTERNAL TRANSITION METALS/en,M\'{E}TAUX DE TRANSITION INTERNES/fr,INTERNE \"{U}BERGANGSMETALLE/de,METALLI DI TRANSIZIONE INTERNI/it,METALES DE TRANSICI\'{O}N INTERNOS/es,METAIS DE TRANSI\c{C}\~{A}O INTERNOS/br}% +\def\pgfPT@labels@blocor{ELEMENTOS REPRESENTATIVOS/pt,REPRESENTATIVE ELEMENTS/en,\'{E}L\'{E}MENTS DU GROUPE PRINCIPAL/fr,HAUPTGRUPPENELEMENTE/de,ELEMENTI RAPPRESENTATIVI/it,ELEMENTOS REPRESENTATIVOS/es,ELEMENTOS REPRESENTATIVOS/br,\pgfPT@user@labels@blocor/user}% +\def\pgfPT@labels@blocot{METAIS DE TRANSI\c{C}\~{A}O/pt,TRANSITION METALS/en,M\'{E}TAUX DE TRANSITION/fr,\"{U}BERGANGSMETALLE/de,METALLI DI TRANSIZIONE/it,METALES DE TRANSICI\'{O}N/es,METAIS DE TRANSI\c{C}\~{A}O/br,\pgfPT@user@labels@blocot/user}% +\def\pgfPT@labels@blocoi{METAIS DE TRANSI\c{C}\~{A}O INTERNOS/pt,INTERNAL TRANSITION METALS/en,M\'{E}TAUX DE TRANSITION INTERNES/fr,INTERNE \"{U}BERGANGSMETALLE/de,METALLI DI TRANSIZIONE INTERNI/it,METALES DE TRANSICI\'{O}N INTERNOS/es,METAIS DE TRANSI\c{C}\~{A}O INTERNOS/br,\pgfPT@user@labels@blocoi/user}% % VARIACOES -\def\pgfPT@labels@Raum{O raio at\'{o}mico aumenta ao longo do grupo/pt,The atomic radius increases along the group/en,Le rayon atomique augmente le long du groupe/fr,Der Atomradius nimmt entlang der Gruppe zu/de,Il raggio atomico aumenta lungo il gruppo/it,El radio at\'{o}mico aumenta a lo largo del grupo/es,O raio at\^{o}mico aumenta ao longo do grupo/br}% -\def\pgfPT@labels@Rdim{O raio at\'{o}mico diminui ao longo do per\'{i}odo/pt,The atomic radius decreases over the period/en,Le rayon atomique diminue au cours de la p\'{e}riode/fr,Der Atomradius nimmt mit der Periode ab/de,Il raggio atomico diminuisce nel periodo/it,El radio at\'{o}mico disminuye a lo largo del per\'{i}odo/es,O raio at\^{o}mico diminui ao longo do per\'{i}odo/br}% -\def\pgfPT@labels@Eiaum{A energia de ioniza\c{c}\~{a}o aumenta ao longo do per\'{i}odo/pt,The ionization energy increases over the period/en,L'\'{e}nergie d'ionisation augmente au cours de la p\'{e}riode/fr,Die Ionisationsenergie nimmt mit der Periode zu/de,L'energia di ionizzazione aumenta nel periodo/it,La energ\'{i}a de ionizaci\'{o}n aumenta a lo largo del per\'{i}odo/es,A energia de ioniza\c{c}\~{a}o aumenta ao longo do per\'{i}odo/br}% -\def\pgfPT@labels@Eidim{A energia de ioniza\c{c}\~{a}o diminui ao longo do grupo/pt,The ionization energy decreases along the group/en,L'\'{e}nergie d'ionisation diminue le long du groupe/fr,Die Ionisationsenergie nimmt entlang der Gruppe ab/de,L'energia di ionizzazione diminuisce lungo il gruppo/it,La energ\'{i}a de ionizaci\'{o}n disminuye a lo largo del grupo/es,A energia de ioniza\c{c}\~{a}o diminui ao longo do grupo/br}% -\def\pgfPT@labels@eaffaum{A eletroafinidade aumenta ao longo do per\'{i}odo/pt,The electron affinity increases over the period/en,L'\'{e}lectroaffinit\'{e} augmente au cours de la p\'{e}riode/fr,Die Elektroaffinit\"{a}t nimmt mit der Periode zu/de,L'elettroaffinit\`{a} di ionizzazione aumenta nel periodo/it,La electroafinidad aumenta a lo largo del per\'{i}odo/es,A eletroafinidade aumenta ao longo do per\'{i}odo/br}% -\def\pgfPT@labels@eaffdim{A eletroafinidade diminui ao longo do grupo/pt,The electron affinity decreases along the group/en,L'\'{e}lectroaffinit\'{e} diminue le long du groupe/fr,Die Elektroaffinit\"{a}t nimmt entlang der Gruppe ab/de,L'elettroaffinit\`{a} diminuisce lungo il gruppo/it,La electroafinidad disminuye a lo largo del grupo/es,A eletroafinidade diminui ao longo do grupo/br}% +\def\pgfPT@labels@Raum{O raio at\'{o}mico aumenta ao longo do grupo/pt,The atomic radius increases along the group/en,Le rayon atomique augmente le long du groupe/fr,Der Atomradius nimmt entlang der Gruppe zu/de,Il raggio atomico aumenta lungo il gruppo/it,El radio at\'{o}mico aumenta a lo largo del grupo/es,O raio at\^{o}mico aumenta ao longo do grupo/br,\pgfPT@user@labels@Raum/user}% +\def\pgfPT@labels@Rdim{O raio at\'{o}mico diminui ao longo do per\'{i}odo/pt,The atomic radius decreases over the period/en,Le rayon atomique diminue au cours de la p\'{e}riode/fr,Der Atomradius nimmt mit der Periode ab/de,Il raggio atomico diminuisce nel periodo/it,El radio at\'{o}mico disminuye a lo largo del per\'{i}odo/es,O raio at\^{o}mico diminui ao longo do per\'{i}odo/br,\pgfPT@user@labels@Rdim/user}% +\def\pgfPT@labels@Eiaum{A energia de ioniza\c{c}\~{a}o aumenta ao longo do per\'{i}odo/pt,The ionization energy increases over the period/en,L'\'{e}nergie d'ionisation augmente au cours de la p\'{e}riode/fr,Die Ionisationsenergie nimmt mit der Periode zu/de,L'energia di ionizzazione aumenta nel periodo/it,La energ\'{i}a de ionizaci\'{o}n aumenta a lo largo del per\'{i}odo/es,A energia de ioniza\c{c}\~{a}o aumenta ao longo do per\'{i}odo/br,\pgfPT@user@labels@Eiaum/user}% +\def\pgfPT@labels@Eidim{A energia de ioniza\c{c}\~{a}o diminui ao longo do grupo/pt,The ionization energy decreases along the group/en,L'\'{e}nergie d'ionisation diminue le long du groupe/fr,Die Ionisationsenergie nimmt entlang der Gruppe ab/de,L'energia di ionizzazione diminuisce lungo il gruppo/it,La energ\'{i}a de ionizaci\'{o}n disminuye a lo largo del grupo/es,A energia de ioniza\c{c}\~{a}o diminui ao longo do grupo/br,\pgfPT@user@labels@Eidim/user}% +\def\pgfPT@labels@eaffaum{A eletroafinidade aumenta ao longo do per\'{i}odo/pt,The electron affinity increases over the period/en,L'\'{e}lectroaffinit\'{e} augmente au cours de la p\'{e}riode/fr,Die Elektroaffinit\"{a}t nimmt mit der Periode zu/de,L'elettroaffinit\`{a} di ionizzazione aumenta nel periodo/it,La electroafinidad aumenta a lo largo del per\'{i}odo/es,A eletroafinidade aumenta ao longo do per\'{i}odo/br,\pgfPT@user@labels@eaffaum/user}% +\def\pgfPT@labels@eaffdim{A eletroafinidade diminui ao longo do grupo/pt,The electron affinity decreases along the group/en,L'\'{e}lectroaffinit\'{e} diminue le long du groupe/fr,Die Elektroaffinit\"{a}t nimmt entlang der Gruppe ab/de,L'elettroaffinit\`{a} diminuisce lungo il gruppo/it,La electroafinidad disminuye a lo largo del grupo/es,A eletroafinidade diminui ao longo do grupo/br,\pgfPT@user@labels@eaffdim/user}% % %%%%%%%%%%%%%%% Lattice Names %%%%%%%%%%%%%%%%%%%%%%% -\def\pgfPT@labels@ls@bcc{c\'{u}bica de corpo centrado/pt,body centered cubic/en,cubique centr\'{e}e/fr,kubisch raumzentriert/de,cubico a corpo centrato/it,c\'{u}bica centrado/es,c\'{u}bica de corpo centrado/br}% -\def\pgfPT@labels@ls@bcort{ortorr\^{o}mbica de bases centradas/pt,base centered orthorhombic/en,orthorhombique \`{a} base centr\'{e}e/fr,orthorhombisch basiszentriert/de,ortorombico a base centrata/it,ortorr\'{o}mbico con bases centradas/es,ortorr\^{o}mbica de bases centradas/br}% -\def\pgfPT@labels@ls@ctetr{tetragonal de corpo centrado/pt,body centered tetragonal/en,quadratique centr\'{e}e/fr,tetragonal innenzentriert/de,tetragonale a corpo centrato/it,tetragonal centrado/es,tetragonal de corpo centrado/br}% -\def\pgfPT@labels@ls@dia{diamante/pt,diamond/en,diamant/fr,diamant/de,diamante/it,diamante/es,diamante/br}% -\def\pgfPT@labels@ls@fcc{c\'{u}bica de faces centradas/pt,face centered cubic/en,cubique \`{a} faces centr\'{e}es/fr,kubisch fl\"{a}chenzentriert/de,cubico a facce centrate/it,c\'{u}bica centrada en las caras/es,c\'{u}bica de faces centradas/br}% -\def\pgfPT@labels@ls@fcort{ortorr\^{o}mbica de faces centradas/pt,face centered orthorhombic/en,orthorhombique \`{a} faces centr\'{e}es/fr,orthorhombisch fl\"{a}chenzentriert/de,ortorombico a facce centrate/it,ortorr\'{o}mbica centrada en la cara/es,ortorr\^{o}mbica de faces centradas/br}% -\def\pgfPT@labels@ls@hcp{hexagonal compacta/pt,hexagonal close packed/en,hexagonal compact/fr,hexagonal-dichteste Packung/de,esagonale compatto/it,empaquetado hexagonal cerrado/es,hexagonal compacta/br}% -\def\pgfPT@labels@ls@hex{hexagonal /pt,hexagonal/en,hexagonal/fr,hexagonal/de,esagonale/it,hexagonal/es,hexagonal /br}% -\def\pgfPT@labels@ls@mono{monocl\'{i}nica/pt,monoclinic/en,monoclinique/fr,monoklin/de,monoclino/it,monocl\'{i}nico/es,monocl\'{i}nica/br}% -\def\pgfPT@labels@ls@rho{rombo\'{e}drica/pt,rhombohedral/en,rhombo\'{e}drique/fr,rhomboedrisch/de,romboedrico/it,rombo\'{e}drico/es,rombo\'{e}drica/br}% -\def\pgfPT@labels@ls@sc{c\'{u}bica simples/pt,simple cubic/en,cubique simple/fr,kubisch primitiv/de,cubico semplice/it,c\'{u}bica simple/es,c\'{u}bica simples/br}% -\def\pgfPT@labels@ls@tric{tricl\'{i}nica simples/pt,simple triclinic/en,triclinique simple/fr,triklin/de,triclino/it,tricl\'{i}nica simple/es,tricl\'{i}nica simples/br}% -\def\pgfPT@labels@ls@tetr{tetragonal/pt,tetragonal/en,quadratique/fr,tetragonal/de,tetragonale/it,tetragonal/es,tetragonal/br}% +\def\pgfPT@labels@ls@bcc{c\'{u}bica de corpo centrado/pt,body centered cubic/en,cubique centr\'{e}e/fr,kubisch raumzentriert/de,cubico a corpo centrato/it,c\'{u}bica centrado/es,c\'{u}bica de corpo centrado/br,\pgfPT@user@labels@ls@bcc/user}% +\def\pgfPT@labels@ls@bcort{ortorr\^{o}mbica de bases centradas/pt,base centered orthorhombic/en,orthorhombique \`{a} base centr\'{e}e/fr,orthorhombisch basiszentriert/de,ortorombico a base centrata/it,ortorr\'{o}mbico con bases centradas/es,ortorr\^{o}mbica de bases centradas/br,\pgfPT@user@labels@ls@bcort/user}% +\def\pgfPT@labels@ls@ctetr{tetragonal de corpo centrado/pt,body centered tetragonal/en,quadratique centr\'{e}e/fr,tetragonal innenzentriert/de,tetragonale a corpo centrato/it,tetragonal centrado/es,tetragonal de corpo centrado/br,\pgfPT@user@labels@ls@ctetr/user}% +\def\pgfPT@labels@ls@dia{diamante/pt,diamond/en,diamant/fr,diamant/de,diamante/it,diamante/es,diamante/br,\pgfPT@user@labels@ls@dia/user}% +\def\pgfPT@labels@ls@fcc{c\'{u}bica de faces centradas/pt,face centered cubic/en,cubique \`{a} faces centr\'{e}es/fr,kubisch fl\"{a}chenzentriert/de,cubico a facce centrate/it,c\'{u}bica centrada en las caras/es,c\'{u}bica de faces centradas/br,\pgfPT@user@labels@ls@fcc/user}% +\def\pgfPT@labels@ls@fcort{ortorr\^{o}mbica de faces centradas/pt,face centered orthorhombic/en,orthorhombique \`{a} faces centr\'{e}es/fr,orthorhombisch fl\"{a}chenzentriert/de,ortorombico a facce centrate/it,ortorr\'{o}mbica centrada en la cara/es,ortorr\^{o}mbica de faces centradas/br,\pgfPT@user@labels@ls@fcort/user}% +\def\pgfPT@labels@ls@hcp{hexagonal compacta/pt,hexagonal close packed/en,hexagonal compact/fr,hexagonal-dichteste Packung/de,esagonale compatto/it,empaquetado hexagonal cerrado/es,hexagonal compacta/br,\pgfPT@user@labels@ls@hcp/user}% +\def\pgfPT@labels@ls@hex{hexagonal /pt,hexagonal/en,hexagonal/fr,hexagonal/de,esagonale/it,hexagonal/es,hexagonal /br,\pgfPT@user@labels@ls@hex/user}% +\def\pgfPT@labels@ls@mono{monocl\'{i}nica/pt,monoclinic/en,monoclinique/fr,monoklin/de,monoclino/it,monocl\'{i}nico/es,monocl\'{i}nica/br,\pgfPT@user@labels@ls@mono/user}% +\def\pgfPT@labels@ls@rho{rombo\'{e}drica/pt,rhombohedral/en,rhombo\'{e}drique/fr,rhomboedrisch/de,romboedrico/it,rombo\'{e}drico/es,rombo\'{e}drica/br,\pgfPT@user@labels@ls@rho/user}% +\def\pgfPT@labels@ls@sc{c\'{u}bica simples/pt,simple cubic/en,cubique simple/fr,kubisch primitiv/de,cubico semplice/it,c\'{u}bica simple/es,c\'{u}bica simples/br,\pgfPT@user@labels@ls@sc/user}% +\def\pgfPT@labels@ls@tric{tricl\'{i}nica simples/pt,simple triclinic/en,triclinique simple/fr,triklin/de,triclino/it,tricl\'{i}nica simple/es,tricl\'{i}nica simples/br,\pgfPT@user@labels@ls@tric/user}% +\def\pgfPT@labels@ls@tetr{tetragonal/pt,tetragonal/en,quadratique/fr,tetragonal/de,tetragonale/it,tetragonal/es,tetragonal/br,\pgfPT@user@labels@ls@tetr/user}% % %%%%%%%%%%%%%%% Units %%%%%%%%%%%%%%%%%%%%%%%%%%% \newcount\pgfPT@count@note% @@ -148,7 +150,7 @@ % gas ;\hspace{.2ex}\mbox{\hspace{.1ex}\pgfPT@box@zerodepth{g}\hspace{.1ex}/dm% \pgfmathsetlength{\pgfPT@dimc}{.666*\pgfPT@dima}\raisebox{.555ex}{\fontsize{\pgfPT@dimc}{\pgfPT@dimc}\selectfont3}\hspace{.6ex}}% -\edef\pgfPT@lang@pt{pt}\edef\pgfPT@lang@en{en}\edef\pgfPT@lang@fr{fr}\edef\pgfPT@lang@de{de}\edef\pgfPT@lang@it{it}\edef\pgfPT@lang@es{es}\edef\pgfPT@lang@br{br}% +\edef\pgfPT@lang@pt{pt}\edef\pgfPT@lang@en{en}\edef\pgfPT@lang@fr{fr}\edef\pgfPT@lang@de{de}\edef\pgfPT@lang@it{it}\edef\pgfPT@lang@es{es}\edef\pgfPT@lang@br{br}\edef\pgfPT@lang@user{user}% \expandafter\pgfPT@getFirstLanguage\pgfPTlanguages, \relax% \ifx\pgfPT@FirstLanguage\pgfPT@lang@pt\relax% para os \textcolor{gasoso}{gases}%pt @@ -164,9 +166,11 @@ per i \textcolor{gasoso}{gas}%it para los \textcolor{gasoso}{gases}%es \else\ifx\pgfPT@FirstLanguage\pgfPT@lang@br\relax% para os \textcolor{gasoso}{gases}%br +\else\ifx\pgfPT@FirstLanguage\pgfPT@lang@user\relax% +-- \textcolor{gasoso}{\pgfPT@user@labels@gasoso}%user \else% use en for the \textcolor{gasoso}{gases}%en -\fi\fi\fi\fi\fi\fi\fi% +\fi\fi\fi\fi\fi\fi\fi\fi% )\fi\fi% }% \def\pgfPT@labels@unit@Cp{\ignorespaces\pgfmathsetlength{\pgfPT@dimc}{.666*\pgfPT@dima}% diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex index b57ca45dcd..2c321dcd34 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex +++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.names.tex @@ -9,6 +9,7 @@ % - it -> Italian % - es -> Spanish % - br -> Portuguese (Brazil) +% - user -> user language (v2.1.0) % -------------------------------------------------------------------------------------------------- % Turn the 'name' in 'Name' % USE -> \expandafter\pgfPT@namec@p#1#2\pgfPT@nomes@xx\relax @@ -21,122 +22,122 @@ % -------------------------------------------------------------------------------------------------- % The names list from Z=1 to 118 --------------------------------------------------------------- % -------------------------------------------------------------------------------------------------- -\def\pgfPT@nomes@i{hidrog\'{e}nio/pt,hydrogen/en,hydrog\`{e}ne/fr,Wasserstoff/de,idrogeno/it,hidr\'{o}geno/es,hidrog\^{e}nio/br}% -\def\pgfPT@nomes@ii{h\'{e}lio/pt,helium/en,h\'{e}lium/fr,Helium/de,elio/it,helio/es,h\'{e}lio/br}% -\def\pgfPT@nomes@iii{l\'{i}tio/pt,lithium/en,lithium/fr,Lithium/de,litio/it,litio/es,l\'{i}tio/br}% -\def\pgfPT@nomes@iv{ber\'{i}lio/pt,beryllium/en,b\'{e}ryllium/fr,Beryllium/de,berillio/it,berilio/es,ber\'{i}lio/br}% -\def\pgfPT@nomes@v{boro/pt,boron/en,bore/fr,Bor/de,boro/it,boro/es,boro/br}% -\def\pgfPT@nomes@vi{carbono/pt,carbon/en,carbone/fr,Kohlenstoff/de,carbonio/it,carb\'{o}n/es,carbono/br}% -\def\pgfPT@nomes@vii{azoto/pt,nitrogen/en,azote/fr,Stickstoff/de,azoto/it,nitr\'{o}geno/es,nitrog\^{e}nio/br}% -\def\pgfPT@nomes@viii{oxig\'{e}nio/pt,oxygen/en,oxyg\`{e}ne/fr,Sauerstoff/de,ossigeno/it,ox\'{i}geno/es,oxig\^{e}nio/br}% -\def\pgfPT@nomes@ix{fl\'{u}or/pt,fluorine/en,fluor/fr,Fluor/de,fluoro/it,fl\'{u}or/es,fl\'{u}or/br}% -\def\pgfPT@nomes@x{n\'{e}on/pt,neon/en,n\'{e}on/fr,Neon/de,neon/it,ne\'{o}n/es,ne\^{o}nio/br}% -\def\pgfPT@nomes@xi{s\'{o}dio/pt,sodium/en,sodium/fr,Natrium/de,sodio/it,sodio/es,s\'{o}dio/br}% -\def\pgfPT@nomes@xii{magn\'{e}sio/pt,magnesium/en,magn\'{e}sium/fr,Magnesium/de,magnesio/it,magnesio/es,magn\'{e}sio/br}% -\def\pgfPT@nomes@xiii{alum\'{i}nio/pt,aluminium/en,aluminium/fr,Aluminium/de,alluminio/it,aluminio/es,alum\'{i}nio/br}% -\def\pgfPT@nomes@xiv{sil\'{i}cio/pt,silicon/en,silicium/fr,Silizium/de,silicio/it,silicio/es,sil\'{i}cio/br}% -\def\pgfPT@nomes@xv{f\'{o}sforo/pt,phosphorus/en,phosphore/fr,Phosphor/de,fosforo/it,f\'{o}sforo/es,f\'{o}sforo/br}% -\def\pgfPT@nomes@xvi{enxofre/pt,sulfur/en,soufre/fr,Schwefel/de,zolfo/it,azufre/es,enxofre/br}% -\def\pgfPT@nomes@xvii{cloro/pt,chlorine/en,chlore/fr,Chlor/de,cloro/it,cloro/es,cloro/br}% -\def\pgfPT@nomes@xviii{\'{a}rgon/pt,argon/en,argon/fr,Argon/de,argo/it,arg\'{o}n/es,arg\^{o}nio/br}% -\def\pgfPT@nomes@xix{pot\'{a}ssio/pt,potassium/en,potassium/fr,Kalium/de,potassio/it,potasio/es,pot\'{a}ssio/br}% -\def\pgfPT@nomes@xx{c\'{a}lcio/pt,calcium/en,calcium/fr,Kalzium/de,calcio/it,calcio/es,c\'{a}lcio/br}% -\def\pgfPT@nomes@xxi{esc\^{a}ndio/pt,scandium/en,scandium/fr,Scandium/de,scandio/it,escandio/es,esc\^{a}ndio/br}% -\def\pgfPT@nomes@xxii{tit\^{a}nio/pt,titanium/en,titane/fr,Titan/de,titanio/it,titanio/es,tit\^{a}nio/br}% -\def\pgfPT@nomes@xxiii{van\'{a}dio/pt,vanadium/en,vanadium/fr,Vanadium/de,vanadio/it,vanadio/es,van\'{a}dio/br}% -\def\pgfPT@nomes@xxiv{cr\'{o}mio/pt,chromium/en,chrome/fr,Chrom/de,cromo/it,cromo/es,cr\^{o}mio/br}% -\def\pgfPT@nomes@xxv{mangan\'{e}sio/pt,manganese/en,mangan\`{e}se/fr,Mangan/de,manganese/it,manganeso/es,mangan\^{e}s/br}% -\def\pgfPT@nomes@xxvi{ferro/pt,iron/en,fer/fr,Eisen/de,ferro/it,planchar/es,ferro/br}% -\def\pgfPT@nomes@xxvii{cobalto/pt,cobalt/en,cobalt/fr,Kobalt/de,cobalto/it,cobalto/es,cobalto/br}% -\def\pgfPT@nomes@xxviii{n\'{i}quel/pt,nickel/en,nickel/fr,Nickel/de,nichel/it,n\'{i}quel/es,n\'{i}quel/br}% -\def\pgfPT@nomes@xxix{cobre/pt,copper/en,cuivre/fr,Kupfer/de,rame/it,cobre/es,cobre/br}% -\def\pgfPT@nomes@xxx{zinco/pt,zinc/en,zinc/fr,Zink/de,zinco/it,zinc/es,zinco/br}% -\def\pgfPT@nomes@xxxi{g\'{a}lio/pt,gallium/en,gallium/fr,Gallium/de,gallio/it,galio/es,g\'{a}lio/br}% -\def\pgfPT@nomes@xxxii{germ\^{a}nio/pt,germanium/en,germanium/fr,Germanium/de,germanio/it,germanio/es,germ\^{a}nio/br}% -\def\pgfPT@nomes@xxxiii{ars\'{e}nio/pt,arsenic/en,arsenic/fr,Arsen/de,arsenico/it,ars\'{e}nico/es,ars\^{e}nio/br}% -\def\pgfPT@nomes@xxxiv{sel\'{e}nio/pt,selenium/en,s\'{e}l\'{e}nium/fr,Selen/de,selenio/it,selenio/es,sel\^{e}nio/br}% -\def\pgfPT@nomes@xxxv{bromo/pt,bromine/en,brome/fr,Brom/de,bromo/it,bromo/es,bromo/br}% -\def\pgfPT@nomes@xxxvi{cr\'{i}pton/pt,krypton/en,krypton/fr,Krypton/de,krypton/it,cript\'{o}n/es,cript\^{o}nio/br}% -\def\pgfPT@nomes@xxxvii{rub\'{i}dio/pt,rubidium/en,rubidium/fr,Rubidium/de,rubidio/it,rubidio/es,rub\'{i}dio/br}% -\def\pgfPT@nomes@xxxviii{estr\^{o}ncio/pt,strontium/en,strontium/fr,Strontium/de,stronzio/it,estroncio/es,estr\^{o}ncio/br}% -\def\pgfPT@nomes@xxxix{\'{i}trio/pt,yttrium/en,yttrium/fr,Yttrium/de,ittrio/it,itrio/es,\'{i}trio/br}% -\def\pgfPT@nomes@xl{zirc\'{o}nio/pt,zirconium/en,zirconium/fr,Zirkonium/de,zirconio/it,circonio/es,zirc\^{o}nio/br}% -\def\pgfPT@nomes@xli{ni\'{o}bio/pt,niobium/en,niobium/fr,Niob/de,niobio/it,niobio/es,ni\'{o}bio/br}% -\def\pgfPT@nomes@xlii{molibd\'{e}nio/pt,molybdenum/en,molybd\`{e}ne/fr,Molybd\"{a}n/de,molibdeno/it,molibdeno/es,molibd\^{e}nio/br}% -\def\pgfPT@nomes@xliii{tecn\'{e}cio/pt,technetium/en,techn\'{e}tium/fr,Technetium/de,tecnezio/it,tecnecio/es,tecn\'{e}cio/br}% -\def\pgfPT@nomes@xliv{rut\'{e}nio/pt,ruthenium/en,ruth\'{e}nium/fr,Ruthenium/de,rutenio/it,rutenio/es,rut\^{e}nio/br}% -\def\pgfPT@nomes@xlv{r\'{o}dio/pt,rhodium/en,rhodium/fr,Rhodium/de,rodio/it,rodio/es,r\'{o}dio/br}% -\def\pgfPT@nomes@xlvi{pal\'{a}dio/pt,palladium/en,palladium/fr,Palladium/de,palladio/it,paladio/es,pal\'{a}dio/br}% -\def\pgfPT@nomes@xlvii{prata/pt,silver/en,argent/fr,Silber/de,argento/it,plata/es,prata/br}% -\def\pgfPT@nomes@xlviii{c\'{a}dmio/pt,cadmium/en,cadmium/fr,Cadmium/de,cadmio/it,cadmio/es,c\'{a}dmio/br}% -\def\pgfPT@nomes@xlix{\'{i}ndio/pt,indium/en,indium/fr,Indium/de,indio/it,indio/es,\'{i}ndio/br}% -\def\pgfPT@nomes@l{estanho/pt,tin/en,\'{e}tain/fr,Zinn/de,lattina/it,esta\~{n}o/es,estanho/br}% -\def\pgfPT@nomes@li{antim\'{o}nio/pt,antimony/en,antimoine/fr,Antimon/de,antimonio/it,antimonio/es,antim\^{o}nio/br}% -\def\pgfPT@nomes@lii{tel\'{u}rio/pt,tellurium/en,tellure/fr,Tellur/de,tellurio/it,telurio/es,tel\'{u}rio/br}% -\def\pgfPT@nomes@liii{iodo/pt,iodine/en,iode/fr,Iod/de,iodio/it,yodo/es,iodo/br}% -\def\pgfPT@nomes@liv{x\'{e}non/pt,xenon/en,x\'{e}non/fr,Xenon/de,xeno/it,xen\'{o}n/es,xen\^{o}nio/br}% -\def\pgfPT@nomes@lv{c\'{e}sio/pt,caesium/en,c\'{e}sium/fr,Caesium/de,cesio/it,cesio/es,c\'{e}sio/br}% -\def\pgfPT@nomes@lvi{b\'{a}rio/pt,barium/en,baryum/fr,Barium/de,bario/it,bario/es,b\'{a}rio/br}% -\def\pgfPT@nomes@lvii{lant\^{a}nio/pt,lanthanum/en,lanthane/fr,Lanthan/de,lantanio/it,lantano/es,lant\^{a}nio/br}% -\def\pgfPT@nomes@lviii{c\'{e}rio/pt,cerium/en,c\'{e}rium/fr,Cer/de,cerio/it,cerio/es,c\'{e}rio/br}% -\def\pgfPT@nomes@lix{praseod\'{i}mio/pt,praseodymium/en,pras\'{e}odyme/fr,Praseodym/de,praseodimio/it,praseodimio/es,praseod\'{i}mio/br}% -\def\pgfPT@nomes@lx{neod\'{i}mio/pt,neodymium/en,n\'{e}odyme/fr,Neodym/de,neodimio/it,neodimio/es,neod\'{i}mio/br}% -\def\pgfPT@nomes@lxi{prom\'{e}cio/pt,promethium/en,prom\'{e}thium/fr,Promethium/de,prometeo/it,prometeo/es,prom\'{e}cio/br}% -\def\pgfPT@nomes@lxii{sam\'{a}rio/pt,samarium/en,samarium/fr,Samarium/de,samario/it,samario/es,sam\'{a}rio/br}% -\def\pgfPT@nomes@lxiii{eur\'{o}pio/pt,europium/en,europium/fr,Europium/de,europium/it,europio/es,eur\'{o}pio/br}% -\def\pgfPT@nomes@lxiv{gadol\'{i}nio/pt,gadolinium/en,gadolinium/fr,Gadolinium/de,gadolinio/it,gadolinio/es,gadol\'{i}nio/br}% -\def\pgfPT@nomes@lxv{t\'{e}rbio/pt,terbium/en,terbium/fr,Terbium/de,terbio/it,terbio/es,t\'{e}rbio/br}% -\def\pgfPT@nomes@lxvi{dispr\'{o}sio/pt,dysprosium/en,dysprosium/fr,Dysprosium/de,dysprosium/it,disprosio/es,dispr\'{o}sio/br}% -\def\pgfPT@nomes@lxvii{h\'{o}lmio/pt,holmium/en,holmium/fr,Holmium/de,olmio/it,holmio/es,h\'{o}lmio/br}% -\def\pgfPT@nomes@lxviii{\'{e}rbio/pt,erbium/en,erbium/fr,Erbium/de,erbio/it,erbio/es,\'{e}rbio/br}% -\def\pgfPT@nomes@lxix{t\'{u}lio/pt,thulium/en,thulium/fr,Thulium/de,tulio/it,tulio/es,t\'{u}lio/br}% -\def\pgfPT@nomes@lxx{it\'{e}rbio/pt,ytterbium/en,ytterbium/fr,Ytterbium/de,itterbio/it,iterbio/es,it\'{e}rbio/br}% -\def\pgfPT@nomes@lxxi{lut\'{e}cio/pt,lutetium/en,lut\'{e}tium/fr,Lutetium/de,lutezio/it,lutecio/es,lut\'{e}cio/br}% -\def\pgfPT@nomes@lxxii{h\'{a}fnio/pt,hafnium/en,hafnium/fr,Hafnium/de,afnio/it,hafnio/es,h\'{a}fnio/br}% -\def\pgfPT@nomes@lxxiii{t\^{a}ntalo/pt,tantalum/en,tantale/fr,Tantal/de,tantalio/it,tantalio/es,t\^{a}ntalo/br}% -\def\pgfPT@nomes@lxxiv{tungst\'{e}nio/pt,tungsten/en,tungst\`{e}ne/fr,Wolfram/de,tungsteno/it,tungsteno/es,tungst\^{e}nio/br}% -\def\pgfPT@nomes@lxxv{r\'{e}nio/pt,rhenium/en,rh\'{e}nium/fr,Rhenium/de,rhenium/it,renio/es,r\^{e}nio/br}% -\def\pgfPT@nomes@lxxvi{\'{o}smio/pt,osmium/en,osmium/fr,Osmium/de,osmio/it,osmio/es,\'{o}smio/br}% -\def\pgfPT@nomes@lxxvii{ir\'{i}dio/pt,iridium/en,iridium/fr,Iridium/de,iridio/it,iridio/es,ir\'{i}dio/br}% -\def\pgfPT@nomes@lxxviii{platina/pt,platinum/en,platine/fr,Platin/de,platino/it,platino/es,platina/br}% -\def\pgfPT@nomes@lxxix{ouro/pt,gold/en,or/fr,Gold/de,oro/it,oro/es,ouro/br}% -\def\pgfPT@nomes@lxxx{merc\'{u}rio/pt,mercury/en,mercure/fr,Quecksilber/de,mercurio/it,mercurio/es,merc\'{u}rio/br}% -\def\pgfPT@nomes@lxxxi{t\'{a}lio/pt,thallium/en,thallium/fr,Thallium/de,tallio/it,talio/es,t\'{a}lio/br}% -\def\pgfPT@nomes@lxxxii{chumbo/pt,lead/en,conduire/fr,Blei/de,piombo/it,plomo/es,chumbo/br}% -\def\pgfPT@nomes@lxxxiii{bismuto/pt,bismuth/en,bismuth/fr,Bismut/de,bismuto/it,bismuto/es,bismuto/br}% -\def\pgfPT@nomes@lxxxiv{pol\'{o}nio/pt,polonium/en,polonium/fr,Polonium/de,polonio/it,polonio/es,pol\^{o}nio/br}% -\def\pgfPT@nomes@lxxxv{astato/pt,astatine/en,astatine/fr,Astat/de,astato/it,astato/es,\'{a}stato/br}% -\def\pgfPT@nomes@lxxxvi{r\'{a}don/pt,radon/en,radon/fr,Radon/de,radon/it,rad\'{o}n/es,rad\^{o}nio/br}% -\def\pgfPT@nomes@lxxxvii{fr\^{a}ncio/pt,francium/en,francium/fr,Francium/de,francio/it,francio/es,fr\^{a}ncio/br}% -\def\pgfPT@nomes@lxxxviii{r\'{a}dio/pt,radium/en,radium/fr,Radium/de,radio/it,radio/es,r\'{a}dio/br}% -\def\pgfPT@nomes@lxxxix{act\'{i}nio/pt,actinium/en,actinium/fr,Actinium/de,attinio/it,actinio/es,act\'{i}nio/br}% -\def\pgfPT@nomes@xc{t\'{o}rio/pt,thorium/en,thorium/fr,Thorium/de,torio/it,torio/es,t\'{o}rio/br}% -\def\pgfPT@nomes@xci{protact\'{i}nio/pt,protactinium/en,protactinium/fr,Protactinium/de,protactinio/it,protactinio/es,protact\'{i}nio/br}% -\def\pgfPT@nomes@xcii{ur\^{a}nio/pt,uranium/en,uranium/fr,Uran/de,uranio/it,uranio/es,ur\^{a}nio/br}% -\def\pgfPT@nomes@xciii{nept\'{u}nio/pt,neptunium/en,neptunium/fr,Neptunium/de,nettunio/it,neptunio/es,net\'{u}nio/br}% -\def\pgfPT@nomes@xciv{plut\'{o}nio/pt,plutonium/en,plutonium/fr,Plutonium/de,plutonio/it,plutonio/es,plut\^{o}nio/br}% -\def\pgfPT@nomes@xcv{amer\'{i}cio/pt,americium/en,am\'{e}ricium/fr,Americium/de,americio/it,americio/es,amer\'{i}cio/br}% -\def\pgfPT@nomes@xcvi{c\'{u}rio/pt,curium/en,curium/fr,Curium/de,curio/it,curio/es,c\'{u}rio/br}% -\def\pgfPT@nomes@xcvii{berqu\'{e}lio/pt,berkelium/en,Berkelium/fr,berkelium/de,berkelium/it,berkelio/es,berqu\'{e}lio/br}% -\def\pgfPT@nomes@xcviii{calif\'{o}rnio/pt,californium/en,Californium/fr,californium/de,californio/it,californio/es,calif\'{o}rnio/br}% -\def\pgfPT@nomes@xcix{einst\'{e}nio/pt,einsteinium/en,Einsteinium/fr,einsteinium/de,einsteinio/it,einstenio/es,einst\^{e}nio/br}% -\def\pgfPT@nomes@c{f\'{e}rmio/pt,fermium/en,fermium/fr,Rermium/de,fermium/it,fermio/es,f\'{e}rmio/br}% -\def\pgfPT@nomes@ci{mendel\'{e}vio/pt,mendelevium/en,mendelevium/fr,Mendelevium/de,mendelevio/it,mendelevio/es,mendel\'{e}vio/br}% -\def\pgfPT@nomes@cii{nob\'{e}lio/pt,nobelium/en,nobelium/fr,Nobelium/de,nobelium/it,nobelio/es,nob\'{e}lio/br}% -\def\pgfPT@nomes@ciii{laur\^{e}ncio/pt,lawrencium/en,lawrencium/fr,Lawrencium/de,laurenzio/it,lawrencium/es,laur\^{e}ncio/br}% -\def\pgfPT@nomes@civ{rutherf\'{o}rdio/pt,rutherfordium/en,rutherfordium/fr,Rutherfordium/de,rutherfordium/it,rutherfordio/es,rutherf\'{o}rdio/br}% -\def\pgfPT@nomes@cv{d\'{u}bnio/pt,dubnium/en,dubnium/fr,Dubnium/de,dubnio/it,dubnium/es,d\'{u}bnio/br}% -\def\pgfPT@nomes@cvi{seab\'{o}rgio/pt,seaborgium/en,seaborgium/fr,Seaborgium/de,seaborgio/it,seaborgio/es,seab\'{o}rgio/br}% -\def\pgfPT@nomes@cvii{b\'{o}rio/pt,bohrium/en,bohrium/fr,Bohrium/de,bohrio/it,bohrium/es,b\'{o}hrio/br}% -\def\pgfPT@nomes@cviii{h\'{a}ssio/pt,hassium/en,hassium/fr,Hassium/de,hassio/it,hassium/es,h\'{a}ssio/br}% -\def\pgfPT@nomes@cix{meitn\'{e}rio/pt,meitnerium/en,meitnerium/fr,Meitnerium/de,meitnerio/it,meitnerio/es,meitn\'{e}rio/br}% -\def\pgfPT@nomes@cx{darmst\'{a}dio/pt,darmstadtium/en,darmstadtium/fr,Darmstadtium/de,darmstadtium/it,darmstadtium/es,darmst\'{a}dtio/br}% -\def\pgfPT@nomes@cxi{roentg\'{e}nio/pt,roentgenium/en,roentgenium/fr,R\"{o}ntgenium/de,roentgenio/it,roentgenio/es,roentg\^{e}nio/br}% -\def\pgfPT@nomes@cxii{copern\'{i}cio/pt,copernicium/en,copernicium/fr,Copernicium/de,copernicium/it,copernicio/es,copern\'{i}cio/br}% -\def\pgfPT@nomes@cxiii{nip\'{o}nio/pt,nihonium/en,nihonium/fr,Nihonium/de,nihonium/it,nihonio/es,nip\^{o}nio/br}% -\def\pgfPT@nomes@cxiv{fler\'{o}vio/pt,flerovium/en,flerovium/fr,Flerovium/de,flerovio/it,flerovio/es,fler\'{o}vio/br}% -\def\pgfPT@nomes@cxv{mosc\'{o}vio/pt,moscovium/en,moscovium/fr,Moscovium/de,moscovium/it,moscovio/es,mosc\'{o}vio/br}% -\def\pgfPT@nomes@cxvi{liverm\'{o}rio/pt,livermorium/en,livermorium/fr,Livermorium/de,livermorio/it,livermorium/es,liverm\'{o}rio/br}% -\def\pgfPT@nomes@cxvii{tenesso/pt,tennessine/en,tennessine/fr,Tenness/de,tennessine/it,teneso/es,tenesso/br}% -\def\pgfPT@nomes@cxviii{ogan\'{e}sson/pt,oganesson/en,oganesson/fr,Oganesson/de,oganesson/it,oganes\'{o}n/es,oganess\^{o}nio/br}% +\def\pgfPT@nomes@i{hidrog\'{e}nio/pt,hydrogen/en,hydrog\`{e}ne/fr,Wasserstoff/de,idrogeno/it,hidr\'{o}geno/es,hidrog\^{e}nio/br,\pgfPT@user@CSname@H/user}% +\def\pgfPT@nomes@ii{h\'{e}lio/pt,helium/en,h\'{e}lium/fr,Helium/de,elio/it,helio/es,h\'{e}lio/br,\pgfPT@user@CSname@He/user}% +\def\pgfPT@nomes@iii{l\'{i}tio/pt,lithium/en,lithium/fr,Lithium/de,litio/it,litio/es,l\'{i}tio/br,\pgfPT@user@CSname@Li/user}% +\def\pgfPT@nomes@iv{ber\'{i}lio/pt,beryllium/en,b\'{e}ryllium/fr,Beryllium/de,berillio/it,berilio/es,ber\'{i}lio/br,\pgfPT@user@CSname@Be/user}% +\def\pgfPT@nomes@v{boro/pt,boron/en,bore/fr,Bor/de,boro/it,boro/es,boro/br,\pgfPT@user@CSname@B/user}% +\def\pgfPT@nomes@vi{carbono/pt,carbon/en,carbone/fr,Kohlenstoff/de,carbonio/it,carb\'{o}n/es,carbono/br,\pgfPT@user@CSname@C/user}% +\def\pgfPT@nomes@vii{azoto/pt,nitrogen/en,azote/fr,Stickstoff/de,azoto/it,nitr\'{o}geno/es,nitrog\^{e}nio/br,\pgfPT@user@CSname@N/user}% +\def\pgfPT@nomes@viii{oxig\'{e}nio/pt,oxygen/en,oxyg\`{e}ne/fr,Sauerstoff/de,ossigeno/it,ox\'{i}geno/es,oxig\^{e}nio/br,\pgfPT@user@CSname@O/user}% +\def\pgfPT@nomes@ix{fl\'{u}or/pt,fluorine/en,fluor/fr,Fluor/de,fluoro/it,fl\'{u}or/es,fl\'{u}or/br,\pgfPT@user@CSname@F/user}% +\def\pgfPT@nomes@x{n\'{e}on/pt,neon/en,n\'{e}on/fr,Neon/de,neon/it,ne\'{o}n/es,ne\^{o}nio/br,\pgfPT@user@CSname@Ne/user}% +\def\pgfPT@nomes@xi{s\'{o}dio/pt,sodium/en,sodium/fr,Natrium/de,sodio/it,sodio/es,s\'{o}dio/br,\pgfPT@user@CSname@Na/user}% +\def\pgfPT@nomes@xii{magn\'{e}sio/pt,magnesium/en,magn\'{e}sium/fr,Magnesium/de,magnesio/it,magnesio/es,magn\'{e}sio/br,\pgfPT@user@CSname@Mg/user}% +\def\pgfPT@nomes@xiii{alum\'{i}nio/pt,aluminium/en,aluminium/fr,Aluminium/de,alluminio/it,aluminio/es,alum\'{i}nio/br,\pgfPT@user@CSname@Al/user}% +\def\pgfPT@nomes@xiv{sil\'{i}cio/pt,silicon/en,silicium/fr,Silizium/de,silicio/it,silicio/es,sil\'{i}cio/br,\pgfPT@user@CSname@Si/user}% +\def\pgfPT@nomes@xv{f\'{o}sforo/pt,phosphorus/en,phosphore/fr,Phosphor/de,fosforo/it,f\'{o}sforo/es,f\'{o}sforo/br,\pgfPT@user@CSname@P/user}% +\def\pgfPT@nomes@xvi{enxofre/pt,sulfur/en,soufre/fr,Schwefel/de,zolfo/it,azufre/es,enxofre/br,\pgfPT@user@CSname@S/user}% +\def\pgfPT@nomes@xvii{cloro/pt,chlorine/en,chlore/fr,Chlor/de,cloro/it,cloro/es,cloro/br,\pgfPT@user@CSname@Cl/user}% +\def\pgfPT@nomes@xviii{\'{a}rgon/pt,argon/en,argon/fr,Argon/de,argo/it,arg\'{o}n/es,arg\^{o}nio/br,\pgfPT@user@CSname@Ar/user}% +\def\pgfPT@nomes@xix{pot\'{a}ssio/pt,potassium/en,potassium/fr,Kalium/de,potassio/it,potasio/es,pot\'{a}ssio/br,\pgfPT@user@CSname@K/user}% +\def\pgfPT@nomes@xx{c\'{a}lcio/pt,calcium/en,calcium/fr,Kalzium/de,calcio/it,calcio/es,c\'{a}lcio/br,\pgfPT@user@CSname@Ca/user}% +\def\pgfPT@nomes@xxi{esc\^{a}ndio/pt,scandium/en,scandium/fr,Scandium/de,scandio/it,escandio/es,esc\^{a}ndio/br,\pgfPT@user@CSname@Sc/user}% +\def\pgfPT@nomes@xxii{tit\^{a}nio/pt,titanium/en,titane/fr,Titan/de,titanio/it,titanio/es,tit\^{a}nio/br,\pgfPT@user@CSname@Ti/user}% +\def\pgfPT@nomes@xxiii{van\'{a}dio/pt,vanadium/en,vanadium/fr,Vanadium/de,vanadio/it,vanadio/es,van\'{a}dio/br,\pgfPT@user@CSname@V/user}% +\def\pgfPT@nomes@xxiv{cr\'{o}mio/pt,chromium/en,chrome/fr,Chrom/de,cromo/it,cromo/es,cr\^{o}mio/br,\pgfPT@user@CSname@Cr/user}% +\def\pgfPT@nomes@xxv{mangan\'{e}sio/pt,manganese/en,mangan\`{e}se/fr,Mangan/de,manganese/it,manganeso/es,mangan\^{e}s/br,\pgfPT@user@CSname@Mn/user}% +\def\pgfPT@nomes@xxvi{ferro/pt,iron/en,fer/fr,Eisen/de,ferro/it,planchar/es,ferro/br,\pgfPT@user@CSname@Fe/user}% +\def\pgfPT@nomes@xxvii{cobalto/pt,cobalt/en,cobalt/fr,Kobalt/de,cobalto/it,cobalto/es,cobalto/br,\pgfPT@user@CSname@Co/user}% +\def\pgfPT@nomes@xxviii{n\'{i}quel/pt,nickel/en,nickel/fr,Nickel/de,nichel/it,n\'{i}quel/es,n\'{i}quel/br,\pgfPT@user@CSname@Ni/user}% +\def\pgfPT@nomes@xxix{cobre/pt,copper/en,cuivre/fr,Kupfer/de,rame/it,cobre/es,cobre/br,\pgfPT@user@CSname@Cu/user}% +\def\pgfPT@nomes@xxx{zinco/pt,zinc/en,zinc/fr,Zink/de,zinco/it,zinc/es,zinco/br,\pgfPT@user@CSname@Zn/user}% +\def\pgfPT@nomes@xxxi{g\'{a}lio/pt,gallium/en,gallium/fr,Gallium/de,gallio/it,galio/es,g\'{a}lio/br,\pgfPT@user@CSname@Ga/user}% +\def\pgfPT@nomes@xxxii{germ\^{a}nio/pt,germanium/en,germanium/fr,Germanium/de,germanio/it,germanio/es,germ\^{a}nio/br,\pgfPT@user@CSname@Ge/user}% +\def\pgfPT@nomes@xxxiii{ars\'{e}nio/pt,arsenic/en,arsenic/fr,Arsen/de,arsenico/it,ars\'{e}nico/es,ars\^{e}nio/br,\pgfPT@user@CSname@As/user}% +\def\pgfPT@nomes@xxxiv{sel\'{e}nio/pt,selenium/en,s\'{e}l\'{e}nium/fr,Selen/de,selenio/it,selenio/es,sel\^{e}nio/br,\pgfPT@user@CSname@Se/user}% +\def\pgfPT@nomes@xxxv{bromo/pt,bromine/en,brome/fr,Brom/de,bromo/it,bromo/es,bromo/br,\pgfPT@user@CSname@Br/user}% +\def\pgfPT@nomes@xxxvi{cr\'{i}pton/pt,krypton/en,krypton/fr,Krypton/de,krypton/it,cript\'{o}n/es,cript\^{o}nio/br,\pgfPT@user@CSname@Kr/user}% +\def\pgfPT@nomes@xxxvii{rub\'{i}dio/pt,rubidium/en,rubidium/fr,Rubidium/de,rubidio/it,rubidio/es,rub\'{i}dio/br,\pgfPT@user@CSname@Rb/user}% +\def\pgfPT@nomes@xxxviii{estr\^{o}ncio/pt,strontium/en,strontium/fr,Strontium/de,stronzio/it,estroncio/es,estr\^{o}ncio/br,\pgfPT@user@CSname@Sr/user}% +\def\pgfPT@nomes@xxxix{\'{i}trio/pt,yttrium/en,yttrium/fr,Yttrium/de,ittrio/it,itrio/es,\'{i}trio/br,\pgfPT@user@CSname@Y/user}% +\def\pgfPT@nomes@xl{zirc\'{o}nio/pt,zirconium/en,zirconium/fr,Zirkonium/de,zirconio/it,circonio/es,zirc\^{o}nio/br,\pgfPT@user@CSname@Zr/user}% +\def\pgfPT@nomes@xli{ni\'{o}bio/pt,niobium/en,niobium/fr,Niob/de,niobio/it,niobio/es,ni\'{o}bio/br,\pgfPT@user@CSname@Nb/user}% +\def\pgfPT@nomes@xlii{molibd\'{e}nio/pt,molybdenum/en,molybd\`{e}ne/fr,Molybd\"{a}n/de,molibdeno/it,molibdeno/es,molibd\^{e}nio/br,\pgfPT@user@CSname@Mo/user}% +\def\pgfPT@nomes@xliii{tecn\'{e}cio/pt,technetium/en,techn\'{e}tium/fr,Technetium/de,tecnezio/it,tecnecio/es,tecn\'{e}cio/br,\pgfPT@user@CSname@Tc/user}% +\def\pgfPT@nomes@xliv{rut\'{e}nio/pt,ruthenium/en,ruth\'{e}nium/fr,Ruthenium/de,rutenio/it,rutenio/es,rut\^{e}nio/br,\pgfPT@user@CSname@Ru/user}% +\def\pgfPT@nomes@xlv{r\'{o}dio/pt,rhodium/en,rhodium/fr,Rhodium/de,rodio/it,rodio/es,r\'{o}dio/br,\pgfPT@user@CSname@Rh/user}% +\def\pgfPT@nomes@xlvi{pal\'{a}dio/pt,palladium/en,palladium/fr,Palladium/de,palladio/it,paladio/es,pal\'{a}dio/br,\pgfPT@user@CSname@Pd/user}% +\def\pgfPT@nomes@xlvii{prata/pt,silver/en,argent/fr,Silber/de,argento/it,plata/es,prata/br,\pgfPT@user@CSname@Ag/user}% +\def\pgfPT@nomes@xlviii{c\'{a}dmio/pt,cadmium/en,cadmium/fr,Cadmium/de,cadmio/it,cadmio/es,c\'{a}dmio/br,\pgfPT@user@CSname@Cd/user}% +\def\pgfPT@nomes@xlix{\'{i}ndio/pt,indium/en,indium/fr,Indium/de,indio/it,indio/es,\'{i}ndio/br,\pgfPT@user@CSname@In/user}% +\def\pgfPT@nomes@l{estanho/pt,tin/en,\'{e}tain/fr,Zinn/de,lattina/it,esta\~{n}o/es,estanho/br,\pgfPT@user@CSname@Sn/user}% +\def\pgfPT@nomes@li{antim\'{o}nio/pt,antimony/en,antimoine/fr,Antimon/de,antimonio/it,antimonio/es,antim\^{o}nio/br,\pgfPT@user@CSname@Sb/user}% +\def\pgfPT@nomes@lii{tel\'{u}rio/pt,tellurium/en,tellure/fr,Tellur/de,tellurio/it,telurio/es,tel\'{u}rio/br,\pgfPT@user@CSname@Te/user}% +\def\pgfPT@nomes@liii{iodo/pt,iodine/en,iode/fr,Iod/de,iodio/it,yodo/es,iodo/br,\pgfPT@user@CSname@I/user}% +\def\pgfPT@nomes@liv{x\'{e}non/pt,xenon/en,x\'{e}non/fr,Xenon/de,xeno/it,xen\'{o}n/es,xen\^{o}nio/br,\pgfPT@user@CSname@Xe/user}% +\def\pgfPT@nomes@lv{c\'{e}sio/pt,caesium/en,c\'{e}sium/fr,Caesium/de,cesio/it,cesio/es,c\'{e}sio/br,\pgfPT@user@CSname@Cs/user}% +\def\pgfPT@nomes@lvi{b\'{a}rio/pt,barium/en,baryum/fr,Barium/de,bario/it,bario/es,b\'{a}rio/br,\pgfPT@user@CSname@Ba/user}% +\def\pgfPT@nomes@lvii{lant\^{a}nio/pt,lanthanum/en,lanthane/fr,Lanthan/de,lantanio/it,lantano/es,lant\^{a}nio/br,\pgfPT@user@CSname@La/user}% +\def\pgfPT@nomes@lviii{c\'{e}rio/pt,cerium/en,c\'{e}rium/fr,Cer/de,cerio/it,cerio/es,c\'{e}rio/br,\pgfPT@user@CSname@Ce/user}% +\def\pgfPT@nomes@lix{praseod\'{i}mio/pt,praseodymium/en,pras\'{e}odyme/fr,Praseodym/de,praseodimio/it,praseodimio/es,praseod\'{i}mio/br,\pgfPT@user@CSname@Pr/user}% +\def\pgfPT@nomes@lx{neod\'{i}mio/pt,neodymium/en,n\'{e}odyme/fr,Neodym/de,neodimio/it,neodimio/es,neod\'{i}mio/br,\pgfPT@user@CSname@Nd/user}% +\def\pgfPT@nomes@lxi{prom\'{e}cio/pt,promethium/en,prom\'{e}thium/fr,Promethium/de,prometeo/it,prometeo/es,prom\'{e}cio/br,\pgfPT@user@CSname@Pm/user}% +\def\pgfPT@nomes@lxii{sam\'{a}rio/pt,samarium/en,samarium/fr,Samarium/de,samario/it,samario/es,sam\'{a}rio/br,\pgfPT@user@CSname@Sm/user}% +\def\pgfPT@nomes@lxiii{eur\'{o}pio/pt,europium/en,europium/fr,Europium/de,europium/it,europio/es,eur\'{o}pio/br,\pgfPT@user@CSname@Eu/user}% +\def\pgfPT@nomes@lxiv{gadol\'{i}nio/pt,gadolinium/en,gadolinium/fr,Gadolinium/de,gadolinio/it,gadolinio/es,gadol\'{i}nio/br,\pgfPT@user@CSname@Gd/user}% +\def\pgfPT@nomes@lxv{t\'{e}rbio/pt,terbium/en,terbium/fr,Terbium/de,terbio/it,terbio/es,t\'{e}rbio/br,\pgfPT@user@CSname@Tb/user}% +\def\pgfPT@nomes@lxvi{dispr\'{o}sio/pt,dysprosium/en,dysprosium/fr,Dysprosium/de,dysprosium/it,disprosio/es,dispr\'{o}sio/br,\pgfPT@user@CSname@Dy/user}% +\def\pgfPT@nomes@lxvii{h\'{o}lmio/pt,holmium/en,holmium/fr,Holmium/de,olmio/it,holmio/es,h\'{o}lmio/br,\pgfPT@user@CSname@Ho/user}% +\def\pgfPT@nomes@lxviii{\'{e}rbio/pt,erbium/en,erbium/fr,Erbium/de,erbio/it,erbio/es,\'{e}rbio/br,\pgfPT@user@CSname@Er/user}% +\def\pgfPT@nomes@lxix{t\'{u}lio/pt,thulium/en,thulium/fr,Thulium/de,tulio/it,tulio/es,t\'{u}lio/br,\pgfPT@user@CSname@Tm/user}% +\def\pgfPT@nomes@lxx{it\'{e}rbio/pt,ytterbium/en,ytterbium/fr,Ytterbium/de,itterbio/it,iterbio/es,it\'{e}rbio/br,\pgfPT@user@CSname@Yb/user}% +\def\pgfPT@nomes@lxxi{lut\'{e}cio/pt,lutetium/en,lut\'{e}tium/fr,Lutetium/de,lutezio/it,lutecio/es,lut\'{e}cio/br,\pgfPT@user@CSname@Lu/user}% +\def\pgfPT@nomes@lxxii{h\'{a}fnio/pt,hafnium/en,hafnium/fr,Hafnium/de,afnio/it,hafnio/es,h\'{a}fnio/br,\pgfPT@user@CSname@Hf/user}% +\def\pgfPT@nomes@lxxiii{t\^{a}ntalo/pt,tantalum/en,tantale/fr,Tantal/de,tantalio/it,tantalio/es,t\^{a}ntalo/br,\pgfPT@user@CSname@Ta/user}% +\def\pgfPT@nomes@lxxiv{tungst\'{e}nio/pt,tungsten/en,tungst\`{e}ne/fr,Wolfram/de,tungsteno/it,tungsteno/es,tungst\^{e}nio/br,\pgfPT@user@CSname@W/user}% +\def\pgfPT@nomes@lxxv{r\'{e}nio/pt,rhenium/en,rh\'{e}nium/fr,Rhenium/de,rhenium/it,renio/es,r\^{e}nio/br,\pgfPT@user@CSname@Re/user}% +\def\pgfPT@nomes@lxxvi{\'{o}smio/pt,osmium/en,osmium/fr,Osmium/de,osmio/it,osmio/es,\'{o}smio/br,\pgfPT@user@CSname@Os/user}% +\def\pgfPT@nomes@lxxvii{ir\'{i}dio/pt,iridium/en,iridium/fr,Iridium/de,iridio/it,iridio/es,ir\'{i}dio/br,\pgfPT@user@CSname@Ir/user}% +\def\pgfPT@nomes@lxxviii{platina/pt,platinum/en,platine/fr,Platin/de,platino/it,platino/es,platina/br,\pgfPT@user@CSname@Pt/user}% +\def\pgfPT@nomes@lxxix{ouro/pt,gold/en,or/fr,Gold/de,oro/it,oro/es,ouro/br,\pgfPT@user@CSname@Au/user}% +\def\pgfPT@nomes@lxxx{merc\'{u}rio/pt,mercury/en,mercure/fr,Quecksilber/de,mercurio/it,mercurio/es,merc\'{u}rio/br,\pgfPT@user@CSname@Hg/user}% +\def\pgfPT@nomes@lxxxi{t\'{a}lio/pt,thallium/en,thallium/fr,Thallium/de,tallio/it,talio/es,t\'{a}lio/br,\pgfPT@user@CSname@Tl/user}% +\def\pgfPT@nomes@lxxxii{chumbo/pt,lead/en,conduire/fr,Blei/de,piombo/it,plomo/es,chumbo/br,\pgfPT@user@CSname@Pb/user}% +\def\pgfPT@nomes@lxxxiii{bismuto/pt,bismuth/en,bismuth/fr,Bismut/de,bismuto/it,bismuto/es,bismuto/br,\pgfPT@user@CSname@Bi/user}% +\def\pgfPT@nomes@lxxxiv{pol\'{o}nio/pt,polonium/en,polonium/fr,Polonium/de,polonio/it,polonio/es,pol\^{o}nio/br,\pgfPT@user@CSname@Po/user}% +\def\pgfPT@nomes@lxxxv{astato/pt,astatine/en,astatine/fr,Astat/de,astato/it,astato/es,\'{a}stato/br,\pgfPT@user@CSname@At/user}% +\def\pgfPT@nomes@lxxxvi{r\'{a}don/pt,radon/en,radon/fr,Radon/de,radon/it,rad\'{o}n/es,rad\^{o}nio/br,\pgfPT@user@CSname@Rn/user}% +\def\pgfPT@nomes@lxxxvii{fr\^{a}ncio/pt,francium/en,francium/fr,Francium/de,francio/it,francio/es,fr\^{a}ncio/br,\pgfPT@user@CSname@Fr/user}% +\def\pgfPT@nomes@lxxxviii{r\'{a}dio/pt,radium/en,radium/fr,Radium/de,radio/it,radio/es,r\'{a}dio/br,\pgfPT@user@CSname@Ra/user}% +\def\pgfPT@nomes@lxxxix{act\'{i}nio/pt,actinium/en,actinium/fr,Actinium/de,attinio/it,actinio/es,act\'{i}nio/br,\pgfPT@user@CSname@Ac/user}% +\def\pgfPT@nomes@xc{t\'{o}rio/pt,thorium/en,thorium/fr,Thorium/de,torio/it,torio/es,t\'{o}rio/br,\pgfPT@user@CSname@Th/user}% +\def\pgfPT@nomes@xci{protact\'{i}nio/pt,protactinium/en,protactinium/fr,Protactinium/de,protactinio/it,protactinio/es,protact\'{i}nio/br,\pgfPT@user@CSname@Pa/user}% +\def\pgfPT@nomes@xcii{ur\^{a}nio/pt,uranium/en,uranium/fr,Uran/de,uranio/it,uranio/es,ur\^{a}nio/br,\pgfPT@user@CSname@U/user}% +\def\pgfPT@nomes@xciii{nept\'{u}nio/pt,neptunium/en,neptunium/fr,Neptunium/de,nettunio/it,neptunio/es,net\'{u}nio/br,\pgfPT@user@CSname@Np/user}% +\def\pgfPT@nomes@xciv{plut\'{o}nio/pt,plutonium/en,plutonium/fr,Plutonium/de,plutonio/it,plutonio/es,plut\^{o}nio/br,\pgfPT@user@CSname@Pu/user}% +\def\pgfPT@nomes@xcv{amer\'{i}cio/pt,americium/en,am\'{e}ricium/fr,Americium/de,americio/it,americio/es,amer\'{i}cio/br,\pgfPT@user@CSname@Am/user}% +\def\pgfPT@nomes@xcvi{c\'{u}rio/pt,curium/en,curium/fr,Curium/de,curio/it,curio/es,c\'{u}rio/br,\pgfPT@user@CSname@Cm/user}% +\def\pgfPT@nomes@xcvii{berqu\'{e}lio/pt,berkelium/en,berkelium/fr,Berkelium/de,berkelium/it,berkelio/es,berqu\'{e}lio/br,\pgfPT@user@CSname@Bk/user}% +\def\pgfPT@nomes@xcviii{calif\'{o}rnio/pt,californium/en,californium/fr,Californium/de,californio/it,californio/es,calif\'{o}rnio/br,\pgfPT@user@CSname@Cf/user}% +\def\pgfPT@nomes@xcix{einst\'{e}nio/pt,einsteinium/en,einsteinium/fr,Einsteinium/de,einsteinio/it,einstenio/es,einst\^{e}nio/br,\pgfPT@user@CSname@Es/user}% +\def\pgfPT@nomes@c{f\'{e}rmio/pt,fermium/en,fermium/fr,Rermium/de,fermium/it,fermio/es,f\'{e}rmio/br,\pgfPT@user@CSname@Fm/user}% +\def\pgfPT@nomes@ci{mendel\'{e}vio/pt,mendelevium/en,mendelevium/fr,Mendelevium/de,mendelevio/it,mendelevio/es,mendel\'{e}vio/br,\pgfPT@user@CSname@Md/user}% +\def\pgfPT@nomes@cii{nob\'{e}lio/pt,nobelium/en,nobelium/fr,Nobelium/de,nobelium/it,nobelio/es,nob\'{e}lio/br,\pgfPT@user@CSname@No/user}% +\def\pgfPT@nomes@ciii{laur\^{e}ncio/pt,lawrencium/en,lawrencium/fr,Lawrencium/de,laurenzio/it,lawrencium/es,laur\^{e}ncio/br,\pgfPT@user@CSname@Lr/user}% +\def\pgfPT@nomes@civ{rutherf\'{o}rdio/pt,rutherfordium/en,rutherfordium/fr,Rutherfordium/de,rutherfordium/it,rutherfordio/es,rutherf\'{o}rdio/br,\pgfPT@user@CSname@Rf/user}% +\def\pgfPT@nomes@cv{d\'{u}bnio/pt,dubnium/en,dubnium/fr,Dubnium/de,dubnio/it,dubnium/es,d\'{u}bnio/br,\pgfPT@user@CSname@Db/user}% +\def\pgfPT@nomes@cvi{seab\'{o}rgio/pt,seaborgium/en,seaborgium/fr,Seaborgium/de,seaborgio/it,seaborgio/es,seab\'{o}rgio/br,\pgfPT@user@CSname@Sg/user}% +\def\pgfPT@nomes@cvii{b\'{o}rio/pt,bohrium/en,bohrium/fr,Bohrium/de,bohrio/it,bohrium/es,b\'{o}hrio/br,\pgfPT@user@CSname@Bh/user}% +\def\pgfPT@nomes@cviii{h\'{a}ssio/pt,hassium/en,hassium/fr,Hassium/de,hassio/it,hassium/es,h\'{a}ssio/br,\pgfPT@user@CSname@Hs/user}% +\def\pgfPT@nomes@cix{meitn\'{e}rio/pt,meitnerium/en,meitnerium/fr,Meitnerium/de,meitnerio/it,meitnerio/es,meitn\'{e}rio/br,\pgfPT@user@CSname@Mt/user}% +\def\pgfPT@nomes@cx{darmst\'{a}dio/pt,darmstadtium/en,darmstadtium/fr,Darmstadtium/de,darmstadtium/it,darmstadtium/es,darmst\'{a}dtio/br,\pgfPT@user@CSname@Ds/user}% +\def\pgfPT@nomes@cxi{roentg\'{e}nio/pt,roentgenium/en,roentgenium/fr,R\"{o}ntgenium/de,roentgenio/it,roentgenio/es,roentg\^{e}nio/br,\pgfPT@user@CSname@Rg/user}% +\def\pgfPT@nomes@cxii{copern\'{i}cio/pt,copernicium/en,copernicium/fr,Copernicium/de,copernicium/it,copernicio/es,copern\'{i}cio/br,\pgfPT@user@CSname@Cn/user}% +\def\pgfPT@nomes@cxiii{nip\'{o}nio/pt,nihonium/en,nihonium/fr,Nihonium/de,nihonium/it,nihonio/es,nip\^{o}nio/br,\pgfPT@user@CSname@Nh/user}% +\def\pgfPT@nomes@cxiv{fler\'{o}vio/pt,flerovium/en,flerovium/fr,Flerovium/de,flerovio/it,flerovio/es,fler\'{o}vio/br,\pgfPT@user@CSname@Fl/user}% +\def\pgfPT@nomes@cxv{mosc\'{o}vio/pt,moscovium/en,moscovium/fr,Moscovium/de,moscovium/it,moscovio/es,mosc\'{o}vio/br,\pgfPT@user@CSname@Mc/user}% +\def\pgfPT@nomes@cxvi{liverm\'{o}rio/pt,livermorium/en,livermorium/fr,Livermorium/de,livermorio/it,livermorium/es,liverm\'{o}rio/br,\pgfPT@user@CSname@Lv/user}% +\def\pgfPT@nomes@cxvii{tenesso/pt,tennessine/en,tennessine/fr,Tenness/de,tennessine/it,teneso/es,tenesso/br,\pgfPT@user@CSname@Ts/user}% +\def\pgfPT@nomes@cxviii{ogan\'{e}sson/pt,oganesson/en,oganesson/fr,Oganesson/de,oganesson/it,oganes\'{o}n/es,oganess\^{o}nio/br,\pgfPT@user@CSname@Og/user}% \endinput% diff --git a/graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex b/graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex index fa52c916eb..54e5befb4c 100644 --- a/graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex +++ b/graphics/pgf/contrib/pgf-periodictable/pgfPT.process.language.tex @@ -4,7 +4,8 @@ % -------------------------------------------------------------------------------------------------- % The macros for process the language(s) data to display in the Periodic Table ------------ % -------------------------------------------------------------------------------------------------- -% Labels available in: pt, en, fr, de, it, es, br +% v2.1.0: Added support for user language +% Labels available in: pt, en, fr, de, it, es, br, user % -------------------------------------------------------------------------------------------------- % \pgfPTsetLanguage{<language flag>} % -------------------------------------------------------------------------------------------------- @@ -17,17 +18,23 @@ % - it, Italian % - es, Spanish % - br, Portuguese (Brazil) +% - user, user language \def\pgfPTsetLanguage#1{% -\pgfPT@validLang{#1}% +% changed in v2.1.0 +\edef\pgfPT@tmp{#1}% +\ifx\pggPT@userlanguage@ISOcode\pgfPT@tmp\relax\edef\pgfPT@tmp{user}\fi% +%\pgfPT@validLang{#1}% +\pgfPT@validLang{\pgfPT@tmp}% +% \ifx\pgfPT@langOK\undefined\relax% \PackageError{pgfPT}{invalid language flag '#1'. It will be ignored (default 'en'\space will be used)}{}% \xdef\pgfPT@defaultLanguage{en}% -\else\xdef\pgfPT@defaultLanguage{#1}\global\let\pgfPT@langOK\undefined\relax% +\else\xdef\pgfPT@defaultLanguage{#1}\global\let\pgfPT@langOK\undefined\relax\global\let\pgfPTlanguages\pgfPT@tmp\relax% \fi}% % -------------------------------------------------------------------------------------------------- % List of available languages % -------------------------------------------------------------------------------------------------- -\def\pgfPT@languagesList{pt,en,fr,de,it,es,br}% +\def\pgfPT@languagesList{pt,en,fr,de,it,es,br,user}% % -------------------------------------------------------------------------------------------------- % Validating language \def\pgfPT@validLang#1{\ignorespaces% diff --git a/graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex b/graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex new file mode 100644 index 0000000000..1f7f634f08 --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/translations/lang.nl.tex @@ -0,0 +1,269 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% -------------------------------------------------------------------------------------------------- +% subfile of pgf-PeriodicTable package ---------------------------------------------------------- +% -------------------------------------------------------------------------------------------------- +% +% Translation file for Nederlands +% Author: Wim De Borggraeve @2024/01/21 +% +% -------------------------------------------------------------------------------------------------- +% This is file lang.nl.tex +% Version: 1 +% Revision: 0 +% Date: 2024/02/10 +% Provides translation of data used +% in pgf-PeriodicTable files +% Language: Dutch +% ISO 639-1 code: nl +% ---------------------------- +\def\pgfPT@user@labels@titulo{Periodiek Systeem van de Elementen}% +% ---------------------------- +\def\pgfPT@user@labels@La{lanthaniden}% +\def\pgfPT@user@labels@Ac{actiniden}% +% ---------------------------- +\def\pgfPT@user@labels@solido{vast}% +\def\pgfPT@user@labels@liquido{vloeibaar}% +\def\pgfPT@user@labels@gasoso{gasvormig}% +\def\pgfPT@user@labels@sintetico{synthetisch}% +% ---------------------------- +% labels for legend +\def\pgfPT@user@labels@Z{Atoomnummer}% +\def\pgfPT@user@labels@name{Naam}% +\def\pgfPT@user@labels@CS{Chemisch Symbool}% +\def\pgfPT@user@labels@Ar@m{Relatieve Atoommassa}% +\def\pgfPT@user@labels@Arstar@m{Standaard Relatieve Atoommassa}% +\def\pgfPT@user@labels@Ar@w{Gemiddelde Atoommassa}% +\def\pgfPT@user@labels@Arstar@w{Standaard Gemiddelde Atoommassa}% +\def\pgfPT@user@labels@radio{Radioactief}% +\def\pgfPT@user@labels@R{Atoomstraal}% +\def\pgfPT@user@labels@Rcov{Covalente Straal}% +\def\pgfPT@user@labels@Rion{Ionstraal}% +\def\pgfPT@user@labels@Ei{Ionisatie-energie}% +\def\pgfPT@user@labels@eneg{Elektronegativiteit}% +\def\pgfPT@user@labels@eaff{Elektronenaffiniteit}% +\def\pgfPT@user@labels@O{Oxidatietrappen}% +\def\pgfPT@user@labels@Tmelt{Smeltpunt}% +\def\pgfPT@user@labels@TmeltC{Smeltpunt}% +\def\pgfPT@user@labels@Tboil{Kookpunt}% +\def\pgfPT@user@labels@TboilC{Kookpunt}% +\def\pgfPT@user@labels@eDist{Elektronenverdeling}% +\def\pgfPT@user@labels@eConfig{Elektronenconfiguratie}% +\def\pgfPT@user@labels@d{Dichtheid}% +\def\pgfPT@user@labels@Cp{Specifieke Warmtecapaciteit}% +\def\pgfPT@user@labels@kT{Thermische Geleidbaarheid}% +\def\pgfPT@user@labels@ls{Roosterstructuur}% +\def\pgfPT@user@labels@lsa{Roosterparameter: a}% +\def\pgfPT@user@labels@lsb{Roosterparameter: b}% +\def\pgfPT@user@labels@lsc{Roosterparameter: c}% +\def\pgfPT@user@labels@lsca{Verhouding roosterparameters c/a}% +\def\pgfPT@user@labels@DiscY{Jaar van Ontdekking}% +% Before Christ acronym: +\def\pgfPT@user@labels@BC{VC}% +\def\pgfPT@user@labels@DiscC{Land van Ontdekking}% +\def\pgfPT@user@labels@spectra{Emissiespectrum}% +% ---------------------------- +% acronym to use in legend +% for 'Name' +\def\pgfPT@user@acr@name{N}% +% for 'Chemical Symbol' +\def\pgfPT@user@acr@CS{CS}% +% for 'Radioactive' +\def\pgfPT@user@acr@radio{Ra}% +% for 'Melting Point' +\def\pgfPT@user@acr@Tmelt{Smeltpt}% +% for 'Boiling Point' +\def\pgfPT@user@acr@Tboil{Kookpt}% +% for 'Electron Distribution' +\def\pgfPT@user@acr@eDist{ev}% +% for 'Electronic Configuration' +\def\pgfPT@user@acr@eConfign{ec}% +% for 'Lattice Structure' +\def\pgfPT@user@acr@ls{rs}% +% for 'Lattice constant: a' +\def\pgfPT@user@acr@lsa{rs a}% +% for 'Lattice constant: b' +\def\pgfPT@user@acr@lsb{rs b}% +% for 'Lattice constant: c' +\def\pgfPT@user@acr@lsc{rs c}% +% for 'Lattice c/a ratio' +\def\pgfPT@user@acr@lsca{rs ca}% +% for 'Year of Discovery' +\def\pgfPT@user@acr@DiscY{jo}% +% for 'Country of Discovery' +\def\pgfPT@user@acr@DiscC{lo}% +% for 'Emission Spectrum' +\def\pgfPT@user@acr@spectra{es}% +% ---------------------------- +% blocks +\def\pgfPT@user@labels@blocos{s-blok}% +\def\pgfPT@user@labels@blocop{p-blok}% +\def\pgfPT@user@labels@blocod{d-blok}% +\def\pgfPT@user@labels@blocof{f-blok}% +% ---------------------------- +\def\pgfPT@user@labels@blocor{REPRESENTATIEVE ELEMENTEN}% +\def\pgfPT@user@labels@blocot{TRANSITIEMETALEN}% +\def\pgfPT@user@labels@blocoi{INWENDIGE TRANSITIEMETALEN}% +% ---------------------------- +% periodic variations +\def\pgfPT@user@labels@Raum{De atoomstraal neemt toe binnen de groep}% +\def\pgfPT@user@labels@Rdim{De atoomstraal neemt af binnen de periode}% +\def\pgfPT@user@labels@Eiaum{De ionisatie-energie neemt toe binnen de periode}% +\def\pgfPT@user@labels@Eidim{De ionisatie-energie neemt af binnen de groep}% +\def\pgfPT@user@labels@eaffaum{De elektronenaffiniteit neemt toe binnen de periode}% +\def\pgfPT@user@labels@eaffdim{De elektronenaffiniteit neemt af binnen de groep}% +% ---------------------------- +% lattice structure: +\def\pgfPT@user@labels@ls@bcc{kubisch I-gecenterd}% +\def\pgfPT@user@labels@ls@bcort{orthorhombisch C-gecenterd}% +\def\pgfPT@user@labels@ls@ctetr{tetragonaal I-gecenterd}% +\def\pgfPT@user@labels@ls@dia{diamant}% +\def\pgfPT@user@labels@ls@fcc{kubisch F-gecenterd}% +\def\pgfPT@user@labels@ls@fcort{orthorombisch F-gecenterd}% +\def\pgfPT@user@labels@ls@hcp{hexagonale dichtste bolstapeling}% +\def\pgfPT@user@labels@ls@hex{hexagonaal}% +\def\pgfPT@user@labels@ls@mono{monoklien}% +\def\pgfPT@user@labels@ls@rho{rhombo\"{e}drisch}% +\def\pgfPT@user@labels@ls@sc{kubisch primitief}% +\def\pgfPT@user@labels@ls@tric{triklien}% +\def\pgfPT@user@labels@ls@tetr{tetragonaal}% +% ---------------------------- +% element names +\def\pgfPT@user@CSname@H{waterstof}% +\def\pgfPT@user@CSname@He{helium}% +\def\pgfPT@user@CSname@Li{lithium}% +\def\pgfPT@user@CSname@Be{beryllium}% +\def\pgfPT@user@CSname@B{boor}% +\def\pgfPT@user@CSname@C{koolstof}% +\def\pgfPT@user@CSname@N{stikstof}% +\def\pgfPT@user@CSname@O{zuurstof}% +\def\pgfPT@user@CSname@F{fluor}% +\def\pgfPT@user@CSname@Ne{neon}% +\def\pgfPT@user@CSname@Na{natrium}% +\def\pgfPT@user@CSname@Mg{magnesium}% +\def\pgfPT@user@CSname@Al{aluminium}% +\def\pgfPT@user@CSname@Si{silicium}% +\def\pgfPT@user@CSname@P{fosfor}% +\def\pgfPT@user@CSname@S{zwavel}% +\def\pgfPT@user@CSname@Cl{chloor}% +\def\pgfPT@user@CSname@Ar{argon}% +\def\pgfPT@user@CSname@K{kalium}% +\def\pgfPT@user@CSname@Ca{calcium}% +\def\pgfPT@user@CSname@Sc{scandium}% +\def\pgfPT@user@CSname@Ti{titanium}% +\def\pgfPT@user@CSname@V{vanadium}% +\def\pgfPT@user@CSname@Cr{chroom}% +\def\pgfPT@user@CSname@Mn{mangaan}% +\def\pgfPT@user@CSname@Fe{ijzer}% +\def\pgfPT@user@CSname@Co{kobalt}% +\def\pgfPT@user@CSname@Ni{nikkel}% +\def\pgfPT@user@CSname@Cu{koper}% +\def\pgfPT@user@CSname@Zn{zink}% +\def\pgfPT@user@CSname@Ga{gallium}% +\def\pgfPT@user@CSname@Ge{germanium}% +\def\pgfPT@user@CSname@As{arseen}% +\def\pgfPT@user@CSname@Se{seleen}% +\def\pgfPT@user@CSname@Br{broom}% +\def\pgfPT@user@CSname@Kr{krypton}% +\def\pgfPT@user@CSname@Rb{rubidium}% +\def\pgfPT@user@CSname@Sr{strontium}% +\def\pgfPT@user@CSname@Y{yttrium}% +\def\pgfPT@user@CSname@Zr{zirkonium}% +\def\pgfPT@user@CSname@Nb{niobium}% +\def\pgfPT@user@CSname@Mo{molybdeen}% +\def\pgfPT@user@CSname@Tc{technetium}% +\def\pgfPT@user@CSname@Ru{ruthenium}% +\def\pgfPT@user@CSname@Rh{rhodium}% +\def\pgfPT@user@CSname@Pd{palladium}% +\def\pgfPT@user@CSname@Ag{zilver}% +\def\pgfPT@user@CSname@Cd{cadmium}% +\def\pgfPT@user@CSname@In{indium}% +\def\pgfPT@user@CSname@Sn{tin}% +\def\pgfPT@user@CSname@Sb{antimoon}% +\def\pgfPT@user@CSname@Te{telluur}% +\def\pgfPT@user@CSname@I{jood}% +\def\pgfPT@user@CSname@Xe{xenon}% +\def\pgfPT@user@CSname@Cs{cesium}% +\def\pgfPT@user@CSname@Ba{barium}% +\def\pgfPT@user@CSname@La{lanthaan}% +\def\pgfPT@user@CSname@Ce{cerium}% +\def\pgfPT@user@CSname@Pr{praseodymium}% +\def\pgfPT@user@CSname@Nd{neodymium}% +\def\pgfPT@user@CSname@Pm{promethium}% +\def\pgfPT@user@CSname@Sm{samarium}% +\def\pgfPT@user@CSname@Eu{europium}% +\def\pgfPT@user@CSname@Gd{gadolinium}% +\def\pgfPT@user@CSname@Tb{terbium}% +\def\pgfPT@user@CSname@Dy{dysprosium}% +\def\pgfPT@user@CSname@Ho{holmium}% +\def\pgfPT@user@CSname@Er{erbium}% +\def\pgfPT@user@CSname@Tm{thulium}% +\def\pgfPT@user@CSname@Yb{ytterbium}% +\def\pgfPT@user@CSname@Lu{lutetium}% +\def\pgfPT@user@CSname@Hf{hafnium}% +\def\pgfPT@user@CSname@Ta{tantaal}% +\def\pgfPT@user@CSname@W{wolfraam}% +\def\pgfPT@user@CSname@Re{renium}% +\def\pgfPT@user@CSname@Os{osmium}% +\def\pgfPT@user@CSname@Ir{iridium}% +\def\pgfPT@user@CSname@Pt{platina}% +\def\pgfPT@user@CSname@Au{goud}% +\def\pgfPT@user@CSname@Hg{kwik}% +\def\pgfPT@user@CSname@Tl{thallium}% +\def\pgfPT@user@CSname@Pb{lood}% +\def\pgfPT@user@CSname@Bi{bismut}% +\def\pgfPT@user@CSname@Po{polonium}% +\def\pgfPT@user@CSname@At{astaat}% +\def\pgfPT@user@CSname@Rn{radon}% +\def\pgfPT@user@CSname@Fr{francium}% +\def\pgfPT@user@CSname@Ra{radium}% +\def\pgfPT@user@CSname@Ac{actinium}% +\def\pgfPT@user@CSname@Th{thorium}% +\def\pgfPT@user@CSname@Pa{protactinium}% +\def\pgfPT@user@CSname@U{uranium}% +\def\pgfPT@user@CSname@Np{neptunium}% +\def\pgfPT@user@CSname@Pu{plutonium}% +\def\pgfPT@user@CSname@Am{americium}% +\def\pgfPT@user@CSname@Cm{curium}% +\def\pgfPT@user@CSname@Bk{berkelium}% +\def\pgfPT@user@CSname@Cf{californium}% +\def\pgfPT@user@CSname@Es{einsteinium}% +\def\pgfPT@user@CSname@Fm{fermium}% +\def\pgfPT@user@CSname@Md{mendelevium}% +\def\pgfPT@user@CSname@No{nobelium}% +\def\pgfPT@user@CSname@Lr{lawrencium}% +\def\pgfPT@user@CSname@Rf{rutherfordium}% +\def\pgfPT@user@CSname@Db{dubnium}% +\def\pgfPT@user@CSname@Sg{seaborgium}% +\def\pgfPT@user@CSname@Bh{bohrium}% +\def\pgfPT@user@CSname@Hs{hassium}% +\def\pgfPT@user@CSname@Mt{meitnerium}% +\def\pgfPT@user@CSname@Ds{darmstadtium}% +\def\pgfPT@user@CSname@Rg{r\"{o}ntgenium}% +\def\pgfPT@user@CSname@Cn{copernicium}% +\def\pgfPT@user@CSname@Nh{nihonium}% +\def\pgfPT@user@CSname@Fl{flerovium}% +\def\pgfPT@user@CSname@Mc{moscovium}% +\def\pgfPT@user@CSname@Lv{livermorium}% +\def\pgfPT@user@CSname@Ts{tennessine}% +\def\pgfPT@user@CSname@Og{oganesson}% +% ---------------------------- +% Country (or Region) names +\def\pgfPT@user@country@AM{Klein-Azi\"{e}}% +\def\pgfPT@user@country@au{Oostenrijk}% +\def\pgfPT@user@country@dn{Denemarken}% +\def\pgfPT@user@country@eg{Egypte}% +\def\pgfPT@user@country@fl{Finland}% +\def\pgfPT@user@country@fr{Frankrijk}% +\def\pgfPT@user@country@de{Duitsland}% +\def\pgfPT@user@country@it{Itali\"{e}}% +\def\pgfPT@user@country@ME{Midden-Oosten}% +\def\pgfPT@user@country@pe{Peru}% +\def\pgfPT@user@country@ro{Roemeni\"{e}}% +\def\pgfPT@user@country@ru{Rusland}% +\def\pgfPT@user@country@es{Spanje}% +\def\pgfPT@user@country@sw{Zweden}% +\def\pgfPT@user@country@ch{Zwitserland}% +\def\pgfPT@user@country@uk{Verenigd Koninkrijk}% +\def\pgfPT@user@country@us{Verenigde Staten}% +\def\pgfPT@user@country@mx{Mexico}% +\endinput% diff --git a/graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex b/graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex new file mode 100644 index 0000000000..ce93b70612 --- /dev/null +++ b/graphics/pgf/contrib/pgf-periodictable/translations/lang.undefined.tex @@ -0,0 +1,268 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% -------------------------------------------------------------------------------------------------- +% subfile of pgf-PeriodicTable package ---------------------------------------------------------- +% -------------------------------------------------------------------------------------------------- +% +% Translation file for user undefined +% Author: Hugo Gomes @2024/02/10 +% Dummy language file to make empty user definitions +% -------------------------------------------------------------------------------------------------- +% This is file lang.undefined.tex +% Version: 1 +% Revision: 0 +% Date: 2024/02/10 +% Provides translation of data used +% in pgf-PeriodicTable files +% Language: undefined +% ---------------------------- +\def\pgfPT@user@labels@titulo{}% +% ---------------------------- +\def\pgfPT@user@labels@La{}% +\def\pgfPT@user@labels@Ac{}% +% ---------------------------- +\def\pgfPT@user@labels@solido{}% +\def\pgfPT@user@labels@liquido{}% +\def\pgfPT@user@labels@gasoso{}% +\def\pgfPT@user@labels@sintetico{}% +% ---------------------------- +% labels for legend +\def\pgfPT@user@labels@Z{}% +\def\pgfPT@user@labels@name{}% +\def\pgfPT@user@labels@CS{}% +\def\pgfPT@user@labels@Ar@m{}% +\def\pgfPT@user@labels@Arstar@m{}% +\def\pgfPT@user@labels@Ar@w{}% +\def\pgfPT@user@labels@Arstar@w{}% +\def\pgfPT@user@labels@radio{}% +\def\pgfPT@user@labels@R{}% +\def\pgfPT@user@labels@Rcov{}% +\def\pgfPT@user@labels@Rion{}% +\def\pgfPT@user@labels@Ei{}% +\def\pgfPT@user@labels@eneg{}% +\def\pgfPT@user@labels@eaff{}% +\def\pgfPT@user@labels@O{}% +\def\pgfPT@user@labels@Tmelt{}% +\def\pgfPT@user@labels@TmeltC{}% +\def\pgfPT@user@labels@Tboil{}% +\def\pgfPT@user@labels@TboilC{}% +\def\pgfPT@user@labels@eDist{}% +\def\pgfPT@user@labels@eConfig{}% +\def\pgfPT@user@labels@d{}% +\def\pgfPT@user@labels@Cp{}% +\def\pgfPT@user@labels@kT{}% +\def\pgfPT@user@labels@ls{}% +\def\pgfPT@user@labels@lsa{}% +\def\pgfPT@user@labels@lsb{}% +\def\pgfPT@user@labels@lsc{}% +\def\pgfPT@user@labels@lsca{}% +\def\pgfPT@user@labels@DiscY{}% +% Before Christ acronym: +\def\pgfPT@user@labels@BC{}% +\def\pgfPT@user@labels@DiscC{}% +\def\pgfPT@user@labels@spectra{}% +% ---------------------------- +% acronym to use in legend +% for 'Name' +\def\pgfPT@user@acr@name{}% +% for 'Chemical Symbol' +\def\pgfPT@user@acr@CS{}% +% for 'Radioactive' +\def\pgfPT@user@acr@radio{}% +% for 'Melting Point' +\def\pgfPT@user@acr@Tmelt{}% +% for 'Boiling Point' +\def\pgfPT@user@acr@Tboil{}% +% for 'Electron Distribution' +\def\pgfPT@user@acr@eDist{}% +% for 'Electronic Configuration' +\def\pgfPT@user@acr@eConfign{}% +% for 'Lattice Structure' +\def\pgfPT@user@acr@ls{}% +% for 'Lattice constant: a' +\def\pgfPT@user@acr@lsa{}% +% for 'Lattice constant: b' +\def\pgfPT@user@acr@lsb{}% +% for 'Lattice constant: c' +\def\pgfPT@user@acr@lsc{}% +% for 'Lattice c/a ratio' +\def\pgfPT@user@acr@lsca{}% +% for 'Year of Discovery' +\def\pgfPT@user@acr@DiscY{}% +% for 'Country of Discovery' +\def\pgfPT@user@acr@DiscC{}% +% for 'Emission Spectrum' +\def\pgfPT@user@acr@spectra{}% +% ---------------------------- +% blocks +\def\pgfPT@user@labels@blocos{}% +\def\pgfPT@user@labels@blocop{}% +\def\pgfPT@user@labels@blocod{}% +\def\pgfPT@user@labels@blocof{}% +% ---------------------------- +\def\pgfPT@user@labels@blocor{}% +\def\pgfPT@user@labels@blocot{}% +\def\pgfPT@user@labels@blocoi{}% +% ---------------------------- +% periodic variations +\def\pgfPT@user@labels@Raum{}% +\def\pgfPT@user@labels@Rdim{}% +\def\pgfPT@user@labels@Eiaum{}% +\def\pgfPT@user@labels@Eidim{}% +\def\pgfPT@user@labels@eaffaum{}% +\def\pgfPT@user@labels@eaffdim{}% +% ---------------------------- +% lattice structure: +\def\pgfPT@user@labels@ls@bcc{}% +\def\pgfPT@user@labels@ls@bcort{}% +\def\pgfPT@user@labels@ls@ctetr{}% +\def\pgfPT@user@labels@ls@dia{}% +\def\pgfPT@user@labels@ls@fcc{}% +\def\pgfPT@user@labels@ls@fcort{}% +\def\pgfPT@user@labels@ls@hcp{}% +\def\pgfPT@user@labels@ls@hex{}% +\def\pgfPT@user@labels@ls@mono{}% +\def\pgfPT@user@labels@ls@rho{}% +\def\pgfPT@user@labels@ls@sc{}% +\def\pgfPT@user@labels@ls@tric{}% +\def\pgfPT@user@labels@ls@tetr{}% +% ---------------------------- +% element names +\def\pgfPT@user@CSname@H{Hugo}% +\def\pgfPT@user@CSname@He{Gomes}% +\def\pgfPT@user@CSname@Li{}% +\def\pgfPT@user@CSname@Be{}% +\def\pgfPT@user@CSname@B{}% +\def\pgfPT@user@CSname@C{}% +\def\pgfPT@user@CSname@N{}% +\def\pgfPT@user@CSname@O{}% +\def\pgfPT@user@CSname@F{}% +\def\pgfPT@user@CSname@Ne{}% +\def\pgfPT@user@CSname@Na{}% +\def\pgfPT@user@CSname@Mg{}% +\def\pgfPT@user@CSname@Al{}% +\def\pgfPT@user@CSname@Si{}% +\def\pgfPT@user@CSname@P{}% +\def\pgfPT@user@CSname@S{}% +\def\pgfPT@user@CSname@Cl{}% +\def\pgfPT@user@CSname@Ar{}% +\def\pgfPT@user@CSname@K{}% +\def\pgfPT@user@CSname@Ca{}% +\def\pgfPT@user@CSname@Sc{}% +\def\pgfPT@user@CSname@Ti{}% +\def\pgfPT@user@CSname@V{}% +\def\pgfPT@user@CSname@Cr{}% +\def\pgfPT@user@CSname@Mn{}% +\def\pgfPT@user@CSname@Fe{}% +\def\pgfPT@user@CSname@Co{}% +\def\pgfPT@user@CSname@Ni{}% +\def\pgfPT@user@CSname@Cu{}% +\def\pgfPT@user@CSname@Zn{}% +\def\pgfPT@user@CSname@Ga{}% +\def\pgfPT@user@CSname@Ge{}% +\def\pgfPT@user@CSname@As{}% +\def\pgfPT@user@CSname@Se{}% +\def\pgfPT@user@CSname@Br{}% +\def\pgfPT@user@CSname@Kr{}% +\def\pgfPT@user@CSname@Rb{}% +\def\pgfPT@user@CSname@Sr{}% +\def\pgfPT@user@CSname@Y{}% +\def\pgfPT@user@CSname@Zr{}% +\def\pgfPT@user@CSname@Nb{}% +\def\pgfPT@user@CSname@Mo{}% +\def\pgfPT@user@CSname@Tc{}% +\def\pgfPT@user@CSname@Ru{}% +\def\pgfPT@user@CSname@Rh{}% +\def\pgfPT@user@CSname@Pd{}% +\def\pgfPT@user@CSname@Ag{}% +\def\pgfPT@user@CSname@Cd{}% +\def\pgfPT@user@CSname@In{}% +\def\pgfPT@user@CSname@Sn{}% +\def\pgfPT@user@CSname@Sb{}% +\def\pgfPT@user@CSname@Te{}% +\def\pgfPT@user@CSname@I{}% +\def\pgfPT@user@CSname@Xe{}% +\def\pgfPT@user@CSname@Cs{}% +\def\pgfPT@user@CSname@Ba{}% +\def\pgfPT@user@CSname@La{}% +\def\pgfPT@user@CSname@Ce{}% +\def\pgfPT@user@CSname@Pr{}% +\def\pgfPT@user@CSname@Nd{}% +\def\pgfPT@user@CSname@Pm{}% +\def\pgfPT@user@CSname@Sm{}% +\def\pgfPT@user@CSname@Eu{}% +\def\pgfPT@user@CSname@Gd{}% +\def\pgfPT@user@CSname@Tb{}% +\def\pgfPT@user@CSname@Dy{}% +\def\pgfPT@user@CSname@Ho{}% +\def\pgfPT@user@CSname@Er{}% +\def\pgfPT@user@CSname@Tm{}% +\def\pgfPT@user@CSname@Yb{}% +\def\pgfPT@user@CSname@Lu{}% +\def\pgfPT@user@CSname@Hf{}% +\def\pgfPT@user@CSname@Ta{}% +\def\pgfPT@user@CSname@W{}% +\def\pgfPT@user@CSname@Re{}% +\def\pgfPT@user@CSname@Os{}% +\def\pgfPT@user@CSname@Ir{}% +\def\pgfPT@user@CSname@Pt{}% +\def\pgfPT@user@CSname@Au{}% +\def\pgfPT@user@CSname@Hg{}% +\def\pgfPT@user@CSname@Tl{}% +\def\pgfPT@user@CSname@Pb{}% +\def\pgfPT@user@CSname@Bi{}% +\def\pgfPT@user@CSname@Po{}% +\def\pgfPT@user@CSname@At{}% +\def\pgfPT@user@CSname@Rn{}% +\def\pgfPT@user@CSname@Fr{}% +\def\pgfPT@user@CSname@Ra{}% +\def\pgfPT@user@CSname@Ac{}% +\def\pgfPT@user@CSname@Th{}% +\def\pgfPT@user@CSname@Pa{}% +\def\pgfPT@user@CSname@U{}% +\def\pgfPT@user@CSname@Np{}% +\def\pgfPT@user@CSname@Pu{}% +\def\pgfPT@user@CSname@Am{}% +\def\pgfPT@user@CSname@Cm{}% +\def\pgfPT@user@CSname@Bk{}% +\def\pgfPT@user@CSname@Cf{}% +\def\pgfPT@user@CSname@Es{}% +\def\pgfPT@user@CSname@Fm{}% +\def\pgfPT@user@CSname@Md{}% +\def\pgfPT@user@CSname@No{}% +\def\pgfPT@user@CSname@Lr{}% +\def\pgfPT@user@CSname@Rf{}% +\def\pgfPT@user@CSname@Db{}% +\def\pgfPT@user@CSname@Sg{}% +\def\pgfPT@user@CSname@Bh{}% +\def\pgfPT@user@CSname@Hs{}% +\def\pgfPT@user@CSname@Mt{}% +\def\pgfPT@user@CSname@Ds{}% +\def\pgfPT@user@CSname@Rg{}% +\def\pgfPT@user@CSname@Cn{}% +\def\pgfPT@user@CSname@Nh{}% +\def\pgfPT@user@CSname@Fl{}% +\def\pgfPT@user@CSname@Mc{}% +\def\pgfPT@user@CSname@Lv{}% +\def\pgfPT@user@CSname@Ts{}% +\def\pgfPT@user@CSname@Og{}% +% ---------------------------- +% Country (or Region) names +\def\pgfPT@user@country@AM{}% +\def\pgfPT@user@country@au{}% +\def\pgfPT@user@country@dn{}% +\def\pgfPT@user@country@eg{}% +\def\pgfPT@user@country@fl{}% +\def\pgfPT@user@country@fr{}% +\def\pgfPT@user@country@de{}% +\def\pgfPT@user@country@it{}% +\def\pgfPT@user@country@ME{}% +\def\pgfPT@user@country@pe{}% +\def\pgfPT@user@country@ro{}% +\def\pgfPT@user@country@ru{}% +\def\pgfPT@user@country@es{}% +\def\pgfPT@user@country@sw{}% +\def\pgfPT@user@country@ch{}% +\def\pgfPT@user@country@uk{}% +\def\pgfPT@user@country@us{}% +\def\pgfPT@user@country@mx{}% +\endinput% diff --git a/macros/generic/lt3luabridge/docstrip.cfg b/macros/generic/lt3luabridge/docstrip.cfg index 4e131f1849..e562506f72 100644 --- a/macros/generic/lt3luabridge/docstrip.cfg +++ b/macros/generic/lt3luabridge/docstrip.cfg @@ -1,6 +1,6 @@ \preamble -Copyright (C) 2016-2022 Vít Novotný +Copyright (C) 2016-2024 Vít Novotný This work may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c diff --git a/macros/generic/lt3luabridge/lt3luabridge.dtx b/macros/generic/lt3luabridge/lt3luabridge.dtx index 3b9c483ba8..67cc73c738 100644 --- a/macros/generic/lt3luabridge/lt3luabridge.dtx +++ b/macros/generic/lt3luabridge/lt3luabridge.dtx @@ -39,7 +39,7 @@ % } % % \author{^^A -% Vít Novotný\thanks +% Vít Starý Novotný\thanks % {^^A % E-mail: % \href{mailto:witiko@mail.muni.cz} @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Released 2022-10-24} +% \date{Released 2024-02-14} % % \maketitle % @@ -108,6 +108,14 @@ % the \cs{luabridge_now:e} function. % \end{function} % +% \begin{function}[added = 2024-02-14]{\luabridge_tl_set:Nn} +% \begin{syntax} +% \cs{luabridge_tl_set:Nn} \meta{tl var} \Arg{token list} +% \end{syntax} +% Like \cs{lua_now:n} but the result of executing the Lua code is stored in +% \meta{tl var} instead of being inserted into \TeX's input stream. +% \end{function} +% % \section{Setting and getting the method to execute \Lua{} code} % % There are several methods that can be used to execute \Lua{} code. This @@ -286,7 +294,7 @@ \c_luabridge_default_error_output_filename_str } \cs_new:Nn - \luabridge_now:n + \luabridge_tl_set:Nn { \iow_open:NV \g_tmpa_iow @@ -304,7 +312,7 @@ % \begin{macrocode} \tl_set:Nx \l_tmpa_tl - { \tl_to_str:n { #1 } } + { \tl_to_str:n { #2 } } \regex_replace_all:nnN { [\\"] } { \\\0 } @@ -355,9 +363,8 @@ \g_luabridge_helper_script_filename_str } { } - \l_tmpa_tl + #1 { - \l_tmpa_tl } { \msg_error:nn @@ -420,11 +427,11 @@ { \c_luabridge_method_directlua_int } { \cs_new:Nn - \luabridge_now:n + \luabridge_tl_set:Nn { \tl_set:Nn \l_tmpa_tl - { #1 } + { #2 } \tl_set:Nx \l_tmpa_tl { @@ -442,13 +449,26 @@ end~ \exp_not:V \l_tmpa_tl } - \lua_now:V - \l_tmpa_tl + \tl_set:Nf + #1 + { + \lua_now:V + \l_tmpa_tl + } } \cs_generate_variant:Nn \lua_now:n { V } } +\cs_new:Nn + \luabridge_now:n + { + \luabridge_tl_set:Nn + \l_tmpb_tl + { #1 } + \tl_use:N + \l_tmpb_tl + } \cs_new_protected:Npn \luabridgeExecute #1 @@ -472,8 +492,8 @@ \RequirePackage{expl3} \ProvidesExplPackage {lt3luabridge}% - {2022-10-24}% - {2.0.2}% + {2024-02-14}% + {2.1.0}% {An expl3 package that allows you to execute Lua code in LuaTeX or any other TeX engine that exposes the shell} \input lt3luabridge\relax diff --git a/macros/generic/lt3luabridge/lt3luabridge.pdf b/macros/generic/lt3luabridge/lt3luabridge.pdf Binary files differindex 79d59210e7..2972fad79f 100644 --- a/macros/generic/lt3luabridge/lt3luabridge.pdf +++ b/macros/generic/lt3luabridge/lt3luabridge.pdf diff --git a/macros/latex-dev/base/README.md b/macros/latex-dev/base/README.md index fcfee6ef01..ed14347e98 100644 --- a/macros/latex-dev/base/README.md +++ b/macros/latex-dev/base/README.md @@ -1,7 +1,7 @@ The LaTeX kernel ================ -Release 2024-06-01 pre-release 0 +Release 2024-06-01 pre-release 1 Overview -------- diff --git a/macros/latex-dev/base/alltt.dtx b/macros/latex-dev/base/alltt.dtx index 548b91bcea..4718c004b4 100644 --- a/macros/latex-dev/base/alltt.dtx +++ b/macros/latex-dev/base/alltt.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -40,7 +40,7 @@ %<package>\ProvidesPackage{alltt} %<driver>\ProvidesFile{alltt.drv} %\ProvidesFile{alltt.dtx} - [2021/01/29 v2.0g defines alltt environment] + [2024/02/08 v2.0g defines alltt environment] % %<*driver> \documentclass{ltxdoc} @@ -97,7 +97,7 @@ % \end{itemize} % % \textbf{NB} When you are using \textsf{OT1} encoded fonts you might -% be surprsied when you switch to italics, becuase those fonts have +% be surprised when you switch to italics, because those fonts have % a different set of glyphs: % \begin{alltt} % The glyph at the position of the $ in a slanted font: \textsl{$}. diff --git a/macros/latex-dev/base/alltt.ins b/macros/latex-dev/base/alltt.ins index 3f40ddc0f0..6d702c1cc7 100644 --- a/macros/latex-dev/base/alltt.ins +++ b/macros/latex-dev/base/alltt.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/alltt.pdf b/macros/latex-dev/base/alltt.pdf Binary files differindex 074d5b4de9..54c606fcf2 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 16a9f23b96..2456f57219 100644 --- a/macros/latex-dev/base/cfgguide.pdf +++ b/macros/latex-dev/base/cfgguide.pdf diff --git a/macros/latex-dev/base/cfgguide.tex b/macros/latex-dev/base/cfgguide.tex index e0f76b74fb..9b750593c4 100644 --- a/macros/latex-dev/base/cfgguide.tex +++ b/macros/latex-dev/base/cfgguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/changes.txt b/macros/latex-dev/base/changes.txt index 812143d3e3..dec230e890 100644 --- a/macros/latex-dev/base/changes.txt +++ b/macros/latex-dev/base/changes.txt @@ -1,22 +1,133 @@ -================================================================================ -This file lists changes to the LaTeX2e files in reverse chronological order -of publication (therefore the dates might be out of sequence if there are -hotfixes). It is provided for convenience only. It therefore makes no claims -to completeness or accuracy and it contains some references to files that are -not part of the distribution. -================================================================================ +================================================================================ +This file lists changes to the LaTeX2e files in reverse chronological order +of publication (therefore the dates might be out of sequence if there are +hotfixes). It is provided for convenience only. It therefore makes no claims +to completeness or accuracy and it contains some references to files that are +not part of the distribution. +================================================================================ + +2024-01-30 David Carlisle <David.Carlisle@latex-project.org> + * ltclass.dtx: check that \RequirePackage, \documentclass, \usepackage + and related commands are at top level (gh/1185) + +2023-11-12 Joseph Wright <Joseph.Wright@latex-project.org> + * lttemplates.dtx + New file to replace loading xtemplate + +2024-01-30 Jérôme Laurens <jerome.laurens@u-bourgogn.fr> + * lthooks.dtx: + Fix rollback to 2020-10-01. + +2024-01-29 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * ltmarks.dtx: + Generalized the support for extracting marks to cover cases like multicols. + + Some internal commands renamed and extended. + Renamed \__mark_update_structure:nn to \__mark_update_structure_from_material:nn + Added \__mark_get_marks_for_reinsertion:nNN + Added \ShowMarksAt for debugging (might not stay this way) + +2024-01-27 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * lttextcomp.dtx (section{Font family sub-encodings setup}): + Adjusted/corrected TS1 sub-encoding declarations for various families. + Some families have changed their names (due to licensing issues), + some got new glyphs added, and some were simply incorrectly categorized + (gh/1257) + + * lttextcomp.dtx (section{The \texttt{checkencodingsubset.tex} file}): + Added check file for encoding subset + +2024-01-03 Phelype Oleinik <phelype.oleinik@latex-project.org> + * lthooks.dtx: + Correct expansion of \@@_print_args:nn argument (gh/1221). + +2023-12-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * doc.dtx (subsection{Macros surrounding the `definition parts'}): + Use \@noligs from the LaTeX kernel, so that the upquote + package can add its patch (gh/1230) + +2023-12-26 Yukai Chou <muzimuzhi@gmai.com> + * ltproperties.dtx: + Correct typo (gh/1223) + * doc.dtx, ltfntcmd.dtx, lthooks.dtx + Correct similar typos of missing backslashes + * ltfilehook.dtx + Change flag markup in macro env + +2023-12-22 Yukai Chou <muzimuzhi@gmail.com> + * ltcmd.dtx (subsection{Normalizing the argument specifications}) + Clarify error message when an argument prefix `!' is applied to + a non-trailing optional argument. (gh/1198) + +2023-12-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * lttagging.dtx: + First version of lttagging module added + +2023-12-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * ltproperties.dtx: use \protected@write, (gh1200) + +2023-12-02 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * doc.dtx (subsection{API creation}): + Provide \ProvideDocElement for use cases where files are processed + individually as well as together, e.g., the LaTeX kernel documentation. + +2023-12-01 Joseph Wright <Joseph.Wright@latex-project.org> + * ltcmd.dtx (subsection{Declaring commands and environments}): + Optimize creation of simple document commands (gh/1189) + * usrguide.tex (subsection{Performance}): + Document efficiency of ltcmd definitions + +2023-11-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * ltpara.dtx (subsection{Providing hooks for paragraphs}): + Correct error message: hook left horizontal not vertical mode (gh/1182) + +2023-11-15 Joseph Wright <Joseph.Wright@latex-project.org> + * ltfiles.dtx (subsection{Listing files}): + Extend \listfiles to optionally include file sizes and hashes + * usrguide.tex + Re-introduce \listfiles (extended) description + +2023-11-09 Yukai Chou <muzimuzhi@gmail.com> + * clsguide-historic.tex, usrguide.tex: + Replace quotation with quote envs for zero para indent + + * clsguide-historic.tex, usrguide-historic.tex + Mention correct source file names in license footnotes + +2023-11-07 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + * ltoutenc.dtx (subsection{The fontenc package}): + Add more explanation to error message about missing encoding (gh/1102) + + * nfssfont.dtx (section{The code}): + Corrected spelling in error message. + + * ltcounts.dtx (subsection{Environment Counter Macros}): + In \newcounter do not change \the... if already defined (gh/823) + + * ltplain.dtx (section{Plain \TeX}): + Set \tracinglostchars to 2 in \tracingnone (gh/549) ================================================================================ All changes above are only part of the development branch for the next release. ================================================================================ ######################### +# 2023-11-01 PL1 Release +######################### + +2024-01-13 Jonathan P. Spratte <jspratte@yahoo.de> + * ltkeys.dtx: + Trim spaces off key names taken from the raw-lists (gh1238) + +######################### # 2023-11-01 Release ######################### -2023-10-15 Ulrike Fischer <Ulrike.Fischer@latex-project.org> - * ltproperties.dtx: - Add support for pagetarget property. +2023-10-15 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * ltproperties.dtx: + Add support for pagetarget property. 2023-10-26 David Carlisle <David.Carlisle@latex-project.org> * ltboxes.dtx: @@ -48,9 +159,9 @@ All changes above are only part of the development branch for the next release. Explain the steps carried out by the replacement algorithm for @@. 2023-09-13 Ulrike Fischer <Ulrike.Fischer@latex-project.org> - * ltproperties.dtx: + * ltproperties.dtx: Use \protected@edef for expansion in the LaTeX2e commands. - + 2023-09-13 Ulrike Fischer <Ulrike.Fischer@latex-project.org> * ltproperties.dtx: Expand consistently the label/property names in the LaTeX2e commands. @@ -135,7 +246,7 @@ All changes above are only part of the development branch for the next release. * ltfiles.dtx Allow for pipes in \input, etc. -2023-06-16 Phelype Oleinik <Joseph.Wright@latex-project.org> +2023-06-16 Phelype Oleinik <phelype.oleinik@latex-project.org> * lthooks.dtx, ltcmdhooks.dtx Correct some rollback labels and dates. diff --git a/macros/latex-dev/base/classes.dtx b/macros/latex-dev/base/classes.dtx index 58690e8375..f7c53f0f71 100644 --- a/macros/latex-dev/base/classes.dtx +++ b/macros/latex-dev/base/classes.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -53,7 +53,7 @@ %<*driver> \ProvidesFile{classes.drv} %</driver> - [2023/05/17 v1.4n + [2024/02/08 v1.4n %<article|report|book> Standard LaTeX document class] %<10pt|11pt|12pt> Standard LaTeX file (size option)] % \end{macrocode} @@ -1882,7 +1882,7 @@ % \changes{v1.3a}{1995/05/17}{Use \cs{@makefnmark} in definition of % \cs{@makefntext}} % \changes{v1.3g}{1995/06/26}{Fix definition of \cs{@makefnmark} and -% \cs{@makefntext} to a) work and b) without using math} +% \cs{@makefntext} to (a) work and (b) without using math} % \begin{macrocode} \else \newcommand\maketitle{\par @@ -2002,7 +2002,7 @@ % `section'. % \item[\meta{level}] A number, denoting the depth of the section % -- e.g., chapter=1, section = 2, etc. A section number -% will be printed if and only if \meta{level} $<=$ the value +% will be printed if and only if \meta{level} $\leq$ the value % of the \Lcount{secnumdepth} counter. % \item[\meta{indent}] The indentation of the heading from the left % margin @@ -3068,7 +3068,7 @@ % list environment's parameters. The user types |\\| to end a line. % This is implemented by |\let|'ing |\\| equal |\@centercr|. % -% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with +% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with ^^A ] % \cs{relax}} % \begin{macrocode} \newenvironment{verse} @@ -3091,7 +3091,7 @@ % are set smaller than |\textwidth|. The first line of a paragraph % inside this environment is indented. % -% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with +% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with ^^A ] % \cs{relax}} % \begin{macrocode} \newenvironment{quotation} @@ -3110,7 +3110,7 @@ % The quote environment is like the quotation environment except % that paragraphs are not indented. % -% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with +% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with ^^A ] % \cs{relax}} % \begin{macrocode} \newenvironment{quote} diff --git a/macros/latex-dev/base/classes.ins b/macros/latex-dev/base/classes.ins index 50a51ea666..7fa35896a4 100644 --- a/macros/latex-dev/base/classes.ins +++ b/macros/latex-dev/base/classes.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/classes.pdf b/macros/latex-dev/base/classes.pdf Binary files differindex 6ba6e988b6..c45fd63ac0 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 c40cf8d8d7..89df4cf17e 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-historic.tex b/macros/latex-dev/base/clsguide-historic.tex index d7a27e3c40..bb5e4b5e96 100644 --- a/macros/latex-dev/base/clsguide-historic.tex +++ b/macros/latex-dev/base/clsguide-historic.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -34,15 +34,15 @@ \title{\LaTeXe~for class and package writers --- historic version} -\author{Copyright \copyright~1995--2006 The \LaTeX\ Project\\ +\author{Copyright \copyright~1995--2023 The \LaTeX\ Project\\ All rights reserved.% \footnote{This file may be distributed and/or modified under the conditions of the \LaTeX{} Project Public License, either version 1.3c of this license or (at your option) any later version. See the source - \texttt{clsguide.tex} for full details.}% + \texttt{clsguide-historic.tex} for full details.}% } -\date{11 January 2023} +\date{09 November 2023} \begin{document} @@ -1481,7 +1481,7 @@ problem, \LaTeX{} provides two new commands |\MakeUppercase| and |\MakeLowercase| to do this. For example: -\begin{quotation} +\begin{quote} \begin{tabular}{rl} |\uppercase{aBcD\ae\AA\ss\OE}| & \uppercase{aBcD\ae\AA\ss\OE}\\ |\lowercase{aBcD\ae\AA\ss\OE}| & \lowercase{aBcD\ae\AA\ss\OE}\\ @@ -1489,7 +1489,7 @@ For example: \MakeUppercase{aBcD\ae\AA\ss\OE}\\ |\MakeLowercase{aBcD\ae\AA\ss\OE}| & \MakeLowercase{aBcD\ae\AA\ss\OE} \end{tabular} -\end{quotation} +\end{quote} The commands |\MakeUppercase| and |\MakeLowercase| themselves are robust, but they have moving arguments. diff --git a/macros/latex-dev/base/clsguide.pdf b/macros/latex-dev/base/clsguide.pdf Binary files differindex c8c14014da..b6146de10e 100644 --- a/macros/latex-dev/base/clsguide.pdf +++ b/macros/latex-dev/base/clsguide.pdf diff --git a/macros/latex-dev/base/clsguide.tex b/macros/latex-dev/base/clsguide.tex index 457f74f287..c23f0a55e9 100644 --- a/macros/latex-dev/base/clsguide.tex +++ b/macros/latex-dev/base/clsguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2023 +% Copyright (C) 2023-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -42,7 +42,7 @@ \texttt{clsguide.tex} for full details.}% } -\date{2023-10-24} +\date{2023-12-02} \NewDocumentCommand\cs{m}{\texttt{\textbackslash\detokenize{#1}}} \NewDocumentCommand\marg{m}{\arg{#1}} @@ -891,7 +891,7 @@ unknown option on to a non-keyval class such as \pkg{article}: The |\ProcessKeyOptions| function is used to check the current option list against the keys defined for \m{family}. Global (class) options and local (package) options are checked when this function is called in a package. -The command will process \emph{all} options given the the current +The command will process \emph{all} options given the current package or class: there is no need to also apply \cs{ProcessOptions}. \begin{decl} diff --git a/macros/latex-dev/base/cmextra.ins b/macros/latex-dev/base/cmextra.ins index 0fa45183fc..3f06c1548b 100644 --- a/macros/latex-dev/base/cmextra.ins +++ b/macros/latex-dev/base/cmextra.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/cmfonts.fdd b/macros/latex-dev/base/cmfonts.fdd index af898e47b2..556db5be81 100644 --- a/macros/latex-dev/base/cmfonts.fdd +++ b/macros/latex-dev/base/cmfonts.fdd @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/cmfonts.ins b/macros/latex-dev/base/cmfonts.ins index af5ac7e5f8..fb9d08f440 100644 --- a/macros/latex-dev/base/cmfonts.ins +++ b/macros/latex-dev/base/cmfonts.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/cmfonts.pdf b/macros/latex-dev/base/cmfonts.pdf Binary files differindex fe88b5af3b..e417fb5389 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 5678806510..f9f6644c9a 100644 --- a/macros/latex-dev/base/cyrguide.pdf +++ b/macros/latex-dev/base/cyrguide.pdf diff --git a/macros/latex-dev/base/cyrguide.tex b/macros/latex-dev/base/cyrguide.tex index 394cd59e20..9a79a80e59 100644 --- a/macros/latex-dev/base/cyrguide.tex +++ b/macros/latex-dev/base/cyrguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/doc-code.pdf b/macros/latex-dev/base/doc-code.pdf Binary files differindex 51e6dad9e8..67ab8bf64d 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 75e04cc299..82eb8dc5b8 100644 --- a/macros/latex-dev/base/doc.dtx +++ b/macros/latex-dev/base/doc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -45,7 +45,7 @@ %<+package> %<+package>\ProvidesPackage{doc} %<+shortvrb>\ProvidesPackage{shortvrb} -%<+package|shortvrb> [2022/11/13 v3.0m +%<+package|shortvrb> [2024/02/08 v3.0o %<+package|shortvrb> Standard LaTeX documentation package V3 (FMi)] %\catcode`\<=12 % @@ -57,7 +57,7 @@ % % %% Package `doc' to use with LaTeX 2e -%% Copyright (C) 1989-2022 Frank Mittelbach, all rights reserved. +%% Copyright (C) 1989-2023 Frank Mittelbach, all rights reserved. % % % Version: Date: Changes: @@ -143,8 +143,8 @@ % \MakeShortVerb{\|} % \setcounter{StandardModuleDepth}{1} % -% {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print -% \gdef\dimenvalue#1pt{$#1$pt}} ^^A a register value with a - sign +% {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print a +% \gdef\dimenvalue#1pt{$#1$pt}} ^^A register value with a - sign % % \newcommand{\DOC}{\texttt{doc}\xspace} % @@ -167,7 +167,7 @@ %\RenewDocElement[macrolike = true , % toplevel = false, % idxtype = , -% idxgroup = LaTeX comands\actualchar\LaTeX{} commands , +% idxgroup = LaTeX commands\actualchar\LaTeX{} commands , % printtype = % ]{Macro}{macro} % @@ -237,7 +237,7 @@ % \changes{v1.9t}{1995/05/11}{Use \cs{GetFileInfo}} % \GetFileInfo{doc.sty} % -% \CheckSum{0} ^^A % keep the checksum in this file but not now :-) +% \CheckSum{0} % % \title{The \DOC{} and \texttt{shortvrb} Packages\thanks % {This file has version number \fileversion{} dated \filedate{}.}} @@ -595,7 +595,16 @@ % class file (like \texttt{ltugboat.cls}) use the |\DocstyleParms| % command described below. Starting with release 2.0a it can now % be changed directly as long as the redefinition happens before -% the |\begin{document}|. +% the |\begin{document}| (if you change it later you might see strange +% typesetting effects if you are unlucky). +% +% |\MacroFont| does not alter the font of +% |\verb| or |\verb*| because it is often used to make the font size of +% the code displays smaller, which would look odd if used within a +% paragraph. If you decide to use a different font family and want to +% use the same family with +% |\verb| you need to alter the font setup for |\ttfamily| in addition +% to |\MacroFont|. % % \DescribeEnv{environment} % For documenting the definition of environments one can use the @@ -695,6 +704,12 @@ % |\NewDocElement{Env}{environment}| % though that's not quite what has been done, as we will see later. % +% \DescribeInterfaceMacro{\ProvideDocElement} +% This declaration does nothing when the doc element is already +% declared, otherwise it works like \cs{NewDocElement}. It can be +% useful if you have many documentation files that you may want to +% process individually as well as together. +% % \DescribeOption[noprint]{macrolike} % \DescribeOption[noprint]{envlike} % \DescribeOption[noprint]{toplevel} @@ -1367,7 +1382,7 @@ %\RenewDocElement[macrolike = true , % toplevel = false, % idxtype = , -% idxgroup = LaTeX comands\actualchar\LaTeX{} commands , +% idxgroup = LaTeX commands\actualchar\LaTeX{} commands , % printtype = % ]{Macro}{macro} %\end{verbatim} @@ -1515,7 +1530,7 @@ % % Thirty years is a long time in the life of computer programs, so % there are a good number of interfaces within \DOC that are really -% only of historical interest (or when processing equally old sources. +% only of historical interest (or when processing equally old sources). % We list them here, but in general we suggest that for new % documentation they should not be used. % @@ -2108,9 +2123,12 @@ % that is, they must be given |\catcode| $12$. % \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim, % which handles more ligatures.} +% \changes{v3.0o}{2023/12/30}{Use \cs{@noligs} from the \LaTeX\ +% kernel, so that the \texttt{upquote} package can +% add its patch (gh/1230)} % \begin{macrocode} \obeylines - \let\do\do@noligs \verbatim@nolig@list + \@noligs \let\do\@makeother \dospecials % \end{macrocode} % \changes{v1.5t}{1989/11/07}{Common code added.} @@ -2183,7 +2201,7 @@ % \changes{v1.7a}{1992/03/13}{Added \cs{reset@font} for NFSS.} % \changes{v1.8c}{1993/10/25}{NFSS standard} % \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different -% math setup /pr1622} +% math setup /pr1622)} % \begin{macrocode} \@ifundefined{MacroFont}{% \if@compatibility @@ -2220,7 +2238,7 @@ % \changes{v1.7m}{1992/10/11}{Use sltt as default.} % \changes{v1.8c}{1993/10/25}{NFSS standard} % \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different -% math setup /pr1622} +% math setup /pr1622)} % Although most of the macro code is set in |\MacroFont| we want to be % able to switch to indicate module code set in |\AltMacroFont|. % |\macro@font| keeps track of which one we're using. We can't do the @@ -2681,7 +2699,7 @@ % \end{macrocode} % % \changes{v2.1j}{2019/11/03}{Kernel now sets up \cs{verbvisiblespace} (gh/205)} -% \changes{v2.1k}{2019/11/10}{Put the definition into the right command :-( (gh/205)} +% \changes{v2.1k}{2019/11/10}{Put the definition into the right command (gh/205)} % \begin{macrocode} \@setupverbvisiblespace \MacroFont \@vobeyspaces \@sxverbatim} @@ -2895,32 +2913,32 @@ % following tasks: % \begin{itemize} % \parindent4em -% \item[1)] +% \item[(1)] % |\catcode| all characters used in macro names to -% 11 (i.e.\ `letter'). -% \item[2)] +% 11 (i.e., `letter'). +% \item[(2)] % |\catcode| the `|\|' character to 13 -% (i.e.\ `active'). -% \item[3a)] +% (i.e., `active'). +% \item[(3a)] % |\let| the `|\|' equal |\scan@macro| -% (i.e.\ start the macro scanning mechanism) if there is -% no special escape character (i.e.\ the +% (i.e., start the macro scanning mechanism) if there is +% no special escape character (i.e., the % |\special@escape@char| is `|\|'). -% \item[3b)] +% \item[(3b)] % Otherwise |\let| it equal |\bslash|, i.e.\ % produce a printable |\|. -% \item[4)] +% \item[(4)] % Make the \meta{special escape character} active. -% \item[5)] +% \item[(5)] % |\let| the active version of the special escape % character -% (i.e.\ the expansion of |\active@escape@char|) equal +% (i.e., the expansion of |\active@escape@char|) equal % |\scan@macro|. % \end{itemize} % The reader might ask why we bother to |\catcode| the % `|\|' first to 12 (at the end of |\macro@code|) then % re-|\catcode| it to 13 in order to produce a $|\|_{12}$ -% in case 3b) above. This is done because we have to ensure that +% in case (3b) above. This is done because we have to ensure that % `|\|' has |\catcode| 13 within the \env{macrocode} % environment. Otherwise the delimiter for the argument of % |\xmacro@code| would not be found (parameter matching @@ -2930,14 +2948,14 @@ % \begin{macrocode} \begingroup \catcode`\|=\z@ \catcode`\\=\active % \end{macrocode} -% We carry out tasks 2) and 3b) first. +% We carry out tasks (2) and (3b) first. % \SpecialEscapechar\| % \begin{macrocode} |gdef|init@crossref{|catcode`|\|active |let\|bslash % \end{macrocode} % Because of the popularity of the `|@|' character as a % `letter' in macros, we normally have to change its -% |\catcode| here, and thus fulfill task 1). But the macro +% |\catcode| here, and thus fulfill task (1). But the macro % designer might use other characters as private letters as well, % so we use a macro to do the |\catcode| switching. % \SpecialEscapechar\| @@ -2945,8 +2963,8 @@ |MakePrivateLetters % \end{macrocode} % Now we |\catcode| the special escape character to 13 and -% |\let| it equal |\scan@macro|, i.e.\ fulfill tasks 4) -% and 5). Note the use of |\expandafter| to insert the chosen +% |\let| it equal |\scan@macro|, i.e., fulfill tasks (4) +% and (5). Note the use of |\expandafter| to insert the chosen % escape character saved in |\special@escape@char| and % |\active@escape@char|. % \SpecialEscapechar\| @@ -2955,7 +2973,7 @@ |expandafter|let|active@escape@char|scan@macro} |endgroup % \end{macrocode} -% If there is no special escape character, i.e.\ if +% If there is no special escape character, i.e., if % |\SpecialEscapechar| is |\\|, the second last line will % overwrite the previous definition of $|\|_{13}$. In this % way all tasks are fulfilled. @@ -3109,9 +3127,9 @@ % done by the |\ifnot@excluded| macro which assumes that the % macro name is saved in |\macro@namepart|. The character % mustn't be stored with a special category code or exclusion from -% the index won't work, so we we use \cs{string} to normalize it -% the same way it is done in \cs{DoNotIndex}, i.e. everything ends up catcode 12 -% except for the space character. +% the index won't work, so we use \cs{string} to normalize it +% the same way it is done in \cs{DoNotIndex}, i.e. everything ends up +% catcode 12 except for the space character. % \changes{v2.0e}{1998/12/28}{Correctly use the case-changing trick.} % \changes{v3.0l}{2022/11/03}{No longer using the case-changing trick.} % \begin{macrocode} @@ -3254,7 +3272,7 @@ % unnecessarily index within that part of the code. As the sequence % is local it will revert this setting at the end of the % environment so that the command is indexed elsewhere (unless it -% is generally disabled from indexing. +% is generally disabled from indexing). % % \DescribeMacro\g__doc_idxtype_prop % Global property list that holds for all commands that are special @@ -3282,7 +3300,7 @@ % \DescribeInterfaceMacro\RecordIndexType % This command takes two arguments: a command (with escape char) % and its type (i.e., first mandatory -% argument of a |\NewDocElement| declaration. If |#1| should not be +% argument of a |\NewDocElement| declaration). If |#1| should not be % included from the index, then the data is used to record that % this command is of this type. The information is then used to % generate appropriate index entries. Obviously, index entries @@ -3481,7 +3499,7 @@ % \begin{macro}{\__doc_idxtype_put:nn} % This internal command takes two arguments: a command name as % string (no backslash) and its type (i.e., first mandatory -% argument of a |\NewDocElement| declaration. If |#1| is not in +% argument of a |\NewDocElement| declaration). If |#1| is not in % |\l__doc_donotindex_seq| it will add this data to the property % list |\g__doc_idxtype_prop| using |#1| as key and |#2| as its % value. If the key already exist its value will be overwritten. If @@ -3884,7 +3902,8 @@ % \begin{imacro}{\RightBraceIndex} % \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} These % two macros fix the problems with \prg{makeindex}. Note the -% `hack' with |\iffalse}\fi| to satisfy both \TeX{} and the +% `hack' with \iffalse{-to get matching braces\fi |\iffalse}\fi| +% to satisfy both \TeX{} and the % \prg{makeindex} program. When this is written to the % \texttt{.idx} file \TeX{} will see both braces (so we get a % balanced text). \prg{makeindex} will also see balanced braces @@ -5539,7 +5558,7 @@ % \begin{macrocode} \long\def\@doc@env#1#2#3{ % \end{macrocode} -% The |\endgroup| here closes the scanning of names (using special catcodes. +% The |\endgroup| here closes the scanning of names (using special catcodes). % \begin{macrocode} \endgroup \clist_map_inline:nn {#3} { \@doc@env@{#1}{#2}{##1} } @@ -5565,8 +5584,8 @@ % they are technically part of the generated API, only not meant for public % use. % -% \fmi{above docu is no longer right (but code needs further changes -% anyway} +% \fmi{above docu is no longer right (but code probably needs further changes +% anyway)} % % |#1| is either \texttt{TT} (for true = macrolike) or \texttt{TF}. % If true then we drop the first char from |\saved@macroname| and @@ -5580,7 +5599,7 @@ % If the \DOC element described is macrolike but not a normal % ``macro'' then its type should be recorded and this is the places % where this happens. For macros (which should make up the bulk of -% these items we don't do this and for anything else that looks +% these items) we don't do this and for anything else that looks % from an indexing perspective like a macro we don't do that either % to keep the list of exceptions small. That would be the case if % the indexing command |\Code|\meta{doc-element}|Index| is @@ -5635,7 +5654,7 @@ \fi % \end{macrocode} % Suppress further |\index| entries when we are within a -% \texttt{macrolike} environment. (There is no point doing that for +% \texttt{macrolike} environment. There is no point doing that for % non-\texttt{macrolike} environments are index entries are only % generated for items starting with a backslash anyway. % \fmi{fix} @@ -5940,6 +5959,16 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\doc@ignoredinfo} +% +% \begin{macrocode} +\def\doc@ignoredinfo#1#2{% + \PackageInfo{doc}{Doc element '#1/#2' declaration + ignored}% +} +% \end{macrocode} +% \end{macro} +% % % \begin{imacro}{\NewDocElement} % \oarg{options}\marg{name}\marg{envname} @@ -5963,6 +5992,30 @@ % \end{macrocode} % \end{imacro} % +% \begin{imacro}{\ProvideDocElement} +% \oarg{options}\marg{name}\marg{envname} +% This does nothing unless the doc element could be declared with +% \cs{NewDocElement}. +% \begin{macrocode} +\newcommand\ProvideDocElement[3][]{% +% \end{macrocode} +% +% \begin{macrocode} + \@ifundefined{Print#2Name}% + {\@ifundefined{PrintDescribe#2}% + {\@ifundefined{#3}% + {\@ifundefined{end#3}% + {\@NewDocElement{#1}}% + \doc@ignoredinfo + }\doc@ignoredinfo + }\doc@ignoredinfo + }\doc@ignoredinfo + {#2}{#3}% +} +% \end{macrocode} +% \end{imacro} +% +% % \begin{imacro}{\RenewDocElement} % \oarg{options}\marg{name}\marg{envname} % @@ -6098,7 +6151,7 @@ % \end{macrocode} -% \begin{macro}{SpecialMainIndex} +% \begin{macro}{\SpecialMainIndex} % % In \DOC v2 we had \cs{SpecialMainIndex} and % \cs{SpecialMainEnvIndex} but now with additional \DOC elements we @@ -6110,7 +6163,7 @@ % \end{macrocode} % \end{macro} -% \begin{macro}{SpecialUsageIndex} +% \begin{macro}{\SpecialUsageIndex} % \DOC v2 also had \cs{SpecialUsageIndex} which is now called % \cs{SpecialMacroIndex} generating the ``usage'' index entry for % a macro. Again we provide that as an alias via |\def|. @@ -6206,86 +6259,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \section{Code no longer used} -% -% \begin{imacro}{\verb} -% \changes{v1.7a}{1992/02/27}{Now warns about newlines (from -% newdoc with `@noligs added).} -% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX \cs{verb}} -% We re-define |\verb| to check for newlines in its argument since a -% missing delimiter is difficult to detect in \DOC{} source. -% The code is the same as in \texttt{latex.tex} of September 19, 1993. -% Perhaps there should be a font-changing -% hook rather than just using |\ttfamily|, but if so it probably should be -% different from |\MacroFont| since that normally includes |\small| -% and would look wrong inline. -% \changes{v1.7a}{1992/02/28}{Added math mode check (from verbatim.sty)} -% \begin{macrocode} -%\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi -% \bgroup \let\do\do@noligs \verbatim@nolig@list -% \ttfamily \verb@eol@error \let\do\@makeother \dospecials -% \@ifstar{\@sverb}{\@vobeyspaces \frenchspacing \@sverb}} -% \end{macrocode} -% \end{imacro} -% -% \begin{macro}{\verb@balance@group} -% \begin{macro}{\verb@egroup} -% \begin{macro}{\verb@eol@error} -% \changes{v1.8b}{1993/09/21}{Renamed \cs{verb@err} to -% \cs{verb@eol@error}, as in new LaTeX verbatim.} -% \begin{macrocode} -%\let\verb@balance@group\@empty -% \end{macrocode} -% -% \begin{macrocode} -%\def\verb@egroup{\global\let\verb@balance@group\@empty\egroup} -% \end{macrocode} -% -% \begin{macrocode} -%\begingroup -% \obeylines% -% \gdef\verb@eol@error{\obeylines% -% \def^^M{\verb@egroup\@latex@error{% -% \noexpand\verb command ended by end of line}\@ehc}}% -%\endgroup -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@sverb} -% \changes{v1.7a}{1992/02/27}{Added for \cs{verb} change.} -% \changes{v1.7a}{1992/02/28}{Now same as in verbatim.sty.} -% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim, -% which has better error trapping.} -% See \cite{art:verbatim} for commentary. -% \changes{v2.1j}{2019/11/03}{Use the kernel definition, no change needed (gh/205)} -% \begin{macrocode} -%\def\@sverb#1{% -% \catcode`#1\active \lccode`\~`#1% -% \gdef\verb@balance@group{\verb@egroup -% \@latex@error{Illegal use of \noexpand\verb command}\@ehc}% -% \aftergroup\verb@balance@group -% \lowercase{\let~\verb@egroup}} -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\verbatim@nolig@list} -% \begin{macro}{\do@noligs} -% These macros replace the old |\@noligs| mechanism by an -% extensible version to allow more ligatures to be added. -% \begin{macrocode} -%\def\verbatim@nolig@list{\do\`\do\<\do\>\do\,\do\'\do\-} -%\def\do@noligs#1{% -% \catcode`#1\active -% \begingroup -% \lccode`\~`#1\relax -% \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1}}} -% \end{macrocode} -% \end{macro} -% \end{macro} - ^^A Needed for emacs ^^A diff --git a/macros/latex-dev/base/doc.pdf b/macros/latex-dev/base/doc.pdf Binary files differindex e8a184011e..1783af35f6 100644 --- a/macros/latex-dev/base/doc.pdf +++ b/macros/latex-dev/base/doc.pdf diff --git a/macros/latex-dev/base/docstrip.dtx b/macros/latex-dev/base/docstrip.dtx index 776d0e68d7..d5366b3fdd 100644 --- a/macros/latex-dev/base/docstrip.dtx +++ b/macros/latex-dev/base/docstrip.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -31,7 +31,7 @@ \def\filename{docstrip.dtx} \def\fileversion{v2.6b} \def\filedate{2022-09-03} -\def\docdate {2023-10-10} +\def\docdate {2024-02-08} %% % %\iffalse @@ -450,7 +450,7 @@ % \DescribeMacro{\endbatchfile} % All batch files should end with this command. Any lines after this % in the file are ignored. In old files that start -% |\def\batchfile{|\ldots\ this command is optional, but is a good +% |\def\batchfile{|\ldots\ \iffalse}\fi this command is optional, but is a good % idea anyway. If this command is omitted from a batchfile then % normally \TeX\ will go to its interactive |*| prompt, so you may % stop \ds{} by typing |\endbatchfile| to this prompt. @@ -757,7 +757,7 @@ % \meta{Primary}]*\\ % \meta{Primary} & $::=$ & % \meta{Terminal} $|$ \texttt{!}\meta{Primary} -% $|$ \texttt{(}\meta{Expression}\texttt{)}\\ +% $|$ \texttt(\meta{Expression}\texttt)\\ % \end{tabular} % % The \texttt{|} stands for disjunction, the \texttt{\&} stands for @@ -1712,7 +1712,7 @@ Z % \end{macrocode} % % \begin{macro}{\quote@name} -% \changes{v2.5h}{2020/04/18}{Macro added gfh/221)} +% \changes{v2.5h}{2020/04/18}{Macro added (gh/221)} % A macro copied from \texttt{ltfiles.dtx} in order to be able to % allow spaces in filenames. % \begin{macrocode} @@ -1994,7 +1994,7 @@ Z % \meta{Primary} & $::=$ & % \meta{Terminal} $|$ \texttt{!}\meta{Primary} % $|$ -% \texttt{(}\meta{Expression}\texttt{)}\\ +% \texttt(\meta{Expression}\texttt)\\ % \end{tabular} % % The \texttt{|} stands for disjunction, the \texttt{\&} stands for @@ -2023,7 +2023,7 @@ Z % \begin{eqnarray*} % \tau(\meta{Terminal})&=&"\t@<Terminal>,#1,<Terminal>,\qStop"\\ % \tau(!\meta{Primary})&=&"\if1"\,\tau(\meta{Primary})\,"0\else1\fi"\\ -% \tau(\mbox{\texttt{(}\meta{Expression}\texttt{)}}) +% \tau(\mbox{\texttt(\meta{Expression}\texttt)}) % &=&\tau(\meta{Expression})\\ % \tau(\mbox{\meta{Primary}\texttt{\&}\meta{Secondary}}) % &=&"\if0"\,\tau(\meta{Primary})\,"0\else" @@ -4473,7 +4473,7 @@ for copying and modification in the file \inFileName. % {Macro added (DPC)} % Process the batch file, and then terminate cleanly. % This may be set to |\relax| for `new style' batch files that -% do not start with |\def\batchfile{|\ldots +% do not start with |\def\batchfile{|\ldots \iffalse}\fi % \begin{macrocode} \def\process@first@batchfile{% \processbatchFile diff --git a/macros/latex-dev/base/docstrip.ins b/macros/latex-dev/base/docstrip.ins index 79d4c429dd..6ed99c9223 100644 --- a/macros/latex-dev/base/docstrip.ins +++ b/macros/latex-dev/base/docstrip.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -52,7 +52,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/docstrip.pdf b/macros/latex-dev/base/docstrip.pdf Binary files differindex b87f05e2e8..55e029485c 100644 --- a/macros/latex-dev/base/docstrip.pdf +++ b/macros/latex-dev/base/docstrip.pdf diff --git a/macros/latex-dev/base/ec.ins b/macros/latex-dev/base/ec.ins index 15a7c3848c..53ea22f957 100644 --- a/macros/latex-dev/base/ec.ins +++ b/macros/latex-dev/base/ec.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/encguide.pdf b/macros/latex-dev/base/encguide.pdf Binary files differindex 53e032c97b..3653bc1dbf 100644 --- a/macros/latex-dev/base/encguide.pdf +++ b/macros/latex-dev/base/encguide.pdf diff --git a/macros/latex-dev/base/encguide.tex b/macros/latex-dev/base/encguide.tex index 1a0978267e..11d968d2ea 100644 --- a/macros/latex-dev/base/encguide.tex +++ b/macros/latex-dev/base/encguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/exscale.dtx b/macros/latex-dev/base/exscale.dtx index 89890a4198..1712d18a26 100644 --- a/macros/latex-dev/base/exscale.dtx +++ b/macros/latex-dev/base/exscale.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/exscale.ins b/macros/latex-dev/base/exscale.ins index ae75460ee5..38c6aea61e 100644 --- a/macros/latex-dev/base/exscale.ins +++ b/macros/latex-dev/base/exscale.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/exscale.pdf b/macros/latex-dev/base/exscale.pdf Binary files differindex 0c9dd72583..9fe9e195db 100644 --- a/macros/latex-dev/base/exscale.pdf +++ b/macros/latex-dev/base/exscale.pdf diff --git a/macros/latex-dev/base/fix-cm.dtx b/macros/latex-dev/base/fix-cm.dtx index 9e39cd192b..09af95dad3 100644 --- a/macros/latex-dev/base/fix-cm.dtx +++ b/macros/latex-dev/base/fix-cm.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/fix-cm.ins b/macros/latex-dev/base/fix-cm.ins index 68c6792412..2023ea229c 100644 --- a/macros/latex-dev/base/fix-cm.ins +++ b/macros/latex-dev/base/fix-cm.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/fix-cm.pdf b/macros/latex-dev/base/fix-cm.pdf Binary files differindex eb2306a8fe..d1eaa48bd0 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 a3c42f9cc3..d6dda9e8e2 100644 --- a/macros/latex-dev/base/fntguide.pdf +++ b/macros/latex-dev/base/fntguide.pdf diff --git a/macros/latex-dev/base/fntguide.tex b/macros/latex-dev/base/fntguide.tex index 143956ecc4..7cf5d23981 100644 --- a/macros/latex-dev/base/fntguide.tex +++ b/macros/latex-dev/base/fntguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/base/fontdef.dtx b/macros/latex-dev/base/fontdef.dtx index 5e88e55079..281add29ef 100644 --- a/macros/latex-dev/base/fontdef.dtx +++ b/macros/latex-dev/base/fontdef.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -27,7 +27,8 @@ % % \fi % \iffalse -%%% From File: fontdef.dtx +%%% From File: fontdef.dtx +%<*!latexrelease> %<*dtx> \ProvidesFile{fontdef.dtx} %</dtx> @@ -38,17 +39,24 @@ %<+cfgprel>\ProvidesFile{preload.cfg} %<driver, >\ProvidesFile{fontdef.drv} % \fi -% \ProvidesFile{fontdef.dtx} -%<-latexrelease> [2021/01/15 v3.0i LaTeX Kernel -% \iftrue (\else -%<text, >(Text -%<math, >(Math -%<+cfgtext>(Uncustomized text -%<+cfgmath>(Uncustomized math -%<+cfgprel>(Uncustomized preload +% \ProvidesFile{fontdef.dtx} + [2024/02/09 v3.0i LaTeX Kernel +% \iffalse +%<text, > (Text font setup) +%<math, > (Math font setup) +%<+cfgtext> (Uncustomized text font setup) +%<+cfgmath> (Uncustomized math font setup) +%<+cfgprel> (Uncustomized preload font setup) +%<*dtx> % \fi -%<-latexrelease> font setup)] -% +(font setup) +%\iffalse +%</dtx> +%\fi +] +% \iffalse +%</!latexrelease> +%\fi % %\iffalse This is a META comment % diff --git a/macros/latex-dev/base/format.ins b/macros/latex-dev/base/format.ins index ba0965004d..e20ff09438 100644 --- a/macros/latex-dev/base/format.ins +++ b/macros/latex-dev/base/format.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -88,7 +88,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 2015-2023 +Copyright (C) 2015-2024 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -123,7 +123,7 @@ extension .ins) which are part of the distribution. This is a generated file. -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -170,6 +170,7 @@ the system are in the document `cfgguide.tex'. \from{lthooks.dtx}{2ekernel} % L3 layer module \from{ltcmdhooks.dtx}{2ekernel} % L3 layer module \from{ltsockets.dtx}{2ekernel} % L3 layer module + \from{lttemplates.dtx}{2ekernel} % L3 layer module \from{ltalloc.dtx}{2ekernel} \from{ltcntrl.dtx}{2ekernel} \from{lterror.dtx}{2ekernel} @@ -206,11 +207,12 @@ the system are in the document `cfgguide.tex'. \from{ltbibl.dtx}{2ekernel} \from{ltmarks.dtx}{trace,2ekernel} % L3 layer module \from{ltpage.dtx}{2ekernel} - \from{ltclass.dtx}{2ekernel,tracerollback} + \from{ltclass.dtx}{2ekernel,tracerollback} \from{ltkeys.dtx}{2ekernel} % L3 layer module \from{ltfilehook.dtx}{2ekernel} % L3 layer module \from{ltshipout.dtx}{2ekernel} % L3 layer module \from{ltoutput.dtx}{2ekernel} + \from{lttagging.dtx}{2ekernel} \from{ltfinal.dtx}{2ekernel}} \file{tracefnt.sty}{% \from{ltfsstrc.dtx}{package,trace}} @@ -228,6 +230,8 @@ the system are in the document `cfgguide.tex'. \from{lttextcomp.dtx}{TS1sty}} \file{textcomp-2018-08-11.sty}{% \from{lttextcomp.dtx}{TS1oldsty}} + \file{checkencodingsubset.tex}{% + \from{lttextcomp.dtx}{TS1check}} } \generateFile{oldlfont.sty}{t}{% diff --git a/macros/latex-dev/base/graphpap.dtx b/macros/latex-dev/base/graphpap.dtx index 6b7bc8b822..7d93512b26 100644 --- a/macros/latex-dev/base/graphpap.dtx +++ b/macros/latex-dev/base/graphpap.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/graphpap.ins b/macros/latex-dev/base/graphpap.ins index 43ba83aae3..7898dd2f92 100644 --- a/macros/latex-dev/base/graphpap.ins +++ b/macros/latex-dev/base/graphpap.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/graphpap.pdf b/macros/latex-dev/base/graphpap.pdf Binary files differindex d68b5190cc..2f422e2a84 100644 --- a/macros/latex-dev/base/graphpap.pdf +++ b/macros/latex-dev/base/graphpap.pdf diff --git a/macros/latex-dev/base/idx.tex b/macros/latex-dev/base/idx.tex index 04c8ef6959..001595bb7d 100644 --- a/macros/latex-dev/base/idx.tex +++ b/macros/latex-dev/base/idx.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ifthen.dtx b/macros/latex-dev/base/ifthen.dtx index aefc4a7666..ef7d8ab398 100644 --- a/macros/latex-dev/base/ifthen.dtx +++ b/macros/latex-dev/base/ifthen.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ifthen.ins b/macros/latex-dev/base/ifthen.ins index 697a4a38b3..0382d2255e 100644 --- a/macros/latex-dev/base/ifthen.ins +++ b/macros/latex-dev/base/ifthen.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/ifthen.pdf b/macros/latex-dev/base/ifthen.pdf Binary files differindex b7638603ef..d5d09c8f6a 100644 --- a/macros/latex-dev/base/ifthen.pdf +++ b/macros/latex-dev/base/ifthen.pdf diff --git a/macros/latex-dev/base/inputenc.dtx b/macros/latex-dev/base/inputenc.dtx index 02956a8c07..7ab9713d8e 100644 --- a/macros/latex-dev/base/inputenc.dtx +++ b/macros/latex-dev/base/inputenc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -142,7 +142,7 @@ % Originally this command was only to be used in vertical mode (with % the idea that it should be only within a document when % using text from several documents to build up a composite work such -% as a volume of journal articles. However, usages in certain +% as a volume of journal articles). However, usages in certain % languages suggested that it might be preferable to allow changing % the input encoding at any time, which is what is possible now % (though that is quite computing resource intensive). @@ -410,7 +410,7 @@ %<cp1252&!ansinew> \ProvidesFile{cp1252.def} %<cp1250> \ProvidesFile{cp1250.def} %<cp1257> \ProvidesFile{cp1257.def} - [2021/02/14 v1.3d Input encoding file] + [2024/02/08 v1.3d Input encoding file] %<cp850>%% %<cp850>%% If you need a Euro symbol, try cp858 instead. %<cp850>%% @@ -2204,7 +2204,7 @@ % \section{The Next encoding} % % This input encoding is based on work by Stefan Ried -% (\texttt{stef@\linebreak[0]theo-phys.uni-essen.de} and Holger Uhr +% (\texttt{stef@\linebreak[0]theo-phys.uni-essen.de}) and Holger Uhr % (\texttt{huhr@\linebreak[0]uni-paderborn.de}). % % Further extended by diff --git a/macros/latex-dev/base/inputenc.ins b/macros/latex-dev/base/inputenc.ins index 3857827070..2cfe820673 100644 --- a/macros/latex-dev/base/inputenc.ins +++ b/macros/latex-dev/base/inputenc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/inputenc.pdf b/macros/latex-dev/base/inputenc.pdf Binary files differindex 6e453b6080..bfa0203fdc 100644 --- a/macros/latex-dev/base/inputenc.pdf +++ b/macros/latex-dev/base/inputenc.pdf diff --git a/macros/latex-dev/base/lablst.tex b/macros/latex-dev/base/lablst.tex index b0a3ac1ab6..961928d5ad 100644 --- a/macros/latex-dev/base/lablst.tex +++ b/macros/latex-dev/base/lablst.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/lamport-manual.pdf b/macros/latex-dev/base/lamport-manual.pdf Binary files differindex 704346408a..ae4146963f 100644 --- a/macros/latex-dev/base/lamport-manual.pdf +++ b/macros/latex-dev/base/lamport-manual.pdf diff --git a/macros/latex-dev/base/latex209.dtx b/macros/latex-dev/base/latex209.dtx index b84564bb55..7e4132665f 100644 --- a/macros/latex-dev/base/latex209.dtx +++ b/macros/latex-dev/base/latex209.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/latex209.ins b/macros/latex-dev/base/latex209.ins index 0c90fa36ea..9226268c28 100644 --- a/macros/latex-dev/base/latex209.ins +++ b/macros/latex-dev/base/latex209.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/latexrelease.dtx b/macros/latex-dev/base/latexrelease.dtx index 4abde253e1..eeda0f8d55 100644 --- a/macros/latex-dev/base/latexrelease.dtx +++ b/macros/latex-dev/base/latexrelease.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/latexrelease.ins b/macros/latex-dev/base/latexrelease.ins index 93739630e3..89c3b0fc3a 100644 --- a/macros/latex-dev/base/latexrelease.ins +++ b/macros/latex-dev/base/latexrelease.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -97,6 +97,7 @@ extension .ins) which are part of the distribution. \from{lthooks.dtx} {latexrelease}% L3 layer module \from{ltcmdhooks.dtx} {latexrelease}% L3 layer module \from{ltsockets.dtx} {latexrelease}% L3 layer module + \from{lttemplates.dtx} {latexrelease}% L3 layer module \from{ltalloc.dtx} {latexrelease}% empty \from{ltcntrl.dtx} {latexrelease}% empty \from{lterror.dtx} {latexrelease}% empty diff --git a/macros/latex-dev/base/latexrelease.pdf b/macros/latex-dev/base/latexrelease.pdf Binary files differindex a33f14a625..34a4481bc3 100644 --- a/macros/latex-dev/base/latexrelease.pdf +++ b/macros/latex-dev/base/latexrelease.pdf diff --git a/macros/latex-dev/base/latexsym.dtx b/macros/latex-dev/base/latexsym.dtx index e4e1559e27..4ad1731589 100644 --- a/macros/latex-dev/base/latexsym.dtx +++ b/macros/latex-dev/base/latexsym.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/latexsym.ins b/macros/latex-dev/base/latexsym.ins index 12d658bca9..874f12cbf7 100644 --- a/macros/latex-dev/base/latexsym.ins +++ b/macros/latex-dev/base/latexsym.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -87,7 +87,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/latexsym.pdf b/macros/latex-dev/base/latexsym.pdf Binary files differindex 76b8b57254..444ae58d37 100644 --- a/macros/latex-dev/base/latexsym.pdf +++ b/macros/latex-dev/base/latexsym.pdf diff --git a/macros/latex-dev/base/lb2.err b/macros/latex-dev/base/lb2.err index 74c0e222b6..7d22f49814 100644 --- a/macros/latex-dev/base/lb2.err +++ b/macros/latex-dev/base/lb2.err @@ -1,4 +1,4 @@ -\newcommand\erratafiledate{2014/09/30} +\newcommand\erratafiledate{2024/01/03} \def\comando#1{\texttt{\string#1}} @@ -1203,6 +1203,14 @@ Streiche den letzten Buchstaben von ausf"uhrliche\u{n}. \erroronpage{647}{Abs.4, Z.1}{JMa}{2006/03/23}{2} Streiche den letzten Buchstaben von vertikale\u{r}. +\erroronpage{649}{Beispiel 10-3-9}{WOs}{2024/01/03}{} +Das Beispiel verwendet \verb=\frame=, was seinen Inhalt immer auf der +Zeile positioniert und nicht \verb=\fbox=, was je nach Drehung auch +unter die Zeile dreht (siehe Beispiel 10.3.10). +Die Ausgabe ist korrekt aber eher überraschend, +da der nachfolgende Absatz dann \verb=\fbox= diskutiert und die +Besonderheit von \verb=\frame= hier nicht erwähnt wird. + \erroronpage{649}{Abs.2, Z.8}{FMi/HjG}{2006/10/22}{2} Ersetze: "`\u{Dieser Punkt} ist in \ldots"' \> "`\u{Dies} ist in \ldots"' @@ -1605,6 +1613,7 @@ Die Abkürzung NFSS sollte \textsf{NFSS} geschrieben werden. \contributor{SZi}{Stefan Ziesemer} \contributor{TNdz}{Timo Niedenzu} \contributor{VVo}{Vladimir Volovich} +\contributor{WOs}{Wolfgang Ostmann} \contributor{YiL}{Yiannis Lazarides} \end{multicols} diff --git a/macros/latex-dev/base/lb2.pdf b/macros/latex-dev/base/lb2.pdf Binary files differindex 1635d1217d..91a6b37f7d 100644 --- a/macros/latex-dev/base/lb2.pdf +++ b/macros/latex-dev/base/lb2.pdf diff --git a/macros/latex-dev/base/letter.dtx b/macros/latex-dev/base/letter.dtx index 3e3c36d3d0..4df9e5ead6 100644 --- a/macros/latex-dev/base/letter.dtx +++ b/macros/latex-dev/base/letter.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/letter.ins b/macros/latex-dev/base/letter.ins index c522f39e59..72bb25531c 100644 --- a/macros/latex-dev/base/letter.ins +++ b/macros/latex-dev/base/letter.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/letter.pdf b/macros/latex-dev/base/letter.pdf Binary files differindex bd800591fc..8eeb8e9c2e 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 c4cbbd166e..9abfbe67df 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 1a7b50860d..880331d70f 100644 --- a/macros/latex-dev/base/lppl.pdf +++ b/macros/latex-dev/base/lppl.pdf diff --git a/macros/latex-dev/base/ltalloc.dtx b/macros/latex-dev/base/ltalloc.dtx index c3498fb9c7..d9d5ebd3be 100644 --- a/macros/latex-dev/base/ltalloc.dtx +++ b/macros/latex-dev/base/ltalloc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltbibl.dtx b/macros/latex-dev/base/ltbibl.dtx index 8e34ca685a..37d11a97aa 100644 --- a/macros/latex-dev/base/ltbibl.dtx +++ b/macros/latex-dev/base/ltbibl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltboxes.dtx b/macros/latex-dev/base/ltboxes.dtx index d84158c161..a041312cc5 100644 --- a/macros/latex-dev/base/ltboxes.dtx +++ b/macros/latex-dev/base/ltboxes.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -33,7 +33,7 @@ %<*driver> % \fi \ProvidesFile{ltboxes.dtx} - [2023/10/26 v1.4e LaTeX Kernel (Box Commands)] + [2024/02/08 v1.4e LaTeX Kernel (Box Commands)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltboxes.dtx} @@ -87,7 +87,7 @@ % Note that in this picture mode version of |\makebox| a [b] aligns on % the \emph{bottom} of the text as documented. If you want to align on % the \emph{baseline} use -% |\makebox( , )[b]{\raisebox{0pt}[\height][0pt]{xyz}}}| +% |\makebox( , )[b]{\raisebox{0pt}[\height][0pt]{xyz}}| % or |\makebox( , )[b]{\smash{xyz}}| % % \DescribeMacro\mbox @@ -235,7 +235,8 @@ % \begin{macro}{\makebox} % \changes{v0.1a}{1993/12/03} % {modified} -% |\makebox| User level command just looks for optional |[| or |(|. +% |\makebox| User level command just looks for optional +% |[| or |(|. \iffalse)]\fi % \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} % \begin{macrocode} %</2ekernel> diff --git a/macros/latex-dev/base/ltclass.dtx b/macros/latex-dev/base/ltclass.dtx index bb52148508..c6c0495fca 100644 --- a/macros/latex-dev/base/ltclass.dtx +++ b/macros/latex-dev/base/ltclass.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -33,7 +33,7 @@ %<*driver> % \fi \ProvidesFile{ltclass.dtx} - [2023/04/14 v1.5h LaTeX Kernel (Class & Package Interface)] + [2024/02/14 v1.5i LaTeX Kernel (Class & Package Interface)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltclass.dtx} @@ -390,7 +390,7 @@ % package files.) % % |\DeclareOption*{\PassOptionsToPackage{\CurrentOption}|^^A -% |{|\meta{pkg-name}|}|\\ +% |{|\meta{pkg-name}|}}|\\ % Handle the current option by passing it on to the package % \meta{pkg-name}, which will presumably be loaded via % |\RequirePackage| later in the file. This is useful for building @@ -1950,12 +1950,34 @@ % \end{macro} % % \begin{macro}{\@fileswithoptions} +% \changes{v1.5i}{2024/01/30}{Test group level} % The common part of |\documentclass| and |\usepackage|. % \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2024/06/01}% +%<latexrelease> {\@fileswithoptions}{Check Group}% +%<*2ekernel|latexrelease> \def\@fileswithoptions#1{% + \ifnum\currentgrouplevel>\z@ + \@latex@error + {Loading a class or package in a group}% + {Classes and packages should only be loaded at the top level}% + \fi \@ifnextchar[%] {\@fileswith@ptions#1}% {\@fileswith@ptions#1[]}} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@fileswithoptions}{Check Group}% +%<latexrelease>\def\@fileswithoptions#1{% +%<latexrelease> \@ifnextchar[%] +%<latexrelease> {\@fileswith@ptions#1}% +%<latexrelease> {\@fileswith@ptions#1[]}} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \begin{macrocode} \@onlypreamble\@fileswithoptions % \end{macrocode} % @@ -2624,8 +2646,8 @@ % % Allow code to be saved to be executed at specific later times. % -% Save things in macros, I considered using toks registers, (and -% |\addto@hook| from the NFSS code, that would require stacking the +% Here we save things in macros. I considered using toks registers (and +% |\addto@hook| from the NFSS code), but that would require stacking the % contents in the case of required packages, so just generate a new % macro for each package. % \begin{macro}{\@begindocumenthook} @@ -2997,7 +3019,7 @@ \let\do\@makeother\dospecials% % \end{macrocode} % If there are active characters in the upper half (e.g., from -% \texttt{inputenc} there would be confusion so we render everything +% \texttt{inputenc}) there would be confusion so we render everything % harmless. % \changes{v1.2f}{2018/03/27} % {Use full file name for old release} @@ -3585,7 +3607,7 @@ % and therefore we can now test its value. If the value is zero we % assume that the remaining argument string represents a version % and change |\pkgcls@targetdate| and set |\pkgcls@targetlabel| to -% the version name (after stripping off the trailing \texttt{=}. +% the version name (after stripping off the trailing \texttt{=}). % \begin{macrocode} \ifnum \pkgcls@targetdate=\z@ \pkgcls@targetdate\@ne @@ -3695,7 +3717,7 @@ % late, but if there wasn't one (i.e., if current release is the % oldest that exists) we use it as the best choice. However in % that case something is wrong (as there shouldn't be a rollback to -% a date where a package used doesn't yet exists. So we make a +% a date when a package used didn't yet exists). So we make a % complained to the user. % \begin{macrocode} \ifx\pkgcls@candidate\@empty diff --git a/macros/latex-dev/base/ltcmd.dtx b/macros/latex-dev/base/ltcmd.dtx index dcb85a1ae8..1733af5416 100644 --- a/macros/latex-dev/base/ltcmd.dtx +++ b/macros/latex-dev/base/ltcmd.dtx @@ -2,7 +2,7 @@ % % Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle % Copyright (C) 2004-2008 Frank Mittelbach, The LaTeX Project -% Copyright (C) 2009-2023 +% Copyright (C) 2009-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -34,8 +34,8 @@ %%% From File: ltcmd.dtx % % \begin{macrocode} -\def\ltcmdversion{v1.2a} -\def\ltcmddate{2023-08-19} +\def\ltcmdversion{v1.2c} +\def\ltcmddate{2024-02-08} % \end{macrocode} % %<*driver> @@ -415,8 +415,6 @@ \cs_new_protected:Npn \@@_declare_cmd_internal:Nnnn #1#2#3#4 { \tl_set:Nx \l_@@_function_tl { \cs_to_str:N #1 } - \tl_set:Nx \l_@@_fn_tl - { \exp_not:c { \l_@@_function_tl \c_space_tl } } \@@_normalize_arg_spec:n {#2} \exp_args:No \@@_prepare_signature:n \l_@@_arg_spec_tl \@@_declare_cmd_code:Nnn #1 {#2} {#3} @@ -435,17 +433,93 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[EXP]{\@@_all_m_check:n, \@@_all_m_check_aux:n} +% A quick loop to check for all |(+)m|-type arguments. +% \begin{macrocode} +\cs_new:Npn \@@_all_m_check:n #1 + { \tl_map_function:nN {#1} \@@_all_m_check_aux:n } +\cs_new:Npn \@@_all_m_check_aux:n #1 + { + \str_if_eq:nnF {#1} { m } + { + \str_if_eq:nnF {#1} { + } + { X } + } + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\@@_declare_cmd_code:Nnn} % \begin{macro} -% {\@@_declare_cmd_code_aux:Nnn, \@@_declare_cmd_code_expandable:Nnn} -% The appropriate auxiliary is called. +% { +% \@@_declare_cmd_optimized:Nnn, +% \@@_declare_cmd_code_aux:Nnn, +% \@@_declare_cmd_code_expandable:Nnn +% } +% \begin{macro}{\@@_start_optimized:} +% \changes{v1.2b}{2023/12/01} +% {Optimize cmd creation for all-\texttt{m} arguments} +% At this stage we can check for a short-cut possibility: if the argument +% specification is made up of just |(+)m| tokens, and if all arguments are +% either short or long, then we can produce an optimized document command. +% This only applies to document commands, not creation of environments (which +% are more complex). +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_cmd_code:Nnn #1#2 + { + \bool_lazy_any:nTF + { + { \l_@@_environment_bool } + { + \bool_lazy_and_p:nn + { \l_@@_some_short_bool } + { \l_@@_some_long_bool } + } + { ! \tl_if_blank_p:e { \@@_all_m_check:n {#2} } } + } + { + \tl_set:Nx \l_@@_fn_tl + { \exp_not:c { \l_@@_function_tl \c_space_tl } } + \bool_if:NTF \l_@@_grab_expandably_bool + { \@@_declare_cmd_code_expandable:Nnn } + { \@@_declare_cmd_code_aux:Nnn } + } + { \@@_declare_cmd_optimized:Nnn } + #1 {#2} + } +% \end{macrocode} +% The optimized version of commands just has to worry about whether to make +% them protected or long. The commands start with an expandable marker so +% that other parts of the kernel know these are set up by \pkg{ltcmd}. +% We need the two layers of redirection so that the \texttt{code} internal +% function has the same form as it would for any other document command. +% Optimization means that there is no \cs{group_align_safe_begin:} before +% grabbing the arguments, so anything involving |&| tokens will not work. +% However, this is really only intended for making optional argument +% processing safe anyway, so in practice should not be an issue. % \begin{macrocode} -\cs_new_protected:Npn \@@_declare_cmd_code:Nnn +\cs_new_protected:Npn \@@_declare_cmd_optimized:Nnn #1#2#3 { - \bool_if:NTF \l_@@_grab_expandably_bool - { \@@_declare_cmd_code_expandable:Nnn } - { \@@_declare_cmd_code_aux:Nnn } - } + \bool_if:NTF \l_@@_expandable_bool + { \cs_set_nopar:Npe } + { \cs_set_protected_nopar:Npe } + #1 + { + \exp_not:N \@@_start_optimized: + \exp_not:c { \l_@@_function_tl \c_space_tl code } + } + \exp_args:Ncc \cs_generate_from_arg_count:NNnn + { \l_@@_function_tl \c_space_tl code } + { + cs_set + \bool_if:NF \l_@@_expandable_bool { _protected } + \bool_if:NF \l_@@_some_long_bool { _nopar } + :Npn + } + \l_@@_current_arg_int + {#3} + } +\cs_new:Npn \@@_start_optimized: { } % \end{macrocode} % Standard functions call \cs{@@_start:nNNnnn}, which receives the % argument specification, an auxiliary used for @@ -544,6 +618,7 @@ % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro}{\@@_declare_env:nnnn} % \begin{macro}{\@@_declare_env_internal:nnnn} @@ -1286,7 +1361,7 @@ % that is not possible without the risk of mistakenly grabbing the % entire brace group (potentially leading to a~\texttt{!~Runaway argument} % error) or trying to grab a |}|$_2$, leading to -% an~\verb|! Argument of \dots has an extra }| error. +% \iffalse{\fi an~\verb|! Argument of \dots has an extra }| error. % \begin{macrocode} \cs_new_protected:Npn \@@_allowed_token_check:N #1 { @@ -1373,6 +1448,9 @@ % \end{macro} % % \begin{macro}{\@@_add_arg_spec:n, \@@_add_arg_spec_mandatory:n} +% \changes{v1.2c}{2023/12/22} +% {Clarify error message when \texttt{!} prefix is applied to +% non-trailing opt-arg (gh/1198)} % When adding an argument to the argument specification, set the % \texttt{some_long} or \texttt{some_short} booleans as appropriate % and clear the booleans keeping track of |+|, |!| and |=| markers. @@ -1414,7 +1492,12 @@ \bool_if:NT \l_@@_some_obey_spaces_bool { \msg_error:nnxx { cmd } { invalid-bang } - { \@@_environment_or_command: } { \tl_to_str:n {#1} } + { \@@_environment_or_command: } + { + \bool_if:NTF \l_@@_obey_spaces_bool + { \tl_to_str:n {'#1'} } + { an~optional~argument~before~mandatory~ \tl_to_str:n {'#1'} } + } \@@_bad_def:wn } \tl_clear:N \l_@@_last_delimiters_tl @@ -1626,8 +1709,10 @@ % argument, so we need to break out of one layer of braces in % \cs{l_@@_process_one_tl}, add copies of the processor as necessary, % and then return the removed brace. The function below does just -% that: it defines \cs{l_@@_process_one_tl} starting with a |}|$_2$ -% and ending with a |{|$_1$, so that it adds as many processors as +% that: it defines \cs{l_@@_process_one_tl} starting with a +% \iffalse{\fi |}|$_2$ +% and ending with a |{|$_1$, \iffalse}\fi +% so that it adds as many processors as % needed when |x|-expanded. % \begin{macrocode} \cs_new_protected:Npn \@@_replicate_processor:nn #1 #2 @@ -2033,7 +2118,7 @@ % \begin{macro}{\@@_copy:NN} % \begin{macro}{\@@_set_eq_if_exist:NN,\@@_set_eq_if_exist:cc} % This macro just branches to the proper copying command by using -% \cs{@@_cmd_type_cases:NnnnnF}. The copying command takes the names +% \cs{@@_cmd_type_cases:NnnnnnF}. The copying command takes the names % of the commands to be copied to and from, and the actual commands % as its four arguments. % \begin{macrocode} @@ -2042,9 +2127,10 @@ \use:x { \int_set:Nn \tex_escapechar:D { 92 } - \exp_not:N \@@_cmd_type_cases:NnnnnF \exp_not:N #2 + \exp_not:N \@@_cmd_type_cases:NnnnnnF \exp_not:N #2 { \@@_copy_command:nnNN } { \@@_copy_expandable:nnNN } + { \@@_copy_optimized:nnNN } { \@@_copy_environment:nnNN } { \@@_copy_environment_end:nnNN } { \@@_cant_copy:nwn { non-ltcmd } } @@ -2186,6 +2272,24 @@ %<latexrelease>\EndIncludeInRelease % \end{macrocode} % +% \begin{macro}{\@@_copy_optimized:nnNN} +% Copy the code, simply define the wrapper. +% \begin{macrocode} +\cs_new_protected:Npn \@@_copy_optimized:nnNN #1#2#3#4 + { + \cs_set_eq:cc { #1 ~ code } { #2 ~ code } + \token_if_protected_macro:NTF #4 + { \cs_set_protected_nopar:Npe } + { \cs_set_nopar:Npe } + #3 + { + \exp_not:N \@@_start_optimized: + \exp_not:c { #1 ~ code } + } + } +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %<latexrelease>\IncludeInRelease{2021/11/15}{\@@_copy:NN (part 2)}% %<latexrelease> {Support~\NewCommandCopy~in~ltcmd} @@ -2423,7 +2527,7 @@ % % \begin{macro}{\@@_show:N} % This macro just branches to the proper showing command by using -% \cs{@@_cmd_type_cases:NnnnnF}. The showing command takes the command +% \cs{@@_cmd_type_cases:NnnnnnF}. The showing command takes the command % to be shown as argument. % \begin{macrocode} \cs_new_protected:Npn \@@_show:N #1 @@ -2431,9 +2535,10 @@ \use:x { \int_set:Nn \tex_escapechar:D { 92 } - \exp_not:N \@@_cmd_type_cases:NnnnnF \exp_not:N #1 + \exp_not:N \@@_cmd_type_cases:NnnnnnF \exp_not:N #1 { \@@_show_command:N } { \@@_show_expandable:N } + { \@@_show_optimized:N } { \@@_show_environment:N } { \@@_show_environment_end:N } { \@@_cant_copy:nwn { non-ltcmd } } @@ -2450,6 +2555,7 @@ % \@@_show_command:NnNNwN, % \@@_show_expandable:N, % \@@_show_expandable:NnNNNNnN, +% \@@_show_optimized:N, % \@@_show_command_aux:NnNNn, % \@@_show_environment:N, % \@@_show:x, @@ -2530,6 +2636,48 @@ } % \end{macrocode} % +% Optimized functions need things done a bit differently as we need to +% reconstruct the argument spec. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_optimized:N #1 + { + \exp_args:Nc \@@_show_optimized:NN + { \cs_to_str:N #1 \c_space_tl code } + #1 + } +\cs_new_protected:Npn \@@_show_optimized:NN #1#2 + { + \cs_set:Npe \@@_show_optimized_aux:N ##1 + { + \c_space_tl \c_space_tl \c_hash_str ##1 : + \bool_lazy_or:nnT + { \token_if_long_macro_p:N #1 } + { \token_if_protected_long_macro_p:N #1 } + { + } m + \iow_newline: + } + \tl_show:e + { + \token_to_str:N #2 = + \bool_lazy_or:nnF + { \token_if_protected_macro_p:N #1 } + { \token_if_protected_long_macro_p:N #1 } + { expandable ~ } document~command: + \iow_newline: + \int_step_function:nN + { + \int_div_truncate:nn + { \tl_count:e { \cs_parameter_spec:N #1 } } + { 2 } + } + \@@_show_optimized_aux:N + -> + \cs_replacement_spec:N #1 + } + } +\cs_generate_variant:Nn \tl_count:n { e } +% \end{macrocode} +% % We can reuse most of the above to show an environment, except that % we need to ensure that the proper \cs[no-index]{environment~\ldots} % are passed to \cs{@@_show_command_aux:NnNNn}. Additionally, when @@ -4376,13 +4524,14 @@ % \end{macro} % % \begin{macro}{\__kernel_cmd_if_xparse:NTF} -% \begin{macro}{\@@_cmd_type_cases:Nnnnn} +% \begin{macro}{\@@_cmd_type_cases:NnnnnnF} % \changes{v1.0d}{2021/04/19}{Renamed \cs{__cmd_cmd_if_xparse:NTF} to % \cs{__kernel_cmd_if_xparse:NTF} for cross-module usage} % \changes{v1.0d}{2021/07/30}{Added \cs{@@_cmd_type_cases:NnnnnF} for % \cs{NewCommandCopy} and \cs{ShowCommand} support} % \changes{v1.0l}{2022/03/18}{Fix \cs{@@_cmd_type_cases:NnnnnF} -%" prematurely expanding macros (gh/795)} +% prematurely expanding macros (gh/795)} +% \changes{v1.2b}{2023/12/01}{Extend for optimized commands} % \begin{macro}{\@@_cmd_if_xparse_aux:N} % % To determine whether the command is an \pkg{xparse} command check @@ -4390,13 +4539,14 @@ % that its |replacement_spec| starts with either % \cs{@@_start:nNNnnn} (non-expandable command) or % \cs{@@_start_expandable:nNNNNn} (expandable command) or +% \cs{@@_start_optimized:} (optimized command) or % \cs{@@_start_env:nnnnn} (environment) or % \cs[no-index]{environment~\#1~end~aux} (environment end). % % This conditional is needed in several kernel modules and is % therefore has a kernel-internal name. % \begin{macrocode} -\cs_new_protected:Npn \@@_cmd_type_cases:NnnnnF #1 #2 #3 #4 #5 #6 +\cs_new_protected:Npn \@@_cmd_type_cases:NnnnnnF #1 #2 #3 #4 #5 #6 #7 { \exp_args:Ne \str_case_e:nnF { @@ -4406,20 +4556,21 @@ { { \exp_not:N \@@_start:nNNnnn } {#2} { \exp_not:N \@@_start_expandable:nNNNNn } {#3} - { \exp_not:N \@@_start_env:nnnnn } {#4} + { \exp_not:N \@@_start_optimized: } {#4} + { \exp_not:N \@@_start_env:nnnnn } {#5} { \exp_after:wN \exp_not:N \cs:w environment~ \exp_last_unbraced:Ne \use_none:nnn { \cs_to_str:N #1 } ~end~aux \cs_end: - } {#5} + } {#6} } - {#6} + {#7} } \cs_new_protected:Npn \__kernel_cmd_if_xparse:NTF #1 { - \@@_cmd_type_cases:NnnnnF #1 - { } { } { } { } { \use_iii:nnn } + \@@_cmd_type_cases:NnnnnnF #1 + { } { } { } { } { } { \use_iii:nnn } \use_i:nn } % \end{macrocode} @@ -4511,10 +4662,8 @@ \bool_if:NTF \l_@@_environment_bool { environment ~ ' \l_@@_environment_str ' } { - command ~ ' - \exp_args:Nf \tl_trim_spaces:n - { \exp_after:wN \token_to_str:N \l_@@_fn_tl } - ' + command ~ + ' \c_backslash_str \tl_to_str:N \l_@@_function_tl ' } } % \end{macrocode} @@ -4522,6 +4671,8 @@ % % Some messages intended as errors when defining commands/environments. % \changes{v1.0f}{2021/06/04}{Normalize various error messages} +% \changes{v1.2c}{2023/12/22} +% {Generalize message \texttt{invalid-bang} (gh/1198)} % \begin{macrocode} \msg_new:nnnn { cmd } { arg-after-body } { Argument~type~'b'~must~be~last~in~#1. } @@ -4612,7 +4763,7 @@ { Invalid~argument~prefix~'!'~in~#1. } { The~prefix~'!'~is~only~allowed~for~trailing~optional~arguments.~ - You~tried~to~apply~it~to~'#2'. + You~tried~to~apply~it~to~#2. \c_@@_ignore_def_tl } \msg_new:nnnn { cmd } { not-definable } diff --git a/macros/latex-dev/base/ltcmdhooks-code.pdf b/macros/latex-dev/base/ltcmdhooks-code.pdf Binary files differindex a48cf808d2..8abe240bae 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 cdff7b57d7..6424ad0033 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 6f885a2c6c..bb071e629c 100644 --- a/macros/latex-dev/base/ltcmdhooks.dtx +++ b/macros/latex-dev/base/ltcmdhooks.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % -%% File: ltcmdhooks.dtx -%% Copyright (C) 2020-2023 +%%% From File: ltcmdhooks.dtx +%% Copyright (C) 2020-2024 %% Frank Mittelbach, Phelype Oleinik, The LaTeX Project % % It may be distributed and/or modified under the conditions of the @@ -12,16 +12,20 @@ % https://www.latex-project.org/lppl.txt % % -%%% From File: ltcmdhooks.dtx -% -\def\ltcmdhooksversion{v1.0i} -\def\ltcmdhooksdate{2023/06/16} -% +% \fi % +% \iffalse +%%% From File: lthooks.dtx % %<*driver> +% \fi +\ProvidesFile{ltcmdhooks.dtx} + [2024/02/11 v1.0i LaTeX Kernel (Command hooks)] +% \iffalse +% \documentclass{l3doc} -%\usepackage{ltcmdhooks} +\GetFileInfo{ltcmdhooks.dtx} +% \usepackage{ltcmdhooks} \EnableCrossrefs \CodelineIndex \begin{document} @@ -38,7 +42,7 @@ % \providecommand\phoinline[1]{\begin{quote}\itshape\footnotesize PhO: #1\end{quote}} % % \title{The \texttt{ltcmdhooks} module\thanks{This file has version -% \ltcmdhooksversion\ dated \ltcmdhooksdate, \copyright\ \LaTeX\ +% \fileversion\ dated \filedate, \copyright\ \LaTeX\ % Project.}} % \author{Frank Mittelbach \and Phelype Oleinik} % @@ -643,7 +647,7 @@ } } % \end{macrocode} -% and a conditional \cs{@@_if_public_command:N} to check if a command +% and a conditional \cs{@@_if_public_command:NTF} to check if a command % has |__| in its name (no other checking is performed). Primitives % with |:D| in their name could be included here, but they are already % discarded in the \cs{token_if_macro:NTF} test above. diff --git a/macros/latex-dev/base/ltcntrl.dtx b/macros/latex-dev/base/ltcntrl.dtx index 52dcdbf983..fad5bf479e 100644 --- a/macros/latex-dev/base/ltcntrl.dtx +++ b/macros/latex-dev/base/ltcntrl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltcounts.dtx b/macros/latex-dev/base/ltcounts.dtx index 69025fa479..006486d23b 100644 --- a/macros/latex-dev/base/ltcounts.dtx +++ b/macros/latex-dev/base/ltcounts.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -33,7 +33,7 @@ %<*driver> % \fi \ProvidesFile{ltcounts.dtx} - [2021/07/08 v1.1m LaTeX Kernel (Counters)] + [2021/11/08 v1.1n LaTeX Kernel (Counters)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltcounts.dtx} @@ -305,6 +305,7 @@ % \begin{macro}{\@definecounter} % \changes{v1.1b}{1995/05/20}{Streamlined code} % \changes{v1.1c}{1995/05/20}{And do it right} +% \changes{v1.1n}{2023/11/07}{Do not change \cs{the...} if already defined (gh/823)} % % \begin{macrocode} \def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname @@ -312,9 +313,21 @@ \global\expandafter\let\csname cl@#1\endcsname\@empty \@addtoreset{#1}{@ckpt}% \global\expandafter\let\csname p@#1\endcsname\@empty +% \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 +% catch, for example, that somebody defines a counter named +% ``index'' conflicting with the \env{theindex} environment. +% \begin{macrocode} \expandafter - \gdef\csname the#1\expandafter\endcsname\expandafter - {\expandafter\@arabic\csname c@#1\endcsname}} + \ifx\csname the#1\endcsname\relax + \expandafter + \gdef\csname the#1\expandafter\endcsname\expandafter + {\expandafter\@arabic\csname c@#1\endcsname}% + \else + \@latex@warning{Command `\string\the#1' already + defined -- not changed}% + \fi} % \end{macrocode} % \end{macro} % diff --git a/macros/latex-dev/base/ltdefns.dtx b/macros/latex-dev/base/ltdefns.dtx index 209c4e0fba..4d8368e2c0 100644 --- a/macros/latex-dev/base/ltdefns.dtx +++ b/macros/latex-dev/base/ltdefns.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -32,7 +32,7 @@ %<*driver> % \fi \ProvidesFile{ltdefns.dtx} - [2022/11/24 v1.5s LaTeX Kernel (definition commands)] + [2024/02/08 v1.5s LaTeX Kernel (definition commands)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltdefns.dtx} @@ -530,9 +530,11 @@ % This macro encapsulates the most common call to |\@ifnextchar|, saving % several tokens each time it is used in the definition of a command % with an optional argument. -% |#1| The code to execute in the case that there is a |[| need not be +% |#1| The code to execute in the case that there is a |[| \iffalse]\fi +% need not be % a single token but can be any sequence of commands that `expects' to -% be followed by |[|. If this command were only used in |\newcommand| +% be followed by |[|. \iffalse]\fi +% If this command were only used in |\newcommand| % definitions then |#1| would be a single token and the braces could % be omitted from |{#1}| in the definition below, saving a bit of % memory. @@ -595,7 +597,7 @@ % required argument spec by using a delimited argument (delimited % by the digit). This is faster and uses less tokens. The coding % is slightly odd to preserve the old interface (using |#2| = -% |\tw@| as the flag to surround the first argument with |[]|. But +% |\tw@| as the flag to surround the first argument with |[]|). But % the new method did not allow for the number of arguments |#3| not % being given as an explicit digit; hence (further expansion of % this argument and use of) |\number| was added later in 1999. @@ -706,13 +708,14 @@ % \begin{macro}{\newenvironment} % Define a new user environment. % |#1| is the environment name. |#2#| Grabs all the tokens up to -% the first |{|. These will be any optional arguments. They are not +% the first |{|. \iffalse}\fi +% These will be any optional arguments. They are not % parsed at this point, but are just passed to |\@newenv| which % will eventually call |\newcommand|. Any optional arguments will % then be parsed by |\newcommand| as it defines the command that % executes the `begin code' of the environment. % -% This |#2#| trick removed with version 1.2i as it fails if a |{| +% This |#2#| trick removed with version 1.2i as it fails if a |{| \iffalse}\fi % occurs in the optional argument. Now use |\@ifnextchar| directly. % \begin{macrocode} \def\newenvironment{\@star@or@long\new@environment} @@ -888,7 +891,8 @@ % \begin{macro}{\@check@c} % \changes{v1.2i}{1995/04/25}{Make \cs{long} for latex/1346} % |\CheckCommand| itself just grabs all the arguments we need, -% without actually looking for |[| optional argument forms. Now +% without actually looking for |[| \iffalse]\fi +% optional argument forms. Now % define |\reserved@a|. If |\\reserved@a| is then defined, compare it % with the ``|\#1|' otherwise compare |\reserved@a| with |#1|. % \begin{macrocode} @@ -2296,7 +2300,7 @@ % \changes{v1.3g}{2004/01/23}{Added macro (pr/3501)} % This macro is the kernel version of |\@ifnextchar| which is used % in a couple of places to prevent the AMS variant from being used -% since in some places this produced chaos (for example +% since in some places this produced chaos. For example, % if an \texttt{fd} file % is loaded in a random place then the optional argument to % |\ProvidesFile| could get printed there instead of being written diff --git a/macros/latex-dev/base/ltdirchk.dtx b/macros/latex-dev/base/ltdirchk.dtx index 6e02929754..d06f68a706 100644 --- a/macros/latex-dev/base/ltdirchk.dtx +++ b/macros/latex-dev/base/ltdirchk.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -36,8 +36,10 @@ %</unstripped> %<*driver> % \fi +% \fi \ProvidesFile{ltdirchk.dtx} - [2021/12/11 v1.3a LaTeX Kernel (System Dependent Parts)] + [2024/02/11 v1.3a LaTeX Kernel (System Dependent Parts)] +% \iffalse % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltdirchk.dtx} @@ -1000,8 +1002,8 @@ % \begin{macro}{\@TeXversion} % \TeX\ versions older than 3.141 require |\@TeXversion| to be % set. This can be determined automatically due to a trick suggested -% by Bernd Raichle. (Actually this will not always get the correct -% version number, eg \TeX3.14 would be detected as \TeX3, but \LaTeX\ +% by Bernd Raichle. Actually this will not always get the correct +% version number, e.g., \TeX3.14 would be detected as \TeX3, but \LaTeX\ % only needs to take account of \TeX's older than 3, or between 3 and % 3.14. % \changes{v1.0h}{1994/10/11} diff --git a/macros/latex-dev/base/lterror.dtx b/macros/latex-dev/base/lterror.dtx index 77672168ce..99bdc79e4f 100644 --- a/macros/latex-dev/base/lterror.dtx +++ b/macros/latex-dev/base/lterror.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltexpl.dtx b/macros/latex-dev/base/ltexpl.dtx index 4e5eba550b..4aaf799e32 100644 --- a/macros/latex-dev/base/ltexpl.dtx +++ b/macros/latex-dev/base/ltexpl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfilehook-code.pdf b/macros/latex-dev/base/ltfilehook-code.pdf Binary files differindex 1e3965df67..7bfb51e947 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 f104a35011..3e561cdf3a 100644 --- a/macros/latex-dev/base/ltfilehook-doc.pdf +++ b/macros/latex-dev/base/ltfilehook-doc.pdf diff --git a/macros/latex-dev/base/ltfilehook.dtx b/macros/latex-dev/base/ltfilehook.dtx index ae183bfeb4..831d633eef 100644 --- a/macros/latex-dev/base/ltfilehook.dtx +++ b/macros/latex-dev/base/ltfilehook.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2020-2023 +% Copyright (C) 2020-2024 % Frank Mittelbach, Phelype Oleinik and The LaTeX Project % % This file is part of the LaTeX base system. @@ -30,16 +30,22 @@ % %%% From File: ltfilehook.dtx % -% \begin{macrocode} -\providecommand\ltfilehookversion{v1.0o} -\providecommand\ltfilehookdate{2023/07/10} -% \end{macrocode} -% +% \fi +%\iffalse +%<*driver,structuredlog> +%\fi +\def\ltfilehookdate{2024/02/11} +\def\ltfilehookversion{v1.0o} +%\iffalse +%</driver,structuredlog> %<*driver> - +%\fi +\expanded{\noexpand\ProvidesFile{ltfilehook.dtx} +[\ltfilehookdate\space \ltfilehookversion\space LaTeX Kernel (hooks)]} +% \iffalse +% \documentclass{l3doc} - \providecommand\InternalDetectionOff{} \providecommand\InternalDetectionOn{} @@ -407,7 +413,7 @@ % % \begin{function}{\disable@package@load,\reenable@package@load} % \begin{syntax} -% \cs{disable@package@load} \Arg{package} \Arg{alternate-code} +% \cs{disable@package@load} \Arg{package} \Arg{alternate-code} % \cs{reenable@package@load} \Arg{package} % \end{syntax} % If \meta{package} is requested do not load it but instead run @@ -1328,7 +1334,7 @@ % \end{macro} % \end{macro} % -% \begin{macro}{flag @@_file_replaced} +% \begin{macro}{@@_file_replaced} % \begin{macro}{\@@_if_file_replaced:TF} % \begin{macro}{\@@_clear_replacement_flag:} % Since the file replacement is done expandably in a \cs{csname}, use diff --git a/macros/latex-dev/base/ltfiles.dtx b/macros/latex-dev/base/ltfiles.dtx index f079c2cf5b..2e2a8884a0 100644 --- a/macros/latex-dev/base/ltfiles.dtx +++ b/macros/latex-dev/base/ltfiles.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -32,7 +32,7 @@ %<*driver> % \fi \ProvidesFile{ltfiles.dtx} - [2023/06/17 v1.2u LaTeX Kernel (File Handling)] + [2024/02/08 v1.2v LaTeX Kernel (File Handling)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltfiles.dtx} @@ -1087,7 +1087,7 @@ % \texttt{-1} we ensure that we don't get a backslash in front. As a % result we end up with all characters as catcode 12 (plus % spaces). We then sometimes add quotes around the construct -% (removing any existing inner quotes. Sometimes we only remove the +% (removing any existing inner quotes). Sometimes we only remove the % quotes if they have been supplied by the user. There is clearly % some room for improvement. % @@ -1682,6 +1682,22 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\if@listfiles@hashes} +% \changes{v1.2v}{2023/11/15}{Extend file list information} +% \begin{macro}{\if@listfiles@sizes} +% \changes{v1.2v}{2023/11/15}{Extend file list information} +% \begin{macrocode} +\ExplSyntaxOn +\keys_define:nn { __kernel / listfiles } + { + hashes .legacy_if_set:n = @listfiles@hashes , + sizes .legacy_if_set:n = @listfiles@sizes + } +\ExplSyntaxOff +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \begin{macro}{\listfiles} % A preamble command to cause |\end{document}| to list files input % from the main file. @@ -1693,8 +1709,10 @@ % {Stop \cs{listfiles} being run twice} % \changes{v1.0i}{1994/10/18} % {code moved here from ltclass} +% \changes{v1.2v}{2023/11/15}{Extend file list information} % \begin{macrocode} -\def\listfiles{% +\NewDocumentCommand\listfiles{O{}}{% + \SetKeys[__kernel/listfiles]{#1}% \let\listfiles\relax \def\@listfiles##1##2##3##4##5##6##7##8##9\@@{% \def\reserved@d{\\}% @@ -1730,9 +1748,40 @@ \filename@area\filename@base\\\\\\\\\\\\\\\\\\\@@ \typeout{% \filename@area\reserved@a - \ifx\reserved@b\relax\else\@spaces\reserved@b\fi}}% + \ifx\reserved@b\relax\else\@spaces\reserved@b\fi +% \end{macrocode} +% Now we add the additional information if requested. +% \begin{macrocode} + \ifnum0% + \if@listfiles@hashes1\fi + \if@listfiles@sizes1\fi + >0 % + ^^J\@spaces + (% + \if@listfiles@sizes + size \@dofilelist@size\@currname + \if@listfiles@hashes + , % + \fi + \fi + \if@listfiles@hashes + hash \@dofilelist@hash\@currname + \fi + )% + \fi + }}% \typeout{ ***********^^J}}} % \end{macrocode} +% \begin{macro}{\@dofilelist@hash} +% \begin{macro}{\@dofilelist@size} +% \begin{macrocode} +\ExplSyntaxOn +\cs_new_eq:NN \@dofilelist@hash \file_mdfive_hash:n +\cs_new_eq:NN \@dofilelist@size \file_size:n +\ExplSyntaxOff +% \end{macrocode} +% \end{macro} +% \end{macro} % % \changes{LaTeX2e}{1994/03/13} % {Reset \cs{@addtofilelist} at begin document} diff --git a/macros/latex-dev/base/ltfinal.dtx b/macros/latex-dev/base/ltfinal.dtx index 2652f6ce44..648e3e1b8b 100644 --- a/macros/latex-dev/base/ltfinal.dtx +++ b/macros/latex-dev/base/ltfinal.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -33,7 +33,7 @@ %<*driver> % \fi \ProvidesFile{ltfinal.dtx} - [2023/05/30 v2.3c LaTeX Kernel (Final Settings)] + [2024/02/08 v2.3c LaTeX Kernel (Final Settings)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltfinal.dtx} @@ -273,7 +273,7 @@ % \end{macro} % \end{macro} % -% \begin{macro}{trace\string_stack\string_levels} +% \begin{macro}{trace_stack_levels} % Now define the Lua function to emulate \cs{tracingstacklevels} and % install it in the |input_level_string| callback. % \begin{macrocode} @@ -1384,7 +1384,7 @@ % \end{macro} % % \begin{macro}{\@filelist} -% \changes{v1.0w}{1995/10/19}{Move after \cs{reserved@a} setting:-)} +% \changes{v1.0w}{1995/10/19}{Move after \cs{reserved@a} setting} % \begin{macro}{\@addtofilelist} % Reset |\@filelist| so files input while making the format are not % listed. The list built up so far may take up a lot of memory and so diff --git a/macros/latex-dev/base/ltfloat.dtx b/macros/latex-dev/base/ltfloat.dtx index 7247824548..a07e5e81da 100644 --- a/macros/latex-dev/base/ltfloat.dtx +++ b/macros/latex-dev/base/ltfloat.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfntcmd.dtx b/macros/latex-dev/base/ltfntcmd.dtx index bb6dbfe75c..097b8f692e 100644 --- a/macros/latex-dev/base/ltfntcmd.dtx +++ b/macros/latex-dev/base/ltfntcmd.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -32,7 +32,7 @@ %<*driver> % \fi \ProvidesFile{ltfntcmd.dtx} - [2021/09/12 v3.5a LaTeX Kernel (Font commands)] + [2023/12/26 v3.5a LaTeX Kernel (Font commands)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltfntcmd.dtx} @@ -393,9 +393,9 @@ % \end{macro} -% \begin{macro}{textulc} -% \begin{macro}{textsw} -% \begin{macro}{textssc} +% \begin{macro}{\textulc} +% \begin{macro}{\textsw} +% \begin{macro}{\textssc} % % \changes{v3.4c}{2019/12/17}{Macro added} % \begin{macrocode} diff --git a/macros/latex-dev/base/ltfssaxes.dtx b/macros/latex-dev/base/ltfssaxes.dtx index a0746bd08c..8b5014a4cc 100644 --- a/macros/latex-dev/base/ltfssaxes.dtx +++ b/macros/latex-dev/base/ltfssaxes.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -28,14 +28,14 @@ % \fi % \iffalse %%% From File: ltfssaxes.dtx -%% Copyright (C) 1999-2020 Frank Mittelbach +%% Copyright (C) 2019-2020 Frank Mittelbach % %<*driver> % \fi % % \ProvidesFile{ltfssaxes.dtx} - [2023/10/30 v1.0i LaTeX Kernel (NFSS Axes handing)] + [2024/02/08 v1.0i LaTeX Kernel (NFSS Axes handing)] % \iffalse \documentclass{ltxdoc} \begin{document} @@ -1087,7 +1087,7 @@ % % Shapes are also split in two axes (though it could be more if % that is desirable), essentially building in an ``sc'' -% axis). +% axis. % % \begin{macrocode} %<*2ekernel|latexrelease> @@ -1118,7 +1118,7 @@ % resets everything and \texttt{up} changes italic or slanted to % upright and \texttt{ulc} undoes small caps. % -% So we now offer \cs{normalshape} (using \cs{shapedefault} which +% So we now offer \cs{normalshape} (using \cs{shapedefault}) which % is normally the same as calling both \cs{ulcshape} and % \cs{upshape}, only more efficient. % @@ -1494,7 +1494,7 @@ % provide. So its redefinitions for the various shape commands, % such as \cs{itshape} should no longer happen. We therefore force % the standard definitions at \cs{AtBeginDocument} (later when this -% is defined. Once +% is defined). Once % \texttt{fontaxes} is no longer doing such redefinitions that could % be taken out again. % diff --git a/macros/latex-dev/base/ltfssbas.dtx b/macros/latex-dev/base/ltfssbas.dtx index fa82bd73bb..df02a5749a 100644 --- a/macros/latex-dev/base/ltfssbas.dtx +++ b/macros/latex-dev/base/ltfssbas.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -35,7 +35,7 @@ % % \ProvidesFile{ltfssbas.dtx} - [2023/10/21 v3.2l LaTeX Kernel (NFSS Basic Macros)] + [2024/02/08 v3.2l LaTeX Kernel (NFSS Basic Macros)] % \iffalse \documentclass{ltxdoc} \begin{document} @@ -962,7 +962,7 @@ % case, however, we also need the value of |\baselineskip|. As the % first argument to |\set@fontsize| we pass the current value of % |\baselinestretch|. This will either match the internal value (in -% which case nothing changes, or it will be an updated value due to +% which case nothing changes) or it will be an updated value due to % a user change of that macro using |\renewcommand|. If we would % pass the internal |\f@linespread| such a change would be % effectively overwritten by a size change. diff --git a/macros/latex-dev/base/ltfsscmp.dtx b/macros/latex-dev/base/ltfsscmp.dtx index 7bdfe2fd3e..57c94ea688 100644 --- a/macros/latex-dev/base/ltfsscmp.dtx +++ b/macros/latex-dev/base/ltfsscmp.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfssdcl.dtx b/macros/latex-dev/base/ltfssdcl.dtx index c3a743d249..32f9eedf19 100644 --- a/macros/latex-dev/base/ltfssdcl.dtx +++ b/macros/latex-dev/base/ltfssdcl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltfssini.dtx b/macros/latex-dev/base/ltfssini.dtx index 7b43f0228b..255abe03f3 100644 --- a/macros/latex-dev/base/ltfssini.dtx +++ b/macros/latex-dev/base/ltfssini.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -36,7 +36,7 @@ % % \ProvidesFile{ltfssini.dtx} - [2021/09/10 v3.2i LaTeX Kernel (NFSS Initialisation)] + [2024/02/08 v3.2i LaTeX Kernel (NFSS Initialisation)] % \iffalse \documentclass{ltxdoc} \begin{document} @@ -864,7 +864,7 @@ % % If \cs{bfdefault} and \cs{bfdefault@previous} are different then % the default got changed directly through the legacy interface -% (i.e., via \cs{def} or \cs{renewcommand}. In that case we reset +% (i.e., via \cs{def} or \cs{renewcommand}). In that case we reset % all meta family defaults so that the document behaves like it was % the case before the new mechanism was introduced. % \changes{v3.1k}{2020/03/19}{Support legacy use of \cs{bfdefault} @@ -885,7 +885,7 @@ \let\bfdefault@previous\bfdefault % \end{macrocode} % And we reset the meta family defaults (\cs{bfdef@ult} is an -% expanded version of \cs{bfdefault}. +% expanded version of \cs{bfdefault}). % \begin{macrocode} \let\bfseries@rm\bfdef@ult \let\bfseries@sf\bfdef@ult @@ -1661,8 +1661,8 @@ % \begin{macrocode} \def\emfontdeclare@clist{#2,#1}% % \end{macrocode} -% Then we execute current declaration. Appending |\selectfont| means one -% can write just |\fontshape{it}}| and that works then too. +% Then we execute the current declaration. Appending |\selectfont| means one +% can write just |\fontshape{it}| and that works then too. % \begin{macrocode} % \typeout{Use: \detokenize{#1}}% #1\selectfont diff --git a/macros/latex-dev/base/ltfsstrc.dtx b/macros/latex-dev/base/ltfsstrc.dtx index be0e6c68cf..4f0e43021a 100644 --- a/macros/latex-dev/base/ltfsstrc.dtx +++ b/macros/latex-dev/base/ltfsstrc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -37,7 +37,7 @@ %<package> [2020/12/22 v3.0n Standard LaTeX package (font tracing)] % \fi % \ProvidesFile{ltfsstrc.dtx} -% [2021/04/26 v3.0o LaTeX Kernel (NFSS tracing)] +% [2024/02/08 v3.0o LaTeX Kernel (NFSS tracing)] % % \iffalse %<+checkmem>\CHECKMEM @@ -125,7 +125,7 @@ % % \item[debugshow] In addition to \texttt{infoshow} show also % changing of math fonts as far as possible (this option can produce a -% large amount of output. +% large amount of output). % % \item[loading] Show the name of external fonts when they are % loaded. This option shows only ``newly'' loaded fonts not those @@ -489,8 +489,8 @@ \let\f@shape@saved\f@shape \let\f@series@saved\f@series % \end{macrocode} -% The we run the delayed adjustments (which is using the -% \cs{..@without@substitution} commands +% Then we run the delayed adjustments (which use the +% \cs{..@without@substitution} commands): % \begin{macrocode} \delayed@f@adjustment % \end{macrocode} @@ -863,14 +863,15 @@ % % \TeX{} uses the math fonts that are current when the end of a % formula is reached. If we don't want to keep font setups local to -% every formula (which would result in an enormous overhead, we have +% every formula (which would result in an enormous overhead), we have % to be careful not to end up with the wrong setup in case formulas % are nested, e.g., we need to be able to handle % \begin{verbatim} % $ a=b+c \mbox{ \small for all $b$ and $c\in Z$}$ %\end{verbatim} % Here the inner formulae |b| and |c\in Z| are typeset in |\small| but -% we have to return to |\normalsize| before we reach the closing |$| +% we have to return to |\normalsize| before we reach the +% closing |$| \iffalse$\fi % of the outer formula. % % This is handled in the following way: @@ -1042,8 +1043,8 @@ % If so we first call the `=' macro (i.e.\ argument three) to set % up special things for the selected math group. Then we call % |\mathgroup| to select the group given by argument two and -% finally we place |#1| (i.e.\ the argument of the \meta{math -% alphabet identifier} at the end. This part of the code is +% finally we place |#1| (i.e., the argument of the \meta{math +% alphabet identifier}) at the end. This part of the code is % surrounded by two commands which behave like |\begingroup| % and |\endgroup| if we want \meta{math alphabet identifier}s % but will expand into |\@empty| if we want simply switches to @@ -1081,7 +1082,7 @@ % \begin{macro}{\math@egroup} % \changes{v1.0q}{1990/07/07}{Tracing code added.} If the % \texttt{margid} option is in force (which can be tested by -% looking at the definition of |\math@bgroup| we change the +% looking at the definition of |\math@bgroup|) we change the % |\math@egroup| command a bit to display the current \meta{math % group number} after it closes the scope of \meta{math alphabet} % with |\endgroup|. @@ -1385,7 +1386,7 @@ % It looks for font ranges with font size functions. It's operation % is rather simple: it discards everything up to the next size % specification and passes this on to |\is@range| for inspection. -% The specification (parameter |#2| is inserted again, in case +% The specification (parameter |#2|) is inserted again, in case % it is needed later. % \begin{macrocode} \def\extract@rangefontinfo#1<#2>{% @@ -1402,7 +1403,7 @@ % % From the way |\is@range| is called inside |\extract@rangefontinfo| % we see that |#2| is the character |>| if the size specification -% found is a simple one (as it does not contain a |-| character. +% found is a simple one (that does not contain a |-| character). % This is checked easily enough and |\extract@rangefontinfo| % called again. Note that the extra tokens inserted after the % |\@nil| in the call to |\is@range| appear at the beginning of diff --git a/macros/latex-dev/base/lthooks-code.pdf b/macros/latex-dev/base/lthooks-code.pdf Binary files differindex 61e9f4a92a..1ebe678058 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 4cd9279439..8dc6df576d 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 20d48730c4..ea337d306d 100644 --- a/macros/latex-dev/base/lthooks.dtx +++ b/macros/latex-dev/base/lthooks.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2020-2023 +% Copyright (C) 2020-2024 % Frank Mittelbach, Phelype Oleinik, The LaTeX Project % % This file is part of the LaTeX base system. @@ -27,17 +27,16 @@ % \fi % % \iffalse -% %%% From File: lthooks.dtx % -% \begin{macrocode} -\def\lthooksversion{v1.1f} -\def\lthooksdate{2023/10/02} -% \end{macrocode} -% %<*driver> +% \fi +\ProvidesFile{lthooks.dtx} + [2024/02/11 v1.1h LaTeX Kernel (hooks)] +% \iffalse +% \documentclass{l3doc} - +\GetFileInfo{lthooks.dtx} \providecommand\InternalDetectionOff{} \providecommand\InternalDetectionOn{} @@ -62,7 +61,7 @@ % % % \title{\LaTeX{}'s hook management\thanks{This module has version -% \lthooksversion\ dated \lthooksdate, \copyright\ \LaTeX\ +% \fileversion\ dated \filedate, \copyright\ \LaTeX\ % Project.}} % % \author{Frank Mittelbach\thanks{Code improvements for speed and other goodies by Phelype Oleinik}} @@ -160,7 +159,7 @@ % \end{function} % % -% \begin{function}{\NewHookWithArguments} +% \begin{function}[added=2023-06-01]{\NewHookWithArguments} % \begin{syntax} % \cs{NewHookWithArguments} \Arg{hook} \Arg{number} % \end{syntax} @@ -172,7 +171,7 @@ % the current package name. See section~\ref{sec:default-label}. % \end{function} % -% \begin{function}{\NewReversedHookWithArguments} +% \begin{function}[added=2023-06-01]{\NewReversedHookWithArguments} % \begin{syntax} % \cs{NewReversedHookWithArguments} \Arg{hook} \Arg{number} % \end{syntax} @@ -184,7 +183,7 @@ % the current package name. See section~\ref{sec:default-label}. % \end{function} % -% \begin{function}{\NewMirroredHookPairWithArguments} +% \begin{function}[added=2023-06-01]{\NewMirroredHookPairWithArguments} % \begin{syntax} % \cs{NewMirroredHookPairWithArguments} \Arg{hook-1} \Arg{hook-2} \Arg{number} % \end{syntax} @@ -264,7 +263,7 @@ % A leading |.| is treated literally. % \end{function} % -% \begin{function}{\UseHookWithArguments} +% \begin{function}[added=2023-06-01]{\UseHookWithArguments} % \begin{syntax} % \cs{UseHookWithArguments} \Arg{hook} \Arg{number} \Arg{arg_1} \ldots \Arg{arg_n} % \end{syntax} @@ -314,7 +313,7 @@ % % \end{function} % -% \begin{function}{\UseOneTimeHookWithArguments} +% \begin{function}[added=2023-06-01]{\UseOneTimeHookWithArguments} % \begin{syntax} % \cs{UseOneTimeHookWithArguments} \Arg{hook} \Arg{number} \Arg{arg_1} \ldots \Arg{arg_n} % \end{syntax} @@ -340,7 +339,7 @@ % % \begin{function}{\AddToHook} % \begin{syntax} -% \cs{AddToHook} \Arg{hook}\oarg{label}\Arg{code} +% \cs{AddToHook} \Arg{hook} \oarg{label} \Arg{code} % \end{syntax} % Adds \meta{code} to the \meta{hook} labeled by \meta{label}. % When the optional argument \meta{label} is not provided, the @@ -368,9 +367,9 @@ % See section~\ref{sec:default-label}. % \end{function} % -% \begin{function}{\AddToHookWithArguments} +% \begin{function}[added=2023-06-01]{\AddToHookWithArguments} % \begin{syntax} -% \cs{AddToHookWithArguments} \Arg{hook}\oarg{label}\Arg{code} +% \cs{AddToHookWithArguments} \Arg{hook} \oarg{label} \Arg{code} % \end{syntax} % Works exactly like \cs{AddToHook}, except that the \meta{code} can % access the arguments passed to the hook using \verb|#1|, \verb|#2|, @@ -398,7 +397,7 @@ % % \begin{function}{\RemoveFromHook} % \begin{syntax} -% \cs{RemoveFromHook} \Arg{hook}\oarg{label} +% \cs{RemoveFromHook} \Arg{hook} \oarg{label} % \end{syntax} % Removes any code labeled by \meta{label} from the \meta{hook}. % When the optional argument \meta{label} is not provided, the @@ -459,7 +458,7 @@ % % \begin{function}{\AddToHookNext} % \begin{syntax} -% \cs{AddToHookNext} \Arg{hook}\Arg{code} +% \cs{AddToHookNext} \Arg{hook} \Arg{code} % \end{syntax} % Adds \meta{code} to the next invocation of the \meta{hook}. % The code is executed after the normal hook code has finished and @@ -505,9 +504,9 @@ % \end{function}\footnotetext{There is % no mechanism to reorder such code chunks (or delete them).} % -% \begin{function}{\AddToHookNextWithArguments} +% \begin{function}[added=2023-06-01]{\AddToHookNextWithArguments} % \begin{syntax} -% \cs{AddToHookNextWithArguments} \Arg{hook}\Arg{code} +% \cs{AddToHookNextWithArguments} \Arg{hook} \Arg{code} % \end{syntax} % Works exactly like \cs{AddToHookNext}, but the \meta{code} can % contain references to the arguments of the \meta{hook} as described @@ -522,7 +521,7 @@ % % \begin{function}{\ClearHookNext} % \begin{syntax} -% \cs{ClearHookNext}\Arg{hook} +% \cs{ClearHookNext} \Arg{hook} % \end{syntax} % Normally \cs{AddToHookNext} is only used when you know precisely % where it will apply and why you want some extra code at that @@ -746,7 +745,7 @@ % % \begin{function}{\DeclareHookRule} % \begin{syntax} -% \cs{DeclareHookRule} \Arg{hook}\Arg{label1}\Arg{relation}\Arg{label2} +% \cs{DeclareHookRule} \Arg{hook} \Arg{label1} \Arg{relation} \Arg{label2} % \end{syntax} % Defines a relation between \meta{label1} and \meta{label2} for a % given \meta{hook}. If \meta{hook} is \texttt{??} this defines a default @@ -807,7 +806,7 @@ % % \begin{function}{\ClearHookRule} % \begin{syntax} -% \cs{ClearHookRule}\Arg{hook}\Arg{label1}\Arg{label2} +% \cs{ClearHookRule} \Arg{hook} \Arg{label1} \Arg{label2} % \end{syntax} % Syntactic sugar for saying that \meta{label1} and \meta{label2} % are unrelated for the given \meta{hook}. @@ -817,7 +816,7 @@ % % \begin{function}{\DeclareDefaultHookRule} % \begin{syntax} -% \cs{DeclareDefaultHookRule}\Arg{label1}\Arg{relation}\Arg{label2} +% \cs{DeclareDefaultHookRule} \Arg{label1} \Arg{relation} \Arg{label2} % \end{syntax} % This sets up a relation between \meta{label1} and \meta{label2} % for all hooks unless overwritten by a specific rule for a hook. @@ -1004,7 +1003,7 @@ % % \begin{function}{\DebugHooksOn,\DebugHooksOff} % \begin{syntax} -% \cs{DebugHooksOn} +% \cs{DebugHooksOn} \ldots\ \cs{DebugHooksOff} % \end{syntax} % Turn the debugging of hook code on or off. This displays most changes % made to the hook data structures. The output is rather coarse and @@ -1044,7 +1043,7 @@ % the current package name. See section~\ref{sec:default-label}. % \end{function} % -% \begin{function}{ +% \begin{function}[added=2023-06-01]{ % \hook_new_with_args:nn, % \hook_new_reversed_with_args:nn, % \hook_new_pair_with_args:nnn @@ -1100,9 +1099,14 @@ % % % -% \begin{function}{\hook_use:n,\hook_use:nnw} +% \begin{function}{\hook_use:n} +% \begin{syntax} +% ~~\cs{hook_use:n} \Arg{hook} +% \end{syntax} +% \end{function} +% \vskip-1.2\baselineskip +% \begin{function}[added=2023-06-01]{\hook_use:nnw} % \begin{syntax} -% \cs{hook_use:n} \Arg{hook} % \cs{hook_use:nnw} \Arg{hook} \Arg{number} \Arg{arg_1} \ldots \Arg{arg_n} % \end{syntax} % Executes the \Arg{hook} code followed (if set up) by the code for next @@ -1118,9 +1122,14 @@ % A leading |.| is treated literally. % \end{function} % -% \begin{function}{\hook_use_once:n,\hook_use_once:nnw} +% \begin{function}{\hook_use_once:n} % \begin{syntax} % \cs{hook_use_once:n} \Arg{hook} +% \end{syntax} +% \end{function} +% \vskip-1.2\baselineskip +% \begin{function}[added=2023-06-01]{\hook_use_once:nnw} +% \begin{syntax} % \cs{hook_use_once:nnw} \Arg{hook} \Arg{number} \Arg{arg_1} \ldots \Arg{arg_n} % \end{syntax} % Changes the \Arg{hook} status so that from now on any addition to @@ -1139,10 +1148,16 @@ % % \begin{function}{ % \hook_gput_code:nnn, +% } +% \begin{syntax} +% ~~~~~~~~~\cs{hook_gput_code:nnn} \Arg{hook} \Arg{label} \Arg{code} +% \end{syntax} +% \end{function} +% \vskip -1.2\baselineskip +% \begin{function}[added=2023-06-01]{ % \hook_gput_code_with_args:nnn % } % \begin{syntax} -% \cs{hook_gput_code:nnn} \Arg{hook} \Arg{label} \Arg{code} % \cs{hook_gput_code_with_args:nnn} \Arg{hook} \Arg{label} \Arg{code} % \end{syntax} % Adds a chunk of \meta{code} to the \meta{hook} labeled @@ -1168,10 +1183,17 @@ % % \begin{function}{ % \hook_gput_next_code:nn, +% } +% \begin{syntax} +% ~~~~~~~~~~~~~\cs{hook_gput_next_code:nn} \Arg{hook} \Arg{code} +% \end{syntax} +% \end{function} +% \vskip-1.2\baselineskip +% \begin{function}[added=2023-06-01]{ % \hook_gput_next_code_with_args:nn, % } % \begin{syntax} -% \cs{hook_gput_next_code:nn} \Arg{hook} \Arg{code} +% \cs{hook_gput_next_code_with_args:nn} \Arg{hook} \Arg{code} % \end{syntax} % Adds a chunk of \meta{code} for use only in the next invocation of the % \meta{hook}. Once used it is gone. @@ -1183,6 +1205,7 @@ % In that case, if an actual parameter token should be added to the % code, it should be doubled. % +% \end{function} % This is simpler than \cs{hook_gput_code:nnn}, the code is simply % appended to the hook in the order of declaration at the very end, % i.e., after all standard code for the hook got executed. @@ -1191,7 +1214,6 @@ % % The \meta{hook} can be specified using the dot-syntax to denote % the current package name. See section~\ref{sec:default-label}. -% \end{function} % % % \begin{function}{\hook_gclear_next_code:n} @@ -1862,15 +1884,17 @@ % \item[\hook{env/\meta{env}/begin}] % % This hook is executed as part of \cs{begin} directly in front -% of the code specific to the environment start (e.g., the -% second argument of \cs{newenvironment}). Its scope is the -% environment body. +% of the code specific to the environment start (e.g., +% the third argument of \cs{NewDocumentEnvironment} and +% the second argument of \cs{newenvironment}). +% Its scope is the environment body. % % \item[\hook{env/\meta{env}/end}] % % This hook is executed as part of \cs{end} directly in front of the -% code specific to the end of the environment (e.g., the third -% argument of \cs{newenvironment}). +% code specific to the end of the environment (e.g., +% the forth argument of \cs{NewDocumentEnvironment} and +% the third argument of \cs{newenvironment}). % % \item[\hook{env/\meta{env}/after}] % @@ -2701,7 +2725,7 @@ % \hook_new:n, % \hook_new_with_args:nn % } -% \begin{macro}{@@_new:nn} +% \begin{macro}{\@@_new:nn} % The \cs{hook_new:n} declaration declares a new hook and expects % the hook \meta{name} as its argument, e.g., % \hook{begindocument}. @@ -3509,7 +3533,8 @@ \msg_error:nnnnn { hooks } { set-top-level } { for } { SetDefaultHookLabel } {#1} } - { \exp_args:Nx \@@_set_default_label:n { \@@_make_name:n {#1} } } + { \exp_args:Nx + \@@_set_default_label:n { \@@_make_name:n {#1} } } } \cs_new_protected:Npn \@@_set_default_label:n #1 { @@ -3722,7 +3747,8 @@ %<latexrelease>\IncludeInRelease{2020/10/01}{\hook_gput_code:nnn} %<latexrelease> {Providing~hooks} %<latexrelease>\cs_gset_protected:Npn \hook_gput_code:nnn #1 #2 -%<latexrelease> { \@@_normalize_hook_args:Nnn \@@_gput_code:nnn {#1} {#2} } +%<latexrelease> { \@@_normalize_hook_args:Nnn +%<latexrelease> \@@_gput_code:nnn {#1} {#2} } %<latexrelease>\cs_gset_protected:Npn \@@_gput_code:nnn #1 #2 #3 %<latexrelease> { %<latexrelease> \@@_if_execute_immediately:nTF {#1} @@ -3736,7 +3762,8 @@ %<latexrelease> { %<latexrelease> \@@_if_disabled:nTF {#1} %<latexrelease> { \msg_error:nnn { hooks } { hook-disabled } {#1} } -%<latexrelease> { \@@_try_declaring_generic_hook:nnn {#1} {#2} {#3} } +%<latexrelease> { \@@_try_declaring_generic_hook:nnn +%<latexrelease> {#1} {#2} {#3} } %<latexrelease> } %<latexrelease> } %<latexrelease> } @@ -3748,7 +3775,8 @@ %<latexrelease> \on@line\space <-~ \tl_to_str:n{#3}} } %<latexrelease> \str_if_eq:nnTF {#2} { top-level } %<latexrelease> { -%<latexrelease> \str_if_eq:eeTF { top-level } { \@@_currname_or_default: } +%<latexrelease> \str_if_eq:eeTF { top-level } +%<latexrelease> { \@@_currname_or_default: } %<latexrelease> { %<latexrelease> \@@_init_structure:n {#1} %<latexrelease> \@@_tl_gput_right:cn { @@_toplevel~#1 } {#3} @@ -3756,7 +3784,8 @@ %<latexrelease> { \msg_error:nnn { hooks } { misused-top-level } {#1} } %<latexrelease> } %<latexrelease> { -%<latexrelease> \prop_get:cnNTF { g_@@_#1_code_prop } {#2} \l_@@_return_tl +%<latexrelease> \prop_get:cnNTF +%<latexrelease> { g_@@_#1_code_prop } {#2} \l_@@_return_tl %<latexrelease> { %<latexrelease> \prop_gput:cno { g_@@_#1_code_prop } {#2} %<latexrelease> { \l_@@_return_tl #3 } @@ -3840,7 +3869,8 @@ % \changes{v1.1d}{2023/05/21} % {Changes to allow support arguments in cmd hooks (cmd-args).} % \begin{macrocode} -%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_try_declaring_generic_hook:nnn} +%<latexrelease>\IncludeInRelease{2023/06/01} +%<latexrelease> {\@@_try_declaring_generic_hook:nnn} %<latexrelease> {Hooks~with~args} \cs_new_protected:Npn \@@_try_declaring_generic_hook:nnn #1 { @@ -3857,31 +3887,38 @@ {#1} } %<latexrelease>\EndIncludeInRelease -%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_try_declaring_generic_hook:nnn} +%<latexrelease>\IncludeInRelease{2021/11/15} +%<latexrelease> {\@@_try_declaring_generic_hook:nnn} %<latexrelease> {Standardise~generic~hook~names} %<latexrelease>\cs_gset_protected:Npn \@@_try_declaring_generic_hook:nnn #1 %<latexrelease> { -%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1} +%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: +%<latexrelease> {#1} %<latexrelease> \hook_gput_code:nnn %<latexrelease> \@@_gput_undeclared_hook:nnn %<latexrelease> {#1} %<latexrelease> } -%<latexrelease>\cs_gset_protected:Npn \@@_try_declaring_generic_next_hook:nn #1 +%<latexrelease>\cs_gset_protected:Npn +%<latexrelease> \@@_try_declaring_generic_next_hook:nn #1 %<latexrelease> { -%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1} +%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: +%<latexrelease> {#1} %<latexrelease> \hook_gput_next_code:nn %<latexrelease> \@@_gput_next_do:nn %<latexrelease> {#1} %<latexrelease> } %<latexrelease>\EndIncludeInRelease -%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_try_declaring_generic_hook:nnn} +%<latexrelease>\IncludeInRelease{2020/10/01} +%<latexrelease> {\@@_try_declaring_generic_hook:nnn} %<latexrelease> {Standardise~generic~hook~names} -%<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_hook:nnn #1 +%<latexrelease>\cs_new_protected:Npn +%<latexrelease> \@@_try_declaring_generic_hook:nnn #1 %<latexrelease> { %<latexrelease> \@@_try_declaring_generic_hook:nNNnn {#1} %<latexrelease> \hook_gput_code:nnn \@@_gput_undeclared_hook:nnn %<latexrelease> } -%<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_next_hook:nn #1 +%<latexrelease>\cs_new_protected:Npn +%<latexrelease> \@@_try_declaring_generic_next_hook:nn #1 %<latexrelease> { %<latexrelease> \@@_try_declaring_generic_hook:nNNnn {#1} %<latexrelease> \hook_gput_next_code:nn \@@_gput_next_do:nn @@ -3904,12 +3941,15 @@ % % \changes{v1.0s}{2021/09/28} % {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/675)} +% \changes{v1.1h}{2024/01/24} +% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/1243)} % \begin{macrocode} %<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_hook:nNNnn #1 %<latexrelease> { -%<latexrelease> \@@_if_file_hook:wTF #1 / \s_@@_mark +%<latexrelease> \@@_if_file_hook:wTF #1 / / \s_@@_mark %<latexrelease> { -%<latexrelease> \exp_args:Ne \@@_try_declaring_generic_hook_split:nNNnn +%<latexrelease> \exp_args:Ne +%<latexrelease> \@@_try_declaring_generic_hook_split:nNNnn %<latexrelease> { \exp_args:Ne \@@_file_hook_normalize:n {#1} } %<latexrelease> } %<latexrelease> { \@@_try_declaring_generic_hook_split:nNNnn {#1} } @@ -3917,9 +3957,11 @@ % \end{macrocode} % % \begin{macrocode} -%<latexrelease>\cs_new_protected:Npn \@@_try_declaring_generic_hook_split:nNNnn #1 #2 #3 +%<latexrelease>\cs_new_protected:Npn +%<latexrelease> \@@_try_declaring_generic_hook_split:nNNnn #1 #2 #3 %<latexrelease> { -%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1} +%<latexrelease> \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: +%<latexrelease> {#1} %<latexrelease> { #2 } %<latexrelease> { #3 } {#1} %<latexrelease> } @@ -3931,9 +3973,11 @@ % \changes{v1.1a}{2023/04/06} % {Changes to add hook arguments (hook-args).} % \begin{macrocode} -%<latexrelease>\IncludeInRelease{2023/06/01}{\@@_try_declaring_generic_hook:wn} +%<latexrelease>\IncludeInRelease{2023/06/01} +%<latexrelease> {\@@_try_declaring_generic_hook:wn} %<latexrelease> {Hooks~with~args} -\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn +\prg_new_protected_conditional:Npnn + \@@_try_declaring_generic_hook:wn #1 / #2 / #3 / #4 \scan_stop: #5 { TF } { \@@_if_generic:nTF {#5} @@ -4052,9 +4096,11 @@ % \end{macro} % % \begin{macrocode} -%<latexrelease>\IncludeInRelease{2021/11/15}{\@@_try_declaring_generic_hook:wn} +%<latexrelease>\IncludeInRelease{2021/11/15} +%<latexrelease> {\@@_try_declaring_generic_hook:wn} %<latexrelease> {Standardise~generic~hook~names} -%<latexrelease>\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn +%<latexrelease>\prg_new_protected_conditional:Npnn +%<latexrelease> \@@_try_declaring_generic_hook:wn %<latexrelease> #1 / #2 / #3 / #4 \scan_stop: #5 { TF } %<latexrelease> { %<latexrelease> \@@_if_generic:nTF {#5} @@ -4083,9 +4129,11 @@ % \end{macrocode} % % \begin{macrocode} -%<latexrelease>\IncludeInRelease{2021/06/01}{\@@_try_declaring_generic_hook:wn} +%<latexrelease>\IncludeInRelease{2021/06/01} +%<latexrelease> {\@@_try_declaring_generic_hook:wn} %<latexrelease> {Support~cmd~hooks} -%<latexrelease>\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn +%<latexrelease>\prg_new_protected_conditional:Npnn +%<latexrelease> \@@_try_declaring_generic_hook:wn %<latexrelease> #1 / #2 / #3 / #4 \scan_stop: #5 { TF } %<latexrelease> { %<latexrelease> \tl_if_empty:nTF {#2} @@ -4099,10 +4147,12 @@ %<latexrelease> { \@@_try_put_cmd_hook:n {#5} } %<latexrelease> \@@_make_usable:n {#5} %<latexrelease> } -%<latexrelease> \prop_if_in:NnTF \c_@@_generics_reversed_ii_prop {#2} +%<latexrelease> \prop_if_in:NnTF +%<latexrelease> \c_@@_generics_reversed_ii_prop {#2} %<latexrelease> { \tl_gset:cn { g_@@_#5_reversed_tl } { - } } %<latexrelease> { -%<latexrelease> \prop_if_in:NnT \c_@@_generics_reversed_iii_prop {#3} +%<latexrelease> \prop_if_in:NnT +%<latexrelease> \c_@@_generics_reversed_iii_prop {#3} %<latexrelease> { \tl_gset:cn { g_@@_#5_reversed_tl } { - } } %<latexrelease> } %<latexrelease> \prg_return_true: @@ -4114,9 +4164,11 @@ % \end{macrocode} % % \begin{macrocode} -%<latexrelease>\IncludeInRelease{2020/10/01}{\@@_try_declaring_generic_hook:wn} +%<latexrelease>\IncludeInRelease{2020/10/01} +%<latexrelease> {\@@_try_declaring_generic_hook:wn} %<latexrelease> {Support~cmd~hooks} -%<latexrelease>\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn +%<latexrelease>\prg_new_protected_conditional:Npnn +%<latexrelease> \@@_try_declaring_generic_hook:wn %<latexrelease> #1 / #2 / #3 / #4 \scan_stop: #5 { TF } %<latexrelease> { %<latexrelease> \tl_if_empty:nTF {#2} @@ -4125,10 +4177,12 @@ %<latexrelease> \prop_if_in:NnTF \c_@@_generics_prop {#1} %<latexrelease> { %<latexrelease> \@@_if_declared:nF {#5} { \hook_new:n {#5} } -%<latexrelease> \prop_if_in:NnTF \c_@@_generics_reversed_ii_prop {#2} +%<latexrelease> \prop_if_in:NnTF +%<latexrelease> \c_@@_generics_reversed_ii_prop {#2} %<latexrelease> { \tl_gset:cn { g_@@_#5_reversed_tl } { - } } %<latexrelease> { -%<latexrelease> \prop_if_in:NnT \c_@@_generics_reversed_iii_prop {#3} +%<latexrelease> \prop_if_in:NnT +%<latexrelease> \c_@@_generics_reversed_iii_prop {#3} %<latexrelease> { \tl_gset:cn { g_@@_#5_reversed_tl } { - } } %<latexrelease> } %<latexrelease> \prg_return_true: @@ -4204,11 +4258,11 @@ % \changes{v1.0h}{2021/01/07}{Assume hook name has at least three % nonempty parts (gh/464)} % \begin{macrocode} -%<latexrelease>\cs_new:Npn \@@_strip_double_slash:w #1/#2/#3 // #4 \s_@@_mark +%<latexrelease>\cs_new:Npn \@@_strip_double_slash:w #1/#2/#3//#4\s_@@_mark %<latexrelease> { %<latexrelease> \tl_if_empty:nTF {#4} %<latexrelease> { #1/#2/#3 } -%<latexrelease> { \@@_strip_double_slash:w #1/#2/#3 / #4 \s_@@_mark } +%<latexrelease> { \@@_strip_double_slash:w #1/#2/#3 /#4\s_@@_mark } %<latexrelease> } %<latexrelease>\EndIncludeInRelease % \end{macrocode} @@ -4287,9 +4341,12 @@ % \begin{macrocode} %<latexrelease>\IncludeInRelease{2020/10/01}{\c_@@_generics_reversed_ii_prop} %<latexrelease> {Standardise~generic~hook~names} -%<latexrelease>\prop_const_from_keyval:Nn \c_@@_generics_reversed_ii_prop {after=,end=} -%<latexrelease>\prop_const_from_keyval:Nn \c_@@_generics_reversed_iii_prop {after=} -%<latexrelease>\prop_const_from_keyval:Nn \c_@@_generics_file_prop {before=,after=} +%<latexrelease>\prop_const_from_keyval:Nn +%<latexrelease> \c_@@_generics_reversed_ii_prop {after=,end=} +%<latexrelease>\prop_const_from_keyval:Nn +%<latexrelease> \c_@@_generics_reversed_iii_prop {after=} +%<latexrelease>\prop_const_from_keyval:Nn +%<latexrelease> \c_@@_generics_file_prop {before=,after=} %<latexrelease>\EndIncludeInRelease % \end{macrocode} % \end{macro} @@ -4369,7 +4426,8 @@ \str_if_eq:nnTF {#2} { top-level } { \@@_toplevel_gset:nn {#1} { } } { - \prop_gpop:cnNF { g_@@_#1_code_prop } {#2} \l_@@_return_tl + \prop_gpop:cnNF { g_@@_#1_code_prop } + {#2} \l_@@_return_tl { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } } } @@ -4387,7 +4445,8 @@ \@@_if_deprecated_generic:nTF {#1} { \@@_deprecated_generic_warn:n {#1} - \@@_do_deprecated_generic:Nn \@@_gremove_code:nn {#1} {#2} + \@@_do_deprecated_generic:Nn + \@@_gremove_code:nn {#1} {#2} } { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } } @@ -4412,8 +4471,10 @@ %<latexrelease> \str_if_eq:nnTF {#2} { top-level } %<latexrelease> { \@@_tl_gclear:c { @@_toplevel~#1 } } %<latexrelease> { -%<latexrelease> \prop_gpop:cnNF { g_@@_#1_code_prop } {#2} \l_@@_return_tl -%<latexrelease> { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } +%<latexrelease> \prop_gpop:cnNF { g_@@_#1_code_prop } +%<latexrelease> {#2} \l_@@_return_tl +%<latexrelease> { \msg_warning:nnnn { hooks } { cannot-remove } +%<latexrelease> {#1} {#2} } %<latexrelease> } %<latexrelease> } %<latexrelease> \@@_if_usable:nT {#1} @@ -4423,9 +4484,11 @@ %<latexrelease> \@@_if_deprecated_generic:nTF {#1} %<latexrelease> { %<latexrelease> \@@_deprecated_generic_warn:n {#1} -%<latexrelease> \@@_do_deprecated_generic:Nn \@@_gremove_code:nn {#1} {#2} +%<latexrelease> \@@_do_deprecated_generic:Nn +%<latexrelease> \@@_gremove_code:nn {#1} {#2} %<latexrelease> } -%<latexrelease> { \msg_warning:nnnn { hooks } { cannot-remove } {#1} {#2} } +%<latexrelease> { \msg_warning:nnnn { hooks } { cannot-remove } +%<latexrelease> {#1} {#2} } %<latexrelease> } %<latexrelease> } %<latexrelease>\EndIncludeInRelease @@ -4467,7 +4530,8 @@ {#1} {#2} } \cs_new_protected:Npn \@@_cs_gput_right_fast:nnn #1 #2 #3 - { \cs_gset:cpx { @@#1~#2 } { \exp_not:v { @@#1~#2 } \exp_not:n {#3} } } + { \cs_gset:cpx { @@#1~#2 } + { \exp_not:v { @@#1~#2 } \exp_not:n {#3} } } \cs_new_protected:Npn \@@_cs_gput_right_slow:nnn #1 #2 #3 { % \end{macrocode} @@ -4693,7 +4757,8 @@ % \begin{macrocode} \exp_last_unbraced:NNf \cs_set:Npn \@@_tmp:w { \@@_parameter:n {#1} } { } - \tl_set:Ne \l_@@_tmpa_tl { \@@_braced_cs_parameter:n { @@_tmp:w } } + \tl_set:Ne \l_@@_tmpa_tl + { \@@_braced_cs_parameter:n { @@_tmp:w } } % \end{macrocode} % Now this function does the fun part. It is meant to be used with % \cs{prop_map_function:NN}, taking a label name in \verb|##1| and the @@ -5069,8 +5134,8 @@ %<latexrelease> \@@_if_deprecated_generic:nT {#1} %<latexrelease> { %<latexrelease> \@@_deprecated_generic_warn:n {#1} -%<latexrelease> \@@_do_deprecated_generic:Nn \@@_gset_rule:nnnn {#1} -%<latexrelease> {#2} {#3} {#4} +%<latexrelease> \@@_do_deprecated_generic:Nn \@@_gset_rule:nnnn +%<latexrelease> {#1} {#2} {#3} {#4} %<latexrelease> \exp_after:wN \use_none:nnnnnnnnn \use_none:n %<latexrelease> } %<latexrelease> \@@_init_structure:n {#1} @@ -5110,7 +5175,8 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_rule_before_gset:nnn #1#2#3 { - \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } + \@@_tl_gset:cx + { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } { \@@_label_ordered:nnTF {#2} {#3} { < } { > } } } \cs_new_eq:cN { @@_rule_<_gset:nnn } \@@_rule_before_gset:nnn @@ -5119,7 +5185,8 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_rule_after_gset:nnn #1#2#3 { - \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#3} {#2} _tl } + \@@_tl_gset:cx + { g_@@_#1_rule_ \@@_label_pair:nn {#3} {#2} _tl } { \@@_label_ordered:nnTF {#3} {#2} { < } { > } } } \cs_new_eq:cN { @@_rule_>_gset:nnn } \@@_rule_after_gset:nnn @@ -5132,7 +5199,8 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_rule_voids_gset:nnn #1#2#3 { - \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } + \@@_tl_gset:cx + { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } { \@@_label_ordered:nnTF {#2} {#3} { -> } { <- } } } % \end{macrocode} @@ -5146,11 +5214,15 @@ % together in hook |#1|. % \begin{macrocode} \cs_new_protected:cpn { @@_rule_incompatible-error_gset:nnn } #1#2#3 - { \@@_tl_gset:cn { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } - { xE } } + { \@@_tl_gset:cn + { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } + { xE } + } \cs_new_protected:cpn { @@_rule_incompatible-warning_gset:nnn } #1#2#3 - { \@@_tl_gset:cn { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } - { xW } } + { \@@_tl_gset:cn + { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } + { xW } + } % \end{macrocode} % \end{macro} % @@ -5268,7 +5340,7 @@ } % \end{macrocode} % After all hooks are initialized we change the ``use'' to just -% call the hook code and not initialize it (as it was done in the +% call the hook code and not initialize it (as this was already done in the % preamble. % \begin{macrocode} \@@_post_initialization_defs: @@ -5281,7 +5353,8 @@ %<latexrelease> {Hooks~with~args} %<latexrelease>\cs_gset_protected:Npn \@@_initialize_all: %<latexrelease> { -%<latexrelease> \cs_gset_eq:NN \@@_update_hook_code:n \@@_initialize_hook_code:n +%<latexrelease> \cs_gset_eq:NN \@@_update_hook_code:n +%<latexrelease> \@@_initialize_hook_code:n %<latexrelease> \@@_debug:n { \prop_gclear:N \g_@@_used_prop } %<latexrelease> \seq_map_inline:Nn \g_@@_all_seq %<latexrelease> { \@@_update_hook_code:n {##1} } @@ -5291,7 +5364,8 @@ %<latexrelease> \prop_map_inline:Nn \g_@@_used_prop %<latexrelease> { %<latexrelease> \iow_term:x -%<latexrelease> { ^^J ~ ##1 ~ -> ~ \cs_replacement_spec:c { @@~##1 } ~ } +%<latexrelease> { ^^J ~ ##1 ~ -> ~ +%<latexrelease> \cs_replacement_spec:c { @@~##1 } ~ } %<latexrelease> } %<latexrelease> } %<latexrelease> \cs_gset_eq:NN \hook_use:n \@@_use_initialized:n @@ -5350,8 +5424,10 @@ % after the \verb|_next| and \verb|_toplevel| macros, so that the % arguments passed to the hook are forwarded to them. % \begin{macrocode} - \exp_not:c { @@_toplevel~#1 } \@@_braced_parameter:n {#1} - \exp_not:c { @@_next~#1 } \@@_braced_parameter:n {#1} + \exp_not:c { @@_toplevel~#1 } + \@@_braced_parameter:n {#1} + \exp_not:c { @@_next~#1 } + \@@_braced_parameter:n {#1} } } { @@ -5400,7 +5476,8 @@ %<latexrelease>\cs_gset_protected:Npn \@@_initialize_hook_code:n #1 %<latexrelease> { %<latexrelease> \@@_debug:n -%<latexrelease> { \iow_term:x { ^^J Update~code~for~hook~'#1' \on@line :^^J } } +%<latexrelease> { \iow_term:x { ^^J Update~code~for~hook~'#1' +%<latexrelease> \on@line :^^J } } %<latexrelease> \@@_include_legacy_code_chunk:n {#1} %<latexrelease> \@@_if_usable:nT {#1} %<latexrelease> { @@ -5414,15 +5491,21 @@ %<latexrelease> } %<latexrelease> { %<latexrelease> \@@_if_reversed:nTF {#1} -%<latexrelease> { \cs_set_eq:NN \@@_tl_gput:Nn \@@_tl_gput_left:Nn -%<latexrelease> \cs_set_eq:NN \@@_clist_gput:NV \clist_gput_left:NV } -%<latexrelease> { \cs_set_eq:NN \@@_tl_gput:Nn \@@_tl_gput_right:Nn -%<latexrelease> \cs_set_eq:NN \@@_clist_gput:NV \clist_gput_right:NV } -%<latexrelease> \prop_set_eq:Nc \l_@@_work_prop { g_@@_#1_code_prop } +%<latexrelease> { \cs_set_eq:NN \@@_tl_gput:Nn +%<latexrelease> \@@_tl_gput_left:Nn +%<latexrelease> \cs_set_eq:NN \@@_clist_gput:NV +%<latexrelease> \clist_gput_left:NV } +%<latexrelease> { \cs_set_eq:NN \@@_tl_gput:Nn +%<latexrelease> \@@_tl_gput_right:Nn +%<latexrelease> \cs_set_eq:NN \@@_clist_gput:NV +%<latexrelease> \clist_gput_right:NV } +%<latexrelease> \prop_set_eq:Nc \l_@@_work_prop +%<latexrelease> { g_@@_#1_code_prop } %<latexrelease> \@@_initialize_single:ccn %<latexrelease> { @@~#1 } { g_@@_#1_labels_clist } {#1} %<latexrelease> \@@_debug:n -%<latexrelease> { \exp_args:NNx \prop_gput:Nnn \g_@@_used_prop {#1} { } } +%<latexrelease> { \exp_args:NNx \prop_gput:Nnn \g_@@_used_prop +%<latexrelease> {#1} { } } %<latexrelease> } %<latexrelease> } %<latexrelease> } @@ -5621,7 +5704,8 @@ \int_compare:nNnT { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0 { - \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } } {##1} + \tl_set:cn + { \@@_tl_csname:n { \l_@@_rear_tl } } {##1} \tl_set:Nn \l_@@_rear_tl {##1} } } @@ -5703,42 +5787,50 @@ %<latexrelease> {#3} %<latexrelease> } %<latexrelease> } -%<latexrelease> \@@_debug:n { \@@_debug_label_data:N \l_@@_work_prop } +%<latexrelease> \@@_debug:n +%<latexrelease> { \@@_debug_label_data:N \l_@@_work_prop } %<latexrelease> \tl_set:Nn \l_@@_rear_tl { 0 } %<latexrelease> \tl_set:cn { \@@_tl_csname:n { 0 } } { 0 } %<latexrelease> \seq_map_inline:Nn \l_@@_labels_seq %<latexrelease> { -%<latexrelease> \int_compare:nNnT { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0 -%<latexrelease> { -%<latexrelease> \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } }{##1} -%<latexrelease> \tl_set:Nn \l_@@_rear_tl {##1} -%<latexrelease> } +%<latexrelease> \int_compare:nNnT +%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0 +%<latexrelease> { +%<latexrelease> \tl_set:cn { \@@_tl_csname:n +%<latexrelease> { \l_@@_rear_tl } } {##1} +%<latexrelease> \tl_set:Nn \l_@@_rear_tl {##1} +%<latexrelease> } %<latexrelease> } %<latexrelease> \tl_set_eq:Nc \l_@@_front_tl { \@@_tl_csname:n { 0 } } %<latexrelease> \@@_tl_gclear:N #1 %<latexrelease> \clist_gclear:N #2 -%<latexrelease> \bool_while_do:nn { ! \str_if_eq_p:Vn \l_@@_front_tl { 0 } } +%<latexrelease> \bool_while_do:nn +%<latexrelease> { ! \str_if_eq_p:Vn \l_@@_front_tl { 0 } } %<latexrelease> { %<latexrelease> \int_decr:N \l_@@_labels_int -%<latexrelease> \prop_get:NVN \l_@@_work_prop \l_@@_front_tl \l_@@_return_tl +%<latexrelease> \prop_get:NVN \l_@@_work_prop +%<latexrelease> \l_@@_front_tl \l_@@_return_tl %<latexrelease> \exp_args:NNV \@@_tl_gput:Nn #1 \l_@@_return_tl %<latexrelease> \@@_clist_gput:NV #2 \l_@@_front_tl -%<latexrelease> \@@_debug:n{ \iow_term:x{Handled~ code~ for~ \l_@@_front_tl} } -%<latexrelease> \seq_map_inline:cn { \@@_seq_csname:n { \l_@@_front_tl } } +%<latexrelease> \@@_debug:n{ \iow_term:x +%<latexrelease> {Handled~ code~ for~ \l_@@_front_tl} } +%<latexrelease> \seq_map_inline:cn +%<latexrelease> { \@@_seq_csname:n { \l_@@_front_tl } } %<latexrelease> { %<latexrelease> \tl_set:cx { \@@_tl_csname:n {##1} } -%<latexrelease> { \int_eval:n -%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: - 1 } -%<latexrelease> } +%<latexrelease> { \int_eval:n +%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: - 1 } +%<latexrelease> } %<latexrelease> \int_compare:nNnT -%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0 -%<latexrelease> { -%<latexrelease> \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } } {##1} -%<latexrelease> \tl_set:Nn \l_@@_rear_tl {##1} -%<latexrelease> } +%<latexrelease> { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0 +%<latexrelease> { +%<latexrelease> \tl_set:cn { \@@_tl_csname:n +%<latexrelease> { \l_@@_rear_tl } } {##1} +%<latexrelease> \tl_set:Nn \l_@@_rear_tl {##1} +%<latexrelease> } %<latexrelease> } %<latexrelease> \tl_set_eq:Nc \l_@@_front_tl -%<latexrelease> { \@@_tl_csname:n { \l_@@_front_tl } } +%<latexrelease> { \@@_tl_csname:n { \l_@@_front_tl } } %<latexrelease> } %<latexrelease> \int_compare:nNnF \l_@@_labels_int = 0 %<latexrelease> { @@ -5747,7 +5839,8 @@ %<latexrelease> \@@_debug_label_data:N \l_@@_work_prop %<latexrelease> \iow_term:x{====================} %<latexrelease> } -%<latexrelease> \exp_args:NNo \@@_tl_gput:Nn #1 { \cs:w @@_toplevel~#3 \cs_end: } +%<latexrelease> \exp_args:NNo \@@_tl_gput:Nn #1 +%<latexrelease> { \cs:w @@_toplevel~#3 \cs_end: } %<latexrelease> \@@_tl_gput_right:No #1 { \cs:w @@_next~#3 \cs_end: } %<latexrelease> } %<latexrelease>\cs_generate_variant:Nn \@@_tl_gput_right:Nn { No } @@ -6008,6 +6101,8 @@ % % \changes{v1.1a}{2023/04/06} % {Changes to add hook arguments (hook-args).} +% \changes{v1.1g}{2024/01/03} +% {Fix expansion of \cs{@@_print_args:nn} argument (gh/1221).} % \begin{macrocode} %<latexrelease>\IncludeInRelease{2023/06/01}{\@@_log:nN} %<latexrelease> {Hooks~with~args} @@ -6027,7 +6122,7 @@ hook~'#1' \@@_if_disabled:nF {#1} { - \exp_args:Nf \@@_print_args:nn {#1} + \exp_args:Nne \@@_print_args:nn {#1} { \int_eval:n { \str_count:e { \@@_parameter:n {#1} } / 3 } @@ -6164,7 +6259,8 @@ %<latexrelease> } %<latexrelease> \@@_preamble_hook:n {#1} %<latexrelease> \@@_log_cmd:x -%<latexrelease> { ^^J ->~The~ \@@_if_generic:nT {#1} { generic~ } hook~'#1': } +%<latexrelease> { ^^J ->~The~ \@@_if_generic:nT +%<latexrelease> {#1} { generic~ } hook~'#1': } %<latexrelease> \@@_if_usable:nF {#1} %<latexrelease> { \@@_log_line:x { The~hook~is~not~declared. } } %<latexrelease> \@@_if_disabled:nT {#1} @@ -6177,26 +6273,30 @@ %<latexrelease> { \@@_log_line_indent:x { --- } } %<latexrelease> { %<latexrelease> \prop_map_inline:cn { g_@@_#1_code_prop } -%<latexrelease> { \@@_log_line_indent:x { ##1~->~\tl_to_str:n {##2} } } +%<latexrelease> { \@@_log_line_indent:x +%<latexrelease> { ##1~->~\tl_to_str:n {##2} } } %<latexrelease> } %<latexrelease> \@@_log_line:x %<latexrelease> { %<latexrelease> Document-level~(top-level)~code %<latexrelease> \@@_if_usable:nT {#1} -%<latexrelease> { ~(executed~\@@_if_reversed:nTF {#1} {first} {last} ) } : +%<latexrelease> { ~(executed~ +%<latexrelease> \@@_if_reversed:nTF {#1} {first} {last} ) } : %<latexrelease> } %<latexrelease> \@@_log_line_indent:x %<latexrelease> { %<latexrelease> \tl_if_empty:cTF { @@_toplevel~#1 } %<latexrelease> { --- } -%<latexrelease> { -> ~ \exp_args:Nv \tl_to_str:n { @@_toplevel~#1 } } +%<latexrelease> { -> ~ \exp_args:Nv \tl_to_str:n +%<latexrelease> { @@_toplevel~#1 } } %<latexrelease> } %<latexrelease> \@@_log_line:x { Extra~code~for~next~invocation: } %<latexrelease> \@@_log_line_indent:x %<latexrelease> { %<latexrelease> \tl_if_empty:cTF { @@_next~#1 } %<latexrelease> { --- } -%<latexrelease> { ->~ \exp_args:Nv \@@_log_next_code:n { @@_next~#1 } } +%<latexrelease> { ->~ \exp_args:Nv \@@_log_next_code:n +%<latexrelease> { @@_next~#1 } } %<latexrelease> } %<latexrelease> \@@_log_line:x { Rules: } %<latexrelease> \bool_set_true:N \l_@@_tmpa_bool @@ -6220,7 +6320,8 @@ %<latexrelease> { %<latexrelease> Execution~order %<latexrelease> \bool_if:NTF \l_@@_tmpa_bool -%<latexrelease> { \@@_if_reversed:nT {#1} { ~(after~reversal) } } +%<latexrelease> { \@@_if_reversed:nT +%<latexrelease> {#1}{ ~(after~reversal) } } %<latexrelease> { ~(after~ %<latexrelease> \@@_if_reversed:nT {#1} { reversal~and~ } %<latexrelease> applying~rules) @@ -6231,16 +6332,19 @@ %<latexrelease> \@spaces %<latexrelease> \clist_if_empty:cTF { g_@@_#1_labels_clist } %<latexrelease> { --- } -%<latexrelease> { \clist_use:cn { g_@@_#1_labels_clist } { ,~ } } +%<latexrelease> { \clist_use:cn +%<latexrelease> { g_@@_#1_labels_clist } { ,~ } } %<latexrelease> } %<latexrelease> } %<latexrelease> { %<latexrelease> \@@_log_line:x { Execution~order: } %<latexrelease> #2 %<latexrelease> { -%<latexrelease> \@spaces Not~set~because~the~hook~ \@@_if_usable:nTF {#1} +%<latexrelease> \@spaces Not~set~because~the~hook~ +%<latexrelease> \@@_if_usable:nTF {#1} %<latexrelease> { code~pool~is~empty } -%<latexrelease> { is~\@@_if_disabled:nTF {#1} {disabled} {undeclared} } +%<latexrelease> { is~\@@_if_disabled:nTF +%<latexrelease> {#1} {disabled} {undeclared} } %<latexrelease> } %<latexrelease> } %<latexrelease> } @@ -6388,7 +6492,8 @@ %<latexrelease>\IncludeInRelease{2020/10/01}{\hook_gput_next_code:nn} %<latexrelease> {Hooks~with~args} %<latexrelease>\cs_gset_protected:Npn \hook_gput_next_code:nn #1 -%<latexrelease> { \@@_normalize_hook_args:Nn \@@_gput_next_code:nn {#1} } +%<latexrelease> { \@@_normalize_hook_args:Nn +%<latexrelease> \@@_gput_next_code:nn {#1} } %<latexrelease>\cs_gset_protected:Npn \hook_gput_next_code_with_args:nn #1 #2 { } %<latexrelease>\EndIncludeInRelease % \end{macrocode} @@ -6580,7 +6685,8 @@ %<latexrelease> \fi: %<latexrelease> \cs:w @@~#1 \@@_use_end: %<latexrelease> } -%<latexrelease>\cs_new:Npn \@@_use_undefined:w #1 #2 @@~#3 \@@_use_end: +%<latexrelease>\cs_new:Npn \@@_use_undefined:w +%<latexrelease> #1 #2 @@~#3 \@@_use_end: %<latexrelease> { %<latexrelease> #1 % fi %<latexrelease> \@@_use:wn #3 / \s_@@_mark {#3} @@ -6680,15 +6786,18 @@ % % \changes{v1.0s}{2021/09/28} % {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/675)} +% \changes{v1.1h}{2024/01/24} +% {Correct usage of older \cs{@@_if_file_hook:wTF} (gh/1243)} % \begin{macrocode} %<latexrelease>\cs_new_protected:Npn \@@_try_file_hook:n #1 %<latexrelease> { -%<latexrelease> \@@_if_file_hook:wTF #1 / \s_@@_mark +%<latexrelease> \@@_if_file_hook:wTF #1 / / \s_@@_mark %<latexrelease> { %<latexrelease> \exp_args:Ne \@@_if_usable_use:n %<latexrelease> { \exp_args:Ne \@@_file_hook_normalize:n {#1} } %<latexrelease> } -%<latexrelease> { \@@_if_usable_use:n {#1} } % file/ generic hook (e.g. file/before) +%<latexrelease> { \@@_if_usable_use:n {#1} } +%<latexrelease> % file/ generic hook (e.g. file/before) %<latexrelease> } % \end{macrocode} % @@ -6726,12 +6835,14 @@ \cs_new_protected:Npn \hook_use_once:n #1 { \@@_if_execute_immediately:nF {#1} - { \@@_normalize_hook_args:Nn \@@_use_once:nn { \use:n {#1} } { 0 } } + { \@@_normalize_hook_args:Nn \@@_use_once:nn + { \use:n {#1} } { 0 } } } \cs_new_protected:Npn \hook_use_once:nnw #1 #2 { \@@_if_execute_immediately:nF {#1} - { \@@_normalize_hook_args:Nn \@@_use_once:nn { \use:n {#1} } {#2} } + { \@@_normalize_hook_args:Nn \@@_use_once:nn + { \use:n {#1} } {#2} } } %<latexrelease>\EndIncludeInRelease % \end{macrocode} @@ -6743,7 +6854,8 @@ %<latexrelease>\cs_gset_protected:Npn \hook_use_once:n #1 %<latexrelease> { %<latexrelease> \@@_if_execute_immediately:nF {#1} -%<latexrelease> { \@@_normalize_hook_args:Nn \@@_use_once:n { \use:n {#1} } } +%<latexrelease> { \@@_normalize_hook_args:Nn \@@_use_once:n +%<latexrelease> { \use:n {#1} } } %<latexrelease> } %<latexrelease>\cs_gset:Npn \hook_use_once:nnw #1 #2 %<latexrelease> { \use:c { use_none: \prg_replicate:nn {#2} { n } } } @@ -6768,7 +6880,8 @@ % along with the next execution code. % \begin{macrocode} \@@_replacing_args_false: - \@@_cs_gput_right:nnn { _next } {#1} { \@@_use_once_clear:n {#1} } + \@@_cs_gput_right:nnn { _next } {#1} + { \@@_use_once_clear:n {#1} } \@@_replacing_args_reset: \@@_if_usable:nTF {#1} { \@@_use_initialized:n {#1} } @@ -7215,7 +7328,8 @@ { Cannot~add~code~to~disabled~hook~'#1'. } { The~hook~'#1'~you~tried~to~add~code~to~was~previously~disabled~ - with~\iow_char:N\\hook_disable_generic:n~or~\iow_char:N\\DisableGenericHook,~so~ + with~\iow_char:N\\hook_disable_generic:n~or~ + \iow_char:N\\DisableGenericHook,~so~ it~cannot~have~code~added~to~it. } % \end{macrocode} @@ -7383,7 +7497,7 @@ %<latexrelease> {Hooks~with~args} %<latexrelease>\cs_new_protected:Npn \NewHookWithArguments #1 #2 { } %<latexrelease>\cs_new_protected:Npn \NewReversedHookWithArguments #1 #2 { } -%<latexrelease>\cs_new_protected:Npn \NewMirroredHookPairWithArguments #1 #2 #3 { } +%<latexrelease>\cs_new_protected:Npn \NewMirroredHookPairWithArguments #1 #2 #3{} %<latexrelease>\EndIncludeInRelease % \end{macrocode} % \end{macro} @@ -7835,7 +7949,8 @@ %<latexrelease> \exp_args:No \exp_not:o %<latexrelease> { %<latexrelease> \cs:w @@#1~#2 \exp_last_unbraced:Ne \cs_end: -%<latexrelease> { \@@_braced_cs_parameter:n { @@#1~#2 } } +%<latexrelease> { \@@_braced_cs_parameter:n +%<latexrelease> { @@#1~#2 } } %<latexrelease> } %<latexrelease> } %<latexrelease> } diff --git a/macros/latex-dev/base/lthyphen.dtx b/macros/latex-dev/base/lthyphen.dtx index 88d30c9cca..ae1e2182aa 100644 --- a/macros/latex-dev/base/lthyphen.dtx +++ b/macros/latex-dev/base/lthyphen.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltidxglo.dtx b/macros/latex-dev/base/ltidxglo.dtx index a2dc6b873e..25b8dd12e9 100644 --- a/macros/latex-dev/base/ltidxglo.dtx +++ b/macros/latex-dev/base/ltidxglo.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltkeys.dtx b/macros/latex-dev/base/ltkeys.dtx index 80c36d5cd9..da8340ea9d 100644 --- a/macros/latex-dev/base/ltkeys.dtx +++ b/macros/latex-dev/base/ltkeys.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2021-2023 +% Copyright (C) 2021-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -33,7 +33,7 @@ %<*driver> % \fi \ProvidesFile{ltkeys.dtx} - [2022/10/22 v1.0l LaTeX Kernel (Keyval options)] + [2024/01/13 v1.0m LaTeX Kernel (Keyval options)] % \iffalse \documentclass{l3doc} \GetFileInfo{ltkeys.dtx} @@ -294,6 +294,7 @@ % \changes{v1.0g}{2022/06/16}{Better handling of option removal} % \changes{v1.0h}{2022/06/19}{Further work on handling of option removal} % \changes{v1.0h}{2022/06/20}{Use raw options data} +% \changes{v1.0m}{2024/01/13}{Trim spaces off key names} % \begin{macro}{\@@_options_class:nnn} % \changes{v1.0h}{2022/06/20}{New function} % \changes{v1.0i}{2022/07/05}{Correct naming of raw class options storage} @@ -318,7 +319,7 @@ \clist_map_inline:cn { @raw@opt@ \@currname . \@currext } { \exp_args:Ne \@@_options_class:nnn - { \@@_remove_equals:n {##1} } + { \tl_trim_spaces:e { \@@_remove_equals:n {##1} } } {##1} {#1} } } @@ -344,6 +345,7 @@ % \changes{v1.0g}{2022/06/16}{Better handling of option removal} % \changes{v1.0h}{2022/06/19}{Further work on handling of option removal} % \changes{v1.0h}{2022/06/20}{Use raw options data} +% \changes{v1.0m}{2024/01/13}{Trim spaces off key names} % \begin{macro}{\@@_options_package:nnn} % \changes{v1.0h}{2022/06/19}{New function} % For global options when processing a package, the tasks are slightly @@ -356,7 +358,7 @@ \clist_map_inline:Nn \@raw@classoptionslist { \exp_args:Ne \@@_options_package:nnn - { \@@_remove_equals:n {##1} } + { \tl_trim_spaces:e { \@@_remove_equals:n {##1} } } {##1} {#1} } } diff --git a/macros/latex-dev/base/ltlength.dtx b/macros/latex-dev/base/ltlength.dtx index 10e4b671c8..c81e6edfb7 100644 --- a/macros/latex-dev/base/ltlength.dtx +++ b/macros/latex-dev/base/ltlength.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltlists.dtx b/macros/latex-dev/base/ltlists.dtx index d43df93a54..8d4c25d916 100644 --- a/macros/latex-dev/base/ltlists.dtx +++ b/macros/latex-dev/base/ltlists.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltlogos.dtx b/macros/latex-dev/base/ltlogos.dtx index 7589cf36e1..4fc710ba40 100644 --- a/macros/latex-dev/base/ltlogos.dtx +++ b/macros/latex-dev/base/ltlogos.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltluatex.dtx b/macros/latex-dev/base/ltluatex.dtx index 6d274ed5c3..a15019dcd5 100644 --- a/macros/latex-dev/base/ltluatex.dtx +++ b/macros/latex-dev/base/ltluatex.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2015-2023 +% Copyright (C) 2015-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -23,16 +23,22 @@ %<tex> \ProvidesFile\undefined\begingroup\def\ProvidesFile %<tex> #1#2[#3]{\endgroup\immediate\write-1{File: #1 #3}} %<tex>\fi -%<plain>\ProvidesFile{ltluatex.tex}% -%<*driver> +%<*dtx> \ProvidesFile{ltluatex.dtx} -%</driver> -%<*tex> -[2023/08/03 v1.2c -%</tex> -%<plain> LuaTeX support for plain TeX (core) -%<*tex> +%</dtx> +%<plain>\ProvidesFile{ltluatex.tex} +%<*plain> +% \fi +% \ProvidesFile{ltluatex.dtx} +[2024/02/11 v1.2c +% LaTeX Kernel (LuaTeX support)^^A +%\iffalse +%<plain> LuaTeX support for plain TeX (core)% +%\fi ] +% \iffalse +%</plain> +%<*tex> \edef\etatcatcode{\the\catcode`\@} \catcode`\@=11 %</tex> @@ -541,9 +547,9 @@ \csname globbox\endcsname % \end{macrocode} % -% Define|\e@alloc| as in latex (the existing macros in |etex.src| +% Define|\e@alloc| as in \LaTeX{} (the existing macros in |etex.src| are % hard to extend to further register types as they assume specific -% 26x and 27x count range. For compatibility the existing register +% 26x and 27x count range). For compatibility the existing register % allocation is not changed. % % \begin{macrocode} diff --git a/macros/latex-dev/base/ltluatex.pdf b/macros/latex-dev/base/ltluatex.pdf Binary files differindex ca793006b1..230cb6527a 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 655e71aa4c..2bbd5ea3a0 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 c5ccd21606..e580cd3319 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 677534dd27..dcfa2fcb27 100644 --- a/macros/latex-dev/base/ltmarks.dtx +++ b/macros/latex-dev/base/ltmarks.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: ltmarks.dtx -%% Copyright (C) 2022-2023 +%% Copyright (C) 2022-2024 %% Frank Mittelbach, The LaTeX Project % % It may be distributed and/or modified under the conditions of the @@ -14,12 +14,14 @@ % %%% From File: ltmarks.dtx % -% \begin{macrocode} -\def\ltmarksversion{v1.0d} -\def\ltmarksdate{2022/06/01} -% \end{macrocode} %<*driver> +% \fi +\ProvidesFile{ltmarks.dtx} + [2024/02/11 v1.0e LaTeX Kernel (Marks)] +% \iffalse +% \documentclass{l3doc} +\GetFileInfo{ltmarks.dtx} %\usepackage{ltmarks} @@ -45,7 +47,7 @@ % % % \title{The \texttt{ltmarks.dtx} code\thanks{This file has version -% \ltmarksversion\ dated \ltmarksdate, \copyright\ \LaTeX\ +% \fileversion\ dated \filedate, \copyright\ \LaTeX\ % Project.}} % \author{^^A % Frank Mittelbach, \LaTeX{} Project\thanks @@ -156,7 +158,7 @@ % \begin{function}{\InsertMark,\mark_insert:nn} % \begin{syntax} % \cs{InsertMark} \Arg{class} \Arg{text} -% \cs{mark_insert:nn} \Arg{class} \Arg{text} +% \cs{mark_insert:nn} \Arg{class} \Arg{text} % \end{syntax} % Adds a mark to the current galley for the \meta{class}, containing the % \meta{text}. @@ -299,6 +301,8 @@ % \emph{true}; if a declared and an undeclared mark class is used % it is always \emph{false}.} % +% \subsection{Use cases for conditionals} +% % However, the basic version is enough for the following typical use cases: % \begin{description} % \item[Test for at most one mark of class \texttt{myclass} on current @@ -353,7 +357,7 @@ % \begin{function}{\DebugMarksOn,\DebugMarksOff, % \mark_debug_on:,\mark_debug_off:} % \begin{syntax} -% \cs{DebugMarksOn} ... \cs{DebugMarksOff} +% \cs{DebugMarksOn} \ldots\ \cs{DebugMarksOff} % \end{syntax} % % Commands to turn the debugging of mark code on or off. The @@ -397,8 +401,8 @@ % % \begin{function}{\markboth, \markright} % \begin{syntax} -% \cs{markboth} \Arg{left} \Arg{right} -% \cs{markright} \Arg{right} +% \cs{markboth} \Arg{left} \Arg{right} +% \cs{markright} \Arg{right} % \end{syntax} % \LaTeXe{} uses two marks which aren't fully independent. A % \enquote{left} mark generated by the first argument of \cs{markboth} @@ -610,9 +614,9 @@ % marks. It too is called as part of \cs{@opcol}. % \end{function} % -% \begin{function}{\@@_update_structure:nn} +% \begin{function}{\@@_update_structure_from_material:nn} % \begin{syntax} -% \cs{@@_update_structure:nn} \Arg{region} \Arg{material with marks} +% \cs{@@_update_structure_from_material:nn} \Arg{region} \Arg{material with marks} % \end{syntax} % Helper function that inspects the marks % inside the second argument and assigns new mark values based on @@ -627,8 +631,8 @@ % \texttt{page} and \texttt{column} because only they have % \texttt{previous-...} counterparts. % -% Another important part to keep in mind is that marks are only -% recognized if they appear on top-level, e.g., if we want to +% Another important aspect to keep in mind is that marks are recognized +% only if they appear on the top level, e.g., if we want to % process material stored in boxes we need to put it unboxed (using % \cs{unvcopy} etc.)\ into the second argument. % \end{function} @@ -642,7 +646,7 @@ % Helper function that copies all mark values in the \meta{source} % region to \meta{alias}, i.e., make the structures identical. Used % to update the \texttt{previous-...} structures inside -% \cs{@@_update_structure:nn} and \texttt{first-column} and +% \cs{@@_update_structure_from_material:nn} and \texttt{first-column} and % \texttt{last-column} structures inside % \cs{@@_update_singlecol_structures:} or % \cs{@@_update_dblcol_structures:}. @@ -650,7 +654,6 @@ % % % -% % \begin{function}{\@@_update_structure_to_err:n} % \begin{syntax} % \cs{@@_update_structure_to_err:n} \Arg{region} @@ -662,6 +665,37 @@ % \end{function} % % +% \begin{function}{\@@_get_marks_for_reinsertion:nNN} +% \begin{syntax} +% \cs{@@_get_marks_for_reinsertion:nNN} \Arg{source} +% \qquad \meta{token-list-var for collecting first marks} +% \qquad \meta{token-list-var for collecting last marks} +% \end{syntax} +% Helper function for extracting marks that would otherwise get +% lost, for example when they are hidden inside a box. This helper +% does not update mark structures and can therefore be used outside +% the output routine as well. +% +% It collect all the top-level marks from inside the \meta{source} +% 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 +% \env{multicols} is returned to the galley for typesetting. +% +% If the \meta{source} consists of a single vertical box (plus +% possibly followed by some glue but nothing else) then the box is +% unpacked and the top-level marks are collected from its +% content. However, if it is not a vertical box or there are are +% other data then nothing is unpacked and you have to do the +% unpacking yourself to get at the marks inside. +% +% It is quite likely that one only needs a single token list for +% returning the \cs{mark_insert:nn} statements. If that is the case +% this command may change to take only two arguments. +% \end{function} +% +% % % ^^A \end{documentation} % @@ -703,12 +737,13 @@ % % % \begin{macro}{\mark_new_class:n,\@@_new_class:nn} +% % A mark class is created by initializing a number of data -% structures. First, we get a register number to refer to the mark class. -% The new mark class is then added to the \cs{g_@@_classes_seq} -% sequence to be able to easily loop over all classes. Finally a -% number of top-level global token lists are declared that hold -% various versions of the mark for access. +% structures. First, we get a register number to refer to the mark +% class. The new mark class is then added to the +% \cs{g_@@_classes_seq} sequence to be able to easily loop over all +% classes. Finally a number of top-level global token lists are +% declared that hold various versions of the mark for access. % \begin{macrocode} \cs_new_protected:Npn \mark_new_class:n #1 { @@ -784,57 +819,74 @@ % \subsection{Updating mark structures} % % -% \begin{macro}{\l_@@_box,\g_@@_tmp_tl,\g_@@_new_top_tl} -% For some operations we need a temporary private box and two +% \begin{macro}{\l_@@_box,\l_@@_ii_box,\g_@@_tmp_tl,\g_@@_new_top_tl} +% For some operations we need two temporary private boxes and two % private global token lists. % \begin{macrocode} \box_new:N \l_@@_box +\box_new:N \l_@@_ii_box \tl_new:N \g_@@_tmp_tl \tl_new:N \g_@@_new_top_tl % \end{macrocode} % \end{macro} % % -% \begin{macro}{\@@_update_structure:nn} -% -% This function updates the mark structures. The first argument is -% the region to update and second argument receives the material -% that holds the marks. Out of this material we extract the first -% and last marks for all classes (if there are any) to do the -% assignments. % +% \begin{macro}{\@@_extract_and_handle_marks:nn} +% \changes{v1.0e}{2024/01/29}{Macro added} +% +% This is the main macro to extract and handle marks inside some +% vertical material. It is used by +% \cs{@@_update_structure_from_material:nn} (for updating the mark +% structure for a region based on the marks found) and by +% \cs{@@_get_marks_for_reinsertion:nNN} (for extracting marks from +% some material and prepare for reinserting them later (e.g., out +% of a box that is placed as a box into the main galley). % \begin{macrocode} -\cs_new_protected:Npn \@@_update_structure:nn #1#2 - { +\cs_new_protected:Npn \@@_extract_and_handle_marks:nn #1#2 { % \end{macrocode} -% First thing we do is copying the current structure to -% \texttt{previous-...}; this leaves the current structure -% untouched so we can update it class by class (which is necessary). +% This macro expects code to handle extracted marks in its first argument and +% vertical material (not boxed or just consisting of a single +% vertical box) as its second. It +% extracts top-level mark information from \verb/#2/, stores them +% as split marks and then calls +% \verb/#1/ to make use of this information. +% +% If it finds a forced break in the material it removes it and then +% restarts the attempt without it. +% +% We start with a group to keep most changes local. % \begin{macrocode} - \@@_update_structure_alias:nn { previous-#1 } {#1} + \group_begin: % \end{macrocode} +% % Getting the first and last marks out of the material in \verb=#2= -% is done by putting the material in a box and then doing a -% split operation to the maximum size possible (which hopefully -% means all of the content).\footnote{We could verify this, maybe we -% should.} Because this is an action only for the sake of getting -% at the mark values we don't want any underfull -% box warnings so we turn those (locally) off. +% is done by putting the material in a box and then doing a split +% operation to the maximum size possible (which hopefully gets us +% all of the content).\footnote{With normal column material cut +% from the main galley we should always get all material in one go, +% but in certain situations, for example, in a \pkg{multicols} +% environment that contains some \cs{columnbreak}s a single split +% operation will not be enough. Thus, this is something we need to +% handle.} Because this action is used only to get the mark +% values, we don't want any underfull box warnings so we (locally) +% turn those off. +% % \begin{macrocode} - \group_begin: \dim_set_eq:NN \tex_splitmaxdepth:D \c_max_dim \int_set_eq:NN \tex_vbadness:D \c_max_int \dim_set_eq:NN \tex_vfuzz:D \c_max_dim % \end{macrocode} -% There is a further complication: if the region contains infinite +% +% There is a further complication: if the material contains infinite % shrinking glue then a \tn{vsplit} operation will balk with a -% low-level error. Now pages or columns, which are our main concern here, can't -% have such infinite shrinkage if they are cut straight from the -% galley, however the use of \tn{enlargethispage} actually does add -% some at the very bottom (and also wraps the whole page into a box -% by itself, so if we leave it this way then a) we get this error -% and b) we don't see any marks because they are hidden one level -% down). +% low-level error. Now pages or columns, which are our main concern +% here, can't have such infinite shrinkage if they are cut straight +% from the galley, however the use of \tn{enlargethispage} actually +% does add some at the very bottom (and also wraps the whole page +% into a box by itself, so if we leave it this way then a) we get +% this error and b) we don't see any marks because they are hidden +% one level down). % % Another possible issue are packages or user code that place stray % \tn{vbox}es directly into the main galley (an example is @@ -842,93 +894,236 @@ % boxes end up as the last item on the page we should not unpack % them. % -% We therefore do an \tn{unskip} to get rid of that glue if present and -% also check if we have then a \tn{vbox} as the last item and if so -% unpack that too, but only under certain conditions, see -% below. All this is temporary, just for getting the -% marks out, so it doesn't affect the final page production. -% -% In fact, we go one step further and set the box to a large -% negative height possible and afterwards take a look at the -% reported badness: if it is zero we know that there has still been -% infinite shrinkage in the box so that we can't do a -% \tn{vsplit}. If that is the case we generate an error message and -% bypass extracting the marks. We use only half of \cs{c_max_dim} -% because otherwise \TeX{} will report an overfull vbox despite our -% setting of \cs{tex_vfuzz:D}. This test will not find existing -% infinite shrinkage in all cases, e.g., if there are several glues -% that cancel each other, but it is the best we can do. -% \begin{macrocode} - \vbox_set_to_ht:Nnn \l_@@_box { -.5\c_max_dim } - { - #2 - \tex_unskip:D - \box_set_to_last:N \l_@@_box +% All these issues need to be handled, which is done in +% \cs{@@_prepare_and_extract:nn}. +% +% \begin{macrocode} + \@@_prepare_and_extract:nn {#1} {#2} +% \end{macrocode} +% Once all mark classes have been processed, the data structures are +% updated and we can close the group, which undoes our local +% changes and retains only the global ones. +% \begin{macrocode} + \group_end: + } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@_prepare_and_extract:nn} +% +% This macro does the dirty work. It is not directly integrated in +% \cs{@@_extract_and_handle_marks:nn} because we may have to call +% it recursively if we find forced breaks. +% \begin{macrocode} +\cs_new_protected:Npn \@@_prepare_and_extract:nn #1#2 { +% \end{macrocode} +% +% To handle the \cs{enlargethispage} case we do an \tn{unskip} to +% get rid of any glue that is present at the very end of the material +% and also check if we have then a \tn{vbox} as the last item and +% if so unpack that too, but only under certain conditions, see +% below. All this is temporary done in a group, just for getting +% the marks out, so it doesn't affect the final page production. +% +% \begin{macrocode} + \vbox_set:Nn \l_@@_box + { + #2 + \tex_unskip:D + \box_set_to_last:N \l_@@_box % \end{macrocode} % After having removed the last box from the current list (if there -% was one) -% we check if the list is now empty. If not, the the last box is -% definitely not the one from \tn{enlargethispage} and so we can -% and should leave it alone. Otherwise we check if this last box is -% a \tn{vbox}. +% was one) we check whether the vertical list is now empty. If not, +% then the last box is definitely not the one from +% \tn{enlargethispage} and so we can, and should, leave it +% alone. Otherwise we check if this last box is a \tn{vbox}. % \changes{v1.0d}{2022/06/01}{Extend the logic for detecting the marks % in the box (gh/836)} % \begin{macrocode} - \int_compare:nNnT \tex_lastnodetype:D < 0 - { - \box_if_vertical:NT \l_@@_box - { -% \end{macrocode} -% If it is we do a further test and reset the \cs{l_@@_box} -% to check if it contains infinitely shrinkable glue. -% \begin{macrocode} - \vbox_set_to_ht:Nnn \l_@@_box { -.5\c_max_dim } - { - \vbox_unpack:N \l_@@_box - \tex_kern:D \c_zero_dim % ensure that box - % is not empty - } + \int_compare:nNnT \tex_lastnodetype:D < 0 + { + \box_if_vertical:NT \l_@@_box % \end{macrocode} -% If not, then we unpack it, if yes we still ignore it for the process of -% mark extraction. We do not generate an error though, because in all -% likelihood this is an ordinary box like a marginal that does -% contain something like \tn{vss}. +% If it is, we unpack the box. % \begin{macrocode} - \int_compare:nNnT \tex_badness:D > 0 - { \vbox_unpack:N \l_@@_box } - } - } + { \vbox_unpack:N \l_@@_box } + } % \end{macrocode} % If it wasn't a vbox, it was either an hbox or there was no box. % Given that we are only interested in the marks we don't need put -% it back in that case. However, we have to make sure that the -% outer box under construction -% is not totally empty (which it might have been from the start, or -% now), because \TeX{} does not report a badness for empty boxes -% and that means our test would incorrectly conclude that we have -% infinite shrinking glue. A simple \tn{kern} is enough to avoid -% this (the same was already done above). -% \begin{macrocode} - \tex_kern:D \c_zero_dim - } - \int_compare:nNnTF \tex_badness:D > 0 +% it back in that case. +% \begin{macrocode} + } % \end{macrocode} -% If the box had no infinite shrinkage (or rather if our test -% didn't show any) we vsplit it. Note that it -% doesn't matter that we set it to this strange size first. If there -% was infinite shrinkage after all, we end up with a low-level -% \TeX{} error, but if there is, it is a coding error and needs -% correcting. +% We are now ready to \cs{vsplit} the box to get at the marks. If +% the box contains some infinite negative glue the \TeX{} will +% produce an error complaining about it but it will correctly find +% the the split marks. Given that we can't prevent that error, we +% hide it from the user and ensure that \TeX{} doesn't stop. The +% error message still shows in the log, but even that is mitigated +% as best as possible---see the definition of +% \cs{@@_vbox_set_split_to_maxdimen:NN} for the tricks employed. % \begin{macrocode} - { - \vbox_set_split_to_ht:NNn \l_@@_box \l_@@_box \c_max_dim + \@@_vbox_set_split_to_maxdimen:NN \l_@@_ii_box \l_@@_box +% \end{macrocode} +% After splitting we check if there is anything left in +% \cs{l_@@_box}. If not then the above split has set some split marks +% that we can then use to finish the extraction: +% \begin{macrocode} + \box_if_empty:NTF \l_@@_box + { #1 } +% \end{macrocode} +% If we have a remainder after the split then this means that there +% was some forced break in the material. We get rid of that by +% combining the content of the two boxes and restart. +% \begin{macrocode} + { +%<*trace> + \@@_debug:n { \iow_term:x + { Marks:~ mark~ extraction~needs~ recursion~ + \msg_line_context: } } +%</trace> + \@@_prepare_and_extract:nn {#1} + { \vbox_unpack:N \l_@@_ii_box + \vbox_unpack:N \l_@@_box } + } +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@_vbox_set_split_to_maxdimen:NN} +% +% Split a box to get at its marks without pausing even if \TeX{} is +% producing an error message because of infinite negative glue in +% the box. If there is such an error we ensure that it only shows +% up in the log but not on the terminal. +% +% The nice low-level hack by DPC records in the \texttt{.log} that a glue +% shrinkage error is harmless. +% +% We disguise \cs{c_max_dim} in an odd looking csname, which then +% shows up as part of the display of an error message if that error +% happens. This csname forms part of the error diplay so what +% you get is something like +%\begin{verbatim} +% ! Infinite glue shrinkage found in box being split. +% <argument> Infinite shrink error above ignored ! +% l. ... } +%\end{verbatim} +% which hopefully makes it clear that the error is harmless and +% and should be ignored by the reader of the \texttt{.log}. +% \begin{macrocode} +\cs_set_eq:cN {Infinite~shrink~error~above~ignored~!}\c_max_dim +% \end{macrocode} +% +% The whole definition of \cs{@@_vbox_set_split_to_maxdimen:NN} +% below is fully expanded, so we have to use a lot of +% \cs{exp_not:N} commands to prevent expansion where necessary. +% \begin{macrocode} +\cs_new_protected:Npx \@@_vbox_set_split_to_maxdimen:NN #1#2 { +% \end{macrocode} +% We start by saving the current interaction and escape char settings. +% \begin{macrocode} + \tl_set:Ne \exp_not:N \l_@@_saved_parameters_tl + { + \tex_interactionmode:D + \exp_not:N \int_use:N \tex_interactionmode:D \scan_stop: + \tex_escapechar:D + \exp_not:N \int_use:N \tex_escapechar:D \scan_stop: + } +% \end{macrocode} +% Then we change them so that no escape char is printed in the +% error message (accounts for the missing backslash in front of +% \verb/Infinite shrink .../) and we set the interaction to +% \cs{nonstopmode} so that the the error (if any) just goes into +% the \texttt{.log} file and \TeX{} doesn't stop at that point. +% \begin{macrocode} + \tex_escapechar:D -1 \scan_stop: + \tex_interactionmode:D 0 \scan_stop: +% \end{macrocode} +% Then we do the splitting of the box to \cs{c_max_dim} to get at +% the marks. This may generate the error we are worried about, +% i.e., if the box contains infinite negative glue. However, \TeX{} +% makes this glue finite and continues, which means we get our split +% marks which is really all we care about. +% \begin{macrocode} + \tex_setbox:D #1 \tex_vsplit:D #2 to +% \end{macrocode} +% The \cs{use:n} may seem pointless, and it is to some extent, but +% we need it to get our disguised \cs{c_max_dim} displayed +% properly as part of the error message if there is one. Without +% it, the display would show only part of what we want it to show +% (try it). +% \begin{macrocode} + \exp_not:N \use:n { + \use:c{Infinite~shrink~error~above~ignored~!} + } +% \end{macrocode} +% Finally, we change the escape char and the interaction mode back +% to what it was before: +% \begin{macrocode} + \exp_not:N \l_@@_saved_parameters_tl +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\l_@@_saved_parameters_tl} +% The temporary variable used for resetting escape char and +% interaction mode. +% \begin{macrocode} +\tl_new:N \l_@@_saved_parameters_tl +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_update_structure_from_material:nn} +% +% \changes{v1.0e}{2024/01/29}{Macro renamed} +% +% This function updates the mark structures of a region. The first +% argument is the region to update and second argument receives the +% material that holds the marks. Out of this material we extract +% the first and last marks for all classes (if there are any) to do +% the assignments. +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_update_structure_from_material:nn #1#2 { + \@@_extract_and_handle_marks:nn +% \end{macrocode} +% +% Once the marks can be extracted we update the structure from the +% split marks (code in \cs{@@_update_structure_from_splitmarks:n}). +% \begin{macrocode} + { \@@_update_structure_from_splitmarks:n {#1} } + { #2 } +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@@_update_structure_from_splitmarks:n} +% This macro is called after we have done a \cs{tex_vsplit:D} +% operation and the mark data is in the split marks. +% \begin{macrocode} +\cs_new_protected:Npn \@@_update_structure_from_splitmarks:n #1 { +% \end{macrocode} +% +% The first thing we do is to copy the current region structure to +% \texttt{previous-...}; this leaves the current structure +% untouched so we can update it class by class (which is necessary). +% \begin{macrocode} + \@@_update_structure_alias:nn { previous-#1 } {#1} % \end{macrocode} % After this action we can get first and last marks of the various % classes through \cs{tex_splitfirstmarks:D} and % \cs{tex_splitbotmarks:D}. So now we loop over all classes stored in % \cs{g_@@_classes_seq}. % \begin{macrocode} - \seq_map_inline:Nn \g_@@_classes_seq + \seq_map_inline:Nn \g_@@_classes_seq { % \end{macrocode} % First action: get the last mark from the previous region, i.e., @@ -950,14 +1145,14 @@ \tl_gset:No \g_@@_tmp_tl { \tex_splitbotmarks:D \use:c { c_@@_class_##1_mark } } % \end{macrocode} -% If this mark doesn't exist then obviously first mark does -% neither, so both become the last mark from the previous region. We +% If this mark doesn't exist then obviously neither does the first mark, +% so both become the last mark from the previous region. We % have to be a little careful here: something like % \verb=\mark_insert:nn{foo}{}= adds an \enquote{empty} mark that should % not be confused with no mark at all. But no mark in our material % will result in \cs{g_@@_tmp_tl} being fully empty. This is why we % have to make sure that \enquote{empty} from \cs{mark_insert:nn} only -% appears to be empty but fails the next test (see below how this +% appears to be empty when typeset but fails the next test (see below how this % is done). % \begin{macrocode} \tl_if_empty:NTF \g_@@_tmp_tl @@ -987,29 +1182,144 @@ } } } - } +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@@_get_marks_for_reinsertion:nNN} +% +% This function extracts the marks from the material in the first +% argument but it does not update any the mark structures. Instead, +% it collects the marks in the token lists given as the second and +% third argument, in such a way that they can be reinserted by just +% executing the token lists.\footnote{It is probably enough to +% collect everything in a single token list as long as we put the +% first marks first and the last marks last). But for extra +% flexibility, I currently use 2 token lists. This might change when it is +% really clear that this is never needed.} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_get_marks_for_reinsertion:nNN #1#2#3 { % \end{macrocode} -% If the badness was zero (we actually tested for${}>0$ but it -% can't get negative) then we had infinite shrinkage, so we report -% that and set all marks to the value the last mark had before. +% First we clear the temporary token lists as we haven't seen any marks yet. % \begin{macrocode} - { - \msg_error:nnn { mark } { infinite-shrinkage } {#1} - \seq_map_inline:Nn \g_@@_classes_seq + \tl_clear:N \g_@@_first_marks_tl + \tl_clear:N \g_@@_last_marks_tl +% \end{macrocode} +% Then we extract all top-level marks, thereby filling the token lists +% with suitable \cs{mark_insert:nn} calls. +% \begin{macrocode} + \@@_extract_and_handle_marks:nn +% \end{macrocode} +% The first argument holds the code for fill the token lists and +% the second is the material we extract from. +% \begin{macrocode} + \@@_get_from_splitmarks: + { #1 } +% \end{macrocode} +% +% Finally, we copy the updated (or not updated) temporary token +% lists to the two that have been supplied when the function was +% called. By convention \enquote{get} operations return their +% values in local variables and \cs{@@_extract_and_handle_marks:nn} +% runs in a group, which is why we have to use global temporary +% variables for collecting. +% \begin{macrocode} + \tl_set_eq:NN #2 \g_@@_first_marks_tl + \tl_set_eq:NN #3 \g_@@_last_marks_tl +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@_get_from_splitmarks:} +% This function is called after we have done a \cs{vsplit} to +% update the split marks. It loops through all mark classes to find +% out if there are marks for this class and if so updates the +% global tls used for collecting. +% \begin{macrocode} +\cs_new_protected:Npn \@@_get_from_splitmarks: { + \seq_map_inline:Nn \g_@@_classes_seq { - \tl_gset_eq:cc { g_@@_#1_top_ ##1_tl } - { g_@@_#1_last_ ##1_tl } - \tl_gset_eq:cc { g_@@_#1_first_##1_tl } - { g_@@_#1_last_ ##1_tl } +% \end{macrocode} +% First we to get the last mark for the current class from the +% material supplied. +% \begin{macrocode} + \tl_gset:No \g_@@_tmp_tl + { \tex_splitbotmarks:D \use:c { c_@@_class_##1_mark } } +% \end{macrocode} +% +% If this mark doesn't exist then obviously first mark doesn't +% either, so we do nothing (other than issuing some debugging +% info). + +% We have to be a little careful here: something like +% \verb=\mark_insert:nn{foo}{}= adds an \enquote{empty} mark that +% we should not confuse with the case where there is no mark at +% all. +% +% When there is no mark at all we get a truly empty +% \cs{g_@@_tmp_tl} as a result. This is why we have to make sure +% that an \enquote{empty} mark generated with \cs{mark_insert:nn} +% only appears to be empty when it is typeset, but fails the next +% test (see below how this is done). +% \begin{macrocode} + \tl_if_empty:NTF \g_@@_tmp_tl + { +%<*trace> + \@@_debug:n { \iow_term:x { Marks:~no~ marks~ + for~ class~ '##1'~\msg_line_context: } } +%</trace> + } +% \end{macrocode} +% +% If it wasn't empty, i.e., if it had a real value then we use this +% value for our new last mark instead. This means we put an +% appropriate \cs{mark_insert:nn} statement into +% \cs{g_@@_last_marks_tl}. +% \begin{macrocode} + { +%<*trace> + \@@_debug:n { \iow_term:x { Marks:~ extract~ last~ + mark~ for~ class~ '##1'~ =~ \g_@@_tmp_tl } } +%</trace> + \tl_gput_right:Ne \g_@@_last_marks_tl + { \mark_insert:nn {##1} { \g_@@_tmp_tl } } +% \end{macrocode} +% Because we had a last mark we also have a first mark (which might +% be the same, but might not be), so we pick that up and add it to +% the \cs{g_@@_first_marks_tl} token list. This explains why we +% first checked for the last mark because that makes the processing +% faster in case there is none. +% \begin{macrocode} +%<*trace> + \@@_debug:n { \iow_term:x { Marks:~ extract~ first~ + mark~ for~ class~ '##1'~ =~ + \tex_splitfirstmarks:D + \use:c { c_@@_class_##1_mark } + } } +%</trace> + \tl_gput_right:Ne \g_@@_first_marks_tl + { \mark_insert:nn {##1} + { + \tex_splitfirstmarks:D + \use:c { c_@@_class_##1_mark } + } + } + } } - } +} % \end{macrocode} -% Once all mark classes have been processed the data structures are -% updated and we can close the group which undoes our local -% changes and retains only the global ones. +% \end{macro} +% +% +% \begin{macro}{\g_@@_first_marks_tl,\g_@@_last_marks_tl} +% These are two global temporary variables used in the code above. % \begin{macrocode} - \group_end: - } +\tl_new:N \g_@@_first_marks_tl +\tl_new:N \g_@@_last_marks_tl % \end{macrocode} % \end{macro} % @@ -1158,7 +1468,7 @@ % To retrieve the first, last or top region mark, we grab the % appropriate value stored in the corresponding token list variable % and pass its contents back. These functions should be used only -% in output routines after \cs{@@_update_structure:nn} has acted, +% in output routines and only after \cs{@@_update_structure_from_material:nn} has acted, % otherwise their value will be wrong. % % If used with an unknown class or region they generate an error @@ -1207,7 +1517,7 @@ % % \subsection{Messages} % -% Mark errors are LaTeX kernel errors: +% Mark errors are \LaTeX{} kernel errors: % \changes{v1.0d}{2022/06/01}{Marks are kernel errors} % \begin{macrocode} \prop_gput:Nnn \g_msg_module_type_prop { mark } { LaTeX } @@ -1247,17 +1557,7 @@ } % \end{macrocode} % -% \begin{macrocode} -\msg_new:nnnn { mark } { infinite-shrinkage } - { Infinite~shrinkage~found~in~'#1'. } - { - \c__msg_coding_error_text_tl - The~mark~region~'#1'~contains~some~infinite~negative~glue~ - allowing~it~to~shrink~to~an~arbitrary~size.~ - This~makes~it~impossible~to~split~the~region~apart~to~ - get~at~its~marks.~They~are~lost. - } -% \end{macrocode} +% % % % @@ -1358,7 +1658,7 @@ % % % \begin{macro}{\@@_status:n} -% Show all mark class values across all regions. +% Show a snapshot of all mark class values across all regions. % \begin{macrocode} \cs_new_protected:Npn \@@_status:n #1 { @@ -1370,6 +1670,22 @@ % \end{macro} % % +% \begin{macro}{\ShowMarksAt} +% \changes{v1.0e}{2024/01/29}{Macro added} +% Debugging helper that displays a snapshot of all known mark +% structures. The argument is a text string that is +% displayed to help identifying when the snapshot was made. +% +% This may not stay like this (or at all), which is why it isn't +% yet documented as an official command. +% \begin{macrocode} +\cs_new_protected:Npn \ShowMarksAt #1 { +%<*trace> + \@@_debug:n { \@@_status:n {#1} } +%</trace> +} +% \end{macrocode} +% \end{macro} % % % \subsection{Designer-level interfaces} @@ -1425,9 +1741,9 @@ % % % -% \section{\LaTeXe{} integration} +% \section{\LaTeXe{} integration} % -% \subsection{Core \LaTeXe{} integration} +% \subsection{Core \LaTeXe{} integration} % % \begin{macro}{\@@_update_singlecol_structures:} % This command updates the mark structures if we are producing a @@ -1445,11 +1761,11 @@ % \begin{macrocode} \box_if_vertical:NTF \@outputbox { - \@@_update_structure:nn {page} + \@@_update_structure_from_material:nn {page} { \vbox_unpack:N \@outputbox } } { - \@@_update_structure:nn {page} + \@@_update_structure_from_material:nn {page} { \hbox_unpack:N \@outputbox } } % \end{macrocode} @@ -1489,11 +1805,11 @@ % \begin{macrocode} \box_if_vertical:NTF \@outputbox { - \@@_update_structure:nn {column} + \@@_update_structure_from_material:nn {column} { \vbox_unpack:N \@outputbox } } { - \@@_update_structure:nn {column} + \@@_update_structure_from_material:nn {column} { \hbox_unpack:N \@outputbox } } % \end{macrocode} @@ -1583,17 +1899,26 @@ %<@@=> % \end{macrocode} % -% \begin{macro}[int]{\@expl@@@mark@update@singlecol@structures@@, -% \@expl@@@mark@update@dblcol@structures@@} +% \begin{macro}[int]{\@expl@@@mark@update@singlecol@structures@@} % \begin{macrocode} \cs_new_eq:NN \@expl@@@mark@update@singlecol@structures@@ \__mark_update_singlecol_structures: +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}[int]{\@expl@@@mark@update@dblcol@structures@@} +% \begin{macrocode} \cs_new_eq:NN \@expl@@@mark@update@dblcol@structures@@ \__mark_update_dblcol_structures: % \end{macrocode} % \end{macro} % -% \subsection{Other \LaTeXe{} output routines} +% +% +% +% \subsection{Other \LaTeXe{} output routines} % % This section will cover \pkg{multicol} and other packages altering % or providing their own output routine. Not done yet. @@ -1601,6 +1926,9 @@ % % % +% \subsection{Rollback information} +% +% % \begin{macrocode} %<latexrelease>\IncludeInRelease{0000/00/00}{ltmarks}% %<latexrelease> {Undo~Marks~handling} @@ -1609,7 +1937,7 @@ % We keep the interface commands around even if we roll back in % case they are used in packages that don't roll back. Not likely % to do a lot of good, but then there is not much we can do, but -% this at least then doesn't give errors. +% this at least they won't give unknown csname errors. % \begin{macrocode} %<latexrelease>\DeclareRobustCommand \NewMarkClass[1]{} %<latexrelease>\DeclareRobustCommand \InsertMark[2]{} diff --git a/macros/latex-dev/base/ltmath.dtx b/macros/latex-dev/base/ltmath.dtx index 3b1518dd2e..b40faa8a80 100644 --- a/macros/latex-dev/base/ltmath.dtx +++ b/macros/latex-dev/base/ltmath.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltmeta.dtx b/macros/latex-dev/base/ltmeta.dtx index daaa71626b..1e4bdaed2c 100644 --- a/macros/latex-dev/base/ltmeta.dtx +++ b/macros/latex-dev/base/ltmeta.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: ltmeta.dtx -%% Copyright (C) 2021-2023 +%% Copyright (C) 2021-2024 %% Frank Mittelbach, The LaTeX Project % % It may be distributed and/or modified under the conditions of the @@ -13,13 +13,14 @@ % % %%% From File: ltmeta.dtx -% -% \begin{macrocode} -\def\ltmetaversion{v1.0b} -\def\ltmetadate{2022/05/18} -% \end{macrocode} %<*driver> +% \fi +\ProvidesFile{ltmeta.dtx} + [2024/02/11 v1.0b LaTeX Kernel (Document Metadata)] +% \iffalse +% \documentclass{l3doc} +\GetFileInfo{ltmeta.dtx} % Fixing footnotes in functions and variables: this should be in l3doc! @@ -43,7 +44,7 @@ % % % \title{The \texttt{ltmeta.dtx} code\thanks{This file has version -% \ltmetaversion\ dated \ltmetadate, \copyright\ \LaTeX\ +% \fileversion\ dated \filedate, \copyright\ \LaTeX\ % Project.}} % \author{Frank Mittelbach} % diff --git a/macros/latex-dev/base/ltmiscen.dtx b/macros/latex-dev/base/ltmiscen.dtx index 74a9685f1f..accdac24b2 100644 --- a/macros/latex-dev/base/ltmiscen.dtx +++ b/macros/latex-dev/base/ltmiscen.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -32,7 +32,7 @@ %<*driver> % \fi \ProvidesFile{ltmiscen.dtx} - [2023/09/13 v1.2c LaTeX Kernel (Misc. Environments)] + [2024/02/08 v1.2c LaTeX Kernel (Misc. Environments)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltmiscen.dtx} @@ -509,8 +509,8 @@ % endings are converted to spaces by \TeX{} during that process. % % However, especially the \texttt{.toc} file might be read in L-R mode -% (in cases the \cs{tableofcontents} attempts to put, say a list of -% sub-sections as a paragraph. In that case the newlines after a line +% (in cases the \cs{tableofcontents} attempts to put, say, a list of +% sub-sections as a paragraph). In that case the newlines after a line % like % \begin{verbatim} % \contentsline {subsubsection}{\numberline {1.1.1}A C-head}{2} @@ -520,9 +520,9 @@ % % That could be fixed by reading in the file using % \cs{endlinechar}\texttt{=-1} but that has the danger that it drops -% some valid endlines that should be converted to spaces (for example +% some valid endlines that should be converted to spaces (for example, % when the user edited the TOC and then used \cs{nofiles} to preserve -% it. +% it). % % So the approach taken instead is this: % \begin{itemize} @@ -1604,7 +1604,7 @@ % ``\verb=!~!foo='' in the output. % To avoid this scenario we check if \verb=#1= has the character % code of a space, if so we recurse otherwise we call \cs{@@sverb} -% (which is the original definition of \cs{@sverb}. +% (which is the original definition of \cs{@sverb}). % \changes{v1.1u}{2020/04/22}{Drop spaces before \cs{verb} delimiter (gh/327)} % \begin{macrocode} \def\@sverb#1{\if\noexpand#1 \expandafter\@sverb\else\@@sverb{#1}\fi} diff --git a/macros/latex-dev/base/ltnews.cls b/macros/latex-dev/base/ltnews.cls index 45ee3664d1..fa86ce17b7 100644 --- a/macros/latex-dev/base/ltnews.cls +++ b/macros/latex-dev/base/ltnews.cls @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews.pdf b/macros/latex-dev/base/ltnews.pdf Binary files differindex b6fc97ce53..d35b824b96 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 0cb6ad55cc..d4a6d274ae 100644 --- a/macros/latex-dev/base/ltnews.tex +++ b/macros/latex-dev/base/ltnews.tex @@ -1,7 +1,7 @@ % \iffalse meta-comment % % Copyright (C) 2006, 2009, 2011, 2014 Heiko Oberdiek -% Copyright (C) 2014-2023 +% Copyright (C) 2014-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -40,7 +40,7 @@ \ProvidesFile{ltnews.tex}% [2022/06/10 v1.4e Master file for ltnews*.tex (LaTeX Project)] -\providecommand*{\lastissue}{38} +\providecommand*{\lastissue}{39} \InputIfFileExists{ltnews-lastissue.cfg}{}{} diff --git a/macros/latex-dev/base/ltnews01.pdf b/macros/latex-dev/base/ltnews01.pdf Binary files differindex a7eb8b72ac..119150dcf2 100644 --- a/macros/latex-dev/base/ltnews01.pdf +++ b/macros/latex-dev/base/ltnews01.pdf diff --git a/macros/latex-dev/base/ltnews01.tex b/macros/latex-dev/base/ltnews01.tex index 55c6b20dd6..5c46b0450e 100644 --- a/macros/latex-dev/base/ltnews01.tex +++ b/macros/latex-dev/base/ltnews01.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews02.pdf b/macros/latex-dev/base/ltnews02.pdf Binary files differindex 1560d5cfae..c549274162 100644 --- a/macros/latex-dev/base/ltnews02.pdf +++ b/macros/latex-dev/base/ltnews02.pdf diff --git a/macros/latex-dev/base/ltnews02.tex b/macros/latex-dev/base/ltnews02.tex index 58856fe97b..d91af6f8b1 100644 --- a/macros/latex-dev/base/ltnews02.tex +++ b/macros/latex-dev/base/ltnews02.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews03.pdf b/macros/latex-dev/base/ltnews03.pdf Binary files differindex a33ab0d699..525e896caa 100644 --- a/macros/latex-dev/base/ltnews03.pdf +++ b/macros/latex-dev/base/ltnews03.pdf diff --git a/macros/latex-dev/base/ltnews03.tex b/macros/latex-dev/base/ltnews03.tex index 96a5bec428..22533b9fae 100644 --- a/macros/latex-dev/base/ltnews03.tex +++ b/macros/latex-dev/base/ltnews03.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews04.pdf b/macros/latex-dev/base/ltnews04.pdf Binary files differindex 0fe86c8d1c..759e78dec7 100644 --- a/macros/latex-dev/base/ltnews04.pdf +++ b/macros/latex-dev/base/ltnews04.pdf diff --git a/macros/latex-dev/base/ltnews04.tex b/macros/latex-dev/base/ltnews04.tex index ab49d7ade3..c1b474bca6 100644 --- a/macros/latex-dev/base/ltnews04.tex +++ b/macros/latex-dev/base/ltnews04.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews05.pdf b/macros/latex-dev/base/ltnews05.pdf Binary files differindex 16be61db08..63b9af2498 100644 --- a/macros/latex-dev/base/ltnews05.pdf +++ b/macros/latex-dev/base/ltnews05.pdf diff --git a/macros/latex-dev/base/ltnews05.tex b/macros/latex-dev/base/ltnews05.tex index cdfe8bc072..3254b428e3 100644 --- a/macros/latex-dev/base/ltnews05.tex +++ b/macros/latex-dev/base/ltnews05.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews06.pdf b/macros/latex-dev/base/ltnews06.pdf Binary files differindex 62f27b9c09..c3a5d736c7 100644 --- a/macros/latex-dev/base/ltnews06.pdf +++ b/macros/latex-dev/base/ltnews06.pdf diff --git a/macros/latex-dev/base/ltnews06.tex b/macros/latex-dev/base/ltnews06.tex index 3d5cadb745..9830e55055 100644 --- a/macros/latex-dev/base/ltnews06.tex +++ b/macros/latex-dev/base/ltnews06.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews07.pdf b/macros/latex-dev/base/ltnews07.pdf Binary files differindex 41696cd5b2..5906a1d278 100644 --- a/macros/latex-dev/base/ltnews07.pdf +++ b/macros/latex-dev/base/ltnews07.pdf diff --git a/macros/latex-dev/base/ltnews07.tex b/macros/latex-dev/base/ltnews07.tex index 43cf204fed..75bbaba715 100644 --- a/macros/latex-dev/base/ltnews07.tex +++ b/macros/latex-dev/base/ltnews07.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews08.pdf b/macros/latex-dev/base/ltnews08.pdf Binary files differindex d3824fd033..093798a6eb 100644 --- a/macros/latex-dev/base/ltnews08.pdf +++ b/macros/latex-dev/base/ltnews08.pdf diff --git a/macros/latex-dev/base/ltnews08.tex b/macros/latex-dev/base/ltnews08.tex index f1386a5332..540e14c33f 100644 --- a/macros/latex-dev/base/ltnews08.tex +++ b/macros/latex-dev/base/ltnews08.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews09.pdf b/macros/latex-dev/base/ltnews09.pdf Binary files differindex ee50c517ad..18344161cc 100644 --- a/macros/latex-dev/base/ltnews09.pdf +++ b/macros/latex-dev/base/ltnews09.pdf diff --git a/macros/latex-dev/base/ltnews09.tex b/macros/latex-dev/base/ltnews09.tex index 26eccedd1e..6b932f8f3e 100644 --- a/macros/latex-dev/base/ltnews09.tex +++ b/macros/latex-dev/base/ltnews09.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews10.pdf b/macros/latex-dev/base/ltnews10.pdf Binary files differindex 8aa002886a..d993b06982 100644 --- a/macros/latex-dev/base/ltnews10.pdf +++ b/macros/latex-dev/base/ltnews10.pdf diff --git a/macros/latex-dev/base/ltnews10.tex b/macros/latex-dev/base/ltnews10.tex index b011eacf7e..e4925794d5 100644 --- a/macros/latex-dev/base/ltnews10.tex +++ b/macros/latex-dev/base/ltnews10.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews11.pdf b/macros/latex-dev/base/ltnews11.pdf Binary files differindex 799f3e69a8..4bd344ad0c 100644 --- a/macros/latex-dev/base/ltnews11.pdf +++ b/macros/latex-dev/base/ltnews11.pdf diff --git a/macros/latex-dev/base/ltnews11.tex b/macros/latex-dev/base/ltnews11.tex index 07dbd64240..70810e7b09 100644 --- a/macros/latex-dev/base/ltnews11.tex +++ b/macros/latex-dev/base/ltnews11.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews12.pdf b/macros/latex-dev/base/ltnews12.pdf Binary files differindex 3017fe26b4..8b19a4a371 100644 --- a/macros/latex-dev/base/ltnews12.pdf +++ b/macros/latex-dev/base/ltnews12.pdf diff --git a/macros/latex-dev/base/ltnews12.tex b/macros/latex-dev/base/ltnews12.tex index 38ea9122a0..92d484333c 100644 --- a/macros/latex-dev/base/ltnews12.tex +++ b/macros/latex-dev/base/ltnews12.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews13.pdf b/macros/latex-dev/base/ltnews13.pdf Binary files differindex a471304672..15fd4203d8 100644 --- a/macros/latex-dev/base/ltnews13.pdf +++ b/macros/latex-dev/base/ltnews13.pdf diff --git a/macros/latex-dev/base/ltnews13.tex b/macros/latex-dev/base/ltnews13.tex index e489b4ff27..278bec28b0 100644 --- a/macros/latex-dev/base/ltnews13.tex +++ b/macros/latex-dev/base/ltnews13.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews14.pdf b/macros/latex-dev/base/ltnews14.pdf Binary files differindex 58c7faeed3..8d615e493d 100644 --- a/macros/latex-dev/base/ltnews14.pdf +++ b/macros/latex-dev/base/ltnews14.pdf diff --git a/macros/latex-dev/base/ltnews14.tex b/macros/latex-dev/base/ltnews14.tex index 44cc44647e..2d767890e0 100644 --- a/macros/latex-dev/base/ltnews14.tex +++ b/macros/latex-dev/base/ltnews14.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews15.pdf b/macros/latex-dev/base/ltnews15.pdf Binary files differindex a4ccdfcf6a..7c3c35bdc7 100644 --- a/macros/latex-dev/base/ltnews15.pdf +++ b/macros/latex-dev/base/ltnews15.pdf diff --git a/macros/latex-dev/base/ltnews15.tex b/macros/latex-dev/base/ltnews15.tex index b95801dd6e..9e281e8e0e 100644 --- a/macros/latex-dev/base/ltnews15.tex +++ b/macros/latex-dev/base/ltnews15.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews16.pdf b/macros/latex-dev/base/ltnews16.pdf Binary files differindex 6fbbe159aa..01c228be83 100644 --- a/macros/latex-dev/base/ltnews16.pdf +++ b/macros/latex-dev/base/ltnews16.pdf diff --git a/macros/latex-dev/base/ltnews16.tex b/macros/latex-dev/base/ltnews16.tex index 7edf8a7f53..8606cffe99 100644 --- a/macros/latex-dev/base/ltnews16.tex +++ b/macros/latex-dev/base/ltnews16.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews17.pdf b/macros/latex-dev/base/ltnews17.pdf Binary files differindex fe38f79c39..3dcf8679dc 100644 --- a/macros/latex-dev/base/ltnews17.pdf +++ b/macros/latex-dev/base/ltnews17.pdf diff --git a/macros/latex-dev/base/ltnews17.tex b/macros/latex-dev/base/ltnews17.tex index e18e4660eb..8af30edac8 100644 --- a/macros/latex-dev/base/ltnews17.tex +++ b/macros/latex-dev/base/ltnews17.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews18.pdf b/macros/latex-dev/base/ltnews18.pdf Binary files differindex 404206d928..f2533985c9 100644 --- a/macros/latex-dev/base/ltnews18.pdf +++ b/macros/latex-dev/base/ltnews18.pdf diff --git a/macros/latex-dev/base/ltnews18.tex b/macros/latex-dev/base/ltnews18.tex index 8c70621534..5bca87ddd1 100644 --- a/macros/latex-dev/base/ltnews18.tex +++ b/macros/latex-dev/base/ltnews18.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews19.pdf b/macros/latex-dev/base/ltnews19.pdf Binary files differindex 3f107c4567..0d73b8b4dd 100644 --- a/macros/latex-dev/base/ltnews19.pdf +++ b/macros/latex-dev/base/ltnews19.pdf diff --git a/macros/latex-dev/base/ltnews19.tex b/macros/latex-dev/base/ltnews19.tex index 7e9492a8f2..5a18300cc2 100644 --- a/macros/latex-dev/base/ltnews19.tex +++ b/macros/latex-dev/base/ltnews19.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews20.pdf b/macros/latex-dev/base/ltnews20.pdf Binary files differindex 8eeacf2590..dd9fe8fb37 100644 --- a/macros/latex-dev/base/ltnews20.pdf +++ b/macros/latex-dev/base/ltnews20.pdf diff --git a/macros/latex-dev/base/ltnews20.tex b/macros/latex-dev/base/ltnews20.tex index b233f92dc4..6d31e1f56c 100644 --- a/macros/latex-dev/base/ltnews20.tex +++ b/macros/latex-dev/base/ltnews20.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews21.pdf b/macros/latex-dev/base/ltnews21.pdf Binary files differindex 0b70907056..4e58f50dd4 100644 --- a/macros/latex-dev/base/ltnews21.pdf +++ b/macros/latex-dev/base/ltnews21.pdf diff --git a/macros/latex-dev/base/ltnews21.tex b/macros/latex-dev/base/ltnews21.tex index a48cd0b199..16319e56d7 100644 --- a/macros/latex-dev/base/ltnews21.tex +++ b/macros/latex-dev/base/ltnews21.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews22.pdf b/macros/latex-dev/base/ltnews22.pdf Binary files differindex 60862afc61..013d7190fa 100644 --- a/macros/latex-dev/base/ltnews22.pdf +++ b/macros/latex-dev/base/ltnews22.pdf diff --git a/macros/latex-dev/base/ltnews22.tex b/macros/latex-dev/base/ltnews22.tex index dfc2e2326a..4a5f70bdb6 100644 --- a/macros/latex-dev/base/ltnews22.tex +++ b/macros/latex-dev/base/ltnews22.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2015-2023 +% Copyright (C) 2015-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews23.pdf b/macros/latex-dev/base/ltnews23.pdf Binary files differindex abf6218395..5a149714d3 100644 --- a/macros/latex-dev/base/ltnews23.pdf +++ b/macros/latex-dev/base/ltnews23.pdf diff --git a/macros/latex-dev/base/ltnews23.tex b/macros/latex-dev/base/ltnews23.tex index ee75a6463e..6eaaa08fd6 100644 --- a/macros/latex-dev/base/ltnews23.tex +++ b/macros/latex-dev/base/ltnews23.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2015-2023 +% Copyright (C) 2015-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews24.pdf b/macros/latex-dev/base/ltnews24.pdf Binary files differindex 2a8294b46a..8a065321dc 100644 --- a/macros/latex-dev/base/ltnews24.pdf +++ b/macros/latex-dev/base/ltnews24.pdf diff --git a/macros/latex-dev/base/ltnews24.tex b/macros/latex-dev/base/ltnews24.tex index 6a50ef902c..d34669098a 100644 --- a/macros/latex-dev/base/ltnews24.tex +++ b/macros/latex-dev/base/ltnews24.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2015-2023 +% Copyright (C) 2015-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews25.pdf b/macros/latex-dev/base/ltnews25.pdf Binary files differindex 3b2fcf4928..818b9b84c8 100644 --- a/macros/latex-dev/base/ltnews25.pdf +++ b/macros/latex-dev/base/ltnews25.pdf diff --git a/macros/latex-dev/base/ltnews25.tex b/macros/latex-dev/base/ltnews25.tex index 0676220a2e..4a168fee7b 100644 --- a/macros/latex-dev/base/ltnews25.tex +++ b/macros/latex-dev/base/ltnews25.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2016-2023 +% Copyright (C) 2016-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews26.pdf b/macros/latex-dev/base/ltnews26.pdf Binary files differindex 55d618bb30..1f5e0d6eee 100644 --- a/macros/latex-dev/base/ltnews26.pdf +++ b/macros/latex-dev/base/ltnews26.pdf diff --git a/macros/latex-dev/base/ltnews26.tex b/macros/latex-dev/base/ltnews26.tex index 9fbb6716b1..7ce1b7bd14 100644 --- a/macros/latex-dev/base/ltnews26.tex +++ b/macros/latex-dev/base/ltnews26.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2017-2023 +% Copyright (C) 2017-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews27.pdf b/macros/latex-dev/base/ltnews27.pdf Binary files differindex 244be0a0bd..5e5115fab5 100644 --- a/macros/latex-dev/base/ltnews27.pdf +++ b/macros/latex-dev/base/ltnews27.pdf diff --git a/macros/latex-dev/base/ltnews27.tex b/macros/latex-dev/base/ltnews27.tex index 917bf1cc10..44407da76f 100644 --- a/macros/latex-dev/base/ltnews27.tex +++ b/macros/latex-dev/base/ltnews27.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2017-2023 +% Copyright (C) 2017-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews28.pdf b/macros/latex-dev/base/ltnews28.pdf Binary files differindex 9536e57f5a..173d27b6f6 100644 --- a/macros/latex-dev/base/ltnews28.pdf +++ b/macros/latex-dev/base/ltnews28.pdf diff --git a/macros/latex-dev/base/ltnews28.tex b/macros/latex-dev/base/ltnews28.tex index 3c3b92da97..fec5c5c6c9 100644 --- a/macros/latex-dev/base/ltnews28.tex +++ b/macros/latex-dev/base/ltnews28.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2017-2023 +% Copyright (C) 2017-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews29.pdf b/macros/latex-dev/base/ltnews29.pdf Binary files differindex 6ac0eb8b97..306556f994 100644 --- a/macros/latex-dev/base/ltnews29.pdf +++ b/macros/latex-dev/base/ltnews29.pdf diff --git a/macros/latex-dev/base/ltnews29.tex b/macros/latex-dev/base/ltnews29.tex index 999836b01d..b201c49180 100644 --- a/macros/latex-dev/base/ltnews29.tex +++ b/macros/latex-dev/base/ltnews29.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2018-2023 +% Copyright (C) 2018-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews30.pdf b/macros/latex-dev/base/ltnews30.pdf Binary files differindex ad5fb53b4c..815eaf3072 100644 --- a/macros/latex-dev/base/ltnews30.pdf +++ b/macros/latex-dev/base/ltnews30.pdf diff --git a/macros/latex-dev/base/ltnews30.tex b/macros/latex-dev/base/ltnews30.tex index 8183f7eabb..97d2e9d890 100644 --- a/macros/latex-dev/base/ltnews30.tex +++ b/macros/latex-dev/base/ltnews30.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews31.pdf b/macros/latex-dev/base/ltnews31.pdf Binary files differindex 4a6484d05b..dff2439d12 100644 --- a/macros/latex-dev/base/ltnews31.pdf +++ b/macros/latex-dev/base/ltnews31.pdf diff --git a/macros/latex-dev/base/ltnews31.tex b/macros/latex-dev/base/ltnews31.tex index 44bf494142..194791cff5 100644 --- a/macros/latex-dev/base/ltnews31.tex +++ b/macros/latex-dev/base/ltnews31.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews32.pdf b/macros/latex-dev/base/ltnews32.pdf Binary files differindex 1964d6203a..f2e80722ec 100644 --- a/macros/latex-dev/base/ltnews32.pdf +++ b/macros/latex-dev/base/ltnews32.pdf diff --git a/macros/latex-dev/base/ltnews32.tex b/macros/latex-dev/base/ltnews32.tex index c64cd97958..ccc5feff77 100644 --- a/macros/latex-dev/base/ltnews32.tex +++ b/macros/latex-dev/base/ltnews32.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews33.pdf b/macros/latex-dev/base/ltnews33.pdf Binary files differindex 6d8f5775e9..0bc0b4a0fc 100644 --- a/macros/latex-dev/base/ltnews33.pdf +++ b/macros/latex-dev/base/ltnews33.pdf diff --git a/macros/latex-dev/base/ltnews33.tex b/macros/latex-dev/base/ltnews33.tex index 0b98a707ba..83e8a90c44 100644 --- a/macros/latex-dev/base/ltnews33.tex +++ b/macros/latex-dev/base/ltnews33.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews34.pdf b/macros/latex-dev/base/ltnews34.pdf Binary files differindex 3985ff0d5e..fa2a374667 100644 --- a/macros/latex-dev/base/ltnews34.pdf +++ b/macros/latex-dev/base/ltnews34.pdf diff --git a/macros/latex-dev/base/ltnews34.tex b/macros/latex-dev/base/ltnews34.tex index d3a9202b56..889531fe78 100644 --- a/macros/latex-dev/base/ltnews34.tex +++ b/macros/latex-dev/base/ltnews34.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews35.pdf b/macros/latex-dev/base/ltnews35.pdf Binary files differindex 820f6a341b..83e8307de1 100644 --- a/macros/latex-dev/base/ltnews35.pdf +++ b/macros/latex-dev/base/ltnews35.pdf diff --git a/macros/latex-dev/base/ltnews35.tex b/macros/latex-dev/base/ltnews35.tex index 8d49bf1984..8f0c9d6ae3 100644 --- a/macros/latex-dev/base/ltnews35.tex +++ b/macros/latex-dev/base/ltnews35.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2021-2023 +% Copyright (C) 2021-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews36.pdf b/macros/latex-dev/base/ltnews36.pdf Binary files differindex 4c2d70661f..35e707fe85 100644 --- a/macros/latex-dev/base/ltnews36.pdf +++ b/macros/latex-dev/base/ltnews36.pdf diff --git a/macros/latex-dev/base/ltnews36.tex b/macros/latex-dev/base/ltnews36.tex index 5dee958747..fdd830d870 100644 --- a/macros/latex-dev/base/ltnews36.tex +++ b/macros/latex-dev/base/ltnews36.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2021-2023 +% Copyright (C) 2021-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews37.pdf b/macros/latex-dev/base/ltnews37.pdf Binary files differindex 3ff2725b4d..c63805f098 100644 --- a/macros/latex-dev/base/ltnews37.pdf +++ b/macros/latex-dev/base/ltnews37.pdf diff --git a/macros/latex-dev/base/ltnews37.tex b/macros/latex-dev/base/ltnews37.tex index 3adda3ea90..1efb0a5127 100644 --- a/macros/latex-dev/base/ltnews37.tex +++ b/macros/latex-dev/base/ltnews37.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2021-2023 +% Copyright (C) 2021-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltnews38.pdf b/macros/latex-dev/base/ltnews38.pdf Binary files differindex 80ff1a2127..9693e62fef 100644 --- a/macros/latex-dev/base/ltnews38.pdf +++ b/macros/latex-dev/base/ltnews38.pdf diff --git a/macros/latex-dev/base/ltnews38.tex b/macros/latex-dev/base/ltnews38.tex index 04ffe1a0ed..bf485de239 100644 --- a/macros/latex-dev/base/ltnews38.tex +++ b/macros/latex-dev/base/ltnews38.tex @@ -177,7 +177,7 @@ and \pkg{biblatex}. For now activation is done through the line \begin{verbatim} \DocumentMetadata - {testphase={phase-III,math,tabular}} + {testphase={phase-III,math,table}} \end{verbatim} The math and the tabular support are not yet incorporated into \texttt{phase-III} but need their own activation, so that we can diff --git a/macros/latex-dev/base/ltnews39.pdf b/macros/latex-dev/base/ltnews39.pdf Binary files differnew file mode 100644 index 0000000000..f43f43a067 --- /dev/null +++ b/macros/latex-dev/base/ltnews39.pdf diff --git a/macros/latex-dev/base/ltnews39.tex b/macros/latex-dev/base/ltnews39.tex new file mode 100644 index 0000000000..b4b93d3504 --- /dev/null +++ b/macros/latex-dev/base/ltnews39.tex @@ -0,0 +1,640 @@ +% \iffalse meta-comment +% +% Copyright 2023 +% 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: ltnews39.tex +% +% This is issue 39 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 parameters parameter} + +\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{} % 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) + +\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 + +\let\finalvspace\vspace % for document layout fixes + +% Undo ltnews's \verbatim@font with active < and > +\makeatletter +\def\verbatim@font{% + \normalsize\ttfamily} +\makeatletter + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\providecommand\tubcommand[1]{} +\tubcommand{\input{tubltmac}} + +\publicationmonth{June} +\publicationyear{2024 --- DRAFT version for upcoming release} +%\publicationyear{2024} + +\publicationissue{39} + +\begin{document} + +\tubcommand{\addtolength\textheight{4.2pc}} % only for TUB + +\maketitle +{\hyphenpenalty=10000 \exhyphenpenalty=10000 \spaceskip=3.33pt \hbadness=10000 +\tableofcontents} + +\setlength\rightskip{0pt plus 3em} + +\medskip + +\section{Introduction} + +\emph{to write} + + +\section{News from the \enquote{\LaTeX{} Tagged PDF} project} + +In the previous \LaTeX{} News~\cite{39:ltnews38} we announced a first prototype +support for tagged tabulars. Some of the necessary support code has +now been moved from \texttt{latex-lab} to the corresponding packages +(using sockets and plugs) and to the \LaTeX{} kernel (for those parts +that are also necessary for other aspects of tagging). + +The kernel code specific to tagging is implemented in the file +\texttt{lttagging.dtx}. For now it contains \cs{UseTaggingSocket}, a +special invocation command for sockets that are specific to +tagging. This enables us to also provide \cs{SuspendTagging} and +\cs{ResumeTagging}, i.e., a very efficient way to temporarily disable +the whole tagging process. This is, for example, necessary, if some +code is doing trial typesetting. In that case the trials should not +generate tagging structures\Dash only the finally chosen version +should. Thus, \pkg{tabularx}, for example, stops the tagging while +doing its trials to figure out the correct column widths to use, and +then renables tagging when the table is finally typeset. + +Over time, \texttt{lttagging.dtx} will hold more general tagging code +as appropriate. For now it is only documented as part of +\texttt{source2e.pdf} but long term we will provide a separate guide +for tagging, which will then also include the information currently +found in various other places, e.g., \texttt{tagpdf.pdf}. + +We also added support for a few missing commands +described in Leslie Lamport's \emph{\LaTeX{} +Manual}~\cite{38:Lamport}: If \texttt{phase-III} is used +the \cs{marginpar} command will be properly tagged (depending on +the PDF version) as an \texttt{Aside} or a \texttt{Note} structure. +In the standard classes \cs{maketitle} will be tagged if the additional +testphase module \texttt{title} is used. + +The \texttt{math} module has been extended and now includes +options to attach MathML files to the structures. +First tests with a PDF reader and screen reader that support +associated files looks very promising. Examples of PDF files tagged with the +new method can be found at +\url{https://github.com/latex3/tagging-project/discussions/56}. + +At last various small bugs and problems reported at +\url{https://github.com/latex3/tagging-project} +has been fixed. Such a feedback is very valuable, +so we hope to see you there and thank you for +any contribution, whether it is an issue or a post on a discussion +thread. + + + +\section{Enhancements to the new mark mechanism} + +In June 2022 we introduced a new mark mechanism in +\LaTeX{}~\cite[p.~76]{39:ltnews} that allows keeping track of multiple +independent marks. It also properly supports top marks, something that wasn't +reliably possible with \LaTeX{} before. + +There was, however, one limitation: to retrieve the marks from the +page data it was necessary to \cs{vsplit} that data artificially so +that \TeX{} would produce split marks that the mechanism could then +use. Unfortunately, \TeX{} gets very upset if it finds infinite +negative glue (e.g., from \cs{vss}) within this data. This is not +totally surprising because such glue would allow splitting off any +amount of material as such glue would hide the size of it. \TeX{} +therefore responds with an error message if it find such glue while +doing a \cs{vsplit} operation (and it does so even if a later glue +item cancels the infinite glue). + +To account for this, the code in 2022 attempted to detect this +situation beforehand and if so did not do any splitting but, of +course, it would then also not extract any mark information. + +In this release the approach has been changed and we always do a +\cs{vsplit} operation and thus always get the right mark data +extracted. While it is not possible to avoid upsetting \TeX{} in case +we have infinite negative glue present, it is possible to hide this +(more or less) from the user.\footnote{A note to \pkg{l3build} users +that make use of its testing capabilities: the new mechanism +temporarily changes \cs{interactionmode} and, for implementation +reasons in \TeX{}, that results in extra newlines in the \texttt{.log} +file, so instead of seeing \texttt{[1] [2]} you will see each on +separate lines. This means that test files might show difference of +that nature, once the code is active, and must therefore be +regenerated as necessary.} With the new code \TeX{} will neither stop +nor show anything on the terminal. What we can't do, though, is to +avoid that an error is written to the log file, but to make it clear +that this error is harmless and should be ignored we have arranged the +code so that the error message, if it is issued, takes the following +format: +\begin{verbatim} +! Infinite glue shrinkage found in box being split. +<argument> Infinite shrink error above ignored ! +l. ... } +\end{verbatim} +Not perfect (especially the somewhat unmotivated \texttt{<argument>}), +but you can only do so much if error messages and their texts are +hard-wired in the engine. + +So why all this? There are two reasons: we do not lose marks in edge +cases any longer and perhaps more importantly we are now also reliably +able to extract marks from arbitrarily boxed data, something that +wasn't possible at all before. This is, for example, necessary to +support extended marks in \env{multicols} environments or extract them +from floats, marginpars, etc. + +Details about the implementation can be found in \texttt{texdoc + ltmarks-code} or in the shorter \texttt{texdoc ltmarks-doc} (which +only describes the general concepts and the command interfaces). + +\section{New or improved commands} + +\subsection{\pkg{doc}: provide \cs{ProvideDocElement}} + +Beside \cs{NewDocElement} and \cs{RenewDocElement} we now also offer a +\cs{ProvideDocElement} declaration that does nothing unless the doc +element could be declared with \cs{NewDocElement}. This can be useful +if documentation files are processed both individually as well as +combined. + + +\subsection{\pkg{doc}: better support for \pkg{upquote}} + +In \LaTeX{} News~37~\cite{39:ltnews37} we wrote that support for the +\pkg{upquote} package was added to the \pkg{doc} package, but back +then this was only done for \cs{verb}, and the \env{verbatim} +environments. However, the bulk of code in a typical \texttt{.dtx} file is +within \env{macrocode} or \env{macrocode*} environments which were not +affected by adding \pkg{upquote}. We have now updated those, such that +\pkg{upquote} alters the quote characters in these environments as +well. +% +\githubissue{1230} + +\section{Providing \pkg{xtemplate} in the format} + +In \LaTeX{} News~32, we described the move of one long-term experimental idea +into the kernel: the package \pkg{xparse}, which was integrated as \pkg{ltcmd}. +With this edition, we move another long-term development idea to stable status: +\emph{templates}. + +In this context, templates are a mechanism to abstract out various elements of a +document (such as \enquote{sectioning}) in such a way that different +implementations can be interchanged, and design decisions are set up efficiently +and controllably. + +In contrast to \pkg{ltcmd}, which provides a mechanism that many document +authors will exploit routinely, templates are a more specialised tool. We +anticipate that they will be used by a small number of programmers, providing +generic ideas that will then be used within document classes. Most document +authors will therefore likely encounter templates directly only rarely. +We anticipate though that they will be \emph{using} templates provided +by the team or others. + +The template system requires three separate ideas +\begin{itemize} + \item Template \emph{type}: the \enquote{thing} we are using templates + for, such as \enquote{sectioning} or \enquote{enumerated-list} + \item A template: a combination of code and keys that can be used + to implement a type. Here for example we might have + \enquote{standard-\LaTeX{}-sectioning} as a template for + \enquote{sectioning} + \item One or more \emph{instances}: a specific use case of a template + where (some) keys are set to known values. We might for example see + \enquote{\LaTeX{}-section}, \enquote{\LaTeX{}-subsection}, etc. +\end{itemize} + +As part of the move from the experimental \pkg{xtemplate} to kernel integration, +the team have revisited the commands provided. The stable set now comprises +\begin{itemize} + \item \cs{NewTemplateType} + \item \cs{DeclareTemplateInterface} + \item \cs{DeclareTemplateCode} + \item \cs{DeclareTemplateCopy} + \item \cs{EditTemplateDefault} + \item \cs{UseTemplate} + \item \cs{DeclareInstance} + \item \cs{DeclareInstanceCopy} + \item \cs{EditInstance} + \item \cs{UseInstance} +\end{itemize} + +To support existing package authors, we have released an updated version of +\pkg{xtemplate} which will work smoothly with the new kernel-level code. The +existing commands provided in \pkg{xtemplate} will continue to work, but +we encourage programmers to move to the set above. + +\section{Code improvements} + +\subsection{Loading packages at the top level} +Classes and packages should only be loaded with \cs{documentclass}, \cs{usepackage}, +or class interface commands such as \cs{LoadClass} or \cs{RequirePackageWithOptions} +at the top level, not inside a group. Previously \LaTeX\ did not check this, +which would often lead to low level errors later on if package declarations +were reverted as a group ended. +\LaTeX\ now checks the group level and an error is thrown +if the class or package is loaded in a group. +% +\githubissue{1185} + +\subsection{Keep track of lost glyphs} + +A while ago we changed the \LaTeX{} default value for +\cs{tracinglostchars} from \texttt{1} to \texttt{2} so that missing +glyphs generate at least a warning, but we forgot to make the same +change to \cs{tracingnone}. Thus, when issuing that command \LaTeX{} +stopped generating warnings about missing glyphs. This has now been +corrected. +% +\githubissue{549} + +\subsection{Improve \pkg{fontenc} error message} + +If the \pkg{fontenc} is asked to load a font encoding for which it +doesn't find a suitable \texttt{.def} file it generates an error +message indicating that the encoding name might be misspelled. That +is, of course, one of the possible causes, but another one is that the +installation is missing a necessary support package, e.g., that no +support for Cyrillic fonts has been installed. The error message text +has therefore been extended to explain the issue more generally. +% +\githubissue{1102} + + +\subsection{Warn if counter names are problematic} + +In the past it was possible to declare, for example, +\verb/\newcounter{index}/ with the side-effect that this defines +\cs{theindex}, even though \LaTeX{} has a \env{theindex} environment +that then got clobbered by the declaration. +% +This has now been changed: if \cs{the}\meta{counter} is already +defined it is not altered, but instead a warning message is displayed. +% +\githubissue{823} + +\subsection{Extended information in \cs{listfiles}} + +The \cs{listfiles} command provides useful information when finding issues +related to variation in package versions. However, this has to date relied on +the information in the \cs{ProvidesPackage} line, or similar: that can be +misleading if for example a file has been edited locally. We have now extended +\cs{listfiles} to take an optional argument which will then include the MD5 +hash of each file (and the size of each file) in the \texttt{.log}. Thus for +example you can use +\begin{verbatim} +\listfiles[hashes,sizes] +\end{verbatim} +to get both the file sizes and file hashes in the \texttt{.log} as well as +the standard release information. +% +\githubissue{945} + +\subsection{Optimize creation of simple document commands} + +Creating document commands using \cs{NewDocumentCommand}, etc., provides a very +flexible way of grabbing arguments. When the document command only takes simple +mandatory arguments, this has to-date added an overhead that could be avoided. +We have now refined the internal code path such that \enquote{simple} document +commands avoid almost any overhead at point-of-use, making the results +essentially as efficient as using \cs{newcommand} for low-level \TeX{} +constructs. Note that as \cs{NewDocumentCommand} makes engine-robust commands, +the direct equivalent to \cs{newcommand} is \cs{NewExpandableDocumentCommand}. +% +\githubissue{1189} + +\subsection{Declaring appropriate sub-encodings for \texttt{TS1} symbol fonts} + +In 2020 we incorporated support for the \texttt{TS1} symbol encoding +directly into the kernel and in this way removed the need to load the +\pkg{textcomp} package~\cite{39:ltnews31} to make commands such as +\cs{texteuro} available. + +There is, however, a big problem with this \texttt{TS1} symbol +encoding: only very few fonts can provide every glyph that is supposed +to be part of \texttt{TS1}. This means that changing font families +might result in certain symbols becoming unavailable. This can be a +major disaster if, for example, the \cs{texteuro} (\texteuro) or the +\cs{textohm} (\textohm) are no longer printed in your document, just +because you altered your text font family. + +To mitigate this problem, we also introduced in 2020 the declaration +\cs{DeclareEncodingSubset}. This declaration is supposed to be used in +font definition files for the \texttt{TS1} encoding to specify which +subset (we have defined 10 common ones) a specific font implements. If +such a declaration is used then missing symbols are automatically +taking from a fallback font. While this is not perfect, it is the best +you can do other than painstrickenly checking that your document only +uses glyphs that the font supports and if necessary switch to a +different font or avoid the missing symbols. See also the discussion +in \cite{39:ltnews33}. + +To jumpstart the process we also added declarations to the \LaTeX{} +kernel for most of the fonts found in \TeX{}Live at the time\Dash with +the assumption that such declarations would over time be superseded by +declarations in the \texttt{.fd} files. Unfortunately, this hasn't +happened yet (or not often) and so many of the initial declarations +went stale: several fonts got new glyphs added to them (so their +sub-encoding should have been changed but didn't); others (mainly due +to license issues) changed the family name and thus our declarations +became useless and the renamed fonts (now without a declaration) ended +up in the default sub-encoding which offers only few glyphs; yet +others such as CharisSIL (which triggered the GitHub issue) were +simply not around at the time. + +We have therefore, again attempted to provide the (currently) correct +declarations, but it is obvious that this is not a workable +process. As we do not maintain the fonts we do not have the +information that something has changed, and to regularly check the +ever growing font support bundles is simply not possible. It is +therefore very important that maintainers of font packages do not only +provide \texttt{.fd} files but also add such a declaration to every +\texttt{TS1...fd} font definition file that they distribute. + +To simplify this process, we now provide a simple \LaTeX{} file +(\texttt{checkencodingsubset.tex}) for determining the correct (safe) +sub-encoding. If run, it asks for a font family and then outputs its +findings, for example, for \texttt{AlgolRevived-TLF} you will get: +\begin{verbatim} +----------------------------------------- +Testing font family AlgolRevived-TLF +(currently TS1-sub-encoding 9) +----------------------------------------- +Some glyphs are missing from sub-encoding 8: + ==> \textcelsius (137) is missing + ==> \texttwosuperior (178) is missing + ==> \textthreesuperior (179) is missing + ==> \textonesuperior (185) is missing +Some glyphs are missing from sub-encoding 7: + ==> \texteuro (191) is missing +All glyphs between sub-encoding 6 and 7 exist +All glyphs between sub-encoding 5 and 6 exist +All glyphs between sub-encoding 4 and 5 exist +Some glyphs are missing from sub-encoding 3: + ==> \textwon (142) is missing +All glyphs between sub-encoding 2 and 3 exist +Some glyphs are missing from sub-encoding 1: + ==> \textmho (77) is missing + ==> \textpertenthousand (152) is missing +All glyphs between sub-encoding 0 and 1 exist +All glyphs in core exist +----------------------------------------- +TS1 encoding subset for AlgolRevived-TLF (ok) +Use sub-encoding 9 +----------------------------------------- +\end{verbatim} +This output is meant for human consumption, e.g., you see which glyphs +are missing and why a certain sub-encoding is suggested, but it is not +that hard to use it in a script and extract the suggested sub-encoding +by grepping for the line starting with \texttt{Use sub-encoding}. + +Of course, this check will only work if the missing glyphs are really +missing: some fonts placed \enquote{tofu}\footnote{Little squares to +indicate a missing symbol.} into such slots and in this case it looks +to \TeX{} as if the glyph is provided. For example, for the old +Palatino fonts (family \texttt{ppl}) it would report +\begin{verbatim} +----------------------------------------- +TS1 encoding subset for ppl (bad) +Use sub-encoding 0 (not 5) +----------------------------------------- +\end{verbatim} +i.e., all glyphs are provided, while in reality more than twenty are +missing and sub-encoding 5 as declared in the kernel is correct. +% +\githubissue{1257} + + + +%\section{Bug fixes} + +%\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} + + +\subsection{\pkg{array}, \pkg{longtable}, \pkg{tabularx}: support tagging} + +The three packages are now extended to enable producing tagged tabulars upon +request. This is done by adding a number of sockets (see +\cite{39:ltnews38}) that, by default, do nothing, but are equipped +with appropriate plugs if tagged PDF is requested. + +In the previous \LaTeX{} release this was handled in +\texttt{latex-lab} patching the packages when tagging was requested. + + + + +\subsection{\pkg{verbatim}: \cs{verb} showed visible spaces} + +A recent change in the kernel was not reflected in the \pkg{verbatim} +package with the result that \cs{verb} showed visible spaces +(\verb*/ /) after the package was loaded. This has already been corrected +in a hotfix for release 2023-11. +% +\githubissue{1160} + +\subsection{\pkg{verbatim}: Support tabs in \cs{verbatiminput*}} + +Mimicking the kernel update (November, 2023) that allowed \cs{verb*} +to mark tabs as spaces, the \pkg{verbatim} package has been updated +such that \cs{verbatiminput*} marks tabs as spaces as well. +% +\githubissue{1245} + + +\subsection{\pkg{multicol}: \cs{columnbreak} interferes with mark mechanism} + +The \pkg{multicol} package has to keep track of marks (from +\cs{markright} or \cs{markboth}) as part of its output routine code +and can't rely on \LaTeX{} handling that automatically. It does so by +artificially splitting page data with \cs{vsplit} to extract the mark +data. With the introduction of \cs{columnbreak} that code failed +sometimes, because it was not seeing any mark that followed such a +forced column break. + +This has now been corrected, but there is further work to do, because +as of now \pkg{multicol} does not yet handle marks using the new mark +mechanism\Dash see the discussion at the beginning of the newsletter. +% +\githubissue{1130} + +\subsection{\pkg{showkeys}: Allow \cs{newline} in \pkg{amsthm} to work} +% +Previously \pkg{showkeys} added an extra box layer which disabled the \cs{newline} +of \pkg{amsthm} theorem styles. This extra box has now been avoided. +% +\githubissue{1123} + + + +\section{Changes to files in the \pkg{cyrillic} category} + +\subsection{Correct definition of \cs{k}} + +Ages ago, the encoding specific definitions for various accent +commands were changed to guard against altering some parameter values +non-locally by mistake. For some reason the definition for \cs{k} in +the Cyrillic encodings \texttt{T2A}, \texttt{T2B}, and \texttt{T2C} +didn't get this treatment. This oversight has now been corrected. +% +\githubissue{1148} + + + +\begin{thebibliography}{9} + +%\fontsize{9.3}{11.3}\selectfont + + +%\bibitem{39: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{39:ltnews} \LaTeX{} Project Team. + \emph{\LaTeXe{} news 1--39}. June, 2024. + \url{https://latex-project.org/news/latex2e-news/ltnews.pdf} +% +% +\bibitem{39:ltnews31} \LaTeX{} Project Team. + \emph{\LaTeXe{} news 31}. February, 2020. + \url{https://latex-project.org/news/latex2e-news/ltnews31.pdf} + +\bibitem{39:ltnews33} \LaTeX{} Project Team. + \emph{\LaTeXe{} news 33}. June 2021.\\ + \url{https://latex-project.org/news/latex2e-news/ltnews33.pdf} + +\bibitem{39:ltnews37} \LaTeX{} Project Team. + \emph{\LaTeXe{} news 37}. June 2023.\\ + \url{https://latex-project.org/news/latex2e-news/ltnews37.pdf} + +\bibitem{39:ltnews38} \LaTeX{} Project Team. + \emph{\LaTeXe{} news 38}. November 2023.\\ + \url{https://latex-project.org/news/latex2e-news/ltnews38.pdf} + +%\bibitem{39:blueprint} Frank Mittelbach and Chris Rowley. +% \emph{\LaTeX{} Tagged PDF \Dash A blueprint for a large project}.\\ +% \url{https://latex-project.org/publications/indexbyyear/2020/} + +\end{thebibliography} + +\end{document} diff --git a/macros/latex-dev/base/ltoutenc.dtx b/macros/latex-dev/base/ltoutenc.dtx index 1d257805a4..c18ff01446 100644 --- a/macros/latex-dev/base/ltoutenc.dtx +++ b/macros/latex-dev/base/ltoutenc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -44,7 +44,7 @@ %<*driver> % \fi \ProvidesFile{ltoutenc.dtx} - [2022/05/27 v2.0z LaTeX Kernel (font encodings)] + [2024/02/08 v2.1a LaTeX Kernel (font encodings)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltoutenc.dtx} @@ -383,10 +383,10 @@ % other encodings, so there are some optimizations provided: % \begin{quote} % |\DeclareTextSymbolDefault{|^^A -% \meta{command}|}|^^A +% \meta{command}|}{|^^A % \meta{encoding}|}|\\ % |\DeclareTextAccentDefault{|^^A -% \meta{command}|}|^^A +% \meta{command}|}{|^^A % \meta{encoding}|}| % \end{quote} % are short for: @@ -840,7 +840,7 @@ % interfere between accent and base character. Therefore we need to % avoid that (they are some hidden inside \cs{maybe@load@fontshape}). % As we don't have to load the fontshape in this case -% (as that happened in the box above if necessary, we simply +% (as that already happened in the box above, if necessary), we simply % disable that part of the code temporarily. % We also ignore \cs{ignorespaces} which has the same issue and may % show up as part of \cs{normalfont} if that is used. @@ -3659,10 +3659,10 @@ \let\encodingdefault\CurrentOption % \end{macrocode} % From 2020/02/02 release onward we only load the encoding files if -% they haven't be loaded already. To check this we look if -% \verb=\T@=\textit{encoding} is already defined. If not we load +% they haven't be loaded already. To check this we look at whether +% \verb=\T@=\textit{encoding} is already defined. If not, we load it later % (indicated by setting the switch -% \texttt{@tempswa} to true and we always load if we run in an older +% \texttt{@tempswa} to true) and we always load if we are using an older % format (or rather in a rollback situation). % \changes{v2.0m}{2020/01/25}{Load each encoding file only once (gh/255)} % \begin{macrocode} @@ -3677,6 +3677,7 @@ \if@tempswa % \end{macrocode} % +% \changes{v2.1a}{2023/11/07}{Add more explanation to error message (gh/1102)} % \begin{macrocode} \edef\reserved@f{% \lowercase{\def\noexpand\reserved@f{\CurrentOption enc.def}}}% @@ -3685,7 +3686,11 @@ {}{\PackageError{fontenc}% {Encoding file `\reserved@f' not found.% \MessageBreak - You might have misspelt the name of the encoding}% + You might have misspelled the name of the encoding + \MessageBreak + or a required support package (e.g., cyrillic) is + \MessageBreak + missing in your installation}% {Necessary code for this encoding was not loaded.\MessageBreak Thus calling the encoding later on will @@ -3723,8 +3728,8 @@ % \end{macrocode} % % We select the new font encoding default (i.e., the last encoding -% specified in the option list. But this encoding may not work with -% the current |\f@shape|, e.g., \texttt{LY1} is not defined for +% specified in the option list). But this encoding may not work with +% the current |\f@shape|: e.g., \texttt{LY1} is not defined for % \texttt{cmr} and therefore packages switching to \texttt{LY1} % usually also change \cs{rmdefault}. But that only applies at % |\begin{document}| so we get a spurious warning if we use what diff --git a/macros/latex-dev/base/ltoutenc.ins b/macros/latex-dev/base/ltoutenc.ins index 2f0c39517f..c5316f9aab 100644 --- a/macros/latex-dev/base/ltoutenc.ins +++ b/macros/latex-dev/base/ltoutenc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/ltoutput.dtx b/macros/latex-dev/base/ltoutput.dtx index 18388b1cc6..b067ef5ecb 100644 --- a/macros/latex-dev/base/ltoutput.dtx +++ b/macros/latex-dev/base/ltoutput.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltpage.dtx b/macros/latex-dev/base/ltpage.dtx index 1a6586d067..f4efe0fd58 100644 --- a/macros/latex-dev/base/ltpage.dtx +++ b/macros/latex-dev/base/ltpage.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltpageno.dtx b/macros/latex-dev/base/ltpageno.dtx index 6c02d0fa7f..da80dbaab7 100644 --- a/macros/latex-dev/base/ltpageno.dtx +++ b/macros/latex-dev/base/ltpageno.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltpar.dtx b/macros/latex-dev/base/ltpar.dtx index 31d863610b..200d3b4238 100644 --- a/macros/latex-dev/base/ltpar.dtx +++ b/macros/latex-dev/base/ltpar.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltpara-code.pdf b/macros/latex-dev/base/ltpara-code.pdf Binary files differindex aa77b62b7c..37c0dd52df 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 008e6a5f33..7d23332d28 100644 --- a/macros/latex-dev/base/ltpara-doc.pdf +++ b/macros/latex-dev/base/ltpara-doc.pdf diff --git a/macros/latex-dev/base/ltpara.dtx b/macros/latex-dev/base/ltpara.dtx index 9c1a95ee61..e9741ff935 100644 --- a/macros/latex-dev/base/ltpara.dtx +++ b/macros/latex-dev/base/ltpara.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: ltpara.dtx -%% Copyright (C) 2020-2023 +%% Copyright (C) 2020-2024 %% Frank Mittelbach, The LaTeX Project % % It may be distributed and/or modified under the conditions of the @@ -14,12 +14,14 @@ % %%% From File: ltpara.dtx % -% \begin{macrocode} -\def\ltparaversion{v1.0l} -\def\ltparadate{2023/01/30} -% \end{macrocode} %<*driver> +% \fi +\ProvidesFile{ltpara.dtx} + [2024/02/11 v1.0m LaTeX Kernel (paragraph hooks)] +% \iffalse +% \documentclass{l3doc} +\GetFileInfo{ltpara.dtx} %\usepackage{ltpara} @@ -45,7 +47,7 @@ % % % \title{The \texttt{ltpara.dtx} code\thanks{This file has version -% \ltparaversion\ dated \ltparadate, \copyright\ \LaTeX\ +% \fileversion\ dated \filedate, \copyright\ \LaTeX\ % Project.}} % \author{Frank Mittelbach} % @@ -811,9 +813,11 @@ \hook_use:n {para/begin} % \end{macrocode} % If we aren't in horizontal mode any longer the hooks above misbehaved. +% \changes{v1.0m}{2023/11/16}{Correct error message: hook +% left horizontal not vertical mode (gh/1182)} % \begin{macrocode} \if_mode_horizontal: \else: - \msg_error:nnnn { hooks }{ para-mode }{begin}{vertical} \fi: + \msg_error:nnnn { hooks }{ para-mode }{begin}{horizontal} \fi: % \end{macrocode} % Finally we reinsert the indentation box (unless suppressed) and % then call \cs{everypar} the way legacy \LaTeX\ code expects it. @@ -845,7 +849,7 @@ %<latexrelease> \@kernel@before@para@begin %<latexrelease> \hook_use:n {para/begin} %<latexrelease> \if_mode_horizontal: \else: -%<latexrelease> \msg_error:nnnn { hooks }{ para-mode }{begin}{vertical} \fi: +%<latexrelease> \msg_error:nnnn { hooks }{ para-mode }{begin}{horizontal} \fi: %<latexrelease> \@@_handle_indent: %<latexrelease>} % \end{macrocode} diff --git a/macros/latex-dev/base/ltpictur.dtx b/macros/latex-dev/base/ltpictur.dtx index 926fd5c692..ea5ac4205b 100644 --- a/macros/latex-dev/base/ltpictur.dtx +++ b/macros/latex-dev/base/ltpictur.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltplain.dtx b/macros/latex-dev/base/ltplain.dtx index b41810373d..a628b954d9 100644 --- a/macros/latex-dev/base/ltplain.dtx +++ b/macros/latex-dev/base/ltplain.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -32,7 +32,7 @@ %<*driver> % \fi \ProvidesFile{ltplain.dtx} - [2023/10/21 v2.3i LaTeX Kernel (Plain TeX)] + [2024/02/08 v2.3j LaTeX Kernel (Plain TeX)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltplain.dtx} @@ -1241,11 +1241,11 @@ %<latexrelease>\IncludeInRelease{2022/06/01}{\obeylines}% %<latexrelease> {Add a redirection to obeylines and obeyspaces}% % \end{macrocode} -% If the active |^^M| escapes, e.g. into a \cs{write} (which is -% effectively in a different context) we don't want the definition +% If the active |^^M| escapes, e.g., into a \cs{write} (which is +% effectively in a different context) then we don't want the definition % from \cs{obeylines} but rather a simple \cs{par} (in fact even % the primitive one, not the \LaTeX{} version \cs{para\_end:} which -% is only defined later. +% is only defined later). % % \begin{macrocode} \begingroup @@ -1263,7 +1263,7 @@ % line ending characters and in that mode \TeX{} discards % everything from that point onwards to the real end of the line so % it works like a comment --- pretty strange really (and I think -% due to the fact the the original pascal compiler could have some +% due to the fact that the original pascal compiler could have some % garbage showing up after the normal line ending character. Thus % we really have to make sure that any closing braces is not one % the same line as an |^^M|, because otherwise it would get dropped @@ -1293,7 +1293,7 @@ % one that is current when \cs{obeylines} act. % % There is a small subtlety here: in an \cs{edef} the active |^^M| stayed -% put (because it was equal to to the primitive \cs{par}), now +% put (because it was equal to the primitive \cs{par}), now % \cs{obeyedline} expands and you get what it contains, i.e., in that % case \cs{par}, into the \cs{edef} or \cs{mark} unless we use % \cs{protected} on it. @@ -1813,7 +1813,13 @@ \tracinggroups\z@ \tracingparagraphs\z@ \tracingmacros\z@ - \tracinglostchars\@ne +% \end{macrocode} +% None really means go back to the \LaTeX{} ``default'' and for +% \cs{tracinglostchars} this should therefore be 2 these days. +% \changes{v2.3j}{2023/11/07}{Set \cs{tracinglostchars} to 2 in +% \cs{tracingnone} (gh/549)} +% \begin{macrocode} + \tracinglostchars\tw@ \tracingpages\z@ \tracingstats\z@ }% diff --git a/macros/latex-dev/base/ltproperties-code.pdf b/macros/latex-dev/base/ltproperties-code.pdf Binary files differindex a0757a3b61..85f4ba4e45 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 8dccf572dc..1dc54d6ea6 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 40c50cd20a..4a5fa78b5f 100644 --- a/macros/latex-dev/base/ltproperties.dtx +++ b/macros/latex-dev/base/ltproperties.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: ltproperties.dtx +% File: ltproperties.dtx % % Copyright (C) 2021-2023 The LaTeX Project % @@ -21,13 +21,21 @@ % https://github.com/latex3/latex2e % % for those people who are interested. -% \begin{macrocode} -\def\ltpropertiesversion{1.0c} -\def\ltpropertiesdate{2023-10-15} -% \end{macrocode} - -%<*driver> +% +% \fi +% +% \iffalse +%%% From File: ltproperties.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltproperties.dtx} + [2024/02/11 v1.0d LaTeX Kernel (Properties)] +% \iffalse +% \documentclass[full]{l3doc} +\GetFileInfo{ltproperties.dtx} + \EnableCrossrefs \CodelineIndex \begin{document} @@ -39,7 +47,7 @@ % \title{^^A % Recording and cross-referencing document properties^^A % \thanks{This module has version -% \ltpropertiesversion\ dated \ltpropertiesdate, \copyright\ The \LaTeX\ +% \fileversion\ dated \filedate, \copyright\ The \LaTeX\ % Project.} % } % @@ -157,8 +165,8 @@ % % \begin{function}{\property_new:nnnn,\property_gset:nnnn} % \begin{syntax} -% \cs{property_new:nnnn} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code} -% \cs{property_gset:nnnn} \Arg{property}\Arg{setpoint} \Arg{default} \Arg{code} +% \cs{property_new:nnnn} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code} +% \cs{property_gset:nnnn} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code} % \end{syntax} % \LaTeXe-interface: see \cs{NewProperty}, \cs{SetProperty}.\\ % Sets the \meta{property} to have the \meta{default} specified, and at the @@ -180,7 +188,7 @@ % \property_record:nn, \property_record:nV, \property_record:ee % } % \begin{syntax} -% \cs{property_record:nN} \Arg{label} \Arg{clist var} +% \cs{property_record:nN} \Arg{label} \meta{clist var} % \cs{property_record:nn} \Arg{label} \Arg{clist} % \end{syntax} % \LaTeXe{}-interface: see \cs{RecordProperties}.\\ @@ -307,8 +315,8 @@ % % \begin{function}{\NewProperty,\SetProperty} % \begin{syntax} -% \cs{NewProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code} -% \cs{SetProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code} +% \cs{NewProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code} +% \cs{SetProperty} \Arg{property} \Arg{setpoint} \Arg{default} \Arg{code} % \end{syntax} % Sets the \meta{property} to have the \meta{default} specified, and at the % \meta{setpoint} (either |now| or |shipout|) to write the result of the @@ -329,7 +337,7 @@ % of properties. Also similar to the standard \cs{label} command, the command is surrounded % by an \cs{@bsphack}/\cs{@esphack} pair to preserve spacing. % \end{function} - +% % \begin{function}[EXP]{\RefProperty} % \begin{syntax} % \cs{RefProperty} \oarg{local default} \Arg{label} \Arg{property} @@ -342,7 +350,7 @@ % % \begin{function}{\IfPropertyExistTF} % \begin{syntax} -% \cs{IfPropertyExistTF} \Arg{property} \Arg{true code} \Arg{false code} +% \cs{IfPropertyExistTF} \Arg{property} \Arg{true code} \Arg{false code} % \end{syntax} % Tests if the \meta{property} has been declared. % \end{function} @@ -361,7 +369,7 @@ % \end{syntax} % Tests if the label and a value of the \meta{property} for the \meta{label} are both known. % \end{function} - +% % \begin{function}{\RefUndefinedWarn} % \begin{syntax} % \cs{RefUndefinedWarn} \Arg{label} \Arg{property} @@ -551,6 +559,7 @@ % later too. That is all pretty easy using \pkg{expl3}: we accept a stray % comma at the end of the list as that is easier to deal with than trying % to tidy up, and there is no real downside. +% \changes{v1.0d}{2024-01-17}{Use \cs{protected@write}}% % \begin{macrocode} \cs_new_protected:Npn \property_record:nN #1#2 { \property_record:nV {#1} #2 } @@ -561,7 +570,7 @@ { \legacy_if:nT { @filesw } { - \iow_shipout_x:Nx \@auxout + \protected@write \@auxout {} { \token_to_str:N \new@label@record {#1} @@ -737,7 +746,7 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{IfPropertyExistTF} +% \begin{macro}{\IfPropertyExistTF} % \begin{macrocode} \cs_new_eq:NN \IfPropertyExistTF \property_if_exist:eTF % \end{macrocode} diff --git a/macros/latex-dev/base/ltsect.dtx b/macros/latex-dev/base/ltsect.dtx index 5a03fd4977..4560704463 100644 --- a/macros/latex-dev/base/ltsect.dtx +++ b/macros/latex-dev/base/ltsect.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltshipout-code.pdf b/macros/latex-dev/base/ltshipout-code.pdf Binary files differindex b688db8cc5..0fee02853e 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 9265263918..3051341818 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 b19814a6fd..0c9113ce93 100644 --- a/macros/latex-dev/base/ltshipout.dtx +++ b/macros/latex-dev/base/ltshipout.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment %% -%% Copyright (C) 2020-2023 +%% Copyright (C) 2020-2024 %% Frank Mittelbach, The LaTeX Project %% % @@ -31,30 +31,14 @@ % %%% From File: ltshipout.dtx % -% \begin{macrocode} -\providecommand\ltshipoutversion{v1.0n} -\providecommand\ltshipoutdate{2022/11/08} -% \end{macrocode} -% %<*driver> - +% \fi +\ProvidesFile{ltshipout.dtx} + [2024/02/11 v1.0n LaTeX Kernel (Shipout)] +% \iffalse +% \documentclass{l3doc} - -% bug fix fo l3doc.cls -\ExplSyntaxOn -\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2 - { - \vbox_set:Nn \l__codedoc_macro_box - { - \vbox_unpack_drop:N \l__codedoc_macro_box - \hbox { \llap { \__codedoc_print_macroname:nN {#1} #2 - \MacroFont % <----- without it the \ is in lmr10 if a link is made - \ - } } - } - \int_incr:N \l__codedoc_macro_int - } -\ExplSyntaxOff +\GetFileInfo{ltshipout.dtx} \providecommand\InternalDetectionOff{} \providecommand\InternalDetectionOn{} @@ -76,7 +60,7 @@ % % % \title{The \texttt{ltshipout} documentation\thanks{This file has version -% \ltshipoutversion\ dated \ltshipoutdate, \copyright\ \LaTeX\ +% \fileversion\ dated \filedate, \copyright\ \LaTeX\ % Project.}} % % \author{Frank Mittelbach, \LaTeX{} Project Team} @@ -859,7 +843,7 @@ % % \changes{v1.0d}{2020/11/23}{Check for both kernel and user hook (gh/431)} % \changes{v1.0f}{2021/01/08}{Added another kernel hook for more -% flexibility (cf \texttt{https://github.com/pgf-tikz/pgf/issues/960}} +% flexibility (cf.\ \texttt{https://github.com/pgf-tikz/pgf/issues/960}} % \begin{macrocode} \bool_lazy_and:nnF { \hook_if_empty_p:n {shipout/background} } diff --git a/macros/latex-dev/base/ltsockets-code.pdf b/macros/latex-dev/base/ltsockets-code.pdf Binary files differindex 7fa60a7f54..6301f60a3c 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 e708f04a3a..a50aad4998 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 7d2940f454..243963f7bc 100644 --- a/macros/latex-dev/base/ltsockets.dtx +++ b/macros/latex-dev/base/ltsockets.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2023 +% Copyright (C) 2023-2024 % Frank Mittelbach, The LaTeX Project % % This file is part of the LaTeX base system. @@ -30,14 +30,14 @@ % %%% From File: ltsockets.dtx % -% \begin{macrocode} -\def\ltsocketsversion{0.9a} -\def\ltsocketsdate{2023-08-21} -% \end{macrocode} +%<*driver> +% \fi +\ProvidesFile{ltsockets.dtx} + [2024/02/11 v0.9a LaTeX Kernel (Sockets)] +% \iffalse % -%<*driver> \documentclass{l3doc} - +\GetFileInfo{ltsockets.dtx} \providecommand\InternalDetectionOff{} \providecommand\InternalDetectionOn{} @@ -55,7 +55,7 @@ % % % \title{\LaTeX{}'s socket management\thanks{This module has version -% \ltsocketsversion\ dated \ltsocketsdate, \copyright\ \LaTeX\ +% \fileversion\ dated \filedate, \copyright\ \LaTeX\ % Project.}} % % \author{Frank Mittelbach} @@ -530,8 +530,8 @@ % % \begin{function}{\NewSocket,\socket_new:nn} % \begin{syntax} -% \cs{NewSocket} \Arg{socket-name}\Arg{number-of-inputs} -% \cs{socket_new:nn}\Arg{socket-name}\Arg{number-of-inputs} +% \cs{NewSocket} \Arg{socket-name} \Arg{number-of-inputs} +% \cs{socket_new:nn} \Arg{socket-name} \Arg{number-of-inputs} % \end{syntax} % Declares a new socket with name \meta{socket-name} having % \meta{number-of-inputs} inputs. There is automatically a @@ -563,9 +563,9 @@ % % \begin{function}{\NewSocketPlug,\socket_new_plug:nnn,\socket_set_plug:nnn} % \begin{syntax} -% \cs{NewSocketPlug} \Arg{socket-name}\Arg{socket-plug-name}\Arg{code} -% \cs{socket_new_plug:nnn}\Arg{socket-name}\Arg{socket-plug-name}\Arg{code} -% \cs{socket_set_plug:nnn}\Arg{socket-name}\Arg{socket-plug-name}\Arg{code} +% \cs{NewSocketPlug} \Arg{socket-name} \Arg{socket-plug-name} \Arg{code} +% \cs{socket_new_plug:nnn} \Arg{socket-name} \Arg{socket-plug-name} \Arg{code} +% \cs{socket_set_plug:nnn} \Arg{socket-name} \Arg{socket-plug-name} \Arg{code} % \end{syntax} % Declares a new plug for socket \meta{socket-name} that runs % \meta{code} when executing. It complains if the plug was already @@ -582,8 +582,8 @@ % % \begin{function}{\AssignSocketPlug,\socket_assign_plug:nn} % \begin{syntax} -% \cs{AssignSocketPlug} \Arg{socket-name}\Arg{socket-plug-name} -% \cs{socket_assign_plug:nn}\Arg{socket-name}\Arg{socket-plug-name} +% \cs{AssignSocketPlug} \Arg{socket-name} \Arg{socket-plug-name} +% \cs{socket_assign_plug:nn} \Arg{socket-name} \Arg{socket-plug-name} % \end{syntax} % Assigns the plug \meta{socket-plug-name} to the socket % \meta{socket-name}. It errors if either socket or plug is not @@ -595,8 +595,8 @@ % % \begin{function}{\UseSocket,\socket_use:nw,\socket_use:n,\socket_use:nn,\socket_use:nnn,\socket_use:nnnn} % \begin{syntax} -% \cs{UseSocket} \Arg{socket-name} -% \cs{socket_use:nnn}\Arg{socket-name} \Arg{socket-arg\textsubscript{1}} \Arg{socket-arg\textsubscript{2}} +% \cs{UseSocket} \Arg{socket-name} +% \cs{socket_use:nnn} \Arg{socket-name} \Arg{socket-arg\textsubscript{1}} \Arg{socket-arg\textsubscript{2}} % \end{syntax} % Executes the socket \meta{socket-name} by retrieving the % \meta{code} of the current plug assigned to the socket. This is @@ -619,8 +619,8 @@ % % \begin{function}{\ShowSocket,\LogSocket,\socket_show:n,\socket_log:n} % \begin{syntax} -% \cs{ShowSocket} \Arg{socket-name} -% \cs{socket_show:n}\Arg{socket-name} +% \cs{ShowSocket} \Arg{socket-name} +% \cs{socket_show:n} \Arg{socket-name} % \end{syntax} % Displays information about the socket \meta{socket-name} and its % state then stops and waits for further instructions --- at the diff --git a/macros/latex-dev/base/ltspace.dtx b/macros/latex-dev/base/ltspace.dtx index 03b3445047..206e4f3885 100644 --- a/macros/latex-dev/base/ltspace.dtx +++ b/macros/latex-dev/base/ltspace.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -32,7 +32,7 @@ %<*driver> % \fi \ProvidesFile{ltspace.dtx} - [2023/10/26 v1.3r LaTeX Kernel (spacing)] + [2024/02/08 v1.3r LaTeX Kernel (spacing)] % \iffalse \documentclass{ltxdoc} \GetFileInfo{ltspace.dtx} @@ -568,7 +568,7 @@ % \changes{LaTeX2e}{1993/12/08} % {Command reimplemented; late birthday present for Chris} % \changes{LaTeX2e}{1993/12/08}{Command reimplemented} -% \changes{LaTeX2e}{1993/12/16}{Corrected optimisation :-)} +% \changes{LaTeX2e}{1993/12/16}{Corrected optimisation} % |\@bsphack| and |\@esphack| % used by macros such as |\index| and % |\begin{@float}| \ldots |\end{@float}| @@ -1156,8 +1156,8 @@ % \subsection{Horizontal space (and breaks)} % % \begin{macro}{\nobreakdashes} -% \changes{v1.3}{2004/02/04}{(Macro added} -% \changes{v1.3a}{2004/02/15}{(Added spacefactor setting} +% \changes{v1.3}{2004/02/04}{Macro added} +% \changes{v1.3a}{2004/02/15}{Added spacefactor setting} % This idea is borrowed from the \textsf{amsmath} package but % here we define a robust command. % @@ -1194,7 +1194,7 @@ % \end{macro} % % \begin{macro}{\nobreakspace} -% \changes{v1.2k}{1995/12/04}{(Macro added} +% \changes{v1.2k}{1995/12/04}{Macro added} % \changes{v1.3r}{2023/10/26}{Protected definition for tilde} % \begin{macro}{\@xobeysp} % \changes{v1.2t}{1996/09/28}{Moved from ltmiscen.dtx and redefined to @@ -1209,7 +1209,7 @@ % % The braces in the definition of |~| are needed to ensure that a % following space is preserved when reading to/from internal files. -% \changes{v1.2l}{1995/12/04}{(braces added to definition of tilde} +% \changes{v1.2l}{1995/12/04}{braces added to definition of tilde} % % We need to keep \cs{@xobeysp} as it is widely used; so here it is % let to the non-robust command \cs{nobreakspace }. diff --git a/macros/latex-dev/base/lttab.dtx b/macros/latex-dev/base/lttab.dtx index e76325d82b..a85b4f8cf7 100644 --- a/macros/latex-dev/base/lttab.dtx +++ b/macros/latex-dev/base/lttab.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/lttagging.dtx b/macros/latex-dev/base/lttagging.dtx new file mode 100644 index 0000000000..585479df21 --- /dev/null +++ b/macros/latex-dev/base/lttagging.dtx @@ -0,0 +1,775 @@ +% \iffalse meta-comment +% +% Copyright (C) 2023-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 +% +% \iffalse +%%% From File: lttagging.dtx +% +%<*driver> +% \fi +\ProvidesFile{lttagging.dtx} + [2023/12/19 v1.0a LaTeX Kernel (tagging support)] +% \iffalse +\documentclass{l3doc} +\GetFileInfo{lttagging.dtx} +\title{\filename} +\date{\filedate} +\author{\LaTeX{} project} + +\begin{document} +% \MaintainedByLaTeXTeam{latex} % should be added again the moment + % it is supported by l3doc + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% \providecommand\env[1]{\texttt{#1}} +% +% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}} +% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}} +% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}} +% +% \let\ProvideDocElement\NewDocElement +% +% \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} +% +% +% \section{} +% +% +% +% \MaybeStop{} +% +% \begin{macrocode} +%<*2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +\ExplSyntaxOn +% \end{macrocode} +% +% +% \section{General support for tagged output} +% +% \DescribeMacro\SuspendTagging +% \DescribeMacro\ResumeTagging +% +% 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 +% version that is actually used, otherwise tagging structures are +% allowed which then do not end up in the PDF and confuse the +% mechanism. For this we have two commands that can be used in +% packages: \cs{SuspendTagging} and \cs{ResumeTagging}. They are +% available as part of the \LaTeX{} kernel, so that they can be +% safely used in packages whether or not tagging is requested .They +% both take string argument that is used for debugging to easily +% identify why tagging was suspended or restarted, for example, in +% \pkg{tabularx} you find \verb=\SuspendTagging{tabularx}=. By default +% they two commands do nothing. +% +% TODO: the corresponding L3 layer commands should also have a dummy +% definition in the kernel! +% +% \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., +% \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. +% +% 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 my 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 +% \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. +% +% +% +% \begin{macro}{\SuspendTagging,\ResumeTagging} +% +% In the kernel, these two 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 \SuspendTagging \use_none:n +\cs_new_eq:NN \ResumeTagging \use_none:n +% \end{macrocode} +% +% A simplified version of this defnition should move to +% \pkg{tagpdf} and dropped here, eventually. +% \begin{macrocode} +\AddToHook{begindocument/before}{ + \cs_if_exist:NT \tag_stop:n + { + \cs_set:Npn \SuspendTagging #1 { +% \end{macrocode}% +% This stops tagging and also disables all tagging sockets so we are done. +% \begin{macrocode} + \tag_stop:n {#1} + } +% \end{macrocode} +% +% \begin{macrocode} + \cs_set:Npn \ResumeTagging #1 { \tag_start:n {#1} } + } +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tag_socket_use:n, +% \tag_socket_use:nn, +% \UseTaggingSocket, +% } +% 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 +% still missing. +% \begin{macrocode} +\AddToHook{begindocument}[kernel]{ + \cs_if_exist:NF \tag_if_active:T + { + \prg_new_conditional:Npnn \tag_if_active: { p , T , TF, F } + { \prg_return_false: } + } +} +% \end{macrocode} +% +% Dummy definitions in the kernel. +% These definitions will get updated in \pkg{tagpdf}. +% \begin{macrocode} +\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 \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 +% \end{macrocode} +% We do not expect tagging sockets with more than one or two +% arguments, so for now we only provide those. +% \begin{macrocode} + } + \ERRORusetaggingsocket % that should get a proper error message +} +\ExplSyntaxOff +% \end{macrocode} +% +% \end{macro} +% +% +% +% +% +% +% \subsection{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. +% +% \begin{socketdecl}{tagsupport/tbl/cell/begin, +% tagsupport/tbl/cell/end, +% tagsupport/tbl/pcell/end, +% tagsupport/tbl/pcell/end, +% tagsupport/tbl/row/begin, +% tagsupport/tbl/row/end, +% } +% At first sockets for the begin and end of cells and table rows: +% \begin{macrocode} +\NewSocket{tagsupport/tbl/cell/begin}{0} +\NewSocket{tagsupport/tbl/cell/end}{0} +% \end{macrocode} +% +% \begin{macrocode} +\NewSocket{tagsupport/tbl/row/begin}{0} +\NewSocket{tagsupport/tbl/row/end}{0} +% \end{macrocode} +% Multi-line cells have their own sockets (as they start out in +% vertical mode and need different treatment). +% \begin{macrocode} +\NewSocket{tagsupport/tbl/pcell/begin}{0} +\NewSocket{tagsupport/tbl/pcell/end}{0} +% \end{macrocode} +% \end{socketdecl} +% +% \begin{socketdecl}{tagsupport/tbl/init} +% This socket should be at the begin of the table, inside a group. +% It is used for settings such as disabling para-tagging inside the +% table. This socket +% can perhaps be merged later into the begin-sockets. +% \begin{macrocode} +\NewSocket{tagsupport/tbl/init}{0} +% \end{macrocode} +% \end{socketdecl} +% +% +% \begin{socketdecl}{tagsupport/tbl/finalize} +% To fine tune the structure (change cells to header cells, remove +% unwanted structures, move a foot to the end, etc.). We also need a +% socket that is executed at the end of the table but \emph{before} +% all the variables are restored to the outer or default values. +% The code in the socket can make assignments, but probably +% shouldn't do typesetting and not write whatsits. +% \begin{macrocode} +\NewSocket{tagsupport/tbl/finalize}{0} +% \end{macrocode} +% \end{socketdecl} +% + + +% \begin{socketdecl}{tagsupport/tbl/colspan} +% This socket is used to manage spanning cells, e.g., a +% \cs{multicolumn}. It expects one argument (the number of cells +% spanned) and if tagging is enabled set appropriate tag attributes +% in the background. We probably need a similar socket for row +% spans eventually. +% \begin{macrocode} +\NewSocket{tagsupport/tbl/colspan}{1} +% \end{macrocode} +% \end{socketdecl} +% + + +% \begin{socketdecl}{tagsupport/tbl/hmode/begin, +% tagsupport/tbl/hmode/end, +% tagsupport/tbl/vmode/begin, +% tagsupport/tbl/vmode/end +% } +% +% These sockets are used in the begin and end code of environments, +% to allow a fast enabling and disabling of the tagging. We +% distinguish between tables that can be used inside paragraphs and +% standalone tables such as \env{longtable} that are always in +% vertical mode. +% \begin{macrocode} +\NewSocket{tagsupport/tbl/hmode/begin}{0} +\NewSocket{tagsupport/tbl/hmode/end}{0} +\NewSocket{tagsupport/tbl/vmode/begin}{0} +\NewSocket{tagsupport/tbl/vmode/end}{0} +% \end{macrocode} +% \end{socketdecl} +% +% +% +% \begin{socketdecl}{tagsupport/tbl/longtable/init, +% tagsupport/tbl/longtable/finalize} +% \env{longtable} needs its own sockets to fine tune the structure. +% Simply switching the plug in the previous socket interferes with +% enabling/disabling the tagging. +% \begin{macrocode} +\NewSocket{tagsupport/tbl/longtable/init}{0} +\NewSocket{tagsupport/tbl/longtable/finalize}{0} +% \end{macrocode} +% \end{socketdecl} +% +% \begin{socketdecl}{tagsupport/tbl/longtable/head, +% tagsupport/tbl/longtable/foot} +% Header and footer boxes need special handling because they are repeatedly +% used. +% \begin{macrocode} +\NewSocket{tagsupport/tbl/longtable/head}{0} +\NewSocket{tagsupport/tbl/longtable/foot}{0} +% \end{macrocode} +% \end{socketdecl} +% +% +% +% +% +% \section{For lttab.dtx parked here for now} +% +% +% \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn +% \end{macrocode} +% +% +% \subsection{Variables for row, column and span counting} +% +% This part needs a decision on names for various integer registers +% as well as a decision if those should be also made available for +% \LaTeXe{}-style packages in form of 2e names and or as +% non-internals for the L3 programming layer. +% +% At the moment they are all internal but this probably has to change. +% +% \begin{macro}{ +% \g_@@_col_int, +% \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 +% chunk to be processed). It is incremented by every \cs{cr} +% including the one ending the table preamble. +% +% TODO: due to the gymnastics needed inside the longtable code the +% row counter is directly exposed there rather than hidden by +% interfaces. This needs changing when it is decided how to manage +% these counters. +% +% \cs{g_@@_col_int} holds the current column number. The value +% \texttt{0} means we have not yet started the table or just finished a table row +% (with \verb=\\= typically); any other positive value means we +% are currently typesetting a cell in that column in some row +% (denoted by the \cs{g_@@_row_int}). +% +% In a \cs{multicolumn} it holds the column number of the first +% spanned column and \cs{g_@@_span_tl} the info how many cells are +% spanned. +% +% \cs{g_@@_span_tl} is normally \texttt{1} except in a +% \cs{multicolumn} cell. +% \begin{macrocode} +\int_new:N \g_@@_col_int +\int_new:N \g_@@_row_int +\tl_new:N \g_@@_span_tl +\tl_new:N \g_@@_table_cols_tl + +\tl_gset:Nn \g_@@_span_tl {1} +\tl_gset:Nn \g_@@_table_cols_tl {0} % indicates outer level +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\l_@@_saved_col_tl,\l_@@_saved_row_tl, +% \l_@@_saved_span_tl,\l_@@_saved_table_cols_tl} +% +% Saving the outer values if we are nesting tables is necessary (as +% the above variables are globally altered). For this we always use +% token lists because they don't change and we do not need to blow +% additional integer registers. +% \begin{macrocode} +\tl_new:N \l_@@_saved_col_tl +\tl_new:N \l_@@_saved_row_tl +\tl_new:N \l_@@_saved_span_tl +\tl_new:N \l_@@_saved_table_cols_tl + +\tl_set:Nn \l_@@_saved_col_tl{0} +\tl_set:Nn \l_@@_saved_row_tl{0} +\tl_set:Nn \l_@@_saved_span_tl{1} +\tl_set:Nn \l_@@_saved_table_cols_tl{0} % indicates outer level +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\g_@@_missingcells_int} +% This will contain the number of missing cells in a row: +% \begin{macrocode} +\int_new:N \g_@@_missing_cells_int +% \end{macrocode} +% \end{macro} +% +% +% +% +% +% \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} +\cs_new_eq:NN \@@_trace:n \use_none:n +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{Interface commands} +% +% All interface commands for the cell number determination have to be +% public on some level because they are needed in other packages as +% well, e.g., longtable. We may or may not also want to provide 2e +% style names for them. +% +% \begin{macro}{\tbl_update_cell_data:} +% Updating cell data in columns after the first means we have to +% increment the \cs{g_@@_col_int} by the span count of the previous +% cell (in case it was a \cs{multicolumn}) and then reset the +% \cs{g_@@_span_tl} to one (as the default). +% \begin{macrocode} +\cs_new_protected:Npn \tbl_update_cell_data: { + \int_gadd:Nn \g_@@_col_int { \g_@@_span_tl } + \tl_gset:Nn \g_@@_span_tl {1} +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\tbl_count_table_cols:} +% Current implementation of \cs{@mkpream} uses the scratch counter +% \cs{count@} to keep track of the number of toks registers it needs +% (2 per column), but this can't be used as it counts also +% insertions made with \verb+!{}+ and \verb+@{}+. +% So similar as does longtable for \cs{LT@cols} we count the +% numbers of ampersands instead. +% \begin{macrocode} +\cs_new:Npn \tbl_count_table_cols: { + \seq_set_split:NnV\l_@@_tmpa_seq {&}\@preamble + \tl_gset:Ne \g_@@_table_cols_tl { \seq_count:N \l_@@_tmpa_seq } + \@@_trace:n { ==>~ Table~ has~ \g_@@_table_cols_tl \space columns } +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\l_@@_tmpa_seq} +% +% \begin{macrocode} +\seq_new:N \l_@@_tmpa_seq +% \end{macrocode} +% \end{macro} +% +% +% +% \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 +% error below when we try to determine the missing cells, so bypass +% that calculation if we aren't doing tagging (there the packages +% should have the proper code added). Recall that this is code, +% that is called by \verb=\\= and an old table packagee might rely +% on whatever the \LaTeX{} kernel offers here. +% \begin{macrocode} +\cs_new:Npn \tbl_count_missing_cells:n #1 { + \tag_if_active:T { + \int_compare:nNnT \g_@@_col_int > 0 + { + \int_gset:Nn \g_@@_missing_cells_int + { + \g_@@_table_cols_tl + - \g_@@_col_int + - \g_@@_span_tl + + 1 + } + \int_compare:nNnT \g_@@_missing_cells_int < 0 \ERRORmissingcells % should not happen + \@@_trace:n{==>~ + (#1)~ + This~ row~ needs~ + \int_use:N \g_@@_missing_cells_int \space + additional~ cell(s) + } + } + } +} +% \end{macrocode} +% \end{macro} +% +% +% \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 +} +% \end{macrocode} +% \end{macro} +% +% +% \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 } + \tl_set:No \l_@@_saved_row_tl {\int_use:N \g_@@_row_int } + \tl_set_eq:NN \l_@@_saved_span_tl \g_@@_span_tl +% + \@@_trace:n { ==>~ saved~cell~data:~ + \l_@@_saved_row_tl, + \l_@@_saved_col_tl, + \l_@@_saved_span_tl \space + ( + \int_compare:nNnTF \l_@@_saved_table_cols_tl = 0 + { outer~ level } + { max:~ \l_@@_saved_table_cols_tl } + ) + } +% \end{macrocode} +% These are the initial values when starting a table: +% \begin{macrocode} + \int_gzero:N \g_@@_row_int + \int_gzero:N \g_@@_col_int + \tl_gset:Nn \g_@@_span_tl {1} +} +% \end{macrocode} +% \end{macro} +% +% +% +% +% \begin{macro}{\tbl_update_cell_data_for_next_row:} +% \begin{macrocode} +\cs_new_protected:Npn \tbl_update_cell_data_for_next_row: { + \int_gincr:N \g_@@_row_int % this row about to start + \int_gzero:N \g_@@_col_int % we are before first col +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\tbl_init_cell_data_for_row:} +% If we start processing a cell in the first column we set +% \cs{g_@@_col_int} to \texttt{1} as we are no longer "at" but "in" +% the first column. We also set \cs{g_@@_span_tl} to its default +% value (not spanning cells). +% \begin{macrocode} +\cs_new_protected:Npn \tbl_init_cell_data_for_row: { + \int_gset:Nn \g_@@_col_int {1} + \tl_gset:Nn \g_@@_span_tl {1} +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\tbl_if_row_was_started:T, +% \tbl_if_row_was_started:TF} +% We use \cs{g_@@_col_int} equal zero to indicate that we are just +% after a TR (i.e.n between rows or at the very beginning of the +% table). Using the row +% count is not so good as longtable may split the table in chunks. +% +% These conditionals have to be expandable (i.e., unprotected) as +% they are sometimes executed when \TeX{} is scanning inside a table. +% \begin{macrocode} +\cs_new:Npn \tbl_if_row_was_started:T { + \int_compare:nNnT \g_@@_col_int > 0 +} +\cs_new:Npn \tbl_if_row_was_started:TF { + \int_compare:nNnTF \g_@@_col_int > 0 +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\tbl_gzero_row_count:,\tbl_gincr_row_count:,\tbl_gdecr_row_count:} +% This here is basically a temporary interface. What it will be in +% the end depends on what we decide concerning exposing row and +% column counters, if they stay internal we need something like +% this here (perhaps using \texttt{gincr} etc, or perhaps some +% other names in the first place). +% \begin{macrocode} +\cs_new_protected:Npn \tbl_gzero_row_count: { + \int_gzero:N \g_@@_row_int +} +\cs_new_protected:Npn \tbl_gincr_row_count: { + \int_gincr:N \g_@@_row_int +} +\cs_new_protected:Npn \tbl_gdecr_row_count: { + \int_gdecr:N \g_@@_row_int +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\tbl_inbetween_rows:} +% Again name is not really brilliant so far. +% \begin{macrocode} +\cs_new_protected:Npn \tbl_inbetween_rows: { + \int_gzero:N \g_@@_col_int +} +% \end{macrocode} +% \end{macro} +% +% +% +% +% +% +% \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 + \@@_trace:n { ==>~ restored~cell~data:~ + \int_use:N \g_@@_row_int, + \int_use:N \g_@@_col_int, + \l_@@_saved_span_tl \space + ( + \int_compare:nNnTF \g_@@_table_cols_tl = 0 + { outer~ level } + { max:~ \g_@@_table_cols_tl } + ) + } +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\tbl_update_multicolumn_cell_data:n} +% This macro updates \cs{g_@@_col_int} and \cs{g_@@_span_tl} inside +% a \cs{multicolumn} and possibly calls the tagging socket +% \texttt{tbl/row/begin}. +% \begin{macrocode} +\cs_new_protected:Npn \tbl_update_multicolumn_cell_data:n #1 { +% \end{macrocode} +% We execute socket for tagging only if this \cs{multicolumn} +% replaces the preamble of the first column. In that case we also have +% to set \cs{g_@@_col_int} to 1 because this is no longer done in the +% preamble for the cell either. +% \begin{macrocode} + \int_compare:nNnTF \g_@@_col_int = 0 + { + \UseTaggingSocket{tbl/row/begin} + \int_gset:Nn \g_@@_col_int {1} + } +% \end{macrocode} +% If we are in a later column we use \cs{g_@@_span_tl} from the +% previous column to update. +% \begin{macrocode} + { + \int_gadd:Nn \g_@@_col_int { \g_@@_span_tl } + } +% \end{macrocode} +% Then we set the span value so that it can be use in the next column. +% \begin{macrocode} + \tl_gset:Nn \g_@@_span_tl {#1} +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\tbl_crcr:n} +% This macro is used instead of the usual \cs{crcr} at the end of a +% table. It is deliberately defined without protection because it +% may get expanded by the scanning mechanism of low-level \TeX{} +% after a final \cs{cr} (aka \verb=\\=) in the table. In that case +% it shouldn't stop the expansion and the conditional inside will +% be false, thus it just vanishes without doing anything. If there +% are missing cells (in which case we also haven't see \cs{cr} yet) +% 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 { + \int_compare:nNnT \g_@@_col_int > 0 + { + \tbl_count_missing_cells:n {#1} + \cr + } +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macrocode} +\ExplSyntaxOff +%<@@=> +% \end{macrocode} +% +% 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}. +% +% TODO: move to right .dtx file +% \begin{macrocode} +\let\@kernel@refstepcounter\refstepcounter +% \end{macrocode} +% Prevent longtable patching by hyperref until hyperref does so automatically: +% \begin{macrocode} +\def\hyper@nopatch@longtable{} +% \end{macrocode} +% +% +% Should there be a module? +% +% \begin{macrocode} +%<latexrelease>\NewModuleRelease{2024/06/01}{lttagging} +%<latexrelease> {Tagging support} +% \end{macrocode} +% +% +% +% +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{0000/00/00}{lttagging}% +%<latexrelease> {Undo tagging support} +%<latexrelease> +%<latexrelease> +%<latexrelease> +%<latexrelease>\EndModuleRelease +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +% \end{macrocode} +% +% \Finale +% diff --git a/macros/latex-dev/base/lttemplates.dtx b/macros/latex-dev/base/lttemplates.dtx new file mode 100644 index 0000000000..844fb6fd34 --- /dev/null +++ b/macros/latex-dev/base/lttemplates.dtx @@ -0,0 +1,2698 @@ +% \iffalse meta-comment +% +% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle +% Copyright (C) 2004-2010 Frank Mittelbach, The LaTeX Project +% Copyright (C) 2011-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 +% +% \iffalse +% +%%% From File: lttemplates.dtx +% +%<*driver> +% \fi +\ProvidesFile{lttemplates.dtx} + [2024-02-11 v1.0a LaTeX Kernel (Prototype document functions)] +% \iffalse +\documentclass{l3doc} +\GetFileInfo{lttemplates.dtx} +\begin{document} + \DocInput{lttemplates.dtx} +\end{document} +%</driver> +% \fi +% +% \title{The \texttt{lttemplates.dtx} code\thanks{This file has version +% \fileversion\ dated \filedate, \copyright\ \LaTeX\ +% Project.}} +% \author{^^A +% Frank Mittelbach, Chris Rowley, David Carlisle, \LaTeX{} Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \maketitle +% +% \section{Introduction} +% +% There are three broad \enquote{layers} between putting down ideas into +% a source file and ending up with a typeset document. These layers of +% document writing are +% \begin{enumerate} +% \item authoring of the text with mark-up; +% \item document layout design; +% \item implementation (with \TeX{} programming) of the design. +% \end{enumerate} +% We write the text as an author, and we see the visual output of the design +% after the document is generated; the \TeX{} implementation in the middle is +% the glue between the two. +% +% \LaTeX{}'s greatest success has been to standardise a system of mark-up that +% balances the trade-off between ease of reading and ease of writing to suit +% almost all forms of technical writing. It's +% other original strength was a good background in typographical design; while +% the standard \LaTeXe{} classes look somewhat dated now in terms of their +% visual design, their typography is generally sound (barring the occasional +% minor faults). +% +% However, \LaTeXe{} has always lacked a standard approach to customising +% the visual design of a document. Changing the looks of the standard classes +% involved either: +% \begin{itemize} +% \item Creating a new version of the implementation code of the class and +% editing it. +% \item Loading one of the many packages to customise certain elements of +% the standard classes. +% \item Loading a completely different document class, such as +% \textsf{KOMA-Script} or \textsf{memoir}, that allows easy customisation. +% \end{itemize} +% All three of these approaches have their drawbacks and learning curves. +% +% The idea behind \pkg{lttemplates} is to cleanly separate the three layers +% introduced at the beginning of this section, so that document authors who +% are not programmers can easily change the design of their documents. +% \pkg{lttemplates} also makes it easier for \LaTeX{} programmers to provide +% their own customisations on top of a pre-existing class. +% +% \section{What is a document?} +% +% Besides the textual content of the words themselves, the source file +% of a document contains mark-up elements that add structure to the +% document. These elements include sectional divisions, figure/table +% captions, lists of various sorts, theorems/proofs, and so on. +% The list will be different for every document that can be written. +% +% Each element can be represented logically without worrying about the +% formatting, with mark-up such as \cs{section}, \cs{caption}, +% |\begin{enumerate}| and so on. The output of each one of these +% document elements will be a typeset representation of the information +% marked up, and the visual arrangement and design of these elements +% can vary widely in producing a variety of desired outcomes. +% +% For each type of document element, there may be design variations that +% contain the same sort of information but present it in slightly +% different ways. For example, the difference between a numbered and an +% unnumbered section, \cs{section} and |\section*|, or the difference +% between an itemised list or an enumerated list. +% +% There are three distinct layers in the definition of +% \enquote{a document} at this level +% \begin{enumerate} +% \item semantic elements such as the ideas of sections and lists; +% \item a set of design solutions for representing these elements +% visually; +% \item specific variations for these designs that represent the +% elements in the document. +% \end{enumerate} +% In the parlance of the template system, these are called types, +% templates, and instances, and they are discussed below in sections +% \ref{sec:types}, \ref{sec:templates}, and~\ref{sec:instances}, +% respectively. +% +% \section {Types, templates, and instances} +% +% By formally declaring documents to be composed of mark-up elements +% grouped into types, which are interpreted and typeset with a set of +% templates, each of which has one or more instances with which to +% compose each and every semantic unit of the text, we can cleanly +% separate the components of document construction. +% +% All of the structures provided by the template system are global, +% and do not respect \TeX{} grouping. +% +% \section{Template types} +% \label{sec:types} +% +% An \emph{template type} (sometimes just \enquote{type}) is an +% abstract idea of a document element that takes a fixed number of +% arguments corresponding to the information from the document author +% that it is representing. A sectioning type, for example, might take +% three inputs: \enquote{title}, \enquote{short title}, and +% \enquote{label}. +% +% Any given document class will define which types are to be +% used in the document, and any template of a given type can be +% used to generate an instance for the type. (Of course, different +% templates will produce different typeset representations, but the +% underlying content will be the same.) +% +% \begin{function}{\NewTemplateType} +% \begin{syntax} +% \cs{NewTemplateType} \Arg{template type} \Arg{no. of args} +% \end{syntax} +% This function defines an \meta{template type} taking +% \meta{number of arguments}, where the \meta{type} is an +% abstraction as discussed above. For example, +% \begin{verbatim} +% \NewTemplateType{sectioning}{3} +% \end{verbatim} +% creates a type \enquote{sectioning}, where each use of that +% type will need three arguments. +% \end{function} +% +% \section{Templates} +% \label{sec:templates} +% +% A \emph{template} is a generalised design solution for representing +% the information of a specified type. Templates that do the same +% thing, but in different ways, are grouped together by their type +% and given separate names. There are two important parts to a template: +% \begin{itemize} +% \item the parameters it takes to vary the design it is producing; +% \item the implementation of the design. +% \end{itemize} +% As a document author or designer does not care about the +% implementation but rather only the interface to the template, these two +% aspects of the template definition are split into two independent +% declarations, \cs{DeclareTemplateInterface} and +% \cs{DeclareTemplateCode}. +% +% \begin{function}{\DeclareTemplateInterface} +% \begin{syntax} +% \cs{DeclareTemplateInterface} +% ~~\Arg{type} \Arg{template} \Arg{no.~of args} +% ~~\Arg{key list} +% \end{syntax} +% A \meta{template} interface is declared for a particular +% \meta{type}, where the \meta{number of arguments} must +% agree with the type declaration. The interface itself is +% defined by the \meta{key list}, which is itself a key--value list +% taking a specialized format: +% \begin{quotation} +% \obeylines +% \noindent +% \meta{key1}~":"~\meta{key type1}~"," +% \meta{key2}~":"~\meta{key type2}~"," +% \meta{key3}~":"~\meta{key type3}~"="~\meta{default3}~"," +% \meta{key4}~":"~\meta{key type4}~"="~\meta{default4}~"," +% \ldots +% \end{quotation} +% Each \meta{key} name should consist of \textsc{ascii} characters, +% with the exception of |,|, |=| and \verb*| |. The recommended form +% for key names is to use lower case letters, with dashes to separate +% out different parts. Spaces are ignored in key names, so they can be +% included or missed out at will. Each \meta{key} must have a +% \meta{key type}, which defined the type of input that the \meta{key} +% requires. A full list of key types is given in +% Table~\ref{tab:key-types}. Each key may have a \meta{default} +% value, which will be used in by the template if the \meta{key} is +% not set explicitly. The \meta{default} should be of the correct +% form to be accepted by the \meta{key type} of the \meta{key}: this +% is not checked by the code. +% \end{function} +% +% \begin{table} +% \centering +% \begin{tabular}{>{\ttfamily}ll} +% \toprule +% \multicolumn{1}{l}{Key-type} & Description of input \\ +% \midrule +% boolean & \texttt{true} or \texttt{false} \\ +% choice\Arg{choices} +% & A list of pre-defined \meta{choices} \\ +% commalist & A comma-separated list \\ +% function\Arg{$N$} +% & A function definition with $N$ arguments +% ($N$ from $0$ to $9$) \\ +% instance\Arg{name} +% & An instance of type \meta{name} \\ +% integer & An integer or integer expression \\ +% length & A fixed length \\ +% muskip & A math length with shrink and stretch components \\ +% real & A real (floating point) value \\ +% skip & A length with shrink and stretch components \\ +% tokenlist & A token list: any text or commands \\ +% \bottomrule +% \end{tabular} +% \caption{Key-types for defining template interfaces with +% \cs{DeclareTemplateInterface}.} +% \label{tab:key-types} +% \end{table} +% +% \begin{function}{\KeyValue} +% \begin{syntax} +% \cs{KeyValue} \Arg{key name} +% \end{syntax} +% There are occasions where the default (or value) for one key +% should be taken from another. The \cs{KeyValue} function can be +% used to transfer this information without needing to know the +% internal implementation of the key: +% \begin{verbatim} +% \DeclareTemplateInterface { type } { template } { no. of args } +% { +% key-name-1 : key-type = value , +% key-name-2 : key-type = \KeyValue { key-name-1 }, +% ... +% } +% \end{verbatim} +% \end{function} +% +% \begin{function}{\DeclareTemplateCode} +% \begin{syntax} +% \cs{DeclareTemplateCode} +% ~~\Arg{type} \Arg{template} \Arg{no.~of args} +% ~~\Arg{key bindings} \Arg{code} +% \end{syntax} +% The relationship between a templates keys and the internal +% implementation is created using the \cs{DeclareTemplateCode} +% function. As with \cs{DeclareTemplateInterface}, the +% \meta{template} name is given along with the \meta{type} +% and \meta{number of arguments} required. The \meta{key bindings} +% argument is a key--value list which specifies the relationship +% between each \meta{key} of the template interface with an +% underlying\meta{variable}. +% +% \begin{quotation} +% \obeylines +% \noindent +% \meta{key1}~"="~\meta{variable1}, +% \meta{key2}~"="~\meta{variable2}, +% \meta{key3}~"="~global~\meta{variable3}, +% \meta{key4}~"="~global~\meta{variable4}, +% \ldots +% \end{quotation} +% With the exception of the choice, code and function key types, +% the \meta{variable} here should be the name of an existing +% \LaTeX3 register. As illustrated, the key word \enquote{global} +% may be included in the listing to indicate that the \meta{variable} +% should be assigned globally. A full list of variable bindings is +% given in Table~\ref{tab:key-vars}. +% +% The \meta{code} argument of \cs{DeclareTemplateCode} is used +% as the replacement text for the template when it is used, either +% directly or as an instance. This may therefore accept arguments +% |#1|, |#2|, \emph{etc}.~as detailed by the \meta{number of arguments} +% taken by the type. +% \end{function} +% +% \begin{table} +% \centering +% \begin{tabular}{>{\ttfamily}ll} +% \toprule +% \multicolumn{1}{l}{Key-type} & Description of binding \\ +% \midrule +% boolean & Boolean variable, \emph{e.g}.~\cs{l_tmpa_bool} \\ +% choice +% & List of choice implementations +% (see Section~\ref{sec:choices-key}) \\ +% commalist & Comma list, \emph{e.g}.~\cs{l_tmpa_clist} \\ +% function +% & Function taking $N$ arguments, \emph{e.g}.~\cs{use_i:nn} \\ +% instance \\ +% integer & Integer variable, \emph{e.g}.~\cs{l_tmpa_int} \\ +% length & Dimension variable, \emph{e.g}.~\cs{l_tmpa_dim} \\ +% muskip & Muskip variable, \emph{e.g}.~\cs{l_tmpa_muskip} \\ +% real & Floating-point variable, \emph{e.g}.~\cs{l_tmpa_fp} \\ +% skip & Skip variable, \emph{e.g}.~\cs{l_tmpa_skip} \\ +% tokenlist & Token list variable, \emph{e.g}.~\cs{l_tmpa_tl} \\ +% \bottomrule +% \end{tabular} +% \caption{Bindings required for different key types when defining +% template implementations with \cs{DeclareTemplateCode}. Apart +% from \texttt{code}, \texttt{choice} and \texttt{function} +% all of these accept the key word \texttt{global} to carry +% out a global assignment.} +% \label{tab:key-vars} +% \end{table} +% +% \begin{function}{\AssignTemplateKeys} +% \begin{syntax} +% \cs{AssignTemplateKeys} +% \end{syntax} +% In the final argument of \cs{DeclareTemplateCode} the assignment of +% keys defined by the template may be delayed by including the command +% \cs{AssignTemplateKeys}. If this is \emph{not} present, keys are assigned +% immediately before the template code. If \cs{AssignTemplateKeys} is +% present, assignment is delayed until this point. Note that the +% command must be \emph{directly} present in the code, not placed +% within a nested command/macro. +% \end{function} +% +% \begin{function}{\DeclareTemplateCopy} +% \begin{syntax} +% \cs{DeclareTemplateCopy} +% ~~\Arg{type} \Arg{template2} \Arg{template1} +% \end{syntax} +% Copies \meta{template1} of \meta{type} to a new name \meta{template2}: +% the copy can then be edited independent of teh original. +% \end{function} +% +% \section{Multiple choices} +% \label{sec:choices-key} +% +% The \texttt{choice} key type implements multiple choice input. At the +% interface level, only the list of valid choices is needed: +% \begin{verbatim} +% \DeclareTemplateInterface { foo } { bar } { 0 } +% { key-name : choice { A, B, C } } +% \end{verbatim} +% where the choices are given as a comma-list (which must therefore +% be wrapped in braces). A default value can also be given: +% \begin{verbatim} +% \DeclareTemplateInterface { foo } { bar } { 0 } +% { key-name : choice { A, B, C } = A } +% \end{verbatim} +% +% At the implementation level, each choice is associated with code, +% using a nested key--value list. +% \begin{verbatim} +% \DeclareTemplateCode { foo } { bar } { 0 } +% { +% key-name = +% { +% A = Code-A , +% B = Code-B , +% C = Code-C +% } +% } +% { ... } +% \end{verbatim} +% The two choice lists should match, but in the implementation a +% special \texttt{unknown} choice is also available. This can be used +% to ignore values and implement an \enquote{else} branch: +% \begin{verbatim} +% \DeclareTemplateCode { foo } { bar } { 0 } +% { +% key-name = +% { +% A = Code-A , +% B = Code-B , +% C = Code-C , +% unknown = Else-code +% } +% } +% { ... } +% \end{verbatim} +% The \texttt{unknown} entry must be the last one given, and should +% \emph{not} be listed in the interface part of the template. +% +% For keys which accept the values \texttt{true} and \texttt{false} +% both the boolean and choice key types can be used. As template +% interfaces are intended to prompt clarity at the design level, the +% boolean key type should be favoured, with the choice type reserved +% for keys which take arbitrary values. +% +% \section{Instances} +% \label{sec:instances} +% +% After a template is defined it still needs to be put to use. The +% parameters that it expects need to be defined before it can be used in +% a document. Every time a template has parameters given to it, an +% \emph{instance} is created, and this is the code that ends up in the +% document to perform the typesetting of whatever pieces of information +% are input into it. +% +% For example, a template might say \enquote{here is a section with or +% without a number that might be centred or left aligned and print its +% contents in a certain font of a certain size, with a bit of a gap +% before and after it} whereas an instance declares \enquote{this is a +% section with a number, which is centred and set in $12\,\text{pt}$ +% italic with a $10\,\text{pt}$ skip before and a +% $12\,\text{pt}$ skip after it}. Therefore, an instance is just a +% frozen version of a template with specific settings as chosen by the +% designer. +% +% \begin{function}{\DeclareInstance} +% \begin{syntax} +% \cs{DeclareInstance} +% ~~\Arg{type} \Arg{instance} \Arg{template} \Arg{parameters} +% \end{syntax} +% This function uses a \meta{template} for an \meta{type} +% to create an \meta{instance}. The \meta{instance} will be set +% up using the \meta{parameters}, which will set some of the +% \meta{keys} in the \meta{template}. +% +% As a practical example, consider a type for document sections +% (which might include chapters, parts, sections, \emph{etc}.), which +% is called \texttt{sectioning}. One possible template for this +% type might be called \texttt{basic}, and one instance of this +% template would be a numbered section. The instance declaration might +% read: +% \begin{verbatim} +% \DeclareInstance { sectioning } { section-num } { basic } +% { +% numbered = true , +% justification = center , +% font =\normalsize\itshape , +% before-skip = 10pt , +% after-skip = 12pt , +% } +% \end{verbatim} +% Of course, the key names here are entirely imaginary, but illustrate +% the general idea of fixing some settings. +% \end{function} +% +% \begin{function}{\IfInstanceExistT, \IfInstanceExistF, \IfInstanceExistTF} +% \begin{syntax} +% \cs{IfInstanceExistTF} \Arg{type} \Arg{instance} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests if the named \meta{instance} of a \meta{type} exists, and +% then inserts the appropriate code into the input stream. +% \end{function} +% +% \begin{function}{\DeclareInstanceCopy} +% \begin{syntax} +% \cs{DeclareInstanceCopy} +% ~~\Arg{type} \Arg{instance2} \Arg{instance1} +% \end{syntax} +% Copies the \meta{values} for \meta{instance1} for an +% \meta{type} to \meta{instance2}. +% \end{function} +% +% \section{Document interface} +% +% After the instances have been chosen, document commands must be +% declared to use those instances in the document. \cs{UseInstance} +% calls instances directly, and this command should be used internally +% in document-level mark-up. +% +% \begin{function}{\UseInstance} +% \begin{syntax} +% \cs{UseInstance} +% ~~\Arg{type} \Arg{instance} \meta{arguments} +% \end{syntax} +% Uses an \meta{instance} of the \meta{type}, which will require +% \meta{arguments} as determined by the number specified for the +% \meta{type}. The \meta{instance} must have been declared +% before it can be used, otherwise an error is raised. +% \end{function} +% +% \begin{function}{\UseTemplate} +% \begin{syntax} +% \cs{UseTemplate} \Arg{type} \Arg{template} +% ~~\Arg{settings} \meta{arguments} +% \end{syntax} +% Uses the \meta{template} of the specified \meta{type}, +% applying the \meta{settings} and absorbing \meta{arguments} as +% detailed by the \meta{type} declaration. This in effect +% is the same as creating an instance using \cs{DeclareInstance} +% and immediately using it with \cs{UseInstance}, but without the +% instance having any further existence. It is therefore useful where +% a template needs to be used once. +% +% This function can also be used as the argument to \texttt{instance} +% key types: +% \begin{verbatim} +% \DeclareInstance { type } { template } { instance } +% { +% instance-key = +% \UseTemplate { type2 } { template2 } { <settings> } +% } +% \end{verbatim} +% \end{function} +% +% \section{Changing existing definitions} +% +% Template parameters may be assigned specific defaults for instances +% to use if the instance declaration doesn't explicit set those +% parameters. In some cases, the document designer will wish to edit +% these defaults to allow them to \enquote{cascade} to the instances. +% The alternative would be to set each parameter identically for each +% instance declaration, a tedious and error-prone process. +% +% \begin{function}{\EditTemplateDefaults} +% \begin{syntax} +% \cs{EditTemplateDefaults} +% ~~\Arg{type} \Arg{template} \Arg{new defaults} +% \end{syntax} +% Edits the \meta{defaults} for a \meta{template} for an +% \meta{type}. The \meta{new defaults}, given as a key--value +% list, replace the existing defaults for the \meta{template}. This +% means that the change will apply to instances declared after the +% editing, but that instances which have already been created are +% unaffected. +% \end{function} +% +% \begin{function}{\EditInstance} +% \begin{syntax} +% \cs{EditInstance} +% ~~\Arg{type} \Arg{instance} \Arg{new values} +% \end{syntax} +% Edits the \meta{values} for an \meta{instance} for an +% \meta{type}. The \meta{new values}, given as a key--value +% list, replace the existing values for the \meta{instance}. This +% function is complementary to \cs{EditTemplateDefaults}: +% \cs{EditInstance} changes a single instance while leaving the +% template untouched. +% \end{function} +% +% \section{\emph{Ad hoc} adjustment of templates} +% +% \begin{function}{\SetTemplateKeys} +% \begin{syntax} +% \cs{SetTemplateKeys} \Arg{type} \Arg{template} \Arg{keyvals} +% \end{syntax} +% At point of use it may be useful to apply changed to individual instances. +% This is supported as each template key is made available for adjustment +% using \cs{SetTemplateKeys}. +% \end{function} +% +% For example, after +% \begin{verbatim} +% \NewTypeType{MyObj}{0} +% \DeclareTemplateInterface{MyObj}{TemplateA}{0} +% { +% akey: tokenlist , +% bkey: function{2} +% } +% \DeclareTemplateCode{MyObj}{TemplateA}{0} +% { +% akey = SomeTokens , +% bkey = \func:nn , +% } +% \end{verbatim} +% the template keys could be adjusted in an \emph{ad hoc} fashion using +% \begin{verbatim} +% \SetTemplateKeys{MyObj}{TemplateA} +% { +% akey = OtherTokens , +% bkey = \AltFunc:nn +% } +% \end{verbatim} +% +% \section{Getting information about templates and instances} +% +% \begin{function}{\ShowInstanceValues} +% \begin{syntax} +% \cs{ShowInstanceValues} \Arg{type} \Arg{instance} +% \end{syntax} +% Shows the \meta{values} for an \meta{instance} of the given +% \meta{type} at the terminal. +% \end{function} +% +% \begin{function}{\ShowTemplateCode} +% \begin{syntax} +% \cs{ShowTemplateCode} \Arg{type} \Arg{template} +% \end{syntax} +% Shows the \meta{code} of a \meta{template} for an \meta{type} +% in the terminal. +% \end{function} +% +% \begin{function}{\ShowTemplateDefaults} +% \begin{syntax} +% \cs{ShowTemplateDefaults} \Arg{type} \Arg{template} +% \end{syntax} +% Shows the \meta{default} values of a \meta{template} for an +% \meta{type} in the terminal. +% \end{function} +% +% \begin{function}{\ShowTemplateInterface} +% \begin{syntax} +% \cs{ShowTemplateInterface} \Arg{type} \Arg{template} +% \end{syntax} +% Shows the \meta{keys} and associated \meta{key types} of a +% \meta{template} for an \meta{type} in the terminal. +% \end{function} +% +% \begin{function}{\ShowTemplateVariables} +% \begin{syntax} +% \cs{ShowTemplateVariables} \Arg{type} \Arg{template} +% \end{syntax} +% Shows the \meta{variables} and associated \meta{keys} of a +% \meta{template} for an \meta{type} in the terminal. Note that +% \texttt{code} and \texttt{choice} keys do not map directly to variables +% but to arbitrary code. For \texttt{choice} keys, each valid choice +% is shown as a separate entry in the list, with the key name and choice +% separated by a space, for example +% \begin{verbatim} +% Template 'example' of type 'example' has variable mapping: +% > demo unknown => \def \demo {?} +% > demo c => \def \demo {c} +% > demo b => \def \demo {b} +% > demo a => \def \demo {a}. +% \end{verbatim} +% would be shown for a choice key \texttt{demo} with valid choices +% \texttt{a}, \texttt{b} and \texttt{c}, plus code for an \texttt{unknown} +% branch. +% \end{function} +% +% \MaybeStop{\setlength\IndexMin{200pt}\PrintIndex} +% +% \section{The implementation} +% +% \begin{macrocode} +%<@@=template> +% \end{macrocode} +% +% \begin{macrocode} +%<*2ekernel> +\message{templates,} +%</2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +%<*2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +\ExplSyntaxOn +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\NewModuleRelease{2024/06/01}{lttemplates} +%<latexrelease> {Prototype~document~commands}% +% \end{macrocode} +% +% \subsection{Variables and constants} +% +% \begin{variable} +% { +% \c_@@_code_root_tl , +% \c_@@_defaults_root_tl , +% \c_@@_instances_root_tl , +% \c_@@_keytypes_root_tl , +% \c_@@_key_order_root_tl , +% \c_@@_restrict_root_tl , +% \c_@@_values_root_tl , +% \c_@@_vars_root_tl +% } +% So that literal values are kept to a minimum. +% \begin{macrocode} +\tl_const:Nn \c_@@_code_root_tl { template~code~>~ } +\tl_const:Nn \c_@@_defaults_root_tl { template~defaults~>~ } +\tl_const:Nn \c_@@_instances_root_tl { template~instance~>~ } +\tl_const:Nn \c_@@_keytypes_root_tl { template~key~types~>~ } +\tl_const:Nn \c_@@_key_order_root_tl { template~key~order~>~ } +\tl_const:Nn \c_@@_values_root_tl { template~values~>~ } +\tl_const:Nn \c_@@_vars_root_tl { template~vars~>~ } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\c_@@_keytypes_arg_seq} +% A list of keytypes which also need additional data (an argument), +% used to parse the keytype correctly. +% \begin{macrocode} +\seq_const_from_clist:Nn \c_@@_keytypes_arg_seq + { choice , function , instance } +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_@@_type_prop} +% For storing types and the associated number of arguments. +% \begin{macrocode} +\prop_new:N \g_@@_type_prop +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_assignments_tl} +% When creating an instance, the assigned values are collected here. +% \begin{macrocode} +\tl_new:N \l_@@_assignments_tl +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\l_@@_default_tl} +% The default value for a key is recovered here from the property list +% in which it is stored. +% \begin{macrocode} +\tl_new:N \l_@@_default_tl +% \end{macrocode} +%\ end{macro} +% +% \begin{variable}{\l_@@_error_bool} +% A flag for errors to be carried forward. +% \begin{macrocode} +\bool_new:N \l_@@_error_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l_@@_global_bool} +% Used to indicate that assignments should be global. +% \begin{macrocode} +\bool_new:N \l_@@_global_bool +% \end{macrocode} +% \end{variable} +% +% \begin{variable} +% { +% \l_@@_key_name_tl , +% \l_@@_keytype_tl , +% \l_@@_keytype_arg_tl , +% \l_@@_value_tl , +% \l_@@_var_tl +% } +% When defining each key in a template, the name and type of the key +% need to be separated and stored. Any argument needed by the +% keytype is also stored separately. +% \begin{macrocode} +\tl_new:N \l_@@_key_name_tl +\tl_new:N \l_@@_keytype_tl +\tl_new:N \l_@@_keytype_arg_tl +\tl_new:N \l_@@_value_tl +\tl_new:N \l_@@_var_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable} +% { +% \l_@@_keytypes_prop , +% \l_@@_key_order_seq , +% \l_@@_values_prop , +% \l_@@_vars_prop +% } +% To avoid needing too many difficult-to-follow csname assignments, +% various scratch token registers are used to build up data, which is +% then transferred +% \begin{macrocode} +\prop_new:N \l_@@_keytypes_prop +\seq_new:N \l_@@_key_order_seq +\prop_new:N \l_@@_values_prop +\prop_new:N \l_@@_vars_prop +% \end{macrocode} +% \end{variable} +% +% \begin{variable} +% { +% \l_@@_tmp_clist , +% \l_@@_tmp_dim , +% \l_@@_tmp_int , +% \l_@@_tmp_muskip , +% \l_@@_tmp_skip , +% \l_@@_tmp_tl +% } +% Scratch space. +% \begin{macrocode} +\clist_new:N \l_@@_tmp_clist +\dim_new:N \l_@@_tmp_dim +\int_new:N \l_@@_tmp_int +\muskip_new:N \l_@@_tmp_muskip +\skip_new:N \l_@@_tmp_skip +\tl_new:N \l_@@_tmp_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\s_@@_mark, \s_@@_stop} +% Internal scan marks. +% \begin{macrocode} +\scan_new:N \s_@@_mark +\scan_new:N \s_@@_stop +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\q_@@_nil} +% Internal quarks. +% \begin{macrocode} +\quark_new:N \q_@@_nil +% \end{macrocode} +% \end{variable} +% +% \begin{macro}[pTF]{\@@_quark_if_nil:n} +% Branching quark conditional. +% \begin{macrocode} +\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:N { F } +% \end{macrocode} +% \end{macro} +% +% \subsection{Testing existence and validity} +% +% There are a number of checks needed for either the existence of +% a type, template or instance. There are also some for the +% validity of a particular call. All of these are collected up here. +% +% \begin{macro}{\@@_execute_if_arg_agree:nnT} +% A test agreement between the number of arguments for the template +% type and that specified when creating a template. This is not done as a +% separate conditional for efficiency and better error message +% \begin{macrocode} +\cs_new_protected:Npn \@@_execute_if_arg_agree:nnT #1#2#3 + { + \prop_get:NnN \g_@@_type_prop {#1} \l_@@_tmp_tl + \int_compare:nNnTF {#2} = \l_@@_tmp_tl + {#3} + { + \msg_error:nneee { template } { argument-number-mismatch } + {#1} { \l_@@_tmp_tl } {#2} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_execute_if_code_exist:nnT} +% A template is only fully declared if the code has been set up, +% which can be checked by looking for the template function itself. +% \begin{macrocode} +\cs_new_protected:Npn \@@_execute_if_code_exist:nnT #1#2#3 + { + \cs_if_exist:cTF { \c_@@_code_root_tl #1 / #2 } + {#3} + { \msg_error:nnnn { template } { no-template-code } {#1} {#2} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% {\@@_execute_if_keytype_exist:nT, \@@_execute_if_keytype_exist:VT} +% The test for valid keytypes looks for a function to set up the key, +% which is part of the \enquote{code} side of the template definition. +% This avoids having different lists for the two parts of the process. +% \begin{macrocode} +\cs_new_protected:Npn \@@_execute_if_keytype_exist:nT #1#2 + { + \cs_if_exist:cTF { @@_store_value_ #1 :n } + {#2} + { \msg_error:nnn { template } { unknown-keytype } {#1} } + } +\cs_generate_variant:Nn \@@_execute_if_keytype_exist:nT { V } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_execute_if_type_exist:nT} +% To check that a particular type is valid. +% \begin{macrocode} +\cs_new_protected:Npn \@@_execute_if_type_exist:nT #1#2 + { + \prop_if_in:NnTF \g_@@_type_prop {#1} + {#2} + { \msg_error:nnn { template } { unknown-type } {#1} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_execute_if_keys_exist:nnT} +% To check that the keys for a template have been set up before trying +% to create any code, a simple check for the correctly-named keytype +% property list. +% \begin{macrocode} +\cs_new_protected:Npn \@@_if_keys_exist:nnT #1#2#3 + { + \cs_if_exist:cTF { \c_@@_keytypes_root_tl #1 / #2 } + {#3} + { \msg_error:nnnn { template } { unknown-template } {#1} {#2} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[TF]{\@@_if_key_value:n, \@@_if_key_value:V} +% Tests for the first token in a string being \cs{KeyValue}. +% \begin{macrocode} +\prg_new_conditional:Npnn \@@_if_key_value:n #1 { T , F , TF } + { + \str_if_eq:noTF { \KeyValue } { \tl_head:w #1 \q_nil \q_stop } + \prg_return_true: + \prg_return_false: + } +\prg_generate_conditional_variant:Nnn \@@_if_key_value:n { V } { T , F , TF } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[TF]{\@@_if_instance_exist:nn} +% Testing for an instance +% \begin{macrocode} +\prg_new_conditional:Npnn \@@_if_instance_exist:nn #1#2 { T, F, TF } + { + \cs_if_exist:cTF { \c_@@_instances_root_tl #1 / #2 } + \prg_return_true: + \prg_return_false: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_if_use_template:nTF} +% Tests for the first token in a string being \cs{UseTemplate}. +% \begin{macrocode} +\prg_new_conditional:Npnn \@@_if_use_template:n #1 { TF } + { + \str_if_eq:noTF { \UseTemplate } { \tl_head:w #1 \q_nil \q_stop } + \prg_return_true: + \prg_return_false: +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Saving and recovering property lists} +% +% The various property lists for templates have to be shuffled in +% and out of storage. +% +% \begin{macro} +% { +% \@@_store_defaults:nn , +% \@@_store_keytypes:nn , +% \@@_store_values:nn , +% \@@_store_vars:nn +% } +% The defaults and keytypes are transferred from the scratch property +% lists to the \enquote{proper} lists for the template being created. +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_defaults:nn #1#2 + { + \debug_suspend: + \prop_gclear_new:c { \c_@@_defaults_root_tl #1 / #2 } + \prop_gset_eq:cN { \c_@@_defaults_root_tl #1 / #2 } + \l_@@_values_prop + \debug_resume: + } +\cs_new_protected:Npn \@@_store_keytypes:nn #1#2 + { + \debug_suspend: + \prop_if_exist:cTF { \c_@@_keytypes_root_tl #1 / #2 } + { + \msg_info:nnnn { template } { declare-template-interface } {#1} {#2} + \prop_gclear:c { \c_@@_keytypes_root_tl #1 / #2 } + } + { \prop_new:c { \c_@@_keytypes_root_tl #1 / #2 } } + \prop_gset_eq:cN { \c_@@_keytypes_root_tl #1 / #2 } + \l_@@_keytypes_prop + \seq_gclear_new:c { \c_@@_key_order_root_tl #1 / #2 } + \seq_gset_eq:cN { \c_@@_key_order_root_tl #1 / #2 } + \l_@@_key_order_seq + \debug_resume: + } +\cs_new_protected:Npn \@@_store_values:nn #1#2 + { + \debug_suspend: + \prop_clear_new:c { \c_@@_values_root_tl #1 / #2 } + \prop_set_eq:cN { \c_@@_values_root_tl #1 / #2 } + \l_@@_values_prop + \debug_resume: + } +\cs_new_protected:Npn \@@_store_vars:nn #1#2 + { + \debug_suspend: + \prop_gclear_new:c { \c_@@_vars_root_tl #1 / #2 } + \prop_gset_eq:cN { \c_@@_vars_root_tl #1 / #2 } + \l_@@_vars_prop + \debug_resume: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { +% \@@_recover_defaults:nn , +% \@@_recover_keytypes:nn , +% \@@_recover_values:nn , +% \@@_recover_vars:nn +% } +% Recovering the stored data for a template is rather less complex +% than storing it. All that happens is the data is transferred from +% the permanent to the scratch storage. However, we need to check the +% scratch storage does exist. +% \begin{macrocode} +\cs_new_protected:Npn \@@_recover_defaults:nn #1#2 + { + \prop_if_exist:cTF + { \c_@@_defaults_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l_@@_values_prop + { \c_@@_defaults_root_tl #1 / #2 } + } + { \prop_clear:N \l_@@_values_prop } + } +\cs_new_protected:Npn \@@_recover_keytypes:nn #1#2 + { + \prop_if_exist:cTF + { \c_@@_keytypes_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l_@@_keytypes_prop + { \c_@@_keytypes_root_tl #1 / #2 } + } + { \prop_clear:N \l_@@_keytypes_prop } + \seq_if_exist:cTF { \c_@@_key_order_root_tl #1 / #2 } + { + \seq_set_eq:Nc \l_@@_key_order_seq + { \c_@@_key_order_root_tl #1 / #2 } + } + { \seq_clear:N \l_@@_key_order_seq } + } +\cs_new_protected:Npn \@@_recover_values:nn #1#2 + { + \prop_if_exist:cTF + { \c_@@_values_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l_@@_values_prop + { \c_@@_values_root_tl #1 / #2 } + } + { \prop_clear:N \l_@@_values_prop } + } +\cs_new_protected:Npn \@@_recover_vars:nn #1#2 + { + \prop_if_exist:cTF + { \c_@@_vars_root_tl #1 / #2 } + { + \prop_set_eq:Nc \l_@@_vars_prop + { \c_@@_vars_root_tl #1 / #2 } + } + { \prop_clear:N \l_@@_vars_prop } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Creating new template types} +% +% \begin{macro}{\@@_define_type:nn, \@@_declare_type:nn} +% Although the type is the \enquote{top level} of the template +% system, it is actually very easy to implement. All that happens is that +% the number of arguments required is recorded, indexed by the name of the +% type. +% \begin{macrocode} +\cs_new_protected:Npn \@@_define_type:nn #1#2 + { + \prop_if_in:NnTF \g_@@_type_prop {#1} + { \msg_error:nnn { template } { type-already-defined } {#1} } + { \@@_declare_type:nn {#1} {#2} } + } +\cs_new_protected:Npn \@@_declare_type:nn #1#2 + { + \int_set:Nn \l_@@_tmp_int {#2} + \int_compare:nTF { 0 <= \l_@@_tmp_int <= 9 } + { + \msg_info:nnnV { template } { declare-type } + {#1} \l_@@_tmp_int + \prop_gput:NnV \g_@@_type_prop {#1} + \l_@@_tmp_int + } + { + \msg_error:nnnV { template } { bad-number-of-arguments } + {#1} \l_@@_tmp_int + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Design part of template declaration} +% +% The \enquote{design} part of a template declaration defines the general +% behaviour of each key, and possibly a default value. However, it does +% not include the implementation. This means that what happens here is +% the two properties are saved to appropriate lists, which can then +% be used later to recover the information when implementing the keys. +% +% \begin{macro}{\@@_declare_template_keys:nnnn} +% The main function for the \enquote{design} part of creating a template +% starts by checking that the type exists and that the number of +% arguments required agree. If that is all fine, then the two storage +% areas for defaults and keytypes are initialised. The mechanism is then +% set up for the \pkg{l3keys} module to actually parse the keys. +% Finally, the code hands of to the storage routine to save the parsed +% information properly. +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_template_keys:nnnn #1#2#3#4 + { + \@@_execute_if_type_exist:nT {#1} + { + \@@_execute_if_arg_agree:nnT {#1} {#3} + { + \prop_clear:N \l_@@_values_prop + \prop_clear:N \l_@@_keytypes_prop + \seq_clear:N \l_@@_key_order_seq + \keyval_parse:NNn + \@@_parse_keys_elt:n \@@_parse_keys_elt:nn {#4} + \@@_store_defaults:nn {#1} {#2} + \@@_store_keytypes:nn {#1} {#2} + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_keys_elt:n} +% \begin{macro}{\@@_parse_keys_elt_aux:n} +% \begin{macro}{\@@_parse_keys_elt_aux:} +% Processing the key part of the key--value pair is always carried out +% using this function, even if a value was found. First, the key name +% is separated from the keytype, and if necessary the keytype is +% separated into two parts. This information is then used to check that +% the keytype is valid, before storing the keytype (plus argument if +% necessary) as a property of the key name. The key name is also stored +% (in braces) in the token list to record the order the keys are defined +% in. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_keys_elt:n #1 + { + \@@_split_keytype:n {#1} + \bool_if:NF \l_@@_error_bool + { + \@@_execute_if_keytype_exist:VT \l_@@_keytype_tl + { + \seq_map_function:NN \c_@@_keytypes_arg_seq + \@@_parse_keys_elt_aux:n + \bool_if:NF \l_@@_error_bool + { + \seq_if_in:NoTF \l_@@_key_order_seq + \l_@@_key_name_tl + { + \msg_error:nnV { template } { duplicate-key-interface } + \l_@@_key_name_tl + } + { \@@_parse_keys_elt_aux: } + } + } + } + } +\cs_new_protected:Npn \@@_parse_keys_elt_aux:n #1 + { + \str_if_eq:VnT \l_@@_keytype_tl {#1} + { + \tl_if_empty:NT \l_@@_keytype_arg_tl + { + \msg_error:nnn { template } { keytype-requires-argument } {#1} + \bool_set_true:N \l_@@_error_bool + \seq_map_break: + } + } + } +\cs_new_protected:Npn \@@_parse_keys_elt_aux: + { + \tl_set:Ne \l_@@_tmp_tl + { + \l_@@_keytype_tl + \tl_if_empty:NF \l_@@_keytype_arg_tl + { { \l_@@_keytype_arg_tl } } + } + \prop_put:NVV \l_@@_keytypes_prop \l_@@_key_name_tl + \l_@@_tmp_tl + \seq_put_right:NV \l_@@_key_order_seq \l_@@_key_name_tl + \str_if_eq:VnT \l_@@_keytype_tl { choice } + { + \clist_if_in:NnT \l_@@_keytype_arg_tl { unknown } + { \msg_error:nn { template } { choice-unknown-reserved } } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_parse_keys_elt:nn} +% For keys which have a default, the keytype and key name are first +% separated out by the \cs{@@_parse_keys_elt:n} +% routine, before storing the default value in the scratch property list. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_keys_elt:nn #1#2 + { + \@@_parse_keys_elt:n {#1} + \use:c { @@_store_value_ \l_@@_keytype_tl :n } {#2} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_split_keytype:n} +% \begin{macro}{\@@_split_keytype_aux:w} +% The keytype and key name should be separated by |:|. As the +% definition might be given inside or outside of a code block, +% the category code of colons is standardised. After +% that, the standard delimited argument method is used to separate the +% two parts. +% \begin{macrocode} +\cs_new_protected:Npe \@@_split_keytype:n #1 + { + \exp_not:N \bool_set_false:N \exp_not:N \l_@@_error_bool + \tl_set:Nn \exp_not:N \l_@@_tmp_tl {#1} + \tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl { : } { \token_to_str:N : } + \tl_if_in:VnTF \exp_not:N \l_@@_tmp_tl { \token_to_str:N : } + { + \exp_not:n + { + \tl_clear:N \l_@@_key_name_tl + \exp_after:wN \@@_split_keytype_aux:w + \l_@@_tmp_tl \s_@@_stop + } + } + { + \exp_not:N \bool_set_true:N \exp_not:N \l_@@_error_bool + \msg_error:nnn { template } { missing-keytype } {#1} + } + } +\use:e + { + \cs_new_protected:Npn \exp_not:N \@@_split_keytype_aux:w + #1 \token_to_str:N : #2 \s_@@_stop + { + \tl_put_right:Ne \exp_not:N \l_@@_key_name_tl + { + \exp_not:N \tl_trim_spaces:e + { \exp_not:N \tl_to_str:n {#1} } + } + \tl_if_in:nnTF {#2} { \token_to_str:N : } + { + \tl_put_right:Nn \exp_not:N \l_@@_key_name_tl + { \token_to_str:N : } + \exp_not:N \@@_split_keytype_aux:w #2 \s_@@_stop + } + { + \exp_not:N \tl_if_empty:NTF \exp_not:N \l_@@_key_name_tl + { + \msg_error:nnn { template } { empty-key-name } + { \token_to_str:N : #2 } + } + { \exp_not:N \@@_split_keytype_arg:n {#2} } + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_split_keytype_arg:n, \@@_split_keytype_arg:V} +% \begin{macro}{\@@_split_keytype_arg_aux:n} +% \begin{macro}{\@@_split_keytype_arg_aux:w} +% The second stage of sorting out the keytype is to check for an +% argument. As there is no convenient delimiting token to look for, +% a check is made instead for each possible text value for the keytype. +% To keep things faster, this only involves the keytypes that need an +% argument. If a match is made, then a check is also needed to see that +% it is at the start of the keytype information. All being well, the +% split can then be applied. Any non-matching keytypes are assumed to +% be \enquote{correct} as given, and are left alone (this is checked by +% other code). +% \begin{macrocode} +\cs_new_protected:Npn \@@_split_keytype_arg:n #1 + { + \tl_set:Ne \l_@@_keytype_tl { \tl_trim_spaces:n {#1} } + \tl_clear:N \l_@@_keytype_arg_tl + \cs_set_protected:Npn \@@_split_keytype_arg_aux:n ##1 + { + \tl_if_in:nnT {#1} {##1} + { + \cs_set:Npn \@@_split_keytype_arg_aux:w + ####1 ##1 ####2 \s_@@_stop + { + \tl_if_blank:nT {####1} + { + \tl_set:Ne \l_@@_keytype_tl + { \tl_trim_spaces:n {##1} } + \tl_if_blank:nF {####2} + { + \tl_set:Ne \l_@@_keytype_arg_tl + { \use:n ####2 } + } + \seq_map_break: + } + } + \@@_split_keytype_arg_aux:w #1 \s_@@_stop + } + } + \seq_map_function:NN \c_@@_keytypes_arg_seq + \@@_split_keytype_arg_aux:n + } +\cs_generate_variant:Nn \@@_split_keytype_arg:n { V } +\cs_new:Npn \@@_split_keytype_arg_aux:n #1 { } +\cs_new:Npn \@@_split_keytype_arg_aux:w #1 \s_@@_stop { } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Storing values} +% +% As \pkg{lttemplates} pre-processes key values for efficiency reasons, +% there is a need to convert the values given as defaults into +% \enquote{ready to use} data. The same general idea is true when an instance +% is declared. However, assignments are not made until an instance is +% used, and so there has to be some intermediate storage. Furthermore, +% the ability to delay evaluation of results is needed. To achieve these +% aims, a series of \enquote{process and store} functions are defined here. +% +% All of the information about the key (the key name and the keytype) +% is already stored as variables. The same property list is always used +% to store the data, meaning that the only argument required is the +% value to be processed and potentially stored. +% +% \begin{macro}{\@@_store_value_boolean:n} +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_value_boolean:n #1 + { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_store_value:n, \@@_store_value_choice:n, +% \@@_store_value_function:n, \@@_store_value_instance:n} +% With no need to worry about delayed evaluation, these keytypes all +% just store the input directly. +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_value:n #1 + { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} } +\cs_new_eq:NN \@@_store_value_choice:n \@@_store_value:n +\cs_new_eq:NN \@@_store_value_function:n \@@_store_value:n +\cs_new_eq:NN \@@_store_value_instance:n \@@_store_value:n +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_store_value_aux:Nn, \@@_store_value_integer:n, +% \@@_store_value_length:n, \@@_store_value_muskip:n, +% \@@_store_value_real:n, \@@_store_value_skip:n, +% \@@_store_value_tokenlist:n, \@@_store_value_commalist:n} +% Storing values in \cs{l_@@_values_prop} is in most cases the same. +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_value_aux:Nn #1#2 + { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#2} } +\cs_new_protected:Npn \@@_store_value_integer:n + { \@@_store_value_aux:Nn \int_eval:n } +\cs_new_protected:Npn \@@_store_value_length:n + { \@@_store_value_aux:Nn \dim_eval:n } +\cs_new_protected:Npn \@@_store_value_muskip:n + { \@@_store_value_aux:Nn \muskip_eval:n } +\cs_new_protected:Npn \@@_store_value_real:n + { \@@_store_value_aux:Nn \fp_eval:n } +\cs_new_protected:Npn \@@_store_value_skip:n + { \@@_store_value_aux:Nn \skip_eval:n } +\cs_new_protected:Npn \@@_store_value_tokenlist:n + { \@@_store_value_aux:Nn \use:n } +\cs_new_eq:NN \@@_store_value_commalist:n \@@_store_value_tokenlist:n +% \end{macrocode} +% \end{macro} +% +% \subsection{Implementation part of template declaration} +% +% \begin{macro}{\@@_declare_template_code:nnnnn} +% \begin{macro}{\@@_declare_template_code:nnnn} +% The main function for implementing a template starts with a couple of +% simple checks to make sure that there are no obvious mistakes: the +% number of arguments must agree and the template keys must have been +% declared. +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_template_code:nnnnn #1#2#3#4#5 + { + \@@_execute_if_type_exist:nT {#1} + { + \@@_execute_if_arg_agree:nnT {#1} {#3} + { + \@@_if_keys_exist:nnT {#1} {#2} + { + \@@_store_key_implementation:nnn {#1} {#2} {#4} + \regex_match:nnTF { \c { AssignTemplateKeys } } {#5} + { \@@_declare_template_code:nnnn {#1} {#2} {#3} {#5} } + { + \@@_declare_template_code:nnnn + {#1} {#2} {#3} { \AssignTemplateKeys #5 } + } + } + } + } + } +\cs_new_protected:Npn \@@_declare_template_code:nnnn #1#2#3#4 + { + \cs_if_exist:cT { \c_@@_code_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-template-code } {#1} {#2} } + \cs_generate_from_arg_count:cNnn + { \c_@@_code_root_tl #1 / #2 } + \cs_gset_protected:Npn {#3} {#4} + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_store_key_implementation:nnn} +% Actually storing the implementation part of a template is quite easy +% as it only requires the list of keys given to be turned into a +% property list. There is also some error-checking to do, hence the need +% to have the list of defined keytypes available. In certain cases +% (when choices are involved) parsing the key results in changes to the +% default values. That is why they are loaded and then saved again. +% \begin{macrocode} +\cs_new_protected:Npn \@@_store_key_implementation:nnn #1#2#3 + { + \@@_recover_defaults:nn {#1} {#2} + \@@_recover_keytypes:nn {#1} {#2} + \prop_clear:N \l_@@_vars_prop + \keyval_parse:nnn + { \@@_parse_vars_elt:n } { \@@_parse_vars_elt:nnn { #1 / #2 } } {#3} + \@@_store_vars:nn {#1} {#2} + \prop_map_inline:Nn \l_@@_keytypes_prop + { \msg_error:nnnnn { template } { key-not-implemented } {##1} {#2} {#1} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_vars_elt:n} +% At the implementation stage, every key must have a value given. So +% this is an error function. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_vars_elt:n #1 + { \msg_error:nnn { template } { key-no-variable } {#1} } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_vars_elt:nnn} +% \begin{macro}{\@@_parse_vars_elt_aux:nn} +% \begin{macro}{\@@_parse_vars_elt_aux:nw} +% \begin{macro}{\@@_parse_vars_elt_aux:nnn, \@@_parse_vars_elt_aux:nne} +% \begin{macro}{\@@_parse_vars_elt_key:nn} +% The actual storage part here is very simple: the storage bin name +% is placed into the property list. At the same time, a comparison is +% made with the keytypes defined earlier: if there is a mismatch then +% an error is raised. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_vars_elt:nnn #1#2#3 + { + \tl_set:Ne \l_@@_key_name_tl + { \tl_trim_spaces:e { \tl_to_str:n {#2} } } + \prop_get:NVNTF \l_@@_keytypes_prop + \l_@@_key_name_tl + \l_@@_keytype_tl + { + \@@_split_keytype_arg:V \l_@@_keytype_tl + \@@_parse_vars_elt_aux:nn {#1} {#3} + \prop_remove:NV \l_@@_keytypes_prop \l_@@_key_name_tl + } + { \msg_error:nnn { template } { unknown-key } {#2} } + } +% \end{macrocode} +% Split off any leading \texttt{global} and they look for the way to +% implement. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_vars_elt_aux:nn #1#2 + { + \@@_parse_vars_elt_aux:nw {#1} #2 global global \s_@@_stop + } +\cs_new_protected:Npn \@@_parse_vars_elt_aux:nw + #1#2 global #3 global #4 \s_@@_stop + { + \tl_if_blank:nTF {#4} + { \@@_parse_vars_elt_aux:nnn {#1} { } {#2} } + { + \tl_if_blank:nTF {#2} + { + \@@_parse_vars_elt_aux:nne + {#1} { global } { \tl_trim_spaces:n {#3} } + } + { \msg_error:nnn { template } { bad-variable } { #2 global #3 } } + } + } +\cs_new_protected:Npn \@@_parse_vars_elt_aux:nnn #1#2#3 + { + \str_case:VnF \l_@@_keytype_tl + { + { choice } { \@@_implement_choices:nn {#1} {#3} } + { function } + { + \cs_if_exist:NF #3 + { \cs_new:Npn #3 { } } + \@@_parse_vars_elt_key:nn {#1} + { + .code:n = + { + \cs_generate_from_arg_count:NNnn + \exp_not:N #3 + \exp_not:c + { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } + { \exp_not:V \l_@@_keytype_arg_tl } + {##1} + } + } + \prop_put:NVn \l_@@_vars_prop + \l_@@_key_name_tl {#2#3} + } + { instance } + { + \@@_parse_vars_elt_key:nn {#1} + { + .code:n = + { + \exp_not:c + { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } + \exp_not:N #3 { \UseInstance {##1} } + } + } + \prop_put:NVn \l_@@_vars_prop + \l_@@_key_name_tl {#2#3} + } + } + { + \tl_if_single:nTF {#3} + { + \cs_if_exist:NF #3 + { \use:c { \@@_map_var_type: _new:N } #3 } + \@@_parse_vars_elt_key:nn {#1} + { + . \@@_map_var_type: + _ \str_if_eq:nnT {#1} { global } { g } set:N + = \exp_not:N #3 + } + \prop_put:NVn \l_@@_vars_prop + \l_@@_key_name_tl {#2#3} + } + { \msg_error:nnn { template } { bad-variable } {#2#3} } + } + } +\cs_generate_variant:Nn \@@_parse_vars_elt_aux:nnn { nne } +\cs_new_protected:Npn \@@_parse_vars_elt_key:nn #1#2 + { + \keys_define:ne { template / #1 } + { \l_@@_key_name_tl #2 } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\@@_map_var_type:} +% Turn a \enquote{friendly} variable type into an \texttt{expl3} one. +% \begin{macrocode} +\cs_new:Npn \@@_map_var_type: + { + \str_case:Vn \l_@@_keytype_tl + { + { boolean } { bool } + { commalist } { clist } + { integer } { int } + { length } { dim } + { muskip } { muskip } + { real } { fp } + { skip } { skip } + { tokenlist } { tl } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_implement_choices:nn} +% \begin{macro}{\@@_implement_choices_default:} +% Implementing choices requires a second key--value loop. So after a +% little set-up, the standard parser is called. +% \begin{macrocode} +\cs_new_protected:Npn \@@_implement_choices:nn #1#2 + { + \clist_set:NV \l_@@_tmp_clist \l_@@_keytype_arg_tl + \prop_put:NVn \l_@@_vars_prop \l_@@_key_name_tl { } + \keys_define:ne { template / #1 } { \l_@@_key_name_tl .choice: } + \keyval_parse:nnn + { \@@_implement_choice_elt:n } + { \@@_implement_choice_elt:nnn {#1} } + {#2} + \prop_get:NVNT \l_@@_values_prop \l_@@_key_name_tl + \l_@@_tmp_tl + { \@@_implement_choices_default: } + \clist_if_empty:NF \l_@@_tmp_clist + { + \clist_map_inline:Nn \l_@@_tmp_clist + { \msg_error:nnn { template } { choice-not-implemented } {##1} } + } + } +% \end{macrocode} +% A sanity check for the default value, so that an error is raised +% now and not when converting to assignments. +% \begin{macrocode} +\cs_new_protected:Npn \@@_implement_choices_default: + { + \tl_set:Ne \l_@@_tmp_tl + { \l_@@_key_name_tl \c_space_tl \l_@@_tmp_tl } + \prop_if_in:NVF \l_@@_vars_prop \l_@@_tmp_tl + { + \tl_set:Ne \l_@@_tmp_tl + { \l_@@_key_name_tl \c_space_tl \l_@@_tmp_tl } + \prop_if_in:NVF \l_@@_vars_prop \l_@@_tmp_tl + { + \prop_get:NVN \l_@@_keytypes_prop \l_@@_key_name_tl + \l_@@_tmp_tl + \@@_split_keytype_arg:V \l_@@_tmp_tl + \prop_get:NVN \l_@@_values_prop \l_@@_key_name_tl + \l_@@_tmp_tl + \msg_error:nnVV { template } { unknown-default-choice } + \l_@@_key_name_tl + \l_@@_key_name_tl + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_implement_choice_elt:nnn, \@@_implement_choice_elt_aux:nnn} +% \begin{macro}{\@@_implement_choice_elt_aux:n} +% \begin{macro}{\@@_implement_choice_elt:n} +% The actual storage of the implementation of a choice is mainly about +% error checking. The code here ensures that all choices have to have +% been declared, apart from the special \texttt{unknown} choice, which +% must come last. The code for each choice is stored along with the +% key name in the variables property list. +% \begin{macrocode} +\cs_new_protected:Npn \@@_implement_choice_elt:nnn #1#2#3 + { + \clist_if_empty:NTF \l_@@_tmp_clist + { + \str_if_eq:nnTF {#2} { unknown } + { \@@_implement_choice_elt_aux:nnn {#1} {#2} {#3} } + { \@@_implement_choice_elt_aux:n {#2} } + } + { + \clist_if_in:NnTF \l_@@_tmp_clist {#2} + { + \clist_remove_all:Nn \l_@@_tmp_clist {#2} + \@@_implement_choice_elt_aux:nnn {#1} {#2} {#3} + } + { \@@_implement_choice_elt_aux:n {#2} } + } + } +\cs_new_protected:Npn \@@_implement_choice_elt_aux:n #1 + { + \prop_get:NVN \l_@@_keytypes_prop \l_@@_key_name_tl + \l_@@_tmp_tl + \@@_split_keytype_arg:V \l_@@_tmp_tl + \msg_error:nnVn { template } { unknown-choice } \l_@@_key_name_tl {#1} + } +\cs_new_protected:Npn \@@_implement_choice_elt_aux:nnn #1#2#3 + { + \keys_define:ne { template / #1 } + { \l_@@_key_name_tl / #2 .code:n = { \exp_not:n {#3} } } + \tl_set:Ne \l_@@_tmp_tl + { \l_@@_key_name_tl \c_space_tl #2 } + \prop_put:NVn \l_@@_vars_prop \l_@@_tmp_tl {#3} + } +\cs_new_protected:Npn \@@_implement_choice_elt:n #1 + { + \msg_error:nnVn { template } { choice-requires-code } + \l_@@_key_name_tl {#1} + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Editing template defaults} +% +% \begin{macro}{\@@_edit_defaults:nnn} +% Editing the template defaults means getting the values back out +% of the store, then parsing the list of new values before putting +% the updated list back into storage. +% \begin{macrocode} +\cs_new_protected:Npn \@@_edit_defaults:nnn #1#2#3 + { + \@@_if_keys_exist:nnT {#1} {#2} + { + \@@_recover_defaults:nn {#1} {#2} + \@@_parse_values:nnn {#1} {#2} {#3} + \@@_store_defaults:nn {#1} {#2} + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_values:nnn} +% The routine to parse values is the same for both editing a +% template and setting up an instance. So the code here does only the +% minimum necessary for reading the values. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_values:nnn #1#2#3 + { + \@@_recover_keytypes:nn {#1} {#2} + \keyval_parse:NNn + \@@_parse_values_elt:n \@@_parse_values_elt:nn {#3} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_values_elt:n} +% Every key needs a value, so this is just an error routine. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_values_elt:n #1 + { + \bool_set_true:N \l_@@_error_bool + \msg_error:nnn { template } { key-no-value } {#1} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_parse_values_elt:nn} +% \begin{macro}{\@@_parse_values_elt_aux:n} +% To store the value, find the keytype then call the saving function. +% These need the current key name saved as \cs{l_@@_key_name_tl}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_parse_values_elt:nn #1#2 + { + \tl_set:Ne \l_@@_key_name_tl + { \tl_trim_spaces:e { \tl_to_str:n {#1} } } + \prop_get:NVNTF \l_@@_keytypes_prop \l_@@_key_name_tl + \l_@@_tmp_tl + { \@@_parse_values_elt_aux:n {#2} } + { \msg_error:nnV { template } { unknown-key } \l_@@_key_name_tl } + } +\cs_new_protected:Npn \@@_parse_values_elt_aux:n #1 + { + \@@_split_keytype_arg:V \l_@@_tmp_tl + \use:c { @@_store_value_ \l_@@_keytype_tl :n } {#1} + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_template_set_eq:nnn} +% To copy a template, each of the lists plus the code has to be copied +% across. To keep this independent of the list storage system, it is +% all done with two-part shuffles. +% \begin{macrocode} +\cs_new_protected:Npn \@@_template_set_eq:nnn #1#2#3 + { + \@@_recover_defaults:nn {#1} {#3} + \@@_store_defaults:nn {#1} {#2} + \@@_recover_keytypes:nn {#1} {#3} + \@@_store_keytypes:nn {#1} {#2} + \@@_recover_vars:nn {#1} {#3} + \@@_store_vars:nn {#1} {#2} + \cs_if_exist:cT { \c_@@_code_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-template-code } {#1} {#2} } + \cs_gset_eq:cc { \c_@@_code_root_tl #1 / #2 } + { \c_@@_code_root_tl #1 / #3 } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Creating instances of templates} +% +% \begin{macro} +% { +% \@@_declare_instance:nnnn, +% \@@_declare_instance_aux:nnnn +% } +% Making an instance has two distinct parts. First, the keys given are +% parsed to transfer the values into the structured data format used +% internally. This allows the default and given values to be combined +% with no repetition. In the second step, the structured data is +% converted to pre-defined variable assignments, and these are stored +% in the function for the instance. +% \begin{macrocode} +\cs_new_protected:Npn \@@_declare_instance:nnnn #1#2#3#4 + { + \@@_execute_if_code_exist:nnT {#1} {#2} + { + \@@_recover_defaults:nn {#1} {#2} + \@@_recover_vars:nn {#1} {#2} + \@@_declare_instance_aux:nnnn {#1} {#2} {#3} {#4} + } + } +\cs_new_protected:Npn \@@_declare_instance_aux:nnnn #1#2#3#4 + { + \bool_set_false:N \l_@@_error_bool + \@@_parse_values:nnn {#1} {#2} {#4} + \bool_if:NF \l_@@_error_bool + { + \prop_put:Nnn \l_@@_values_prop { from~template } {#2} + \@@_store_values:nn {#1} {#3} + \@@_convert_to_assignments: + \cs_if_exist:cT { \c_@@_instances_root_tl #1 / #3 } + { \msg_info:nnnn { template } { declare-instance } {#3} {#1} } + \cs_set_protected:cpe { \c_@@_instances_root_tl #1 / #3 } + { + \exp_not:N \@@_assignments_push:n + { \exp_not:V \l_@@_assignments_tl } + \exp_not:c { \c_@@_code_root_tl #1 / #2 } + } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_instance_set_eq:nnn} +% Copy--paste an instance. +% \begin{macrocode} +\cs_new_protected:Npn \@@_instance_set_eq:nnn #1#2#3 + { + \@@_if_instance_exist:nnTF {#1} {#3} + { + \@@_recover_values:nn {#1} {#3} + \@@_store_values:nn {#1} {#2} + \cs_if_exist:cT { \c_@@_instances_root_tl #1 / #2 } + { \msg_info:nnnn { template } { declare-instance } {#2} {#1} } + \cs_set_eq:cc { \c_@@_instances_root_tl #1 / #2 } + { \c_@@_instances_root_tl #1 / #3 } + } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#3} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_edit_instance:nnn} +% \begin{macro} +% {\@@_edit_instance_aux:nnnnn, \@@_edit_instance_aux:nVnnn} +% Editing an instance is almost identical to declaring one. The only +% variation is the source of the values to use. When editing, they are +% recovered from the previous instance run. +% \begin{macrocode} +\cs_new_protected:Npn \@@_edit_instance:nnn #1#2#3 + { + \@@_if_instance_exist:nnTF {#1} {#2} + { + \@@_recover_values:nn {#1} {#2} + \prop_get:NnN \l_@@_values_prop { from~template } + \l_@@_tmp_tl + \@@_edit_instance_aux:nVnn + {#1} \l_@@_tmp_tl {#2} {#3} + } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#2} } + } +\cs_new_protected:Npn \@@_edit_instance_aux:nnnn #1#2#3#4 + { + \@@_recover_vars:nn {#1} {#2} + \@@_declare_instance_aux:nnnn {#1} {#2} {#3} {#4} + } +\cs_generate_variant:Nn \@@_edit_instance_aux:nnnn { nV } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_convert_to_assignments:} +% \begin{macro}{\@@_convert_to_assignments_aux:n} +% \begin{macro} +% {\@@_convert_to_assignments_aux:nn, \@@_convert_to_assignments_aux:nV} +% The idea on converting to a set of assignments is to loop over each +% key, so that the loop order follows the declaration order of the keys. +% This is done using a sequence as property lists are not +% \enquote{ordered}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_convert_to_assignments: + { + \tl_clear:N \l_@@_assignments_tl + \seq_map_function:NN \l_@@_key_order_seq + \@@_convert_to_assignments_aux:n + } +\cs_new_protected:Npn \@@_convert_to_assignments_aux:n #1 + { + \prop_get:NnN \l_@@_keytypes_prop {#1} \l_@@_tmp_tl + \@@_convert_to_assignments_aux:nV {#1} \l_@@_tmp_tl + } +% \end{macrocode} +% The second auxiliary function actually does the work. The +% arguments here are the key name (|#1|) and the keytype (|#2|). +% From those, the value to assign and the name of the appropriate +% variable are recovered. A bit of work is then needed to sort out +% keytypes with arguments (for example instances), and to look for +% global assignments. Once that is done, a hand-off can be made to the +% handler for the relevant keytype. +% \begin{macrocode} +\cs_new_protected:Npn \@@_convert_to_assignments_aux:nn #1#2 + { + \prop_get:NnNT \l_@@_values_prop {#1} \l_@@_value_tl + { + \prop_get:NnNTF \l_@@_vars_prop {#1} \l_@@_var_tl + { + \@@_split_keytype_arg:n {#2} + \str_if_eq:VnF \l_@@_keytype_tl { choice } + { + \str_if_eq:VnF \l_@@_keytype_tl { code } + { \@@_find_global: } + } + \tl_set:Nn \l_@@_key_name_tl {#1} + \use:c { @@_assign_ \l_@@_keytype_tl : } + } + { \msg_error:nnn { template } { unknown-attribute } {#1} } + } + } +\cs_generate_variant:Nn \@@_convert_to_assignments_aux:nn { nV } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_find_global:} +% \begin{macro}{\@@_find_global_aux:w} +% Global assignments should have the phrase |global| at the front. +% This is pretty easy to find: no other error checking, though. +% \begin{macrocode} +\cs_new_protected:Npn \@@_find_global: + { + \bool_set_false:N \l_@@_global_bool + \tl_if_in:onT \l_@@_var_tl { global } + { + \exp_after:wN \@@_find_global_aux:w \l_@@_var_tl \s_@@_stop + } + } +\cs_new_protected:Npn \@@_find_global_aux:w #1 global #2 \s_@@_stop + { + \tl_set:Nn \l_@@_var_tl {#2} + \bool_set_true:N \l_@@_global_bool + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Using templates directly} +% +% \begin{macro}{\@@_use_template:nnn} +% Directly use a template with a particular parameter setting. +% This is also picked up if used in a nested fashion inside a parameter +% list. The idea is essentially the same as creating an instance, +% just with no saving of the result. +% \begin{macrocode} +\cs_new_protected:Npn \@@_use_template:nnn #1#2#3 + { + \@@_execute_if_code_exist:nnT {#1} {#2} + { + \@@_recover_defaults:nn {#1} {#2} + \@@_recover_vars:nn {#1} {#2} + \@@_parse_values:nnn {#1} {#2} {#3} + \@@_convert_to_assignments: + \use:c { \c_@@_code_root_tl #1 / #2 } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Assigning values to variables} +% +% \begin{macro}{\@@_assign_boolean:} +% \begin{macro}{\@@_assign_boolean_aux:n} +% Setting a Boolean value is slightly different to everything else +% as the value can be used to work out which \texttt{set} function to +% call. As long as there is no need to recover things from another +% variable, everything is pretty easy. If there is, then we need to allow +% for the fact that the recovered value here will \emph{not} be expandable, +% so needs to be converted to something that is. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assign_boolean: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_boolean_aux:n { bool_gset } } + { \@@_assign_boolean_aux:n { bool_set } } + } +\cs_new_protected:Npn \@@_assign_boolean_aux:n #1 + { + \@@_if_key_value:VTF \l_@@_value_tl + { + \@@_key_to_value: + \tl_put_right:Ne \l_@@_assignments_tl + { + \exp_not:c { #1 _eq:NN } + \exp_not:V \l_@@_var_tl + \exp_not:V \l_@@_value_tl + } + } + { + \tl_put_right:Ne \l_@@_assignments_tl + { + \exp_not:c { #1 _ \l_@@_value_tl :N } + \exp_not:V \l_@@_var_tl + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_assign_choice:} +% \begin{macro} +% {\@@_assign_choice_aux:nF, \@@_assign_choice_aux:eF} +% The idea here is to find either the choice as-given or else the +% special |unknown| choice, and to copy the appropriate code across. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assign_choice: + { + \@@_assign_choice_aux:eF + { \l_@@_key_name_tl \c_space_tl \l_@@_value_tl } + { + \@@_assign_choice_aux:eF + { \l_@@_key_name_tl \c_space_tl unknown } + { + \prop_get:NVN \l_@@_keytypes_prop \l_@@_key_name_tl + \l_@@_tmp_tl + \@@_split_keytype_arg:V \l_@@_tmp_tl + \msg_error:nnVV { template } { unknown-choice } + \l_@@_key_name_tl + \l_@@_value_tl + } + } + } +\cs_new_protected:Npn \@@_assign_choice_aux:nF #1 + { + \prop_get:NnNTF \l_@@_vars_prop {#1} \l_@@_tmp_tl + { \tl_put_right:NV \l_@@_assignments_tl \l_@@_tmp_tl } + } +\cs_generate_variant:Nn \@@_assign_choice_aux:nF { e } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_assign_function:} +% \begin{macro}{\@@_assign_function_aux:N} +% This looks a bit messy but is only actually one function. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assign_function: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_function_aux:N \cs_gset:Npn } + { \@@_assign_function_aux:N \cs_set:Npn } + } +\cs_new_protected:Npn \@@_assign_function_aux:N #1 + { + \tl_put_right:Ne \l_@@_assignments_tl + { + \cs_generate_from_arg_count:NNnn + \exp_not:V \l_@@_var_tl + \exp_not:N #1 + { \exp_not:V \l_@@_keytype_arg_tl } + { \exp_not:V \l_@@_value_tl } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_assign_instance:} +% \begin{macro}{\@@_assign_instance_aux:N} +% Using an instance means adding the appropriate function creation to +% the tl. No checks are made at this stage, so if the instance is +% not valid then errors will arise later. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assign_instance: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_instance_aux:N \cs_gset_protected:Npn } + { \@@_assign_instance_aux:N \cs_set_protected:Npn } + } +\cs_new_protected:Npn \@@_assign_instance_aux:N #1 + { + \tl_put_right:Ne \l_@@_assignments_tl + { + \exp_not:N #1 \exp_not:V \l_@@_var_tl + { + \@@_use_instance:nn + { \exp_not:V \l_@@_keytype_arg_tl } + { \exp_not:V \l_@@_value_tl } + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_assign_integer:} +% \begin{macro}{\@@_assign_length:} +% \begin{macro}{\@@_assign_muskip:} +% \begin{macro}{\@@_assign_real:} +% \begin{macro}{\@@_assign_skip:} +% All of the calculated assignments use the same underlying code, with +% only the low-level assignment function changing. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assign_integer: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_variable:N \int_gset:Nn } + { \@@_assign_variable:N \int_set:Nn } + } +\cs_new_protected:Npn \@@_assign_length: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_variable:N \dim_gset:Nn } + { \@@_assign_variable:N \dim_set:Nn } +} +\cs_new_protected:Npn \@@_assign_muskip: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_variable:N \muskip_gset:Nn } + { \@@_assign_variable:N \muskip_set:Nn } + } +\cs_new_protected:Npn \@@_assign_real: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_variable:N \fp_gset:Nn } + { \@@_assign_variable:N \fp_set:Nn } + } +\cs_new_protected:Npn \@@_assign_skip: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_variable:N \skip_gset:Nn } + { \@@_assign_variable:N \skip_set:Nn } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_assign_tokenlist:} +% \begin{macro}{\@@_assign_tokenlist_aux:NN} +% Life would be easy here if it were not for \cs{KeyValue}. To deal +% correctly with that, we need to allow for the recovery a stored value +% at point of use. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assign_tokenlist: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_tokenlist_aux:NN \tl_gset:NV \tl_gset:Nn } + { \@@_assign_tokenlist_aux:NN \tl_set:NV \tl_set:Nn } + } +\cs_new_protected:Npn \@@_assign_tokenlist_aux:NN #1#2 + { + \@@_if_key_value:VTF \l_@@_value_tl + { + \@@_key_to_value: + \tl_put_right:Ne \l_@@_assignments_tl + { + #1 \exp_not:V \l_@@_var_tl + { \exp_not:V \l_@@_value_tl } + } + } + { + \tl_put_right:Ne \l_@@_assignments_tl + { + #2 \exp_not:V \l_@@_var_tl + { \exp_not:V \l_@@_value_tl } + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_assign_commalist:} +% Very similar for commas lists, so some code is shared. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assign_commalist: + { + \bool_if:NTF \l_@@_global_bool + { \@@_assign_tokenlist_aux:NN \clist_gset:NV \clist_gset:Nn } + { \@@_assign_tokenlist_aux:NN \clist_set:NV \clist_set:Nn } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_assign_variable:N} +% A general-purpose function for all of the numerical assignments. +% As long as the value is not coming from another variable, the stored +% value is simply transferred for output. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assign_variable:N #1 + { + \@@_if_key_value:VT \l_@@_value_tl + { \@@_key_to_value: } + \tl_put_right:Ne \l_@@_assignments_tl + { + #1 \exp_not:V \l_@@_var_tl + { \exp_not:V \l_@@_value_tl } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_key_to_value:} +% \begin{macro}{\@@_key_to_value_auxi:w} +% \begin{macro}{\@@_key_to_value_auxii:w} +% The idea here is to recover the attribute value of another key. To +% do that, the marker is removed and a look up takes place. If this +% is successful, then the name of the variable of the attribute is +% returned. This assumes that the value will be used in context where +% it will be converted to a value, for example when setting a number. +% There is also a need to check in case the copied value happens to be +% \texttt{global}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_key_to_value: + { \exp_after:wN \@@_key_to_value_auxi:w \l_@@_value_tl } +\cs_new_protected:Npn \@@_key_to_value_auxi:w \KeyValue #1 + { + \tl_set:Ne \l_@@_tmp_tl { \tl_trim_spaces:e { \tl_to_str:n {#1} } } + \prop_get:NVNTF \l_@@_vars_prop \l_@@_tmp_tl + \l_@@_value_tl + { + \exp_after:wN \@@_key_to_value_auxii:w \l_@@_value_tl + \s_@@_mark global \q_@@_nil \s_@@_stop + } + { \msg_error:nnV { template } { unknown-attribute } \l_@@_tmp_tl } + } +\cs_new_protected:Npn \@@_key_to_value_auxii:w #1 global #2#3 \s_@@_stop + { + \@@_quark_if_nil:NF #2 + { \tl_set:Nn \l_@@_value_tl {#2} } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Using instances} +% +% \begin{macro}{\@@_use_instance:nn} +% \begin{macro}{\@@_use_instance_aux:nNnnn} +% \begin{macro}{\@@_use_instance_aux:nn} +% Using an instance is just a question of finding the appropriate function. +% If nothing is found, an error is raised. One complication is that +% if the first token of argument |#2| is \cs{UseTemplate} then that +% is also valid. There is an error-test to make sure that the +% types agree, and if so the template is used directly. +% \begin{macrocode} +\cs_new_protected:Npn \@@_use_instance:nn #1#2 + { + \@@_if_use_template:nTF {#2} + { \@@_use_instance_aux:nNnnn {#1} #2 } + { \@@_use_instance_aux:nn {#1} {#2} } + } +\cs_new_protected:Npn \@@_use_instance_aux:nNnnn #1#2#3#4#5 + { + \str_if_eq:nnTF {#1} {#3} + { \@@_use_template:nnn {#3} {#4} {#5} } + { \msg_error:nnnn { template } { type-mismatch } {#1} {#3} } +} +\cs_new_protected:Npn \@@_use_instance_aux:nn #1#2 + { + \@@_if_instance_exist:nnTF {#1} {#2} + { \use:c { \c_@@_instances_root_tl #1 / #2 } } + { \msg_error:nnnn { template } { unknown-instance } {#1} {#2} } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +%\subsection{Assignment manipulation} +% +% A few functions to transfer assignments about, as this is needed by +% \cs{AssignTemplateKeys}. +% +% \begin{macro}{\@@_assignments_pop:} +% To actually use the assignments. +% \begin{macrocode} +\cs_new:Npn \@@_assignments_pop: { \l_@@_assignments_tl } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_assignments_push:n} +% Here, the assignments are stored for later use. +% \begin{macrocode} +\cs_new_protected:Npn \@@_assignments_push:n #1 + { \tl_set:Nn \l_@@_assignments_tl {#1} } +% \end{macrocode} +% \end{macro} +% +% \subsection{Showing templates and instances} +% +% \begin{macro}{\@@_show_code:nn} +% Showing the code for a template is just a translation of +% \cs{cs_show:c}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_code:nn #1#2 + { \cs_show:c { \c_@@_code_root_tl #1 / #2 } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { +% \@@_show_defaults:nn, +% \@@_show_keytypes:nn, +% \@@_show_vars:nn +% } +% \begin{macro}{\@@_show:Nnnn} +% A modified version of the property-list printing code, such that +% the output refers to templates and instances rather than to the +% underlying structures. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_defaults:nn #1#2 + { + \@@_if_keys_exist:nnT {#1} {#2} + { + \@@_recover_defaults:nn {#1} {#2} + \@@_show:Nnnn \l_@@_values_prop + {#1} {#2} { default~values } + } + } +\cs_new_protected:Npn \@@_show_keytypes:nn #1#2 + { + \@@_if_keys_exist:nnT {#1} {#2} + { + \@@_recover_keytypes:nn {#1} {#2} + \@@_show:Nnnn \l_@@_keytypes_prop + {#1} {#2} { interface } + } + } +\cs_new_protected:Npn \@@_show_vars:nn #1#2 + { + \@@_execute_if_code_exist:nnT {#1} {#2} + { + \@@_recover_vars:nn {#1} {#2} + \@@_show:Nnnn \l_@@_vars_prop + {#1} {#2} { variable~mapping } + } + } +\cs_new_protected:Npn \@@_show:Nnnn #1#2#3#4 + { + \msg_show:nneeee { template } { show-attribute } + { \tl_to_str:n {#2} } + { \tl_to_str:n {#3} } + { \tl_to_str:n {#4} } + { \prop_map_function:NN #1 \msg_show_item_unbraced:nn } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_show_values:nn} +% Instance values are a little more complex, as is the template to consider. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_values:nn #1#2 + { + \@@_if_instance_exist:nnT {#1} {#2} + { + \@@_recover_values:nn {#1} {#2} + \msg_show:nneee { template } { show-values } + { \tl_to_str:n {#1} } + { \tl_to_str:n {#2} } + { + \prop_map_function:NN \l_@@_values_prop + \msg_show_item_unbraced:nn + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Messages} +% +% The text for error messages: short and long text for all of them. +% \begin{macrocode} +\msg_new:nnnn { template } { argument-number-mismatch } + { Template~type~'#1'~takes~#2~argument(s). } + { + Templates~of~type~'#1'~require~#2~argument(s).\\ + You~have~tried~to~make~a~template~for~'#1'~ + with~#3~argument(s),~which~is~not~possible:~ + the~number~of~arguments~must~agree. + } +\msg_new:nnnn { template } { bad-number-of-arguments } + { Bad~number~of~arguments~for~template~type~'#1'. } + { + A~template~may~accept~between~0~and~9~arguments.\\ + You~asked~to~use~#2~arguments:~this~is~not~supported. + } +\msg_new:nnnn { template } { bad-variable } + { Incorrect~variable~description~'#1'. } + { + The~argument~'#1'~is~not~of~the~form \\ + ~~'<variable>'\\ + ~or~\\ + ~~'global~<variable>'.\\ + It~must~be~given~in~one~of~these~formats~to~be~used~in~a~template. + } +\msg_new:nnnn { template } { choice-not-implemented } + { The~choice~'#1'~has~no~implementation. } + { + Each~choice~listed~in~the~interface~for~a~template~must~ + have~an~implementation. + } +\msg_new:nnnn { template } { choice-no-code } + { The~choice~'#1'~requires~implementation~details. } + { + When~creating~template~code~using~\DeclareTemplateCode,~ + each~choice~name~must~have~an~associated~implementation.\\ + This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. + } +\msg_new:nnnn { template } { choice-requires-code } + { The~choice~'#2'~for~key~'#1'~requires~an~implementation. } + { + You~should~have~put:\\ + \ \ #1~:~choice~{~#2 = <code> ~} \\ + but~LaTeX~did~not~find~any~<code>. + } +\msg_new:nnnn { template } { duplicate-key-interface } + { Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. } + { + Each~key~can~only~have~one~interface~declared~in~a~template.\\ + LaTeX~found~two~interfaces~for~'#1'. + } +\msg_new:nnnn { template } { keytype-requires-argument } + { The~key~type~'#1'~requires~an~argument~\msg_line_context:. } + { + You~should~have~put:\\ + \ \ <key-name>~:~#1~{~<argument>~} \\ + but~LaTeX~did~not~find~an~<argument>. + } +\msg_new:nnnn { template } { invalid-keytype } + { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } + { + Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\ + \ \ <key>~:~<key-type>\\ + LaTeX~could~not~find~a~<key-type>~in~your~input. + } +\msg_new:nnnn { template } { key-no-value } + { The~key~'#1'~has~no~value~\msg_line_context:. } + { + When~creating~an~instance~of~a~template~ + every~key~listed~must~include~a~value:\\ + \ \ <key>~=~<value> + } +\msg_new:nnnn { template } { key-no-variable } + { The~key~'#1'~requires~implementation~details~\msg_line_context:. } + { + When~creating~template~code~using~\DeclareTemplateCode,~ + each~key~name~must~have~an~associated~implementation.\\ + This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. + } +\msg_new:nnnn { template } { key-not-implemented } + { Key~'#1'~has~no~implementation~\msg_line_context:. } + { + The~definition~of~key~implementations~for~template~'#2'~ + of~template~type~'#3'~does~not~include~any~details~for~key~'#1'.\\ + The~key~was~declared~in~the~interface~definition,~ + and~so~an~implementation~is~required. + } +\msg_new:nnnn { template } { missing-keytype } + { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } + { + Key~interface~definitions~should~be~of~the~form\\ + \ \ #1~:~<key-type>\\ + but~LaTeX~could~not~find~a~<key-type>. + } +\msg_new:nnnn { template } { no-template-code } + { + The~template~'#2'~of~type~'#1'~is~unknown~ + or~has~no~implementation. + } + { + There~is~no~code~available~for~the~template~name~given.\\ + This~should~be~given~using~\DeclareTemplateCode. + } +\msg_new:nnnn { template } { type-already-defined } + { Template~type~'#1'~already~defined. } + { + You~have~used~\NewTemplateType~ + with~a~template~type~that~has~already~been~defined. + } +\msg_new:nnnn { template } { type-mismatch } + { Template~types~'#1'~and~'#2'~do~not~agree. } + { + You~are~trying~to~use~a~template~directly~with~\UseInstance + (or~a~similar~function),~but~the~template~types~do~not~match. + } +\msg_new:nnnn { template } { unknown-attribute } + { The~template~attribute~'#1'~is~unknown. } + { + There~is~a~definition~in~the~current~template~reading\\ + \ \ \token_to_str:N \KeyValue {~#1~} \\ + but~there~is~no~key~called~'#1'. + } +\msg_new:nnnn { template } { unknown-choice } + { The~choice~'#2'~was~not~declared~for~key~'#1'. } + { + The~key~'#1'~takes~a~fixed~list~of~choices~ + and~this~list~does~not~include~'#2'. + } +\msg_new:nnnn { template } { unknown-default-choice } + { The~default~choice~'#2'~was~not~declared~for~key~'#1'. } + { + The~key~'#1'~takes~a~fixed~list~of~choices~ + and~this~list~does~not~include~'#2'. + } +\msg_new:nnnn { template } { unknown-instance } + { The~instance~'#2'~of~type~'#1'~is~unknown. } + { + You~have~asked~to~use~an~instance~'#2',~ + but~this~has~not~been~created. + } +\msg_new:nnnn { template } { unknown-key } + { Unknown~template~key~'#1'. } + { + The~key~'#1'~was~not~declared~in~the~interface~ + for~the~current~template. + } +\msg_new:nnnn { template } { unknown-keytype } + { The~key-type~'#1'~is~unknown. } + { + Valid~key-types~are:\\ + -~boolean;\\ + -~choice;\\ + -~commalist;\\ + -~function;\\ + -~instance;\\ + -~integer;\\ + -~length;\\ + -~muskip;\\ + -~real;\\ + -~skip;\\ + -~tokenlist. + } +\msg_new:nnnn { template } { unknown-type } + { The~template~type~'#1'~is~unknown. } + { + A~template~type~needs~to~be~defined~with~\NewTemplateType + prior~to~using~it. + } +\msg_new:nnnn { template } { unknown-template } + { The~template~'#2'~of~type~'#1'~is~unknown. } + { + No~interface~has~been~declared~for~a~template~ + '#2'~of~template~type~'#1'. + } +% \end{macrocode} +% +% Information messages only have text: more text should not be needed. +% \begin{macrocode} +\msg_new:nnn { template } { declare-instance } + { Declaring~instance~~'#1'~of~type~#2~\msg_line_context:. } +\msg_new:nnn { template } { declare-template-code } + { Declaring~code~for~template~'#2'~of~template~type~'#1'~\msg_line_context:. } +\msg_new:nnn { template } { declare-template-interface } + { + Declaring~interface~for~template~'#2'~of~template~type~'#1'~ + \msg_line_context:. + } +\msg_new:nnn { template } { declare-type } + { Declaring~template~type~'#1'~taking~#2~argument(s)~\msg_line_context:. } +\msg_new:nnn { template } { show-attribute } + { + The~template~'#2'~of~type~'#1'~has~ + \tl_if_empty:nTF {#4} { no~#3. } { #3 : #4 } + } +\msg_new:nnn { template } { show-values } + { + The~instance~'#2'~of~type~'#1'~has~ + \tl_if_empty:nTF {#3} { no~values. } { values: #3 } + } +% \end{macrocode} +% +% Also add \pkg{template} to the \pkg{LaTeX} messages. +% \begin{macrocode} +\prop_gput:Nnn \g_msg_module_type_prop { template } { LaTeX } +% \end{macrocode} +% +% \subsection{User functions} +% +% \begin{macro}{\NewTemplateType} +% \begin{macro}{\DeclareTemplateInterface} +% \begin{macro}{\DeclareTemplateCode} +% \begin{macro}{\DeclareTemplateCopy} +% \begin{macro}{\EditTemplateDefaults} +% \begin{macro}{\UseTemplate} +% \begin{macro}{\DeclareInstance} +% \begin{macro}{\DeclareInstanceCopy} +% \begin{macro}{\EditInstance} +% \begin{macro}{\UseInstance} +% All simple translations. +% \begin{macrocode} +\cs_new_protected:Npn \NewTemplateType #1#2 + { \@@_define_type:nn {#1} {#2} } +\cs_new_protected:Npn \DeclareTemplateInterface #1#2#3#4 + { \@@_declare_template_keys:nnnn {#1} {#2} {#3} {#4} } +\cs_new_protected:Npn \DeclareTemplateCode #1#2#3#4#5 + { \@@_declare_template_code:nnnnn {#1} {#2} {#3} {#4} {#5} } +\cs_new_protected:Npn \DeclareTemplateCopy #1#2#3 + { \@@_template_set_eq:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \EditTemplateDefaults #1#2#3 + { \@@_edit_defaults:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \UseTemplate #1#2#3 + { \@@_use_template:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \DeclareInstance #1#2#3#4 + { \@@_declare_instance:nnnn {#1} {#3} {#2} {#4} } +\cs_new_protected:Npn \DeclareInstanceCopy #1#2#3 + { \@@_instance_set_eq:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \EditInstance #1#2#3 + { \@@_edit_instance:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \UseInstance #1#2 + { \@@_use_instance:nn {#1} {#2} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ShowTemplateCode} +% \begin{macro}{\ShowTemplateDefaults} +% \begin{macro}{\ShowTemplateInterface} +% \begin{macro}{\ShowTemplateVariables} +% \begin{macro}{\ShowInstanceValues} +% The show functions are again just translation. +% \begin{macrocode} +\cs_new_protected:Npn \ShowTemplateCode #1#2 + { \@@_show_code:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateDefaults #1#2 + { \@@_show_defaults:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateInterface #1#2 + { \@@_show_keytypes:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateVariables #1#2 + { \@@_show_vars:nn {#1} {#2} } +\cs_new_protected:Npn \ShowInstanceValues #1#2 + { \@@_show_values:nn {#1} {#2} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\KeyValue} +% Simply dump the argument when executed: this should not happen. +% \begin{macrocode} +\cs_new_protected:Npn \KeyValue #1 {#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AssignTemplateKeys} +% A short call to use a token register by proxy. +% \begin{macrocode} +\cs_new_protected:Npn \AssignTemplateKeys { \@@_assignments_pop: } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SetTemplateKeys} +% A friendly wrapper +% \begin{macrocode} +\cs_new_protected:Npn \SetTemplateKeys #1#2#3 + { \keys_set_known:nnN { template / #1 / #2 } {#3} \l_@@_tmp_clist } +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{0000/00/00}{lttemplates}% +%<latexrelease> {Prototype~document~commands}% +%<latexrelease> +%<latexrelease>\EndModuleRelease +% \end{macrocode} +% +% \begin{macrocode} +\ExplSyntaxOff +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +% \end{macrocode} +% +% We need to stop DocStrip treating |@@| in a special way at this point. +% \begin{macrocode} +%<@@=> +% \end{macrocode} +% +% \Finale
\ No newline at end of file diff --git a/macros/latex-dev/base/lttextcomp.dtx b/macros/latex-dev/base/lttextcomp.dtx index 3602e0a6b0..c67bac00dd 100644 --- a/macros/latex-dev/base/lttextcomp.dtx +++ b/macros/latex-dev/base/lttextcomp.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2019-2023 +% Copyright (C) 2019-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -37,7 +37,7 @@ % % \ProvidesFile{lttextcomp.dtx} - [2022/08/07 v1.0g LaTeX Kernel (text companion symbols)] + [2024/02/08 v1.1a LaTeX Kernel (text companion symbols)] % \iffalse \documentclass{ltxdoc} \begin{document} @@ -163,11 +163,12 @@ % % \begin{macro}{\DeclareEncodingSubset} % -% The declaration takes 3 mandatory arguments: an \emph{encoding} +% The declaration takes 3 mandatory arguments: an \emph{encoding} % for which a subsetting is wanted (currently always \texttt{TS1}, % and most likely forever), the \emph{font family} for which we -% declare the subset and finally the \emph{subset} number (between \texttt{0} (all -% of the encoding is supported) and \texttt{9} many glyphs are missing. +% declare the subset and finally the \emph{subset} number, with a value between +% \texttt{0} (all of the encoding is supported) and \texttt{9} (many +% glyphs are missing). % % For \texttt{TS1} the numbers have been chosen in a way that most % fonts can be fairly correctly categorized, but the default @@ -439,7 +440,7 @@ % \end{macrocode} % % And here are the other \texttt{TS1} glyphs that are implemented -% by every font (or nearly every---a few are commented out and +% by every font (or nearly every)---a few are commented out and % moved to sub-encoding 9, % because they aren't around in some fonts. % \begin{macrocode} @@ -950,6 +951,8 @@ % This first block contains the fonts that have been already % supported by the \texttt{textcomp} package way back, i.e., the % font families that have \TeX{} support since the mid-nineties. +% \changes{v1.1a}{2024/01/27}{Adjusted/corrected TS1 sub-encoding +% declarations for various families (gh/1257)} % \begin{macrocode} \DeclareEncodingSubset{TS1}{ccr} {0} \DeclareEncodingSubset{TS1}{cmbr} {0} @@ -981,16 +984,28 @@ \DeclareEncodingSubset{TS1}{lmss} {1} \DeclareEncodingSubset{TS1}{lmssq} {1} \DeclareEncodingSubset{TS1}{lmvtt} {1} -\DeclareEncodingSubset{TS1}{lmtt} {1} % missing TM, SM and - % pertenthousand for some reason +% \end{macrocode} +% The lmtt family is missing TM, SM, and perthousand for some +% reason, so the first safe sub-encoding would be 2, but that is +% then missing out a huge number of glyphs that are available, so +% we claim it is sub-encoding 1 even if this can lead to missing glyphs. +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{lmtt} {1} % missing TM, SM and pertenthousand % \end{macrocode} % +% The next three families have been removed from TeX Live, but we +% keep the definitions % \begin{macrocode} \DeclareEncodingSubset{TS1}{ptmx} {2} \DeclareEncodingSubset{TS1}{ptmj} {2} \DeclareEncodingSubset{TS1}{ul8} {2} % \end{macrocode} % +% The next set are the early PostScript font implementations, these +% days there are better alternatives, but \ldots. Note that, their +% virtual fonts contain a lot of ``tofu'' in form of black squares, +% thus they don't even give a missing character warning if you +% select such a glyph. This is why they are set as sub-encoding 5. % \begin{macrocode} \DeclareEncodingSubset{TS1}{bch} {5} % tofu for blank, ohm \DeclareEncodingSubset{TS1}{futj}{5} % tofu for blank, interrobang/down, ohm @@ -1009,12 +1024,11 @@ \DeclareEncodingSubset{TS1}{ul9} {5} % tofu for blank, interrobang/down, ohm % \end{macrocode} % +% The next set suffers from the same problem and they contain even +% fewer real glyphs. % \begin{macrocode} \DeclareEncodingSubset{TS1}{dayroms}{6} % tofu for blank, interrobang/down, ohm \DeclareEncodingSubset{TS1}{dayrom} {6} % tofu for blank, interrobang/down, ohm -% \end{macrocode} -% -% \begin{macrocode} \DeclareEncodingSubset{TS1}{augie}{8} % really only missing euro \DeclareEncodingSubset{TS1}{put} {8} \DeclareEncodingSubset{TS1}{uag} {8} % probably (currently broken distrib) @@ -1024,6 +1038,7 @@ % \begin{macrocode} \DeclareEncodingSubset{TS1}{zi4} {9} % \end{macrocode} +% % LucidaBright (sold through TUG) probably not quite correct, I % guess as I have the older fonts \ldots % \begin{macrocode} @@ -1041,44 +1056,72 @@ % Below are the newer fonts that have support files for % \LaTeX{}. With very few exceptions the classifications are done % so that all characters are correctly produced (either being -% available in the font or substituted. +% available in the font or substituted). % % There are a few fonts that contain ``tofu'' squares in places % (instead of a real glyph) and in a few cases some really seldom % needed chars are unavailable, i.e., produce missing glyphs (to % avoid that a large number of available chars are unnecessarily -% substituted. +% substituted). % +% Encoding declarations for these font families shouldn't really be +% in the kernel, but part of the \texttt{.fd} files for the +% family. When we introduced the concept in 2021 we had some hope +% that this would happen over time and that we could take the +% declarations out---after all it is nearly impossible to maintain +% it correctly in the kernel, given that fonts may get new glyphs +% added (happened for several of them in the recent year) which is +% something we wouldn't notice. However, so far this hasn't +% happened, so in 2024, I went through the current set and adjusted +% the declarations in several places. +% +% Next four are wrong and still need adjustment: % \begin{macrocode} \DeclareEncodingSubset{TS1}{lato-*} {0} % with a bunch of tofu inside \DeclareEncodingSubset{TS1}{opensans-*} {0} % with a bunch of tofu inside \DeclareEncodingSubset{TS1}{cantarell-*} {0} % with a bunch of tofu inside -\DeclareEncodingSubset{TS1}{fbb-*} {0} % missing centoldstyle +\DeclareEncodingSubset{TS1}{tli} {1} % with lots of tofu inside % \end{macrocode} % % \begin{macrocode} -\DeclareEncodingSubset{TS1}{tli} {1} % with lots of tofu inside +\DeclareEncodingSubset{TS1}{fbb-*} {2} % missing centoldstyle % \end{macrocode} % +% % \begin{macrocode} \DeclareEncodingSubset{TS1}{Alegreya-*} {2} \DeclareEncodingSubset{TS1}{AlegreyaSans-*} {2} +\DeclareEncodingSubset{TS1}{BaskervilleF-*} {2} \DeclareEncodingSubset{TS1}{DejaVuSans-TLF} {2} \DeclareEncodingSubset{TS1}{DejaVuSansCondensed-TLF} {2} +% \end{macrocode} +% Next one is missing \cs{textfractionsolidus} but is otherwise +% completely sub-encoding 2 so we use that sub-encoding. +% \begin{macrocode} \DeclareEncodingSubset{TS1}{DejaVuSansMono-TLF} {2} +% \end{macrocode} +% +% \begin{macrocode} \DeclareEncodingSubset{TS1}{EBGaramond-*} {2} +\DeclareEncodingSubset{TS1}{Merriwthr-OsF} {2} +\DeclareEncodingSubset{TS1}{MerriwthrSans-OsF} {2} +\DeclareEncodingSubset{TS1}{Montserrat-*} {2} +\DeclareEncodingSubset{TS1}{MontserratAlternates-*} {2} +\DeclareEncodingSubset{TS1}{NotoSansMono-TLF} {2} +\DeclareEncodingSubset{TS1}{NotoSansMono-TOsF} {2} \DeclareEncodingSubset{TS1}{Tempora-TLF} {2} \DeclareEncodingSubset{TS1}{Tempora-TOsF} {2} +\DeclareEncodingSubset{TS1}{XCharter-TLF} {2} +\DeclareEncodingSubset{TS1}{XCharter-TOsF} {2} +\DeclareEncodingSubset{TS1}{erewhon-*} {2} % \end{macrocode} % % \begin{macrocode} \DeclareEncodingSubset{TS1}{Arimo-TLF} {3} -\DeclareEncodingSubset{TS1}{Carlito-*} {3} -\DeclareEncodingSubset{TS1}{FiraSans-*} {3} +\DeclareEncodingSubset{TS1}{Crlt-*} {3} +\DeclareEncodingSubset{TS1}{IBMPlexMono-TLF} {3} \DeclareEncodingSubset{TS1}{IBMPlexSans-TLF} {3} -\DeclareEncodingSubset{TS1}{Merriweather-OsF} {3} -\DeclareEncodingSubset{TS1}{Montserrat-*} {3} -\DeclareEncodingSubset{TS1}{MontserratAlternates-*} {3} +\DeclareEncodingSubset{TS1}{IBMPlexSerif-TLF} {3} \DeclareEncodingSubset{TS1}{SourceCodePro-TLF} {3} \DeclareEncodingSubset{TS1}{SourceCodePro-TOsF} {3} \DeclareEncodingSubset{TS1}{SourceSansPro-*} {3} @@ -1096,6 +1139,7 @@ \DeclareEncodingSubset{TS1}{CrimsonPro-*} {4} \DeclareEncodingSubset{TS1}{FiraMono-TLF} {4} \DeclareEncodingSubset{TS1}{FiraMono-TOsF} {4} +\DeclareEncodingSubset{TS1}{FiraSans-*} {4} \DeclareEncodingSubset{TS1}{Go-TLF} {4} \DeclareEncodingSubset{TS1}{GoMono-TLF} {4} \DeclareEncodingSubset{TS1}{InriaSans-*} {4} @@ -1108,7 +1152,6 @@ \DeclareEncodingSubset{TS1}{LinguisticsPro-OsF} {4} \DeclareEncodingSubset{TS1}{LinuxBiolinumT-*} {4} \DeclareEncodingSubset{TS1}{LinuxLibertineT-*} {4} -\DeclareEncodingSubset{TS1}{MerriweatherSans-OsF} {4} \DeclareEncodingSubset{TS1}{MintSpirit-*} {4} \DeclareEncodingSubset{TS1}{MintSpiritNoTwo-*} {4} \DeclareEncodingSubset{TS1}{PTMono-TLF} {4} @@ -1128,66 +1171,64 @@ % \end{macrocode} % % \begin{macrocode} -\DeclareEncodingSubset{TS1}{Almendra-OsF} {5} +\DeclareEncodingSubset{TS1}{Almndr-OsF} {5} \DeclareEncodingSubset{TS1}{Baskervaldx-*} {5} -\DeclareEncodingSubset{TS1}{BaskervilleF-*} {5} -\DeclareEncodingSubset{TS1}{Bitter-TLF} {5} +\DeclareEncodingSubset{TS1}{Bttr-TLF} {5} \DeclareEncodingSubset{TS1}{Cinzel-LF} {5} \DeclareEncodingSubset{TS1}{CinzelDecorative-LF} {5} +\DeclareEncodingSubset{TS1}{Cochineal-*} {5} \DeclareEncodingSubset{TS1}{DejaVuSerif-TLF} {5} \DeclareEncodingSubset{TS1}{DejaVuSerifCondensed-TLF} {5} \DeclareEncodingSubset{TS1}{GilliusADF-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFCond-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFNoTwo-LF} {5} \DeclareEncodingSubset{TS1}{GilliusADFNoTwoCond-LF} {5} -\DeclareEncodingSubset{TS1}{LobsterTwo-LF} {5} \DeclareEncodingSubset{TS1}{OldStandard-TLF} {5} -\DeclareEncodingSubset{TS1}{PlayfairDisplay-TLF} {5} -\DeclareEncodingSubset{TS1}{PlayfairDisplay-TOsF} {5} +\DeclareEncodingSubset{TS1}{PlyfrDisplay-TLF} {5} +\DeclareEncodingSubset{TS1}{PlyfrDisplay-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoDidot-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoDidot-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoModern-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoModern-TOsF} {5} \DeclareEncodingSubset{TS1}{TheanoOldStyle-TLF} {5} \DeclareEncodingSubset{TS1}{TheanoOldStyle-TOsF} {5} +\DeclareEncodingSubset{TS1}{charssil-TLF} {5} % \end{macrocode} % % \begin{macrocode} \DeclareEncodingSubset{TS1}{Crimson-TLF} {6} -\DeclareEncodingSubset{TS1}{IBMPlexMono-TLF} {6} -\DeclareEncodingSubset{TS1}{IBMPlexSerif-TLF} {6} -\DeclareEncodingSubset{TS1}{LibertinusMono-TLF} {6} \DeclareEncodingSubset{TS1}{LibertinusSerifDisplay-LF}{6} \DeclareEncodingSubset{TS1}{LinuxLibertineDisplayT-*} {6} \DeclareEncodingSubset{TS1}{LinuxLibertineMonoT-LF} {6} \DeclareEncodingSubset{TS1}{LinuxLibertineMonoT-TLF} {6} -\DeclareEncodingSubset{TS1}{Overlock-LF} {6} +\DeclareEncodingSubset{TS1}{Ovrlck-LF} {6} % \end{macrocode} % % \begin{macrocode} +\DeclareEncodingSubset{TS1}{ComicNeue-TLF} {7} +\DeclareEncodingSubset{TS1}{ComicNeueAngular-TLF} {7} \DeclareEncodingSubset{TS1}{CormorantGaramond-*} {7} \DeclareEncodingSubset{TS1}{Heuristica-TLF} {7} \DeclareEncodingSubset{TS1}{Heuristica-TOsF} {7} \DeclareEncodingSubset{TS1}{IMFELLEnglish-TLF} {7} -\DeclareEncodingSubset{TS1}{LibreBaskerville-TLF} {7} -\DeclareEncodingSubset{TS1}{LibreCaslon-*} {7} -\DeclareEncodingSubset{TS1}{Marcellus-LF} {7} +\DeclareEncodingSubset{TS1}{LibreBskrvl-TLF} {7} +\DeclareEncodingSubset{TS1}{LibreCsln-*} {7} +\DeclareEncodingSubset{TS1}{Lbstr-LF} {7} +\DeclareEncodingSubset{TS1}{Mrcls-LF} {7} +% \end{macrocode} +% Strangely enough NotoSerif and NotoSans are sub-encoding 7 as +% they are missing \cs{textminus} and several other glyphs. In +% contrast the NotoSansMono is far more complete. +% \begin{macrocode} \DeclareEncodingSubset{TS1}{NotoSans-*} {7} -\DeclareEncodingSubset{TS1}{NotoSansMono-TLF} {7} -\DeclareEncodingSubset{TS1}{NotoSansMono-TOsF} {7} \DeclareEncodingSubset{TS1}{NotoSerif-*} {7} -\DeclareEncodingSubset{TS1}{Quattrocento-TLF} {7} -\DeclareEncodingSubset{TS1}{QuattrocentoSans-TLF} {7} -\DeclareEncodingSubset{TS1}{XCharter-TLF} {7} -\DeclareEncodingSubset{TS1}{XCharter-TOsF} {7} -\DeclareEncodingSubset{TS1}{erewhon-*} {7} -\DeclareEncodingSubset{TS1}{ComicNeue-TLF} {7} -\DeclareEncodingSubset{TS1}{ComicNeueAngular-TLF} {7} -\DeclareEncodingSubset{TS1}{Forum-LF} {7} % the superiors are missing +\DeclareEncodingSubset{TS1}{Quattro-LF} {7} +\DeclareEncodingSubset{TS1}{QuattroSans-LF} {7} +\DeclareEncodingSubset{TS1}{Frm-LF} {7} % the superiors are missing % \end{macrocode} % % \begin{macrocode} -\DeclareEncodingSubset{TS1}{Cochineal-*} {8} +\DeclareEncodingSubset{TS1}{LibertinusMono-TLF} {8} % \end{macrocode} % % \begin{macrocode} @@ -1231,7 +1272,7 @@ % % Here are new names for the legacy symbols that \LaTeX{} used to % pick up from the \texttt{OMS} encoded fonts (and used for itemize -% lists or footnote symbols. +% lists or footnote symbols). % % We go the roundabout way via separate OMS declarations so that %\begin{verbatim} @@ -1481,7 +1522,6 @@ % % % -% % \section{The \texttt{textcomp} package} % % @@ -1706,7 +1746,7 @@ % The default is ``almostfull'' which means that old documents will % work except that |\textcircled| and |\t| will use the kernel % defaults (with the advantage that this also works if the current -% font (as often the case) doesn't implement these glyphs. +% font, as often the case, doesn't implement these glyphs). % % The ``force'' option simply sets the switch to true. % \begin{macrocode} @@ -2301,8 +2341,547 @@ % \begin{macrocode} %</TS1oldsty> % \end{macrocode} +% +% +% +% +% \section{The \texttt{checkencodingsubset.tex} file} +% +% This is a simple file that asks for a name of a font family and +% then displays information about the TS1 encoding for this family +% and recommends the right encoding subset (to be used with +% \cs{DeclareEncodingsubset}) for this family. +% \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] +% \end{macrocode} +% +% \begin{macrocode} +\let\typeoutdetails\typeout +%\def\typeoutdetails#1{} % alternative definition used below +% \end{macrocode} +% +% For the purpose of this check a glyph exists if the font slot is +% occupied---too bad if that contains the wrong glyph or some tofu. +% If it ``exists'' we return 0 otherwise 1. This way we can call +% this macro several times in a row and obtain a number that is 0 +% if all glyphs are existing or greater than 0 if any of them is +% missing. +% +% The second argument (holding the command name for a symbol) is +% not used during these tests. +% \begin{macrocode} +\def\doesglyphexist#1#2{\iffontchar\testFont #1 0\else 1\relax \fi} +% \end{macrocode} +% +% This macro also tests and outputs some information about the +% symbol if it is missing. This time we make use of the second +% argument. +% \begin{macrocode} +\def\glyphmissingdetails#1#2{\iffontchar\testFont #1 \else + \typeoutdetails{\space\space\space ==> \string#2 (#1) is missing}\fi} +% \end{macrocode} +% +% \begin{macrocode} +\newif\ifsafesubencodingfound +\newif\ifcoremisses +% \end{macrocode} +% +% Testing a group of symbols that belong to one sub-encoding. More +% precisely, the symbols that become unavailable if you change from +% sub-encoding $x$ (\texttt{\#2}) to $x+1$ (\texttt{\#3}). As far +% as the code is concerned, the +% symbols that are supposed to be always available (the core) +% become available if we test the group \texttt{-1} and \texttt{0}. +% +% The first argument contains the testing code and is supposed to +% return a single number greater or equal to zero. +% \begin{macrocode} +\def\testgroup#1#2#3{% + \ifnum 0 = #1% + \ifnum #2<0 + \typeoutdetails{All glyphs in core exist}% + \else + \typeoutdetails{All glyphs between sub-encoding #2 and #3 exist}% + \fi + \else + \ifnum #2<0 + \typeoutdetails{**********************************}% + \typeoutdetails{Some glyphs are missing from core:}% + \coremissestrue + \ifsafesubencodingfound \else + \def\subencodingresult{#2}% + \fi + \else + \typeoutdetails{Some glyphs are missing from sub-encoding #2:}% + \ifsafesubencodingfound \else + \def\subencodingresult{#3}% + \fi + \fi +% \end{macrocode} +% If some glyphs are missing, we rerun the test code but this time +% using \cs{glyphmissingdetails}. +% \begin{macrocode} + {\let\doesglyphexist \glyphmissingdetails #1}% +% \end{macrocode} +% And because we had misses we have definitely found the subset. +% \begin{macrocode} + \safesubencodingfoundtrue + \fi +} +% \end{macrocode} +% +% The currently defined subset for the family is either stored in +% \cs{TS1:\meta{family}} if it was declared, or it is the default +% subset which is stored in \cs{TS1:?}. +% \begin{macrocode} +\def\currsubencoding#1{\csname TS1:\ifcsname TS1:#1\endcsname #1\else ?\fi\endcsname} +% \end{macrocode} +% +% If a font family is not found when declaring it with +% \cs{DeclareFixedFont} we end up with the following font. This can +% then be used as a simple test if we failed loading the TS1 font. +% \begin{macrocode} +\DeclareFixedFont\cmrFont{TS1}{cmr}{m}{n}{10pt} +% \end{macrocode} +% +% Check for all glyphs in all encoding subsets \ldots +% \begin{macrocode} +\def\testallgroups#1{% + \DeclareFixedFont\testFont{TS1}{#1}{m}{n}{10pt}% + \ifx\testFont\cmrFont + \typeout{***** Font family #1 not found ****}% + \else +% \end{macrocode} +% We haven't checked anything yet. +% \begin{macrocode} + \safesubencodingfoundfalse + \coremissesfalse + \typeoutdetails{^^J-----------------------------------------}% + \typeoutdetails{Testing font family #1^^J(currently TS1-sub-encoding + \currsubencoding{#1})}% + \typeout{-----------------------------------------}% +% \end{macrocode} +% Then we start testing the groups beginning with the glyphs +% between sub-encoding 8 and 9. If any of them is missing (checked +% with \cs{doesglyphexist}) then we already know that 9 is the +% correct answer. +% \begin{macrocode} + \testgroup{% + \doesglyphexist{21}{\texttwelveudash}% + \doesglyphexist{22}{\textthreequartersemdash}% + \doesglyphexist{134}{\textbardbl}% + \doesglyphexist{137}{\textcelsius}% + \doesglyphexist{178}{\texttwosuperior}% + \doesglyphexist{179}{\textthreesuperior}% + \doesglyphexist{185}{\textonesuperior}% + }{8}{9}% +% \end{macrocode} +% Nevertheless we go on with further groups so that the output +% lists all missing glyphs. +% \begin{macrocode} + \testgroup{% + \doesglyphexist{32}{\textblank}% + \doesglyphexist{148}{\textinterrobang}% + \doesglyphexist{149}{\textinterrobangdown}% + \doesglyphexist{191}{\texteuro}% + }{7}{8}% + \testgroup{% + \doesglyphexist{47}{\textfractionsolidus}% + \doesglyphexist{61}{\textminus}% + \doesglyphexist{87}{\textohm}% + \doesglyphexist{181}{\textmu}% + }{6}{7}% + \testgroup{% + \doesglyphexist{140}{\textflorin}% + \doesglyphexist{164}{\textcurrency}% + }{5}{6}% + \testgroup{% + \doesglyphexist{155}{\textnumero}% + \doesglyphexist{157}{\textestimated}% + }{4}{5}% + \testgroup{% + \doesglyphexist{24}{\textleftarrow}% + \doesglyphexist{25}{\textrightarrow}% + \doesglyphexist{94}{\textuparrow}% + \doesglyphexist{95}{\textdownarrow}% + \doesglyphexist{141}{\textcolonmonetary}% + \doesglyphexist{142}{\textwon}% + \doesglyphexist{146}{\textlira}% + \doesglyphexist{150}{\textdong}% + }{3}{4}% + \testgroup{% + \doesglyphexist{60}{\textlangle}% + \doesglyphexist{62}{\textrangle}% + }{2}{3}% + \testgroup{% + \doesglyphexist{0}{\capitalgrave}% + \doesglyphexist{1}{\capitalacute}% + \doesglyphexist{2}{\capitalcircumflex}% + \doesglyphexist{3}{\capitaltilde}% + \doesglyphexist{4}{\capitaldieresis}% + \doesglyphexist{5}{\capitalhungarumlaut}% + \doesglyphexist{6}{\capitalring}% + \doesglyphexist{7}{\capitalcaron}% + \doesglyphexist{8}{\capitalbreve}% + \doesglyphexist{9}{\capitalmacron}% + \doesglyphexist{10}{\capitaldotaccent}% + \doesglyphexist{11}{\capitalcedilla}% + \doesglyphexist{12}{\capitalogonek}% + \doesglyphexist{26}{\t}% + \doesglyphexist{27}{\capitaltie}% + \doesglyphexist{28}{\newtie}% + \doesglyphexist{29}{\capitalnewtie}% + \doesglyphexist{45}{\textdblhyphen}% + \doesglyphexist{48}{\textzerooldstyle}% + \doesglyphexist{49}{\textoneoldstyle}% + \doesglyphexist{50}{\texttwooldstyle}% + \doesglyphexist{51}{\textthreeoldstyle}% + \doesglyphexist{52}{\textfouroldstyle}% + \doesglyphexist{53}{\textfiveoldstyle}% + \doesglyphexist{54}{\textsixoldstyle}% + \doesglyphexist{55}{\textsevenoldstyle}% + \doesglyphexist{56}{\texteightoldstyle}% + \doesglyphexist{57}{\textnineoldstyle}% + \doesglyphexist{77}{\textmho}% + \doesglyphexist{79}{\textbigcircle}% + \doesglyphexist{91}{\textlbrackdbl}% + \doesglyphexist{93}{\textrbrackdbl}% + \doesglyphexist{96}{\textasciigrave}% + \doesglyphexist{98}{\textborn}% + \doesglyphexist{99}{\textdivorced}% + \doesglyphexist{100}{\textdied}% + \doesglyphexist{108}{\textleaf}% + \doesglyphexist{109}{\textmarried}% + \doesglyphexist{110}{\textmusicalnote}% + \doesglyphexist{126}{\texttildelow}% + \doesglyphexist{127}{\textdblhyphenchar}% + \doesglyphexist{128}{\textasciibreve}% + \doesglyphexist{129}{\textasciicaron}% + \doesglyphexist{175}{\textasciimacron}% + \doesglyphexist{130}{\textacutedbl}% + \doesglyphexist{131}{\textgravedbl}% + \doesglyphexist{138}{\textdollaroldstyle}% + \doesglyphexist{139}{\textcentoldstyle}% + \doesglyphexist{143}{\textnaira}% + \doesglyphexist{144}{\textguarani}% + \doesglyphexist{145}{\textpeso}% + \doesglyphexist{147}{\textrecipe}% + \doesglyphexist{152}{\textpertenthousand}% + \doesglyphexist{153}{\textpilcrow}% + \doesglyphexist{154}{\textbaht}% + \doesglyphexist{156}{\textdiscount}% + \doesglyphexist{158}{\textopenbullet}% + \doesglyphexist{159}{\textservicemark}% + \doesglyphexist{160}{\textlquill}% + \doesglyphexist{161}{\textrquill}% + \doesglyphexist{168}{\textasciidieresis}% + \doesglyphexist{171}{\textcopyleft}% + \doesglyphexist{173}{\textcircledP}% + \doesglyphexist{180}{\textasciiacute}% + \doesglyphexist{184}{\textreferencemark}% + \doesglyphexist{187}{\textsurd}% + }{1}{2}% +% \end{macrocode} +% All fonts (up to now) that belong to sub-encoding 1 do have the +% \cs{textcircled} glyph, but it is too small to be usable. So this +% test for this group currently doesn't do much good---but who +% knows maybe one day a font shows up in which this glyph is +% actually missing. +% \begin{macrocode} + \testgroup{% + \doesglyphexist{79}{\textcircled}% this is not a proper test because the symbol is + % usually available but not usable + }{0}{1}% + \testgroup{% + \doesglyphexist{13}{\textquotestraightbase}% + \doesglyphexist{18}{\textquotestraightdblbase}% + \doesglyphexist{23}{\textcapitalcompwordmark}% + \doesglyphexist{31}{\textascendercompwordmark}% + \doesglyphexist{36}{\textdollar}% + \doesglyphexist{39}{\textquotesingle}% + \doesglyphexist{42}{\textasteriskcentered}% + \doesglyphexist{132}{\textdagger}% + \doesglyphexist{133}{\textdaggerdbl}% + \doesglyphexist{135}{\textperthousand}% + \doesglyphexist{136}{\textbullet}% + \doesglyphexist{151}{\texttrademark}% + \doesglyphexist{162}{\textcent}% + \doesglyphexist{163}{\textsterling}% + \doesglyphexist{165}{\textyen}% + \doesglyphexist{166}{\textbrokenbar}% + \doesglyphexist{167}{\textsection}% + \doesglyphexist{169}{\textcopyright}% + \doesglyphexist{170}{\textordfeminine}% + \doesglyphexist{172}{\textlnot}% + \doesglyphexist{174}{\textregistered}% + \doesglyphexist{176}{\textdegree}% + \doesglyphexist{177}{\textpm}% + \doesglyphexist{182}{\textparagraph}% + \doesglyphexist{183}{\textperiodcentered}% + \doesglyphexist{186}{\textordmasculine}% + \doesglyphexist{188}{\textonequarter}% + \doesglyphexist{189}{\textonehalf}% + \doesglyphexist{190}{\textthreequarters}% + \doesglyphexist{214}{\texttimes}% + \doesglyphexist{246}{\textdiv}% + }{-1}{0}% +% \end{macrocode} +% If all groups have all glyphs then we have the full encoding +% (subset 0). +% \begin{macrocode} + \ifsafesubencodingfound\else + \def\subencodingresult{0}% + \fi +% \end{macrocode} +% If the font is missing some of the core glyphs we make a remark +% about this, because they will never display. +% \begin{macrocode} + \typeoutdetails{-----------------------------------------}% + \typeout{TS1 encoding subset for #1\ifcoremisses \space(ignoring core misses)\fi + \space (\ifnum\subencodingresult = + \currsubencoding{#1} ok\else bad\fi)}% + \typeout{Use sub-encoding \subencodingresult + \ifnum\subencodingresult = \currsubencoding{#1}\else + \space (not \currsubencoding{#1})\fi} + \typeout{-----------------------------------------^^J}% + \fi +} +% \end{macrocode} +% +% This tests all declarations (or most of them) that have been +% added to the kernel. It is called if no family is given interactively. +% \begin{macrocode} +\long\def\testallkerneldefinedfamilies{% +\testallgroups{ccr}% {0} +\testallgroups{cmbr}% {0} +%%\testallgroups{cmr}% {0} % don't test this one as it is the fallback + % thus reports that the family is not found +\testallgroups{cmss}% {0} +\testallgroups{cmtl}% {0} +\testallgroups{cmtt}% {0} +\testallgroups{cmvtt}% {0} +\testallgroups{pxr}% {0} +\testallgroups{pxss}% {0} +\testallgroups{pxtt}% {0} +\testallgroups{qag}% {0} +\testallgroups{qbk}% {0} +\testallgroups{qcr}% {0} +\testallgroups{qcs}% {0} +\testallgroups{qhvc}% {0} +\testallgroups{qhv}% {0} +\testallgroups{qpl}% {0} +\testallgroups{qtm}% {0} +\testallgroups{qzc}% {0} +\testallgroups{txr}% {0} +\testallgroups{txss}% {0} +\testallgroups{txtt}% {0} +% +% Next would claim to be 0 (or 2) +% +%\testallgroups{lmr}% {1} +%\testallgroups{lmdh}% {1} +%\testallgroups{lmss}% {1} +%\testallgroups{lmssq}% {1} +%\testallgroups{lmvtt}% {1} +%\testallgroups{lmtt}% {1} % missing TM, SM and pertenthousand so really 2 +% +% these are no longer in TeX Live +% +%\testallgroups{ptmx}% {2} % gone for a long time it seems +%\testallgroups{ptmj}% {2} % ditto +%\testallgroups{ul8}% {2} % ditto +% +% next block has tofu chars so results are wrong +% +%\testallgroups{bch}% {5} % tofu for blank, ohm +%\testallgroups{futj}%{5} % tofu for blank, interrobang/down, ohm +%\testallgroups{futs}%{5} % tofu for blank, ohm +%\testallgroups{futx}%{5} % probably (currently broken distrib) +%\testallgroups{pag}% {5} % tofu for blank, interrobang/down, ohm +%\testallgroups{pbk}% {5} % tofu for blank, interrobang/down, ohm +%\testallgroups{pcr}% {5} % tofu for blank, interrobang/down, ohm +%\testallgroups{phv}% {5} % tofu for blank, interrobang/down, ohm +%\testallgroups{pnc}% {5} % tofu for blank, interrobang/down, ohm +%\testallgroups{pplj}%{5} % tofu for blank +%\testallgroups{pplx}%{5} % tofu for blank +%\testallgroups{ppl}% {5} % tofu for blank interrobang/down +%\testallgroups{ptm}% {5} % tofu for blank, interrobang/down, ohm +%\testallgroups{pzc}% {5} % tofu for blank, interrobang/down, ohm +%\testallgroups{ul9}% {5} % tofu for blank, interrobang/down, ohm +%\testallgroups{dayroms}%{6} % tofu for blank, interrobang/down, ohm +%\testallgroups{dayrom}% {6} % tofu for blank, interrobang/down, ohm +%\testallgroups{augie}%{8} % really only missing euro and full of tofu +%\testallgroups{put}% {8} +%\testallgroups{uag}% {8} % probably (currently broken distrib) +%\testallgroups{ugq}% {8} +% +\testallgroups{zi4}% {9} +% +%% not installed normally +% +%\testallgroups{hls}% {5} +%\testallgroups{hlst}% {5} +%\testallgroups{hlct}% {5} +%\testallgroups{hlh}% {5} +%\testallgroups{hlx}% {8} +%\testallgroups{hlce}% {8} +%\testallgroups{hlcn}% {8} +%\testallgroups{hlcw}% {8} +%\testallgroups{hlcf}% {8} - +\testallgroups{lato-LF}% {0} % with a bunch of tofu inside --- should probably be changed +\testallgroups{opensans-TLF}%{0} % with a bunch of tofu inside --- should probably be changed +\testallgroups{cantarell-TLF}% {0} % with a bunch of tofu inside --- should probably be changed +\testallgroups{fbb-LF}% {0} % missing centoldstyle ---> 2 +\testallgroups{tli}% {1} % with lots of tofu inside --- should probably be changed +\testallgroups{Alegreya-OsF}% {2} +\testallgroups{AlegreyaSans-OsF}% {2} +\testallgroups{DejaVuSans-TLF}% {2} +\testallgroups{DejaVuSansCondensed-TLF}% {2} +\testallgroups{DejaVuSansMono-TLF}% {2} this is missing \textfractionsolidus which makes it 7 really +\testallgroups{EBGaramond-LF}% {2} +\testallgroups{Tempora-TLF}% {2} +\testallgroups{Tempora-TOsF}% {2} +\testallgroups{Arimo-TLF}% {3} +\testallgroups{Crlt-TLF}% {3} changed from Carlito- +\testallgroups{FiraSans-LF}% {3} should be 4 +\testallgroups{IBMPlexSans-TLF}% {3} +\testallgroups{Merriwthr-OsF}% {3} changed from Merriweather- and should be 2 +\testallgroups{Montserrat-LF}% {3} now 2 +\testallgroups{MontserratAlternates-LF}%{3} now 2 +\testallgroups{SourceCodePro-TLF}% {3} +\testallgroups{SourceCodePro-TOsF}% {3} +\testallgroups{SourceSansPro-OsF}% {3} +\testallgroups{SourceSerifPro-LF}% {3} +\testallgroups{Tinos-TLF}% {3} +\testallgroups{AccanthisADFStdNoThree-LF}%{4} +\testallgroups{Cabin-TLF}% {4} +\testallgroups{Caladea-TLF}% {4} +\testallgroups{Chivo-LF}% {4} +\testallgroups{ClearSans-TLF}% {4} +\testallgroups{Coelacanth-LF}% {4} +\testallgroups{CrimsonPro-LF}% {4} +\testallgroups{FiraMono-TLF}% {4} +\testallgroups{FiraMono-TOsF}% {4} +\testallgroups{Go-TLF}% {4} +\testallgroups{GoMono-TLF}% {4} +\testallgroups{InriaSans-LF}% {4} +\testallgroups{InriaSerif-LF}% {4} +\testallgroups{LibertinusSans-LF}% {4} +\testallgroups{LibertinusSerif-LF}% {4} +\testallgroups{LibreBodoni-TLF}% {4} +\testallgroups{LibreFranklin-TLF}% {4} +\testallgroups{LinguisticsPro-LF}% {4} +\testallgroups{LinguisticsPro-OsF}% {4} +\testallgroups{LinuxBiolinumT-LF}% {4} +\testallgroups{LinuxLibertineT-LF}% {4} +\testallgroups{MerriwthrSans-OsF}% {4} name change and now 2 +\testallgroups{MintSpirit-LF}% {4} +\testallgroups{MintSpiritNoTwo-LF}% {4} +\testallgroups{PTMono-TLF}% {4} +\testallgroups{PTSans-TLF}% {4} +\testallgroups{PTSansCaption-TLF}% {4} +\testallgroups{PTSansNarrow-TLF}% {4} +\testallgroups{PTSerif-TLF}% {4} +\testallgroups{PTSerifCaption-TLF}% {4} +\testallgroups{Raleway-TLF}% {4} +\testallgroups{Raleway-TOsF}% {4} +\testallgroups{Roboto-LF}% {4} +\testallgroups{RobotoMono-TLF}% {4} +\testallgroups{RobotoSlab-TLF}% {4} +\testallgroups{Rosario-LF}% {4} +\testallgroups{SticksTooText-LF}% {4} +\testallgroups{UniversalisADFStd-LF}%{4} +\testallgroups{Almndr-OsF}% {5} name change +\testallgroups{Baskervaldx-LF}% {5} +\testallgroups{BaskervilleF-LF}% {5} now 2 +\testallgroups{Bttr-TLF}% {5} name changed from Bitter-... +\testallgroups{Cinzel-LF}% {5} +\testallgroups{CinzelDecorative-LF}%{5} +\testallgroups{DejaVuSerif-TLF}% {5} +\testallgroups{DejaVuSerifCondensed-TLF}% {5} +\testallgroups{GilliusADF-LF}% {5} +\testallgroups{charssil-TLF} %% missing should be 5 +\testallgroups{GilliusADFCond-LF}%{5} +\testallgroups{GilliusADFNoTwo-LF}%{5} +\testallgroups{GilliusADFNoTwoCond-LF}%{5} +\testallgroups{Lbstr-LF}% {5} name change and should be 7 +\testallgroups{OldStandard-TLF}% {5} +\testallgroups{PlyfrDisplay-LF}%{5} name change +\testallgroups{PlyfrDisplay-OsF}% {5} name change +\testallgroups{TheanoDidot-TLF}% {5} +\testallgroups{TheanoDidot-TOsF}% {5} +\testallgroups{TheanoModern-TLF}% {5} +\testallgroups{TheanoModern-TOsF}%{5} +\testallgroups{TheanoOldStyle-TLF}%{5} +\testallgroups{TheanoOldStyle-TOsF}%{5} +\testallgroups{Crimson-TLF}% {6} +\testallgroups{IBMPlexMono-TLF}% {6} now 3 +\testallgroups{IBMPlexSerif-TLF}% {6} now 3 +\testallgroups{LibertinusMono-TLF}%{6} should be 8 +\testallgroups{LibertinusSerifDisplay-LF}%{6} +\testallgroups{LinuxLibertineDisplayT-LF}%{6} +\testallgroups{LinuxLibertineMonoT-LF}%{6} +\testallgroups{LinuxLibertineMonoT-TLF}%{6} +\testallgroups{Ovrlck-LF}% {6} name changed +\testallgroups{CormorantGaramond-LF}%{7} +\testallgroups{Heuristica-TLF}% {7} +\testallgroups{Heuristica-TOsF}% {7} +\testallgroups{IMFELLEnglish-TLF}%{7} +\testallgroups{LibreBskvl-LF}% {7} %% wrong name LibreBaskerville-TLF +\testallgroups{LibreCsln-LF}% {7} changed from LibreCaslon- +\testallgroups{Mrcls-LF}% {7} %% wrong name Marcellus-LF +\testallgroups{NotoSans-LF}% {7} +\testallgroups{NotoSansMono-TLF}%{7} now 2 +\testallgroups{NotoSansMono-TOsF}%{7} now 2 +\testallgroups{NotoSerif-LF}% {7} +\testallgroups{Quattro-LF}% {7} changed from Quattrocento- +\testallgroups{QuattroSans-LF}% {7} changed from QuattrocentoSans- +\testallgroups{XCharter-TLF}% {7} now 2 +\testallgroups{XCharter-TOsF}% {7} now 2 +\testallgroups{erewhon-LF}% {7} now 2 +\testallgroups{ComicNeue-TLF}% {7} +\testallgroups{ComicNeueAngular-TLF}%{7} +\testallgroups{Frm-LF}%{7} % the superiors are missing; name changed from Forum-LF +\testallgroups{Cochineal-TLF}% {8} now 5 +\testallgroups{AlgolRevived-TLF}%{9} +} +% \end{macrocode} +% +% There interaction with the user. +% \begin{macrocode} +\typeout{^^J=====================================================================} +\typeout{| Enter font family to check (or <enter> for kernel defined families)} +\typeout{=====================================================================} +\typein[\FontFamilyToCheck]{} +% \end{macrocode} +% +% \begin{macrocode} +\if!\FontFamilyToCheck! + \typeout{=====================================================================} + \typeout{| Detailed output? (default no)} + \typeout{=====================================================================} + \typein[\Details]{} + \if!\Details! + \def\typeoutdetails#1{} + \else + \let\typeoutdetails\typeout + \fi + \testallkerneldefinedfamilies +\else + \let\typeoutdetails\typeout + \testallgroups\FontFamilyToCheck +\fi +% \end{macrocode} +% +% \begin{macrocode} +\stop +%</TS1check> +% \end{macrocode} +% % \Finale % diff --git a/macros/latex-dev/base/ltthm.dtx b/macros/latex-dev/base/ltthm.dtx index b321c7ac2b..180b8accfe 100644 --- a/macros/latex-dev/base/ltthm.dtx +++ b/macros/latex-dev/base/ltthm.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltvers.dtx b/macros/latex-dev/base/ltvers.dtx index e169dee020..3896935525 100644 --- a/macros/latex-dev/base/ltvers.dtx +++ b/macros/latex-dev/base/ltvers.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -115,7 +115,7 @@ {2024-06-01} %</2ekernel|latexrelease> %<*2ekernel> -\def\patch@level{0} +\def\patch@level{-1} % \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 61f04c83ca..4abf1f8a46 100644 --- a/macros/latex-dev/base/ltx3info.pdf +++ b/macros/latex-dev/base/ltx3info.pdf diff --git a/macros/latex-dev/base/ltx3info.tex b/macros/latex-dev/base/ltx3info.tex index 096fa2db9a..bfa09b9b87 100644 --- a/macros/latex-dev/base/ltx3info.tex +++ b/macros/latex-dev/base/ltx3info.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltxcheck.tex b/macros/latex-dev/base/ltxcheck.tex index d219d2ebc2..244bddffce 100644 --- a/macros/latex-dev/base/ltxcheck.tex +++ b/macros/latex-dev/base/ltxcheck.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltxdoc.dtx b/macros/latex-dev/base/ltxdoc.dtx index e147c9d22f..5e8b494692 100644 --- a/macros/latex-dev/base/ltxdoc.dtx +++ b/macros/latex-dev/base/ltxdoc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -30,7 +30,7 @@ % %<class>\NeedsTeXFormat{LaTeX2e} %<class>\ProvidesClass{ltxdoc} -%<class> [2023/03/28 v2.1j Standard LaTeX documentation class] +%<class> [2024/02/08 v2.1j Standard LaTeX documentation class] % %<*driver> \documentclass{ltxdoc} @@ -288,12 +288,13 @@ % \section{Useful abbreviations} % % |\cmd{\foo}| Prints |\foo| verbatim. It may be used inside moving -% arguments. It can \emph{not} be use to record commands that are defined as +% arguments. It can \emph{not} be used to record commands that are defined as % ``|\outer|'' nor is it possible to use it on conditionals such as % |\iftrue| or defined by |\newif|. -% |\cs{foo}| already available with the \texttt{doc} package also prints |\foo|, for those who prefer that +% |\cs{foo}| Already available with the \texttt{doc} package and also prints |\foo|, +% for those who prefer that % syntax. (This second form can be used to record all types of command so the -% above restrictions do not apply. +% above restrictions do not apply.) % \begin{macro}{\cmd} % \changes{v2.0k}{1994/05/21}{New definition, so \cmd\{ works.} % \begin{macro}{\cs} @@ -676,7 +677,7 @@ Bug reports can be opened (category \texttt{#1}) at\\% % % Copyright 2006, 2007, 2011 % Heiko Oberdiek -% Copyright (C) 2014-2023 +% Copyright (C) 2014-2024 % The LaTeX Project % diff --git a/macros/latex-dev/base/ltxdoc.pdf b/macros/latex-dev/base/ltxdoc.pdf Binary files differindex 334349f4bb..61a0b18e68 100644 --- a/macros/latex-dev/base/ltxdoc.pdf +++ b/macros/latex-dev/base/ltxdoc.pdf diff --git a/macros/latex-dev/base/ltxguide.cls b/macros/latex-dev/base/ltxguide.cls index 778f7e993e..c202b56acb 100644 --- a/macros/latex-dev/base/ltxguide.cls +++ b/macros/latex-dev/base/ltxguide.cls @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/ltxref.dtx b/macros/latex-dev/base/ltxref.dtx index 0f842e4312..79cf01be77 100644 --- a/macros/latex-dev/base/ltxref.dtx +++ b/macros/latex-dev/base/ltxref.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/makeindx.dtx b/macros/latex-dev/base/makeindx.dtx index b91d3a6c44..20da2f159d 100644 --- a/macros/latex-dev/base/makeindx.dtx +++ b/macros/latex-dev/base/makeindx.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/makeindx.ins b/macros/latex-dev/base/makeindx.ins index 1c5f6edcb9..45e5c9aab0 100644 --- a/macros/latex-dev/base/makeindx.ins +++ b/macros/latex-dev/base/makeindx.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/makeindx.pdf b/macros/latex-dev/base/makeindx.pdf Binary files differindex d6c1e08074..a2ab245043 100644 --- a/macros/latex-dev/base/makeindx.pdf +++ b/macros/latex-dev/base/makeindx.pdf diff --git a/macros/latex-dev/base/minimal.cls b/macros/latex-dev/base/minimal.cls index 89c233c30f..64efdd5287 100644 --- a/macros/latex-dev/base/minimal.cls +++ b/macros/latex-dev/base/minimal.cls @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf Binary files differindex ff40b00fa9..5006d07168 100644 --- a/macros/latex-dev/base/modguide.pdf +++ b/macros/latex-dev/base/modguide.pdf diff --git a/macros/latex-dev/base/modguide.tex b/macros/latex-dev/base/modguide.tex index 332b609ab3..ff934ecc34 100644 --- a/macros/latex-dev/base/modguide.tex +++ b/macros/latex-dev/base/modguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/newdc.ins b/macros/latex-dev/base/newdc.ins index 277e8ea21f..69d74d6167 100644 --- a/macros/latex-dev/base/newdc.ins +++ b/macros/latex-dev/base/newdc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/newlfont.dtx b/macros/latex-dev/base/newlfont.dtx index 0b35eddd80..2792395c58 100644 --- a/macros/latex-dev/base/newlfont.dtx +++ b/macros/latex-dev/base/newlfont.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/nfssfont.dtx b/macros/latex-dev/base/nfssfont.dtx index 556ce5f76d..0464053c10 100644 --- a/macros/latex-dev/base/nfssfont.dtx +++ b/macros/latex-dev/base/nfssfont.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -26,8 +26,8 @@ % extension .ins) which are part of the distribution. % % \fi -\def\nfssfontfileversion{v2.2e} -\def\nfssfontfiledate{2020/11/26} +\def\nfssfontfileversion{v2.2f} +\def\nfssfontfiledate{2023/11/07} % % \iffalse @@ -197,7 +197,7 @@ {\PackageWarningNoLine{nfssfont}% {Encoding file `\next' not found.% \MessageBreak - You might have misspelt the name of the encoding + You might have misspelled the name of the encoding \MessageBreak or perhaps this encoding is not a text encoding, \MessageBreak diff --git a/macros/latex-dev/base/nfssfont.ins b/macros/latex-dev/base/nfssfont.ins index 21a13f70a8..00f5a0c8a3 100644 --- a/macros/latex-dev/base/nfssfont.ins +++ b/macros/latex-dev/base/nfssfont.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/nfssfont.pdf b/macros/latex-dev/base/nfssfont.pdf Binary files differindex c947cc02bf..44aba54c32 100644 --- a/macros/latex-dev/base/nfssfont.pdf +++ b/macros/latex-dev/base/nfssfont.pdf diff --git a/macros/latex-dev/base/olddc.ins b/macros/latex-dev/base/olddc.ins index 320b3a4b0e..1f5d12ece4 100644 --- a/macros/latex-dev/base/olddc.ins +++ b/macros/latex-dev/base/olddc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/oldlfont.dtx b/macros/latex-dev/base/oldlfont.dtx index 33ae5e6fd9..7a3534f517 100644 --- a/macros/latex-dev/base/oldlfont.dtx +++ b/macros/latex-dev/base/oldlfont.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/preload.dtx b/macros/latex-dev/base/preload.dtx index d26bdaa9ed..fb5f86824c 100644 --- a/macros/latex-dev/base/preload.dtx +++ b/macros/latex-dev/base/preload.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/proc.dtx b/macros/latex-dev/base/proc.dtx index bbbf71162f..ec69e47396 100644 --- a/macros/latex-dev/base/proc.dtx +++ b/macros/latex-dev/base/proc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/proc.ins b/macros/latex-dev/base/proc.ins index 056816e99e..83f50bda12 100644 --- a/macros/latex-dev/base/proc.ins +++ b/macros/latex-dev/base/proc.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/proc.pdf b/macros/latex-dev/base/proc.pdf Binary files differindex b143f929d5..84fbeb3470 100644 --- a/macros/latex-dev/base/proc.pdf +++ b/macros/latex-dev/base/proc.pdf diff --git a/macros/latex-dev/base/slides.dtx b/macros/latex-dev/base/slides.dtx index a918c337dd..3674a6c05f 100644 --- a/macros/latex-dev/base/slides.dtx +++ b/macros/latex-dev/base/slides.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/slides.ins b/macros/latex-dev/base/slides.ins index 3acb556b96..3124ed366f 100644 --- a/macros/latex-dev/base/slides.ins +++ b/macros/latex-dev/base/slides.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -96,7 +96,7 @@ extension .ins) which are part of the distribution. This is a generated file. -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. @@ -138,7 +138,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/slides.pdf b/macros/latex-dev/base/slides.pdf Binary files differindex 5bdcaaa9e6..072806917b 100644 --- a/macros/latex-dev/base/slides.pdf +++ b/macros/latex-dev/base/slides.pdf diff --git a/macros/latex-dev/base/slifonts.fdd b/macros/latex-dev/base/slifonts.fdd index 5b66975095..b35cd07a8b 100644 --- a/macros/latex-dev/base/slifonts.fdd +++ b/macros/latex-dev/base/slifonts.fdd @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -45,7 +45,7 @@ %<*driver, > \ProvidesFile{sfonts.drv} %</driver, > - [2019/07/09 v2.2f Standard LaTeX slide font definitions] + [2023/12/02 v2.2f Standard LaTeX slide font definitions] % %<*driver> \documentclass{ltxdoc} @@ -95,7 +95,7 @@ % \section{Introduction} % % This file contains the external font information for special -% variants of the the Computer Modern fonts to be used for overhead +% variants of the Computer Modern fonts to be used for overhead % slides. They allow to produce slides in a similar fashion as it was % originally done by \SliTeX{}. % @@ -103,7 +103,7 @@ % format. Instead the standard format may be used and internally only % different font definition files come into play. % -% Note, that that you therefore can easily produce slides in different +% Note that you therefore can easily produce slides in different % fonts just by calling an appropriate package (like |times|) in % your |\usepackage| command. This works, for example, with all % fonts that are defined to be scalable (eg PostScript fonts) since diff --git a/macros/latex-dev/base/slifonts.pdf b/macros/latex-dev/base/slifonts.pdf Binary files differindex 8dc32739ff..140e317b47 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 f39b19d128..5fbc7e1c0c 100644 --- a/macros/latex-dev/base/source2e.pdf +++ b/macros/latex-dev/base/source2e.pdf diff --git a/macros/latex-dev/base/source2e.tex b/macros/latex-dev/base/source2e.tex index c538593ddd..6ff2928a42 100644 --- a/macros/latex-dev/base/source2e.tex +++ b/macros/latex-dev/base/source2e.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -342,6 +342,8 @@ page_precedence "rnaA" \DocInclude{ltoutput} % Output routine + \DocInclude{lttagging}% Tagging support + \DocInclude{lthyphen} % Hyphenation (hyphen.ltx). \DocInclude{ltfinal} % Last minute initialisations and dump @@ -378,7 +380,7 @@ page_precedence "rnaA" \def\endash{--} \catcode`\-\active \def-{\futurelet\temp\indexdash} -\def\indexdash{\ifx\temp-\endash\fi} +\def\indexdash{\ifx\temp-\endash\else:\fi} \PrintIndex \endgroup diff --git a/macros/latex-dev/base/source2edoc.cls b/macros/latex-dev/base/source2edoc.cls index 5f731af7ae..48ae49b29a 100644 --- a/macros/latex-dev/base/source2edoc.cls +++ b/macros/latex-dev/base/source2edoc.cls @@ -2,12 +2,12 @@ % This class is buggy and needs fixing \ProvidesClass{source2edoc} - [2022/04/03 v0.2c Quick hack to typeset source2.tex + [2024/02/14 v0.2e Quick hack to typeset source2.tex (not usable for anything else and buggy -- will vanish again)!] -\LoadClass{l3doc} +\LoadClass[kernel]{l3doc} \RemoveFromHook{begindocument}[l3doc] % drop the standard setting making " a shortverb \AddToHook{begindocument}{\MakeShortVerb \|} % but readd | as one @@ -50,84 +50,6 @@ } - -% some l3doc's def are buggy (already fixed there but not distributed yet) - -\RenewDocumentCommand \DocInclude { m } - { - \relax\clearpage - \docincludeaux - \IfFileExists{#1.fdd} - { \cs_set:Npn \currentfile{#1.fdd} } - { \cs_set:Npn \currentfile{#1.dtx} } - \int_compare:nNnTF \@auxout = \@partaux - { \@latexerr{\string\include\space cannot~be~nested}\@eha } - { \@docinclude {#1} } % <--- braces needed! - \int_compare:nNnF { \tex_currentgrouplevel:D } = { 0 } - { - \int_compare:nNnT { \tex_interactionmode:D } = { 0 } - { \int_set:Nn \tex_interactionmode:D { 1 } } - \msg_fatal:nnn { source2edoc } { missing-endgroup } {#1} - } - } -\msg_new:nnn { source2edoc } { missing-endgroup } - { - \str_if_eq:VnTF \@currenvir { document } - { - There~are~\int_use:N \tex_currentgrouplevel:D - \c_space_tl unclosed~groups~in~#1.dtx. - } - { - The~\@currenvir \c_space_tl environment~on~line~\@currenvline - \c_space_tl doesn't~have~a~matching~\iow_char:N\\end{\@currenvir}. - } - } -\cs_gset:Npn \@docinclude #1 - { - \clearpage - \immediate\write\@mainaux{\string\@input{#1.aux}} - \@tempswatrue - \if@partsw - \@tempswafalse - \cs_set:Npx \@tempb {#1} - \clist_map_inline:Nn \@partlist - { - \if_meaning:w \@tempa \@tempb - \@tempswatrue - \fi: - } - \fi - \if@tempswa - \cs_set_eq:NN \@auxout \@partaux - \immediate\openout\@partaux #1.aux - \immediate\write\@partaux{\relax} - \cs_set_eq:NN \@ltxdoc@PrintIndex \PrintIndex - \cs_set_eq:NN \PrintIndex \relax - \cs_set_eq:NN \@ltxdoc@PrintChanges \PrintChanges - \cs_set_eq:NN \PrintChanges \relax - \cs_set_eq:NN \@ltxdoc@theglossary \theglossary - \cs_set_eq:NN \@ltxdoc@endtheglossary \endtheglossary - \part{\currentfile} - { - \cs_set_eq:NN \ttfamily\relax - \cs_gset:Npx \filekey - { \filekey,~ \thepart = { \ttfamily \currentfile } } % <-- mising spaces considered harmful - } - \DocInput{\currentfile} - \cs_set_eq:NN \PrintIndex \@ltxdoc@PrintIndex - \cs_set_eq:NN \PrintChanges \@ltxdoc@PrintChanges - \cs_set_eq:NN \theglossary \@ltxdoc@theglossary - \cs_set_eq:NN \endtheglossary \@ltxdoc@endtheglossary - \clearpage - \@writeckpt{#1} - \immediate \closeout \@partaux - \else - \@nameuse{cp@#1} - \fi - \cs_set_eq:NN \@auxout \@mainaux - } - - % change the setup here: we have a lot of long names so better run raggeded \cs_set_protected:Npn \__codedoc_macro_end_style:n #1 @@ -176,7 +98,7 @@ dd% \else\@ctrerr\fi} \def\docincludeaux{% - \def\thepart{\aalph{part}}\def\filesep{\thepart-}% + \def\thepart{\ifnum\value{part}<10 0\fi\arabic{part}}\def\filesep{\thepart-}% \let\filekey\@gobble \g@addto@macro\index@prologue{% \gdef\@oddfoot{\parbox[t]{\textwidth}{\strut\footnotesize @@ -303,6 +225,9 @@ Bug reports can be opened (category \texttt{#1}) at\\% \AddToHook{cmd/tableofcontents/after}{\global\let\tableofcontents\relax} +% pages > 1000 +\renewcommand\@pnumwidth{2em} + \InputIfFileExists{ltxdoc.cfg} {\typeout{*************************************^^J% * Local config file ltxdoc.cfg used^^J% diff --git a/macros/latex-dev/base/syntonly.dtx b/macros/latex-dev/base/syntonly.dtx index 2b0049b696..9844585fa5 100644 --- a/macros/latex-dev/base/syntonly.dtx +++ b/macros/latex-dev/base/syntonly.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -71,7 +71,7 @@ \ProvidesFile{syntonly.dtx} %</dtx> %<*package|dtx> - [2017/06/30 v2.1e Standard LaTeX2e package] + [2024/02/08 v2.1e Standard LaTeX2e package] %</package|dtx> % \end{macrocode} % @@ -150,7 +150,7 @@ \repeat % \end{macrocode} % Since all font changes occur either via |\selectfont| (in -% text or |\mathversion| (for math mode) it is sufficient +% text) or |\mathversion| (for math mode), it is sufficient % to change these to no-ops. In addition we must prevent % the loading of math fonts, this is done by making % |\getanddefine@fonts| a no-op. @@ -184,7 +184,7 @@ % The |\nopages@| macro disables the \LaTeX{} output routine. % To this end we define a very simple output routine that empties % the output \emph{and} footnote boxes (remember that the latter -% are insertions. +% are insertions). % \begin{macrocode} \def\nopages@{% \output {\setbox\z@\box\@cclv diff --git a/macros/latex-dev/base/syntonly.ins b/macros/latex-dev/base/syntonly.ins index 8ccaf254d1..6435e0a6ee 100644 --- a/macros/latex-dev/base/syntonly.ins +++ b/macros/latex-dev/base/syntonly.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/syntonly.pdf b/macros/latex-dev/base/syntonly.pdf Binary files differindex 3390b696f3..6beca59509 100644 --- a/macros/latex-dev/base/syntonly.pdf +++ b/macros/latex-dev/base/syntonly.pdf diff --git a/macros/latex-dev/base/testpage.tex b/macros/latex-dev/base/testpage.tex index 7eae6c142c..e8f06313fb 100644 --- a/macros/latex-dev/base/testpage.tex +++ b/macros/latex-dev/base/testpage.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/tlc2.pdf b/macros/latex-dev/base/tlc2.pdf Binary files differindex 87fd9f964d..4945823cda 100644 --- a/macros/latex-dev/base/tlc2.pdf +++ b/macros/latex-dev/base/tlc2.pdf diff --git a/macros/latex-dev/base/tlc3.err b/macros/latex-dev/base/tlc3.err index d4f94705d7..cb33dd01e4 100644 --- a/macros/latex-dev/base/tlc3.err +++ b/macros/latex-dev/base/tlc3.err @@ -1,4 +1,4 @@ -\newcommand\erratafiledate{2023/10/30} % needs / and not - +\newcommand\erratafiledate{2024/01/29} % needs / and not - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % To produce a printed version of this errata file run this file through @@ -640,14 +640,37 @@ Output of example misses the page numbers in acronym list \> Run example 3 times \CHAPTER{Chapter 4 --- Basic Formatting Tools -- Larger \ldots} +\erroronpage{I-253}{para 2, l.-3}{YEi}{2023/11/27}{s} +Move comma:\\ +and \textsf{thmtools} packages and \textsf{typed-checklist}\u{,} helps you write \> \\ +and \textsf{thmtools} packages\u{,} and \textsf{typed-checklist} helps you write + + \erroronpage{I-323}{Table 4.4, left column}{BeB}{2023/07/25}{s} Typo: Assembler (\u{N}otorola68k, x86masm) \> \\ Assembler (\u{M}otorola68k, x86masm) % Matlab \> Matlab \u{(empty, 5.1)} % könnte auch aktualisiert werden, steht aber in Version 1.8d nicht drin +\erroronpage{I-344}{exa 4-3-16}{CAR/FMi}{2024/01/29}{s} +Use \cs{NewDocumentEnvironment} instead of +\cs{DeclareDocumentEnvironment} because it is always better to check +that the declaration is not accidentally overwriting an existing +environment. \CHAPTER{Chapter 5 --- The Layout of the Page} +\erroronpage{I-365}{paras -3 to -2}{YEi}{2023/11/28}{s} + +Add/replace:\\ +\ldots package and others. \cs{par} The \u{fifth} section then \> \\ +\ldots package and others. +\u{In the fifth section we cover ``static'' page} \\ +\u{decorations such as watermarks.} \cs{par} The \u{sixth} section then + +\erroronpage{I-368}{table 5.1}{YEi}{2023/11/29}{s} +A better approximation for \texttt{b5paper} is \u{$6\frac{7}{8}$}${}\times 9 \frac{7}{8}$ + + \erroronpage{I-386}{exa 5-3-1, l.7}{EOl}{2023/09/09}{s} Change: paragraph over \u{two} pages. \> paragraph over \u{three} pages. @@ -1302,6 +1325,10 @@ is created only if the entry \u{contains} a shorttitle \u{field} and the title a is created only if the entry \u{has been referenced (prior to typesetting}\\ \u{the bibliography), contains} a shorttitle \u{field,} and the title and shorttitle fields differ. +\erroronpage{II-535}{footnote}{FMi}{2024/01/07}{} +Extend the explanation:\\ +\u{you can} use \cs{mancite} \u{in front of any citation command} to avoid this. + \erroronpage{II-560}{exa 16-7-31}{FMi}{2023/08/31}{s} Jane Doe.\ \textit{A\u{n} second book.}\ 2020.\> Jane Doe.\ \textit{A second book.}\ 2020. @@ -1367,11 +1394,13 @@ Appendix title not properly capitalized. \contributor{MJo}{Maciej Jończyk} \contributor{YFu}{FUJIMURA Yukitoshi} \contributor{YvH}{Yvon Henel} +\contributor{YEi}{Yaakov Eisenberg} \contributor{bb}{Barbara Beeton} \contributor{kb}{Karl Berry} \end{multicols} + Other people have sent us corrections for errors already found. Thanks to all of you! diff --git a/macros/latex-dev/base/tlc3.pdf b/macros/latex-dev/base/tlc3.pdf Binary files differindex 24ff91e85b..00936f6e57 100644 --- a/macros/latex-dev/base/tlc3.pdf +++ b/macros/latex-dev/base/tlc3.pdf diff --git a/macros/latex-dev/base/tulm.fdd b/macros/latex-dev/base/tulm.fdd index c8dd8b95fc..6f7a6873cd 100644 --- a/macros/latex-dev/base/tulm.fdd +++ b/macros/latex-dev/base/tulm.fdd @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2016-2023 +% Copyright (C) 2016-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % diff --git a/macros/latex-dev/base/tulm.ins b/macros/latex-dev/base/tulm.ins index 85970a5133..ea8fd7b22b 100644 --- a/macros/latex-dev/base/tulm.ins +++ b/macros/latex-dev/base/tulm.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 2016-2023 +%% Copyright (C) 2016-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html (but please observe conditions on bug reports sent to that address!) -Copyright (C) 2016-2023 +Copyright (C) 2016-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/base/tulm.pdf b/macros/latex-dev/base/tulm.pdf Binary files differindex 8316f50ae8..29c84ca59b 100644 --- a/macros/latex-dev/base/tulm.pdf +++ b/macros/latex-dev/base/tulm.pdf diff --git a/macros/latex-dev/base/unpack.ins b/macros/latex-dev/base/unpack.ins index 5baa2b5447..e81c8dbfa8 100644 --- a/macros/latex-dev/base/unpack.ins +++ b/macros/latex-dev/base/unpack.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% diff --git a/macros/latex-dev/base/usrguide-historic.pdf b/macros/latex-dev/base/usrguide-historic.pdf Binary files differindex d41dee80ce..0001be0aae 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-historic.tex b/macros/latex-dev/base/usrguide-historic.tex index 40865a2be9..228a253abb 100644 --- a/macros/latex-dev/base/usrguide-historic.tex +++ b/macros/latex-dev/base/usrguide-historic.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -34,15 +34,15 @@ \title{\LaTeX\ for authors --- historic version} -\author{\copyright~Copyright 1995--2022, \LaTeX\ Project Team.\\ +\author{\copyright~Copyright 1995--2023, \LaTeX\ Project Team.\\ All rights reserved.% \footnote{This file may be distributed and/or modified under the conditions of the \LaTeX{} Project Public License, either version 1.3c of this license or (at your option) any later version. See the source - \texttt{usrguide.tex} for full details.}% + \texttt{usrguide-historic.tex} for full details.}% } -\date{30 August 2022} +\date{09 November 2023} \begin{document} diff --git a/macros/latex-dev/base/usrguide.pdf b/macros/latex-dev/base/usrguide.pdf Binary files differindex 4ab7004018..c9f3496f57 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 05fc93e7af..9f5cfb181a 100644 --- a/macros/latex-dev/base/usrguide.tex +++ b/macros/latex-dev/base/usrguide.tex @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2020-2023 +% Copyright (C) 2020-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -43,7 +43,7 @@ \texttt{usrguide.tex} for full details.}% } -\date{2023-05-23} +\date{2023-12-02} \NewDocumentCommand\cs{m}{\texttt{\textbackslash\detokenize{#1}}} \NewDocumentCommand\marg{m}{\arg{#1}} @@ -794,6 +794,18 @@ a & b & c \\ \end{tabular} \end{verbatim} +\subsection{Performance} + +For document commands where the argument specification is entirely +comprised of |m| or |+m| entries (or is entirely empty), the internal structure +created by \cs{NewDocumentCommand} is essentially as efficient +as provided by |\newcommand(*)|. As such, document commands may replace +constructs arising from \cs{newcommand}, etc., without a need to be concerned +about performance. Note that \cs{newcommand(*)} produces expandable +results, so the direct replacement is \cs{NewExpandableDocumentCommand}; +in most cases, however, it is better to use \cs{NewDocumentCommand} to +give more robust structures. + \subsection{Details about argument delimiters} In normal (non-expandable) commands, the delimited types look for the @@ -951,7 +963,7 @@ The differences between \cs{New...}, \cs{Renew...}, and \begin{decl} |\ShowEnvironment| \arg{env} \end{decl} -This displays the meaning of the begin end end code for environment \meta{env}. +This displays the meaning of the begin and end code for environment \meta{env}. @@ -1161,7 +1173,7 @@ therefore shows the same syntax peculiars as discussed above. Nevertheless, in practice they are usually sufficient. For example \begin{verbatim} -\newcommand\calculateheight[1]{% +\NewDocumentCommand\calculateheight{m}{% \setlength\textheight{\dimeval{\topskip+\baselineskip*\inteval{#1-1}}}} \end{verbatim} sets the \cs{textheight} to the appropriate value if a page should @@ -1186,13 +1198,13 @@ Titlecasing here follows the definition given by the Unicode Consortium: the first character of the input will be converted to (broadly) uppercase, and the rest of the input to lowercase. The full range of Unicode UTF-8 input can be supported. -\begin{quotation} +\begin{quote} \begin{tabular}{rl} |\MakeUppercase{hello WORLD ßüé}| & \MakeUppercase{hello WORLD ßüé} \\ |\MakeLowercase{hello WORLD ßüé}| & \MakeLowercase{hello WORLD ßüé} \\ |\MakeTitlecase{hello WORLD ßüé}| & \MakeTitlecase{hello WORLD ßüé} \\ \end{tabular} -\end{quotation} +\end{quote} The case-changing commands take an optional argument which can be used to tailor the output. This optional argument accepts the key \texttt{locale}, @@ -1208,14 +1220,14 @@ are the arguments to the commands \cs{label}, \cs{ref}, \cs{cite}, \cs{begin} and \cs{end}. Additional exclusions can be added using the command \cs{AddToNoCaseChangeList}. Input can be excluded from case changing using the command \cs{NoCaseChange}. -\begin{quotation} +\begin{quote} \begin{tabular}{rl} |\MakeUppercase{Some text $y = mx + c$}| & \MakeUppercase{Some text $y = mx + c$} \\ |\MakeUppercase{\NoCaseChange{iPhone}}| & \MakeLowercase{\NoCaseChange{iPhone}} \\ \end{tabular} -\end{quotation} +\end{quote} To allow robust commands to be used within case changing \emph{and} to produce the expected output, two additional control commands are available. @@ -1244,18 +1256,54 @@ apply to a specific one: this is given in BCP-47 format (\url{https://en.wikipedia.org/wiki/IETF_language_tag}). For example, the kernel customises the mapping for U+01F0 (\v{j}) when uppercasing in 8-bit engines: -\begin{quotation} +\begin{quote} |\DeclareUppercaseMapping{"01F0}{\v{J}}| -\end{quotation} +\end{quote} as there is no pre-composed \v{J} character, and this is problematic if the engine does not support Unicode natively. Similarly, to set a locale \texttt{xx} to behave in the same way as Turkish and retain the difference between dotted- and dotless-i, one could use for example -\begin{quotation} +\begin{quote} |\DeclareLowercaseMapping[xx]{"0049}{\i}|\\ |\DeclareLowercaseMapping[xx]{"0130}{i}|\\ |\DeclareUppercaseMapping[xx]{"0069}{\.{I}}|\\ |\DeclareUppercaseMapping[xx]{"0131}{I}| -\end{quotation} +\end{quote} + +\section{Support for problem solving} + +\begin{decl} + |\listfiles| \oarg{options} +\end{decl} + +If this command is placed in the preamble then a list of the files +read in (as a result of processing the document) will be displayed +on the terminal (and in the log file) at the end of the run. Where +possible, a short description will also be produced. These descriptions +will (hopefully) include the descriptions, dates and version numbers +for package and class files. + +Sometimes, it may be that a local edit has been made to a package or +class file (or rather a copy of such a file). To allow these cases to +be identified, \cs{listfiles} takes an optional argument which allows +adjustment of the information printed using a key--value approach +\begin{description} + \item[\texttt{hashes}] Adds the MD5 hash for each file to the + information printed + \item[\texttt{sizes}] Adds the file size for each file to the + information printed +\end{description} +Note that as Windows and Unix use different line endings (LF \emph{versus} LF +CR), the hashes and file sizes from the two systems will not be the same. As +such, you should compare these values between operating systems of the same +type. + +\emph{Warning}: this command will list only files which were read +using \LaTeX{} commands such as |\input|\arg{file} or +|\include|\arg{file}. If the file was read using the primitive \TeX{} +syntax |\input |\emph{file} (without |{ }| braces around the file name) +then it will not be listed; failure to use the \LaTeX{} form with the +braces can cause more severe problems, possibly leading to overwriting +important files, so \textbf{always put in the braces}. \end{document} diff --git a/macros/latex-dev/base/utf8ienc.dtx b/macros/latex-dev/base/utf8ienc.dtx index f1623ee0e6..a2701ac5c8 100644 --- a/macros/latex-dev/base/utf8ienc.dtx +++ b/macros/latex-dev/base/utf8ienc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % The LaTeX Project and any individual authors listed elsewhere % in this file. % @@ -886,7 +886,8 @@ \else % \end{macrocode} % -% If the input is malformed UTF-8 there may not be enough closing ) so +% If the input is malformed UTF-8 there may not be enough closing +% \iffalse(\fi ) so % add 5 so there are always some remaining then cleanup and remove % any remaining ones at the end. This avoids |\numexpr| parse errors % while outputting a package error. @@ -1660,7 +1661,7 @@ % \end{macrocode} % According to the Unicode standard Ux04C5 should be an L with ``tail'' not % with descender (which also exists as Ux04A2) but it looks as if the char -% names do not make this distinction). Should they? +% names do not make this distinction. Should they? % \begin{macrocode} %<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04C5}{\CYRLDSC} %<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04C6}{\cyrldsc} diff --git a/macros/latex-dev/base/utf8ienc.pdf b/macros/latex-dev/base/utf8ienc.pdf Binary files differindex da31897579..a7e369b6eb 100644 --- a/macros/latex-dev/base/utf8ienc.pdf +++ b/macros/latex-dev/base/utf8ienc.pdf diff --git a/macros/latex-dev/base/webcomp.err b/macros/latex-dev/base/webcomp.err index 1b3b7a2475..aabef28187 100644 --- a/macros/latex-dev/base/webcomp.err +++ b/macros/latex-dev/base/webcomp.err @@ -373,7 +373,7 @@ preferable in a form usable for this file, i.e., \begin{flushleft} |\erroronpage{|\textit{page-number}|}{|\textit{line-identification}|}{|% \textit{your-initials}|}{|\textit{date}|}{}| \\ - \hspace*{2em}\textit{description of the the errata} + \hspace*{2em}\textit{description of the errata} \end{flushleft} Here is an example: \begin{verbatim} diff --git a/macros/latex-dev/base/webcomp.pdf b/macros/latex-dev/base/webcomp.pdf Binary files differindex afda6ddc4b..c9664c681f 100644 --- a/macros/latex-dev/base/webcomp.pdf +++ b/macros/latex-dev/base/webcomp.pdf diff --git a/macros/latex-dev/required/latex-lab/README.md b/macros/latex-dev/required/latex-lab/README.md index 046d498ab8..a72fd43d9e 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-06-01 pre-release 0 +Release 2024-06-01 pre-release 1 ## Overview @@ -38,5 +38,5 @@ The license is LPPL 1.3c. This README file is -Copyright (C) 2021-2023 +Copyright (C) 2021-2024 The LaTeX Project 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 ff13361fcc..b9095a2bd6 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 a0f0e5dfad..c72d60783c 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 1a65830e8b..fd7e2d9333 100644 --- a/macros/latex-dev/required/latex-lab/changes.txt +++ b/macros/latex-dev/required/latex-lab/changes.txt @@ -1,3 +1,88 @@ +2024-02-12 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-block.dtx: left align description labels. + +2024-02-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-table.dtx: change value layout to presentation (as in ARIA). + +2024-02-09 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: add keys to suppress AF-files locally + +2024-02-09 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-title.dtx: force DisplayDocTitle if UA-standard is detected + +2024-02-08 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-testphase.dtx: add marginpar tagging to phase-III + +2024-02-08 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx, latex-lab-table.dtx: adapt tagpdfsetup keys + +2024-02-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-table.dtx: change key names from table-tagging to table/tagging + +2024-02-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-float.dtx: fix caption outside float error + +2024-02-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-toc-kernel-changes.dtx: fix spurious space, tagging-project#50 + +2024-01-29 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: disable mathgrabbing in begindocument hook. + +2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-firstaid.dtx: add support for \authors from amsart. + +2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-title.dtx: make \@title and \@author robust to avoid errors + if they are not set. + +2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-table.dtx: add support for layout tables. + +2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-block.dtx: add support to set an attribute-class for para-main. + +2024-01-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-table.dtx: add option table-tagging=layout + +2024-01-17 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx, latex-lab-amsmath.dtx, redefine \text to + avoid faulty structure and faulty PDF from \mathchoice. + Add statistic for mathml handling. + +2024-01-14 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-float.dtx, correct destination, see tagging issue #55 + +2024-01-14 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-block.dtx, correct error message for environments, + see tagging issue #57 + +2024-01-12 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-table.dtx: add some variables for tag names + +2024-01-08 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * move mathml-AF support into latex-lab-math.ltx + +2023-12-27 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * added latex-lab-title.dtx for maketitle/title and author tagging. + +2023-11-18 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-block.dtx, correct error message for items outside lists + see tagging issue #35 + +2023-11-17 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-block.dtx, latex-lab-sec.dtx: use wrapper for para counter, + see tagging issue #34 + +2023-11-12 Joseph Wright <Joseph.Wright@latex-project.org> + * latex-lab-math.dtx: tidy variant creation, switch to e-type expansion + +2023-11-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: remove processor in \(..\), see tagging issue #29 + +2023-11-05 Ulrike Fischer <Ulrike.Fischer@latex-project.org> + * latex-lab-math.dtx: handle also tabular*, see tagging issue #25 + * latex-lab-table.dtx: use cmd hook for array, see tagging issue #28 + 2023-10-30 Ulrike Fischer <Ulrike.Fischer@latex-project.org> * added latex-lab-table.dtx for basic table tagging. 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 e7e0823f1e..c7d0fe107b 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 af93980113..ff0295a160 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/documentmetadata-support.dtx b/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx index b37ae6c9d7..6bc7e232a1 100644 --- a/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx +++ b/macros/latex-dev/required/latex-lab/documentmetadata-support.dtx @@ -84,8 +84,17 @@ % features developed as part of the multi-year ``Tagged PDF'' % project~\cite{blueprint}. % -% -% +% \section{The \cs{DocumentMetadata} command} +% +% \begin{function}{\DocumentMetadata} +% \begin{syntax} +% \cs{DocumentMetadata}\Arg{key-value list} +% \end{syntax} +% +% The command should be used as the first command in a document, before +% \cs{documentclass}. It takes a key-value argument. +% \end{function} + % \section{Currently supported key/values} % % @@ -215,6 +224,10 @@ % This code is also loaded by the \texttt{phase-III} key. % \item[\texttt{math}] This adapts math for tagging. This is only a prototype. % The module is currently not loaded by any \texttt{phase} key. +% \item[\texttt{table}] This provides basic tagging for +% \texttt{tabular}, \texttt{longtable} and similar table environments. +% The module is currently not loaded by any \texttt{phase} key. Its use and +% restrictions is documented in \texttt{latex-lab-table.pdf}.% % \item[\texttt{firstaid}] This contains small adjustments to external packages. % The module is currently not loaded by any \texttt{phase} key. % \end{description} @@ -274,8 +287,28 @@ \ExplSyntaxOn\makeatletter % \end{macrocode} +% \subsection{Variables} +% These variable definitions are currently also done in ltdocinit. +% They can be removed from there once latex-lab has been updated to +% provide them too. +% \begin{variable}{\g_@@_firstaidoff_clist} +% A list to store the firstaid code which should be disabled +% \begin{macrocode} +\clist_if_exist:NF \g_@@_firstaidoff_clist + { \clist_new:N \g_@@_firstaidoff_clist } +% \end{macrocode} +% \end{variable} +% \begin{variable}{\g_@@_testphase_tl} +% a tl to store the testphase loading code so that we can load them at +% the end of the command. +% \begin{macrocode} +\tl_if_exist:NF \g_@@_testphase_tl + { \tl_new:N \g_@@_testphase_tl } +% \end{macrocode} +% \end{variable} - +% \subsection{\cs{DocumentMetadata}} +% % \begin{macro}{\DocumentMetadata} % % \cs{DocumentMetadata} should not be used after @@ -348,15 +381,8 @@ % \end{macrocode} % \end{macro} - - - +%\subsection{\cs{DocumentMetadata} keys} % \begin{macrocode} -%FMi defined elsewhere -%FMi -%FMi \clist_new:N \g_@@_firstaidoff_clist -%FMi \tl_new:N \g_@@_testphase_tl -% UFi should the definition move to here? \keys_define:nn { document / metadata } { backend .choices:nn = diff --git a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx index e1f95730fa..c50a40eedd 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-amsmath.dtx @@ -2,7 +2,7 @@ % %% File: latex-lab-amsmath.dtx % -% Copyright (C) 2022,2023 The LaTeX Project +% Copyright (C) 2022-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -66,7 +66,7 @@ % \subsection{File declaration} % \begin{macrocode} \ProvidesFile{latex-lab-amsmath.ltx} - [2023-01-05 v0.1a amsmath adaptions] + [2024-02-12 v0.1b amsmath adaptions] % \end{macrocode} % \subsection{Tagpdf support} % To make the code independent from tagging being loaded and active @@ -90,7 +90,11 @@ \def\intertext##1{% \ifvmode\else\\\@empty\fi \noalign{% - \penalty\postdisplaypenalty\vskip\belowdisplayskip +% \end{macrocode} +% we have to flip the sign and use a negative \cs{belowdisplayskip} +% as we flipped the sign at the outside. +% \begin{macrocode} + \penalty\postdisplaypenalty\vskip-\belowdisplayskip \vbox{ % \end{macrocode} % Stop tagging when measuring: @@ -105,9 +109,13 @@ % \begin{macrocode} \tag_mc_end_push: % \end{macrocode} -% We are already in a par so we change now to Span: +% We are already in a par so we change now to text: +% \begin{macrocode} + \tagpdfsetup{paratag=P}% +% \end{macrocode} +% TODO why \cs{tagpdfparaOn} needed? % \begin{macrocode} - \tagpdfsetup{paratag=Span}% + \tagpdfparaOn \noindent\ignorespaces##1\par % \end{macrocode} % Restart the MC @@ -119,6 +127,78 @@ } % \end{macrocode} % +% \subsection{\cs{text}} +% +% The \cs{text} command uses \cs{mathchoice} which \enquote{typesets} the argument +% four times. This makes it quite problematic for tagging. Without precautions +% structure objects would be created four times and would get MC-chunks as kids +% that doesn't really exist. amsmath contains a switch that allows to execute code +% only in the first (displaymath) branch, but that isn't usable here. At first because +% we don't know if the first branch creates the same structure as the one that is +% actually used. At second because the engines executes some commands like \cs{label} +% and \cs{pdfannot} only at shipout from the branch that really was used. So we would +% get structure data from one \cs{mathchoice}-branch and MC-labels and links from another +% one and that gets very messy. +% +% We therefore have to avoid that tagging is active in unused branches. In pdflatex it +% is not possible to detect the mathstyle before, so we use a label. With lualatex is +% is possible to redefine \cs{text} not to use \cs{mathchoice} +% +% \begin{macrocode} +\AddToHook{package/amstext/after} + { +% \end{macrocode} +% currently amsmath is loaded in a begindocument hook, so this +% test is fine. If amstext is loaded earlier (in the kernel), this needs perhaps a change. +% \begin{macrocode} + \tag_if_active:T + { + \sys_if_engine_luatex:TF + { + \def\text@#1{{% + \ifcase\mathstyle + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{#1}}\or + \hbox{{\let\f@size\sf@size\selectfont#1}}\or + \hbox{{\let\f@size\sf@size\selectfont#1}}\or + \hbox{{\let\f@size\ssf@size\selectfont#1}}\or + \hbox{{\let\f@size\ssf@size\selectfont#1}}\or + \ERROR + \fi + \check@mathfonts + }} + } + { + \def\text@#1 + {{ + \int_gincr:N\g__math_mathchoice_int + \tag_stop: + \mathchoice + { + \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{0} + \textdef@\displaystyle\f@size{#1} + } + { + \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{2} + \textdef@\textstyle\f@size{\firstchoice@false #1} + } + { + \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{4} + \textdef@\textstyle\sf@size{\firstchoice@false #1} + } + { + \@@_tag_if_mathstyle:en{mathchoice-\int_use:N\g__math_mathchoice_int}{6} + \textdef@\textstyle \ssf@size{\firstchoice@false #1} + } + \check@mathfonts + }} + } + } + } +% \end{macrocode} +% % \begin{macrocode} \ExplSyntaxOff % \end{macrocode} 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 9c0073d19d..577c3cddab 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-bib.dtx index a467bf3158..e8ee192a7b 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-bib.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-bib.dtx @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabbibdate{2023-07-20} -\def\ltlabbibversion{0.81a} +\def\ltlabbibdate{2024-02-12} +\def\ltlabbibversion{0.81b} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -124,6 +124,17 @@ % but has to test if this anchor is already known. % \end{description} % +% \section{Provided or redefined commands} +% +% \begin{function}{\@extra@binfo,\@extra@b@citeb} +% +% These are taken from hyperref, they are for chapterbib compability (and also +% signal to chapterbib not to change the citation commands) +% \end{function} +% +% \begin{function}{\@bibitem,\@lbibitem} +% The internal item commands. +% \end{function} % % \section{Implementation} % \begin{macrocode} @@ -264,7 +275,7 @@ \AddToHookWithArguments{bibcite/before} { \tag_mc_end_push: - \exp_args:Nx\tagstructbegin{tag=Reference,ref=cite.#1\@extra@b@citeb} + \exp_args:Ne\tagstructbegin{tag=Reference,ref=cite.#1\@extra@b@citeb} \tagmcbegin{} } \AddToHookWithArguments{bibcite/after}[tag] @@ -318,7 +329,7 @@ { \leavevmode \tag_mc_end_push: - \exp_args:Nx\tag_struct_begin:n{tag=Reference,ref=cite.#1\@extra@b@citeb} + \exp_args:Ne\tag_struct_begin:n{tag=Reference,ref=cite.#1\@extra@b@citeb} \tag_mc_begin:n{} } \AddToHook{cmd/hyper@natlinkend/after} 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 59569a1735..4abf970ebf 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-block.dtx index e0a723ca87..75203f8ed5 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-block.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-block.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-block.dtx (C) Copyright 2021-2023 LaTeX Project +%% File: latex-lab-block.dtx (C) Copyright 2021-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -9,10 +9,10 @@ % % https://www.latex-project.org/lppl.txt % -\def\ltlabblockdate{2023-09-01} -\def\ltlabblockversion{0.8h} +\def\ltlabblockdate{2024-02-12} +\def\ltlabblockversion{0.8l} %<*driver> -\documentclass{l3doc} +\documentclass[kernel]{l3doc} \usepackage{amstext} \EnableCrossrefs \CodelineIndex @@ -308,7 +308,7 @@ % \end{TemplateDescription} % % The maximum number of \xt{blockenv}s that can be nested into each -% other is is restricted by the \LaTeX{} counter +% other is restricted by the \LaTeX{} counter % \texttt{maxblocklevels} with a default value of \texttt{6}. If this % value is increased then it is necessary to provide additional % instances, e.g., \texttt{displayblock-7}, etc. Decreasing is, of @@ -646,11 +646,59 @@ % % \end{description} % +% \section{Debugging} +% +% \begin{function}{\DebugBlocksOn,\DebugBlocksOff, \block_debug_on:, \block_debug_off:} +% +% These commands enable/disable debugging messages. +% +% \end{function} % +% \section{New and redefined kernel command} +% +% \begin{function}{\@doendpe} +% The original \LaTeXe{} command is augmented to allow for tagging. +% \end{function} % +% \begin{function}{\legacyverbatimsetup,\legacylistsetupcode} +% \emph{to be documented} +% \end{function} +% +% \begin{function}{\@setupverbinvisiblespace} +% A counterpart definition to the kernel command \cs{@setupverbinvisiblespace}, +% needed as we need to handle real space chars in verbatim. +% \end{function} +% +% \begin{function}{endblockenv,\g_block_nesting_depth_int} +% \emph{to be documented} +% \end{function} +% +% \begin{function}{\newtheorem,\@thm,\@begintheorem} +% Redefined to make theorems tagging aware. +% \end{function} % +% \begin{function}{\item,\@itemlabel} +% The \cs{item} is redefined. +% \end{function} % -% +% \begin{function}{\c@maxblocklevels} +% A counter to increase or decrease the number of supported +% level. If increased, one needs to supply additional level instances. +% \end{function} +% +% \begin{function}{\begin} +% The \cs{begin} is slightly redefine to handle \cs{@doendpe} better. +% TODO: move to kernel +% \end{function} +% +% \begin{function}{\para_end:} +% TODO: consider name, document +% \end{function} +% +% \begin{function}{para/begin} +% The para/begin hook is enhanced to support list ends +% \end{function} +% % \end{documentation} % % \StopEventually{\setlength\IndexMin{200pt} \PrintIndex } @@ -674,10 +722,6 @@ blockenv implementation] % \end{macrocode} % -% We make use of templates: -% \begin{macrocode} -\RequirePackage{xtemplate} -% \end{macrocode} % Generell kernel changes, also loaded by the sec and toc code. % \begin{macrocode} \RequirePackage{latex-lab-kernel-changes} @@ -691,7 +735,7 @@ \tl_new:N \l_@@_item_align_tl \tl_new:N\l_@@_legacy_env_params_tl % \end{macrocode} - +% % \subsection{Handling \cs{par} after the end of the list} % % An empty line (or a \cs{par}) after a list has semantic meaning as @@ -767,11 +811,11 @@ % given use in the document. This section is devoted to template % interfaces, and the template code is covered later. % \begin{macrocode} -\DeclareObjectType{blockenv}{1} -\DeclareObjectType{block}{1} -\DeclareObjectType{para}{1} -\DeclareObjectType{list}{1} -\DeclareObjectType{item}{1} +\NewTemplateType{blockenv}{1} +\NewTemplateType{block}{1} +\NewTemplateType{para}{1} +\NewTemplateType{list}{1} +\NewTemplateType{item}{1} % \end{macrocode} % \end{objecttype} % @@ -907,12 +951,9 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\tl_if_novalue:nTF} -% % \begin{macrocode} \cs_generate_variant:Nn \tl_if_novalue:nTF { o } % \end{macrocode} -% \end{macro} % % % \subsubsection{Debugging} @@ -1342,14 +1383,14 @@ \@definecounter {#2} \IfNoValueTF {#4} { % @ynthm - \tl_gset:cx { the #2 } + \tl_gset:ce { the #2 } { \@thmcounter{#2} } } { % @xnthm \@newctr{#1}[#4] - \tl_gset:cx { the #2 } + \tl_gset:ce { the #2 } { \expandafter\noexpand\csname the#4\endcsname \@thmcountersep @@ -1802,7 +1843,7 @@ fixed-word-spaces = \l__par_fixed_word_spaces_bool , % name?? final-hyphen-demerits = \finalhyphendemerits , cr-cmd = \\ , - para-class = \l_tag_para_attr_class_tl , + para-class = \l__tag_para_attr_class_tl , } { \tl_if_empty:nF {#1} { \SetTemplateKeys{para}{std}{#1} } @@ -2488,10 +2529,13 @@ { \@inmatherr \item % \end{macrocode} -% TODO: Test for being outside of a list needs updating! +% TODO: Check if test for being outside of a list is sensible % \begin{macrocode} - \tl_if_empty:oTF \@@_item_instance:n %%FMi? - { \msg_error:nnn { @@ } { item-in-nonlist } { \item[{#1}] } } + \cs_if_free:NTF \@@_item_instance:n + { + \@latex@error{Lonely~\string\item--perhaps~a~missing~ + list~environment}\@ehc + } { \legacy_if:nTF { @newlist } { \__kernel_list_item_begin: } @@ -2630,7 +2674,7 @@ % % \item Then open an new (inner) structure (by default % \texttt{Figure} but typically the one specified on the instance). -% \item At the end of the block close the the inner structure +% \item At the end of the block close the inner structure % (\texttt{Figure} or explicit one) % but leave the \texttt{text-unit} open to be either continued or closed due to a % following \cs{par}. @@ -3290,6 +3334,7 @@ \DeclareInstance{item}{description}{std} { label-format = \normalfont\bfseries #1 , + label-align = left } % \end{macrocode} % \end{instance} @@ -3389,9 +3434,7 @@ % % In this section we provide code to the various kernel hooks to support % the tagging of the different displayblock environments. -% -% -% +% % All of the following definitions should only be made if tagging % is active! % \begin{macrocode} @@ -3424,8 +3467,12 @@ { \int_compare:nNnT \l_@@_flattened_level_int < 2 { - \int_gincr:N \g__tag_para_main_begin_int - \tagstructbegin{tag=\l__tag_para_main_tag_tl} + \__tag_gincr_para_main_begin_int: + \tag_struct_begin:n + { + tag=\l__tag_para_main_tag_tl, + attribute-class=\l__tag_para_main_attr_class_tl, + } } } } @@ -3445,7 +3492,7 @@ \cs_set:Npn \@@_beginpar_hmode:N #1 { \tag_mc_end: - \int_gincr:N \g__tag_para_end_int + \__tag_gincr_para_end_int: \@@_debug_typeout:n{increment~ /P \on@line } \bool_if:NT \l__tag_para_show_bool { \tag_mc_begin:n{artifact} @@ -3492,7 +3539,7 @@ { \@@_debug_typeout:n{Structure-end~ \l__tag_para_main_tag_tl\space after~ displayblock \on@line } - \int_gincr:N \g__tag_para_main_end_int + \__tag_gincr_para_main_end_int: \tag_struct_end: %text-unit } } @@ -3551,16 +3598,20 @@ { \bool_if:NF \l__tag_para_flattened_bool { - \int_gincr:N \g__tag_para_main_begin_int - \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl} + \__tag_gincr_para_main_begin_int: + \tag_struct_begin:n + { + tag=\l__tag_para_main_tag_tl, + attribute-class=\l__tag_para_main_attr_class_tl, + } } } - \int_gincr:N \g__tag_para_begin_int + \__tag_gincr_para_begin_int: \@@_debug_typeout:n{increment~ P \on@line } \tag_struct_begin:n { tag=\l__tag_para_tag_tl - ,attribute-class=\l_tag_para_attr_class_tl + ,attribute-class=\l__tag_para_attr_class_tl } \__tag_check_para_begin_show:nn {green}{#1} \tag_mc_begin:n {} @@ -3572,15 +3623,19 @@ \cs_new_protected:Npn \@@_start_para_structure_unconditionally:n #1 { \bool_if:NF \l__tag_para_flattened_bool { - \int_gincr:N \g__tag_para_main_begin_int - \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl} + \__tag_gincr_para_main_begin_int: + \tag_struct_begin:n + { + tag=\l__tag_para_main_tag_tl, + attribute-class=\l__tag_para_main_attr_class_tl, + } } - \int_gincr:N \g__tag_para_begin_int + \__tag_gincr_para_begin_int: \@@_debug_typeout:n{increment~ P \on@line } \tag_struct_begin:n { tag=\l__tag_para_tag_tl - ,attribute-class=\l_tag_para_attr_class_tl + ,attribute-class=\l__tag_para_attr_class_tl } \__tag_check_para_begin_show:nn {green}{#1} \tag_mc_begin:n {} @@ -3594,14 +3649,14 @@ { \bool_if:NT \l__tag_para_bool { - \int_gincr:N \g__tag_para_end_int + \__tag_gincr_para_end_int: \@@_debug_typeout:n{increment~ /P \on@line } \tag_mc_end: \__tag_check_para_end_show:nn {red}{} \tag_struct_end: \bool_if:NF \l__tag_para_flattened_bool { - \int_gincr:N \g__tag_para_main_end_int + \__tag_gincr_para_main_end_int: \tag_struct_end: } } @@ -3657,7 +3712,7 @@ \DeclareRobustCommand*\begin[1]{% \UseHook{env/#1/before}% \@ifundefined{#1}% - {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}% + {\def\reserved@a{\@latex@error{Environment~#1~undefined}\@eha}}% {\def\reserved@a{\def\@currenvir{#1}% \edef\@currenvline{\on@line}% \@execute@begin@hook{#1}% @@ -3680,7 +3735,7 @@ { \bool_if:NF \l__tag_para_flattened_bool { - \int_gincr:N \g__tag_para_main_end_int + \__tag_gincr_para_main_end_int: \tag_struct_end: } \@endpefalse @@ -3722,7 +3777,7 @@ \@@_debug_typeout:n{block-end \on@line} \legacy_if:nT { @endpe } { - \int_gincr:N \g__tag_para_main_end_int + \__tag_gincr_para_main_end_int: \@@_debug_typeout:n{close~ /text-unit \on@line} \tagstructend } @@ -3792,7 +3847,7 @@ \cs_set:Npn \__kernel_list_label_begin: { % % FMi: this needs a different logic to decide when to make the label -% an artifact (after cleaning up the the \item code ), therefore +% an artifact (after cleaning up the \item code ), therefore % disabled for now % \tl_if_empty:oTF \@itemlabel % { @@ -3835,7 +3890,7 @@ \cs_set:Npn \@@_list_item_end: { \legacy_if:nT { @endpe } { - \int_gincr:N \g__tag_para_main_end_int + \__tag_gincr_para_main_end_int: \tagstructend % text-unit % \@@_debug_typeout:n{Structure-end~ P~ at~ item-end \on@line } } @@ -3854,7 +3909,7 @@ \cs_set:Npn \@@_list_end: { \legacy_if:nT { @endpe } { - \int_gincr:N \g__tag_para_main_end_int + \__tag_gincr_para_main_end_int: \tagstructend % text-unit \@@_debug_typeout:n{Structure-end~ P~ at~ list-end \on@line } } 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 7cd08195e3..44c6602ada 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 e2ee78b2ff..a50b367837 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{2023-07-20} -\def\ltlabfirstaidversion{0.85a} +\def\ltlabfirstaiddate{2024-01-21} +\def\ltlabfirstaidversion{0.85b} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -64,7 +64,17 @@ \ltlabfirstaiddate\space v\ltlabfirstaiddate\space Temporary patches to external packages needed for the tagging project] % \end{macrocode} - +% \subsection{ams classes} +% The amsart and amsbook 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. +% +% \begin{macrocode} +\AddToHook{class/amsart/after} + {\def\@author{\authors}} +\AddToHook{class/amsbook/after} + {\def\@author{\authors}} +% \end{macrocode} % \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 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 578d70101e..8db9946ef4 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-float.dtx index 3bd3483600..e1c70968ab 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-float.dtx +++ b/macros/latex-dev/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{2023-07-20} -\def\ltlabfloatversion{0.81a} +\def\ltlabfloatdate{2024-02-05} +\def\ltlabfloatversion{0.81c} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -86,8 +86,8 @@ % In PDF~2.0 there is the suitable \texttt{Aside} tag which hopefully will % be handled correctly regarding the reading order once processor actually support % PDF~2.0. But in PDF~1.7 we rolemap it to \texttt{Note} and this doesn't lead to -% a good reading order. The code therefore collect the float structures and moves -% them to a \texttt{Sect} the end of the document or the chapter +% a good reading order. The code therefore collects the float structures and moves +% them to a \texttt{Sect} at the end of the document or the chapter % (H-floats once they are handled will not be moved). % % To fulfill the requirement that a \texttt{Caption} should be at the begin or end, we always @@ -106,6 +106,8 @@ % % The code add two keys for the \cs{tagtool} command % +% +% \begin{function}{flush-floats,split-float} % \begin{description} % \item[flush-floats] This will flush out the collected floats sofar (currently % table and figure. The value is a sectioning level, e.g. \texttt{section} or \texttt{chapter}, @@ -117,9 +119,19 @@ % \item[split-float] This can be used inside a float if there are two captions. % It will only work reasonably well if the content of the float parts are in a sensible order % and can be separated by this command. More complex setups with tabulars will need more -% thoughts +% thoughts. +% \end{description} +% \end{function} +% +% \section{Kernel commands} +% \begin{function}{\@current@float@struct} +% This variable holds the structure number of current float structure. +% \end{function} % -% \end{description} +% \begin{function}{\@makecaption} +% \cs{@makecaption} is defined by the classes so we overwrite it for now +% at begin document. +% \end{function} % % % \begin{macrocode} @@ -182,7 +194,7 @@ \seq_map_inline:Nn\g_@@_float_types_seq { \tag_struct_begin:n{tag=##1s,stash} - \prop_gput:Nnx\g_@@_float_sect_prop {##1-struct}{\int_use:N\c@g__tag_struct_abs_int} + \prop_gput:Nne\g_@@_float_sect_prop {##1-struct}{\int_use:N\c@g__tag_struct_abs_int} \tag_struct_end: } } @@ -239,6 +251,7 @@ {\par\__tag_sec_end:n{-10}\@@_float_stop_sect:} \DeclareHookRule{tagpdf/finish/before}{latex-lab/float}{before}{tagpdf} % \end{macrocode} +% % \subsection{Splitting floats} % \begin{macro}{split-float} % TODO: check if the target affect spacing!! @@ -249,7 +262,7 @@ { \@@_float_end: \@@_float_begin: - \MakeLinkTarget[tagstructure]{g__tag_struct_abs_int} + \MakeLinkTarget*{floatstructure.\int_use:N\c@g__tag_struct_abs_int} } } % \end{macrocode} @@ -290,12 +303,12 @@ { \exp_args:Ne \tag_struct_begin:n{tag=float,parent=0\prop_item:No\g_@@_float_sect_prop{\@captype-struct}}% - \prop_gput:Nxx \g_@@_float_sect_prop {\@captype-used}{true} + \prop_gput:Nee \g_@@_float_sect_prop {\@captype-used}{true} } { \tag_struct_begin:n{tag=float} } - \tl_set:Nx\@current@float@struct{\tag_get:n{struct_num}}% + \tl_set:Ne\@current@float@struct{\tag_get:n{struct_num}}% \typeout{Float structure: \@current@float@struct} } @@ -381,7 +394,7 @@ % \end{macrocode} % We add a target for links. TODO: check that it doesn't affect spacing!! % \begin{macrocode} - \MakeLinkTarget[tagstructure]{g__tag_struct_abs_int}% + \MakeLinkTarget*{floatstructure.\number\value{g__tag_struct_abs_int}}% }% % \end{macrocode} % The end code of the float ... @@ -446,10 +459,24 @@ \let\@kernel@refstepcounter\refstepcounter %as long it is not in the kernel \def\caption{% \ifx\@captype\@undefined - \@latex@error{\noexpand\caption outside float}\@ehd + \@latex@error{\noexpand\caption\c_space_tl outside~float}\@ehd \expandafter\@gobble - \else - \@kernel@refstepcounter\@captype + \else +% \end{macrocode} +% if a caption is used outside a float no +% target has been set and \cs{@current@float@struct} is empty +% \begin{macrocode} + \tl_if_empty:NTF\@current@float@struct + { + \refstepcounter\@captype + } + { + \@kernel@refstepcounter\@captype +% \end{macrocode} +% we need to reset the target for \cs{addcontentsline}. +% \begin{macrocode} + \xdef\@currentHref{floatstructure.\@current@float@struct}% + } \expandafter\@firstofone \fi {\@dblarg{\@caption\@captype}}% @@ -471,7 +498,6 @@ { \long\def\@makecaption#1#2{% \vskip\abovecaptionskip - \xdef\@currentHref{tagstructure.\@current@float@struct}% % \end{macrocode} % we don't want tagging when storing the caption for the singleline check % \begin{macrocode} @@ -482,12 +508,21 @@ % we stop paratagging. TODO: check % \begin{macrocode} \tagtool{para=false} - \tag_struct_begin:n{tag=Caption,parent=\@current@float@struct} +% \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} - \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 + \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 + } \ifdim \wd\@tempboxa >\hsize \tag_struct_begin:n{tag=Lbl} \tag_mc_begin:n{} 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 1af101107f..e691200085 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 e0b8bc5580..4e291d6abf 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx index 158b0d2a9c..9585bee189 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-graphic.dtx @@ -184,7 +184,10 @@ \RequirePackage{l3opacity} % \end{macrocode} % -% +% Needed during switch to e-type: +% \begin{macrocode} +\cs_generate_variant:Nn \@@_prop_gput:Nnn {cne} +% \end{macrocode} % \begin{macro}{\@@_graphic_savepos:n} % this is the command which stores the position. Similar to % zref-savepos it uses two savepos commands @@ -894,7 +897,7 @@ % The structure and the mc must be open earlier, before the \cs{setbox} (at least % for luatex it has to). TODO: think about interface if more attributes are needed. % \begin{macrocode} - \@@_prop_gput:cnx + \@@_prop_gput:cne { g_@@_struct_\int_eval:n {\c@g_@@_struct_abs_int}_prop } { A } { @@ -970,7 +973,7 @@ {red} {\int_use:N\g_@@_graphic_int} } - \@@_prop_gput:cnx + \@@_prop_gput:cne { g_@@_struct_\int_eval:n {\c@g_@@_struct_abs_int}_prop } { A } { 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 bf57d1bd95..fe21c3e51a 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx new file mode 100644 index 0000000000..ca79d8a67f --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-marginpar.dtx @@ -0,0 +1,259 @@ +% \iffalse meta-comment +% +%% File: latex-lab-marginpar.dtx +%% +% Copyright (C) 2024 LaTeX Project +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file +% +% https://www.latex-project.org/lppl.txt +% +% +% The development version of the bundle can be found below +% +% https://github.com/latex3/latex2e/required/latex-lab +% +% for those people who are interested or want to report an issue. +% +\def\ltlabmarginpardate{2024-02-12} +\def\ltlabmarginparversion{0.85b} + +%<*driver> +\documentclass[kernel]{l3doc} +\EnableCrossrefs +\CodelineIndex +\begin{document} + \DocInput{latex-lab-marginpar.dtx} +\end{document} +%</driver> +% +% \fi +% +% \title{The \textsf{latex-lab-marginpar} package\\ +% Changes related to the tagging of margin notes} +% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}} +% \date{v\ltlabmarginparversion\ \ltlabmarginpardate} +% +% \maketitle +% +% \newcommand{\xt}[1]{\textsl{\textsf{#1}}} +% \newcommand{\TODO}[1]{\textbf{[TODO:} #1\textbf{]}} +% \newcommand{\docclass}{document class \marginpar{\raggedright document class +% customizations}} +% +% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}} +% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}} +% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}} +% +% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl} +% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl} +% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl} +% +% \begin{abstract} +% \end{abstract} +% +% \section{Introduction} +% +% This module contains changes to improve the tagging (in the standard classes) of +% margin notes created with the \cs{marginpar} command. +% +% Such margin notes are rather small but nevertheless tagging is not trivial and poses +% a number of interesting problems both regarding the structure and the implementation. +% +% \subsection{Structure} +% \cs{marginpar} creates small boxes in the margin of a page. +% While they are technically floats they also typically +% relate to the paragraph beside them, so their structure element should be placed near +% such a paragraph. +% +% 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|, +% 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. +% +% \subsection{Implementation} +% +% |marginpar| has an optional argument which allows to define a different content +% on left/right margins for odd/even pages (depending on twoside and \cs{reversemarginpar}). +% +% The current implementation stores *both* arguments in boxes and +% decides in the output routine which +% one to use. This is quite problematic for tagging, as the unused box produces +% structure objects, literals, labels, MCID numbers, +% and perhaps OBJR-objects from links +% which must be later thrown away again (or are thrown away by the engine). +% While it is theoretically not impossible to create +% both boxes while taging is active but to keep everything on hold and insert +% the real structure only when the box is used it is in practice quite difficult, +% slow and error prone. +% +% There are a number of options to avoid this hassle. +% +% \begin{description} +% \item[Minimal tagging] One option is to disable tagging when the boxes +% are built and when the box is used to surround them with a simple Aside. +% +% \begin{description} +% \item[Pro:] easy to implement +% \item[Contra:] +% Content that perhaps needed tagging (|\LaTeX| logo with /ActualText, images, links) is not tagged. +% \end{description} +% +% \item[Remaking the box] +% Tagging is deactivated when the boxes are created. +% The arguments are stored and when the box should be used in the output routine +% (and when it is known which one will be used) the box is (re)created, now with proper tagging. +% +% Contra: The content can change e.g. if it uses counters or macros that are redefine later before the +% output routine is called. As tagging is done later, it is not trivial to insert the +% |Aside| in the right place in the paragraph structure. +% +% \item[Two pass compilation] +% A label is used to detect which argument/boxed is used and +% tagging is activated only for this one. +% +% Contra: costs a |label| and requires a two pass compilation (which is needed anyway). +% This should be ok. |\marginnote| uses a label too, and the same +% label could also be used to resolve problems if a margin note +% moves to a new page (and so replace the mparhack package). +% \end{description} +% +% The last option seems the best and is therefore implemented. +% +% +% \section{Implementation} +% \begin{macrocode} +%<*package> +%<@@=tag> +% \end{macrocode} +% \begin{macrocode} +\ProvidesExplPackage {latex-lab-testphase-marginpar} {\ltlabmarginpardate} {\ltlabmarginparversion} + {Changes related to the tagging of the margin notes} +% \end{macrocode} +% \subsection{Variables} +% We need a variable to make the label unique. +% Todo: Not sure about the name. +% \begin{macro}{\g__kernel_marginpar_int} +% \begin{macrocode} +\int_new:N \g__kernel_marginpar_int +% \end{macrocode} +% \end{macro} +% +% \subsection{Tagging sockets} +% +% \begin{socketdecl}{tagsupport/marginpar/begin,tagsupport/marginpar/end} +% \begin{macrocode} +\socket_new:nn {tagsupport/marginpar/begin}{0} +\socket_new:nn {tagsupport/marginpar/end}{0} +% \end{macrocode} +% \end{socketdecl} +% \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}% + \else: + \tag_struct_begin:n{tag=Aside}% + \fi: + } +\socket_new_plug:nnn {tagsupport/marginpar/end}{default} + { + \tag_struct_end: + \if_mode_horizontal: \tag_mc_begin:n{} \fi: + } +\socket_assign_plug:nn {tagsupport/marginpar/begin}{default} +\socket_assign_plug:nn {tagsupport/marginpar/end}{default} +% \end{macrocode} +% \end{plugdecl} + +% \subsection{Kernel command changes} +% \begin{macro}{\@savemarbox } +% We add sockets that add a tagging structure Aside: +% \begin{macrocode} +\long\def \@savemarbox #1#2{% + \UseTaggingSocket{marginpar/begin} + \global\setbox #1% + \color@vbox + \vtop{% + \hsize\marginparwidth + \@parboxrestore + \@marginparreset + #2\par + \@minipagefalse + \outer@nobreak + }% + \color@endbox + \UseTaggingSocket{marginpar/end} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ympar} +% We must avoid that \cs{@xympar} creates tagging structure: +% \begin{macrocode} +\long\def\@ympar#1{% + \@savemarbox\@marbox{#1}% + \global\setbox\@currbox\copy\@marbox + \tag_stop: + \@xympar + \tag_start:} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xmpar} +% \cs{@xmpar} is the command used if an optional argument is present. +% In this case we must stop tagging for \cs{@xympar} as above +% but also decide which of the two @savemarbox should have tagging active. +% We add a label to \cs{@marbox}. If that exist tagging is activated for this +% box else for the other one. +% \begin{macrocode} +\long\def\@xmpar[#1]#2{% + \int_gincr:N\g__kernel_marginpar_int + \property_if_recorded:eTF { tag_marginpar-opt-\int_use:N\g__kernel_marginpar_int } + { + \@savemarbox\@marbox {#1 + \property_record:ee + { tag_marginpar-opt-\int_use:N\g__kernel_marginpar_int }{page} + }% + \tag_stop: + \@savemarbox\@currbox{#2}% + \tag_start: + } +% \end{macrocode} +% order matters! the tagged box should be first so that it can pick up +% the correct text-unit number. +% \begin{macrocode} + { + \@savemarbox\@currbox{#2}% + \tag_stop: + \@savemarbox\@marbox{#1 + \property_record:ee + { tag_marginpar-opt-\int_use:N\g__kernel_marginpar_int }{page}} + \tag_start: + } + \tag_stop: + \@xympar + \tag_start: + } +%</package> +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%<*latex-lab> +\ProvidesFile{marginpar-latex-lab-testphase.ltx} + [\ltlabmarginpardate\space v\ltlabmarginparversion\space + Changes related to the tagging of the margin notes] + +\RequirePackage{latex-lab-testphase-marginpar} + +%</latex-lab> +% \end{macrocode} 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 differnew file mode 100644 index 0000000000..33be164cfa --- /dev/null +++ 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 285471addc..03eb8e42d0 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-math.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-math.dtx @@ -2,7 +2,7 @@ % %% File: latex-lab-math.dtx % -% Copyright (C) 2022-2023 The LaTeX Project +% Copyright (C) 2022-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -19,8 +19,8 @@ % for those people who are interested or want to report an issue. % % -\def\ltlabmathdate{2023-09-11} -\def\ltlabmathversion{0.5c} +\def\ltlabmathdate{2024-02-09} +\def\ltlabmathversion{0.5i} % %<*driver> \documentclass{l3doc} @@ -46,7 +46,14 @@ % \newcommand\NEW[1]{\marginpar{\mbox{}\hfill\fbox{New: #1}}} % \providecommand\class[1]{\texttt{#1.cls}} % \providecommand\pkg[1]{\texttt{#1}} -% \providecommand\hook[1]{\texttt{#1}} +% +% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}} +% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}} +% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}} +% +% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl} +% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl} +% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl} % % ^^A \car {...} for marginal comments % ^^A \car*{...} for longer inline comments @@ -59,8 +66,6 @@ % {\IfBooleanTF{#1}{\todo[inline,#2]{#3}}^^A % {\todo[#2]{#3}}} % -% -% % \begin{abstract} % This is an experimental prototype. It captures math material % (basically okay, but the interfaces for packages aren't yet @@ -75,6 +80,18 @@ % \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. +% \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. +% \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 @@ -84,7 +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 +% \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 +% regardless of the state of the boolean. For +% |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} +% % \subsection{Code level interfaces} % % \begin{function}{\math_register_env:n, \math_register_env:nn} @@ -109,7 +143,8 @@ % \end{syntax} % Declares that the captured math content should be passed to the % \meta{tokens}, which will receive the environment type as |#1| and -% the content as |#2|. +% the content as |#2|. The processing is done before the typesetting. It is not +% applied if \cs{ifmeasuring@} is true. % \end{function} % % \subsection{Document level interfaces} @@ -129,38 +164,275 @@ % \end{itemize} % \end{function} % +% \section{Math tagging} +% +% 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 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 the /Alt key +% \item setup content for the /ActualText key +% \item setup attributes +% \item add associated files +% \item add a Formula structure +% \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 +% (currently only luatex with luamml) +% \end{itemize} +% \end{itemize} +% +% \subsection{Inline math} +% +% The embedding code is added through +% the sockets +% \begin{itemize} +% \item |tagsupport/math/inline/begin| +% \item |tagsupport/math/inline/end| +% \end{itemize} +% The sockets simply push and pop the MC currently. Without +% 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 +% socket uses the identity plug. +% The |default| plug of the socket calls these three internal sockets +% for the tagging support: +% \begin{itemize} +% \item |tagsupport/math/content| This should set up the various +% content variables (empty variables are ignored by the structure code +% and so can be used to suppress a setting). +% \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?? +% \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| +% \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. +% 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 +% 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. +% 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. +% 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 +% 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. +% 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 +% 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>| \\ +% | <h2>\mml| \meta{key}|</h2>|\\ +% | <p>|\meta{source}|</p>| \\ +% | <p>|\meta{hash}|</p>| \\ +% | <math | \meta{attributes} |>|\\ +% \meta{mathml}\\ +% | </math>|\\ +% |</div>| +% \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 +% 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. +% 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 +% |math/mathml/AF=false|, or +% completly 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 +% 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). +% +% \subsection{Options} +% +% % \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} % 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}/''. +% This can be avoided by an additional brace group: +% \begin{verbatim} +% $a{\begin{minipage}{1cm}$b$\end{minipage}}$ +% \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 +% +% \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). +% +% \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 +% a grabbing environment. +% +% \item The behaviour of |\[...\]| is faulty. See above. % \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}. +% +% 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 +% \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. +% +% 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. +% +% \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. +% 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 +% \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. +% 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. +% +% \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. +% 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 -% The presence of \cs{m@th} in association with \cs{ensuremath} +% 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, % \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. % % \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{DeclareMathEnviornment}, +% 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.} @@ -172,7 +444,10 @@ % \begin{enumerate} % \item Add (some of) the math display commands that were \enquote{lifted from % plain}, e.g., \cs{displaylines} \cs{eqalign}(??). -% \item +% \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. % \end{enumerate} % % @@ -218,36 +493,823 @@ % have conditional definitions and deals with how to define \cs{[}/\cs{]} % neatly. % \begin{macrocode} -\tl_gput_right:Nn \@kernel@before@begindocument - { \RequirePackage { amsmath } } +\AddToHook{begindocument/before}{ \RequirePackage { amsmath } } % \end{macrocode} % % % \subsection{Data structures} % -% -% -% \begin{variable}{\l_@@_collected_bool} +% \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. +% See \ref{sec:mathcapture} for details. +% \begin{macrocode} +\bool_new:N \l_@@_collected_bool +% \end{macrocode} +% \end{variable} % +% \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 +% grabbed contents contains the \cs{m@th} token. % % \begin{macrocode} -\bool_new:N \l_@@_collected_bool +\bool_new:N \l_@@_fakemath_bool % \end{macrocode} % \end{variable} -% +% +% % \car{Change first tl name below: `env' $=>$ `info'?\\ % Or do we need an extra storage tl?} % % \begin{variable}{\g_@@_grabbed_env_tl, \g_@@_grabbed_math_tl} -% \cs{g_@@_grabbed_env_tl} contains the name of the math environment (\texttt{math} in the case -% of inline math, \cs{g_@@_grabbed_math_tl} the math content. +% \cs{g_@@_grabbed_env_tl} contains the name of the math environment +% (\texttt{math} in the case of inline math, +% \cs{g_@@_grabbed_math_tl} the math content. % \begin{macrocode} \tl_new:N \g_@@_grabbed_env_tl \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 +% \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. +% \begin{macrocode} +\tl_new:N \l_@@_content_alt_tl +\tl_new:N \l_@@_content_actual_tl +\tl_new:N \l_@@_content_AF_source_tl +\tl_new:N \l_@@_content_AF_source_tmpa_tl +\tl_new:N \l_@@_content_AF_mathml_tl +% \end{macrocode} +% \end{variable} +% +% \subsection{Tagging tools} +% 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: + { + \tag_if_active:T + { + \tag_mc_end: %end P-chunk, should perhaps be \tag_mc_end_push: ... + \__tag_gincr_para_end_int: + \__tag_check_para_end_show:nn{red}{} %debug: show para + \tag_struct_end: + } + } +% \end{macrocode} +% \end{macro} +% +% We add also an attribute. +% \begin{macrocode} +\tl_new:N\l_@@_attribute_class_tl +\tagpdfsetup + {newattribute = {inline} {/O /Layout /Placement/Inline}, + newattribute = {display} {/O /Layout /Placement/Block}, + } +% \end{macrocode} +% +% \subsection{Code related to AF} +% Booleans to handle the options. +% \begin{variable}{ +% \l__tag_math_texsource_AF_bool, +% \l__tag_math_texsource_pane_bool, +% \l__tag_math_mathml_AF_bool, +% \g__tag_math_mathml_AF_bool, +% \l__tag_math_mathml_pane_bool, +% \l__tag_math_alt_bool +% } +% \begin{macrocode} +\bool_new:N\l__tag_math_texsource_AF_bool +\bool_new:N\l__tag_math_texsource_pane_bool +\bool_new:N\l__tag_math_mathml_AF_bool +\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 +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{ +% \g_@@_mathml_total_int, +% \g_@@_mathml_int, +% \g_@@_math_total_int, +% \g_@@_mathml_AF_found_int, +% \g_@@_mathml_AF_attached_int, +% } +% \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_found_int} records the number of math structures for which a fitting +% 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 +\int_new:N\g_@@_math_total_int +\int_new:N\g_@@_mathml_AF_found_int +\int_new:N\g_@@_mathml_AF_attached_int +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\l__tag_math_mathml_files_clist} +% A sequence to store the file list for the mathml. +% \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} +% \end{macrocode} +% \end{variable} + +% 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 +%#1 number, #2 tex source for debugging, #3 hash, #4 mathml + { + \int_gincr:N \g_@@_mathml_total_int +% \end{macrocode} +% mathml with the same hash should be included only once: +% \begin{macrocode} + \tl_if_exist:cF { g_@@_mathml_#3_tl } + { + \int_gincr:N \g_@@_mathml_int +% \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)} + \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 +% \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 + } + } +% \end{macrocode} +% \end{macro} +% +% 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 + \char_set_catcode_other:N\{ + \char_set_catcode_other:N\} + \char_set_catcode_other:N\# + \char_set_catcode_other:N\% + \@@_AF_html_reader_verb:w{#1}{#3}{#5}<math +} +% \end{macrocode} +% \begin{macrocode} +\cs_new_protected:Npn\@@_AF_html_reader_verb:w#1#2#3#4~</div>{ + \endgroup + \@@_AF_mml:nnnn{#1}{#2}{#3}{#4} + } +% \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_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: + <math></math> + \iow_newline: + </div> + \iow_newline: + } + } +% \end{macrocode} +% \end{plugdecl} +% And now a key to activate the socket. +% \begin{macrocode} + +\keys_define:nn { __tag / setup } + { + math/mathml/write-dummy .code:n = + { + \bool_gset_true:N \g__tag_math_mathml_AF_bool + \tl_if_exist:NF\g_@@_writedummy_iow + { + \iow_new:N \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> + } + \AssignSocketPlug {tagsupport/math/mathml/write}{On} + \AddToHook{enddocument/afterlastpage} + { + \iow_now:Nn \g_@@_writedummy_iow {</html>} + \iow_close:N \g_@@_writedummy_iow + } + } + }, + math/mathml/write-dummy .usage:n=preamble + } +% \end{macrocode} +% +% \begin{macro}{\@@_AF_process_mathml_files:} +% \begin{macrocode} +\box_new:N\l_@@_tmpa_box +\cs_new_protected:Npn \@@_AF_process_mathml_files: + { + \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} } + \char_set_catcode_other:N \# + \cs_set_eq:NN\mml \@@_AF_html_reader:w + \clist_map_inline:Nn \l__tag_math_mathml_files_clist + { + \file_if_exist:nTF {##1.html} + { + \typeout{Info:~reading~mathml~file~##1} + \file_input:n {##1.html} + \bool_gset_true:N\g__tag_math_mathml_AF_bool + } + { + \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} +% \end{macrocode} +% mathml handling doesn't like subparts, so we disable them for now: +% \begin{macrocode} + \AssignSocketPlug{tagsupport/math/substruct/begin}{single} + \AssignSocketPlug{tagsupport/math/substruct/end}{single} + \AddToHook{enddocument/info} + { + \iow_term:n{MathML~statistic} + \iow_term:n{================} + \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 + different~MathML~fragments} + \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 + fitting~MathML~AF~found} + \iow_term:e{==>~\int_use:N\g_@@_mathml_AF_attached_int\c_space_tl + MathML~AF~attached} + } + } + } +\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. +% 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 +\int_new:N \g_@@_mathchoice_int +\property_new:nnnn{mathstyle}{now}{-1}{\int_use:N \l_@@_mathstyle_int } +% \end{macrocode} +%\end{macro} +% 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 +% then used. +% \begin{macro}{\@@_tag_if_mathstyle:nn} +% \begin{macrocode} +\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: } + } +\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, + 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, + 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} +% +% \subsection{Sockets} +% \subsubsection{Main inline math sockets} +% +% \begin{socketdecl} +% { +% tagsupport/math/inline/begin, +% tagsupport/math/inline/end, +% tagsupport/math/inline/formula/begin, +% 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. +% 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! +% \begin{macrocode} +\socket_new:nn {tagsupport/math/inline/begin}{0} +\socket_new:nn {tagsupport/math/inline/end}{0} +\socket_new:nn {tagsupport/math/inline/formula/begin}{1} % +\socket_new:nn {tagsupport/math/inline/formula/end}{0} +% \end{macrocode} +%\end{socketdecl} +% +% +% \begin{plugdecl}{MC} +% \begin{macrocode} +\socket_new_plug:nnn + {tagsupport/math/inline/begin} + {MC} + {\tag_mc_end_push:} +\socket_new_plug:nnn + {tagsupport/math/inline/end} + {MC} + {\tag_mc_begin_pop:n{}} +% \end{macrocode} +% \end{plugdecl} +% +% We probably will want to test different tagging receipes. +% \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} +% 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} + #1 + \socket_use:n{tagsupport/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, +% tagsupport/math/display/end, +% tagsupport/math/display/formula/begin, +% 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 +% P-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! +% \begin{macrocode} +\socket_new:nn {tagsupport/math/display/begin}{0} +\socket_new:nn {tagsupport/math/display/end}{0} +\socket_new:nn {tagsupport/math/display/formula/begin}{1} % +\socket_new:nn {tagsupport/math/display/formula/end}{0} +% \end{macrocode} +%\end{socketdecl} + +% \begin{plugdecl}{default} +% \begin{macrocode} +\socket_new_plug:nnn + {tagsupport/math/display/begin} + {default} + { \__tag_tool_close_P: } +\socket_new_plug:nnn + {tagsupport/math/display/end} + {default} + { + } +% \end{macrocode} +% \end{plugdecl} + + +% \begin{plugdecl}{default} +% \begin{macrocode} +\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} + } +\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} +\tl_new:N\l_@@_content_template_tl +\tl_set:Nn \l_@@_content_template_tl + { + LaTeX~ formula~ starts~ + \exp_not:N\begin{\g_@@_grabbed_env_tl} + \c_space_tl + \exp_not:V\g_@@_grabbed_math_tl + \c_space_tl + \exp_not:N\end{\g_@@_grabbed_env_tl} + \c_space_tl LaTeX~ formula~ ends~ + } +% \end{macrocode} +% \end{variable} + +% \begin{variable}{\l_@@_texsource_template_tl} +% The default text used as texsource +% \begin{macrocode} +\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 + { + $ + \exp_not:V\g_@@_grabbed_math_tl + $ + } + { + \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 +% 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 +% \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 how this should organized so that one +% has options to change from the outside and so that +% there are less repetitions. +% \begin{plugdecl}{actual+source} +% \begin{macrocode} +\socket_new_plug:nnn + {tagsupport/math/content} + {actual+source} + { + \tl_set:Ne\l_@@_content_actual_tl + { + \l_@@_content_template_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} +% +% \begin{plugdecl}{alt+source} +% \begin{macrocode} +\socket_new_plug:nnn + {tagsupport/math/content} + {alt+source} + { + \tl_set:Ne\l_@@_content_alt_tl + { + \l_@@_content_template_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} +% \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 +% \cs{g_@@_grabbed_env_tl} and \cs{g_@@_grabbed_math_tl} +% \begin{macrocode} +\socket_new:nn {tagsupport/math/struct/begin}{0} +\socket_new:nn {tagsupport/math/struct/end}{0} +% \end{macrocode} +% \end{socketdecl} +% +% \begin{plugdecl}{default} +% TODO: think about some naming convention ... +% \begin{macrocode} +\socket_new_plug:nnn + {tagsupport/math/struct/begin} + {default} + { + \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 } + \tag_struct_begin:n + { + tag=Formula, + texsource = \l_@@_content_AF_source_tmpa_tl, + title-o = \g_@@_grabbed_env_tl, + actualtext = \l_@@_content_actual_tl, + alt = \l_@@_content_alt_tl + } + } +\socket_new_plug:nnn + {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| +% \begin{macrocode} +\cs_generate_variant:Nn \str_mdfive_hash:n {o} +\tl_new:N\l_@@_content_hash_tl +% \end{macrocode} +% we need to save the grabbed math: +% \begin{macrocode} +\tl_new:N\l_@@_grabbed_math_tl +% \end{macrocode} +% the socket definition +% \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 + \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{} } +% \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 + { \tl_set_eq:NN \l_@@_content_AF_source_tmpa_tl \l_@@_content_AF_source_tl } + { \tl_clear:N \l_@@_content_AF_source_tmpa_tl } + \tag_struct_begin:n + { + tag=Formula, + attribute-class=\l_@@_attribute_class_tl, % + AFref = + \bool_if:NT\l__tag_math_mathml_AF_bool + { + \cs_if_exist_use:c {g_@@_mathml_ \l_@@_content_hash_tl _tl} + }, + texsource = \l_@@_content_AF_source_tmpa_tl, % should be after mathml AF! + title-o = \g_@@_grabbed_env_tl, % + alt = \l_@@_content_alt_tl + } + } +% \end{macrocode} +% not really needed but looks more symmetric: +% \begin{macrocode} +\socket_new_plug:nnn + {tagsupport/math/struct/end} + {test-mathml} + { + \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. +% \begin{macrocode} +\socket_new:nn {tagsupport/math/substruct/begin}{0} +\socket_new:nn {tagsupport/math/substruct/end}{0} +% \end{macrocode} +% \end{socketdecl} +% +% \begin{plugdecl}{default} +% \begin{macrocode} +\socket_new_plug:nnn + {tagsupport/math/substruct/begin} + {default} + { \grabaformulapartandstart } +\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} + +% \begin{plugdecl}{single} +% We need an option to disable subparts as it is unclear +% if consumers can handle them: +% \begin{macrocode} +\socket_new_plug:nnn + {tagsupport/math/substruct/begin} + {single} + { + \typeout{====>subpart~splitting~deactivated} + \typeout{====>grabbed~math=\meaning\g_@@_grabbed_math_tl} + \tag_mc_begin:n{} + } +\socket_new_plug:nnn + {tagsupport/math/substruct/end} + {single} + { \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. +% \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: + { + \socket_assign_plug:nn {tagsupport/math/inline/begin}{noop} + \socket_assign_plug:nn {tagsupport/math/inline/end}{noop} + \socket_assign_plug:nn {tagsupport/math/inline/formula/begin}{identity} + \socket_assign_plug:nn {tagsupport/math/inline/formula/end}{noop} + \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} + } +% \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: + { + \socket_assign_plug:nn {tagsupport/math/inline/begin}{MC} + \socket_assign_plug:nn {tagsupport/math/inline/end}{MC} + \socket_assign_plug:nn {tagsupport/math/inline/formula/begin}{default} + \socket_assign_plug:nn {tagsupport/math/inline/formula/end}{default} + \socket_assign_plug:nn {tagsupport/math/display/begin}{default} + \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: +% \begin{macrocode} +\AtBeginDocument{\tag_if_active:T{\__tag_math_enable: }} +% \end{macrocode} % % \subsection{Interface commands} % @@ -260,7 +1322,8 @@ { \legacy_if:nF { measuring@ } { - \tl_if_in:nnF {#2} { \m@th } + \tl_if_in:nnTF {#2} { \m@th } + { \bool_set_true:N\l_@@_fakemath_bool } { \tl_trim_spaces_apply:nN {#2} \@@_process_auxi:nn {#1} } } } @@ -287,15 +1350,15 @@ % % \begin{macro}{\@@_grab_dollar:w} % Grab up to a single |$|, for inline math mode, suppressing -% any processing if the first token is \tn{m@th}. +% any processing if the token is \tn{m@th} found in the content. +% +% \fmi{what's that test doing?} % -% \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{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{cf.~the code for this in \cs{@ensuredmath}} % %\car{It is harmless but unnecessary in the dollardollar grabbing below.} % @@ -309,91 +1372,61 @@ \tl_if_blank:nF {#1} { \@@_process:nn { math } {#1} % $ -% fairly simple this one % \end{macrocode} -% We do not want math tagging in fakemath or when measuring, -% so we imitate the test inside \cs{@@_process:nn} for now, -% see https://github.com/latex3/tagging-project/issues/5 -% TODO: use socket to get more control about typesetting variants (tagged, drop etc)? +% We do not want math tagging in fakemath or when measuring, % \begin{macrocode} - \legacy_if:nTF { measuring@ } - { #1 $ } - { - \tl_if_in:nnTF {#1} { \m@th } - { #1 $ } - { - \tagmcend %end P-chunk, in code: \tag_mc_end_push: - \@kernel@math@begin - #1 $ - \@kernel@math@end - \tagmcbegin{} % restart P-chunk (whatsits in pdftex) - } - } + \bool_lazy_or:nnTF + {\legacy_if_p:n { measuring@ }} + { \l_@@_fakemath_bool } + { #1 $ } + { + \socket_use:n {tagsupport/math/inline/begin} %end P-MC + \socket_use:nn{tagsupport/math/inline/formula/begin}{#1} + $ + \socket_use:n {tagsupport/math/inline/formula/end} + \socket_use:n {tagsupport/math/inline/end} % restart P-MC + } } } % \end{macrocode} % \end{macro} +% % \begin{macro}{\@@_grab_dollardollar:w} % And for the classical \TeX{} display structure. % \begin{macrocode} - -\skip_new:N \l_@@_tmpa_skip - \cs_new_protected:Npn \@@_grab_dollardollar:w % $$ #1 $$ { \tl_if_blank:nF {#1} { - \@@_tag_dollardollar_display:nn { equation* }{#1} - #1 + \@@_process:nn { equation* } {#1} + \socket_use:n {tagsupport/math/display/begin} + \socket_use:nn{tagsupport/math/display/formula/begin}{#1} $$ } } % \end{macrocode} -% To allow to use the code without tagging we guard. But probably tagpdf should -% provide some tools for such manual para-ends. +% +% The end code is added through a \cs{aftergroup} so we +% store it inside a command. % \begin{macrocode} -\cs_new_protected:Npn \@kernel@close@P { - \tag_if_active:T - { - \tagmcend %end P-chunk, should perhaps be \tag_mc_end_push: ... - \int_gincr:N \g__tag_para_end_int - \bool_if:NT \l__tag_para_show_bool - { \tag_mc_begin:n{artifact} - \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int} - \tag_mc_end: - } - \tag_struct_end: - } -} - - - -\cs_new_protected:Npn \@@_tag_dollardollar_display:nn #1#2 { - \@@_process:nn {#1} {#2} - \@kernel@close@P - \@kernel@math@begin -% \skip_set:Nn \belowdisplayskip {-\belowdisplayskip} -% \skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip} -% \int_set:Nn \postdisplaypenalty {10000} -%% -% \group_insert_after:N \@@_tag_dollardollar_display_end: -} - -\cs_new_protected:Npn \@@_tag_dollardollar_display_end: { -% \typeout{== tag dollarldollar display end} -% \ShowTagging{struct-stack} - \tagpdfparaOff - \para_raw_end: - \tagpdfparaOn - \l_@@_tmpa_skip \lastskip - \@kernel@math@end - \penalty \postdisplaypenalty +\cs_new_protected:Npn \@@_tag_dollardollar_display_end: + { + % \typeout{== tag dollarldollar display end} + % \ShowTagging{struct-stack} + \para_raw_end: +% \end{macrocode} +% TODO why is that needed? where is para-tagging disabled? +% \begin{macrocode} + \tagpdfparaOn + \l_@@_tmpa_skip \lastskip + \socket_use:n{tagsupport/math/display/formula/end} + \penalty \postdisplaypenalty % \end{macrocode} % This reinserts the below display skips. It must be doubled to % get the right amount: % \begin{macrocode} - \skip_vertical:n { -\l_@@_tmpa_skip * 2 } + \skip_vertical:n { -\l_@@_tmpa_skip * 2 } % \@doendpe % this has no \end{...} to take care of it } @@ -410,13 +1443,13 @@ { \tl_if_blank:nF {#1} { - \@@_process:nn { math } {#1} $ #1 $ } \bool_set_false:N \l_@@_collected_bool } % \end{macrocode} % \end{macro} +% % \begin{macro}{\@@_grab_eqn:w} % For the most common use of \cs{[}/\cs{]}: turn into an environment. % \begin{macrocode} @@ -463,7 +1496,7 @@ % \begin{macro}{\math_register_env:n} % \begin{macro}{\RegisterMathEnvironment} % Set up to capture environment content and make available. -% +% % \begin{macrocode} \cs_new_protected:Npn \math_register_env:nn #1#2 { @@ -472,15 +1505,8 @@ \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1} \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 } % - \ExpandArgs { nnx } \RenewDocumentEnvironment {#1} { b } + \ExpandArgs { nne } \RenewDocumentEnvironment {#1} { b } { -% \bool_set_true:N \exp_not:N \l_@@_collected_bool -% \cs_if_exist:cTF { @@_env #1 _aux: } -% { -% \exp_not:c { @@_env #1 _aux: } -% ####1 \exp_not:N \@@_env_end: {#1} -% } -% { \exp_not:N \@@_process:nn {#1} {####1} } \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool { % \typeout{===>B1} @@ -490,34 +1516,22 @@ \cs_if_exist:cTF { @@_env #1 _aux: } { \exp_not:c { @@_env #1 _aux: } - ####1 \exp_not:N \@@_env_end: {#1} + ##1 \exp_not:N \@@_env_end: {#1} } - { \exp_not:N \@@_process:nn {#1} {####1} } + { \exp_not:N \@@_process:nn {#1} {##1} } \exp_not:n { \@kernel@math@registered@begin } \bool_set_true:N \exp_not:N \l_@@_collected_bool } -% \exp_not:N \tracingall +% \exp_not:N \tracingall \exp_not:c { @@_env_ #1 _begin: } - ####1 + ##1 \exp_not:c { @@_env_ #1 _end: } -% \exp_not:c { @@_env_ #1 _end: } % \exp_not:N \tracingnone -% \exp_not:n { \@kernel@math@registered@end } } - { - } + { + } } -\cs_set_protected:Npn \__cs_tmp:w #1 - { - \group_begin: - \exp_args:No \__cs_generate_internal_variant:n - { \tl_to_str:n {#1} } - \group_end: - } -\__cs_tmp:w { nnxx } - - \cs_new_protected:Npn \math_register_halign_env:nn #1#2 { \tl_set:Nn \l_@@_env_name_tl {#1} @@ -525,15 +1539,8 @@ \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1} \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 } % - \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b } + \ExpandArgs { nnee } \RenewDocumentEnvironment {#1} { b } { -% \bool_set_true:N \exp_not:N \l_@@_collected_bool -% \cs_if_exist:cTF { @@_env #1 _aux: } -% { -% \exp_not:c { @@_env #1 _aux: } -% ####1 \exp_not:N \@@_env_end: {#1} -% } -% { \exp_not:N \@@_process:nn {#1} {####1} } \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool { % \typeout{===>B1} @@ -543,23 +1550,24 @@ \cs_if_exist:cTF { @@_env #1 _aux: } { \exp_not:c { @@_env #1 _aux: } - ####1 \exp_not:N \@@_env_end: {#1} + ##1 \exp_not:N \@@_env_end: {#1} } - { \exp_not:N \@@_process:nn {#1} {####1} } + { \exp_not:N \@@_process:nn {#1} {##1} } \exp_not:n { \@kernel@math@registered@begin } \bool_set_true:N \exp_not:N \l_@@_collected_bool } -% \exp_not:N \tracingall +% \exp_not:N \tracingall \exp_not:c { @@_env_ #1 _begin: } - ####1 -% \exp_not:c { @@_env_ #1 _end: } + ##1 % \exp_not:N \tracingnone } - { - \exp_not:c { @@_env_ #1 _end: } - } + { + \exp_not:c { @@_env_ #1 _end: } + } } - +% \end{macrocode} +% TODO: the following command is neither documented nor used. Is is needed? +% \begin{macrocode} \cs_new_protected:Npn \math_register_odd_env:nn #1#2 { \tl_set:Nn \l_@@_env_name_tl {#1} @@ -567,7 +1575,7 @@ \cs_gset_eq:cc { @@_env_ #1 _begin: } {#1} \cs_gset_eq:cc { @@_env_ #1 _end: } { end #1 } % - \ExpandArgs { nnxx } \RenewDocumentEnvironment {#1} { b } + \ExpandArgs { nnee } \RenewDocumentEnvironment {#1} { b } { \exp_not:N \bool_if:NTF \exp_not:N \l_@@_collected_bool { @@ -578,19 +1586,19 @@ \cs_if_exist:cTF { @@_env #1 _aux: } { \exp_not:c { @@_env #1 _aux: } - ####1 \exp_not:N \@@_env_end: {#1} + ##1 \exp_not:N \@@_env_end: {#1} } - { \exp_not:N \@@_process:nn {#1} {####1} } + { \exp_not:N \@@_process:nn {#1} {##1} } \exp_not:n { \@kernel@math@registered@begin } \bool_set_true:N \exp_not:N \l_@@_collected_bool } -% \exp_not:N \tracingall +% \exp_not:N \tracingall \exp_not:c { @@_env_ #1 _begin: } - ####1 + ##1 } { \exp_not:c { @@_env_ #1 _end: } -% needed if we don't have $$...$$ +% needed if we don't have $$...$$ % \exp_not:n { \typeout{---> @kernel@math@registered@end }} \exp_not:n { \@kernel@math@registered@end } } @@ -614,7 +1622,7 @@ \cs_new:Npn \@kernel@math@registered@begin { -% \ShowTagging{struct-stack} +% \ShowTagging{struct-stack} %\typeout{==>A1}\ShowTagging{struct-stack,mc-current} \mode_if_vertical:TF { @@ -623,19 +1631,21 @@ % { \__block_list_beginpar_vmode: } % % \typeout{==>~ at:~ \g__tag_struct_tag_tl} -% - \exp_args:Noo\str_if_eq:nnF \g__tag_struct_tag_tl { \l__tag_para_main_tag_tl } % needs correction! +% + \tag_if_active:T + { + \exp_args:Noo\str_if_eq:nnF \g__tag_struct_tag_tl { \l__tag_para_main_tag_tl } % needs correction! { % \typeout{==>A2} \__block_beginpar_vmode: } % needs correction! + } } { % \typeout{==>A3} - \@kernel@close@P -% \tagmcend % needs correction! + \__tag_tool_close_P: } - \@kernel@math@begin + \socket_use:nn{tagsupport/math/display/formula/begin}{} \tagpdfparaOff % \typeout{==>MC1}\ShowTagging{mc-current} } @@ -644,13 +1654,14 @@ % \typeout{==>MC2}\ShowTagging{mc-current} \para_raw_end: \tagpdfparaOn - \@kernel@math@end + \socket_use:n{tagsupport/math/display/formula/end} % \typeout{==>MC3}\ShowTagging{mc-current} \@endpetrue } - + \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} @@ -660,12 +1671,12 @@ % % \begin{macro}{\@@_env_forward:w} % \begin{macrocode} -\cs_new_protected:Npn \@@_env_forward:w #1 \@@_env_end: #2 +\cs_new_protected:Npn \@@_env_forward:w #1 \@@_env_end: #2 { \@@_process:nn {#2} {#1} } % \end{macrocode} % \end{macro} -% -% \subsection{Document commands} +% +% \subsection{Document commands} % % \car*{Add one more here: \texttt{displaymath}, which % is equivalent to \cs{[} , \cs{]}\\ @@ -692,9 +1703,9 @@ % at the moment register_env can only do display math % \math_register_env:n { math } \RenewDocumentEnvironment{math} {b}{$#1$}{} -% and this one doesn't work either +% and this one doesn't work either % \math_register_env:n { displaymath } - \RenewDocumentEnvironment{displaymath} {b}{\[#1\]}{} + \RenewDocumentEnvironment{displaymath} {b}{\[#1\]}{} } % \end{macrocode} % \end{macro} @@ -737,29 +1748,31 @@ { \cs_gset_protected:Npn \[ % \] { - \bool_if:NTF \l_@@_collected_bool - { \begin { equation* } } - { \@@_grab_eqn:w } + \@@_grab_eqn:w + % \bool_if:NTF \l_@@_collected_bool +% { \begin { equation* } } +% { \@@_grab_eqn:w } } % \[ \cs_gset_protected:Npn \] { - \bool_if:NTF \l_@@_collected_bool - { \end{ equation* } } - { \@badmath } + \@badmath +% \bool_if:NTF \l_@@_collected_bool +% { \end{ equation* } } +% { \@badmath } } } % \end{macrocode} % \end{macro} -% +% % % \begin{macro}{\ensuremath} % A bit of nesting fun to make sure we collect only if required. % \fmi{why does ensuremath need handling at all?} -% -% \car{Indeed! Currently, this is setup to process the math that -% it has anyways already captured as its argument; thus it is more +% +% \car{Indeed! Currently, this is setup to process the math that +% it has anyways already captured as its argument; thus it is more % efficient than leaving the capture to be repeated by the \cs{everymath}} -% +% % \begin{macrocode} %\cs_gset_protected:Npn \ensuremath #1 % { @@ -786,47 +1799,6 @@ % have macro control. % \begin{macrocode} -\tl_new:N\tmpmathcontent - - -\def\@kernel@math@begin { -% \typeout{==>~math~begin} -% needs different handling if we support nesting - \tl_gset:Nx\tmpmathcontent - { - LaTeX~ formula~ starts~ - \exp_not:N\begin{\g_@@_grabbed_env_tl} - \space - \exp_not:V\g_@@_grabbed_math_tl - \space - \exp_not:N\end{\g_@@_grabbed_env_tl} - \space LaTeX~ formula~ ends~ - } - \tagstructbegin{tag=Formula, - AFinline-o=\tmpmathcontent, - title-o=\g_@@_grabbed_env_tl, - actualtext=\tmpmathcontent -% alt=\tmpmathcontent - } -% inner formula if multiple parts (not really implemented yet) - \grabaformulapartandstart -% the above does: -% \tagstructbegin{tag=Formula}\tagmcbegin{} -% or just -% \tagmcbegin{} -} -\def\@kernel@math@end { -% \typeout{==>~math~end} -% \ShowTagging{struct-stack} - \tagmcend - \if@subformulas - \tagstructend - \else - \fi - \tagstructend -% \ShowTagging{struct-stack} -} - \exp_args:No \tex_everymath:D { \tex_the:D \tex_everymath:D @@ -841,24 +1813,21 @@ { \tex_the:D \tex_everydisplay:D \iftrue % this may have to be a settable flag! -% { % \typeout{==>~ in~ everydisplay} % \end{macrocode} -% flipping the \cs{belowdisplay} values is done so that we get (assumption) -% a negative skip and not make the page bigger then we take that out, -% then we add the tagging code (in \cs{@@_tag_dollardollar_display_end} ) and -% then we put a real \cs{postdisplaypenalty} in and -% the right skip (of which we don't know if it is short or a -% normal \cs{belowdisplayskip}). This might need some refinement if that skip -% is actually negative from the start +% flipping the \cs{belowdisplay} values is done so that we get (assumption) +% a negative skip and not make the page bigger then we take that out, +% then we add the tagging code (in \cs{@@_tag_dollardollar_display_end} ) and +% then we put a real \cs{postdisplaypenalty} in and +% the right skip (of which we don't know if it is short or a +% normal \cs{belowdisplayskip}). This might need some refinement if that skip +% is actually negative from the start % (not sure it ever is and is worth bothering about) % \begin{macrocode} \skip_set:Nn \belowdisplayskip {-\belowdisplayskip} \skip_set:Nn \belowdisplayshortskip {-\belowdisplayshortskip} \int_set:Nn \postdisplaypenalty {10000} -% \group_insert_after:N \@@_tag_dollardollar_display_end: -% } \fi \bool_if:NF \l_@@_collected_bool { @@ -876,14 +1845,23 @@ \math_register_env:n { eqnarray* } % \end{macrocode} % -% Places where math mode is (ab)used. +% Tabulars currently contain a \$ that shouldn't trigger math +% tagging. % \begin{macrocode} -\clist_map_inline:nn - { tabular } - { - \AddToHook{ env / #1 / begin } - { \bool_set_true:N \l_@@_collected_bool } - } +\RequirePackage{array} +\tl_if_in:NnT\@tabular{$} + { + \def\@tabular{% + \leavevmode + \UseTaggingSocket{tbl/hmode/begin}% + \hbox \bgroup + \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 + \@tabarray} + } % \end{macrocode} % % \begin{macro}{\@@_m@th:, \m@th} @@ -898,6 +1876,20 @@ } % \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 + { + \bool_set_true:N\l_@@_collected_bool + } +\tl_gput_right:Nn\@kernel@after@begindocument + { + \bool_set_false:N\l_@@_collected_bool + } +% \end{macrocode} % % \subsection{Modifying \pkg{amsmath}} % @@ -934,7 +1926,7 @@ $$\ignorespacesafterend } % \end{macrocode} -% +% % \begin{macrocode} \def\common@align@ending { \math@cr \black@\totwidth@ @@ -1007,9 +1999,11 @@ % \end{macrocode} % % \begin{macrocode} -% +% \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 {flalign}{} \math_register_halign_env:nn {flalign*}{} \math_register_halign_env:nn {gather}{} @@ -1032,44 +2026,8 @@ \fi } % \end{macrocode} -% -% \begin{macrocode} - \def\intertext@{% - \def\intertext##1{% - \ifvmode\else\\\@empty\fi - \noalign{% -% we have to flip the sign on the skip because we flipped it on the outside - \penalty\postdisplaypenalty\vskip-\belowdisplayskip - \vbox{ -% \end{macrocode} -% Stop tagging when measuring: -% \begin{macrocode} - \ifmeasuring@\tag_stop:\fi - \normalbaselines - \ifdim\linewidth=\columnwidth - \else \parshape\@ne \@totalleftmargin \linewidth - \fi -% \end{macrocode} -% End the previous mc:\fmi{if we use 2 levels of formulas this would -% need changing} -% \begin{macrocode} - \tag_mc_end_push: -% \end{macrocode} -% We are already in a par so we change now to Span:\fmi{not true any longer} -% \begin{macrocode} - \tagpdfsetup{paratag=P}% - \tagpdfparaOn - \noindent\ignorespaces##1\par -% \end{macrocode} -% Restart the MC -% \begin{macrocode} - \tag_mc_begin_pop:n{}}% - \penalty\predisplaypenalty\vskip\abovedisplayskip% - }% - } - } -% \end{macrocode} -% +% +% % \begin{macrocode} \@namedef{math@cr @ @ @ gather}{% \ifst@rred\nonumber\fi @@ -1083,7 +2041,7 @@ \cr } % \end{macrocode} -% +% % \begin{macrocode} \@namedef{math@cr @ @ @ align}{% \ifst@rred\nonumber\fi @@ -1104,7 +2062,7 @@ \cr } % \end{macrocode} -% +% % \begin{macrocode} \def\restore@math@cr{\@namedef{math@cr @ @ @}{ % @@ -1113,7 +2071,7 @@ \cr}} \restore@math@cr % \end{macrocode} -% +% % \begin{macrocode} } % \end{macrocode} @@ -1125,9 +2083,18 @@ % % -% \begin{macro}{} +% \begin{macro}{\@@_split_at_nl:NN} +% This splits grabbed math at newlines. % % \begin{macrocode} +\cs_new:Npn \@@_split_at_nl:NN #1#2 { + \tl_set:Nf \l_@@_tmpa_tl { + \exp_after:wN \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop } + \exp_after:wN \@@_split_at_nl_aux:nnNN \l_@@_tmpa_tl #1 #2 +} +% \end{macrocode} +% and the auxiliary commands +% \begin{macrocode} \cs_new:Npn \@@_split_at_nl_first:w #1 \\ #2 \\ #3 \s_stop { \quark_if_nil:nTF {#2} @@ -1137,8 +2104,15 @@ #2 \\ #3 \s_stop } } -\cs_new:Npn \@@_split_chk_if_begin:ww #1 \begin #2 #3 \s_mark - #4 \\ \q_nil \\ \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 + #1 \begin #2 #3 \s_mark #4 \\ \q_nil \\ \s_stop { \quark_if_nil:nTF {#2} { {#1} {#4} } @@ -1148,7 +2122,9 @@ { } { 1 } } } + \cs_new:Npn \@@_split_cleanup_begin_q_nil:w #1 \begin \q_nil {#1} + \cs_new:Npn \@@_split_collect_one_end:w #1 \end #2 #3 \s_stop #4 #5 { \exp_args:Nf \@@_split_check_count_begins:nnnn @@ -1157,14 +2133,16 @@ } \cs_new:Npn \@@_split_count_begins:n #1 { \int_eval:n { 0 \@@_split_count_begins:w #1 \begin \q_nil } } + \cs_new:Npn \@@_split_count_begins:w #1 \begin #2 { \quark_if_nil:nF {#2} { +1 \@@_split_count_begins:w } } + \cs_new:Npn \@@_split_check_count_begins:nnnn #1 #2 #3 #4 { \int_compare:nNnTF {#1} = {#2} { \exp_last_unbraced:Nf \@@_split_final_cleanup:nn - { \split:n { \@@_split_guard:n {#3} #4 } } + { \@@_split:n { \@@_split_guard:n {#3} #4 } } } { \exp_args:No \use_ii_i:nn @@ -1184,29 +2162,17 @@ { \exp_end: { #4 #1 } } { \@@_split_final_cleanup:w #3 \s_mark { #4 #1 #2 } } } -\NewDocumentCommand \splitnl { mm +m } - { - \tl_set:Nf \l_tmpa_tl { \split:n {#3} } - \show \l_tmpa_tl - \exp_after:wN \__splitnl_aux:nnNN \l_tmpa_tl #1 #2 - } - - -\cs_new:Npn \split:n #1 { + +\cs_new:Npn \@@_split:n #1 { \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop } - -\cs_new:Npn \@@_split_at_nl:NN #1#2 { - \tl_set:Nf \l_tmpa_tl { - \exp_after:wN \@@_split_at_nl_first:w #1 \\ \q_nil \\ \s_stop } - \exp_after:wN \@@_split_at_nl_aux:nnNN \l_tmpa_tl #1 #2 -} - -\cs_new_protected:Npn \@@_split_at_nl_aux:nnNN #1 #2 #3 #4 - { - \tl_gset:Nn #4 {#1} - \tl_gset:Nn #3 {#2} -} - + +% this looks unused. +%\NewDocumentCommand \splitnl { mm +m } +% { +% \tl_set:Nf \l_@@_tmpa_tl { \split:n {#3} } +% \show \l_@@_tmpa_tl +% \exp_after:wN \__splitnl_aux:nnNN \l_@@_tmpa_tl #1 #2 +% } % \end{macrocode} % \end{macro} % @@ -1233,9 +2199,11 @@ \edef\resulttitle{\g_@@_grabbed_env_tl\space (part)} \tagstructbegin{tag=Formula, % \end{macrocode} -% For now we don't put anything in /alt or /ActualText on subformulas +% For now we don't put real content in /alt or /ActualText on subformulas +% but we add a short text to satisfy the pdf/ua-2 validator % \begin{macrocode} % alt=\result, + alt = subformula, title-o=\resulttitle } } @@ -1301,10 +2269,6 @@ % \end{macrocode} % % \begin{macrocode} -% -% \end{macrocode} -% -% \begin{macrocode} %</kernel> % \end{macrocode} % 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 deab5ad914..4907833be8 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx index 14d8e94362..a8e8e810ad 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathpkg.dtx @@ -2,7 +2,7 @@ % %% File: latex-lab-mathpkg.dtx % -% Copyright (C) 2022,2023 The LaTeX Project +% Copyright (C) 2022-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this 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 dbfcb0815b..1a2b8be781 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx index c3f43243b1..1a0b8e0630 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-mathtools.dtx @@ -2,7 +2,7 @@ % %% File: latex-lab-mathtools.dtx % -% Copyright (C) 2022,2023 The LaTeX Project +% Copyright (C) 2022-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -109,7 +109,7 @@ \def\intertext##1{% \ifvmode\else\\\@empty\fi \noalign{% - \penalty\postdisplaypenalty\vskip\belowdisplayskip + \penalty\postdisplaypenalty\vskip-\belowdisplayskip \vskip-\lineskiplimit % CCS \vskip\normallineskiplimit % CCS \vskip\l_MT_above_intertext_sep @@ -170,6 +170,7 @@ \MH_fi: \tag_mc_end_push: \tagpdfsetup{paratag=Span} + \tagpdfparaOn \noindent\ignorespaces#1\par \tag_mc_begin_pop:n{}} \penalty\predisplaypenalty\vskip\abovedisplayshortskip% @@ -197,7 +198,11 @@ \parshape\@ne \@totalleftmargin \linewidth \MH_fi: \tag_mc_end_push: - \tagpdfsetup{paratag=Span} + \tagpdfsetup{paratag=P} +% \end{macrocode} +% Why is it needed to enable paratagging?? +% \begin{macrocode} + \tagpdfparaOn \noindent\ignorespaces#1\par \tag_mc_begin_pop:n{}}% \penalty\predisplaypenalty\vskip\abovedisplayshortskip% 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 97026901d6..63e5b1e169 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx index 1d3ee828aa..ffbe5357e7 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-minipage.dtx @@ -1,6 +1,8 @@ % \iffalse meta-comment % -%% File: latex-lab-minipage.dtx (C) Copyright 2023 LaTeX Project +%% File: latex-lab-minipage.dtx +%% +% Copyright (C) 2023-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this 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 c91e93f2fc..6149b51afa 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx index 2ec9b0584b..a6087abe57 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-namespace.dtx @@ -1,6 +1,8 @@ % \iffalse meta-comment % -%% File: latex-lab-namespace.dtx (C) Copyright 2023 LaTeX Project +%% File: latex-lab-namespace.dtx +%% +% Copyright (C) 2023-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this 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 ff8e705be3..ec3c307a97 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx index cc60f50de0..9994b15cb8 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-1.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2023 Frank Mittelbach +%% File: latex-lab-new-or-1.dtx (C) Copyright 2020-2024 Frank Mittelbach % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this diff --git a/macros/latex-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 e670627022..05cb1fbb23 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx index d2011256b1..ee20331a8f 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-new-or-2.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: latex-lab-new-or-2.dtx -% Copyright (C) 2022-2023 The LaTeX Project +% Copyright (C) 2022-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this 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 13f4fa1265..df38c11015 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-sec.dtx index ae7a0b85c3..f3786c2ddb 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-sec.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-sec.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-sec.dtx (C) Copyright 2022-2023 LaTeX Project +%% File: latex-lab-sec.dtx (C) Copyright 2022-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -16,10 +16,10 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabsecdate{2023-10-16} -\def\ltlabsecversion{0.84b} +\def\ltlabsecdate{2024-02-12} +\def\ltlabsecversion{0.84c} %<*driver> -\documentclass{l3doc} +\documentclass[kernel]{l3doc} \EnableCrossrefs \CodelineIndex \begin{document} @@ -214,11 +214,11 @@ \fi \IfBooleanTF {#1} { - \tl_gset:Nx \@currentHref {#3} + \tl_gset:Ne \@currentHref {#3} } { \int_gincr:N\g__kernel_target_int - \tl_gset:Nx \@currentHref {target*.\int_use:N\g__kernel_target_int} + \tl_gset:Ne \@currentHref {target*.\int_use:N\g__kernel_target_int} } } \ExplSyntaxOff @@ -260,7 +260,7 @@ tag= {\int_compare:nNnTF {#1}={-1}{Part}{Sect}} ,#2 } - \seq_gpush:Nx \g__tag_sec_stack_seq {{\g__tag_struct_tag_tl}{\int_eval:n{#1}}} + \seq_gpush:Ne \g__tag_sec_stack_seq {{\g__tag_struct_tag_tl}{\int_eval:n{#1}}} } % \end{macrocode} % \end{macro} @@ -289,7 +289,7 @@ \__tag_sec_end:n {#1} } { - \msg_warning:nnxx {tag}{wrong-sect-nesting} + \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 } } @@ -670,6 +670,7 @@ \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=Lbl} \setbox\@tempboxa \hbox 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 4dc549e7c9..5e389feb11 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-table.dtx index 700d4ce6c1..2eafb0a21e 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-table.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-table.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-table.dtx (C) Copyright 2023 LaTeX Project +%% File: latex-lab-table.dtx (C) Copyright 2023-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -16,8 +16,8 @@ % % for those people who are interested or want to report an issue. % -\def\ltlabtbldate{2023-10-30} -\def\ltlabtblversion{0.85d} +\def\ltlabtbldate{2024-02-07} +\def\ltlabtblversion{0.85k} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -115,9 +115,17 @@ % Such tables can be nested. % % If a table should not be tagged as table, for example because it is merely used -% to produce a layout or because it is a not yet (fully) supported table structure, +% as a layout to ensure that the content is properly aligned +% or because it is a not yet (fully) supported table structure, % the tagging can be disabled with -% \verb|\tagpdfsetup{table-tagging=false}|. +% \verb|\tagpdfsetup{table/tagging=false}| or with \verb|\tagpdfsetup{table/tagging=presentation}|% +% \footnote{The key has been renamed. The old name `table-tagging` still works but is +% deprecated. The value \texttt{presentation} refers to the ARIA role \enquote{presentation}.} +% The first option disables the table tagging code and he content of the tabular +% is then treated more or less like running text. This works ok for simple tables using +% only hmode-cells (l/c/r) with normal text content, but fails if the table uses vmode-cells +% (p/m/b). In such cases the second option works better: it keeps the tagging code active +% but changes the tag names to \texttt{Div} and the grouping structure \texttt{NonStruct}. % % Inside cells the automatic tagging of paragraphs is disabled with the exception of % p/m/b-type cells. @@ -126,9 +134,10 @@ % added with an empty TD-structure. % % There is some basic support\footnote{This is not meant to be the -% final interface, though.} for headers. With +% 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-rows={|\meta{list of row numbers}\verb|}| % \end{quote} % you can % declare which (absolute) row numbers should be tagged as header rows. @@ -139,7 +148,7 @@ % for header columns yet. 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. +% 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. @@ -193,7 +202,8 @@ % % \item Not every table should be tagged as a Table structure, often they are % only used as layout help, e.g. to align authors in a title pages. In such uses -% the tagging of the table must be deactivated with \verb|\tagpdfsetup{table-tagging=false}|. +% 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 % subheaders will be handled later as that needs some syntax changes. Tables @@ -210,6 +220,8 @@ % % \item The \env{longtable} environment supports footnotes in p-type columns, but it hasn't been % tested yet if this works also with the tagging code. +% +% \item Vertical boxes (\cs{parbox}, \texttt{minipage}, \ldots) inside cells can be problematic. % % \item The code is quite noisy and fills the log with lots of % messages.\footnote{Helpful for us at this stage.} @@ -271,10 +283,11 @@ % \begin{macro} % { % \l_@@_celltag_tl +% \l_@@_pcelltag_tl % ,\l_@@_rowtag_tl +% ,\l_@@_table_tl % ,\l_@@_cellattribute_tl % ,\l_@@_rowattribute_tl -% ,\g_@@_missingcells_int % ,\l_@@_tmpa_clist % ,\l_@@_tmpa_seq % ,\l_@@_tmpa_tl @@ -283,12 +296,19 @@ % \begin{macrocode} \tl_new:N \l_@@_celltag_tl \tl_set:Nn \l_@@_celltag_tl {TD} +\tl_new:N \l_@@_pcelltag_tl +\tl_set:Nn \l_@@_pcelltag_tl {TD} % \end{macrocode} % For the rowtag, probably always TR: % \begin{macrocode} \tl_new:N \l_@@_rowtag_tl \tl_set:Nn \l_@@_rowtag_tl {TR} % \end{macrocode} +% For the tabletag, probably always Table: +% \begin{macrocode} +\tl_new:N \l_@@_tabletag_tl +\tl_set:Nn \l_@@_tabletag_tl {Table} +% \end{macrocode} % And here cell and row attributes: % \begin{macrocode} \tl_new:N \l_@@_cellattribute_tl @@ -296,94 +316,27 @@ \tl_new:N \l_@@_rowattribute_tl \tl_set:Nn \l_@@_rowattribute_tl {} % \end{macrocode} -% This will contain the number of missing cells used: -% \begin{macrocode} -\int_new:N \g_@@_missing_cells_int -% \end{macrocode} % Temp variables % \begin{macrocode} \clist_new:N \l_@@_tmpa_clist -\seq_new:N \l_@@_tmpa_seq \tl_new:N \l_@@_tmpa_tl % \end{macrocode} % \end{macro} % -% \subsection{Sockets} -% -% 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 At first sockets for the begin and -% end of cells and rows -% -% \begin{socketdecl}{tagsupport/tblcell/begin, -% tagsupport/tblcell/end, -% tagsupport/tblrow/begin, -% tagsupport/tblrow/end, -% } -% \begin{macrocode} -\NewSocket{tagsupport/tblcell/begin}{0} -\NewSocket{tagsupport/tblcell/end}{0} -\NewSocket{tagsupport/tblrow/begin}{0} -\NewSocket{tagsupport/tblrow/end}{0} -% \end{macrocode} -% \end{socketdecl} -% -% \begin{socketdecl}{tagsupport/tbl/init} -% This socket should be at the begin of the table, inside a group. -% It is meant for settings like disabling paratagging. This socket -% can perhaps be merged later into the begin-sockets when they are -% no longer added as hooks but in the environment definitions. -% \begin{macrocode} -\NewSocket{tagsupport/tbl/init}{0} -% \end{macrocode} -% \end{socketdecl} -% -% -% \begin{socketdecl}{tagsupport/tbl/finalize} -% To fine tune the structure (change cells to header cells, remove -% unwanted structures, move a foot to the end, etc.) we also need a -% socket that is executed at the end of the table but \emph{before} -% all the variables are restored to the outer or default values. -% The code in the socket can make assignments, but probably -% shouldn't do typesetting and not write whatsits. -% \begin{macrocode} -\NewSocket{tagsupport/tbl/finalize}{0} -% \end{macrocode} -% \end{socketdecl} +% \subsection{Tagging support sockets} % -% \begin{socketdecl}{tagsupport/tbl/finalize/longtable} -% \env{longtable} needs its own socket to fine tune the structure. -% Simply switching the plug in the previous socket interferes with -% enabling/disabling the tagging. -% \begin{macrocode} -\NewSocket{tagsupport/tbl/finalize/longtable}{0} -% \end{macrocode} -% \end{socketdecl} -% -% \begin{socketdecl}{tagsupport/tblhmode/begin, -% tagsupport/tblhmode/end, -% tagsupport/tblvmode/begin, -% tagsupport/tblvmode/end -% } -% -% These sockets are used in the begin and end code of environments, -% to allow a fast enabling and disabling of the tagging. We -% distinguish between tables that can be used inside paragraphs and -% standalone tables like longtable. -% \begin{macrocode} -\NewSocket{tagsupport/tblhmode/begin}{0} -\NewSocket{tagsupport/tblhmode/end}{0} -\NewSocket{tagsupport/tblvmode/begin}{0} -\NewSocket{tagsupport/tblvmode/end}{0} -% \end{macrocode} -% \end{socketdecl} % % This are the standard plugs for tagging of cells and rows. % % \begin{plugdecl}{TD} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblcell/begin}{TD} +\NewSocketPlug{tagsupport/tbl/cell/begin}{TD} { +% \end{macrocode} +% Next line was previously outside of the plug, so if we want to execute it +% always even if the noop plug is in force this needs a different solution. +% \begin{macrocode} + \@@_show_curr_cell_data: \tag_struct_begin:n { tag =\l_@@_celltag_tl, @@ -405,7 +358,7 @@ % % \begin{plugdecl}{TD} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblcell/end}{TD} +\NewSocketPlug{tagsupport/tbl/cell/end}{TD} { \tag_mc_end: \tag_struct_end: @@ -415,14 +368,14 @@ % % In p-columns we need a slightly different plug which reactivates the % paragraph tagging. -% tagging -% \begin{plugdecl}{TD} +% \begin{plugdecl}{TDpbox} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblcell/begin}{TDpbox} +\NewSocketPlug{tagsupport/tbl/pcell/begin}{TDpbox} { + \@@_show_curr_cell_data: \tag_struct_begin:n { - tag =\l__tbl_celltag_tl, + 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} } @@ -436,9 +389,9 @@ % \end{macrocode} % \end{plugdecl} % -% \begin{plugdecl}{TD} +% \begin{plugdecl}{TDpbox} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblcell/end}{TDpbox} +\NewSocketPlug{tagsupport/tbl/pcell/end}{TDpbox} { \tag_struct_end: } @@ -447,7 +400,7 @@ % % \begin{plugdecl}{TR} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblrow/begin}{TR} +\NewSocketPlug{tagsupport/tbl/row/begin}{TR} { \seq_gclear:N \g_@@_struct_cur_seq \tag_struct_begin:n @@ -462,24 +415,28 @@ % % \begin{plugdecl}{TR} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblrow/end}{TR} +\NewSocketPlug{tagsupport/tbl/row/end}{TR} { - \__tag_tbl_add_missing_cells:n { \g_@@_missing_cells_int } + \tag_if_active:T + { + \@@_add_missing_cells: \seq_gput_right:Ne \g_@@_struct_cells_seq { \seq_use:Nn \g_@@_struct_cur_seq {,} } - \int_compare:nNnTF { \g_@@_row_int } = { \seq_count:N\g_@@_struct_cells_seq } + \int_compare:nNnTF { \g_@@_row_int } = + { \seq_count:N \g_@@_struct_cells_seq } { - \typeout + \@@_trace:n {==>~ stucture~stored~for~row~\int_use:N\g_@@_row_int :~ \seq_use:Nn \g_@@_struct_cur_seq {,} } } - { \ERROR } % should not happen ... + { \ERRORtbl/row } % should not happen ... \tag_struct_end: } + } % \end{macrocode} % \end{plugdecl} % @@ -497,6 +454,10 @@ \tag_if_active:T { \bool_set_false:N \l__tag_para_bool +% \end{macrocode} +% We also initialize the structure data variables a this point. +% \begin{macrocode} + \@@_init_struct_data: } } % \end{macrocode} @@ -509,14 +470,41 @@ \NewSocketPlug{tagsupport/tbl/finalize}{Table} { \@@_set_header_rows: +% \end{macrocode} +% Similarly, we restore the outer values of the structure data when +% we leave the table. +% \begin{macrocode} + \@@_restore_struct_data: } % \end{macrocode} % \end{plugdecl} % +% +% +% +% \begin{plugdecl}{Table} +% This plug will initialize the structure in longtable. +% \begin{macrocode} +\NewSocketPlug{tagsupport/tbl/longtable/init}{Table} + { + \seq_gclear:N\g_@@_struct_rows_seq + \seq_gclear:N\g_@@_struct_cells_seq + \seq_gclear:N\g_@@_struct_cur_seq + \seq_gclear:N\g_@@_LT@firsthead_rows_seq + \seq_gclear:N\g_@@_LT@head_rows_seq + \seq_gclear:N\g_@@_LT@lastfoot_rows_seq + \seq_gclear:N\g_@@_LT@foot_rows_seq + } +% \end{macrocode} +% \end{plugdecl} +% +% + + % \begin{plugdecl}{Table} -% This plug will fine tune the structure of longtable. +% This plug will fine tune the structure in longtable. % \begin{macrocode} -\NewSocketPlug{tagsupport/tbl/finalize/longtable}{Table} +\NewSocketPlug{tagsupport/tbl/longtable/finalize}{Table} { % \end{macrocode} % If neither \cs{endhead} nor \cs{endfirsthead} has been used @@ -683,11 +671,40 @@ % \end{macrocode} % \end{plugdecl} % +% +% +% \begin{plugdecl}{Table} +% +% We must avoid that the reuse of the header foot box leads to duplicated +% content, thus reset attribute of the box: +% \begin{macrocode} +\NewSocketPlug{tagsupport/tbl/longtable/head}{Table} + { + \tagmcbegin{artifact} + \tag_mc_reset_box:N\LT@head + \tagmcend + } +% \end{macrocode} +% \end{plugdecl} +% % \begin{plugdecl}{Table} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblhmode/begin}{Table} +\NewSocketPlug{tagsupport/tbl/longtable/foot}{Table} + { + \tagmcbegin{artifact} + \tag_mc_reset_box:N \LT@foot + \tagmcend + } +% \end{macrocode} +% \end{plugdecl} +% +% +% +% +% \begin{plugdecl}{Table} +% \begin{macrocode} +\NewSocketPlug{tagsupport/tbl/hmode/begin}{Table} { - \mode_leave_vertical: \tag_mc_end_push: % \end{macrocode} % Close the P-chunk. This assumes that para-tagging is active. @@ -696,7 +713,7 @@ \bool_lazy_and:nnT { \bool_if_exist_p:N \l__tag_para_bool } { \l__tag_para_bool } { \tag_struct_end:n { text } } - \tag_struct_begin:n {tag=Table} + \tag_struct_begin:n {tag=\l_@@_tabletag_tl} \tl_gset:Ne \g_@@_struct_table_tl { \tag_get:n {struct_num} } } % \end{macrocode} @@ -704,7 +721,7 @@ % % \begin{plugdecl}{Table} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblhmode/end}{Table} +\NewSocketPlug{tagsupport/tbl/hmode/end}{Table} { \tag_struct_end: % \end{macrocode} @@ -721,9 +738,9 @@ % % \begin{plugdecl}{Table} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblvmode/begin}{Table} +\NewSocketPlug{tagsupport/tbl/vmode/begin}{Table} { - \tag_struct_begin:n {tag=Table} + \tag_struct_begin:n {tag=\l_@@_tabletag_tl} \tl_gset:Ne \g_@@_struct_table_tl { \tag_get:n {struct_num} } } % \end{macrocode} @@ -731,7 +748,7 @@ % % \begin{plugdecl}{Table} % \begin{macrocode} -\NewSocketPlug{tagsupport/tblvmode/end}{Table} +\NewSocketPlug{tagsupport/tbl/vmode/end}{Table} { \tag_struct_end: \par @@ -740,30 +757,50 @@ % \end{plugdecl} % % +% \begin{plugdecl}{code} +% This socket takes a number, checks if is larger than one, +% checks if the colspan attribute already exists (we can't predefine an +% arbitrary number), and updates \cs{l_@@_cellattribute_tl}. +% \begin{macrocode} +\NewSocketPlug{tagsupport/tbl/colspan}{code} + { + \int_compare:nNnT {#1}>{1} + { + \prop_get:NeNF \g__tag_attr_entries_prop + {colspan-\int_eval:n{#1}} + \l_@@_tmpa_tl + { + \__tag_attr_new_entry:ee + {colspan-\int_eval:n{#1}} + {/O /Table /ColSpan~\int_eval:n{#1}} + } + \tl_set:Ne \l_@@_cellattribute_tl + {colspan-\int_eval:n{#1}} + } + } +% \end{macrocode} +% TODO: move to tagpdf +% \begin{macrocode} +\tag_if_active:T + { \cs_generate_variant:Nn \__tag_attr_new_entry:nn {ee} } + +% \end{macrocode} +% \end{plugdecl} % % % %\subsection{Environments} % -% Currently only tabular, tabular*, tabularx and longtable. -% We must use the \texttt{before} and \texttt{after} hooks as the \texttt{end} -% hook is executed before the end of the last row and then MC are messed up. -% This means that this sockets should only contain code that doesn't needs to be -% grouped! -% \begin{macrocode} -\AddToHook{env/tabular/before} {\UseSocket{tagsupport/tblhmode/begin}} -\AddToHook{env/tabular/after} {\UseSocket{tagsupport/tblhmode/end}} -\AddToHook{env/tabular*/before} {\UseSocket{tagsupport/tblhmode/begin}} -\AddToHook{env/tabular*/after} {\UseSocket{tagsupport/tblhmode/end}} -\AddToHook{env/tabularx/before} {\UseSocket{tagsupport/tblhmode/begin}} -\AddToHook{env/tabularx/after} {\UseSocket{tagsupport/tblhmode/end}} -\AddToHook{env/longtable/before}{\UseSocket{tagsupport/tblvmode/begin}} -\AddToHook{env/longtable/after} {\UseSocket{tagsupport/tblvmode/end}} -% \end{macrocode} +% Currently we support only tabular, tabular*, tabularx and longtable +% (and possibly environments build directly on top of them). % % The \env{array} environment is math. So we disable table tagging for now. +% We use the command hook to catch also cases where \cs{array} is used directly +% in other environments like matrix environments. +% Perhaps table tagging should be disable for math generally, but then +% we have to handle text insertions. % \begin{macrocode} -\AddToHook{env/array/begin} {\__tag_tbl_disable:} +\AddToHook{cmd/array/before}{\__tag_tbl_disable:} % \end{macrocode} % % @@ -771,34 +808,6 @@ % % \subsubsection{Tagging helper commands} % -% \begin{macro}{\@@_set_colspan:n} -% This commands takes a number, checks if is larger than one, -% checks if the colspan attribute exists (we can't predefine an -% arbitrary number), and updates \cs{l_@@_cellattribute_tl}. -% \begin{macrocode} -\tag_if_active:T - { \cs_generate_variant:Nn \__tag_attr_new_entry:nn {ee} } -\cs_new_protected:Npn \@@_set_colspan:n #1 - { - \tag_if_active:T - { - \int_compare:nNnT {#1}>{1} - { - \prop_get:NeNF \g__tag_attr_entries_prop - {colspan-\int_eval:n{#1}} - \l_@@_tmpa_tl - { - \__tag_attr_new_entry:ee - {colspan-\int_eval:n{#1}} - {/O /Table /ColSpan~\int_eval:n{#1}} - } - \tl_set:Ne \l_@@_cellattribute_tl - {colspan-\int_eval:n{#1}} - } - } - } -% \end{macrocode} -% \end{macro} % % \subsubsection{Disabling/enabling} % @@ -810,17 +819,23 @@ % \begin{macrocode} \cs_new_protected:Npn \__tag_tbl_disable: { - \AssignSocketPlug{tagsupport/tblcell/begin}{noop} - \AssignSocketPlug{tagsupport/tblcell/end}{noop} - \AssignSocketPlug{tagsupport/tblrow/begin}{noop} - \AssignSocketPlug{tagsupport/tblrow/end}{noop} + \AssignSocketPlug{tagsupport/tbl/cell/begin}{noop} + \AssignSocketPlug{tagsupport/tbl/cell/end}{noop} + \AssignSocketPlug{tagsupport/tbl/pcell/begin}{noop} + \AssignSocketPlug{tagsupport/tbl/pcell/end}{noop} + \AssignSocketPlug{tagsupport/tbl/row/begin}{noop} + \AssignSocketPlug{tagsupport/tbl/row/end}{noop} \AssignSocketPlug{tagsupport/tbl/init}{noop} \AssignSocketPlug{tagsupport/tbl/finalize}{noop} - \AssignSocketPlug{tagsupport/tbl/finalize/longtable}{noop} - \AssignSocketPlug{tagsupport/tblhmode/begin}{noop} - \AssignSocketPlug{tagsupport/tblhmode/end}{noop} - \AssignSocketPlug{tagsupport/tblvmode/begin}{noop} - \AssignSocketPlug{tagsupport/tblvmode/end}{noop} + \AssignSocketPlug{tagsupport/tbl/longtable/init}{noop} + \AssignSocketPlug{tagsupport/tbl/longtable/head}{noop} + \AssignSocketPlug{tagsupport/tbl/longtable/foot}{noop} + \AssignSocketPlug{tagsupport/tbl/longtable/finalize}{noop} + \AssignSocketPlug{tagsupport/tbl/hmode/begin}{noop} + \AssignSocketPlug{tagsupport/tbl/hmode/end}{noop} + \AssignSocketPlug{tagsupport/tbl/vmode/begin}{noop} + \AssignSocketPlug{tagsupport/tbl/vmode/end}{noop} + \AssignSocketPlug{tagsupport/tbl/colspan}{noop} } % \end{macrocode} % \end{macro} @@ -831,46 +846,58 @@ % \begin{macrocode} \cs_new_protected:Npn \__tag_tbl_enable: { - \AssignSocketPlug{tagsupport/tblcell/begin}{TD} - \AssignSocketPlug{tagsupport/tblcell/end}{TD} - \AssignSocketPlug{tagsupport/tblrow/begin}{TR} - \AssignSocketPlug{tagsupport/tblrow/end}{TR} + \AssignSocketPlug{tagsupport/tbl/cell/begin}{TD} + \AssignSocketPlug{tagsupport/tbl/cell/end}{TD} + \AssignSocketPlug{tagsupport/tbl/pcell/begin}{TDpbox} + \AssignSocketPlug{tagsupport/tbl/pcell/end}{TDpbox} + \AssignSocketPlug{tagsupport/tbl/row/begin}{TR} + \AssignSocketPlug{tagsupport/tbl/row/end}{TR} \AssignSocketPlug{tagsupport/tbl/init}{Table} \AssignSocketPlug{tagsupport/tbl/finalize}{Table} - \AssignSocketPlug{tagsupport/tbl/finalize/longtable}{Table} - \AssignSocketPlug{tagsupport/tblhmode/begin}{Table} - \AssignSocketPlug{tagsupport/tblhmode/end}{Table} - \AssignSocketPlug{tagsupport/tblvmode/begin}{Table} - \AssignSocketPlug{tagsupport/tblvmode/end}{Table} + \AssignSocketPlug{tagsupport/tbl/longtable/head}{Table} + \AssignSocketPlug{tagsupport/tbl/longtable/foot}{Table} + \AssignSocketPlug{tagsupport/tbl/longtable/init}{Table} + \AssignSocketPlug{tagsupport/tbl/longtable/finalize}{Table} + \AssignSocketPlug{tagsupport/tbl/hmode/begin}{Table} + \AssignSocketPlug{tagsupport/tbl/hmode/end}{Table} + \AssignSocketPlug{tagsupport/tbl/vmode/begin}{Table} + \AssignSocketPlug{tagsupport/tbl/vmode/end}{Table} + \AssignSocketPlug{tagsupport/tbl/colspan}{code} } % \end{macrocode} % \end{macro} % \begin{macrocode} -% TODO decide about key name +% See tagpdfsetup-keys.md in tagpdf/doc for the naming scheme. \keys_define:nn { __tag / setup } { - table-tagging .choices:nn = { true, on } + table/tagging .choices:nn = { true, on } { \__tag_tbl_enable: }, - table-tagging .choices:nn = { false, off } + table/tagging .choices:nn = { false, off } { \__tag_tbl_disable: }, - table-tagging .default:n = true, - table-tagging .initial:n = true + table/tagging .choice:, + table/tagging / presentation .code:n = + { + \__tag_tbl_enable: + \tl_set:Nn\l_@@_rowtag_tl {NonStruct} + \tl_set:Nn\l_@@_pcelltag_tl {NonStruct} + \tl_set:Nn\l_@@_celltag_tl {text} + \tl_set:Nn\l_@@_tabletag_tl {Div} + }, + table/tagging .default:n = true, + table/tagging .initial:n = true } % \end{macrocode} -% -% Table tagging should be disabled in the head and foot. +% This are the old key names kept for now for +% compability. They will got at some time. % \begin{macrocode} -\AddToHook{begindocument} - { - \cs_if_exist:NT \@kernel@before@head - { - \tl_put_right:Nn \@kernel@before@head {\__tag_tbl_disable:} - \tl_put_right:Nn \@kernel@before@foot {\__tag_tbl_disable:} - } - } +\keys_define:nn { __tag / setup } + { + table-tagging .meta:n = {table/tagging={#1}} + } % \end{macrocode} % +% % \subsubsection{Header support} % % Accessible table must have header cells declaring the meaning of the @@ -983,261 +1010,68 @@ % \end{macro} % % And some key support: +% (See tagpdfsetup-keys.md for the naming scheme.) % \begin{macrocode} -% TODO decide about key name \keys_define:nn { __tag / setup } { - table-header-rows .clist_set:N = \l_@@_header_rows_clist + table/header-rows .clist_set:N = \l_@@_header_rows_clist, +% \end{macrocode} +% obsolete older name: +% \begin{macrocode} + table-header-rows .meta:n = {table/header-rows={#1}} } % \end{macrocode} % -% \subsection{Changes to \pkg{array} commands} % % +% \subsection{Misc stuff} % % \begin{macro}{\@@_show_curr_cell_data:} % Show the row/column index and span count for current table cell % for debugging. % \begin{macrocode} \cs_new_protected:Npn \@@_show_curr_cell_data: { - \typeout { ==>~ current~cell~data:~ - \int_use:N \g_@@_row_int , - \int_use:N \g_@@_col_int , - \g_@@_span_tl - } -} -% \end{macrocode} -% \end{macro} -% -% -% -% -% \begin{macro}{\insert@column} -% \cs{insert@column} is defined in \pkg{array}, here only the two -% sockets are inserted. -% \begin{macrocode} -\def\insert@column{% - \@@_show_curr_cell_data: - \UseSocket{tagsupport/tblcell/begin}% - \the@toks \the \@tempcnta - \ignorespaces \@sharp \unskip - \the@toks \the \count@ \relax - \UseSocket{tagsupport/tblcell/end}% -} -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@classz} -% \begin{macrocode} -\def\@classz{\@classx - \@tempcnta \count@ - \prepnext@tok - \@addtopreamble{\ifcase \@chnum - \hfil - \hskip1sp% - \d@llarbegin - \insert@column - \d@llarend \do@row@strut \hfil \or - \hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \hfil \or - \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \or - \setbox\ar@mcellbox\vbox - \@startpbox{\@nextchar} - \AssignSocketPlug{tagsupport/tblcell/begin}{TDpbox} - \AssignSocketPlug{tagsupport/tblcell/end}{TDpbox} - \insert@column \@endpbox - \ar@align@mcell - \do@row@strut \or - \vtop \@startpbox{\@nextchar} - \AssignSocketPlug{tagsupport/tblcell/begin}{TDpbox} - \AssignSocketPlug{tagsupport/tblcell/end}{TDpbox} - \insert@column \@endpbox\do@row@strut \or - \vbox \@startpbox{\@nextchar} - \AssignSocketPlug{tagsupport/tblcell/begin}{TDpbox} - \AssignSocketPlug{tagsupport/tblcell/end}{TDpbox} - \insert@column \@endpbox\do@row@strut - \fi}\prepnext@tok} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@array,\@@@@array} -% We modificate the \cs{@array} from \pkg{array}. -% \begin{macrocode} -\def\@array[#1]#2{% - \@tempdima \ht \strutbox - \advance \@tempdima by\extrarowheight - \setbox \@arstrutbox \hbox{\vrule - \@height \arraystretch \@tempdima - \@depth \arraystretch \dp \strutbox - \@width \z@}% -% \end{macrocode} -% The total number of table columns of the current table is -% determined in \cs{@@_determine_table_cols:} but this is called in -% a group, so local settings do not survive. Thus, to save away the -% outer value of \cs{g_@@_table_cols_tl} we do it before the group. -% \begin{macrocode} - \tl_set_eq:NN \l_@@_saved_table_cols_tl \g_@@_table_cols_tl -% \end{macrocode} -% -% \begin{macrocode} - \begingroup - \@mkpream{#2} -% \end{macrocode} -% Next call has to happen immediately after \cs{@mkpream} because -% it uses implementation details from that. -% \begin{macrocode} - \@@_determine_table_cols: -% \end{macrocode} -% -% \begin{macrocode} - \xdef\@preamble{% - \noexpand -% \end{macrocode} -% \cs{ialign} in the original definition is replaced by -% \cs{ar@ialign} defined below. -% \begin{macrocode} - \ar@ialign - \@halignto - \bgroup \@arstrut -% \end{macrocode} -% A socket is inserted -% \begin{macrocode} - \UseSocket{tagsupport/tblrow/begin}% -% \end{macrocode} -% At the start of the preamble for the first column we set -% \cs{g_@@_col_int} to \texttt{1} as we are no longer "at" but "in" -% the first column. This is done in \cs{@@_init_cell_data:}. In -% later columns this data is updated via \cs{@@_update_cell_data:}. -% \begin{macrocode} - \@@_init_cell_data: - \@preamble - \tabskip \z@ \cr}% - \endgroup - \@arrayleft -% \end{macrocode} -% Another socket for tagging. TODO: what about \cs{arrayleft}? -% \begin{macrocode} - \UseSocket{tagsupport/tbl/init} - \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi - \bgroup - \let \@sharp ##\let \protect \relax - \lineskip \z@ - \baselineskip \z@ - \m@th - \let\\\@arraycr \let\tabularnewline\\\let\par\@empty -%\show\@preamble - \@preamble} -% \end{macrocode} -% Finally, also set \cs{@@@@array} to the new definition: -% \begin{macrocode} -\let\@@@@array\@array -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@@_init_cell_data:} -% -% \begin{macrocode} -\cs_new_protected:Npn \@@_init_cell_data: { - \int_gset:Nn \g_@@_col_int {1} - \tl_gset:Nn \g_@@_span_tl {1} -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_update_cell_data:} -% Updating cell data in columns after the first means we have to -% increment the \cs{g_@@_col_int} by the span count of the previous -% cell (in case it was a \cs{multicolumn} and then reset the -% \cs{g_@@_span_tl} to one (as the default). -% \begin{macrocode} -\cs_new_protected:Npn \@@_update_cell_data: { - \int_gadd:Nn \g_@@_col_int { \g_@@_span_tl } - \tl_gset:Nn \g_@@_span_tl {1} + \@@_trace:n { ==>~ current~cell~data:~ + \int_use:N \g_@@_row_int , + \int_use:N \g_@@_col_int , + \g_@@_span_tl + } } % \end{macrocode} % \end{macro} % % % -% \begin{macro}{\@@_determine_table_cols:} -% Current implementation of \cs{@mkpream} uses the scratch counter -% \cs{count@} to keep track of the number of toks registers it needs -% (2 per column), but this can't be used as it counts also -% insertings made with \verb+!{}+ and \verb+@{}+. -% So similar as does longtable for \cs{LT@cols} we count the -% numbers of ambersands instead. -% \begin{macrocode} -\cs_new:Npn \@@_determine_table_cols: { - \seq_set_split:NnV\l_@@_tmpa_seq {&}\@preamble - \tl_gset:Ne \g_@@_table_cols_tl { \seq_count:N \l_@@_tmpa_seq } - \typeout{ ==>~ Table~ has~ \g_@@_table_cols_tl \space columns } -} -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@arraycr} -% Add code that figures out if the current table row is incomplete -% (not enough \verb=&=s). It can then do extra actions, such as -% inserting missing cell tags. +% \begin{macro}{\@@_add_missing_cells:} +% The storing and use of the number of missing cells must happen at +% different places as the testing happens at the end of the last +% 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} -\protected\def\@arraycr{ - \relax - \@@_store_missing_cells:n{@arraycr} - % - \iffalse{\fi\ifnum 0=`}\fi - \@ifstar \@xarraycr \@xarraycr} -% \end{macrocode} -% \end{macro} -% -% -% -% \begin{macro}{\@@_store_missing_cells:n, -% \__tag_tbl_add_missing_cells:n} -% The storing and use of the number of missing cells -% must happen at different places as the testing happens at -% the end of the last cell of a row, but -% still inside that cell, so we use two commands. The second is used in -% the endrow socket. -% \begin{macrocode} -\cs_new:Npn \@@_store_missing_cells:n #1 { - \int_compare:nNnT \g_@@_col_int > 0 - { - \int_gset:Nn \g_@@_missing_cells_int - { - \g_@@_table_cols_tl - - \g_@@_col_int - - \g_@@_span_tl - + 1 - } - \int_compare:nNnT \g_@@_missing_cells_int < 0 \ERROR % should not happen - \typeout{==>~ - (#1)~ - This~ row~ needs~ - \int_use:N \g_@@_missing_cells_int \space - additional~ cell(s) - } - } -} +\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 \__tag_tbl_add_missing_cells:n #1 +\cs_new:Npn \@@_add_missing_cells: { % \end{macrocode} -% The TD-socket messages are issued after the message about the end-row socket, -% but the structure is ok, so better issue a message for now to avoid confusion: +% The TD-socket messages are issued after the message about the +% end-row socket, but the structure is ok, so better issue a +% message for now to avoid confusion: % \begin{macrocode} - \int_compare:nNnT {#1}>{0} - { - \typeout{==>~ - ~Inserting~\int_eval:n{#1}~additional~cell(s)~into~previous~row:} - } - \int_step_inline:nn { #1 } + \int_compare:nNnT \g_@@_missing_cells_int > 0 { - \UseSocket{tagsupport/tblcell/begin} - \UseSocket{tagsupport/tblcell/end} + \@@_trace:n {==>~ + ~Inserting~\int_use:N \g_@@_missing_cells_int \space + additional~cell(s)~into~previous~row:} + \int_step_inline:nn { \g_@@_missing_cells_int } + { + \UseTaggingSocket{tbl/cell/begin} + \UseTaggingSocket{tbl/cell/end} + } } } % \end{macrocode} @@ -1245,120 +1079,9 @@ % % % -% \begin{macro}{\endarray} -% If tables are nested into another then it is necessary to -% restore information about the cell the inner table started -% in. Otherwise, \cs{g_@@_row_int}, \cs{g_@@_col_int}, and -% \cs{g_@@_span_tl} reflect the status in the outer table as they -% are globally manipulated. We restore in all cases even if we are -% not in a nesting situation as that makes the code simpler (and -% probably faster). -% -% \cs{endtabular} and \cs{endtabular*} inherit from \cs{endarray} -% so we only need to change that. \texttt{tabularx} is handled -% below. -% \begin{macrocode} -\def\endarray{ - \@@_store_missing_cells:n{endarray} - \crcr \egroup - \UseSocket{tagsupport/tbl/finalize} - \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 - \tl_gset_eq:NN \g_@@_struct_table_tl \l_@@_saved_struct_table_tl - \seq_gset_eq:NN \g_@@_struct_rows_seq \l_@@_saved_struct_rows_seq - \seq_gset_eq:NN \g_@@_struct_cells_seq\l_@@_saved_struct_cells_seq - \seq_gset_eq:NN \g_@@_struct_cur_seq \l_@@_saved_struct_cur_seq - \typeout{==>~ restored~cell~data:~ - \int_use:N \g_@@_row_int, - \int_use:N \g_@@_col_int, - \l_@@_saved_span_tl \space - ( - \int_compare:nNnTF \g_@@_table_cols_tl = 0 - { outer~ level } - { max:~ \g_@@_table_cols_tl } - ) - } - \egroup - \@arrayright \gdef\@preamble{}% -} -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@addamp} -% If we are after the first column we have to insert a \verb=&= and -% also update the cell data. -% \begin{macrocode} -\def\@addamp { - \if@firstamp - \@firstampfalse - \else - \edef\@preamble{\@preamble & - \@@_update_cell_data: - } - \fi -} -% \end{macrocode} -% \end{macro} -% -% -% -% \begin{macro}{ -% \g_@@_col_int, -% \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. It -% is incremented by every \cs{cr} including the one ending the -% table preamble. -% -% \cs{g_@@_col_int} holds the current column number. The value -% \texttt{0} means we have not yet started the table or just finished a table row -% (with \verb=\\= typically); any other positive value means we -% are currently typesetting a cell in that column in some row -% (denoted by the \cs{g_@@_row_int}. % -% In a \cs{multicolumn} it holds the column number of the first -% spanned column and \cs{g_@@_span_tl} the info how many cells are -% spanned. -% -% \cs{g_@@_span_tl} is normally \texttt{1} except in a -% \cs{multicolumn} cell. -% \begin{macrocode} -\int_new:N \g_@@_col_int -\int_new:N \g_@@_row_int -\tl_new:N \g_@@_span_tl -\tl_new:N \g_@@_table_cols_tl - -\tl_gset:Nn \g_@@_span_tl {1} -\tl_gset:Nn \g_@@_table_cols_tl {0} % indicates outer level -% \end{macrocode} -% \end{macro} % % -% \begin{macro}{\l_@@_saved_col_tl,\l_@@_saved_row_tl, -% \l_@@_saved_span_tl,\l_@@_saved_table_cols_tl} -% -% Saving the outer values if we are nesting tables is necessary (as -% the above variables are globally altered. For this we use always -% token lists because they don't change and we do not need to blow -% additional integer registers. -% \begin{macrocode} -\tl_new:N \l_@@_saved_col_tl -\tl_new:N \l_@@_saved_row_tl -\tl_new:N \l_@@_saved_span_tl -\tl_new:N \l_@@_saved_table_cols_tl - -\tl_set:Nn \l_@@_saved_col_tl{0} -\tl_set:Nn \l_@@_saved_row_tl{0} -\tl_set:Nn \l_@@_saved_span_tl{1} -\tl_set:Nn \l_@@_saved_table_cols_tl{0} % indicates outer level -% \end{macrocode} -% \end{macro} -% % \begin{macro} % { % \g_@@_struct_table_tl, \l_@@_saved_struct_table_tl, @@ -1390,474 +1113,53 @@ \seq_new:N \l_@@_saved_struct_cur_seq % \end{macrocode} % \end{macro} + + + +% \begin{macro}{\@@_init_struct_data:} +% Save the global structure data variables locally so the we can +% restore them when the table ends (important in case of nested +% tables). % -% \begin{macro}{\ar@ialign} -% A new command that replaces \cs{ialign} above. \cs{everycr} is -% also applied to the \cs{cr} ending the preamble so we have to -% program around that. -% \begin{macrocode} -\def\ar@ialign{% -% \end{macrocode} -% Before starting a table we locally stored the information related -% to the current cell (if any) so that we can restore it once the -% table is finished. +% This is also the right point to initialize +% them. \cs{g_@@_struct_table_tl} is set elsewhere. % \begin{macrocode} - \tl_set:No \l_@@_saved_col_tl {\int_use:N \g_@@_col_int } - \tl_set:No \l_@@_saved_row_tl {\int_use:N \g_@@_row_int } - \tl_set_eq:NN \l_@@_saved_span_tl \g_@@_span_tl +\cs_new_protected:Npn \@@_init_struct_data: { \tl_set_eq:NN \l_@@_saved_struct_table_tl \g_@@_struct_table_tl \seq_set_eq:NN \l_@@_saved_struct_rows_seq \g_@@_struct_rows_seq \seq_set_eq:NN \l_@@_saved_struct_cells_seq \g_@@_struct_cells_seq \seq_set_eq:NN \l_@@_saved_struct_cur_seq \g_@@_struct_cur_seq % - \typeout{==>~ saved~cell~data:~ - \l_@@_saved_row_tl, - \l_@@_saved_col_tl, - \l_@@_saved_span_tl \space - ( - \int_compare:nNnTF \l_@@_saved_table_cols_tl = 0 - { outer~ level } - { max:~ \l_@@_saved_table_cols_tl } - ) - } -% \end{macrocode} -% These are the initial values when starting a table: -% \begin{macrocode} - \int_gzero:N \g_@@_row_int - \int_gzero:N \g_@@_col_int - \tl_gset:Nn \g_@@_span_tl {1} \seq_gclear:N\g_@@_struct_rows_seq \seq_gclear:N\g_@@_struct_cells_seq \seq_gclear:N\g_@@_struct_cur_seq +} % \end{macrocode} -% -% \begin{macrocode} - \everycr{% - \noalign{% -% \end{macrocode} -% We use \cs{g_@@_col_int} equal zero to indicate that we are just -% after a TR (or at the very beginning of the table). Using the row -% count is not so good as longtable may split the table in chunks. -% \begin{macrocode} - \int_compare:nNnT \g_@@_col_int > 0 - { \UseSocket{tagsupport/tblrow/end} } - \int_gincr:N \g_@@_row_int % this row about to start - \int_gzero:N \g_@@_col_int % we are before first col - }% - }% - \tabskip\z@skip\halign} -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\multicolumn} -% -% \cs{multicolumn} is also defined in \pkg{array}. The redefinition -% has to solve two problems: it must handle the row begin if it is -% used there, and it must save the numbers of cells it spans so -% that we can add a suitable ColSpan attribute.\footnote{FMi: This can -% now perhaps cleaned up somewhat} -% \begin{macrocode} -\long\def\multicolumn#1#2#3{% - % alternative: determine first col with vmode test ... - % \ifvmode - % \multispan{#1}\typeout{A==> vmode}% - % \else - % \multispan{#1}\typeout{A==> not vmode} - % \fi - % but this makes the \crcr handling really complicated which would - % then need to become something like - % \ifvmode \expandafter \@gobble - % \else \expandafter \@iden \fi {\cr\noalign{do something}}% - % so not used. - % Instead: - \multispan{#1}\begingroup -% \end{macrocode} -% Insert rowbegin socket only if this multicolumn -% replaces the preamble of the first column. In that case we have -% to set \cs{g_@@_col_int} to 1 since this is no longer done in the -% preamble for the cell. -% \begin{macrocode} - \int_compare:nNnTF \g_@@_col_int = 0 - { - \UseSocket{tagsupport/tblrow/begin} - \int_gset:Nn \g_@@_col_int {1} - } -% \end{macrocode} -% If we are in a later column we use \cs{g_@@_span_tl} from the -% previous column to update. -% \begin{macrocode} - { - \int_gadd:Nn \g_@@_col_int { \g_@@_span_tl } - } -% \end{macrocode} -% Then we set the span value so that it can be use in the next column. +% \end{macro} + + + + +% \begin{macro}{\@@_restore_struct_data:} +% % \begin{macrocode} - \tl_gset:Nn \g_@@_span_tl {#1} +\cs_new_protected:Npn \@@_restore_struct_data: { + \tl_gset_eq:NN \g_@@_struct_table_tl \l_@@_saved_struct_table_tl + \seq_gset_eq:NN \g_@@_struct_rows_seq \l_@@_saved_struct_rows_seq + \seq_gset_eq:NN \g_@@_struct_cells_seq\l_@@_saved_struct_cells_seq + \seq_gset_eq:NN \g_@@_struct_cur_seq \l_@@_saved_struct_cur_seq +} % \end{macrocode} +% \end{macro} + + % -% \begin{macrocode} - \def\@addamp{\if@firstamp\@firstampfalse \else - \@preamerr 5\fi}% - \@mkpream{#2}\@addtopreamble\@empty - \endgroup -% \end{macrocode} -% Now we update the colspan attribute. This needs setting after -% the group as it is hidden inside the plug in \cs{insert@column}. -% \begin{macrocode} - \@@_set_colspan:n {#1} -% \end{macrocode} -% \begin{macrocode} - \def\@sharp{#3}% - \@arstrut \@preamble - \null - \ignorespaces} -% \end{macrocode} -% \end{macro} % % \subsection{longtable} % -% Longtable is complicated. When at the begin the \cs{endhead}, -% \cs{endfirsthead}, \cs{endfoot} and \cs{endlastfoot} are used to -% setup head and foot they create each a structure subtree with one or -% more rows. From this structures we want to keep at most two (head -% and foot) and move the foot to the end of the table. When the head -% and foot boxes are (re)inserted on following pages we want to mark -% them up as artifact with the exception of the head at the begin and -% the foot box at the end. -% -% TODO: When a line is killed the structure subtree is there already -% too and must be removed. -% -% Hyperref patches longtable. This must be disabled and replace with -% genuine code -% \begin{macrocode} -\let\@kernel@refstepcounter\refstepcounter -\def\hyper@nopatch@longtable{} -% \end{macrocode} -% \begin{macrocode} -\def\@@_patch_LT@array[#1]#2{% -% \end{macrocode} -% \cs{LT@array} is executed in a group, so we can disable para-tagging here. -% \begin{macrocode} - \UseSocket{tagsupport/tbl/init}% - \@kernel@refstepcounter{table}\stepcounter{LT@tables}% -% \end{macrocode} -% The target is created rather late and a \cs{label} can come earlier, -% so we have to define \cs{@currentHref} explicitly. We can't currently -% assume that \cs{theHtable} is defined always. -% \begin{macrocode} - \tl_gset:Ne \@currentHref {table.\cs_if_exist_use:N\theHtable} - \int_gzero:N \g_@@_row_int - \seq_gclear:N\g_@@_struct_rows_seq - \seq_gclear:N\g_@@_struct_cells_seq - \seq_gclear:N\g_@@_struct_cur_seq - \seq_gclear:N\g_@@_LT@firsthead_rows_seq - \seq_gclear:N\g_@@_LT@head_rows_seq - \seq_gclear:N\g_@@_LT@lastfoot_rows_seq - \seq_gclear:N\g_@@_LT@foot_rows_seq - \if l#1% - \LTleft\z@ \LTright\fill - \else\if r#1% - \LTleft\fill \LTright\z@ - \else\if c#1% - \LTleft\fill \LTright\fill - \fi\fi\fi - \let\LT@mcol\multicolumn - \let\LT@@@@tabarray\@tabarray - \let\LT@@@@hl\hline - \def\@tabarray{% - \let\hline\LT@@@@hl - \LT@@@@tabarray}% - \let\\\LT@tabularcr - \let\tabularnewline\\% - \def\newpage{\noalign{\break}}% - \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% - \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% - \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption - \@tempdima\ht\strutbox - \let\@endpbox\LT@endpbox - \ifx\extrarowheight\@undefined - \let\@acol\@tabacol - \let\@classz\@tabclassz \let\@classiv\@tabclassiv - \def\@startpbox{\vtop\LT@startpbox}% - \let\@@@@startpbox\@startpbox - \let\@@@@endpbox\@endpbox - \let\LT@LL@FM@cr\@tabularcr - \else - \advance\@tempdima\extrarowheight - \col@sep\tabcolsep - \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr - \fi - \setbox\@arstrutbox\hbox{\vrule - \@height \arraystretch \@tempdima - \@depth \arraystretch \dp \strutbox - \@width \z@}% - \let\@sharp##\let\protect\relax - \begingroup - \@mkpream{#2}% - \@@_determine_table_cols: - \xdef\LT@bchunk{% -% \end{macrocode} -% At the start of a chunk we set \cs{g_@@_col_int} to zero to make -% sure that we aren't generating /TR with the \cs{cr} ending the -% chunk preamble. -% \begin{macrocode} - \int_gzero:N \g_@@_col_int - \global\advance\c@LT@chunks\@ne - \global\LT@rows\z@\setbox\z@\vbox\bgroup - \LT@setprevdepth - \tabskip\LTleft \noexpand\halign to\hsize\bgroup - \tabskip\z@ \@arstrut -% \end{macrocode} -% Insert the socket and the setting of the conditional -% \begin{macrocode} - \UseSocket{tagsupport/tblrow/begin}% - \@@_init_cell_data: -% \end{macrocode} -% \begin{macrocode} - \@preamble \tabskip\LTright \cr}% - \endgroup - \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols - \LT@make@row - \m@th\let\par\@empty -% \end{macrocode} -% Socket and conditional -% \begin{macrocode} - \everycr{% - \noalign{% -% \end{macrocode} -% In \pkg{longtable} we have a bunch of extra \cs{cr}s that are -% executed whenever a chunk ends. In that case they should not -% increment the main row counter, sigh. -% \begin{macrocode} - \typeout{--longtable-->~chunk~row:~ \the\LT@rows \space - row:~ \the\g_@@_row_int \space - column:~ \the\g_@@_col_int - } - \int_compare:nNnT \g_@@_col_int > 0 - { - \UseSocket{tagsupport/tblrow/end} - } -% \end{macrocode} -% This prevents any of the additional \cs{cr}s at the end of the -% chunk to add another /TR. Then once we really start a new chunk -% it gets incremented so\ldots -% \begin{macrocode} - \int_gzero:N \g_@@_col_int % before first col -% \end{macrocode} -% And for the same reason such \cs{cr}s should not increment the -% main row counter (but it has to be incremented after the preamble -% of a chunk), so here we test against \cs{LT@rows} which is -% \cs{LTchunksize} at the end of a chunk. -% \begin{macrocode} - \int_compare:nNnT \LT@rows < \LTchunksize - { \int_gincr:N \g_@@_row_int } % this row about to start - }% - }% -% \end{macrocode} -% \begin{macrocode} - \lineskip\z@\baselineskip\z@ - \LT@bchunk} -% \end{macrocode} -% The end code most stop to insert the endrow too. -% \begin{macrocode} -\def\@@_patch_endlongtable{% - \@@_store_missing_cells:n{endlongtable} - \crcr - \noalign{% - \UseSocket{tagsupport/tbl/finalize/longtable} - \int_gzero:N \g_@@_row_int % this prevents considering the next - % \crcr as another row end. - \let\LT@entry\LT@entry@chop - \xdef\LT@save@row{\LT@save@row}}% - \LT@echunk - \LT@start - \unvbox\z@ - \LT@get@widths - \if@filesw - {\let\LT@entry\LT@entry@write\immediate\write\@auxout{% - \gdef\expandafter\noexpand - \csname LT@\romannumeral\c@LT@tables\endcsname - {\LT@save@row}}}% - \fi - \ifx\LT@save@row\LT@@@@save@row - \else - \LT@warn{Column~\@width s~have~changed\MessageBreak - in~table~\thetable}% - \LT@final@warn - \fi - \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@ - \fi - \endgroup - \global\@mparbottom\z@ - \endgraf\penalty\z@\addvspace\LTpost - \ifvoid\footins\else\insert\footins{}\fi} -% \end{macrocode} -% -% -% -% \begin{macro}{\@@_patch_LT@t@bularcr} -% -% \begin{macrocode} -\def\@@_patch_LT@t@bularcr{% - \global\advance\LT@rows\@ne - \ifnum\LT@rows=\LTchunksize -% \end{macrocode} -% At the end of the chunk \verb=\\= is doing something special and -% so we loose \cs{@@_store_missing_cells:n}. Below is about the -% right place to add it do this code branch. -% \begin{macrocode} - \@@_store_missing_cells:n{echunk} - \gdef\LT@setprevdepth{% - \prevdepth\z@ - \global\let\LT@setprevdepth\relax}% - \expandafter\LT@xtabularcr - \else - \ifnum0=`{}\fi - \expandafter\LT@LL@FM@cr - \fi} - -% \end{macrocode} -% \end{macro} -% % % -% \begin{macro}{\@@_patch_LT@end@hd@ft} -% This command is used to store the head and foot boxes. -% We need to retrieve and store the row so that we can clean -% up the structure in the finalize code. -% \begin{macrocode} -\def\@@_patch_LT@end@hd@ft#1{% -% \end{macrocode} -% To handle missing columns in the header we need this: -% \begin{macrocode} - \__tbl_store_missing_cells:n{head/foot} - \int_step_inline:nn - { \LT@rows + 1 } - { - \seq_gput_left:ce - {g_@@_\cs_to_str:N #1 _rows_seq } - { \int_eval:n {\g_@@_row_int + 1 - ##1 } } - } -% \end{macrocode} -% We also have to set the chunk rows to its max value before -% calling \cs{LTechunk} so that we don't get extra increments of -% the main row counter due to \cs{everycr}. -% \begin{macrocode} - \int_gset:Nn \LT@rows { \LTchunksize } - \LT@echunk - \ifx\LT@start\endgraf - \LT@err - {Longtable head or foot not at start of table}% - {Increase LTchunksize}% - \fi - \setbox#1\box\z@ - \LT@get@widths - \LT@bchunk} -% \end{macrocode} -% \end{macro} - -% \begin{macro}{\@@_patch_LT@start} -% \begin{macrocode} -\def\@@_patch_LT@start{% - \let\LT@start\endgraf - \endgraf\penalty\z@\vskip\LTpre\endgraf - \ifdim \pagetotal<\pagegoal \else - \dimen@=\pageshrink - \advance \dimen@ 1sp % - \kern\dimen@\penalty 9999\endgraf \kern-\dimen@ - \fi - \dimen@\pagetotal - \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi - \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi - \advance\dimen@ \ht\LT@foot - \edef\LT@reset@vfuzz{\vfuzz\the\vfuzz\vbadness\the\vbadness\relax}% - \vfuzz\maxdimen - \vbadness\@M - \setbox\tw@\copy\z@ - \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox - \setbox\tw@\vbox{\unvbox\tw@}% - \LT@reset@vfuzz - \advance\dimen@ \ht - \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi - \advance\dimen@\dp - \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi - \advance\dimen@ -\pagegoal - \ifdim \dimen@>\z@ - \vfil\break - \else - \ifdim\pageshrink>\z@\pageshrink\z@\fi - \fi - \global\@colroom\@colht - \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@ - \maxdepth\z@ - \fi - \MakeLinkTarget{table} - \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak -% \end{macrocode} -% Avoid that following uses of the box add content: -% \begin{macrocode} - \tagmcbegin{artifact} - \tag_mc_reset_box:N\LT@head - \tagmcend - \output{\LT@output}} -% \end{macrocode} -% \end{macro} -% % -% \begin{macro}{\@@_patch_LT@output} -% We must also avoid that the reuse of the foot box leads to -% duplicated content: -% \begin{macrocode} -\def\@@_patch_LT@output{% - \ifnum\outputpenalty <-\@Mi - \ifnum\outputpenalty > -\LT@end@pen - \LT@err{floats and marginpars not allowed in a longtable}\@ehc - \else - \setbox\z@\vbox{\unvbox\@cclv}% - \ifdim \ht\LT@lastfoot>\ht\LT@foot - \dimen@\pagegoal - \advance\dimen@\ht\LT@foot - \advance\dimen@-\ht\LT@lastfoot - \ifdim\dimen@<\ht\z@ - \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}% - \@makecol - \@outputpage - \global\vsize\@colroom - \setbox\z@\vbox{\box\LT@head}% - \fi - \fi - \unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi -% \end{macrocode} -% Reset attribute of foot box: -% \begin{macrocode} - \tagmcbegin{artifact} - \tag_mc_reset_box:N \LT@foot - \tagmcend - \fi - \else - \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% -% \end{macrocode} -% Reset attribute of foot box: -% \begin{macrocode} - \tagmcbegin{artifact} - \tag_mc_reset_box:N \LT@foot - \tagmcend - \@makecol - \@outputpage - \global\vsize\@colroom - \copy\LT@head\nobreak - \fi} -% \end{macrocode} -% \end{macro} % % \begin{macro}{\@@_patch_\LT@makecaption} % This patch is quite similar to the one for LaTeX's \cs{@makecaption} @@ -1893,74 +1195,11 @@ % \begin{macrocode} \AddToHook{package/longtable/after} { - \seq_new:N \g_@@_LT@firsthead_rows_seq - \seq_new:N \g_@@_LT@head_rows_seq - \seq_new:N \g_@@_LT@lastfoot_rows_seq - \seq_new:N \g_@@_LT@foot_rows_seq - \cs_set_eq:NN \LT@array\@@_patch_LT@array - \cs_set_eq:NN \endlongtable\@@_patch_endlongtable - \cs_set_eq:NN \LT@start\@@_patch_LT@start - \cs_set_eq:NN \LT@output\@@_patch_LT@output - \cs_set_eq:NN \LT@t@bularcr\@@_patch_LT@t@bularcr - \cs_set_eq:NN \LT@end@hd@ft\@@_patch_LT@end@hd@ft \cs_set_eq:NN \LT@makecaption\@@_patch_LT@makecaption } % \end{macrocode} - - - -% \subsection{tabularx} -% -% In tabularx we mainly need to ensure that no tagging is done during -% the trial. -% -% \begin{macrocode} -\def\@@_patch_TX@endtabularx{% - \expandafter\expandafter\expandafter - \TX@find@endtabularxa\csname end\TX@\endcsname - \endtabularx\TX@\endtabularx\TX@find@endtabularxa - \expandafter\TX@newcol\expandafter{\tabularxcolumn{\TX@col@width}}% - \let\verb\TX@verb - \def\@elt##1{\global\value{##1}\the\value{##1}\relax}% - \edef\TX@ckpt{\cl@@@@ckpt}% - \let\@elt\relax - \TX@old@table\maxdimen - \TX@col@width\TX@target - \global\TX@cols\@ne - \TX@typeout@ - {\@spaces Table Width\@spaces Column Width\@spaces X Columns}% -% \end{macrocode} -% Here we stop tagging: -% \begin{macrocode} - \tag_stop:n{tabularx} - \TX@trial{\def\NC@rewrite@X{% - \global\advance\TX@cols\@ne\NC@find p{\TX@col@width}}}% - \loop - \TX@arith - \ifTX@ - \TX@trial{}% - \repeat -% \end{macrocode} -% And now we restart it again. -% \begin{macrocode} - \tag_start:n{tabularx} - {\let\@footnotetext\TX@ftntext\let\@xfootnotenext\TX@xftntext - \csname tabular*\expandafter\endcsname\expandafter\TX@target - \the\toks@ - \csname endtabular*\endcsname}% - \global\TX@ftn\expandafter{\expandafter}\the\TX@ftn - \ifnum0=`{\fi}% - \expandafter\expandafter\expandafter - \TX@find@endtabularxbb - \expandafter\end\expandafter{\TX@}% - \endtabularx\TX@\endtabularx\TX@find@endtabularxb -} - -\AddToHook{package/tabularx/after} - {\cs_set_eq:NN \TX@endtabularx\@@_patch_TX@endtabularx } -% \end{macrocode} % \begin{macrocode} %</package> % \end{macrocode} @@ -1973,3 +1212,11 @@ \RequirePackage{latex-lab-testphase-table} %</latex-lab> % \end{macrocode} + +% \begin{macrocode} +%<*latex-lab-alias> +\ProvidesFile{tabular-latex-lab-testphase.ltx} + [\ltlabtbldate\space v\ltlabtblversion\space latex-lab wrapper tabular] +\RequirePackage{latex-lab-testphase-table} +%</latex-lab-alias> +% \end{macrocode} 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 997db2d1a7..a8c827c2e6 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx index b2ed5ecf8a..ca3afe896d 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-testphase.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % %% File: latex-lab-testphase.dtx -% Copyright (C) 2021-2023 The LaTeX Project +% Copyright (C) 2021-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -79,7 +79,7 @@ % \begin{macrocode} %<*phase-III> \ProvidesFile{phase-III-latex-lab-testphase.ltx} - [2023-07-20 v0.1b latex-lab wrapper phase-III] + [2024-02-12 v0.1c latex-lab wrapper phase-III] \input{phase-II-latex-lab-testphase.ltx} \IfFormatAtLeastTF{2023-06-01} { @@ -91,6 +91,7 @@ \RequirePackage{latex-lab-testphase-float} \RequirePackage{latex-lab-testphase-bib} \RequirePackage{latex-lab-testphase-text} + \RequirePackage{latex-lab-testphase-marginpar} } {\PackageWarning{latex-lab}{Testphase III needs newer format}{}} %</phase-III> 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 c65847a04f..e10f2c04f1 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-text.dtx index 4041336ecb..fe9b6ababc 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-text.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-text.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-text.dtx (C) Copyright 2023 LaTeX Project +%% File: latex-lab-text.dtx (C) Copyright 2023-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this 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 a4e26db75f..6847dff5a4 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-title.dtx new file mode 100644 index 0000000000..757bb284a4 --- /dev/null +++ b/macros/latex-dev/required/latex-lab/latex-lab-title.dtx @@ -0,0 +1,518 @@ +% \iffalse meta-comment +% +%% File: latex-lab-title.dtx (C) Copyright 2023-2024 LaTeX Project +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file +% +% https://www.latex-project.org/lppl.txt +% +% +% The development version of the bundle can be found below +% +% https://github.com/latex3/latex2e/required/latex-lab +% +% for those people who are interested or want to report an issue. +% +\def\ltlabtitledate{2024-02-09} +\def\ltlabtitleversion{0.85c} + +%<*driver> +\documentclass{l3doc} +\EnableCrossrefs +\CodelineIndex +\begin{document} + \DocInput{latex-lab-title.dtx} +\end{document} +%</driver> +% +% \fi +% +% \title{The \textsf{latex-lab-title} package\\ +% Changes related to the tagging of the title} +% \author{\LaTeX{} Project\thanks{Initial implementation done by Ulrike Fischer}} +% \date{v\ltlabtitleversion\ \ltlabtitledate} +% +% \maketitle +% +% \newcommand{\xt}[1]{\textsl{\textsf{#1}}} +% \newcommand{\TODO}[1]{\textbf{[TODO:} #1\textbf{]}} +% \newcommand{\docclass}{document class \marginpar{\raggedright document class +% customizations}} +% +% \providecommand\hook[1]{\texttt{#1}} +% +% \begin{abstract} +% \end{abstract} +% +% \section{Introduction} +% +% This module contains changes to improve the tagging (in the standard classes) of +% the title created with the \cs{maketitle} command. It also improves the +% setting of the metadata related to the title and the author. +% +% For basic tagging of the printed title there are basically three things to do: +% +% \begin{itemize} +% \item The actual title should be tagged with the \texttt{Title} tag. +% \item The tabular used to format the author list should \emph{not} be tagged as a tabular. +% \item \cs{maketitle} redefines footnote internals. These must be made tagging aware. +% \end{itemize} +% +% A second task related to title is to store the authors and the title text +% (or a shorter version) inside the XMP-metadata and (in PDF 1.7 or lower) in +% the Info dictionary. Currently this can only be set if hyperref +% is loaded and requires the use of the \texttt{pdftitle} and \texttt{pdfauthor} keys. +% The new code therefore extends the \cs{title} and \cs{author} commands: They +% stores their argument and use them at the end of the document +% for the PDF metadata if the data hasn't been given in another way. +% The code also gives \cs{title} and \cs{author} +% an optional argument where the PDF title or author can be given with +% in a key-value syntax. As with hyperref it is possible to store titles +% in more than one language: +% +% \begin{verbatim} +% \title +% [pdftitle = +% {[en]English Title,[de] Deutscher Titel,[fr]{titre français, avec comma}}] +% {Document title} +% \end{verbatim} +% +% It is also possible to set a subtitle which is then stored in the XMP-metadata: +% +% \begin{verbatim} +% \title +% [pdfsubtitle = +% {[en]English Subtitle,[de] Deutscher Subtitel,[fr]{subtitre français, avec comma}}] +% {Document title} +% \end{verbatim} + +% +% If using the \texttt{pdfauthor} key authors should be separated +% by commas, and to hide commas in a name inside braces if needed: +% +% \begin{verbatim} +% \author[pdfauthor = {Bär, Peter Anteater, {Riley, the sloth}}]{\ldots} +% \end{verbatim} +% +% If hyperref is loaded there is no difference to the \texttt{pdftitle} and +% \texttt{pdfauthor} key used in \cs{hypersetup}. Both can be used (and the last +% key used will win). +% +% \subsection{Open questions and TODOs} +% +% \begin{itemize} +% \item Writing into the Info dictionary needs to convert the input into a PDF string. +% This is here done with a simple version of hyperref's \cs{pdfstringdef}, similar code +% exist also in in the generic hyperref driver. This should be moved into a better place +% module. +% +% \item Is it sensible to enhance \cs{author} and \cs{title} with an optional argument as done here? +% An advantage is that it is rather light-weight and +% doesn't require to decide how this values should be set in \cs{DocumentMetadata} (and would also work +% without \cs{DocumentMetadata}. But a problem could be that various classes and packages already +% extend this commands with other optional arguments. +% +% \item Some of the definitions related to metadata should perhaps be moved into l3pdfmeta. +% +% \item Are the names \texttt{pdftitle} and \texttt{pdfauthor} ok? +% +% \item The patch for \cs{thanks} to get a rlap-footnotemarker looks wrong. This +% probably means that some configuration option is missing in the footnote code. +% \end{itemize} +% +% +% +% \section{Implementation} +% \begin{macrocode} +%<*package> +%<@@=tag> +% \end{macrocode} +% \begin{macrocode} +\ProvidesExplPackage {latex-lab-testphase-title} {\ltlabtitledate} {\ltlabtitleversion} + {Changes related to the tagging of the title} +% \end{macrocode} +% +% \subsection{\cs{maketitle} in article class} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_patch_thanks:n #1 + { + \rlap{\footnotemark} + \protected@xdef\@thanks{\@thanks + \protect\footnotetext[\the\c@footnote]{#1}} + } +% \end{macrocode} +% The no-titlepage version of article, report and book +% \begin{macrocode} +\cs_new_protected:Npn \@@_patch_maketitle: + { + \par + \begingroup +% \end{macrocode} +% Disable table tagging +% \begin{macrocode} + \cs_if_exist_use:N\__tag_tbl_disable: + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% +% \end{macrocode} +% the original definition redefines \cs{@makefnmark} and +% \cs{@makefntext} to get an rlap-mark in the text without +% affecting the mark in the note (which gives by the way +% a wrong link area with hyperref). There seem to be currently +% no good way in the footnote to configure this, so we redefine +% \cs{thanks} instead +% \begin{macrocode} + \cs_set_eq:NN \thanks \@@_patch_thanks:n + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi + \thispagestyle{plain}\@thanks + \endgroup + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax + } +% \end{macrocode} +% We must also change \cs{@maketitle} to insert a Title tag +% \begin{macrocode} +\cs_new_protected:Npn \@@_patch_@maketitle: + { + \newpage + \null + \vskip 2em% + \begin{center}% + \let \footnote \thanks +% \end{macrocode} +% use Title around the title. As in PDF 1.7 this is +% rolemapped to P we change the text-unit tag there. +% \begin{macrocode} + \pdf_version_compare:NnTF > {1.7} + {{\LARGE \tag_struct_begin:n{tag=Title}\@title \par\tag_struct_end:}} + {{\LARGE \tagtool{paratag=Title}\@title \par}}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large \@date}% + \end{center}% + \par + \vskip 1.5em + } + +% \end{macrocode} +% The titlepage variant +% \begin{macrocode} +\cs_new_protected:Npn \@@_patch_maketitle_page: + {\begin{titlepage}% +% \end{macrocode} +% disable table tagging +% \begin{macrocode} + \cs_if_exist_use:N\__tag_tbl_disable: + \let\footnotesize\small + \let\footnoterule\relax + \let \footnote \thanks + \null\vfil + \vskip 60\p@ +% \end{macrocode} +% use Title around the title. As in PDF 1.7 this is +% rolemapped to P we change the text-unit tag there. +% \begin{macrocode} + \begin{center}% + \pdf_version_compare:NnTF > {1.7} + {{\LARGE \tag_struct_begin:n{tag=Title}\@title \par\tag_struct_end:}} + {{\LARGE \tagtool{paratag=Title}\@title \par}}% + \vskip 3em% + {\large + \lineskip .75em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1.5em% + {\large \@date \par}% % Set date in \large size. + \end{center}\par + \@thanks + \vfil\null + \end{titlepage}% + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax + } + +% \end{macrocode} +% Map the new commands onto \cs{maketitle}: +% \begin{macrocode} +\AddToHook{class/article/after} + { + \if@titlepage + \cs_set_eq:NN \maketitle \@@_patch_maketitle_page: + \else + \cs_set_eq:NN \maketitle \@@_patch_maketitle: + \cs_set_eq:NN \@maketitle \@@_patch_@maketitle: + \fi + } +\AddToHook{class/report/after} + { + \if@titlepage + \cs_set_eq:NN \maketitle \@@_patch_maketitle_page: + \else + \cs_set_eq:NN \maketitle \@@_patch_maketitle: + \cs_set_eq:NN \@maketitle \@@_patch_@maketitle: + \fi + } +\AddToHook{class/book/after} + { + \if@titlepage + \cs_set_eq:NN \maketitle \@@_patch_maketitle_page: + \else + \cs_set_eq:NN \maketitle \@@_patch_maketitle: + \cs_set_eq:NN \@maketitle \@@_patch_@maketitle: + \fi + } +% \end{macrocode} +% +% \subsection{Helper commands to set metadata} +% +% Some temp variables +% \begin{macrocode} +\str_new:N \g_@@_title_tmpa_str +\str_new:N \l_@@_title_tmpa_str +\tl_new:N \l_@@_title_tmpa_tl +\seq_new:N \l_@@_title_tmpa_seq +% \end{macrocode} +% Support for \cs{texorpdfstring} +% \begin{macrocode} +\providecommand\texorpdfstring[2]{#1}% +% \end{macrocode} +% +% A helper command to convert the title into a pdfstring similar to +% \cs{pdfstringdef}. +% As we use \cs{text_purify} we must ensure that the default definitions +% of \cs{@title} and \cs{@author} are robust: +% \begin{macrocode} +\protected\def\@title{\@latex@error{No \noexpand\title given}\@ehc} +\protected\def\@author{\@latex@warning@no@line{No \noexpand\author given}} +% \end{macrocode} +% TODO: This should be improved and moved into the pdf module so that +% it is generally available. +% \begin{macrocode} +\cs_new_protected:Npn \@@_title_pdfstring:nnN #1 #2 #3 % #1 text, #2 e.g. utf16/hex + { + \group_begin: +% \end{macrocode} +% TODO: we need probably a common boolean to handle +% \cs{texorpdfstring} also without hyperref. +% \begin{macrocode} + \cs_set_eq:NN\texorpdfstring\use_ii:nn + \str_set:Ne \l_@@_title_tmpa_str {\text_purify:n { #1 } } + \pdf_string_from_unicode:nVN { #2 } \l_@@_title_tmpa_str \l_@@_title_tmpa_str + \str_gset_eq:NN \g_@@_title_tmpa_str\l_@@_title_tmpa_str + \group_end: + \str_set_eq:NN #3 \g_@@_title_tmpa_str + } +\cs_generate_variant:Nn\@@_title_pdfstring:nnN {e} +% \end{macrocode} + +% \subsection{Extend title to set metadata} +% At first a variable to store the title, as \cs{@title} is emptied by \LaTeX. +% \begin{macrocode} +\tl_new:N \g_@@_title_title_tl +% \end{macrocode} +% Now we redefine \cs{title} so that it stores the title, and processes +% keys in the optional argument. We use \texttt{hyp} as module +% name for the key as this means that if hyperref is loaded its definition +% of \texttt{pdftitle} will be used -- at some time probably this +% should be moved out of hyperref so that we have only one definition. +% +% \begin{macrocode} +\RenewDocumentCommand\title{O{}m} + { + \gdef\@title{#2} + \tl_gset_eq:NN\g_@@_title_title_tl\@title + \keys_set:nn {hyp}{#1} + } +% \end{macrocode} +% Now we define the \texttt{pdftitle} key. This is more or less +% the same definition as in the generic hyperref driver. +% \begin{macrocode} +\regex_new:N\l_@@_title_optlang_regex +\regex_set:Nn\l_@@_title_optlang_regex {\A\[([A-Za-z\-]+)\](.*)} +\cs_generate_variant:Nn \regex_extract_once:NnN{NVN} +\cs_generate_variant:Nn \clist_item:nn {on} +% \end{macrocode} +% and now the keys. +% \begin{macrocode} +\keys_define:nn { hyp } + { + pdftitle .code:n = + { + \tl_if_blank:nTF {#1} + { + \pdfmanagement_remove:nn {Info}{Title} + } + { + \tl_set:Ne\l_@@_title_tmpa_tl {\clist_item:on{#1}{1}} + \regex_extract_once:NVN + \l_@@_title_optlang_regex + \l_@@_title_tmpa_tl + \l_@@_title_tmpa_seq + \seq_if_empty:NTF\l_@@_title_tmpa_seq + { + \@@_title_pdfstring:nnN {#1}{utf16/hex}\l_@@_title_tmpa_str + } + { + \@@_title_pdfstring:enN + {\seq_item:Nn \l_@@_title_tmpa_seq{3}}{utf16/hex}\l_@@_title_tmpa_str + } + \str_if_eq:VnF\l_@@_title_tmpa_str{<FEFF>} + { + \pdfmanagement_add:nne {Info}{Title}{\l_@@_title_tmpa_str} + } + } + \AddToDocumentProperties[hyperref]{pdftitle}{#1} + } + ,pdfsubtitle .code:n = { \AddToDocumentProperties[hyperref]{pdfsubtitle}{#1} } + } +% \end{macrocode} +% +% \subsection{Extend \cs{author} to set metadata} +% +% At first a variable to store the authors, as \cs{@author} is emptied by \LaTeX. +% \begin{macrocode} +\tl_new:N \g_@@_title_author_tl +% \end{macrocode} +% Now we redefine \cs{author} so that it stores the authors, and processes +% keys in the optional argument. We use \texttt{hyp} as module +% name for the key as this means that if hyperref is loaded its definition +% of \texttt{pdfauthor} will be used -- at some time probably this +% should be moved out of hyperref so that we have only one definition. +% +% \begin{macrocode} +\RenewDocumentCommand\author{O{}m} + { + \gdef\@author{#2} + \tl_gset_eq:NN\g_@@_title_author_tl\@author + \keys_set:nn {hyp}{#1} + } +% \end{macrocode} +% +% Now we define the \texttt{pdfauthor} key. This is more or less +% the same definition as in the generic hyperref driver. + +% \begin{macrocode} +\keys_define:nn { hyp } + { + pdfauthor .code:n = + { + \tl_if_blank:nTF {#1} + { + \pdfmanagement_remove:nn {Info}{Author} + } + { + \tl_set:Ne\l_@@_title_tmpa_tl {\clist_item:on{#1}{1}} + \regex_extract_once:NVN + \l_@@_title_optlang_regex + \l_@@_title_tmpa_tl + \l_@@_title_tmpa_seq + \seq_if_empty:NTF\l_@@_title_tmpa_seq + { + \@@_title_pdfstring:nnN {#1}{utf16/hex}\l_@@_title_tmpa_str + } + { + \@@_title_pdfstring:enN + {\seq_item:Nn \l_@@_title_tmpa_seq{3}}{utf16/hex}\l_@@_title_tmpa_str + } + \str_if_eq:VnF\l_@@_title_tmpa_str{<FEFF>} + { + \pdfmanagement_add:nne {Info}{Author}{\l_@@_title_tmpa_str} + } + } + \AddToDocumentProperties[hyperref]{pdfauthor}{#1} + } + } +% \end{macrocode} +% \subsection{Fallback for classes and packages that redefine \cs{title} or \cs{author}} +% If a class redefines \cs{author} and \cs{title} again, we try to retrieve at +% least the values. +% \begin{macrocode} +\AddToHook{cmd/maketitle/before} + { + \tl_gset_eq:NN \g_@@_title_author_tl\@author + \tl_gset_eq:NN \g_@@_title_title_tl\@title + } +% \end{macrocode} +% +% \subsection{Finalize document} +% At last we set the title and the author at the end of document +% if that hasn't happened yet: +% \begin{macrocode} +\AddToHook{shipout/lastpage} + { + \tl_if_empty:eT{\GetDocumentProperties{hyperref/pdftitle}} + { + \group_begin: + \cs_set_eq:NN\thanks \use_none:n + \str_set:Ne \l_@@_title_tmpa_str {\text_purify:n { \g_@@_title_title_tl } } + \keys_set:ne{hyp}{pdftitle={\exp_not:V\l_@@_title_tmpa_str}} + \group_end: + } + \tl_if_empty:eT{\GetDocumentProperties{hyperref/pdfauthor}} + { + \group_begin: + \cs_set_eq:NN\thanks \use_none:n + \cs_set:Npn \and {,} + \str_set:Ne \l_@@_title_tmpa_str {\text_purify:n { \g_@@_title_author_tl } } + \keys_set:ne{hyp}{pdfauthor={\exp_not:V\l_@@_title_tmpa_str}} + \group_end: + } +% \end{macrocode} +% force display title, if an UA-standard is detected. +% \begin{macrocode} + \tl_if_empty:eF{\GetDocumentProperties{document/pdfstandard-UA}} + { + \pdfmanagement_add:nnn {Catalog / ViewerPreferences } { DisplayDocTitle } { true } + } + } +\DeclareHookRule{shipout/lastpage}{latex-lab-testphase-title}{before}{pdfmanagement-testphase} +%</package> +% \end{macrocode} + +% \begin{macrocode} +%<*latex-lab> +\ProvidesFile{title-latex-lab-testphase.ltx} + [\ltlabtitledate\space v\ltlabtitleversion\space + Changes related to the tagging of the title] + +\RequirePackage{latex-lab-testphase-title} + +%</latex-lab> +% \end{macrocode} 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 differnew file mode 100644 index 0000000000..2e60580ba6 --- /dev/null +++ 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx index 2f00b83c05..ff9dd950b7 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-hyperref-changes.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-toc-hyperref-changes.dtx (C) Copyright 2022-2023 LaTeX Project +%% File: latex-lab-toc-hyperref-changes.dtx (C) Copyright 2022-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this 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 161e96f338..6fdcf836af 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx index 81c9edfe4d..bb88ffdcb0 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc-kernel-changes.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2023 LaTeX Project +%% File: latex-lab-toc-kernel-changes.dtx (C) Copyright 2022-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -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{2023-10-16} -\def\ltlabkernelversion{0.85b} +\def\ltlabkerneldate{2024-02-12} +\def\ltlabkernelversion{0.85c} %<*driver> \documentclass{l3doc} \EnableCrossrefs @@ -235,7 +235,7 @@ \makeatletter \@starttoc@cfgpoint@before{#1}% \@input{\jobname.#1}% - \@starttoc@cfgpoint@after{#1} + \@starttoc@cfgpoint@after{#1}% \if@filesw \expandafter\newwrite\csname tf@#1\endcsname \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax 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 0a78ca15d9..de2dd29b50 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.dtx b/macros/latex-dev/required/latex-lab/latex-lab-toc.dtx index 6def505e11..7235eb9ed9 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab-toc.dtx +++ b/macros/latex-dev/required/latex-lab/latex-lab-toc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: latex-lab-toc.dtx (C) Copyright 2022-2023 LaTeX Project +%% File: latex-lab-toc.dtx (C) Copyright 2022-2024 LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -271,7 +271,7 @@ { \int_compare_p:nNn { \g_@@_toc_level_int } > {-100} } { \int_compare_p:nNn { \use:c{toclevel@#1} } > { \g_@@_toc_level_int } } { - \seq_gpush:Nx \g_@@_toc_stack_seq {{TOC}\use:c{toclevel@#1}} + \seq_gpush:Ne \g_@@_toc_stack_seq {{TOC}\use:c{toclevel@#1}} \tag_struct_begin:n{tag=TOC} } % \end{macrocode} @@ -298,7 +298,7 @@ % \begin{macrocode} \group_begin: \text_declare_expand_equivalent:Nn \numberline \use_none:n - \exp_args:Nx \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. @@ -307,9 +307,9 @@ % need to store fake names. % \end{NOTE} % \begin{macrocode} - \prop_gput:Nxx \g_@@_struct_ref_by_dest_prop + \prop_gput:Nee \g_@@_struct_ref_by_dest_prop { \tag_get:n {struct_num} }{#3} - \seq_gpush:Nx \g_@@_toc_stack_seq {{TOCI}\use:c{toclevel@#1}} + \seq_gpush:Ne \g_@@_toc_stack_seq {{TOCI}\use:c{toclevel@#1}} \group_end: } } 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 eafeeec42e..38122e3322 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/latex-lab/latex-lab.ins b/macros/latex-dev/required/latex-lab/latex-lab.ins index 548f18a6fa..7071ed6e3d 100644 --- a/macros/latex-dev/required/latex-lab/latex-lab.ins +++ b/macros/latex-dev/required/latex-lab/latex-lab.ins @@ -154,8 +154,16 @@ where one can also log issues in case there are any. %table \generate{\file{table-latex-lab-testphase.ltx}{\from{latex-lab-table.dtx}{latex-lab}}} +\generate{\file{tabular-latex-lab-testphase.ltx}{\from{latex-lab-table.dtx}{latex-lab-alias}}} \generate{\file{latex-lab-testphase-table.sty}{\from{latex-lab-table.dtx}{package}}} +%title +\generate{\file{title-latex-lab-testphase.ltx}{\from{latex-lab-title.dtx}{latex-lab}}} +\generate{\file{latex-lab-testphase-title.sty}{\from{latex-lab-title.dtx}{package}}} + +%marginpar +\generate{\file{marginpar-latex-lab-testphase.ltx}{\from{latex-lab-marginpar.dtx}{latex-lab}}} +\generate{\file{latex-lab-testphase-marginpar.sty}{\from{latex-lab-marginpar.dtx}{package}}} % stop docstrip adding \endinput \preamble diff --git a/macros/latex-dev/required/tools/README.md b/macros/latex-dev/required/tools/README.md index c87b522b3c..8c55bf3449 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-06-01 pre-release 0 +Release 2024-06-01 pre-release 1 Overview -------- diff --git a/macros/latex-dev/required/tools/afterpage.dtx b/macros/latex-dev/required/tools/afterpage.dtx index 518b70761d..72df39402c 100644 --- a/macros/latex-dev/required/tools/afterpage.dtx +++ b/macros/latex-dev/required/tools/afterpage.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/afterpage.ins b/macros/latex-dev/required/tools/afterpage.ins index 6fec5edc6f..17792ddfa1 100644 --- a/macros/latex-dev/required/tools/afterpage.ins +++ b/macros/latex-dev/required/tools/afterpage.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug reports for it can be opened at https://latex-project.org/bugs/ (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/required/tools/afterpage.pdf b/macros/latex-dev/required/tools/afterpage.pdf Binary files differindex 1e62bd8f2b..a6f340967f 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-2023-11-01.sty b/macros/latex-dev/required/tools/array-2023-11-01.sty new file mode 100644 index 0000000000..cd6eee6a0f --- /dev/null +++ b/macros/latex-dev/required/tools/array-2023-11-01.sty @@ -0,0 +1,375 @@ +%% +%% This is file `array.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% array.dtx (with options: `package,ncols') +%% +%% This is a generated file. +%% +%% The source is maintained by the LaTeX Project team and bug +%% reports for it can be opened at https://latex-project.org/bugs/ +%% (but please observe conditions on bug reports sent to that address!) +%% +%% +%% Copyright (C) 1993-2023 +%% The LaTeX Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'. +%% -------------------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file may only be distributed together with a copy of the LaTeX +%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle' +%% without such generated files. +%% +%% The list of all files belonging to the LaTeX `Tools Bundle' is +%% given in the file `manifest.txt'. +%% +%% Package `array' to use with LaTeX 2e +%% Copyright (C) 1989-1998 Frank Mittelbach, all rights reserved. +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\providecommand\DeclareRelease[3]{} +\providecommand\DeclareCurrentRelease[2]{} + +\DeclareRelease{}{2016-10-06}{array-2016-10-06.sty} +\DeclareRelease{v2.4}{2020-02-10}{array-2020-02-10.sty} +\DeclareCurrentRelease{}{2020-10-01} + +\ProvidesPackage{array} + [2023/10/16 v2.5g Tabular extension package (FMi)] +%% + +\def\@addtopreamble#1{\xdef\@preamble{\@preamble #1}} +\def\@testpach{\@chclass + \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else + \ifnum \@lastchclass=7 5 \else + \ifnum \@lastchclass=8 \tw@ \else + \ifnum \@lastchclass=9 \thr@@ + \else \z@ + \ifnum \@lastchclass = 10 \else + \edef\@nextchar{\expandafter\string\@nextchar}% + \@chnum + \if \@nextchar c\z@ \else + \if \@nextchar l\@ne \else + \if \@nextchar r\tw@ \else + \z@ \@chclass + \if\@nextchar |\@ne \else + \if \@nextchar !6 \else + \if \@nextchar @7 \else + \if \@nextchar <8 \else + \if \@nextchar >9 \else + 10 + \@chnum + \if \@nextchar m\thr@@\else + \if \@nextchar p4 \else + \if \@nextchar b5 \else + \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi + \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi} +\def\@xexpast#1*#2#3#4\@@{% + \@tempcnta #2 + \toks@={#1}\@temptokena={#3}% + \let\the@toksz\relax \let\the@toks\relax + \def\@tempa{\the@toksz}% + \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do + {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}% + \let \@tempb \@xexpast \else + \let \@tempb \@xexnoop \fi + \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}% + \edef\@tempa{\@tempa}% + \expandafter \@tempb \@tempa #4\@@} +\def\prepnext@tok{\advance \count@ \@ne + \toks\count@{}} +\def\save@decl{\toks\count@ \expandafter{\@nextchar}} +\def\insert@column{% + \the@toks \the \@tempcnta + \ignorespaces \@sharp \unskip + \the@toks \the \count@ \relax} +\newdimen\col@sep +\def\@acol{\@addtopreamble{\hskip\col@sep}} +\def\@classx{% + \ifcase \@lastchclass + \@acolampacol \or + \@addamp \@acol \or + \@acolampacol \or + \or + \@acol \@firstampfalse \or + \@addamp + \fi} +\def\@classz{\@classx + \@tempcnta \count@ + \prepnext@tok + \@addtopreamble{\ifcase \@chnum + \hfil + \hskip1sp% + \d@llarbegin + \insert@column + \d@llarend \do@row@strut \hfil \or + \hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \hfil \or + \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \or + \setbox\ar@mcellbox\vbox + \@startpbox{\@nextchar}\insert@column \@endpbox + \ar@align@mcell + \do@row@strut \or + \vtop \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut \or + \vbox \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut + \fi}\prepnext@tok} + +\newbox\ar@mcellbox +\def\ar@align@mcell{% + \ifdim \ht\ar@mcellbox > \ht\strutbox + \begingroup + \dimen@\ht\ar@mcellbox + \advance\dimen@-\ht\@arstrutbox + \advance\dimen@\baselineskip + \lower.5\dimen@\box\ar@mcellbox + \endgroup + \else % assume one line and align at baseline + \box\ar@mcellbox + \fi} + +\def\@arrayrule{\@addtopreamble \vline} +\def\@classvii{\ifnum \@lastchclass = \thr@@ + \@preamerr \thr@@ \fi} +\def\@classvi{\ifcase \@lastchclass + \@acol \or + \@addtopreamble{\hskip \doublerulesep}\or + \@acol \or + \@classvii + \fi} +\def\@classii{\advance \count@ \m@ne + \save@decl\prepnext@tok} +\def\@classi{\@classvi + \ifcase \@chnum \@arrayrule \or + \@classv \fi} +\def\@startpbox#1{\bgroup + \color@begingroup + \setlength\hsize{#1}\@arrayparboxrestore + \everypar{% + \vrule \@height \ht\@arstrutbox \@width \z@ + \everypar{}}% + } +\def\@endpbox{\@finalstrut\@arstrutbox \par \color@endgroup \egroup\hfil} +\def\@array[#1]#2{% + \@tempdima \ht \strutbox + \advance \@tempdima by\extrarowheight + \setbox \@arstrutbox \hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \begingroup + \@mkpream{#2}% + \xdef\@preamble{\noexpand \ialign \@halignto + \bgroup \@arstrut \@preamble + \tabskip \z@ \cr}% + \endgroup + \@arrayleft + \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi + \bgroup + \let \@sharp ##\let \protect \relax + \lineskip \z@ + \baselineskip \z@ + \m@th + \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble} +\def\arraybackslash{\let\\\tabularnewline} +\newdimen \extrarowheight +\extrarowheight=0pt +\def\@arstrut{\unhcopy\@arstrutbox} +\protected\def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi + \@ifstar \@xarraycr \@xarraycr} +\def\@xarraycr{\@ifnextchar [% + \@argarraycr {\ifnum 0=`{}\fi\cr}} +\def\@argarraycr[#1]{\ifnum0=`{}\fi\ifdim #1>\z@ + \expandafter\@xargarraycr\else + \expandafter\@yargarraycr\fi{#1}} +\def\@xargarraycr#1{\unskip\gdef\do@row@strut + {\@tempdima #1\advance\@tempdima \dp\@arstrutbox + \vrule \@depth\@tempdima \@width\z@\global\let\do@row@strut\relax}% + \ifnum\@multicnt >\z@ \do@row@strut \fi + \cr} +\let\do@row@strut\relax +\long\def\multicolumn#1#2#3{% + \multispan{#1}\begingroup + \def\@addamp{\if@firstamp \@firstampfalse \else + \@preamerr 5\fi}% + \@mkpream{#2}\@addtopreamble\@empty + \endgroup + \def\@sharp{#3}% + \@arstrut \@preamble + \null + \ignorespaces} +\let\d@llarbegin\begingroup +\let\d@llarend\endgroup +\def\array{\col@sep\arraycolsep + \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}% + \@tabarray} +\def\tabular{\def\@halignto{}\@tabular} +\expandafter\def\csname tabular*\endcsname#1{% + \setlength\dimen@{#1}% + \edef\@halignto{to\the\dimen@}\@tabular} +\def\@tabular{% + \leavevmode + \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup + \let\d@llarend\endgroup + \@tabarray} +\def\endtabular{\endarray\m@th $\egroup} +\expandafter\let\csname endtabular*\endcsname=\endtabular +\let\@ampacol=\relax \let\@expast=\relax +\let\@arrayclassiv=\relax \let\@arrayclassz=\relax +\let\@tabclassiv=\relax \let\@tabclassz=\relax +\let\@arrayacol=\relax \let\@tabacol=\relax +\let\@tabularcr=\relax \let\@@endpbox=\relax +\let\@argtabularcr=\relax \let\@xtabularcr=\relax +\def\@preamerr#1{\def\@tempd{{..} at wrong position: }% + \PackageError{array}{% + \ifcase #1 Illegal pream-token (\@nextchar): `c' used\or %0 + Missing arg: token ignored\or %1 + Empty preamble: `l' used\or %2 + >\@tempd token ignored\or %3 + <\@tempd changed to !{..}\or %4 + Only one column-spec. allowed.\fi}\@ehc} %5 +\def\newcolumntype#1{% + \edef\NC@char{\string#1}% + \@ifundefined{NC@find@\NC@char}% + {\@tfor\next:=<>clrmbp@!|\do + {% + \if\expandafter\noexpand\next\NC@char + \PackageWarning{array}% + {Redefining primitive column \NC@char}\fi}% + \NC@list\expandafter{\the\NC@list\NC@do#1}}% + {\PackageWarning{array}{Column \NC@char\space is already defined}}% + \@namedef{NC@find@\NC@char}##1#1{\NC@{##1}}% + \@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}} +\def\newcol@#1[#2]#3{\expandafter\@reargdef + \csname NC@rewrite@#1\endcsname[#2]{\NC@find#3}} +\def\NC@#1{% + \@temptokena\expandafter{\the\@temptokena#1}\futurelet\next\NC@ifend} +\def\NC@ifend{% + \ifx\next\relax + \else\@tempswatrue\expandafter\NC@rewrite\fi} +\def\NC@do#1{% + \expandafter\let\expandafter\NC@rewrite + \csname NC@rewrite@\string#1\endcsname + \expandafter\let\expandafter\NC@find + \csname NC@find@\string#1\endcsname + \expandafter\@temptokena\expandafter{\expandafter}% + \expandafter\NC@find\the\@temptokena#1\relax} +\def\showcols{{\def\NC@do##1{\let\NC@do\NC@show}\the\NC@list}} +\def\NC@show#1{% + \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip + \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}} +\def\NC@strip#1:#2->#3 #4\@@{#2 -> #4} +\newtoks\NC@list +\newcolumntype{*}[2]{} +\long\@namedef{NC@rewrite@*}#1#2{% + \count@#1\relax + \loop + \ifnum\count@>\z@ + \advance\count@\m@ne + \@temptokena\expandafter{\the\@temptokena#2}% + \repeat + \NC@find} +\let\@xexpast\relax +\let\@xexnoop\relax +\def\save@decl{\toks \count@ = \expandafter\expandafter\expandafter + {\expandafter\@nextchar\the\toks\count@}} +\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue + \let\@sharp\relax + \def\@startpbox##1{\unexpanded\expandafter{\expandafter + \@startpbox\expandafter{##1}}}\let\@endpbox\relax + \let\do@row@strut\relax + \let\ar@align@mcell\relax + \@temptokena{#1}\@tempswatrue + \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}% + \count@\m@ne + \let\the@toks\relax + \prepnext@tok + \expandafter \@tfor \expandafter \@nextchar + \expandafter :\expandafter =\the\@temptokena \do + {\@testpach + \ifcase \@chclass \@classz \or \@classi \or \@classii + \or \save@decl \or \or \@classv \or \@classvi + \or \@classvii \or \@classviii + \or \@classx + \or \@classx \fi + \@lastchclass\@chclass}% + \ifcase\@lastchclass + \@acol \or + \or + \@acol \or + \@preamerr \thr@@ \or + \@preamerr \tw@ \@addtopreamble\@sharp \or + \or + \else \@preamerr \@ne \fi + \def\the@toks{\the\toks}} +\let\@classix\relax +\def\@classviii{\ifnum \@lastchclass >\z@\ifnum\@lastchclass=\tw@\else + \@preamerr 4\@chclass 6 \@classvi \fi\fi} +\def\@classv{\save@decl + \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@ + \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}% + \prepnext@tok} +\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}% + \ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi} +\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}} +\let\@@array\@array +\def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}} +\let\@arrayleft\@empty +\let\@arrayright\@empty +\newlength{\extratabsurround} +\setlength{\extratabsurround}{2pt} +\newlength{\backup@length} +\newcommand{\firsthline}{% + \multicolumn1{@{}c@{}}{% + \global\backup@length\ht\@arstrutbox + \global\advance\backup@length\dp\@arstrutbox + \global\advance\backup@length\arrayrulewidth + \raise\extratabsurround\copy\@arstrutbox + \kern-1sp% + }\\[-\backup@length]\hline +} +\newcommand{\lasthline}{\hline\multicolumn1{@{}c@{}}{% + \global\backup@length2\ht\@arstrutbox + \global\advance\backup@length2\dp\@arstrutbox + \global\advance\backup@length\arrayrulewidth + }\\[-\backup@length]% + \multicolumn1{@{}c@{}}{% + \lower\extratabsurround\copy\@arstrutbox + \kern-1sp% + }% +} +\CheckCommand*\@xhline{\ifx\reserved@a\hline + \vskip\doublerulesep + \vskip-\arrayrulewidth + \fi + \ifnum0=`{\fi}} +\renewcommand*\@xhline{\ifx\reserved@a\hline + \vskip\doublerulesep + \fi + \ifnum0=`{\fi}} + +\newsavebox\ar@cellbox +\newcolumntype{w}[2]{% + >{\begin{lrbox}\ar@cellbox\d@llarbegin}% + c% + <{\d@llarend \end{lrbox}% + \makebox[#2][#1]{\unhbox\ar@cellbox}}} + +\newcolumntype{W}[2] + {>{\begin{lrbox}\ar@cellbox\d@llarbegin}% + c% + <{\d@llarend\end{lrbox}% + \let\hss\hfil + \makebox[#2][#1]{\unhbox\ar@cellbox}}} +\endinput +%% +%% End of file `array.sty'. diff --git a/macros/latex-dev/required/tools/array.dtx b/macros/latex-dev/required/tools/array.dtx index 6e4e34ea26..66c40a5267 100644 --- a/macros/latex-dev/required/tools/array.dtx +++ b/macros/latex-dev/required/tools/array.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. @@ -30,10 +30,15 @@ %<+package> %<+package>\DeclareRelease{}{2016-10-06}{array-2016-10-06.sty} %<+package>\DeclareRelease{v2.4}{2020-02-10}{array-2020-02-10.sty} -%<+package>\DeclareCurrentRelease{}{2020-10-01} +%<+package>\DeclareRelease{v2.5}{2023-11-01}{array-2023-11-01.sty} +%<+package>\DeclareCurrentRelease{}{2024-06-01} %<+package> +% \end{macrocode} +% Current version needs a new kernel. +% \begin{macrocode} +%<+package>\NeedsTeXFormat{LaTeX2e}[2024/06/01] %<+package>\ProvidesPackage{array} -%<+package> [2023/10/16 v2.5g Tabular extension package (FMi)] +%<+package> [2023/12/11 v2.6a Tabular extension package (FMi)] % % \fi % @@ -177,6 +182,18 @@ % \DoNotIndex{\xdef} % \DoNotIndex{\z@} % +% +% \providecommand\env[1]{\texttt{#1}} +% +% \providecommand\hook[1]{\texttt{#1\DescribeHook[noprint]{#1}}} +% \providecommand\socket[1]{\texttt{#1\DescribeSocket[noprint]{#1}}} +% \providecommand\plug[1]{\texttt{#1\DescribePlug[noprint]{#1}}} +% +% \NewDocElement[printtype=\textit{socket},idxtype=socket,idxgroup=Sockets]{Socket}{socketdecl} +% \NewDocElement[printtype=\textit{hook},idxtype=hook,idxgroup=Hooks]{Hook}{hookdecl} +% \NewDocElement[printtype=\textit{plug},idxtype=plug,idxgroup=Plugs]{Plug}{plugdecl} +% +% % \GetFileInfo{array.sty} % % \title{A new implementation of \LaTeX's \textsf{tabular} @@ -195,6 +212,8 @@ % \MaintainedByLaTeXTeam{tools} % \maketitle % +% +% % \MakeShortVerb{\=} % % \begin{abstract} @@ -750,12 +769,29 @@ % \end{itemize} % % +% \section{Support for tagged PDF} % -% \changes{v2.2b}{1994/02/04}{Removed interactive prompt} +% With version 2.6a the package is made tagging aware, which means that +% it will automatically produce tagged tables (necessary, for example, for +% accessibility) if tagging is requested via \cs{DocumentMetadata}. % -% \MaybeStop{ +% More granular control, e.g., explicitly deciding which cells are +% header cells, etc., is currently under development, but syntax for +% this will not appear in this package. Instead it will become +% available across all tabular-generating packages and then +% automatically apply here as well. +% +% Enabling \LaTeX{} to automatically produce tagged PDF is a long-term +% project and this is a tiny step in this puzzle. For more information +% on the project and already available functionality, see +% \url{https://latex-project.org/publications/indexbytopic/pdf} and +% \url{https://github.com/latex3/tagging-project}. % % +% +% \changes{v2.2b}{1994/02/04}{Removed interactive prompt} +% +% \MaybeStop{ % \begin{thebibliography}{1} % \bibitem{bk:GMS94} \textsc{M.~Goossens}, \textsc{F.~Mittelbach} % and \textsc{A.~Samarin}. @@ -772,7 +808,6 @@ % \newblock % Addison-Wesley, Reading, Massachusetts, 1986. % \end{thebibliography} -% % } ^^A end of \MaybeStop % % @@ -786,8 +821,49 @@ % \texttt{docstrip} program. % \begin{macrocode} %<*driver> -\NeedsTeXFormat{LaTeX2e}[1995/12/01] -\documentclass{ltxdoc} +\NeedsTeXFormat{LaTeX2e}[2024/06/01] +% \end{macrocode} +% +% We switched from \cls{ltxdoc} to \cls{l3doc} to get support for +% code written in the L3 programming layer. The first is that we +% are currently missing \cs{MaintainedByLaTeXTeam}, so we have to +% provide that for now. +% \begin{macrocode} +\documentclass{l3doc} + +% currently missing in l3doc +\makeatletter +\def\MaintainedBy#1{\gdef\@maintainedby{#1}} +\let\@maintainedby\@empty +\def\MaintainedByLaTeXTeam#1{% +{\gdef\@maintainedby{% +This file is maintained by the \LaTeX{} Project team.\\% +Bug reports can be opened (category \texttt{#1}) at\\% +\url{https://latex-project.org/bugs.html}.}}} +\def\@maketitle{% + \newpage + \null + \vskip 2em% + \begin{center}% + \let \footnote \thanks + {\LARGE \@title \par}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large \@date}% + \ifx\@maintainedby\@empty + \else + \vskip 1em% + \fbox{\fbox{\begin{tabular}{@{}l@{}}\@maintainedby\end{tabular}}}% + \fi + \end{center}% + \par + \vskip 1.5em} +\makeatother % undo the default is not used: @@ -817,6 +893,29 @@ % \end{macrocode} % % +% \section{A note on the updates done December 2023} +% +% 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 +% currently somewhat clattered, unfortunately. Eventually this will all move to L3 +% programming layer but this will take time. +% +% +% \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn +% \end{macrocode} +% +% +% +% +% % \section{The construction of the preamble} % % \DeleteShortVerb{\"} @@ -972,6 +1071,7 @@ % =\@chclass= and =\@chnum=. % \changes{v2.0f}{1992/02/29}{Argument removed since implicitly known} % \begin{macrocode} +\ExplSyntaxOff \def\@testpach{\@chclass % \end{macrocode} % First we deal with the cases in which the \textsf{token} @@ -981,7 +1081,7 @@ \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else \ifnum \@lastchclass=7 5 \else \ifnum \@lastchclass=8 \tw@ \else - \ifnum \@lastchclass=9 \thr@@ + \ifnum \@lastchclass=9 \thr@@@@ % \end{macrocode} % Otherwise we will assume that the \textsf{token} belongs to the % class $0$ @@ -1032,7 +1132,7 @@ % \begin{macrocode} 10 \@chnum - \if \@nextchar m\thr@@\else + \if \@nextchar m\thr@@@@ \else \if \@nextchar p4 \else \if \@nextchar b5 \else % \end{macrocode} @@ -1042,6 +1142,7 @@ % \begin{macrocode} \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi} +\ExplSyntaxOn % \end{macrocode} % \end{macro} % @@ -1062,10 +1163,10 @@ % they are in explicit braces, as in =@{*}=. % % This macro is called via -% =\@xexpast=\meta{preamble}=*0x\@@=. +% =\@xexpast=\meta{preamble}=*0x\@@@@=. % The $*$--expression =*0x= is being used to terminate the % recursion, -% as we shall see later, and =\@@= serves as an argument +% as we shall see later, and =\@@@@= serves as an argument % delimiter. =\@xexpast= has four arguments. The first % one is the part of the % user preamble before the first $*$--expression while the second @@ -1074,7 +1175,7 @@ % above). % The fourth argument is the rest of the preamble. % \begin{macrocode} -\def\@xexpast#1*#2#3#4\@@{% +\def\@xexpast#1*#2#3#4\@@@@{% % \end{macrocode} % The number of copies of \textit{String} (=#2=) that are to be % produced will be saved in a \textsf{count} register. @@ -1111,7 +1212,7 @@ % \end{macrocode} % If \textit{N\/} was greater than zero we prepare for another call % of =\@xexpast=. Otherwise we assume we have reached the end of -% the user preamble, because we had appended =*0x\@@= when we first +% the user preamble, because we had appended =*0x\@@@@= when we first % called =\@xexpast=. In other words: if the user inserts % =*{0}{..}= in his preamble, \LaTeX\ ignores the rest of it. % \begin{macrocode} @@ -1133,7 +1234,7 @@ % $*$--expression is handled, or to the macro =\@xexnoop=, % which only ends the recursion by deleting its argument. % \begin{macrocode} - \expandafter \@tempb \@tempa #4\@@} + \expandafter \@tempb \@tempa #4\@@@@} % \end{macrocode} % \end{macro} % \end{macro} @@ -1142,10 +1243,10 @@ % \begin{macro}{\@xexnoop} % So the first big problem is solved. Now it is easy to % specify =\@xexnoop=. -% Its argument is delimited by =\@@= and it simply expands to +% Its argument is delimited by =\@@@@= and it simply expands to % nothing. % \begin{macrocode} -% \def\@xexnoop#1\@@{} +% \def\@xexnoop#1\@@@@{} % \end{macrocode} % \end{macro} % @@ -1275,6 +1376,13 @@ % \begin{macrocode} \def\insert@column{% % \end{macrocode} +% +% For tagging we insert as special socket, that adds the necessary +% PDF tag at the beginning of the cell if tagging is enabled. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/cell/begin}% +% \end{macrocode} % Here, we assume that the \textsf{count} register % =\@tempcnta= has saved the value $=\count@= - 1$. % \begin{macrocode} @@ -1302,12 +1410,36 @@ % \changes{v2.0c}{1990/08/14}{\cs{relax} added to avoid problem % \cs{the}\cs{toks0}\cs{the}\cs{toks1}.} % \begin{macrocode} - \the@toks \the \count@ \relax} + \the@toks \the \count@ \relax +% \end{macrocode} +% +% And another socket for tagging that adds the necessary closing tag +% if enabled. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/cell/end}% +} % \end{macrocode} % \end{macro} % \end{macro} % % +% \begin{macro}{\insert@pcolumn} +% Handling pcolumn-cells needs slightly different handling when +% doing tagging. Rather than changing the plugs in +% \cs{insert@column} back and forth, we simply use a different +% version of \cs{insert@column} that has its own sockets. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} +\def\insert@pcolumn{% + \UseTaggingSocket{tbl/pcell/begin}% + \the@toks \the \@tempcnta + \ignorespaces \@sharp \unskip + \the@toks \the \count@ \relax + \UseTaggingSocket{tbl/pcell/end}% +} +% \end{macrocode} +% \end{macro} % % % \subsection{The separation of columns} @@ -1321,11 +1453,24 @@ % =\@addamp=, the macro that inserts the =&=. % \begin{macrocode} % \newif \@iffirstamp -% \def\@addamp{\if@firstamp \@firstampfalse -% \else \@addtopreamble &\fi} +\def\@addamp { + \if@firstamp + \@firstampfalse + \else +% \end{macrocode} +% If we are after the first column we have to insert a \verb=&= and +% also update the cell data. +% \changes{v2.6a}{2023/12/11}{Managing cell indexes} +% \begin{macrocode} + \edef\@preamble{\@preamble & + \noexpand\tbl_update_cell_data: } + \fi +} % \end{macrocode} % \end{macro} % +% +% % \begin{macro}{\@acol} % \begin{macro}{\@acolampacol} % \begin{macro}{\col@sep} @@ -1393,7 +1538,7 @@ % command =\@xexpast=. As we already know, this command saves % its result in the macro =\@tempa=. % \begin{macrocode} -% \@xexpast #1*0x\@@ +% \@xexpast #1*0x\@@@@ % \end{macrocode} % Afterwards we initialize all registers and macros, that we need % for the build-up of the preamble. @@ -1477,7 +1622,7 @@ % \texttt{r}, \texttt{p},\texttt{m} or \texttt{b}. We report an % error and ignore the declaration given by ={..}=. % \begin{macrocode} -% \@preamerr \thr@@ \or +% \@preamerr \thr@@@@ \or % \end{macrocode} % If =\@lastchclass= is $4$ the user preamble has been empty. % To continue, we insert a =#= in the preamble. @@ -1671,18 +1816,17 @@ \setbox\ar@mcellbox\vbox % \end{macrocode} % The part of the templates which is the same in all three cases -% (\texttt{p}, \texttt{m} and \texttt{b}) -% is built by the macros =\@startpbox= and -% =\@endpbox=. =\@startpbox= has an argument: -% the width of the column which is stored in the current -% \textsf{token} (i.e.\ =\@nextchar=). -% Between these two macros we find the well known -% =\insert@column=. -% The strut is places after the box +% (\texttt{p}, \texttt{m} and \texttt{b}) is built by the macros +% =\@startpbox= and =\@endpbox=. =\@startpbox= has an argument: the +% width of the column which is stored in the current \textsf{token} +% (i.e.\ =\@nextchar=). Between these two macros we find the well +% known =\insert@column= or rather the variant for tagging: +% \cs{insert@pcolumn}. The strut is placed after the box. % \changes{v2.4e}{2016/10/07}{Fixing SX68732} % \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}} +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} % \begin{macrocode} - \@startpbox{\@nextchar}\insert@column \@endpbox + \@startpbox{\@nextchar}\insert@pcolumn \@endpbox \ar@align@mcell \do@row@strut \or % \end{macrocode} @@ -1690,9 +1834,10 @@ % same way though we do not need the =$= characters because we use % =\vtop= or =\vbox=. % \changes{v2.4e}{2016/10/07}{Fixing SX68732} +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} % \begin{macrocode} - \vtop \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut \or - \vbox \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut + \vtop \@startpbox{\@nextchar}\insert@pcolumn \@endpbox\do@row@strut \or + \vbox \@startpbox{\@nextchar}\insert@pcolumn \@endpbox\do@row@strut % \end{macrocode} % Other values for =\@chnum= are impossible. Therefore we % end the arguments to =\@addtopreamble= and =\ifcase=. @@ -1783,8 +1928,8 @@ % So the declarations defined by the first =>{...}= % are ignored. % \begin{macrocode} -%\def\@classix{\ifnum \@lastchclass = \thr@@ -% \@preamerr \thr@@ \fi +%\def\@classix{\ifnum \@lastchclass = \thr@@@@ +% \@preamerr \thr@@@@ \fi % \end{macrocode} % Furthermore, we call up =\@class10= because afterwards always a % new column is started by \texttt{c}, \texttt{l}, \texttt{r}, @@ -1836,14 +1981,14 @@ % We only check if the last \textsf{token} was of class $3$ which is % forbidden. % \begin{macrocode} -\def\@classvii{\ifnum \@lastchclass = \thr@@ +\def\@classvii{\ifnum \@lastchclass = \thr@@@@ % \end{macrocode} % If this is true we output an error message and % ignore the declarations stored % by the last =>{...}=, because these are overwritten % by the argument of \texttt{@}. % \begin{macrocode} - \@preamerr \thr@@ \fi} + \@preamerr \thr@@@@ \fi} % \end{macrocode} % \end{macro} % @@ -2032,7 +2177,7 @@ % second one describes the wanted preamble, % e.g.\ it has the form =|c|c|c|=. % \begin{macrocode} -\def\@array[#1]#2{% +\def\@array[#1]#2{ % \end{macrocode} % First we define a \textsf{strut} whose size basically corresponds % to a normal \textsf{strut} multiplied by the factor @@ -2051,6 +2196,14 @@ \@depth \arraystretch \dp \strutbox \@width \z@}% % \end{macrocode} +% The total number of table columns of the current table is +% determined in \cs{tbl_count_table_cols:} but this is called in +% a group, so local settings do not survive. Thus, to save away the +% outer value of \cs{g_@@_table_cols_tl} we do it before the group. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \tbl_save_outer_table_cols: +% \end{macrocode} % Then we open a group, in which the user preamble is evaluated by % the macro =\@mkpream=. As we know this must happen locally. % This macro creates a preamble for a =\halign= and saves @@ -2059,6 +2212,11 @@ \begingroup \@mkpream{#2}% % \end{macrocode} +% Figure out how many columns this table has: +% \changes{v2.6a}{2023/12/11}{Managing cell indexes} +% \begin{macrocode} + \tbl_count_table_cols: +% \end{macrocode} % We again redefine =\@preamble= so that a call up of =\@preamble= % now starts the =\halign=. Thus also the arguments of \texttt{>}, % \texttt{<}, \texttt{@} and \texttt{!}, saved in the @@ -2085,13 +2243,38 @@ % unsupported redefinition of a \TeX{} primitive for the moment (as people rely % on that experimental code). % \begin{macrocode} - \xdef\@preamble{\noexpand \ialign \@halignto - \bgroup \@arstrut \@preamble - \tabskip \z@ \cr}% + \xdef\@preamble{ +% \end{macrocode} +% \cs{ialign} in the original definition is replaced by +% \cs{ar@ialign} defined below. This does what \cs{ialign} does but +% additionally handles the tagging structure for the whole table if necessary. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \noexpand \ar@ialign + \@halignto + \bgroup \@arstrut % \end{macrocode} % What we have not explained yet is the macro =\@halignto= % that was just used. Depending on its replacement text the % =\halign= becomes a =\halign= \texttt{to} \meta{dimen}. +% +% Next, a tagging support socket is inserted adding the start row tag. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/row/begin} +% \end{macrocode} +% At the start of the preamble for the first column we call +% \cs{tbl_init_cell_data_for_row:} to initialize the cell index data. In +% later columns this data is updated via \cs{tbl_update_cell_data:}. +% \changes{v2.6a}{2023/12/11}{Managing cell indexes} +% \begin{macrocode} + \tbl_init_cell_data_for_row: +% \end{macrocode} +% +% \begin{macrocode} + \@preamble + \tabskip \z@ \cr} +% \end{macrocode} % Now we close the group again. Thus % =\@startpbox= and =\@endpbox= as well as all % \textsf{token} registers get their former meaning back. @@ -2128,12 +2311,16 @@ % around every column in the \textsf{array}--environment % the parameter =\mathsurround= should % also be set to \textsf{0pt}. This prevents additional space between -% the rows. The -% \PlainTeX--macro =\m@th= does this. +% the rows. % \begin{macrocode} \lineskip \z@ \baselineskip \z@ - \m@th +% \end{macrocode} +% Don't use \cs{m@th} here as that signals to the math taggingg +% code that this is fake math that should not be tagged. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \mathsurround \z@ % \end{macrocode} % Beside, we have to assign a special meaning (which we still have % to specify) to the line separator =\\=. We also have to @@ -2144,10 +2331,61 @@ % start the wanted =\halign=. % \changes{1994/12/08}{v2.3b}{add \cs{tabularnewline}} % \begin{macrocode} - \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble} + \let\\\@arraycr \let\tabularnewline\\\let\par\@empty +% \end{macrocode} +% Another socket for tagging. TODO: what about \cs{arrayleft} above? +% \begin{macrocode} + \UseTaggingSocket{tbl/init} +% \end{macrocode} +% +% \begin{macrocode} + \@preamble +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\ar@ialign} +% A new command that replaces \cs{ialign} used previously. \cs{everycr} is +% also applied to the \cs{cr} ending the preamble so we have to +% program around that. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} +\def\ar@ialign{% +% \end{macrocode} +% Before starting a table we have to initialize the variables +% holding row and column information for cells. We also have +% locally store the information related to the current cell (if we +% are already inside a table) so that we can restore it once the +% inner table is finished. +% \changes{v2.6a}{2023/12/11}{Managing cell indexes} +% \begin{macrocode} + \tbl_init_cell_data_for_table: +% \end{macrocode} +% +% \begin{macrocode} + \everycr{% + \noalign{% +% \end{macrocode} +% If this \cs{cr} was at the end of a real row (e.g., not at the +% end of the table preamble) we have add a row end tag. +% \begin{macrocode} + \tbl_if_row_was_started:T { \UseTaggingSocket{tbl/row/end} } +% \end{macrocode} +% The we prepare for the next row. +% \begin{macrocode} + \tbl_update_cell_data_for_next_row: + }% + }% + \tabskip\z@skip\halign} % \end{macrocode} % \end{macro} % +% +% +% +% % \begin{macro}{\arraybackslash} % \changes{v2.4a}{2003/12/17}{(DPC) Macro added (from tabularx)} % Restore =\\= for use in array and tabular environment (after @@ -2182,7 +2420,27 @@ % \begin{macro}{\@arraycr} % In the macro =\@array= the line separator =\\= is % =\let= to the command =\@arraycr=. -% Its definition starts with a special brace which I have directly +% \changes{v2.3c}{1995/04/23}{Avoid adding an ord atom in math} +% \changes{v2.5e}{2021/04/20}{Use \cs{protected} for \cs{\bslash} variant (gh/548)} +% \begin{macrocode} +\protected\def\@arraycr { +% \end{macrocode} +% Add code that figures out if the current table row is incomplete +% (not enough \verb=&=s). It can then do extra actions, such as +% inserting missing cell tags. +% \changes{v2.6a}{2023/12/11}{Managing cell indexes} +% \begin{macrocode} + \tbl_count_missing_cells:n {@arraycr} +% \end{macrocode} +% TODO: maybe this is also the right place to add a socket that +% could be used to actually enter missing cells instead of just +% adding tagging structures for them later. This would be optional +% but in many cases it would be the right thing to do (for example +% if tables contain vertical lines or similar visual structures +% that require fully specified rows. +% +% +% We then start a special brace which I have directly % copied from the original definition. It is % necessary, because the =\futurlet= in =\@ifnextchar= % might @@ -2198,10 +2456,8 @@ % =\halign= while we are looking for a =*= or =[=. % For further information see % \cite[Appendix D]{bk:knuth}. -% \changes{v2.3c}{1995/04/23}{Avoid adding an ord atom in math} -% \changes{v2.5e}{2021/04/20}{Use \cs{protected} for \cs{\bslash} variant (gh/548)} % \begin{macrocode} -\protected\def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi + \iffalse{\fi\ifnum 0=`}\fi % \end{macrocode} % Then we test whether the user is using the star form and ignore % a possible star (I also disagree with this procedure, because a @@ -2210,6 +2466,11 @@ \@ifstar \@xarraycr \@xarraycr} % \end{macrocode} % \end{macro} + + + + + % % \begin{macro}{\@xarraycr} % In the command =\@xarraycr= we test if an optional argument @@ -2301,6 +2562,7 @@ % the result column and the actual column entry. % \changes{v2.3j}{1998/01/29}{Command made \cs{long} to match % kernel change for pr/2180} +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} % \begin{macrocode} \long\def\multicolumn#1#2#3{% % \end{macrocode} @@ -2310,6 +2572,16 @@ % \begin{macrocode} \multispan{#1}\begingroup % \end{macrocode} +% For tagging support we have to solve two problems: +% \cs{multicolumn} must handle the row begin if it is used there, +% and it must save the numbers of cells it spans so that we can add +% a suitable ColSpan attribute. We do this in the next macro +% (which in turn calls the \texttt{tbl/row/begin} socket, if +% necessary). +% \changes{v2.6a}{2023/12/11}{Managing cell indexes} +% \begin{macrocode} + \tbl_update_multicolumn_cell_data:n {#1} +% \end{macrocode} % Since a =\multicolumn= should only describe the format of a % result column, we redefine =\@addamp= in such a way that one gets % an error message if one uses more than one \texttt{c}, @@ -2336,6 +2608,12 @@ % \begin{macrocode} \endgroup % \end{macrocode} +% Now we update the colspan attribute. This needs setting after +% the group as it is hidden inside the plug in \cs{insert@column}. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/colspan}{#1}% +% \end{macrocode} % In the special situation of =\multicolumn= =\@preamble= % is not needed as preamble for a =\halign= but it is directly % inserted into our table. Thus instead of =\sharp= @@ -2458,6 +2736,12 @@ % \begin{macrocode} \leavevmode % \end{macrocode} +% Now that we know we are in hmode we can add the start tag for the +% whole table. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/hmode/begin}% +% \end{macrocode} % It should be taken into consideration that the macro =\@array= % must be called in math mode. Therefore we open a \textsf{box}, % insert a =$= and then assign the correct values to =\col@sep= and @@ -2486,11 +2770,41 @@ % =\@array=. To save \textsf{token} space we then redefine % =\@preamble= % because its replacement text isn't longer needed. +% +% To handle cell indexes, we do not use \cs{crcr} but a variant +% that also handles missing cells as necessary. +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} +\def\endarray { + \tbl_crcr:n{endarray} \egroup + \UseTaggingSocket{tbl/finalize} +% \end{macrocode} +% +% If tables are nested into another then it is necessary to +% restore information about the cell the inner table started +% in. Otherwise, the cell index data structures reflect the +% status in the outer table as they +% are globally manipulated. We restore in all cases even if we are +% not in a nesting situation as that makes the code simpler (and +% probably faster). +% +% \cs{endtabular} and \cs{endtabular*} inherit from \cs{endarray} +% so we only need to change that. \texttt{tabularx} uses a similar method. +% \changes{v2.6a}{2023/12/11}{Managing cell indexes} % \begin{macrocode} -%\def\endarray{\crcr \egroup \egroup \gdef\@preamble{}} + \tbl_restore_outer_cell_data: +% \end{macrocode} +% +% \begin{macrocode} + \egroup + \@arrayright \gdef\@preamble{}% +} % \end{macrocode} % \end{macro} % +% +% +% % \begin{macro}{\endtabular} % \begin{macro}{\endtabular*} % To end a \textsf{tabular} or \textsf{tabular$*$} environment we @@ -2499,7 +2813,13 @@ % any =\mathsurround= so we cancel that with =\m@th=. % \changes{v2.5f}{2021/07/12}{Cancel any outside \cs{mathsurround} (gh/614)} % \begin{macrocode} -\def\endtabular{\endarray\m@th $\egroup} +\def\endtabular{\endarray\m@th $\egroup +% \end{macrocode} +% +% \changes{v2.6a}{2023/12/11}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/hmode/end}% +} \expandafter\let\csname endtabular*\endcsname=\endtabular % \end{macrocode} % \end{macro} @@ -2518,7 +2838,7 @@ \let\@arrayclassiv=\relax \let\@arrayclassz=\relax \let\@tabclassiv=\relax \let\@tabclassz=\relax \let\@arrayacol=\relax \let\@tabacol=\relax -\let\@tabularcr=\relax \let\@@endpbox=\relax +\let\@tabularcr=\relax \let\@@@@endpbox=\relax \let\@argtabularcr=\relax \let\@xtabularcr=\relax % \end{macrocode} % @@ -2576,6 +2896,7 @@ % to define letters, to be used in the same way as the primitive % column specifiers, `c' `p' etc. % \begin{macrocode} +\ExplSyntaxOff % this is really oldstyle using \@tfor := \def\newcolumntype#1{% % \end{macrocode} % "\NC@char" was added in V2.01 so that active characters, like "@" in @@ -2615,6 +2936,7 @@ % If an optional argument was not given, give a default argument of 0. % \begin{macrocode} \@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}} +\ExplSyntaxOn % \end{macrocode} % \end{macro} % \begin{macro}{\newcol@} @@ -2710,16 +3032,18 @@ % produced and then "\typeout" the required string. % \begin{macrocode} \def\NC@show#1{% - \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip - \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}} + \typeout{Column~ #1\expandafter\expandafter\expandafter\NC@strip + \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@@@}} % \end{macrocode} % \end{macro} % \begin{macro}{\NC@strip} % Delimit the arguments to "\NC@strip" with `\texttt{:}', `\texttt{->}', -% a space, and "\@@" to pull out the required parts of the output from +% a space, and "\@@@@" to pull out the required parts of the output from % "\meaning". % \begin{macrocode} -\def\NC@strip#1:#2->#3 #4\@@{#2 -> #4} +\ExplSyntaxOff +\def\NC@strip#1:#2->#3 #4\@@@@{#2 -> #4} +\ExplSyntaxOn % \end{macrocode} % \end{macro} % \begin{macro}{\NC@list} @@ -2807,6 +3131,7 @@ % \changes{v2.4e}{2016/10/07}{Fixing SX68732} % \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}} % \begin{macrocode} +\ExplSyntaxOff % really oldstyle using \@tfor := \def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue \let\@sharp\relax % \end{macrocode} @@ -2869,11 +3194,12 @@ \@acol \or \or \@acol \or - \@preamerr \thr@@ \or + \@preamerr \thr@@@@ \or \@preamerr \tw@ \@addtopreamble\@sharp \or \or \else \@preamerr \@ne \fi \def\the@toks{\the\toks}} +\ExplSyntaxOn % \end{macrocode} % \end{macro} % @@ -2908,7 +3234,7 @@ % \texttt{array.sty} 2.0h. % \begin{macrocode} \def\@classv{\save@decl - \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@ + \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@@@@ \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}% \prepnext@tok} % \end{macrocode} @@ -2920,7 +3246,7 @@ % second "\extracolsep", there is no point in the user entering two of % these commands anyway, so this is not really a restriction. % \begin{macrocode} -\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}% +\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@@@@{\def\@tempa{#2}% \ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi} %</ncols> % \end{macrocode} @@ -2936,28 +3262,27 @@ % % \begin{macro}{\@tabarray} % This macro tests for an optional bracket and then calls up -% "\@@array" or "\@@array[c]" (as default). +% "\@@@@array" or "\@@@@array[c]" (as default). % \begin{macrocode} %<*package> -\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}} +\def\@tabarray{\@ifnextchar[{\@@@@array}{\@@@@array[c]}} % \end{macrocode} % \end{macro} -% \begin{macro}{\@@array} +% \begin{macro}{\@@@@array} % This macro tests could then test an optional delimiter before the % left brace of the main preamble argument. Here in the main package % it simply is let to be "\@array". % \begin{macrocode} -\let\@@array\@array +\let\@@@@array\@array % \end{macrocode} % \end{macro} % -% \begin{macro}{\endarray} +% \begin{macro}{\@arrrayleft} % \begin{macro}{\@arrayright} % We have to declare the hook we put into "\@array" above. -% A similar hook `"\@arrayright"' will be inserted into the +% A similar hook \cs{@arrayright} will be inserted into the % "\endarray" to gain control. Both defaults to empty. % \begin{macrocode} -\def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}} \let\@arrayleft\@empty \let\@arrayright\@empty % \end{macrocode} @@ -3182,6 +3507,14 @@ % \end{macro} % % +% +% +% +% \begin{macrocode} +\ExplSyntaxOff +% \end{macrocode} +% +% % \PrintIndex % \PrintChanges % diff --git a/macros/latex-dev/required/tools/array.pdf b/macros/latex-dev/required/tools/array.pdf Binary files differindex 9cf73a7e98..87880c97fb 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.dtx b/macros/latex-dev/required/tools/bm.dtx index a608c6aeb5..d7d6eb54ee 100644 --- a/macros/latex-dev/required/tools/bm.dtx +++ b/macros/latex-dev/required/tools/bm.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. @@ -22,7 +22,7 @@ % \fi % % \iffalse -%% Copyright 1996 1997 1998 1999 2002 2003 2004 2016 2017 2019 2021 2022 +%% Copyright 1996 1997 1998 1999 2002 2003 2004 2016 2017 2019 2021 2022 2023 %% David Carlisle Frank Mittelbach %% %% Development of this package was commissioned by Y&Y Inc. @@ -36,7 +36,7 @@ %<driver>\ProvidesFile{bm.drv} % \fi % \ProvidesFile{bm.dtx} - [2023/07/08 v1.2f Bold Symbol Support (DPC/FMi)] + [2023/12/19 v1.2f Bold Symbol Support (DPC/FMi)] % % \iffalse %<*driver> @@ -178,14 +178,14 @@ % spacing). So the third example produces identical output to the first % (but \TeX\ takes more time producing it). % -% In the fourth example the |\mathrm{\bm{g}}| is essentially +% In the fourth example the |\mathrm{\bm{{g}}}| is essentially % equivalent to |\mathrm{\mbox{\boldmath$g$}}|. Currently math alphabet % settings are not passed down to `nested' math lists, and so in this % example, the |\mathrm| has no effect, and a bold math italic $\bm g$ % is obtained. % % Similarly the last example is equivalent to -% |$\mbox{\boldmath$\mathrm{g}$}}| and so in this case, one obtains a +% |$\mbox{\boldmath$\mathrm{g}$}$| and so in this case, one obtains a % bold roman \textbf{g}. % % \subsection{Delimiters} diff --git a/macros/latex-dev/required/tools/bm.ins b/macros/latex-dev/required/tools/bm.ins index a7424a0e67..c0c8125d10 100644 --- a/macros/latex-dev/required/tools/bm.ins +++ b/macros/latex-dev/required/tools/bm.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug reports for it can be opened at https://latex-project.org/bugs/ (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/required/tools/bm.pdf b/macros/latex-dev/required/tools/bm.pdf Binary files differindex c39e17aca0..1f9efb0b02 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.dtx b/macros/latex-dev/required/tools/calc.dtx index 2c4cecbf03..154c6ba26a 100644 --- a/macros/latex-dev/required/tools/calc.dtx +++ b/macros/latex-dev/required/tools/calc.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/calc.pdf b/macros/latex-dev/required/tools/calc.pdf Binary files differindex 4c0230c693..3cff423972 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 7b38392bd4..ebf705e687 100644 --- a/macros/latex-dev/required/tools/changes.txt +++ b/macros/latex-dev/required/tools/changes.txt @@ -5,11 +5,51 @@ completeness or accuracy and it contains some references to files that are not part of the distribution. ======================================================================= +2024-01-22 Lars Madsen <daleif@math.au.dk> + + * verbatim.dtx: added TAB marking support to \verbatiminput* (gh/1245) + +2023-12-16 David Carlisle <David.Carlisle@latex-project.org> + + * showkeys.dtx: avoid adding extra box to \@lables gh/1123 + +2023-12-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * longtable.dtx: + Support for tagged PDF + Manage and provide cell indexes + +2023-12-12 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * array.dtx: + Support for tagged PDF + Manage and provide cell indexes + +2023-12-11 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * tabularx.dtx: + Require newer LaTeX kernel (that supports tagging) + Suspend any tagging while doing trial typesetting + +2023-11-10 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * multicol.dtx (subsection{Maintaining the mark registers}]): + Get rid of forced breaks for mark extraction (gh/1130) + ================================================================================ All changes above are only part of the development branch for the next release. ================================================================================ ######################### +# 2023-11-01c Release +######################### + +2023-11-06 Frank Mittelbach <Frank.Mittelbach@latex-project.org> + + * verbatim.dtx (subsection{Preliminaries}): + Update code so that \verb does not show visible spaces (gh/1160) + +######################### # 2023-11-01b Release ######################### @@ -23,8 +63,8 @@ All changes above are only part of the development branch for the next release. 2023-08-25 Ulrike Fischer <Ulrike.Fischer@latex-project.org> - * longtable.dtx: use \everypar to insert the strut in \LT@startpbox - to match the array use, github/1128 + * longtable.dtx: use \everypar to insert the strut in \LT@startpbox + to match the array use, github/1128 ######################### # 2023-06-01 Release diff --git a/macros/latex-dev/required/tools/dcolumn.dtx b/macros/latex-dev/required/tools/dcolumn.dtx index c8ddaf4ce6..feb3096cce 100644 --- a/macros/latex-dev/required/tools/dcolumn.dtx +++ b/macros/latex-dev/required/tools/dcolumn.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/dcolumn.pdf b/macros/latex-dev/required/tools/dcolumn.pdf Binary files differindex 967e011d28..588505c218 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.dtx b/macros/latex-dev/required/tools/delarray.dtx index 86a1a6203f..61d40b5c74 100644 --- a/macros/latex-dev/required/tools/delarray.dtx +++ b/macros/latex-dev/required/tools/delarray.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/delarray.pdf b/macros/latex-dev/required/tools/delarray.pdf Binary files differindex 1a8212075a..1fe65b8c75 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.dtx b/macros/latex-dev/required/tools/enumerate.dtx index 2818a73a09..c3889a9157 100644 --- a/macros/latex-dev/required/tools/enumerate.dtx +++ b/macros/latex-dev/required/tools/enumerate.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/enumerate.pdf b/macros/latex-dev/required/tools/enumerate.pdf Binary files differindex 17a894442e..66a10c9002 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.dtx b/macros/latex-dev/required/tools/fileerr.dtx index eef222bb6e..0e8eeb1ffb 100644 --- a/macros/latex-dev/required/tools/fileerr.dtx +++ b/macros/latex-dev/required/tools/fileerr.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/fileerr.pdf b/macros/latex-dev/required/tools/fileerr.pdf Binary files differindex 3fc612b3d8..102b8c865d 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.dtx b/macros/latex-dev/required/tools/fontsmpl.dtx index 525065cde5..6e9835e20e 100644 --- a/macros/latex-dev/required/tools/fontsmpl.dtx +++ b/macros/latex-dev/required/tools/fontsmpl.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/fontsmpl.pdf b/macros/latex-dev/required/tools/fontsmpl.pdf Binary files differindex 61648a2c33..a40e5d5566 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.dtx b/macros/latex-dev/required/tools/ftnright.dtx index 663fa304a9..a3826376db 100644 --- a/macros/latex-dev/required/tools/ftnright.dtx +++ b/macros/latex-dev/required/tools/ftnright.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/ftnright.pdf b/macros/latex-dev/required/tools/ftnright.pdf Binary files differindex 2a4e24a432..e7f13295c7 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.dtx b/macros/latex-dev/required/tools/hhline.dtx index 49ac1ae208..b2d833d965 100644 --- a/macros/latex-dev/required/tools/hhline.dtx +++ b/macros/latex-dev/required/tools/hhline.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/hhline.pdf b/macros/latex-dev/required/tools/hhline.pdf Binary files differindex d8f969b7b0..c8484ff875 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.dtx b/macros/latex-dev/required/tools/indentfirst.dtx index 2314db1c70..9bbe1871e1 100644 --- a/macros/latex-dev/required/tools/indentfirst.dtx +++ b/macros/latex-dev/required/tools/indentfirst.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/indentfirst.pdf b/macros/latex-dev/required/tools/indentfirst.pdf Binary files differindex 235e364993..96440b6c57 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/layout.dtx b/macros/latex-dev/required/tools/layout.dtx index 2798bd4f60..a2fc87a6a5 100644 --- a/macros/latex-dev/required/tools/layout.dtx +++ b/macros/latex-dev/required/tools/layout.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/layout.pdf b/macros/latex-dev/required/tools/layout.pdf Binary files differindex 4e0722c710..b2d34d40fc 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 2a61ab0c87..5a23f3ecb3 100644 --- a/macros/latex-dev/required/tools/longtable.dtx +++ b/macros/latex-dev/required/tools/longtable.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. @@ -37,7 +37,7 @@ %<driver> \ProvidesFile{longtable.drv} % \fi % \ProvidesFile{longtable.dtx} - [2023-11-01 v4.19 Multi-page Table package (DPC)] + [2023-12-16 v4.19 Multi-page Table package (DPC)] % % \iffalse %<*driver> @@ -1048,6 +1048,14 @@ \if@twocolumn \LT@err{longtable not in 1-column mode}\@ehc \fi +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/vmode/begin}% +% \end{macrocode} +% +% \begin{macrocode} \begingroup % \end{macrocode} % Check for an optional argument. @@ -1056,7 +1064,14 @@ % \end{macrocode} % \end{macro} % +% +% % \begin{macro}{\LT@array} +% \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn +% \end{macrocode} +% % Start setting the alignment. % Based on "\@array" from the \LaTeX\ kernel % and the \package{array} package. @@ -1066,7 +1081,43 @@ % so that "\caption" works correctly. % \begin{macrocode} \def\LT@array[#1]#2{% - \refstepcounter{table}\stepcounter{LT@tables}% +% \end{macrocode} +% +% With respect to tagging we have a complicated situation with +% longtable. When at the begin the \cs{endhead}, +% \cs{endfirsthead}, \cs{endfoot} and \cs{endlastfoot} are used to +% setup head and foot they create each a structure subtree with one or +% more rows. From these structures we want to keep at most two (head +% and foot) and move the foot to the end of the table. When the head +% and foot boxes are (re)inserted on following pages we want to mark +% them up as artifact with the exception of the head at the begin and +% the foot box at the end. +% +% TODO: When a line is killed the structure subtree is there already +% too and must be removed. If hard to do, then maybe at first warn if the +% construction is used. +% +% \cs{LT@array} is executed in a group, so we can disable para-tagging here. +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/init} + \@kernel@refstepcounter{table}\stepcounter{LT@tables} +% \end{macrocode} +% The target is created rather late and a \cs{label} can come earlier, +% so we have to define \cs{@currentHref} explicitly. We can't currently +% assume that \cs{theHtable} is defined always. +% \begin{macrocode} + \tl_gset:Ne \@currentHref {table.\cs_if_exist_use:N\theHtable} +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_gzero_row_count: +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/longtable/init} % \end{macrocode} % Set up the glue around the table if an optional argument given. % \begin{macrocode} @@ -1101,17 +1152,18 @@ % here so that you can load the \package{array} package before or after % \package{longtable}. % \begin{macrocode} - \let\LT@@tabarray\@tabarray - \let\LT@@hl\hline + \let\LT@@@@tabarray\@tabarray + \let\LT@@@@hl\hline \def\@tabarray{% - \let\hline\LT@@hl + \let\hline\LT@@@@hl % \end{macrocode} %\begin{verbatim} % \let\multicolumn\LT@mcol %\end{verbatim} % \begin{macrocode} - \LT@@tabarray}% - \let\\\LT@tabularcr\let\tabularnewline\\% + \LT@@@@tabarray}% + \let\\\LT@tabularcr + \let\tabularnewline\\% \def\newpage{\noalign{\break}}% % \end{macrocode} % \changes{v4.05}{1996/11/12} @@ -1128,8 +1180,8 @@ % \end{macrocode} % % \changes{v4.08}{1998/01/20} -% {Move \cs{@endpbox} definition earlier and define \cs{@@endpbox} -% and \cs{@@startpbox} for non-array case. tools/2736} +% {Move \cs{@endpbox} definition earlier and define \cs{@@@@endpbox} +% and \cs{@@@@startpbox} for non-array case. tools/2736} % \begin{macrocode} \let\@endpbox\LT@endpbox % \end{macrocode} @@ -1142,8 +1194,8 @@ \let\@acol\@tabacol \let\@classz\@tabclassz \let\@classiv\@tabclassiv \def\@startpbox{\vtop\LT@startpbox}% - \let\@@startpbox\@startpbox - \let\@@endpbox\@endpbox + \let\@@@@startpbox\@startpbox + \let\@@@@endpbox\@endpbox \let\LT@LL@FM@cr\@tabularcr \else % \end{macrocode} @@ -1172,6 +1224,11 @@ \begingroup \@mkpream{#2}% % \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_count_table_cols: +% \end{macrocode} % We need to rename "\@preamble" here as F.M.'s scheme uses % "\global", and we may need to nest "\@mkpream", eg for % "\multicolumn" @@ -1180,6 +1237,11 @@ % \begin{macrocode} \xdef\LT@bchunk{% % \end{macrocode} +% We aren't inside any row when a chunk starts. +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_inbetween_rows: +% \end{macrocode} % \changes{v4.00}{1996/04/08} % {(DK) Increment Chunk counter} % \begin{macrocode} @@ -1205,7 +1267,21 @@ % \begin{macrocode} \tabskip\LTleft \noexpand\halign to\hsize\bgroup % \tabskip\LTleft\halign to\hsize\bgroup - \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}% + \tabskip\z@ \@arstrut +% \end{macrocode} +% Insert the tagging socket to start the row and initialize the cell +% data for the row. +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/row/begin}% +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_init_cell_data_for_row: +% \end{macrocode} +% \begin{macrocode} + \@preamble \tabskip\LTright \cr}% \endgroup % \end{macrocode} % Find out how many columns we have (store in "\LT@cols"). @@ -1220,11 +1296,57 @@ % A few more internal commands for \env{longtable}. % \begin{macrocode} \m@th\let\par\@empty - \everycr{}\lineskip\z@\baselineskip\z@ +% \end{macrocode} +% Tagging socket and conditional +% \begin{macrocode} + \everycr{% + \noalign{% +% \end{macrocode} +% In \pkg{longtable} we have a bunch of extra \cs{cr}s that are +% executed whenever a chunk ends. In that case they should not +% increment the main row counter, sigh. +% +% TODO: At the moment this tracing still exposes the internal row counter! +% \begin{macrocode} + \@@_trace:n {--longtable-->~chunk~row:~ \the\LT@rows \space + row:~ \the\g_@@_row_int \space + column:~ \the\g_@@_col_int + } +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \tbl_if_row_was_started:T + { + \UseTaggingSocket{tbl/row/end} +% \end{macrocode} +% The next setting prevents any of the additional \cs{cr}s at the end of the +% chunk to add another /TR. Then once we really start a new chunk +% it gets incremented so\ldots +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_inbetween_rows: + } +% \end{macrocode} +% And for the same reason such \cs{cr}s should not increment the +% main row counter (but it has to be incremented after the preamble +% of a chunk), so here we test against \cs{LT@rows} which is +% \cs{LTchunksize} at the end of a chunk. +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \int_compare:nNnT \LT@rows < \LTchunksize + { \tbl_gincr_row_count: } % next is row about to start + }% + }% +% \end{macrocode} +% \begin{macrocode} + \lineskip\z@\baselineskip\z@ % \end{macrocode} % Start the first chunk. % \begin{macrocode} \LT@bchunk} +\ExplSyntaxOff +%<@@=> % \end{macrocode} % \end{macro} % @@ -1251,6 +1373,11 @@ % force the page-breaker to wake up. The second "\endgraf" is there so % that "\pagetotal" is updated and so takes "\LTpre" into account. % \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn +% \end{macrocode} +% +% \begin{macrocode} \def\LT@start{% \let\LT@start\endgraf \endgraf\penalty\z@\vskip\LTpre\endgraf @@ -1334,7 +1461,7 @@ % \changes{v3.14}{1995/05/02} % {Set \cs{@colroom}, for tools/1584} % \begin{macrocode} - \global\@colroom\@colht + \global\@colroom\@colht % \end{macrocode} % If the foot is non empty, reduce the "\vsize" and "\@colroom" % accordingly. @@ -1342,24 +1469,46 @@ % {Rearrange vertical space tests for tools/3512 (floats on same page)} % \begin{macrocode} \ifvoid\LT@foot\else -% \advance\vsize-\ht\LT@foot \global\advance\vsize-\ht\LT@foot \global\advance\@colroom-\ht\LT@foot \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ \maxdepth\z@ \fi % \end{macrocode} +% +% \begin{macrocode} + \MakeLinkTarget{table} +% \end{macrocode} % Put the table head on the page, and then switch to the new output % routine. % \changes{v4.11}{2004/02/01} % {\cs{nobreak}, for tools/3484} % \begin{macrocode} \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/longtable/head} +% \end{macrocode} +% +% \begin{macrocode} \output{\LT@output}} +\ExplSyntaxOff +%<@@=> % \end{macrocode} % \end{macro} % +% +% +% % \begin{macro}{\endlongtable} +% +% \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn +% \end{macrocode} +% % Called by "\end{longtable}". % \begin{macrocode} \def\endlongtable{% @@ -1370,11 +1519,23 @@ % been shortened, or the table numbering has gone awry). In that case % we at least start collecting valid new information with the last % chunk of this table, by removing the width constraint. +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \tbl_crcr:n {endlongtable} +% \end{macrocode} +% % \changes{v4.01}{1996/04/11} % {(DPC) use \cs{noalign} to sneak in \cs{LT@entry@chop}} % \begin{macrocode} - \crcr \noalign{% +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/longtable/finalize} +% \end{macrocode} +% +% \begin{macrocode} \let\LT@entry\LT@entry@chop \xdef\LT@save@row{\LT@save@row}}% \LT@echunk @@ -1414,10 +1575,10 @@ % \changes{v4.04}{1996/05/24} % {Use \cs{LT@final@warn}} % \begin{macrocode} - \ifx\LT@save@row\LT@@save@row + \ifx\LT@save@row\LT@@@@save@row \else - \LT@warn{Column \@width s have changed\MessageBreak - in table \thetable}% + \LT@warn{Column~ widths~ have~ changed\MessageBreak + in~ table~ \thetable}% \LT@final@warn \fi % \end{macrocode} @@ -1449,7 +1610,15 @@ % \end{macrocode} % Footnotes. As done in the \package{multicol} package. % \begin{macrocode} - \ifvoid\footins\else\insert\footins{}\fi} + \ifvoid\footins\else\insert\footins{}\fi +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/vmode/end}% +} +\ExplSyntaxOff +%<@@=> % \end{macrocode} % \end{macro} % @@ -1518,6 +1687,10 @@ \protected\def\LT@tabularcr{% \relax\iffalse{\fi\ifnum0=`}\fi \@ifstar +% \end{macrocode} +% TODO: as we replace crcr later in one case, we probably have to +% implement some further logic there! +% \begin{macrocode} {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr \LT@t@bularcr}% {\LT@t@bularcr}} @@ -1544,8 +1717,13 @@ % \end{macrocode} % \end{macro} % +% +% +% % \begin{macro}{\LT@t@bularcr} % \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn \def\LT@t@bularcr{% % \end{macrocode} % Increment the counter, and do \env{tabular}'s "\\" or finish the @@ -1555,6 +1733,13 @@ % \begin{macrocode} \global\advance\LT@rows\@ne \ifnum\LT@rows=\LTchunksize +% \end{macrocode} +% At the end of the chunk \verb=\\= is doing something special and +% so we lose \verb=\tbl_count_missing_cells:n=. Below is about the +% right place to add it do this code branch. +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_count_missing_cells:n {echunk} \gdef\LT@setprevdepth{% \prevdepth\z@ \global\let\LT@setprevdepth\relax}% @@ -1563,6 +1748,8 @@ \ifnum0=`{}\fi \expandafter\LT@LL@FM@cr \fi} +\ExplSyntaxOff +%<@@=> % \end{macrocode} % \end{macro} % @@ -1943,7 +2130,9 @@ % This code is based on "\cline". Two copies of the line are produced, % as described above. % \begin{macrocode} -\def\LT@@hline{% +%<@@=tbl> +\ExplSyntaxOn +\def\LT@@@@hline{% \ifx\@let@token\hline \global\let\@gtempa\@gobble \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}% @@ -1954,11 +2143,25 @@ \ifnum0=`{\fi}% \multispan\LT@cols \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr - \noalign{\LT@sep}% +% \end{macrocode} +% Don't update the row counter, or rather undo the update done in \cs{everycr}: +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \noalign{ + \tbl_gdecr_row_count: + \LT@sep} \multispan\LT@cols \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr - \noalign{\penalty\@M}% +% \end{macrocode} +% Same here. +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \noalign{ + \tbl_gdecr_row_count: + \penalty\@M} \@gtempa} +\ExplSyntaxOff +%<@@=> % \end{macrocode} % \end{macro} % @@ -2049,13 +2252,15 @@ % \begin{macro}{\LT@output} % Actually this is not so bad, with FM leading the way. % \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn \def\LT@output{% \ifnum\outputpenalty <-\@Mi \ifnum\outputpenalty > -\LT@end@pen % \end{macrocode} % If this was a float or a marginpar we complain. % \begin{macrocode} - \LT@err{floats and marginpars not allowed in a longtable}\@ehc + \LT@err{floats~ and~ marginpars~ not~ allowed~ in~ a~ longtable}\@ehc \else % \end{macrocode} % We have reached the end of the table, on the scroll at least, @@ -2103,6 +2308,13 @@ % \begin{macrocode} \unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi % \end{macrocode} +% Handle foot box when tagging: +% +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/longtable/foot} +% \end{macrocode} +% % End of "\ifnum\outputpenalty > -\LT@end@pen". % \begin{macrocode} \fi @@ -2114,6 +2326,15 @@ % If we have not reached the end of the table, % \begin{macrocode} \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% +% \end{macrocode} +% +% Handle foot box when tagging: +% \changes{v4.19}{2023/12/16}{Support for tagged PDF} +% \begin{macrocode} + \UseTaggingSocket{tbl/longtable/foot} +% \end{macrocode} +% +% \begin{macrocode} \@makecol \@outputpage % \end{macrocode} @@ -2133,8 +2354,15 @@ % \begin{macrocode} \fi} % \end{macrocode} +% +% \begin{macrocode} +\ExplSyntaxOff +%<@@=> +% \end{macrocode} % \end{macro} % +% +% % \subsection{Commands for the table head and foot} % % \begin{macro}{\LT@end@hd@ft} @@ -2142,20 +2370,86 @@ % box specified by "#1". Issue an error if the table has already % started. Then start a new chunk. % \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn \def\LT@end@hd@ft#1{% +% \end{macrocode} +% +% This command is used to store the head and foot boxes. +% We need to retrieve and store the row so that we can clean +% up the structure in the finalize code. +% +% To handle missing columns in the header we need this: +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_if_row_was_started:TF + { +% \end{macrocode} +% TODO: This is exposing internal counters, so it should be encapsulated +% in some interface command (but I'm not sure what that should be +% called, so not done yet. +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_count_missing_cells:n {head/foot} + \int_step_inline:nn + { \LT@rows + 1 } + { + \seq_gput_left:ce + {g_@@_\cs_to_str:N #1 _rows_seq } + { \int_eval:n {\g_@@_row_int + 1 - ##1 } } + } +% \end{macrocode} +% We also have to set the chunk rows to its max value before +% calling \cs{LTechunk} so that we don't get extra increments of +% the main row counter due to \cs{everycr}. +% \begin{macrocode} + \int_gset:Nn \LT@rows { \LTchunksize } + } +% \end{macrocode} + +% If we are still in column zero then we had an empty \cs{endhead} +% and so making any assignment, etc., would start a row --- something we don't want. +% To get out of this trap we run \cs{crcr} (which would normally +% come inside \cs{LT@echunk}. That will then trigger \cs{everycr} +% and update row counter unnecessarily, but now we have a defined state, so +% we can use \cs{noalign} to undo that. +% We also change \cs{LT@rows} so that further \cs{cr}s do not do +% any harm (as explained above. +% +% The \cs{crcr} inside \cs{LT@echunk} will be bypassed in that case +% as we have just executed a \cs{crcr} and are still in scanning modus for +% \cs{omit} or \cs{noalign}. +% \begin{macrocode} + { + \crcr + \noalign{ +% \end{macrocode} +% +% \changes{v4.19}{2023/12/16}{Managing cell indexes} +% \begin{macrocode} + \tbl_gdecr_row_count: % undo the increment + \int_gset:Nn \LT@rows { \LTchunksize } + } + } \LT@echunk % \end{macrocode} % Changed from "\relax" to "\endgraf" at V3.04, see "\LT@start". % \begin{macrocode} \ifx\LT@start\endgraf \LT@err - {Longtable head or foot not at start of table}% - {Increase LTchunksize}% + {Longtable~ head~ or~ foot~ not~ at~ start~ of~ table}% + {Increase~ LTchunksize}% \fi \setbox#1\box\z@ + \@@_trace:n {-->>~ Saving~\noexpand#1} \LT@get@widths \LT@bchunk} % \end{macrocode} +% +% \begin{macrocode} +\ExplSyntaxOff +%<@@=> +% \end{macrocode} % \end{macro} % % \begin{macro}{\endfirsthead} @@ -2255,6 +2549,24 @@ % \end{macrocode} % \end{macro} % +% +% +% +% +% Some variables need for the tagging support. +% \begin{macrocode} +%<@@=tbl> +\ExplSyntaxOn + \seq_new:N \g_@@_LT@firsthead_rows_seq + \seq_new:N \g_@@_LT@head_rows_seq + \seq_new:N \g_@@_LT@lastfoot_rows_seq + \seq_new:N \g_@@_LT@foot_rows_seq +\ExplSyntaxOff +%<@@=> +% \end{macrocode} +% +% +% % \begin{macrocode} %</package> % \end{macrocode} diff --git a/macros/latex-dev/required/tools/longtable.ins b/macros/latex-dev/required/tools/longtable.ins index 5c3ad27063..60b7461571 100644 --- a/macros/latex-dev/required/tools/longtable.ins +++ b/macros/latex-dev/required/tools/longtable.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug reports for it can be opened at https://latex-project.org/bugs/ (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/required/tools/longtable.pdf b/macros/latex-dev/required/tools/longtable.pdf Binary files differindex f24ff36f4f..5fb3c4a917 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.dtx b/macros/latex-dev/required/tools/multicol.dtx index 2676d03aa1..9c680ab563 100644 --- a/macros/latex-dev/required/tools/multicol.dtx +++ b/macros/latex-dev/required/tools/multicol.dtx @@ -99,10 +99,10 @@ %<driver> \ProvidesFile{multicol.drv} % \fi % \ProvidesFile{multicol.dtx} - [2023/03/30 v1.9f multicolumn formatting (FMi)] + [2024/01/29 v1.9g multicolumn formatting (FMi)] +% % % -%% % % \changes{v1.9c}{2021/11/30}{Added rollback to v1.8} % \changes{v1.5n}{1997/06/05}{Applied improvement of documentation, @@ -919,9 +919,22 @@ % And we don't show macro names in the margin. % \begin{macrocode} \setcounter{IndexColumns}{4} -\let\DescribeMacro\SpecialUsageIndex -\let\DescribeEnv\SpecialEnvIndex -\renewcommand\PrintMacroName[1]{} +% \end{macrocode} +% +% The following redefinitions have to be moved until after the +% preamble because version 3 of \pkg{doc} resets them after the +% premable (this is tmp, because \pkg{hypdoc} is not yet +% integrated, but as we all know, tmp solutions have a tendency to +% survive for a long time\ldots). +% \begin{macrocode} +\AddToHook{begindocument}{% + \let\DescribeMacro\SpecialUsageIndex + \let\DescribeEnv\SpecialEnvIndex + \renewcommand\PrintMacroName[1]{}% +} +% \end{macrocode} +% +% \begin{macrocode} \CodelineIndex %\DisableCrossrefs % Partial index \RecordChanges % Change log @@ -1082,7 +1095,7 @@ % better test for this situation. Otherwise, we will get a \TeX{} % stack overflow as this would generate a self-referencing definition. % \changes{v1.6e}{2004/02/14}{Avoid self-referencing definition of -% \cs{@footnotetext} (pr/3618)}. +% \cs{@footnotetext} (pr/3618)} % \begin{macrocode} \ifx\@footnotetext\mult@footnotetext \else @@ -2376,7 +2389,7 @@ % If |\raggedcolumns| is in force we add a |vfill| at the bottom by % unboxing the split box. % But we need to unbox anyway to ensure that at the end of the box -% we do not have unwanted space. This can sneak in in certain +% we do not have unwanted space. This can sneak in, in certain % situations, for example, if two lists follow each other and we % break between them. While such space is usually zero it still has % an effect because it hides depth of the last line in the column @@ -2925,7 +2938,11 @@ % We start by setting the kept marks by updating them with any % marks from this box. This has to be done \emph{before} we add a % penalty of $-10000$ to the top of the box, otherwise only an -% empty box will be considered. +% empty box will be considered. But even that is not enough: the box +% may contain \cs{columnbreak}s in which case doing some artifical +% splitting to get the marks out still fails to see all marks +% unless we take some special precaution in \cs{get@keptmarks} +% (which is now done). % \changes{v1.5h}{1994/08/26}{Get kept marks first} % \begin{macrocode} \get@keptmarks\mult@box @@ -3751,8 +3768,15 @@ % everything is split off. As a result |\splitfirstmark| and % |\splitbotmark| will contain the first and last mark in the box % respectively. +% +% Unfortunately, a simple \cs{vsplit} is not enough if the material +% contains forced breaks in that case we first have to get rid of +% those which is why we do this work in a separate macro that can +% call itself recursively. +% \changes{v1.9g}{2023/11/10}{Get rid of forced breaks for mark +% extraction (gh/1130)} % \begin{macrocode} - \setbox#1\vsplit#1to\maxdimen + \mc@get@all@box@marks #1% % \end{macrocode} % Therefore we can now set the kept marks which is a global % operation and afterwards close the group. This will restore the @@ -3773,6 +3797,29 @@ % \end{macro} % % +% \begin{macro}{\mc@get@all@box@marks} +% This macro splits a box to \cs{maxdimen} in order to get at the +% marks inside. If it turns out that we have a remainder after the +% split (e.g., if there was a \cs{columnbreak} in the material) we +% stitch the two parts together again (which omits the forced +% break) and recurse. Eventually, everything is split off and the +% split marks will then have the appropriate values. +% \changes{v1.9g}{2023/11/10}{Get rid of forced breaks for mark +% extraction (gh/1130)} +% \begin{macrocode} +\def\mc@get@all@box@marks #1{% + \setbox\@tempboxa\vsplit#1to\maxdimen + \ifvoid#1\else + \setbox#1\vbox{\unvbox\@tempboxa \unvbox#1}% + \mc@get@all@box@marks #1% + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% +% % \begin{macro}{\set@keptmarks} % The macro |\set@keptmarks| is responsible for setting % |\kept@firstmark| and |\kept@botmark|, by checking the current diff --git a/macros/latex-dev/required/tools/multicol.ins b/macros/latex-dev/required/tools/multicol.ins index fa561e0bb1..7a7ef27d24 100644 --- a/macros/latex-dev/required/tools/multicol.ins +++ b/macros/latex-dev/required/tools/multicol.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug reports for it can be opened at https://latex-project.org/bugs/ (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/required/tools/multicol.pdf b/macros/latex-dev/required/tools/multicol.pdf Binary files differindex 031d1920fa..360c09d0b9 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.dtx b/macros/latex-dev/required/tools/rawfonts.dtx index 4b930f3ea7..3ffa2032c3 100644 --- a/macros/latex-dev/required/tools/rawfonts.dtx +++ b/macros/latex-dev/required/tools/rawfonts.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/rawfonts.pdf b/macros/latex-dev/required/tools/rawfonts.pdf Binary files differindex 08f8d71317..98bfaa374a 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.dtx b/macros/latex-dev/required/tools/shellesc.dtx index aa707fe550..8a556de922 100644 --- a/macros/latex-dev/required/tools/shellesc.dtx +++ b/macros/latex-dev/required/tools/shellesc.dtx @@ -1,6 +1,6 @@ % \iffalse %% Source File: shellesc.dtx -%% Copyright (C) 2015-2023 +%% Copyright (C) 2015-2024 %% %% The LaTeX Project and any individual authors listed elsewhere %% in this file. diff --git a/macros/latex-dev/required/tools/shellesc.pdf b/macros/latex-dev/required/tools/shellesc.pdf Binary files differindex ee1a87cc01..c41228c1b9 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.dtx b/macros/latex-dev/required/tools/showkeys.dtx index c90b3863e1..aba96a7eab 100644 --- a/macros/latex-dev/required/tools/showkeys.dtx +++ b/macros/latex-dev/required/tools/showkeys.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. @@ -22,7 +22,7 @@ % \fi % \iffalse %% File: showkeys.dtx Copyright (C) 1992-1997 David Carlisle -%% File: showkeys.dtx Copyright (C) 2006-2019 David Carlisle, LaTeX Project +%% File: showkeys.dtx Copyright (C) 2006-2023 David Carlisle, LaTeX Project % %<*dtx> \ProvidesFile{showkeys.dtx} @@ -39,7 +39,7 @@ %<driver> \ProvidesFile{showkeys.drv} % \fi % \ProvidesFile{showkeys.dtx} - [2023/07/08 v3.19 Show cite and label keys (DPC, MH)] + [2023/12/16 v3.20 Show cite and label keys (DPC, MH)] % % \iffalse %<*driver> @@ -417,6 +417,8 @@ % \end{macrocode} % \changes{v3.02}{1995/03/17} % {New code for `in label' case.} +% \changes{v3.20}{2023/12/16} +% {Avoid adding an extra box layer github/1123} % If the |\label| is straight after |\item| (|\bibitem| is handled by % this case as well) then the item label has not been added to the page % yet. It is hanging around in the box |\@labels| waiting for the @@ -425,7 +427,7 @@ \global\setbox\@labels\hbox{% \llap{\SK@lab\SK@lab@relax \kern\@totalleftmargin\kern\marginparsep}% - \box\@labels}% + \unhbox\@labels}% % \end{macrocode} % % \begin{macrocode} diff --git a/macros/latex-dev/required/tools/showkeys.pdf b/macros/latex-dev/required/tools/showkeys.pdf Binary files differindex 2d4da0c5a7..6b1ae4549e 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.dtx b/macros/latex-dev/required/tools/somedefs.dtx index 02653a1393..156621d70e 100644 --- a/macros/latex-dev/required/tools/somedefs.dtx +++ b/macros/latex-dev/required/tools/somedefs.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/somedefs.pdf b/macros/latex-dev/required/tools/somedefs.pdf Binary files differindex 9d282b58f3..07a32befaa 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.dtx b/macros/latex-dev/required/tools/tabularx.dtx index 6d59ca4c22..52ee62cad9 100644 --- a/macros/latex-dev/required/tools/tabularx.dtx +++ b/macros/latex-dev/required/tools/tabularx.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. @@ -31,7 +31,7 @@ %<driver> \ProvidesFile{tabularx.drv} % \fi % \ProvidesFile{tabularx.dtx} - [2023/07/08 v2.11c `tabularx' package (DPC)] + [2023/12/11 v2.12a `tabularx' package (DPC)] % \iffalse %<*driver> \documentclass{ltxdoc} @@ -261,6 +261,25 @@ % This behaviour of the package can be customised slightly % as noted in the documentation of the code section. % +% \section{Support for tagged PDF} +% +% With version 2.12a the package is made tagging aware, which means that +% it will automatically produce tagged tables (necessary, for example, for +% accessibility) if tagging is requested via \cs{DocumentMetadata}. +% +% More granular control, e.g., explicitly deciding which cells are +% header cells, etc., is currently under development, but syntax for +% this will not appear in this package. Instead it will become +% available across all tabular-generating packages and then +% automatically apply here as well. +% +% Enabling \LaTeX{} to automatically produce tagged PDF is a long-term +% project and this is a tiny step in this puzzle. For more information +% on the project and already available functionality, see +% \url{https://latex-project.org/publications/indexbytopic/pdf} and +% \url{https://github.com/latex3/tagging-project}. +% +% % \MaybeStop{} % % \section{The Macros} @@ -269,6 +288,14 @@ %<*package> % \end{macrocode} % +% We only need two changes for tagging support, but they require +% that a recent \LaTeX{} kernel is used (which should be no problem +% if \texttt{tools} is distributed in parallel with the kernel. +% \changes{v2.12a}{2023/12/11}{Require newer LaTeX kernel} +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[2024/06/01] +% \end{macrocode} +% % \changes{v2.00}{1994/02/07} % {New Option Handling} % \begin{macrocode} @@ -506,7 +533,15 @@ % \begin{macrocode} \TX@typeout@ {\@spaces Table Width\@spaces Column Width\@spaces X Columns}% -% \end{macrocode}% +% \end{macrocode} +% +% While we do trial typesetting we suspend any tagging if that is +% active: +% \changes{v2.12a}{2023/12/11} +% {Suspend any tagging while doing trial typesetting} +% \begin{macrocode} + \SuspendTagging {tabularx}% +% \end{macrocode} % First attempt. Modify the {\ttfamily X} definition to count {\ttfamily % X} columns. % \begin{macrocode} @@ -523,6 +558,12 @@ \TX@trial{}% \repeat % \end{macrocode} +% +% And here we restart it again: +% \begin{macrocode} + \ResumeTagging {tabularx}% +% \end{macrocode} +% % One last time, with warnings back on (see appendix D) % use {\ttfamily tabular*} to put it in a box of the right size, in case % the algorithm failed to find the correct size. @@ -737,8 +778,9 @@ % Make the table, and finish the hbox. % Since v1.06, "\toks@" contains the preamble specification, % and possible optional argument, as well as the table body. +% % \begin{macrocode} - \expandafter\tabular\the\toks@ + \expandafter\tabular\the\toks@ \endtabular}% % \end{macrocode} % Since v1.05 reset all \LaTeX\ counters, by executing "\TX@ckpt". @@ -961,6 +1003,7 @@ % \end{macrocode} % \end{macro} % +% % \begin{macrocode} %</package> % \end{macrocode} diff --git a/macros/latex-dev/required/tools/tabularx.ins b/macros/latex-dev/required/tools/tabularx.ins index 6e81e93432..fdce598d37 100644 --- a/macros/latex-dev/required/tools/tabularx.ins +++ b/macros/latex-dev/required/tools/tabularx.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug reports for it can be opened at https://latex-project.org/bugs/ (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/required/tools/tabularx.pdf b/macros/latex-dev/required/tools/tabularx.pdf Binary files differindex 9f68f26643..28b61a3da3 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.dtx b/macros/latex-dev/required/tools/theorem.dtx index e3a8e90b8c..a9c3ccae3e 100644 --- a/macros/latex-dev/required/tools/theorem.dtx +++ b/macros/latex-dev/required/tools/theorem.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/theorem.pdf b/macros/latex-dev/required/tools/theorem.pdf Binary files differindex 5cdc977c98..96c8c8512f 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 300602a9ed..b5dd0670fb 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/tools-overview.tex b/macros/latex-dev/required/tools/tools-overview.tex index 3bc325d67c..54f4b5ed63 100644 --- a/macros/latex-dev/required/tools/tools-overview.tex +++ b/macros/latex-dev/required/tools/tools-overview.tex @@ -1,7 +1,7 @@ \NeedsTeXFormat{LaTeX2e} \ProvidesFile{tools-overview.tex}[2015/03/31 v1.0 Tools overview] -% Copyright (C) 2006-2023 +% Copyright (C) 2006-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/tools.ins b/macros/latex-dev/required/tools/tools.ins index 6898faead3..2fd1cd174b 100644 --- a/macros/latex-dev/required/tools/tools.ins +++ b/macros/latex-dev/required/tools/tools.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -49,7 +49,7 @@ reports for it can be opened at https://latex-project.org/bugs/ (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/required/tools/trace.dtx b/macros/latex-dev/required/tools/trace.dtx index 788f831620..27a39c776b 100644 --- a/macros/latex-dev/required/tools/trace.dtx +++ b/macros/latex-dev/required/tools/trace.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/trace.pdf b/macros/latex-dev/required/tools/trace.pdf Binary files differindex 7ddd4fc6b7..f0065a21c3 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.dtx b/macros/latex-dev/required/tools/varioref.dtx index e801c54f81..ccf3468c9b 100644 --- a/macros/latex-dev/required/tools/varioref.dtx +++ b/macros/latex-dev/required/tools/varioref.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/varioref.ins b/macros/latex-dev/required/tools/varioref.ins index dcc41d0176..88527a20ba 100644 --- a/macros/latex-dev/required/tools/varioref.ins +++ b/macros/latex-dev/required/tools/varioref.ins @@ -3,7 +3,7 @@ %% driver files from the doc files in this package when run through %% LaTeX or TeX. %% -%% Copyright (C) 1993-2023 +%% Copyright (C) 1993-2024 %% The LaTeX Project and any individual authors listed elsewhere %% in this file. %% @@ -45,7 +45,7 @@ The source is maintained by the LaTeX Project team and bug reports for it can be opened at https://latex-project.org/bugs/ (but please observe conditions on bug reports sent to that address!) -Copyright (C) 1993-2023 +Copyright (C) 1993-2024 The LaTeX Project and any individual authors listed elsewhere in this file. diff --git a/macros/latex-dev/required/tools/varioref.pdf b/macros/latex-dev/required/tools/varioref.pdf Binary files differindex 6a8d722fd7..01a079a5ff 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.dtx b/macros/latex-dev/required/tools/verbatim.dtx index 832f80ef3a..468dead3e8 100644 --- a/macros/latex-dev/required/tools/verbatim.dtx +++ b/macros/latex-dev/required/tools/verbatim.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. @@ -55,7 +55,7 @@ \and Chris Rowley} -\date{2023/07/08} +\date{2023/11/06} \begin{document} \markboth{Verbatim style option}{Verbatim style option} \MaintainedByLaTeXTeam{tools} @@ -69,6 +69,8 @@ %\fi % % +% +% \changes{v1.5x}{2024/01/22}{Added TAB marking support to \cs{verbatiminput*}} % \changes{v1.5u}{2020-07-07}{Typo repair and added a missing comment % character} % \changes{v1.5q}{2003/08/22}{Reintroduced \cs{@noligs}, by popular @@ -508,7 +510,7 @@ %<*package> \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{verbatim} - [2022-07-02 v1.5u LaTeX2e package for verbatim enhancements] + [2024-01-22 v1.5x LaTeX2e package for verbatim enhancements] \@ifundefined{verbatim@@@}{}{\endinput} % \end{macrocode} % @@ -549,9 +551,17 @@ % to be printed as spaces in the output. % \begin{macrocode} \begingroup - \catcode`\ =\active% - \def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}} - \expandafter\endgroup\x +\catcode`\ =\active% +% \end{macrocode} +% Because space is active we can't indent the following code +% nicely---we would then get the spaces at the beginning of the +% line as the third and fourth argument to \cs{@ifl@t@r}. +% \changes{v1.5v}{2023/11/06}{\cs{@vobeytabs} added when available (gh/1160)} +% \begin{macrocode} +\@ifl@t@r\fmtversion{2023-11-01}% +{\def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp\@vobeytabs}}}% +{\def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}}% +\expandafter\endgroup\x % \end{macrocode} % \end{macro} % @@ -1562,7 +1572,14 @@ % arguments, depending on whether an asterisk follows. % \begin{macrocode} \def\verbatiminput{\begingroup - \@ifstar{\verbatim@input\relax}% +% \end{macrocode} +% +% \changes{v1.5x}{2024/01/22}{Added TAB marking support into the +% starred version (gh/1245)} +% If starred, we mark spaces and TABs, the two +% added pieces are the same as for verbatim*. +% \begin{macrocode} + \@ifstar{\verbatim@input{\@setupverbvisiblespace\@vobeyspaces}}% {\verbatim@input{\frenchspacing\@vobeyspaces}}} % \end{macrocode} % \end{macro} diff --git a/macros/latex-dev/required/tools/verbatim.pdf b/macros/latex-dev/required/tools/verbatim.pdf Binary files differindex 3908ca304d..bc055db066 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.dtx b/macros/latex-dev/required/tools/xr.dtx index be48f5a01b..3914cebcd9 100644 --- a/macros/latex-dev/required/tools/xr.dtx +++ b/macros/latex-dev/required/tools/xr.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/xr.pdf b/macros/latex-dev/required/tools/xr.pdf Binary files differindex 58217a12d2..b3c4530a59 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.dtx b/macros/latex-dev/required/tools/xspace.dtx index 807fc9c5df..be20fc9e52 100644 --- a/macros/latex-dev/required/tools/xspace.dtx +++ b/macros/latex-dev/required/tools/xspace.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 1993-2023 +% Copyright (C) 1993-2024 % % The LaTeX Project and any individual authors listed elsewhere % in this file. diff --git a/macros/latex-dev/required/tools/xspace.pdf b/macros/latex-dev/required/tools/xspace.pdf Binary files differindex 573624719e..792cae7e6c 100644 --- a/macros/latex-dev/required/tools/xspace.pdf +++ b/macros/latex-dev/required/tools/xspace.pdf diff --git a/macros/latex/contrib/eolang/README.md b/macros/latex/contrib/eolang/README.md index 47fa929241..2214b74e38 100644 --- a/macros/latex/contrib/eolang/README.md +++ b/macros/latex/contrib/eolang/README.md @@ -22,7 +22,7 @@ x -> [ \end{document} ``` -Otherwise, you can download [`eolang.sty`](https://yegor256.github.io/eolang.sty) and add to your project. +Otherwise, you can download [`eolang.sty`](https://objectionary.github.io/eolang.sty/eolang.sty) and add to your project. If you want to contribute yourself, make a fork, then create a branch, then run `l3build ctan` in the root directory. diff --git a/macros/latex/contrib/eolang/eolang.1 b/macros/latex/contrib/eolang/eolang.1 index bcac9db30d..8ab1954d87 100644 --- a/macros/latex/contrib/eolang/eolang.1 +++ b/macros/latex/contrib/eolang/eolang.1 @@ -1,4 +1,4 @@ -.TH eolang 1 "2024-01-11" +.TH eolang 1 "2024-02-14" .SH NAME eolang \- Automated Editor of TeX Files that Use "eolang" Package .SH SYNOPSIS diff --git a/macros/latex/contrib/eolang/eolang.dtx b/macros/latex/contrib/eolang/eolang.dtx index 262c10f2ca..97d558ccaa 100644 --- a/macros/latex/contrib/eolang/eolang.dtx +++ b/macros/latex/contrib/eolang/eolang.dtx @@ -50,7 +50,7 @@ %<package>\NeedsTeXFormat{LaTeX2e} %<package>\ProvidesPackage{eolang} %<*package> -[2024-01-11 0.18.0 Formulas and Graphs for EO Programming Language] +[2024-02-14 0.18.1 Formulas and Graphs for EO Programming Language] %</package> %<*driver> \documentclass{ltxdoc} @@ -877,7 +877,7 @@ $macro = $ARGV[0]; open(my $fh, '<', $ARGV[1]); my $tex; { local $/; $tex = <$fh>; } -print "% This file is auto-generated by 0.18.0\n"; +print "% This file is auto-generated by 0.18.1\n"; print '% There are ', length($tex), ' chars in the input: ', $ARGV[1], "\n"; print '% ---', "\n"; @@ -1219,6 +1219,10 @@ sub fmt { $tex =~ s/\|([^\|]+)\|/\\textnormal{\\texttt{\1}}/g; return $tex; } +sub toem { + my ($cm) = @_; + return $cm * 2.8; +} sub vertex { my ($v) = @_; if (index($v, 'v0') == 0) { @@ -1315,7 +1319,7 @@ for (my $c = 0; $c < 0+@cmds; $c++) { $draw = $draw . " (<MF:${to}><B:break-v>)"; if (exists $opts{'break'}) { print tailor($draw, 'F') . ";\n"; - print ' \node[outer sep=.1cm,inner sep=0cm] ' . + print ' \node[outer sep=' . toem(0.1) . 'em,inner sep=0em] ' . 'at (break) (break-v) {$' . vertex($to) . '$};' . "\n"; print ' ' . tailor($draw, 'B'); @@ -1326,10 +1330,10 @@ for (my $c = 0; $c < 0+@cmds; $c++) { my ($from, $to) = split (/=+>/, $head); my $size = () = $head =~ /=/g; if ($from eq '') { - print '\node [phi-arrow, left=' . ($size * 0.6) . 'cm of ' . + print '\node [phi-arrow, left=' . toem($size * 0.6) . 'em of ' . $to . '.center]'; } elsif ($to eq '') { - print '\node [phi-arrow, right=' . ($size * 0.6) . 'cm of ' . + print '\node [phi-arrow, right=' . toem($size * 0.6) . 'em of ' . $from . '.center]'; } else { print '\node [phi-arrow] at ($(' . @@ -1340,7 +1344,7 @@ for (my $c = 0; $c < 0+@cmds; $c++) { my ($v, $marker) = split (/!+/, $head); my $size = () = $head =~ /!/g; print '\node [phi-marker, left=' . - ($size * 0.6) . 'cm of ' . + toem($size * 0.6) . 'em of ' . $v . '.center]{' . fmt($marker) . '}'; } elsif (index($head, '+') >= 0) { my ($v, $suffix) = split (/\+/, $head); @@ -1417,8 +1421,8 @@ for (my $c = 0; $c < 0+@cmds; $c++) { $loc = $loc . 'left'; } print ',' . $loc . '='; - print abs(num($down)) . 'cm and ' . - abs(num($right)) . 'cm of ' . $v . '.center'; + print toem(abs(num($down))) . 'em and ' . + toem(abs(num($right))) . 'em of ' . $v . '.center'; } if (exists $opts{'data'}) { print ',phi-data'; @@ -1521,17 +1525,17 @@ print '\endinput'; % \begin{macrocode} \newenvironment{phicture}% {\noindent\begin{tikzpicture}[ - ->,>=stealth',node distance=0,thick, + ->,>=stealth',node distance=0,line width=.08em, pics/parallel arrow/.style={ code={\draw[-latex,phi-rho] (##1) -- (-##1);}}]}% {\end{tikzpicture}} \tikzstyle{phi-arrow} = [fill=white!80!black, single arrow, - minimum height=0.5cm, minimum width=0.5cm, + minimum height=0.05em, minimum width=0.05em, single arrow head extend=2mm] \tikzstyle{phi-marker} = [inner sep=0pt, minimum height=1.4em, minimum width=1.4em, font={\small\color{white}\ttfamily}, fill=gray] -\tikzstyle{phi-thing} = [thick,inner sep=0pt,minimum height=2.4em, +\tikzstyle{phi-thing} = [inner sep=0pt,minimum height=2.4em, draw,font={\small}] \tikzstyle{phi-object} = [phi-thing,circle] \tikzstyle{phi-data} = [phi-thing,regular polygon, @@ -1593,7 +1597,7 @@ print '\endinput'; \tikzstyle{phi-pi} = [draw,dotted] \tikzstyle{phi-atom} = [phi-object,double] \tikzstyle{phi-box} = [xshift=-5pt,yshift=3pt,draw,fill=white, - rectangle,thin,minimum width=1.2em,anchor=north west, + rectangle,line width=.04em,minimum width=1.2em,anchor=north west, font={\scriptsize}] \tikzstyle{phi-attr} = [midway,sloped,inner sep=0pt, above=2pt,sloped/.append style={transform shape}, diff --git a/macros/latex/contrib/eolang/eolang.pdf b/macros/latex/contrib/eolang/eolang.pdf Binary files differindex 23028cf96a..2bf8e39de4 100644 --- a/macros/latex/contrib/eolang/eolang.pdf +++ b/macros/latex/contrib/eolang/eolang.pdf diff --git a/macros/latex/contrib/eolang/eolang.pl b/macros/latex/contrib/eolang/eolang.pl index 3ac32331a4..48ba53dc5b 100755 --- a/macros/latex/contrib/eolang/eolang.pl +++ b/macros/latex/contrib/eolang/eolang.pl @@ -21,7 +21,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -# 2024-01-11 0.18.0 +# 2024-02-14 0.18.1 package eolang; use warnings; @@ -45,6 +45,8 @@ sub savefile { open(my $f, '>', $path) or error('Cannot open file for writing: ' . $path); print $f $content; close($f); + my $size = -s $path; + info("File saved to '$path' ($size bytes)"); } # Print INFO message to the console. @@ -78,7 +80,7 @@ if (@ARGV+0 eq 0 or exists $args{'--help'} or exists $args{'-?'}) { " --tmpdir=path Temp directory with .tex files ('_eolang' by default)\n\n" . "If any issues, report to GitHub: https://github.com/yegor256/bibcop"); } elsif (exists $args{'--version'} or exists $args{'-v'}) { - info('0.18.0 2024-01-11'); + info('0.18.1 2024-02-14'); } else { my ($src, $target) = grep { not($_ =~ /^-.*$/) } @ARGV; if (not $src) { @@ -146,7 +148,6 @@ if (@ARGV+0 eq 0 or exists $args{'--help'} or exists $args{'-?'}) { } debug('Target: ' . $target); savefile($target, $tex); - info("New TeX file save to: ". $target); } # In order to finish it with success: diff --git a/macros/latex/contrib/huawei/LICENSE.txt b/macros/latex/contrib/huawei/LICENSE.txt index 5744f745f0..1f211e0287 100644 --- a/macros/latex/contrib/huawei/LICENSE.txt +++ b/macros/latex/contrib/huawei/LICENSE.txt @@ -1,6 +1,6 @@ (The MIT License) -Copyright (c) 2021-2023 Yegor Bugayenko +Copyright (c) 2021-2024 Yegor Bugayenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal diff --git a/macros/latex/contrib/huawei/README.md b/macros/latex/contrib/huawei/README.md index b7a0640cf2..e2f585d214 100644 --- a/macros/latex/contrib/huawei/README.md +++ b/macros/latex/contrib/huawei/README.md @@ -21,6 +21,8 @@ Hello, world! \end{document} ``` +Otherwise, you can download [`huawei.cls`](https://yegor256.github.io/huawei.cls/huawei.sty) and add to your project. + Read the detailed documentation [in PDF](http://mirrors.ctan.org/macros/latex/contrib/huawei/huawei.pdf). If you need more formatting options, diff --git a/macros/latex/contrib/huawei/huawei.dtx b/macros/latex/contrib/huawei/huawei.dtx index 88af315984..1140958502 100644 --- a/macros/latex/contrib/huawei/huawei.dtx +++ b/macros/latex/contrib/huawei/huawei.dtx @@ -1,7 +1,7 @@ % \iffalse meta-comment % (The MIT License) % -% Copyright (c) 2021-2023 Yegor Bugayenko +% Copyright (c) 2021-2024 Yegor Bugayenko % % Permission is hereby granted, free of charge, to any person obtaining a copy % of this software and associated documentation files (the 'Software'), to deal @@ -50,7 +50,7 @@ %<class>\NeedsTeXFormat{LaTeX2e} %<class>\ProvidesClass{huawei} %<*class> -[2023-09-21 0.18.2 Template for Huawei Documents] +[2024-02-14 0.18.3 Template for Huawei Documents] %</class> %<*driver> \documentclass{ltxdoc} @@ -782,7 +782,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt] % \begin{macrocode} \makeatletter\renewcommand\maketitle{% \vspace*{18pt}% - {\bfseries{\Huge\raggedright\thetitle\par}}% + {\bfseries{\begin{spacing}{.9}\Huge\raggedright\thetitle\par\end{spacing}}}% \ifx\thesubtitle\empty\else% {\color{gray!50!black}\large\raggedright\thesubtitle\par}% \fi% @@ -997,7 +997,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt] \setlength\parindent{0pt}% \setlength\parskip{6pt}% \setlength\columnsep{32pt}% -\def\arraystretch{1.5}% +\renewcommand{\arraystretch}{1}% } % \end{macrocode} diff --git a/macros/latex/contrib/huawei/huawei.ins b/macros/latex/contrib/huawei/huawei.ins index daa75a374e..784d524942 100644 --- a/macros/latex/contrib/huawei/huawei.ins +++ b/macros/latex/contrib/huawei/huawei.ins @@ -1,6 +1,6 @@ %% (The MIT License) %% -%% Copyright (c) 2021-2023 Yegor Bugayenko +%% Copyright (c) 2021-2024 Yegor Bugayenko %% %% Permission is hereby granted, free of charge, to any person obtaining a copy %% of this software and associated documentation files (the 'Software'), to deal @@ -26,7 +26,7 @@ \preamble (The MIT License) -Copyright (c) 2021-2023 Yegor Bugayenko +Copyright (c) 2021-2024 Yegor Bugayenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal diff --git a/macros/latex/contrib/huawei/huawei.pdf b/macros/latex/contrib/huawei/huawei.pdf Binary files differindex 827b703b74..c0c742fa02 100644 --- a/macros/latex/contrib/huawei/huawei.pdf +++ b/macros/latex/contrib/huawei/huawei.pdf diff --git a/macros/latex/contrib/jnuexam/jnuexam.cls b/macros/latex/contrib/jnuexam/jnuexam.cls index c70cee0fd9..6fa3b722ca 100644 --- a/macros/latex/contrib/jnuexam/jnuexam.cls +++ b/macros/latex/contrib/jnuexam/jnuexam.cls @@ -6,7 +6,7 @@ % ---------------------------------------------------------------------------- \NeedsTeXFormat{LaTeX2e} -\ProvidesClass{jnuexam}[2023/12/18 v2.1 An exam class for Jinan University] +\ProvidesClass{jnuexam}[2024/02/02 v2.1.1 An exam class for Jinan University] %% 旧版本的 LaTeX 不能识别 2022-11-01 这种日期格式 %\@ifl@t@r\fmtversion{2022-11-01}{}{ @@ -56,7 +56,7 @@ % 在 xeCJK 中已经禁止载入 CJK,但是在新版本 ctex 宏包中却失效了 % 我们假装 CJK 已经载入,再载入 CJKnumb,避免出现 \CJKglue 重复定义的问题 % 注意用 PDFLaTeX 编译时需要用到 CJK,所以只在未定义时才作修改 -\ifdefined\else +\ifdefined\CJKglue \@namedef{ver@CJK.sty}{} %\@namedef{opt@CJK.sty}{} \fi @@ -926,7 +926,7 @@ \newcommand*{\my@alignment@check}[1]{% \ifx\my@let@token #1% \def\my@alignment@offset{5}% - \listbreak + \expandafter\listbreak \fi } diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md index a8e4cb8d77..472c43a655 100644 --- a/macros/latex/contrib/l3kernel/CHANGELOG.md +++ b/macros/latex/contrib/l3kernel/CHANGELOG.md @@ -7,6 +7,26 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2024-02-13] + +### Added +- Checking missing `\endgroup` at the end of `\DocInclude` +- Linked storage type for large property lists (issue \#1040, pull \#1059) + +### Changed +- `\meta` now typesets in `\texttt`, along with `\Arg` +- Improved the performance of `\cs_if_exist:NTF`, `\cs_if_free:NTF`, + `\cs_if_exist_use:NTF`, and most notably their `c`-type variants. + +### Fixed +- Inconsistent local/global assignments in `\vcoffin_gset:Nnn` and + `\vcoffin_gset:Nnw` +- Tokenization by `\peek_analysis_map_inline:n` of one additional + character after any space or brace + +### Deprecated +- `\msg_gset:nnn(n)` + ## [2024-01-22] ### Added @@ -1648,7 +1668,8 @@ this project uses date-based 'snapshot' version identifiers. - Step functions have been added for dim variables, e.g. `\dim_step_inline:nnnn` -[Unreleased]: https://github.com/latex3/latex3/compare/2024-01-22...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2024-02-13...HEAD +[2024-02-13]: https://github.com/latex3/latex3/compare/2024-01-22...2024-02-13 [2024-01-22]: https://github.com/latex3/latex3/compare/2024-01-04...2024-01-22 [2024-01-04]: https://github.com/latex3/latex3/compare/2023-12-11...2024-01-04 [2023-12-11]: https://github.com/latex3/latex3/compare/2023-12-08...2023-12-11 diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md index 96b7e958f9..ee146d0405 100644 --- a/macros/latex/contrib/l3kernel/README.md +++ b/macros/latex/contrib/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2024-01-22 +Release 2024-02-13 Overview -------- diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx index 8fbb777dcb..a2f820f71f 100644 --- a/macros/latex/contrib/l3kernel/expl3.dtx +++ b/macros/latex/contrib/l3kernel/expl3.dtx @@ -24,7 +24,7 @@ % %<*driver|generic|package|2ekernel> %</driver|generic|package|2ekernel> -\def\ExplFileDate{2024-01-22}% +\def\ExplFileDate{2024-02-13}% %<*driver> \documentclass[full]{l3doc} \usepackage{graphicx} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf Binary files differindex 8f722bc6b4..03b7a491c1 100644 --- a/macros/latex/contrib/l3kernel/expl3.pdf +++ b/macros/latex/contrib/l3kernel/expl3.pdf diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf Binary files differindex 7b5ffdc3e9..dcbc798249 100644 --- a/macros/latex/contrib/l3kernel/interface3.pdf +++ b/macros/latex/contrib/l3kernel/interface3.pdf diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex index 06b8b3d8a6..c4c45a6bca 100644 --- a/macros/latex/contrib/l3kernel/interface3.tex +++ b/macros/latex/contrib/l3kernel/interface3.tex @@ -42,12 +42,6 @@ for those people who are interested. \documentclass[kernel]{l3doc} -% fix for l3doc class -\ExplSyntaxOn -\DeclareDocumentCommand \meta { m } - { \texttt{ \__codedoc_meta:n {#1} } } -\ExplSyntaxOff - \newif\ifinterface \interfacetrue diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx index 0be8bdc8b2..bc79956d05 100644 --- a/macros/latex/contrib/l3kernel/l3basics.dtx +++ b/macros/latex/contrib/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -92,6 +92,9 @@ % to occur within the same function. Indeed, it is often necessary % to start a group within one function and finish it within another, % for example when seeking to use non-standard category codes. +% \begin{texnote} +% These are the \TeX{} primitives \tn{begingroup} and \tn{endgroup}. +% \end{texnote} % \end{function} % % \begin{function}{\group_insert_after:N} @@ -1248,11 +1251,13 @@ % % \begin{function}[EXP]{\if:w, \if_charcode:w, \if_catcode:w} % \begin{syntax} -% "\if:w" <token_1> <token_2> <true code> "\else:" <false code> "\fi:" \\ -% "\if_catcode:w" <token_1> <token_2> <true code> "\else:" <false code> "\fi:" +% "\if:w" <token(s)> <true code> "\else:" <false code> "\fi:" \\ +% "\if_catcode:w" <token(s_> <true code> "\else:" <false code> "\fi:" % \end{syntax} -% These conditionals expand any following tokens until two -% unexpandable tokens are left. If you wish to prevent this expansion, +% These conditionals expand \meta{token(s)} until two +% unexpandable tokens \meta{token_1} and \meta{tokens_2} are left; +% any further tokens become part of the \meta{true code}. +% If you wish to prevent this expansion, % prefix the token in question with "\exp_not:N". "\if_catcode:w" % tests if the category codes of the two tokens are the same whereas % "\if:w" tests if the character codes are @@ -2451,22 +2456,28 @@ % (to be defined) if it does not already exist. % % \begin{macro}[pTF, EXP]{\cs_if_exist:N, \cs_if_exist:c} +% \begin{macro}{\@@_if_exist_c_aux:,\@@_if_exist_c_aux:w} % Two versions for checking existence. For the |N| form we firstly % check for \cs{scan_stop:} and then if it is in the hash % table. There is no problem when inputting something like \cs{else:} % or \cs{fi:} as \TeX{} will only ever skip input in case the token % tested against is \cs{scan_stop:}. +% +% In both the |N| and |c| form we use the way \cs{prg_set_conditional:Npnn} +% optimizes the conditionals to negate the tests using \cs{else:} (the +% \cs{else:} in the top level functions will be removed by the optimization, +% and this usage of \cs{else:} will be fine). % \begin{macrocode} \prg_set_conditional:Npnn \cs_if_exist:N #1 { p , T , F , TF } { \if_meaning:w #1 \scan_stop: - \prg_return_false: + \use_i:nnnn + \else: + \fi: + \if_cs_exist:N #1 + \prg_return_true: \else: - \if_cs_exist:N #1 - \prg_return_true: - \else: - \prg_return_false: - \fi: + \prg_return_false: \fi: } % \end{macrocode} @@ -2477,87 +2488,148 @@ % disturb the scanner. Therefore, we ensure that the second test is % performed after the first one has concluded completely. % \begin{macrocode} -\prg_set_conditional:Npnn \cs_if_exist:c #1 { p , T , F , TF } +\cs_if_exist:NTF \tex_lastnamedcs:D { - \if_cs_exist:w #1 \cs_end: - \exp_after:wN \use_i:nn - \else: - \exp_after:wN \use_ii:nn - \fi: - { - \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop: - \prg_return_false: - \else: - \prg_return_true: - \fi: - } - \prg_return_false: + \prg_set_conditional:Npnn \cs_if_exist:c #1 { p , T , F , TF } + { + \if_cs_exist:w #1 \cs_end: + \@@_if_exist_c_aux: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } + \cs_set:Npn \@@_if_exist_c_aux: + { \fi: \exp_after:wN \if_meaning:w \tex_lastnamedcs:D \scan_stop: \else: } + } + { + \prg_set_conditional:Npnn \cs_if_exist:c #1 { p , T , F , TF } + { + \if_cs_exist:w #1 \cs_end: + \@@_if_exist_c_aux:w + \fi: + \use_none:n {#1} + \if_false: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } + \cs_set:Npn \@@_if_exist_c_aux:w \fi: \use_none:n #1 \if_false: + { \fi: \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop: \else: } } % \end{macrocode} % \end{macro} +% \end{macro} % % \begin{macro}[pTF, EXP]{\cs_if_free:N, \cs_if_free:c} % The logical reversal of the above. % \begin{macrocode} \prg_set_conditional:Npnn \cs_if_free:N #1 { p , T , F , TF } { + \if_cs_exist:N #1 + \else: + \use_none:nnnn + \fi: \if_meaning:w #1 \scan_stop: \prg_return_true: \else: - \if_cs_exist:N #1 - \prg_return_false: - \else: - \prg_return_true: - \fi: + \prg_return_false: \fi: } -\prg_set_conditional:Npnn \cs_if_free:c #1 { p , T , F , TF } +\cs_if_exist:NTF \tex_lastnamedcs:D { - \if_cs_exist:w #1 \cs_end: - \exp_after:wN \use_i:nn - \else: - \exp_after:wN \use_ii:nn - \fi: + \prg_set_conditional:Npnn \cs_if_free:c #1 { p , T , F , TF } + { + \if_cs_exist:w #1 \cs_end: + \@@_if_free_c_aux:w + \fi: + \if_true: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } + \cs_set:Npn \@@_if_free_c_aux:w \fi: \if_true: + { \fi: \exp_after:wN \if_meaning:w \tex_lastnamedcs:D \scan_stop: } + } + { + \prg_set_conditional:Npnn \cs_if_free:c #1 { p , T , F , TF } { - \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop: + \if_cs_exist:w #1 \cs_end: + \@@_if_free_c_aux:w + \fi: + \use_none:n {#1} + \if_true: \prg_return_true: \else: \prg_return_false: \fi: } - { \prg_return_true: } + \cs_set:Npn \@@_if_free_c_aux:w \fi: \use_none:n #1 \if_true: + { \fi: \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop: } } % \end{macrocode} % \end{macro} % % \begin{macro}[EXP,noTF,added=2011-10-10] % {\cs_if_exist_use:N, \cs_if_exist_use:c} +% \begin{macro}{\@@_if_exist_use_aux:w, \@@_if_exist_use_aux:Nnn} % The \cs[index=cs_if_exist_use:N]{cs_if_exist_use:\ldots{}} % functions cannot be implemented % as conditionals because the true branch must leave both the control % sequence itself and the true code in the input stream. % For the \texttt{c} variants, we are careful not to put the control % sequence in the hash table if it does not exist. -% In \LuaTeX{} we could use the \tn{lastnamedcs} primitive. +% If available we use the \tn{lastnamedcs} primitive. % \begin{macrocode} \cs_set:Npn \cs_if_exist_use:NTF #1#2 { \cs_if_exist:NTF #1 { #1 #2 } } \cs_set:Npn \cs_if_exist_use:NF #1 - { \cs_if_exist:NTF #1 { #1 } } + { \cs_if_exist:NTF #1 #1 } \cs_set:Npn \cs_if_exist_use:NT #1 #2 - { \cs_if_exist:NTF #1 { #1 #2 } { } } + { \cs_if_exist:NT #1 { #1 #2 } } \cs_set:Npn \cs_if_exist_use:N #1 - { \cs_if_exist:NTF #1 { #1 } { } } -\cs_set:Npn \cs_if_exist_use:cTF #1#2 - { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } } + { \cs_if_exist:NT #1 #1 } +\cs_if_exist:NTF \tex_lastnamedcs:D + { + \cs_set:Npn \cs_if_exist_use:cTF #1 + { + \if_cs_exist:w #1 \cs_end: + \@@_if_exist_use_aux:w + \fi: + \use_ii:nn + } + \cs_set:Npn \@@_if_exist_use_aux:w \fi: \use_ii:nn + { \fi: \exp_after:wN \@@_if_exist_use_aux:Nnn \tex_lastnamedcs:D } + } + { + \cs_set:Npn \cs_if_exist_use:cTF #1 + { + \if_cs_exist:w #1 \cs_end: + \@@_if_exist_use_aux:w + \fi: + \use_iii:nnn {#1} + } + \cs_set:Npn \@@_if_exist_use_aux:w \fi: \use_iii:nnn #1 + { \fi: \exp_after:wN \@@_if_exist_use_aux:Nnn \cs:w #1 \cs_end: } + } +\cs_set:Npn \@@_if_exist_use_aux:Nnn #1#2 + { + \if_meaning:w #1 \scan_stop: + \exp_after:wN \use_iii:nnn + \fi: + \use_i:nn { #1 #2 } + } \cs_set:Npn \cs_if_exist_use:cF #1 - { \cs_if_exist:cTF {#1} { \use:c {#1} } } + { \cs_if_exist_use:cTF {#1} {} } \cs_set:Npn \cs_if_exist_use:cT #1#2 - { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } { } } + { \cs_if_exist_use:cTF {#1} {#2} {} } \cs_set:Npn \cs_if_exist_use:c #1 - { \cs_if_exist:cTF {#1} { \use:c {#1} } { } } + { \cs_if_exist_use:cTF {#1} {} {} } % \end{macrocode} % \end{macro} +% \end{macro} % % \subsection{Preliminaries for new functions} % @@ -3270,7 +3342,7 @@ \cs_new_protected:Npn \group_show_list: { \@@_group_show:NN \use_none:n 1 } \cs_new_protected:Npn \group_log_list: - { \@@_group_show:NN \int_zero:N 0 } + { \@@_group_show:NN \int_gzero:N 0 } \cs_new_protected:Npn \@@_group_show:NN #1#2 { \use:e @@ -3280,7 +3352,7 @@ \int_set:Nn \tex_errorcontextlines:D { -1 } \exp_not:N \exp_after:wN \scan_stop: \tex_showgroups:D - \int_set:Nn \tex_interactionmode:D + \int_gset:Nn \tex_interactionmode:D { \int_use:N \tex_interactionmode:D } \int_set:Nn \tex_tracingonline:D { \int_use:N \tex_tracingonline:D } diff --git a/macros/latex/contrib/l3kernel/l3bitset.dtx b/macros/latex/contrib/l3kernel/l3bitset.dtx index 498e9954cc..e87a9c9e0f 100644 --- a/macros/latex/contrib/l3kernel/l3bitset.dtx +++ b/macros/latex/contrib/l3kernel/l3bitset.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx index c1fb85f8c0..b6a747f833 100644 --- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx +++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx index ae3bc283c2..5cb80d888d 100644 --- a/macros/latex/contrib/l3kernel/l3box.dtx +++ b/macros/latex/contrib/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -1343,9 +1343,9 @@ { \exp_args:No \@@_log:nNnn { \tex_the:D \tex_interactionmode:D } } \cs_new_protected:Npn \@@_log:nNnn #1#2#3#4 { - \int_set:Nn \tex_interactionmode:D { 0 } + \int_gset:Nn \tex_interactionmode:D { 0 } \@@_show:NNff 0 #2 { \int_eval:n {#3} } { \int_eval:n {#4} } - \int_set:Nn \tex_interactionmode:D {#1} + \int_gset:Nn \tex_interactionmode:D {#1} } \cs_generate_variant:Nn \box_log:Nnn { c } % \end{macrocode} @@ -2279,7 +2279,7 @@ \cs_generate_variant:Nn \box_autosize_to_wd_and_ht:Nnn { c } \cs_new_protected:Npn \box_gautosize_to_wd_and_ht:Nnn #1#2#3 { \@@_autosize:NnnnN #1 {#2} {#3} { \box_ht:N #1 } \hbox_gset:Nn } -\cs_generate_variant:Nn \box_autosize_to_wd_and_ht:Nnn { c } +\cs_generate_variant:Nn \box_gautosize_to_wd_and_ht:Nnn { c } \cs_new_protected:Npn \box_autosize_to_wd_and_ht_plus_dp:Nnn #1#2#3 { \@@_autosize:NnnnN #1 {#2} {#3} { \box_ht:N #1 + \box_dp:N #1 } diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/contrib/l3kernel/l3cctab.dtx index e3285d9bd9..a11b0e31a7 100644 --- a/macros/latex/contrib/l3kernel/l3cctab.dtx +++ b/macros/latex/contrib/l3kernel/l3cctab.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx index a8e24c2a30..54b558f7ea 100644 --- a/macros/latex/contrib/l3kernel/l3clist.dtx +++ b/macros/latex/contrib/l3kernel/l3clist.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx index c6882fe5b3..c8a71eb252 100644 --- a/macros/latex/contrib/l3kernel/l3coffins.dtx +++ b/macros/latex/contrib/l3kernel/l3coffins.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -128,7 +128,7 @@ % environment in a coffin. % \end{function} % -% \begin{function}[added = 2011-08-17, updated = 2019-01-21] +% \begin{function}[added = 2011-08-17, updated = 2023-02-03] % { % \vcoffin_set:Nnn, \vcoffin_set:cnn, % \vcoffin_gset:Nnn, \vcoffin_gset:cnn @@ -142,7 +142,7 @@ % size of the typeset material. % \end{function} % -% \begin{function}[added = 2011-09-10, updated = 2019-01-21] +% \begin{function}[added = 2011-09-10, updated = 2023-02-03] % { % \vcoffin_set:Nnw, \vcoffin_set:cnw, \vcoffin_set_end:, % \vcoffin_gset:Nnw, \vcoffin_gset:cnw, \vcoffin_gset_end: @@ -702,7 +702,7 @@ % \vcoffin_set:Nnn, \vcoffin_set:cnn, % \vcoffin_gset:Nnn, \vcoffin_gset:cnn % } -% \begin{macro}{\@@_set_vertical:NnnNN} +% \begin{macro}{\@@_set_vertical:NnnNNN} % \begin{macro}{\@@_set_vertical_aux:} % Setting vertical coffins is more complex. First, the material is % typeset with a given width. The default handles and poles are set as @@ -714,17 +714,17 @@ % \begin{macrocode} \cs_new_protected:Npn \vcoffin_set:Nnn #1#2#3 { - \@@_set_vertical:NnnNN #1 {#2} {#3} - \vbox_set:Nn \coffin_reset_poles:N + \@@_set_vertical:NnnNNN #1 {#2} {#3} + \vbox_set:Nn \coffin_reset_poles:N \@@_set_pole:Nnn } \cs_generate_variant:Nn \vcoffin_set:Nnn { c } \cs_new_protected:Npn \vcoffin_gset:Nnn #1#2#3 { - \@@_set_vertical:NnnNN #1 {#2} {#3} - \vbox_gset:Nn \coffin_greset_poles:N + \@@_set_vertical:NnnNNN #1 {#2} {#3} + \vbox_gset:Nn \coffin_greset_poles:N \@@_gset_pole:Nnn } \cs_generate_variant:Nn \vcoffin_gset:Nnn { c } -\cs_new_protected:Npn \@@_set_vertical:NnnNN #1#2#3#4#5 +\cs_new_protected:Npn \@@_set_vertical:NnnNNN #1#2#3#4#5#6 { \@@_if_exist:NT #1 { @@ -736,7 +736,7 @@ } #5 #1 \vbox_set_top:Nn \l_@@_internal_box { \vbox_unpack:N #1 } - \@@_set_pole:Nne #1 { T } + #6 #1 { T } { { 0pt } { @@ -804,25 +804,25 @@ % % \begin{macro} % {\vcoffin_set:Nnw, \vcoffin_set:cnw, \vcoffin_gset:Nnw, \vcoffin_gset:cnw} -% \begin{macro}{\@@_set_vertical:NnNNNNw} +% \begin{macro}{\@@_set_vertical:NnNNNNNw} % \begin{macro}{\vcoffin_set_end:, \vcoffin_gset_end:} % The same for vertical coffins. % \begin{macrocode} \cs_new_protected:Npn \vcoffin_set:Nnw #1#2 { - \@@_set_vertical:NnNNNNw #1 {#2} \vbox_set:Nw + \@@_set_vertical:NnNNNNNw #1 {#2} \vbox_set:Nw \vcoffin_set_end: - \vbox_set_end: \coffin_reset_poles:N + \vbox_set_end: \coffin_reset_poles:N \@@_set_pole:Nnn } \cs_generate_variant:Nn \vcoffin_set:Nnw { c } \cs_new_protected:Npn \vcoffin_gset:Nnw #1#2 { - \@@_set_vertical:NnNNNNw #1 {#2} \vbox_gset:Nw + \@@_set_vertical:NnNNNNNw #1 {#2} \vbox_gset:Nw \vcoffin_gset_end: - \vbox_gset_end: \coffin_greset_poles:N + \vbox_gset_end: \coffin_greset_poles:N \@@_gset_pole:Nnn } \cs_generate_variant:Nn \vcoffin_gset:Nnw { c } -\cs_new_protected:Npn \@@_set_vertical:NnNNNNw #1#2#3#4#5#6 +\cs_new_protected:Npn \@@_set_vertical:NnNNNNNw #1#2#3#4#5#6#7 { \@@_if_exist:NT #1 { @@ -834,7 +834,7 @@ #5 #6 #1 \vbox_set_top:Nn \l_@@_internal_box { \vbox_unpack:N #1 } - \@@_set_pole:Nne #1 { T } + #7 #1 { T } { { 0pt } { @@ -989,7 +989,7 @@ % \coffin_gset_vertical_pole:Nnn, \coffin_gset_vertical_pole:cnn % } % \begin{macro}{\@@_set_vertical_pole:NnnN} -% \begin{macro}{\@@_set_pole:Nnn, \@@_set_pole:Nne} +% \begin{macro}{\@@_set_pole:Nnn, \@@_gset_pole:Nnn} % Setting the pole of a coffin at the user/designer level requires a % bit more care. The idea here is to provide a reasonable interface to % the system, then to do the setting with full expansion. The @@ -1033,10 +1033,14 @@ } \cs_new_protected:Npn \@@_set_pole:Nnn #1#2#3 { - \prop_put:cnn { coffin ~ \@@_to_value:N #1 ~ poles } + \prop_put:cne { coffin ~ \@@_to_value:N #1 ~ poles } + {#2} {#3} + } +\cs_new_protected:Npn \@@_gset_pole:Nnn #1#2#3 + { + \prop_gput:cne { coffin ~ \@@_to_value:N #1 ~ poles } {#2} {#3} } -\cs_generate_variant:Nn \@@_set_pole:Nnn { Nne } % \end{macrocode} % \end{macro} % \end{macro} @@ -2068,7 +2072,7 @@ \tl_if_in:nnTF {#2} { - } { \tl_set:Nn \l_@@_internal_tl { {#2} } } { \tl_set:Nn \l_@@_internal_tl { { #1 - #2 } } } - \exp_last_unbraced:NNo \@@_set_pole:Nne \l_@@_aligned_coffin + \exp_last_unbraced:NNo \@@_set_pole:Nnn \l_@@_aligned_coffin { \l_@@_internal_tl } { { \dim_use:N \l_@@_x_dim } { \dim_use:N \l_@@_y_dim } @@ -2130,11 +2134,11 @@ { \dim_compare:nNnTF {#2} < {#6} { - \@@_set_pole:Nne #9 { T } + \@@_set_pole:Nnn #9 { T } { { 0pt } {#6} { 1000pt } { 0pt } } } { - \@@_set_pole:Nne #9 { T } + \@@_set_pole:Nnn #9 { T } { { 0pt } {#2} { 1000pt } { 0pt } } } } @@ -2142,11 +2146,11 @@ { \dim_compare:nNnTF {#2} < {#6} { - \@@_set_pole:Nne #9 { B } + \@@_set_pole:Nnn #9 { B } { { 0pt } {#2} { 1000pt } { 0pt } } } { - \@@_set_pole:Nne #9 { B } + \@@_set_pole:Nnn #9 { B } { { 0pt } {#6} { 1000pt } { 0pt } } } } diff --git a/macros/latex/contrib/l3kernel/l3color.dtx b/macros/latex/contrib/l3kernel/l3color.dtx index 950bf3d6be..6ecdf216c4 100644 --- a/macros/latex/contrib/l3kernel/l3color.dtx +++ b/macros/latex/contrib/l3kernel/l3color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx index e8f577a4bb..f345c6d303 100644 --- a/macros/latex/contrib/l3kernel/l3debug.dtx +++ b/macros/latex/contrib/l3kernel/l3debug.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -55,71 +55,9 @@ % % \section{\pkg{l3debug} implementation} % -% \begin{function}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N} -% \begin{syntax} -% \cs{__kernel_chk_var_local:N} \meta{var} -% \cs{__kernel_chk_var_global:N} \meta{var} -% \end{syntax} -% Applies \cs{__kernel_chk_var_exist:N} \meta{var} as well as -% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}, where -% \meta{scope} is |l| or~|g|. -% \end{function} -% -% \begin{function}{\__kernel_chk_var_scope:NN} -% \begin{syntax} -% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var} -% \end{syntax} -% Checks the \meta{var} has the correct \meta{scope}, and if not -% raises a kernel-level error. This function is only created if -% debugging is enabled. The \meta{scope} is a single letter |l|, |g|, -% |c| denoting local variables, global variables, or constants. More -% precisely, if the variable name starts with a letter and an -% underscore (normal \pkg{expl3} convention) the function checks that -% this single letter matches the \meta{scope}. Otherwise the function -% cannot know the scope \meta{var} the first time: instead, it defines -% |\__debug_chk_/|\meta{var name} to store that information for the -% next call. Thus, if a given \meta{var} is subject to assignments of -% different scopes a kernel error will result. -% \end{function} -% -% \begin{function} -% { -% \__kernel_chk_cs_exist:N, -% \__kernel_chk_cs_exist:c, -% \__kernel_chk_var_exist:N -% } -% \begin{syntax} -% \cs{__kernel_chk_cs_exist:N} \meta{cs} -% \cs{__kernel_chk_var_exist:N} \meta{var} -% \end{syntax} -% These functions are only created if debugging is enabled. They -% check that their argument is defined according to the criteria for -% \cs{cs_if_exist_p:N}, -% and if not raises a kernel-level error. Error messages are -% different. -% \end{function} -% -% \begin{function}[EXP]{\__kernel_chk_flag_exist:NN} -% \begin{syntax} -% \cs{__kernel_chk_flag_exist:NN} -% \meta{function} \meta{flag} -% \end{syntax} -% This function is only created if debugging is enabled. It checks -% that the \meta{flag} is defined according to the criterion for -% \cs{flag_if_exist_p:N}, and if not raises a kernel-level error and -% calls the function with the argument \cs{l_tmpa_flag} to proceed -% somehow without producing too many errors. -% \end{function} -% -% \begin{function}{\__kernel_debug_log:e} -% \begin{syntax} -% \cs{__kernel_debug_log:e} \Arg{message text} -% \end{syntax} -% If the \texttt{log-functions} option is active, this function writes -% the \meta{message text} to the log file using \cs{iow_log:e}. -% Otherwise, the \meta{message text} is ignored using \cs{use_none:n}. -% This function is only created if debugging is enabled. -% \end{function} +% Internal kernel functions that are only defined here are listed in +% \pkg{l3kernel-functions}, +% see~\ref{sec:l3kernel-functions:l3debug-internals}. % % \begin{macrocode} %<*package> @@ -131,7 +69,7 @@ % % Standard file identification. % \begin{macrocode} -\ProvidesExplFile{l3debug.def}{2024-01-22}{}{L3 Debugging support} +\ProvidesExplFile{l3debug.def}{2024-02-13}{}{L3 Debugging support} % \end{macrocode} % % \begin{variable}{\s_@@_stop} @@ -782,6 +720,8 @@ { \clist_concat:NNN \clist_gconcat:NNN + \prop_concat:NNN + \prop_gconcat:NNN \seq_concat:NNN \seq_gconcat:NNN \str_concat:NNN @@ -836,6 +776,17 @@ \muskip_add:Nn \muskip_sub:Nn \muskip_set_eq:NN + \prop_clear:N + \prop_concat:NNN + \prop_pop:NnN + \prop_pop:NnNT + \prop_pop:NnNF + \prop_pop:NnNTF + \prop_put:Nnn + \prop_put_if_new:Nnn + \prop_put_from_keyval:Nn + \prop_remove:Nn + \prop_set_eq:NN \seq_set_eq:NN \skip_zero:N \skip_set:Nn @@ -905,6 +856,17 @@ \muskip_gadd:Nn \muskip_gsub:Nn \muskip_gset_eq:NN + \prop_gclear:N + \prop_gconcat:NNN + \prop_gpop:NnN + \prop_gpop:NnNT + \prop_gpop:NnNF + \prop_gpop:NnNTF + \prop_gput:Nnn + \prop_gput_if_new:Nnn + \prop_gput_from_keyval:Nn + \prop_gremove:Nn + \prop_gset_eq:NN \seq_gset_eq:NN \skip_gzero:N \skip_gset:Nn @@ -952,6 +914,8 @@ \int_const:Nn \intarray_const_from_clist:Nn \muskip_const:Nn + \prop_const_from_keyval:Nn + \prop_const_linked_from_keyval:Nn \skip_const:Nn \str_const:Nn \tl_const:Nn diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx index 99b52ec961..674ca610bd 100644 --- a/macros/latex/contrib/l3kernel/l3deprecation.dtx +++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -313,6 +313,21 @@ % \end{macro} % \end{macro} % +% \subsection{Deprecated \pkg{l3msg} functions} +% +% \begin{macrocode} +%<@@=msg> +% \end{macrocode} +% +% \begin{macro}[deprecated]{\msg_gset:nnnn, \msg_gset:nnn} +% \begin{macrocode} +\__kernel_patch_deprecation:nnNNpn { 2024-01-17 } { \msg_set:nnnn } +\cs_new_protected:Npn \msg_gset:nnnn { \msg_set:nnnn } +\__kernel_patch_deprecation:nnNNpn { 2024-01-17 } { \msg_set:nnn } +\cs_new_protected:Npn \msg_gset:nnn { \msg_set:nnn } +% \end{macrocode} +% \end{macro} +% % \subsection{Deprecated \pkg{l3pdf} functions} % % \begin{macrocode} diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx index fde5ddd103..48e022ae80 100644 --- a/macros/latex/contrib/l3kernel/l3doc.dtx +++ b/macros/latex/contrib/l3kernel/l3doc.dtx @@ -71,7 +71,7 @@ and all files in that bundle must be distributed together. % This isn't included in the typeset documentation because it's a bit % ugly: %<*class> -\ProvidesExplClass{l3doc}{2024-01-22}{} +\ProvidesExplClass{l3doc}{2024-02-13}{} {L3 Experimental documentation class} %</class> % \fi @@ -84,7 +84,7 @@ and all files in that bundle must be distributed together. % require you to do updates, if the class changes.}} % % \author{\Team} -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % \maketitle % \tableofcontents % @@ -1740,7 +1740,7 @@ and all files in that bundle must be distributed together. % A document-level command. % \begin{macrocode} \DeclareDocumentCommand \meta { m } - { \@@_meta:n {#1} } + { \texttt{ \@@_meta:n {#1} } } % \end{macrocode} % \end{macro} % @@ -1760,10 +1760,11 @@ and all files in that bundle must be distributed together. { < \tl_to_str:n {#1} > } \pdfstringdefDisableCommands { - \cs_set_eq:NN \cmd \@@_pdfstring_cmd:w - \cs_set_eq:NN \cs \@@_pdfstring_cs:w - \cs_set_eq:NN \tn \@@_pdfstring_cs:w - \cs_set_eq:NN \meta \@@_pdfstring_meta:w + \cs_set_eq:NN \cmd \@@_pdfstring_cmd:w + \cs_set_eq:NN \cs \@@_pdfstring_cs:w + \cs_set_eq:NN \tn \@@_pdfstring_cs:w + \cs_set_eq:NN \meta \@@_pdfstring_meta:w + \cs_set_eq:NN \@@_meta:n \@@_pdfstring_meta:w } % \end{macrocode} % \end{macro} @@ -1775,10 +1776,10 @@ and all files in that bundle must be distributed together. % Finally, \cs{Arg} is the same as \cs{marg}. % \begin{macrocode} \newcommand\Arg[1] - { \texttt{\char`\{} \meta{#1} \texttt{\char`\}} } + { \texttt{\char`\{} \@@_meta:n {#1} \texttt{\char`\}} } \providecommand\marg[1]{ \Arg{#1} } -\providecommand\oarg[1]{ \texttt[ \meta{#1} \texttt] } -\providecommand\parg[1]{ \texttt( \meta{#1} \texttt) } +\providecommand\oarg[1]{ \texttt[ \@@_meta:n {#1} \texttt] } +\providecommand\parg[1]{ \texttt( \@@_meta:n {#1} \texttt) } % \end{macrocode} % \end{macro} % @@ -3727,10 +3728,22 @@ and all files in that bundle must be distributed together. % % \begin{macro}{\DocInclude} % More or less exactly the same as \tn{include}, but uses -% \tn{DocInput} on a \file{.dtx} file, not \tn{input} on a \file{.tex} -% file. +% \tn{DocInput} on a \file{.fdd} or \file{.dtx} file (without file +% extension), not \tn{input} on a \file{.tex} file. % % \begin{macrocode} +\msg_new:nnn { l3doc } { missing-endgroup } + { + \str_if_eq:VnTF \@currenvir { document } + { + There~are~\int_use:N \tex_currentgrouplevel:D + \c_space_tl unclosed~groups~in~#1. + } + { + The~\@currenvir \c_space_tl environment~on~line~\@currenvline + \c_space_tl doesn't~have~a~matching~\iow_char:N\\end{\@currenvir}. + } + } \NewDocumentCommand \DocInclude { m } { \relax\clearpage @@ -3741,6 +3754,13 @@ and all files in that bundle must be distributed together. \int_compare:nNnTF \@auxout = \@partaux { \@latexerr{\string\include\space cannot~be~nested}\@eha } { \@docinclude {#1} } + % check missing \endgroup, e.g., missing "\end{macro}" in time + \int_compare:nNnF { \tex_currentgrouplevel:D } = { 0 } + { + \int_compare:nNnT { \tex_interactionmode:D } = { 0 } + { \int_gset:Nn \tex_interactionmode:D { 1 } } + \msg_fatal:nne { l3doc } { missing-endgroup } { \currentfile } + } } % \end{macrocode} % @@ -4087,7 +4107,7 @@ and all files in that bundle must be distributed together. \int_set:Nn \l_@@_tmpa_int { \tex_interactionmode:D } \errorstopmode \ClassError { l3doc } { \l_@@_tmpa_tl } { } - \int_set:Nn \tex_interactionmode:D { \l_@@_tmpa_int } + \int_gset:Nn \tex_interactionmode:D { \l_@@_tmpa_int } } } } diff --git a/macros/latex/contrib/l3kernel/l3doc.pdf b/macros/latex/contrib/l3kernel/l3doc.pdf Binary files differindex 352082c2ab..9d301da547 100644 --- a/macros/latex/contrib/l3kernel/l3doc.pdf +++ b/macros/latex/contrib/l3kernel/l3doc.pdf diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx index 9034fb7176..f55be84c36 100644 --- a/macros/latex/contrib/l3kernel/l3docstrip.dtx +++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf Binary files differindex 2098a2ce21..923689f3d8 100644 --- a/macros/latex/contrib/l3kernel/l3docstrip.pdf +++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx index 5ea58b75d5..7527b4091a 100644 --- a/macros/latex/contrib/l3kernel/l3expan.dtx +++ b/macros/latex/contrib/l3kernel/l3expan.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -571,6 +571,7 @@ % \exp_last_unbraced:Nco, % \exp_last_unbraced:NcV, % \exp_last_unbraced:Nno, +% \exp_last_unbraced:Nnf, % \exp_last_unbraced:Noo, % \exp_last_unbraced:Nfo, % \exp_last_unbraced:NNNo, @@ -1436,6 +1437,7 @@ % \exp_last_unbraced:NNNV, % \exp_last_unbraced:NNNf, % \exp_last_unbraced:Nno, +% \exp_last_unbraced:Nnf, % \exp_last_unbraced:Noo, % \exp_last_unbraced:Nfo, % \exp_last_unbraced:NnNo, @@ -1494,6 +1496,7 @@ \exp:w \exp_end_continue_f:w #4 } \cs_new:Npn \exp_last_unbraced:Nno { \::n \::o_unbraced \::: } +\cs_new:Npn \exp_last_unbraced:Nnf { \::n \::f_unbraced \::: } \cs_new:Npn \exp_last_unbraced:Noo { \::o \::o_unbraced \::: } \cs_new:Npn \exp_last_unbraced:Nfo { \::f \::o_unbraced \::: } \cs_new:Npn \exp_last_unbraced:NnNo { \::n \::N \::o_unbraced \::: } diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx index cc14b48980..091c7b57f0 100644 --- a/macros/latex/contrib/l3kernel/l3file.dtx +++ b/macros/latex/contrib/l3kernel/l3file.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -718,10 +718,8 @@ % \cs{file_if_exist_p:n} \Arg{file name} % \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code} % \end{syntax} -% Expands the argument of the \cs{file name} to give a string, then -% searches for this string using the current \TeX{} search -% path and the additional paths controlled by -% \cs{l_file_search_path_seq}. +% Tests if \meta{file name} is found in the path as detailed for +% \cs{file_if_exist:nTF}. % \end{function} % % \subsection{Information about files and file contents} diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx index b0a586d48b..d1325b2c96 100644 --- a/macros/latex/contrib/l3kernel/l3flag.dtx +++ b/macros/latex/contrib/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx index e2e9937c2c..ca71600b16 100644 --- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % \maketitle % % \begin{documentation} diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx index cc54b7e02b..1c8c57a3f9 100644 --- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx index ed13beb5fd..4227b8f6f5 100644 --- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx index d5b73e7d97..413d4988a5 100644 --- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx index 2c86293101..0013d859a9 100644 --- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx index 0e4e48a0a9..be9cc93107 100644 --- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-functions.dtx b/macros/latex/contrib/l3kernel/l3fp-functions.dtx index 3e423c0908..4024dbacf3 100644 --- a/macros/latex/contrib/l3kernel/l3fp-functions.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-functions.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx index 13eeed8888..42d88735c4 100644 --- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx index ef6c2ad392..2bcd5a2c89 100644 --- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx index 8c68289d60..7d32a59a51 100644 --- a/macros/latex/contrib/l3kernel/l3fp-random.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx index a01b9505da..e6bb4e58c0 100644 --- a/macros/latex/contrib/l3kernel/l3fp-round.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx b/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx index 01e883f136..088c118b9c 100644 --- a/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-symbolic.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx index 6212ff731c..90f33a7aa4 100644 --- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % \maketitle % % \begin{documentation} diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx index 5cf22fd7e9..c7d235b991 100644 --- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp-types.dtx b/macros/latex/contrib/l3kernel/l3fp-types.dtx index fc6a34f6a1..2843b9131c 100644 --- a/macros/latex/contrib/l3kernel/l3fp-types.dtx +++ b/macros/latex/contrib/l3kernel/l3fp-types.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx index bdc1d3fae3..cfd8b118fc 100644 --- a/macros/latex/contrib/l3kernel/l3fp.dtx +++ b/macros/latex/contrib/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx index 2d8cd62f14..b9b4e4a096 100644 --- a/macros/latex/contrib/l3kernel/l3fparray.dtx +++ b/macros/latex/contrib/l3kernel/l3fparray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx index 4d5f91cf53..9a6d09f193 100644 --- a/macros/latex/contrib/l3kernel/l3int.dtx +++ b/macros/latex/contrib/l3kernel/l3int.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx index 118e44ff3b..cc3f7a2c6c 100644 --- a/macros/latex/contrib/l3kernel/l3intarray.dtx +++ b/macros/latex/contrib/l3kernel/l3intarray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx index 6b3db5fd7d..c19add5937 100644 --- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx +++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -55,17 +55,77 @@ % % \section{\pkg{l3kernel-functions}: kernel-reserved functions} % -% \subsection{Internal kernel functions} +% \subsection{Internal \pkg{l3debug} kernel functions} +% \label{sec:l3kernel-functions:l3debug-internals} +% +% These function are only created if debugging is enabled, hence they are +% actually defined in \pkg{l3debug}. +% +% \begin{function}{\__kernel_chk_var_local:N, \__kernel_chk_var_global:N} +% \begin{syntax} +% \cs{__kernel_chk_var_local:N} \meta{var} +% \cs{__kernel_chk_var_global:N} \meta{var} +% \end{syntax} +% Applies \cs{__kernel_chk_var_exist:N} \meta{var} as well as +% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var}, where +% \meta{scope} is |l| or~|g|. +% \end{function} % -% \begin{function}{\__kernel_chk_cs_exist:N, \__kernel_chk_cs_exist:c} +% \begin{function}{\__kernel_chk_var_scope:NN} +% \begin{syntax} +% \cs{__kernel_chk_var_scope:NN} \meta{scope} \meta{var} +% \end{syntax} +% Checks the \meta{var} has the correct \meta{scope}, and if not +% raises a kernel-level error. +% The \meta{scope} is a single letter |l|, |g|, +% |c| denoting local variables, global variables, or constants. More +% precisely, if the variable name starts with a letter and an +% underscore (normal \pkg{expl3} convention) the function checks that +% this single letter matches the \meta{scope}. Otherwise the function +% cannot know the scope \meta{var} the first time: instead, it defines +% |\__debug_chk_/|\meta{var name} to store that information for the +% next call. Thus, if a given \meta{var} is subject to assignments of +% different scopes a kernel error will result. +% \end{function} +% +% \begin{function} +% { +% \__kernel_chk_cs_exist:N, +% \__kernel_chk_cs_exist:c, +% \__kernel_chk_var_exist:N +% } % \begin{syntax} % \cs{__kernel_chk_cs_exist:N} \meta{cs} +% \cs{__kernel_chk_var_exist:N} \meta{var} +% \end{syntax} +% Checks that their argument is defined according to the criteria for +% \cs{cs_if_exist_p:N}, +% and if not raises a kernel-level error. Error messages are +% different. +% \end{function} +% +% \begin{function}[EXP]{\__kernel_chk_flag_exist:NN} +% \begin{syntax} +% \cs{__kernel_chk_flag_exist:NN} +% \meta{function} \meta{flag} % \end{syntax} -% This function is only created if debugging is enabled. It checks -% that \meta{cs} exists according to the criteria for -% \cs{cs_if_exist_p:N}, and if not raises a kernel-level error. +% Checks that the \meta{flag} is defined according to the criterion for +% \cs{flag_if_exist_p:N}, and if not raises a kernel-level error and +% calls the function with the argument \cs{l_tmpa_flag} to proceed +% somehow without producing too many errors. % \end{function} % +% \begin{function}{\__kernel_debug_log:e} +% \begin{syntax} +% \cs{__kernel_debug_log:e} \Arg{message text} +% \end{syntax} +% If the \texttt{log-functions} option is active, this function writes +% the \meta{message text} to the log file using \cs{iow_log:e}. +% Otherwise, the \meta{message text} is ignored using \cs{use_none:n}. +% \end{function} +% +% \subsection{Internal kernel functions} +% % \begin{function}{\__kernel_chk_defined:NT} % \begin{syntax} % \cs{__kernel_chk_defined:NT} \meta{variable} \Arg{true code} diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx index 54155d6d4e..18b42ae30d 100644 --- a/macros/latex/contrib/l3kernel/l3keys.dtx +++ b/macros/latex/contrib/l3kernel/l3keys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -89,7 +89,7 @@ % \end{verbatim} % As illustrated, keys are created inside a \meta{module}: a set of related % keys, typically those for a single module/\LaTeXe{} package. See -% Section~\label{sec:l3keys:subdivision} for suggestions on how to divide +% Section~\ref{sec:l3keys:subdivision} for suggestions on how to divide % large numbers of keys for a single module. % % At a document level, \cs{keys_set:nn} is used within a @@ -3504,7 +3504,7 @@ { \prg_return_true: } { \prg_return_false: } } -\prg_generate_conditional_variant:Nnn \keys_if_exist:nn { ne } { T , F , TF } +\prg_generate_conditional_variant:Nnn \keys_if_exist:nn { ne } { p , T , F , TF } % \end{macrocode} % \end{macro} % diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx index f8846e7cb8..0a7b8bb9a1 100644 --- a/macros/latex/contrib/l3kernel/l3legacy.dtx +++ b/macros/latex/contrib/l3kernel/l3legacy.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx index 55f33b80a5..8a18c7fbf1 100644 --- a/macros/latex/contrib/l3kernel/l3luatex.dtx +++ b/macros/latex/contrib/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx index dced50e37f..5cbf548e0e 100644 --- a/macros/latex/contrib/l3kernel/l3msg.dtx +++ b/macros/latex/contrib/l3kernel/l3msg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -120,7 +120,7 @@ % used. An error is raised if the \meta{message} already exists. % \end{function} % -% \begin{function}{\msg_set:nnnn, \msg_set:nnn, \msg_gset:nnnn, \msg_gset:nnn} +% \begin{function}{\msg_set:nnnn, \msg_set:nnn} % \begin{syntax} % \cs{msg_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text} % \end{syntax} @@ -809,15 +809,17 @@ % \msg_new:nnnn, \msg_new:nnee, \msg_new:nnxx, % \msg_new:nnn, \msg_new:nne, \msg_new:nnx % } -% \begin{macro}{\msg_gset:nnnn, \msg_gset:nnn} % \begin{macro}{\msg_set:nnnn, \msg_set:nnn} % Setting a message simply means saving the appropriate text % into two functions. A sanity check first. % \begin{macrocode} -\cs_new_protected:Npn \msg_new:nnnn #1#2 +\cs_new_protected:Npn \msg_new:nnnn #1#2#3#4 { \@@_chk_free:nn {#1} {#2} - \msg_gset:nnnn {#1} {#2} + \cs_gset:cpn { \c_@@_text_prefix_tl #1 / #2 } + ##1##2##3##4 {#3} + \cs_gset:cpn { \c_@@_more_text_prefix_tl #1 / #2 } + ##1##2##3##4 {#4} } \cs_generate_variant:Nn \msg_new:nnnn { nnee , nnxx } \cs_new_protected:Npn \msg_new:nnn #1#2#3 @@ -832,19 +834,9 @@ } \cs_new_protected:Npn \msg_set:nnn #1#2#3 { \msg_set:nnnn {#1} {#2} {#3} { } } -\cs_new_protected:Npn \msg_gset:nnnn #1#2#3#4 - { - \cs_gset:cpn { \c_@@_text_prefix_tl #1 / #2 } - ##1##2##3##4 {#3} - \cs_gset:cpn { \c_@@_more_text_prefix_tl #1 / #2 } - ##1##2##3##4 {#4} - } -\cs_new_protected:Npn \msg_gset:nnn #1#2#3 - { \msg_gset:nnnn {#1} {#2} {#3} { } } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} % % \subsection{Messages: support functions and text} % @@ -2227,6 +2219,14 @@ { internal~structure:\\\\\iow_indent:n {#4} } } } +\msg_new:nnnn { prop } { bad-link } + { Variable~'#1'~is~not~a~valid~(linked)~prop. } + { + \c_@@_coding_error_text_tl + The~variable~'#1'~has~an~incorrect~internal~structure.~ + Its~internal~entry~'#2'~points~to~'#3',~whose~name~is~not~of~the~ + form~'#4~<key>'. + } \msg_new:nnnn { clist } { non-clist } { Variable~'#1'~is~not~a~valid~clist. } { @@ -2236,6 +2236,24 @@ should~be~a~clist~variable,~but~it~includes~empty~or~blank~items~ without~braces. } +\msg_new:nnnn { prop } { misused } + { A~property~list~was~misused. } + { + \c_@@_coding_error_text_tl + A~property~list~variable~was~used~without~an~accessor~function.~ + It~ + \tl_if_empty:nTF {#1} + { is~empty. } + { contains~the~key-value~pairs \use_none:n #1 . } + } +\msg_new:nnnn { prop } { inner-make } + { '#1'~ cannot~ be~ used~ in~ a~ group. } + { + \c_@@_coding_error_text_tl + The~ command~ '#1'~ was~ applied~ to~ the~ property~ list~ + variable~ '#2', but~ the~ storage~ type~ can~ only~ be~ changed~ + at~ the~ outermost~ group~ level. + } % \end{macrocode} % % Some errors only appear in expandable settings, @@ -2247,8 +2265,6 @@ { Erroneous~variable~#1 used! } \msg_new:nnn { seq } { misused } { A~sequence~was~misused. } -\msg_new:nnn { prop } { misused } - { A~property~list~was~misused. } \msg_new:nnn { prg } { negative-replication } { Negative~argument~for~\iow_char:N\\prg_replicate:nn. } \msg_new:nnn { prop } { prop-keyval } @@ -2272,7 +2288,8 @@ { The~integer~array~#1~contains~#2~items: \\ #3 . } \msg_new:nnn { prop } { show } { - The~property~list~#1~ + The~ \str_if_eq:nnF {#3} { flat } { #3~ } + property~list~#1~ \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~pairs~(without~outer~braces): #2 . } diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx index 66e4056a05..6a1bb766d1 100644 --- a/macros/latex/contrib/l3kernel/l3names.dtx +++ b/macros/latex/contrib/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf Binary files differindex 4719901866..31473fd53c 100644 --- a/macros/latex/contrib/l3kernel/l3news.pdf +++ b/macros/latex/contrib/l3kernel/l3news.pdf diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf Binary files differindex 155535a4fd..1e97f4aaca 100644 --- a/macros/latex/contrib/l3kernel/l3news01.pdf +++ b/macros/latex/contrib/l3kernel/l3news01.pdf diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf Binary files differindex 678d28fe51..ed804fc6b3 100644 --- a/macros/latex/contrib/l3kernel/l3news02.pdf +++ b/macros/latex/contrib/l3kernel/l3news02.pdf diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf Binary files differindex c4d3285b7e..ffcf4a37f2 100644 --- a/macros/latex/contrib/l3kernel/l3news03.pdf +++ b/macros/latex/contrib/l3kernel/l3news03.pdf diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf Binary files differindex 996d2face0..971bea5082 100644 --- a/macros/latex/contrib/l3kernel/l3news04.pdf +++ b/macros/latex/contrib/l3kernel/l3news04.pdf diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf Binary files differindex daea9c248a..bbdc0373a5 100644 --- a/macros/latex/contrib/l3kernel/l3news05.pdf +++ b/macros/latex/contrib/l3kernel/l3news05.pdf diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf Binary files differindex 8193ffab13..3a46d423fa 100644 --- a/macros/latex/contrib/l3kernel/l3news06.pdf +++ b/macros/latex/contrib/l3kernel/l3news06.pdf diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf Binary files differindex 9492361a4a..6c9632fdf4 100644 --- a/macros/latex/contrib/l3kernel/l3news07.pdf +++ b/macros/latex/contrib/l3kernel/l3news07.pdf diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf Binary files differindex 62d965b72f..5ec72ff809 100644 --- a/macros/latex/contrib/l3kernel/l3news08.pdf +++ b/macros/latex/contrib/l3kernel/l3news08.pdf diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf Binary files differindex 988790dadf..a2ea7832c0 100644 --- a/macros/latex/contrib/l3kernel/l3news09.pdf +++ b/macros/latex/contrib/l3kernel/l3news09.pdf diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf Binary files differindex 6c13a5cbb1..113dfe2f19 100644 --- a/macros/latex/contrib/l3kernel/l3news10.pdf +++ b/macros/latex/contrib/l3kernel/l3news10.pdf diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf Binary files differindex d78d434fa7..74d21a3c62 100644 --- a/macros/latex/contrib/l3kernel/l3news11.pdf +++ b/macros/latex/contrib/l3kernel/l3news11.pdf diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf Binary files differindex 6f9eac3b37..ccbd0305ff 100644 --- a/macros/latex/contrib/l3kernel/l3news12.pdf +++ b/macros/latex/contrib/l3kernel/l3news12.pdf diff --git a/macros/latex/contrib/l3kernel/l3pdf.dtx b/macros/latex/contrib/l3kernel/l3pdf.dtx index d1e2a7e185..0490af4c46 100644 --- a/macros/latex/contrib/l3kernel/l3pdf.dtx +++ b/macros/latex/contrib/l3kernel/l3pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv index e3512672ff..286be82652 100644 --- a/macros/latex/contrib/l3kernel/l3prefixes.csv +++ b/macros/latex/contrib/l3kernel/l3prefixes.csv @@ -12,8 +12,8 @@ alloc,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https ampersand,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, apfs,apfontspec,Qing Lee,https://github.com/CTeX-org/apfontspec,https://github.com/CTeX-org/apfontspec.git,https://github.com/CTeX-org/apfontspec/issues,2020-05-17,2020-05-17, arch,archaeologie,Lukas C. Bossert,http://www.biblatex-archaeologie.de,https://github.com/LukasCBossert/biblatex-archaeologie.git,https://github.com/LukasCBossert/biblatex-archaeologie/issues,2017-03-24,2017-03-24, -arsenal,arsenal,Boris Veytsman,https://github.com/borisveytsman/arsenal,https://github.com/borisveytsman/arsenal,https://github.com/borisveytsman/arsenal/issues,2023-09-04,2023-09-04, array,hobby,Andrew Stacey,https://github.com/loopspace/hobby,https://github.com/loopspace/hobby,https://github.com/loopspace/hobby/issues,2013-03-16,2020-10-29, +arsenal,arsenal,Boris Veytsman,https://github.com/borisveytsman/arsenal,https://github.com/borisveytsman/arsenal,https://github.com/borisveytsman/arsenal/issues,2023-09-04,2023-09-04, atsign,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, avm,langsci-avm,Felix Kopecky,https://ctan.org/pkg/langsci-avm,https://github.com/langsci/langsci-avm,https://github.com/langsci/langsci-avm/issues,2020-03-11,2020-03-11, babellatin,babel-latin,Keno Wehr,https://ctan.org/pkg/babel-latin,https://github.com/wehro/babel-latin,https://github.com/wehro/babel-latin/issues,2021-08-23,2021-08-23, @@ -59,6 +59,7 @@ ctuthesis,ctuthesis,Tom Hejda,https://github.com/tohecz/ctuthesis,https://github debug,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2017-07-15,2017-07-15, denisbdoc,denisbdoc,Denis Bitouzé,https://github.com/dbitouze/denisbdoc,git@github.com:dbitouze/denisbdoc.git,,2020-05-13,2020-05-13, deriv,derivative,Simon Jensen,,,,2019-07-24,2019-07-24, +didec,didec,Thomas F. Sturm,https://github.com/T-F-S/didec,https://github.com/T-F-S/didec.git,https://github.com/T-F-S/didec/issues,2024-02-02,2024-02-02, diffcoeff,diffcoeff,Andrew Parsloe,,,,2019-08-26,2019-08-26, dim,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, document,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02, @@ -131,7 +132,7 @@ keys,"l3kernel,l3keys2e,ltkeys",The LaTeX Project,https://www.latex-project.org/ keyval,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, kgl,kantlipsum,Enrico Gregorio,,,,2013-03-16,2013-03-16, kivitendo,"kiviletter, kivitables",Marei Peischl for Kivitendo,https://www.kivitendo.de/,https://github.com/kivitendo/kivitendo-erp,https://forum.kivitendo.de/,2021-05-28,2021-05-28, -langsci,langscibook ,Language Science Press,https://langsci-press.org,https://github.com/langsci/langscibook,https://github.com/langsci/langscibook/issues,2021-07-20,2021-07-21, +langsci,langscibook,Language Science Press,https://langsci-press.org,https://github.com/langsci/langscibook,https://github.com/langsci/langscibook/issues,2021-07-20,2021-07-21, left,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, lltxmath,lualatex-math,Philipp Stephani,https://github.com/phst/lualatex-math,https://github.com/phst/lualatex-math.git,https://github.com/phst/lualatex-math/issues,2012-11-07,2012-11-07, log,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, @@ -204,7 +205,7 @@ prop,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https: property,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2021-01-20,2021-03-03, pseudo,pseudo,Magnus Lie Hetland,https://github.com/mlhetland/pseudo.sty,https://github.com/mlhetland/pseudo.sty.git,https://github.com/mlhetland/pseudo.sty/issues,2019-06-24,2019-06-24, ptex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-07-28,2015-07-28, -ptxcd,ptxcd, Marei Peischl,,,,2020-07-27,2020-07-27,Used for specific corporate design templates +ptxcd,ptxcd,Marei Peischl,,,,2020-07-27,2020-07-27,Used for specific corporate design templates qrbill,qrbill,Marei Peischl,https://github.com/peiTeX/qrbill,https://github.com/peiTeX/qrbill.git,https://github.com/peiTeX/qrbill/issues,2020-06-27,2020-06-27, quark,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, rainbow,beamertheme-rainbow,samcarter,https://github.com/samcarter/beamertheme-rainbow,https://github.com/samcarter/beamertheme-rainbow,https://github.com/samcarter/beamertheme-rainbow/issues,2023-07-04,2023-07-04, @@ -250,7 +251,7 @@ template,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,htt term,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, tex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27, text,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2020-01-15,2020-01-15, -tikzfill,tikzfill,Thomas F. Sturm,https://github.com/T-F-S/tikzfill,https://github.com/T-F-S/tikzfill.git,https://github.com/T-F-S/tikzfill/issues,2022-07-19,2022-07-19, +tikzfill,tikzfill,Thomas F. Sturm,https://github.com/T-F-S/tikzfill,https://github.com/T-F-S/tikzfill.git,https://github.com/T-F-S/tikzfill/issues,2022-07-19,2022-07-19, tikzlings,tikzlings,samcarter,https://github.com/samcarter/tikzlings,git@github.com:samcarter/tikzlings.git,https://github.com/samcarter/tikzlings/issues,2023-02-17,2023-02-17, tikzsymbols,tikzsymbols,Ben Vitecek,https://github.com/Vidabe/tikzsymbols,https://github.com/Vidabe/tikzsymbols.git,https://github.com/Vidabe/tikzsymbols/issues,2018-09-26,2018-09-26, tilde,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12, diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf Binary files differindex ea2bf15903..2bd39c3787 100644 --- a/macros/latex/contrib/l3kernel/l3prefixes.pdf +++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx index 0b134d713f..5b7a36238b 100644 --- a/macros/latex/contrib/l3kernel/l3prg.dtx +++ b/macros/latex/contrib/l3kernel/l3prg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx index f6190ebee7..8281611924 100644 --- a/macros/latex/contrib/l3kernel/l3prop.dtx +++ b/macros/latex/contrib/l3kernel/l3prop.dtx @@ -43,19 +43,19 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % % \begin{documentation} % -% \pkg{expl3} implements a property list data type, which contain -% an unordered list of entries each of which consists of a \meta{key} and -% an associated \meta{value}. The \meta{key} and \meta{value} may both -% be any balanced text, and the \meta{key} is processed using -% \cs{tl_to_str:n}, meaning that category codes are ignored. It is possible to -% map functions to property lists such that the function is applied to every -% key--value pair within the list. +% \pkg{expl3} implements a \enquote{property list} data type, which contain +% an unordered list of entries each of which consists of a \meta{key} (string) +% and an associated \meta{value} (token list). The \meta{key} and \meta{value} +% may both be given as any balanced text, and the \meta{key} is processed using +% \cs{tl_to_str:n}, meaning that category codes are ignored. Entries can be +% manipulated individually, as well as collectively by applying a function to +% every key--value pair within the list. % % Each entry in a property list must have a unique \meta{key}: if an entry is % added to a property list which already contains the \meta{key} then the new @@ -63,8 +63,41 @@ % string basis, using the same method as \cs{str_if_eq:nnTF}. % % Property lists are intended for storing key-based information for use within -% code. This is in contrast to key--value lists, which are a form of -% \emph{input} parsed by the \pkg{l3keys} module. +% code. They can be converted from and to key--value lists, which are a form of +% \emph{input} parsed by the \pkg{l3keys} module. If a key--value list contains +% a \meta{key} multiple times, only the last \meta{value} associated to it will +% be kept in the conversion to a property list. +% +% Internally, property lists can use two distinct implementations with different +% data storage, which are decided when declaring the property list variable +% using \cs{prop_new:N} (\enquote{flat} storage) or \cs{prop_new_linked:N} +% (\enquote{linked} storage). After a property list is declared with +% \cs{prop_new:N} or \cs{prop_new_linked:N}, the type of internal data storage +% can be changed by \cs{prop_make_flat:N} or \cs{prop_make_linked:N}, but only +% at the outermost group level. All other \pkg{l3prop} functions transparently +% manipulate either storage method and convert as needed. +% \begin{itemize} +% \item +% The (default) \enquote{flat} storage method is suited for a relatively +% small number of entries, or when the property list is likely to be +% manipulated (copied, mapped) as a whole rather than entry-wise. It is +% significantly faster for \cs{prop_set_eq:NN}, and only slightly faster for +% \cs{prop_clear:N}, \cs{prop_concat:NNN}, and mapping functions +% \cs[no-index]{prop_map_\ldots{}}. +% +% \item +% The \enquote{linked} storage method is meant for property lists with a +% large numbers of entries. It takes up more of \TeX{}'s memory during a run, but is +% significantly faster (for long lists) when accessing or modifying +% individual entries using functions such as \cs{prop_if_in:Nn}, +% \cs{prop_item:Nn}, \cs{prop_put:Nnn}, \cs{prop_get:NnN}, +% \cs{prop_pop:NnN}, \cs{prop_remove:Nn}, as it takes a constant +% time for these operations (rather than the number of items for a +% \enquote{flat} property list). A technical drawback is that +% memory is permanently used\footnote{Until the end of the run, that +% is.} by \meta{keys} stored in a \enquote{linked} property list, +% even after they are removed and the property list is deleted. +% \end{itemize} % % \section{Creating and initialising property lists} % @@ -72,9 +105,20 @@ % \begin{syntax} % \cs{prop_new:N} \meta{property list} % \end{syntax} -% Creates a new \meta{property list} or raises an error if the name is -% already taken. The declaration is global. The \meta{property list} -% initially contains no entries. +% Creates a new \enquote{flat} \meta{property list} or raises an error if the +% name is already taken. The declaration is global. The \meta{property list} +% initially contains no entries. See also \cs{prop_new_linked:N}. +% \end{function} +% +% \begin{function}[added = 2024-02-12]{\prop_new_linked:N, \prop_new_linked:c} +% \begin{syntax} +% \cs{prop_new_linked:N} \meta{property list} +% \end{syntax} +% Creates a new \enquote{linked} \meta{property list} or raises an error if +% the name is already taken. The declaration is global. The \meta{property +% list} initially contains no entries. The internal data storage differs from +% that produced by \cs{prop_new:N} and it is optimized for property lists with +% a large number of entries. % \end{function} % % \begin{function} @@ -95,8 +139,28 @@ % \end{syntax} % Ensures that the \meta{property list} exists globally by applying % \cs{prop_new:N} if necessary, then applies -% \cs[index=prop_clear:N]{prop_(g)clear:N} to leave -% the list empty. +% \cs[index=prop_clear:N]{prop_(g)clear:N} to leave the list empty. +% \begin{texnote} +% If the property list exists and is of \enquote{linked} type, it +% is cleared but not made into a flat property list. +% \end{texnote} +% \end{function} +% +% \begin{function}[added = 2024-02-12] +% { +% \prop_clear_new_linked:N, \prop_clear_new_linked:c, +% \prop_gclear_new_linked:N, \prop_gclear_new_linked:c +% } +% \begin{syntax} +% \cs{prop_clear_new_linked:N} \meta{property list} +% \end{syntax} +% Ensures that the \meta{property list} exists globally by applying +% \cs{prop_new_linked:N} if necessary, then applies +% \cs[index=prop_clear:N]{prop_(g)clear:N} to leave the list empty. +% \begin{texnote} +% If the property list exists and is of \enquote{flat} type, it +% is cleared but not made into a linked property list. +% \end{texnote} % \end{function} % % \begin{function} @@ -107,8 +171,8 @@ % \begin{syntax} % \cs{prop_set_eq:NN} \meta{property list_1} \meta{property list_2} % \end{syntax} -% Sets the content of \meta{property list_1} equal to that of -% \meta{property list_2}. +% Sets the content of \meta{property list_1} equal to that of \meta{property +% list_2}. This converts as needed between the two storage types. % \end{function} % % \begin{function}[added = 2017-11-28, updated = 2021-11-07] @@ -125,6 +189,9 @@ % \end{syntax} % Sets \meta{property list} to contain key--value pairs given in the second % argument. If duplicate keys appear only the last of the values is kept. +% In contrast to most keyval lists (\emph{e.g.}~those in \pkg{l3keys}), each +% key here \emph{must} be followed with an \texttt{=} sign even to specify an +% empty \meta{value}. % % Spaces are trimmed around every \meta{key} and every \meta{value}, % and if the result of trimming spaces consists of a single brace @@ -133,10 +200,6 @@ % signs. The \meta{key} is then processed by \cs{tl_to_str:n}. % This function correctly detects the |=| and |,| signs provided they % have the standard category code~$12$ or they are active. -% -% Notice that in contrast to most keyval lists (\emph{e.g.}~those in -% \pkg{l3keys}), each key here \emph{must} be followed with an \texttt{=} -% sign. % \end{function} % % \begin{function}[added = 2017-11-28, updated = 2021-11-07] @@ -148,17 +211,55 @@ % \meta{key2} |=| \meta{value2} |,| \ldots{} % \} % \end{syntax} -% Creates a new constant \meta{property list} or raises an error if the +% Creates a new constant \enquote{flat} \meta{property list} or raises +% an error if the % name is already taken. The \meta{property list} is set globally to % contain key--value pairs given in the second argument, processed in % the way described for \cs{prop_set_from_keyval:Nn}. If duplicate % keys appear only the last of the values is kept. % This function correctly detects the |=| and |,| signs provided they % have the standard category code~$12$ or they are active. +% \end{function} +% +% \begin{function}[added = 2024-02-12] +% {\prop_const_linked_from_keyval:Nn, \prop_const_linked_from_keyval:cn} +% \begin{syntax} +% \cs{prop_const_linked_from_keyval:Nn} \meta{prop~var} +% \{ +% \meta{key1} |=| \meta{value1} |,| +% \meta{key2} |=| \meta{value2} |,| \ldots{} +% \} +% \end{syntax} +% Creates a new constant \enquote{linked} \meta{prop~var} or raises an +% error if the +% name is already taken. The \meta{prop~var} is set globally to +% contain key--value pairs given in the second argument, processed in +% the way described for \cs{prop_set_from_keyval:Nn}. If duplicate +% keys appear only the last of the values is kept. +% This function correctly detects the |=| and |,| signs provided they +% have the standard category code~$12$ or they are active. +% \end{function} % -% Notice that in contrast to most keyval lists (\emph{e.g.}~those in -% \pkg{l3keys}), each key here \emph{must} be followed with an \texttt{=} -% sign. +% \begin{function}[added = 2024-02-12]{\prop_make_flat:N, \prop_make_flat:c} +% \begin{syntax} +% \cs{prop_make_flat:N} \meta{property list} +% \end{syntax} +% Changes the internal storage type of the \meta{property list} to be +% the same \enquote{flat} storage as \cs{prop_new:N}. The key--value +% pairs of the \meta{property list} are preserved by the change. If +% the property list was already flat then nothing is done. This +% function can only be used at the outermost group level. +% \end{function} +% +% \begin{function}[added = 2024-02-12]{\prop_make_linked:N, \prop_make_linked:c} +% \begin{syntax} +% \cs{prop_make_linked:N} \meta{property list} +% \end{syntax} +% Changes the internal storage type of the \meta{property list} to be +% the same \enquote{linked} storage as \cs{prop_new_linked:N}. The +% key--value pairs of the \meta{property list} are preserved by the +% change. If the property list was already linked then nothing is +% done. This function can only be used at the outermost group level. % \end{function} % % \section{Adding and updating property list entries} @@ -171,22 +272,20 @@ % \prop_put:Nen, \prop_put:NeV, \prop_put:Nev, \prop_put:Nee, % \prop_put:Nno, \prop_put:Non, \prop_put:Noo, % \prop_put:cnn, \prop_put:cnV, \prop_put:cnv, \prop_put:cne, -% \prop_put:cno, % \prop_put:cVn, \prop_put:cVV, \prop_put:cVv, \prop_put:cVe, % \prop_put:cvn, \prop_put:cvV, \prop_put:cvv, \prop_put:cve, % \prop_put:cen, \prop_put:ceV, \prop_put:cev, \prop_put:cee, -% \prop_put:con, \prop_put:coo, +% \prop_put:cno, \prop_put:con, \prop_put:coo, % \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nnv, \prop_gput:Nne, % \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVv, \prop_gput:NVe, % \prop_gput:Nvn, \prop_gput:NvV, \prop_gput:Nvv, \prop_gput:Nve, % \prop_gput:Nen, \prop_gput:NeV, \prop_gput:Nev, \prop_gput:Nee, % \prop_gput:Nno, \prop_gput:Non, \prop_gput:Noo, % \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cnv, \prop_gput:cne, -% \prop_gput:cno, % \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVv, \prop_gput:cVe, % \prop_gput:cvn, \prop_gput:cvV, \prop_gput:cvv, \prop_gput:cve, % \prop_gput:cen, \prop_gput:ceV, \prop_gput:cev, \prop_gput:cee, -% \prop_gput:con, \prop_gput:coo +% \prop_gput:cno, \prop_gput:con, \prop_gput:coo % } % \begin{syntax} % \cs{prop_put:Nnn} \meta{property list} \Arg{key} \Arg{value} @@ -227,6 +326,7 @@ % \meta{property list_3}, and saves the result in \meta{property list_1}. If a % key appears in both \meta{property list_2} and \meta{property list_3} then the % last value, namely the value in \meta{property list_3} is kept. +% This converts as needed between the two storage types. % \end{function} % % \begin{function}[added = 2021-05-16, updated = 2021-11-07] @@ -319,7 +419,7 @@ % the \meta{token list variable} is local. See also \cs{prop_gpop:NnNTF}. % \end{function} % -% \begin{function}[added = 2014-07-17, EXP] +% \begin{function}[EXP, added = 2014-07-17] % { % \prop_item:Nn, \prop_item:NV, \prop_item:Ne, \prop_item:No, % \prop_item:cn, \prop_item:cV, \prop_item:ce, \prop_item:co @@ -331,8 +431,11 @@ % the \meta{property list}. If the \meta{key} is missing, this has % an empty expansion. % \begin{texnote} -% This function is slower than the non-expandable analogue -% \cs{prop_get:NnN}. +% For \enquote{flat} property lists, this expandable function iterates +% through every key--value pair and is therefore slower than a +% non-expandable approach based on \cs{prop_get:NnN}. +% (For \enquote{linked} property lists both functions are fast.) +% % The result is returned within the \tn{unexpanded} % primitive (\cs{exp_not:n}), which means that the \meta{value} % does not expand further when appearing in an \texttt{e}-type @@ -354,7 +457,7 @@ % \end{syntax} % Expands to the \meta{property list} in a key--value notation. Keep in mind % that a \meta{property list} is \emph{unordered}, while key--value interfaces -% don't necessarily are, so this can't be used for arbitrary interfaces. +% are not necessarily, so this cannot be used for arbitrary interfaces. % \begin{texnote} % The result is returned within the \tn{unexpanded} primitive % (\cs{exp_not:n}), which means that the key--value list does not expand @@ -402,7 +505,7 @@ % Tests if the \meta{property list} is empty (containing no entries). % \end{function} % -% \begin{function}[updated = 2011-09-15, EXP, pTF] +% \begin{function}[EXP, pTF, updated = 2011-09-15] % { % \prop_if_in:Nn, \prop_if_in:NV, \prop_if_in:Ne, \prop_if_in:No, % \prop_if_in:cn, \prop_if_in:cV, \prop_if_in:ce, \prop_if_in:co @@ -414,9 +517,10 @@ % Tests if the \meta{key} is present in the \meta{property list}, % making the comparison using the method described by \cs{str_if_eq:nnTF}. % \begin{texnote} -% This function iterates through every key--value pair in the -% \meta{property list} and is therefore slower than using the -% non-expandable \cs{prop_get:NnNTF}. +% For \enquote{flat} property lists, this expandable function iterates +% through every key--value pair and is therefore slower than a +% non-expandable approach based on \cs{prop_get:NnNTF}. +% (For \enquote{linked} property lists both functions are fast.) % \end{texnote} % \end{function} % @@ -424,11 +528,11 @@ % % The functions in this section combine tests for the presence of a key % in a property list with recovery of the associated valued. This makes them -% useful for cases where different cases follow dependent on the presence +% useful for cases where different code follows depending on the presence % or absence of a key in a property list. They offer increased readability % and performance over separate testing and recovery phases. % -% \begin{function}[updated = 2012-05-19, TF] +% \begin{function}[TF, updated = 2012-05-19] % { % \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NeN, % \prop_get:NoN, @@ -458,7 +562,8 @@ % \prop_pop:coN % } % \begin{syntax} -% \cs{prop_pop:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \Arg{true code} \Arg{false code} +% \cs{prop_pop:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\ +% ~~\Arg{true code} \Arg{false code} % \end{syntax} % If the \meta{key} is not present in the \meta{property list}, leaves % the \meta{false code} in the input stream. The value of the @@ -479,7 +584,8 @@ % \prop_gpop:coN % } % \begin{syntax} -% \cs{prop_gpop:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \Arg{true code} \Arg{false code} +% \cs{prop_gpop:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\ +% ~~\Arg{true code} \Arg{false code} % \end{syntax} % If the \meta{key} is not present in the \meta{property list}, leaves % the \meta{false code} in the input stream. The value of the @@ -498,7 +604,7 @@ % local assignments made by the \meta{function} or \meta{code} discussed % below remain in effect after the loop. % -% \begin{function}[updated = 2013-01-08, rEXP] +% \begin{function}[rEXP, updated = 2013-01-08] % {\prop_map_function:NN, \prop_map_function:cN} % \begin{syntax} % \cs{prop_map_function:NN} \meta{property list} \meta{function} @@ -509,7 +615,7 @@ % The order in which \meta{entries} are returned is not defined and % should not be relied upon. % To pass further arguments to the \meta{function}, see -% \cs{prop_map_tokens:Nn}. +% \cs{prop_map_inline:Nn} (non-expandable) or \cs{prop_map_tokens:Nn}. % \end{function} % % \begin{function}[updated = 2013-01-08] @@ -543,7 +649,7 @@ % arguments. For that specific task, \cs{prop_item:Nn} is faster. % \end{function} % -% \begin{function}[updated = 2012-06-29, rEXP]{\prop_map_break:} +% \begin{function}[rEXP, updated = 2012-06-29]{\prop_map_break:} % \begin{syntax} % \cs{prop_map_break:} % \end{syntax} @@ -570,7 +676,7 @@ % \end{texnote} % \end{function} % -% \begin{function}[updated = 2012-06-29, rEXP]{\prop_map_break:n} +% \begin{function}[rEXP, updated = 2012-06-29]{\prop_map_break:n} % \begin{syntax} % \cs{prop_map_break:n} \Arg{code} % \end{syntax} @@ -604,27 +710,34 @@ % \begin{syntax} % \cs{prop_show:N} \meta{property list} % \end{syntax} -% Displays the entries in the \meta{property list} in the terminal. +% Displays the entries in the \meta{property list} in the terminal, +% and specifies its storage type. % \end{function} % % \begin{function}[added = 2014-08-12, updated = 2021-04-29]{\prop_log:N, \prop_log:c} % \begin{syntax} % \cs{prop_log:N} \meta{property list} % \end{syntax} -% Writes the entries in the \meta{property list} in the log file. +% Writes the entries in the \meta{property list} in the log file, +% and specifies its storage type. % \end{function} % % \section{Scratch property lists} % +% There is no need to include both flat and linked property lists as +% scratch variables. We arbitrarily pick the older implementation. +% % \begin{variable}[added = 2012-06-23]{\l_tmpa_prop, \l_tmpb_prop} -% Scratch property lists for local assignment. These are never used by +% Scratch \enquote{flat} property lists for local assignment. +% These are never used by % the kernel code, and so are safe for use with any \LaTeX3-defined % function. However, they may be overwritten by other non-kernel % code and so should only be used for short-term storage. % \end{variable} % % \begin{variable}[added = 2012-06-23]{\g_tmpa_prop, \g_tmpb_prop} -% Scratch property lists for global assignment. These are never used by +% Scratch \enquote{flat} property lists for global assignment. +% These are never used by % the kernel code, and so are safe for use with any \LaTeX3-defined % function. However, they may be overwritten by other non-kernel % code and so should only be used for short-term storage. @@ -652,97 +765,98 @@ %<@@=prop> % \end{macrocode} % -% A property list is a macro whose top-level expansion is of the form +% With the (default) flat data storage, a property list is a macro whose +% top-level expansion is of the form % \begin{quote} -% \cs{s_@@} +% \cs{s_@@} \cs{@@_chk:w} % \cs{@@_pair:wn} \meta{key_1} \cs{s_@@} \Arg{value_1} \\ % \ldots{} \\ % \cs{@@_pair:wn} \meta{key_n} \cs{s_@@} \Arg{value_n} \\ % \end{quote} -% where \cs{s_@@} is a scan mark -% (equal to \cs{scan_stop:}), and \cs{@@_pair:wn} can be used to map -% through the property list. -% -% \begin{variable}{\s_@@} -% The internal token used at the beginning of property lists. This is -% also used after each \meta{key} (see \cs{@@_pair:wn}). -% \end{variable} -% -% \begin{variable}{\@@_pair:wn} -% \begin{syntax} -% \cs{@@_pair:wn} \meta{key} \cs{s_@@} \Arg{item} -% \end{syntax} -% The internal token used to begin each key--value pair in the -% property list. If expanded outside of a mapping or manipulation -% function, an error is raised. The definition should always be -% set globally. -% \end{variable} -% -% \begin{variable}{\l_@@_internal_tl} -% Token list used to store new key--value pairs to be inserted by -% functions of the \cs{prop_put:Nnn} family. -% \end{variable} -% -% \begin{function}[updated = 2013-01-08]{\@@_split:NnTF} -% \begin{syntax} -% \cs{@@_split:NnTF} \meta{property list} \Arg{key} \Arg{true code} \Arg{false code} -% \end{syntax} -% Splits the \meta{property list} at the \meta{key}, giving three -% token lists: the \meta{extract} of \meta{property list} before the -% \meta{key}, the \meta{value} associated with the \meta{key} and the -% \meta{extract} of the \meta{property list} after the \meta{value}. -% Both \meta{extracts} retain the internal structure of a property -% list, and the concatenation of the two \meta{extracts} is a -% property list. -% If the \meta{key} is present in the \meta{property list} then the -% \meta{true code} is left in the input stream, with |#1|, |#2|, and -% |#3| replaced by the first \meta{extract}, the \meta{value}, and the -% second extract. -% If the \meta{key} is not present in the \meta{property list} then -% the \meta{false code} is left in the input stream, with no trailing -% material. -% Both \meta{true code} and \meta{false code} are used in the -% replacement text of a macro defined internally, hence macro -% parameter characters should be doubled, except |#1|, |#2|, and |#3| -% which stand in the \meta{true code} for the three extracts from the -% property list. -% The \meta{key} comparison takes place as described for \cs{str_if_eq:nn}. -% \end{function} +% where \cs{s_@@} is a scan mark (equal to \cs{scan_stop:}), \cs{@@_chk:w} +% produces a suitable error if the property list is used directly in the input +% stream, and \cs{@@_pair:wn} can be used to map through the property list. +% +% With the linked data storage, each property list entry +% \meta{key_i}--\meta{value_i} is stored into a token list +% \cs[no-index]{@@~\meta{prefix}~\meta{key_i}}. The \meta{prefix} is one or +% more characters (no spaces), constructed automatically only once, when the +% property list is initially declared. The control sequence name does not +% conform to standard naming for variables because (1) this is an internal +% control sequence, not really a \pkg{expl3} variable; (2) keeping track of the +% scope |l| or~|g| throughout all functions would be a pretty big mess, +% especially if users accidentally mix local and global use (we would have to +% always check for such mistakes, rather than only checking when suitable debug +% options are set); (3) shorter control sequence names use less memory and are +% quicker in case of hash collisions, which may matter since we are using many +% control sequences. +% +% We need to enable mapping through such a property list, but without storing a +% list of all entries anywhere: this is achieved by making each of these token +% lists also store a pointer to the next entry. To enable efficient deletion, +% the token lists also store a pointer to the previous entry. This means we +% have a doubly-linked list. To avoid having to special-case the two ends of +% the doubly-linked list when deleting entries, we include as a zeroth entry in +% the doubly-linked list the property list variable itself, and we include as an +% $(n+1)$-th entry in the doubly-linked list an end-pointer +% \cs{@@~\meta{prefix}} (no trailing space, so it differs from an empty key). +% The space before \meta{prefix} ensures there is no collision with +% other \pkg{l3prop} internal functions, even if we have very many +% linked property lists being defined. +% +% The property list variable itself is a token list of the form +% \begin{quote} +% \cs{@@_flatten:w} \cs{@@~\meta{prefix}} \cs{s_@@} \Arg{prefix} +% \cs[no-index]{@@~\meta{prefix}~\meta{key_1}} +% \end{quote} +% Here, \cs{@@_flatten:w} serves as an efficiently recognized marker, and when +% \texttt{f}-expanded it is tasked with fully unpacking the property list into +% the same form as the default data storage so as to ease conversion. The +% \meta{prefix} is used when looking up an entry. The token list +% \cs{@@~\meta{prefix}} (see below) contains a pointer to the last key to help +% insert a new entry. The pointer to \meta{key_1} is needed to start a mapping. +% The token list labeled by \meta{key_i} is of the form +% \begin{quote} +% \cs{use_none:n} \cs[no-index]{@@~\meta{prefix}~\meta{key$_{i-1}$}} +% \cs{@@_pair:wn} \meta{key_i} \cs{s_@@} \Arg{value_i} +% \cs[no-index]{@@~\meta{prefix}~\meta{key$_{i+1}$}} +% \end{quote} +% where the pointer to \meta{key$_{i-1}$} is needed when deleting the +% \meta{key_i}. Expanding this will run \cs{@@_pair:wn} on the +% \meta{key_i}--\meta{value_i} pair (for speed, \meta{key_i} is kept as explicit +% tokens rather than slowly extracting it from a control sequence name), then +% move on to the next key, thus mapping through the whole list. The mapping is +% ended upon expanding \cs{@@~\meta{prefix}}, which is the token list +% \begin{quote} +% \cs{use_none:n} \cs[no-index]{@@~\meta{prefix}~\meta{key_n}} +% \end{quote} +% Let us think about deleting the \meta{key_i}. We need to update the +% \meta{key$_{i-1}$} and \meta{key$_{i+1}$} to point to each other +% instead of \meta{key_i}. To edit the corresponding token lists, it is +% important that \cs[no-index]{@@~\meta{prefix}~\meta{key_i}} be at the +% \enquote{same place} in the token lists also in the boundary cases +% $i=1$ or $i=n$, namely as the second token, or as the second argument +% after \cs{s_@@}. % -% \begin{macro}{\s_@@} -% A private scan mark is used as a marker after each key, and at the -% very beginning of the property list. -% \begin{macrocode} -\scan_new:N \s_@@ -% \end{macrocode} -% \end{macro} +% \subsection{Internal auxiliaries} % -% \begin{macro}{\@@_pair:wn} -% The delimiter is always defined, but when misused simply triggers an -% error and removes its argument. +% \begin{macro}{\@@_tmp:w} +% Scratch macro, defined as needed, for instance to save \cs{@@_pair:wn} when +% concatenating. % \begin{macrocode} -\cs_new:Npn \@@_pair:wn #1 \s_@@ #2 - { \msg_expandable_error:nn { prop } { misused } } +\cs_new_eq:NN \@@_tmp:w ? % \end{macrocode} % \end{macro} % % \begin{variable}{\l_@@_internal_tl} -% Token list used to store the new key--value pair inserted by -% \cs{prop_put:Nnn} and friends. +% Token list used in various places: for the prefix; when converting from flat +% to linked props; and to store the new key--value pair inserted by +% \cs{prop_put:Nnn}. % \begin{macrocode} \tl_new:N \l_@@_internal_tl % \end{macrocode} % \end{variable} % -% \begin{variable}[tested = m3prop004]{\c_empty_prop} -% An empty prop. -% \begin{macrocode} -\tl_const:Nn \c_empty_prop { \s_@@ } -% \end{macrocode} -% \end{variable} -% -% \subsection{Internal auxiliaries} -% % \begin{variable}{\s_@@_mark,\s_@@_stop} % Internal scan marks. % \begin{macrocode} @@ -769,10 +883,160 @@ % \end{macro} % \end{macro} % +% \subsection{Structure of a property list} +% +% \begin{macro}{\s_@@} +% A private scan mark is used as a marker after each key, and at the +% very beginning of the property list. +% \begin{macrocode} +\scan_new:N \s_@@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_chk:w, \@@_chk_loop:nw, \@@_chk_get:nw} +% This removes the flat property list from the input stream and complains +% about a bad use of a property list. Since property lists do not have an +% end-marker, we slowly peek ahead in a loop. Speed does not matter since +% this is for an error situation. While \cs{@@_pair:wn} does not keep a fixed +% definition, it always includes the internal \cs{s_@@} in its argument +% specification, so that there is no risk of accidentally picking up a public +% token instead of \cs{@@_pair:wn} when doing a meaning test. We collect the +% keys and values to produce a more useful error message. +% \begin{macrocode} +\cs_new_protected:Npn \@@_chk:w { \@@_chk_loop:nw { } } +\cs_new_protected:Npn \@@_chk_loop:nw #1 + { + \peek_meaning:NTF \@@_pair:wn + { \@@_chk_get:nw {#1} } + { \msg_error:nne { prop } { misused } {#1} } + } +\cs_new_protected:Npn \@@_chk_get:nw #1 \@@_pair:wn #2 \s_@@ #3 + { \@@_chk_loop:nw { #1 , ~ {#2} = { \tl_to_str:n {#3} } } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_pair:wn} +% Used as \cs{@@_pair:wn} \meta{key} \cs{s_@@} \Arg{item} for both storage +% types, this internal token starts each key--value pair in the property list. +% This default definition is changed globally by any mapping function, so +% there is not much point trying to make it an error. Instead, the error is +% produced by \cs{@@_chk:w}. +% \begin{macrocode} +\cs_new:Npn \@@_pair:wn #1 \s_@@ #2 { } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_flatten:w} +% We implement here the fact that \texttt{f}-expanding a linked property list +% gives a flat property list. +% Leaving a linked property list in the input stream will turn it into a flat +% property list so that the error implemented by \cs{@@_chk:w} will correctly +% be triggered. +% \begin{macrocode} +\cs_new_protected:Npn \@@_flatten:w #1 \s_@@ #2#3 + { \use:e { \@@_flatten_aux:N #3 } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[rEXP] +% {\@@_flatten:N, \@@_flatten_aux:w, \@@_flatten_aux:N, \@@_flatten_loop:w} +% The main function \cs{@@_flatten:N} receives a linked property list and +% flattens it. The auxiliary \cs{@@_flatten_aux:N} receives a pointer to the +% first key and flattens the linked property list into a flat property list. +% This is only restricted-expandable as it involves mapping through all of the +% property list's entries starting from \meta{key_1}. The looping function +% \cs{@@_flatten_loop:w} removes \cs{use_none:n} and a backwards pointer~|#2|, +% leaves the key--value pair for \cs{use:e} to receive, and calls itself +% again after expanding the next key's token list. Its argument |#3| is +% empty, except at the end where it is the \cs{use_none:nnnn} appearing in the +% definition of~\cs{@@_flatten_aux:N}, which ends the loop. +% \begin{macrocode} +\cs_new:Npn \@@_flatten:N #1 + { \exp_after:wN \@@_flatten_aux:w #1 } +\cs_new:Npn \@@_flatten_aux:w #1 \s_@@ #2 { \@@_flatten_aux:N } +\cs_new:Npn \@@_flatten_aux:N #1 + { + \s_@@ \@@_chk:w + \exp_after:wN \@@_flatten_loop:w #1 + \use_none:nnnn \@@_pair:wn \s_@@ { } + } +\cs_new:Npn \@@_flatten_loop:w #1#2#3 \@@_pair:wn #4 \s_@@ #5 + { + #3 + \exp_not:n { \@@_pair:wn #4 \s_@@ {#5} } + \exp_after:wN \@@_flatten_loop:w + } +% \end{macrocode} +% \end{macro} +% +% \begin{variable}{\g_@@_prefix_int, \c_@@_basis_int} +% Used to assign prefixes for each linked property list. It is converted to +% base \cs{c_@@_basis_int}, then each digit is converted to a character, +% starting at |!| (the character after space). +% \begin{macrocode} +\int_new:N \g_@@_prefix_int +\int_const:Nn \c_@@_basis_int { \c_max_char_int - `\! } +% \end{macrocode} +% \end{variable} +% +% \begin{macro}{\@@_next_prefix:, \@@_to_prefix:n} +% Store in \cs{l_@@_internal_tl} the conversion of \cs{g_@@_prefix_int} to +% characters, and increment this integer for use in the next linked property +% list. No need to optimize since this is only used when declaring the +% property list the first time. +% The aim here is to make this string as short as we can, given the +% range of distinct characters available. This speeds up the work of +% \cs{cs:w} \ldots{} \cs{cs_end:} that looks up keys in the hash table. +% \begin{macrocode} +\cs_new_protected:Npn \@@_next_prefix: + { + \tl_set:Ne \l_@@_internal_tl + { \@@_to_prefix:n { \g_@@_prefix_int } } + \int_gincr:N \g_@@_prefix_int + } +\cs_new:Npn \@@_to_prefix:n #1 + { + \int_compare:nNnTF {#1} > \c_@@_basis_int + { + \exp_args:Nf \@@_to_prefix:n + { \int_div_truncate:nn {#1} \c_@@_basis_int } + \exp_args:Nf \@@_to_prefix:n + { \int_mod:nn {#1} \c_@@_basis_int } + } + { \char_generate:nn { `\! + #1 } { 12 } } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_if_flat:NTF, \@@_if_flat_aux:w} +% We could either test for the presence of \cs{@@_chk:w} (flat +% property list) or of \cs{@@_flatten:w} (linked property list). We +% make the second choice; this way props that are accidentally +% \tn{relax} are treated as they were before. The auxiliary receives +% \cs{use_i:nn} or \cs{use_ii:nn} as~|#3|. +% \begin{macrocode} +\cs_new:Npn \@@_if_flat:NTF #1 + { + \exp_after:wN \@@_if_flat_aux:w #1 + \s_@@_mark \use_ii:nn + \@@_flatten:w \s_@@_mark \use_i:nn \s_@@_stop + } +\cs_new:Npn \@@_if_flat_aux:w + #1 \@@_flatten:w #2 \s_@@_mark #3 #4 \s_@@_stop {#3} +% \end{macrocode} +% \end{macro} +% % \subsection{Allocation and initialisation} % +% \begin{variable}[tested = m3prop004]{\c_empty_prop} +% An empty flat prop. +% \begin{macrocode} +\tl_const:Nn \c_empty_prop { \s_@@ \@@_chk:w } +% \end{macrocode} +% \end{variable} +% % \begin{macro}[tested = m3prop001]{\prop_new:N, \prop_new:c} -% Property lists are initialized with the value \cs{c_empty_prop}. +% Flat property lists are initialized with the value \cs{c_empty_prop}. % \begin{macrocode} \cs_new_protected:Npn \prop_new:N #1 { @@ -783,23 +1047,107 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[tested = m3prop001]{\prop_new_linked:N, \prop_new_linked:c} +% \begin{macro}{\@@_new_linked:N} +% The auxiliary is used in \cs{prop_make_linked:N}. +% For linked property lists, get a new prefix in \cs{l_@@_internal_tl}, then +% use it to set up the internal structure: the last token in~|#1| is usually a +% pointer to the first key, which is here the end-pointer. That end-pointer +% has a pointer to the previous key (usually the last key), which is the +% variable~|#1| itself that begins the doubly-linked list. +% \begin{macrocode} +\cs_new_protected:Npn \prop_new_linked:N #1 + { + \__kernel_chk_if_free_cs:N #1 + \@@_new_linked:N #1 + } +\cs_new_protected:Npn \@@_new_linked:N #1 + { + \@@_next_prefix: + \cs_gset_nopar:Npe #1 + { + \@@_flatten:w + \exp_not:c { @@ ~ \l_@@_internal_tl } + \s_@@ { \l_@@_internal_tl } + \exp_not:c { @@ ~ \l_@@_internal_tl } + } + \cs_gset_nopar:cpe { @@ ~ \l_@@_internal_tl } + { + \exp_not:N \use_none:n + \exp_not:N #1 + } + } +\cs_generate_variant:Nn \prop_new_linked:N { c } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \begin{macro}[tested = m3prop001]{\prop_clear:N, \prop_clear:c} % \begin{macro}[tested = m3prop001]{\prop_gclear:N, \prop_gclear:c} -% The same idea for clearing. +% \begin{macro}{\@@_clear:NNN, \@@_clear:wNNN, \@@_clear_loop:Nw} +% Clearing a flat property list is like declaring it anew, simply setting it +% equal to \cs{c_empty_prop}. For linked property lists we must clear all of +% the variables storing individual keys, which requires a loop. At each step +% of the loop, \cs{@@_clear_loop:Nw} receives +% \cs[index=cs_set_eq:NN]{cs_(g)set_eq:NN}, \cs{use_none:n}, the backwards +% pointer, an empty~|#4| (except at the end of the loop), and the key--value +% pair |#5=#6| which we disregard. The looping auxiliary undefines the +% previous key's token list (this includes the main token list, but that is +% fine because it is restored at the end) and calls itself after expanding the +% next key's token list. The loop ends when |#4| is \cs{use_none:nnnn}. +% After the loop, \cs{@@_clear:wNNN} correctly sets up the main variable~|#6| +% and the end-pointer~|#1|. Importantly, this is done using +% \cs[index=cs_set_nopar:Npe]{cs_(g)set_nopar:Npe} and \cs{exp_not:n} because +% the almost-equivalent \cs{tl_set:Nn} would complain in debug mode about the +% fact that the main variable is undefined at this stage. Importantly, +% \cs{@@_clear_entries:NN} is used in the implementation of +% \cs{prop_set_eq:NN}. % \begin{macrocode} -\cs_new_protected:Npn \prop_clear:N #1 - { \prop_set_eq:NN #1 \c_empty_prop } +\cs_new_protected:Npn \prop_clear:N + { \@@_clear:NNN \cs_set_eq:NN \cs_set_nopar:Npe } \cs_generate_variant:Nn \prop_clear:N { c } -\cs_new_protected:Npn \prop_gclear:N #1 - { \prop_gset_eq:NN #1 \c_empty_prop } +\cs_new_protected:Npn \prop_gclear:N + { \@@_clear:NNN \cs_gset_eq:NN \cs_gset_nopar:Npe } \cs_generate_variant:Nn \prop_gclear:N { c } +\cs_new_protected:Npn \@@_clear:NNN #1#2#3 + { + \@@_if_flat:NTF #3 + { #1 #3 \c_empty_prop } + { \exp_after:wN \@@_clear:wNNN #3 #1 #2 #3 } + } +\cs_new_protected:Npn \@@_clear:wNNN + \@@_flatten:w #1 \s_@@ #2#3#4#5#6 + { + \@@_clear_entries:NN #4 #3 + #5 #6 { \exp_not:n { \@@_flatten:w #1 \s_@@ {#2} #1 } } + #5 #1 { \exp_not:n { \use_none:n #6 } } + } +\cs_new_protected:Npn \@@_clear_entries:NN #1#2 + { + \exp_after:wN \@@_clear_loop:Nw \exp_after:wN #1 #2 + \use_none:nnnn \@@_pair:wn \s_@@ { } + } +\cs_new_protected:Npn \@@_clear_loop:Nw + #1#2#3#4 \@@_pair:wn #5 \s_@@ #6 + { + #1 #3 \tex_undefined:D + #4 + \exp_after:wN \@@_clear_loop:Nw + \exp_after:wN #1 + } % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % -% \begin{macro}[tested = m3prop001]{\prop_clear_new:N, \prop_clear_new:c} -% \begin{macro}[tested = m3prop001]{\prop_gclear_new:N, \prop_gclear_new:c} -% Once again a simple variation of the token list functions. +% \begin{macro}[tested = m3prop001] +% { +% \prop_clear_new:N, \prop_clear_new:c, +% \prop_gclear_new:N, \prop_gclear_new:c, +% \prop_clear_new_linked:N, \prop_clear_new_linked:c, +% \prop_gclear_new_linked:N, \prop_gclear_new_linked:c +% } +% A simple variation of the token list functions. % \begin{macrocode} \cs_new_protected:Npn \prop_clear_new:N #1 { \prop_if_exist:NTF #1 { \prop_clear:N #1 } { \prop_new:N #1 } } @@ -807,26 +1155,176 @@ \cs_new_protected:Npn \prop_gclear_new:N #1 { \prop_if_exist:NTF #1 { \prop_gclear:N #1 } { \prop_new:N #1 } } \cs_generate_variant:Nn \prop_gclear_new:N { c } +\cs_new_protected:Npn \prop_clear_new_linked:N #1 + { \prop_if_exist:NTF #1 { \prop_clear:N #1 } { \prop_new_linked:N #1 } } +\cs_generate_variant:Nn \prop_clear_new_linked:N { c } +\cs_new_protected:Npn \prop_gclear_new_linked:N #1 + { \prop_if_exist:NTF #1 { \prop_gclear:N #1 } { \prop_new_linked:N #1 } } +\cs_generate_variant:Nn \prop_gclear_new_linked:N { c } % \end{macrocode} % \end{macro} -% \end{macro} % % \begin{macro}[tested = m3prop001] % {\prop_set_eq:NN, \prop_set_eq:cN, \prop_set_eq:Nc, \prop_set_eq:cc} % \begin{macro}[tested = m3prop001] % {\prop_gset_eq:NN, \prop_gset_eq:cN, \prop_gset_eq:Nc, \prop_gset_eq:cc} -% These are simply copies from the token list functions. +% \begin{macro} +% { +% \@@_set_eq:NNNN, \@@_set_eq:wNNNN, \@@_set_eq:nNnNN, +% \@@_set_eq_loop:NNnw, \@@_set_eq_end:w +% } +% If both variables are accidentally the same variable (or equal flat property +% lists, as it turns out) we do nothing, otherwise the following code would +% lose all entries. If the target variable~|#3| is a flat prop, either copy +% directly or flatten before copying. If it is a linked prop, we must clear +% it, then go through the entries in~|#4| to add them to~|#3|. +% \begin{macrocode} +\cs_new_protected:Npn \prop_set_eq:NN + { \@@_set_eq:NNNN \cs_set_eq:NN \cs_set_nopar:Npe } +\cs_generate_variant:Nn \prop_set_eq:NN { Nc , cN , cc } +\cs_new_protected:Npn \prop_gset_eq:NN + { \@@_set_eq:NNNN \cs_gset_eq:NN \cs_gset_nopar:Npe } +\cs_generate_variant:Nn \prop_gset_eq:NN { Nc , cN , cc } +\cs_new_protected:Npn \@@_set_eq:NNNN #1#2#3#4 + { + \cs_if_eq:NNF #3#4 + { + \@@_if_flat:NTF #3 + { + \@@_if_flat:NTF #4 + { #1 #3 #4 } + { #2 #3 { \@@_flatten:N #4 } } + } + { \exp_after:wN \@@_set_eq:wNNNN #3 #1#2#3#4 } + } + } +\cs_new_protected:Npn \@@_set_eq:wNNNN + \@@_flatten:w #1 \s_@@ #2#3#4#5#6#7 + { + \@@_clear_entries:NN #4 #3 + \exp_args:Nf \@@_set_eq:nNnNN {#7} #1 {#2} #5 #6 + } +% \end{macrocode} +% We have used that |f|-expanding either type of prop gives a flat prop. At +% this stage \cs{@@_set_eq:nNnNN} receives the second variable as a flat prop, +% the end-pointer, the prefix, the suitable +% \cs[index=cs_set_nopar:Npe]{cs_(g)set_nopar:Npe} assignment, and the first +% variable itself. Remove the leading \cs{s_@@} and \cs{@@_chk:w} with +% \cs{use_i:nnn}, then start the loop. +% \begin{macrocode} +\cs_new_protected:Npn \@@_set_eq:nNnNN #1#2#3#4#5 + { + \use_i:nnn + { + \@@_set_eq_loop:NNnw #5 #4 {#3} + \@@_flatten:w #2 \s_@@ {#3} + } + #1 + \use_none:n \@@_pair:wn ? \s_@@ + } +% \end{macrocode} +% The looping function receives the current pointer~|#1| (initially the +% variable itself), the defining function~|#2| and the prefix~|#3|, then a +% partial definition~|#4| (which in later stages includes the backwards +% pointer), followed by the current value as \cs{s_@@} |{#5}|. It seeks the +% next key~|#7| to construct in \cs{l_@@_internal_tl} the next pointer +% \cs[no-index]{@@~\meta{prefix}~\meta{next key}} (the +% argument~|#6| is empty, except at the end of the loop, where it is +% \cs{use_none:n} in such a way as to delete the \meta{space} and \meta{next +% key}). Then the token list (current pointer)~|#1| is set-up to contain the +% partial definition and current value, as well as the newly constructed next +% pointer. After a line responsible for correctly ending the loop with +% \cs{@@_set_eq_end:w}, we loop, setting up the next definition, which starts +% with \cs{use_none:n} and a backwards pointer to~|#1| followed by the +% \meta{next key}~|#7| and so on. % \begin{macrocode} -\cs_new_eq:NN \prop_set_eq:NN \tl_set_eq:NN -\cs_new_eq:NN \prop_set_eq:Nc \tl_set_eq:Nc -\cs_new_eq:NN \prop_set_eq:cN \tl_set_eq:cN -\cs_new_eq:NN \prop_set_eq:cc \tl_set_eq:cc -\cs_new_eq:NN \prop_gset_eq:NN \tl_gset_eq:NN -\cs_new_eq:NN \prop_gset_eq:Nc \tl_gset_eq:Nc -\cs_new_eq:NN \prop_gset_eq:cN \tl_gset_eq:cN -\cs_new_eq:NN \prop_gset_eq:cc \tl_gset_eq:cc +\cs_new_protected:Npn \@@_set_eq_loop:NNnw + #1#2#3#4 \s_@@ #5#6 \@@_pair:wn #7 \s_@@ + { + \tl_set:Ne \l_@@_internal_tl { \exp_not:c { @@ ~ #3 #6 ~ #7 } } + #2 #1 { \exp_not:n { #4 \s_@@ {#5} } \exp_not:o \l_@@_internal_tl } + \use_none:n #6 \@@_set_eq_end:w + \exp_after:wN \@@_set_eq_loop:NNnw \l_@@_internal_tl #2 {#3} + \use_none:n #1 \@@_pair:wn #7 \s_@@ + } +% \end{macrocode} +% The end-code picks up what is needed to correctly assign the last token +% list (the end pointer), which is simply \cs{use_none:n} +% \cs[no-index]{@@_\meta{prefix}\meta{space}\meta{key_n}}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_set_eq_end:w + \exp_after:wN \@@_set_eq_loop:NNnw #1#2#3 + \use_none:n #4#5 \s_@@ + { + \exp_after:wN #2 \l_@@_internal_tl { \exp_not:n { \use_none:n #4 } } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\prop_make_flat:N, \prop_make_flat:c \@@_make_flat:Nn} +% The only interesting case is when given a linked prop. Clear the +% linked property list using \cs{@@_clear:wNNN} with local assignments +% (it does not matter since we are at the outermost group level, and +% \cs{cs_set_eq:NN} is very slightly faster than its global version. +% Then store the contents (expanded preventively by \cs{exp_args:NNf}) +% with an assignment \cs{cs_set_nopar:Npe} that does not perform +% \pkg{l3debug} checks. +% \begin{macrocode} +\cs_new_protected:Npn \prop_make_flat:N #1 + { + \int_compare:nNnTF { \tex_currentgrouplevel:D } = 0 + { + \@@_if_flat:NTF #1 { } + { \exp_args:NNf \@@_make_flat:Nn #1 {#1} } + } + { + \msg_error:nnee { prop } { inner-make } + { \token_to_str:N \prop_make_flat:N } { \token_to_str:N #1 } + } + } +\cs_generate_variant:Nn \prop_make_flat:N { c } +\cs_new_protected:Npn \@@_make_flat:Nn #1#2 + { + \exp_after:wN \@@_clear:wNNN #1 \cs_set_eq:NN \cs_set_nopar:Npe #1 + \cs_set_nopar:Npe #1 { \exp_not:n {#2} } + } % \end{macrocode} % \end{macro} +% +% \begin{macro}{\prop_make_linked:N, \prop_make_linked:c, \@@_make_linked:Nn} +% The only interesting case is when given a flat prop. We expand the +% contents for later use. Then \cs{@@_new_linked:N} disregards that +% previous value of~|#1| and initializes the linked prop. We can then +% use an auxiliary \cs{@@_set_eq:wNNNN} underlying +% \cs{prop_set_eq:NN}, with the prop contents saved as +% \cs{l_@@_internal_tl}. That step is a bit unsafe, as +% \cs{l_@@_internal_tl} (really, a flat prop here) is used within +% \cs{@@_set_eq:wNNNN} itself, but it is in fact expanded early enough +% to be ok. +% \begin{macrocode} +\cs_new_protected:Npn \prop_make_linked:N #1 + { + \int_compare:nNnTF { \tex_currentgrouplevel:D } = 0 + { + \@@_if_flat:NTF #1 + { \exp_args:NNo \@@_make_linked:Nn #1 {#1} } { } + } + { + \msg_error:nnee { prop } { inner-make } + { \token_to_str:N \prop_make_linked:N } { \token_to_str:N #1 } + } + } +\cs_generate_variant:Nn \prop_make_linked:N { c } +\cs_new_protected:Npn \@@_make_linked:Nn #1#2 + { + \@@_new_linked:N #1 + \tl_set:Nn \l_@@_internal_tl {#2} + \exp_after:wN \@@_set_eq:wNNNN #1 + \cs_set_eq:NN \cs_set_nopar:Npe #1 \l_@@_internal_tl + } +% \end{macrocode} % \end{macro} % % \begin{variable}[tested = m3prop004]{\l_tmpa_prop, \l_tmpb_prop} @@ -841,156 +1339,223 @@ % \end{variable} % \end{variable} % -% \begin{variable}{\l_@@_internal_prop} -% Property list used by \cs{prop_concat:NNN}, -% \cs{prop_set_from_keyval:Nn} and others. -% \begin{macrocode} -\prop_new:N \l_@@_internal_prop -% \end{macrocode} -% \end{variable} -% % \begin{macro} % { % \prop_concat:NNN, \prop_concat:ccc, -% \prop_gconcat:NNN, \prop_gconcat:ccc, \@@_concat:NNNN +% \prop_gconcat:NNN, \prop_gconcat:ccc, +% \@@_concat:NNNNN, \@@_concat:nNNN % } -% Combine two property lists. We cannot use a simple -% \cs{tl_concat:NNN} because there may be some duplicate keys between -% the two property lists. +% The basic strategy is to copy the first variable into the target, +% then loop through the second variable, calling +% \cs[index=prop_put:Nnn]{prop_(g)put:Nnn} on each item. To avoid +% running the \pkg{l3debug} scope checks on each of these steps, we +% use the auxiliaries that underly \cs{prop_set_eq:NN} and +% \cs{prop_put:Nnn}, whose syntax is a bit unwieldy. +% We work directly with the target prop |#3| as a scratch space, +% because copying over from a temporary variable to |#3| would be slow +% in the linked case. If |#5| is |#3| itself we have to be careful +% not to lose the data, and we even take the opportunity to skip the +% copying step completely. To keep the correct version of the +% duplicate keys we use the code underlying \cs{prop_put_if_new:Nnn}, +% which involves passing \cs{use_none:nnn} to the auxiliary instead of +% nothing. +% There is no need to check for the case where |#3| is equal to~|#4| +% because in that case \cs[index=prop_set_eq:NN]{prop_(g)set_eq:NN} +% |#3| |#4| (or rather the underlying auxiliary) is correctly set up +% to do no needless work. % \begin{macrocode} \cs_new_protected:Npn \prop_concat:NNN - { \@@_concat:NNNN \prop_set_eq:NN } + { \@@_concat:NNNNN \cs_set_eq:NN \cs_set_nopar:Npe } \cs_generate_variant:Nn \prop_concat:NNN { ccc } \cs_new_protected:Npn \prop_gconcat:NNN - { \@@_concat:NNNN \prop_gset_eq:NN } + { \@@_concat:NNNNN \cs_gset_eq:NN \cs_gset_nopar:Npe } \cs_generate_variant:Nn \prop_gconcat:NNN { ccc } -\cs_new_protected:Npn \@@_concat:NNNN #1#2#3#4 +\cs_new_protected:Npn \@@_concat:NNNNN #1#2#3#4#5 { - \prop_set_eq:NN \l_@@_internal_prop #3 - \prop_map_inline:Nn #4 { \prop_put:Nnn \l_@@_internal_prop {##1} {##2} } - #1 #2 \l_@@_internal_prop + \cs_if_eq:NNTF #3 #5 + { \@@_concat:nNNN \use_none:nnn #2 #3 #4 } + { + \@@_set_eq:NNNN #1 #2 #3 #4 + \@@_concat:nNNN { } #2 #3 #5 + } + } +\cs_new_protected:Npn \@@_concat:nNNN #1#2#3#4 + { + \cs_gset_eq:NN \@@_tmp:w \@@_pair:wn + \cs_gset_protected:Npn \@@_pair:wn ##1 \s_@@ + { \@@_put:nNNnn {#1} #2 #3 {##1} } + \exp_last_unbraced:Nf \use_none:nn #4 + \cs_gset_eq:NN \@@_pair:wn \@@_tmp:w } % \end{macrocode} % \end{macro} % -% \begin{macro}{\prop_set_from_keyval:Nn, \prop_set_from_keyval:cn} -% \begin{macro}{\prop_gset_from_keyval:Nn, \prop_gset_from_keyval:cn} -% \begin{macro}{\prop_const_from_keyval:Nn, \prop_const_from_keyval:cn} -% \begin{macro}{\prop_put_from_keyval:Nn, \prop_put_from_keyval:cn} -% \begin{macro}{\prop_gput_from_keyval:Nn, \prop_gput_from_keyval:cn} -% \begin{macro}{\@@_missing_eq:n} -% To avoid tracking throughout the loop the variable name and whether -% the assignment is local/global, do everything in a scratch variable -% and empty it afterwards to avoid wasting memory. Loop through items -% separated by commas, with \cs{prg_do_nothing:} to avoid losing -% braces. After checking for termination, split the item at the first -% and then at the second |=| (which ought to be the first of the -% trailing~|=| that we added). For both splits trim spaces and call a -% function (first \cs{@@_from_keyval_key:w} then -% \cs{@@_from_keyval_value:w}), followed by the trimmed material, -% \cs{s_@@_mark}, the subsequent part of the item, and the trailing |=|'s -% and \cs{s_@@_stop}. After finding the \meta{key} just store it after -% \cs{s_@@_stop}. After finding the \meta{value} ignore completely empty -% items (both trailing~|=| were used as delimiters and all parts are -% empty); if the remaining part~|#2| consists exactly of the second -% trailing~|=| (namely there was exactly one |=|~in the item) then -% output one key--value pair for the property list; otherwise complain -% about a missing or extra~|=|. +% \begin{macro} +% { +% \prop_put_from_keyval:Nn, \prop_put_from_keyval:cn, +% \prop_gput_from_keyval:Nn, \prop_gput_from_keyval:cn, +% \@@_from_keyval:nn, \@@_from_keyval:Nnn, +% \@@_missing_eq:n +% } +% The core is a call to \cs{keyval_parse:nnn}, with an error message +% \cs{@@_missing_eq:n} for entries without~|=|, and a call to (essentially) +% \cs[index=prop_put:Nnn]{prop_(g)put:Nnn} for valid key--value pairs. +% To avoid repeated scope checks (and errors) when \pkg{l3debug} is +% active, we instead use the auxiliary underlying \cs{prop_put:Nnn}. +% Because blank keys are valid here, in contrast to \pkg{l3keys}, we set and +% restore \cs{l__kernel_keyval_allow_blank_keys_bool}. +% The key--value argument may be quite large so we avoid reading it until it +% is really necessary. +% \begin{macrocode} +\cs_new_protected:Npn \prop_put_from_keyval:Nn #1 + { \@@_from_keyval:nn { \@@_put:nNNnn { } \cs_set_nopar:Npe #1 } } +\cs_generate_variant:Nn \prop_put_from_keyval:Nn { c } +\cs_new_protected:Npn \prop_gput_from_keyval:Nn #1 + { \@@_from_keyval:nn { \@@_put:nNNnn { } \cs_gset_nopar:Npe #1 } } +\cs_generate_variant:Nn \prop_gput_from_keyval:Nn { c } +\cs_new_protected:Npn \@@_from_keyval:nn + { + \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool + { \@@_from_keyval:Nnn \c_true_bool } + { \@@_from_keyval:Nnn \c_false_bool } + } +\cs_new_protected:Npn \@@_from_keyval:Nnn #1#2#3 + { + \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool \c_true_bool + \keyval_parse:nnn \@@_missing_eq:n {#2} {#3} + \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool #1 + } +\cs_new_protected:Npn \@@_missing_eq:n + { \msg_error:nnn { prop } { prop-keyval } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { +% \prop_set_from_keyval:Nn, \prop_set_from_keyval:cn, +% \prop_gset_from_keyval:Nn, \prop_gset_from_keyval:cn, +% } +% Just empty the prop (with the auxiliary underlying +% \cs{prop_clear:N} to avoid \pkg{l3debug} problems) and push +% key--value entries using +% \cs[index=prop_put_from_keyval:Nn]{prop_(g)put_from_keyval:Nn}. % \begin{macrocode} \cs_new_protected:Npn \prop_set_from_keyval:Nn #1 { - \prop_clear:N #1 + \@@_clear:NNN \cs_set_eq:NN \cs_set_nopar:Npe #1 \prop_put_from_keyval:Nn #1 } \cs_generate_variant:Nn \prop_set_from_keyval:Nn { c } \cs_new_protected:Npn \prop_gset_from_keyval:Nn #1 { - \prop_gclear:N #1 + \@@_clear:NNN \cs_gset_eq:NN \cs_gset_nopar:Npe #1 \prop_gput_from_keyval:Nn #1 } \cs_generate_variant:Nn \prop_gset_from_keyval:Nn { c } -\cs_new_protected:Npn \prop_const_from_keyval:Nn #1#2 +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { +% \prop_const_from_keyval:Nn, \prop_const_from_keyval:cn, +% \prop_const_linked_from_keyval:Nn, \prop_const_linked_from_keyval:cn +% } +% For both flat and linked constant props, we create |#1| then use the +% same auxiliary as for \cs{prop_gput_from_keyval:Nn}. It is most +% natural to use the already packaged \cs{prop_gput:Nnn}, but that +% would mean doing an assignment on a supposedly constant property +% list. To avoid errors when \pkg{l3debug} is activated, we use the +% auxiliary underlying \cs{prop_gput:Nnn}. +% \begin{macrocode} +\cs_new_protected:Npn \prop_const_from_keyval:Nn #1 { - \prop_set_from_keyval:Nn \l_@@_internal_prop {#2} - \tl_const:Ne #1 { \exp_not:o \l_@@_internal_prop } - \prop_clear:N \l_@@_internal_prop + \prop_new:N #1 + \@@_from_keyval:nn { \@@_put:nNNnn { } \cs_gset_nopar:Npe #1 } } \cs_generate_variant:Nn \prop_const_from_keyval:Nn { c } -\cs_new_protected:Npn \prop_put_from_keyval:Nn - { - \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool - { \@@_keyval_parse:NNNn \c_true_bool } - { \@@_keyval_parse:NNNn \c_false_bool } - \prop_put:Nnn - } -\cs_generate_variant:Nn \prop_put_from_keyval:Nn { c } -\cs_new_protected:Npn \prop_gput_from_keyval:Nn - { - \bool_if:NTF \l__kernel_keyval_allow_blank_keys_bool - { \@@_keyval_parse:NNNn \c_true_bool } - { \@@_keyval_parse:NNNn \c_false_bool } - \prop_gput:Nnn - } -\cs_generate_variant:Nn \prop_gput_from_keyval:Nn { c } -\cs_new_protected:Npn \@@_missing_eq:n - { \msg_error:nnn { prop } { prop-keyval } } -\cs_new_protected:Npn \@@_keyval_parse:NNNn #1#2#3#4 +\cs_new_protected:Npn \prop_const_linked_from_keyval:Nn #1 { - \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool \c_true_bool - \keyval_parse:nnn \@@_missing_eq:n { #2 #3 } {#4} - \bool_set_eq:NN \l__kernel_keyval_allow_blank_keys_bool #1 + \prop_new_linked:N #1 + \@@_from_keyval:nn { \@@_put:nNNnn { } \cs_gset_nopar:Npe #1 } } +\cs_generate_variant:Nn \prop_const_linked_from_keyval:Nn { c } % \end{macrocode} % \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} % % \subsection{Accessing data in property lists} % -% \begin{macro}{\@@_split:NnTF} -% \begin{macro}{\@@_split_aux:NnTF} -% \begin{macro}[EXP]{\@@_split_aux:w} -% This function is used by most of the module, and hence must be fast. -% It receives a \meta{property list}, a \meta{key}, a \meta{true code} -% and a \meta{false code}. The aim is to split the \meta{property -% list} at the given \meta{key} into the \meta{extract_1} before the -% key--value pair, the \meta{value} associated with the \meta{key} and -% the \meta{extract_2} after the key--value pair. This is done using -% a delimited function, whose definition is as follows, where the -% \meta{key} is turned into a string. +% Accessing/deleting/adding entries is mostly done by \cs{@@_split:NnTFn}, which +% must be fast because it is used in many \pkg{l3prop} functions. Its syntax is +% as follows. +% \begin{quote} +% \cs{@@_split:NnTFn} \meta{property list} \Arg{key} \\ +% ~~\Arg{true code} \Arg{false code} \Arg{link code} +% \end{quote} +% If the \meta{property list} uses the linked data storage, then it runs +% the \meta{link code}, otherwise it does as follows. +% +% It splits the \meta{property list} at the \meta{key}, giving three +% token lists: the \meta{entries before} the \meta{key}, the +% \meta{value} associated with the \meta{key} and the \meta{entries +% after} the \meta{key}. Both the \meta{entries before} and the +% \meta{entries after} can be empty or consist of some number of +% consecutive entries \cs{@@_pair:wn} \meta{key_i} \cs{s_@@} +% \Arg{value_i}. If the \meta{key} is present in the \meta{property +% list} then the \meta{true code} is left in the input stream, with +% |#2|, |#3|, and |#4| replaced by the \meta{entries before}, +% \meta{value}, and \meta{entries after}. If the \meta{key} is not +% present in the \meta{property list} then the \meta{false code} is left +% in the input stream. Only the \meta{true code} is used in the +% replacement text of a macro defined internally, which requires +% |##|~doubling. +% +% \begin{macro}{\@@_split:NnTFn} +% \begin{macro}{\@@_split_aux:NnTFn} +% \begin{macro}{\@@_split_aux:w} +% The aim is to split the \meta{property list} at the given \meta{key} +% into the \meta{extract_1} before the key--value pair, the +% \meta{value} associated with the \meta{key} and the \meta{extract_2} +% after the key--value pair. This is done using a delimited function, +% whose definition is as follows, where the \meta{key} is turned into +% a string. % \begin{quote} -% \cs{cs_set:Npn} \cs{@@_split_aux:w} |#1| \\ -% \quad \cs{@@_pair:wn} \meta{key} \cs{s_@@} |#2| \\ -% \quad |#3| \cs{s_@@_mark} |#4| |#5| \cs{s_@@_stop} \\ -% \quad |{| |#4| \Arg{true code} \Arg{false code} |}| +% \cs{cs_set:Npn} \cs{@@_split_aux:w} |#1| \cs{@@_chk:w} |#2| \\ +% \quad \cs{@@_pair:wn} \meta{key} \cs{s_@@} |#3| \\ +% \quad |#4| \cs{s_@@_mark} |#5| |#6| \cs{s_@@_stop} \\ +% \quad |{| |#5| \Arg{true code} |}| % \end{quote} % % If the \meta{key} is present in the property list, -% \cs{@@_split_aux:w}'s |#1| is the part before the \meta{key}, |#2| -% is the \meta{value}, |#3| is the part after the \meta{key}, |#4| is -% \cs{use_i:nn}, and |#5| is additional tokens that we do not care +% \cs{@@_split_aux:w}'s |#2| is the part before the \meta{key}, |#3| +% is the \meta{value}, |#4| is the part after the \meta{key}, |#5| is +% \cs{use_i:nnn}, and |#6| is additional tokens that we do not care % about. The \meta{true code} is left in the input stream, and can -% use the parameters |#1|, |#2|, |#3| for the three parts of the +% use the parameters |#2|, |#3|, |#4| for the three parts of the % property list as desired. Namely, the original property list is in -% this case |#1| \cs{@@_pair:wn} \meta{key} \cs{s_@@} |{#2}| |#3|. +% this case \cs{s_@@} \cs{@@_chk:w} |#2| \cs{@@_pair:wn} \meta{key} +% \cs{s_@@} |{#3}| |#4|. % % If the \meta{key} is not there, then the \meta{function} is -% \cs{use_ii:nn}, which keeps the \meta{false code}. +% \cs{use_ii:nnn}, which keeps the \meta{false code}. If the property +% list uses the doubly-linked list storage, then the argument +% delimited by \cs{@@_chk:w} includes the whole property list, |#2|, +% |#3|, |#4| are empty, and |#5| is \cs{use_iii:nnn}. In all three +% cases, the appopriate code among \meta{true code}, \meta{false +% code}, and \meta{linked code} is run. % \begin{macrocode} -\cs_new_protected:Npn \@@_split:NnTF #1#2 - { \exp_args:NNo \@@_split_aux:NnTF #1 { \tl_to_str:n {#2} } } -\cs_new_protected:Npn \@@_split_aux:NnTF #1#2#3#4 +\cs_new_protected:Npn \@@_split:NnTFn #1#2 + { \exp_args:NNo \@@_split_aux:NnTFn #1 { \tl_to_str:n {#2} } } +\cs_new_protected:Npn \@@_split_aux:NnTFn #1#2#3 { - \cs_set:Npn \@@_split_aux:w ##1 - \@@_pair:wn #2 \s_@@ ##2 ##3 \s_@@_mark ##4 ##5 \s_@@_stop - { ##4 {#3} {#4} } - \exp_after:wN \@@_split_aux:w #1 \s_@@_mark \use_i:nn - \@@_pair:wn #2 \s_@@ { } \s_@@_mark \use_ii:nn \s_@@_stop + \cs_set:Npn \@@_split_aux:w ##1 \@@_chk:w ##2 + \@@_pair:wn #2 \s_@@ ##3 ##4 \s_@@_mark ##5 ##6 \s_@@_stop + { ##5 {#3} } + \exp_after:wN \@@_split_aux:w #1 \s_@@_mark \use_i:nnn + \@@_pair:wn #2 \s_@@ { } \s_@@_mark \use_ii:nnn + \@@_chk:w + \@@_pair:wn #2 \s_@@ { } \s_@@_mark \use_iii:nnn + \s_@@_stop } -\cs_new:Npn \@@_split_aux:w { } % \end{macrocode} % \end{macro} % \end{macro} @@ -998,37 +1563,13 @@ % % \begin{macro}[tested = m3prop002] % { -% \prop_remove:Nn, \prop_remove:NV, \prop_remove:Ne, -% \prop_remove:cn, \prop_remove:cV, \prop_remove:ce -% } -% \begin{macro}[tested = m3prop002] -% { -% \prop_gremove:Nn, \prop_gremove:NV, \prop_gremove:Ne, -% \prop_gremove:cn, \prop_gremove:cV, \prop_gremove:ce +% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NeN, +% \prop_get:NoN, \prop_get:NxN, +% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:ceN, +% \prop_get:coN, \prop_get:cxN, +% \prop_get:cnc % } -% Deleting from a property starts by splitting the list. -% If the key is present in the property list, the returned value is ignored. -% If the key is missing, nothing happens. -% \begin{macrocode} -\cs_new_protected:Npn \prop_remove:Nn #1#2 - { - \@@_split:NnTF #1 {#2} - { \tl_set:Nn #1 { ##1 ##3 } } - { } - } -\cs_new_protected:Npn \prop_gremove:Nn #1#2 - { - \@@_split:NnTF #1 {#2} - { \tl_gset:Nn #1 { ##1 ##3 } } - { } - } -\cs_generate_variant:Nn \prop_remove:Nn { NV , Ne , c , cV , ce } -\cs_generate_variant:Nn \prop_gremove:Nn { NV , Ne , c , cV , ce } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}[tested = m3prop002] +% \begin{macro}[TF, tested = m3prop004] % { % \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NeN, % \prop_get:NoN, \prop_get:NxN, @@ -1036,64 +1577,75 @@ % \prop_get:coN, \prop_get:cxN, % \prop_get:cnc % } -% Getting an item from a list is very easy: after splitting, -% if the key is in the property list, just set the token list variable -% to the return value, otherwise to \cs{q_no_value}. +% \begin{macro}{\@@_get:NnnTF} +% \begin{macro}[EXP]{\@@_get_linked:w, \@@_get_linked_aux:w} +% Here we implement both \cs{prop_get:NnN} and its branching version through +% \cs{@@_get:NnnTF}. It receives the prop and key, followed by an assignment +% used when the value is found, \meta{true code} to run after the assignment, +% and some fall-back \meta{false code} for absent values. It relies on +% \cs{@@_split:NnTFn}. For a flat prop, the first four arguments of +% \cs{@@_split:NnTFn} are used, and run either the assignment~|#3{##3}| and +% \meta{true code}~|#4|, or the \meta{false code}~|#5|. % \begin{macrocode} \cs_new_protected:Npn \prop_get:NnN #1#2#3 { - \@@_split:NnTF #1 {#2} - { \tl_set:Nn #3 {##2} } - { \tl_set:Nn #3 { \q_no_value } } + \@@_get:NnnTF #1 {#2} + { \tl_set:Nn #3 } { } { \tl_set:Nn #3 { \q_no_value } } } \cs_generate_variant:Nn \prop_get:NnN { NV , Nv , Ne , c , cV , cv , ce } \cs_generate_variant:Nn \prop_get:NnN { No , Nx , co , cx } \cs_generate_variant:Nn \prop_get:NnN { cnc } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[tested = m3prop002] -% { -% \prop_pop:NnN, \prop_pop:NVN, -% \prop_pop:NoN, -% \prop_pop:cnN, \prop_pop:cVN, -% \prop_pop:coN, -% } -% \begin{macro}[tested = m3prop002] -% { -% \prop_gpop:NnN, \prop_gpop:NVN, -% \prop_gpop:NoN, -% \prop_gpop:cnN, \prop_gpop:cVN, -% \prop_gpop:coN, -% } -% Popping a value also starts by doing the split. -% If the key is present, save the value in the token list and update the -% property list as when deleting. -% If the key is missing, save \cs{q_no_value} in the token list. -% \begin{macrocode} -\cs_new_protected:Npn \prop_pop:NnN #1#2#3 +\prg_new_protected_conditional:Npnn \prop_get:NnN #1#2#3 { T , F , TF } { - \@@_split:NnTF #1 {#2} - { - \tl_set:Nn #3 {##2} - \tl_set:Nn #1 { ##1 ##3 } - } - { \tl_set:Nn #3 { \q_no_value } } + \@@_get:NnnTF #1 {#2} + { \tl_set:Nn #3 } \prg_return_true: \prg_return_false: } -\cs_new_protected:Npn \prop_gpop:NnN #1#2#3 +\prg_generate_conditional_variant:Nnn \prop_get:NnN + { NV , Nv , Ne , c , cV , cv , ce } { T , F , TF } +\prg_generate_conditional_variant:Nnn \prop_get:NnN + { No , Nx , co , cx } { T , F , TF } +\prg_generate_conditional_variant:Nnn \prop_get:NnN + { cnc } { T , F , TF } +\cs_new_protected:Npn \@@_get:NnnTF #1#2#3#4#5 { - \@@_split:NnTF #1 {#2} - { - \tl_set:Nn #3 {##2} - \tl_gset:Nn #1 { ##1 ##3 } - } - { \tl_set:Nn #3 { \q_no_value } } + \@@_split:NnTFn #1 {#2} + { #3 {##3} #4 } + {#5} + { \exp_after:wN \@@_get_linked:w #1 {#2} {#3} {#4} {#5} } } -\cs_generate_variant:Nn \prop_pop:NnN { NV , No } -\cs_generate_variant:Nn \prop_pop:NnN { c , cV , co } -\cs_generate_variant:Nn \prop_gpop:NnN { NV , No } -\cs_generate_variant:Nn \prop_gpop:NnN { c , cV , co } % \end{macrocode} +% For a linked prop we must work a bit: \cs{@@_get_linked:w} is followed by +% the expansion of the prop, then by four brace groups: the key~|#4|, the +% assignment code~|#5|, \meta{true code}~|#6|, and \meta{false code}~|#7|. If +% the key is present, its value is stored in the token list +% \cs[no-index]{@@_}|#2~#4|. If that token list exists, +% \cs{@@_get_linked_aux:w} gets called followed by the expansion of that token +% list and we grab as~|#2| the value associated to that key, which we feed to +% the assignment code and follow-up code. If the key is absent the token list +% can be \tn{undefined} or \tn{relax}. In both cases \cs{@@_get_linked_aux:w} +% finds an empty brace group as~|#2|, \cs{use_none:n} as~|#4| and the +% \meta{false code} as~|#5|. +% Note that we made \cs{@@_get_linked:w} and subsequent auxiliaries +% expandable, because they are also used in \cs{prop_item:Nn}. +% \begin{macrocode} +\cs_new:Npn \@@_get_linked:w + \@@_flatten:w #1 \s_@@ #2#3#4#5#6#7 + { + \if_cs_exist:w @@ ~ #2 ~ \tl_to_str:n {#4} \cs_end: + \exp_after:wN \exp_after:wN \exp_after:wN \@@_get_linked_aux:w + \cs:w @@ ~ #2 ~ \tl_to_str:n {#4} \exp_after:wN \cs_end: + \else: + \exp_after:wN \@@_get_linked_aux:w + \fi: + \s_@@_mark {#5} {#6} + \s_@@ { } \s_@@_mark \use_none:n {#7} + \s_@@_stop + } +\cs_new:Npn \@@_get_linked_aux:w + #1 \s_@@ #2 #3 \s_@@_mark #4 #5 #6 \s_@@_stop { #4 {#2} #5 } +% \end{macrocode} +% \end{macro} +% \end{macro} % \end{macro} % \end{macro} % @@ -1103,7 +1655,7 @@ % \prop_item:cn, \prop_item:cV, \prop_item:co, \prop_item:ce % } % \begin{macro}[EXP]{\@@_item:nnn} -% Getting the value corresponding to a key in a property list in an +% Getting the value corresponding to a key in a flat property list in an % expandable fashion simply uses \cs{prop_map_tokens:Nn} to go through % the property list. The auxiliary \cs{@@_item:nnn} receives the % search string~|#1|, the key~|#2| and the value~|#3| and returns as @@ -1111,8 +1663,15 @@ % \begin{macrocode} \cs_new:Npn \prop_item:Nn #1#2 { - \exp_args:NNo \prop_map_tokens:Nn #1 - { \exp_after:wN \@@_item:nnn \exp_after:wN { \tl_to_str:n {#2} } } + \@@_if_flat:NTF #1 + { + \exp_args:NNo \prop_map_tokens:Nn #1 + { + \exp_after:wN \@@_item:nnn + \exp_after:wN { \tl_to_str:n {#2} } + } + } + { \exp_after:wN \@@_get_linked:w #1 {#2} \use:n { } { } } } \cs_new:Npn \@@_item:nnn #1#2#3 { @@ -1124,161 +1683,259 @@ % \end{macro} % \end{macro} % -% \begin{macro}[EXP]{\prop_count:N, \prop_count:c} -% \begin{macro}[EXP]{\@@_count:nn} -% Counting the key--value pairs in a property list is done using the -% same approach as for other count functions: turn each entry into a -% \texttt{+1} then use integer evaluation to actually do the -% mathematics. +% \subsection{Removing data from property lists} +% +% \begin{macro} +% { +% \@@_pop:NnNNnTF, +% \@@_pop_linked:wnNNnTF, \@@_pop_linked:NNNn, +% \@@_pop_linked:w, +% \@@_pop_linked_prev:w, \@@_pop_linked_next:w +% } +% This auxiliary is used by both the \cs[no-index]{prop_pop} family and +% the \cs[no-index]{prop_remove} family of functions. +% It receives a \meta{prop} and a \Arg{key}, three assignment functions +% (\cs{tl_set:Nn} \cs{cs_set_eq:NN} \cs{cs_set_nopar:Npe} or their global +% versions), then \Arg{code} \Arg{true code} \Arg{false code}. +% +% For a flat prop, split it. If the \meta{key} is there, reconstruct the rest +% of the prop from the two extracts |##2| |##4| and assign using +% \cs[index=tl_set:Nn]{tl_(g)set:Nn}, then run \meta{code} \Arg{value} with +% the \meta{value} found, and run the \meta{true code}. If the \meta{key} is +% absent, run the \meta{false code}. +% +% For a linked prop, the removal is done by \cs{@@_pop_linked:wnNNnTF}, which +% removes the key--value pair from the doubly-linked list and runs its last +% three arguments \Arg{code} \Arg{true code} \Arg{false code} depending on +% whether the key--value is found, in the same way as for flat props. % \begin{macrocode} -\cs_new:Npn \prop_count:N #1 +\cs_new_protected:Npn \@@_pop:NnNNnTF #1#2#3#4#5#6#7 { - \int_eval:n + \@@_split:NnTFn #1 {#2} { - 0 - \prop_map_function:NN #1 \@@_count:nn + #4 #1 { \exp_not:n { \s_@@ \@@_chk:w ##2 ##4 } } + #5 {##3} + #6 + } + {#7} + { + \exp_after:wN \@@_pop_linked:wnNNnTF #1 {#2} + #3 #4 {#5} {#6} {#7} } } -\cs_new:Npn \@@_count:nn #1#2 { + 1 } -\cs_generate_variant:Nn \prop_count:N { c } % \end{macrocode} -% \end{macro} +% The next auxiliary \cs{@@_pop_linked:wnNNnTF}, together with the |NNNn| +% auxiliary, checks if the key is present in the \meta{linked prop}, then the +% corresponding value (if present) is passed as a braced argument to the +% \meta{code} and the \meta{true code} or \meta{false code} is run as +% appropriate. Before that, there are also three assignments: the token lists +% for the previous key and next key are made to point to each other, cf.\ +% \cs{@@_pop_linked:w}, and the token list for the given key is made +% undefined. +% \begin{macrocode} +\cs_new_protected:Npn \@@_pop_linked:wnNNnTF + \@@_flatten:w #1 \s_@@ #2#3#4#5#6#7 + { + \if_cs_exist:w @@ ~ #2 ~ \tl_to_str:n {#4} \cs_end: + \exp_after:wN \@@_pop_linked:NNNn + \cs:w @@ ~ #2 ~ \tl_to_str:n {#4} \cs_end: + #5 #6 {#7} + \else: + \exp_after:wN \use_iii:nnn + \fi: + \use_i:nn + } +\cs_new_protected:Npn \@@_pop_linked:NNNn #1#2#3#4 + { + \if_meaning:w \scan_stop: #1 + \exp_after:wN \exp_after:wN \exp_after:wN \use_iii:nnn + \else: + \exp_after:wN \@@_pop_linked:w #1 #1 #2 #3 {#4} + \fi: + } +\cs_new_protected:Npn \@@_pop_linked:w + \use_none:n #1#2 \s_@@ #3#4#5#6#7#8 + { + #6 #5 \tex_undefined:D + #7 #1 + { + \exp_after:wN \@@_pop_linked_prev:w #1 + \exp_not:N #4 + } + #7 #4 + { + \exp_not:n { \use_none:n #1 } + \exp_not:f { \exp_after:wN \@@_pop_linked_next:w #4 } + } + #8 {#3} + } +\cs_new:Npn \@@_pop_linked_prev:w #1 \s_@@ #2#3 + { \exp_not:n { #1 \s_@@ {#2} } } +\cs_new:Npn \@@_pop_linked_next:w \use_none:n #1 { \exp_stop_f: } +% \end{macrocode} % \end{macro} % -% \begin{macro}[EXP]{\prop_to_keyval:N} -% \begin{macro}[EXP] -% {\@@_to_keyval_exp_after:wN, \@@_to_keyval:nn, \@@_to_keyval:nnw} -% Each property name and value pair will be returned in the form -% \verb*| |\marg{name}\verb*|= |\marg{value}. As one of the main use cases for -% this macro is to pass the \meta{property list} on to a key--value parser, we -% have to make sure that the behaviour is as good as possible. Using a space -% before the opening brace we get the correct brace stripping behaviour for -% most of the key--value parsers available in \LaTeX. -% Iterate over the -% \meta{property list} and remove the leading comma afterwards. Only the value -% has to be protected in \cs{__kernel_exp_not:w} as the property name is -% always a string. After the loop the leading comma is removed by -% \cs{use_none:n} and afterwards \cs{__kernel_exp_not:w} eventually finds the -% opening brace of its argument. +% \begin{macro}[tested = m3prop002] +% { +% \prop_remove:Nn, \prop_remove:NV, \prop_remove:Ne, +% \prop_remove:cn, \prop_remove:cV, \prop_remove:ce +% } +% \begin{macro}[tested = m3prop002] +% { +% \prop_gremove:Nn, \prop_gremove:NV, \prop_gremove:Ne, +% \prop_gremove:cn, \prop_gremove:cV, \prop_gremove:ce +% } +% Deleting from a property relies on \cs{@@_pop:NnNNnTF}. The three +% assignment functions are suitably local or global. The last three arguments +% are \cs{use_none:n} and two empty brace groups: if the key is found we get +% \cs{use_none:n} \Arg{key} \meta{empty}, which expands to nothing, and +% otherwise we just get \meta{empty}. The auxiliary takes care of actually +% removing the entry from the prop. % \begin{macrocode} -\cs_new:Npn \prop_to_keyval:N #1 +\cs_new_protected:Npn \prop_remove:Nn #1#2 { - \__kernel_exp_not:w - \prop_if_empty:NTF #1 - { {} } - { - \exp_after:wN \exp_after:wN \exp_after:wN - { - \tex_expanded:D - { - \__kernel_exp_not:w { \use_none:n } - \prop_map_function:NN #1 \@@_to_keyval:nn - } - } - } + \@@_pop:NnNNnTF #1 {#2} + \cs_set_eq:NN \cs_set_nopar:Npe + \use_none:n { } { } } -\cs_new:Npn \@@_to_keyval:nn #1#2 - { , ~ {#1} =~ { \__kernel_exp_not:w {#2} } } +\cs_new_protected:Npn \prop_gremove:Nn #1#2 + { + \@@_pop:NnNNnTF #1 {#2} + \cs_gset_eq:NN \cs_gset_nopar:Npe + \use_none:n { } { } + } +\cs_generate_variant:Nn \prop_remove:Nn { NV , Ne , c , cV , ce } +\cs_generate_variant:Nn \prop_gremove:Nn { NV , Ne , c , cV , ce } % \end{macrocode} % \end{macro} % \end{macro} % +% \begin{macro}[tested = m3prop002] +% { +% \prop_pop:NnN, \prop_pop:NVN, \prop_pop:NoN, +% \prop_pop:cnN, \prop_pop:cVN, \prop_pop:coN, +% \prop_gpop:NnN, \prop_gpop:NVN, \prop_gpop:NoN, +% \prop_gpop:cnN, \prop_gpop:cVN, \prop_gpop:coN, +% } % \begin{macro}[TF, tested = m3prop004] % { -% \prop_pop:NnN, \prop_pop:NVN, -% \prop_pop:cnN, \prop_pop:cVN, -% \prop_gpop:NnN, \prop_gpop:NVN, -% \prop_gpop:NoN, -% \prop_gpop:cnN, \prop_gpop:cVN, +% \prop_pop:NnN, \prop_pop:NVN, \prop_pop:NoN, +% \prop_pop:cnN, \prop_pop:cVN, \prop_pop:coN, +% \prop_gpop:NnN, \prop_gpop:NVN, \prop_gpop:NoN, +% \prop_gpop:cnN, \prop_gpop:cVN, \prop_gpop:coN, % } -% Popping an item from a property list, keeping track of whether -% the key was present or not, is implemented as a conditional. -% If the key was missing, neither the property list, nor the token -% list are altered. Otherwise, \cs{prg_return_true:} is used after -% the assignments. +% Popping a value is almost the same, but the value found is kept. +% For the non-branching version, we additionally set the target token list to +% \cs{q_no_value}, while for the branching version we must produce +% \cs{prg_return_true:} or \cs{prg_return_false:}. % \begin{macrocode} +\cs_new_protected:Npn \prop_pop:NnN #1#2#3 + { + \@@_pop:NnNNnTF #1 {#2} + \cs_set_eq:NN \cs_set_nopar:Npe + { \tl_set:Nn #3 } { } { \tl_set:Nn #3 { \q_no_value } } + } +\cs_new_protected:Npn \prop_gpop:NnN #1#2#3 + { + \@@_pop:NnNNnTF #1 {#2} + \cs_gset_eq:NN \cs_gset_nopar:Npe + { \tl_set:Nn #3 } { } { \tl_set:Nn #3 { \q_no_value } } + } +\cs_generate_variant:Nn \prop_pop:NnN { NV , No } +\cs_generate_variant:Nn \prop_pop:NnN { c , cV , co } +\cs_generate_variant:Nn \prop_gpop:NnN { NV , No } +\cs_generate_variant:Nn \prop_gpop:NnN { c , cV , co } \prg_new_protected_conditional:Npnn \prop_pop:NnN #1#2#3 { T , F , TF } { - \@@_split:NnTF #1 {#2} - { - \tl_set:Nn #3 {##2} - \tl_set:Nn #1 { ##1 ##3 } - \prg_return_true: - } - { \prg_return_false: } + \@@_pop:NnNNnTF #1 {#2} + \cs_set_eq:NN \cs_set_nopar:Npe + { \tl_set:Nn #3 } \prg_return_true: \prg_return_false: } \prg_new_protected_conditional:Npnn \prop_gpop:NnN #1#2#3 { T , F , TF } { - \@@_split:NnTF #1 {#2} - { - \tl_set:Nn #3 {##2} - \tl_gset:Nn #1 { ##1 ##3 } - \prg_return_true: - } - { \prg_return_false: } + \@@_pop:NnNNnTF #1 {#2} + \cs_gset_eq:NN \cs_gset_nopar:Npe + { \tl_set:Nn #3 } \prg_return_true: \prg_return_false: } -\prg_generate_conditional_variant:Nnn \prop_pop:NnN { NV , c , cV } { T , F , TF } -\prg_generate_conditional_variant:Nnn \prop_gpop:NnN { NV , c , cV } { T , F , TF } +\prg_generate_conditional_variant:Nnn \prop_pop:NnN + { NV , No , c , cV , co } { T , F , TF } +\prg_generate_conditional_variant:Nnn \prop_gpop:NnN + { NV , No , c , cV , co } { T , F , TF } % \end{macrocode} % \end{macro} +% \end{macro} +% +% \subsection{Adding data to property lists} % % \begin{macro}[tested = m3prop002] % { % \prop_put:Nnn, \prop_put:NnV, \prop_put:Nnv, \prop_put:Nne, % \prop_put:NVn, \prop_put:NVV, \prop_put:NVv, \prop_put:NVe, -% \prop_put:Nvn, \prop_put:NvV, \prop_put:Nvv, \prop_put:Nve, +% \prop_put:Nvn, \prop_put:NvV, \prop_put:Nvv, \prop_put:Nve, % \prop_put:Nen, \prop_put:NeV, \prop_put:Nev, \prop_put:Nee, -% \prop_put:Nno, \prop_put:Nnx, \prop_put:NVx, -% \prop_put:Non, \prop_put:Noo, \prop_put:NxV, \prop_put:Nxx, +% \prop_put:Nno, \prop_put:Non, \prop_put:Noo, +% \prop_put:Nnx, \prop_put:NVx, \prop_put:NxV, \prop_put:Nxx, % \prop_put:cnn, \prop_put:cnV, \prop_put:cnv, \prop_put:cne, -% \prop_put:cno, \prop_put:cnx, % \prop_put:cVn, \prop_put:cVV, \prop_put:cVv, \prop_put:cVe, -% \prop_put:cvn, \prop_put:cvV, \prop_put:cvv, \prop_put:cve, +% \prop_put:cvn, \prop_put:cvV, \prop_put:cvv, \prop_put:cve, % \prop_put:cen, \prop_put:ceV, \prop_put:cev, \prop_put:cee, -% \prop_put:con, \prop_put:coo, \prop_put:cxV, \prop_put:cxx +% \prop_put:cno, \prop_put:con, \prop_put:coo, +% \prop_put:cnx, \prop_put:cVx, \prop_put:cxV, \prop_put:cxx % } % \begin{macro}[tested = m3prop002] % { % \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nnv, \prop_gput:Nne, % \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVv, \prop_gput:NVe, -% \prop_gput:Nvn, \prop_gput:NvV, \prop_gput:Nvv, \prop_gput:Nve, +% \prop_gput:Nvn, \prop_gput:NvV, \prop_gput:Nvv, \prop_gput:Nve, % \prop_gput:Nen, \prop_gput:NeV, \prop_gput:Nev, \prop_gput:Nee, % \prop_gput:Nno, \prop_gput:Non, \prop_gput:Noo, -% \prop_gput:Nnx, \prop_gput:NVx, \prop_gput:Nxn, \prop_gput:Nxx, +% \prop_gput:Nnx, \prop_gput:NVx, \prop_gput:NxV, \prop_gput:Nxx, % \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cnv, \prop_gput:cne, -% \prop_gput:cno, \prop_gput:cnx, % \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVv, \prop_gput:cVe, -% \prop_gput:cvn, \prop_gput:cvV, \prop_gput:cvv, \prop_gput:cve, +% \prop_gput:cvn, \prop_gput:cvV, \prop_gput:cvv, \prop_gput:cve, % \prop_gput:cen, \prop_gput:ceV, \prop_gput:cev, \prop_gput:cee, -% \prop_gput:cno, \prop_gput:con, \prop_gput:cxn, \prop_gput:cxx +% \prop_gput:cno, \prop_gput:con, \prop_gput:coo, +% \prop_gput:cnx, \prop_gput:cVx, \prop_gput:cxV, \prop_gput:cxx +% } +% \begin{macro}[tested = m3prop002] +% { +% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV, +% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV, +% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV, +% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV % } -% \begin{macro}{\@@_put:NNnn} -% Since the branches of \cs{@@_split:NnTF} are used as the replacement -% text of an internal macro, and since the \meta{key} and new -% \meta{value} may contain arbitrary tokens, it is not safe to include -% them in the argument of \cs{@@_split:NnTF}. We thus start by -% storing in \cs{l_@@_internal_tl} tokens which (after -% \texttt{e}-expansion) encode the key--value pair. This variable can -% safely be used in \cs{@@_split:NnTF}. If the \meta{key} was absent, -% append the new key--value to the list. -% Otherwise concatenate the extracts |##1| -% and |##3| with the new key--value pair \cs{l_@@_internal_tl}. The -% updated entry is placed at the same spot as the original \meta{key} -% in the property list, preserving the order of entries. +% \begin{macro}[tested = m3prop002] +% { +% \@@_put:NNNnn, \@@_put_linked:wnNN, +% \@@_put_linked:NNNN, \@@_put_linked_old:w, +% \@@_put_linked_new:w +% } +% All of the \cs[no-index]{prop_(g)put(_if_new):Nnn} functions are +% based on the same auxiliary, which receives \meta{code} and an +% \enquote{assignment}, followed by \meta{prop} \Arg{key} \Arg{new +% value}. The +% assignment \cs[index=cs_set_nopar:Npe]{cs_(g)set_nopar:Npe} is the +% primitive assignment without any checking: in the case of linked +% props it is applied to individual +% pieces of the linked prop, which are typically not yet defined. +% Debugging the scope of the variable is done at a higher level by +% letting \pkg{l3debug} change \cs{prop_put:Nnn} and friends. This +% allows other \pkg{l3prop} commands to directly call the underlying +% auxiliary to skip this checking step and avoid getting multiple +% error messages for the same error. +% The \meta{code} (empty for |put| and \cs{use_none:nnn} for +% |put_if_new|) is placed before the assignment in cases where the key +% is already present, in order to suppress the assignment in the +% |put_if_new| case. % \begin{macrocode} -\cs_new_protected:Npn \prop_put:Nnn { \@@_put:NNnn \__kernel_tl_set:Nx } -\cs_new_protected:Npn \prop_gput:Nnn { \@@_put:NNnn \__kernel_tl_gset:Nx } -\cs_new_protected:Npn \@@_put:NNnn #1#2#3#4 - { - \tl_set:Nn \l_@@_internal_tl - { - \exp_not:N \@@_pair:wn \tl_to_str:n {#3} - \s_@@ { \exp_not:n {#4} } - } - \@@_split:NnTF #2 {#3} - { #1 #2 { \exp_not:n {##1} \l_@@_internal_tl \exp_not:n {##3} } } - { #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } } - } +\cs_new_protected:Npn \prop_put:Nnn + { \@@_put:nNNnn { } \cs_set_nopar:Npe } +\cs_new_protected:Npn \prop_gput:Nnn + { \@@_put:nNNnn { } \cs_gset_nopar:Npe } +\cs_new_protected:Npn \prop_put_if_new:Nnn + { \@@_put:nNNnn \use_none:nnn \cs_set_nopar:Npe } +\cs_new_protected:Npn \prop_gput_if_new:Nnn + { \@@_put:nNNnn \use_none:nnn \cs_gset_nopar:Npe } \cs_generate_variant:Nn \prop_put:Nnn { NnV , Nnv , Nne , NV , NVV , NVv , NVe , @@ -1307,50 +1964,104 @@ } \cs_generate_variant:Nn \prop_gput:Nnn { cno , co , coo , cnx , cVx , cxV , cxx } +\cs_generate_variant:Nn \prop_put_if_new:Nnn + { NnV , NV , cnV , cV } +\cs_generate_variant:Nn \prop_gput_if_new:Nnn + { NnV , NV , cnV , cV } % \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}[tested = m3prop002] -% { -% \prop_put_if_new:Nnn, \prop_put_if_new:NVn, \prop_put_if_new:NnV, -% \prop_put_if_new:cnn, \prop_put_if_new:cVn, \prop_put_if_new:cnV -% } -% \begin{macro}[tested = m3prop002] -% { -% \prop_gput_if_new:Nnn, \prop_gput_if_new:NVn, \prop_gput_if_new:NnV, -% \prop_gput_if_new:cnn, \prop_gput_if_new:cVn, \prop_gput_if_new:cnV -% } -% \begin{macro}{\@@_put_if_new:NNnn} -% Adding conditionally also splits. If the key is already present, -% the three brace groups given by \cs{@@_split:NnTF} are removed. -% If the key is new, then the value is added, being careful to -% convert the key to a string using \cs{tl_to_str:n}. +% Since the true branch of \cs{@@_split:NnTFn} is used as the +% replacement text of an internal macro, and since the \meta{key} and +% new \meta{value} may contain arbitrary tokens, it is not safe to +% include them in the argument of \cs{@@_split:NnTFn}. We thus start +% by storing in \cs{l_@@_internal_tl} tokens which (after +% \texttt{x}-expansion) encode the key--value pair. This variable can +% safely be used in \cs{@@_split:NnTFn}. For a flat prop, if the +% \meta{key} was absent, append the new key--value to the list; +% otherwise concatenate the extracts |##2| and |##4| with the new +% key--value pair \cs{l_@@_internal_tl}. The updated entry is placed +% at the same spot as the original \meta{key} in the property list, +% preserving the order of entries. For a linked prop, call +% \cs{@@_put_linked:wnNN}, which constructs the control sequence in +% which we will place the new value. If it matches \cs{scan_stop:} +% then the key was not yet there and we add it using +% \cs{@@_put_linked_new:w}, otherwise it was already there and we use +% \cs{@@_put_linked_old:w}. % \begin{macrocode} -\cs_new_protected:Npn \prop_put_if_new:Nnn - { \@@_put_if_new:NNnn \__kernel_tl_set:Nx } -\cs_new_protected:Npn \prop_gput_if_new:Nnn - { \@@_put_if_new:NNnn \__kernel_tl_gset:Nx } -\cs_new_protected:Npn \@@_put_if_new:NNnn #1#2#3#4 +\cs_new_protected:Npn \@@_put:nNNnn #1#2#3#4#5 { \tl_set:Nn \l_@@_internal_tl { - \exp_not:N \@@_pair:wn \tl_to_str:n {#3} - \s_@@ \exp_not:n { {#4} } + \exp_not:N \@@_pair:wn \tl_to_str:n {#4} + \s_@@ { \exp_not:n {#5} } + } + \@@_split:NnTFn #3 {#4} + { + #1 #2 #3 + { + \s_@@ \@@_chk:w \exp_not:n {##2} + \l_@@_internal_tl \exp_not:n {##4} + } + } + { #2 #3 { \exp_not:o {#3} \l_@@_internal_tl } } + { \exp_after:wN \@@_put_linked:wnnN #3 {#4} {#1} #2 } + } +\cs_new_protected:Npn \@@_put_linked:wnnN + \@@_flatten:w #1 \s_@@ #2#3#4 + { + \exp_after:wN \@@_put_linked:NNnN + \cs:w @@ ~ #2 ~ \tl_to_str:n {#4} \cs_end: + #1 + } +\cs_new_protected:Npn \@@_put_linked:NNnN #1#2#3#4 + { + \if_meaning:w \scan_stop: #1 + \exp_after:wN \@@_put_linked_new:w #2 #1 #2 #4 + \else: + \exp_after:wN \@@_put_linked_old:w #1 { #3 #4 #1 } + \fi: + } +% \end{macrocode} +% To add a new entry, \cs{@@_put_linked_new:w} receives the expansion +% of the end-pointer, namely \cs{use_none:n} \meta{last key pointer}, +% followed by the new key pointer~|#2|, the end pointer~|#3|, and an +% assignment function~|#4|. Set up the doubly-linked list in the +% order |#1|, |#2|, |#3|, placing the key--value pair +% \cs{l_@@_internal_tl} in~|#2|. To replace an old entry, +% \cs{@@_put_linked_old:w} receives the expansion of that entry, and +% it reassigns it (|#5|) using the assignment~|#6|, by simply +% replacing the payload |#2| \cs{s_@@} |#3| by \cs{l_@@_internal_tl}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_put_linked_new:w + \use_none:n #1#2#3#4 + { + #4 #1 + { + \exp_after:wN \@@_pop_linked_prev:w #1 + \exp_not:N #2 + } + #4 #2 + { + \exp_not:n { \use_none:n #1 } + \l_@@_internal_tl + \exp_not:N #3 + } + #4 #3 { \exp_not:n { \use_none:n #2 } } + } +\cs_new_protected:Npn \@@_put_linked_old:w + \use_none:n #1#2 \s_@@ #3#4#5 + { + #5 + { + \exp_not:n { \use_none:n #1 } + \l_@@_internal_tl + \exp_not:N #4 } - \@@_split:NnTF #2 {#3} - { } - { #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } } } -\cs_generate_variant:Nn \prop_put_if_new:Nnn - { NnV , NV , cnV , cV } -\cs_generate_variant:Nn \prop_gput_if_new:Nnn - { NnV , NV , cnV , cV } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % \subsection{Property list conditionals} % @@ -1365,46 +2076,82 @@ % \end{macro} % % \begin{macro}[pTF, tested = m3prop003]{\prop_if_empty:N, \prop_if_empty:c} -% Same test as for token lists. +% \begin{macro}{\@@_if_empty_return:w} +% A flat property list is empty if it matches \cs{c_empty_prop}. A linked +% property list is empty if its second token (the end pointer) and last token +% (the first key pointer) are equal. There cannot be false positives because +% the end pointer takes the form \cs{use_none:n} \meta{pointer} while the +% other pointers have more elaborate structure. The subtle code branch here +% is when a non-empty flat property list is given: then \cs{@@_if_empty:w} +% reads the whole property list as~|#1| and |#2|, |#3|, |#4| are |2|, |3|, +% |4|, respectively. % \begin{macrocode} \prg_new_conditional:Npnn \prop_if_empty:N #1 { p , T , F , TF } { - \tl_if_eq:NNTF #1 \c_empty_prop - \prg_return_true: \prg_return_false: + \if_meaning:w #1 \c_empty_prop + \prg_return_true: + \else: + \exp_after:wN \@@_if_empty_return:w #1 + \@@_flatten:w 2 \s_@@ 34 \s_@@_stop + \fi: + } +\cs_new:Npn \@@_if_empty_return:w + #1 \@@_flatten:w #2 \s_@@ #3#4#5 \s_@@_stop + { + \if_meaning:w #2 #4 + \prg_return_true: + \else: + \prg_return_false: + \fi: } \prg_generate_conditional_variant:Nnn \prop_if_empty:N { c } { p , T , F , TF } % \end{macrocode} % \end{macro} +% \end{macro} % % \begin{macro}[pTF, tested = m3prop003] % { % \prop_if_in:Nn, \prop_if_in:NV, \prop_if_in:Ne, \prop_if_in:No, % \prop_if_in:cn, \prop_if_in:cV, \prop_if_in:ce, \prop_if_in:co % } -% \begin{macro}[EXP]{\@@_if_in:nnn} -% Testing expandably if a key is in a property list -% requires to go through the key--value pairs one by one. -% This is rather slow, and a faster test would be +% \begin{macro}[EXP]{\@@_if_in_flat:nnn} +% For a linked prop, use \cs{@@_get_linked:w} to look up whether the control +% sequence constructed from the prefix and the sought-after key exists; this +% auxiliary calls \cs{use_none:n} \Arg{value} \cs{prg_return_true:} if the key +% is found, and otherwise \cs{prg_return_false:}. For a flat prop, testing +% expandably if a key is there requires to go through the key--value pairs one +% by one. This is rather slow, and a faster test would be % \begin{verbatim} % \prg_new_protected_conditional:Npnn \prop_if_in:Nn #1 #2 % { -% \@@_split:NnTF #1 {#2} +% \@@_split:NnTFn #1 {#2} % { \prg_return_true: } % { \prg_return_false: } +% { ... } % } % \end{verbatim} -% but \cs{@@_split:NnTF} is non-expandable. +% but \cs{@@_split:NnTFn} is non-expandable. % Instead, we use \cs{prop_map_tokens:Nn} to compare the search key to % each key in turn using \cs{str_if_eq:ee}, which is expandable. % \begin{macrocode} \prg_new_conditional:Npnn \prop_if_in:Nn #1#2 { p , T , F , TF } { - \exp_args:NNo \prop_map_tokens:Nn #1 - { \exp_after:wN \@@_if_in:nnn \exp_after:wN { \tl_to_str:n {#2} } } - \prg_return_false: + \@@_if_flat:NTF #1 + { + \exp_after:wN \prop_map_tokens:Nn \exp_after:wN #1 + { + \exp_after:wN \@@_if_in_flat:nnn + \exp_after:wN { \tl_to_str:n {#2} } + } + \prg_return_false: + } + { + \exp_after:wN \@@_get_linked:w #1 {#2} + \use_none:n \prg_return_true: \prg_return_false: + } } -\cs_new:Npn \@@_if_in:nnn #1#2#3 +\cs_new:Npn \@@_if_in_flat:nnn #1#2#3 { \str_if_eq:eeT {#1} {#2} { \prop_map_break:n { \use_i:nn \prg_return_true: } } @@ -1415,38 +2162,6 @@ % \end{macro} % \end{macro} % -% \subsection{Recovering values from property lists with branching} -% -% \begin{macro}[TF, tested = m3prop004] -% { -% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NeN, -% \prop_get:NoN, \prop_get:NxN, -% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:ceN, -% \prop_get:coN, \prop_get:cxN, -% \prop_get:cnc -% } -% Getting the value corresponding to a key, keeping track of whether -% the key was present or not, is implemented as a conditional (with -% side effects). If the key was absent, the token list is not altered. -% \begin{macrocode} -\prg_new_protected_conditional:Npnn \prop_get:NnN #1#2#3 { T , F , TF } - { - \@@_split:NnTF #1 {#2} - { - \tl_set:Nn #3 {##2} - \prg_return_true: - } - { \prg_return_false: } - } -\prg_generate_conditional_variant:Nnn \prop_get:NnN - { NV , Nv , Ne , c , cV , cv , ce } { T , F , TF } -\prg_generate_conditional_variant:Nnn \prop_get:NnN - { No , Nx , co , cx } { T , F , TF } -\prg_generate_conditional_variant:Nnn \prop_get:NnN - { cnc } { T , F , TF } -% \end{macrocode} -% \end{macro} -% % \subsection{Mapping over property lists} % % \begin{macro}[tested = m3prop003] @@ -1455,6 +2170,9 @@ % \prop_map_function:cN, \prop_map_function:cc % } % \begin{macro}{\@@_map_function:Nw} +% We first |f|-expand to flatten~|#1| in case it was a linked list. +% The \cs{use_i:nnn} removes the leading \cs{s_@@} \cs{@@_chk:w} of +% the flattened prop. % The even-numbered arguments of \cs{@@_map_function:Nw} are keys, % hence have string catcodes, except at the end where they are % \cs{fi:} \cs{prop_map_break:}. The \cs{fi:} ends the \cs{if_false:} @@ -1463,10 +2181,8 @@ % \begin{macrocode} \cs_new:Npn \prop_map_function:NN #1#2 { - \exp_after:wN \use_i_ii:nnn - \exp_after:wN \@@_map_function:Nw - \exp_after:wN #2 - #1 + \exp_last_unbraced:Nnf + \use_i:nnn { \@@_map_function:Nw #2 } #1 \@@_pair:wn \fi: \prop_map_break: \s_@@ { } \@@_pair:wn \fi: \prop_map_break: \s_@@ { } \@@_pair:wn \fi: \prop_map_break: \s_@@ { } @@ -1506,7 +2222,7 @@ { @@_map_ \int_use:N \g__kernel_prg_map_int :wn } \@@_pair:wn \int_gincr:N \g__kernel_prg_map_int \cs_gset_protected:Npn \@@_pair:wn ##1 \s_@@ ##2 {#2} - #1 + \exp_last_unbraced:Nf \use_none:nn #1 \prg_break_point:Nn \prop_map_break: { \int_gdecr:N \g__kernel_prg_map_int @@ -1520,8 +2236,8 @@ % % \begin{macro}[rEXP]{\prop_map_tokens:Nn, \prop_map_tokens:cn} % \begin{macro}{\@@_map_tokens:nw} -% The mapping is very similar to \cs{prop_map_function:NN}. The -% \cs{use_i:nn} removes the leading \cs{s_@@}. The odd construction +% The mapping is very similar to \cs{prop_map_function:NN}. +% The odd construction % |\use:n {#1}| allows |#1| to contain any token without interfering % with \cs{prop_map_break:}. The loop stops when the \meta{key} % between \cs{@@_pair:wn} and \cs{s_@@} is \cs{fi:} @@ -1529,8 +2245,8 @@ % \begin{macrocode} \cs_new:Npn \prop_map_tokens:Nn #1#2 { - \exp_last_unbraced:Nno - \use_i:nn { \@@_map_tokens:nw {#2} } #1 + \exp_last_unbraced:Nnf + \use_i:nnn { \@@_map_tokens:nw {#2} } #1 \@@_pair:wn \fi: \prop_map_break: \s_@@ { } \@@_pair:wn \fi: \prop_map_break: \s_@@ { } \@@_pair:wn \fi: \prop_map_break: \s_@@ { } @@ -1567,16 +2283,98 @@ % \end{macro} % \end{macro} % +% \subsection{Uses of mapping over property lists} +% +% \begin{macro}[EXP]{\prop_count:N, \prop_count:c} +% \begin{macro}[EXP]{\@@_count:nn} +% Counting the key--value pairs in a property list is done using the +% same approach as for other count functions: turn each entry into a +% \texttt{+1} then use integer evaluation to actually do the +% mathematics. +% \begin{macrocode} +\cs_new:Npn \prop_count:N #1 + { + \int_eval:n + { + 0 + \prop_map_function:NN #1 \@@_count:nn + } + } +\cs_new:Npn \@@_count:nn #1#2 { + 1 } +\cs_generate_variant:Nn \prop_count:N { c } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[EXP]{\prop_to_keyval:N} +% \begin{macro}[EXP] +% {\@@_to_keyval_exp_after:wN, \@@_to_keyval:nn, \@@_to_keyval:nnw} +% Each property name and value pair will be returned in the form +% \verb*| |\marg{name}\verb*|= |\marg{value}. As one of the main use cases for +% this macro is to pass the \meta{property list} on to a key--value parser, we +% have to make sure that the behaviour is as good as possible. Using a space +% before the opening brace we get the correct brace stripping behaviour for +% most of the key--value parsers available in \LaTeX{}. +% Iterate over the +% \meta{property list} and remove the leading comma afterwards. Only the value +% has to be protected in \cs{__kernel_exp_not:w} as the property name is +% always a string. After the loop the leading comma is removed by +% \cs{use_none:n} and afterwards \cs{__kernel_exp_not:w} eventually finds the +% opening brace of its argument. +% \begin{macrocode} +\cs_new:Npn \prop_to_keyval:N #1 + { + \__kernel_exp_not:w + \prop_if_empty:NTF #1 + { {} } + { + \exp_after:wN \exp_after:wN \exp_after:wN + { + \tex_expanded:D + { + \exp_not:N \use_none:n + \prop_map_function:NN #1 \@@_to_keyval:nn + } + } + } + } +\cs_new:Npn \@@_to_keyval:nn #1#2 + { , ~ {#1} =~ { \__kernel_exp_not:w {#2} } } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \subsection{Viewing property lists} % % \begin{macro}[tested = m3show001] % {\prop_show:N, \prop_show:c, \prop_log:N, \prop_log:c} -% \begin{macro}{\@@_show:NN} -% \begin{macro}[rEXP]{\@@_show_validate:w} -% Apply the general \cs{__kernel_chk_tl_type:NnnT}. -% Contrarily to sequences and comma lists, -% we use \cs{msg_show_item:nn} to format both the key and the value -% for each pair. +% \begin{macro}{\@@_show:NN, \@@_show_finally:NNn, \@@_show_prepare:w, \@@_show_loop:NNw, \@@_show_bad_name:NNN, \@@_show_end:NNN, \@@_show_loop_key:wNNN} +% \begin{macro}[rEXP]{\@@_show_flat:w, \@@_show_linked:w} +% Experience shows one source of problems is very hard to debug: when +% a data structure such as a |seq| or~|prop| gets corrupted. In the +% past, \cs{prop_show:N} would in some cases happily show items of +% such a |prop|, even though other more demanding \pkg{l3prop} +% functions would choke. It is thus best to make \cs{prop_show:N} +% check very thoroughly the structure and flag issues, even though +% that is very painful for linked props. Throughout the code below, +% we strive to remain as safe as possible, but in the explanations we +% only state what the arguments are when the prop is correctly formed, +% rather than saying at every step that various arguments can be +% arbitrary junk, made safe by using \cs{tl_to_str:n} generously. +% +% The general \cs{__kernel_chk_tl_type:NnnT} checks that its first +% argument is a token list, and if it is, then it \texttt{e}-expands +% its second argument and compares with the contents of its first +% argument. Thus, within this \texttt{e}-expansion it is safe to use +% \cs{@@_if_flat:NTF} to check if the prop is flat or linked. In the +% flat case we simply reconstruct the expected structure using +% \cs{@@_show_flat:w}, which loops through the prop and correctly +% turns all keys to strings for instance. In the linked case, we use +% \cs{@@_show_linked:w}, which ensures the form \cs{@@_flatten:w} +% \cs[no-index]{@@~\meta{prefix}} \cs{s_@@} \Arg{prefix} \meta{rest}, +% where \meta{prefix} is made into a string and \meta{rest} cannot be +% a brace group or multiple tokens since \cs{@@_show_linked:w} would +% in such cases give a different result from the original token list. % \begin{macrocode} \cs_new_protected:Npn \prop_show:N { \@@_show:NN \msg_show:nneeee } \cs_generate_variant:Nn \prop_show:N { c } @@ -1586,22 +2384,168 @@ { \__kernel_chk_tl_type:NnnT #2 { prop } { - \s_@@ - \exp_after:wN \use_i:nn \exp_after:wN \@@_show_validate:w #2 - \@@_pair:wn \q_recursion_tail \s_@@ { } \q_recursion_stop + \@@_if_flat:NTF #2 + { + \s_@@ \@@_chk:w + \exp_after:wN \@@_show_flat:w #2 + \s_@@ { } + \@@_pair:wn \q_@@_recursion_tail \s_@@ { } + \q_@@_recursion_stop + } + { \exp_after:wN \@@_show_linked:w #2 \s_@@ ! ? \s_@@_stop } } { - #1 { prop } { show } - { \token_to_str:N #2 } - { \prop_map_function:NN #2 \msg_show_item:nn } - { } { } + \@@_if_flat:NTF #2 + { \@@_show_finally:NNn #1 #2 { flat } } + { + \tl_set:Nn \l_@@_internal_tl { #1 #2 } + \exp_after:wN \@@_show_prepare:w #2 #2 + } } } -\cs_new:Npn \@@_show_validate:w #1 \@@_pair:wn #2 \s_@@ #3 +\cs_new:Npn \@@_show_flat:w #1 \@@_pair:wn #2 \s_@@ #3 { - \quark_if_recursion_tail_stop:n {#2} + \@@_if_recursion_tail_stop:n {#2} \exp_not:N \@@_pair:wn \tl_to_str:n {#2} \s_@@ \exp_not:n { {#3} } - \@@_show_validate:w + \@@_show_flat:w + } +\cs_new:Npn \@@_show_linked:w #1 \s_@@ #2#3#4 \s_@@_stop + { + \exp_not:N \@@_flatten:w + \exp_not:c { @@ ~ \tl_to_str:n {#2} } + \s_@@ { \tl_to_str:n {#2} } + \exp_not:n {#3} + } +% \end{macrocode} +% For flat props we are done by using \cs{msg_show:nneeee} or +% \cs{msg_log:nneeee}. The auxiliary \cs{@@_show_finally:NNn} is +% eventually also used in the linked case after some more tests. To +% avoid having to bring along the message function and the property +% list, we store them into \cs{l_@@_internal_tl}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_finally:NNn #1#2#3 + { + #1 { prop } { show } + { \token_to_str:N #2 } + { \prop_map_function:NN #2 \msg_show_item:nn } + {#3} { } + } +% \end{macrocode} +% For linked props, we now know they have a reasonable form so that we +% are calling \cs{@@_show_prepare:w} \cs{@@_flatten:w} +% \cs[no-index]{@@~\meta{prefix}} \cs{s_@@} \Arg{prefix} \meta{token} +% \meta{property list}, and the task is to loop through the linked +% list and check integrity. We first set things up: the auxiliary +% \cs{@@_tmp:w} will be in charge of checking that various tokens +% start with \cs[no-index]{@@~\meta{prefix}} (in the sense of string +% representations), and calling one of \cs{@@_show_loop_key:wNNN}, +% \cs{@@_show_end:NNN}, \cs{@@_show_bad_name:NNN}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_prepare:w + \@@_flatten:w #1 \s_@@ #2#3#4 + { + \use:e + { + \cs_set_nopar:Npn \exp_not:N \@@_tmp:w + ##1 \token_to_str:N #1 ##2 \s_@@_mark ##3 \s_@@_stop + { + \exp_not:N \tl_if_empty:nTF {##1} + { + \exp_not:N \tl_if_head_is_space:nTF {##2} + { \exp_not:N \exp_args:Nf \@@_show_loop_key:wNNN } + { \exp_not:N \tl_if_empty:nTF } + {##2} + } + { \exp_not:N \use_ii:nn } + \@@_show_end:NNN + \@@_show_bad_name:NNN + } + } + \exp_last_unbraced:NNNo \@@_show_loop:NNw #1 #4 #4 + } +% \end{macrocode} +% The loop will consist of calls to \cs{@@_show_loop:NNw} +% \cs[no-index]{@@~\meta{prefix}} \meta{token} \meta{expansion}, where +% \meta{token} is one of the items in the list, specifically the key +% container for \meta{key$_{i-1}$} (starting at $i=1$ with the +% property list variable itself), and \meta{expansion} stands for the +% expansion of that token, which has already been checked, and takes +% the form \meta{junk} \cs{s_@@} \Arg{value} +% \cs[no-index]{@@~\meta{prefix}~\meta{key_i}}. Thus, the loop +% auxiliary receives the prefix command as |#1|, and the $(i-1)$-th +% and $i$-th key containers as |#2| and~|#5|. Then \cs{@@_tmp:w} +% checks that the name of the $i$-th key container is valid. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_loop:NNw #1#2 #3 \s_@@ #4#5 + { + \exp_last_two_unbraced:Noo \@@_tmp:w + { \token_to_str:N #5 \s_@@_mark } + { \token_to_str:N #1 \s_@@_mark \s_@@_stop } + #1 #2 #5 + } +% \end{macrocode} +% If the $i$-th key container has the wrong name we get +% \cs{@@_show_bad_name:NNN} \cs[no-index]{@@~\meta{prefix}} +% \meta{previous container} \meta{current container with bad name}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_bad_name:NNN #1#2#3 + { + \msg_error:nneeee { prop } { bad-link } + { \tl_tail:N \l_@@_internal_tl } + { \token_to_str:N #2 } + { \token_to_str:N #3 } + { \token_to_str:N #1 } + } +% \end{macrocode} +% If the $i$-th key container has the name +% \cs[no-index]{@@~\meta{prefix}} (without space), it is the trailing +% one. We check that it is the right kind of macro to be a token +% list, and that it has the right contents \cs{use_none:n} +% \meta{previous container}. If so, we are done checking everything, +% and we display the property list using the message function and +% property list name stored in \cs{l_@@_internal_tl}. Note that we +% also use this \cs{l_@@_internal_tl} in the type argument of +% \cs{__kernel_chk_tl_type:NnnT}, to build up the name +% \enquote{\meta{property list} prop entry} used in error messages. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_end:NNN #1#2#3 + { + \__kernel_chk_tl_type:NnnT #3 + { \tl_tail:N \l_@@_internal_tl prop~entry } + { \exp_not:n { \use_none:n #2 } } + { + \exp_after:wN \@@_show_finally:NNn + \l_@@_internal_tl { linked } + } + } +% \end{macrocode} +% If the $i$-th container has a name \cs[no-index]{@@~\meta{prefix} +% \meta{key}} (with a space before the key), then we have a call to +% \cs{@@_show_loop_key:wNNN} \Arg{key} \meta{junk_1} \meta{junk_2} +% \cs[no-index]{@@~\meta{prefix}} \meta{previous container} +% \meta{current container}. (with an \texttt{f}-expansion to eliminate +% the space). The first argument is the \meta{key} without a leading +% space, thanks to a judicious \texttt{f}-expansion earlier on. We +% check that the \meta{current container} is a token list with the +% expected structure \cs{use_none:n} \meta{previous container} +% \cs{@@_pair:wn} \meta{string} \cs{s_@@} \Arg{anything} \meta{single +% token}. The auxiliary \cs{@@_show_flat:w} is reused to produce the +% \cs{@@_pair:wn} part, and the last token is produced by +% \cs{tl_item:Nn} (we don't waste a specialized auxiliary to speed +% that up). If the check succeed, move on to the next item. +% \begin{macrocode} +\cs_new_protected:Npn \@@_show_loop_key:wNNN #1#2#3#4#5#6 + { + \__kernel_chk_tl_type:NnnT #6 + { \tl_tail:N \l_@@_internal_tl prop~entry } + { + \exp_not:n { \use_none:n #5 } + \exp_after:wN \@@_show_flat:w #6 \s_@@ { } + \@@_pair:wn \q_@@_recursion_tail \s_@@ { } + \q_@@_recursion_stop + \tl_item:Nn #6 { -1 } + } + { \exp_last_unbraced:NNNo \@@_show_loop:NNw #4 #6 #6 } } % \end{macrocode} % \end{macro} diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx index 281b8453ad..3aeff3f8de 100644 --- a/macros/latex/contrib/l3kernel/l3quark.dtx +++ b/macros/latex/contrib/l3kernel/l3quark.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx index 952c115d29..d59d61ddb6 100644 --- a/macros/latex/contrib/l3kernel/l3regex.dtx +++ b/macros/latex/contrib/l3kernel/l3regex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx index 45e5028d1b..c68a7a86af 100644 --- a/macros/latex/contrib/l3kernel/l3seq.dtx +++ b/macros/latex/contrib/l3kernel/l3seq.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx index 319cf75b6e..e18ea29c9b 100644 --- a/macros/latex/contrib/l3kernel/l3skip.dtx +++ b/macros/latex/contrib/l3kernel/l3skip.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx index a85bb213b2..0e9e70bbdb 100644 --- a/macros/latex/contrib/l3kernel/l3sort.dtx +++ b/macros/latex/contrib/l3kernel/l3sort.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx index 39b6a43d28..dc87dbb621 100644 --- a/macros/latex/contrib/l3kernel/l3str-convert.dtx +++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx index 80b26ea9bc..8be8e8ff09 100644 --- a/macros/latex/contrib/l3kernel/l3str.dtx +++ b/macros/latex/contrib/l3kernel/l3str.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf Binary files differindex dda0393c17..c40939a7a3 100644 --- a/macros/latex/contrib/l3kernel/l3styleguide.pdf +++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf Binary files differindex 0bce9ea22a..e8db43bb3e 100644 --- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf +++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx index 1d628ed6a8..d62bd9a80b 100644 --- a/macros/latex/contrib/l3kernel/l3sys.dtx +++ b/macros/latex/contrib/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf Binary files differindex da4ee7e729..736d53b4c0 100644 --- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf +++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx index 10e68fe763..ec9368ae18 100644 --- a/macros/latex/contrib/l3kernel/l3text-case.dtx +++ b/macros/latex/contrib/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3text-map.dtx b/macros/latex/contrib/l3kernel/l3text-map.dtx index b1787a2f73..c8e5db95dc 100644 --- a/macros/latex/contrib/l3kernel/l3text-map.dtx +++ b/macros/latex/contrib/l3kernel/l3text-map.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx index 2e57a3c3d3..a797b3a609 100644 --- a/macros/latex/contrib/l3kernel/l3text-purify.dtx +++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx index 0631cc4695..7ef37636f3 100644 --- a/macros/latex/contrib/l3kernel/l3text.dtx +++ b/macros/latex/contrib/l3kernel/l3text.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -196,10 +196,7 @@ % codepoint is uppercased, irrespective of the general code of the character. % % \begin{function}[added = 2022-07-04] -% { -% \text_declare_case_equivalent:Nn , -% \text_declare_case_equivalent:cn -% } +% {\text_declare_case_equivalent:Nn} % \begin{syntax} % \cs{text_declare_case_equivalent:Nn} \meta{cmd} \Arg{replacement} % \end{syntax} diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx index 4c85ed51d9..9ff2ec04e7 100644 --- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx +++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -196,18 +196,15 @@ % \end{variable} % % \begin{variable} -% {\l_@@_analysis_token, \l_@@_analysis_char_token, \l_@@_analysis_next_token} +% {\l_@@_analysis_token, \l_@@_analysis_char_token} % The tokens in the token list are probed with the \TeX{} primitive % \tn{futurelet}. We use \cs{l_@@_analysis_token} in that % construction. In some cases, we convert the following token to a % string before probing it: then the token variable used is -% \cs{l_@@_analysis_char_token}. When getting tokens from the input -% stream we may need to look two tokens ahead, for which we use -% \cs{l_@@_analysis_next_token}. +% \cs{l_@@_analysis_char_token}. % \begin{macrocode} \cs_new_eq:NN \l_@@_analysis_token ? \cs_new_eq:NN \l_@@_analysis_char_token ? -\cs_new_eq:NN \l_@@_analysis_next_token ? % \end{macrocode} % \end{variable} % @@ -1223,13 +1220,12 @@ % \@@_peek_analysis_nonexp:N, \@@_peek_analysis_cs:N, % \@@_peek_analysis_char:N, \@@_peek_analysis_char:w, % \@@_peek_analysis_special:, \@@_peek_analysis_retest:, -% \@@_peek_analysis_next:, \@@_peek_analysis_nextii:, % \@@_peek_analysis_str:, % \@@_peek_analysis_str:w, \@@_peek_analysis_str:n, % \@@_peek_analysis_active_str:n, \@@_peek_analysis_explicit:n, % \@@_peek_analysis_escape:, \@@_peek_analysis_collect:w, % \@@_peek_analysis_collect:n, \@@_peek_analysis_collect_loop:, -% \@@_peek_analysis_collect_test:, \@@_peek_analysis_collect_end:NNN +% \@@_peek_analysis_collect_test:, \@@_peek_analysis_collect_end:NNNN % } % Save the user's code in a control sequence that is suitable for % nested maps. We may wish to pass to this function an \tn{outer} @@ -1254,7 +1250,10 @@ #1 \@@_peek_analysis_loop:NNn \prg_break_point:Nn \peek_analysis_map_break: - { \group_align_safe_end: } + { + \int_gdecr:N \g__kernel_prg_map_int + \group_align_safe_end: + } } \@@_peek_analysis_loop:NNn ? ? ? } @@ -1460,7 +1459,7 @@ \if_meaning:w \l_@@_analysis_token \scan_stop: \exp_after:wN \@@_peek_analysis_normal:N \else: - \exp_after:wN \@@_peek_analysis_next: + \exp_after:wN \@@_peek_analysis_str: \fi: } % \end{macrocode} @@ -1469,41 +1468,22 @@ % begin-group or end-group token (catcode $1$ or~$2$), and we excluded % a few cases that would be difficult later (empty control sequence, % active character with the same character code as its meaning or as -% the escape character). Now look at the \meta{next token} following -% it using a combination of \tn{afterassignment} and \tn{futurelet}. -% (In fact look twice to reset an internal \TeX{} flag in case the -% \meta{next token} had been hit with \cs{exp_not:N}.) -% The syntax of this primitive is \tn{futurelet} \meta{peek token} -% \meta{first token} \meta{next token}, and it sets \meta{peek token} -% equal to \meta{next token}. Traditionally, one takes \meta{first -% token} to be some macro that regains control of the code and, e.g., -% analyses \meta{peek token}. Here, both \meta{first token} and -% \meta{next token} are mostly unknown tokens in the input stream (but -% we know the \meta{first token} has catcode $1$, $2$ or $10$), where -% \meta{first token} was already stored as \cs{l_peek_token}, and we -% regain control using \tn{afterassignment}, which inserts its -% argument after the assignment, hence after \meta{peek token} but -% before \meta{first token}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_peek_analysis_next: - { - \tl_if_empty:oT { \tex_the:D \tex_everyeof:D } - { \tex_everyeof:D { \scan_stop: } } - \tex_afterassignment:D \@@_peek_analysis_nextii: - \tex_futurelet:D \l_@@_analysis_next_token - } -\cs_new_protected:Npn \@@_peek_analysis_nextii: - { - \tex_afterassignment:D \@@_peek_analysis_str: - \tex_futurelet:D \l_@@_analysis_next_token - } -% \end{macrocode} -% We then hit the \meta{first token} with \cs{token_to_str:N} and grab -% characters until finding \cs{l_@@_analysis_next_token}. More +% the escape character). The idea is to apply \cs{token_to_str:N} to +% the \meta{token} then grab characters (of category code~$12$ except +% for spaces that have category code~$10$) to reconstruct it. In +% earlier versions of the code we would peek at the \meta{next token} +% that lies after \meta{token} in the input stream, which would help +% us be more accurate in reconstructing the \meta{token} case in edge +% cases (mentioned below), but this had the side-effect of tokenizing +% the input stream (turning characters into tokens) farther ahead than +% needed. +% +% We hit the \meta{token} with \cs{token_to_str:N} and start grabbing +% characters. More % precisely, by looking at the first character in the string -% representation of the \meta{first token} we distinguish three cases: +% representation of the \meta{token} we distinguish three cases: % a stringified control sequence starts with the escape character; for -% an explicit character we find that same character; for an explicit +% an explicit character we find that same character; for an active % character we find anything else (we made sure to exclude the case of % an active character whose string representation coincides with the % other two cases). @@ -1591,14 +1571,11 @@ % know that until we had run all the various tests including % stringifying the token. We are thus left with the hard work of % picking up one by one the characters in the csname (being careful -% about spaces), until finding a token that matches the \meta{next -% token} picked up earlier (which was not stringified), such that the -% control sequence that we found so far indeed has the expected -% meaning \cs{l_peek_token}. This comparison with \cs{l_peek_token} -% catches a reasonably common case like \cs{c_group_begin_token} |_| -% in which the trailing |_| has category code other: without -% comparison of the constructed csname with \cs{l_peek_token} -% collection would stop at \cs[no-index]{c}, which is wrong. +% about spaces), until the constructed csname has the expected +% meaning. This fails if someone defines a token like +% \cs[no-index]{bgroup@my} whose string representation starts the same +% as another token with the same meaning being an implicit character +% token of category code $1$, $2$, or $10$. % \begin{macrocode} \cs_new_protected:Npn \@@_peek_analysis_escape: { @@ -1615,25 +1592,27 @@ } \cs_new_protected:Npn \@@_peek_analysis_collect_loop: { - \tex_futurelet:D \l_@@_analysis_token - \@@_peek_analysis_collect_test: - } -\cs_new_protected:Npn \@@_peek_analysis_collect_test: - { - \if_meaning:w \l_@@_analysis_token \l_@@_analysis_next_token - \exp_after:wN \if_meaning:w \cs:w \l_@@_internal_a_tl \cs_end: \l_peek_token - \@@_peek_analysis_collect_end:NNN + \exp_after:wN \if_meaning:w + \cs:w + \if_cs_exist:w \l_@@_internal_a_tl \cs_end: + \l_@@_internal_a_tl + \else: + c_one % anything short \fi: + \cs_end: + \l_peek_token + \@@_peek_analysis_collect_end:NNNN \fi: - \@@_peek_analysis_collect:w + \tex_futurelet:D \l_@@_analysis_token + \@@_peek_analysis_collect:w } % \end{macrocode} % End by calling the user code with suitable arguments (here |#1|, % |#2| are \cs{fi:}), which closes the group begun early on. % \begin{macrocode} -\cs_new_protected:Npn \@@_peek_analysis_collect_end:NNN #1#2#3 +\cs_new_protected:Npn \@@_peek_analysis_collect_end:NNNN #1#2#3#4 { - #1 #2 + #1 \tl_put_right:Ne \l_@@_peek_code_tl { { \exp_not:N \exp_not:n { \exp_not:c { \l_@@_internal_a_tl } } } diff --git a/macros/latex/contrib/l3kernel/l3tl-build.dtx b/macros/latex/contrib/l3kernel/l3tl-build.dtx index 66b5a2d03e..7971301ef3 100644 --- a/macros/latex/contrib/l3kernel/l3tl-build.dtx +++ b/macros/latex/contrib/l3kernel/l3tl-build.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx index 5429f19c54..1043feaad9 100644 --- a/macros/latex/contrib/l3kernel/l3tl.dtx +++ b/macros/latex/contrib/l3kernel/l3tl.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx index add3e80eff..fe8d1a780e 100644 --- a/macros/latex/contrib/l3kernel/l3token.dtx +++ b/macros/latex/contrib/l3kernel/l3token.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % @@ -102,7 +102,8 @@ % \end{syntax} % Sets the behaviour of the \meta{char} in situations where it is % active (category code $13$) to be equivalent to that of the -% \meta{function}. The category code of the \meta{char} is +% definition of the \meta{function} at the time \cs{char_set_active_eq:NN} +% is used. The category code of the \meta{char} is % \emph{unchanged} by this process. The \meta{function} may itself % be an active character. % \end{function} @@ -118,7 +119,8 @@ % Sets the behaviour of the \meta{char} which has character % code as given by the \meta{integer expression} in situations % where it is active (category code $13$) to be equivalent to that of the -% \meta{function}. The category code of the \meta{char} is +% \meta{function} at the time \cs{char_set_active_eq:nN} +% is used. The category code of the \meta{char} is % \emph{unchanged} by this process. The \meta{function} may itself % be an active character. % \end{function} @@ -424,6 +426,11 @@ % These are implicit tokens which have the category code described % by their name. They are used internally for test purposes but % are also available to the programmer for other uses. +% \begin{texnote} +% The tokens \cs{c_group_begin_token}, \cs{c_group_end_token}, and +% \cs{c_space_token} are \pkg{expl3} counterparts of \LaTeXe{}'s +% \tn{bgroup}, \tn{egroup}, and \cs{@sptoken}. +% \end{texnote} % \end{variable} % % \begin{variable} @@ -786,11 +793,11 @@ % There is often a need to look ahead at the next token in the input % stream while leaving it in place. This is handled using the % \enquote{peek} functions. The generic \cs{peek_after:Nw} is provided -% along with a family of predefined tests for common cases. As peeking -% ahead does \emph{not} skip spaces the predefined tests include both a -% space-respecting and space-skipping version. In addition, using -% \cs{peek_analysis_map_inline:n}, one can map through the following -% tokens in the input stream and repeatedly perform some tests. +% along with a family of predefined tests for common cases. Peeking +% ahead does \emph{not} skip spaces: rather, \cs{peek_remove_spaces:n}. +% should be used. In addition, using \cs{peek_analysis_map_inline:n}, +% one can map through the following tokens in the input stream and +% repeatedly perform some tests. % % \begin{function}{\peek_after:Nw} % \begin{syntax} @@ -957,7 +964,7 @@ % (as appropriate to the result of the test). % \end{function} % -% \begin{function}[added = 2020-12-03, updated = 2022-10-03] +% \begin{function}[added = 2020-12-03, updated = 2024-02-07] % {\peek_analysis_map_inline:n} % \begin{syntax} % \cs{peek_analysis_map_inline:n} \Arg{inline function} @@ -998,6 +1005,12 @@ % effect after the loop. Within the code, \cs{l_peek_token} is set % equal (as a token, not a token list) to the token under % consideration. +% \begin{texnote} +% In case the input stream has not yet been tokenized (converted +% from characters to tokens), characters are tokenized one by one as +% needed by \cs{peek_analysis_map_inline:n} using the current +% category code regime. +% \end{texnote} % \end{function} % % \begin{function}[added = 2020-12-03] diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx index ce11f62ae2..de3b6067ba 100644 --- a/macros/latex/contrib/l3kernel/l3unicode.dtx +++ b/macros/latex/contrib/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-01-22} +% \date{Released 2024-02-13} % % \maketitle % diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf Binary files differindex d74db5c796..09f28f0667 100644 --- a/macros/latex/contrib/l3kernel/source3.pdf +++ b/macros/latex/contrib/l3kernel/source3.pdf diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex index 5ccc140197..1e396b15fb 100644 --- a/macros/latex/contrib/l3kernel/source3body.tex +++ b/macros/latex/contrib/l3kernel/source3body.tex @@ -272,7 +272,11 @@ following argument specifiers: dependent and their name can change without warning, thus their use is \emph{strongly discouraged} in package code: programmers should instead use the interfaces documented in - \href{interface3.pdf}{interface3.pdf}. + \ifinterface + this documentation. + \else + \href{interface3.pdf}{interface3.pdf}. + \fi \end{description} Notice that the argument specifier describes how the argument is processed prior to being passed to the underlying function. For example, @@ -607,8 +611,7 @@ used on top of \LaTeXe{} if \tn{outer} tokens are used in the arguments. \DocInput{l3color.dtx} \DocInput{l3pdf.dtx} -\part{Removals} - +% implementation part only \ExplSyntaxOn \clist_gput_right:Nn \g_docinput_clist { l3deprecation.dtx } \clist_gput_right:Nn \g_docinput_clist { l3debug.dtx } diff --git a/macros/latex/contrib/l3packages/CHANGELOG.md b/macros/latex/contrib/l3packages/CHANGELOG.md index 05001a0e8f..abef360b7a 100644 --- a/macros/latex/contrib/l3packages/CHANGELOG.md +++ b/macros/latex/contrib/l3packages/CHANGELOG.md @@ -7,6 +7,15 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2024-02-13] + +### Changed +- Preparation for move of `xtemplate` concepts to the kernel + +### Removed +- `\IfInstanceExist(TF)` +- `xfrac`: moved to https://github.com/latex3/xfrac + ## [2023-10-10] ### Changed @@ -65,7 +74,7 @@ this project uses date-based 'snapshot' version identifiers. ## [2022-05-30] -## Added +### Added - `\SetTemplateKeys` for _ad hoc_ adjustment of template values ### Changed @@ -99,19 +108,16 @@ this project uses date-based 'snapshot' version identifiers. ## [2021-06-18] ### Fixed - - Correct internal changes to message naming ## [2021-06-01] ### Fixed - - Restore one parameter in `xfrac` ## [2021-05-27] ### Changed - - Internal changes to message naming ## [2021-05-07] @@ -237,7 +243,8 @@ this project uses date-based 'snapshot' version identifiers. - Switch to ISO date format - Improve cross-module use of internal functions -[Unreleased]: https://github.com/latex3/latex3/compare/2023-10-10...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2024-02-13...HEAD +[2024-02-13]: https://github.com/latex3/latex3/compare/2023-10-10...2024-02-13 [2023-10-10]: https://github.com/latex3/latex3/compare/2023-08-29...2023-10-10 [2023-08-29]: https://github.com/latex3/latex3/compare/2023-02-02...2023-08-29 [2023-02-02]: https://github.com/latex3/latex3/compare/2023-02-01...2023-02-02 diff --git a/macros/latex/contrib/l3packages/README.md b/macros/latex/contrib/l3packages/README.md index d3ecea7028..2579ee6e96 100644 --- a/macros/latex/contrib/l3packages/README.md +++ b/macros/latex/contrib/l3packages/README.md @@ -1,99 +1,37 @@ -LaTeX3 High-Level Concepts -========================== +# `l3packages`: Higher-level LaTeX3 Concepts (Deprecated) -Release 2023-10-10 +Release 2024-02-13 -Overview --------- +## Overview -The `l3packages` collection contains implementations for aspects of the -LaTeX3 kernel, dealing with higher-level ideas such as the Designer Interface. -The packages here are considered broadly stable (The LaTeX Project does not -expect the interfaces to alter radically). These packages are build on LaTeX2e -conventions at the interface level, and so may not migrate in the current form -to a stand-alone LaTeX3 format. +The `l3packages` collection dealing with higher-level ideas such as the +Designer Interface, as part of 'LaTeX3' developments. The packages here have +over time migrated into the LaTeX kernel: the material here is retained to +support older files. -All of the material in the collection requires the LaTeX3 base layer package -[`l3kernel`](http://ctan.org/pkg/l3kernel). The two packages must be installed -in matching versions: if you update `l3packages`, make sure that `l3kernel` is -updated at the same time. +The appropriate LaTeX kernel releases incorporating the ideas from the packages +here are -Currently included in the CTAN release of `l3packages` are the following -bundles: -* `l3keys2e` (deprecated in favor of updated LaTeX kernel methods) -* `xfp` (from 2022-06-01 part of the LaTeX format) -* `xfrac` -* `xparse` (deprecated in favor of elements move to the LaTeX kernel) -* `xtemplate` +- `l3keys2e` 2022-06-01 +- `xfp` 2022-06-01 +- `xparse` 2020-10-01 +- `xtemplate` 2024-06-01 -`l3keys2e` (deprecated) ----------- +## Issues -The `l3keys2e` package allows keys defined using `l3keys` to be used as package -and class options with LaTeX2e. This is tied to the method the existing kernel -uses for processing options, and so it is likely that a stand-alone LaTeX3 -kernel will use a very different approach. - -`xfp` (deprecated) ------ - -The `xfp` package provides a document-level interface for the LaTeX3 -FPU. As such, it is a wrapper around the core `\fp_eval:n` function -but does not require code syntax. It provides the expandable command -`\fpeval`, which can be used inside for example `\edef` or contexts -where TeX requires a number. - -From 2022-06-01 release of LaTeX this will be included in the format -so that the package doesn't need loading any longer. - -`xfrac` -------- - -The `xfrac` package uses the interface defined by `xtemplate` to provide -flexible split-level fractions _via_ the `\sfrac` macro. This is both a -demonstration of the power of the template concept and also a useful addition -to the available functionality in LaTeX2e. - -`xparse` (deprecated) -------- - -The `xparse` package provides a high-level interface for declaring document -commands, e.g., a uniform way to define commands taking optional arguments, -optional stars (and others), mandatory arguments and more. - -The development of `xparse` moved to the -[LaTeX2e repository](https://github.com/latex3/latex2e) as `ltcmd`, which is -preloaded in the LaTeX format, and the code for `xparse` in this repository -contains only the deprecated argument types `G`, `l`, and `u`. - -`xtemplate` ------------ - -The `xtemplate` package provides an interface for defining generic -functions using a key=val syntax. This is designed to be -"self-documenting", with the key definitions providing information -on how they are to be used. - - -Issues ------- - -The issue tracker for LaTeX3 is currently located +The issue tracker for LaTeX is currently located [on GitHub](https://github.com/latex3/latex3/issues). +## Development team -The LaTeX Project ------------------- +This code is developed by [The LaTeX Project](https://latex-project.org). -Development of LaTeX3 is carried out by -[The LaTeX Project](https://www.latex-project.org/latex3/). +## License -The development team can be contacted -by e-mail: <latex-team@latex-project.org>; for general LaTeX3 discussion -the [LaTeX-L list](#Discussion) should be used. +Released under the LaTeX Project Public License v1.3c or later. See https://www.latex-project.org/lppl.txt ----- -<p>Copyright (C) 1998-2012,2015-2023 The LaTeX Project <br /> -<a href="http://latex-project.org/">http://latex-project.org/</a> <br /> +<p>Copyright (C) 2024 The LaTeX Project <br /> +<a href="https://latex-project.org/">https://latex-project.org/</a> <br /> All rights reserved.</p> diff --git a/macros/latex/contrib/l3packages/l3keys2e.dtx b/macros/latex/contrib/l3packages/l3keys2e.dtx index 376cb136ac..f5c494120a 100644 --- a/macros/latex/contrib/l3packages/l3keys2e.dtx +++ b/macros/latex/contrib/l3packages/l3keys2e.dtx @@ -2,7 +2,7 @@ % %% File: l3keys2e.dtx % -% Copyright (C) 2009,2011-2023 The LaTeX Project +% Copyright (C) 2009-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -49,7 +49,7 @@ % \fi % % \title{^^A -% The \textsf{l3keys2e} package\\ +% The \pkg{l3keys2e} package\\ % \LaTeXe{} option processing using \LaTeX3 keys^^A % } % @@ -62,7 +62,7 @@ % }^^A % } % -% \date{Released 2023-10-10} +% \date{Released 2024-02-13} % % \maketitle % @@ -154,7 +154,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3keys2e}{2023-10-10}{} +\ProvidesExplPackage{l3keys2e}{2024-02-13}{} {LaTeX2e option processing using LaTeX3 keys} % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/l3keys2e.ins b/macros/latex/contrib/l3packages/l3keys2e.ins index 667debde59..c4d1545e13 100644 --- a/macros/latex/contrib/l3packages/l3keys2e.ins +++ b/macros/latex/contrib/l3packages/l3keys2e.ins @@ -2,7 +2,7 @@ File: l3keys2e.ins -Copyright (C) 2009,2011,2012,2016,2017,2019-2023 The LaTeX Project +Copyright (C) 2009,2011,2012,2016,2017,2019-2024 The LaTeX Project It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of this @@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN. \preamble -Copyright (C) 2009-2023 The LaTeX Project +Copyright (C) 2009-2024 The LaTeX Project It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of diff --git a/macros/latex/contrib/l3packages/l3keys2e.pdf b/macros/latex/contrib/l3packages/l3keys2e.pdf Binary files differindex cfef37deff..a6e0bd9e41 100644 --- a/macros/latex/contrib/l3packages/l3keys2e.pdf +++ b/macros/latex/contrib/l3packages/l3keys2e.pdf diff --git a/macros/latex/contrib/l3packages/xfp.dtx b/macros/latex/contrib/l3packages/xfp.dtx index 2c3a5bf732..d695d44bb1 100644 --- a/macros/latex/contrib/l3packages/xfp.dtx +++ b/macros/latex/contrib/l3packages/xfp.dtx @@ -2,7 +2,7 @@ % %% File: xfp.dtx % -% Copyright (C) 2017-2023 The LaTeX Project +% Copyright (C) 2017-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -51,7 +51,7 @@ % \providecommand\nan{\texttt{NaN}} % % \title{^^A -% The \textsf{xfp} package\\Floating Point Unit^^A +% The \pkg{xfp} package\\ Floating Point Unit^^A % } % % \author{^^A @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2023-10-10} +% \date{Released 2024-02-13} % % \maketitle % @@ -171,7 +171,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfp}{2023-10-10}{} +\ProvidesExplPackage{xfp}{2024-02-13}{} {L3 Floating point unit} % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/xfp.ins b/macros/latex/contrib/l3packages/xfp.ins index 266bfa1661..d7d1ff046a 100644 --- a/macros/latex/contrib/l3packages/xfp.ins +++ b/macros/latex/contrib/l3packages/xfp.ins @@ -2,7 +2,7 @@ File: xfp.ins -Copyright (C) 2017,2019-2023 The LaTeX Project +Copyright (C) 2017,2019-2024 The LaTeX Project It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of this @@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN. \preamble -Copyright (C) 2017-2023 The LaTeX Project +Copyright (C) 2017-2024 The LaTeX Project It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of diff --git a/macros/latex/contrib/l3packages/xfp.pdf b/macros/latex/contrib/l3packages/xfp.pdf Binary files differindex aa5b6c0293..b45cdd5b15 100644 --- a/macros/latex/contrib/l3packages/xfp.pdf +++ b/macros/latex/contrib/l3packages/xfp.pdf diff --git a/macros/latex/contrib/l3packages/xfrac.dtx b/macros/latex/contrib/l3packages/xfrac.dtx deleted file mode 100644 index 6bce5f93ee..0000000000 --- a/macros/latex/contrib/l3packages/xfrac.dtx +++ /dev/null @@ -1,1141 +0,0 @@ -% \iffalse meta-comment -% -%% File: xfrac.dtx -% -% Copyright (C) 2004,2008-2010 Morten Hoegholm -% (C) 2011,2012,2014-2023 The LaTeX Project -% -% It may be distributed and/or modified under the conditions of the -% LaTeX Project Public License (LPPL), either version 1.3c of this -% license or (at your option) any later version. The latest version -% of this license is in the file -% -% https://www.latex-project.org/lppl.txt -% -% This file is part of the "l3packages bundle" (The Work in LPPL) -% and all files in that bundle must be distributed together. -% -% ----------------------------------------------------------------------- -% -% The development version of the bundle can be found at -% -% https://github.com/latex3/latex3 -% -% for those people who are interested. -% -%<*driver|package> -% The version of expl3 required is tested as early as possible, as -% some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2018/02/21] -%<package>\@ifpackagelater{expl3}{2018/02/21} -%<package> {} -%<package> {% -%<package> \PackageError{xfrac}{Support package l3kernel too old} -%<package> {% -%<package> Please install an up to date version of l3kernel\MessageBreak -%<package> using your TeX package manager or from CTAN.\MessageBreak -%<package> \MessageBreak -%<package> Loading xfrac will abort!% -%<package> }% -%<package> \endinput -%<package> } -\RequirePackage{amstext,graphicx,l3keys2e,textcomp,xparse,xtemplate} -%</driver|package> -%<*driver> -\documentclass[full]{l3doc} -\usepackage{nicefrac,xfrac} ^^A Need nicefrac for demo purposes -\providecommand*\key[1]{\textbf{#1}} -\newcommand*\switch[2]{{\fontfamily{#1}\selectfont #2}} -\begin{document} - \DocInput{\jobname.dtx} -\end{document} -%</driver> -% \fi -% -% \title{^^A -% The \textsf{xfrac} package\\ Split-level fractions^^A -% } -% -% \author{^^A -% The \LaTeX{} Project\thanks -% {^^A -% E-mail: -% \href{mailto:latex-team@latex-project.org} -% {latex-team@latex-project.org}^^A -% }^^A -% } -% -% \date{Released 2023-10-10} -% -% \maketitle -% -% \begin{documentation} -% -% The \pkg{xfrac} package defines a document command \cs{sfrac} -% with the following syntax: -% \begin{quote} -% \cs{sfrac}\oarg{instance}\marg{num}\oarg{sep}\marg{denom} -% \end{quote} -% Let's show a few examples: -% \begin{verbatim} -% \sfrac{1}{2}, $\sfrac{1}{2}$, -% $\mathbf{3\times\sfrac{1}{2}}$ -% \quad \fontfamily{ppl}\selectfont Palatino: \sfrac{1}{2} -% \quad \fontfamily{ptm}\selectfont Times: \sfrac{1}{2} -% \end{verbatim} -% \begin{quote} -% \sfrac{1}{2}, $\sfrac{1}{2}$, $\mathbf{3\times\sfrac{1}{2}}$ -% \quad \fontfamily{ppl}\selectfont Palatino: \sfrac{1}{2} -% \quad \fontfamily{ptm}\selectfont Times: \sfrac{1}{2} -% \end{quote} -% You'll notice something interesting: not only does the \cs{sfrac} -% command work as it should in math mode, it also gets the job done -% for other fonts as well. -% -% \section{A Bit of History} -% -% \subsection{The Past} -% -% One of the first exercises in \emph{The \TeX{}Book} is to design a -% macro for split level fractions. The solution presented is fairly -% simple, using a \emph{virgule} (a slash) for separating the two -% components. It looks okay because the text font and math font of -% Computer Modern look almost identical. -% -% The proper symbol to use instead of the virgule is a \emph{solidus} -% which does not exist in Computer Modern. It is however available in -% the European Computer Modern fonts, but I'll get back to that. -% -% \subsection{The Present} -% -% The most common way to produce split level fractions within \LaTeXe{} -% is by means of the \pkg{nicefrac} package. Part of the reason it -% has found widespread use is due to the strange design of the -% built-in text fractions of the EC fonts, which look like this: -% \textonehalf{}. The package is very simple to use but there are a few -% issues: -% \begin{itemize} -% \item It uses the virgule instead of the solidus. -% \item Font size of numerator and denominator is bigger than in the -% built-in symbol. Compare Palatino: \switch{ppl}{\nicefrac{1}{2}} -% \emph{vs.}~\switch{ppl}{\textonehalf}. -% \item It doesn't correct for fonts using text figures such as in the -% \pkg{eco} package. Compare \switch{cmor}{\nicefrac{1}{2}} and -% \switch{cmor}{\nicefrac{8}{9}}. -% \item In math mode, it doesn't always pick up the correct math -% alphabet. -% \end{itemize} -% In short: \pkg{nicefrac} doesn't attempt to be the answer to -% everything and so this is not a criticism of the package. It works -% quite well for Computer Modern which was pretty much what was widely -% available at the time it was developed. Users these days, however, -% have a choice of many fonts when they write their documents. -% -% \subsection{The Future} -% -% Fonts are wildly different; one macro that works fine for Computer -% Modern obviously doesn't work well at all in Palatino. For one we -% have to make the separator symbol configurable, and we need to -% take care of several details as well: font scaling of the -% numerator/denominator pair (ND), font selection of ND, \emph{etc.} If we -% are to have a single package for this in the future we have to define a -% totally generic interface for the fraction commands and then adjust -% parameters depending on the current font. What you see in this -% prototype implementation of \pkg{xfrac} is just that. -% -% \section{Advanced User Interface} -% -% \subsection{Text mode} -% -% The usual problem in text mode has a name: Computer Modern. The -% solidi of all the Computer Modern fonts leave a lot to be desired, -% although things are potentially looking better as the Latin Modern -% fonts are becoming more stable and widespread. As long as the -% default fonts are Computer Modern variants we must however work -% around this. One idea that comes to mind is to see what happens -% when you use a solidus from another font instead. Let's try with -% Times: -% \begin{quote} -% \DeclareInstance{xfrac}{cmr2}{text} -% {slash-symbol-font = ptm} -% \enquote{You take \sfrac[cmr2]{1}{2} cup of sugar, \ldots} -% \end{quote} -% That looks quite good actually, so it was probably very difficult -% to obtain that result. Nope, it was extremely easy---if you happen -% to know about \emph{instances}: -% \begin{verbatim} -% \DeclareInstance{xfrac}{cmr}{text} -% {slash-symbol-font = ptm} -% \end{verbatim} -% So we define an instance with the name |cmr| from the template -% |text| which in turn is of object type |xfrac|. You'll notice -% the |cmr| is also the name of the font family for Computer Modern -% Roman and the reasoning behind is that every font family should -% have it's own settings, and if a document command is to work well -% in that scheme, letting it use the name of the current font family -% seems like a good idea. Thus the \cs{sfrac} command checks to see -% whether an instance with same name as the current font family -% exists and uses it if the test is true; otherwise the default -% setting is used. Here we defined the instance to be used for the -% font family |cmr| and just told it to use the Times font for -% typesetting the slash symbol which turns out to be a solidus by -% default. -% -% The option \texttt{cm-recommended} which is loaded by default uses -% the Times solidus for Computer Modern Roman and Computer Modern -% Sans Serif and the Palatino solidus for Computer Modern Typewriter -% Type. This looks quite good. Should you however not want this you -% can use the option \texttt{cm-standard} which produces somewhat -% acceptable results using Computer Modern exclusively. -% -% So what about old style figures? If you use the \pkg{eco} -% package you might define an instance similar to this (`cmor' is -% the name of the roman font activated by \pkg{eco}): -% \DeclareInstance{xfrac}{cmor}{text} -% { -% slash-symbol-font = ptm, -% numerator-font = cmr, -% denominator-font = cmr -% } -% \begin{verbatim} -% \DeclareInstance{xfrac}{cmor}{text} -% { -% slash-symbol-font = ptm, -% numerator-font = cmr, -% denominator-font = cmr -% } -% \end{verbatim} -% We also use regular Computer Modern Roman for typesetting ND, so -% we end up with \switch{cmor}{\sfrac{1}{2}} and -% \switch{cmor}{\sfrac{8}{9}} instead of -% \switch{cmor}{\nicefrac{1}{2}} and \switch{cmor}{\nicefrac{8}{9}}. -% Much better. -% -% There are also situations where other tricks are useful. If you -% don't have the inferior and superior figures available in a font, -% or the font doesn't have a wider design for small font sizes, you -% can cheat by manually scaling the ND-pair. I got nice results for -% Adobe's Stempel Garamond (with small caps and old style figures) -% with the following setup: -% \begin{verbatim} -% \DeclareInstance{xfrac}{pegj}{text} -% { -% numerator-font = pegx, -% denominator-font = pegx, -% scale-factor = 0.9, -% h-scale = 1.1 -% } -% \end{verbatim} -% We use the font family |pegx| (Stempel Garamond with real small -% caps) for typesetting the ND-pair. Additionally the key -% \key{scale-factor} specifies that the font size used for the -% ND-pair should be $0.9$ of the height of the solidus, and the key -% \key{h-scale} specifies that the ND-pair should be scaled an extra -% 10\,\% horizontally. -% -% Should you be so fortunate the have a font with inferior and -% superior figures like in the Monotype Janson example from Philipp -% Lehman's excellent \emph{The Font Installation Guide}. In that -% example Philipp defines the font families |mjn0| for the inferior -% figures and |mjn1| for the superior. Thus to get the \cs{sfrac} -% command to use them on the fly for the font family |mjnj| (Janson, -% old style figures) we would say -% \begin{verbatim} -% \DeclareInstance{xfrac}{mjnj}{text} -% { -% numerator-font = mjn1, -% denominator-font = mjn0, -% scaling = false, -% numerator-bot-sep = 0 pt, -% denominator-bot-sep = 0 pt -% } -% \end{verbatim} -% I think this example is a very clean way to do it. An alternative -% approach could be to use the keys \key{numerator-format} and -% \key{denominator-format} to process the arguments and let them -% determine what to do. -% -% \subsection{Math Mode} -% -% In math mode the choices are a lot fewer because first of all -% \TeX{} comes with a built-in limitation of $16$ math families. -% Additionally we will not need a solidus for typesetting split -% fractions in math, as tradition is to use a virgule instead. We -% define the basic |mathdefault| instance to simply use the math -% family in use when the instance is run. So if we're in normal math -% like |$\sfrac{7}{9}$| we simply get family~$-1$. If we're inside a -% \cs{mathbf} we're in family~$4$ (in the standard setup at least), -% and so the fraction is typeset with the same math family. Simple, -% isn't? -% -% You can also declare instances for the math families, but I really -% don't see why you would. If you do then name them according to the -% scheme \texttt{mathfam\meta{N}}, where \meta{N} is the family number, and -% only do it if you \emph{really} know how to set up math fonts. -% That is, if \cs{DeclareMathAlphabet} is unbeknownst to you, then -% just don't go there. -% -% Another example: If we want \cs{sfrac} to produce split fractions -% without doing anything at all, we can choose the collection -% |plainmath|, which is defined as -% \begin{verbatim} -% \DeclareCollectionInstance{plainmath}{xfrac}{mathdefault}{math} -% { -% denominator-bot-sep = 0 pt, -% numerator-bot-sep = 0 pt, -% numerator-top-sep = \c_max_dim, -% scaling = false, -% slash-right-mkern = 0 mu, -% slash-left-mkern = 0 mu -% } -% \end{verbatim} -% This creates an alternative version of the instance |mathdefault| -% with settings as specified by the keys. In the default math setup -% \key{numerator-top-sep} is set to 0~pt, and here we set -% \key{numerator-bot-sep} to 0~pt as well, so in order to avoid -% over-specification (and an error message) we must set -% \key{numerator-top-sep} to \cs{c_max_dim}. We activate (obeying -% normal scoping rules) it with: -% \begin{verbatim} -% \UseCollection{xfrac}{plainmath} -% \end{verbatim} -% Then |$\sfrac{8}{13}$| produces^^A -% \begingroup -% \UseCollection{xfrac}{plainmath} -% $\sfrac{8}{13}$ and just typing |$8/13$| gives the same result: -% $8/13$. -% \endgroup -% -% \section{The Template Interface} -% -% \begin{TemplateInterfaceDescription}{xfrac} -% -% \TemplateArgument{1}{The numerator} -% -% \TemplateArgument{2}{The separator} -% -% \TemplateArgument{3}{The denominator} -% -% \TemplateSemantics -% -% Typesets arguments 1 and 3 separated by argument 2, which in text -% mode by default is a \emph{solidus}. This is taken from -% \pkg{textcomp} where it is denoted \cs{textfractionsolidus}. -% This is the character used for the ready made split level -% fractions such as \textonehalf{}---except in the (European) Computer -% Modern fonts. In math mode a \emph{virgule} is used instead as -% this is more appropriate and it is always available in the math -% fonts. The solidus is a text symbol only. -% -% \end{TemplateInterfaceDescription} -% -% \begin{TemplateDescription}{xfrac}{text} -% -% \TemplateKey{numerator-font}{tokenlist} -% {Font family specification to use for the numerator.} -% {\cs{f@family}} -% -% \TemplateKey{numerator-format}{function 1 arg} -% {Action to be taken on the numerator.} -% {Process argument unchanged} -% -% \TemplateKey{slash-symbol}{tokenlist} -% {The separator symbol. If not specified the default value will be -% used instead.} -% {Solidus (\cs{textfractionsolidus})} -% -% \TemplateKey{slash-symbol-font}{tokenlist} -% {Font family specification to use for the separator symbol.} -% {\cs{f@family}} -% -% \TemplateKey{slash-symbol-format}{function 1 arg} -% {Action to be taken on the separator symbol.} -% {Process argument unchanged} -% -% \TemplateKey{denominator-font}{tokenlist} -% {Font family specification to use for the denominator.} -% {\cs{f@family}} -% -% \TemplateKey{denominator-format}{function 1 arg} -% {Action to be taken on the denominator.} -% {Process argument unchanged} -% -% \TemplateKey{h-scale}{real} -% {Factor by which the numerator and denominator should be -% horizontally scaled. It should only be used if the real superior -% and inferior fonts are not available. For instance Stempel -% Garamond looks excellent if scaled 10\,\% extra horizontally, \emph{i.e.}, -% by a factor of 1.1.} -% {1} -% -% \TemplateKey{v-scale}{real} -% {Same as \key{h-scale} only vertically. Probably not of much use -% but added for completeness.} -% {1} -% -% \TemplateKey{scale-factor}{real} -% {Fraction of the size of \key{slash-symbol}. Used for setting the -% font size of numerator and denominator. Usually a value of app.\ -% \sfrac{5}{6} produces fine results. It should only be used if the -% real superior and inferior fonts are not available. As an example -% Stempel Garamond looks better if the factor is 0.9.} -% {0.83333} -% -% \TemplateKey{scale-relative}{choice} -% {If set to |true| the font size of the numerator and denominator -% is scaled with respect to the height of the \key{slash-symbol}. If -% set to |false| the font is scaled with respect to the total height -% of the \key{slash-symbol}.} -% {true} -% -% \TemplateKey{scaling}{choice} -% {If set to |true| the fonts are allowed to scale. If set to -% |false| they are not. See the `Janson' example for an application.} -% {true} -% -% \TemplateKey{numerator-top-sep}{length} -% {Dimension specifying the space between the top of the -% \key{slash-symbol} and the top of the numerator. If not specified, -% the depth of the solidus will be used, because this value will -% make the fraction look even.} -% {Unspecified} -% -% \TemplateKey{numerator-bot-sep}{length} -% {Dimension specifying the lift of the numerator from the -% baseline.} -% {Unspecified} -% -% \TemplateKey{denominator-bot-sep}{length} -% {Dimension specifying the lift of the denominator from the -% baseline.} -% {Unspecified} -% -% \TemplateKey{slash-right-kern}{length} -% {Dimension specifying the kerning between the \key{slash-symbol} -% and the numerator.} -% {\texttt{0pt}} -% -% \TemplateKey{slash-left-kern}{length} -% {Dimension specifying the kerning between the \key{slash-symbol} -% and the denominator.} -% {\texttt{0pt}} -% -% \TemplateKey{math-mode}{choice} -% {Are we in math mode or not?} -% {false} -% -% \TemplateKey{phantom}{tokenlist} -% {A character that suits the common cases. As we would mostly want -% to use numbers in text mode we choose a \enquote{tall} number, while in -% math it is somewhat different.} -% {8} -% -% \TemplateSemantics -% -% This template is also the foundation for the \enquote{math} template. The -% keys \key{slash-right-mkern} and \key{slash-left-mkern} can only -% be used in math mode and are not shown here. -% -% \end{TemplateDescription} -% -% \begin{TemplateDescription}{xfrac}{math} -% -% \TemplateKey{numerator-font}{tokenlist} -% {Font family specification to use for the numerator.} -% {\cs{number}\cs{fam}} -% -% \TemplateKey{slash-symbol}{tokenlist} -% {The separator symbol. If not specified the default value will be -% used instead.} -% {Virgule ($/$)} -% -% \TemplateKey{slash-symbol-font}{tokenlist} -% {Font family specification to use for the separator symbol.} -% {\cs{number}\cs{fam}} -% -% \TemplateKey{denominator-font}{tokenlist} -% {Font family specification to use for the denominator.} -% {\cs{number}\cs{fam}} -% -% \TemplateKey{scale-factor}{real} -% {Fraction of the size of \key{slash-symbol}. In math mode we -% cannot rely on the fonts to be able to scale, but giving a default -% scale of 0.7 fits into the regular size changing scheme---the -% default scheme has values $(D,T,S,SS)=(1,1,0.7,0.5)$ whereas we -% with a default \key{scale-factor} of 0.7 get $(1,1,0.7,0.49)$. -% That's close enough.} -% {0.7} -% -% \TemplateKey{scale-relative}{choice} -% {If set to |true| the font size of the numerator and denominator -% is scaled with respect to the height of the \key{slash-symbol}. If -% set to |false| the font is scaled with respect to the total height -% of the \key{slash-symbol}.} -% {false} -% -% \TemplateKey{scaling}{choice} -% {If set to |true| the fonts are allowed to scale. If set to -% |false| they are not. See the |plainmath| example for an application.} -% {true} -% -% \TemplateKey{numerator-top-sep}{length} -% {Dimension specifying the space between the top of the -% \key{slash-symbol} and the top of the numerator. If not specified, -% the depth of the virgule will be used, because this value will -% make the fraction look even.} -% {\texttt{0pt}} -% -% \TemplateKey{denominator-bot-sep}{length} -% {Dimension specifying the lift of the denominator from the -% baseline.} -% {\texttt{0pt}} -% -% \TemplateKey{slash-right-mkern}{muskip} -% {Same as \key{slash-right-kern} but for math mode only and should -% be specified in \texttt{mu} units.} -% {\texttt{-2mu}} -% -% \TemplateKey{slash-left-mkern}{muskip} -% {Same as \key{slash-left-kern} but for math mode only and should -% be specified in \texttt{mu} units.} -% {\texttt{-1mu}} -% -% \TemplateKey{math-mode}{choice} -% {Are we in math mode or not?} -% {true} -% -% \TemplateKey{phantom}{tokenlist} -% {A character that suits the common cases. In math we have a high -% risk of using a parenthesis, so we choose that. Text mode is -% another story.} -% {(^^A) -% } -% -% \TemplateSemantics -% -% This template is a restricted version of the |text| template. Only -% the keys that are different from the |text| template are shown -% here. Also bear in mind that the attributes \key{slash-left-kern} -% and \key{slash-right-kern} have no meaning in this template. -% -% \end{TemplateDescription} -% -% \end{documentation} -% -% \begin{implementation} -% -% \section{\pkg{xfrac} implementation} -% -% \begin{macrocode} -%<*package> -% \end{macrocode} -% -% \begin{macrocode} -%<@@=xfrac> -% \end{macrocode} -% -% \begin{macrocode} -\ProvidesExplPackage{xfrac}{2023-10-10}{} - {L3 Experimental split-level fractions} -% \end{macrocode} -% -% \begin{variable}{\l_@@_cm_std_bool} -% There is one option to support. -% \begin{macrocode} -\keys_define:nn { xfrac } - { - cm-recommended .choice:, - cm-recommended / - false .code:n = - { \bool_set_true:N \l_@@_cm_std_bool }, - cm-recommended / - true .code:n = - { \bool_set_false:N \l_@@_cm_std_bool }, - cm-recommended .default:n = { true }, - cm-standard .bool_set:N = \l_@@_cm_std_bool - } -\ProcessKeysOptions { xfrac } -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_slash_box} -% \begin{variable}{\l_@@_tmp_box} -% In keeping with the \LaTeX3 philosophy, rather than use generic -% scratch boxes and get confused, \pkg{xfrac} reserves its own named -% working space. -% \begin{macrocode} -\box_new:N \l_@@_slash_box -\box_new:N \l_@@_tmp_box -% \end{macrocode} -% \end{variable} -% \end{variable} -% -% \begin{macro}{\@@_tmp:w} -% Used for the raised boxes: weird as it does not take an argument -% but the \cs{raisebox} does. -% \begin{macrocode} -\cs_new:Npn \@@_tmp:w { } -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Initialisation of variables} -% -% Variables used in templates have to be set up: there is not -% much to say about these, other than that they must exist. -% -% \begin{variable}{\l_@@_denominator_bot_sep_dim} -% \begin{variable}{\l_@@_numerator_bot_sep_dim} -% \begin{variable}{\l_@@_numerator_top_sep_dim} -% \begin{variable}{\l_@@_slash_left_sep_dim} -% \begin{variable}{\l_@@_slash_right_sep_dim} -% Fixed lengths. -% \begin{macrocode} -\dim_new:N \l_@@_denominator_bot_sep_dim -\dim_new:N \l_@@_numerator_bot_sep_dim -\dim_new:N \l_@@_numerator_top_sep_dim -\dim_new:N \l_@@_slash_left_sep_dim -\dim_new:N \l_@@_slash_right_sep_dim -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_slash_left_muskip} -% \begin{variable}{\l_@@_slash_right_muskip} -% Math mode skips. -% \begin{macrocode} -\muskip_new:N \l_@@_slash_left_muskip -\muskip_new:N \l_@@_slash_right_muskip -% \end{macrocode} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_hscale_fp} -% \begin{variable}{\l_@@_scale_factor_fp} -% \begin{variable}{\l_@@_vscale_fp} -% Floating point values. -% \begin{macrocode} -\fp_new:N \l_@@_hscale_fp -\fp_new:N \l_@@_scale_factor_fp -\fp_new:N \l_@@_vscale_fp -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_denominator_font_tl} -% \begin{variable}{\l_@@_numerator_font_tl} -% \begin{variable}{\l_@@_phantom_tl } -% \begin{variable}{\l_@@_slash_symbol_tl} -% \begin{variable}{\l_@@_slash_symbol_font_tl} -% Token lists, which include floating-point numbers and math(s) -% skips. -% \begin{macrocode} -\tl_new:N \l_@@_denominator_font_tl -\tl_new:N \l_@@_numerator_font_tl -\tl_new:N \l_@@_phantom_tl -\tl_new:N \l_@@_slash_symbol_tl -\tl_new:N \l_@@_slash_symbol_font_tl -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{macro}{\@@_fontscale:} -% \begin{macro}{\@@_math:n} -% \begin{macro}{\@@_denominator_font_change:} -% \begin{macro}{\@@_denominator_format:n} -% \begin{macro}{\@@_numerator_font_change:} -% \begin{macro}{\@@_numerator_format:n} -% \begin{macro}{\@@_relscale:} -% \begin{macro}{\@@_slash_symbol_font_change:} -% \begin{macro}{\@@_slash_symbol_format:n} -% \begin{macro}{\@@_text_or_math:n} -% Functions, either things which are calculated \enquote{on the fly} -% (no argument required) or are functions taking one argument in the -% code. -% \begin{macrocode} -\cs_new:Npn \@@_fontscale: { } -\cs_new:Npn \@@_math:n #1 { } -\cs_new:Npn \@@_denominator_font_change: { } -\cs_new:Npn \@@_denominator_format:n #1 { } -\cs_new:Npn \@@_numerator_font_change: { } -\cs_new:Npn \@@_numerator_format:n #1 { } -\cs_new:Npn \@@_relscale: { } -\cs_new:Npn \@@_slash_symbol_font_change: { } -\cs_new:Npn \@@_slash_symbol_format:n #1 { } -\cs_new:Npn \@@_text_or_math:n #1 { } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \subsection{The template} -% -% There is only one object type in \pkg{xfrac}, rather unimaginatively -% named \texttt{xfrac}. -% \begin{macrocode} -\DeclareObjectType { xfrac } { 3 } -% \end{macrocode} -% -% A single template interface is used for both text and math(s), which -% does make a few things a little complex later. -% \begin{macrocode} -\DeclareTemplateInterface { xfrac } { text } { 3 } - { - denominator-bot-sep : length = \c_max_dim , - denominator-font : tokenlist = \f@family , - denominator-format : function 1 = #1 , - h-scale : real = 1 , - math-mode : choice { false , true } - = false , - numerator-font : tokenlist = \f@family , - numerator-format : function 1 = #1 , - numerator-bot-sep : length = \c_max_dim , - numerator-top-sep : length = \c_max_dim , - phantom : tokenlist = 8 , - scale-factor : real = 0.83333 , - scale-relative : choice { false , true } - = true , - scaling : choice { false , true } - = true , - slash-left-kern : length = 0 pt , - slash-left-mkern : muskip = -2 mu , - slash-right-kern : length = 0 pt , - slash-right-mkern : muskip = -1 mu , - slash-symbol : tokenlist = \textfractionsolidus , - slash-symbol-font : tokenlist = \f@family , - slash-symbol-format : function 1 = #1 , - v-scale : real = 1 , - } -% \end{macrocode} -% Most of the variable binding is quite simple: of course, the choices -% are a little more complicated. That is particularly true where -% these have to set up \enquote{on the fly} functions. -% \begin{macrocode} -\DeclareTemplateCode { xfrac } { text } { 3 } - { - denominator-bot-sep = \l_@@_denominator_bot_sep_dim , - denominator-font = \l_@@_denominator_font_tl , - denominator-format = \@@_denominator_format:n , - h-scale = \l_@@_hscale_fp , - math-mode = - { - false = \cs_set_eq:NN \@@_math:n \use:n, - true = \cs_set_eq:NN \@@_math:n \ensuremath - }, - numerator-font = \l_@@_numerator_font_tl , - numerator-format = \@@_numerator_format:n , - numerator-bot-sep = \l_@@_numerator_bot_sep_dim , - numerator-top-sep = \l_@@_numerator_top_sep_dim , - phantom = \l_@@_phantom_tl , - scale-factor = \l_@@_scale_factor_fp , - scale-relative = - { - false = - \cs_set:Npn \@@_relscale: - { - \dim_eval:n - { \box_ht:N \l_@@_tmp_box + \box_dp:N \l_@@_tmp_box } - }, - true = - \cs_set:Npn \@@_relscale: - { \dim_eval:n { \box_ht:N \l_@@_slash_box } } - }, - scaling = - { - false = \cs_set_eq:NN \@@_fontscale: \prg_do_nothing:, - true = - \cs_set:Npn \@@_fontscale: - { - \fontsize - { \fp_to_dim:n { \l_@@_scale_factor_fp * \@@_relscale: } } - { \c_zero_dim } - \selectfont - } - }, - slash-left-kern = \l_@@_slash_left_sep_dim , - slash-left-mkern = \l_@@_slash_left_muskip , - slash-right-kern = \l_@@_slash_right_sep_dim , - slash-right-mkern = \l_@@_slash_right_muskip , - slash-symbol = \l_@@_slash_symbol_tl , - slash-symbol-font = \l_@@_slash_symbol_font_tl , - slash-symbol-format = \@@_slash_symbol_format:n , - v-scale = \l_@@_vscale_fp - } -% \end{macrocode} -% The implementation part starts with applying all of the settings -% from above. The first part of the set up is then to determine -% whether the surroundings are text or math(s), and react accordingly. -% \begin{macrocode} - { - \mode_if_math:TF - { - \cs_set_eq:NN \@@_text_or_math:n \text - \cs_set:Npe \@@_denominator_font_change: - { \tex_fam:D \l_@@_denominator_font_tl } - \cs_set:Npe \@@_numerator_font_change: - { \tex_fam:D \l_@@_numerator_font_tl } - \cs_set:Npe \@@_slash_symbol_font_change: - { \tex_fam:D \l_@@_slash_symbol_font_tl } - } - { - \cs_set_eq:NN \@@_text_or_math:n \mbox - \cs_set:Npn \@@_denominator_font_change: - { - \fontfamily { \l_@@_denominator_font_tl } - \selectfont - } - \cs_set:Npn \@@_numerator_font_change: - { - \fontfamily { \l_@@_numerator_font_tl } - \selectfont - } - \cs_set:Npn \@@_slash_symbol_font_change: - { - \fontfamily { \l_@@_slash_symbol_font_tl } - \selectfont - } - } -% \end{macrocode} -% Everything is now either inside \cs{text} or an \cs{mbox}, depending -% upon the surroundings. First, there are some boxes to set up. -% \begin{macrocode} - \@@_text_or_math:n - { - \m@th - \hbox_set:Nn \l_@@_tmp_box - { \@@_math:n { \vphantom { ( ) } } } - \hbox_set:Nn \l_@@_slash_box - { - \@@_math:n - { - \@@_slash_symbol_format:n - { - \@@_math:n - { - \@@_slash_symbol_font_change: - \IfNoValueTF {#2} - { \l_@@_slash_symbol_tl } {#2} - } - } - } - } -% \end{macrocode} -% Check on the numerator separator dimensions. The code starts with the -% assumption that neither has been given, as this can then be used to -% set up a default, which is also used when both values are set -% erroneously. -% \begin{macrocode} - \cs_set:Npn \@@_tmp:w - { - \raisebox - { - \dim_eval:n - { - \box_ht:N \l_@@_slash_box - - \box_dp:N \l_@@_slash_box - - \height - } - } - } - \dim_compare:nNnTF - { \l_@@_numerator_top_sep_dim } = { \c_max_dim } - { - \dim_compare:nNnF - { \l_@@_numerator_bot_sep_dim } = { \c_max_dim } - { - \cs_set:Npn \@@_tmp:w - { - \raisebox - { \dim_use:N \l_@@_numerator_bot_sep_dim } - } - } - } - { - \dim_compare:nNnTF - { \l_@@_numerator_bot_sep_dim } = { \c_max_dim } - { - \cs_set:Npn \@@_tmp:w - { - \raisebox - { - \dim_eval:n - { - \box_ht:N \l_@@_slash_box - - \dim_use:N \l_@@_numerator_top_sep_dim - - \height - } - } - } - } - { - \msg_error:nn { xfrac } - { over-specified-numerator-sep } - } - } -% \end{macrocode} -% Typeset the numerator. -% \begin{macrocode} - \@@_tmp:w - { - \@@_fontscale: - \@@_numerator_format:n - { - \scalebox - { \fp_use:N \l_@@_hscale_fp } - [ \fp_use:N \l_@@_vscale_fp ] - { - \@@_math:n - { - \@@_numerator_font_change: - { - \vphantom { \l_@@_phantom_tl } - #1 - } - } - } - } - } - \@@_math:n - { % THIS IS JUST WRONG! - \mode_if_math:TF - { \tex_mskip:D \l_@@_slash_right_muskip } - { \tex_hskip:D \l_@@_slash_right_sep_dim } - } -% \end{macrocode} -% Typeset the separator. -% \begin{macrocode} - \box_use:N \l_@@_slash_box - \@@_math:n - { - \mode_if_math:TF - { \tex_mskip:D \l_@@_slash_left_muskip } - { \tex_hskip:D \l_@@_slash_left_sep_dim } - } -% \end{macrocode} -% Typeset the denominator. -% \begin{macrocode} - \dim_compare:nNnTF - { \l_@@_denominator_bot_sep_dim } = { \c_max_dim } - { - \cs_set:Npn \@@_tmp:w - { \raisebox { - \box_dp:N \l_@@_slash_box } } - } - { - \cs_set:Npn \@@_tmp:w - { - \raisebox - { \dim_use:N \l_@@_denominator_bot_sep_dim } - } - } - \@@_tmp:w - { - \@@_fontscale: - \@@_denominator_format:n - { - \scalebox - { \fp_use:N \l_@@_hscale_fp } - [ \fp_use:N \l_@@_vscale_fp ] - { - \@@_math:n - { - \@@_denominator_font_change: - { - \vphantom { \l_@@_phantom_tl } - #3 - } - } - } - } - } - } - } -% \end{macrocode} -% -% Since math(s) and text mode are wildly different entities we define a -% separate template for each. You already saw the \enquote{text} -% template, and here is the \enquote{math} template. -% \begin{macrocode} -\DeclareRestrictedTemplate { xfrac } { text } { math } - { - numerator-font = \number \fam , - slash-symbol = / , - slash-symbol-font = \number \fam , - denominator-font = \number \fam , - scale-factor = 0.7 , - scale-relative = false , - scaling = true , - denominator-bot-sep = 0 pt , - math-mode = true , - phantom = ( % ) - } -% \end{macrocode} -% -%\subsection{The standard instances} -% -% For the default instances we just use the relevant templates with -% the default settings. -% -% The default \enquote{text} instance. -% \begin{macrocode} -\DeclareInstance { xfrac } { default } { text } { } -% \end{macrocode} -% -% The default \enquote{math(s)} instance. We annot set the -% |numerator-top-sep| in the restricted template above as it clashes -% with the requirements of the |plainmath| collection which comes next. -% \begin{macrocode} -\DeclareInstance { xfrac } { mathdefault } { math } - { numerator-top-sep = 0pt } -% \end{macrocode} -% -% \begin{macrocode} -\DeclareCollectionInstance { plainmath } { xfrac } { mathdefault } { math } - { - numerator-bot-sep = 0 pt , - numerator-top-sep = \c_max_dim , - scale-factor = 1 , - scale-relative = false , - scaling = true , - slash-right-mkern = 0 mu , - slash-left-mkern = 0 mu - } -% \end{macrocode} -% -% Default Computer Modern setup. Far from optimal, but better than -% nothing. -% \begin{macrocode} -\DeclareInstance { xfrac } { cmr } { text } - { - denominator-bot-sep = 0 pt , - numerator-top-sep = 0.2 ex , - slash-left-kern = -0.1 em , - slash-right-kern = -0.1 em - } -\DeclareInstance { xfrac } { cmss } { text } - { - denominator-bot-sep = 0 pt , - numerator-top-sep = 0.2 ex , - slash-left-kern = -0.1 em , - slash-right-kern = -0.1 em - } -\DeclareInstance { xfrac } { cmtt } { text } - { - denominator-bot-sep = 0 pt , - numerator-top-sep = 0.2 ex , - slash-left-kern = -0.1 em , - slash-right-kern = -0.1 em - } -% \end{macrocode} -% -% We can do better for the Computer Modern fonts. For cmr and cmss -% we choose Times, and for cmtt use Palatino. -% \begin{macrocode} -\bool_if:NF \l_@@_cm_std_bool - { - \DeclareInstance { xfrac } { cmr } { text } - { slash-symbol-font = ptm } - \DeclareInstance { xfrac } { cmss } { text } - { slash-symbol-font = ptm } - \DeclareInstance { xfrac } { cmtt } { text } - { slash-symbol-font = ppl } - } -% \end{macrocode} -% -% Things works slightly better with Latin Modern. -% \begin{macrocode} -\DeclareInstance { xfrac } { lmr } { text } - { - denominator-bot-sep = 0 pt , - numerator-top-sep = 0.1 ex , - slash-left-kern = -0.15 em , - slash-right-kern = -0.15 em - } -\DeclareInstance { xfrac } { lmss } { text } - { - denominator-bot-sep = 0 pt , - numerator-top-sep = 0 pt , - slash-left-kern = -0.15 em , - slash-right-kern = -0.15 em - } -\DeclareInstance { xfrac } { lmtt } { text } - { - denominator-bot-sep = 0 pt , - numerator-top-sep = 0 pt , - slash-left-kern = -0.15 em , - slash-right-kern = -0.15 em - } -% \end{macrocode} -% -% \subsection{The user command} -% -% \begin{macro}{\sfrac} -% Currently there is just a single user command. \cs{sfrac} takes -% two mandatory arguments: numerator and denominator. It can take an -% optional argument between the mandatory specifying the separator -% like this: -% \begin{verbatim} -% \sfrac{7}[/]{12} -% \end{verbatim} -% It also has an optional argument that comes before the first -% mandatory argument. If used it will use that instance instead of -% the auto-detected one, so a user who has defined the instance -% \enquote{cmr2} may use -% \begin{verbatim} -% \sfrac[cmr2]{7}{12} -% \end{verbatim} -% and get the settings from \enquote{cmr2} instead of the settings of -% the current font family. -% \begin{macrocode} -\NewDocumentCommand \sfrac { o m o m } - { - \mode_if_math:TF - { - \IfInstanceExistTF { xfrac } { mathfam \number \fam } - { \UseInstance { xfrac } { mathfam \number \fam } } - { \UseInstance { xfrac } { mathdefault } } - {#2} {#3} {#4} - } - { - \IfInstanceExistTF { xfrac } {#1} - { \UseInstance { xfrac } {#1} } - { - \IfInstanceExistTF { xfrac } { \f@family } - { \UseInstance { xfrac } { \f@family } } - { \UseInstance { xfrac } { default } } - } - {#2} {#3} {#4} - } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Messages} -% -% Just the one. -% \begin{macrocode} -\msg_new:nnnn { xfrac } { over-specified-numerator-sep } - { You~have~specified~both~"numerator-top-sep"~and~"numerator-bot-sep". } - { I~will~pretend~that~you~didn't~specify~either~of~them. } -% \end{macrocode} -% -% \begin{macrocode} -%</package> -% \end{macrocode} -% -% \end{implementation} -% -% \PrintIndex diff --git a/macros/latex/contrib/l3packages/xfrac.ins b/macros/latex/contrib/l3packages/xfrac.ins deleted file mode 100644 index 511e68c3c3..0000000000 --- a/macros/latex/contrib/l3packages/xfrac.ins +++ /dev/null @@ -1,49 +0,0 @@ -\iffalse meta-comment - -File: xfrac.ins - -Copyright (C) 2004,2008-2010 Morten Hoegholm - (C) 2011,2012,2016,2017,2019-2023 The LaTeX Project - -It may be distributed and/or modified under the conditions of the -LaTeX Project Public License (LPPL), either version 1.3c of this -license or (at your option) any later version. The latest version -of this license is in the file - - http://www.latex-project.org/lppl.txt - -This file is part of the "l3packages bundle" (The Work in LPPL) -and all files in that bundle must be distributed together. - -The released version of this bundle is available from CTAN. - -\fi - -\input docstrip % -\askforoverwritefalse - -\preamble - -Copyright (C) 2004,2008-2010 Morten Hoegholm - (C) 2011-2023 The LaTeX Project - -It may be distributed and/or modified under the conditions of -the LaTeX Project Public License (LPPL), either version 1.3c of -this license or (at your option) any later version. The latest -version of this license is in the file: - - http://www.latex-project.org/lppl.txt - -This file is part of the "l3packages bundle" (The Work in LPPL) -and all files in that bundle must be distributed together. - -\endpreamble -% stop docstrip adding \endinput -\postamble -\endpostamble - -\keepsilent - -\generate{\file{xfrac.sty} {\from{xfrac.dtx} {package}}} - -\endbatchfile diff --git a/macros/latex/contrib/l3packages/xfrac.pdf b/macros/latex/contrib/l3packages/xfrac.pdf Binary files differdeleted file mode 100644 index 61a472a901..0000000000 --- a/macros/latex/contrib/l3packages/xfrac.pdf +++ /dev/null diff --git a/macros/latex/contrib/l3packages/xparse.dtx b/macros/latex/contrib/l3packages/xparse.dtx index ba98987d7f..e701edada3 100644 --- a/macros/latex/contrib/l3packages/xparse.dtx +++ b/macros/latex/contrib/l3packages/xparse.dtx @@ -4,7 +4,7 @@ % % Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle % (C) 2004-2008 Frank Mittelbach, The LaTeX Project -% (C) 2009-2023 The LaTeX Project +% (C) 2009-2024 The LaTeX Project % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -55,7 +55,7 @@ % \begin{itemize}\def\makelabel##1{\hss\llap{\bfseries##1}}}{\end{itemize}} % % \title{^^A -% The \textsf{xparse} package\\ Document command parser^^A +% The \pkg{xparse} package\\ Document command parser^^A % } % % \author{^^A @@ -67,7 +67,7 @@ % }^^A % } % -% \date{Released 2023-10-10} +% \date{Released 2024-02-13} % % \maketitle % @@ -1064,7 +1064,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xparse}{2023-10-10}{} +\ProvidesExplPackage{xparse}{2024-02-13}{} {L3 Experimental document command parser} % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/xparse.ins b/macros/latex/contrib/l3packages/xparse.ins index d7973d49f7..9177c53dbc 100644 --- a/macros/latex/contrib/l3packages/xparse.ins +++ b/macros/latex/contrib/l3packages/xparse.ins @@ -2,7 +2,7 @@ File: xparse.ins -Copyright (C) 2000-2012,2016,2017,2019-2023 The LaTeX Project +Copyright (C) 2000-2012,2016,2017,2019-2024 The LaTeX Project It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of this @@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN. \preamble -Copyright (C) 2009-2023 The LaTeX Project +Copyright (C) 2009-2024 The LaTeX Project It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of diff --git a/macros/latex/contrib/l3packages/xparse.pdf b/macros/latex/contrib/l3packages/xparse.pdf Binary files differindex 483370f2fc..183ebaaa78 100644 --- a/macros/latex/contrib/l3packages/xparse.pdf +++ b/macros/latex/contrib/l3packages/xparse.pdf diff --git a/macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty b/macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty new file mode 100644 index 0000000000..a0a91afd81 --- /dev/null +++ b/macros/latex/contrib/l3packages/xtemplate-2023-10-10.sty @@ -0,0 +1,1371 @@ +%% +%% This is file `xtemplate-2023-10-10.sty', generated from +%% xtemplate.dtx (with options: `package' on 2023-11-14) +%% then adapted and frozen for compatibility. Development of +%% xtemplate.dtx will continue in the LaTeX2e kernel as lttemplates.dtx. +%% +%% Copyright (C) 2011-2023 The LaTeX Project +%% +%% It may be distributed and/or modified under the conditions of +%% the LaTeX Project Public License (LPPL), either version 1.3c of +%% this license or (at your option) any later version. The latest +%% version of this license is in the file: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% This file is part of the "l3packages bundle" (The Work in LPPL) +%% and all files in that bundle must be distributed together. +%% +%% File: xtemplate.dtx +\RequirePackage{expl3}[2018/02/21] +\@ifpackagelater{expl3}{2018/02/21} + {} + {% + \PackageError{xtemplate}{Support package l3kernel too old} + {% + Please install an up to date version of l3kernel\MessageBreak + using your TeX package manager or from CTAN.\MessageBreak + \MessageBreak + Loading xtemplate will abort!% + }% + \endinput + } +\ProvidesExplPackage{xtemplate}{2023-10-10}{} + {L3 Experimental prototype document functions} +\tl_const:Nn \c__xtemplate_code_root_tl { template~code~>~ } +\tl_const:Nn \c__xtemplate_defaults_root_tl { template~defaults~>~ } +\tl_const:Nn \c__xtemplate_instances_root_tl { template~instance~>~ } +\tl_const:Nn \c__xtemplate_keytypes_root_tl { template~key~types~>~ } +\tl_const:Nn \c__xtemplate_key_order_root_tl { template~key~order~>~ } +\tl_const:Nn \c__xtemplate_restrict_root_tl { template~restrictions~>~ } +\tl_const:Nn \c__xtemplate_values_root_tl { template~values~>~ } +\tl_const:Nn \c__xtemplate_vars_root_tl { template~vars~>~ } +\seq_const_from_clist:Nn \c__xtemplate_keytypes_arg_seq + { choice , function , instance } +\prop_new:N \g__xtemplate_object_type_prop +\tl_new:N \l__xtemplate_assignments_tl +\tl_new:N \l__xtemplate_collection_tl +\prop_new:N \l__xtemplate_collections_prop +\tl_new:N \l__xtemplate_default_tl +\bool_new:N \l__xtemplate_error_bool +\bool_new:N \l__xtemplate_global_bool +\bool_new:N \l__xtemplate_restrict_bool +\clist_new:N \l__xtemplate_restrict_clist +\tl_new:N \l__xtemplate_key_name_tl +\tl_new:N \l__xtemplate_keytype_tl +\tl_new:N \l__xtemplate_keytype_arg_tl +\tl_new:N \l__xtemplate_value_tl +\tl_new:N \l__xtemplate_var_tl +\prop_new:N \l__xtemplate_keytypes_prop +\seq_new:N \l__xtemplate_key_order_seq +\prop_new:N \l__xtemplate_values_prop +\prop_new:N \l__xtemplate_vars_prop +\clist_new:N \l__xtemplate_tmp_clist +\dim_new:N \l__xtemplate_tmp_dim +\int_new:N \l__xtemplate_tmp_int +\muskip_new:N \l__xtemplate_tmp_muskip +\skip_new:N \l__xtemplate_tmp_skip +\tl_new:N \l__xtemplate_tmp_tl +\scan_new:N \s__xtemplate_mark +\scan_new:N \s__xtemplate_stop +\quark_new:N \q__xtemplate_nil +\__kernel_quark_new_conditional:Nn \__xtemplate_quark_if_nil:N { F } +\cs_generate_variant:Nn \prop_get:NnNTF { No } +\cs_generate_variant:Nn \prop_get:NnNT { No } +\cs_generate_variant:Nn \prop_get:NnNF { No } +\cs_new_protected:Npn \__xtemplate_execute_if_arg_agree:nnT #1#2#3 + { + \prop_get:NnN \g__xtemplate_object_type_prop {#1} \l__xtemplate_tmp_tl + \int_compare:nNnTF {#2} = \l__xtemplate_tmp_tl + {#3} + { + \msg_error:nneee { xtemplate } + { argument-number-mismatch } {#1} { \l__xtemplate_tmp_tl } {#2} + } + } +\cs_new_protected:Npn \__xtemplate_execute_if_code_exist:nnT #1#2#3 + { + \cs_if_exist:cTF { \c__xtemplate_code_root_tl #1 / #2 } + {#3} + { + \msg_error:nnee { xtemplate } { no-template-code } + {#1} {#2} + } + } +\cs_new_protected:Npn \__xtemplate_execute_if_keytype_exist:nT #1#2 + { + \cs_if_exist:cTF { __xtemplate_store_value_ #1 :n } + {#2} + { \msg_error:nne { xtemplate } { unknown-keytype } {#1} } + } +\cs_generate_variant:Nn \__xtemplate_execute_if_keytype_exist:nT { o } +\cs_new_protected:Npn \__xtemplate_execute_if_type_exist:nT #1#2 + { + \prop_if_in:NnTF \g__xtemplate_object_type_prop {#1} + {#2} + { \msg_error:nne { xtemplate } { unknown-object-type } {#1} } + } +\cs_new_protected:Npn \__xtemplate_if_keys_exist:nnT #1#2#3 + { + \cs_if_exist:cTF { \c__xtemplate_keytypes_root_tl #1 / #2 } + {#3} + { + \msg_error:nnee { xtemplate } { unknown-template } + {#1} {#2} + } + } +\prg_new_conditional:Npnn \__xtemplate_if_key_value:n #1 { T , F , TF } + { + \str_if_eq:noTF { \KeyValue } { \tl_head:w #1 \q_nil \q_stop } + { \prg_return_true: } + { \prg_return_false: } + } +\cs_generate_variant:Nn \__xtemplate_if_key_value:nT { o } +\cs_generate_variant:Nn \__xtemplate_if_key_value:nF { o } +\cs_generate_variant:Nn \__xtemplate_if_key_value:nTF { o } +\prg_new_conditional:Npnn \__xtemplate_if_instance_exist:nnn #1#2#3 + { T, F, TF } + { + \cs_if_exist:cTF { \c__xtemplate_instances_root_tl #1 / #2 / #3 } + { \prg_return_true: } + { \prg_return_false: } + } +\prg_new_conditional:Npnn \__xtemplate_if_use_template:n #1 { TF } + { + \str_if_eq:noTF { \UseTemplate } { \tl_head:w #1 \q_nil \q_stop } + { \prg_return_true: } + { \prg_return_false: } +} +\cs_new_protected:Npn \__xtemplate_store_defaults:n #1 + { + \prop_gclear_new:c { \c__xtemplate_defaults_root_tl #1 } + \prop_gset_eq:cN { \c__xtemplate_defaults_root_tl #1 } + \l__xtemplate_values_prop + } +\cs_new_protected:Npn \__xtemplate_store_keytypes:n #1 + { + \prop_gclear_new:c { \c__xtemplate_keytypes_root_tl #1 } + \prop_gset_eq:cN { \c__xtemplate_keytypes_root_tl #1 } + \l__xtemplate_keytypes_prop + \seq_gclear_new:c { \c__xtemplate_key_order_root_tl #1 } + \seq_gset_eq:cN { \c__xtemplate_key_order_root_tl #1 } + \l__xtemplate_key_order_seq + } +\cs_new_protected:Npn \__xtemplate_store_values:n #1 + { + \prop_clear_new:c { \c__xtemplate_values_root_tl #1 } + \prop_set_eq:cN { \c__xtemplate_values_root_tl #1 } + \l__xtemplate_values_prop + } +\cs_new_protected:Npn \__xtemplate_store_restrictions:n #1 + { + \clist_gclear_new:c { \c__xtemplate_restrict_root_tl #1 } + \clist_gset_eq:cN { \c__xtemplate_restrict_root_tl #1 } + \l__xtemplate_restrict_clist + } +\cs_new_protected:Npn \__xtemplate_store_vars:n #1 + { + \prop_gclear_new:c { \c__xtemplate_vars_root_tl #1 } + \prop_gset_eq:cN { \c__xtemplate_vars_root_tl #1 } + \l__xtemplate_vars_prop + } +\cs_new_protected:Npn \__xtemplate_recover_defaults:n #1 + { + \prop_if_exist:cTF + { \c__xtemplate_defaults_root_tl #1 } + { + \prop_set_eq:Nc \l__xtemplate_values_prop + { \c__xtemplate_defaults_root_tl #1 } + } + { \prop_clear:N \l__xtemplate_values_prop } + } +\cs_new_protected:Npn \__xtemplate_recover_keytypes:n #1 + { + \prop_if_exist:cTF + { \c__xtemplate_keytypes_root_tl #1 } + { + \prop_set_eq:Nc \l__xtemplate_keytypes_prop + { \c__xtemplate_keytypes_root_tl #1 } + } + { \prop_clear:N \l__xtemplate_keytypes_prop } + \seq_if_exist:cTF { \c__xtemplate_key_order_root_tl #1 } + { + \seq_set_eq:Nc \l__xtemplate_key_order_seq + { \c__xtemplate_key_order_root_tl #1 } + } + { \seq_clear:N \l__xtemplate_key_order_seq } + } +\cs_new_protected:Npn \__xtemplate_recover_restrictions:n #1 + { + \clist_if_exist:cTF + { \c__xtemplate_restrict_root_tl #1 } + { + \clist_set_eq:Nc \l__xtemplate_restrict_clist + { \c__xtemplate_restrict_root_tl #1 } + } + { \clist_clear:N \l__xtemplate_restrict_clist } + } +\cs_new_protected:Npn \__xtemplate_recover_values:n #1 + { + \prop_if_exist:cTF + { \c__xtemplate_values_root_tl #1 } + { + \prop_set_eq:Nc \l__xtemplate_values_prop + { \c__xtemplate_values_root_tl #1 } + } + { \prop_clear:N \l__xtemplate_values_prop } + } +\cs_new_protected:Npn \__xtemplate_recover_vars:n #1 + { + \prop_if_exist:cTF + { \c__xtemplate_vars_root_tl #1 } + { + \prop_set_eq:Nc \l__xtemplate_vars_prop + { \c__xtemplate_vars_root_tl #1 } + } + { \prop_clear:N \l__xtemplate_vars_prop } + } +\cs_new_protected:Npn \__xtemplate_declare_object_type:nn #1#2 + { + \int_set:Nn \l__xtemplate_tmp_int {#2} + \int_compare:nTF { 0 <= \l__xtemplate_tmp_int <= 9 } + { + \msg_info:nnnV { xtemplate } { declare-object-type } + {#1} \l__xtemplate_tmp_int + \prop_gput:NnV \g__xtemplate_object_type_prop {#1} + \l__xtemplate_tmp_int + } + { + \msg_error:nnee { xtemplate } { bad-number-of-arguments } + {#1} { \exp_not:V \l__xtemplate_tmp_int } + } + } +\cs_new_protected:Npn \__xtemplate_declare_template_keys:nnnn #1#2#3#4 + { + \__xtemplate_execute_if_type_exist:nT {#1} + { + \__xtemplate_execute_if_arg_agree:nnT {#1} {#3} + { + \prop_clear:N \l__xtemplate_values_prop + \prop_clear:N \l__xtemplate_keytypes_prop + \seq_clear:N \l__xtemplate_key_order_seq + \keyval_parse:NNn + \__xtemplate_parse_keys_elt:n \__xtemplate_parse_keys_elt:nn {#4} + \__xtemplate_store_defaults:n { #1 / #2 } + \__xtemplate_store_keytypes:n { #1 / #2 } + } + } + } +\cs_new_protected:Npn \__xtemplate_parse_keys_elt:n #1 + { + \__xtemplate_split_keytype:n {#1} + \bool_if:NF \l__xtemplate_error_bool + { + \__xtemplate_execute_if_keytype_exist:oT \l__xtemplate_keytype_tl + { + \seq_map_function:NN \c__xtemplate_keytypes_arg_seq + \__xtemplate_parse_keys_elt_aux:n + \bool_if:NF \l__xtemplate_error_bool + { + \seq_if_in:NoTF \l__xtemplate_key_order_seq + \l__xtemplate_key_name_tl + { + \msg_error:nne { xtemplate } + { duplicate-key-interface } + { \l__xtemplate_key_name_tl } + } + { \__xtemplate_parse_keys_elt_aux: } + } + } + } + } +\cs_new_protected:Npn \__xtemplate_parse_keys_elt_aux:n #1 + { + \str_if_eq:onT \l__xtemplate_keytype_tl {#1} + { + \tl_if_empty:NT \l__xtemplate_keytype_arg_tl + { + \msg_error:nne { xtemplate } + { keytype-requires-argument } {#1} + \bool_set_true:N \l__xtemplate_error_bool + \seq_map_break: + } + } + } +\cs_new:Npn \__xtemplate_parse_keys_elt_aux: + { + \tl_set:Ne \l__xtemplate_tmp_tl + { + \l__xtemplate_keytype_tl + \tl_if_empty:NF \l__xtemplate_keytype_arg_tl + { { \l__xtemplate_keytype_arg_tl } } + } + \prop_put:Noo \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl + \l__xtemplate_tmp_tl + \seq_put_right:No \l__xtemplate_key_order_seq \l__xtemplate_key_name_tl + \str_if_eq:onT \l__xtemplate_keytype_tl { choice } + { + \exp_args:No \clist_if_in:nnT \l__xtemplate_keytype_arg_tl { unknown } + { \msg_error:nn { xtemplate } { choice-unknown-reserved } } + } + } +\cs_new_protected:Npn \__xtemplate_parse_keys_elt:nn #1#2 + { + \__xtemplate_parse_keys_elt:n {#1} + \use:c { __xtemplate_store_value_ \l__xtemplate_keytype_tl :n } {#2} + } +\cs_new_protected:Npe \__xtemplate_split_keytype:n #1 + { + \exp_not:N \bool_set_false:N \exp_not:N \l__xtemplate_error_bool + \tl_set:Nn \exp_not:N \l__xtemplate_tmp_tl {#1} + \tl_replace_all:Nnn \exp_not:N \l__xtemplate_tmp_tl { : } { \token_to_str:N : } + \tl_if_in:onTF \exp_not:N \l__xtemplate_tmp_tl { \token_to_str:N : } + { + \exp_not:n + { + \tl_clear:N \l__xtemplate_key_name_tl + \exp_after:wN \__xtemplate_split_keytype_aux:w + \l__xtemplate_tmp_tl \s__xtemplate_stop + } + } + { + \exp_not:N \bool_set_true:N \exp_not:N \l__xtemplate_error_bool + \msg_error:nne { xtemplate } { missing-keytype } {#1} + } + } +\use:e + { + \cs_new_protected:Npn \exp_not:N \__xtemplate_split_keytype_aux:w + #1 \token_to_str:N : #2 \s__xtemplate_stop + { + \tl_put_right:Ne \exp_not:N \l__xtemplate_key_name_tl + { + \exp_not:N \tl_trim_spaces:e + { \exp_not:N \tl_to_str:n {#1} } + } + \tl_if_in:nnTF {#2} { \token_to_str:N : } + { + \tl_put_right:Nn \exp_not:N \l__xtemplate_key_name_tl + { \token_to_str:N : } + \exp_not:N \__xtemplate_split_keytype_aux:w #2 \s__xtemplate_stop + } + { + \exp_not:N \tl_if_empty:NTF \exp_not:N \l__xtemplate_key_name_tl + { + \msg_error:nne { xtemplate } { empty-key-name } + { \token_to_str:N : #2 } + } + { \exp_not:N \__xtemplate_split_keytype_arg:n {#2} } + } + } + } +\cs_new_protected:Npn \__xtemplate_split_keytype_arg:n #1 + { + \tl_set:Ne \l__xtemplate_keytype_tl { \tl_trim_spaces:n {#1} } + \tl_clear:N \l__xtemplate_keytype_arg_tl + \cs_set_protected:Npn \__xtemplate_split_keytype_arg_aux:n ##1 + { + \tl_if_in:nnT {#1} {##1} + { + \cs_set:Npn \__xtemplate_split_keytype_arg_aux:w + ####1 ##1 ####2 \s__xtemplate_stop + { + \tl_if_blank:nT {####1} + { + \tl_set:Ne \l__xtemplate_keytype_tl + { \tl_trim_spaces:n {##1} } + \tl_if_blank:nF {####2} + { + \tl_set:Ne \l__xtemplate_keytype_arg_tl + { \use:n ####2 } + } + \seq_map_break: + } + } + \__xtemplate_split_keytype_arg_aux:w #1 \s__xtemplate_stop + } + } + \seq_map_function:NN \c__xtemplate_keytypes_arg_seq + \__xtemplate_split_keytype_arg_aux:n + } +\cs_generate_variant:Nn \__xtemplate_split_keytype_arg:n { o } +\cs_new:Npn \__xtemplate_split_keytype_arg_aux:n #1 { } +\cs_new:Npn \__xtemplate_split_keytype_arg_aux:w #1 \s__xtemplate_stop { } +\cs_new_protected:Npn \__xtemplate_store_value_boolean:n #1 + { \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1} } +\cs_new_protected:Npn \__xtemplate_store_value:n #1 + { \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#1} } +\cs_new_eq:NN \__xtemplate_store_value_choice:n \__xtemplate_store_value:n +\cs_new_eq:NN \__xtemplate_store_value_function:n \__xtemplate_store_value:n +\cs_new_eq:NN \__xtemplate_store_value_instance:n \__xtemplate_store_value:n +\cs_new_protected:Npn \__xtemplate_store_value_aux:Nn #1#2 + { \prop_put:Non \l__xtemplate_values_prop \l__xtemplate_key_name_tl {#2} } +\cs_new_protected:Npn \__xtemplate_store_value_integer:n + { \__xtemplate_store_value_aux:Nn \int_eval:n } +\cs_new_protected:Npn \__xtemplate_store_value_length:n + { \__xtemplate_store_value_aux:Nn \dim_eval:n } +\cs_new_protected:Npn \__xtemplate_store_value_muskip:n + { \__xtemplate_store_value_aux:Nn \muskip_eval:n } +\cs_new_protected:Npn \__xtemplate_store_value_real:n + { \__xtemplate_store_value_aux:Nn \fp_eval:n } +\cs_new_protected:Npn \__xtemplate_store_value_skip:n + { \__xtemplate_store_value_aux:Nn \skip_eval:n } +\cs_new_protected:Npn \__xtemplate_store_value_tokenlist:n + { \__xtemplate_store_value_aux:Nn \use:n } +\cs_new_eq:NN \__xtemplate_store_value_commalist:n \__xtemplate_store_value_tokenlist:n +\cs_new_protected:Npn \__xtemplate_declare_template_code:nnnnn #1#2#3#4#5 + { + \__xtemplate_execute_if_type_exist:nT {#1} + { + \__xtemplate_execute_if_arg_agree:nnT {#1}{#3} + { + \__xtemplate_if_keys_exist:nnT {#1} {#2} + { + \__xtemplate_store_key_implementation:nnn {#1} {#2} {#4} + \regex_match:nnTF { \c { AssignTemplateKeys } } {#5} + { \__xtemplate_declare_template_code:nnn { #1 / #2 } {#3} {#5} } + { + \__xtemplate_declare_template_code:nnn + { #1 / #2 } {#3} { \AssignTemplateKeys #5 } + } + } + } + } + } +\cs_new_protected:Npn \__xtemplate_declare_template_code:nnn #1#2#3 + { + \cs_generate_from_arg_count:cNnn + { \c__xtemplate_code_root_tl #1 } + \cs_gset_protected:Npn {#2} {#3} + } +\cs_new_protected:Npn \__xtemplate_store_key_implementation:nnn #1#2#3 + { + \__xtemplate_recover_defaults:n { #1 / #2 } + \__xtemplate_recover_restrictions:n { #1 / #2 } + \__xtemplate_recover_keytypes:n { #1 / #2 } + \prop_clear:N \l__xtemplate_vars_prop + \keyval_parse:nnn + { \__xtemplate_parse_vars_elt:n } { \__xtemplate_parse_vars_elt:nnn { #1 / #2 } } {#3} + \__xtemplate_store_vars:n { #1 / #2 } + \__xtemplate_store_restrictions:n { #1 / #2 } + \prop_map_inline:Nn \l__xtemplate_keytypes_prop + { + \msg_error:nneee { xtemplate } { key-not-implemented } + {##1} {#2} {#1} + } + } +\cs_new_protected:Npn \__xtemplate_parse_vars_elt:n #1 + { \msg_error:nne { xtemplate } { key-no-variable } {#1} } +\cs_new_protected:Npn \__xtemplate_parse_vars_elt:nnn #1#2#3 + { + \tl_set:Ne \l__xtemplate_key_name_tl + { \tl_trim_spaces:e { \tl_to_str:n {#2} } } + \prop_get:NoNTF + \l__xtemplate_keytypes_prop + \l__xtemplate_key_name_tl + \l__xtemplate_keytype_tl + { + \__xtemplate_split_keytype_arg:o \l__xtemplate_keytype_tl + \__xtemplate_parse_vars_elt_aux:nn {#1} {#3} + \prop_remove:NV \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl + } + { \msg_error:nne { xtemplate } { unknown-key } {#2} } + } +\cs_new_protected:Npn \__xtemplate_parse_vars_elt_aux:nn #1#2 + { + \__xtemplate_parse_vars_elt_aux:nw {#1} #2 global global \s__xtemplate_stop + } +\cs_new_protected:Npn \__xtemplate_parse_vars_elt_aux:nw + #1#2 global #3 global #4 \s__xtemplate_stop + { + \tl_if_blank:nTF {#4} + { \__xtemplate_parse_vars_elt_aux:nnn {#1} { } {#2} } + { + \tl_if_blank:nTF {#2} + { + \exp_args:Nnne \__xtemplate_parse_vars_elt_aux:nnn + {#1} { global } { \tl_trim_spaces:n {#3} } + } + { \msg_error:nnn { xtemplate } { bad-variable } { #2 global #3 } } + } + } +\cs_new_protected:Npn \__xtemplate_parse_vars_elt_aux:nnn #1#2#3 + { + \str_case:VnF \l__xtemplate_keytype_tl + { + { choice } { \__xtemplate_implement_choices:nn {#1} {#3} } + { function } + { + \cs_if_exist:NF #3 + { \cs_new:Npn #3 { } } + \__xtemplate_parse_vars_elt_key:nn {#1} + { + .code:n = + { + \cs_generate_from_arg_count:NNnn + \exp_not:N #3 + \exp_not:c + { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } + { \exp_not:o \l__xtemplate_keytype_arg_tl } + {##1} + } + } + \prop_put:Non \l__xtemplate_vars_prop + \l__xtemplate_key_name_tl {#2#3} + } + { instance } + { + \__xtemplate_parse_vars_elt_key:nn {#1} + { + .code:n = + { + \exp_not:c + { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } + \exp_not:N #3 { \UseInstance {##1} } + } + } + \prop_put:Non \l__xtemplate_vars_prop + \l__xtemplate_key_name_tl {#2#3} + } + } + { + \tl_if_single:nTF {#3} + { + \cs_if_exist:NF #3 + { \use:c { \__xtemplate_map_var_type: _new:N } #3 } + \__xtemplate_parse_vars_elt_key:nn {#1} + { + . \__xtemplate_map_var_type: + _ \str_if_eq:nnT {#1} { global } { g } set:N + = \exp_not:N #3 + } + \prop_put:Non \l__xtemplate_vars_prop + \l__xtemplate_key_name_tl {#2#3} + } + { \msg_error:nne { xtemplate } { bad-variable } { #2#3 } } + } + } +\cs_new_protected:Npn \__xtemplate_parse_vars_elt_key:nn #1#2 + { + \keys_define:ne { template / #1 } + { \l__xtemplate_key_name_tl #2 } + } +\cs_new:Npn \__xtemplate_map_var_type: + { + \str_case:on \l__xtemplate_keytype_tl + { + { boolean } { bool } + { commalist } { clist } + { integer } { int } + { length } { dim } + { muskip } { muskip } + { real } { fp } + { skip } { skip } + { tokenlist } { tl } + } + } +\cs_new_protected:Npn \__xtemplate_implement_choices:nn #1#2 + { + \clist_set:No \l__xtemplate_tmp_clist { \l__xtemplate_keytype_arg_tl } + \prop_put:Non \l__xtemplate_vars_prop \l__xtemplate_key_name_tl { } + \keys_define:ne { template / #1 } { \l__xtemplate_key_name_tl .choice: } + \keyval_parse:nnn + { \__xtemplate_implement_choice_elt:n } + { \__xtemplate_implement_choice_elt:nnn {#1} } + {#2} + \prop_get:NoNT \l__xtemplate_values_prop \l__xtemplate_key_name_tl + \l__xtemplate_tmp_tl + { \__xtemplate_implement_choices_default: } + \clist_if_empty:NF \l__xtemplate_tmp_clist + { + \clist_map_inline:Nn \l__xtemplate_tmp_clist + { + \msg_error:nne { xtemplate } { choice-not-implemented } + {##1} + } + } + } +\cs_new_protected:Npn \__xtemplate_implement_choices_default: + { + \tl_set:Ne \l__xtemplate_tmp_tl + { \l__xtemplate_key_name_tl \c_space_tl \l__xtemplate_tmp_tl } + \prop_if_in:NoF \l__xtemplate_vars_prop \l__xtemplate_tmp_tl + { + \tl_set:Ne \l__xtemplate_tmp_tl + { \l__xtemplate_key_name_tl \c_space_tl \l__xtemplate_tmp_tl } + \prop_if_in:NoF \l__xtemplate_vars_prop \l__xtemplate_tmp_tl + { + \prop_get:NoN \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl + \l__xtemplate_tmp_tl + \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl + \prop_get:NoN \l__xtemplate_values_prop \l__xtemplate_key_name_tl + \l__xtemplate_tmp_tl + \msg_error:nneee { xtemplate } { unknown-default-choice } + { \l__xtemplate_key_name_tl } { \l__xtemplate_key_name_tl } + { \l__xtemplate_keytype_arg_tl } + } + } + } +\cs_new_protected:Npn \__xtemplate_implement_choice_elt:nnn #1#2#3 + { + \clist_if_empty:NTF \l__xtemplate_tmp_clist + { + \str_if_eq:nnTF {#2} { unknown } + { \__xtemplate_implement_choice_elt_aux:nnn {#1} {#2} {#3} } + { + \prop_get:NoN \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl + \l__xtemplate_tmp_tl + \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl + \msg_error:nneee { xtemplate } { unknown-choice } + { \l__xtemplate_key_name_tl } {#2} + { \l__xtemplate_keytype_arg_tl } + } + } + { + \clist_if_in:NnTF \l__xtemplate_tmp_clist {#2} + { + \clist_remove_all:Nn \l__xtemplate_tmp_clist {#2} + \__xtemplate_implement_choice_elt_aux:nnn {#1} {#2} {#3} + } + { + \prop_get:NoN \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl + \l__xtemplate_tmp_tl + \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl + \msg_error:nneee { xtemplate } { unknown-choice } + { \l__xtemplate_key_name_tl } {#2} + { \l__xtemplate_keytype_arg_tl } + } + } + } +\cs_new_protected:Npn \__xtemplate_implement_choice_elt_aux:nnn #1#2#3 + { + \keys_define:ne { template / #1 } + { \l__xtemplate_key_name_tl / #2 .code:n = { \exp_not:n {#3} } } + \tl_set:Ne \l__xtemplate_tmp_tl + { \l__xtemplate_key_name_tl \c_space_tl #2 } + \prop_put:Non \l__xtemplate_vars_prop \l__xtemplate_tmp_tl {#3} + } +\cs_new_protected:Npn \__xtemplate_implement_choice_elt:n #1 + { + \msg_error:nneee { xtemplate } { choice-requires-code } + { \l__xtemplate_key_name_tl } {#1} + } +\cs_new_protected:Npn \__xtemplate_declare_restricted:nnnn #1#2#3#4 + { + \__xtemplate_if_keys_exist:nnT {#1} {#2} + { + \__xtemplate_set_template_eq:nn { #1 / #3 } { #1 / #2 } + \bool_set_true:N \l__xtemplate_restrict_bool + \__xtemplate_edit_defaults_aux:nnn {#1} {#3} {#4} + \bool_set_false:N \l__xtemplate_restrict_bool + } + } +\cs_new_protected:Npn \__xtemplate_edit_defaults:nnn + { + \bool_set_false:N \l__xtemplate_restrict_bool + \__xtemplate_edit_defaults_aux:nnn + } +\cs_new_protected:Npn \__xtemplate_edit_defaults_aux:nnn #1#2#3 + { + \__xtemplate_if_keys_exist:nnT {#1} {#2} + { + \__xtemplate_recover_defaults:n { #1 / #2 } + \__xtemplate_recover_restrictions:n { #1 / #2 } + \__xtemplate_parse_values:nn { #1 / #2 } {#3} + \__xtemplate_store_defaults:n { #1 / #2 } + \__xtemplate_store_restrictions:n { #1 / #2 } + } + } +\cs_new_protected:Npn \__xtemplate_parse_values:nn #1#2 + { + \clist_clear:N \l__xtemplate_restrict_clist + \__xtemplate_parse_values_aux:nn {#1} {#2} + } +\cs_new_protected:Npn \__xtemplate_parse_values_aux:nn #1#2 + { + \__xtemplate_recover_keytypes:n {#1} + \keyval_parse:NNn + \__xtemplate_parse_values_elt:n \__xtemplate_parse_values_elt:nn {#2} + } +\cs_new_protected:Npn \__xtemplate_parse_values_elt:n #1 + { + \bool_set_true:N \l__xtemplate_error_bool + \msg_error:nne { xtemplate } { key-no-value } {#1} + } +\cs_new_protected:Npn \__xtemplate_parse_values_elt:nn #1#2 + { + \tl_set:Ne \l__xtemplate_key_name_tl + { \tl_trim_spaces:e { \tl_to_str:n {#1} } } + \prop_get:NoNTF \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl + \l__xtemplate_tmp_tl + { + \bool_if:NTF \l__xtemplate_restrict_bool + { + \clist_if_in:NoF \l__xtemplate_restrict_clist + \l__xtemplate_key_name_tl + { \__xtemplate_parse_values_elt_aux:n {#2} } + } + { \__xtemplate_parse_values_elt_aux:n {#2} } + } + { + \msg_error:nne { xtemplate } { unknown-key } + { \l__xtemplate_key_name_tl } + } + } +\cs_new_protected:Npn \__xtemplate_parse_values_elt_aux:n #1 + { + \clist_put_right:No \l__xtemplate_restrict_clist \l__xtemplate_key_name_tl + \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl + \use:c { __xtemplate_store_value_ \l__xtemplate_keytype_tl :n } {#1} + } +\cs_new_protected:Npn \__xtemplate_set_template_eq:nn #1#2 + { + \__xtemplate_recover_defaults:n {#2} + \__xtemplate_store_defaults:n {#1} + \__xtemplate_recover_keytypes:n {#2} + \__xtemplate_store_keytypes:n {#1} + \__xtemplate_recover_vars:n {#2} + \__xtemplate_store_vars:n {#1} + \cs_gset_eq:cc { \c__xtemplate_code_root_tl #1 } + { \c__xtemplate_code_root_tl #2 } + } +\cs_new_protected:Npn \__xtemplate_declare_instance:nnnnn #1#2#3#4#5 + { + \__xtemplate_execute_if_code_exist:nnT {#1} {#2} + { + \__xtemplate_recover_defaults:n { #1 / #2 } + \__xtemplate_recover_restrictions:n { #1 / #2 } + \__xtemplate_recover_vars:n { #1 / #2 } + \__xtemplate_declare_instance_aux:nnnnn {#1} {#2} {#3} {#4} {#5} + } + } +\cs_new_protected:Npn \__xtemplate_declare_instance_aux:nnnnn #1#2#3#4#5 + { + \bool_set_false:N \l__xtemplate_error_bool + \__xtemplate_parse_values_aux:nn { #1 / #2 } {#5} + \bool_if:NF \l__xtemplate_error_bool + { + \prop_put:Nnn \l__xtemplate_values_prop { from~template } {#2} + \__xtemplate_store_values:n { #1 / #3 / #4 } + \__xtemplate_convert_to_assignments: + \cs_set_protected:cpe { \c__xtemplate_instances_root_tl #1 / #3 / #4 } + { + \exp_not:N \__xtemplate_assignments_push:n + { \exp_not:o \l__xtemplate_assignments_tl } + \exp_not:c { \c__xtemplate_code_root_tl #1 / #2 } + } + \__xtemplate_if_instance_exist:nnnF {#1} { } {#4} + { + \cs_set_eq:cc + { \c__xtemplate_instances_root_tl #1 / / #4 } + { \c__xtemplate_instances_root_tl #1 / #3 / #4 } + } + } + } +\cs_new_protected:Npn \__xtemplate_copy_instance:nnnn #1#2#3#4 + { + \__xtemplate_if_instance_exist:nnnTF {#1} {#2} {#3} + { + \__xtemplate_recover_values:n { #1 / #2 / #3 } + \__xtemplate_store_values:n { #1 / #2 / #4 } + \cs_set_eq:cc { \c__xtemplate_instances_root_tl #1 / #2 / #4 } + { \c__xtemplate_instances_root_tl #1 / #2 / #3 } + } + { + \msg_error:nnee { xtemplate } { unknown-instance } + {#1} {#3} + } + } +\cs_new_protected:Npn \__xtemplate_edit_instance:nnnn #1#2#3#4 + { + \__xtemplate_if_instance_exist:nnnTF {#1} {#2} {#3} + { + \__xtemplate_recover_values:n { #1 / #2 / #3 } + \prop_get:NnN \l__xtemplate_values_prop { from~template } + \l__xtemplate_tmp_tl + \__xtemplate_edit_instance_aux:nonnn {#1} \l__xtemplate_tmp_tl + {#2} {#3} {#4} + } + { + \msg_error:nnee { xtemplate } { unknown-instance } + {#1} {#3} + } + } +\cs_new_protected:Npn \__xtemplate_edit_instance_aux:nnnnn #1#2 + { + \__xtemplate_recover_vars:n { #1 / #2 } + \__xtemplate_declare_instance_aux:nnnnn {#1} {#2} + } +\cs_generate_variant:Nn \__xtemplate_edit_instance_aux:nnnnn { no } +\cs_new_protected:Npn \__xtemplate_convert_to_assignments: + { + \tl_clear:N \l__xtemplate_assignments_tl + \seq_map_function:NN \l__xtemplate_key_order_seq + \__xtemplate_convert_to_assignments_aux:n + } +\cs_new_protected:Npn \__xtemplate_convert_to_assignments_aux:n #1 + { + \prop_get:NnN \l__xtemplate_keytypes_prop {#1} \l__xtemplate_tmp_tl + \__xtemplate_convert_to_assignments_aux:no {#1} \l__xtemplate_tmp_tl + } +\cs_new_protected:Npn \__xtemplate_convert_to_assignments_aux:nn #1#2 + { + \prop_get:NnNT \l__xtemplate_values_prop {#1} \l__xtemplate_value_tl + { + \prop_get:NnNTF \l__xtemplate_vars_prop {#1} \l__xtemplate_var_tl + { + \__xtemplate_split_keytype_arg:n {#2} + \str_if_eq:onF \l__xtemplate_keytype_tl { choice } + { + \str_if_eq:onF \l__xtemplate_keytype_tl { code } + { \__xtemplate_find_global: } + } + \tl_set:Nn \l__xtemplate_key_name_tl {#1} + \use:c { __xtemplate_assign_ \l__xtemplate_keytype_tl : } + } + { \msg_error:nne { xtemplate } { unknown-attribute } {#1} } + } + } +\cs_generate_variant:Nn \__xtemplate_convert_to_assignments_aux:nn { no } +\cs_new_protected:Npn \__xtemplate_find_global: + { + \bool_set_false:N \l__xtemplate_global_bool + \tl_if_in:onT \l__xtemplate_var_tl { global } + { + \exp_after:wN \__xtemplate_find_global_aux:w \l__xtemplate_var_tl \s__xtemplate_stop + } + } +\cs_new_protected:Npn \__xtemplate_find_global_aux:w #1 global #2 \s__xtemplate_stop + { + \tl_set:Nn \l__xtemplate_var_tl {#2} + \bool_set_true:N \l__xtemplate_global_bool + } +\cs_new_protected:Npn \__xtemplate_use_template:nnn #1#2#3 + { + \__xtemplate_execute_if_code_exist:nnT {#1} {#2} + { + \__xtemplate_recover_defaults:n { #1 / #2 } + \__xtemplate_recover_vars:n { #1 / #2 } + \__xtemplate_parse_values:nn { #1 / #2 } {#3} + \__xtemplate_convert_to_assignments: + \use:c { \c__xtemplate_code_root_tl #1 / #2 } + } + } +\cs_new_protected:Npn \__xtemplate_assign_boolean: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_boolean_aux:n { bool_gset } } + { \__xtemplate_assign_boolean_aux:n { bool_set } } + } +\cs_new_protected:Npn \__xtemplate_assign_boolean_aux:n #1 + { + \__xtemplate_if_key_value:oTF \l__xtemplate_value_tl + { + \__xtemplate_key_to_value: + \tl_put_right:Ne \l__xtemplate_assignments_tl + { + \exp_not:c { #1 _eq:NN } + \exp_not:o \l__xtemplate_var_tl + \exp_not:o \l__xtemplate_value_tl + } + } + { + \tl_put_right:Ne \l__xtemplate_assignments_tl + { + \exp_not:c { #1 _ \l__xtemplate_value_tl :N } + \exp_not:o \l__xtemplate_var_tl + } + } + } +\cs_new_protected:Npn \__xtemplate_assign_choice: + { + \__xtemplate_assign_choice_aux:eF + { \l__xtemplate_key_name_tl \c_space_tl \l__xtemplate_value_tl } + { + \__xtemplate_assign_choice_aux:eF + { \l__xtemplate_key_name_tl \c_space_tl unknown } + { + \prop_get:NoN \l__xtemplate_keytypes_prop \l__xtemplate_key_name_tl + \l__xtemplate_tmp_tl + \__xtemplate_split_keytype_arg:o \l__xtemplate_tmp_tl + \msg_error:nneee { xtemplate } { unknown-choice } + { \l__xtemplate_key_name_tl } { \l__xtemplate_value_tl } + { \l__xtemplate_keytype_arg_tl } + } + } + } +\cs_new_protected:Npn \__xtemplate_assign_choice_aux:nF #1 + { + \prop_get:NnNTF + \l__xtemplate_vars_prop + {#1} + \l__xtemplate_tmp_tl + { \tl_put_right:No \l__xtemplate_assignments_tl \l__xtemplate_tmp_tl } + } +\cs_generate_variant:Nn \__xtemplate_assign_choice_aux:nF { e } +\cs_new_protected:Npn \__xtemplate_assign_function: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_function_aux:N \cs_gset:Npn } + { \__xtemplate_assign_function_aux:N \cs_set:Npn } + } +\cs_new_protected:Npn \__xtemplate_assign_function_aux:N #1 + { + \tl_put_right:Ne \l__xtemplate_assignments_tl + { + \cs_generate_from_arg_count:NNnn + \exp_not:o \l__xtemplate_var_tl + \exp_not:N #1 + { \exp_not:o \l__xtemplate_keytype_arg_tl } + { \exp_not:o \l__xtemplate_value_tl } + } + } +\cs_new_protected:Npn \__xtemplate_assign_instance: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_instance_aux:N \cs_gset_protected:Npn } + { \__xtemplate_assign_instance_aux:N \cs_set_protected:Npn } + } +\cs_new_protected:Npn \__xtemplate_assign_instance_aux:N #1 + { + \tl_put_right:Ne \l__xtemplate_assignments_tl + { + \exp_not:N #1 \exp_not:o \l__xtemplate_var_tl + { + \__xtemplate_use_instance:nn + { \exp_not:o \l__xtemplate_keytype_arg_tl } + { \exp_not:o \l__xtemplate_value_tl } + } + } + } +\cs_new_protected:Npn \__xtemplate_assign_integer: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_variable:N \int_gset:Nn } + { \__xtemplate_assign_variable:N \int_set:Nn } + } +\cs_new_protected:Npn \__xtemplate_assign_length: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_variable:N \dim_gset:Nn } + { \__xtemplate_assign_variable:N \dim_set:Nn } +} +\cs_new_protected:Npn \__xtemplate_assign_muskip: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_variable:N \muskip_gset:Nn } + { \__xtemplate_assign_variable:N \muskip_set:Nn } + } +\cs_new_protected:Npn \__xtemplate_assign_real: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_variable:N \fp_gset:Nn } + { \__xtemplate_assign_variable:N \fp_set:Nn } + } +\cs_new_protected:Npn \__xtemplate_assign_skip: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_variable:N \skip_gset:Nn } + { \__xtemplate_assign_variable:N \skip_set:Nn } + } +\cs_new_protected:Npn \__xtemplate_assign_tokenlist: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_tokenlist_aux:NN \tl_gset:NV \tl_gset:Nn } + { \__xtemplate_assign_tokenlist_aux:NN \tl_set:NV \tl_set:Nn } + } +\cs_new_protected:Npn \__xtemplate_assign_tokenlist_aux:NN #1#2 + { + \__xtemplate_if_key_value:oTF \l__xtemplate_value_tl + { + \__xtemplate_key_to_value: + \tl_put_right:Ne \l__xtemplate_assignments_tl + { + #1 \exp_not:o \l__xtemplate_var_tl + \exp_not:o \l__xtemplate_value_tl + } + } + { + \tl_put_right:Ne \l__xtemplate_assignments_tl + { + #2 \exp_not:o \l__xtemplate_var_tl + { \exp_not:o \l__xtemplate_value_tl } + } + } + } +\cs_new_protected:Npn \__xtemplate_assign_commalist: + { + \bool_if:NTF \l__xtemplate_global_bool + { \__xtemplate_assign_tokenlist_aux:NN \clist_gset:NV \clist_gset:Nn } + { \__xtemplate_assign_tokenlist_aux:NN \clist_set:NV \clist_set:Nn } + } +\cs_new_protected:Npn \__xtemplate_assign_variable:N #1 + { + \__xtemplate_if_key_value:oT \l__xtemplate_value_tl + { \__xtemplate_key_to_value: } + \tl_put_right:Ne \l__xtemplate_assignments_tl + { + #1 \exp_not:o \l__xtemplate_var_tl + { \exp_not:o \l__xtemplate_value_tl } + } + } +\cs_new_protected:Npn \__xtemplate_key_to_value: + { \exp_after:wN \__xtemplate_key_to_value_auxi:w \l__xtemplate_value_tl } +\cs_new_protected:Npn \__xtemplate_key_to_value_auxi:w \KeyValue #1 + { + \tl_set:Ne \l__xtemplate_tmp_tl { \tl_trim_spaces:e { \tl_to_str:n {#1} } } + \prop_get:NoNTF + \l__xtemplate_vars_prop + \l__xtemplate_tmp_tl + \l__xtemplate_value_tl + { + \exp_after:wN \__xtemplate_key_to_value_auxii:w \l__xtemplate_value_tl + \s__xtemplate_mark global \q__xtemplate_nil \s__xtemplate_stop + } + { + \msg_error:nne { xtemplate } { unknown-attribute } + { \l__xtemplate_tmp_tl } + } + } +\cs_new_protected:Npn \__xtemplate_key_to_value_auxii:w #1 global #2#3 \s__xtemplate_stop + { + \__xtemplate_quark_if_nil:NF #2 + { \tl_set:Nn \l__xtemplate_value_tl {#2} } + } +\cs_new_protected:Npn \__xtemplate_use_instance:nn #1#2 + { + \__xtemplate_if_use_template:nTF {#2} + { \__xtemplate_use_instance_aux:nNnnn {#1} #2 } + { \__xtemplate_use_instance_aux:nn {#1} {#2} } + } +\cs_new_protected:Npn \__xtemplate_use_instance_aux:nNnnn #1#2#3#4#5 + { + \str_if_eq:nnTF {#1} {#3} + { \__xtemplate_use_template:nnn {#3} {#4} {#5} } + { \msg_error:nnee { xtemplate } { type-mismatch } {#1} {#3} } +} +\cs_new_protected:Npn \__xtemplate_use_instance_aux:nn #1#2 + { + \__xtemplate_get_collection:n {#1} + \__xtemplate_if_instance_exist:nnnTF + {#1} { \l__xtemplate_collection_tl } {#2} + { + \use:c + { + \c__xtemplate_instances_root_tl #1 / + \l__xtemplate_collection_tl / #2 + } + } + { + \__xtemplate_if_instance_exist:nnnTF {#1} { } {#2} + { \use:c { \c__xtemplate_instances_root_tl #1 / / #2 } } + { + \msg_error:nnee { xtemplate } { unknown-instance } + {#1} {#2} + } + } + } +\cs_new_protected:Npn \__xtemplate_use_collection:nn #1#2 + { \prop_put:Nnn \l__xtemplate_collections_prop {#1} {#2} } +\cs_new_protected:Npn \__xtemplate_get_collection:n #1 + { + \prop_get:NnNF \l__xtemplate_collections_prop {#1} + \l__xtemplate_collection_tl + { \tl_clear:N \l__xtemplate_collection_tl } + } +\cs_new:Npn \__xtemplate_assignments_pop: { \l__xtemplate_assignments_tl } +\cs_new_protected:Npn \__xtemplate_assignments_push:n #1 + { \tl_set:Nn \l__xtemplate_assignments_tl {#1} } +\cs_new_protected:Npn \__xtemplate_show_code:nn #1#2 + { \cs_show:c { \c__xtemplate_code_root_tl #1 / #2 } } +\cs_new_protected:Npn \__xtemplate_show_defaults:nn #1#2 + { + \__xtemplate_if_keys_exist:nnT {#1} {#2} + { + \__xtemplate_recover_defaults:n { #1 / #2 } + \__xtemplate_show:Nnnn \l__xtemplate_values_prop + {#1} {#2} { default~values } + } + } +\cs_new_protected:Npn \__xtemplate_show_keytypes:nn #1#2 + { + \__xtemplate_if_keys_exist:nnT {#1} {#2} + { + \__xtemplate_recover_keytypes:n { #1 / #2 } + \__xtemplate_show:Nnnn \l__xtemplate_keytypes_prop + {#1} {#2} { interface } + } + } +\cs_new_protected:Npn \__xtemplate_show_vars:nn #1#2 + { + \__xtemplate_execute_if_code_exist:nnT {#1} {#2} + { + \__xtemplate_recover_vars:n { #1 / #2 } + \__xtemplate_show:Nnnn \l__xtemplate_vars_prop + {#1} {#2} { variable~mapping } + } + } +\cs_new_protected:Npn \__xtemplate_show:Nnnn #1#2#3#4 + { + \msg_show:nneeee { xtemplate } { show-attribute } + { \tl_to_str:n {#2} } + { \tl_to_str:n {#3} } + { \tl_to_str:n {#4} } + { \prop_map_function:NN #1 \msg_show_item_unbraced:nn } + } +\cs_new_protected:Npn \__xtemplate_show_values:nnn #1#2#3 + { + \__xtemplate_if_instance_exist:nnnT {#1} {#2} {#3} + { + \__xtemplate_recover_values:n { #1 / #2 / #3 } + \msg_show:nneeee { xtemplate } { show-values } + { \tl_to_str:n {#1} } + { \tl_to_str:n {#2} } + { \tl_to_str:n {#3} } + { + \prop_map_function:NN \l__xtemplate_values_prop + \msg_show_item_unbraced:nn + } + } + } +\msg_new:nnnn { xtemplate } { argument-number-mismatch } + { Object~type~'#1'~takes~#2~argument(s). } + { + Objects~of~type~'#1'~require~#2~argument(s).\\ + You~have~tried~to~make~a~template~for~'#1'~ + with~#3~argument(s),~which~is~not~possible:~ + the~number~of~arguments~must~agree. + } +\msg_new:nnnn { xtemplate } { bad-number-of-arguments } + { Bad~number~of~arguments~for~object~type~'#1'. } + { + An~object~may~accept~between~0~and~9~arguments.\\ + You~asked~to~use~#2~arguments:~this~is~not~supported. + } +\msg_new:nnnn { xtemplate } { bad-variable } + { Incorrect~variable~description~'#1'. } + { + The~argument~'#1'~is~not~of~the~form \\ + ~~'<variable>'\\ + ~or~\\ + ~~'global~<variable>'.\\ + It~must~be~given~in~one~of~these~formats~to~be~used~in~a~template. + } +\msg_new:nnnn { xtemplate } { choice-not-implemented } + { The~choice~'#1'~has~no~implementation. } + { + Each~choice~listed~in~the~interface~for~a~template~must~ + have~an~implementation. + } +\msg_new:nnnn { xtemplate } { choice-no-code } + { The~choice~'#1'~requires~implementation~details. } + { + When~creating~template~code~using~\DeclareTemplateCode,~ + each~choice~name~must~have~an~associated~implementation.\\ + This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. + } +\msg_new:nnnn { xtemplate } { choice-requires-code } + { The~choice~'#2'~for~key~'#1'~requires~an~implementation. } + { + You~should~have~put:\\ + \ \ #1~:~choice~{~#2 = <code> ~} \\ + but~LaTeX~did~not~find~any~<code>. + } +\msg_new:nnnn { xtemplate } { duplicate-key-interface } + { Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. } + { + Each~key~can~only~have~one~interface~declared~in~a~template.\\ + LaTeX~found~two~interfaces~for~'#1'. + } +\msg_new:nnnn { xtemplate } { keytype-requires-argument } + { The~key~type~'#1'~requires~an~argument~\msg_line_context:. } + { + You~should~have~put:\\ + \ \ <key-name>~:~#1~{~<argument>~} \\ + but~LaTeX~did~not~find~an~<argument>. + } +\msg_new:nnnn { xtemplate } { invalid-keytype } + { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } + { + Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\ + \ \ <key>~:~<key-type>\\ + LaTeX~could~not~find~a~<key-type>~in~your~input. + } +\msg_new:nnnn { xtemplate } { key-no-value } + { The~key~'#1'~has~no~value~\msg_line_context:. } + { + When~creating~an~instance~of~a~template~ + every~key~listed~must~include~a~value:\\ + \ \ <key>~=~<value> + } +\msg_new:nnnn { xtemplate } { key-no-variable } + { The~key~'#1'~requires~implementation~details~\msg_line_context:. } + { + When~creating~template~code~using~\DeclareTemplateCode,~ + each~key~name~must~have~an~associated~implementation.\\ + This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. + } +\msg_new:nnnn { xtemplate } { key-not-implemented } + { Key~'#1'~has~no~implementation~\msg_line_context:. } + { + The~definition~of~key~implementations~for~template~'#2'~ + of~object~type~'#3'~does~not~include~any~details~for~key~'#1'.\\ + The~key~was~declared~in~the~interface~definition,~ + and~so~an~implementation~is~required. + } +\msg_new:nnnn { xtemplate } { missing-keytype } + { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } + { + Key~interface~definitions~should~be~of~the~form\\ + \ \ #1~:~<key-type>\\ + but~LaTeX~could~not~find~a~<key-type>. + } +\msg_new:nnnn { xtemplate } { no-template-code } + { + The~template~'#2'~of~type~'#1'~is~unknown~ + or~has~no~implementation. + } + { + There~is~no~code~available~for~the~template~name~given.\\ + This~should~be~given~using~\DeclareTemplateCode. + } +\msg_new:nnnn { xtemplate } { object-type-mismatch } + { Object~types~'#1'~and~'#2'~do~not~agree. } + { + You~are~trying~to~use~a~template~directly~with~\UseInstance + (or~a~similar~function),~but~the~object~types~do~not~match. + } +\msg_new:nnnn { xtemplate } { unknown-attribute } + { The~template~attribute~'#1'~is~unknown. } + { + There~is~a~definition~in~the~current~template~reading\\ + \ \ \token_to_str:N \KeyValue {~#1~} \\ + but~there~is~no~key~called~'#1'. + } +\msg_new:nnnn { xtemplate } { unknown-choice } + { The~choice~'#2'~was~not~declared~for~key~'#1'. } + { + The~key~'#1'~takes~a~fixed~list~of~choices~ + and~this~list~does~not~include~'#2'. + } +\msg_new:nnnn { xtemplate } { unknown-default-choice } + { The~default~choice~'#2'~was~not~declared~for~key~'#1'. } + { + The~key~'#1'~takes~a~fixed~list~of~choices~ + and~this~list~does~not~include~'#2'. + } +\msg_new:nnnn { xtemplate } { unknown-instance } + { The~instance~'#2'~of~type~'#1'~is~unknown. } + { + You~have~asked~to~use~an~instance~'#2',~ + but~this~has~not~been~created. + } +\msg_new:nnnn { xtemplate } { unknown-key } + { Unknown~template~key~'#1'. } + { + The~key~'#1'~was~not~declared~in~the~interface~ + for~the~current~template. + } +\msg_new:nnnn { xtemplate } { unknown-keytype } + { The~key-type~'#1'~is~unknown. } + { + Valid~key-types~are:\\ + -~boolean;\\ + -~choice;\\ + -~commalist;\\ + -~function;\\ + -~instance;\\ + -~integer;\\ + -~length;\\ + -~muskip;\\ + -~real;\\ + -~skip;\\ + -~tokenlist. + } +\msg_new:nnnn { xtemplate } { unknown-object-type } + { The~object~type~'#1'~is~unknown. } + { + An~object~type~needs~to~be~declared~with~\DeclareObjectType + prior~to~using~it. + } +\msg_new:nnnn { xtemplate } { unknown-template } + { The~template~'#2'~of~type~'#1'~is~unknown. } + { + No~interface~has~been~declared~for~a~template~ + '#2'~of~object~type~'#1'. + } +\msg_new:nnn { xtemplate } { declare-object-type } + { Declaring~object~type~'#1'~taking~#2~argument(s)~\msg_line_context:. } +\msg_new:nnn { xtemplate } { declare-template-code } + { Declaring~code~for~template~'#2'~of~object~type'#1'~\msg_line_context:. } +\msg_new:nnn { xtemplate } { declare-template-interface } + { + Declaring~interface~for~template~'#2'~of~object~type~'#1'~ + \msg_line_context:. + } +\msg_new:nnn { xtemplate } { show-attribute } + { + The~template~'#2'~of~object~type~'#1'~has~ + \tl_if_empty:nTF {#4} { no~#3. } { #3 : #4 } + } +\msg_new:nnn { xtemplate } { show-values } + { + \tl_if_empty:nTF {#2} + { The~instance~'#3'~ } + { The~collection~ instance~'#3'~ (from~collection~'#2')~ } + of~object~type~'#1'~has~ + \tl_if_empty:nTF {#4} { no~values. } { values: #4 } + } +\cs_new_protected:Npn \DeclareObjectType #1#2 + { \__xtemplate_declare_object_type:nn {#1} {#2} } +\cs_new_protected:Npn \DeclareTemplateInterface #1#2#3#4 + { \__xtemplate_declare_template_keys:nnnn {#1} {#2} {#3} {#4} } +\cs_new_protected:Npn \DeclareTemplateCode #1#2#3#4#5 + { \__xtemplate_declare_template_code:nnnnn {#1} {#2} {#3} {#4} {#5} } +\cs_new_protected:Npn \DeclareRestrictedTemplate #1#2#3#4 + { \__xtemplate_declare_restricted:nnnn {#1} {#2} {#3} {#4} } +\cs_new_protected:Npn \DeclareInstance #1#2#3#4 + { \__xtemplate_declare_instance:nnnnn {#1} {#3} { } {#2} {#4} } +\cs_new_protected:Npn \DeclareCollectionInstance #1#2#3#4#5 + { \__xtemplate_declare_instance:nnnnn {#2} {#4} {#1} {#3} {#5} } +\cs_new_protected:Npn \DeclareInstanceCopy #1#2#3 + { \__xtemplate_copy_instance:nnnn {#1} { } {#3} {#2} } +\cs_new_protected:Npn \EditTemplateDefaults #1#2#3 + { \__xtemplate_edit_defaults:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \EditInstance #1#2#3 + { \__xtemplate_edit_instance:nnnn {#1} { } {#2} {#3} } +\cs_new_protected:Npn \EditCollectionInstance #1#2#3#4 + { \__xtemplate_edit_instance:nnnn {#2} {#1} {#3} {#4} } +\cs_new_protected:Npn \UseTemplate #1#2#3 + { \__xtemplate_use_template:nnn {#1} {#2} {#3} } +\cs_new_protected:Npn \UseInstance #1#2 + { \__xtemplate_use_instance:nn {#1} {#2} } +\cs_new_protected:Npn \UseCollection #1#2 + { \__xtemplate_use_collection:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateCode #1#2 + { \__xtemplate_show_code:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateDefaults #1#2 + { \__xtemplate_show_defaults:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateInterface #1#2 + { \__xtemplate_show_keytypes:nn {#1} {#2} } +\cs_new_protected:Npn \ShowTemplateVariables #1#2 + { \__xtemplate_show_vars:nn {#1} {#2} } +\cs_new_protected:Npn \ShowInstanceValues #1#2 + { \__xtemplate_show_values:nnn {#1} { } {#2} } +\cs_new_protected:Npn \ShowCollectionInstanceValues #1#2#3 + { \__xtemplate_show_values:nnn {#1} {#2} {#3} } +\cs_new:Npn \IfInstanceExistTF #1#2 + { \__xtemplate_if_instance_exist:nnnTF {#1} { } {#2} } +\cs_new:Npn \IfInstanceExistT #1#2 + { \__xtemplate_if_instance_exist:nnnT {#1} { } {#2} } +\cs_new:Npn \IfInstanceExistF #1#2 + { \__xtemplate_if_instance_exist:nnnF {#1} { } {#2} } +\cs_new_protected:Npn \KeyValue #1 {#1} +\cs_new_protected:Npn \AssignTemplateKeys + { \__xtemplate_assignments_pop: } +\cs_new_protected:Npn \SetTemplateKeys #1#2#3 + { \keys_set_known:nnN { template / #1 / #2 } {#3} \l__xtemplate_tmp_clist } +\cs_new_eq:NN \ShowTemplateKeytypes \ShowTemplateInterface +%% +%% +%% End of file `xtemplate.sty'. diff --git a/macros/latex/contrib/l3packages/xtemplate.dtx b/macros/latex/contrib/l3packages/xtemplate.dtx index 5080d94b0f..ee393ef3b3 100644 --- a/macros/latex/contrib/l3packages/xtemplate.dtx +++ b/macros/latex/contrib/l3packages/xtemplate.dtx @@ -4,7 +4,7 @@ % % Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle % (C) 2004-2010 Frank Mittelbach, The LaTeX Project -% (C) 2011-2023 The LaTeX Project +% (C) 2011-2024 The LaTeX Project %\ % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this @@ -24,23 +24,6 @@ % % for those people who are interested. % -%<*driver|package> -% The version of expl3 required is tested as early as possible, as -% some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2018/02/21] -%<package>\@ifpackagelater{expl3}{2018/02/21} -%<package> {} -%<package> {% -%<package> \PackageError{xtemplate}{Support package l3kernel too old} -%<package> {% -%<package> Please install an up to date version of l3kernel\MessageBreak -%<package> using your TeX package manager or from CTAN.\MessageBreak -%<package> \MessageBreak -%<package> Loading xtemplate will abort!% -%<package> }% -%<package> \endinput -%<package> } -%</driver|package> %<*driver> \documentclass[full]{l3doc} \usepackage{amstext} @@ -51,7 +34,7 @@ % \fi % % \title{^^A -% The \textsf{xtemplate} package\\ Prototype document functions^^A +% The \pkg{xtemplate} package\\ Prototype document functions^^A % } % % \author{^^A @@ -63,7 +46,7 @@ % }^^A % } % -% \date{Released 2023-10-10} +% \date{Released 2024-02-13} % % \maketitle % @@ -98,7 +81,7 @@ % \item Loading one of the many packages to customise certain elements of % the standard classes. % \item Loading a completely different document class, such as -% \textsf{KOMA-Script} or \textsf{memoir}, that allows easy customisation. +% \cls{KOMA-Script} or \cls{memoir}, that allows easy customisation. % \end{itemize} % All three of these approaches have their drawbacks and learning curves. % @@ -467,14 +450,6 @@ % the general idea of fixing some settings. % \end{function} % -% \begin{function}{\IfInstanceExistT, \IfInstanceExistF, \IfInstanceExistTF} -% \begin{syntax} -% \cs{IfInstanceExistTF} \Arg{object type} \Arg{instance} \Arg{true code} \Arg{false code} -% \end{syntax} -% Tests if the named \meta{instance} of a \meta{object type} exists, and -% then inserts the appropriate code into the input stream. -% \end{function} -% % \begin{function}{\DeclareInstanceCopy} % \begin{syntax} % \cs{DeclareInstanceCopy} @@ -707,2225 +682,35 @@ % \end{macrocode} % % \begin{macrocode} -%<@@=xtemplate> -% \end{macrocode} -% -% \begin{macrocode} -\ProvidesExplPackage{xtemplate}{2023-10-10}{} - {L3 Experimental prototype document functions} -% \end{macrocode} -% -% \subsection{Variables and constants} -% -% \begin{variable}{\c_@@_code_root_tl} -% \begin{variable}{\c_@@_defaults_root_tl} -% \begin{variable}{\c_@@_instances_root_tl} -% \begin{variable}{\c_@@_keytypes_root_tl} -% \begin{variable}{\c_@@_key_order_root_tl} -% \begin{variable}{\c_@@_restrict_root_tl} -% \begin{variable}{\c_@@_values_root_tl} -% \begin{variable}{\c_@@_vars_root_tl} -% So that literal values are kept to a minimum. -% \begin{macrocode} -\tl_const:Nn \c_@@_code_root_tl { template~code~>~ } -\tl_const:Nn \c_@@_defaults_root_tl { template~defaults~>~ } -\tl_const:Nn \c_@@_instances_root_tl { template~instance~>~ } -\tl_const:Nn \c_@@_keytypes_root_tl { template~key~types~>~ } -\tl_const:Nn \c_@@_key_order_root_tl { template~key~order~>~ } -\tl_const:Nn \c_@@_restrict_root_tl { template~restrictions~>~ } -\tl_const:Nn \c_@@_values_root_tl { template~values~>~ } -\tl_const:Nn \c_@@_vars_root_tl { template~vars~>~ } -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\c_@@_keytypes_arg_seq} -% A list of keytypes which also need additional data (an argument), -% used to parse the keytype correctly. We suspend debugging to allow -% an assignment to a constant. -% \begin{macrocode} -\seq_const_from_clist:Nn \c_@@_keytypes_arg_seq - { choice , function , instance } -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\g_@@_object_type_prop} -% For storing types and the associated number of arguments. -% \begin{macrocode} -\prop_new:N \g_@@_object_type_prop -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_assignments_tl} -% When creating an instance, the assigned values are collected here. -% \begin{macrocode} -\tl_new:N \l_@@_assignments_tl -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_collection_tl} -% The current instance collection name is stored here. -% \begin{macrocode} -\tl_new:N \l_@@_collection_tl -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_collections_prop} -% Lists current collection in force, indexed by object type. -% \begin{macrocode} -\prop_new:N \l_@@_collections_prop -% \end{macrocode} -% \end{variable} -% -% \begin{macro}{\l_@@_default_tl} -% The default value for a key is recovered here from the property list -% in which it is stored. The internal implementation of property lists -% means that this is safe even with un-escaped |#| tokens. -% \begin{macrocode} -\tl_new:N \l_@@_default_tl -% \end{macrocode} -%\ end{macro} -% -% \begin{variable}{\l_@@_error_bool} -% A flag for errors to be carried forward. -% \begin{macrocode} -\bool_new:N \l_@@_error_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_global_bool} -% Used to indicate that assignments should be global. -% \begin{macrocode} -\bool_new:N \l_@@_global_bool +%<@@=template> % \end{macrocode} -% \end{variable} % -% \begin{variable}{\l_@@_restrict_bool} -% A flag to indicate that a template is being restricted. -% \begin{macrocode} -\bool_new:N \l_@@_restrict_bool -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_restrict_clist} -% A scratch list for restricting templates. -% \begin{macrocode} -\clist_new:N \l_@@_restrict_clist -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\l_@@_key_name_tl} -% \begin{variable}{\l_@@_keytype_tl} -% \begin{variable}{\l_@@_keytype_arg_tl} -% \begin{variable}{\l_@@_value_tl} -% \begin{variable}{\l_@@_var_tl} -% When defining each key in a template, the name and type of the key -% need to be separated and stored. Any argument needed by the -% keytype is also stored separately. -% \begin{macrocode} -\tl_new:N \l_@@_key_name_tl -\tl_new:N \l_@@_keytype_tl -\tl_new:N \l_@@_keytype_arg_tl -\tl_new:N \l_@@_value_tl -\tl_new:N \l_@@_var_tl -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_keytypes_prop} -% \begin{variable}{\l_@@_key_order_seq} -% \begin{variable}{\l_@@_values_prop} -% \begin{variable}{\l_@@_vars_prop} -% To avoid needing too many difficult-to-follow csname assignments, -% various scratch token registers are used to build up data, which is -% then transferred -% \begin{macrocode} -\prop_new:N \l_@@_keytypes_prop -\seq_new:N \l_@@_key_order_seq -\prop_new:N \l_@@_values_prop -\prop_new:N \l_@@_vars_prop -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_tmp_clist} -% \begin{variable}{\l_@@_tmp_dim} -% \begin{variable}{\l_@@_tmp_int} -% \begin{variable}{\l_@@_tmp_muskip} -% \begin{variable}{\l_@@_tmp_skip} -% For pre-processing the data stored by \pkg{xtemplate}, a number of -% scratch variables are needed. The assignments are made to these in the -% first instance, unless evaluation is delayed. -% \begin{macrocode} -\clist_new:N \l_@@_tmp_clist -\dim_new:N \l_@@_tmp_dim -\int_new:N \l_@@_tmp_int -\muskip_new:N \l_@@_tmp_muskip -\skip_new:N \l_@@_tmp_skip -% \end{macrocode} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% \end{variable} -% -% \begin{variable}{\l_@@_tmp_tl} -% A scratch variable for comparisons and so on. -% \begin{macrocode} -\tl_new:N \l_@@_tmp_tl -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\s_@@_mark,\s_@@_stop} -% Internal scan marks. -% \begin{macrocode} -\scan_new:N \s_@@_mark -\scan_new:N \s_@@_stop -% \end{macrocode} -% \end{variable} -% -% \begin{variable}{\q_@@_nil} -% Internal quarks. -% \begin{macrocode} -\quark_new:N \q_@@_nil -% \end{macrocode} -% \end{variable} -% -% \begin{macro}[pTF]{\@@_quark_if_nil:n} -% Branching quark conditional. -% \begin{macrocode} -\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:N { F } -% \end{macrocode} -% \end{macro} -% -% \subsection{Variant of prop functions} -% -% \begin{macro}[TF]{\prop_get:NoN} -% In some cases, we need to expand the key, and get the corresponding -% value in a property list if it exists. -% \begin{macrocode} -\cs_generate_variant:Nn \prop_get:NnNTF { No } -\cs_generate_variant:Nn \prop_get:NnNT { No } -\cs_generate_variant:Nn \prop_get:NnNF { No } -% \end{macrocode} -% \end{macro} -% -% \subsection{Testing existence and validity} -% -% There are a number of checks needed for either the existence of -% a object type, template or instance. There are also some for the -% validity of a particular call. All of these are collected up here. -% -% \begin{macro}{\@@_execute_if_arg_agree:nnT} -% A test agreement between the number of arguments for the template -% type and that specified when creating a template. This is not done as a -% separate conditional for efficiency and better error message -% \begin{macrocode} -\cs_new_protected:Npn \@@_execute_if_arg_agree:nnT #1#2#3 - { - \prop_get:NnN \g_@@_object_type_prop {#1} \l_@@_tmp_tl - \int_compare:nNnTF {#2} = \l_@@_tmp_tl - {#3} - { - \msg_error:nneee { xtemplate } - { argument-number-mismatch } {#1} { \l_@@_tmp_tl } {#2} - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_execute_if_code_exist:nnT} -% A template is only fully declared if the code has been set up, -% which can be checked by looking for the template function itself. -% \begin{macrocode} -\cs_new_protected:Npn \@@_execute_if_code_exist:nnT #1#2#3 - { - \cs_if_exist:cTF { \c_@@_code_root_tl #1 / #2 } - {#3} - { - \msg_error:nnee { xtemplate } { no-template-code } - {#1} {#2} - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_execute_if_keytype_exist:nT} -% \begin{macro}{\@@_execute_if_keytype_exist:oT} -% The test for valid keytypes looks for a function to set up the key, -% which is part of the \enquote{code} side of the template definition. -% This avoids having different lists for the two parts of the process. -% \begin{macrocode} -\cs_new_protected:Npn \@@_execute_if_keytype_exist:nT #1#2 - { - \cs_if_exist:cTF { @@_store_value_ #1 :n } - {#2} - { \msg_error:nne { xtemplate } { unknown-keytype } {#1} } - } -\cs_generate_variant:Nn \@@_execute_if_keytype_exist:nT { o } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_execute_if_type_exist:nT} -% To check that a particular object type is valid. -% \begin{macrocode} -\cs_new_protected:Npn \@@_execute_if_type_exist:nT #1#2 - { - \prop_if_in:NnTF \g_@@_object_type_prop {#1} - {#2} - { \msg_error:nne { xtemplate } { unknown-object-type } {#1} } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_execute_if_keys_exist:nnT} -% To check that the keys for a template have been set up before trying -% to create any code, a simple check for the correctly-named keytype -% property list. -% \begin{macrocode} -\cs_new_protected:Npn \@@_if_keys_exist:nnT #1#2#3 - { - \cs_if_exist:cTF { \c_@@_keytypes_root_tl #1 / #2 } - {#3} - { - \msg_error:nnee { xtemplate } { unknown-template } - {#1} {#2} - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[TF]{\@@_if_key_value:n, \@@_if_key_value:o} -% Tests for the first token in a string being \cs{KeyValue}. -% \begin{macrocode} -\prg_new_conditional:Npnn \@@_if_key_value:n #1 { T , F , TF } - { - \str_if_eq:noTF { \KeyValue } { \tl_head:w #1 \q_nil \q_stop } - { \prg_return_true: } - { \prg_return_false: } - } -\cs_generate_variant:Nn \@@_if_key_value:nT { o } -\cs_generate_variant:Nn \@@_if_key_value:nF { o } -\cs_generate_variant:Nn \@@_if_key_value:nTF { o } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[TF]{\@@_if_instance_exist:nnn} -% Testing for an instance is collection dependent. -% \begin{macrocode} -\prg_new_conditional:Npnn \@@_if_instance_exist:nnn #1#2#3 - { T, F, TF } - { - \cs_if_exist:cTF { \c_@@_instances_root_tl #1 / #2 / #3 } - { \prg_return_true: } - { \prg_return_false: } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_if_use_template:nTF} -% Tests for the first token in a string being \cs{UseTemplate}. -% \begin{macrocode} -\prg_new_conditional:Npnn \@@_if_use_template:n #1 { TF } - { - \str_if_eq:noTF { \UseTemplate } { \tl_head:w #1 \q_nil \q_stop } - { \prg_return_true: } - { \prg_return_false: } -} -% \end{macrocode} -% \end{macro} -% -% \subsection{Saving and recovering property lists} -% -% The various property lists for templates have to be shuffled in -% and out of storage. -% -% \begin{macro}{\@@_store_defaults:n} -% \begin{macro}{\@@_store_keytypes:n} -% \begin{macro}{\@@_store_restrictions:n} -% \begin{macro}{\@@_store_values:n} -% \begin{macro}{\@@_store_vars:n} -% The defaults and keytypes are transferred from the scratch property -% lists to the \enquote{proper} lists for the template being created. -% \begin{macrocode} -\cs_new_protected:Npn \@@_store_defaults:n #1 - { - \prop_gclear_new:c { \c_@@_defaults_root_tl #1 } - \prop_gset_eq:cN { \c_@@_defaults_root_tl #1 } - \l_@@_values_prop - } -\cs_new_protected:Npn \@@_store_keytypes:n #1 - { - \prop_gclear_new:c { \c_@@_keytypes_root_tl #1 } - \prop_gset_eq:cN { \c_@@_keytypes_root_tl #1 } - \l_@@_keytypes_prop - \seq_gclear_new:c { \c_@@_key_order_root_tl #1 } - \seq_gset_eq:cN { \c_@@_key_order_root_tl #1 } - \l_@@_key_order_seq - } -\cs_new_protected:Npn \@@_store_values:n #1 - { - \prop_clear_new:c { \c_@@_values_root_tl #1 } - \prop_set_eq:cN { \c_@@_values_root_tl #1 } - \l_@@_values_prop - } -\cs_new_protected:Npn \@@_store_restrictions:n #1 - { - \clist_gclear_new:c { \c_@@_restrict_root_tl #1 } - \clist_gset_eq:cN { \c_@@_restrict_root_tl #1 } - \l_@@_restrict_clist - } -\cs_new_protected:Npn \@@_store_vars:n #1 - { - \prop_gclear_new:c { \c_@@_vars_root_tl #1 } - \prop_gset_eq:cN { \c_@@_vars_root_tl #1 } - \l_@@_vars_prop - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_recover_defaults:n} -% \begin{macro}{\@@_recover_keytypes:n} -% \begin{macro}{\@@_recover_restrictions:n} -% \begin{macro}{\@@_recover_values:n} -% \begin{macro}{\@@_recover_vars:n} -% Recovering the stored data for a template is rather less complex -% than storing it. All that happens is the data is transferred from -% the permanent to the scratch storage. However, we need to check the -% scratch storage does exist. -% \begin{macrocode} -\cs_new_protected:Npn \@@_recover_defaults:n #1 - { - \prop_if_exist:cTF - { \c_@@_defaults_root_tl #1 } - { - \prop_set_eq:Nc \l_@@_values_prop - { \c_@@_defaults_root_tl #1 } - } - { \prop_clear:N \l_@@_values_prop } - } -\cs_new_protected:Npn \@@_recover_keytypes:n #1 - { - \prop_if_exist:cTF - { \c_@@_keytypes_root_tl #1 } - { - \prop_set_eq:Nc \l_@@_keytypes_prop - { \c_@@_keytypes_root_tl #1 } - } - { \prop_clear:N \l_@@_keytypes_prop } - \seq_if_exist:cTF { \c_@@_key_order_root_tl #1 } - { - \seq_set_eq:Nc \l_@@_key_order_seq - { \c_@@_key_order_root_tl #1 } - } - { \seq_clear:N \l_@@_key_order_seq } - } -\cs_new_protected:Npn \@@_recover_restrictions:n #1 - { - \clist_if_exist:cTF - { \c_@@_restrict_root_tl #1 } - { - \clist_set_eq:Nc \l_@@_restrict_clist - { \c_@@_restrict_root_tl #1 } - } - { \clist_clear:N \l_@@_restrict_clist } - } -\cs_new_protected:Npn \@@_recover_values:n #1 - { - \prop_if_exist:cTF - { \c_@@_values_root_tl #1 } - { - \prop_set_eq:Nc \l_@@_values_prop - { \c_@@_values_root_tl #1 } - } - { \prop_clear:N \l_@@_values_prop } - } -\cs_new_protected:Npn \@@_recover_vars:n #1 - { - \prop_if_exist:cTF - { \c_@@_vars_root_tl #1 } - { - \prop_set_eq:Nc \l_@@_vars_prop - { \c_@@_vars_root_tl #1 } - } - { \prop_clear:N \l_@@_vars_prop } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \subsection{Creating new object types} -% -% \begin{macro}{\@@_declare_object_type:nn} -% Although the object type is the \enquote{top level} of the template -% system, it is actually very easy to implement. All that happens is that -% the number of arguments required is recorded, indexed by the name of the -% object type. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_object_type:nn #1#2 - { - \int_set:Nn \l_@@_tmp_int {#2} - \int_compare:nTF { 0 <= \l_@@_tmp_int <= 9 } - { - \msg_info:nnnV { xtemplate } { declare-object-type } - {#1} \l_@@_tmp_int - \prop_gput:NnV \g_@@_object_type_prop {#1} - \l_@@_tmp_int - } - { - \msg_error:nnee { xtemplate } { bad-number-of-arguments } - {#1} { \exp_not:V \l_@@_tmp_int } - } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Design part of template declaration} -% -% The \enquote{design} part of a template declaration defines the general -% behaviour of each key, and possibly a default value. However, it does -% not include the implementation. This means that what happens here is -% the two properties are saved to appropriate lists, which can then -% be used later to recover the information when implementing the keys. -% -% \begin{macro}{\@@_declare_template_keys:nnnn} -% The main function for the \enquote{design} part of creating a template -% starts by checking that the object type exists and that the number of -% arguments required agree. If that is all fine, then the two storage -% areas for defaults and keytypes are initialised. The mechanism is then -% set up for the \pkg{l3keys} module to actually parse the keys. -% Finally, the code hands of to the storage routine to save the parsed -% information properly. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_template_keys:nnnn #1#2#3#4 - { - \@@_execute_if_type_exist:nT {#1} - { - \@@_execute_if_arg_agree:nnT {#1} {#3} - { - \prop_clear:N \l_@@_values_prop - \prop_clear:N \l_@@_keytypes_prop - \seq_clear:N \l_@@_key_order_seq - \keyval_parse:NNn - \@@_parse_keys_elt:n \@@_parse_keys_elt:nn {#4} - \@@_store_defaults:n { #1 / #2 } - \@@_store_keytypes:n { #1 / #2 } - } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_keys_elt:n} -% \begin{macro}{\@@_parse_keys_elt_aux:n} -% \begin{macro}{\@@_parse_keys_elt_aux:} -% Processing the key part of the key--value pair is always carried out -% using this function, even if a value was found. First, the key name -% is separated from the keytype, and if necessary the keytype is -% separated into two parts. This information is then used to check that -% the keytype is valid, before storing the keytype (plus argument if -% necessary) as a property of the key name. The key name is also stored -% (in braces) in the token list to record the order the keys are defined -% in. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_keys_elt:n #1 - { - \@@_split_keytype:n {#1} - \bool_if:NF \l_@@_error_bool - { - \@@_execute_if_keytype_exist:oT \l_@@_keytype_tl - { - \seq_map_function:NN \c_@@_keytypes_arg_seq - \@@_parse_keys_elt_aux:n - \bool_if:NF \l_@@_error_bool - { - \seq_if_in:NoTF \l_@@_key_order_seq - \l_@@_key_name_tl - { - \msg_error:nne { xtemplate } - { duplicate-key-interface } - { \l_@@_key_name_tl } - } - { \@@_parse_keys_elt_aux: } - } - } - } - } -\cs_new_protected:Npn \@@_parse_keys_elt_aux:n #1 - { - \str_if_eq:onT \l_@@_keytype_tl {#1} - { - \tl_if_empty:NT \l_@@_keytype_arg_tl - { - \msg_error:nne { xtemplate } - { keytype-requires-argument } {#1} - \bool_set_true:N \l_@@_error_bool - \seq_map_break: - } - } - } -\cs_new:Npn \@@_parse_keys_elt_aux: - { - \tl_set:Ne \l_@@_tmp_tl - { - \l_@@_keytype_tl - \tl_if_empty:NF \l_@@_keytype_arg_tl - { { \l_@@_keytype_arg_tl } } - } - \prop_put:Noo \l_@@_keytypes_prop \l_@@_key_name_tl - \l_@@_tmp_tl - \seq_put_right:No \l_@@_key_order_seq \l_@@_key_name_tl - \str_if_eq:onT \l_@@_keytype_tl { choice } - { - \exp_args:No \clist_if_in:nnT \l_@@_keytype_arg_tl { unknown } - { \msg_error:nn { xtemplate } { choice-unknown-reserved } } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_parse_keys_elt:nn} -% For keys which have a default, the keytype and key name are first -% separated out by the \cs{@@_parse_keys_elt:n} -% routine, before storing the default value in the scratch property list. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_keys_elt:nn #1#2 - { - \@@_parse_keys_elt:n {#1} - \use:c { @@_store_value_ \l_@@_keytype_tl :n } {#2} - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_split_keytype:n} -% \begin{macro}{\@@_split_keytype_aux:w} -% The keytype and key name should be separated by |:|. As the -% definition might be given inside or outside of a code block, -% the category code of colons is standardised. After -% that, the standard delimited argument method is used to separate the -% two parts. -% \begin{macrocode} -\cs_new_protected:Npe \@@_split_keytype:n #1 - { - \exp_not:N \bool_set_false:N \exp_not:N \l_@@_error_bool - \tl_set:Nn \exp_not:N \l_@@_tmp_tl {#1} - \tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl { : } { \token_to_str:N : } - \tl_if_in:onTF \exp_not:N \l_@@_tmp_tl { \token_to_str:N : } - { - \exp_not:n - { - \tl_clear:N \l_@@_key_name_tl - \exp_after:wN \@@_split_keytype_aux:w - \l_@@_tmp_tl \s_@@_stop - } - } - { - \exp_not:N \bool_set_true:N \exp_not:N \l_@@_error_bool - \msg_error:nne { xtemplate } { missing-keytype } {#1} - } - } -\use:e - { - \cs_new_protected:Npn \exp_not:N \@@_split_keytype_aux:w - #1 \token_to_str:N : #2 \s_@@_stop - { - \tl_put_right:Ne \exp_not:N \l_@@_key_name_tl - { - \exp_not:N \tl_trim_spaces:e - { \exp_not:N \tl_to_str:n {#1} } - } - \tl_if_in:nnTF {#2} { \token_to_str:N : } - { - \tl_put_right:Nn \exp_not:N \l_@@_key_name_tl - { \token_to_str:N : } - \exp_not:N \@@_split_keytype_aux:w #2 \s_@@_stop - } - { - \exp_not:N \tl_if_empty:NTF \exp_not:N \l_@@_key_name_tl - { - \msg_error:nne { xtemplate } { empty-key-name } - { \token_to_str:N : #2 } - } - { \exp_not:N \@@_split_keytype_arg:n {#2} } - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_split_keytype_arg:n, \@@_split_keytype_arg:o} -% \begin{macro}{\@@_split_keytype_arg_aux:n} -% \begin{macro}{\@@_split_keytype_arg_aux:w} -% The second stage of sorting out the keytype is to check for an -% argument. As there is no convenient delimiting token to look for, -% a check is made instead for each possible text value for the keytype. -% To keep things faster, this only involves the keytypes that need an -% argument. If a match is made, then a check is also needed to see that -% it is at the start of the keytype information. All being well, the -% split can then be applied. Any non-matching keytypes are assumed to -% be \enquote{correct} as given, and are left alone (this is checked by -% other code). -% \begin{macrocode} -\cs_new_protected:Npn \@@_split_keytype_arg:n #1 - { - \tl_set:Ne \l_@@_keytype_tl { \tl_trim_spaces:n {#1} } - \tl_clear:N \l_@@_keytype_arg_tl - \cs_set_protected:Npn \@@_split_keytype_arg_aux:n ##1 - { - \tl_if_in:nnT {#1} {##1} - { - \cs_set:Npn \@@_split_keytype_arg_aux:w - ####1 ##1 ####2 \s_@@_stop - { - \tl_if_blank:nT {####1} - { - \tl_set:Ne \l_@@_keytype_tl - { \tl_trim_spaces:n {##1} } - \tl_if_blank:nF {####2} - { - \tl_set:Ne \l_@@_keytype_arg_tl - { \use:n ####2 } - } - \seq_map_break: - } - } - \@@_split_keytype_arg_aux:w #1 \s_@@_stop - } - } - \seq_map_function:NN \c_@@_keytypes_arg_seq - \@@_split_keytype_arg_aux:n - } -\cs_generate_variant:Nn \@@_split_keytype_arg:n { o } -\cs_new:Npn \@@_split_keytype_arg_aux:n #1 { } -\cs_new:Npn \@@_split_keytype_arg_aux:w #1 \s_@@_stop { } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \subsubsection{Storing values} -% -% As \pkg{xtemplate} pre-processes key values for efficiency reasons, -% there is a need to convert the values given as defaults into -% \enquote{ready to use} data. The same general idea is true when an instance -% is declared. However, assignments are not made until an instance is -% used, and so there has to be some intermediate storage. Furthermore, -% the ability to delay evaluation of results is needed. To achieve these -% aims, a series of \enquote{process and store} functions are defined here. -% -% All of the information about the key (the key name and the keytype) -% is already stored as variables. The same property list is always used -% to store the data, meaning that the only argument required is the -% value to be processed and potentially stored. -% -% \begin{macro}{\@@_store_value_boolean:n} -% \begin{macrocode} -\cs_new_protected:Npn \@@_store_value_boolean:n #1 - { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_store_value:n, \@@_store_value_choice:n, -% \@@_store_value_function:n, \@@_store_value_instance:n} -% With no need to worry about delayed evaluation, these keytypes all -% just store the input directly. -% \begin{macrocode} -\cs_new_protected:Npn \@@_store_value:n #1 - { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#1} } -\cs_new_eq:NN \@@_store_value_choice:n \@@_store_value:n -\cs_new_eq:NN \@@_store_value_function:n \@@_store_value:n -\cs_new_eq:NN \@@_store_value_instance:n \@@_store_value:n -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_store_value_aux:Nn, \@@_store_value_integer:n, -% \@@_store_value_length:n, \@@_store_value_muskip:n, -% \@@_store_value_real:n, \@@_store_value_skip:n, -% \@@_store_value_tokenlist:n, \@@_store_value_commalist:n} -% Storing values in \cs{l_@@_values_prop} is in most cases the same. -% \begin{macrocode} -\cs_new_protected:Npn \@@_store_value_aux:Nn #1#2 - { \prop_put:Non \l_@@_values_prop \l_@@_key_name_tl {#2} } -\cs_new_protected:Npn \@@_store_value_integer:n - { \@@_store_value_aux:Nn \int_eval:n } -\cs_new_protected:Npn \@@_store_value_length:n - { \@@_store_value_aux:Nn \dim_eval:n } -\cs_new_protected:Npn \@@_store_value_muskip:n - { \@@_store_value_aux:Nn \muskip_eval:n } -\cs_new_protected:Npn \@@_store_value_real:n - { \@@_store_value_aux:Nn \fp_eval:n } -\cs_new_protected:Npn \@@_store_value_skip:n - { \@@_store_value_aux:Nn \skip_eval:n } -\cs_new_protected:Npn \@@_store_value_tokenlist:n - { \@@_store_value_aux:Nn \use:n } -\cs_new_eq:NN \@@_store_value_commalist:n \@@_store_value_tokenlist:n -% \end{macrocode} -% \end{macro} -% -% \subsection{Implementation part of template declaration} -% -% \begin{macro}{\@@_declare_template_code:nnnnn} -% \begin{macro}{\@@_declare_template_code:nnn} -% The main function for implementing a template starts with a couple of -% simple checks to make sure that there are no obvious mistakes: the -% number of arguments must agree and the template keys must have been -% declared. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_template_code:nnnnn #1#2#3#4#5 - { - \@@_execute_if_type_exist:nT {#1} - { - \@@_execute_if_arg_agree:nnT {#1}{#3} - { - \@@_if_keys_exist:nnT {#1} {#2} - { - \@@_store_key_implementation:nnn {#1} {#2} {#4} - \regex_match:nnTF { \c { AssignTemplateKeys } } {#5} - { \@@_declare_template_code:nnn { #1 / #2 } {#3} {#5} } - { - \@@_declare_template_code:nnn - { #1 / #2 } {#3} { \AssignTemplateKeys #5 } - } - } - } - } - } -\cs_new_protected:Npn \@@_declare_template_code:nnn #1#2#3 - { - \cs_generate_from_arg_count:cNnn - { \c_@@_code_root_tl #1 } - \cs_gset_protected:Npn {#2} {#3} - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_store_key_implementation:nnn} -% Actually storing the implementation part of a template is quite easy -% as it only requires the list of keys given to be turned into a -% property list. There is also some error-checking to do, hence the need -% to have the list of defined keytypes available. In certain cases -% (when choices are involved) parsing the key results in changes to the -% default values. That is why they are loaded and then saved again. -% \begin{macrocode} -\cs_new_protected:Npn \@@_store_key_implementation:nnn #1#2#3 - { - \@@_recover_defaults:n { #1 / #2 } - \@@_recover_restrictions:n { #1 / #2 } - \@@_recover_keytypes:n { #1 / #2 } - \prop_clear:N \l_@@_vars_prop - \keyval_parse:nnn - { \@@_parse_vars_elt:n } { \@@_parse_vars_elt:nnn { #1 / #2 } } {#3} - \@@_store_vars:n { #1 / #2 } - \@@_store_restrictions:n { #1 / #2 } - \prop_map_inline:Nn \l_@@_keytypes_prop - { - \msg_error:nneee { xtemplate } { key-not-implemented } - {##1} {#2} {#1} - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_vars_elt:n} -% At the implementation stage, every key must have a value given. So -% this is an error function. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_vars_elt:n #1 - { \msg_error:nne { xtemplate } { key-no-variable } {#1} } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_vars_elt:nnn} -% The actual storage part here is very simple: the storage bin name -% is placed into the property list. At the same time, a comparison is -% made with the keytypes defined earlier: if there is a mismatch then -% an error is raised. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_vars_elt:nnn #1#2#3 - { - \tl_set:Ne \l_@@_key_name_tl - { \tl_trim_spaces:e { \tl_to_str:n {#2} } } - \prop_get:NoNTF - \l_@@_keytypes_prop - \l_@@_key_name_tl - \l_@@_keytype_tl - { - \@@_split_keytype_arg:o \l_@@_keytype_tl - \@@_parse_vars_elt_aux:nn {#1} {#3} - \prop_remove:NV \l_@@_keytypes_prop \l_@@_key_name_tl - } - { \msg_error:nne { xtemplate } { unknown-key } {#2} } - } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\@@_parse_vars_elt_aux:nn} -% \begin{macro}{\@@_parse_vars_elt_aux:nw} -% \begin{macro}{\@@_parse_vars_elt_aux:nnn} -% \begin{macro}{\@@_parse_vars_elt_key:nn} -% Split off any leading \texttt{global} and they look for the way to -% implement. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_vars_elt_aux:nn #1#2 - { - \@@_parse_vars_elt_aux:nw {#1} #2 global global \s_@@_stop - } -\cs_new_protected:Npn \@@_parse_vars_elt_aux:nw - #1#2 global #3 global #4 \s_@@_stop - { - \tl_if_blank:nTF {#4} - { \@@_parse_vars_elt_aux:nnn {#1} { } {#2} } - { - \tl_if_blank:nTF {#2} - { - \exp_args:Nnne \@@_parse_vars_elt_aux:nnn - {#1} { global } { \tl_trim_spaces:n {#3} } - } - { \msg_error:nnn { xtemplate } { bad-variable } { #2 global #3 } } - } - } -\cs_new_protected:Npn \@@_parse_vars_elt_aux:nnn #1#2#3 - { - \str_case:VnF \l_@@_keytype_tl - { - { choice } { \@@_implement_choices:nn {#1} {#3} } - { function } - { - \cs_if_exist:NF #3 - { \cs_new:Npn #3 { } } - \@@_parse_vars_elt_key:nn {#1} - { - .code:n = - { - \cs_generate_from_arg_count:NNnn - \exp_not:N #3 - \exp_not:c - { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } - { \exp_not:o \l_@@_keytype_arg_tl } - {##1} - } - } - \prop_put:Non \l_@@_vars_prop - \l_@@_key_name_tl {#2#3} - } - { instance } - { - \@@_parse_vars_elt_key:nn {#1} - { - .code:n = - { - \exp_not:c - { cs_ \str_if_eq:nnT {#1} { global } { g } set:Npn } - \exp_not:N #3 { \UseInstance {##1} } - } - } - \prop_put:Non \l_@@_vars_prop - \l_@@_key_name_tl {#2#3} - } - } - { - \tl_if_single:nTF {#3} - { - \cs_if_exist:NF #3 - { \use:c { \@@_map_var_type: _new:N } #3 } - \@@_parse_vars_elt_key:nn {#1} - { - . \@@_map_var_type: - _ \str_if_eq:nnT {#1} { global } { g } set:N - = \exp_not:N #3 - } - \prop_put:Non \l_@@_vars_prop - \l_@@_key_name_tl {#2#3} - } - { \msg_error:nne { xtemplate } { bad-variable } { #2#3 } } - } - } -\cs_new_protected:Npn \@@_parse_vars_elt_key:nn #1#2 - { - \keys_define:ne { template / #1 } - { \l_@@_key_name_tl #2 } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}[EXP]{\@@_map_var_type:} -% Turn a \enquote{friendly} variable type into an \texttt{expl3} one. -% \begin{macrocode} -\cs_new:Npn \@@_map_var_type: - { - \str_case:on \l_@@_keytype_tl - { - { boolean } { bool } - { commalist } { clist } - { integer } { int } - { length } { dim } - { muskip } { muskip } - { real } { fp } - { skip } { skip } - { tokenlist } { tl } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_implement_choices:nn} -% \begin{macro}{\@@_implement_choices_default:} -% Implementing choices requires a second key--value loop. So after a -% little set-up, the standard parser is called. -% \begin{macrocode} -\cs_new_protected:Npn \@@_implement_choices:nn #1#2 - { - \clist_set:No \l_@@_tmp_clist { \l_@@_keytype_arg_tl } - \prop_put:Non \l_@@_vars_prop \l_@@_key_name_tl { } - \keys_define:ne { template / #1 } { \l_@@_key_name_tl .choice: } - \keyval_parse:nnn - { \@@_implement_choice_elt:n } - { \@@_implement_choice_elt:nnn {#1} } - {#2} - \prop_get:NoNT \l_@@_values_prop \l_@@_key_name_tl - \l_@@_tmp_tl - { \@@_implement_choices_default: } - \clist_if_empty:NF \l_@@_tmp_clist - { - \clist_map_inline:Nn \l_@@_tmp_clist - { - \msg_error:nne { xtemplate } { choice-not-implemented } - {##1} - } - } - } -% \end{macrocode} -% A sanity check for the default value, so that an error is raised -% now and not when converting to assignments. -% \begin{macrocode} -\cs_new_protected:Npn \@@_implement_choices_default: - { - \tl_set:Ne \l_@@_tmp_tl - { \l_@@_key_name_tl \c_space_tl \l_@@_tmp_tl } - \prop_if_in:NoF \l_@@_vars_prop \l_@@_tmp_tl - { - \tl_set:Ne \l_@@_tmp_tl - { \l_@@_key_name_tl \c_space_tl \l_@@_tmp_tl } - \prop_if_in:NoF \l_@@_vars_prop \l_@@_tmp_tl - { - \prop_get:NoN \l_@@_keytypes_prop \l_@@_key_name_tl - \l_@@_tmp_tl - \@@_split_keytype_arg:o \l_@@_tmp_tl - \prop_get:NoN \l_@@_values_prop \l_@@_key_name_tl - \l_@@_tmp_tl - \msg_error:nneee { xtemplate } { unknown-default-choice } - { \l_@@_key_name_tl } { \l_@@_key_name_tl } - { \l_@@_keytype_arg_tl } - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_implement_choice_elt:nnn, \@@_implement_choice_elt_aux:nnn} -% \begin{macro}{\@@_implement_choice_elt:n} -% The actual storage of the implementation of a choice is mainly about -% error checking. The code here ensures that all choices have to have -% been declared, apart from the special \texttt{unknown} choice, which -% must come last. The code for each choice is stored along with the -% key name in the variables property list. -% \begin{macrocode} -\cs_new_protected:Npn \@@_implement_choice_elt:nnn #1#2#3 - { - \clist_if_empty:NTF \l_@@_tmp_clist - { - \str_if_eq:nnTF {#2} { unknown } - { \@@_implement_choice_elt_aux:nnn {#1} {#2} {#3} } - { - \prop_get:NoN \l_@@_keytypes_prop \l_@@_key_name_tl - \l_@@_tmp_tl - \@@_split_keytype_arg:o \l_@@_tmp_tl - \msg_error:nneee { xtemplate } { unknown-choice } - { \l_@@_key_name_tl } {#2} - { \l_@@_keytype_arg_tl } - } - } - { - \clist_if_in:NnTF \l_@@_tmp_clist {#2} - { - \clist_remove_all:Nn \l_@@_tmp_clist {#2} - \@@_implement_choice_elt_aux:nnn {#1} {#2} {#3} - } - { - \prop_get:NoN \l_@@_keytypes_prop \l_@@_key_name_tl - \l_@@_tmp_tl - \@@_split_keytype_arg:o \l_@@_tmp_tl - \msg_error:nneee { xtemplate } { unknown-choice } - { \l_@@_key_name_tl } {#2} - { \l_@@_keytype_arg_tl } - } - } - } -\cs_new_protected:Npn \@@_implement_choice_elt_aux:nnn #1#2#3 - { - \keys_define:ne { template / #1 } - { \l_@@_key_name_tl / #2 .code:n = { \exp_not:n {#3} } } - \tl_set:Ne \l_@@_tmp_tl - { \l_@@_key_name_tl \c_space_tl #2 } - \prop_put:Non \l_@@_vars_prop \l_@@_tmp_tl {#3} - } -\cs_new_protected:Npn \@@_implement_choice_elt:n #1 - { - \msg_error:nneee { xtemplate } { choice-requires-code } - { \l_@@_key_name_tl } {#1} - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Editing template defaults} -% -% Template defaults can be edited either with no other changes or -% to prevent further editing, forming a \enquote{restricted template}. -% In the later case, a new template results, whereas simple editing -% does not produce a new template name. -% -% \begin{macro}{\@@_declare_restricted:nnnn} -% Creating a restricted template means copying the old template to the -% new one first. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_restricted:nnnn #1#2#3#4 - { - \@@_if_keys_exist:nnT {#1} {#2} - { - \@@_set_template_eq:nn { #1 / #3 } { #1 / #2 } - \bool_set_true:N \l_@@_restrict_bool - \@@_edit_defaults_aux:nnn {#1} {#3} {#4} - \bool_set_false:N \l_@@_restrict_bool - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_edit_defaults:nnn} -% \begin{macro}{\@@_edit_defaults_aux:nnn} -% Editing the template defaults means getting the values back out -% of the store, then parsing the list of new values before putting -% the updated list back into storage. The auxiliary function is used -% to allow code-sharing with the template-restriction system. -% \begin{macrocode} -\cs_new_protected:Npn \@@_edit_defaults:nnn - { - \bool_set_false:N \l_@@_restrict_bool - \@@_edit_defaults_aux:nnn - } -\cs_new_protected:Npn \@@_edit_defaults_aux:nnn #1#2#3 - { - \@@_if_keys_exist:nnT {#1} {#2} - { - \@@_recover_defaults:n { #1 / #2 } - \@@_recover_restrictions:n { #1 / #2 } - \@@_parse_values:nn { #1 / #2 } {#3} - \@@_store_defaults:n { #1 / #2 } - \@@_store_restrictions:n { #1 / #2 } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_parse_values:nn, \@@_parse_values_aux:nn} -% The routine to parse values is the same for both editing a -% template and setting up an instance. So the code here does only the -% minimum necessary for reading the values. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_values:nn #1#2 - { - \clist_clear:N \l_@@_restrict_clist - \@@_parse_values_aux:nn {#1} {#2} - } -\cs_new_protected:Npn \@@_parse_values_aux:nn #1#2 - { - \@@_recover_keytypes:n {#1} - \keyval_parse:NNn - \@@_parse_values_elt:n \@@_parse_values_elt:nn {#2} - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_values_elt:n} -% Every key needs a value, so this is just an error routine. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_values_elt:n #1 - { - \bool_set_true:N \l_@@_error_bool - \msg_error:nne { xtemplate } { key-no-value } {#1} - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_values_elt:nn} -% \begin{macro}{\@@_parse_values_elt_aux:n} -% To store the value, find the keytype then call the saving function. -% These need the current key name saved as \cs{l_@@_key_name_tl}. -% When a template is being restricted, the setting code will be -% skipped for restricted keys. -% \begin{macrocode} -\cs_new_protected:Npn \@@_parse_values_elt:nn #1#2 - { - \tl_set:Ne \l_@@_key_name_tl - { \tl_trim_spaces:e { \tl_to_str:n {#1} } } - \prop_get:NoNTF \l_@@_keytypes_prop \l_@@_key_name_tl - \l_@@_tmp_tl - { - \bool_if:NTF \l_@@_restrict_bool - { - \clist_if_in:NoF \l_@@_restrict_clist - \l_@@_key_name_tl - { \@@_parse_values_elt_aux:n {#2} } - } - { \@@_parse_values_elt_aux:n {#2} } - } - { - \msg_error:nne { xtemplate } { unknown-key } - { \l_@@_key_name_tl } - } - } -\cs_new_protected:Npn \@@_parse_values_elt_aux:n #1 - { - \clist_put_right:No \l_@@_restrict_clist \l_@@_key_name_tl - \@@_split_keytype_arg:o \l_@@_tmp_tl - \use:c { @@_store_value_ \l_@@_keytype_tl :n } {#1} - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_set_template_eq:nn} -% To copy a template, each of the lists plus the code has to be copied -% across. To keep this independent of the list storage system, it is -% all done with two-part shuffles. -% \begin{macrocode} -\cs_new_protected:Npn \@@_set_template_eq:nn #1#2 - { - \@@_recover_defaults:n {#2} - \@@_store_defaults:n {#1} - \@@_recover_keytypes:n {#2} - \@@_store_keytypes:n {#1} - \@@_recover_vars:n {#2} - \@@_store_vars:n {#1} - \cs_gset_eq:cc { \c_@@_code_root_tl #1 } - { \c_@@_code_root_tl #2 } - } -% \end{macrocode} -% \end{macro} -% -%\subsection{Creating instances of templates} -% -% \begin{macro}{\@@_declare_instance:nnnnn} -% \begin{macro}{\@@_declare_instance_aux:nnnnn} -% Making an instance has two distinct parts. First, the keys given are -% parsed to transfer the values into the structured data format used -% internally. This allows the default and given values to be combined -% with no repetition. In the second step, the structured data is -% converted to pre-defined variable assignments, and these are stored -% in the function for the instance. A final check is also made so that -% there is always an instance \enquote{outside} of any collection. -% \begin{macrocode} -\cs_new_protected:Npn \@@_declare_instance:nnnnn #1#2#3#4#5 - { - \@@_execute_if_code_exist:nnT {#1} {#2} - { - \@@_recover_defaults:n { #1 / #2 } - \@@_recover_restrictions:n { #1 / #2 } - \@@_recover_vars:n { #1 / #2 } - \@@_declare_instance_aux:nnnnn {#1} {#2} {#3} {#4} {#5} - } - } -\cs_new_protected:Npn \@@_declare_instance_aux:nnnnn #1#2#3#4#5 - { - \bool_set_false:N \l_@@_error_bool - \@@_parse_values_aux:nn { #1 / #2 } {#5} - \bool_if:NF \l_@@_error_bool - { - \prop_put:Nnn \l_@@_values_prop { from~template } {#2} - \@@_store_values:n { #1 / #3 / #4 } - \@@_convert_to_assignments: - \cs_set_protected:cpe { \c_@@_instances_root_tl #1 / #3 / #4 } - { - \exp_not:N \@@_assignments_push:n - { \exp_not:o \l_@@_assignments_tl } - \exp_not:c { \c_@@_code_root_tl #1 / #2 } - } - \@@_if_instance_exist:nnnF {#1} { } {#4} - { - \cs_set_eq:cc - { \c_@@_instances_root_tl #1 / / #4 } - { \c_@@_instances_root_tl #1 / #3 / #4 } - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_copy_instance:nnnn} -% Copy--paste an instance -% \begin{macrocode} -\cs_new_protected:Npn \@@_copy_instance:nnnn #1#2#3#4 - { - \@@_if_instance_exist:nnnTF {#1} {#2} {#3} - { - \@@_recover_values:n { #1 / #2 / #3 } - \@@_store_values:n { #1 / #2 / #4 } - \cs_set_eq:cc { \c_@@_instances_root_tl #1 / #2 / #4 } - { \c_@@_instances_root_tl #1 / #2 / #3 } - } - { - \msg_error:nnee { xtemplate } { unknown-instance } - {#1} {#3} - } - } -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@@_edit_instance:nnnn} -% \begin{macro}{\@@_edit_instance_aux:nnnnn} -% \begin{macro}{\@@_edit_instance_aux:nonnn} -% Editing an instance is almost identical to declaring one. The only -% variation is the source of the values to use. When editing, they are -% recovered from the previous instance run. -% \begin{macrocode} -\cs_new_protected:Npn \@@_edit_instance:nnnn #1#2#3#4 - { - \@@_if_instance_exist:nnnTF {#1} {#2} {#3} - { - \@@_recover_values:n { #1 / #2 / #3 } - \prop_get:NnN \l_@@_values_prop { from~template } - \l_@@_tmp_tl - \@@_edit_instance_aux:nonnn {#1} \l_@@_tmp_tl - {#2} {#3} {#4} - } - { - \msg_error:nnee { xtemplate } { unknown-instance } - {#1} {#3} - } - } -\cs_new_protected:Npn \@@_edit_instance_aux:nnnnn #1#2 - { - \@@_recover_vars:n { #1 / #2 } - \@@_declare_instance_aux:nnnnn {#1} {#2} - } -\cs_generate_variant:Nn \@@_edit_instance_aux:nnnnn { no } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_convert_to_assignments:} -% \begin{macro}{\@@_convert_to_assignments_aux:n} -% \begin{macro}{\@@_convert_to_assignments_aux:nn} -% \begin{macro}{\@@_convert_to_assignments_aux:no} -% The idea on converting to a set of assignments is to loop over each -% key, so that the loop order follows the declaration order of the keys. -% This is done using a sequence as property lists are not -% \enquote{ordered}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_convert_to_assignments: - { - \tl_clear:N \l_@@_assignments_tl - \seq_map_function:NN \l_@@_key_order_seq - \@@_convert_to_assignments_aux:n - } -\cs_new_protected:Npn \@@_convert_to_assignments_aux:n #1 - { - \prop_get:NnN \l_@@_keytypes_prop {#1} \l_@@_tmp_tl - \@@_convert_to_assignments_aux:no {#1} \l_@@_tmp_tl - } -% \end{macrocode} -% The second auxiliary function actually does the work. The -% arguments here are the key name (|#1|) and the keytype (|#2|). -% From those, the value to assign and the name of the appropriate -% variable are recovered. A bit of work is then needed to sort out -% keytypes with arguments (for example instances), and to look for -% global assignments. Once that is done, a hand-off can be made to the -% handler for the relevant keytype. -% \begin{macrocode} -\cs_new_protected:Npn \@@_convert_to_assignments_aux:nn #1#2 - { - \prop_get:NnNT \l_@@_values_prop {#1} \l_@@_value_tl - { - \prop_get:NnNTF \l_@@_vars_prop {#1} \l_@@_var_tl - { - \@@_split_keytype_arg:n {#2} - \str_if_eq:onF \l_@@_keytype_tl { choice } - { - \str_if_eq:onF \l_@@_keytype_tl { code } - { \@@_find_global: } - } - \tl_set:Nn \l_@@_key_name_tl {#1} - \use:c { @@_assign_ \l_@@_keytype_tl : } - } - { \msg_error:nne { xtemplate } { unknown-attribute } {#1} } - } - } -\cs_generate_variant:Nn \@@_convert_to_assignments_aux:nn { no } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_find_global:} -% \begin{macro}{\@@_find_global_aux:w} -% Global assignments should have the phrase |global| at the front. -% This is pretty easy to find: no other error checking, though. -% \begin{macrocode} -\cs_new_protected:Npn \@@_find_global: - { - \bool_set_false:N \l_@@_global_bool - \tl_if_in:onT \l_@@_var_tl { global } - { - \exp_after:wN \@@_find_global_aux:w \l_@@_var_tl \s_@@_stop - } - } -\cs_new_protected:Npn \@@_find_global_aux:w #1 global #2 \s_@@_stop - { - \tl_set:Nn \l_@@_var_tl {#2} - \bool_set_true:N \l_@@_global_bool - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \subsection{Using templates directly} -% -% \begin{macro}{\@@_use_template:nnn} -% Directly use a template with a particular parameter setting. -% This is also picked up if used in a nested fashion inside a parameter -% list. The idea is essentially the same as creating an instance, -% just with no saving of the result. -% \begin{macrocode} -\cs_new_protected:Npn \@@_use_template:nnn #1#2#3 - { - \@@_execute_if_code_exist:nnT {#1} {#2} - { - \@@_recover_defaults:n { #1 / #2 } - \@@_recover_vars:n { #1 / #2 } - \@@_parse_values:nn { #1 / #2 } {#3} - \@@_convert_to_assignments: - \use:c { \c_@@_code_root_tl #1 / #2 } - } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Assigning values to variables} -% -% \begin{macro}{\@@_assign_boolean:} -% \begin{macro}{\@@_assign_boolean_aux:n} -% Setting a Boolean value is slightly different to everything else -% as the value can be used to work out which \texttt{set} function to -% call. As long as there is no need to recover things from another -% variable, everything is pretty easy. If there is, then we need to allow -% for the fact that the recovered value here will \emph{not} be expandable, -% so needs to be converted to something that is. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assign_boolean: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_boolean_aux:n { bool_gset } } - { \@@_assign_boolean_aux:n { bool_set } } - } -\cs_new_protected:Npn \@@_assign_boolean_aux:n #1 - { - \@@_if_key_value:oTF \l_@@_value_tl - { - \@@_key_to_value: - \tl_put_right:Ne \l_@@_assignments_tl - { - \exp_not:c { #1 _eq:NN } - \exp_not:o \l_@@_var_tl - \exp_not:o \l_@@_value_tl - } - } - { - \tl_put_right:Ne \l_@@_assignments_tl - { - \exp_not:c { #1 _ \l_@@_value_tl :N } - \exp_not:o \l_@@_var_tl - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_assign_choice:} -% \begin{macro} -% {\@@_assign_choice_aux:n, \@@_assign_choice_aux:o} -% The idea here is to find either the choice as-given or else the -% special |unknown| choice, and to copy the appropriate code across. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assign_choice: - { - \@@_assign_choice_aux:eF - { \l_@@_key_name_tl \c_space_tl \l_@@_value_tl } - { - \@@_assign_choice_aux:eF - { \l_@@_key_name_tl \c_space_tl unknown } - { - \prop_get:NoN \l_@@_keytypes_prop \l_@@_key_name_tl - \l_@@_tmp_tl - \@@_split_keytype_arg:o \l_@@_tmp_tl - \msg_error:nneee { xtemplate } { unknown-choice } - { \l_@@_key_name_tl } { \l_@@_value_tl } - { \l_@@_keytype_arg_tl } - } - } - } -\cs_new_protected:Npn \@@_assign_choice_aux:nF #1 - { - \prop_get:NnNTF - \l_@@_vars_prop - {#1} - \l_@@_tmp_tl - { \tl_put_right:No \l_@@_assignments_tl \l_@@_tmp_tl } - } -\cs_generate_variant:Nn \@@_assign_choice_aux:nF { e } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_assign_function:} -% \begin{macro}{\@@_assign_function_aux:N} -% This looks a bit messy but is only actually one function. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assign_function: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_function_aux:N \cs_gset:Npn } - { \@@_assign_function_aux:N \cs_set:Npn } - } -\cs_new_protected:Npn \@@_assign_function_aux:N #1 - { - \tl_put_right:Ne \l_@@_assignments_tl - { - \cs_generate_from_arg_count:NNnn - \exp_not:o \l_@@_var_tl - \exp_not:N #1 - { \exp_not:o \l_@@_keytype_arg_tl } - { \exp_not:o \l_@@_value_tl } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_assign_instance:} -% \begin{macro}{\@@_assign_instance_aux:N} -% Using an instance means adding the appropriate function creation to -% the tl. No checks are made at this stage, so if the instance is -% not valid then errors will arise later. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assign_instance: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_instance_aux:N \cs_gset_protected:Npn } - { \@@_assign_instance_aux:N \cs_set_protected:Npn } - } -\cs_new_protected:Npn \@@_assign_instance_aux:N #1 - { - \tl_put_right:Ne \l_@@_assignments_tl - { - \exp_not:N #1 \exp_not:o \l_@@_var_tl - { - \@@_use_instance:nn - { \exp_not:o \l_@@_keytype_arg_tl } - { \exp_not:o \l_@@_value_tl } - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_assign_integer:} -% \begin{macro}{\@@_assign_length:} -% \begin{macro}{\@@_assign_muskip:} -% \begin{macro}{\@@_assign_real:} -% \begin{macro}{\@@_assign_skip:} -% All of the calculated assignments use the same underlying code, with -% only the low-level assignment function changing. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assign_integer: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_variable:N \int_gset:Nn } - { \@@_assign_variable:N \int_set:Nn } - } -\cs_new_protected:Npn \@@_assign_length: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_variable:N \dim_gset:Nn } - { \@@_assign_variable:N \dim_set:Nn } -} -\cs_new_protected:Npn \@@_assign_muskip: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_variable:N \muskip_gset:Nn } - { \@@_assign_variable:N \muskip_set:Nn } - } -\cs_new_protected:Npn \@@_assign_real: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_variable:N \fp_gset:Nn } - { \@@_assign_variable:N \fp_set:Nn } - } -\cs_new_protected:Npn \@@_assign_skip: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_variable:N \skip_gset:Nn } - { \@@_assign_variable:N \skip_set:Nn } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_assign_tokenlist:} -% \begin{macro}{\@@_assign_tokenlist_aux:NN} -% Life would be easy here if it were not for \cs{KeyValue}. To deal -% correctly with that, we need to allow for the recovery a stored value -% at point of use. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assign_tokenlist: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_tokenlist_aux:NN \tl_gset:NV \tl_gset:Nn } - { \@@_assign_tokenlist_aux:NN \tl_set:NV \tl_set:Nn } - } -\cs_new_protected:Npn \@@_assign_tokenlist_aux:NN #1#2 - { - \@@_if_key_value:oTF \l_@@_value_tl - { - \@@_key_to_value: - \tl_put_right:Ne \l_@@_assignments_tl - { - #1 \exp_not:o \l_@@_var_tl - \exp_not:o \l_@@_value_tl - } - } - { - \tl_put_right:Ne \l_@@_assignments_tl - { - #2 \exp_not:o \l_@@_var_tl - { \exp_not:o \l_@@_value_tl } - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_assign_commalist:} -% Very similar for commas lists, so some code is shared. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assign_commalist: - { - \bool_if:NTF \l_@@_global_bool - { \@@_assign_tokenlist_aux:NN \clist_gset:NV \clist_gset:Nn } - { \@@_assign_tokenlist_aux:NN \clist_set:NV \clist_set:Nn } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_assign_variable:N} -% A general-purpose function for all of the numerical assignments. -% As long as the value is not coming from another variable, the stored -% value is simply transferred for output. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assign_variable:N #1 - { - \@@_if_key_value:oT \l_@@_value_tl - { \@@_key_to_value: } - \tl_put_right:Ne \l_@@_assignments_tl - { - #1 \exp_not:o \l_@@_var_tl - { \exp_not:o \l_@@_value_tl } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_key_to_value:} -% \begin{macro}{\@@_key_to_value_auxi:w} -% \begin{macro}{\@@_key_to_value_auxii:w} -% The idea here is to recover the attribute value of another key. To -% do that, the marker is removed and a look up takes place. If this -% is successful, then the name of the variable of the attribute is -% returned. This assumes that the value will be used in context where -% it will be converted to a value, for example when setting a number. -% There is also a need to check in case the copied value happens to be -% \texttt{global}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_key_to_value: - { \exp_after:wN \@@_key_to_value_auxi:w \l_@@_value_tl } -\cs_new_protected:Npn \@@_key_to_value_auxi:w \KeyValue #1 - { - \tl_set:Ne \l_@@_tmp_tl { \tl_trim_spaces:e { \tl_to_str:n {#1} } } - \prop_get:NoNTF - \l_@@_vars_prop - \l_@@_tmp_tl - \l_@@_value_tl - { - \exp_after:wN \@@_key_to_value_auxii:w \l_@@_value_tl - \s_@@_mark global \q_@@_nil \s_@@_stop - } - { - \msg_error:nne { xtemplate } { unknown-attribute } - { \l_@@_tmp_tl } - } - } -\cs_new_protected:Npn \@@_key_to_value_auxii:w #1 global #2#3 \s_@@_stop - { - \@@_quark_if_nil:NF #2 - { \tl_set:Nn \l_@@_value_tl {#2} } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \subsection{Using instances} -% -% \begin{macro}{\@@_use_instance:nn} -% \begin{macro}{\@@_use_instance_aux:nNnnn} -% \begin{macro}{\@@_use_instance_aux:nn} -% Using an instance is just a question of finding the appropriate -% function. There is the possibility that a collection instance exists, -% so this is checked before trying the general instance. If nothing is -% found, an error is raised. One additional complication is that -% if the first token of argument |#2| is \cs{UseTemplate} then that -% is also valid. There is an error-test to make sure that the -% types agree, and if so the template is used directly. -% \begin{macrocode} -\cs_new_protected:Npn \@@_use_instance:nn #1#2 - { - \@@_if_use_template:nTF {#2} - { \@@_use_instance_aux:nNnnn {#1} #2 } - { \@@_use_instance_aux:nn {#1} {#2} } - } -\cs_new_protected:Npn \@@_use_instance_aux:nNnnn #1#2#3#4#5 - { - \str_if_eq:nnTF {#1} {#3} - { \@@_use_template:nnn {#3} {#4} {#5} } - { \msg_error:nnee { xtemplate } { type-mismatch } {#1} {#3} } -} -\cs_new_protected:Npn \@@_use_instance_aux:nn #1#2 - { - \@@_get_collection:n {#1} - \@@_if_instance_exist:nnnTF - {#1} { \l_@@_collection_tl } {#2} - { - \use:c - { - \c_@@_instances_root_tl #1 / - \l_@@_collection_tl / #2 - } - } - { - \@@_if_instance_exist:nnnTF {#1} { } {#2} - { \use:c { \c_@@_instances_root_tl #1 / / #2 } } - { - \msg_error:nnee { xtemplate } { unknown-instance } - {#1} {#2} - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_use_collection:nn} -% Switching to an instance collection is just a question of setting the -% appropriate list. -% \begin{macrocode} -\cs_new_protected:Npn \@@_use_collection:nn #1#2 - { \prop_put:Nnn \l_@@_collections_prop {#1} {#2} } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_get_collection:n} -% Recovering the collection for a given type is pretty easy: just a read -% from the list. -% \begin{macrocode} -\cs_new_protected:Npn \@@_get_collection:n #1 - { - \prop_get:NnNF \l_@@_collections_prop {#1} - \l_@@_collection_tl - { \tl_clear:N \l_@@_collection_tl } - } -% \end{macrocode} -% \end{macro} -% -%\subsection{Assignment manipulation} -% -% A few functions to transfer assignments about, as this is needed by -% \cs{AssignTemplateKeys}. -% -% \begin{macro}{\@@_assignments_pop:} -% To actually use the assignments. -% \begin{macrocode} -\cs_new:Npn \@@_assignments_pop: { \l_@@_assignments_tl } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_assignments_push:n} -% Here, the assignments are stored for later use. -% \begin{macrocode} -\cs_new_protected:Npn \@@_assignments_push:n #1 - { \tl_set:Nn \l_@@_assignments_tl {#1} } -% \end{macrocode} -% \end{macro} -% -% \subsection{Showing templates and instances} -% -% \begin{macro}{\@@_show_code:nn} -% Showing the code for a template is just a translation of -% \cs{cs_show:c}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_show_code:nn #1#2 - { \cs_show:c { \c_@@_code_root_tl #1 / #2 } } -% \end{macrocode} -% \end{macro} -% -% \begin{macro} -% { -% \@@_show_defaults:nn, \@@_show_keytypes:nn, -% \@@_show_vars:nn -% } -% \begin{macro}{\@@_show:Nnnn} -% A modified version of the property-list printing code, such that -% the output refers to templates and instances rather than to the -% underlying structures. -% \begin{macrocode} -\cs_new_protected:Npn \@@_show_defaults:nn #1#2 - { - \@@_if_keys_exist:nnT {#1} {#2} - { - \@@_recover_defaults:n { #1 / #2 } - \@@_show:Nnnn \l_@@_values_prop - {#1} {#2} { default~values } - } - } -\cs_new_protected:Npn \@@_show_keytypes:nn #1#2 - { - \@@_if_keys_exist:nnT {#1} {#2} - { - \@@_recover_keytypes:n { #1 / #2 } - \@@_show:Nnnn \l_@@_keytypes_prop - {#1} {#2} { interface } - } - } -\cs_new_protected:Npn \@@_show_vars:nn #1#2 - { - \@@_execute_if_code_exist:nnT {#1} {#2} - { - \@@_recover_vars:n { #1 / #2 } - \@@_show:Nnnn \l_@@_vars_prop - {#1} {#2} { variable~mapping } - } - } -\cs_new_protected:Npn \@@_show:Nnnn #1#2#3#4 - { - \msg_show:nneeee { xtemplate } { show-attribute } - { \tl_to_str:n {#2} } - { \tl_to_str:n {#3} } - { \tl_to_str:n {#4} } - { \prop_map_function:NN #1 \msg_show_item_unbraced:nn } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_show_values:nnn} -% Instance values are a little more complex, as there are the collection -% and template to consider. -% \begin{macrocode} -\cs_new_protected:Npn \@@_show_values:nnn #1#2#3 - { - \@@_if_instance_exist:nnnT {#1} {#2} {#3} - { - \@@_recover_values:n { #1 / #2 / #3 } - \msg_show:nneeee { xtemplate } { show-values } - { \tl_to_str:n {#1} } - { \tl_to_str:n {#2} } - { \tl_to_str:n {#3} } - { - \prop_map_function:NN \l_@@_values_prop - \msg_show_item_unbraced:nn - } - } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Messages} -% -% The text for error messages: short and long text for all of them. -% \begin{macrocode} -\msg_new:nnnn { xtemplate } { argument-number-mismatch } - { Object~type~'#1'~takes~#2~argument(s). } - { - Objects~of~type~'#1'~require~#2~argument(s).\\ - You~have~tried~to~make~a~template~for~'#1'~ - with~#3~argument(s),~which~is~not~possible:~ - the~number~of~arguments~must~agree. - } -\msg_new:nnnn { xtemplate } { bad-number-of-arguments } - { Bad~number~of~arguments~for~object~type~'#1'. } - { - An~object~may~accept~between~0~and~9~arguments.\\ - You~asked~to~use~#2~arguments:~this~is~not~supported. - } -\msg_new:nnnn { xtemplate } { bad-variable } - { Incorrect~variable~description~'#1'. } - { - The~argument~'#1'~is~not~of~the~form \\ - ~~'<variable>'\\ - ~or~\\ - ~~'global~<variable>'.\\ - It~must~be~given~in~one~of~these~formats~to~be~used~in~a~template. - } -\msg_new:nnnn { xtemplate } { choice-not-implemented } - { The~choice~'#1'~has~no~implementation. } - { - Each~choice~listed~in~the~interface~for~a~template~must~ - have~an~implementation. - } -\msg_new:nnnn { xtemplate } { choice-no-code } - { The~choice~'#1'~requires~implementation~details. } - { - When~creating~template~code~using~\DeclareTemplateCode,~ - each~choice~name~must~have~an~associated~implementation.\\ - This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. - } -\msg_new:nnnn { xtemplate } { choice-requires-code } - { The~choice~'#2'~for~key~'#1'~requires~an~implementation. } - { - You~should~have~put:\\ - \ \ #1~:~choice~{~#2 = <code> ~} \\ - but~LaTeX~did~not~find~any~<code>. - } -\msg_new:nnnn { xtemplate } { duplicate-key-interface } - { Key~'#1'~appears~twice~in~interface~definition~\msg_line_context:. } - { - Each~key~can~only~have~one~interface~declared~in~a~template.\\ - LaTeX~found~two~interfaces~for~'#1'. - } -\msg_new:nnnn { xtemplate } { keytype-requires-argument } - { The~key~type~'#1'~requires~an~argument~\msg_line_context:. } - { - You~should~have~put:\\ - \ \ <key-name>~:~#1~{~<argument>~} \\ - but~LaTeX~did~not~find~an~<argument>. - } -\msg_new:nnnn { xtemplate } { invalid-keytype } - { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } - { - Each~key~in~a~template~requires~a~key-type,~given~in~the~form:\\ - \ \ <key>~:~<key-type>\\ - LaTeX~could~not~find~a~<key-type>~in~your~input. - } -\msg_new:nnnn { xtemplate } { key-no-value } - { The~key~'#1'~has~no~value~\msg_line_context:. } - { - When~creating~an~instance~of~a~template~ - every~key~listed~must~include~a~value:\\ - \ \ <key>~=~<value> - } -\msg_new:nnnn { xtemplate } { key-no-variable } - { The~key~'#1'~requires~implementation~details~\msg_line_context:. } - { - When~creating~template~code~using~\DeclareTemplateCode,~ - each~key~name~must~have~an~associated~implementation.\\ - This~should~be~given~after~a~'='~sign:~LaTeX~did~not~find~one. - } -\msg_new:nnnn { xtemplate } { key-not-implemented } - { Key~'#1'~has~no~implementation~\msg_line_context:. } - { - The~definition~of~key~implementations~for~template~'#2'~ - of~object~type~'#3'~does~not~include~any~details~for~key~'#1'.\\ - The~key~was~declared~in~the~interface~definition,~ - and~so~an~implementation~is~required. - } -\msg_new:nnnn { xtemplate } { missing-keytype } - { The~key~'#1'~is~missing~a~key-type~\msg_line_context:. } - { - Key~interface~definitions~should~be~of~the~form\\ - \ \ #1~:~<key-type>\\ - but~LaTeX~could~not~find~a~<key-type>. - } -\msg_new:nnnn { xtemplate } { no-template-code } - { - The~template~'#2'~of~type~'#1'~is~unknown~ - or~has~no~implementation. - } - { - There~is~no~code~available~for~the~template~name~given.\\ - This~should~be~given~using~\DeclareTemplateCode. - } -\msg_new:nnnn { xtemplate } { object-type-mismatch } - { Object~types~'#1'~and~'#2'~do~not~agree. } - { - You~are~trying~to~use~a~template~directly~with~\UseInstance - (or~a~similar~function),~but~the~object~types~do~not~match. - } -\msg_new:nnnn { xtemplate } { unknown-attribute } - { The~template~attribute~'#1'~is~unknown. } - { - There~is~a~definition~in~the~current~template~reading\\ - \ \ \token_to_str:N \KeyValue {~#1~} \\ - but~there~is~no~key~called~'#1'. - } -\msg_new:nnnn { xtemplate } { unknown-choice } - { The~choice~'#2'~was~not~declared~for~key~'#1'. } - { - The~key~'#1'~takes~a~fixed~list~of~choices~ - and~this~list~does~not~include~'#2'. - } -\msg_new:nnnn { xtemplate } { unknown-default-choice } - { The~default~choice~'#2'~was~not~declared~for~key~'#1'. } - { - The~key~'#1'~takes~a~fixed~list~of~choices~ - and~this~list~does~not~include~'#2'. - } -\msg_new:nnnn { xtemplate } { unknown-instance } - { The~instance~'#2'~of~type~'#1'~is~unknown. } - { - You~have~asked~to~use~an~instance~'#2',~ - but~this~has~not~been~created. - } -\msg_new:nnnn { xtemplate } { unknown-key } - { Unknown~template~key~'#1'. } - { - The~key~'#1'~was~not~declared~in~the~interface~ - for~the~current~template. - } -\msg_new:nnnn { xtemplate } { unknown-keytype } - { The~key-type~'#1'~is~unknown. } - { - Valid~key-types~are:\\ - -~boolean;\\ - -~choice;\\ - -~commalist;\\ - -~function;\\ - -~instance;\\ - -~integer;\\ - -~length;\\ - -~muskip;\\ - -~real;\\ - -~skip;\\ - -~tokenlist. - } -\msg_new:nnnn { xtemplate } { unknown-object-type } - { The~object~type~'#1'~is~unknown. } - { - An~object~type~needs~to~be~declared~with~\DeclareObjectType - prior~to~using~it. - } -\msg_new:nnnn { xtemplate } { unknown-template } - { The~template~'#2'~of~type~'#1'~is~unknown. } - { - No~interface~has~been~declared~for~a~template~ - '#2'~of~object~type~'#1'. - } -% \end{macrocode} -% -% Information messages only have text: more text should not be needed. -% \begin{macrocode} -\msg_new:nnn { xtemplate } { declare-object-type } - { Declaring~object~type~'#1'~taking~#2~argument(s)~\msg_line_context:. } -\msg_new:nnn { xtemplate } { declare-template-code } - { Declaring~code~for~template~'#2'~of~object~type'#1'~\msg_line_context:. } -\msg_new:nnn { xtemplate } { declare-template-interface } - { - Declaring~interface~for~template~'#2'~of~object~type~'#1'~ - \msg_line_context:. - } -\msg_new:nnn { xtemplate } { show-attribute } - { - The~template~'#2'~of~object~type~'#1'~has~ - \tl_if_empty:nTF {#4} { no~#3. } { #3 : #4 } - } -\msg_new:nnn { xtemplate } { show-values } - { - \tl_if_empty:nTF {#2} - { The~instance~'#3'~ } - { The~collection~ instance~'#3'~ (from~collection~'#2')~ } - of~object~type~'#1'~has~ - \tl_if_empty:nTF {#4} { no~values. } { values: #4 } - } -% \end{macrocode} -% -% \subsection{User functions} -% -% The user functions provided by \pkg{xtemplate} are pretty much direct -% copies of internal ones. However, by sticking to the \pkg{xparse} -% approach only the appropriate arguments are long. -% -% \begin{macro}{\DeclareObjectType} -% \begin{macro}{\DeclareTemplateInterface} -% \begin{macro}{\DeclareTemplateCode} % \begin{macro}{\DeclareRestrictedTemplate} -% \begin{macro}{\EditTemplateDefaults} -% \begin{macro}{\DeclareInstance} -% \begin{macro}{\DeclareCollectionInstance} -% \begin{macro}{\DeclareInstanceCopy} -% \begin{macro}{\EditInstance} -% \begin{macro}{\EditCollectionInstance} -% \begin{macro}{\UseTemplate} -% \begin{macro}{\UseInstance} -% \begin{macro}{\UseCollection} -% All simple translations, with the appropriate long/short argument -% filtering. -% \begin{macrocode} +% \begin{macro}{\DeclareObjectType} +% If the new kernel code is not loaded, make a couple of compatibility +% additions. Otherwise, hand over to the frozen version. +% \begin{macrocode} +\@ifundefined{NewTemplateType} + {% + \input{xtemplate-2023-10-10.sty}% + \endinput + } + {% + \ProvidesExplPackage{xtemplate}{2023-10-10}{} + {L3 Experimental prototype document functions} + \long\protected\def\DeclareRestrictedTemplate#1#2#3#4{% + \DeclareTemplateCopy{#1}{#3}{#2}% + \EditTemplateDefaults{#1}{#3}{#4}% + }% + } +\ExplSyntaxOn \cs_new_protected:Npn \DeclareObjectType #1#2 - { \@@_declare_object_type:nn {#1} {#2} } -\cs_new_protected:Npn \DeclareTemplateInterface #1#2#3#4 - { \@@_declare_template_keys:nnnn {#1} {#2} {#3} {#4} } -\cs_new_protected:Npn \DeclareTemplateCode #1#2#3#4#5 - { \@@_declare_template_code:nnnnn {#1} {#2} {#3} {#4} {#5} } -\cs_new_protected:Npn \DeclareRestrictedTemplate #1#2#3#4 - { \@@_declare_restricted:nnnn {#1} {#2} {#3} {#4} } -\cs_new_protected:Npn \DeclareInstance #1#2#3#4 - { \@@_declare_instance:nnnnn {#1} {#3} { } {#2} {#4} } -\cs_new_protected:Npn \DeclareCollectionInstance #1#2#3#4#5 - { \@@_declare_instance:nnnnn {#2} {#4} {#1} {#3} {#5} } -\cs_new_protected:Npn \DeclareInstanceCopy #1#2#3 - { \@@_copy_instance:nnnn {#1} { } {#3} {#2} } -\cs_new_protected:Npn \EditTemplateDefaults #1#2#3 - { \@@_edit_defaults:nnn {#1} {#2} {#3} } -\cs_new_protected:Npn \EditInstance #1#2#3 - { \@@_edit_instance:nnnn {#1} { } {#2} {#3} } -\cs_new_protected:Npn \EditCollectionInstance #1#2#3#4 - { \@@_edit_instance:nnnn {#2} {#1} {#3} {#4} } -\cs_new_protected:Npn \UseTemplate #1#2#3 - { \@@_use_template:nnn {#1} {#2} {#3} } -\cs_new_protected:Npn \UseInstance #1#2 - { \@@_use_instance:nn {#1} {#2} } -\cs_new_protected:Npn \UseCollection #1#2 - { \@@_use_collection:nn {#1} {#2} } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\ShowTemplateCode} -% \begin{macro}{\ShowTemplateDefaults} -% \begin{macro}{\ShowTemplateInterface} -% \begin{macro}{\ShowTemplateVariables} -% \begin{macro}{\ShowInstanceValues} -% \begin{macro}{\ShowCollectionInstanceValues} -% The show functions are again just translation. -% \begin{macrocode} -\cs_new_protected:Npn \ShowTemplateCode #1#2 - { \@@_show_code:nn {#1} {#2} } -\cs_new_protected:Npn \ShowTemplateDefaults #1#2 - { \@@_show_defaults:nn {#1} {#2} } -\cs_new_protected:Npn \ShowTemplateInterface #1#2 - { \@@_show_keytypes:nn {#1} {#2} } -\cs_new_protected:Npn \ShowTemplateVariables #1#2 - { \@@_show_vars:nn {#1} {#2} } -\cs_new_protected:Npn \ShowInstanceValues #1#2 - { \@@_show_values:nnn {#1} { } {#2} } -\cs_new_protected:Npn \ShowCollectionInstanceValues #1#2#3 - { \@@_show_values:nnn {#1} {#2} {#3} } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\IfInstanceExistT, \IfInstanceExistF, \IfInstanceExistTF} -% More direct translation: only the base instance is checked for. -% \begin{macrocode} -\cs_new:Npn \IfInstanceExistTF #1#2 - { \@@_if_instance_exist:nnnTF {#1} { } {#2} } -\cs_new:Npn \IfInstanceExistT #1#2 - { \@@_if_instance_exist:nnnT {#1} { } {#2} } -\cs_new:Npn \IfInstanceExistF #1#2 - { \@@_if_instance_exist:nnnF {#1} { } {#2} } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\KeyValue} -% Simply dump the argument when executed: this should not happen. -% \begin{macrocode} -\cs_new_protected:Npn \KeyValue #1 {#1} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\AssignTemplateKeys} -% A short call to use a token register by proxy. -% \begin{macrocode} -\cs_new_protected:Npn \AssignTemplateKeys - { \@@_assignments_pop: } + { \@@_declare_type:nn {#1} {#2} } +\ExplSyntaxOff % \end{macrocode} % \end{macro} -% -% \begin{macro}{\SetTemplateKeys} -% A friendly wrapper -% \begin{macrocode} -\cs_new_protected:Npn \SetTemplateKeys #1#2#3 - { \keys_set_known:nnN { template / #1 / #2 } {#3} \l_@@_tmp_clist } -% \end{macrocode} % \end{macro} % -% \begin{macrocode} -\cs_new_eq:NN \ShowTemplateKeytypes \ShowTemplateInterface -% \end{macrocode} -% -% \begin{macrocode} %</package> % \end{macrocode} % diff --git a/macros/latex/contrib/l3packages/xtemplate.ins b/macros/latex/contrib/l3packages/xtemplate.ins index 72bf777194..eaf3fe0ead 100644 --- a/macros/latex/contrib/l3packages/xtemplate.ins +++ b/macros/latex/contrib/l3packages/xtemplate.ins @@ -2,7 +2,7 @@ File: xtemplate.ins -Copyright (C) 2000-2012,2016,2017,2019-2023 The LaTeX Project +Copyright (C) 2000-2012,2016,2017,2019-2024 The LaTeX Project It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of this @@ -34,7 +34,7 @@ license information is placed in the derived files. \preamble -Copyright (C) 2011-2023 The LaTeX Project +Copyright (C) 2011-2024 The LaTeX Project It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of diff --git a/macros/latex/contrib/l3packages/xtemplate.pdf b/macros/latex/contrib/l3packages/xtemplate.pdf Binary files differindex 57ab72b148..c5fc465835 100644 --- a/macros/latex/contrib/l3packages/xtemplate.pdf +++ b/macros/latex/contrib/l3packages/xtemplate.pdf diff --git a/macros/optex/README b/macros/optex/README index 3dab8b68f1..aa84d46627 100644 --- a/macros/optex/README +++ b/macros/optex/README @@ -22,6 +22,11 @@ doc/ ... PDF version of the OpTeX documentation and sources. History: +<1.14> Feb 2024: + More links in doc: TeX primitives linked to TeX in a Nutshell. + \trykv returns unexpanded value of the key=value pair. + \bracedparam reimplemented, improved. + \optdef can create an expandable macro. <1.13> Nov 2023: \usebib completely reimplemented, libranian package not needed from now. Selected OpTeX tricks are automatically loaded when a relevant macro is used. diff --git a/macros/optex/base/alloc.opm b/macros/optex/base/alloc.opm index fae88d286e..180adddeff 100644 --- a/macros/optex/base/alloc.opm +++ b/macros/optex/base/alloc.opm @@ -120,19 +120,18 @@ \_newdimen \tmpdim \_newdimen \_tmpdim \_doc ----------------------------- - A few registers are initialized like in plain\TeX/. We absolutely + A few registers: \`\maxdimen`, \`\hideskip` and + \`\centering` are initialized like in plain\TeX/. We absolutely don't support the `@`category dance, so `\z@skip` - `\z@`, `\p@` etc. are defined but not recommended in \OpTeX/. - - The \`\_zo` and \`\_zoskip` (equivalents to `\z@` and `\z@skip`) - are declared here and used in some internal macros of \OpTeX/ - for improving speed. + `\z@`, `\p@` etc. are defined but not recommended. + The \`\_zo`, \`\_zoskip` and \`\voidbox` (equivalents to + `\z@`, `\z@skip` and `\voidb@x`) are preferred in \OpTeX. \_cod ----------------------------- \_newdimen\_maxdimen \_maxdimen=16383.99999pt % the largest legal <dimen> -\_newdimen\_zo \_zo=0pt \_newskip\_hideskip \_hideskip=-1000pt plus 1fill % negative but can grow \_newskip\_centering \_centering=0pt plus 1000pt minus 1000pt +\_newdimen\_zo \_zo=0pt \_newskip\_zoskip \_zoskip=0pt plus0pt minus0pt \_newbox\_voidbox % permanently void box register diff --git a/macros/optex/base/doc.opm b/macros/optex/base/doc.opm index fb96d35007..c334019de2 100644 --- a/macros/optex/base/doc.opm +++ b/macros/optex/base/doc.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \printdoc {Macros for documentation printing <2022-12-11>} % loaded on demand by \load[doc] +\_codedecl \printdoc {Macros for documentation printing <2023-12-10>} % loaded on demand by \load[doc] \_doc ----------------------------- General decalarations. @@ -41,8 +41,6 @@ \_doc ----------------------------- The listing mode is implemented here. The \`\maxlines` is maximal lines of code printed in the listing mode. - The \code{\\catcode`\\.=11} sets dot as letter in listngs (for package - documentation where `\.foo` sequeces exist). \_cod ----------------------------- \_newcount \_maxlines \_maxlines=100000 @@ -54,7 +52,7 @@ \_typosize[8/10] \_let\_printverbline=\_printcodeline \_ttline=\_inputlineno - \_setverb \_catcode`\.=11 + \_setverb \_ifnum\_ttline<0 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi \_adef{ }{\ }\_adef\^^I{\t}\_parindent=\_ttindent \_parskip=0pt \_def\t{\_hskip \_dimexpr\_tabspaces em/2\_relax}% @@ -88,7 +86,8 @@ the first `_` or `.` is removed from `\_tmpa` and the test is repeated. \_cod ----------------------------- -\_def\_makecs{\_def\_tmpa{}\_futurelet\_next\_makecsA} +\_def\_makecs{\_def\_tmpa{}\_futurelet\_next\_makecsD} +\_def\_makecsD{\_if.\_next \_ea\_makecsB \_else \_ea\_makecsA \_fi} % \.foo is accepted \_def\_makecsA{\_ifcat a\_noexpand\_next \_ea\_makecsB \_else \_ea\_makecsF \_fi} \_def\_makecsB#1{\_addto\_tmpa{#1}\_futurelet\_next\_makecsA} \_def\_makecsF{\_let\_tmpb=\_tmpa @@ -363,6 +362,7 @@ have the same meaning: `\optexdoclink` in this example. And \endinput +2023-12-10 \catcode`.=11 removed, issue solved by \_makecsD. 2022-12-11 \_opwaning "Second main documentation point" introduced. 2022-12-11 \_docrefcodes added (bug due to 2022-11-13 fixed). 2022-11-21 magenta color for internal links instead green. diff --git a/macros/optex/base/f-fbb.opm b/macros/optex/base/f-fbb.opm new file mode 100644 index 0000000000..ac69a89a99 --- /dev/null +++ b/macros/optex/base/f-fbb.opm @@ -0,0 +1,26 @@ +%% This is part of the OpTeX project, see http://petr.olsak.net/optex + +\_famdecl [fbb] \FBembo {Bembo–like fonts derived from Cardo} + {\caps \swash} {\rm \bf \it \bi} {} + {[fbb-Regular]} + {\_def\_fontnamegen {[fbb-\_currV]:script=latn;\_capsV\_swaV\_fontfeatures}} + +\_wlog{\_detokenize{% +Modifier:^^J + \caps ...... caps & small caps + old digits^^J + \swash ..... alternative Q letter and some other characters^^J +}} + +\_moddef \resetmod {\_fsetV caps={},swa={} \_fvars Regular Bold Italic BoldItalic } +\_moddef \caps {\_fsetV caps=+smcp;\_ffonum; } +\_moddef \swash {\_fsetV swa=+swsh;+salt; } + +\_initfontfamily % new font family must be initialized + +\_endcode + +See historical notice in texdoc fbb. + +See the file `f-heros.opm` for information about principles of such +font-macro-files. + diff --git a/macros/optex/base/f-gentium.opm b/macros/optex/base/f-gentium.opm new file mode 100644 index 0000000000..e6775695c2 --- /dev/null +++ b/macros/optex/base/f-gentium.opm @@ -0,0 +1,26 @@ +%% This is part of the OpTeX project, see http://petr.olsak.net/optex + +\_famdecl [Gentium] \Gentium {Serif free fonts, support Greek, Cyrillic, IPA} + {\caps} {\rm \bf \it \bi} {Termes} + {[GentiumPlus-Regular]} + {\_def\_fontnamegen {[Gentium\_bkV Plus-\_currV]:\_capsV\_fontfeatures}} + +\_wlog{\_detokenize{% +Modifiers:^^J + \caps ...... caps & small caps^^J + \book ...... Book variants (a little bolder)^^J +}} + +\_moddef \resetmod {\_fsetV caps={} \_fsetV bk={} \_fvars Regular Bold Italic BoldItalic } +\_moddef \caps {\_fsetV caps=+smcp;\_ffonum; } +\_moddef \book {\_fsetV bk=Book } + +\_initfontfamily % new font family must be initialized + +\_loadmath {[texgyretermes-math]} + +\_endcode + +See the file `f-heros.opm` for information about principles of such +font-macro-files. + diff --git a/macros/optex/base/fams-ini.opm b/macros/optex/base/fams-ini.opm index 6dc19ca9b1..7d3f0332a8 100644 --- a/macros/optex/base/fams-ini.opm +++ b/macros/optex/base/fams-ini.opm @@ -107,6 +107,11 @@ \caps: {\rm\bf\it\bi} \caps\semibold: {\bf\bi} \caps\sans: {\rm\bf\it} -: {\mono\initials\displ\keybr} } +\_famfrom{Victor Gaultney} +\_faminfo [Gentium] {Serif free fonts, support Greek, Cyrrilic, IPA} {f-gentium} + { -,\caps,\book,\book\caps: {\rm\bf\it\bi} } +\_famalias [GentiumPro] + \_famfrom {Daniel Flipo} \_faminfo [KP fonts] {KP fonts -- Johannes Kepler project} {f-kpfonts} { -,\light,\sans,\mono, \caps, \caps\light, \caps\sans,\caps\mono,\swash: {\rm\bf\it\bi} } @@ -249,6 +254,11 @@ \_faminfo [GFSBodoni] {Based on Bodoni with greek letters} {f-gfsbodoni} { -: {\rm\bf\it\bi} \caps: {\rm} } +\_famfrom {David J. Perry, Michael Sharpe} +\_faminfo [fbb] {Bembo–like fonts derived from Cardo} {f-fbb} + { -,\caps: {\rm\bf\it\bi} \swash: {\rm} } +\_famalias [Bembo] \_famalias [FBembo] + \_famfrom {bBox Type GmbH, Carrois Corporate GbR, Edenspiekermann AG} \_faminfo [Fira] {Humanist sans-serif, originally designed for Firefox OS} {f-fira} { \thin,\light,\book,-,\medium,\mono,\mono\medium,% diff --git a/macros/optex/base/fonts-opmac.opm b/macros/optex/base/fonts-opmac.opm index 158f19299e..ca4d38b4ce 100644 --- a/macros/optex/base/fonts-opmac.opm +++ b/macros/optex/base/fonts-opmac.opm @@ -171,10 +171,12 @@ \_ea\_ifx \_the\_font \_tenbi \_additcorr \_bf \_else \_it \_aftergroup\_afteritcorr\_fi\_fi\_fi } -\_def\_additcorr{\_ifdim\_lastskip>\_zo - \_skip0=\_lastskip \_unskip\_italcorr \_hskip\_skip0 \_else\_italcorr \_fi} +\_def\_additcorr{\_ifhmode \_ifdim\_lastskip>\_zo + \_skip0=\_lastskip \_unskip \_additcorrA \_hskip\_skip0 \_else \_additcorrA \_fi\_fi} +\_def\_additcorrA{\_ifnum\_lastpenalty=\_zo \_italcorr \_else + \_ea\_unpenalty \_ea\_italcorr \_ea\_penalty \_the\_lastpenalty \_relax \_fi} \_def\_afteritcorr{\_futurelet\_next\_afteritcorrA} -\_def\_afteritcorrA{\_ifx\_next.\_else\_ifx\_next,\_else \_italcorr \_fi\_fi} +\_def\_afteritcorrA{\_ifhmode \_ifx\_next.\_else\_ifx\_next,\_else \_italcorr \_fi\_fi\_fi} \_let\_italcorr=\/ \_doc ----------------------------- @@ -218,6 +220,7 @@ \_endcode % ------------------------------------- History: +2024-01-25 \em: \_additcorr reimplemented to be more robust 2022-02-22 \_setmainvalues: only \rm initialized 2021-03-10 \boldify corrected 2021-03-09 \mfontsrule and \_setmathfonts introduced diff --git a/macros/optex/base/fonts-preload.opm b/macros/optex/base/fonts-preload.opm index 8562da786c..82387970e6 100644 --- a/macros/optex/base/fonts-preload.opm +++ b/macros/optex/base/fonts-preload.opm @@ -24,14 +24,14 @@ \_endcode %--------------------------------------------------- The format in Lua\TeX/ can download only non-Unicode fonts. Latin Modern EC is -loaded here. These fonts are totally unusable in LuaTeX when languages with out +loaded here. These fonts are totally unusable in \LuaTeX/ when languages with out of ASCII or ISO-8859-1 alphabets are used (for example Czech). We load only a few 8bit fonts here especially for simple testing of the format. But, if the user needs to do more serious work, he/she can -use `\fontfam` macro to load a selected font family of Unicode fonts. +use \^`\fontfam` macro to load a selected font family of Unicode fonts. We have a dilemma: when the Unicode fonts cannot be preloaded in the format then the basic -font set can be loaded by `\everyjob`. But why to load a set of fonts at the +font set can be loaded by \^`\everyjob`. But why to load a set of fonts at the beginning of every job when it is highly likely that the user will load something completely different. Our decision is: there is a basic 8bit font set in the format (for testing purposes only) and the user should load diff --git a/macros/optex/base/fonts-resize.opm b/macros/optex/base/fonts-resize.opm index 323e1d72a0..f4dd3c4033 100644 --- a/macros/optex/base/fonts-resize.opm +++ b/macros/optex/base/fonts-resize.opm @@ -5,7 +5,7 @@ \_doc ----------------------------- \`\initunifonts` macro extends \LuaTeX's font capabilities, in order to be able to load Unicode fonts. Unfortunately, this part of - \OpTeX/ depends on the `luaotfload` package, which adapts Con\TeX/t's generic + \OpTeX/ depends on the `luaotfload` package, which adapts \ConTeXt's generic font loader for plain \TeX/ and \LaTeX. `luaotfload` uses Lua functions from \LaTeX's `luatexbase` namespace, we provide our own replacements. \^`\initunifonts` sets itself to relax because we don't want to do @@ -62,7 +62,8 @@ The `\fontname` primitive returns the <font file name> optionally followed by <size spec>. The \`\xfontname` macro expands to <font file name> without <size spec>. We need to remove the part `<space>at<dimen>` from - `\fontname` output. The letters `at` have category 12. + `\fontname` output. The letters `at` have category 12 in the \`\_stringat` + macro. \_cod ----------------------------- \_edef\_stringat{\_string a\_string t} diff --git a/macros/optex/base/hyperlinks.opm b/macros/optex/base/hyperlinks.opm index 1d15b5e734..7c3e78635a 100644 --- a/macros/optex/base/hyperlinks.opm +++ b/macros/optex/base/hyperlinks.opm @@ -6,11 +6,12 @@ \`\dest``[<type>:<spec>]` creates a destination of internal links. The destination is declared in the format `<type>:<spec>`. If the \^`\hyperlinks` command in not used, then `\dest` does nothing else it is set to `\_destactive`. - The \`\_destactive` is implemented by `\_pdfdest` primitive. It creates a box + The \`\_destactive` is implemented by `\_pdfdest` primitive. It creates a + box using \`\_destbox``[<type>:<spec>]` in which the destination is shifted by \`\_destheight`. The reason is that the destination is exactly at the top border of the PDF viewer but we want to see - the line where the destination is. The destination box is positioned by a - different way dependent on the current vertical or horizontal mode. + the line where the destination is. The destination box is positioned + differently dependent on the current vertical or horizontal mode. \_cod ---------------------------- \_def\_destheight{1.4em} diff --git a/macros/optex/base/if-macros.opm b/macros/optex/base/if-macros.opm index 415b2c01c8..eae011ae26 100644 --- a/macros/optex/base/if-macros.opm +++ b/macros/optex/base/if-macros.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \newif {Special if-macros, is-macros and loops <2023-10-17>} % preloaded in format +\_codedecl \newif {Special if-macros, is-macros and loops <2023-12-07>} % preloaded in format \_doc ---------------------------- \secc Classical \code{\\newif} @@ -95,8 +95,8 @@ \_immediateassignment \_long\_gdef\_fbody#2{\_testparam##1..\_iftrue #3\_ea\_fbody\_fi}% \_fbody #1#2\_finbody\_getforstack } -\_def\_testparam#1#2#3\_iftrue{\_ifx###1\_empty\_ea\_finbody\_else} -\_def\_finbody#1\_finbody{} +\_long\_def\_testparam#1#2#3\_iftrue{\_ifx###1\_empty\_ea\_finbody\_else} +\_long\_def\_finbody#1\_finbody{} \_long\_def\foreach #1\do#2#{\_isempty{#2}\_iftrue \_afterfi{\_foreachA{#1}{##1}}\_else\_afterfi{\_foreachA{#1}{#2}}\_fi} @@ -376,6 +376,7 @@ \_endcode +2023-12-07 \_testparam define \long (big fixed) 2023-10-17 \qcasesof introduced, \xcasesof reimplemented. 2023-01-16 \isnextchar created expandable. 2022-12-02 \xcasesof: its first parameter is \long too. diff --git a/macros/optex/base/keyval.opm b/macros/optex/base/keyval.opm index 68f3fea536..645a3b33a5 100644 --- a/macros/optex/base/keyval.opm +++ b/macros/optex/base/keyval.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \readkv {Key-value dictionaries <2023-10-23>} % preloaded in format +\_codedecl \readkv {Key-value dictionaries <2023-11-24>} % preloaded in format \_doc ---------------------------- {\bf Implementation.}\nl @@ -12,8 +12,10 @@ <value> after it.\nl The \`\kvx``{<key>}{<code>}` defines the `\_kvx:<dict>:<key>#1` macro and \`\nokvx``{<code>}` defines the `\_nokvx:<dict>:<key>` macro.\nl - The \`\kv``{<key>}` expands the `\_kv:<dict>:<key>` macro. If this macro isn't - defined then \`\_kvunknown` is processed. You can re-define it if you want.\nl + The \`\trykv``{<key>}{<code>}` + returns unexpanded value of <key> if declared, else it runs <code>.\nl + The \`\kv``{<key>}` returns expanded value of <key> if declared, + else returns expanded value of `.notdef` key else expands \`\_kvunknown`.\nl The \`\iskv``{<key>}\iftrue` (or `\iffalse`) is the test, if the `<key>` is defined in current <dict>. \_cod ---------------------------- @@ -28,12 +30,14 @@ {\_trycs{_nokvx:\_the\_kvdict}{\_ea\_ignoreit}{#1}\_ea\_ignoreit}{#2}} \_def\_kvx#1#2{\_sdef{_kvx:\_the\_kvdict:#1}##1{#2}} \_def\_nokvx#1{\_sdef{_nokvx:\_the\_kvdict}##1\_ea\_ignoreit##2{#1}} -\_def\_kv#1{\_trycs{\_kvcs#1}{\_kvunknown}} +\_def\_trykv#1{\_ea\_trykvA \_begincsname\_kvcs#1\_endcsname \_ignoreit} +\_def\_trykvA#1{\_ifx #1\_ignoreit \_ea\_useit\_else \_unexpanded\_ea{#1}\_fi} +\_def\_kv#1{\_expanded{\_trykv{#1}{\_trykv{.\_csstring\notdef}{\_kvunknown}}}} \_def\_iskv#1#2{#2\_else\_ea\_unless\_fi \_ifcsname\_kvcs#1\_endcsname} \_def\_kvcs{_kv:\_the\_kvdict:} \_def\_kvunknown{???} -\public \readkv \kvx \nokvx \kv \iskv ; +\public \readkv \kvx \nokvx \kv \trykv \iskv ; \_endcode @@ -75,7 +79,13 @@ register. First: we read default parameters by \^`\readkv\myframedefaults` and secondly the actual parameters are read by \^`\readkv{\the\opt}`. The last setting wins. Third: the values can be used by the expandable \^`\kv{<key>}` macro. -The \^`\kv{<key>}` returns `???` if such key is not declared. +The \^`\kv{<key>}` returns `???` if such a <key> isn't declared +but if `.notdef` key is declared then its value is returned in this case. + +The \^`\kv{<key>}` macro fully expands the value of key. If you don't want to expand +the value, use \^`\trykv``{<key>}{<code>}`. It returns unexpanded value of <key> if +declared else returns expanded <code>. For example +`\edef\macro{\trykv{key}{}}` defines `\macro` as the unexpanded value of the `key`. You can use keys without values in the parameters list too. Then you can ask if the key is declared by \^`\iskv``{<key>}\iftrue` @@ -114,7 +124,7 @@ for undeclared <key>. Example: `\nokvx{\opwarning{Unknown option "#1"}}`. The default dictionary name (where key-value pairs are processed) is empty. You can use your specific dictionary by -\^`\kvdict``={<name>}`. Then `\redakv`, `\kv`, `\iskv`, `\kvx` and `\nokvx` +\^`\kvdict``={<name>}`. Then `\redakv`, `\kv`, `\trykv`, `\iskv`, `\kvx` and `\nokvx` macros use this named dictionary of <key>/<value> pairs. Package options can be processed when `\kvdict={pkg:<pkg>}`, example is the `\mathset` macro in @@ -128,6 +138,7 @@ A more extensive example can be found in \_endinput +2023-11-24 \trykv introduced. 2023-10-23 minor changes in \readkv, empty key isn't processed. 2023-03-11 \nokvx: \fi bug (due to \afterfi in \trycs) fixed. 2023-01-13 \kvx parameter added, \nokvx introduced. diff --git a/macros/optex/base/logos.opm b/macros/optex/base/logos.opm index a510a74a30..1168c25b58 100644 --- a/macros/optex/base/logos.opm +++ b/macros/optex/base/logos.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \TeX {Logos TeX, LuaTeX, etc. <2020-02-28>} % preloaded in format +\_codedecl \TeX {Logos TeX, LuaTeX, etc. <2024-02-12>} % preloaded in format \_doc ---------------------------- Despite plain \TeX/ each macro for logos ends by \`\ignoreslash`. @@ -20,6 +20,18 @@ \_public \TeX \OpTeX \LuaTeX \XeTeX \ignoreslash ; + \_doc ---------------------------- + The \`\ConTeXt` logo is implemented as in the \ConTeXt/ format itself. + The kerning between \"Con" and \"\TeX/t" is calculated by measuring the kerning + between the letters \"T" and \"e". + \_cod ---------------------------- + +\_protected\_def \_ConTeXt{\_begingroup + Con\_setbox0=\_hbox{T\_kern\_zo e}\_setbox1=\_hbox{Te}{\_kern\_dimexpr\_wd1 -\_wd0}% + \_TeX t\_endgroup\_ignoreslash} + +\_public \ConTeXt ; + \_doc ----------------------------- The \`\_slantcorr` macro expands to the slant-correction of the current font. It is used to shifting A if the \`\LaTeX` logo is in italic. @@ -53,9 +65,12 @@ \_def\TeX{TeX\_ignslash}\_def\OpTeX{OpTeX\_ignslash}% \_def\LuaTeX{LuaTeX\_ignslash}\_def\XeTeX{XeTeX\_ignslash}% \_def\LaTeX{LaTeX\_ignslash}\_def\OPmac{OPmac\_ignslash}% + \_def\ConTeXt{ConTeXt\_ignslash}% \_def\CS{CS}\_def\csplain{csplain\_ignslash}% } \_public \ignslash ; \_endcode +2024-02-12 ConTeXt logo added. +2020-02-28 Released. diff --git a/macros/optex/base/margins.opm b/macros/optex/base/margins.opm index 0f544fc5dd..c77926f9ad 100644 --- a/macros/optex/base/margins.opm +++ b/macros/optex/base/margins.opm @@ -64,7 +64,9 @@ \_doc ---------------------------- \`\magscale` `[<factor>]` does `\mag=<factor>` and recalculates page - dimensions to their true values. + dimensions to their true values.\nl + \`\_truedimen``<dimen-register>` retunrs true value of <dimen-register> + regardless of `\mag`. \_cod ---------------------------- \_def\_trueunit{} diff --git a/macros/optex/base/math-macros.opm b/macros/optex/base/math-macros.opm index 00adc9f1aa..fa4317f25a 100644 --- a/macros/optex/base/math-macros.opm +++ b/macros/optex/base/math-macros.opm @@ -347,7 +347,10 @@ names from plain\TeX/ with `@` character are re-written in a more readable form.\nl \`\sp` is an alternative for `^`. The \`\sb` alternative for `_` was defined - at line 27 of the file `math-macros.opm`. + at line 27 of the file `math-macros.opm`.\nl + \`\_thinsk`, \`\_medsk`, \`\_thicksk` and \`\_thinneg` should be used + instead `\,`, `\>`, `\;` and `\!` in macros because a user can re-define + these single-letter sequences. \_cod ----------------------------- \_let\_sp=^ \public \sp ; diff --git a/macros/optex/base/more-macros.opm b/macros/optex/base/more-macros.opm index 8c62243234..3f4916a9c3 100644 --- a/macros/optex/base/more-macros.opm +++ b/macros/optex/base/more-macros.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \eoldef {OpTeX useful macros <2023-01-18>} % preloaded in format +\_codedecl \eoldef {OpTeX useful macros <2024-02-10>} % preloaded in format \_doc ----------------------------- We define \`\opinput` `{<file name>}` macro which @@ -119,8 +119,9 @@ \_newtoks\_opt \_def\_optdef#1[#2]{% - \_def#1{\_opt={#2}\_isnextchar[{\_cs{_oA:\_csstring#1}}{\_cs{_oB:\_csstring#1}}}% - \_sdef{_oA:\_csstring#1}[##1]{\_opt={##1}\_cs{_oB:\_csstring#1\_nospaceafter}}% + \_def#1{\_isnextchar[{\_cs{_oA:\_csstring#1}}{\_cs{_oA:\_csstring#1}[#2]}}% + \_sdef{_oA:\_csstring#1}[##1]{% + \_immediateassignment\_opt={##1}\_cs{_oB:\_csstring#1\_nospaceafter}}% \_sdef{_oB:\_csstring#1\_nospaceafter}% } \_def\_nospaceafter#1{\_ea#1\_romannumeral-`\.\_noexpand} @@ -130,12 +131,21 @@ \_public \opt \optdef \nospaceafter \nospacefuturelet ; \_doc ----------------------------- + \`\_noprefix` `<cs>` works like `\csstring` `<cs>`, but ignores not only + the first backlash but the second~\"`_`" ignores too (if it follows the + backslash). + \_cod ----------------------------- + +\_def\_noprefix#1{\_ea\_noprefixA \_csstring#1\_empty\_fin} +\_def\_noprefixA #1#2\_fin{\_if _#1\_else #1\_fi #2} + + \_doc ----------------------------- The declarator \`\eoldef``\macro #1{<replacement text>}` defines a `\macro` which scans its parameter to the end of the current line. This is the parameter `#1` which can be used in the `<replacement text>`. The catcode of the `\endlinechar` is reset temporarily when the parameter is scanned. - The macro defined by `\eoldef` cannot be used with its parameter inside + The macro defined by \^`\eoldef` cannot be used with its parameter inside other macros because the catcode dancing is not possible here. But the \`\bracedparam``\macro{<parameter>}` can be used here. The `\bracedparam` is a prefix that re-sets temporarily the `\macro` to a `\macro` with @@ -146,15 +156,16 @@ \_cod ----------------------------- \_def\_eoldef #1{\_def #1{\_begingroup \_catcode`\^^M=12 \_eoldefA #1}% - \_ea\_def\_csname _\_csstring #1:M\_endcsname} + \_ea\_def\_csname _eol:\_noprefix #1\_endcsname} \_catcode`\^^M=12 % -\_def\_eoldefA #1#2^^M{\_endgroup\_csname _\_csstring #1:M\_endcsname{#2}}% +\_def\_eoldefA #1#2^^M{\_endgroup\_csname _eol:\_noprefix #1\_endcsname{#2}}% \_normalcatcodes % \_eoldef\_skiptoeol#1{} -\_def\_bracedparam#1{\_ifcsname _\_csstring #1:M\_endcsname - \_csname _\_csstring #1:M\_ea \_endcsname - \_else \_csname _in\_csstring #1\_ea \_endcsname \_fi + +\_def\_bracedparam#1{% + \_trycs{_eol:\_noprefix#1}% + {\_errmessage{\_string\bracedparam: \_string#1 isn't defined by \_string\eoldef}}% } \_public \eoldef \skiptoeol \bracedparam ; @@ -270,7 +281,8 @@ \endtt You can use expandable \`\expr``{<expression>}` for analogical purposes. It expands to the value of the `<expression>` at expand processor level. - The `<expression>` can include `+-*/()` and decimal numbers in common syntax. + The `<expression>` can include `+-*/^()` and decimal numbers in common syntax. + Moreover, `a//b` means integer division and `a\%b` is remainder. The math functions (and pi constant) have to be prefixed by `math.`, because it is processed by Lua interpreter. For example `\expr{math.pi*math.sqrt(2)}`. @@ -298,6 +310,21 @@ \_public \expr \bp ; + \_doc ----------------------------- + The \^`\expr` and \^`\bp` macros return their results with given number of decimal + digits even if there are trailing zeros. There is the \^`\nnum` macro to + \"normalize" such decimal numbers. \`\nnum``{<number>}` expands its parameter + and removes trailing zeros after decimal point and removes the decimal point + if nothing follows. For example, use `\nnum{\expr[10]{<expression>}}`. + The `\nnum` macro is fully expandable. + \_cod ----------------------------- + +\_def\_nnum #1{\_ea\_nnumA\_expanded{#1}.\_fin} +\_def\_nnumA #1.#2\_fin{#1\_ifx~#2~\_else \_nnumB #20.\_fin \_fi} +\_def\_nnumB #10.#2\_fin{\_ifx~#2~\_nnumC#1\_else \_nnumB #1.0.\_fin \_fi} +\_def\_nnumC #1.{\_ifx~#1~\_else .#1\_fi} +\_public \nnum ; + \_doc ------------------ You can write \^`\setpos``[<label>]` somewhere and the position of such \^`\setpos``[<label>]` can be referenced by \^`\posx``[<label>]`, @@ -374,6 +401,9 @@ \_endcode % ------------------------------------- +2024-02-10 \optdef reimplemented, it can create expandable macros now. +2024-01-18 \bracedparam reimplemented. +2023-12-04 \nnum introduced 2023-01-18 \bp, \expr have optional syntax for setting dec-digits 2022-11-24 \setpos, \posx, \posy moved from OpTeX trick here 2022-11-22 \docgen writes banner to log diff --git a/macros/optex/base/optex-tricks.opm b/macros/optex/base/optex-tricks.opm index 89fc7dd5e7..456a7472e1 100644 --- a/macros/optex/base/optex-tricks.opm +++ b/macros/optex/base/optex-tricks.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \_undefined {OpTeX tricks ready to autoload <2023-11-15>} % chunks loaded on demand +\_codedecl \_undefined {OpTeX tricks ready to autoload <2024-02-13>} % chunks loaded on demand % Selected OpTeX tricks are here, they are auto-loaded if the macro is used first % namespace: optextrick @@ -97,13 +97,14 @@ \_trick 105 \directoutput ; %%%%%%%%%%% -\_def\directoutput{\_begingroup \_afterassignment\.directoutputA \_setbox0=} +\_newbox\.outbox +\_def\directoutput{\_begingroup \_afterassignment\.directoutputA \_setbox\.outbox=} \_def\.directoutputA{\_aftergroup \.directoutputB} -\_def\.directoutputB{\_preshipout0\_box0 - \_pdfpageheight=\_dimexpr\_ht0+\_dp0+2\_vvkern \_relax - \_pdfpagewidth=\_dimexpr\_wd0+2\_hhkern\_relax +\_def\.directoutputB{\_preshipout\.outbox\_box\.outbox + \_pdfpageheight=\_dimexpr\_ht\.outbox+\_dp\.outbox+2\_vvkern \_relax + \_pdfpagewidth=\_dimexpr\_wd\.outbox+2\_hhkern\_relax \_hoffset=\_hhkern \_voffset=\_vvkern - \_shipout\_box0 + \_shipout\_box\.outbox \_incr\_pageno \_endgroup } @@ -735,12 +736,47 @@ +\_topskip \_relax } +\_trick 0129 \pgforeground ; +%%%%%%%%%%%% + +\_newtoks \pgforeground + +\_addto\_makefootline{ + \_istoksempty\pgforeground \_iffalse + \_vskip-\_prevdepth + \_vskip-\_vsize + \_vskip-\_voffset + \_istoksempty\_footline \_iffalse \_vskip-\_footlinedist \_fi + \_nointerlineskip + \_moveleft\_hoffset \_vbox{\_the\pgforeground} + \_fi +} + +\_trick 0130 \onlyifnew ; +%%%%%%%%%%%% + +\_def \onlyifnew#1#2{\_begingroup% + \_edef\.tmpA{\_csstring #2}% + \_edef\.tmpB{\_string #2}% + \_ea\_ifcsname\.tmpA\_endcsname% + \_ifx\.tmpA\.tmpB% #2 has no backslash + \_def\.onlyifnewA{#1{_optextrick_onlyifnewB}}\_else% + \_def\.onlyifnewA{#1\_optextrick_onlyifnewB}\_fi% + \_else% + \_ifx\.tmpA\.tmpB% + \_def\.onlyifnewA{#1{#2}}\_else% + \_def\.onlyifnewA{#1#2}\_fi% + \_fi\_ea\_endgroup\.onlyifnewA} + +%%%%%%%%%%%% \_trick end ; \_endcode +2024-02-13 \onlyifnew added +2024-02-12 \pgforeground added 2023-11-15 \correctvsize added -2023-11-09 \makeLOF, \makeLOT aded +2023-11-09 \makeLOF, \makeLOT added 2023-11-08 \ispageodd, \seccc added 2023-11-07 \settabs \import \incrpp added 2023-11-05 \twoblocks, \pstart added diff --git a/macros/optex/base/optex.ini b/macros/optex/base/optex.ini index b65832faf8..a659f43dc8 100644 --- a/macros/optex/base/optex.ini +++ b/macros/optex/base/optex.ini @@ -21,7 +21,7 @@ % OpTeX version -\def\optexversion{1.13 Nov 2023} +\def\optexversion{1.14 Feb 2024} \def\fmtname{OpTeX} \let\fmtversion=\optexversion diff --git a/macros/optex/base/others.opm b/macros/optex/base/others.opm index 9926c98fef..9b7e3a7ead 100644 --- a/macros/optex/base/others.opm +++ b/macros/optex/base/others.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \uv {Miscenaleous <2023-10-17>} % preloaded in format +\_codedecl \uv {Miscenaleous <2023-12-23>} % preloaded in format \_doc ---------------------------- \`\useOpTeX` and \`\useoptex` are declared as `\relax`. @@ -105,13 +105,14 @@ first sentence from the paragraph <number> using \`\_lipsumdot`. \_cod ---------------------------- +\_newbox\_nonebox \_def\_lipsumtext[#1]{\_lipsumload\_cs{_lip:#1}} \_def\_lipsum[#1]{\_lipsumA #1.]{#1}} \_def\_lipsumA #1.#2]#3{\_ifx^#2^\_lipsumB #1\_empty-\_empty\_fin \_else \_lipsumdot[#1].\_fi} \_def\_lipsumB #1-#2\_empty#3\_fin{% \_fornum #1..\_ifx^#2^#1\_else#2\_fi \_do {\_lipsumtext[##1]\_par}} \_def\_lipsumload{{% - \_setbox0=\_vbox{\_tmpnum=0 % vertical mode during \input lipsum.ltd.tex + \_setbox\_nonebox=\_vbox{\_tmpnum=0 % vertical mode during \input lipsum.ltd.tex \_def\ProvidesFile##1[##2]{}% \_def\SetLipsumLanguage##1{}% \_def\NewLipsumPar{\_incr\_tmpnum \_sxdef{_lip:\_the\_tmpnum}}% @@ -149,7 +150,7 @@ \_savecatcodetable\_tmpcatcodes \_catcodetable\_tmpcatcodes \_long\_def\_loadtrickA ##1\_trick##2#1##3;{##1}% \_wlog{Loading trick macros for \_string#1}% - \_setbox0=\_vbox{\_globaldefs=1 \_ea\_loadtrickA \_input {optex-tricks.opm}}% + \_setbox\_nonebox=\_vbox{\_globaldefs=1 \_ea\_loadtrickA \_input {optex-tricks.opm}}% \_restorectable \_endnamespace } \_def\_trick #1;{\_endinput} @@ -161,7 +162,8 @@ \shadedframe \roundframe \cancel \ignoreinspic \keystroke \colortab \crx \crtop \crbot \crmid \longtable \vcent \vbot \tnote \tabnodes \tablebefore \framedblocks \twoblocks \pstart \settabs \import \incrpp \ispageodd - \iniseccc \seccc \makeLOF \makeLOT \captionF \captionT \correctvsize ; + \iniseccc \seccc \makeLOF \makeLOT \captionF \captionT \correctvsize \pgforeground + \onlyifnew ; \_sdef{_item:m}{\_loadtrick{\style m}\_cs{_item:m}} \_doc ----------------------------- @@ -238,6 +240,7 @@ \_endcode +2023-12-23 \_nonebox instead box 0 introduced. 2023-10-17 \_loadtrick introduced. 2022-05-04 \lipsum[<num>]. changed to \lipsum[<num>.] to keep macro expandable. 2022-04-21 syntax \lipsum[<num>]. introduced. diff --git a/macros/optex/base/parameters.opm b/macros/optex/base/parameters.opm index f831fa6a2d..05abe42275 100644 --- a/macros/optex/base/parameters.opm +++ b/macros/optex/base/parameters.opm @@ -144,12 +144,12 @@ \_voffset=25mm \_hsize=160mm % 210mm (from A4 size) - 2*25mm (default margins) \_vsize=244mm % 297mm (from A4 size) - 2*25mm (default margins) -3mm baseline correction -\_pagewidth=210 true mm -\_pageheight=297 true mm +\_pdfpagewidth=210 true mm +\_pdfpageheight=297 true mm \_doc ----------------------------- If you insist on plain \TeX/ values of these parameters then you can - call the `\plaintexsetting` macro. + call the \`\plaintexsetting` macro. \_cod ----------------------------- \_def\_plaintexsetting{% @@ -162,8 +162,8 @@ \_voffset=0pt \_hsize=6.5in \_vsize=8.9in - \_pagewidth=8.5 true in - \_pageheight=11 true in + \_pdfpagewidth=8.5 true in + \_pdfpageheight=11 true in \_nonfrenchspacing } \_public \plaintexsetting ; diff --git a/macros/optex/base/plain-macros.opm b/macros/optex/base/plain-macros.opm index 6ae59108b5..f3aa8c5334 100644 --- a/macros/optex/base/plain-macros.opm +++ b/macros/optex/base/plain-macros.opm @@ -8,6 +8,8 @@ \begtt \addto \dospecials{\do\_} \endtt + \`\active` is character constant 13, we can use it in the context + \code{\\catcode`}<character>\code{=\\active}. \_cod ----------------------------- \_def\_dospecials {\do\ \do\\\do\{\do\}\do\$\do\&% @@ -138,6 +140,7 @@ \_doc ----------------------------- The \`\strutbox` is declared as 10pt size dependent (like in plain \TeX), but the macro `\_setbaselineskip` (from `fonts-opmac.opm`) redefines it. + The `\strut` macro puts the \^`\strutbox`. \_cod ----------------------------- \_newbox\_strutbox @@ -162,8 +165,8 @@ \_doc ----------------------------- Tabbing macros are omitted because they are obsolete. \nl - Indentation and others. \`\textindent`, \`\item`, \`\itemitem`, - \`\narrower`, \`\raggedright`, \`\ttraggedright`, \`\leavevmode`. + Indentation and similar macros are defined here: \`\hang`, \`\textindent`, + \`\item`, \`\itemitem`, \`\narrower`, \`\raggedright`, \`\ttraggedright`, \`\leavevmode`. \_cod ----------------------------- \_def \_hang {\_hangindent\_parindent} @@ -181,7 +184,7 @@ \_doc ----------------------------- Few character codes are set for backward compatibility. But old obscurities - (from plain TeX) based on \`\mathhexbox` + (from plain \TeX) based on \`\mathhexbox` are not supported -- an error message and recommendation to directly using the desired character is implemented by the \`\_usedirectly` macro). @@ -219,7 +222,7 @@ \_public \mathhexbox ; \_doc ----------------------------- - The \`\_unichars` macro is run in \~`\initunifonts`, + The \`\_unichars` macro is run when Unicode font family is loaded, Unicodes are used instead old plain \TeX/ settings. \_cod ----------------------------- @@ -263,6 +266,9 @@ macro \`\oldaccents` which defines accented macros. \nl Much more usable is to define these control sequences for other purposes. + \nl + The \`\_uniaccents` macro redeclares codes for accents and it is run when + Unicode font family is loaded. \_cod ----------------------------- \_def \_oldaccents {% @@ -342,7 +348,7 @@ \rightarrowfill \leftarrowfill \downbracefill \upbracefill ; \_doc ----------------------------- - The last part of plain \TeX/ macros: \`\magnification`, \`\bye`. + The last part of plain \TeX/ macros: \`\magnification`, \`\showhyphens`, \`\bye`. Note that math macros are defined in the `math-macros.opm` file (section~\ref[math-macros]). \_cod ----------------------------- @@ -361,7 +367,7 @@ \_public \showhyphens \bye ; \_doc ----------------------------- - Plain \TeX/ reads `hyphen.tex` with patterns as `\language=0`. We do the same. + Plain \TeX/ reads `hyphen.tex` with patterns when \^`\language``=0`. We do the same. \_cod ----------------------------- \_lefthyphenmin=2 \_righthyphenmin=3 % disallow x- or -xx breaks diff --git a/macros/optex/base/prefixed.opm b/macros/optex/base/prefixed.opm index 3d25b0c894..89aa0b4966 100644 --- a/macros/optex/base/prefixed.opm +++ b/macros/optex/base/prefixed.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \public {Prefixing and code syntax <2022-11-25>} % preloaded in format +\_codedecl \public {Prefixing and code syntax <2024-02-02>} % preloaded in format \_doc --------- All \TeX/ primitives have alternative control sequence `\_hbox` `\_string`, ... @@ -97,6 +97,8 @@ \_def \_nspublic {\_xargs \_nspublicA} \_def \_nspublicA #1{% \_checkexists \_nspublic {\_pkglabel _\_csstring #1}% + \_ifcsname _eol:\_ea\_ignoreit\_pkglabel _\_csstring #1\_endcsname % defined by \eoldef + \_slet {_eol:\_csstring #1}{_eol:\_ea\_ignoreit\_pkglabel _\_csstring #1}\_fi \_ea\_newpublic \_ea\_let \_ea#1\_csname \_pkglabel _\_csstring #1\_endcsname } \_def \_nsprivate {\_xargs \_nsprivateA} @@ -388,6 +390,8 @@ can look like. Another good and short example is \endinput +2024-02-02 \_nspublicA bug correction (#1 may be set as \outer) +2024-01-18 \_nspublic modified in order to \eoldef+\bracedparam 2023-01-30 doc. about namespaces rewritten 2022-11-25 \_resetnamespace: moved \gdef\_namesp:#1 {} to \_namespace 2022-11-24 \newpublic introduced, \_checkexists with only two parameters. diff --git a/macros/optex/base/sections.opm b/macros/optex/base/sections.opm index ef5958e788..de647475ef 100644 --- a/macros/optex/base/sections.opm +++ b/macros/optex/base/sections.opm @@ -1,6 +1,6 @@ %% This is part of the OpTeX project, see http://petr.olsak.net/optex -\_codedecl \chap {Titles, chapters, sections, subsections <2023-05-02>} % preloaded in format +\_codedecl \chap {Titles, chapters, sections, subsections <2024-01-19>} % preloaded in format \_doc --------------------------- We are using scaled fonts for titles @@ -28,7 +28,7 @@ \_nobreak\_bigskip } \_def\_tit{\_scantoeol\_printtit} -\_let\_intit=\_printtit % used by \bracedparam +\_sdef{_eol:tit}{\_printtit} % enables \bracedparam\tit{title} \_public \tit ; @@ -156,7 +156,7 @@ \_doc ---------------------------- The \`\notoc` and \`\nonum` prefixes are implemented by - internal `\_ifnotoc` and `\_ifnonum`. They are reset + internal \`\_ifnotoc` and \`\_ifnonum`. They are reset after each chapter/section/subsection by the \`\_resetnonumnotoc` macro. \_cod ---------------------------- @@ -179,6 +179,10 @@ \_optdef\_secc[]{\_trylabel \_scantoeol\_insecc} \_def\_trylabel{\_istoksempty\_opt\_iffalse \_label[\_the\_opt]\_fi} +\_sdef{_eol:chap}{\_inchap} % enebles \bracedparam\chap{title} +\_sdef{_eol:sec}{\_insec} % enables \bracedparam\sec{title} +\_sdef{_eol:secc}{\_insecc} % enables \bracedparam\secc{title} + \_def\_inchap #1{\_par \_sectionlevel=1 \_def \_savedtitle {#1}% saved to .ref file \_ifnonum \_else {\_globaldefs=1 \_incr\_chapnum \_chapx}\_fi @@ -317,12 +321,14 @@ `\secl3` is `\secc` and all more levels (for <number>$>3$) are printed by the common \`\_seclp` macro. It declares only a simple design. If there is a requirement to use such more levels then the book designer can - define something different here. + define something different here.\nl + The variant `\_eol:secl` is defined to enable \^`\bracedparam``\secl<number> {<title-text>}`. \_cod ----------------------------- -\_def\_secl{\_afterassignment\_secla \_sectionlevel=} +\_def\_secl{\_let\_secle=\_ea \_afterassignment\_secla \_sectionlevel=} +\_sdef{_eol:secl}{\_def\_secle{\_ea\_bracedparam\_ea}\_afterassignment\_secla \_sectionlevel=} \_def\_secla{\_ifcase\_sectionlevel - \_or\_ea\_chap\_or\_ea\_sec\_or\_ea\_secc\_else\_ea\_seclp\_fi} + \_or \_secle\_chap \_or \_secle\_sec \_or \_secle\_secc \_else \_ea \_seclp\_fi} \_eoldef\_seclp#1{\_par \_ifnum\_lastpenalty=0 \_removelastskip\_medskip\_fi \_noindent{\_bf #1}\_vadjust{\_nobreak}\_nl\_ignorepars} \_def\_ignorepars{\_isnextchar\_par{\_ignoresecond\_ignorepars}{}} @@ -473,6 +479,8 @@ \_endcode % ------------------------------------- +2024-01-19 \bracedparam\secl enalbed +2024-01-18 \tit, \chap, \sec, \secc: added cooperation with new \bracedparam 2023-05-02 \_numprint used 2022-10-19 More robust \caption (two opened groups, \_printcaption introduced) 2022-08-02 Penalties in \_printsec, \_printsecc changed diff --git a/macros/optex/base/unimath-codes.opm b/macros/optex/base/unimath-codes.opm index 66be7487d4..d2b7e0e1e3 100644 --- a/macros/optex/base/unimath-codes.opm +++ b/macros/optex/base/unimath-codes.opm @@ -198,7 +198,8 @@ } \_doc ----------------------------- - The math alphabets \`\cal`, \`\bbchar`, \`\frak`, \`\script` are re-defined + The math alphabets \`\cal`, \`\bbchar`, \`\frak`, \`\script`, + \`\misans`, \`\mbisans` are re-defined here. The \`\_marm`, \`\_mabf`, \`\_mait`, \`\_mabi`, \`\_matt` used in \^`\rm`, \^`\bf`, \^`\it`, \^`\bi` are re-defined too.\nl You can redefine them again if you need different behavior (for example @@ -548,7 +549,7 @@ \secc More Unicode-math examples Example of using additional math font is in section 5.3 in the -\ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]{\tt optex-math.pdf} documentation +\ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]{\tt optex-math.pdf} documentation. More examples are in the \ulink[http://petr.olsak.net/optex/optex-tricks.html]{OpTeX tricks} and in the \ulink[https://petr.olsak.net/ftp/olsak/optex/math-doc.pdf]{math.opm} package. diff --git a/macros/optex/base/unimath-macros.opm b/macros/optex/base/unimath-macros.opm index 35842e674d..ac926b5e89 100644 --- a/macros/optex/base/unimath-macros.opm +++ b/macros/optex/base/unimath-macros.opm @@ -181,7 +181,9 @@ \`\themathcodefam``<math-char>` and \`\themathcodechar``<math-char>` macros. The parameter <math-char> is a math character or it is a macro like `\doteq`, `\times`. Moreower, \`\thedelcodefam``<math-char>` and \`\thedelcodechar``<math-char>` - return delcode quaitities of givem math character. + return delcode quaitities of given math character. + All these commands use the common Lua code defined in + the \`\_getmathcode``<code>{<math or del>}<character number>` macro. \_cod ----------------------------- \_def\_getmathcode#1#2{\_directlua{tex.print(tex.get#2code(token.scan_int())[#1])}} diff --git a/macros/optex/demo/op-mathalign.tex b/macros/optex/demo/op-mathalign.tex index b2524ee80d..7770a8d0e2 100644 --- a/macros/optex/demo/op-mathalign.tex +++ b/macros/optex/demo/op-mathalign.tex @@ -44,7 +44,7 @@ \tit Math alignment examples The document \url{https://www.ntg.nl/maps/34/06.pdf} shows examples how to -do special math alignments in display mode in ConTeXt (and in \LaTeX/ for +do special math alignments in display mode in \ConTeXt/ (and in \LaTeX/ for comparison). We present the same examples here. They are created in \OpTeX/ and the \LaTeX/ source is shown for comparison. diff --git a/macros/optex/doc/optex-doc.pdf b/macros/optex/doc/optex-doc.pdf Binary files differindex aebe78c634..731b1ab179 100644 --- a/macros/optex/doc/optex-doc.pdf +++ b/macros/optex/doc/optex-doc.pdf diff --git a/macros/optex/doc/optex-doc.tex b/macros/optex/doc/optex-doc.tex index d780ceeeef..eb0fcc5682 100644 --- a/macros/optex/doc/optex-doc.tex +++ b/macros/optex/doc/optex-doc.tex @@ -21,9 +21,9 @@ \tit Format Based on Plain \TeX/ and OPmac\fnotemark1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\hfill Version 1.13 +\hfill Version 1.14 -\centerline{\it Petr Olšák, 2020, 2021, 2022, 2023} +\centerline{\it Petr Olšák, 2020, 2021, 2022, 2023, 2024} \bigskip \centerline{\url{http://petr.olsak.net/optex}} @@ -65,7 +65,7 @@ The main goal of \OpTeX/ is: If you need to customize your document or you need to use something very specific, then you can copy relevant parts of \OpTeX/ macros into your macro file and do changes to these macros here. This is a significant difference from -\LaTeX/ or ConTeXt, which is an attempt to create a new user level with a +\LaTeX/ or \ConTeXt/, which is an attempt to create a new user level with a plenty of non-primitive parameters and syntax hiding \TeX/ internals. The macros from \OpTeX/ are simple and straightforward because they solve only what is explicitly needed, they do not create a new user level for @@ -113,13 +113,28 @@ document \ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf] \nonum\chap Index \noindent -There are all control sequences used in \OpTeX/ except \TeX/ primitives. -If you want to know something about \TeX/ primitives then you can use another index from -\ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf\#ref:index]{\TeX/ in a Nutshell}. +Control sequences declared by \OpTeX/ have page list here and they are +internal links to their main documentation point. \TeX/ primitives used by +\OpTeX/ have no page list here and they are external links to +\ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf]{\TeX/ in a Nutshell} +to the place where the primitive is briefly described. +%Only primitives used in \OpTeX/ macros are listed here. There are much more +%primitives implemented in \LuaTeX/, see +%\ulink[https://www.pragma-ade.com/general/manuals/luatex.pdf]{\LuaTeX/ manual}, +%section \"primitives". % active links directly to the main documentation point but not to the pages: -\def\_printii #1&{\noindent\hskip-\iindent \link[cs:#1]\Blue{\bslash #1} } +\def\_printii #1&{% + \noindent\hskip-\iindent + \ea\ifx \csname,#1\endcsname \empty % primitive + \_dest[cs:#1]% main documentation point for primitives is in the Index + \ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf\#cs:#1]{\bslash#1} + \ea\ea\ea\nopages + \else \link[cs:#1]\Blue{\bslash #1} % OpTeX macro + \fi +} \def\_pgprintA #1{#1} +\def\nopages#1&{*\_par} \begmulti 3 \tt \makeindex \endmulti \bye diff --git a/macros/optex/doc/optex-techdoc.tex b/macros/optex/doc/optex-techdoc.tex index 7815619404..894f2d8cd3 100644 --- a/macros/optex/doc/optex-techdoc.tex +++ b/macros/optex/doc/optex-techdoc.tex @@ -5,6 +5,7 @@ % (three times) to create whole documentation including all references and the index. \load [doc.opm] +\input primitives \thisoutline {TECHNICAL DOCUMENTATION} diff --git a/macros/optex/doc/optex-userdoc.tex b/macros/optex/doc/optex-userdoc.tex index 61157b0d31..c99e63c21d 100644 --- a/macros/optex/doc/optex-userdoc.tex +++ b/macros/optex/doc/optex-userdoc.tex @@ -1896,7 +1896,7 @@ tests, if the current point is at odd page regardless of asynchronous processing \tpg[perpage]\t\incrpp. \t\thepp, \t\thepplast, \t\truepage\ does per-page counting of objects. -\tpg[keystrokes]\t\keystoke\ +\tpg[keystrokes]\t\keystroke\ prints given text in a keystroke-like frame. \tpg[longtable]\t\longtable\ @@ -1905,15 +1905,21 @@ alows to break a table to more pages and repeates header. \tpg[lot]\t\makeLOF, \t\makeLOT, \t\captionF, \t\captionT\ create list of tables and list of figures similar to \^`\maketoc`. +\tpg[onlyifnew]\t\onlyifnew\ +only define a macro if it is not already defined. + +\tpg[pgforeground]\t\pgforeground\ +adds material to the foreground of each page. + \tpg[linnum]\t\pstart, \t\pend\ dispalys line numbers of the marked text in the margin. -\tpg[shadedframe]\t\shadedframe\ -colored rectangular frames with simple shadows. - \tpg[roundframe]\t\roundframe\ colored frames with rounded corners and many options. +\tpg[shadedframe]\t\shadedframe\ +colored rectangular frames with simple shadows. + \tpg[scaleto]\t\scaleto, \t\scaletof\ text font size changed to the desired width. @@ -2072,8 +2078,8 @@ documentation. Example: \~`\isinlist\list{<text>}\iftrue` does `\iftrue` if <text> is in `\list`.\nl \^`\isnextchar`` <char>{<text1>}{<text2>}` performs <text1> if next character is <char>, else <text2>.\nl -\~`\kv` `{<key>}` expands to value when key-value parameters are used. - See also \~`\iskv`, \~`\readkv`, \~`\kvx`, \~`\nokvx`.\nl +\~`\kv` `{<key>}` expands to a value given by key=value. + See also \~`\trykv`, \~`\iskv`, \~`\readkv`, \~`\kvx`, \~`\nokvx`.\nl \^`\loop` `...` \^`\repeat` is classical Plain \TeX/ loop.\nl \^`\mathstyles`` {<math list>}` enables to create macros dependent on current math style.\nl \~`\_namespace`` {<pkg>}` declares name space used by package writers.\nl diff --git a/macros/optex/doc/primitives.tex b/macros/optex/doc/primitives.tex new file mode 100644 index 0000000000..11ced8bca1 --- /dev/null +++ b/macros/optex/doc/primitives.tex @@ -0,0 +1,387 @@ +%% This is part of the OpTeX project, see http://petr.olsak.net/optex + +% There is a list of TeX primitives used by OpTeX, they are printed in the Index. + +\def\addprimitive#1{\_ea\addprimitiveA \_csname,\_csstring#1\_endcsname} +\def\addprimitiveA#1{\ifx#1\relax\_addto\_iilist#1\fi \_gdef#1{}} +\def\_intlink{\_link[cs:\_tmpa]{\choosecolor}{\_csstring\\\_tmpb}} +\def\choosecolor{\_ea\ifx\csname,\_tmpa\endcsname\empty \primcolor\else\ulinkcolor\fi} +\def\primcolor{\setcmykcolor{.7 0 .7 .5}} + +\xargs\addprimitive +%\above +\abovedisplayshortskip +\abovedisplayskip +%\abovewithdelims +\accent +\adjdemerits +\advance +\afterassignment +\aftergroup +\atop +\atopwithdelims +\attributedef +\baselineskip +%\batchmode +\begingroup +\belowdisplayshortskip +\belowdisplayskip +\binoppenalty +%\botmark +\box +\boxmaxdepth +\breakafterdirmode +\brokenpenalty +%\catcode +\catcodetable +\char +\chardef +\cleaders +\closein +\closeout +\clubpenalty +\copy +\countdef +\cr +\crampeddisplaystyle +\crampedscriptstyle +\crampedscriptscriptstyle +\crampedtextstyle +\crcr +\csname +\csstring +\day +\def +\defaulthyphenchar +\defaultskewchar +\delcode +\delimiter +\delimiterfactor +\delimitershortfall +\detokenize +\dimen +\dimendef +\dimexpr +\directlua +\discretionary +%\displaylimits +\displaystyle +\displaywidowpenalty +\displaywidth +\divide +\doublehyphendemerits +\dump +\edef +%\efcode +\else +\emergencystretch +\end +\endcsname +\endgroup +\endinput +\endlinechar +\eqno +\errmessage +\errorcontextlines +%\errorstopmode +\escapechar +\everycr +\everydisplay +\everyeof +%\everyhbox +\everyjob +\everymath +\everypar +%\everyvbox +\exhyphenpenalty +\expandafter +\expanded +\fi +\finalhyphendemerits +\firstmark +\floatingpenalty +\font +\fontdimen +\fontname +\futurelet +\gdef +\glet +\global +\globaldefs +\halign +\hangafter +\hangindent +\hbadness +\hbox +\hfil +\hfill +%\hfilneg +\hfuzz +\hoffset +\hrule +\hsize +\hskip +\hss +\hyphenation +\hyphenchar +\hyphenpenalty +\if +\ifcase +\ifcat +\ifcsname +\ifdim +\ifeof +\iffalse +%\ifhbox +\ifhmode +\ifinner +\ifmmode +\ifnum +\ifodd +\iftrue +%\ifvbox +\ifvmode +\ifvoid +\ifx +\ignorespaces +\immediate +\immediateassigned +\immediateassignment +\indent +\input +\inputlineno +\interlinepenalty +\jobname +\kern +%\knaccode +%\knbccode +%\knbscode +\language +\lastbox +\lastnamedcs +\lastpenalty +\lastskip +\lccode +\leaders +\left +\lefthyphenmin +\leftskip +\leqno +\let +%\letterspacefont +\limits +\linepenalty +\lineskip +\lineskiplimit +\long +%\looseness +\lower +\lowercase +%\lpcode +\luaescapestring +\mag +\mark +\mathaccent +\mathbin +\mathchar +\mathchardef +\mathchoice +\mathclose +\mathcode +\matheqdirmode +\mathop +\mathopen +\mathord +\mathpunct +\mathrel +\mathsurround +\maxdepth +\meaning +\medmuskip +\message +\middle +\mkern +\month +\moveleft +\moveright +\mskip +\multiply +\muskip +\muskipdef +\newlinechar +\noalign +\noexpand +\noindent +\nolimits +\nonscript +%\nonstopmode +\nulldelimiterspace +\nullfont +\number +\numexpr +\omit +\openin +\openout +\outer +\output +\outputmode +\outputpenalty +\over +\overfullrule +%\overwithdelims +\par +\parfillskip +\parindent +%\parshape +\parskip +\patterns +%\pdfadjustinterwordglue +%\pdfadjustspacing +\pdfcatalog +%\pdfcolorstack +\pdfdest +\pdfendlink +\pdfextension +\pdffeedback +%\pdffontexpand +\pdfhorigin +\pdfinfo +\pdflastximage +\pdflastxpos +\pdflastypos +\pdfliteral +%\pdfnormaldeviate +\pdfoutline +\pdfpageheight +\pdfpagewidth +%\pdfprotrudechars +\pdfrefximage +\pdfrestore +\pdfsave +\pdfsavepos +\pdfsetmatrix +%\pdfsetrandomseed +\pdfstartlink +%\pdfstrcmp +%\pdfuniformdeviate +\pdfvariable +\pdfvorigin +\pdfximage +\penalty +\postdisplaypenalty +\predisplaypenalty +\pretolerance +\prevdepth +\prevgraph +\protected +\protrudechars +\radical +\raise +\read +\relax +\relpenalty +\right +\righthyphenmin +\rightskip +\romannumeral +\root +%\rpcode +\savecatcodetable +\scantextokens +\scantokens +\scriptfont +\scriptscriptfont +\scriptscriptstyle +\scriptstyle +%\scrollmode +\setbox +\sfcode +%\shbscode +\shipout +\show +\showbox +\showboxbreadth +\showboxdepth +\showlists +\showthe +\skewchar +\skip +\skipdef +\spacefactor +\spaceskip +\span +%\special +\splitmaxdepth +\splittopskip +\sqrt +%\stbscode +\string +\suppressfontnotfounderror +\tabskip +\textfont +\textstyle +\the +\thickmuskip +\thinmuskip +\time +\toks +\toksdef +\tolerance +%\topmark +\topskip +\tracingassigns +\tracingcommands +\tracinggroups +\tracingifs +\tracinglostchars +\tracingmacros +\tracingonline +\tracingoutput +\tracingpages +\tracingparagraphs +\tracingrestores +\tracingscantokens +\tracingstats +\uccode +\Uchar +\uchyph +\Udelcode +\Udelimiter +\Umathaccent +\Umathchar +\Umathchardef +\Umathcode +\unexpanded +\unhbox +\unhcopy +\unless +\unpenalty +\unskip +\unvbox +\unvcopy +\uppercase +\Uradical +\vadjust +\valign +\vbadness +\vbox +\vcenter +\vfil +\vfill +\vfilneg +\vfuzz +\voffset +\vrule +\vsize +\vskip +\vsplit +\vss +\vtop +\wd +\widowpenalty +\write +\xdef +%\xleaders +\xspaceskip +\year +; diff --git a/macros/optex/pkg/mte.opm b/macros/optex/pkg/mte.opm index 0c8b22152a..5352d5dd78 100644 --- a/macros/optex/pkg/mte.opm +++ b/macros/optex/pkg/mte.opm @@ -658,7 +658,7 @@ You can define your own protrusion or expansion values: copy macros as you wish using `\def`. Such definition has precedence. Similar definitions can be in some font family files too, so: do your definition after all `\fontfam` if you want to keep the precedence. -All such definitions must be performed before the `\mteinit` command. +All such definitions must be performed before the \^`\enablemte` command. You can use `\def\_mte_P` for data of protrusion for all fonts which has general precedence. For example, if you want to protrude hyphen diff --git a/support/texlogfilter/README b/support/texlogfilter/README index e8ceb46dc5..d621a2aeb4 100644 --- a/support/texlogfilter/README +++ b/support/texlogfilter/README @@ -69,13 +69,15 @@ texlogfilter 1.1 HISTORY - * 2024, February, version 1.2 : fix duplicate or missing lines; handle - package and class names with hyphen ; add info and warning patterns + * 2024, February, version 1.3: better detect the current file name. + + * 2024, February, version 1.2: fix duplicate or missing lines; handle + package and class names with hyphen; add info and warning patterns for fonts. - * 2022, March, version 1.1 : add --info and --no-info options. + * 2022, March, version 1.1: add --info and --no-info options. - * 2021, November, version 1.0 : initial version. + * 2021, November, version 1.0: initial version. DOCUMENTATION The documentation is integrated, writtent in Plain Old Documentation diff --git a/support/texlogfilter/texlogfilter b/support/texlogfilter/texlogfilter index 6a8b246232..341318e576 100755 --- a/support/texlogfilter/texlogfilter +++ b/support/texlogfilter/texlogfilter @@ -16,7 +16,7 @@ use Getopt::Long; use Term::ANSIColor; my $name = "texlogfilter"; -my $version = "1.2"; +my $version = "1.3"; # options my @userfilters; @@ -27,7 +27,7 @@ my $showboxmsg = 1; my $showinfomsg = 0; my $showskips = 0; my $skipmarker = "..."; -my $extpattern = "tex|sty|cls|bib"; +my $extpattern = "tex|sty|cls|bib|fd|bst|bbx|cbx|def|clo"; my $fulllog = 0; my $printfilename = -1; # -1: value not modified by options my $errcolor = "red"; @@ -187,7 +187,8 @@ while (<>) { # assume currentfile is given in the last open parenthesis # (works badly for packages) - if (/\(([^)]+$extpattern)$/) {$currentfile = $1;} + if (/^[^(]*\)/) {$currentfile = ""; $lastfile = "";} + if (/\(([^)]+($extpattern))$/) {$currentfile = $1;} # try to show usefull lines following some warnings or errors (starting with # whitespaces or package name) @@ -341,12 +342,14 @@ distributions of LaTeX version 2005/12/01 or later. =over -=item * 2024, February, version 1.2 : fix duplicate or missing lines; handle -package and class names with hyphen ; add info and warning patterns for fonts. +=item * 2024, February, version 1.3: better detect the current file name. -=item * 2022, March, version 1.1 : add --info and --no-info options. +=item * 2024, February, version 1.2: fix duplicate or missing lines; handle +package and class names with hyphen; add info and warning patterns for fonts. -=item * 2021, November, version 1.0 : initial version. +=item * 2022, March, version 1.1: add --info and --no-info options. + +=item * 2021, November, version 1.0: initial version. =back diff --git a/support/texlogfilter/texlogfilter.html b/support/texlogfilter/texlogfilter.html index 789edcbc84..350951829e 100644 --- a/support/texlogfilter/texlogfilter.html +++ b/support/texlogfilter/texlogfilter.html @@ -94,13 +94,16 @@ <ul> -<li><p>2024, February, version 1.2 : fix duplicate or missing lines; handle package and class names with hyphen ; add info and warning patterns for fonts.</p> +<li><p>2024, February, version 1.3: better detect the current file name.</p> </li> -<li><p>2022, March, version 1.1 : add --info and --no-info options.</p> +<li><p>2024, February, version 1.2: fix duplicate or missing lines; handle package and class names with hyphen; add info and warning patterns for fonts.</p> </li> -<li><p>2021, November, version 1.0 : initial version.</p> +<li><p>2022, March, version 1.1: add --info and --no-info options.</p> + +</li> +<li><p>2021, November, version 1.0: initial version.</p> </li> </ul> diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl index 99a93e2a42..06638ca3e0 100644 --- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl @@ -24,9 +24,6 @@ $mirrors = { 'https://mirrors.tuna.tsinghua.edu.cn/CTAN/' => 1, 'https://mirrors.ustc.edu.cn/CTAN/' => 1, }, - 'Hong Kong' => { - 'https://mirror-hk.koddos.net/CTAN/' => 1, - }, 'India' => { 'https://in.mirrors.cicku.me/ctan/' => 1, 'https://mirror.niser.ac.in/ctan/' => 1, @@ -40,13 +37,14 @@ $mirrors = { 'https://ctan.yazd.ac.ir/' => 1, }, 'Japan' => { - 'http://ring.airnet.ne.jp/archives/text/CTAN/' => 1, + 'https://ftp.jaist.ac.jp/pub/CTAN/' => 1, 'https://ftp.kddilabs.jp/CTAN/' => 1, 'https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/' => 1, 'https://jp.mirrors.cicku.me/ctan/' => 1, }, 'Korea' => { 'http://ftp.ktug.org/tex-archive/' => 1, + 'https://ftp.kaist.ac.kr/tex-archive/' => 1, 'https://kr.mirrors.cicku.me/ctan/' => 1, 'https://lab.uklee.pe.kr/tex-archive/' => 1, 'https://mirror.kakao.com/CTAN/' => 1, @@ -200,7 +198,6 @@ $mirrors = { 'Australia' => { 'https://au.mirrors.cicku.me/ctan/' => 1, 'https://mirror.aarnet.edu.au/pub/CTAN/' => 1, - 'https://mirror.cse.unsw.edu.au/pub/CTAN/' => 1, }, }, 'South America' => { diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb index 70e76c2b39..ad8d52af03 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb @@ -26,7 +26,7 @@ depend container_split_src_files/1 depend frozen/0 depend minrelease/2016 depend release/2023 -depend revision/69828 +depend revision/69848 name 00texlive.image category TLCore @@ -4850,7 +4850,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd name 00texlive.installer category TLCore -revision 69818 +revision 69830 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 @@ -324576,7 +324576,7 @@ docfiles size=376 name texlive-scripts category TLCore -revision 69818 +revision 69830 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. @@ -324584,10 +324584,10 @@ depend texlive-scripts.ARCH depend texlive.infra execute addMap mathpple.map postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat -containersize 114048 -containerchecksum c4473bfee861397aaf297a42fa17af1eeb0d0ede0b9e2ce1987f939c80e8f2b13c1a55f8634d38b20bb5d6dc184ffad40cecc4dc332b1ca66db22806521e8162 +containersize 114016 +containerchecksum b51853014b8eb066752a924af18874e9e8294bcee70f32578c9c8f236623307ccca583ab7b5e0328f353784f6fa530486fea721e298c514fc7019eeba43f5cd1 doccontainersize 432272 -doccontainerchecksum 72f5fa48ffdbc124956fbcdb1f32ab4a6582c103058e6e00c4c588963f7fde3ca0ec3f353ac6b0d447d325bed0808f4381cf22416bef2eb0ca4a15896a547a73 +doccontainerchecksum 52fe9ea255c6ac85aadfe1b49efafae42d0896e16859e6b9c2826746dc265c9846816785c45ec45e5b96162e99772fcbfb7a445ae46c39dcfcc67014fe35a84e docfiles size=564 doc.html texmf-dist/doc/man/man1/fmtutil-sys.1 diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 index b62201a301..a0531955de 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 @@ -1 +1 @@ -de4a5aa6a764933f85281b384f474e18 texlive.tlpdb +cc308c08b6deabc7d0f2f62ad9cb7436 texlive.tlpdb diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 index fa167724f7..303f85debe 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 @@ -1 +1 @@ -c8dafd24d336467b4248536de63d42ec2992d95fdacaf4dc25a519b507556c180e54232d9133a01c55b1ec14c3908975964328f61316aaa07dc9cf831c1769c5 texlive.tlpdb +5d6fd5d771e3136953ebcef2ec11e9b3b76c9eb29a73ae14675b51f5fc1805cd5a12178892c2be60de4da71e63314eb75627e7330f26cfd754307da8db566155 texlive.tlpdb diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc index 1ce121f343..455a3625fd 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+QqiBBqTOGHfhlDjHAFAmXK0ycACgkQTOGHfhlD -jHDIJggAim+czRYNVtOnwXq2Cw8BpRMzjePCNjNeiWEajSg17mjMNrxAhKyN5Umb -9rtBrDIjCdmsTUAefwwyVd27ZUbTvtGcehOhOabhXq5hf2+ZAqjdBG4/bqUWEqc/ -DNYTAA0p9nehqHjuXjcVQ+ZmoDVJ+sCb8nVxSFFMQjUqq4jeJXUCTp96HcFpaE9F -zfkQjZivfQ01ad7SK1oeDz/4YYJGooiErNggbMsyer3AqTjisXJ/2UFVr6Pecho5 -tWzKDUkdCdmNqsTT4ZtULXf4Z+mlKJH1g3oodcxfxwj8awow2O3ms5H9LWWCG0U+ -Gn68PihBnbIhhO6iC9OfNEl6isQXLQ== -=SxXi +iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmXMJN0ACgkQTOGHfhlD +jHCiJggAi+byUEyFm7TcdlSBTCttv4vaLx7rJXmnrvoZ7T7ImA5VfTSubTLWUOJ8 +mHCRnuPjt6xbl7EMBqJubIc/SoHxSMzLBrpSlf9TRJj5NytX8peowp8/TSuFlhSS +JTZzAMrF6e3pqhT3qC0w8gv0zUMn1LAX1DY5TkxsB65cUzHEhYtswCWJYiOgs0+D +ygzm6u6qiXNXGl38x4bOEPPv9YErqrBOm4aTP8NXkI4kvLPhChv9NEYLojHoaV0l +GbUlpeQb+yHRgJ/HYtXF/YnYkD6A89jI/mujOxzbtKBhHgSrKvHMdZoQQe8q5jDr +bVCagm9Xxm+tDLICVmEWmpkobSD3PQ== +=ZEZ5 -----END PGP SIGNATURE----- diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz Binary files differindex a1db8e19b0..dc7092d953 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: dante.ctan.org # The year-month-day-hour-minute of this site's material: -2024-02-14-02-02 +2024-02-15-02-02 |