summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-09-25 03:02:18 +0000
committerNorbert Preining <norbert@preining.info>2024-09-25 03:02:18 +0000
commit224bec647afdf054bb090ee64640e2a736b6b4ed (patch)
tree3cdf6fa811e69803227ac8af936a4b4d9a944b87
parentc9bd28f387903dc2da4108d8e82bf0c8be4be3be (diff)
CTAN sync 202409250302
-rw-r--r--FILES.byname143
-rw-r--r--FILES.byname.gzbin2677883 -> 2677684 bytes
-rw-r--r--FILES.last07days151
-rw-r--r--biblio/ctan-bibdata/ctan.bib16
-rw-r--r--install/macros/unicodetex/latex/tex/latex/polyglossia/polyglossia.sty2468
-rw-r--r--macros/latex/contrib/easybook/README.md2
-rw-r--r--macros/latex/contrib/easybook/easybook.dtx6
-rw-r--r--macros/latex/contrib/easybook/easybook.pdfbin639786 -> 643393 bytes
-rw-r--r--macros/latex/contrib/easybook/easybook.tex31
-rw-r--r--macros/latex/contrib/jupynotex/README.md61
-rwxr-xr-xmacros/latex/contrib/jupynotex/example/build5
-rw-r--r--macros/latex/contrib/jupynotex/example/example.tex27
-rw-r--r--macros/latex/contrib/jupynotex/example/notebook.ipynb593
-rw-r--r--macros/latex/contrib/jupynotex/jupynotex.py331
-rw-r--r--macros/latex/contrib/jupynotex/jupynotex.sty18
-rwxr-xr-xmacros/latex/contrib/jupynotex/tests/run3
-rw-r--r--macros/latex/contrib/jupynotex/tests/test_cellparser.py79
-rw-r--r--macros/latex/contrib/jupynotex/tests/test_main.py111
-rw-r--r--macros/latex/contrib/jupynotex/tests/test_notebook.py237
-rw-r--r--support/TeX4ht/source/ChangeLog20
-rw-r--r--support/TeX4ht/source/Makefile6
-rw-r--r--support/TeX4ht/source/tex4ht-4ht.tex43
-rw-r--r--support/TeX4ht/source/tex4ht-sty.tex16
-rw-r--r--support/TeX4ht/source/wripro.tex6
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl6
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt102
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb310
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.md52
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha5122
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc16
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2595656 -> 2600132 bytes
-rw-r--r--timestamp2
32 files changed, 899 insertions, 3914 deletions
diff --git a/FILES.byname b/FILES.byname
index cba6cbc812..44aa1cdec1 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -2147,12 +2147,12 @@
2024/09/14 | 1837 | biblio/citation-style-language/README.md
2024/09/14 | 12878 | biblio/citation-style-language/vancouver.csl
2024/09/14 | 4575789 | biblio/citation-style-language.zip
-2024/09/23 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2024/09/24 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx
-2024/09/23 | 2889760 | biblio/ctan-bibdata/ctan.bib
-2024/09/23 | 3708800 | biblio/ctan-bibdata/ctan.pdf
+2024/09/24 | 2890173 | biblio/ctan-bibdata/ctan.bib
+2024/09/24 | 3708800 | biblio/ctan-bibdata/ctan.pdf
2023/01/16 | 1489 | biblio/ctan-bibdata/README
-2024/09/23 | 4126081 | biblio/ctan-bibdata.zip
+2024/09/24 | 4126138 | biblio/ctan-bibdata.zip
2023/02/23 | 3126 | biblio/pbibtex/pbibtex-base/cpp.awk
2023/02/23 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh
2023/02/23 | 22362 | biblio/pbibtex/pbibtex-base/jabbrv.bst
@@ -5514,7 +5514,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2024/09/23 | 192677 | FILES.last07days
+2024/09/24 | 229262 | 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
@@ -207720,7 +207720,6 @@
2024/05/11 | 1346852 | install/macros/unicodetex/latex/fontspec.tds.zip
2024/09/23 | 711672 | install/macros/unicodetex/latex/polyglossia.tds.zip
2016/02/13 | 111305 | install/macros/unicodetex/latex/realscripts.tds.zip
-2024/09/23 | 74258 | install/macros/unicodetex/latex/tex/latex/polyglossia/polyglossia.sty
2021/02/09 | 4924350 | install/macros/unicodetex/latex/texnegar.tds.zip
2023/08/13 | 3485348 | install/macros/unicodetex/latex/unicode-math.tds.zip
2016/05/14 | 185871 | install/macros/xetex/generic/zhspacing.tds.zip
@@ -233293,12 +233292,12 @@
2008/02/10 | 19110 | macros/latex/contrib/ean13isbn/License.txt
2021/01/24 | 422 | macros/latex/contrib/ean13isbn/README
2021/01/24 | 322624 | macros/latex/contrib/ean13isbn.zip
-2024/09/23 | 90506 | macros/latex/contrib/easybook/easybook.dtx
+2024/09/24 | 90506 | macros/latex/contrib/easybook/easybook.dtx
2024/01/04 | 2081 | macros/latex/contrib/easybook/easybook.ins
-2024/09/23 | 639786 | macros/latex/contrib/easybook/easybook.pdf
-2024/09/23 | 109802 | macros/latex/contrib/easybook/easybook.tex
-2024/09/23 | 913 | macros/latex/contrib/easybook/README.md
-2024/09/23 | 692765 | macros/latex/contrib/easybook.zip
+2024/09/24 | 643393 | macros/latex/contrib/easybook/easybook.pdf
+2024/09/24 | 111087 | macros/latex/contrib/easybook/easybook.tex
+2024/09/24 | 913 | macros/latex/contrib/easybook/README.md
+2024/09/24 | 696673 | macros/latex/contrib/easybook.zip
2009/06/17 | 82589 | macros/latex/contrib/easy/doc/docbib.pdf
2009/06/17 | 78378 | macros/latex/contrib/easy/doc/docbmat.pdf
2009/06/17 | 99132 | macros/latex/contrib/easy/doc/doceqn.pdf
@@ -241238,18 +241237,11 @@
2015/06/02 | 17996 | macros/latex/contrib/jumplines/jumplines.sty
2015/06/02 | 1518 | macros/latex/contrib/jumplines/README
2015/06/02 | 257991 | macros/latex/contrib/jumplines.zip
-2020/10/19 | 94 | macros/latex/contrib/jupynotex/example/build
-2020/10/19 | 286 | macros/latex/contrib/jupynotex/example/example.tex
-2020/10/19 | 42204 | macros/latex/contrib/jupynotex/example/notebook.ipynb
-2020/10/19 | 5212 | macros/latex/contrib/jupynotex/jupynotex.py
-2020/10/19 | 131 | macros/latex/contrib/jupynotex/jupynotex.sty
-2020/10/19 | 11357 | macros/latex/contrib/jupynotex/LICENSE
-2020/10/19 | 2137 | macros/latex/contrib/jupynotex/README.md
-2020/10/19 | 59 | macros/latex/contrib/jupynotex/tests/run
-2020/10/19 | 1901 | macros/latex/contrib/jupynotex/tests/test_cellparser.py
-2020/10/19 | 3093 | macros/latex/contrib/jupynotex/tests/test_main.py
-2020/10/19 | 5269 | macros/latex/contrib/jupynotex/tests/test_notebook.py
-2020/10/20 | 33486 | macros/latex/contrib/jupynotex.zip
+2024/09/20 | 11464 | macros/latex/contrib/jupynotex/jupynotex.py
+2024/09/20 | 388 | macros/latex/contrib/jupynotex/jupynotex.sty
+2024/06/28 | 11357 | macros/latex/contrib/jupynotex/LICENSE
+2024/09/20 | 4163 | macros/latex/contrib/jupynotex/README.md
+2024/09/24 | 10575 | macros/latex/contrib/jupynotex.zip
2004/09/22 | 48526 | macros/latex/contrib/juraabbrev/juraabbrev.dtx
2004/09/22 | 410 | macros/latex/contrib/juraabbrev/juraabbrev.ins
2004/09/22 | 479255 | macros/latex/contrib/juraabbrev/juraabbrev.pdf
@@ -308263,8 +308255,8 @@
2021/07/26 | 1568 | systems/texlive/tlnet/archive/beamertheme-simpledarkblue.r60061.tar.xz
2022/10/22 | 37024 | systems/texlive/tlnet/archive/beamertheme-simpleplus.doc.r64770.tar.xz
2022/10/22 | 1904 | systems/texlive/tlnet/archive/beamertheme-simpleplus.r64770.tar.xz
-2024/04/30 | 173452 | systems/texlive/tlnet/archive/beamertheme-tcolorbox.doc.r71124.tar.xz
-2024/04/30 | 2416 | systems/texlive/tlnet/archive/beamertheme-tcolorbox.r71124.tar.xz
+2024/09/24 | 173544 | systems/texlive/tlnet/archive/beamertheme-tcolorbox.doc.r72368.tar.xz
+2024/09/24 | 2428 | systems/texlive/tlnet/archive/beamertheme-tcolorbox.r72368.tar.xz
2023/02/20 | 585252 | systems/texlive/tlnet/archive/beamertheme-trigon.doc.r65985.tar.xz
2023/02/20 | 6096 | systems/texlive/tlnet/archive/beamertheme-trigon.r65985.tar.xz
2023/02/20 | 15168 | systems/texlive/tlnet/archive/beamertheme-trigon.source.r65985.tar.xz
@@ -310999,9 +310991,9 @@
2021/07/19 | 313228 | systems/texlive/tlnet/archive/easing.doc.r59975.tar.xz
2021/07/19 | 2220 | systems/texlive/tlnet/archive/easing.r59975.tar.xz
2021/07/19 | 7876 | systems/texlive/tlnet/archive/easing.source.r59975.tar.xz
-2024/09/23 | 668368 | systems/texlive/tlnet/archive/easybook.doc.r72348.tar.xz
-2024/09/23 | 19640 | systems/texlive/tlnet/archive/easybook.r72348.tar.xz
-2024/09/23 | 19520 | systems/texlive/tlnet/archive/easybook.source.r72348.tar.xz
+2024/09/24 | 669108 | systems/texlive/tlnet/archive/easybook.doc.r72368.tar.xz
+2024/09/24 | 19536 | systems/texlive/tlnet/archive/easybook.r72368.tar.xz
+2024/09/24 | 19420 | systems/texlive/tlnet/archive/easybook.source.r72368.tar.xz
2019/02/28 | 4540 | systems/texlive/tlnet/archive/easy.doc.r19440.tar.xz
2023/10/12 | 344 | systems/texlive/tlnet/archive/easydtx.aarch64-linux.r68514.tar.xz
2023/10/12 | 344 | systems/texlive/tlnet/archive/easydtx.amd64-freebsd.r68514.tar.xz
@@ -313573,8 +313565,8 @@
2019/02/28 | 9192 | systems/texlive/tlnet/archive/keyreader.r28195.tar.xz
2019/02/28 | 33556 | systems/texlive/tlnet/archive/keystroke.doc.r17992.tar.xz
2019/02/28 | 6820 | systems/texlive/tlnet/archive/keystroke.r17992.tar.xz
-2024/09/21 | 530224 | systems/texlive/tlnet/archive/keytheorems.doc.r72331.tar.xz
-2024/09/21 | 15400 | systems/texlive/tlnet/archive/keytheorems.r72331.tar.xz
+2024/09/24 | 536060 | systems/texlive/tlnet/archive/keytheorems.doc.r72368.tar.xz
+2024/09/24 | 15712 | systems/texlive/tlnet/archive/keytheorems.r72368.tar.xz
2019/02/28 | 314328 | systems/texlive/tlnet/archive/keyval2e.doc.r23698.tar.xz
2019/02/28 | 3228 | systems/texlive/tlnet/archive/keyval2e.r23698.tar.xz
2023/01/01 | 902524 | systems/texlive/tlnet/archive/keyvaltable.doc.r65416.tar.xz
@@ -313734,9 +313726,9 @@
2024/09/11 | 12069664 | systems/texlive/tlnet/archive/l3kernel-dev.doc.r72248.tar.xz
2024/09/11 | 180236 | systems/texlive/tlnet/archive/l3kernel-dev.r72248.tar.xz
2024/09/11 | 623060 | systems/texlive/tlnet/archive/l3kernel-dev.source.r72248.tar.xz
-2024/09/10 | 12024268 | systems/texlive/tlnet/archive/l3kernel.doc.r72241.tar.xz
-2024/09/10 | 180392 | systems/texlive/tlnet/archive/l3kernel.r72241.tar.xz
-2024/09/10 | 623020 | systems/texlive/tlnet/archive/l3kernel.source.r72241.tar.xz
+2024/09/24 | 12075204 | systems/texlive/tlnet/archive/l3kernel.doc.r72365.tar.xz
+2024/09/24 | 180340 | systems/texlive/tlnet/archive/l3kernel.r72365.tar.xz
+2024/09/24 | 622832 | systems/texlive/tlnet/archive/l3kernel.source.r72365.tar.xz
2024/08/29 | 1458196 | systems/texlive/tlnet/archive/l3packages.doc.r72128.tar.xz
2024/08/29 | 20424 | systems/texlive/tlnet/archive/l3packages.r72128.tar.xz
2024/08/29 | 27412 | systems/texlive/tlnet/archive/l3packages.source.r72128.tar.xz
@@ -314227,8 +314219,8 @@
2022/01/24 | 972 | systems/texlive/tlnet/archive/libertinus.r61719.tar.xz
2024/06/05 | 1541584 | systems/texlive/tlnet/archive/libertinust1math.doc.r71428.tar.xz
2024/06/05 | 1248816 | systems/texlive/tlnet/archive/libertinust1math.r71428.tar.xz
-2023/06/24 | 1447396 | systems/texlive/tlnet/archive/libertinus-type1.doc.r67450.tar.xz
-2023/06/24 | 8564832 | systems/texlive/tlnet/archive/libertinus-type1.r67450.tar.xz
+2024/09/24 | 1126120 | systems/texlive/tlnet/archive/libertinus-type1.doc.r72354.tar.xz
+2024/09/24 | 6489200 | systems/texlive/tlnet/archive/libertinus-type1.r72354.tar.xz
2022/11/14 | 159184 | systems/texlive/tlnet/archive/libgreek.doc.r65004.tar.xz
2022/11/14 | 4504 | systems/texlive/tlnet/archive/libgreek.r65004.tar.xz
2022/11/14 | 17020 | systems/texlive/tlnet/archive/libgreek.source.r65004.tar.xz
@@ -314340,7 +314332,7 @@
2019/02/28 | 340 | systems/texlive/tlnet/archive/listbib.x86_64-solaris.r26126.tar.xz
2019/02/28 | 259240 | systems/texlive/tlnet/archive/listing.doc.r17373.tar.xz
2019/02/28 | 1968 | systems/texlive/tlnet/archive/listing.r17373.tar.xz
-2024/05/26 | 2794444 | systems/texlive/tlnet/archive/listings.doc.r71355.tar.xz
+2024/09/24 | 2797684 | systems/texlive/tlnet/archive/listings.doc.r72368.tar.xz
2019/02/28 | 348 | systems/texlive/tlnet/archive/listings-ext.aarch64-linux.r46208.tar.xz
2019/02/28 | 348 | systems/texlive/tlnet/archive/listings-ext.amd64-freebsd.r16472.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/listings-ext.amd64-netbsd.r30191.tar.xz
@@ -314358,8 +314350,8 @@
2019/02/28 | 348 | systems/texlive/tlnet/archive/listings-ext.x86_64-linuxmusl.r46840.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/listings-ext.x86_64-linux.r15093.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/listings-ext.x86_64-solaris.r18442.tar.xz
-2024/05/26 | 147464 | systems/texlive/tlnet/archive/listings.r71355.tar.xz
-2024/05/26 | 272428 | systems/texlive/tlnet/archive/listings.source.r71355.tar.xz
+2024/09/24 | 147552 | systems/texlive/tlnet/archive/listings.r72368.tar.xz
+2024/09/24 | 272992 | systems/texlive/tlnet/archive/listings.source.r72368.tar.xz
2019/12/12 | 299004 | systems/texlive/tlnet/archive/listingsutf8.doc.r53097.tar.xz
2019/12/12 | 2264 | systems/texlive/tlnet/archive/listingsutf8.r53097.tar.xz
2019/12/12 | 5628 | systems/texlive/tlnet/archive/listingsutf8.source.r53097.tar.xz
@@ -314378,8 +314370,8 @@
2024/03/27 | 3436 | systems/texlive/tlnet/archive/litebook.r70777.tar.xz
2024/08/16 | 643420 | systems/texlive/tlnet/archive/litesolution.doc.r72036.tar.xz
2024/08/16 | 4480 | systems/texlive/tlnet/archive/litesolution.r72036.tar.xz
-2024/03/03 | 425180 | systems/texlive/tlnet/archive/litetable.doc.r70352.tar.xz
-2024/03/03 | 3840 | systems/texlive/tlnet/archive/litetable.r70352.tar.xz
+2024/09/24 | 757528 | systems/texlive/tlnet/archive/litetable.doc.r72368.tar.xz
+2024/09/24 | 3416 | systems/texlive/tlnet/archive/litetable.r72368.tar.xz
2023/03/08 | 56116 | systems/texlive/tlnet/archive/lithuanian.doc.r66461.tar.xz
2023/03/08 | 64828 | systems/texlive/tlnet/archive/lithuanian.r66461.tar.xz
2019/02/28 | 115684 | systems/texlive/tlnet/archive/liturg.doc.r15878.tar.xz
@@ -315427,9 +315419,9 @@
2022/01/24 | 41912 | systems/texlive/tlnet/archive/minitoc.r61719.tar.xz
2019/02/28 | 166396 | systems/texlive/tlnet/archive/minorrevision.doc.r32165.tar.xz
2019/02/28 | 1584 | systems/texlive/tlnet/archive/minorrevision.r32165.tar.xz
-2024/04/04 | 850304 | systems/texlive/tlnet/archive/minted.doc.r70838.tar.xz
-2024/04/04 | 10156 | systems/texlive/tlnet/archive/minted.r70838.tar.xz
-2024/04/04 | 47940 | systems/texlive/tlnet/archive/minted.source.r70838.tar.xz
+2024/09/24 | 1748344 | systems/texlive/tlnet/archive/minted.doc.r72368.tar.xz
+2024/09/24 | 22060 | systems/texlive/tlnet/archive/minted.r72368.tar.xz
+2024/09/24 | 41032 | systems/texlive/tlnet/archive/minted.source.r72368.tar.xz
2022/09/23 | 308412 | systems/texlive/tlnet/archive/mintspirit.doc.r64461.tar.xz
2022/09/23 | 1105472 | systems/texlive/tlnet/archive/mintspirit.r64461.tar.xz
2019/02/28 | 393404 | systems/texlive/tlnet/archive/minutes.doc.r42186.tar.xz
@@ -315928,8 +315920,8 @@
2019/02/28 | 196212 | systems/texlive/tlnet/archive/newspaper.doc.r15878.tar.xz
2019/02/28 | 1924 | systems/texlive/tlnet/archive/newspaper.r15878.tar.xz
2019/02/28 | 6804 | systems/texlive/tlnet/archive/newspaper.source.r15878.tar.xz
-2024/08/26 | 975276 | systems/texlive/tlnet/archive/newtx.doc.r72105.tar.xz
-2024/08/26 | 6064816 | systems/texlive/tlnet/archive/newtx.r72105.tar.xz
+2024/09/24 | 975348 | systems/texlive/tlnet/archive/newtx.doc.r72368.tar.xz
+2024/09/24 | 6064804 | systems/texlive/tlnet/archive/newtx.r72368.tar.xz
2024/01/27 | 263284 | systems/texlive/tlnet/archive/newtxsf.doc.r69597.tar.xz
2024/01/27 | 106028 | systems/texlive/tlnet/archive/newtxsf.r69597.tar.xz
2024/03/14 | 338392 | systems/texlive/tlnet/archive/newtxtt.doc.r70620.tar.xz
@@ -316808,8 +316800,8 @@
2020/10/10 | 1928 | systems/texlive/tlnet/archive/pgfopts.r56615.tar.xz
2020/10/10 | 6008 | systems/texlive/tlnet/archive/pgfopts.source.r56615.tar.xz
2024/08/15 | 2403676 | systems/texlive/tlnet/archive/pgfornament.doc.r72029.tar.xz
-2023/10/31 | 1350376 | systems/texlive/tlnet/archive/pgfornament-han.doc.r68704.tar.xz
-2023/10/31 | 96368 | systems/texlive/tlnet/archive/pgfornament-han.r68704.tar.xz
+2024/09/24 | 1530540 | systems/texlive/tlnet/archive/pgfornament-han.doc.r72357.tar.xz
+2024/09/24 | 96564 | systems/texlive/tlnet/archive/pgfornament-han.r72357.tar.xz
2024/08/15 | 616696 | systems/texlive/tlnet/archive/pgfornament.r72029.tar.xz
2024/09/10 | 5678472 | systems/texlive/tlnet/archive/pgf-periodictable.doc.r72236.tar.xz
2024/09/10 | 516812 | systems/texlive/tlnet/archive/pgf-periodictable.r72236.tar.xz
@@ -317102,9 +317094,8 @@
2021/08/26 | 30572 | systems/texlive/tlnet/archive/polski.source.r60322.tar.xz
2023/07/24 | 1392140 | systems/texlive/tlnet/archive/poltawski.doc.r67718.tar.xz
2023/07/24 | 6817740 | systems/texlive/tlnet/archive/poltawski.r67718.tar.xz
-2024/07/16 | 691676 | systems/texlive/tlnet/archive/polyglossia.doc.r71813.tar.xz
-2024/07/16 | 125344 | systems/texlive/tlnet/archive/polyglossia.r71813.tar.xz
-2024/07/16 | 169948 | systems/texlive/tlnet/archive/polyglossia.source.r71813.tar.xz
+2024/09/24 | 431912 | systems/texlive/tlnet/archive/polyglossia.doc.r72368.tar.xz
+2024/09/24 | 126016 | systems/texlive/tlnet/archive/polyglossia.r72368.tar.xz
2023/11/10 | 186376 | systems/texlive/tlnet/archive/polyhedra.doc.r68770.tar.xz
2023/11/10 | 3500 | systems/texlive/tlnet/archive/polyhedra.r68770.tar.xz
2019/02/28 | 400020 | systems/texlive/tlnet/archive/polynom.doc.r44832.tar.xz
@@ -317936,9 +317927,9 @@
2020/09/26 | 426068 | systems/texlive/tlnet/archive/repltext.doc.r56433.tar.xz
2020/09/26 | 1412 | systems/texlive/tlnet/archive/repltext.r56433.tar.xz
2020/09/26 | 7104 | systems/texlive/tlnet/archive/repltext.source.r56433.tar.xz
-2024/08/13 | 236104 | systems/texlive/tlnet/archive/reptheorem.doc.r72017.tar.xz
-2024/08/13 | 1692 | systems/texlive/tlnet/archive/reptheorem.r72017.tar.xz
-2024/08/13 | 5140 | systems/texlive/tlnet/archive/reptheorem.source.r72017.tar.xz
+2024/09/24 | 246676 | systems/texlive/tlnet/archive/reptheorem.doc.r72368.tar.xz
+2024/09/24 | 1860 | systems/texlive/tlnet/archive/reptheorem.r72368.tar.xz
+2024/09/24 | 5268 | systems/texlive/tlnet/archive/reptheorem.source.r72368.tar.xz
2022/07/11 | 331404 | systems/texlive/tlnet/archive/rerunfilecheck.doc.r63869.tar.xz
2022/07/11 | 3140 | systems/texlive/tlnet/archive/rerunfilecheck.r63869.tar.xz
2022/07/11 | 7216 | systems/texlive/tlnet/archive/rerunfilecheck.source.r63869.tar.xz
@@ -318249,9 +318240,9 @@
2019/02/28 | 2524 | systems/texlive/tlnet/archive/screenplay-pkg.r44965.tar.xz
2019/02/28 | 2764 | systems/texlive/tlnet/archive/screenplay.r27223.tar.xz
2019/02/28 | 17316 | systems/texlive/tlnet/archive/screenplay.source.r27223.tar.xz
-2024/09/06 | 568844 | systems/texlive/tlnet/archive/scrhack.doc.r72204.tar.xz
-2024/09/06 | 3824 | systems/texlive/tlnet/archive/scrhack.r72204.tar.xz
-2024/09/06 | 20980 | systems/texlive/tlnet/archive/scrhack.source.r72204.tar.xz
+2024/09/24 | 568844 | systems/texlive/tlnet/archive/scrhack.doc.r72368.tar.xz
+2024/09/24 | 3892 | systems/texlive/tlnet/archive/scrhack.r72368.tar.xz
+2024/09/24 | 20980 | systems/texlive/tlnet/archive/scrhack.source.r72368.tar.xz
2023/12/29 | 918260 | systems/texlive/tlnet/archive/scripture.doc.r69232.tar.xz
2023/12/29 | 8872 | systems/texlive/tlnet/archive/scripture.r69232.tar.xz
2023/12/29 | 23944 | systems/texlive/tlnet/archive/scripture.source.r69232.tar.xz
@@ -318800,8 +318791,8 @@
2023/10/17 | 6361456 | systems/texlive/tlnet/archive/stex.doc.r68569.tar.xz
2023/10/17 | 91048 | systems/texlive/tlnet/archive/stex.r68569.tar.xz
2023/10/17 | 50020 | systems/texlive/tlnet/archive/stex.source.r68569.tar.xz
-2021/10/19 | 406344 | systems/texlive/tlnet/archive/stickstoo.doc.r60793.tar.xz
-2021/10/19 | 2668304 | systems/texlive/tlnet/archive/stickstoo.r60793.tar.xz
+2024/09/24 | 406440 | systems/texlive/tlnet/archive/stickstoo.doc.r72368.tar.xz
+2024/09/24 | 2668708 | systems/texlive/tlnet/archive/stickstoo.r72368.tar.xz
2021/04/05 | 1252812 | systems/texlive/tlnet/archive/stix2-otf.doc.r58735.tar.xz
2021/04/05 | 1382984 | systems/texlive/tlnet/archive/stix2-otf.r58735.tar.xz
2021/01/17 | 1393108 | systems/texlive/tlnet/archive/stix2-type1.doc.r57448.tar.xz
@@ -319488,7 +319479,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/09/23 | 437200 | systems/texlive/tlnet/archive/texlive-scripts.doc.r72352.tar.xz
+2024/09/24 | 437160 | systems/texlive/tlnet/archive/texlive-scripts.doc.r72367.tar.xz
2024/07/09 | 908 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r71749.tar.xz
2024/07/09 | 920 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r71749.tar.xz
2024/07/09 | 908 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r71749.tar.xz
@@ -319510,7 +319501,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/09/23 | 114448 | systems/texlive/tlnet/archive/texlive-scripts.r72352.tar.xz
+2024/09/24 | 114460 | systems/texlive/tlnet/archive/texlive-scripts.r72367.tar.xz
2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz
2024/05/10 | 60592 | systems/texlive/tlnet/archive/texlive-scripts.windows.r71215.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz
@@ -321468,16 +321459,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2024/07/20 | 125851 | systems/texlive/tlnet/install-tl
-2024/09/23 | 5752613 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2024/09/23 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2024/09/23 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2024/09/24 | 5752290 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2024/09/24 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2024/09/24 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2024/04/13 | 5743 | systems/texlive/tlnet/install-tl-windows.bat
-2024/09/23 | 27717443 | systems/texlive/tlnet/install-tl-windows.exe
-2024/09/23 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2024/09/23 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2024/09/23 | 34425933 | systems/texlive/tlnet/install-tl.zip
-2024/09/23 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2024/09/23 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2024/09/24 | 27719673 | systems/texlive/tlnet/install-tl-windows.exe
+2024/09/24 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2024/09/24 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2024/09/24 | 34425952 | systems/texlive/tlnet/install-tl.zip
+2024/09/24 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2024/09/24 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2024/03/13 | 1229 | systems/texlive/tlnet/README.md
2024/03/13 | 0 | systems/texlive/tlnet/TEXLIVE_2024
2024/01/02 | 9011 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -321487,7 +321478,7 @@
2024/01/02 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2024/07/29 | 50743 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2024/09/23 | 7519 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2024/09/24 | 7593 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2024/07/03 | 228633 | 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
@@ -321529,12 +321520,12 @@
2023/02/21 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2024/05/02 | 5898 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2024/09/23 | 19616654 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2024/09/23 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2024/09/24 | 19593531 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2024/09/24 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2024/06/22 | 87725 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2024/09/23 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2024/09/23 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2024/09/23 | 2598588 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2024/09/24 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2024/09/24 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2024/09/24 | 2595656 | 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
@@ -333251,7 +333242,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/09/24 | 186 | timestamp
+2024/09/25 | 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
index 8ccadd737a..d729216b62 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 0c40bbf8fe..fbdf4b7d52 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,3 +1,64 @@
+2024/09/24 | 975348 | systems/texlive/tlnet/archive/newtx.doc.r72368.tar.xz
+2024/09/24 | 96564 | systems/texlive/tlnet/archive/pgfornament-han.r72357.tar.xz
+2024/09/24 | 913 | macros/latex/contrib/easybook/README.md
+2024/09/24 | 90506 | macros/latex/contrib/easybook/easybook.dtx
+2024/09/24 | 7593 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2024/09/24 | 757528 | systems/texlive/tlnet/archive/litetable.doc.r72368.tar.xz
+2024/09/24 | 696673 | macros/latex/contrib/easybook.zip
+2024/09/24 | 669108 | systems/texlive/tlnet/archive/easybook.doc.r72368.tar.xz
+2024/09/24 | 6489200 | systems/texlive/tlnet/archive/libertinus-type1.r72354.tar.xz
+2024/09/24 | 643393 | macros/latex/contrib/easybook/easybook.pdf
+2024/09/24 | 622832 | systems/texlive/tlnet/archive/l3kernel.source.r72365.tar.xz
+2024/09/24 | 6064804 | systems/texlive/tlnet/archive/newtx.r72368.tar.xz
+2024/09/24 | 5752290 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2024/09/24 | 568844 | systems/texlive/tlnet/archive/scrhack.doc.r72368.tar.xz
+2024/09/24 | 536060 | systems/texlive/tlnet/archive/keytheorems.doc.r72368.tar.xz
+2024/09/24 | 5268 | systems/texlive/tlnet/archive/reptheorem.source.r72368.tar.xz
+2024/09/24 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2024/09/24 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2024/09/24 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2024/09/24 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2024/09/24 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2024/09/24 | 437160 | systems/texlive/tlnet/archive/texlive-scripts.doc.r72367.tar.xz
+2024/09/24 | 431912 | systems/texlive/tlnet/archive/polyglossia.doc.r72368.tar.xz
+2024/09/24 | 4126138 | biblio/ctan-bibdata.zip
+2024/09/24 | 41032 | systems/texlive/tlnet/archive/minted.source.r72368.tar.xz
+2024/09/24 | 406440 | systems/texlive/tlnet/archive/stickstoo.doc.r72368.tar.xz
+2024/09/24 | 3892 | systems/texlive/tlnet/archive/scrhack.r72368.tar.xz
+2024/09/24 | 3708800 | biblio/ctan-bibdata/ctan.pdf
+2024/09/24 | 34425952 | systems/texlive/tlnet/install-tl.zip
+2024/09/24 | 3416 | systems/texlive/tlnet/archive/litetable.r72368.tar.xz
+2024/09/24 | 2890173 | biblio/ctan-bibdata/ctan.bib
+2024/09/24 | 2797684 | systems/texlive/tlnet/archive/listings.doc.r72368.tar.xz
+2024/09/24 | 27719673 | systems/texlive/tlnet/install-tl-windows.exe
+2024/09/24 | 272992 | systems/texlive/tlnet/archive/listings.source.r72368.tar.xz
+2024/09/24 | 2668708 | systems/texlive/tlnet/archive/stickstoo.r72368.tar.xz
+2024/09/24 | 2595656 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2024/09/24 | 246676 | systems/texlive/tlnet/archive/reptheorem.doc.r72368.tar.xz
+2024/09/24 | 2428 | systems/texlive/tlnet/archive/beamertheme-tcolorbox.r72368.tar.xz
+2024/09/24 | 22060 | systems/texlive/tlnet/archive/minted.r72368.tar.xz
+2024/09/24 | 20980 | systems/texlive/tlnet/archive/scrhack.source.r72368.tar.xz
+2024/09/24 | 19593531 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2024/09/24 | 19536 | systems/texlive/tlnet/archive/easybook.r72368.tar.xz
+2024/09/24 | 19420 | systems/texlive/tlnet/archive/easybook.source.r72368.tar.xz
+2024/09/24 | 1860 | systems/texlive/tlnet/archive/reptheorem.r72368.tar.xz
+2024/09/24 | 180340 | systems/texlive/tlnet/archive/l3kernel.r72365.tar.xz
+2024/09/24 | 1748344 | systems/texlive/tlnet/archive/minted.doc.r72368.tar.xz
+2024/09/24 | 173544 | systems/texlive/tlnet/archive/beamertheme-tcolorbox.doc.r72368.tar.xz
+2024/09/24 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2024/09/24 | 15712 | systems/texlive/tlnet/archive/keytheorems.r72368.tar.xz
+2024/09/24 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2024/09/24 | 1530540 | systems/texlive/tlnet/archive/pgfornament-han.doc.r72357.tar.xz
+2024/09/24 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2024/09/24 | 147552 | systems/texlive/tlnet/archive/listings.r72368.tar.xz
+2024/09/24 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2024/09/24 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2024/09/24 | 126016 | systems/texlive/tlnet/archive/polyglossia.r72368.tar.xz
+2024/09/24 | 12075204 | systems/texlive/tlnet/archive/l3kernel.doc.r72365.tar.xz
+2024/09/24 | 114460 | systems/texlive/tlnet/archive/texlive-scripts.r72367.tar.xz
+2024/09/24 | 1126120 | systems/texlive/tlnet/archive/libertinus-type1.doc.r72354.tar.xz
+2024/09/24 | 111087 | macros/latex/contrib/easybook/easybook.tex
+2024/09/24 | 10575 | macros/latex/contrib/jupynotex.zip
2024/09/23 | 9999 | macros/latex/required/l3kernel/l3news10.tex
2024/09/23 | 98 | macros/latex/contrib/minted/DEPENDS.txt
2024/09/23 | 9839 | macros/unicodetex/latex/polyglossia/tex/gloss-belarusian.ldf
@@ -13,9 +74,7 @@
2024/09/23 | 927 | graphics/pgf/contrib/pgfornament-han/han/han25.pgf
2024/09/23 | 9269 | graphics/pgf/contrib/pgfornament-han/han/han53.pgf
2024/09/23 | 91989 | macros/latex/required/l3kernel/l3skip.dtx
-2024/09/23 | 913 | macros/latex/contrib/easybook/README.md
2024/09/23 | 90578 | macros/latex/required/l3kernel/l3int.dtx
-2024/09/23 | 90506 | macros/latex/contrib/easybook/easybook.dtx
2024/09/23 | 8968 | macros/unicodetex/latex/polyglossia/tex/gloss-ukrainian.ldf
2024/09/23 | 88792 | macros/latex/required/l3kernel/l3expan.dtx
2024/09/23 | 88239 | macros/latex/required/l3kernel/l3coffins.dtx
@@ -48,12 +107,10 @@
2024/09/23 | 7603 | graphics/pgf/contrib/pgfornament-han/han/han73.pgf
2024/09/23 | 7535 | macros/unicodetex/latex/polyglossia/tex/gloss-polish.ldf
2024/09/23 | 7523 | macros/unicodetex/latex/polyglossia/tex/gloss-tibetan.ldf
-2024/09/23 | 7519 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2024/09/23 | 749 | graphics/pgf/contrib/pgfornament-han/han/han46.pgf
2024/09/23 | 7454 | graphics/pgf/contrib/pgfornament-han/han/han51.pgf
2024/09/23 | 7426 | macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamertheme-tcolorbox-doc.tex
2024/09/23 | 74258 | macros/unicodetex/latex/polyglossia/tex/polyglossia.sty
-2024/09/23 | 74258 | install/macros/unicodetex/latex/tex/latex/polyglossia/polyglossia.sty
2024/09/23 | 7412 | macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/beamerinnerthemetcolorbox.sty
2024/09/23 | 7409 | macros/unicodetex/latex/polyglossia/tex/gloss-georgian.ldf
2024/09/23 | 73845 | macros/latex/required/l3kernel/l3fp-trig.dtx
@@ -67,11 +124,9 @@
2024/09/23 | 7057 | macros/unicodetex/latex/polyglossia/tex/gloss-urdu.ldf
2024/09/23 | 700429 | macros/unicodetex/latex/polyglossia.zip
2024/09/23 | 6974 | macros/unicodetex/latex/polyglossia/tex/gloss-mongolian.ldf
-2024/09/23 | 692765 | macros/latex/contrib/easybook.zip
2024/09/23 | 6905 | macros/unicodetex/latex/polyglossia/tex/farsical.sty
2024/09/23 | 6778 | graphics/pgf/contrib/pgfornament-han/han/han63.pgf
2024/09/23 | 674 | graphics/pgf/contrib/pgfornament-han/han/han38.pgf
-2024/09/23 | 668368 | systems/texlive/tlnet/archive/easybook.doc.r72348.tar.xz
2024/09/23 | 6677 | macros/latex/required/l3kernel/l3news02.tex
2024/09/23 | 663 | graphics/pgf/contrib/pgfornament-han/han/han44.pgf
2024/09/23 | 6637 | macros/unicodetex/latex/polyglossia/tex/gloss-spanish.ldf
@@ -88,7 +143,6 @@
2024/09/23 | 641 | graphics/pgf/contrib/pgfornament-han/han/han11.pgf
2024/09/23 | 640 | graphics/pgf/contrib/pgfornament-han/han/han21.pgf
2024/09/23 | 640312 | systems/texlive/tlnet/archive/xindex.doc.r72347.tar.xz
-2024/09/23 | 639786 | macros/latex/contrib/easybook/easybook.pdf
2024/09/23 | 63576 | macros/latex/required/l3kernel/l3tl-analysis.dtx
2024/09/23 | 6348 | macros/unicodetex/latex/polyglossia/tex/gloss-portuguese.ldf
2024/09/23 | 6314 | macros/unicodetex/latex/polyglossia/tex/gloss-dutch.ldf
@@ -104,7 +158,6 @@
2024/09/23 | 5996 | macros/unicodetex/latex/polyglossia/tex/gloss-amharic.ldf
2024/09/23 | 588 | graphics/pgf/contrib/pgfornament-han/han/han9.pgf
2024/09/23 | 5767553 | fonts/stickstoo.zip
-2024/09/23 | 5752613 | systems/texlive/tlnet/install-tl-unx.tar.gz
2024/09/23 | 5723 | macros/unicodetex/latex/polyglossia/tex/polyglossia.lua
2024/09/23 | 567 | graphics/pgf/contrib/pgfornament-han/han/han42.pgf
2024/09/23 | 566 | graphics/pgf/contrib/pgfornament-han/han/han36.pgf
@@ -131,13 +184,8 @@
2024/09/23 | 49321 | macros/latex/required/l3kernel/l3fp-expo.dtx
2024/09/23 | 4911 | macros/latex/required/l3kernel/l3fp-types.dtx
2024/09/23 | 49000 | macros/latex/required/l3kernel/l3text.dtx
-2024/09/23 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2024/09/23 | 4895 | macros/unicodetex/latex/polyglossia/tex/gloss-sorbian.ldf
2024/09/23 | 4890 | macros/latex/required/l3kernel/l3news.tex
-2024/09/23 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2024/09/23 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2024/09/23 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2024/09/23 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2024/09/23 | 4866 | graphics/pgf/contrib/pgfornament-han/tianqing-poster.tex
2024/09/23 | 474 | graphics/pgf/contrib/pgfornament-han/han/han34.pgf
2024/09/23 | 47237 | macros/latex/required/l3kernel/l3fp-aux.dtx
@@ -156,7 +204,6 @@
2024/09/23 | 4461 | macros/unicodetex/latex/polyglossia/tex/gloss-hebrew.ldf
2024/09/23 | 441 | macros/unicodetex/latex/polyglossia/tex/gloss-portuges.ldf
2024/09/23 | 4380 | macros/unicodetex/latex/polyglossia/tex/gloss-odia.ldf
-2024/09/23 | 437200 | systems/texlive/tlnet/archive/texlive-scripts.doc.r72352.tar.xz
2024/09/23 | 435 | graphics/pgf/contrib/pgfornament-han/han/han45.pgf
2024/09/23 | 43211 | macros/latex/required/l3kernel/l3sys.dtx
2024/09/23 | 427 | macros/unicodetex/latex/polyglossia/tex/nkonumbers.sty
@@ -164,7 +211,6 @@
2024/09/23 | 4197 | macros/unicodetex/latex/polyglossia/tex/babel-hebrewalph.def
2024/09/23 | 41859 | macros/latex/required/l3kernel/l3debug.dtx
2024/09/23 | 4184 | systems/texlive/tlnet/archive/luaaddplot.source.r72350.tar.xz
-2024/09/23 | 4126081 | biblio/ctan-bibdata.zip
2024/09/23 | 40727 | macros/latex/required/l3kernel/l3sort.dtx
2024/09/23 | 402148 | macros/latex/required/l3kernel/l3news.pdf
2024/09/23 | 40123 | macros/latex/contrib/minted/CHANGELOG_MINTED_LATEX_PACKAGE.md
@@ -178,7 +224,6 @@
2024/09/23 | 3752 | macros/unicodetex/latex/polyglossia/tex/gloss-kannada.ldf
2024/09/23 | 37260 | systems/texlive/tlnet/archive/xindex.r72347.tar.xz
2024/09/23 | 3710 | macros/unicodetex/latex/polyglossia/tex/hijrical.sty
-2024/09/23 | 3708800 | biblio/ctan-bibdata/ctan.pdf
2024/09/23 | 3630 | macros/unicodetex/latex/polyglossia/tex/xpg-cyrillicnumbers.sty
2024/09/23 | 3612 | macros/unicodetex/latex/polyglossia/tex/gloss-gaelic.ldf
2024/09/23 | 3609 | graphics/pgf/contrib/pgfornament-han/han/han60.pgf
@@ -191,7 +236,6 @@
2024/09/23 | 350 | graphics/pgf/contrib/pgfornament-han/han/han32.pgf
2024/09/23 | 3471 | macros/unicodetex/latex/polyglossia/tex/gloss-hindi.ldf
2024/09/23 | 34447 | macros/latex/required/l3kernel/l3cctab.dtx
-2024/09/23 | 34425933 | systems/texlive/tlnet/install-tl.zip
2024/09/23 | 3392 | macros/unicodetex/latex/polyglossia/tex/gloss-norwegian.ldf
2024/09/23 | 333 | macros/unicodetex/latex/polyglossia/tex/gloss-nynorsk.ldf
2024/09/23 | 333 | macros/unicodetex/latex/polyglossia/tex/gloss-norsk.ldf
@@ -226,13 +270,11 @@
2024/09/23 | 2983 | macros/unicodetex/latex/polyglossia/tex/gloss-lao.ldf
2024/09/23 | 296526 | macros/latex/required/l3kernel/l3styleguide.pdf
2024/09/23 | 2954 | graphics/pgf/contrib/pgfornament-han/heavenlyclouds-sample.tex
-2024/09/23 | 2889760 | biblio/ctan-bibdata/ctan.bib
2024/09/23 | 2883 | macros/unicodetex/latex/polyglossia/tex/gloss-punjabi.ldf
2024/09/23 | 287 | graphics/pgf/contrib/pgfornament-han/han/han41.pgf
2024/09/23 | 2850 | macros/unicodetex/latex/polyglossia/tex/gloss-turkish.ldf
2024/09/23 | 2821 | macros/latex/required/l3kernel/l3prefixes.tex
2024/09/23 | 2810 | macros/unicodetex/latex/polyglossia/tex/gloss-breton.ldf
-2024/09/23 | 27717443 | systems/texlive/tlnet/install-tl-windows.exe
2024/09/23 | 2752 | graphics/pgf/contrib/pgfornament-han/tianqing-sample.tex
2024/09/23 | 274 | macros/unicodetex/latex/polyglossia/tex/gloss-fr-CA-u-sd-canb.ldf
2024/09/23 | 274 | graphics/pgf/contrib/pgfornament-han/han/han16.pgf
@@ -246,7 +288,6 @@
2024/09/23 | 2645 | macros/unicodetex/latex/polyglossia/tex/gloss-afrikaans.ldf
2024/09/23 | 260 | macros/unicodetex/latex/polyglossia/tex/fontmapping/devanagaridigits.map
2024/09/23 | 259 | macros/unicodetex/latex/polyglossia/tex/gloss-de-DE-1901.ldf
-2024/09/23 | 2598588 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2024/09/23 | 258 | macros/unicodetex/latex/polyglossia/tex/gloss-de-AT-1901.ldf
2024/09/23 | 258 | macros/unicodetex/latex/polyglossia/tex/fontmapping/gurmukhidigits.map
2024/09/23 | 2584 | macros/unicodetex/latex/polyglossia/tex/gloss-icelandic.ldf
@@ -428,13 +469,10 @@
2024/09/23 | 20310 | macros/latex/required/l3kernel/l3fp-symbolic.dtx
2024/09/23 | 1980 | macros/unicodetex/latex/polyglossia/tex/arabicnumbers.sty
2024/09/23 | 197 | macros/unicodetex/latex/polyglossia/tex/gloss-ug.ldf
-2024/09/23 | 19640 | systems/texlive/tlnet/archive/easybook.r72348.tar.xz
2024/09/23 | 1963 | macros/unicodetex/latex/polyglossia/README.md
2024/09/23 | 19637 | macros/latex/required/l3kernel/l3fp-convert.dtx
-2024/09/23 | 19616654 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
2024/09/23 | 195704 | macros/latex/contrib/minted/minted.dtx
2024/09/23 | 19547 | macros/latex/required/l3kernel/l3bitset.dtx
-2024/09/23 | 19520 | systems/texlive/tlnet/archive/easybook.source.r72348.tar.xz
2024/09/23 | 1951 | macros/unicodetex/latex/polyglossia/tex/gloss-telugu.ldf
2024/09/23 | 1949 | macros/latex/required/l3kernel/interface3.tex
2024/09/23 | 1949 | graphics/pgf/contrib/pgfornament-han/han/han58.pgf
@@ -460,7 +498,6 @@
2024/09/23 | 1701 | graphics/pgf/contrib/pgfornament-han/han/han68.pgf
2024/09/23 | 16853 | macros/latex/contrib/minted/latexminted.py
2024/09/23 | 1680 | graphics/pgf/contrib/pgfornament-han/han/han14.pgf
-2024/09/23 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2024/09/23 | 16686 | macros/unicodetex/latex/polyglossia/tex/gloss-kurdish.ldf
2024/09/23 | 16671 | macros/unicodetex/latex/polyglossia/tex/xgreek-fixes.def
2024/09/23 | 16624 | macros/latex/required/l3kernel/l3text-map.dtx
@@ -473,19 +510,15 @@
2024/09/23 | 15606 | macros/unicodetex/latex/polyglossia/tex/gloss-greek.ldf
2024/09/23 | 154694 | macros/latex/required/l3kernel/l3news03.pdf
2024/09/23 | 1545 | graphics/pgf/contrib/pgfornament-han/han/han56.pgf
-2024/09/23 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
2024/09/23 | 1530651 | graphics/pgf/contrib/pgfornament-han/pgfornament-han-doc.pdf
-2024/09/23 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
2024/09/23 | 151602 | macros/latex/required/l3kernel/l3news06.pdf
2024/09/23 | 151188 | macros/latex/required/l3kernel/l3docstrip.pdf
2024/09/23 | 150932 | macros/latex/required/l3kernel/l3news02.pdf
2024/09/23 | 149633 | macros/latex/required/l3kernel/l3tl.dtx
2024/09/23 | 14913 | macros/latex/required/l3kernel/l3news12.tex
2024/09/23 | 1468 | systems/texlive/tlnet/archive/luaaddplot.r72350.tar.xz
-2024/09/23 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
2024/09/23 | 1457040 | macros/latex/contrib/listings/listings-devel.pdf
2024/09/23 | 1454 | macros/unicodetex/latex/polyglossia/tex/gloss-bosnian.ldf
-2024/09/23 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2024/09/23 | 1449 | macros/unicodetex/latex/polyglossia/tex/gloss-swedish.ldf
2024/09/23 | 1449 | graphics/pgf/contrib/pgfornament-han/han/han26.pgf
2024/09/23 | 144306 | macros/latex/required/l3kernel/l3file.dtx
@@ -540,14 +573,12 @@
2024/09/23 | 1153 | macros/latex/contrib/beamer-contrib/themes/beamertheme-tcolorbox/README.md
2024/09/23 | 114764 | macros/latex/required/l3kernel/l3news04.pdf
2024/09/23 | 1145 | graphics/pgf/contrib/pgfornament-han/han/han72.pgf
-2024/09/23 | 114448 | systems/texlive/tlnet/archive/texlive-scripts.r72352.tar.xz
2024/09/23 | 113735 | macros/latex/required/l3kernel/l3str-convert.dtx
2024/09/23 | 1134 | macros/unicodetex/latex/polyglossia/LICENSE.txt
2024/09/23 | 112536 | macros/latex/required/l3kernel/l3news05.pdf
2024/09/23 | 112286 | macros/latex/required/l3kernel/l3color.dtx
2024/09/23 | 11176 | graphics/pgf/contrib/pgfornament-han/han/han67.pgf
2024/09/23 | 1107 | macros/unicodetex/latex/polyglossia/tex/polyglossia-sanskrit.lua
-2024/09/23 | 109802 | macros/latex/contrib/easybook/easybook.tex
2024/09/23 | 1087 | macros/unicodetex/latex/polyglossia/tex/gloss-divehi.ldf
2024/09/23 | 108493 | macros/latex/required/l3kernel/l3prop.dtx
2024/09/23 | 1081 | graphics/pgf/contrib/pgfornament-han/README.md
@@ -2454,7 +2485,6 @@
2024/09/21 | 59264 | fonts/libertinus-fonts/otf/LibertinusMono-Regular.otf
2024/09/21 | 588848 | fonts/libertinus-fonts/otf/LibertinusMath-Regular.otf
2024/09/21 | 56716 | fonts/libertinus-fonts/otf/LibertinusKeyboard-Regular.otf
-2024/09/21 | 530224 | systems/texlive/tlnet/archive/keytheorems.doc.r72331.tar.xz
2024/09/21 | 510242 | fonts/libertinus-fonts/preview.svg
2024/09/21 | 4426 | fonts/libertinus-fonts/OFL.txt
2024/09/21 | 37509 | systems/texlive/tlnet/tlpkg/TeXLive/TLWinGoo.pm
@@ -2481,7 +2511,6 @@
2024/09/21 | 17103 | fonts/libertinus-fonts/documentation/Design-Guidelines.md
2024/09/21 | 160836 | fonts/libertinus-fonts/documentation/Math-Sample.pdf
2024/09/21 | 154573 | macros/latex/contrib/proflycee/tex/pflcliparts/pfl-bronze-medal.pdf
-2024/09/21 | 15400 | systems/texlive/tlnet/archive/keytheorems.r72331.tar.xz
2024/09/21 | 1484 | macros/latex/contrib/proflycee/tex/pflcliparts/pfl-crossed.pdf
2024/09/21 | 1480 | macros/latex/contrib/proflycee/tex/pflcliparts/pfl-checked.pdf
2024/09/21 | 1402 | fonts/libertinus-fonts/CONTRIBUTING.md
@@ -2526,9 +2555,11 @@
2024/09/20 | 4367 | macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.tex
2024/09/20 | 42891 | support/sqltex/src/sqltex
2024/09/20 | 4268 | macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.tex
+2024/09/20 | 4163 | macros/latex/contrib/jupynotex/README.md
2024/09/20 | 3965 | macros/latex/contrib/univie-ling/doc/templates/template-paper-english.tex
2024/09/20 | 3924 | fonts/simpleicons/enc/simpleiconsone.enc
2024/09/20 | 3918 | fonts/simpleicons/enc/simpleiconsfive.enc
+2024/09/20 | 388 | macros/latex/contrib/jupynotex/jupynotex.sty
2024/09/20 | 3800 | macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.tex
2024/09/20 | 3757 | fonts/simpleicons/enc/simpleiconsthree.enc
2024/09/20 | 3735 | fonts/simpleicons/enc/simpleiconsoneone.enc
@@ -2632,6 +2663,7 @@
2024/09/20 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconseight.tfm
2024/09/20 | 1207 | fonts/simpleicons/README.md
2024/09/20 | 11669 | support/sqltex/src/Makefile.in
+2024/09/20 | 11464 | macros/latex/contrib/jupynotex/jupynotex.py
2024/09/20 | 11075 | support/sqltex/man/Makefile.in
2024/09/20 | 110585 | support/sqltex/configure
2024/09/20 | 11013 | support/sqltex/doc/Makefile.in
@@ -2702,58 +2734,3 @@
2024/09/18 | 11902 | macros/latex/contrib/sim-os-menus/doc/sim-os-menus-doc.tex
2024/09/18 | 1090114 | macros/latex/required/babel/base/locale.zip
2024/09/18 | 10432 | systems/texlive/tlnet/archive/cs-techrep.source.r72306.tar.xz
-2024/09/17 | 87045 | macros/latex/contrib/animate/animate.tex
-2024/09/17 | 79043 | macros/luatex/generic/nodetree/nodetree.lua
-2024/09/17 | 76009 | macros/latex/contrib/tableof.zip
-2024/09/17 | 752 | support/sqltex/configure.ac
-2024/09/17 | 735900 | systems/texlive/tlnet/archive/tikz3d-fr.doc.r72297.tar.xz
-2024/09/17 | 72290 | macros/luatex/latex/plantuml.zip
-2024/09/17 | 6488 | systems/texlive/tlnet/archive/ocgx2.doc.r72300.tar.xz
-2024/09/17 | 631 | macros/luatex/latex/plantuml/example-component-diagram.tex
-2024/09/17 | 62790 | macros/latex/contrib/tableof/tableof.pdf
-2024/09/17 | 612 | macros/luatex/latex/plantuml/example-multiple-diagrams-svg.tex
-2024/09/17 | 567 | macros/luatex/latex/plantuml/example-class-relations--svg.tex
-2024/09/17 | 48809 | macros/luatex/latex/plantuml/plantuml.pdf
-2024/09/17 | 4829 | macros/luatex/latex/plantuml/example-minimal.png
-2024/09/17 | 4644 | systems/texlive/tlnet/archive/tikz3d-fr.r72297.tar.xz
-2024/09/17 | 462271 | macros/latex/contrib/profmaquette.zip
-2024/09/17 | 4266 | macros/latex/contrib/animate/README.md
-2024/09/17 | 41522 | macros/latex/contrib/tableof/tableof.dtx
-2024/09/17 | 4014 | macros/luatex/generic/nodetree/README.md
-2024/09/17 | 396 | macros/luatex/latex/plantuml/release.sh
-2024/09/17 | 389 | macros/luatex/latex/plantuml/example-class-relations--latex.tex
-2024/09/17 | 3797724 | macros/latex/contrib/animate/animate.pdf
-2024/09/17 | 3652492 | systems/texlive/tlnet/archive/media9.doc.r72299.tar.xz
-2024/09/17 | 3477 | macros/luatex/latex/plantuml/README.md
-2024/09/17 | 341735 | macros/latex/contrib/profmaquette/doc/profmaquette-doc.pdf
-2024/09/17 | 341448 | macros/latex/contrib/cs-techrep.zip
-2024/09/17 | 32338 | macros/luatex/generic/nodetree/nodetree-doc.tex
-2024/09/17 | 3233469 | install/macros/latex/contrib/animate.tds.zip
-2024/09/17 | 3231192 | macros/latex/contrib/animate.zip
-2024/09/17 | 3099 | macros/luatex/latex/plantuml/plantuml.sty
-2024/09/17 | 307312 | macros/luatex/generic/nodetree.zip
-2024/09/17 | 306576 | macros/latex/contrib/iaria.zip
-2024/09/17 | 305966 | macros/latex/contrib/iaria-lite.zip
-2024/09/17 | 2976 | macros/luatex/latex/plantuml/CHANGELOG.md
-2024/09/17 | 284593 | macros/luatex/generic/nodetree/nodetree.pdf
-2024/09/17 | 2711 | macros/latex/contrib/tableof/README.md
-2024/09/17 | 24878 | macros/texinfo/latest/htmlxref.cnf
-2024/09/17 | 24272 | systems/texlive/tlnet/archive/penlight.doc.r72301.tar.xz
-2024/09/17 | 2250 | macros/luatex/generic/nodetree/nodetree.ins
-2024/09/17 | 220408 | systems/texlive/tlnet/archive/coloredtheorem.doc.r72298.tar.xz
-2024/09/17 | 2104320 | macros/latex/contrib/tagpdf.zip
-2024/09/17 | 1896108 | systems/texlive/tlnet/archive/media9.r72299.tar.xz
-2024/09/17 | 186698 | macros/latex/contrib/changelog.zip
-2024/09/17 | 1776704 | systems/texlive/tlnet/archive/media9.source.r72299.tar.xz
-2024/09/17 | 171546 | macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
-2024/09/17 | 16672 | systems/texlive/tlnet/archive/ocgx2.r72300.tar.xz
-2024/09/17 | 1637 | macros/luatex/latex/plantuml/plantuml.lua
-2024/09/17 | 148 | macros/luatex/latex/plantuml/example-minimal.tex
-2024/09/17 | 13997 | macros/luatex/latex/plantuml/example-class-relations--svg.png
-2024/09/17 | 1388 | systems/texlive/tlnet/archive/coloredtheorem.r72298.tar.xz
-2024/09/17 | 138873 | macros/latex/contrib/animate/animate.sty
-2024/09/17 | 13552 | macros/latex/contrib/animate/ChangeLog
-2024/09/17 | 134823580 | macros/context/latest/cont-tmf.zip
-2024/09/17 | 12258 | macros/luatex/generic/nodetree/nodetree.dtx
-2024/09/17 | 106378 | macros/latex/contrib/profmaquette/doc/profmaquette-doc.zip
-2024/09/17 | 102132 | systems/texlive/tlnet/archive/penlight.r72301.tar.xz
diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib
index d6731527f0..aa3ad1b9d0 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 24-09-2024, 02:00:03
+%% created at 25-09-2024, 02:00:03
%%
%% This file is provided under the terms of the LPPL v1.3 or
@@ -20987,8 +20987,8 @@
title = {The \texttt{easybook} package},
subtitle = {Easily typesetting Chinese theses or books},
author = {Qu Yi},
- date = {2024-09-23},
- version = {2024du},
+ date = {2024-09-24},
+ version = {2024dx},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/easybook},
url = {https://ctan.org/pkg/easybook},
@@ -20999,8 +20999,8 @@
with the general framework design of the dissertation of many
universities in China, providing multiple commands and
interfaces allows users to easily customize the thesis template.
- Its basic macro package easybase can also be used with CTeX and
- standard document classes.},
+ Its basic macro package can also be used with
+ CTeX and standard document classes.},
}
@manual{ctan-easydtx,
@@ -36520,8 +36520,8 @@
title = {The \texttt{jupynotex} package},
subtitle = {Include whole or partial Jupyter notebooks in \LaTeX{} documents},
author = {Facundo Batista},
- date = {2020-10-28},
- version = {0.1},
+ date = {2024-09-24},
+ version = {1.0},
license = {apache2},
mirror = {https://mirror.ctan.org/macros/latex/contrib/jupynotex},
url = {https://ctan.org/pkg/jupynotex},
@@ -40945,7 +40945,7 @@
title = {The \texttt{LiteTable} package},
subtitle = {Class schedules with colorful course blocks},
author = {Mingyu Xia},
- date = {2024-09-22},
+ date = {2024-09-24},
version = {3.0a},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/litetable},
diff --git a/install/macros/unicodetex/latex/tex/latex/polyglossia/polyglossia.sty b/install/macros/unicodetex/latex/tex/latex/polyglossia/polyglossia.sty
deleted file mode 100644
index 0e8b8f1c30..0000000000
--- a/install/macros/unicodetex/latex/tex/latex/polyglossia/polyglossia.sty
+++ /dev/null
@@ -1,2468 +0,0 @@
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesExplPackage
- {polyglossia} {2024/09/23} {v2.3}
- {Modern multilingual typesetting with XeLaTeX and LuaLaTeX}
-
-% TODO Handle remaining uses in the gloss files (\patchcmd)
-% and remove package call afterwards
-\RequirePackage{etoolbox}
-% Will raise error if used with anything else than XeTeX or LuaTeX
-\RequirePackage{fontspec}[2010/06/08]% v2.0
-\RequirePackage{iftex}
-
-\prg_generate_conditional_variant:Nnn \clist_if_in:Nn {Ne} {TF, T, F} % check if needed
-
-%% The following is for compatibility with Babel-aware package:
-% \languageshorthands is provided by babelsh.def, which is
-% only loaded by some glosses, but some classes presuppose
-% it is there generally. So let's provide a stub:
-\ProvideDocumentCommand \languageshorthands { m } {}
-% These have to be provided at the end of the preamble
-\hook_gput_code:nnn {begindocument/before} {.}
-{
- \cs_gset_eq:NN \bbl@set@language \xpg_set_language_aux:nn % for biblatex
- \cs_gset_eq:NN \bbl@main@language \xpg_main_language_tl % for biblatex
- \ProvideDocumentCommand \texorpdfstring { m m } { #1 } % dummy command if hyperref is not loaded
-}
-
-%% when no patterns are available, we use \l@nohyphenation, assigned to 255
-%% (suggestion by Enrico Gregorio)
-%% \l@nohyphenation is defined in polyglossia.lua
-\sys_if_engine_luatex:TF
- {
- \lua_load_module:n{polyglossia}
- \prg_new_conditional:Nnn \xpg_if_script:n { TF, T, F }
- {
- \fontspec_if_fontspec_font:TF
- {
- \lua_now:e
- {
- if~ luaotfload.aux.provides_script(font.current(), '#1')~ then~
- token.put_next(token.create('prg_return_true:'))~
- else~
- token.put_next(token.create('prg_return_false:'))~
- end
- }
- }
- { \prg_return_false: }
- }
- }{
- \cs_if_free:cT { l@nohyphenation }
- { \chardef\l@nohyphenation=255 }
- \prg_set_eq_conditional:NNn \xpg_if_script:n \fontspec_if_script:n { TF, T, F }
- }
-
-% Which version of XeTeX do we use? What is the boundary class? 4095 or 255
-\cs_if_exist:cTF { e@alloc@intercharclass@top }
- { \cs_gset_eq:NN \xpg@boundaryclass \e@alloc@intercharclass@top }
- { \chardef\xpg@boundaryclass=\@cclv }
-
-% Useful for getting list of loaded languages and variants. Like babel's bbl@loaded
-% all language loaded
-\seq_new:N \__xpg_langs_loaded
-% list of loaded languages (polyglossia name)
-\clist_new:N \xpg@loaded
-% list of loaded variants
-\clist_new:N \xpg@vloaded
-% list of loaded languages (babel name)
-\clist_new:N \xpg@bloaded
-% list of loaded languages (bcp-47 id)
-\clist_new:N \xpg@bcp@loaded
-
-% output counter as lower-case latin letter
-\DeclareExpandableDocumentCommand \latinalph { m }
-{
- \exp_args:Nc \latin@alph {c@#1}
-}
-% output counter as upper-case latin letter
-\DeclareExpandableDocumentCommand \latinAlph { m }
-{
- \exp_args:Nc \latin@Alph {c@#1}
-}
-
-%% Internal hooks
-% select defaultlanguage hook. Since we only want the
-% last definition of this, we do not use a \hook
-\cs_new_nopar:Nn \__xpg_selectdefaultlanguage: {}
-% things to be done after the above
-\hook_new:n { polyglossia / selectdefaultlanguage / after }
-
-% things to be executed at begin of document
-\hook_gput_code:nnn {begindocument} {.}
-{
- % save various command
- \cs_gset_eq:cc{latin@alph}{@alph}% TODO rename when we have the C locale
- \cs_gset_eq:cc{latin@Alph}{@Alph}% TODO rename when we have the C locale
- % push to C language gloss
- \cs_gset_eq:cc{xpg_Clang_arabic}{@arabic}
-
- \xpg_initial_setup:
- % apply \familydefault changes
- \xpg_set_familydefault:
-}
-
-% The following needs to go after any \AtBeginDocument (also of packages
-% loaded after \set[main|other]language
-\hook_gput_code:nnn {begindocument/end} {.}
-{
- % now we have the C locale definition: select the language
- \__xpg_selectdefaultlanguage:
- % Do the things that need to be done after default language selection
- \hook_use_once:n { polyglossia / selectdefaultlanguage / after }
-}
-
-%
-% MESSAGES
-%
-
-% message templates
-\msg_new:nnn { polyglossia } { general } { #1 }
-
-\msg_new:nnn { polyglossia } { languagenotloaded }
-{
- The~ language~ #1~ is~ not~ loaded.~ You~ must~ load~ it~ in~ order~ to~ use~ it.
-}
-\msg_redirect_name:nnn { polyglossia } { languagenotloaded } { critical }
-
-\msg_new:nnn { polyglossia } { languagenolongerloaded }
-{
- The~ language~ #1~ is~ no~ longer~ loaded.~ Please~ rerun~ LaTeX.
-}
-\msg_redirect_name:nnn { polyglossia } { languagenolongerloaded } { warning }
-
-\msg_new:nnn { polyglossia } { unknownlocalnumeral }
-{
- Unknown~ key~ "#1"~ in~ \string\localnumeral.
-}
-
-\msg_new:nnn { polyglossia } { localnumeralemptyvalue }
-{
- Keys~ of~ \string\localnumeral~ must~ have~ a~ value.
-}
-
-\msg_new:nnn { polyglossia } { illvalue }
-{
- Illegal~ value~ (#1)~ for~ #2!
-}
-
-\msg_new:nnn { polyglossia } { illarg }
-{
- Invalid~ argument~ (#1)~ for~ #2!
-}
-
-\msg_new:nnn { polyglossia } { nopatterns }
-{
- No~ hyphenation~ patterns~ were~ loaded~ for~ `#2' \iow_newline:
- I~ will~ use~ \string\language=\string\l@ #1\space instead.
-}
-
-\msg_new:nnn { polyglossia } { undefcmd }
-{
- \tl_to_str:N {#1} ~ is~ not~ defined!
-}
-
-%% custom message macros
-\cs_new_nopar:Nn \xpg_error_msg:n
-{
- \exp_args:Nnne \msg_error:nnn { polyglossia } { general } { #1 }
-}
-
-\cs_new_nopar:Nn \xpg_warning_msg:n
-{
- \exp_args:Nnne \msg_warning:nnn { polyglossia } { general } { #1 }
-}
-
-\cs_new_nopar:Nn \xpg_info_msg:n
-{
- \exp_args:Nnne \msg_info:nnn { polyglossia } { general } { #1 }
-}
-
-\cs_new_nopar:Nn \xpg_no_patterns_msg:n
-{
- \msg_warning:nnnn { polyglossia } { nopatterns } { nohyphenation } { #1 }
-}
-
-\cs_new_nopar:Nn \xpg_ill_value_msg:nn
-{
- \msg_warning:nnnn { polyglossia } { illvalue } { #1 } { #2 }
-}
-
-\cs_new_nopar:Nn \xpg_ill_arg_msg:nn
-{
- \msg_error:nnnn { polyglossia } { illarg } { #1 } { #2 }
-}
-
-% error out if lang is not loaded
-\cs_new_nopar:Nn \xpg_error_if_lang_not_loaded:n
-{
- \seq_if_in:NeF \__xpg_langs_loaded {#1}
- {
- \msg_error:nnn { polyglossia } { languagenotloaded } { #1 }
- }
-}
-
-%% use macro if defined, else warn that it is not
-\cs_new_nopar:Nn \__xpg_use_or_warn:N
-{
- \cs_if_exist_use:NF {#1}
- {
- \msg_error:nnn { polyglossia } { undefcmd } { #1 }
- }
-}
-\cs_generate_variant:Nn \__xpg_use_or_warn:N {c}
-
-% gloss message interface
-\cs_set_eq:cc { xpg@error } { xpg_error_msg:n }
-\cs_set_eq:cc { xpg@warning } { xpg_warning_msg:n }
-\cs_set_eq:cc { xpg@info } { xpg_info_msg:n }
-\cs_set_eq:cc { xpg@ill@value } { xpg_ill_value_msg:nn }
-
-
-\NewDocumentCommand \XPGNoPatternsFallback { O{ nohyphenation } m }
-{
- \msg_warning:nnnn { polyglossia } { nopatterns } { #1 } { #2 }
- \exp_args:Ncc \adddialect {l@#2} {l@#1}
-}
-
-\NewDocumentCommand \CheckHyphenationPatterns { m }
-{
- \xpg_if_language_defined:nF {#1}
- {
- \XPGNoPatternsFallback{#1}
- }
-}
-
-%
-% END MESSAGES
-
-
-%% ensure directionality if bidi is loaded, else ignore
-%%% FIXME still used?
-\cs_new_nopar:Npn \@@ensure@dir #1
-{
- \cs_if_exist_use:c{@ensure@dir}{#1}
-}
-
-\cs_new_nopar:Npn \@@ensure@maindir #1
-{
- \cs_if_exist_use:c{@ensure@maindir}{#1}
-}
-
-% if we are in the document preamble run T else F
-\prg_set_conditional:Nnn \xpg_if_in_preamble: {T, F, TF}
-{
- \cs_if_eq:NNTF { \@onlypreamble } { \@notprerr }
- {
- \prg_return_false:
- }
- {
- \prg_return_true:
- }
-}
-
-%% Used by the language definitions files for right-to-left languages
-\DeclareDocumentCommand \RequireBidi {}
- {
- \xpg_if_in_preamble:T
- {
- \sys_if_engine_luatex:TF
- { \RequirePackage{luabidi} }
- { \RequirePackage{bidi} }
- }
- \DeclareDocumentCommand \RequireBidi {} {}
- }
-
-% if #1 is LR run T else F
-\prg_set_conditional:Nnn \__xpg_if_LR_str:n {p, T, F, TF}
-{
- \str_case_e:nnF{#1}
- {
- {LR}{\prg_return_true:}
- {RL}{\prg_return_false:}
- }
- {
- \xpg_error_msg:n {Unknown~ direction~#1}
- \prg_return_false:
- }
-}
-\prg_generate_conditional_variant:Nnn \__xpg_if_LR_str:n {e} {p, T, F, TF}
-
-% (lua)bidi commands to change directionality for paragraphs
-% and inline text.
-% overwritten with correct package
-\cs_new_nopar:Nn \__xpg_set_par_direction:n
-{
- \__xpg_if_LR_str:nF {#1}
- {
- \xpg_error_msg:n {right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!}
- }
-}
-\cs_new_nopar:Nn \__xpg_set_text_direction:n
-{
- \__xpg_if_LR_str:nF {#1}
- {
- \xpg_error_msg:n {right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!}
- }
-}
-\hook_gput_code:nnn {package/bidi/after} {.}
-{
- \cs_gset_nopar:Nn \__xpg_set_par_direction:n
- {
- \__xpg_if_LR_str:nTF{#1}
- {
- \setLR
- }
- {
- \setRL
- }
- }
- \cs_gset_nopar:Nn \__xpg_set_text_direction:n
- {
- \__xpg_if_LR_str:nTF{#1}
- {
- \LRE
- }
- {
- \RLE
- }
- }
-}
-\hook_gput_code:nnn {package/luabidi/after} {.}
-{
- \cs_gset_nopar:Nn \__xpg_set_par_direction:n
- {
- \__xpg_if_LR_str:nTF{#1}
- {
- \setLR
- }
- {
- \setRL
- }
- }
- \cs_gset_nopar:Nn \__xpg_set_text_direction:n
- {
- \__xpg_if_LR_str:nTF{#1}
- {
- \LRE
- }
- {
- \RLE
- }
- }
-}
-
-% emulate \RTLmain
-\sys_if_engine_luatex:TF
- { \cs_new_nopar:Nn \__xpg_setRTLmain: { \setRTLmain } }
- { \cs_new_nopar:Nn \__xpg_setRTLmain: { \@RTLmaintrue\setnonlatin } }
-
-%% compatibility with babel
-\cs_set:Npn \addto #1 #2
-{
- \cs_if_exist:NF { #1 }
- { \cs_new:Npn { #1 } {} }
- \tl_gput_right:Nn { #1 } { #2 }
-}
-
-%% SETUP INTERFACE FOR GLOSS FILES
-%% options currently available:
-%% language : the name of the language (as understood by fontspec)
-%% hyphennames : the different hyphenation patterns to try (comma separated list)
-%%% TODO: if pattern is prefixed by !, then it should be loaded as a fallback,
-%%%% with \CheckHyphenationPatterns - i.e. with a warning: e.g. sanskrit for hindi,
-%%%% or catalan for asturian. – Also for languages with variants!
-%%%% (English and German, etc.)
-%% script : the name of the script (as understood by fontspec) – default is Latin
-%% scripttag : the OpenType tag for the script
-%% langtag : the OpenType tag for the language
-%% hyphenmins : the hyphenmins for this language (comma-sep list of two integers)
-%% frenchspacing : boolean
-%% indentfirst : boolean
-%% fontsetup : boolean
-%% TODO: nouppercase : boolean (for scripts like Arabic, Devanagari, etc which have
-%% no concept of uppercase/lowercase)
-%% TODO: localalph = {<alph_csname>,<Alph_csname>}
-%% TODO: localnumeral = <csname>
-%% or even better localdigits = {0123456789} for fully automatic setup
-\NewDocumentCommand \PolyglossiaSetup { m m }
-{
- \__xpg_keys_define_lang:n{#1}
- \keys_set:nn { polyglossia / #1 } { #2 }
- \__xpg_setup_hyphen:n {#1}
- %define booleans etoolbox style and set defaults
- %% TODO ? \providetoggle{#1@setup@done}%
- % we initialize this so that we can append below
- \cs_gset:cpn {init@extras@#1} {}
- % here we do the fontsetup:
- \__xpg_auto_setupfont:n { #1 }
- %% TODO? \toggletrue{#1@setup@done}
- % register base alias
- \xpg_language_alias { #1 } { #1 }
-}
-
-% Adjust language key setting after initial setup.
-% Principally any key can be altered this way.
-% The command is mainly used in gloss file where
-% different options (variant, script, etc.) result
-% in different babel names, bcp47 specification,
-% or OpenType language or script tags.
-\DeclareDocumentCommand \SetLanguageKeys { m m }
-{
- \clist_map_inline:nn { #1 } { \keys_set:nn { polyglossia / ##1 } { #2 } }
-}
-
-\bool_new:N \l__xpg_have_hyphen_bool
-% setup hyphennames from a str list of hyphen
-\cs_new:Nn \__xpg_setup_hyphen:n
-{
- \clist_set:Ne{\l_tmpa_clist}{\prop_item:Nn \l_xpg_langsetup_prop {#1 / hyphennames}}
- \bool_set_false:N \l__xpg_have_hyphen_bool
- % for each hyphen in the set until we find one that works
- \clist_map_inline:Nn \l_tmpa_clist
- {
- \bool_if:NF \l__xpg_have_hyphen_bool
- {
- % check if language hyphenname is defined
- \__xpg_pattern_check_if_exists:nF{#1}
- {
- % if not, first consider nohyphenation
- \str_if_eq:nnTF{##1}{nohyphenation}
- {
- \cs_gset_eq:cc{l@#1}{l@##1}
- \bool_gset_true:N \l__xpg_have_hyphen_bool
- }
- {
- % then test if hyphenation is defined
- \xpg_if_language_defined:nT {##1}
- {
- % test if language hyphenation is nohyphenation
- \cs_if_eq:cNTF{l@#1}{\l@nohyphenation}
- { \bool_gset_true:N \l__xpg_have_hyphen_bool }
- {
- % if false define language to hyphenation if it is not equal...
- \str_if_eq:nnF{#1}{##1}{\cs_gset_eq:cc{l@#1}{l@##1}}
- % ...and load
- \xpg_set_hyphenation_patterns:n {##1}
- \bool_gset_true:N \l__xpg_have_hyphen_bool
- }
- }
- }
- }
- }
- }
- % if l@#1 does not yet exist,
- % we assign it to nohyphenation
- % we do this here in case and if the hyphennames key was omitted
- \bool_if:NF \l__xpg_have_hyphen_bool
- {
- \CheckHyphenationPatterns{#1}
- }
- \cs_gset:cpn {#1@language}
- {
- \SetupPolyglossiaLangPatterns{#1}
- }
- % setup hyphenmins
- \clist_set:Ne \l_tmpa_clist
- { \prop_item:Nn \l_xpg_langsetup_prop {#1 / hyphenmins} }
- \cs_if_eq:cNF {l@#1} \l@nohyphenation
- {
- \use:x
- {
- \exp_not:N \setlocalhyphenmins {#1}
- { \clist_item:Nn \l_tmpa_clist {1} }
- { \clist_item:Nn \l_tmpa_clist {2} }
- }
- }
-}
-
-\NewDocumentCommand \SetupPolyglossiaLangPatterns { m }
-{
- \bool_if:NTF \g__xpg_hyphenation_disabled_bool
- {
- \tl_gset:Ne \g__xpg_lastlanguage_tl {\the\csname l@#1\endcsname}
- }{
- % first, test if \l@#1 exists
- % without that, \csname l@#1\endcsname will be defined as \relax
- \cs_if_exist:cTF {l@#1}
- {
- \cs_if_eq:cNTF {l@#1} \l@nohyphenation
- {
- \language=\l@nohyphenation
- }
- {
- \xpg_set_hyphenation_patterns:n {#1}
- }
- }
- {
- % Since this function is sometimes called from the gloss files
- % directly, we need to check whether the requested hyphenname exists.
- \CheckHyphenationPatterns{#1}
- \xpg_set_hyphenation_patterns:n {#1}
- }
- }
-}
-
-\prop_new_linked:N \l_xpg_langsetup_prop
-
-\cs_new_protected:Npn \__xpg_keys_define_lang:n #1
-{
- \keys_define:nn {polyglossia}
- {
- % the script font
- #1 / script
- .code:n = {
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/script}{##1}
- \prop_put:Nne \l_xpg_langsetup_prop {#1/lcscript}
- {\tl_if_empty:nF{##1}{\str_lowercase:n{##1}}}
- },
- #1 / script
- .value_required:n = true,
- #1 / script
- .initial:n = latin,
- % the opentype script tag
- #1 / scripttag
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/scripttag}{##1}},
- #1 / scripttag
- .default:n = {},
- #1 / scripttag
- .initial:n = {},
- % the language full name
- #1 / language
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/language}{##1}},
- #1 / language
- .value_required:n = true,
- #1 / language
- .initial:x = {\str_uppercase:n#1},
- % the language tag
- #1 / langtag
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/langtag}{##1}},
- #1 / langtag
- .value_required:n = true,
- #1 / langtag
- .initial:n = {},
- % the BCP-47 tag
- #1 / bcp47
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47}{##1}},
- #1 / bcp47
- .value_required:n = true,
- #1 / bcp47
- .initial:n = {},
- % the BCP-47 language tag
- #1 / bcp47-language
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47-language}{##1}},
- #1 / bcp47-language
- .value_required:n = true,
- #1 / bcp47-language
- .initial:n = {},
- % the BCP-47 region tag
- #1 / bcp47-region
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47-region}{##1}},
- #1 / bcp47-region
- .value_required:n = false,
- #1 / bcp47-region
- .initial:n = {},
- % the BCP-47 script tag
- #1 / bcp47-script
- .code:n =
- {
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47-script}{##1}
- \prop_put:Nne \l_xpg_langsetup_prop {#1/lc-bcp47-script}
- {\tl_if_empty:nF{##1}{\str_lowercase:n{##1}}}
- },
- #1 / bcp47-script
- .value_required:n = true,
- #1 / bcp47-script
- .initial:n = {Latn},
- % the BCP-47 variant tag
- #1 / bcp47-variant
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47-variant}{##1}},
- #1 / bcp47-variant
- .value_required:n = false,
- #1 / bcp47-variant
- .initial:n = {},
- % the BCP-47 extension-t tag
- #1 / bcp47-extension-t
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47-extension-t}{##1}},
- #1 / bcp47-extension-t
- .value_required:n = false,
- #1 / bcp47-extension-t
- .initial:n = {},
- % the BCP-47 extension-u tag
- #1 / bcp47-extension-u
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47-extension-u}{##1}},
- #1 / bcp47-extension-u
- .value_required:n = false,
- #1 / bcp47-extension-u
- .initial:n = {},
- % the BCP-47 extension-x tag
- #1 / bcp47-extension-x
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47-extension-x}{##1}},
- #1 / bcp47-extension-x
- .value_required:n = false,
- #1 / bcp47-extension-x
- .initial:n = {},
- % the BCP-47 casing alias
- #1 / bcp47-casing
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/bcp47-casing}{##1}},
- #1 / bcp47-casing
- .value_required:n = false,
- #1 / bcp47-casing
- .initial:n = {},
- % hyphennames
- #1 / hyphennames
- .code:n = {
- \clist_set:Nn{\l_tmpa_clist}{##1}
- \prop_put:Nne \l_xpg_langsetup_prop {#1/hyphennames}{\clist_use:Nn \l_tmpa_clist {,}}
- },
- #1 / hyphennames
- .value_required:n = true,
- #1 / hyphennames
- .initial:x = {\c_empty_clist},
- % direction
- #1 / direction
- . code:n = {
- \str_case_e:nnTF{##1}{
- {LR}{}
- {RL}{\RequireBidi}
- }
- { \prop_put:Nnn \l_xpg_langsetup_prop {#1/direction}{##1} }
- { \xpg_error_msg:n {Unknown~ direction~ "##1"~ for~ language~ "#1"} }
- },
- #1 / direction
- .value_required:n = true,
- #1 / direction
- .initial:n = {LR},
- % minimal left and right hyphenation minima using
- #1 / hyphenmins
- .code:n = {
- % check syntax
- \int_compare:nNnF { \clist_count:n {##1} } = {2}
- { \xpg_error_msg:n {hypenmins~should~be~a~list~of~two~entries,~got~"##1"} }
- % set prop
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/hyphenmins} {##1}
- },
- #1 / hyphenmins
- .value_required:n = true,
- #1 / hyphenmins
- .initial:n = {2,3},
- % minimal length for hyphenation (LuaTeX only)
- #1 / totalhyphenmin
- .code:n = {
- % check syntax
- \int_compare:nNnF { \clist_count:n {##1} } = {1}
- { \xpg_error_msg:n {totalhyphenhypenmin~should~be~a~single~entry,~got~"##1"} }
- % set prop
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/totalhyphenmin} {##1}
- },
- #1 / totalhyphenmin
- .value_required:n = false,
- % frenchspacing
- #1 / frenchspacing .bool_gset:c = g__xpg_#1_fs_bool ,
- #1 / frenchspacing .default:n = true ,
- #1 / frenchspacing .initial:n = false ,
- % indent first line
- #1 / indentfirst .bool_gset:c = g__xpg_#1_if_bool ,
- #1 / indentfirst .default:n = true ,
- #1 / indentfirst .initial:n = false ,
- % fontsetup
- #1 / fontsetup .bool_gset:c = g__xpg_#1_fontsetup_bool ,
- #1 / fontsetup .default:n = true ,
- #1 / fontsetup .initial:n = false ,
- % environment name
- #1 / envname
- .code:n = {
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/envname}{##1}
- },
- #1/ envname.value_required:n = true,
- #1/ envname.initial:n = {#1},
- % babel name
- #1 / babelname
- .code:n = {
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/babelname}{##1}
- },
- #1/ babelname.value_required:n = true,
- #1/ babelname.initial:n = {#1},
- % default numerals
- #1 / localnumeral
- . code:n = {
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/localnumeral}{##1}
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/Localnumeral}{##1}
- },
- #1 / localnumeral.value_required:n = true,
- #1 / localnumeral.initial:n = {xpg_C_localnumeral:nn},
- % uppercased
- #1 / Localnumeral
- . code:n = {
- \prop_put:Nnn \l_xpg_langsetup_prop {#1/Localnumeral}{##1}
- },
- #1 / Localnumeral.value_required:n = true,
- #1 / Localnumeral.initial:n = {xpg_C_localnumeral:nn},
- % environment define command (by default create the environment)
- #1 / DefineCommandsCmd
- .code:n = {\prop_put:Nnn \l_xpg_langsetup_prop {#1/DefineCommandsCmd}{##1}},
- #1 / DefineCommandsCmd
- .value_required:n = true,
- #1 / DefineCommandsCmd
- .initial:n = {xpg_define_language_commands:e}
- }
-}
-
-\DeclareExpandableDocumentCommand \babelname { }
- {
- \prop_item:Ne \l_xpg_langsetup_prop { \languagename / babelname }
- }
-
-\DeclareExpandableDocumentCommand \mainbabelname { }
- {
- \prop_item:Ne \l_xpg_langsetup_prop { \mainlanguagename / babelname }
- }
-
-% TODO move to C module
-\cs_new:Nn \xpg_C_localnumeral:nn
-{
- \xpg_Clang_arabic{#2}
-}
-
-\cs_new:Npn \__xpg_localnumeral_parse:nn #1 #2
- {
- \str_if_eq:eeF { #1 } { lang } { \msg_error:nnn { polyglossia } { unknownlocalnumeral } { #1 } }
- \exp_args:Ne \str_case:nnF { #2 }
- {
- { local } { }
- { main } { \foreignlanguage { \mainlanguagename } }
- }
- { \foreignlanguage { #2 } }
- }
-
-\cs_new:Npn \__xpg_localnumeral:nnn #1 #2 #3
- {
- \use:e
- {
- \keyval_parse:nnn
- { \msg_error:nnn { polyglossia } { localnumeralemptyvalue } }
- {
- \__xpg_localnumeral_parse:nn
- } { #2 }
- }
- { \use:c { \prop_item:Ne \l_xpg_langsetup_prop
- { \languagename / #3 } } { } { #1 } }
- }
-
-\NewExpandableDocumentCommand \localnumeral { s O{ lang=local } m }
- {
- \IfBooleanTF { #1 }
- {
- \exp_args:Nc \__xpg_localnumeral:nnn { c@#3 } { #2 } { localnumeral }
- }
- {
- \__xpg_localnumeral:nnn { #3 } { #2 } { localnumeral }
- }
- }
-
-\NewExpandableDocumentCommand \Localnumeral { s O{ lang=local } m }
- {
- \IfBooleanTF { #1 }
- {
- \exp_args:Nc \__xpg_localnumeral:nnn { c@#3 } { #2 } { Localnumeral }
- }
- {
- \__xpg_localnumeral:nnn { #3 } { #2 } { Localnumeral }
- }
- }
-
-\cs_new_nopar:Npn \__xpg_french_spacing:n #1
- {
- \bool_if:cTF { g__xpg_#1_fs_bool }
- { \frenchspacing } { \nonfrenchspacing }
- }
-
-\cs_new_nopar:Npn \__xpg_indent_first:n #1
- {
- \bool_if:cTF { g__xpg_#1_if_bool }
- { \__xpg_french_indent: } { \__xpg_no_french_indent: }
- }
-
-\cs_new:Nn \__xpg_lang_set_par_direction:n
-{
- \prop_get:NeNTF \l_xpg_langsetup_prop {#1/direction} \l_tmpa_tl
- {
- \__xpg_set_par_direction:n{\l_tmpa_tl}
- }
- {
- \xpg_error_msg:n {Could~ not~ retrieve~ key~ direction~ for~ language~ "#1"}
- \prop_show:N{\l_xpg_langsetup_prop}
- }
-}
-
-
-\cs_new:Nn \__xpg_lang_set_text_direction:nn
-{
- \prop_get:NeNTF \l_xpg_langsetup_prop {#1/direction} \l_tmpa_tl
- {
- \__xpg_set_text_direction:n{\l_tmpa_tl}{#2}
- }
- {
- \xpg_error_msg:n {Could~ not~ retrieve~ key~ direction~ for~ language~ "#1"}
- \prop_show:N{\l_xpg_langsetup_prop}
- }
-}
-
-\tl_new:N \g__xpg_lastlanguage_tl
-\tl_set:Nn \g__xpg_lastlanguage_tl { 0 }
-
-% Track whether hyphenation is disabled
-\bool_new:N \g__xpg_hyphenation_disabled_bool
-
-\DeclareDocumentCommand \disablehyphenation {}
-{
- % we have to postpone the execution until the main language
- % has been set (#125).
- \hook_gput_code:nnn { polyglossia / selectdefaultlanguage / after } {.}
- {
- \__xpg_disable_hyphenation:
- }
-}
-
-\cs_new:Nn \__xpg_disable_hyphenation:
-{
- \bool_if:NF \g__xpg_hyphenation_disabled_bool
- {
- \bool_gset_true:N \g__xpg_hyphenation_disabled_bool
- \tl_gset:Ne \g__xpg_lastlanguage_tl { \the\language }
- % We do not call \xpg_set_hyphenation_patterns:n here to avoid a warning message.
- % "nohyphenation" is not listed in language.dat.lua.
- \language=\l@nohyphenation
- }
-}
-
-\DeclareDocumentCommand \enablehyphenation {}
-{
- \bool_if:NT \g__xpg_hyphenation_disabled_bool
- {
- \bool_gset_false:N \g__xpg_hyphenation_disabled_bool
- \language=\tl_use:N{\g__xpg_lastlanguage_tl}
- }
-}
-
-\cs_new:Npn \__xpg_auto_setupfont:n #1
-{
- \bool_if:cTF { g__xpg_#1_fontsetup_bool }
- {
- \str_if_eq:eeTF{\prop_item:Nn{\l_xpg_langsetup_prop}{#1/lcscript}}{latin}
- {\SetupLatinPolyglossiaFont{#1}}
- {\SetupNonLatinPolyglossiaFont{#1}}
- }
- {
- \xpg_info_msg:n{Skipping~ automatic~ font~ setup~ for~ language~ #1}
- }
-}
-
-
-% add fontfeature Language=#2 to langtag #1
-% do nothing if #1 or #2 is empty
-\cs_new:Nn \__xpg_add_font_feature_language:nn
-{
- \bool_if:nTF{\tl_if_empty_p:n{#1} || \tl_if_empty_p:n{#2}}
- {
- % maybe an error ?
- \xpg_warning_msg:n{Asking~ to~ add~ empty~ feature~to~ main~ font~
- (Language="#2"~ to~ langtag~ "#1")}
- }
- {
- \str_if_eq:nnTF{#2}{Turkish}
- {
- \fontspec_if_language:nTF {TRK}
- {
- \addfontfeature{Language=Turkish}
- }
- {
- \fontspec_if_language:nT {TUR}
- {
- \addfontfeature{Language=Turkish}
- }
- }
- }{
- \fontspec_if_language:nT{#1}
- {
- \addfontfeature{Language=#2}
- }
- }
- }
-}
-\cs_generate_variant:Nn \__xpg_add_font_feature_language:nn { ee }
-
-% add fontfeature Script=#3 to scripttag #2 for family #1
-% do nothing if #2 or #3 is empty
-\cs_new:Nn \__xpg_add_font_feature_script:nnn
-{
- \bool_if:nTF{\tl_if_empty_p:n{#2} || \tl_if_empty_p:n{#3}}
- {
- % maybe an error ?
- \xpg_warning_msg:n{Asking~ to~ add~ empty~ feature~to~ main~ font
- (Script="#3"~ to~ scripttag~ "#2")}
- }
- {
- \xpg_if_script:nTF{#2}
- {\addfontfeature{Script=#3}}
- {
- \tl_set:Nn \xpg_ffamily_tl {}
- \tl_set:Nn \xpg_ffamilysh_tl { #1 }
- \str_if_eq:nnT { #1 } { rm }
- {
- \tl_set:Nn \xpg_ffamily_tl { roman }
- \tl_set:Nn \xpg_ffamilysh_tl {}
- }
- \str_if_eq:nnT { #1 } { sf }
- {
- \tl_set:Nn \xpg_ffamily_tl { sans~ serif }
- }
- \str_if_eq:nnT { #1 } { tt }
- {
- \tl_set:Nn \xpg_ffamily_tl { monospace }
- }
- % Strip font family name for error message
- % Courtesy of egreg, https://tex.stackexchange.com/a/613996
- \str_set:Nx \xpg_fname_str { \fontname\font }
- % Remove name: prefix
- \regex_replace_once:nnN { name: } { } \xpg_fname_str
- % Remove all after :
- \regex_replace_once:nnN { \:.* } { } \xpg_fname_str
- % ... and all after /
- \regex_replace_once:nnN { /.* } { } \xpg_fname_str
- % ... and brackets
- \regex_replace_once:nnN { \[ } { } \xpg_fname_str
- \regex_replace_once:nnN { \] } { } \xpg_fname_str
- % ... and extensions
- \regex_replace_once:nnN { \.[^\.]* \Z } { } \xpg_fname_str
- % ... and, finally, quotation marks
- \regex_replace_once:nnN { " } { } \xpg_fname_str
- \xpg_error_msg:n
- {
- The~ current~ main ~ \xpg_ffamily_tl\space font,~ \xpg_fname_str,~ does~ not~ contain~ the~"#3"~ script! \iow_newline:
- Please~ define~\csname\tl_if_empty:nF{#3}{\str_lowercase:n{#3}}font\xpg_ffamilysh_tl\endcsname~
- with~ \string\newfontfamily\space command
- }
- }
- }
-}
-\cs_generate_variant:Nn \__xpg_add_font_feature_script:nnn { nee }
-
-%% TODO: probably can be cleaned a little more
-\cs_new_protected:Npn \__xpg_setup_font:nnnnn #1 #2 #3 #4 #5 % #1 = lang, #2 = family, #3 = family, #4 = gobble, #5 gobble
- {
- \cs_set_protected_nopar:cpn { #1@font@#2 }
- {
- \cs_if_exist_use:cF{ #1font#3 }
- {
- \cs_if_exist_use:cF { \prop_item:Nn \l_xpg_langsetup_prop { #1 / lc-bcp47-script } font#3 }
- {
- #4 { \prop_item:Nn \l_xpg_langsetup_prop { #1 / lcscript } font#3 }
- {
- \use:c { #2familylatin }
- #5
- {
- \__xpg_add_font_feature_script:nee { #2 }
- { \prop_item:Nn \l_xpg_langsetup_prop { #1 / scripttag } }
- { \prop_item:Nn \l_xpg_langsetup_prop { #1 / script } }
- }
- }
- }
- \__xpg_add_font_feature_language:ee
- { \prop_item:Nn \l_xpg_langsetup_prop { #1 / langtag } }
- { \prop_item:Nn \l_xpg_langsetup_prop { #1 / language } }
- }
- \tl_set:Nn \familytype { #2 }
- }
- }
-
-\NewDocumentCommand \SetupLatinPolyglossiaFont { m }
- {
- \__xpg_setup_font:nnnnn { #1 } { rm } { } { \use_ii:nn } { \use_none:n }
- \__xpg_setup_font:nnnnn { #1 } { sf } { sf } { \use_ii:nn } { \use_none:n }
- \__xpg_setup_font:nnnnn { #1 } { tt } { tt } { \use_ii:nn } { \use_none:n }
- }
-
-\NewDocumentCommand \SetupNonLatinPolyglossiaFont { m }
- {
- \__xpg_setup_font:nnnnn { #1 } { rm } { } { \cs_if_exist_use:cF } { \use:n }
- \__xpg_setup_font:nnnnn { #1 } { sf } { sf } { \cs_if_exist_use:cF } { \use:n }
- \__xpg_setup_font:nnnnn { #1 } { tt } { tt } { \cs_if_exist_use:cF } { \use:n }
- }
-
-%%% END OF PolyglossiaSetup
-
-%% ensure localization of \markright and \markboth commands
-%%% THIS IS NOW DISABLED BY DEFAULT
-\cs_new_nopar:Nn \__xpg_local_marks:n { }
-\cs_new_nopar:Nn \__xpg_enable_local_marks:
-{
- \xpg_info_msg:n{Option:~ localmarks}
- \cs_gset_nopar:Nn \__xpg_local_marks:n
- {
- \DeclareDocumentCommand \markboth { m m }
- {
- \group_begin:
- \cs_set_eq:cc { label } { relax }
- \cs_set_eq:cc { index } { relax }
- \cs_set_eq:cc { glossary } { relax }
- \unrestored@protected@xdef\@themark
- {
- {\foreignlanguage{##1}{\protect\@@ensure@maindir{####1}}}
- {\foreignlanguage{##1}{\protect\@@ensure@maindir{####2}}}
- }
- \@temptokena \expandafter{\@themark}
- \mark_insert:nn{2e-left}{####1}
- \mark_insert:nn{2e-right}{####2}
- \tl_if_empty:nF{####2}{ \mark_insert:nn{2e-right-nonempty}{####2} }
- \mark{\the\@temptokena}
- \group_end:
- \if@nobreak\ifvmode\nobreak\fi\fi
- }
- \DeclareDocumentCommand \markright { m }
- {
- \group_begin:
- \cs_set_eq:cc { label } { relax }
- \cs_set_eq:cc { index } { relax }
- \cs_set_eq:cc { glossary } { relax }
- \expandafter\@markright\@themark
- {\foreignlanguage{##1}{\protect\@@ensure@maindir{####1}}}
- \@temptokena \expandafter{\@themark}
- \mark_insert:nn{2e-right}{####1}
- \tl_if_empty:nF{####1}{ \mark_insert:nn{2e-right-nonempty}{####1} }
- \mark{\the\@temptokena}
- \group_end:
- \if@nobreak\ifvmode\nobreak\fi\fi
- }
- }
-}
-
-%we call this macro when a gloss file is not found for a given language
-\cs_new_nopar:Nn \__xpg_no_gloss:n
-{
- \xpg_warning_msg:n
- {File~ gloss-#1.ldf~ do~ not~ exists! \iow_newline:
- I~ will~ nevertheless~ try~ to~ use~ hyphenation~ patterns~ for~ #1.}
-
- \PolyglossiaSetup{#1}{hyphenmins={2,3},hyphennames={#1},fontsetup=true}
- % the above amounts to:
- %\ifcsundef{l@#1}%
- % {\expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax}%
- % {\setlocalhyphenmins{#1}{2}{3}}%
- %\csdef{#1@language}{\language=\csname l@#1\endcsname}%
-}
-
-\cs_new_nopar:Nn \xpg_input:n
-{
- % Store catcode of @ before making at letter
- \cs_set_protected_nopar:Npx \__xpg_restore_at_catcode:
- { \char_set_catcode:nn { `@ } { \char_value_catcode:n {`\@ } } }
- \char_set_catcode_letter:N @
- \file_input:n { #1 }
- % restore former @ catcode
- \__xpg_restore_at_catcode:
-}
-
-% try to load a language file
-\cs_new:Nn \__xpg_load_lang_definition:nn
-{
- \file_if_exist:nTF{gloss-#2.ldf}
- {
- \tl_set:Nn \xpg__tmp_default_options_tl { #1 }
- % Temporarily force catcode of ~ to 13 (active) since babelsh.def
- % requires it. This is needed particularly with LaTeX3
- % packages which force \ExplSyntaxOn (#425)
- \cs_gset_protected:Npx \__xpg_restore_tilde_catcode:
- { \char_set_catcode:nn { 126 } { \char_value_catcode:n { 126 } } }
- \char_set_catcode_active:n { 126 }
- \xpg_input:n {gloss-#2.ldf}
- % restore former ~ catcode
- \__xpg_restore_tilde_catcode:
- }
- {
- \__xpg_no_gloss:n {#2}
- }
-}
-\cs_generate_variant:Nn \__xpg_load_lang_definition:nn { ee }
-
-% load a master language from an alias file
-\NewDocumentCommand \InheritGlossFile { m }
-{
- \seq_if_in:NeF \__xpg_langs_loaded {#1}
- {
- \xpg_input:n {gloss-#1.ldf}
- % define environment and command if not alias
- \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#1/target}} {#1} {
- \use:c{\prop_item:Nn{\l_xpg_langsetup_prop}
- {#1/DefineCommandsCmd}}
- {#1}
- }
- \seq_gput_right:Nn \__xpg_langs_loaded {#1}
- }
- \__xpg_register_language:nn{}{#1}
-}
-
-\prop_new_linked:N \__xpg_alias
-
-% define environment and command if not alias
-\cs_new:Nn \xpg_define_language_commands:n {
- \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#1/target}} {#1}
- {
- \exp_args:Ne
- \NewDocumentEnvironment {\prop_item:Nn{\l_xpg_langsetup_prop}{#1/envname}} { O{} }
- {
- \otherlanguage [ ##1 ] { #1 }
- }
- {
- \endotherlanguage
- }
- \exp_args:Nc \NewDocumentCommand {text#1} { O{} m }
- {
- \__xpg_textlanguage:een{##1}{#1}{##2}
- }
- }
-}
-\cs_generate_variant:Nn \xpg_define_language_commands:n {e}
-
-
-% resolve alias property #1 lang #2 item
-\cs_new:Nn \xpg_alias_prop_item:nn {
- \prop_if_in:NeTF \__xpg_alias {#1/#2}
- {
- \prop_item:Ne \__xpg_alias {#1/#2}
- }
- {
- \prop_if_in:NeTF \__xpg_alias {#1/target}
- {
- % target to self fall back to language table
- \str_if_eq:eeTF { \prop_item:Ne \__xpg_alias {#1/target} } { #1 }
- {
- \prop_item:Nn{\l_xpg_langsetup_prop} {#1/#2}
- }
- % load alias by recursion
- {
- \xpg_alias_prop_item:ee { \prop_item:Ne \__xpg_alias {#1/target} } {#2}
- }
- }
- {
- % empty
- }
- }
-}
-\cs_generate_variant:Nn \xpg_alias_prop_item:nn {en, ne, ee}
-
-% add option #2 to list of option of language #1
-\cs_new:Nn \xpg_alias_add_to_option_i:nn
-{
- \tl_if_blank:eTF {#2}
- {
- \xpg_alias_prop_item:nn {#1}{options}
- }
- {
- \tl_if_blank:eTF { \xpg_alias_prop_item:nn {#1}{options} }
- {
- #2
- }
- {
- \xpg_alias_prop_item:nn {#1}{options},#2
- }
- }
-}
-
-
-% get base language
-\cs_new:Nn \xpg_alias_base_lang:n
- {
- \prop_item:Ne \__xpg_alias {#1/target}
- }
-\cs_generate_variant:Nn \xpg_alias_base_lang:n {e}
-
-\keys_define:nn { polyglossia/alias }
-{
- % babelname\l_tmpa_prop
- babelname .prop_put:N = \__xpg_language_alias_prop,
- % bcp47
- bcp47 .prop_put:N = \__xpg_language_alias_prop,
- % variant
- variant .prop_put:N = \__xpg_language_alias_prop,
-}
-
-
-
-% provide way to define alias environment and command
-% #1 () variant
-% #2 [] option (not yet without variant and bcp47 name)
-% #3 language
-% #4 () babel name
-% #5 [] bcp47 name
-% #6 alias
-\DeclareDocumentCommand \xpg_language_alias { D(){} O{} m D(){} O{} m}
-{
- \prop_gremove:Nn \__xpg_alias {#6/target}
- \prop_gremove:Nn \__xpg_alias {#6/options}
- \prop_gremove:Nn \__xpg_alias {#6/bcp47}
- \prop_gremove:Nn \__xpg_alias {#6/babelname}
- \prop_gremove:Nn \__xpg_alias {#6/variant}
- \prop_gput:Nee \__xpg_alias {#6/target} {#3}
- \tl_if_blank:eF {#1}
- {
- \prop_gput:Nee \__xpg_alias {#6/variant} {#1}
- }
- \tl_if_blank:eF {#5}
- {
- \prop_gput:Nee \__xpg_alias {#6/bcp47} {#5}
- }
- \tl_if_blank:eF {#4}
- {
- \prop_gput:Nee \__xpg_alias {#6/babelname} {#1}
- }
- \tl_if_blank:eF {#2}
- {
- \prop_gput:Nee \__xpg_alias {#6/options} {#2}
- }
-}
-
-
-% provide way to define alias environment and command
-% \setlanguagealias[<options>]{<language>}{<alias>}
-\DeclareDocumentCommand \setlanguagealias {s O{} m m}
-{
- % The starred version does not define commands and environments
- \IfBooleanF {#1}
- {
- \exp_args:Nc \DeclareDocumentCommand {text#4} { O{} m }
- {
- \__xpg_textlanguage:een {##1} {#4} {##2}
- }
- \DeclareDocumentEnvironment { #4 } { }
- {
- \otherlanguage { #4 }
- }
- {
- \endotherlanguage
- }
- }
- \tl_clear_new:N \__xpg_alias_option_tl
- \prop_clear_new:N \__xpg_language_alias_prop
- \keys_set_known:nnN{polyglossia/alias} {#2} \__xpg_alias_option_tl
- \xpg_language_alias
- (\prop_item:Nn \__xpg_language_alias_prop {variant})
- % TODO not yet [\__xpg_alias_option_tl]
- [#2]
- {#3}
- (\prop_item:Nn \__xpg_language_alias_prop {babelname})
- [\prop_item:Nn \__xpg_language_alias_prop {bcp47}]
- {#4}
-}
-
-\cs_new:Nn \__xpg_register_language:nn
-{
- \clist_if_in:NeF \xpg@loaded {#2}{
- \clist_gput_right:Ne \xpg@loaded {#2}
- }
- \group_begin:
- % set language options
- \__xpg_set_language_options:nn {#2} {#1}
- % register babelname
- \prop_get:NeN \l_xpg_langsetup_prop {#2/babelname} \l_tmpa_tl
- \clist_if_in:NeF \xpg@bloaded {\l_tmpa_tl}{
- \clist_gput_right:Ne \xpg@bloaded {\l_tmpa_tl}
- }
- % register BCP-47 ID
- \prop_get:NeN \l_xpg_langsetup_prop {#2/bcp47} \l_tmpa_tl
- \clist_if_in:NeF \xpg@bcp@loaded {\l_tmpa_tl}{
- \clist_gput_right:Ne \xpg@bcp@loaded {\l_tmpa_tl}
- }
- % register variant
- \prop_get:NnNT \l_xpg_curropt_prop {#2/variant} \l_tmpa_tl {
- \clist_if_in:NeF \xpg@vloaded {\l_tmpa_tl}{
- \clist_gput_right:Ne \xpg@vloaded {\l_tmpa_tl}
- }}
- \group_end:
-}
-
-\prop_new_linked:N \l_xpg_curropt_prop
-
-\DeclareDocumentCommand \setdefaultlanguage { O{} m }
-{
- % latex is an internal language, so do not record
- \str_if_eq:eeF{#2}{latex}
- {
- \clist_if_in:NeF \xpg@loaded {\xpg_alias_base_lang:n{##2}}{
- \clist_gput_right:Ne \xpg@loaded {\xpg_alias_base_lang:n{##2}}
- }
- }
- \seq_if_in:NeF \__xpg_langs_loaded {#2}
- {
- \__xpg_load_lang_definition:nn{#1}{#2}
- % define environment and command if not alias
- \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#2/target}} {#2} {
- \use:c{\prop_item:Ne{\l_xpg_langsetup_prop}
- {#2/DefineCommandsCmd}}
- {#2}
- }
- \seq_gput_right:Ne \__xpg_langs_loaded {#2}
- }
- \cs_set_nopar:Npe \mainlanguagevariant { \prop_item:Ne \l_xpg_curropt_prop { \xpg_alias_base_lang:n{#2} / variant } }
- \exp_args:Nee \__xpg_set_default_language:nn {\xpg_alias_add_to_option_i:nn{#2}{#1}}
- {\xpg_alias_base_lang:n{#2}}
-}
-
-
-\cs_new:Nn \__xpg_set_default_language:nn
-{
- \tl_gset:Nn \xpg_main_language_tl {#2}
- %% The following settings are for the default language and script
- % this tells bidi.sty or luabidi.sty that the document is RTL
- \__xpg_if_LR_str:eF{\prop_item:Nn{\l_xpg_langsetup_prop}{#2/direction}}
- {
- \__xpg_setRTLmain:
- }
- \cs_gset_nopar:Nn \__xpg_selectdefaultlanguage:
- {
- \selectbackgroundlanguage{#2}
- \selectlanguage[#1]{#2}
- }
- \str_if_eq:eeF { #2 } { latex }
- { \xpg_info_msg:n{Default~ language~ is~ #2} }
- \xpg_set_language_name:n { #2 }
-
- \cs_gset_nopar:Npn \mainlanguagename {#2}
-}
-
-\DeclareCommandCopy \setmainlanguage \setdefaultlanguage
-
-% Returns the language ID of the current language
-% Currently supported: bcp-47
-\DeclareDocumentCommand \languageid {m}
-{
- \str_case:nnF {#1}
- {
- {bcp-47} { \use:c{bcp47.tag} }
- {bcp47} { \use:c{bcp47.tag} }
- }
- {
- \xpg_ill_arg_msg:nn { #1 } { \languageid }
- }
-}
-
-% Returns the language ID of the main language
-% Currently supported: bcp-47
-\DeclareDocumentCommand \mainlanguageid {m}
-{
- \str_case:nnF {#1}
- {
- {bcp-47} { \use:c{bcp47.main.tag} }
- {bcp47} { \use:c{bcp47.main.tag} }
- }
- {
- \xpg_ill_arg_msg:nn { #1 } { \mainlanguageid }
- }
-}
-% Kernel command to access to BCP-47 data.
-% Shared interface with babel.
-% We support:
-% * language (e.g., de)
-% * region (e.g., AT)
-% * script (e.g., Latn)
-% * variant (e.g., 1901)
-% * extension-t (transformation, e.g., en-t-ja)
-% * extension-u (additional locale information, e.g., ar-u-nu-latn)
-% * extension-x (e.g., classic for la-x-classic)
-% * casing (whatever is suitable for \MakeUppercase and friends,
-% usually alias to language but could also be something
-% like el-x-iota or ckb-Latn)
-% * tag (the registered full tag)
-% and main.* variants thereof
-% See https://github.com/latex3/latex2e/issues/1035
-\DeclareExpandableDocumentCommand \BCPdata {m}
- {
- \cs_if_exist_use:cF{bcp47.#1}
- { \xpg_ill_arg_msg:nn { #1 } { \BCPdata } }
- }
-
-\clist_map_inline:nn
- {
- language, region, script, variant,
- extension.t, extension.u, extension.x
- }{
- \tl_set:Nn \l_tmpa_tl { #1 }
- \tl_replace_once:Nnn \l_tmpa_tl { . } { - }
- \cs_gset_nopar:cpe { bcp47.#1 }
- {
- \exp_not:n { \prop_item:Ne \l_xpg_langsetup_prop } { \exp_not:N \languagename / bcp47-\l_tmpa_tl }
- }
- \cs_gset_nopar:cpe { bcp47.main.#1 }
- {
- \exp_not:n { \prop_item:Ne \l_xpg_langsetup_prop } { \exp_not:N \mainlanguagename / bcp47-\l_tmpa_tl }
- }
- }
-\cs_gset_nopar:cpn { bcp47.casing }
- {
- \tl_if_empty:eTF { \prop_item:Ne \l_xpg_langsetup_prop { \languagename / bcp47-casing } }
- {
- \prop_item:Ne \l_xpg_langsetup_prop { \languagename / bcp47-language }
- }{
- \prop_item:Ne \l_xpg_langsetup_prop { \languagename / bcp47-casing }
- }
- }
-\cs_gset_nopar:cpn { bcp47.main.casing }
- {
- \tl_if_empty:eTF { \prop_item:Ne \l_xpg_langsetup_prop { \mainlanguagename / bcp47-casing } }
- {
- \prop_item:Ne \l_xpg_langsetup_prop { \mainlanguagename / bcp47-language }
- }{
- \prop_item:Ne \l_xpg_langsetup_prop { \mainlanguagename / bcp47-casing }
- }
- }
-\cs_gset_nopar:cpn { bcp47.tag }
- {
- \prop_item:Ne \l_xpg_langsetup_prop { \languagename / bcp47 }
- }
-\cs_gset_nopar:cpn { bcp47.main.tag }
- {
- \prop_item:Ne \l_xpg_langsetup_prop { \mainlanguagename / bcp47 }
- }
-
-\cs_new_nopar:Npn \languagevariant
- {
- \prop_item:Ne \l_xpg_curropt_prop { \languagename / variant }
- }
-
-\cs_new:Nn \xpg_set_language_name:n
-{
- \cs_set:Npn \languagename { #1 }
-}
-
-\NewDocumentCommand \resetdefaultlanguage { O{} m }
-{
- \__xpg_reset_default_language:nn
- {\xpg_alias_add_to_option_i:nn{#2}{#1}}
- {\xpg_alias_base_lang:n{#2}}
-}
-
-\cs_new:Nn \__xpg_reset_default_language:nn
-{
- \xpg_error_if_lang_not_loaded:n{#2}
- % disable globalnumbers of previously defined default language
- \use:c{no\xpg_main_language_tl @globalnumbers}
- \use:c{noextras@\xpg_main_language_tl}
- % This is a hook for external packages which want to access variants
- % via babelname (such as biblatex)
- \cs_if_exist_use:c{noextras@bbl@\mainbabelname}
- \use:c{init@noextras@\xpg_main_language_tl}
- \xpg_set_language_name:n { #2 }
- \__xpg_if_LR_str:eF{\prop_item:Ne{\l_xpg_langsetup_prop}{#2/direction}}
- {
- \@rlmaintrue\@rl@footnotetrue
- }
- \selectlanguage[#1]{#2}
- \selectbackgroundlanguage{#2}
- \cs_set_nopar:Npe \mainlanguagevariant { \prop_item:Ne \l_xpg_curropt_prop { \xpg_alias_base_lang:n{#2} / variant } }
-}
-
-% This saves the normalfont for the latin script since we may change normalfont in other scripts
-\cs_set_eq:cc { normalfontlatin } { normalfont }
-
-% Provide default fonts (as set with \setmainfont, \setsansfont and \setmonofont)
-% for Latin scripts and as a fallback for non-Latin scripts.
-\cs_set_protected:Nn \xpg_defaultfont_rm:
-{
- \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}
- \fontfamily\rmdefault
- \hook_use:n { rmfamily }
- \selectfont
-}
-
-\cs_set_protected:Nn \xpg_defaultfont_sf:
-{
- \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}
- \fontfamily\sfdefault
- \hook_use:n { sffamily }
- \selectfont
-}
-
-\cs_set_protected:Nn \xpg_defaultfont_tt:
-{
- \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}
- \fontfamily\ttdefault
- \hook_use:n { ttfamily }
- \selectfont
-}
-
-\cs_new:Nn \__xpg_patch_fontfamilies:
-{
- % This robustifies the redefinitions of \<xx>family (suggestion by Enrico Gregorio)
- % e.g. to prevent expansion of the \familytype redefinition in auxiliary files
- \tl_put_right:cn {rmfamily~} {\tl_set:Nn \familytype {rm}}
- \tl_put_right:cn {sffamily~} {\tl_set:Nn \familytype {sf}}
- \tl_put_right:cn {ttfamily~} {\tl_set:Nn \familytype {tt}}
-}
-
-% These switches activate the default fonts
-% Note that a simple \let\rmfamilylatin=\rmfamily
-% does not work reliably (see #24)
-\cs_set_eq:cc{rmfamilylatin}{xpg_defaultfont_rm:}
-\cs_set_eq:cc{sffamilylatin}{xpg_defaultfont_sf:}
-\cs_set_eq:cc{ttfamilylatin}{xpg_defaultfont_tt:}
-
-\cs_new:Nn \xpg_set_familydefault:
-{
- \tl_set:Ne \l_tmpa_tl { \familydefault }
- \tl_set:Ne \l_tmpb_tl { \sfdefault }
- \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl
- { \tl_set:Nn \familytype {sf} }
- { \tl_set_eq:NN \l_tmpb_tl \ttdefault
- \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl
- { \tl_set:Nn \familytype {tt} }
- { \tl_set:Nn \familytype {rm} }
- }
- \__xpg_patch_fontfamilies:
- % This (re-)saves the normalfont for the latin script since we may
- % change normalfont in other scripts
- \cs_set_eq:cc{ normalfontlatin }{ normalfont }
- % And for all cases, we also reset \<xx>familylatin
- \cs_set_eq:cc{ rmfamilylatin }{ xpg_defaultfont_rm: }
- \cs_set_eq:cc{ sffamilylatin }{ xpg_defaultfont_sf: }
- \cs_set_eq:cc{ ttfamilylatin }{ xpg_defaultfont_tt: }
-}
-
-\cs_set_nopar:Nn \xpg_select_fontfamily:n
-{
- \str_if_eq:VnTF \familytype { tt }
- { \__xpg_use_or_warn:c { #1@font@tt } }
- { \str_if_eq:VnTF \familytype { sf }
- { \__xpg_use_or_warn:c { #1@font@sf } }
- { \__xpg_use_or_warn:c { #1@font@rm } }
- }
-}
-
-\cs_set_protected:Npn \xpg_select_default_fontfamily:n #1
- {
- \tl_set:Ne \l_tmpa_tl { \familydefault }
- \tl_set:Ne \l_tmpb_tl { \sfdefault }
- \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl
- { \tl_set:Nn \familytype {sf} }
- { \tl_set_eq:NN \l_tmpb_tl \ttdefault
- \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl
- { \tl_set:Nn \familytype {tt} }
- { \tl_set:Nn \familytype {rm} }
- }
- \xpg_select_fontfamily:n{#1}
- }
-
-\cs_new_nopar:Nn \xpg_set_normalfont:n
-{
- \cs_set_eq:cc { rmfamily } { #1@font@rm }
- \cs_set_eq:cc { sffamily } { #1@font@sf }
- \cs_set_eq:cc { ttfamily } { #1@font@tt }
- \cs_set_nopar:Npn \normalfont
- { \xpg_select_default_fontfamily:n {#1}
- \fontseries{\seriesdefault}\selectfont
- \fontshape{\shapedefault}
- \hook_use:n { normalfont }
- \selectfont
- }
- \cs_set_nopar:Npn \reset@font {\protect\normalfont}
-}
-
-\cs_gset_eq:cc { @@fterindentfalse } { @afterindentfalse }
-\cs_new_nopar:Nn \__xpg_french_indent:
-{
- \cs_set_eq:cc { @afterindentfalse } { @afterindenttrue }
- \@afterindenttrue
-}
-\cs_new_nopar:Nn \__xpg_no_french_indent:
-{
- \cs_set_eq:cc { @afterindentfalse } { @@fterindentfalse }
- \@afterindentfalse
-}
-
-\DeclareDocumentCommand \selectbackgroundlanguage { m }
-{
- \__xpg_select_background_language:n {\xpg_alias_base_lang:n{#1}}
-}
-
-\cs_new:Nn \__xpg_select_background_language:n
-{
- \str_if_eq:eeTF { \prop_item:Nn{\l_xpg_langsetup_prop}{#1/lcscript} } { latin }
- {}
- { \xpg_set_normalfont:n{#1} }
- \use:c{#1@globalnumbers}
-}
-\cs_generate_variant:Nn \__xpg_select_background_language:n {e}
-% Declare secondary language #2 with language options #1
-\DeclareDocumentCommand \setotherlanguage { O{} m }
-{
- \seq_if_in:NeF \__xpg_langs_loaded {#2}
- {
- \__xpg_load_lang_definition:ee {#1} {#2}
- % define environment and command if not alias
- \str_if_eq:eeT {\prop_item:Ne \__xpg_alias {#2/target}} {#2} {
- \use:c{\prop_item:Ne{\l_xpg_langsetup_prop}
- {#2/DefineCommandsCmd}}
- {#2}
- }
- \__xpg_set_otherlanguage:ee {\xpg_alias_add_to_option_i:nn{#2}{#1}}
- {\xpg_alias_base_lang:n{#2}}
- \seq_gput_right:Ne \__xpg_langs_loaded {#2}
- }
-}
-
-\cs_new:Nn \__xpg_set_otherlanguage:nn
-{
- \__xpg_register_language:nn{#1}{#2}
-}
-\cs_generate_variant:Nn \__xpg_set_otherlanguage:nn { ee }
-
-\NewDocumentCommand \setotherlanguages { m }
-{
- \clist_map_function:eN { #1 } \setotherlanguage
-}
-
-\cs_set:Nn \xpg_common_language:
-{% FIXME is this really needed???
- \bool_if:NTF \g__xpg_hyphenation_disabled_bool
- {
- \tl_gset:Ne \g__xpg_lastlanguage_tl {\z@}
- }{
- \language=\z@
- }
- \lefthyphenmin=\tw@
- \righthyphenmin=\thr@@}
-
-\cs_set:Nn \xpg_initial_setup:
-{
- \xpg_common_language:
-}
-
-
-% Alias to \text<lang>, but more suitable
-% for specific (esp. tag-based) aliases
-% where \text<alias> would cause clashes
-% (e.g., \textit)
-\NewDocumentCommand \textlang { O{} m +m }
-{
- \__xpg_textlanguage:een {#1} {#2} {#3}
-}
-
-% prevent the language tag in \textlang
-% (second argument) from being affected
-% inside case changing commands (e.g. \MakeUppercase)
-\tl_put_right:Nn \l_text_case_exclude_arg_tl { \textlang }
-
-% wrapper for foreignlanguage and otherlanguage*
-\cs_new_nopar:Nn \xpg_set_foreign_language:nn
-{
- \xpg_select_language:nn { #1 } { #2 }
- \__xpg_register_language:nn{#1}{#2}
-}
-
-% lowercase options before passing to setkeys
-\NewDocumentCommand \SetGlossOptions { m m }
-{
- % \text_lowercase:n fully expands
- % (as opposed to \str_lowercase:n)
- \use:c { xpg_#1_default_options_tl }
- \exp_args:Ne \keys_set:ne{ polyglossia / gloss / #1 }{ \text_lowercase:n {#2} }
- \tl_set:Ne \xpg__current_options_tl { #2 }
-}
-
-% joint code of \foreignlanguage, otherlanguage*
-% and \text<lang>
-% #1 option
-% #2 language
-\cs_new:Nn \xpg_otherlanguage:nn
-{
- \xpg_error_if_lang_not_loaded:n{#2}
- \SetGlossOptions{#2}{#1}
- \xpg_set_foreign_language:nn { #1 } { #2 }
- % Hook for external packages such as biblatex
- \polyglossia@language@switched
- % buggy restoration heure
- \use:c{inlineextras@#2}
- % This is a hook for external packages which want to access variants
- % via babelname (such as biblatex)
- \cs_if_exist_use:c{inlineextras@bbl@\babelname}
-}
-
-\DeclareDocumentCommand { \foreignlanguage } { O{} m +m }
-{
- \__xpg_foreignlanguage:eeen {#1} {#2} {\xpg_alias_base_lang:n{#2}} {#3}
-}
-
-% prevent case changing of language name in \foreignlanguage
-\tl_put_right:Nn \l_text_case_exclude_arg_tl { \foreignlanguage }
-
-% internal wrapper for foreign language
-% #1 option
-% #2 alias
-% #3 base lang
-% #4 text
-\cs_new:Nn \__xpg_foreignlanguage:nnnn
-{
- \tl_if_blank:nTF {#3}
- {
- \msg_show:nnn { polyglossia } { languagenotloaded } {#2}
- }{
- \group_begin:
- \xpg_otherlanguage:nn{ \xpg_alias_add_to_option_i:nn{#2}{#1} }{ #3 }
- \__xpg_lang_set_text_direction:nn{#3}{#4}
- \group_end:
- \cs_if_exist_use:c{ nestedextras@\languagename }
- }
-}
-\cs_generate_variant:Nn \__xpg_foreignlanguage:nnnn {eeen}
-
-
-% otherlanguage* is the environment equivalent of \foreignlanguage
-\DeclareDocumentEnvironment { otherlanguage* } { O{} m }
- {
- \__xpg_otherlanguage:eee { #1 } { #2 } { \xpg_alias_base_lang:n { #2 } }
- }{
- \c_group_end_token% \group_end: does not work here!
- \cs_if_exist_use:c{ nestedextras@\languagename }
- }
-
-% internal wrapper
-% #1 option
-% #2 alias
-% #3 base lang
-\cs_new:Nn \__xpg_otherlanguage:nnn
-{
- \tl_if_blank:nTF {#3}
- {
- \msg_show:nnn { polyglossia } { languagenotloaded } {#2}
- }{
- \xpg_otherlanguage:nn{ \xpg_alias_add_to_option_i:nn{#2}{#1} }{ #3 }
- \__xpg_lang_set_text_direction:nn{#3}%
- \c_group_begin_token% \group_begin: does not work here!
- }
-}
-\cs_generate_variant:Nn \__xpg_otherlanguage:nnn { eee }
-
-% use by \text<lang> and \textlang. Equivalent to \foreignlanguage,
-% except that dates are localized.
-% #1: option
-% #2: alias
-% #3: text
-\cs_new:Nn \__xpg_textlanguage:nnn
-{
- \__xpg_textlanguage:nnen {#1} {#2} {\xpg_alias_base_lang:n{#2}} {#3}
-}
-\cs_generate_variant:Nn \__xpg_textlanguage:nnn {een}
-
-% use by \text<lang> and \textlang. Equivalent to \foreignlanguage,
-% except that dates are localized.
-% #1: option
-% #2: alias
-% #3: base language
-% #4: text
-\cs_new:Nn \__xpg_textlanguage:nnnn
-{
- \tl_if_blank:nTF {#3}
- {
- \msg_show:nnn { polyglossia } { languagenotloaded } {#2}
- }
- {
- \group_begin:
- \xpg_otherlanguage:nn{#1}{#3}
- \use:c{date#3}
- % This is a hook for external packages which want to access variants
- % via babelname (such as biblatex)
- \cs_if_exist_use:c{date@bbl@\babelname}
- \__xpg_lang_set_text_direction:nn{#3}{#4}
- \group_end:
- \cs_if_exist_use:c{ nestedextras@\languagename }
- }
-}
-\cs_generate_variant:Nn \__xpg_textlanguage:nnnn {nnen}
-
-% Define language-specific hyphenation exceptions
-\NewDocumentCommand \pghyphenation {O{} m m}
- {
- \begin{hyphenrules}[#1]{#2}
- \hyphenation{#3}
- \end{hyphenrules}
- }
-
-
-% Hook that other package authors can use
-% (for instance biblatex):
-% Do not rename!
-\cs_set_nopar:Npn \xpg@hook@setlanguage {}
-
-\cs_set_nopar:Nn \__xpg_pop_language:nn
-{
- \xpg_set_language_aux:nn { #1 } { #2 }
- \xpg@hook@setlanguage
-% FIXME This seems to be a very old relict.
-% The macro is nowhere used. Probably remove.
-% \let\emp@langname\@undefined
-}
-
-\DeclareDocumentCommand \selectlanguage {s O{} m}
- {
- \tl_if_blank:eTF {\xpg_alias_base_lang:n{#3}}
- {
- \IfBooleanTF { #1 }
- { \msg_show:nnn { polyglossia } { languagenolongerloaded } {#3} }
- { \msg_show:nnn { polyglossia } { languagenotloaded } {#3} }
- }{
- \__xpg_select_language:nee {#1}
- { \xpg_alias_add_to_option_i:nn{#3}{#2} }
- { \xpg_alias_base_lang:n{#3} }
- }
- }
-
-\cs_new:Nn \__xpg_select_language:nnn
-{
- % Register the language options
- \__xpg_set_language_options:nn {#3} {#2}
- \IfBooleanTF { #1 } % The starred variant does not write to the aux
- {
- \xpg_set_language_nonaux:nn { #2 } { #3 }
- }{
- \cs_set_nopar:Ne \xpg_pop_language: { \exp_not:N \__xpg_pop_language:nn { #2 } { #3 } }
- \group_insert_after:N \xpg_pop_language:
- \xpg_set_language_aux:nn { #2 } { #3 }
- }
- \__xpg_register_language:nn { #2 } { #3 }
-}
-\cs_generate_variant:Nn \__xpg_select_language:nnn { nee, nne }
-
-% set lang option #2 for lang #1
-\cs_new:Nn \__xpg_set_language_options:nn
-{
- \cs_if_exist:cT { xpg_#1_default_options_prop }
- {
- \prop_concat:ccc { l_xpg_curropt_prop } { l_xpg_curropt_prop }
- { xpg_#1_default_options_prop }
- }
- \xpg__keyval_parser:eeN { #2 } { #1 } \l_xpg_curropt_prop
- \SetGlossOptions{#1}{#2}
-}
-
-% Initialize default language options, so that
-% \iflanguageoption has the info it needs also
-% for default settings
-\NewDocumentCommand \InitializeGlossOptions { m m }
-{
- \tl_new:c { xpg_#1_default_options_tl }
- \prop_new:c { xpg_#1_default_options_prop }
- \keys_precompile:nec { polyglossia / gloss / #1 }
- { \text_lowercase:n { #2, \xpg__tmp_default_options_tl } }
- { xpg_#1_default_options_tl }
- \xpg__keyval_parser:enc { #2, \xpg__tmp_default_options_tl } { #1 }
- { xpg_#1_default_options_prop }
- \prop_concat:ccc { l_xpg_curropt_prop } { l_xpg_curropt_prop }
- { xpg_#1_default_options_prop }
- \use:c { xpg_#1_default_options_tl }
- \__xpg_set_language_options:nn {#1} {#2}
-}
-\tl_new:N \xpg__tmp_default_options_tl
-\tl_new:N \xpg__current_options_tl
-\cs_generate_variant:Nn \keys_precompile:nnN { nec }
-
-% Record synonymous keyvals such as variant=us and variant=american
-% Syntax: \SetLanguageAliasValues{<lang>}{<key>}{<alias vals, comma-separated>}
-\int_new:N \l_xpg_alias_keyvals_int
-\int_set:Nn \l_xpg_alias_keyvals_int { 2 }
-\NewDocumentCommand \SetLanguageAliasValues { m m m }
-{
- \clist_map_inline:nn { #3 }
- {
- \int_const:cn { c_xpg_alias_keyvals_#1_#2_##1_int } { \l_xpg_alias_keyvals_int }
- }
- \int_incr:N \l_xpg_alias_keyvals_int
-}
-
-\cs_new:Npn \xpg__keyval_parser:nnN #1 #2 #3 % #1 = key-vals, #2 = language, #3 = prop
- {
- \keyval_parse:nnn
- { \xpg__keyval_parser_default:nnn { #2 } { #3 } }
- { \xpg__keyval_parser_nondefault:nnnn { #2 } { #3 } }
- { #1 }
- }
-\cs_generate_variant:Nn \xpg__keyval_parser:nnN { eeN, enc }
-
-\cs_new:Npn \xpg__keyval_parser_default:nnn #1 #2 #3 % #1 = lang, #2 = prop, #3 = key
- {
- \str_set:Nn \l_tempa_str { #1 / #3 }
- \str_concat:NNN \l_tempa_str \c__keys_default_root_str \l_tempa_str
- \prop_put:Nne #2 { #1 / #3 } { \use:c { \l_tempa_str } }
- }
-
-\cs_new:Npn \xpg__keyval_parser_nondefault:nnnn #1 #2 #3 #4 % #1 = lang, #2 = prop, #3 = key, #4 = value
- {
- \prop_put:Nnn #2 { #1 / #3 } { #4 }
- }
-
-\prg_set_conditional:Npnn \__xpg_check_option_value:NNN #1#2#3 { p , T , F , TF }
- {
- \bool_lazy_or:nnTF
- {
- \str_if_eq_p:ee { \prop_item:Nn \l_xpg_curropt_prop { #1 / #2 } } { #3 }
- } {
- \int_compare_p:nNn
- {
- \cs_if_exist_use:cF { c_xpg_alias_keyvals_#1_#2_#3_int } { 0 }
- } = {
- \cs_if_exist_use:cF { c_xpg_alias_keyvals_#1_#2_\prop_item:Nn \l_xpg_curropt_prop { #1 / #2 }_int } { 1 }
- }
- } { \prg_return_true: } { \prg_return_false: }
- }
-
-\prg_set_conditional:Npnn \xpg_if_main_language:n #1 { T, F, TF }
-{
- \str_if_eq:VnTF \xpg_main_language_tl { #1 }
- { \prg_return_true: }
- { \prg_return_false: }
-}
-
-\cs_set_eq:NN \IfMainLanguageTF \xpg_if_main_language:nTF
-
-\cs_set_eq:NN \IfMainLanguageT \xpg_if_main_language:nT
-
-\cs_set_eq:NN \IfMainLanguageF \xpg_if_main_language:nF
-
-% Test if option value is set
-\DeclareDocumentCommand \iflanguageoption { m m m m m }
-{
- \__xpg_check_option_value:NNNTF{#1}{#2}{#3}{#4}{#5}
-}
-
-% Test if language is loaded
-\DeclareDocumentCommand \iflanguageloaded { m m m }
-{
- \hook_gput_code:nnn {begindocument/end} {.}
- {
- \clist_if_in:NeTF \xpg@loaded{#1}{#2}{#3}
- }
-}
-
-% Same for babellanguage is loaded
-\DeclareDocumentCommand \ifbabellanguageloaded { m m m }
-{
- \hook_gput_code:nnn {begindocument/end} {.}
- {
- \clist_if_in:NeTF \xpg@bloaded{#1}{#2}{#3}
- }
-}
-
-% Same for languageid
-\DeclareDocumentCommand \iflanguageidloaded { m m m m }
-{
- \hook_gput_code:nnn {begindocument/end} {.}
- {
- \str_case:nnTF {#1}
- {
- {bcp-47} { \clist_if_in:NeTF \xpg@bcp@loaded{#2}{#3}{#4} }
- {bcp47} { \clist_if_in:NeTF \xpg@bcp@loaded{#2}{#3}{#4} }
- }
- {}
- {
- \xpg_ill_arg_msg:nn { #1 } { \iflanguageidloaded }
- }
- }%
-}
-
-% Check if the current font has a given glyph
-\prg_new_conditional:Npnn \__xpg_if_char:N #1 { TF }
- {
- \iffontchar\font\int_from_hex:n { #1 }~
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-
-% Test if a char (by char code) is available in the current font
-% and print it, if so, otherwise print the replacement #2
-\NewExpandableDocumentCommand \charifavailable { m m }
- {
- \exp_args:Nno \__xpg_if_char:NTF { #1 } { \Uchar"#1 } { #2 }
- }
-
-% Test if a char (by char code) is available in the current font
-% if so, do #2, else do #3
-\NewExpandableDocumentCommand \IfCharIsAvailableTF { m m m }
- {
- \__xpg_if_char:NTF { #1 } { #2 } { #3 }
- }
-
-
-\cs_new_nopar:Nn \xpg_set_language_nonaux:nn
-{
- \__xpg_start_language:nn { #1 } { #2 }
-}
-
-
-\cs_new_nopar:Nn \xpg_set_language_aux:nn
-{
- \__xpg_start_language:nn { #1 } { #2 }
- % Write to the aux
- \xpg_set_language_only_aux:nn { #1 } { #2 }
-}
-
-\cs_new_nopar:Nn \xpg_set_language_only_aux:nn
-{
- % Write to the aux (toc files)
- \if@filesw
- \addtocontents{toc}{\selectlanguage*[#1]{#2}}
- \fi
-}
-
-\hook_gput_code:nnn {begindocument} {.}
- {
- \if@filesw
- \immediate\write\@mainaux
- {\ProvideDocumentCommand\selectlanguage{sO{}m}{}}
- \fi
-
- % we need to redefine \@caption to intrude the currently active language
- % for the lot/lof.
- % Since captions might float to other language regions,
- % we need to specify the language here (#542)
- \cs_set_eq:cc { __xpg_save_caption:n } { @caption }
- \cs_new:Npn \xpg@current@opts {}
-
- \cs_set:Npn \@caption #1 [#2] #3
- {
- % we might be outside of l3 catcode regime
- \tl_set_eq:NN \xpg@current@opts \xpg__current_options_tl
- \__xpg_save_caption:n { #1 } [ { \selectlanguage*[\xpg@current@opts]{\languagename}#2 } ] { #3 }
- }
- }
-
-% check if language is defined
-\prg_set_conditional:Npnn \__xpg_pattern_check_if_exists:n #1 { F, TF }
- {
- \bool_lazy_and:nnTF
- { \cs_if_exist_p:c { l@#1 } }
- { ! (\cs_if_eq_p:cc { l@#1 } { l@nohyphenation }) }
- { \prg_return_true: }
- { \prg_return_false: }
- }
-
-\cs_new_nopar:Nn \__xpg_luatex_load_lang:n
-{
- % if \l@#1 is not properly defined, call lua function newloader(#1),
- % and assign the returned number to \l@#1
- \__xpg_pattern_check_if_exists:nF {#1}
- {
- \directlua { token.set_char('l@#1', polyglossia.newloader'#1') }
- }
-}
-
-% check if language is defined
-\prg_set_conditional:Npnn \xpg_if_language_defined:n #1 { T, F, TF }
-{
- % With luatex, we first need to define \l@#1.
- \sys_if_engine_luatex:T
- {
- \__xpg_luatex_load_lang:n {#1}
- }
- \__xpg_pattern_check_if_exists:nTF{#1}
- { \prg_return_true: }
- { \prg_return_false: }
-}
-
-% Aliases for gloss files
-\cs_gset_eq:cc { IfLanguageDefinedTF } { xpg_if_language_defined:nTF }
-\cs_gset_eq:cc { IfLanguageDefinedT } { xpg_if_language_defined:nT }
-\cs_gset_eq:cc { IfLanguageDefinedF } { xpg_if_language_defined:nF }
-
-% Check if patterns for language #1 is defined. If not, try
-% the comma-separated list of fallbacks in #2
-\NewDocumentCommand \TryPatternWithFallback { m m }
-{
- \xpg_if_language_defined:nF { #1 }
- {
- \clist_clear_new:N \l_xpg_lang_patterns
- \clist_set:Ne \l_xpg_lang_patterns { #2 }
- \bool_set_false:N \l_tmpa_bool
- \clist_map_inline:Nn \l_xpg_lang_patterns
- {
- \xpg_if_language_defined:nT { ##1 }
- {
- \cs_gset_eq:cc { l@#1 } { l@##1 }
- \bool_set_true:N \l_tmpa_bool
- \clist_map_break:
- }
- }
- \bool_if:NF \l_tmpa_bool
- {
- \xpg_warning_msg:n
- {No~ hyphenation~ patterns~ for~ #1~ found \iow_newline:
- Falling~ back~ to~ the~ default~ patterns~ (=~English)!}
- \exp_args:Nc \adddialect {l@#1} 0
- }
- }
-}
-
-% This old term is used by biblatex, so don't drop!
-\cs_gset_eq:cc { xpg@ifdefined } { xpg_if_language_defined:nTF }
-
-% Set \bbl@hyphendata@\the\language, which is (lua)babel's
-% hyphenation pattern hook
-% FIXME Clarifiy why/when this is needed.
-\cs_new:Nn \xpg_set_bbl_hyphendata:n
-{
- \sys_if_engine_luatex:T
- {
- \cs_if_exist:cF {bbl@hyphendata@#1}
- {
- \cs_gset:cpn {bbl@hyphendata@\the\language} {}
- }
- }
-}
-
-% Set hyphenation patterns for a given language. This does the right
-% thing both for XeTeX and LuaTeX
-\cs_new:Nn \xpg_set_hyphenation_patterns:n
-{
- \sys_if_engine_luatex:T { \__xpg_luatex_load_lang:n {#1} }
- \language=\csname l@#1\endcsname
-}
-
-\cs_new:Nn \__xpg_start_language:nn
-{
- % hook for compatibility with biblatex
- \select@language { #2 }
- \xpg_set_bbl_hyphendata:n {\the\language}
- \xpg_initial_setup:
- \xpg_select_language:nn { #1 } { #2 }
- % Hook for external packages such as biblatex
- \polyglossia@language@switched
- \__xpg_lang_set_par_direction:n {#2}
- \use:c {captions#2}
- \use:c {date#2}
- % These are hooks for external packages which want to access variants
- % via babelname (such as biblatex)
- \cs_if_exist_use:c {captions@bbl@\babelname}
- \cs_if_exist_use:c {date@bbl@\babelname}
- \__xpg_local_marks:n {#2}
- \use:c {init@extras@#2}
- \__xpg_indent_first:n { #2 }
- \cs_if_exist_use:c {blockextras@#2}
- % This is a hook for external packages which want to access variants
- % via babelname (such as biblatex)
- \cs_if_exist_use:c {blockextras@bbl@\babelname}
-}
-
-% hook for compatibility with biblatex
-% (probably no longer used due to the
-% more general hook that follows, but
-% we keep it for backwards comp.)
-\cs_set:Npn \select@language #1 {}
-
-% Hook for external packages such as biblatex
-% do not rename!
-\cs_new:Npn \polyglossia@language@switched {}
-
-% remove all customization for language #1
-\cs_new:Npn \noextrascurrent #1
-{
- \cs_if_exist_use:c{noextras@#1}%
- % This is a hook for external packages which want to access variants
- % via babelname (such as biblatex)
- \cs_if_exist_use:c{noextras@bbl@\babelname}
-}
-
-% Common code for `\select@language' and `\foreignlanguage'.
-\cs_new:Nn \xpg_select_language:nn
-{
- % disable the extras and number settings of the previous language
- \cs_if_exist:cT{languagename}
- {
- \noextrascurrent{\languagename}
- \cs_if_exist_use:c{no\languagename @numbers}
- \sys_if_engine_xetex:T{
- \__xpg_if_LR_str:eTF{\prop_item:Ne{\l_xpg_langsetup_prop}{\languagename/direction}}
- {
- \__xpg_if_LR_str:eF{\prop_item:Nn{\l_xpg_langsetup_prop}{#2/direction}}
- {\setnonlatin} % LTR -> RTL
- }
- {
- \__xpg_if_LR_str:eT{\prop_item:Nn{\l_xpg_langsetup_prop}{#2/direction}}
- {\setlatin} % RTL -> LTR
- }
- }
- }
- \xpg_set_language_name:n { #2 }
- \xpg_set_normalfont:n { #2 }
- \xpg_select_fontfamily:n { #2 }
- \__xpg_use_or_warn:c{#2@language}
- \cs_if_exist_use:c{#2@numbers}
- \__xpg_use_localhyphenmins:nn { #1 } { #2 }
- \__xpg_french_spacing:n { #2 }
-}
-
-
-\cs_undefine:N \xpg_pop_language:
-
-\DeclareDocumentEnvironment { otherlanguage } { O{} m }
- {
- \selectlanguage[#1]{#2}
- } { }
-
-% Alias to {<lang>}, but more suitable
-% for specific (esp. tag-based) aliases
-% where {<alias>} would cause clashes
-% (e.g., \fi)
-\DeclareEnvironmentCopy { lang } { otherlanguage }
-
-\NewDocumentCommand \setlocalhyphenmins { m m m }
-{
- \xpg_if_language_defined:nTF{#1}
- {
- \cs_if_eq:ccTF { l@#1 } { l@nohyphenation }
- {
- \xpg_warning_msg:n {\string\setlocalhyphenmin\space~ useless~ for~ unhyphenated~ language~ #1}
- }{
- \providehyphenmins{#1}{#2#3}
- }
- }{
- \xpg_warning_msg:n {\string\setlocalhyphenmin\space~ useless~ for~ unknown~ language~ #1}
- }
-}
-
-% \setlanghyphenmins[options]{lang}{l}{r}
-\NewDocumentCommand \setlanghyphenmins { O{} m m m }
-{
- % Check for real language name and options
- \tl_set:Nx \l_tmp_opts_tl { \xpg_alias_add_to_option_i:nn{#2}{#1} }
- \tl_set:Nx \l_tmp_lang_tl { \xpg_alias_base_lang:n{#2} }
- \c_group_begin_token
- \xpg_error_if_lang_not_loaded:n{\l_tmp_lang_tl}
- \SetGlossOptions{\l_tmp_lang_tl}{ \l_tmp_opts_tl }
- % Store bcp47.tag@hypenmins
- \cs_set_nopar:cpe {tmp@bcp47.tag} { \prop_item:Ne{\l_xpg_langsetup_prop}{ \l_tmp_lang_tl / bcp47 } }
- \cs_gset:cpn {\csname tmp@bcp47.tag\endcsname @hyphenmins} {{#3}{#4}}
- \c_group_end_token
-}
-
-% \__xpg_use_localhyphenmins:nn {options}{lang}
-\cs_new_nopar:Nn \__xpg_use_localhyphenmins:nn
-{
- \c_group_begin_token
- \xpg_error_if_lang_not_loaded:n {#2}
- \SetGlossOptions {#2} {#1}
- % Use bcp47.tag@hypenmins
- \cs_gset_nopar:cpe {tmp@bcp47.tag} { \prop_item:Nn{\l_xpg_langsetup_prop}{ #2 / bcp47 } }
- \c_group_end_token
- \cs_if_exist:cTF {\csname tmp@bcp47.tag\endcsname @hyphenmins}
- {
- \tl_set:Ne \l_tmpa_tl { \use:c{\csname tmp@bcp47.tag\endcsname @hyphenmins} }
- \expandafter \set@hyphenmins \l_tmpa_tl
- }{
- \cs_if_exist:cT{#2hyphenmins}
- {
- \expandafter\expandafter\expandafter\set@hyphenmins\csname #2hyphenmins\endcsname\relax
- }
- }
- \sys_if_engine_luatex:T
- {
- % Set \totalhyphenmin if specified
- \prop_get:NeNT \l_xpg_langsetup_prop {#2/totalhyphenmin} \l_tmpb_tl
- {
- \xpg_info_msg:n {totalhyphenmin: '\l_tmpb_tl'}
- \expandafter\hyphenationmin \l_tmpb_tl
- }
- }
-}
-
-% Babel previously compiled in hyphenrules into the kernel (via hyphen.cfg)
-% but this is no longer the case. In any case, we roll our own one now
-% and possibly overwrite babel's.
-% As opposed to the one inherited from switch.def/babel, our environment
-% supports language options and aliases.
-\DeclareDocumentEnvironment { hyphenrules } { O{} m }
- {
- % Check for real language name and options
- \tl_set:Nx \l_tmp_opts_tl { \xpg_alias_add_to_option_i:nn{#2}{#1} }
- \tl_set:Nx \l_tmp_lang_tl { \xpg_alias_base_lang:n{#2} }
- % Register the language options
- \__xpg_set_language_options:nn { \l_tmp_lang_tl } { \l_tmp_opts_tl }
- % Now switch patterns
- \__xpg_use_or_warn:c{\use:c{l_tmp_lang_tl}@language}
- % And activate hyphenmins
- \__xpg_use_localhyphenmins:nn { \l_tmp_opts_tl } { \l_tmp_lang_tl }
- }
- { }
-
-\hook_gput_code:nnn {begindocument/before} {.}
-{
- \IfPackageLoadedTF{bidi}
- {
- \ProvideDocumentCommand \aemph { m } { $\overline{\hboxR{#1}}$ }
- }{}
- \IfPackageLoadedTF{luabidi}
- {
- \ProvideDocumentCommand \aemph { m } { $\overline{\hbox{\RL{#1}}}$ }
- }{}
-}
-
-
-% keys for main package
-\keys_define:nn { polyglossia } {
- verbose
- .bool_set:N = \g_xpg_verbose_bool,
- verbose
- .default:n = true,
- % compatibility
- quiet
- .meta:n = { verbose = false },
-
- localmarks
- .bool_set:N = \g_xpg_localmarks_bool,
- localmarks
- .default:n = true,
- % compatibility
- nolocalmarks
- .meta:n = { localmarks = false },
-
- babelshorthands
- .legacy_if_set:n = system@babelshorthands, % compatibility
- babelshorthands
- .default:n = true,
-
- luatexrenderer
- .str_set:N = \g_xpg_luatex_renderer_str,
- luatexrenderer
- .value_required:n = true,
-}
-
-\keys_set:nn { polyglossia }
-{
- localmarks = false,
- verbose = true,
- babelshorthands = false,
- luatexrenderer = Harfbuzz
-}
-
-% load by default latex
-\setmainlanguage{latex}
-% then process key in order to overwrite
-\ProcessKeyOptions[polyglossia]
-
-% Set the LuaTeX renderer. As opposed to fontspec, we use Harfbuzz by default.
-% This can be changed via the luatexrenderer package option.
-\sys_if_engine_luatex:T{
- \str_if_eq:eeF{\g_xpg_luatex_renderer_str}{none}
- {
- \xpg_info_msg:n{Setting~ LuaTeX~ font~ renderer~ to~ \g_xpg_luatex_renderer_str}
- \exp_args:Ne \defaultfontfeatures{Renderer=\g_xpg_luatex_renderer_str}
- }
-}
-
-\bool_if:nF \g_xpg_verbose_bool
-{
- \cs_gset_nopar:Npn \@latex@info #1 { \relax } % no latex info
- \cs_gset_nopar:Npn \@font@info #1 { \relax } % no latex font info
- \cs_gset_nopar:Npn \@font@warning #1 { \relax } % no latex font warnings
- \msg_redirect_module:nnn { fontspec } { info } { none } % no fontspec info
- \msg_redirect_module:nnn { polyglossia } { info } { none } % no polyglossia info
-}
-
-\bool_if:nT \g_xpg_localmarks_bool {
- \__xpg_enable_local_marks:
-}
-
-% common code to initiate babelshordhands in glosses
-\cs_new:Npn \InitializeBabelShorthands
-{
- \cs_if_exist:cF {initiate@active@char}
- {
- \file_input:n {babelsh.def}
- \initiate@active@char{"}
- \shorthandoff{"}
- }
-}
-
-% Control shorthand (de-)activation
-% This checks that the shorthand char is only deactivated
-% if we have activated it ourselves and hence keeps
-% activation of other packages if no shorthands are used.
-\seq_new:N \g__xpg_active_shorthands_seq
-
-\DeclareDocumentCommand \xpg@activate@shorthands { O{"} }
-{
- \seq_if_in:NnF \g__xpg_active_shorthands_seq { #1 }
- {
- \bbl@activate{#1}
- \seq_gpush:Nn \g__xpg_active_shorthands_seq { #1 }
- }
-}
-
-\DeclareDocumentCommand \xpg@deactivate@shorthands { O{"} }
-{
- \seq_if_in:NnT \g__xpg_active_shorthands_seq { #1 }
- {
- \cs_if_exist:cT{initiate@active@char}{\bbl@deactivate{#1}}
- \seq_remove_all:Nn \g__xpg_active_shorthands_seq {#1}
- }
-}
-
-% Inherit shorthands in other languages
-\NewDocumentCommand \inheritbabelshorthands { m m }
-{
- \hook_gput_code:nnn {begindocument/before} {.}
- {
- % Load the involved languages if necessary
- % Error if they do not exist
- \tl_set:Nn \l__xpg_tmpa_lang_tl { \xpg_alias_base_lang:n{#1} }
- \clist_if_in:NeF \xpg@loaded {\l__xpg_tmpa_lang_tl}{
- \file_if_exist:nTF{gloss-\l__xpg_tmpa_lang_tl .ldf}
- { \setotherlanguage{#1} }
- { \xpg_error_msg:n { Source~ language~ #1,~ used~ in~
- \string\inheritbabelshorthands,~ does~ not~ exist } }
- }
- \tl_set:Nn \l__xpg_tmpb_lang_tl { \xpg_alias_base_lang:n{#2} }
- \clist_if_in:NeF \xpg@loaded {\l__xpg_tmpb_lang_tl}{
- \file_if_exist:nTF{gloss-\l__xpg_tmpb_lang_tl .ldf}
- { \setotherlanguage{#2} }
- { \xpg_error_msg:n { Target~ language~ #2,~ used~ in~
- \string\inheritbabelshorthands,~ does~ not~ exist } }
- }
- % Test whether the requested shorthands exist
- \bool_if_exist:NF \l__xpg_no_shorthands_bool
- { \bool_new:N \l__xpg_no_shorthands_bool }
- \cs_if_exist:cF { \l__xpg_tmpa_lang_tl @shorthands }
- { \bool_set_true:N \l__xpg_no_shorthands_bool }
- \cs_if_exist:cF { no\l__xpg_tmpa_lang_tl @shorthands }
- { \bool_set_true:N \l__xpg_no_shorthands_bool }
- \bool_if:nT { \l__xpg_no_shorthands_bool }
- {
- \xpg_error_msg:n { No~ babel~ shorthands~ exist~ for~ language~ #1 }
- }
- % If so, apply:
- \bool_if:nF { \l__xpg_no_shorthands_bool }
- {
- \exp_args:Ncc \addto { blockextras@\l__xpg_tmpb_lang_tl } { \l__xpg_tmpa_lang_tl @shorthands }
- \exp_args:Ncc \addto { inlineextras@\l__xpg_tmpb_lang_tl } { \l__xpg_tmpa_lang_tl @shorthands }
- \exp_args:Ncc \addto { noextras@\l__xpg_tmpb_lang_tl } { no\l__xpg_tmpa_lang_tl @shorthands }
- }
- }
-}
-
-% Activate shorthands of a (loaded) language inline
-\NewDocumentCommand \usebabelshorthands { m }
-{
- \str_if_eq:nnTF { #1 } { none }
- {
- % "none" deactivates any shorthands
- \languageshorthands{none}
- }
- {
- \tl_set:Nn \l__xpg_tmpa_lang_tl { \xpg_alias_base_lang:n{#1} }
- \iflanguageloaded{\l__xpg_tmpa_lang_tl}{
- \use:c{\l__xpg_tmpa_lang_tl @shorthands}
- }{
- \xpg_error_msg:n { Language~ #1,~ requested~ in~
- \string\startbabelshorthands,~ is~ not~ loaded }
- }
- }
-}
-
-\endinput
diff --git a/macros/latex/contrib/easybook/README.md b/macros/latex/contrib/easybook/README.md
index 0c0eb3a13a..457e40308f 100644
--- a/macros/latex/contrib/easybook/README.md
+++ b/macros/latex/contrib/easybook/README.md
@@ -1,5 +1,5 @@
# The `easybook` document class
-Easily typesetting Chinese theses or books (v2024du)
+Easily typesetting Chinese theses or books (v2024dx)
## Abstract
`easybook` is a pure academic template created based on the `ctexbook` book document class. It also has the functions of `book` and `article` document class. Combined with the general framework design of the theses of many universities in China, providing multiple commands and interfaces allows users to easily customize the theses templates. Its basic macro package `easybase` can also be used with `ctex` and standard document classes.
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx
index 62740d6e23..452f4017bf 100644
--- a/macros/latex/contrib/easybook/easybook.dtx
+++ b/macros/latex/contrib/easybook/easybook.dtx
@@ -14,7 +14,7 @@
% This work has the LPPL maintenance status `maintained'.
%<class|package>\NeedsTeXFormat{LaTeX2e}[2021/11/15]
%<*class>
-\ProvidesExplClass{easybook}{2024/09/23}{2024du}
+\ProvidesExplClass{easybook}{2024/09/24}{2024dx}
{Easily typesetting Chinese theses or books}
\bool_new:N \l__eb_compile_draft_bool
@@ -301,7 +301,7 @@
%</class>
%<*package>
\RequirePackage{etoolbox}
-\ProvidesExplPackage{easybase}{2024/09/23}{2024du}
+\ProvidesExplPackage{easybase}{2024/09/24}{2024dx}
{Easily typesetting Chinese theses or books}
\cs_generate_variant:Nn \dim_set:Nn { NV }
@@ -2835,7 +2835,7 @@
}
%</package>
%<*tcolorbox>
-\ProvidesExplFile{eb-tcolorbox.cfg}{2024/09/23}{2024du}
+\ProvidesExplFile{eb-tcolorbox.cfg}{2024/09/24}{2024dx}
{Customization of tcolorbox for easybook}
\cs_set_protected:Npn \addtotcbstyle #1#2
diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf
index 75d9fdde24..4d2daec2b8 100644
--- a/macros/latex/contrib/easybook/easybook.pdf
+++ b/macros/latex/contrib/easybook/easybook.pdf
Binary files differ
diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex
index 559706c4ff..b0990391c0 100644
--- a/macros/latex/contrib/easybook/easybook.tex
+++ b/macros/latex/contrib/easybook/easybook.tex
@@ -23,8 +23,8 @@
name = easybook,
color-scheme = blue,
title = EASYBOOK使用手册,
- version = v2024du,
- date = 2024/09/23,
+ version = v2024dx,
+ date = 2024/09/24,
authors = 瞿毅,
info = 简便地排版中文学位论文或书籍,
email = toquyi@163.com,
@@ -632,7 +632,7 @@ $\blacktriangleright$需要注意正确\textbf{编译索引}要增加 \code{-she
\subsection[页面尺寸]{页面尺寸\smodule{geo}}
\label{subsec:page margins}
-页面尺寸模块 \module*{geo} 用于设置纸张大小和各种页面边距,它将选项交给页面尺寸宏包 \pkg*{geometry} 处理,并且支持它的键值列表,预置的页面尺寸与 \textsf{Word} 的默认值接近。下面列举几种 \pkg*{geometry} 不同键值输入方式的选项,前面有\hface 符号的选项为额外附加,其它选项可查阅宏包帮助文档。当用此模块设置纸张规格时,会覆盖全局选项 \option{paper} 的设置。
+页面尺寸模块 \module*{geo} 用于设置纸张大小和各种页面边距,它将选项交给页面尺寸宏包 \pkg*{geometry} 处理,支持通用接口 \cs{geometry} 的键值列表,预置的页面尺寸与 \textsf{Word} 的默认值接近。下面列举几种 \pkg*{geometry} 不同键值输入方式的选项,前面有\hface 符号的选项为额外附加,其它选项可查阅宏包帮助文档。当用此模块设置纸张规格时,会覆盖全局选项 \option{paper} 的设置。模块 \module*{geo} 的通用接口命令只能在导言区中使用。
\begin{cnltxlist}[itemsep = 0ex]
\keyval{headruleskip}{页眉线间距}\dtag\Default*{0pt}
\keyval{footruleskip}{页脚线间距}\dtag\Default*{3.5pt}
@@ -649,6 +649,29 @@ $\blacktriangleright$需要注意正确\textbf{编译索引}要增加 \code{-she
vcentering
}
\end{ctexexam}
+
+ \pkg*{geometry} 宏包支持在文档中部改变页面尺寸,提供了新建和保存页面布局的命令。需要注意的是,\pkg*{fancyhdr} 宏包配置页面标记是以文档开始的页面尺寸为参考,若中途更改页面布局后需用标记偏移命令 \cs{fancyhfoffset} 重置参考的尺寸,以确保标记位置正确。
+ \command{newgeometry}[\marg{键值列表}]
+ 在正文中更改页面布局,\meta{键值列表} 为 \pkg*{geometry} 宏包通用接口的各种页面尺寸选项。
+ \command{restoregeometry}
+ 恢复正文开始时的页面布局。
+ \command{savegeometry}[\marg{布局名}]
+ 保存当前页面布局名为 \meta{布局名}。
+ \command{loadgeometry}[\marg{布局名}]
+ 载入保存的名为 \meta{布局名} 的页面布局。
+ \begin{ctexexam}
+ L1
+ \newgeometry{left = 3cm,right = 1cm,bottom = 0.1cm}
+ \savegeometry{L2}
+ L2 (new, saved)
+ \restoregeometry
+ L1 (restored)
+ \newgeometry{margin = 1cm,includefoot}
+ L3 (new)
+ \loadgeometry{L2}
+ \fancyhfoffset{0pt}
+ L2 (loaded)
+ \end{ctexexam}
\end{cnltxlist}
\subsection[图表题注]{图表题注\smodule{cap}}
@@ -721,6 +744,8 @@ $\blacktriangleright$需要注意正确\textbf{编译索引}要增加 \code{-she
\ebhdrset{headrule = {}}
}
\end{ctexexam}
+ \command{pagestyle}[\marg{风格名}]\Default{fancy}
+ 设置 \meta{风格名} 为当前及之后页的页面风格。
\command{fancyhead}[\oarg{位置}\marg{内容}]\default{}
\command{fancyfoot}[\oarg{位置}\marg{内容}]
为了确保页面显示正确,使用 \cs{fancyhead} 和 \cs{fancyfoot} 等命令设置页眉页脚时需要在页边距的命令之后。默认设置的是一个名为 \code{fancy} 的页面风格。\pkg*{fancyhdr} 将页眉页脚分成了左中右和奇数页(odd)、偶数页(even)共12个部分,可选参数中 \code{E} 和 \code{O} 代表偶数和奇数,\code{L}、\code{C} 和 \code{R} 代表左、中和右部分。单面打印时,含有偶数位置的命令无效。
diff --git a/macros/latex/contrib/jupynotex/README.md b/macros/latex/contrib/jupynotex/README.md
index d19b75542c..1a26ad22e4 100644
--- a/macros/latex/contrib/jupynotex/README.md
+++ b/macros/latex/contrib/jupynotex/README.md
@@ -13,15 +13,15 @@ It will convert the Jupyter Notebook format to proper LaTeX so it gets included
All you need to do is include the `jupynotex.py` and `jupynotex.sty` files in your LaTeX project, and use the package from your any of your `.tex` files:
- \usepackage{jupynotex}
+ `\usepackage{jupynotex}`
After that, you can include a whole Jupyter Notebook in your file just specifying it's file name:
- \jupynotex{file_name_for_your_notebook.ipynb}
+ `\jupynotex{file_name_for_your_notebook.ipynb}`
If you do not want to include it completely, you can optionally specify which cells:
- \jupynotex[<which cells>]{sample.ipynb}
+ `\jupynotex[<which cells>]{sample.ipynb}`
The cells specification can be numbers separated by comma, or ranges using dashes (defaulting to first and last if any side is not included).
@@ -48,18 +48,69 @@ Examples:
`\jupynotex[3,12-]{somenote.ipynb}`
+## Configurations available
+
+The whole package can be configured when included in your project:
+
+ \usepackage[OPTIONS]{jupynotex}
+
+Global options available:
+
+- `output-text-limit=N` where N is a number; it will wrap all outputs that exceed that quantity of columns
+
+Also, each cell(s) can be configured when included in your .tex files:
+
+ `\jupynotex[3, OPTIONS]{yournotebook.ipynb}`
+
+Cell options available:
+
+- `output-image-size=SIZE` where SIZE is a valid .tex size (a number with an unit, e.g. `70mm`); it will set any image in the output of those cells to the indicated size
+
+
## Full Example
Check the `example` directory in this project.
-There you will find an example `notebook.ipynb`, an `example.tex` file that includes cells from that notebook in different ways, and a `build` script.
+There you will find different notebook examples and `.tex` files using them. Also there's a build script to easily run on any of the examples, like:
+
+ ./build cell_ranges.tex
Play with it. Enjoy.
+# Supported cell types
+
+Jupyter has several types of cells, `jupynotex` supports most of those. If you find one that is not supported, please open an issue with an example.
+
+In any case, only the "code" cells are included when processing a notebook (no markdown titles, for example, to make it easy for the developer to find the numbers of cells to include).
+
+Supported cell types in the output:
+
+- `execute_result`: this may have multiple types of information inside; if an image is present, it will be included, otherwise if a latex output is present it will included (directly, so the latex is really parsed later by the LaTeX system, else the plain text will be included (verbatim).
+
+- `stream`: the different text lines will be included (verbatim)
+ result.extend(_verbatimize(x.rstrip() for x in item["text"]))
+
+- `display_data`: the image will be included
+
+- `error`: in this case the Traceback will be parsed, sanitized and included in the output keeping its structure (verbatim)
+
+Two type of images are currently supported (for the case in `execute_result` or `display_data` cell type:
+
+- PNG: used directly
+
+- SVG: converted to PDF (need to have `inkscape` present in the system) and included that
+
+
# Dependencies
-You need Python 3 in your system, and the [tcolorbox](https://ctan.org/pkg/tcolorbox) module in your LaTeX toolbox.
+You need Python 3 in your system, and the following modules in your LaTeX toolbox:
+
+- [tcolorbox](https://ctan.org/pkg/tcolorbox)
+
+- [minted](https://www.ctan.org/pkg/minted)
+
+To support SVG images in the notebook, [inkscape](https://inkscape.org/) needs to be installed and in the system's PATH.
# Feedback & Development
diff --git a/macros/latex/contrib/jupynotex/example/build b/macros/latex/contrib/jupynotex/example/build
deleted file mode 100755
index 51598c0450..0000000000
--- a/macros/latex/contrib/jupynotex/example/build
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-ln -s ../jupynotex.py .
-ln -s ../jupynotex.sty .
-xelatex -shell-escape example.tex
diff --git a/macros/latex/contrib/jupynotex/example/example.tex b/macros/latex/contrib/jupynotex/example/example.tex
deleted file mode 100644
index 5251586b63..0000000000
--- a/macros/latex/contrib/jupynotex/example/example.tex
+++ /dev/null
@@ -1,27 +0,0 @@
-\documentclass{article}
-
-\usepackage{jupynotex}
-
-\begin{document}
-
-One cell:
-
-\jupynotex[1]{notebook.ipynb}
-
-
-A range of cells:
-
-\jupynotex[4-6]{notebook.ipynb}
-
-
-Some specific cells:
-
-\jupynotex[12,17]{notebook.ipynb}
-
-
-The whole notebook:
-
-\jupynotex{notebook.ipynb}
-
-
-\end{document}
diff --git a/macros/latex/contrib/jupynotex/example/notebook.ipynb b/macros/latex/contrib/jupynotex/example/notebook.ipynb
deleted file mode 100644
index a423e9a11f..0000000000
--- a/macros/latex/contrib/jupynotex/example/notebook.ipynb
+++ /dev/null
@@ -1,593 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Non alphanums {'>', '\\t', '[', '\\r', '\\x13', '\\x1d', '<', '^', '\\x04', '\\x08', '\\x17', '\\x1b', '\\\\', '\\x19', '`', '\\x1f', '$', '\\x0b', '\\x14', '\\x12', '\\x18', ')', '=', '?', ' ', \"'\", '\\x1c', '|', ';', '/', '\\x1e', '\\n', '\\x07', '\\x10', '\\x03', '\\x02', '#', '\\x0c', '@', '\\x16', '_', '}', '.', '-', '(', '!', '+', '\\x06', ']', '{', ':', '\\x01', '\\x11', '\\x0f', '\\x05', ',', '~', '\\x15', '\\x00', '\"', '%', '\\x0e', '*', '&', '\\x1a'}\n",
- "Separators b'([\\\\>\\\\\\t\\\\[\\\\\\r\\\\\\x13\\\\\\x1d\\\\<\\\\^\\\\\\x04\\\\\\x08\\\\\\x17\\\\\\x1b\\\\\\\\\\\\\\x19\\\\`\\\\\\x1f\\\\$\\\\\\x0b\\\\\\x14\\\\\\x12\\\\\\x18\\\\)\\\\=\\\\?\\\\ \\\\\\'\\\\\\x1c\\\\|\\\\;\\\\/\\\\\\x1e\\\\\\n\\\\\\x07\\\\\\x10\\\\\\x03\\\\\\x02\\\\#\\\\\\x0c\\\\@\\\\\\x16\\\\_\\\\}\\\\.\\\\-\\\\(\\\\!\\\\+\\\\\\x06\\\\]\\\\{\\\\:\\\\\\x01\\\\\\x11\\\\\\x0f\\\\\\x05\\\\,\\\\~\\\\\\x15\\\\\\x00\\\\\"\\\\%\\\\\\x0e\\\\*\\\\&\\\\\\x1a])'\n"
- ]
- }
- ],
- "source": [
- "import string\n",
- "\n",
- "non_alphanums = set(chr(x) for x in range(127)) - set(string.ascii_letters) - set(string.digits)\n",
- "print(\"Non alphanums\", non_alphanums)\n",
- "separators = '([' + ''.join('\\\\' + x for x in non_alphanums) + '])'\n",
- "separators = separators.encode('ascii')\n",
- "print(\"Separators\", separators)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[b'dlg',\n",
- " b'=',\n",
- " b'Resource',\n",
- " b'.',\n",
- " b'loadfromresfile',\n",
- " b'(',\n",
- " b'filename',\n",
- " b',',\n",
- " b'win',\n",
- " b',',\n",
- " b'QuoteDialog',\n",
- " b'.',\n",
- " b'MyQuoteDialog',\n",
- " b',',\n",
- " b\"'\",\n",
- " b'QuoteDialog',\n",
- " b\"'\",\n",
- " b',',\n",
- " b'win',\n",
- " b')']"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "import re\n",
- "program_line = b\"\"\"dlg = Resource.loadfromresfile(filename, win, QuoteDialog.MyQuoteDialog, 'QuoteDialog', win)\"\"\"\n",
- "tokens = [t for x in re.split(separators, program_line) if (t := x.strip())]\n",
- "tokens"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Checking base dir: HTML document\n",
- "Checking base dir: C source\n",
- "Checking base dir: C++ source\n",
- "Checking base dir: PHP script\n",
- "Checking base dir: ReStructuredText file\n",
- "Checking base dir: Python script\n",
- "Checking base dir: Ruby script\n",
- "Checking base dir: Java source\n",
- "Checking base dir: Objective-C source\n",
- "Checking base dir: Perl5 module source\n",
- "Checking base dir: XML 1.0 document\n"
- ]
- }
- ],
- "source": [
- "import os\n",
- "from collections import Counter\n",
- "\n",
- "DUMP_BASE = '/home/facundo/devel/ml/dump'\n",
- "\n",
- "# directories with 1000 files of each code type, excluding \"just text\" (ascii, utf8, etc)\n",
- "CODE_TYPES = [\n",
- " 'HTML document',\n",
- " 'C source',\n",
- " 'C++ source',\n",
- " 'PHP script',\n",
- " 'ReStructuredText file',\n",
- " 'Python script',\n",
- " 'Ruby script',\n",
- " 'Java source',\n",
- " 'Objective-C source',\n",
- " 'Perl5 module source',\n",
- " 'XML 1.0 document',\n",
- "]\n",
- "\n",
- "# let's collect ALL tokens present in all the program files\n",
- "tokens = Counter()\n",
- "for basedir in CODE_TYPES:\n",
- " print(\"Checking base dir:\", basedir)\n",
- " for dirpath, dirnames, filenames in os.walk(os.path.join(DUMP_BASE, basedir)):\n",
- " for fname in filenames:\n",
- " fpath = os.path.join(dirpath, fname)\n",
- " with open(fpath, 'rb') as fh:\n",
- " tokens.update(t for x in re.split(separators, fh.read()) if (t := x.strip()))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Total different tokens 213400\n",
- " 870525 b'.'\n",
- " 756849 b'_'\n",
- " 730609 b'('\n",
- " 717433 b'='\n",
- " 699725 b')'\n",
- " 688556 b'/'\n",
- " 661461 b'\"'\n",
- " 640989 b','\n",
- " 625121 b'-'\n",
- " 594091 b'>'\n"
- ]
- }
- ],
- "source": [
- "different_tokens = len(tokens)\n",
- "print(\"Total different tokens\", different_tokens)\n",
- "for name, quant in tokens.most_common(10):\n",
- " print(\"{:8d} {}\".format(quant, name))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Total tokens found: 20101050\n",
- "Total representative: 3324\n",
- "Last ten...\n",
- " 289 b'enables'\n",
- " 289 b'smaller'\n",
- " 289 b'Creates'\n",
- " 289 b'cross'\n",
- " 289 b'GLFW'\n",
- " 289 b'Os'\n",
- " 289 b'usb'\n",
- " 288 b'stylesheets'\n",
- " 288 b'ad'\n",
- " 288 b'WIDTH'\n"
- ]
- }
- ],
- "source": [
- "import numpy as np\n",
- "\n",
- "total_tokens = sum(tokens.values())\n",
- "print(\"Total tokens found:\", total_tokens)\n",
- "\n",
- "most = total_tokens * 0.9\n",
- "tot = 0\n",
- "representative_data = []\n",
- "for name, quant in tokens.most_common():\n",
- " representative_data.append((name, quant))\n",
- " tot += quant\n",
- " if tot > most:\n",
- " break\n",
- "\n",
- "print(\"Total representative:\", len(representative_data))\n",
- "print(\"Last ten...\")\n",
- "for name, quant in representative_data[-10:]:\n",
- " print(\"{:8d} {}\".format(quant, name))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Collecting data from base dir HTML document\n",
- "Collecting data from base dir C source\n",
- "Collecting data from base dir C++ source\n",
- "Collecting data from base dir PHP script\n",
- "Collecting data from base dir ReStructuredText file\n",
- "Collecting data from base dir Python script\n",
- "Collecting data from base dir Ruby script\n",
- "Collecting data from base dir Java source\n",
- "Collecting data from base dir Objective-C source\n",
- "Collecting data from base dir Perl5 module source\n",
- "Collecting data from base dir XML 1.0 document\n",
- "Src data samples: 11000\n"
- ]
- }
- ],
- "source": [
- "import random\n",
- "\n",
- "# real \"ML data\": a list of (code_type, features) (one pair for each file)\n",
- "# code_type: the *position* of the code type corresponding to the file (needs to be an int)\n",
- "# features: a list of values, each value corresponds to how many of the tokens of that position the file has\n",
- "\n",
- "representative_tokens = [name for name, _ in representative_data]\n",
- "\n",
- "all_src_data = []\n",
- "for idx, basedir in enumerate(CODE_TYPES):\n",
- " print(\"Collecting data from base dir\", basedir)\n",
- " for dirpath, dirnames, filenames in os.walk(os.path.join(DUMP_BASE, basedir)):\n",
- " for fname in filenames:\n",
- " fpath = os.path.join(dirpath, fname)\n",
- " with open(fpath, 'rb') as fh:\n",
- " fcontent = fh.read()\n",
- " \n",
- " file_tokens = Counter(t for x in re.split(separators, fcontent) if (t := x.strip()))\n",
- " token_quantities = [file_tokens.get(t, 0) for t in representative_tokens]\n",
- "\n",
- " all_src_data.append((idx, token_quantities))\n",
- "\n",
- "print(\"Src data samples:\", len(all_src_data))\n",
- "\n",
- "# shuffle, as currently is too much \"per directory\"\n",
- "random.shuffle(all_src_data)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "import tensorflow as tf\n",
- "from tensorflow.keras import Model, layers\n",
- "import numpy as np\n",
- "\n",
- "# representation of our model\n",
- "num_classes = len(CODE_TYPES)\n",
- "num_features = len(representative_tokens)\n",
- "\n",
- "# 1st and 2nd layer number of neurons (these numbers are just chamuyo)\n",
- "n_hidden_1 = 128 \n",
- "n_hidden_2 = 256\n",
- "\n",
- "# training parameters (more chamuyo)\n",
- "learning_rate = 0.1\n",
- "\n",
- "batch_size = 256\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Example code types: (2, 0, 4, 4, 5)\n",
- "Example token quants: [246, 786, 246, 61, 246] [32, 32, 5, 22, 5]\n",
- "Token quants shape: (11000, 3324)\n",
- "Example normalized quants: [0.3129771 1. 0.3129771 0.07760815 0.3129771 ] [0.9411765 0.9411765 0.14705883 0.64705884 0.14705883]\n"
- ]
- }
- ],
- "source": [
- "# separate the source data and into two pairing lists\n",
- "code_types, token_quantities = zip(*all_src_data)\n",
- "print(\"Example code types:\", code_types[:5])\n",
- "print(\"Example token quants:\", token_quantities[0][:5], token_quantities[117][:5])\n",
- "\n",
- "# convert features to float\n",
- "float_quantities = np.array(token_quantities, np.float32)\n",
- "print(\"Token quants shape:\", float_quantities.shape)\n",
- "\n",
- "# normalize EACH ONE to [0, 1]\n",
- "for quants in float_quantities:\n",
- " quants /= max(quants)\n",
- "print(\"Example normalized quants:\", float_quantities[0][:5], float_quantities[117][:5])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Real training set: 89.70%\n"
- ]
- }
- ],
- "source": [
- "# let's prepare the teching sets, input and output for training first (90% of cases) and\n",
- "# then testing what's learned (the remaining 10%); \n",
- "input_training = []\n",
- "output_training = []\n",
- "input_testing = []\n",
- "output_testing = []\n",
- "for token_distribution, code_type in zip(float_quantities, code_types):\n",
- " if random.random() < .1:\n",
- " input_testing.append(token_distribution)\n",
- " output_testing.append(code_type)\n",
- " else:\n",
- " input_training.append(token_distribution)\n",
- " output_training.append(code_type)\n",
- "print(\"Real training set: {:.2f}%\".format(100 * len(input_training) / len(float_quantities))) "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "import tensorflow as tf\n",
- "from tensorflow.keras import Model\n",
- "\n",
- "class NeuralNet(Model):\n",
- " \"\"\"Chamuyo al cuadrado.\"\"\"\n",
- " \n",
- " def __init__(self):\n",
- " super(NeuralNet, self).__init__()\n",
- " self.fc1 = layers.Dense(n_hidden_1, activation=tf.nn.sigmoid) # se puede cambiar a relu\n",
- " self.fc2 = layers.Dense(n_hidden_2, activation=tf.nn.sigmoid) # se puede cambiar a relu\n",
- " self.out = layers.Dense(num_classes)\n",
- "\n",
- " def call(self, x, is_training=False):\n",
- " x = self.fc1(x)\n",
- " x = self.fc2(x)\n",
- " x = self.out(x)\n",
- " if not is_training:\n",
- " # tf cross entropy expect logits without softmax, so only\n",
- " # apply softmax when not training.\n",
- " x = tf.nn.softmax(x)\n",
- " return x\n",
- "\n",
- "neural_net = NeuralNet()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Note that this will apply 'softmax' to the logits.\n",
- "def cross_entropy_loss(x, y):\n",
- " # Convert labels to int 64 for tf cross-entropy function.\n",
- " y = tf.cast(y, tf.int64)\n",
- " # Apply softmax to logits and compute cross-entropy.\n",
- " loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=x)\n",
- " # Average loss across the batch.\n",
- " return tf.reduce_mean(loss)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Stochastic gradient descent optimizer.\n",
- "optimizer = tf.optimizers.SGD(learning_rate)\n",
- "\n",
- "# Optimización. \n",
- "def run_optimization(x, y):\n",
- " # Funciones para calcular el gradiente\n",
- " with tf.GradientTape() as g:\n",
- " # Algoritmo de forward\n",
- " pred = neural_net(x, is_training=True)\n",
- " # Computa la función de costo o pérdida utilizando entropía cruzada\n",
- " loss = cross_entropy_loss(pred, y)\n",
- " \n",
- " # Actualiza las variables de entrenamiento.\n",
- " trainable_variables = neural_net.trainable_variables\n",
- "\n",
- " # Computa los gradientes\n",
- " gradients = g.gradient(loss, trainable_variables)\n",
- " \n",
- " # Actualiza los nuevos parámetros W (pesos) y b (bias).\n",
- " optimizer.apply_gradients(zip(gradients, trainable_variables))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Accuracy metric.\n",
- "def accuracy(y_pred, y_true):\n",
- " # Predicted class is the index of highest score in prediction vector (i.e. argmax).\n",
- " correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.cast(y_true, tf.int64))\n",
- " return tf.reduce_mean(tf.cast(correct_prediction, tf.float32), axis=-1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Step 100: loss=2.379924, accuracy=0.125000\n",
- "Step 200: loss=2.372284, accuracy=0.128906\n",
- "Step 300: loss=2.366430, accuracy=0.140625\n",
- "Step 400: loss=2.360768, accuracy=0.121094\n",
- "Step 500: loss=2.347394, accuracy=0.109375\n",
- "Step 600: loss=2.349795, accuracy=0.199219\n",
- "Step 700: loss=2.312950, accuracy=0.218750\n",
- "Step 800: loss=2.284508, accuracy=0.289062\n",
- "Step 900: loss=2.173395, accuracy=0.335938\n",
- "Step 1000: loss=2.115966, accuracy=0.300781\n",
- "Step 1100: loss=1.977837, accuracy=0.441406\n",
- "Step 1200: loss=1.860783, accuracy=0.425781\n",
- "Step 1300: loss=1.866206, accuracy=0.425781\n",
- "Step 1400: loss=1.773057, accuracy=0.402344\n",
- "Step 1500: loss=1.736271, accuracy=0.546875\n",
- "Step 1600: loss=1.626320, accuracy=0.578125\n",
- "Step 1700: loss=1.537970, accuracy=0.539062\n",
- "Step 1800: loss=1.369012, accuracy=0.609375\n",
- "Step 1900: loss=1.286771, accuracy=0.625000\n",
- "Step 2000: loss=1.270916, accuracy=0.640625\n"
- ]
- }
- ],
- "source": [
- "train_data = tf.data.Dataset.from_tensor_slices((input_training, output_training))\n",
- "\n",
- "# NOTE: this doesn't only selectes, it completely transform the structures\n",
- "# from <TensorSliceDataset shapes: ((3324,), ()), types: (tf.float32, tf.int32)>\n",
- "# to <PrefetchDataset shapes: ((None, 3324), (None,)), types: (tf.float32, tf.int32)>\n",
- "train_data = train_data.repeat().shuffle(5000).batch(batch_size).prefetch(1)\n",
- "\n",
- "display_step = 100\n",
- "training_steps = 2000\n",
- "\n",
- "# Run training for the given number of steps.\n",
- "for step, (input_batch, output_batch) in enumerate(train_data.take(training_steps), 1):\n",
- " # Run the optimization to update W and b values.\n",
- " run_optimization(input_batch, output_batch)\n",
- " \n",
- " if step % display_step == 0:\n",
- " pred = neural_net(input_batch, is_training=True)\n",
- " loss = cross_entropy_loss(pred, output_batch)\n",
- " acc = accuracy(pred, output_batch)\n",
- " print(\"Step {}: loss={:f}, accuracy={:f}\".format(step, loss, acc))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Test Accuracy: 0.578994\n"
- ]
- }
- ],
- "source": [
- "# Test model on validation set\n",
- "input_testing = np.array(input_testing)\n",
- "pred = neural_net(input_testing, is_training=False)\n",
- "print(\"Test Accuracy: {:f}\".format(accuracy(pred, output_testing)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [],
- "source": [
- "# If we consider the \"more probable\" prediction on each item, how well it goes?\n",
- "all_guesses = neural_net(input_testing, is_training=False)\n",
- "guesses_ok = [0] * len(CODE_TYPES)\n",
- "guesses_bad = [0] * len(CODE_TYPES)\n",
- "\n",
- "for guess, real in zip(all_guesses, output_testing):\n",
- " # guess is an array of len(CODE_TYPES) with a float in each position showing\n",
- " # which one is the most probable to be real, so we need to get position \n",
- " # for the max one and check if it matches with the real real :)\n",
- " position_for_max = np.where(guess == np.amax(guess))[0][0]\n",
- " if position_for_max == real:\n",
- " guesses_ok[real] += 1\n",
- " else:\n",
- " guesses_bad[real] += 1"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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c0lNnjyZrl27cswxxxT3DRs2jG222YaTTz6ZwYMHM2TIECZODL93pkyZwrbbbsuee+7JxhtvvNT2kiVLOPnkkxk5ciRDhw5l/PiG9X3OOecchgwZwrBhwzjttNO48cYbmTZtGgcffDDDhw/nk08+YdKkSWy66aYMGTKEI444gk8//TT318S1H3UpKUg6DNgD2NEa5u5+jcaLcfejZYupO5eLp556is0333yp/TfddBMzZszgiSee4O2332bkyJFst912ADz22GM89dRTDBw4kClTpjTavuSSS1hllVWYOnUqn376KVtvvTW77LILzz77LLfeeiuPPPIIK664Iu+88w6rrbYaF154Ib/97W8ZMWIEixYt4rDDDmPSpElsuOGGHHrooVx88cWMGzcu51fFtRe5lxQk7QacAuxpZh9nDt0GHChpBUkDCasrPZp3+pxbVvfffz8HHXQQnTt3pm/fvmy//fZMnToVgFGjRjUaB5DdvvPOO7nqqqsYPnw4W2yxBQsWLOD555/n7rvv5vDDD2fFFVcEYLXVVlsq5uzZsxk4cGCx2mrs2LHce++9qS/VtWNJSwqSriUsPL6GpLnAGYTeRisAd8WucA+b2TFmNkvS9YRFtxcDx5vZkpTpc25ZbLLJJtx4440tes5KK61UcdvMuOCCC9h118a9sO+4445lT6RzyyhpScHMDjKzNc2sq5n1M7PLzGx9M1vHzIbH2zGZx//KzNYzs0Fm9s+UaXNuWY0ZM4ZPP/2USy65pLhv5syZ9O7dm4kTJ7JkyRLmz5/Pvffey6hRo5o936677srFF1/M559/DsBzzz3HRx99xM4778wVV1zBxx+HAvU777wDQM+ePVm4cCEAgwYNYs6cObzwwgsA/PnPf2b77X0te7fs6t37yLnlUm0X0lqSxM0338y4ceM455xz6N69OwMGDOC8887jww8/ZNiwYUjiN7/5DV/60pd49tlnmzzfkUceyZw5c9hss80wM/r06cMtt9zCbrvtxowZMxgxYgTdunVj991359e//jWHHXYYxxxzDD169OChhx7iiiuuYL/99mPx4sWMHDmyUQO4cy3V5tdoHjFihPkiOx3HM888w1e+8pV6J6Pdqdvr6l1S60bSdDMbUbq/Y5cUUr0h/c3onGujfEI855xzRZ4pOOecK/JMwTnnXJFnCs4554o8U3DOOVfUsXsfubav1j3Iqug5tvLKK/Phhx/WNm4NnXfeeRx99NHF6TGcawkvKTjXiixevLjJ7Wqcd955xVHQzrWUZwrOLaMpU6YwevRo9t13XzbaaCMOPvhgCoNBp06dyle/+lWGDRvGqFGjWLhwIYsWLeLwww9nyJAhbLrppkyePBkI6yPsueeejBkzhh133HGp7Y8++ogjjjiCUaNGsemmm3LrrbcCsGTJEn74wx8yePBghg4dygUXXMD555/P66+/zg477MAOO+wAwLXXXsuQIUMYPHgwp556an1eLNdmePWRc8vh8ccfZ9asWay11lpsvfXWPPDAA4waNYoDDjiAiRMnMnLkSD744AN69OjBH/7wByTx5JNP8uyzz7LLLrvw3HPPAWFq7ZkzZ7LaaqsxYcKERts/+tGPGDNmDJdffjnvvfceo0aNYqedduKqq65izpw5zJgxgy5duhSn1j733HOZPHkya6yxBq+//jqnnnoq06dPZ9VVV2WXXXbhlltuYe+9967vC+daLS8pOLccRo0aRb9+/ejUqRPDhw9nzpw5zJ49mzXXXJORI0cC0KtXL7p06cL999/PIYccAsBGG23EuuuuW8wUdt5550ZTY2e377zzTs4++2yGDx/O6NGjWbRoEa+88gp333033/3ud4srt5WbWnvq1KmMHj2aPn360KVLFw4++GCfWts1yUsKzi2HFVZYoXi/c+fOy9QGAM1Prf3Xv/6VQYMGLVsinWsBLyk4V2ODBg1i3rx5xQV2Fi5cyOLFi9l222255pqw+uxzzz3HK6+8UtUX/a677soFF1xQbK94/PHHgVCaGD9+fDEjKje19qhRo7jnnnt4++23WbJkCddee61Pre2a5CUF17a1wskHu3XrxsSJEznhhBP45JNP6NGjB3fffTfHHXccxx57LEOGDKFLly5MmDChUUmjkp/+9KeMGzeOoUOH8sUXXzBw4EBuv/12jjzySJ577jmGDh1K165dOeqoo/je977H0UcfzW677cZaa63F5MmTOfvss9lhhx0wM77+9a+z11575fAquLaqY0+d7bOktjk+dXYaPnV2x1Np6myvPnLOOVfk1UeudvxXn3NtnpcUXJvT1qs8Wxt/PV2WZwquTenevTsLFizwL7IaMTMWLFhA9+7d650U10p49ZFrU/r168fcuXOZP39+vZPSbnTv3p1+/frV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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "\n",
- "values_ok = [guesses_ok[i] for i in range(len(CODE_TYPES))]\n",
- "values_bad = [guesses_bad[i] for i in range(len(CODE_TYPES))]\n",
- "x_positions = np.arange(len(CODE_TYPES))\n",
- "\n",
- "p1 = plt.bar(x_positions, guesses_ok)\n",
- "p2 = plt.bar(x_positions, guesses_bad, bottom=guesses_ok)\n",
- "\n",
- "plt.ylabel('Tipo de código')\n",
- "plt.title('Aciertos o no, por tipo de código')\n",
- "plt.xticks(x_positions, CODE_TYPES, rotation=90)\n",
- "#plt.yticks(np.arange(0, 81, 10))\n",
- "plt.legend((p1[0], p2[0]), ('Correcto', 'Incorrecto'))\n",
- "\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/macros/latex/contrib/jupynotex/jupynotex.py b/macros/latex/contrib/jupynotex/jupynotex.py
index 036be088ce..53f27dec91 100644
--- a/macros/latex/contrib/jupynotex/jupynotex.py
+++ b/macros/latex/contrib/jupynotex/jupynotex.py
@@ -1,64 +1,202 @@
-# Copyright 2020 Facundo Batista
+# Copyright 2020-2024 Facundo Batista
# All Rights Reserved
# Licensed under Apache 2.0
-"""USAGE: jupynote.py notebook.ipynb cells
-
- cells is a string with which cells to include, separate groups
- with comma, ranges with dash (with defaults to start and end.
-"""
+"""Convert a jupyter notebook into latex for inclusion in documents."""
+import argparse
import base64
import json
+import pathlib
+import re
+import subprocess
import sys
import tempfile
+import textwrap
import traceback
+# message to help people to report potential problems
+REPORT_MSG = """
+
+Please report the issue in
+https://github.com/facundobatista/jupynotex/issues/new
+including the latex log. Thanks!
+"""
+
+# basic verbatim start/end
+VERBATIM_BEGIN = [r"\begin{footnotesize}", r"\begin{verbatim}"]
+VERBATIM_END = [r"\end{verbatim}", r"\end{footnotesize}"]
+
+# highlighers for different languages (block beginning and ending)
+HIGHLIGHTERS = {
+ 'python': ([r'\begin{minted}[fontsize=\footnotesize]{python}'], [r'\end{minted}']),
+ None: (VERBATIM_BEGIN, VERBATIM_END),
+}
+
+# the different formats to be used when error or all ok
+FORMAT_ERROR = r"colback=red!5!white,colframe=red!75!"
+FORMAT_OK = (
+ r"coltitle=red!75!black, colbacktitle=black!10!white, "
+ r"halign title=right, fonttitle=\sffamily\mdseries\scshape\footnotesize")
+
+# a little mark to put in the continuation line(s) when text is wrapped
+WRAP_MARK = "↳"
+
+# the options available for command line
+CMDLINE_OPTION_NAMES = {
+ "output-text-limit": "The column limit for the output text of a cell",
+}
+
+
+def _validator_positive_int(value):
+ """Validate value is a positive integer."""
+ value = value.strip()
+ if not value:
+ return
-def _verbatimize(lines):
+ value = int(value)
+ if value <= 0:
+ raise ValueError("Value must be greater than zero.")
+ return value
+
+
+def _process_plain_text(lines, config_options=None):
"""Wrap a series of lines around a verbatim indication."""
- result = [r"\begin{verbatim}"]
+ if config_options is None:
+ config_options = {}
+
+ result = []
+ result.extend(VERBATIM_BEGIN)
for line in lines:
- result.append(line.rstrip())
- result.append(r"\end{verbatim}")
+ line = line.rstrip()
+
+ # clean color escape codes (\u001b plus \[Nm where N are one or more digits)
+ line = re.sub(r"\x1b\[[\d;]+m", "", line)
+
+ # split too long lines
+ limit = config_options.get("output-text-limit")
+ if limit and line:
+ firstline, *restlines = textwrap.wrap(line, limit)
+ lines = [firstline]
+ for line in restlines:
+ lines.append(f" {WRAP_MARK} {line}")
+ else:
+ lines = [line]
+
+ result.extend(lines)
+ result.extend(VERBATIM_END)
return result
-def _save_content(data):
- """Save the received b64encoded data to a temp file."""
- _, fname = tempfile.mkstemp(suffix='.png')
- with open(fname, 'wb') as fh:
- fh.write(base64.b64decode(data))
- return fname
+class ItemProcessor:
+ """Process each item according to its type with a (series of) function(s)."""
+
+ def __init__(self, cell_options, config_options):
+ self.cell_options = cell_options
+ self.config_options = config_options
+
+ def get_item_data(self, item):
+ """Extract item information using different processors."""
+
+ data = item['data']
+ for mimetype, *functions in self.PROCESSORS:
+ if mimetype in data:
+ content = data[mimetype]
+ break
+ else:
+ raise ValueError("Image type not supported: {}".format(data.keys()))
+
+ for func in functions:
+ content = func(self, content)
+
+ return content
+
+ def process_plain_text(self, lines):
+ """Process plain text."""
+ return _process_plain_text(lines, self.config_options)
+
+ def process_png(self, image_data):
+ """Process a PNG: just save the received b64encoded data to a temp file."""
+ _, fname = tempfile.mkstemp(suffix='.png')
+ with open(fname, 'wb') as fh:
+ fh.write(base64.b64decode(image_data))
+ return fname
+
+ def process_svg(self, image_data):
+ """Process a SVG: save the data, transform to PDF, and then use that."""
+ _, svg_fname = tempfile.mkstemp(suffix='.svg')
+ _, pdf_fname = tempfile.mkstemp(suffix='.pdf')
+ raw_svg = ''.join(image_data).encode('utf8')
+ with open(svg_fname, 'wb') as fh:
+ fh.write(raw_svg)
+
+ cmd = ['inkscape', '--export-text-to-path', '--export-pdf={}'.format(pdf_fname), svg_fname]
+ subprocess.run(cmd)
+
+ return pdf_fname
+
+ def include_graphics(self, fname):
+ """Wrap a filename in an includegraphics structure."""
+ fname_no_backslashes = fname.replace("\\", "/") # do not leave backslashes in Windows
+ width = self.cell_options.get("output-image-size", r"1\textwidth")
+ return r"\includegraphics[width={}]{{{}}}".format(width, fname_no_backslashes)
+
+ def listwrap(self, item):
+ """Wrap an item in a list for processors that return that single item."""
+ return [item]
+
+ # mimetype and list of functions to apply; order is important here as we want to
+ # prioritize getting some mimetypes over others when multiple are present
+ PROCESSORS = [
+ ('text/latex',),
+ ('image/svg+xml', process_svg, include_graphics, listwrap),
+ ('image/png', process_png, include_graphics, listwrap),
+ ('text/plain', process_plain_text),
+ ]
class Notebook:
"""The notebook converter to latex."""
- def __init__(self, path):
- with open(path, 'rt', encoding='utf8') as fh:
- nb_data = json.load(fh)
+ GLOBAL_CONFIGS = {
+ "output-text-limit": _validator_positive_int,
+ }
+
+ def __init__(self, notebook_path, config_options):
+ self.config_options = self._validate_config(config_options)
+ self.cell_options = {}
+ nb_data = json.loads(notebook_path.read_text())
- self._cells = nb_data['cells']
+ # get the languaje, to highlight
+ lang = nb_data['metadata']['language_info']['name']
+ self._highlight_delimiters = HIGHLIGHTERS.get(lang, HIGHLIGHTERS[None])
- def __len__(self):
- return len(self._cells)
+ # get all cells excluding markdown ones
+ self._cells = [x for x in nb_data['cells'] if x['cell_type'] != 'markdown']
+
+ def _validate_config(self, config):
+ """Validate received configuration."""
+ for key, value in list(config.items()):
+ validator = self.GLOBAL_CONFIGS[key]
+ new_value = validator(value)
+ config[key] = new_value
+ return config
def _proc_src(self, content):
"""Process the source of a cell."""
source = content['source']
result = []
if content['cell_type'] == 'code':
- result.extend(_verbatimize(source))
- elif content['cell_type'] == 'markdown':
- # XXX: maybe we could parse this?
- result.extend(_verbatimize(source))
+ begin, end = self._highlight_delimiters
+ result.extend(begin)
+ result.extend(line.rstrip() for line in source)
+ result.extend(end)
else:
raise ValueError(
"Cell type not supported when processing source: {!r}".format(
content['cell_type']))
- return '\n'.join(result) + '\n'
+ return '\n'.join(result)
def _proc_out(self, content):
"""Process the output of a cell."""
@@ -67,27 +205,30 @@ class Notebook:
return
result = []
+ processor = ItemProcessor(self.cell_options, self.config_options)
for item in outputs:
output_type = item['output_type']
- if output_type == 'execute_result':
- data = item['data']
- if 'image/png' in data:
- fname = _save_content(data['image/png'])
- result.append(r"\includegraphics{{{}}}".format(fname))
- elif 'text/latex' in data:
- result.extend(data["text/latex"])
- else:
- result.extend(_verbatimize(data["text/plain"]))
+ if output_type in ('execute_result', 'display_data'):
+ more_content = processor.get_item_data(item)
elif output_type == 'stream':
- result.extend(_verbatimize(x.rstrip() for x in item["text"]))
- elif output_type == 'display_data':
- data = item['data']
- fname = _save_content(data['image/png'])
- result.append(r"\includegraphics{{{}}}".format(fname))
+ more_content = processor.process_plain_text(item["text"])
+ elif output_type == 'error':
+ raw_traceback = item['traceback']
+ tback_lines = []
+ for raw_line in raw_traceback:
+ internal_lines = raw_line.split('\n')
+ for line in internal_lines:
+ line = re.sub(r"\x1b\[\d.*?m", "", line) # sanitize
+ if set(line) == {'-'}:
+ # ignore separator, as our graphical box already has one
+ continue
+ tback_lines.append(line)
+ more_content = processor.process_plain_text(tback_lines)
else:
raise ValueError("Output type not supported in item {!r}".format(item))
+ result.extend(more_content)
- return '\n'.join(result) + '\n'
+ return '\n'.join(result)
def get(self, cell_idx):
"""Return the content from a specific cell in the notebook.
@@ -99,58 +240,71 @@ class Notebook:
output = self._proc_out(content)
return source, output
+ def parse_cells(self, spec):
+ """Convert the cells spec to a range of ints."""
+ if not spec:
+ raise ValueError("Empty cells spec not allowed")
+
+ maxlen = len(self._cells)
+
+ cells = set()
+ options = {}
+ groups = [x.strip() for x in spec.split(',')]
+ valid_chars = set('0123456789-,')
+ for group in groups:
+ if '=' in group:
+ k, v = group.split("=", maxsplit=1)
+ options[k] = v
+ continue
-def _parse_cells(spec, maxlen):
- """Convert the cells spec to a range of ints."""
- if not spec:
- raise ValueError("Empty cells spec not allowed")
- if set(spec) - set('0123456789-,'):
- raise ValueError(
- "Found forbidden characters in cells definition (allowed digits, '-' and ',')")
-
- cells = set()
- groups = spec.split(',')
- for group in groups:
- if '-' in group:
- cfrom, cto = group.split('-')
- cfrom = 1 if cfrom == '' else int(cfrom)
- cto = maxlen if cto == '' else int(cto)
- if cfrom >= cto:
+ if set(group) - valid_chars:
raise ValueError(
- "Range 'from' need to be smaller than 'to' (got {!r})".format(group))
- cells.update(range(cfrom, cto + 1))
- else:
- cells.add(int(group))
- cells = sorted(cells)
+ "Found forbidden characters in cells definition (allowed digits, '-' and ',')")
+
+ if '-' in group:
+ cfrom, cto = group.split('-')
+ cfrom = 1 if cfrom == '' else int(cfrom)
+ cto = maxlen if cto == '' else int(cto)
+ if cfrom >= cto:
+ raise ValueError(
+ "Range 'from' need to be smaller than 'to' (got {!r})".format(group))
+ cells.update(range(cfrom, cto + 1))
+ else:
+ cells.add(int(group))
+ cells = sorted(cells)
- if any(x < 1 for x in cells):
- raise ValueError("Cells need to be >=1")
- if maxlen < cells[-1]:
- raise ValueError(
- "Notebook loaded of len {}, smaller than requested cells: {}".format(maxlen, cells))
+ if any(x < 1 for x in cells):
+ raise ValueError("Cells need to be >=1")
+ if maxlen < cells[-1]:
+ raise ValueError(
+ f"Notebook loaded of len {maxlen}, smaller than requested cells: {cells}")
- return cells
+ self.cell_options = options
+ return cells
-def main(notebook_path, cells_spec):
+def main(notebook_path, cells_spec, config_options):
"""Main entry point."""
- nb = Notebook(notebook_path)
- cells = _parse_cells(cells_spec, len(nb))
+ nb = Notebook(notebook_path, config_options)
+ cells = nb.parse_cells(cells_spec)
for cell in cells:
try:
src, out = nb.get(cell)
- except Exception:
+ except Exception as exc:
title = "ERROR when parsing cell {}".format(cell)
- print(
- r"\begin{{tcolorbox}}"
- r"[colback=red!5!white,colframe=red!75!,title={{{}}}]".format(title))
- tb = traceback.format_exc()
- print('\n'.join(_verbatimize(tb.split('\n'))))
+ print(r"\begin{{tcolorbox}}[{}, title={{{}}}]".format(FORMAT_ERROR, title))
+ print(exc)
+ _parts = _process_plain_text(REPORT_MSG.split('\n'))
+ print('\n'.join(_parts))
print(r"\end{tcolorbox}")
+
+ # send title and traceback to stderr, which will appear in compilation log
+ tb = traceback.format_exc()
+ print(tb, file=sys.stderr)
continue
- print(r"\begin{{tcolorbox}}[title=Cell {{{:02d}}}]".format(cell))
+ print(r"\begin{{tcolorbox}}[{}, title=Cell {{{:02d}}}]".format(FORMAT_OK, cell))
print(src)
if out:
print(r"\tcblower")
@@ -159,8 +313,19 @@ def main(notebook_path, cells_spec):
if __name__ == "__main__":
- if len(sys.argv) != 3:
- print(__doc__)
- exit()
+ parser = argparse.ArgumentParser()
+ parser.add_argument("notebook_path", type=pathlib.Path, help="The path to the notebook.")
+ parser.add_argument(
+ "cells_spec",
+ type=str,
+ help=(
+ "A string specifying which cells to include; use comma to separate groups, "
+ "dash for ranges (with defaults to start and end)"
+ )
+ )
+ for option, explanation in CMDLINE_OPTION_NAMES.items():
+ parser.add_argument(option, type=str, help=explanation)
+ args = parser.parse_args()
- main(*sys.argv[1:3])
+ config_options = {option: getattr(args, option) for option in CMDLINE_OPTION_NAMES}
+ main(args.notebook_path, args.cells_spec, config_options)
diff --git a/macros/latex/contrib/jupynotex/jupynotex.sty b/macros/latex/contrib/jupynotex/jupynotex.sty
index 205343d097..b79f622af6 100644
--- a/macros/latex/contrib/jupynotex/jupynotex.sty
+++ b/macros/latex/contrib/jupynotex/jupynotex.sty
@@ -1,7 +1,21 @@
-\ProvidesPackage{jupynotex}[0.1]
+\ProvidesPackage{jupynotex}[1.0]
\usepackage{tcolorbox}
+\usepackage{pgfopts}
+
+\newcommand*\jupynotex@outputtextlimit@value{}
+
+
+\pgfkeys{
+ /jupynotex/.cd ,
+ output-text-limit/.store in=\jupynotex@outputtextlimit@value
+}
+
+\ProcessPgfPackageOptions{/jupynotex}
\newcommand{\jupynotex}[2][-]{
- \input|"python3 jupynotex.py #2 #1"
+ \input|"python3 jupynotex.py '#2' '#1' '\jupynotex@outputtextlimit@value'"
}
+
+\endinput
+
diff --git a/macros/latex/contrib/jupynotex/tests/run b/macros/latex/contrib/jupynotex/tests/run
deleted file mode 100755
index a5fa69f44d..0000000000
--- a/macros/latex/contrib/jupynotex/tests/run
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-PYTHONPATH=. fades -d pytest -x pytest -sv "$@"
diff --git a/macros/latex/contrib/jupynotex/tests/test_cellparser.py b/macros/latex/contrib/jupynotex/tests/test_cellparser.py
deleted file mode 100644
index f9108f4bb8..0000000000
--- a/macros/latex/contrib/jupynotex/tests/test_cellparser.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# Copyright 2020 Facundo Batista
-# All Rights Reserved
-# Licensed under Apache 2.0
-
-import pytest
-import re
-
-from jupynotex import _parse_cells
-
-
-def test_empty():
- msg = "Empty cells spec not allowed"
- with pytest.raises(ValueError, match=re.escape(msg)):
- _parse_cells('', 100)
-
-
-def test_simple():
- r = _parse_cells('1', 100)
- assert r == [1]
-
-
-def test_several_comma():
- r = _parse_cells('1,3,5,9,7', 100)
- assert r == [1, 3, 5, 7, 9]
-
-
-def test_several_range():
- r = _parse_cells('1-9', 100)
- assert r == [1, 2, 3, 4, 5, 6, 7, 8, 9]
-
-
-def test_several_limited():
- msg = "Notebook loaded of len 3, smaller than requested cells: [1, 2, 3, 4]"
- with pytest.raises(ValueError, match=re.escape(msg)):
- _parse_cells('1-4', 3)
-
-
-def test_range_default_start():
- r = _parse_cells('-3', 8)
- assert r == [1, 2, 3]
-
-
-def test_range_default_end():
- r = _parse_cells('5-', 8)
- assert r == [5, 6, 7, 8]
-
-
-def test_not_int():
- msg = "Found forbidden characters in cells definition (allowed digits, '-' and ',')"
- with pytest.raises(ValueError, match=re.escape(msg)):
- _parse_cells('1,a', 3)
-
-
-def test_not_positive():
- msg = "Cells need to be >=1"
- with pytest.raises(ValueError, match=re.escape(msg)):
- _parse_cells('3,0', 3)
-
-
-def test_several_mixed():
- r = _parse_cells('1,3,5-7,2,9,11-13', 80)
- assert r == [1, 2, 3, 5, 6, 7, 9, 11, 12, 13]
-
-
-def test_overlapped():
- r = _parse_cells('3,5-7,6-9,8', 80)
- assert r == [3, 5, 6, 7, 8, 9]
-
-
-def test_bad_range_equal():
- msg = "Range 'from' need to be smaller than 'to' (got '12-12')"
- with pytest.raises(ValueError, match=re.escape(msg)):
- _parse_cells('12-12', 80)
-
-
-def test_bad_range_smaller():
- msg = "Range 'from' need to be smaller than 'to' (got '3-2')"
- with pytest.raises(ValueError, match=re.escape(msg)):
- _parse_cells('3-2', 80)
diff --git a/macros/latex/contrib/jupynotex/tests/test_main.py b/macros/latex/contrib/jupynotex/tests/test_main.py
deleted file mode 100644
index fabfa4e01e..0000000000
--- a/macros/latex/contrib/jupynotex/tests/test_main.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# Copyright 2020 Facundo Batista
-# All Rights Reserved
-# Licensed under Apache 2.0
-
-import textwrap
-
-import jupynotex
-from jupynotex import main
-
-
-class FakeNotebook:
- """Fake notebook.
-
- The instance supports calling (as it if were instantiated). The .get will return the
- value in a dict for received key; raise it if exception.
- """
-
- def __init__(self, side_effects):
- self.side_effects = side_effects
-
- def __call__(self, path):
- return self
-
- def __len__(self):
- return len(self.side_effects)
-
- def get(self, key):
- """Return or raise the stored side effect."""
- value = self.side_effects[key]
- if isinstance(value, Exception):
- raise value
- else:
- return value
-
-
-def test_simple_ok(monkeypatch, capsys):
- fake_notebook = FakeNotebook({
- 1: ("test cell content up", "test cell content down"),
- })
- monkeypatch.setattr(jupynotex, 'Notebook', fake_notebook)
-
- main('boguspath', '1')
- expected = textwrap.dedent("""\
- \\begin{tcolorbox}[title=Cell {01}]
- test cell content up
- \\tcblower
- test cell content down
- \\end{tcolorbox}
- """)
- assert expected == capsys.readouterr().out
-
-
-def test_simple_only_first(monkeypatch, capsys):
- fake_notebook = FakeNotebook({
- 1: ("test cell content up", ""),
- })
- monkeypatch.setattr(jupynotex, 'Notebook', fake_notebook)
-
- main('boguspath', '1')
- expected = textwrap.dedent("""\
- \\begin{tcolorbox}[title=Cell {01}]
- test cell content up
- \\end{tcolorbox}
- """)
- assert expected == capsys.readouterr().out
-
-
-def test_simple_error(monkeypatch, capsys):
- fake_notebook = FakeNotebook({
- 1: ValueError("test problem"),
- })
- monkeypatch.setattr(jupynotex, 'Notebook', fake_notebook)
-
- main('boguspath', '1')
-
- # verify the beginning and the end, as the middle part is specific to the environment
- # where the test runs
- expected_ini = [
- r"\begin{tcolorbox}[colback=red!5!white,colframe=red!75!,title={ERROR when parsing cell 1}]", # NOQA
- r"\begin{verbatim}",
- r"Traceback (most recent call last):",
- ]
- expected_end = [
- r"ValueError: test problem",
- r"\end{verbatim}",
- r"\end{tcolorbox}",
- ]
- out = [line for line in capsys.readouterr().out.split('\n') if line]
- assert expected_ini == out[:3]
- assert expected_end == out[-3:]
-
-
-def test_multiple(monkeypatch, capsys):
- fake_notebook = FakeNotebook({
- 1: ("test cell content up", "test cell content down"),
- 2: ("test cell content ONLY up", ""),
- })
- monkeypatch.setattr(jupynotex, 'Notebook', fake_notebook)
-
- main('boguspath', '1-2')
- expected = textwrap.dedent("""\
- \\begin{tcolorbox}[title=Cell {01}]
- test cell content up
- \\tcblower
- test cell content down
- \\end{tcolorbox}
- \\begin{tcolorbox}[title=Cell {02}]
- test cell content ONLY up
- \\end{tcolorbox}
- """)
- assert expected == capsys.readouterr().out
diff --git a/macros/latex/contrib/jupynotex/tests/test_notebook.py b/macros/latex/contrib/jupynotex/tests/test_notebook.py
deleted file mode 100644
index bf6511cbd3..0000000000
--- a/macros/latex/contrib/jupynotex/tests/test_notebook.py
+++ /dev/null
@@ -1,237 +0,0 @@
-# Copyright 2020 Facundo Batista
-# All Rights Reserved
-# Licensed under Apache 2.0
-
-import base64
-import json
-import os
-import pathlib
-import re
-import tempfile
-import textwrap
-
-import pytest
-
-from jupynotex import Notebook
-
-
-@pytest.fixture
-def notebook():
- _, name = tempfile.mkstemp()
-
- def _f(cells):
- with open(name, 'wt', encoding='utf8') as fh:
- json.dump({'cells': cells}, fh)
-
- return Notebook(name)
-
- yield _f
- os.unlink(name)
-
-
-def test_empty(notebook):
- nb = notebook([])
- assert len(nb) == 0
-
-
-def test_source_code(notebook):
- rawcell = {
- 'cell_type': 'code',
- 'source': ['line1\n', ' line2\n'],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- src, _ = nb.get(1)
- expected = textwrap.dedent("""\
- \\begin{verbatim}
- line1
- line2
- \\end{verbatim}
- """)
- assert src == expected
-
-
-def test_source_markdown(notebook):
- rawcell = {
- 'cell_type': 'markdown',
- 'source': ['line1\n', ' line2\n'],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- src, _ = nb.get(1)
- expected = textwrap.dedent("""\
- \\begin{verbatim}
- line1
- line2
- \\end{verbatim}
- """)
- assert src == expected
-
-
-def test_output_missing(notebook):
- rawcell = {
- 'cell_type': 'code',
- 'source': [],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- _, out = nb.get(1)
- assert out is None
-
-
-def test_output_simple_executeresult_plain(notebook):
- rawcell = {
- 'cell_type': 'code',
- 'source': [],
- 'outputs': [
- {
- 'output_type': 'execute_result',
- 'data': {
- 'text/plain': ['default always present', 'line2'],
- },
- },
- ],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- _, out = nb.get(1)
- expected = textwrap.dedent("""\
- \\begin{verbatim}
- default always present
- line2
- \\end{verbatim}
- """)
- assert out == expected
-
-
-def test_output_simple_executeresult_latex(notebook):
- rawcell = {
- 'cell_type': 'code',
- 'source': [],
- 'outputs': [
- {
- 'output_type': 'execute_result',
- 'data': {
- 'text/latex': ['some latex line', 'latex 2'],
- 'text/plain': ['default always present'],
- },
- },
- ],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- _, out = nb.get(1)
- expected = textwrap.dedent("""\
- some latex line
- latex 2
- """)
- assert out == expected
-
-
-def test_output_simple_executeresult_image(notebook):
- raw_content = b"\x01\x02 asdlklda3wudghlaskgdlask"
- rawcell = {
- 'cell_type': 'code',
- 'source': [],
- 'outputs': [
- {
- 'output_type': 'execute_result',
- 'data': {
- 'image/png': base64.b64encode(raw_content).decode('ascii'),
- 'text/plain': ['default always present'],
- },
- },
- ],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- _, out = nb.get(1)
- m = re.match(r'\\includegraphics\{(.+)\}\n', out)
- assert m
- (fpath,) = m.groups()
- assert pathlib.Path(fpath).read_bytes() == raw_content
-
-
-def test_output_simple_stream(notebook):
- rawcell = {
- 'cell_type': 'code',
- 'source': [],
- 'outputs': [
- {
- 'output_type': 'stream',
- 'text': ['some text line', 'text 2'],
- },
- ],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- _, out = nb.get(1)
- expected = textwrap.dedent("""\
- \\begin{verbatim}
- some text line
- text 2
- \\end{verbatim}
- """)
- assert out == expected
-
-
-def test_output_simple_display_data(notebook):
- raw_content = b"\x01\x02 asdlklda3wudghlaskgdlask"
- rawcell = {
- 'cell_type': 'code',
- 'source': [],
- 'outputs': [
- {
- 'output_type': 'display_data',
- 'data': {
- 'image/png': base64.b64encode(raw_content).decode('ascii'),
- },
- },
- ],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- _, out = nb.get(1)
- m = re.match(r'\\includegraphics\{(.+)\}\n', out)
- assert m
- (fpath,) = m.groups()
- assert pathlib.Path(fpath).read_bytes() == raw_content
-
-
-def test_output_multiple(notebook):
- rawcell = {
- 'cell_type': 'code',
- 'source': [],
- 'outputs': [
- {
- 'output_type': 'execute_result',
- 'data': {
- 'text/latex': ['some latex line', 'latex 2'],
- },
- }, {
- 'output_type': 'stream',
- 'text': ['some text line', 'text 2'],
- },
- ],
- }
- nb = notebook([rawcell])
- assert len(nb) == 1
-
- _, out = nb.get(1)
- expected = textwrap.dedent("""\
- some latex line
- latex 2
- \\begin{verbatim}
- some text line
- text 2
- \\end{verbatim}
- """)
- assert out == expected
diff --git a/support/TeX4ht/source/ChangeLog b/support/TeX4ht/source/ChangeLog
index 0efdd8bc4f..e836a359a1 100644
--- a/support/TeX4ht/source/ChangeLog
+++ b/support/TeX4ht/source/ChangeLog
@@ -1,3 +1,23 @@
+2024-09-24 Karl Berry <karl@freefriends.org>
+
+ * wripro.tex: copyright 2024.
+ * Makefile (tex4ht_sty_derived): depends on wripro.tex.
+
+2024-09-23 Michal Hoftich <michal.h21@gmail.com>
+
+ * tex4ht-4ht.tex (amsmath.4ht): fixed support for superscripts and
+ subscripts in equation tags (like \tag{$e_{1}$}).
+
+ * tex4ht-4ht.tex (th4.4ht),
+ * tex4ht-info.tex (info4ht.4ht),
+ * tex4ht-sty.tex (tex4ht.sty),
+ * wripro.tex: renamed internal TeX4ht command \Ref to \XRef, to
+ prevent clashes with \Ref provided by LaTeX.
+
+ * tex4ht-4ht.tex (latex.4ht): fixed support for superscripts and
+ subscripts that are used values in labels (like in
+ \tag{$e_{1}$}\label{eq1}). Thanks to Linas Stonys.
+
2024-09-11 Michal Hoftich <michal.h21@gmail.com>
* tex4ht-mathjax.tex (mathjax-latex-4ht.4ht): prevent insertion of
diff --git a/support/TeX4ht/source/Makefile b/support/TeX4ht/source/Makefile
index 5328185f78..16da59e03c 100644
--- a/support/TeX4ht/source/Makefile
+++ b/support/TeX4ht/source/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile 1538 2024-07-07 15:55:16Z karl $
+# $Id: Makefile 1558 2024-09-24 17:22:45Z karl $
# This file is public domain. Originally written 2010, Karl Berry.
# Assumes GNU make.
@@ -385,8 +385,6 @@ endif
derived += $(tex4ht_mathjax_derived)
tex4ht_mathjax_derived = mathjax-latex-4ht.4ht
-# wripro.tex generates nothing (not literate).
-
ifneq ($(do_java),2)
derived += $(xtpipes_derived)
xtpipes_derived = \
@@ -577,7 +575,7 @@ $(tex4ht_ooimpress_derived): tex4ht-ooimpress.tex $(common)
$(tex4ht_options_derived): tex4ht-options.tex $(common)
htlatex $< "html,3,sections+" "" "" $(tex_1opt)
-$(tex4ht_sty_derived): tex4ht-sty.tex $(common_no_tex4ht_sty)
+$(tex4ht_sty_derived): tex4ht-sty.tex wripro.tex $(common_no_tex4ht_sty)
$(HTTEX) $< ""
$(tex4ht_svg_derived): tex4ht-svg.tex $(common)
diff --git a/support/TeX4ht/source/tex4ht-4ht.tex b/support/TeX4ht/source/tex4ht-4ht.tex
index 2bd694407c..ca3a61c56a 100644
--- a/support/TeX4ht/source/tex4ht-4ht.tex
+++ b/support/TeX4ht/source/tex4ht-4ht.tex
@@ -1,4 +1,4 @@
-% $Id: tex4ht-4ht.tex 1552 2024-09-09 14:48:03Z michal_h21 $
+% $Id: tex4ht-4ht.tex 1557 2024-09-23 12:20:56Z michal_h21 $
% tex tex4ht-4ht or ht tex tex4ht-4ht
%
% Copyright 2009-2024 TeX Users Group
@@ -1526,6 +1526,13 @@ A better def is given to \''\l:bel' in AmsLaTeX .
\let\o:ref|=\:ref
\def\::ref#1{{\:SUBOff\:SUPOff\xdef\RefArg{#1}}\expandafter\o:ref
\expandafter{\RefArg}}
+\ExplSyntaxOn
+\def\::ref#1{{\:SUBOff\:SUPOff\xdef\RefArg{#1}%
+ \SUBOn\SUPOn%
+ \def\rEfLiNK##1##2{\Link{##1}{}\tl_rescan:nn{}{##2}\EndLink}%
+ \expandafter\o:ref\expandafter{\RefArg}%
+}}
+\ExplSyntaxOff
\DeclareDocumentCommand\:ref{s}{\IfBooleanTF{#1}{\Protect\::ref}{\Protect\::ref}}
\let\ref|=\:ref
>>>
@@ -1535,12 +1542,14 @@ Support for the \''\Ref' command. It is variant of \''\ref' that uppercases
first letter of the referenced label.
\<sub/sup in labels/refs\><<<
-\def\::Ref#1{%
- \let\olda:rEfLiNK\rEfLiNK%%
- \def\rEfLiNK##1##2{\Link{##1}{}\edef\:ref:currentlabel{##2}\expandafter\MakeUppercase\:ref:currentlabel\EndLink}%
- \::ref{#1}%
- \let\rEfLiNK\olda:rEfLiNK%
-}
+\ExplSyntaxOn
+\def\::Ref#1{{%
+ \:SUBOff\:SUPOff\xdef\RefArg{#1}%
+ \SUBOn\SUPOn%
+ \def\rEfLiNK##1##2{\tl_set_rescan:Nnn\l_tmpa_tl{}{##2}\Link{##1}{}\expandafter\MakeUppercase\l_tmpa_tl\EndLink}%
+ \expandafter\o:ref\expandafter{\RefArg}%
+}}
+\ExplSyntaxOff
\DeclareDocumentCommand\:Ref{s}{\IfBooleanTF{#1}{\Protect\::Ref}{\Protect\::Ref}}
\let\Ref\:Ref
>>>
@@ -22112,11 +22121,13 @@ $$
|<def :currentlabel for make@df@tag|>%
\anc:lbl r{}%
}}
-\def\make@df@tag@@@#1{\gdef\df@tag{\tagform@{#1}%
+\ExplSyntaxOn
+\def\make@df@tag@@@#1{\gdef\df@tag{\tagform@{\tl_rescan:nn{}{#1}}%
\toks@\@xp{\p@equation{#1}}\edef\@currentlabel{\the\toks@}%
|<def :currentlabel for make@df@tag|>%
\anc:lbl r{}%
}}
+\ExplSyntaxOff
>>>
%%%%%%%%%%%%%
@@ -37114,25 +37125,25 @@ is not a font).
\<non-html TeX4ht divs\><<<
\def\TagCh#1{\Tag{#1|<Ch tag|>}{\theChapterCounter}}
-\def\RefCh#1{Chapter\ \Ref{#1|<Ch tag|>}}
+\def\RefCh#1{Chapter\ \XRef{#1|<Ch tag|>}}
\def\TagApp#1{\Tag{#1|<Ap tag|>}{\theChapterCounter}}
-\def\RefApp#1{Appendix\ \Ref{#1|<Ap tag|>}}
+\def\RefApp#1{Appendix\ \XRef{#1|<Ap tag|>}}
\def\TagSec#1{\Tag{#1|<Sec tag|>}{\theSectionCounter}}
-\def\RefSec#1{Section\ \Ref{#1|<Sec tag|>}}
+\def\RefSec#1{Section\ \XRef{#1|<Sec tag|>}}
>>>
\<html TeX4ht divs\><<<
\def\TagCh#1{\Tag{#1|<Ch tag|>}{\theChapterCounter}\Tag
{#1|<hCh tag|>}{\:curch}}
-\def\RefCh#1{\Link{\LikeRef{#1|<hCh tag|>}}{}Chapter\ \Ref
+\def\RefCh#1{\Link{\LikeRef{#1|<hCh tag|>}}{}Chapter\ \XRef
{#1|<Ch tag|>}\EndLink}
\def\TagApp#1{\Tag{#1|<Ap tag|>}{\theChapterCounter}\Tag
{#1|<hAp tag|>}{\:curch}}
-\def\RefApp#1{\Link{\LikeRef{#1|<hAp tag|>}}{}Appendix\ \Ref
+\def\RefApp#1{\Link{\LikeRef{#1|<hAp tag|>}}{}Appendix\ \XRef
{#1|<Ap tag|>}\EndLink}
\def\TagSec#1{\Tag{#1|<Sec tag|>}{\theSectionCounter}\Tag
{#1|<hSec tag|>}{\:cursec}}
-\def\RefSec#1{\Link{\LikeRef{#1|<hSec tag|>}}{}Section\ \Ref
+\def\RefSec#1{\Link{\LikeRef{#1|<hSec tag|>}}{}Section\ \XRef
{#1|<Sec tag|>}\EndLink}
>>>
@@ -37144,12 +37155,12 @@ is not a font).
\<html TeX4ht divs\><<<
\def\TagPage#1{%
\Link{}{page#1}\EndLink\Tag{#1}{}}
-\def\RefPage#1{\Link{page#1}{}\Ref{#1}\EndLink}
+\def\RefPage#1{\Link{page#1}{}\XRef{#1}\EndLink}
>>>
\<non-html TeX4ht divs\><<<
\def\TagPage#1{\Tag{#1}{}}
-\def\RefPage{\Ref}
+\def\RefPage{\XRef}
>>>
%\SubSection{Standard}
diff --git a/support/TeX4ht/source/tex4ht-sty.tex b/support/TeX4ht/source/tex4ht-sty.tex
index e713134f7e..34fa75425a 100644
--- a/support/TeX4ht/source/tex4ht-sty.tex
+++ b/support/TeX4ht/source/tex4ht-sty.tex
@@ -1,4 +1,4 @@
-% $Id: tex4ht-sty.tex 1514 2024-05-06 14:50:21Z michal_h21 $
+% $Id: tex4ht-sty.tex 1556 2024-09-23 10:50:11Z michal_h21 $
% tex tex4ht-sty or ht tex tex4ht-sty
%
% Copyright 2009-2022 TeX Users Group
@@ -2162,11 +2162,11 @@ Should be consistent with the corresponding features in ProTeX.
\SubSection{Ref}
-The implementations of \''\Ref' and \''\Tag' view the crosswords $\alpha$ as
+The implementations of \''\XRef' and \''\Tag' view the crosswords $\alpha$ as
pointers to macros that carry the names `\''\cw:'$\alpha$'.
\<common cross references\><<<
-\def\Ref#1{\expandafter\ifx
+\def\XRef#1{\expandafter\ifx
\csname |<tag of Tag|>#1\endcsname \relax \:NoTag{#1}%
\else \csname |<tag of Tag|>#1\endcsname \fi}
>>>
@@ -2186,7 +2186,7 @@ pointers to macros that carry the names `\''\cw:'$\alpha$'.
\SubSection{LikeRef}
The \`'\:LikeRef' command is a stripped down version of
-\`'\Ref'; it doesn't check whether the tag is defined.
+\`'\XRef'; it doesn't check whether the tag is defined.
The space in \`'\space' is needed for carrying MAME tags
in (mosaic) html files.
@@ -2272,7 +2272,7 @@ probably in latex.4ht.
\openin15=\jobname.xref
\ifeof15 \def\:NoTag#1{\hbox{$???$}}
\else \def\:NoTag#1{\hbox{$???$}
- \:warning{\string\Ref\string{\string#1\string}?}}
+ \:warning{\string\XRef\string{\string#1\string}?}}
|<warnings for missing /Link|>
\fi
\closein15
@@ -2312,11 +2312,11 @@ optional. A missing \`'.ext' stands for \`'.xref'. When \`'-[prefix]+'
is empty the component \`'{...}' should also be omitted (and the
comamnd assume the form \`'\LoadRef{filename.ext}').
-A \`'+' asks that \`'\Ref' and \`'LikeRef' commands will refer to
+A \`'+' asks that \`'\XRef' and \`'LikeRef' commands will refer to
expanded tags of the form \`'filename::tag' instead of just \`'tag'.
A \`'[prefix]' asks that only tags which start with the given prefix
will be loaded. When \`'[prefix]' is omitted, an empty prefix is
-assumed and all the tags are loaded. A \`'-' asks that \`'\Ref' and
+assumed and all the tags are loaded. A \`'-' asks that \`'\XRef' and
\`'LikeRef' commands will refer to truncated tags in which the
specified prefixes are omitted.
@@ -2920,7 +2920,7 @@ restricted environments (\`'\edef', \`'\write').
>>>
-\`'\def\RefFile#1{\Ref{#1|<File tag|>}}
+\`'\def\RefFile#1{\XRef{#1|<File tag|>}}
\def\LikeRefFile#1{\LikeRef{#1|<File tag|>}}'
\<html file commands\><<<
diff --git a/support/TeX4ht/source/wripro.tex b/support/TeX4ht/source/wripro.tex
index 30d0c025f2..4da6c4d3b6 100644
--- a/support/TeX4ht/source/wripro.tex
+++ b/support/TeX4ht/source/wripro.tex
@@ -1,4 +1,4 @@
-% $Id: wripro.tex 414 2018-06-12 23:04:41Z karl $
+% $Id: wripro.tex 1556 2024-09-23 10:50:11Z michal_h21 $
% Used in tex4ht.sty. Not installed in runtime.
%
% Copyright (C)) 2009-2010 TeX Users Group
@@ -181,9 +181,9 @@ For instance, in {\tt
A \`'\Link-{..}{b}' asks that a \''\Tag' will not be produced for `b'.
-A \`'\Link[\empty]{b}{..}' asks that a \''\Ref' will not be produced for
+A \`'\Link[\empty]{b}{..}' asks that a \''\XRef' will not be produced for
`a'. The same is true for any other non-empty replacement to \''\empty'
-A `b' for which we neither have a \''\Tag' and a \''\Ref' provides
+A `b' for which we neither have a \''\Tag' and a \''\XRef' provides
a memory save in `strings out of', `string characters out of', and
`multiletter control sequences' (see log files).
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index 94fc52d111..0a7a400b12 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -31,7 +31,6 @@ $mirrors = {
'India' => {
'https://2.mirrors.in.sahilister.net/ctan/' => 1,
'https://in.mirrors.cicku.me/ctan/' => 1,
- 'https://mirror.niser.ac.in/ctan/' => 1,
},
'Indonesia' => {
'http://repo.ugm.ac.id/ctan/' => 1,
@@ -78,6 +77,10 @@ $mirrors = {
'Belarus' => {
'https://mirror.datacenter.by/pub/mirrors/CTAN/' => 1,
},
+ 'Bulgaria' => {
+ 'https://mirrors.neterra.net/CTAN/' => 1,
+ 'https://mirrors.netix.net/CTAN/' => 1,
+ },
'Czech Republic' => {
'http://ftp.cvut.cz/tex-archive/' => 1,
'https://mirrors.nic.cz/tex-archive/' => 1,
@@ -143,7 +146,6 @@ $mirrors = {
'Poland' => {
'https://ctan.gust.org.pl/tex-archive/' => 1,
'https://polish-mirror.evolution-host.com/ctan/' => 1,
- 'https://sunsite.icm.edu.pl/pub/CTAN/' => 1,
},
'Portugal' => {
'https://ftp.eq.uc.pt/software/TeX/' => 1,
diff --git a/systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt b/systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
index 86d6cd80cc..f2c24a589d 100644
--- a/systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
+++ b/systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
@@ -1,7 +1,9 @@
##
## Bundle of CA Root Certificates
##
-## Certificate data from Mozilla as of: Tue Jul 2 03:12:04 2024 GMT
+## Certificate data from Mozilla as of: Tue Sep 24 03:12:04 2024 GMT
+##
+## Find updated versions here: https://curl.se/docs/caextract.html
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,7 +16,7 @@
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.29.
-## SHA256: 456ff095dde6dd73354c5c28c73d9c06f53b61a803963414cb91a1d92945cdd3
+## SHA256: 36105b01631f9fc03b1eca779b44a30a1a5890b9bf8dc07ccb001a07301e01cf
##
@@ -3566,3 +3568,99 @@ Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
pYXFuXqUPoeovQA=
-----END CERTIFICATE-----
+
+TWCA CYBER Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
+EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
+IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
+EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
+IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
+Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
+V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
+o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
+Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
+/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
+IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
+fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
+2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
+wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
+QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
+AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
+c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
+X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
+IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
+/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
+FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
+Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
+It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
+IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
+-----END CERTIFICATE-----
+
+SecureSign Root CA12
+====================
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
+ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
+BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
+U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
+emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
+J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
+fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
+EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
+NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
+AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
+LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
+mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
+vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
+aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
+-----END CERTIFICATE-----
+
+SecureSign Root CA14
+====================
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
+A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
+ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
+BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
+U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
+1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
+bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
+1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
+/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
+kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
+jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
+ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
+dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
+AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
+YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
+rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
+ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
+Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
+FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
+nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
+OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
+OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
+pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
+eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
+-----END CERTIFICATE-----
+
+SecureSign Root CA15
+====================
+-----BEGIN CERTIFICATE-----
+MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
+BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
+cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
+BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
+dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
+dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
+2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
+fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
+SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
+-----END CERTIFICATE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index ffb88d71a7..63f27519c6 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,11 +26,11 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2024
-depend revision/72367
+depend revision/72377
name 00texlive.image
category TLCore
-revision 72368
+revision 72375
shortdesc TeX Live files only in the source repository
longdesc The files here are not copied by the installer and containers
longdesc are not built for them; they exist only in the source
@@ -3774,6 +3774,7 @@ runfiles size=14526
tlpkg/tlpsrc/ran_toks.tlpsrc
tlpkg/tlpsrc/randbild.tlpsrc
tlpkg/tlpsrc/randexam.tlpsrc
+ tlpkg/tlpsrc/randintlist.tlpsrc
tlpkg/tlpsrc/random.tlpsrc
tlpkg/tlpsrc/randomlist.tlpsrc
tlpkg/tlpsrc/randomwalk.tlpsrc
@@ -4950,7 +4951,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 72367
+revision 72377
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
@@ -4960,7 +4961,7 @@ longdesc allowed, but in this case, 00texlive.installer is never used
longdesc *except* to build the installer archives, so it's ok. For
longdesc information on the 00texlive prefix see
longdesc 00texlive.installation(.tlpsrc)
-runfiles size=801
+runfiles size=803
install-tl
release-texlive.txt
tlpkg/installer/COPYING.MinGW-runtime.txt
@@ -72478,7 +72479,7 @@ containerchecksum e2186a4295eb854d56e838deaae8330e47ced975d28ad83b51d8ada6955a5a
name collection-latexextra
category Collection
-revision 72340
+revision 72374
shortdesc LaTeX additional packages
relocated 1
longdesc A very large collection of add-on packages for LaTeX.
@@ -73649,6 +73650,7 @@ depend quoting
depend quotmark
depend ran_toks
depend randexam
+depend randintlist
depend randtext
depend rccol
depend rcs-multi
@@ -74056,7 +74058,7 @@ depend zugferd
depend zwgetfdate
depend zwpagelayout
containersize 7280
-containerchecksum 02b31e12331fb327eec574de0b3f7de775de89d42098a533cd35c979f925c9dae064c8a5af8a377ddd45bd413a75a6aa2fa23cf047e7e9e641c80ae4b40c70eb
+containerchecksum f464fb3cea6cbeebfc45436588150de0348a5a01e9baaa6c4c5fa8aa8696d03130cb15010e438b10c8841966179b8a0b26c128bccb642a69dee2a26887e55b75
name collection-latexrecommended
category Collection
@@ -107543,7 +107545,7 @@ catalogue-topics notes editorial
name easybook
category Package
-revision 72368
+revision 72372
shortdesc Easily typesetting Chinese theses or books
relocated 1
longdesc easybook is a pure academic template created based on the
@@ -107554,16 +107556,16 @@ longdesc providing multiple commands and interfaces allows users to
longdesc easily customize the thesis template. Its basic macro package
longdesc easybase can also be used with CTeX and standard document
longdesc classes.
-containersize 19536
-containerchecksum 7f81f47508b887b45efbf73858760d177678bfcf079387c8d67d9ab82a84562fcc6c9a4fe26872951ee7bca1fcc9eaaeca811f16ed9428214c6fabc1c7d04a1a
-doccontainersize 669108
-doccontainerchecksum 8c994a979671fad6b3150b032e868659064ce345217e848153fbd01e76e51cfacf64b48612ce2e5fc307f50b893a89b09c00f6220ad90945f22ccc775438bef8
-docfiles size=185
+containersize 19556
+containerchecksum 0a612bc0361e6e5a449b039fe4243940a6460e11211e2b30f087eed73c1d48a42fecb871cabcd9eefb1eaff91691365a5955f8b0cd2c4bf003a3a36d742d180b
+doccontainersize 672944
+doccontainerchecksum 7d9279b45b45f33589d87462f04ab4a1fc8aa3173fe3c0d245aede4b26cc6a376f885612c02ab162d5cd791c40f8c1365168b7ee05f681ccf28ad1424198cd37
+docfiles size=187
RELOC/doc/latex/easybook/README.md details="Readme"
RELOC/doc/latex/easybook/easybook.pdf details="Package documentation" language="zh"
RELOC/doc/latex/easybook/easybook.tex
-srccontainersize 19420
-srccontainerchecksum 5fbfa3b9312ea7c0946632a651ffb6d7f4986adecf9028e9e654f04129ca5cf725203525472942017bf9e4189d7de2a28e2576c840de09fae4bf32938e2136a6
+srccontainersize 19424
+srccontainerchecksum 41dbdd0c52b0d8fa3619e3ea5a5f13d87536c9820b2ac27eed9baf0db7966e9945bf084a375ffa6d01199fed883c8ad8f3a91796b5cce4318dd49ca69a219b57
srcfiles size=24
RELOC/source/latex/easybook/easybook.dtx
RELOC/source/latex/easybook/easybook.ins
@@ -107576,7 +107578,7 @@ catalogue-contact-repository https://gitee.com/texno3/easybook
catalogue-ctan /macros/latex/contrib/easybook
catalogue-license lppl1.3c
catalogue-topics book-pub dissertation class doc-templ chinese expl3
-catalogue-version 2024du
+catalogue-version 2024dx
name easydtx
category Package
@@ -173920,7 +173922,7 @@ catalogue-version 2.209
name jupynotex
category Package
-revision 56715
+revision 72373
shortdesc Include whole or partial Jupyter notebooks in LaTeX documents
relocated 1
longdesc This package provides a python3 script and a LaTeX .sty file
@@ -173928,29 +173930,25 @@ longdesc which can be used together to include Jupyter Notebooks (all of
longdesc them, or some specific cells) as part of a LaTeX document. It
longdesc will convert the Jupyter Notebook format to proper LaTeX so it
longdesc gets included seamlessly, supporting text, LaTeX, images, etc.
-containersize 2516
-containerchecksum 3b5cca7c6b8b14eda35d52a6db5e7ac027c0b29ee08a7b8f58411886963d8dc69348752d6cc1f010d11b9216026b705fe4cc915d2c60cb3ee9f3950fcc6bb308
-doccontainersize 28936
-doccontainerchecksum 35b8d2dbcbecfb4e7b2bfb0ef39f2d076d6f4eec9189e89cee3bdfdbb6f57d5c1dcefbca3eeecf4842f7f94616030d2e73588074618b39e232f40104e371f3ea
-docfiles size=22
+containersize 4660
+containerchecksum f048a117d04aa236694c3c1b56738131e0bf5903301a01921aec5888ed5f11415a8cc5abfc79fd90d100e497f8f71d2ff24ec340a60705a5a4df29fe0044e0e8
+doccontainersize 5724
+doccontainerchecksum 63ae4efa1ae7c740da1a8dffd16b6d6ff2fe8fc91f21c8a857fe53dcfedd87b5924d8736b02b140dfea1fc69f7e90f1025f7a34889c7cc9c3d262e0877a68811
+docfiles size=5
RELOC/doc/latex/jupynotex/LICENSE
RELOC/doc/latex/jupynotex/README.md details="Readme"
- RELOC/doc/latex/jupynotex/example/build
- RELOC/doc/latex/jupynotex/example/example.tex
- RELOC/doc/latex/jupynotex/example/notebook.ipynb
- RELOC/doc/latex/jupynotex/tests/run
- RELOC/doc/latex/jupynotex/tests/test_cellparser.py
- RELOC/doc/latex/jupynotex/tests/test_main.py
- RELOC/doc/latex/jupynotex/tests/test_notebook.py
-runfiles size=3
+runfiles size=4
RELOC/tex/latex/jupynotex/jupynotex.py
RELOC/tex/latex/jupynotex/jupynotex.sty
catalogue-contact-bugs https://github.com/facundobatista/jupynotex/issues
+catalogue-contact-development https://github.com/facundobatista/jupynotex/
+catalogue-contact-home https://github.com/facundobatista/jupynotex/
catalogue-contact-repository https://github.com/facundobatista/jupynotex/
+catalogue-contact-support https://github.com/facundobatista/jupynotex/issues
catalogue-ctan /macros/latex/contrib/jupynotex
catalogue-license apache2
catalogue-topics foreign-import data-import ext-code
-catalogue-version 0.1
+catalogue-version 1.0
name jura
category Package
@@ -177893,7 +177891,7 @@ binfiles arch=x86_64-solaris size=3
name kpathsea
category TLCore
-revision 71664
+revision 72376
shortdesc Path searching library for TeX-related files
longdesc Kpathsea is a library and utility programs which provide path
longdesc searching facilities for TeX file types, including the
@@ -177903,9 +177901,9 @@ longdesc distributed separately, but rather is released and maintained
longdesc as part of the TeX Live sources.
depend kpathsea.ARCH
containersize 33080
-containerchecksum 7f90d2e6c16199d0ee7bf8539506925d156c4a5f843dfab8a69ed67b26f770e82c90cf0b3da6a0586b07ede5f10873a23c306fb84c9cd825bdaf95e5cd4391bb
-doccontainersize 1057472
-doccontainerchecksum b072615cdb7c51260039fa5c2c7fa4476bf04a4d8963d644b5c37c03d0e35938eb6b98493664180af58d2e0c40c29a4ca98bcc5d06390c4f7b070537759c8f58
+containerchecksum f8f5404087aeec306e7c2713a165b0ced5bf02aaf5b002e0ac9c603c1a9f9eed3fedfff96ab47cba9c44e4360a0e98fd702a6c178ff51eed198d58717008f8b8
+doccontainersize 1057476
+doccontainerchecksum ba35e45f839354fd5047c12595656cd61ca1426dc164f596f159d2aa2e0cdd38e98e2fd8dc1389bce55db710510057945626a0c7a204e93edab400fa148b3205
docfiles size=584
texmf-dist/doc/info/dir
texmf-dist/doc/info/kpathsea.info
@@ -220509,9 +220507,8 @@ catalogue-version 1.1
name minted
category Package
-revision 72368
+revision 72375
shortdesc Highlighted source code for LaTeX
-relocated 1
longdesc The package that facilitates expressive syntax highlighting in
longdesc LaTeX using the powerful Pygments library. The package also
longdesc provides options to customize the highlighted source code
@@ -220519,42 +220516,39 @@ longdesc output using fancyvrb.
depend catchfile
depend etoolbox
depend float
-depend framed
depend fvextra
-depend graphics
-depend ifplatform
-depend kvoptions
-depend lineno
+depend latex2pydata
+depend minted.ARCH
depend newfloat
depend pdftexcmds
+depend pgf
+depend pgfopts
depend tools
-depend upquote
depend xcolor
-depend xstring
-containersize 22060
-containerchecksum 36f05053ed1b49aca2e4168f3aa7f812459b5822dc8fc43d96d6cd1139cbd5300cc327d6e7abf6403da12a2d466b724b4e46ff44a98492c490f27a5648d7d5e2
-doccontainersize 1748344
-doccontainerchecksum a926c7e122258a6b27755e637984f1df0ec3f820f6e2a60faa87abdd0999d0af2699e87c2074ad4208de0a6a0fea39ad8af321a53cbda733832da5a08d7212af
-docfiles size=450
- RELOC/doc/latex/minted/CHANGELOG_LATEXMINTED_PYTHON_PACKAGE.md
- RELOC/doc/latex/minted/CHANGELOG_MINTED_LATEX_PACKAGE.md
- RELOC/doc/latex/minted/DEPENDS.txt
- RELOC/doc/latex/minted/README details="Readme"
- RELOC/doc/latex/minted/latex2pydata-0.4.0-py3-none-any.whl
- RELOC/doc/latex/minted/latexminted-0.1.0-py3-none-any.whl
- RELOC/doc/latex/minted/latexrestricted-0.4.0-py3-none-any.whl
- RELOC/doc/latex/minted/minted.pdf details="Package documentation"
- RELOC/doc/latex/minted/pygments-2.18.0-py3-none-any.whl
-srccontainersize 41032
-srccontainerchecksum ff0a1d94114290535a9d3487ff545f6d6b0f1ed4a8a9a6b03dd88697855efd8996606a6004a013d17ab08164ede8a4a0d96b181b12d4a6c3cbe62a49992c51f8
+containersize 1265704
+containerchecksum f876d82553b76838a5dd80bd47c7b0c38e320e25ac7261ceec7847a8f1486bb6ab7d0171bbd699d209b3cab2f15fd3d9405e630d2dc6190590dedfdfc587b286
+doccontainersize 505012
+doccontainerchecksum d92c83676c0e8d4c98180badd3a2d46448153fbc78648dd675138b2c875fa3e238171ff3adce0cb7bb918ac90ad02998b9e1d8c414a5cb929948e3ba16f85731
+docfiles size=136
+ texmf-dist/doc/latex/minted/CHANGELOG_LATEXMINTED_PYTHON_PACKAGE.md
+ texmf-dist/doc/latex/minted/CHANGELOG_MINTED_LATEX_PACKAGE.md
+ texmf-dist/doc/latex/minted/DEPENDS.txt
+ texmf-dist/doc/latex/minted/README details="Readme"
+ texmf-dist/doc/latex/minted/minted.pdf details="Package documentation"
+srccontainersize 41036
+srccontainerchecksum 857d07c9914a454e24bd8bda8ecfdad1e531ce652bb45b73ac14f56406cf4632b9622aecd6f2307cc2789a7c781ef799b49eb4b9cb04081cd04a80a8ea0bc2eb
srcfiles size=49
- RELOC/source/latex/minted/minted.dtx
- RELOC/source/latex/minted/minted.ins
-runfiles size=37
- RELOC/tex/latex/minted/latexminted.py
- RELOC/tex/latex/minted/minted.sty
- RELOC/tex/latex/minted/minted1.sty
- RELOC/tex/latex/minted/minted2.sty
+ texmf-dist/source/latex/minted/minted.dtx
+ texmf-dist/source/latex/minted/minted.ins
+runfiles size=351
+ texmf-dist/scripts/minted/latex2pydata-0.4.0-py3-none-any.whl
+ texmf-dist/scripts/minted/latexminted-0.1.0-py3-none-any.whl
+ texmf-dist/scripts/minted/latexminted.py
+ texmf-dist/scripts/minted/latexrestricted-0.4.0-py3-none-any.whl
+ texmf-dist/scripts/minted/pygments-2.18.0-py3-none-any.whl
+ texmf-dist/tex/latex/minted/minted.sty
+ texmf-dist/tex/latex/minted/minted1.sty
+ texmf-dist/tex/latex/minted/minted2.sty
catalogue-also texments verbments
catalogue-contact-repository https://github.com/gpoore/minted
catalogue-ctan /macros/latex/contrib/minted
@@ -220562,6 +220556,141 @@ catalogue-license lppl1.3 bsd3
catalogue-topics listing verbatim synt-hlt
catalogue-version 3.0.0
+name minted.aarch64-linux
+category Package
+revision 72375
+shortdesc aarch64-linux files of minted
+containersize 340
+containerchecksum cc92119543e98d82b7945b892df8c72d46146e778368d09d429cdee1500c206a291b3e16dd9140c68642b3c2e3df5404ca86e99db83cbd3dec8577c4733f4c93
+binfiles arch=aarch64-linux size=1
+ bin/aarch64-linux/latexminted
+
+name minted.amd64-freebsd
+category Package
+revision 72375
+shortdesc amd64-freebsd files of minted
+containersize 340
+containerchecksum 4cc81bb16c42ce2ba2880897977a9e906da7da55573ee32a9f0b82e531000cf43ebbdd813265e42526eb7b052920e0497fc78fbb54af5e964819d67f0494d346
+binfiles arch=amd64-freebsd size=1
+ bin/amd64-freebsd/latexminted
+
+name minted.amd64-netbsd
+category Package
+revision 72375
+shortdesc amd64-netbsd files of minted
+containersize 340
+containerchecksum 46a025c81b73faf327e24beb3b0500fefef86b945d0a0eb6accc1107b84b1b1a510674d71981ab8d2582b00c725d4fd27f4b6343de6df7bbc0a7c560bf07dd08
+binfiles arch=amd64-netbsd size=1
+ bin/amd64-netbsd/latexminted
+
+name minted.armhf-linux
+category Package
+revision 72375
+shortdesc armhf-linux files of minted
+containersize 340
+containerchecksum 521bb5c0954a09354c402c973c1942f0f8156c4a9cfbd38f5c99e58fd7999d583bd86ec691564116c6d94d33a2b5b624605c7c900ad3e0005ef8802488f58ae7
+binfiles arch=armhf-linux size=1
+ bin/armhf-linux/latexminted
+
+name minted.i386-freebsd
+category Package
+revision 72375
+shortdesc i386-freebsd files of minted
+containersize 340
+containerchecksum 250634000db73a1f8432212bd728c1e198a9ca83bbd9ddca38d8d77430c95bcba9b8483b973cb24ac082de9b22262487d2d974593d5769386617a075a5a123a3
+binfiles arch=i386-freebsd size=1
+ bin/i386-freebsd/latexminted
+
+name minted.i386-linux
+category Package
+revision 72375
+shortdesc i386-linux files of minted
+containersize 340
+containerchecksum b6fc05f6bcda7a9a421cd88dae3f778027de6ea51ba9f5b72e31638f836053d2b91a4e93bc6f08a3dca23612d08d82e5dba569362fd3dd296d1a6b87de4e412e
+binfiles arch=i386-linux size=1
+ bin/i386-linux/latexminted
+
+name minted.i386-netbsd
+category Package
+revision 72375
+shortdesc i386-netbsd files of minted
+containersize 340
+containerchecksum a76fc2247ff4c5a9684ce9213f299e80131d8df4a771e1889219633be94de3e58f239456a9c555fcd6778208d019495dfeaffb7575db75b699896b43291588f3
+binfiles arch=i386-netbsd size=1
+ bin/i386-netbsd/latexminted
+
+name minted.i386-solaris
+category Package
+revision 72375
+shortdesc i386-solaris files of minted
+containersize 340
+containerchecksum 5cdfe8d541da29e369dd5f3c3cfd59b92327de91a5f9fa1439ef659d0eb442bd2addfd03a31187debdfa8f0e1d5f6c26862a6a3da40809ee07fc60e6404bdee0
+binfiles arch=i386-solaris size=1
+ bin/i386-solaris/latexminted
+
+name minted.universal-darwin
+category Package
+revision 72375
+shortdesc universal-darwin files of minted
+containersize 344
+containerchecksum cb2e0f827060aa057ed37b493b19a4f2734b758c949e455b149c713fa8fc9c0106a64647a99fb23c8c2070d1d0267923fbe6ab2b786c738a94a96cb49666c743
+binfiles arch=universal-darwin size=1
+ bin/universal-darwin/latexminted
+
+name minted.windows
+category Package
+revision 72375
+shortdesc windows files of minted
+containersize 2304
+containerchecksum fa7960196fcbf0b01e8da48cadfb17c9b18bf3886e86a3988d2dd6831ea2322d4ed3b894fc616a5a978ae68d7e72e0f616d6fdd2bf51aa7d2eeb03da54ebea6c
+binfiles arch=windows size=2
+ bin/windows/latexminted.exe
+
+name minted.x86_64-cygwin
+category Package
+revision 72375
+shortdesc x86_64-cygwin files of minted
+containersize 340
+containerchecksum e6d630f62fa7cbf38c9421b777e8ee6b852444f4b7041a4423b9d7d01a3c487ef6d6f13da7b5d4ec2d94220b17ca16e1b8abf98f3958e16f670312770fed2961
+binfiles arch=x86_64-cygwin size=1
+ bin/x86_64-cygwin/latexminted
+
+name minted.x86_64-darwinlegacy
+category Package
+revision 72375
+shortdesc x86_64-darwinlegacy files of minted
+containersize 352
+containerchecksum 6ef9747b7c64fa330b9da3a30d55857010c54284fa05b0806242e226c3c7502bdb578ca995f31142d56551a6c8a1dd11cffa4e37d57c6ac49677e5e12bf5c01b
+binfiles arch=x86_64-darwinlegacy size=1
+ bin/x86_64-darwinlegacy/latexminted
+
+name minted.x86_64-linux
+category Package
+revision 72375
+shortdesc x86_64-linux files of minted
+containersize 340
+containerchecksum 25a7fdd0f15ffa9d1cc8a7af6c54ee11892f0f47032224277983988a0f2f5f000e3a271f0512b59130fc8513adb3cbd366fcae071659c4a475783a13bca4f527
+binfiles arch=x86_64-linux size=1
+ bin/x86_64-linux/latexminted
+
+name minted.x86_64-linuxmusl
+category Package
+revision 72375
+shortdesc x86_64-linuxmusl files of minted
+containersize 344
+containerchecksum a6f9e0f73917df458c786c69b2e54a10f3ef16b8b0168f68637f1c0a55f50fe5b334e86038c9f1fa837907aec46228dbee7114a5bbd5d1c98bb4e0fb468a5704
+binfiles arch=x86_64-linuxmusl size=1
+ bin/x86_64-linuxmusl/latexminted
+
+name minted.x86_64-solaris
+category Package
+revision 72375
+shortdesc x86_64-solaris files of minted
+containersize 340
+containerchecksum 373f5a0b8f6792d36bf8d66684d593e71b961f1af7609e32442408d7b71064db7c15addde68e21bd807fad1f140b77c138a5d4e86c26e1302915bcf58c58a7c3
+binfiles arch=x86_64-solaris size=1
+ bin/x86_64-solaris/latexminted
+
name mintspirit
category Package
revision 64461
@@ -282497,6 +282626,33 @@ catalogue-license lppl1.3c
catalogue-topics exam
catalogue-version 2024F
+name randintlist
+category Package
+revision 72374
+shortdesc Creating random integer number lists , with repeating and sorting options
+relocated 1
+longdesc This package (like luarandom, but without the obligation to use
+longdesc LuaLaTeX) provides some macros for creating random integer
+longdesc number lists between a and b. This list can have multiple
+longdesc numbers or not, and this list can be sorted or not.
+containersize 1736
+containerchecksum 8476a524492e568738cf619a412cb58218ba390fab25ee9ec428356e2ed30559f9f24b4ab2783bfa80b283f70a73591176b38505cd4256d6ebd744f71c6cd05d
+doccontainersize 84512
+doccontainerchecksum 7ec66cd5a5a5c4b900a38d7ffb4628edca81c3206326f5426122c462f6e5936239fac04b42a67b2d5b05c6c78d64c637974544f5d55d490cfc3bf28cc59bc150
+docfiles size=25
+ RELOC/doc/latex/randintlist/README.md details="Readme"
+ RELOC/doc/latex/randintlist/randintlist-doc.pdf details="Package documentation"
+ RELOC/doc/latex/randintlist/randintlist-doc.tex
+runfiles size=2
+ RELOC/tex/latex/randintlist/randintlist.sty
+catalogue-contact-bugs https://github.com/cpierquet/randintlist/issues
+catalogue-contact-home https://github.com/cpierquet/randintlist
+catalogue-contact-repository https://github.com/cpierquet/randintlist
+catalogue-ctan /macros/latex/contrib/randintlist
+catalogue-license lppl1.3c
+catalogue-topics random calculation
+catalogue-version 0.1.0
+
name random
category Package
revision 54723
@@ -316951,7 +317107,7 @@ binfiles arch=x86_64-solaris size=1
name tex4ht
category Package
-revision 72258
+revision 72371
shortdesc Convert (La)TeX to HTML/XML
longdesc A converter from TeX and LaTeX to SGML-based formats such as
longdesc (X)HTML, MathML, OpenDocument, and Docbook, providing a
@@ -316972,10 +317128,10 @@ longdesc files from them is nontrivial, and generally done with the
longdesc Makefile in development, from which the TeX4ht package in TeX
longdesc Live is updated.
depend tex4ht.ARCH
-containersize 1136500
-containerchecksum 7238d17dede14eb4d64186914a1aa3a545f5e840d557c68c5bbb74084322fbced733581b2d141e36467631338773d1173180c50d472b2a48c7c9e87db61eaf26
+containersize 1136516
+containerchecksum bad8650874a463dfdc5382ef7f40eb0a1039c4697e89b32d5e1c3f5cb08a4050ab20d8cfaffca8cf69fd1e7429d59f2c64c3266d6c228e91bab31b809f57caa4
doccontainersize 136384
-doccontainerchecksum f7940c5a02e7e3e30214e0a7ba77534322a24a1002f457e1ef09e4d140934191a35286a9203197d98b245c44999c2958efcfcbcf441524bfa89df16198accf3c
+doccontainerchecksum 284214d352400a010fe5aedd4550637356021403536d299c4370883988c84c92e1dbce6c1b6c3bd662161d1f687a522e2b8715a6f1bdd225fd0c04bfc06b8534
docfiles size=260
texmf-dist/doc/generic/tex4ht/Makefile
texmf-dist/doc/generic/tex4ht/README details="Readme"
@@ -317047,8 +317203,8 @@ docfiles size=260
texmf-dist/doc/generic/tex4ht/mn56.html
texmf-dist/doc/generic/tex4ht/mn5x.png
texmf-dist/doc/generic/tex4ht/mn6x.png
-srccontainersize 1498868
-srccontainerchecksum cfa20184505fa3422e47a6fbae8213d1f5761d7acda39a64220953b0809306b0da5c384592561fcccc67badc6ce19c68d3fb26e54f4a921873c1bbdea2b105fe
+srccontainersize 1499588
+srccontainerchecksum 275097bf1f565ed5abc76420a408e7ce40f1c7b64162aa8e55332ec2445b2f46206031e2f1a2372f93dc7874e536791602af578de95ec59fbbaafd9791200f44
srcfiles size=4659
texmf-dist/source/generic/tex4ht/ChangeLog
texmf-dist/source/generic/tex4ht/Makefile
@@ -329486,7 +329642,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 72367
+revision 72377
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.
@@ -329495,10 +329651,10 @@ depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
containersize 114460
-containerchecksum f4a663cad7bf2f5a3498ad0d040496af8d1ae41370dafa55fa4e012dbd7ba4ed8b1f1d7d449bb918a8b02f8231008aca1e3d38b87a6e1a25d3a011589c536765
-doccontainersize 437160
-doccontainerchecksum 65599c497c0dfa7fc7f06f1d94dd3cb6e8e41b4394f06d1c63897d040c482c5082d589a8c19186f9b2dfc6baf0f81324f6d1ec0d21b562a1889fec4b667ea32f
-docfiles size=567
+containerchecksum 1abf0c14d90449386943de73e97ad8fff87a2f7ec550cd227a392dd36d2e832a961b14ce1fcc6496a33fc5b197515517d7ab15b70a4c28b59d7b242835301454
+doccontainersize 437280
+doccontainerchecksum e6865e3994e9c5b6d1121eacd0d347abed931dc8d139e3db0d36df6f73db0a4234de562a74857703312e52f914b8add94b1594b0b7a676215d32b34b9f50d923
+docfiles size=566
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
texmf-dist/doc/man/man1/fmtutil-sys.man1.pdf
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 8f50cc3b83..08a9e076f2 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-b6449589b6e80bf457c43e5a62e2da67 texlive.tlpdb
+2c89efeecd324f6d3ea28e1c8bb9b851 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index be08442a71..7560760cb2 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-d0ff27970160c04ae20f0ee23baff23ff51ef44c3bc3f9f720cecccff994d22caef065df9c0f8b0d9423ad32152fcf7ac9b0727ccf762507920dde4a43f1a8e0 texlive.tlpdb
+392e302246d3b094bc356041ee0d644d3838b89250531cb643c380ff0e7406e90ec2bbf0c560a27ca970869c42e38c1a21f7696cac422f07abd59052119b9991 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 479aad5642..6c76dc6688 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+QqiBBqTOGHfhlDjHAFAmbx/oIACgkQTOGHfhlD
-jHD2GAgAl7h1U77UBAxSlDgb79HXkHXvQ2E8H2/ym/dGWA9k2GU87PEHxGXM5Seb
-8LXsfnyT0QQ3GMr7IhlyuOna1VMf/Bjvio20rS4+ysisjySPYmTCcSqaom61lTVM
-qqDx7LkXx9JJrj/IwsqH3rinYhCpThE4btq2RDxZGRZtzJS6C5f/nc9C/WnRgHlS
-FYXfPCeaSfigW2MfzN0eTIbS0Vp1TlWg+WSMaPazQYCnuve1l/Ux3TUeLu4aXL97
-0lf73R5Wj96Xg8XUr+mNB5vXASEyjIfbMK6rV8bo/79/+AVx68YeE73AQseYF1UW
-u/EmjfmMhv7cB5MtsYGd066pfVyXrQ==
-=H2vA
+iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmbzT8sACgkQTOGHfhlD
+jHCY6QgAu0lBryN5OaHXsqBGKmzX97Xb+CmteTw9wkrmHliOuB5ux09UEL3rgRTz
+fVFzNr/m617dLYn7rPA51zdZ9zEtYLapHVpJki8cJcqwUFaorBNGfuEEyM4GPlPU
+ssE3XDQG55DZtwvzryxKx/tXu5Id5xl091koFdzh5vXHwFwlS4tSkDciPg2ogNd8
+JMFq1ljzBm9dTBkSEdYa7U18rGEy7nvlGcBXmqWX0Qd6tAiVGFDMp1imU1Tgq8+Q
+gXXE0mru+ZIxWBEG4wVqkkmQFxnICF3zK8Na57xPZvf22Pl3DM5HTw2+/6OB/Utd
+87Mz8Y8GD/8lugTEyrOmKX97gt1qnA==
+=u8vr
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 21db17739f..0419902830 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/timestamp b/timestamp
index 37ce02d78d..23a5187fa8 100644
--- a/timestamp
+++ b/timestamp
@@ -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-09-24-02-02
+2024-09-25-02-02