summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-01-25 03:01:16 +0000
committerNorbert Preining <norbert@preining.info>2023-01-25 03:01:16 +0000
commit90299d4f0bdde9fb84d583d5c0e923cfe3869132 (patch)
tree18aafa9c8d28266a65ed09979c53c6277b6502ef
parentb06c6695162b493aeec3b594c6beb518c15c98ba (diff)
CTAN sync 202301250301
-rw-r--r--FILES.byname574
-rw-r--r--FILES.byname.gzbin2511985 -> 2511737 bytes
-rw-r--r--FILES.last07days486
-rw-r--r--biblio/ctan-bibdata/ctan.bib97
-rw-r--r--biblio/ctan-bibdata/ctan.pdfbin3641550 -> 3641439 bytes
-rw-r--r--macros/latex/contrib/l3experimental/CHANGELOG.md10
-rw-r--r--macros/latex/contrib/l3experimental/README.md4
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.ins4
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.pdfbin308083 -> 308483 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3bitset.dtx8
-rw-r--r--macros/latex/contrib/l3experimental/l3bitset.pdfbin403912 -> 404305 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-boxes.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-code.pdfbin667718 -> 679193 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-layers.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-paths.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-points.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-scopes.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-softpath.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-state.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-transforms.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.ins4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.pdfbin517252 -> 517619 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.pdfbin408448 -> 408825 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.dtx8
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.ins4
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.pdfbin381672 -> 382072 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3opacity.dtx9
-rw-r--r--macros/latex/contrib/l3experimental/l3opacity.ins4
-rw-r--r--macros/latex/contrib/l3experimental/l3opacity.pdfbin334603 -> 313535 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.dtx8
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.pdfbin367526 -> 367940 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3str.ins4
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.ins4
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.pdfbin347562 -> 347982 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.ins4
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.pdfbin394009 -> 394409 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.dtx19
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.ins4
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.pdfbin299230 -> 299636 bytes
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md16
-rw-r--r--macros/latex/contrib/l3kernel/README.md2
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin622988 -> 622767 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1779228 -> 1779014 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3candidates.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3cctab.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3color.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.pdfbin558003 -> 557803 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin152026 -> 151818 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx44
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin395876 -> 395876 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin122710 -> 122710 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin150674 -> 150674 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin148706 -> 148706 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin114586 -> 114586 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin112485 -> 112485 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin151569 -> 151569 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin128316 -> 128316 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin163456 -> 163456 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin250136 -> 250136 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin150283 -> 150283 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin170076 -> 170076 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin204992 -> 204992 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3pdf.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin81614 -> 81614 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin296456 -> 296239 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin243128 -> 242907 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin215659 -> 215443 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3text-map.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-purify.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin7320187 -> 7323123 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex2
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdfbin859565 -> 860401 bytes
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex72
-rw-r--r--macros/latex/contrib/proflycee/tex/ProfLycee.sty31
-rw-r--r--macros/latex/contrib/sidecap/Makefile23
-rw-r--r--macros/latex/contrib/sidecap/README.md (renamed from macros/latex/contrib/sidecap/README)10
-rw-r--r--macros/latex/contrib/sidecap/sc-test-common.tex122
-rw-r--r--macros/latex/contrib/sidecap/scraggeddemo.tex128
-rw-r--r--macros/latex/contrib/sidecap/sidecap.dtx93
-rw-r--r--macros/latex/contrib/sidecap/sidecap.pdfbin156630 -> 325718 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/README.md6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex4
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdfbin1115481 -> 1052327 bytes
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex19
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex628
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty8
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex113
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex6
-rw-r--r--macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex6
-rw-r--r--obsolete/macros/generic/expkv-cs/README.md32
-rw-r--r--obsolete/macros/generic/expkv-cs/expkv-cs.dtx3431
-rw-r--r--obsolete/macros/generic/expkv-cs/expkv-cs.pdfbin470406 -> 0 bytes
-rw-r--r--obsolete/macros/generic/expkv-def/README.md32
-rw-r--r--obsolete/macros/generic/expkv-def/expkv-def.dtx2493
-rw-r--r--obsolete/macros/generic/expkv-def/expkv-def.pdfbin424547 -> 0 bytes
-rw-r--r--obsolete/macros/generic/expkv-opt/README.md29
-rw-r--r--obsolete/macros/generic/expkv-opt/expkv-opt-2020-10-10.dtx938
-rw-r--r--obsolete/macros/generic/expkv-opt/expkv-opt.dtx1012
-rw-r--r--obsolete/macros/generic/expkv-opt/expkv-opt.pdfbin268534 -> 0 bytes
-rw-r--r--obsolete/macros/generic/expkv/README.md35
-rw-r--r--obsolete/macros/generic/expkv/expkv.dtx2980
-rw-r--r--obsolete/macros/generic/expkv/expkv.pdfbin490757 -> 0 bytes
-rw-r--r--systems/doc/luatex/luatex-modifications.tex24
-rw-r--r--systems/doc/luatex/luatex.pdfbin1786719 -> 1788188 bytes
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl2
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb263
-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.asc14
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2446668 -> 2444244 bytes
-rw-r--r--timestamp2
207 files changed, 1959 insertions, 12340 deletions
diff --git a/FILES.byname b/FILES.byname
index 22de6422c0..078d002ac4 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -2048,12 +2048,12 @@
2022/12/25 | 1673 | biblio/citation-style-language/README.md
2022/12/25 | 11958 | biblio/citation-style-language/vancouver.csl
2022/12/25 | 604004 | biblio/citation-style-language.zip
-2023/01/23 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/01/24 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx
-2023/01/23 | 2761437 | biblio/ctan-bibdata/ctan.bib
-2023/01/23 | 3642904 | biblio/ctan-bibdata/ctan.pdf
+2023/01/24 | 2761884 | biblio/ctan-bibdata/ctan.bib
+2023/01/24 | 3641550 | biblio/ctan-bibdata/ctan.pdf
2023/01/16 | 1489 | biblio/ctan-bibdata/README
-2023/01/23 | 4037507 | biblio/ctan-bibdata.zip
+2023/01/24 | 4036706 | biblio/ctan-bibdata.zip
2022/02/06 | 3110 | biblio/pbibtex/pbibtex-base/cpp.awk
2022/02/06 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh
2022/02/06 | 22422 | biblio/pbibtex/pbibtex-base/jabbrv.bst
@@ -5407,7 +5407,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
-2023/01/23 | 112771 | FILES.last07days
+2023/01/24 | 635732 | 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
@@ -193312,8 +193312,8 @@
2019/12/19 | 302191 | install/macros/latex/contrib/kvdefinekeys.tds.zip
2023/01/16 | 971287 | install/macros/latex/contrib/l3backend.tds.zip
2022/11/10 | 817286 | install/macros/latex/contrib/l3build.tds.zip
-2022/04/20 | 4458126 | install/macros/latex/contrib/l3experimental.tds.zip
-2023/01/16 | 14019002 | install/macros/latex/contrib/l3kernel.tds.zip
+2023/01/24 | 4451432 | install/macros/latex/contrib/l3experimental.tds.zip
+2023/01/24 | 14020560 | install/macros/latex/contrib/l3kernel.tds.zip
2023/01/16 | 2254278 | install/macros/latex/contrib/l3packages.tds.zip
2021/09/03 | 583760 | install/macros/latex/contrib/lastpage.tds.zip
2009/09/02 | 556672 | install/macros/latex/contrib/layouts.tds.zip
@@ -226034,152 +226034,152 @@
2022/11/10 | 3382 | macros/latex/contrib/l3build/l3build-zip.lua
2022/11/10 | 1019 | macros/latex/contrib/l3build/README.md
2022/11/10 | 813856 | macros/latex/contrib/l3build.zip
-2022/04/20 | 7547 | macros/latex/contrib/l3experimental/CHANGELOG.md
-2022/04/20 | 16509 | macros/latex/contrib/l3experimental/l3benchmark.dtx
-2022/04/20 | 1558 | macros/latex/contrib/l3experimental/l3benchmark.ins
-2022/04/20 | 308083 | macros/latex/contrib/l3experimental/l3benchmark.pdf
-2022/04/20 | 18695 | macros/latex/contrib/l3experimental/l3bitset.dtx
-2022/04/20 | 1565 | macros/latex/contrib/l3experimental/l3bitset.ins
-2022/04/20 | 403912 | macros/latex/contrib/l3experimental/l3bitset.pdf
-2022/04/20 | 4323 | macros/latex/contrib/l3experimental/l3draw-boxes.dtx
-2022/04/20 | 667718 | macros/latex/contrib/l3experimental/l3draw-code.pdf
-2022/04/20 | 1360 | macros/latex/contrib/l3experimental/l3draw-code.tex
-2022/04/20 | 42558 | macros/latex/contrib/l3experimental/l3draw.dtx
-2022/04/20 | 1906 | macros/latex/contrib/l3experimental/l3draw.ins
-2022/04/20 | 5653 | macros/latex/contrib/l3experimental/l3draw-layers.dtx
-2022/04/20 | 32508 | macros/latex/contrib/l3experimental/l3draw-paths.dtx
-2022/04/20 | 517252 | macros/latex/contrib/l3experimental/l3draw.pdf
-2022/04/20 | 36026 | macros/latex/contrib/l3experimental/l3draw-points.dtx
-2022/04/20 | 10018 | macros/latex/contrib/l3experimental/l3draw-scopes.dtx
-2022/04/20 | 20451 | macros/latex/contrib/l3experimental/l3draw-softpath.dtx
-2022/04/20 | 4448 | macros/latex/contrib/l3experimental/l3draw-state.dtx
-2022/04/20 | 10136 | macros/latex/contrib/l3experimental/l3draw-transforms.dtx
-2022/04/20 | 96041 | macros/latex/contrib/l3experimental/l3galley.dtx
-2022/04/20 | 408448 | macros/latex/contrib/l3experimental/l3galley.pdf
-2022/04/20 | 25753 | macros/latex/contrib/l3experimental/l3graphics.dtx
-2022/04/20 | 1553 | macros/latex/contrib/l3experimental/l3graphics.ins
-2022/04/20 | 381672 | macros/latex/contrib/l3experimental/l3graphics.pdf
-2022/04/20 | 4108 | macros/latex/contrib/l3experimental/l3opacity.dtx
-2022/04/20 | 1547 | macros/latex/contrib/l3experimental/l3opacity.ins
-2022/04/20 | 334603 | macros/latex/contrib/l3experimental/l3opacity.pdf
-2022/04/20 | 31828 | macros/latex/contrib/l3experimental/l3str-format.dtx
-2022/04/20 | 367526 | macros/latex/contrib/l3experimental/l3str-format.pdf
-2022/04/20 | 1564 | macros/latex/contrib/l3experimental/l3str.ins
-2022/04/20 | 12361 | macros/latex/contrib/l3experimental/l3sys-shell.dtx
-2022/04/20 | 1565 | macros/latex/contrib/l3experimental/l3sys-shell.ins
-2022/04/20 | 347562 | macros/latex/contrib/l3experimental/l3sys-shell.pdf
-2022/04/20 | 4284 | macros/latex/contrib/l3experimental/README.md
-2022/04/20 | 35092 | macros/latex/contrib/l3experimental/xcoffins.dtx
-2022/04/20 | 1569 | macros/latex/contrib/l3experimental/xcoffins.ins
-2022/04/20 | 394009 | macros/latex/contrib/l3experimental/xcoffins.pdf
-2022/04/20 | 58366 | macros/latex/contrib/l3experimental/xgalley.dtx
-2022/04/20 | 1624 | macros/latex/contrib/l3experimental/xgalley.ins
-2022/04/20 | 299230 | macros/latex/contrib/l3experimental/xgalley.pdf
-2022/04/20 | 4420859 | macros/latex/contrib/l3experimental.zip
-2023/01/16 | 43141 | macros/latex/contrib/l3kernel/CHANGELOG.md
-2023/01/16 | 70859 | macros/latex/contrib/l3kernel/expl3.dtx
-2023/01/16 | 622988 | macros/latex/contrib/l3kernel/expl3.pdf
-2023/01/16 | 1779228 | macros/latex/contrib/l3kernel/interface3.pdf
-2023/01/16 | 1908 | macros/latex/contrib/l3kernel/interface3.tex
-2023/01/16 | 129434 | macros/latex/contrib/l3kernel/l3basics.dtx
-2023/01/16 | 15127 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
-2023/01/16 | 79792 | macros/latex/contrib/l3kernel/l3box.dtx
-2023/01/16 | 68290 | macros/latex/contrib/l3kernel/l3candidates.dtx
-2023/01/16 | 32429 | macros/latex/contrib/l3kernel/l3cctab.dtx
-2023/01/16 | 82707 | macros/latex/contrib/l3kernel/l3clist.dtx
-2023/01/16 | 87493 | macros/latex/contrib/l3kernel/l3coffins.dtx
-2023/01/16 | 110994 | macros/latex/contrib/l3kernel/l3color.dtx
-2023/01/16 | 43212 | macros/latex/contrib/l3kernel/l3debug.dtx
-2023/01/16 | 23530 | macros/latex/contrib/l3kernel/l3deprecation.dtx
-2023/01/16 | 155616 | macros/latex/contrib/l3kernel/l3doc.dtx
-2023/01/16 | 558003 | macros/latex/contrib/l3kernel/l3doc.pdf
-2023/01/16 | 2390 | macros/latex/contrib/l3kernel/l3docstrip.dtx
-2023/01/16 | 152026 | macros/latex/contrib/l3kernel/l3docstrip.pdf
-2023/01/16 | 106428 | macros/latex/contrib/l3kernel/l3expan.dtx
-2023/01/16 | 136649 | macros/latex/contrib/l3kernel/l3file.dtx
-2023/01/16 | 9436 | macros/latex/contrib/l3kernel/l3flag.dtx
-2023/01/16 | 11781 | macros/latex/contrib/l3kernel/l3fparray.dtx
-2023/01/16 | 7454 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
-2023/01/16 | 47216 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
-2023/01/16 | 84785 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
-2023/01/16 | 19641 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
-2023/01/16 | 70578 | macros/latex/contrib/l3kernel/l3fp.dtx
-2023/01/16 | 49311 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
-2023/01/16 | 51059 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
-2023/01/16 | 23011 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
-2023/01/16 | 105029 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
-2023/01/16 | 25650 | macros/latex/contrib/l3kernel/l3fp-random.dtx
-2023/01/16 | 18531 | macros/latex/contrib/l3kernel/l3fp-round.dtx
-2023/01/16 | 12783 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
-2023/01/16 | 73835 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
-2023/01/16 | 6224 | macros/latex/contrib/l3kernel/l3.ins
-2023/01/16 | 34166 | macros/latex/contrib/l3kernel/l3intarray.dtx
-2023/01/16 | 90018 | macros/latex/contrib/l3kernel/l3int.dtx
-2023/01/16 | 26737 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
-2023/01/16 | 127087 | macros/latex/contrib/l3kernel/l3keys.dtx
-2023/01/16 | 4538 | macros/latex/contrib/l3kernel/l3legacy.dtx
-2023/01/16 | 23866 | macros/latex/contrib/l3kernel/l3luatex.dtx
-2023/01/16 | 74250 | macros/latex/contrib/l3kernel/l3msg.dtx
-2023/01/16 | 80495 | macros/latex/contrib/l3kernel/l3names.dtx
-2023/01/16 | 122710 | macros/latex/contrib/l3kernel/l3news01.pdf
-2023/01/16 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex
-2023/01/16 | 150674 | macros/latex/contrib/l3kernel/l3news02.pdf
-2023/01/16 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
-2023/01/16 | 148706 | macros/latex/contrib/l3kernel/l3news03.pdf
-2023/01/16 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
-2023/01/16 | 114586 | macros/latex/contrib/l3kernel/l3news04.pdf
-2023/01/16 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
-2023/01/16 | 112485 | macros/latex/contrib/l3kernel/l3news05.pdf
-2023/01/16 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
-2023/01/16 | 151569 | macros/latex/contrib/l3kernel/l3news06.pdf
-2023/01/16 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex
-2023/01/16 | 128316 | macros/latex/contrib/l3kernel/l3news07.pdf
-2023/01/16 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
-2023/01/16 | 163456 | macros/latex/contrib/l3kernel/l3news08.pdf
-2023/01/16 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
-2023/01/16 | 250136 | macros/latex/contrib/l3kernel/l3news09.pdf
-2023/01/16 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex
-2023/01/16 | 150283 | macros/latex/contrib/l3kernel/l3news10.pdf
-2023/01/16 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
-2023/01/16 | 170076 | macros/latex/contrib/l3kernel/l3news11.pdf
-2023/01/16 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
-2023/01/16 | 204992 | macros/latex/contrib/l3kernel/l3news12.pdf
-2023/01/16 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
-2023/01/16 | 395876 | macros/latex/contrib/l3kernel/l3news.pdf
-2023/01/16 | 4890 | macros/latex/contrib/l3kernel/l3news.tex
-2023/01/16 | 19161 | macros/latex/contrib/l3kernel/l3pdf.dtx
-2023/01/16 | 45040 | macros/latex/contrib/l3kernel/l3prefixes.csv
-2023/01/16 | 81614 | macros/latex/contrib/l3kernel/l3prefixes.pdf
-2023/01/16 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex
-2023/01/16 | 66654 | macros/latex/contrib/l3kernel/l3prg.dtx
-2023/01/16 | 57974 | macros/latex/contrib/l3kernel/l3prop.dtx
-2023/01/16 | 35441 | macros/latex/contrib/l3kernel/l3quark.dtx
-2023/01/16 | 304752 | macros/latex/contrib/l3kernel/l3regex.dtx
-2023/01/16 | 90470 | macros/latex/contrib/l3kernel/l3seq.dtx
-2023/01/16 | 76279 | macros/latex/contrib/l3kernel/l3skip.dtx
-2023/01/16 | 40704 | macros/latex/contrib/l3kernel/l3sort.dtx
-2023/01/16 | 113427 | macros/latex/contrib/l3kernel/l3str-convert.dtx
-2023/01/16 | 78244 | macros/latex/contrib/l3kernel/l3str.dtx
-2023/01/16 | 296456 | macros/latex/contrib/l3kernel/l3styleguide.pdf
-2023/01/16 | 11884 | macros/latex/contrib/l3kernel/l3styleguide.tex
-2023/01/16 | 243128 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
-2023/01/16 | 6267 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
-2023/01/16 | 33655 | macros/latex/contrib/l3kernel/l3sys.dtx
-2023/01/16 | 215659 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
-2023/01/16 | 6169 | macros/latex/contrib/l3kernel/l3term-glossary.tex
-2023/01/16 | 60744 | macros/latex/contrib/l3kernel/l3text-case.dtx
-2023/01/16 | 51006 | macros/latex/contrib/l3kernel/l3text.dtx
-2023/01/16 | 16633 | macros/latex/contrib/l3kernel/l3text-map.dtx
-2023/01/16 | 21665 | macros/latex/contrib/l3kernel/l3text-purify.dtx
-2023/01/16 | 62840 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
-2023/01/16 | 145318 | macros/latex/contrib/l3kernel/l3tl.dtx
-2023/01/16 | 118859 | macros/latex/contrib/l3kernel/l3token.dtx
-2023/01/16 | 32409 | macros/latex/contrib/l3kernel/l3unicode.dtx
-2023/01/16 | 3929 | macros/latex/contrib/l3kernel/README.md
-2023/01/16 | 24841 | macros/latex/contrib/l3kernel/source3body.tex
-2023/01/16 | 7320187 | macros/latex/contrib/l3kernel/source3.pdf
-2023/01/16 | 2229 | macros/latex/contrib/l3kernel/source3.tex
-2023/01/16 | 13760156 | macros/latex/contrib/l3kernel.zip
+2023/01/24 | 7734 | macros/latex/contrib/l3experimental/CHANGELOG.md
+2023/01/24 | 16509 | macros/latex/contrib/l3experimental/l3benchmark.dtx
+2023/01/24 | 1558 | macros/latex/contrib/l3experimental/l3benchmark.ins
+2023/01/24 | 308483 | macros/latex/contrib/l3experimental/l3benchmark.pdf
+2023/01/24 | 18694 | macros/latex/contrib/l3experimental/l3bitset.dtx
+2023/01/24 | 1565 | macros/latex/contrib/l3experimental/l3bitset.ins
+2023/01/24 | 404305 | macros/latex/contrib/l3experimental/l3bitset.pdf
+2023/01/24 | 4323 | macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+2023/01/24 | 679193 | macros/latex/contrib/l3experimental/l3draw-code.pdf
+2023/01/24 | 1360 | macros/latex/contrib/l3experimental/l3draw-code.tex
+2023/01/24 | 42558 | macros/latex/contrib/l3experimental/l3draw.dtx
+2023/01/24 | 1906 | macros/latex/contrib/l3experimental/l3draw.ins
+2023/01/24 | 5653 | macros/latex/contrib/l3experimental/l3draw-layers.dtx
+2023/01/24 | 32508 | macros/latex/contrib/l3experimental/l3draw-paths.dtx
+2023/01/24 | 517619 | macros/latex/contrib/l3experimental/l3draw.pdf
+2023/01/24 | 36026 | macros/latex/contrib/l3experimental/l3draw-points.dtx
+2023/01/24 | 10018 | macros/latex/contrib/l3experimental/l3draw-scopes.dtx
+2023/01/24 | 20451 | macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+2023/01/24 | 4448 | macros/latex/contrib/l3experimental/l3draw-state.dtx
+2023/01/24 | 10136 | macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+2023/01/24 | 96041 | macros/latex/contrib/l3experimental/l3galley.dtx
+2023/01/24 | 408825 | macros/latex/contrib/l3experimental/l3galley.pdf
+2023/01/24 | 25753 | macros/latex/contrib/l3experimental/l3graphics.dtx
+2023/01/24 | 1553 | macros/latex/contrib/l3experimental/l3graphics.ins
+2023/01/24 | 382072 | macros/latex/contrib/l3experimental/l3graphics.pdf
+2023/01/24 | 4011 | macros/latex/contrib/l3experimental/l3opacity.dtx
+2023/01/24 | 1547 | macros/latex/contrib/l3experimental/l3opacity.ins
+2023/01/24 | 313535 | macros/latex/contrib/l3experimental/l3opacity.pdf
+2023/01/24 | 31827 | macros/latex/contrib/l3experimental/l3str-format.dtx
+2023/01/24 | 367940 | macros/latex/contrib/l3experimental/l3str-format.pdf
+2023/01/24 | 1564 | macros/latex/contrib/l3experimental/l3str.ins
+2023/01/24 | 12361 | macros/latex/contrib/l3experimental/l3sys-shell.dtx
+2023/01/24 | 1565 | macros/latex/contrib/l3experimental/l3sys-shell.ins
+2023/01/24 | 347982 | macros/latex/contrib/l3experimental/l3sys-shell.pdf
+2023/01/24 | 4284 | macros/latex/contrib/l3experimental/README.md
+2023/01/24 | 35092 | macros/latex/contrib/l3experimental/xcoffins.dtx
+2023/01/24 | 1569 | macros/latex/contrib/l3experimental/xcoffins.ins
+2023/01/24 | 394409 | macros/latex/contrib/l3experimental/xcoffins.pdf
+2023/01/24 | 58083 | macros/latex/contrib/l3experimental/xgalley.dtx
+2023/01/24 | 1624 | macros/latex/contrib/l3experimental/xgalley.ins
+2023/01/24 | 299636 | macros/latex/contrib/l3experimental/xgalley.pdf
+2023/01/24 | 4414253 | macros/latex/contrib/l3experimental.zip
+2023/01/24 | 43537 | macros/latex/contrib/l3kernel/CHANGELOG.md
+2023/01/24 | 70859 | macros/latex/contrib/l3kernel/expl3.dtx
+2023/01/24 | 622767 | macros/latex/contrib/l3kernel/expl3.pdf
+2023/01/24 | 1779014 | macros/latex/contrib/l3kernel/interface3.pdf
+2023/01/24 | 1908 | macros/latex/contrib/l3kernel/interface3.tex
+2023/01/24 | 129434 | macros/latex/contrib/l3kernel/l3basics.dtx
+2023/01/24 | 14927 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
+2023/01/24 | 79792 | macros/latex/contrib/l3kernel/l3box.dtx
+2023/01/24 | 68290 | macros/latex/contrib/l3kernel/l3candidates.dtx
+2023/01/24 | 32429 | macros/latex/contrib/l3kernel/l3cctab.dtx
+2023/01/24 | 82707 | macros/latex/contrib/l3kernel/l3clist.dtx
+2023/01/24 | 87493 | macros/latex/contrib/l3kernel/l3coffins.dtx
+2023/01/24 | 110994 | macros/latex/contrib/l3kernel/l3color.dtx
+2023/01/24 | 43212 | macros/latex/contrib/l3kernel/l3debug.dtx
+2023/01/24 | 23530 | macros/latex/contrib/l3kernel/l3deprecation.dtx
+2023/01/24 | 155616 | macros/latex/contrib/l3kernel/l3doc.dtx
+2023/01/24 | 557803 | macros/latex/contrib/l3kernel/l3doc.pdf
+2023/01/24 | 2390 | macros/latex/contrib/l3kernel/l3docstrip.dtx
+2023/01/24 | 151818 | macros/latex/contrib/l3kernel/l3docstrip.pdf
+2023/01/24 | 106428 | macros/latex/contrib/l3kernel/l3expan.dtx
+2023/01/24 | 136649 | macros/latex/contrib/l3kernel/l3file.dtx
+2023/01/24 | 9436 | macros/latex/contrib/l3kernel/l3flag.dtx
+2023/01/24 | 11781 | macros/latex/contrib/l3kernel/l3fparray.dtx
+2023/01/24 | 7454 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
+2023/01/24 | 47216 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
+2023/01/24 | 84785 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
+2023/01/24 | 19641 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
+2023/01/24 | 70578 | macros/latex/contrib/l3kernel/l3fp.dtx
+2023/01/24 | 49311 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
+2023/01/24 | 51059 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
+2023/01/24 | 23011 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
+2023/01/24 | 105029 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
+2023/01/24 | 25650 | macros/latex/contrib/l3kernel/l3fp-random.dtx
+2023/01/24 | 18531 | macros/latex/contrib/l3kernel/l3fp-round.dtx
+2023/01/24 | 12783 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
+2023/01/24 | 73835 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
+2023/01/24 | 6224 | macros/latex/contrib/l3kernel/l3.ins
+2023/01/24 | 34166 | macros/latex/contrib/l3kernel/l3intarray.dtx
+2023/01/24 | 90018 | macros/latex/contrib/l3kernel/l3int.dtx
+2023/01/24 | 26737 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+2023/01/24 | 127087 | macros/latex/contrib/l3kernel/l3keys.dtx
+2023/01/24 | 4538 | macros/latex/contrib/l3kernel/l3legacy.dtx
+2023/01/24 | 23866 | macros/latex/contrib/l3kernel/l3luatex.dtx
+2023/01/24 | 74250 | macros/latex/contrib/l3kernel/l3msg.dtx
+2023/01/24 | 82195 | macros/latex/contrib/l3kernel/l3names.dtx
+2023/01/24 | 122710 | macros/latex/contrib/l3kernel/l3news01.pdf
+2023/01/24 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex
+2023/01/24 | 150674 | macros/latex/contrib/l3kernel/l3news02.pdf
+2023/01/24 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
+2023/01/24 | 148706 | macros/latex/contrib/l3kernel/l3news03.pdf
+2023/01/24 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
+2023/01/24 | 114586 | macros/latex/contrib/l3kernel/l3news04.pdf
+2023/01/24 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
+2023/01/24 | 112485 | macros/latex/contrib/l3kernel/l3news05.pdf
+2023/01/24 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
+2023/01/24 | 151569 | macros/latex/contrib/l3kernel/l3news06.pdf
+2023/01/24 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex
+2023/01/24 | 128316 | macros/latex/contrib/l3kernel/l3news07.pdf
+2023/01/24 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
+2023/01/24 | 163456 | macros/latex/contrib/l3kernel/l3news08.pdf
+2023/01/24 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
+2023/01/24 | 250136 | macros/latex/contrib/l3kernel/l3news09.pdf
+2023/01/24 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex
+2023/01/24 | 150283 | macros/latex/contrib/l3kernel/l3news10.pdf
+2023/01/24 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
+2023/01/24 | 170076 | macros/latex/contrib/l3kernel/l3news11.pdf
+2023/01/24 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
+2023/01/24 | 204992 | macros/latex/contrib/l3kernel/l3news12.pdf
+2023/01/24 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
+2023/01/24 | 395876 | macros/latex/contrib/l3kernel/l3news.pdf
+2023/01/24 | 4890 | macros/latex/contrib/l3kernel/l3news.tex
+2023/01/24 | 19161 | macros/latex/contrib/l3kernel/l3pdf.dtx
+2023/01/24 | 45040 | macros/latex/contrib/l3kernel/l3prefixes.csv
+2023/01/24 | 81614 | macros/latex/contrib/l3kernel/l3prefixes.pdf
+2023/01/24 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex
+2023/01/24 | 66654 | macros/latex/contrib/l3kernel/l3prg.dtx
+2023/01/24 | 57974 | macros/latex/contrib/l3kernel/l3prop.dtx
+2023/01/24 | 35441 | macros/latex/contrib/l3kernel/l3quark.dtx
+2023/01/24 | 304752 | macros/latex/contrib/l3kernel/l3regex.dtx
+2023/01/24 | 90470 | macros/latex/contrib/l3kernel/l3seq.dtx
+2023/01/24 | 76279 | macros/latex/contrib/l3kernel/l3skip.dtx
+2023/01/24 | 40704 | macros/latex/contrib/l3kernel/l3sort.dtx
+2023/01/24 | 113427 | macros/latex/contrib/l3kernel/l3str-convert.dtx
+2023/01/24 | 78244 | macros/latex/contrib/l3kernel/l3str.dtx
+2023/01/24 | 296239 | macros/latex/contrib/l3kernel/l3styleguide.pdf
+2023/01/24 | 11884 | macros/latex/contrib/l3kernel/l3styleguide.tex
+2023/01/24 | 242907 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+2023/01/24 | 6267 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
+2023/01/24 | 33655 | macros/latex/contrib/l3kernel/l3sys.dtx
+2023/01/24 | 215443 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
+2023/01/24 | 6169 | macros/latex/contrib/l3kernel/l3term-glossary.tex
+2023/01/24 | 60878 | macros/latex/contrib/l3kernel/l3text-case.dtx
+2023/01/24 | 51006 | macros/latex/contrib/l3kernel/l3text.dtx
+2023/01/24 | 16633 | macros/latex/contrib/l3kernel/l3text-map.dtx
+2023/01/24 | 21665 | macros/latex/contrib/l3kernel/l3text-purify.dtx
+2023/01/24 | 62840 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+2023/01/24 | 145318 | macros/latex/contrib/l3kernel/l3tl.dtx
+2023/01/24 | 118855 | macros/latex/contrib/l3kernel/l3token.dtx
+2023/01/24 | 32409 | macros/latex/contrib/l3kernel/l3unicode.dtx
+2023/01/24 | 3929 | macros/latex/contrib/l3kernel/README.md
+2023/01/24 | 24841 | macros/latex/contrib/l3kernel/source3body.tex
+2023/01/24 | 7323123 | macros/latex/contrib/l3kernel/source3.pdf
+2023/01/24 | 2229 | macros/latex/contrib/l3kernel/source3.tex
+2023/01/24 | 13761468 | macros/latex/contrib/l3kernel.zip
2023/01/16 | 6908 | macros/latex/contrib/l3packages/CHANGELOG.md
2023/01/16 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex
2023/01/16 | 12312 | macros/latex/contrib/l3packages/l3keys2e.dtx
@@ -232051,8 +232051,8 @@
2022/04/26 | 323 | macros/latex/contrib/proflabo/README.md
2022/04/26 | 9327 | macros/latex/contrib/proflabo/tex/ProfLabo.sty
2022/04/26 | 136164 | macros/latex/contrib/proflabo.zip
-2023/01/17 | 32 | macros/latex/contrib/proflycee/doc/basique.csv
-2023/01/17 | 968 | macros/latex/contrib/proflycee/doc/cap.csv
+2023/01/24 | 32 | macros/latex/contrib/proflycee/doc/basique.csv
+2023/01/24 | 968 | macros/latex/contrib/proflycee/doc/cap.csv
2022/10/14 | 10939 | macros/latex/contrib/proflycee/doc/graphics/pl-doc-probas_a.png
2022/10/14 | 10804 | macros/latex/contrib/proflycee/doc/graphics/pl-doc-probas_b.png
2022/10/14 | 7252 | macros/latex/contrib/proflycee/doc/graphics/pl-doc-probas_c.png
@@ -232069,16 +232069,16 @@
2023/01/02 | 9215 | macros/latex/contrib/proflycee/doc/graphics/pl-solve_b.png
2023/01/02 | 10175 | macros/latex/contrib/proflycee/doc/graphics/pl-solve_c.png
2023/01/02 | 10145 | macros/latex/contrib/proflycee/doc/graphics/pl-solve_d.png
-2023/01/17 | 736 | macros/latex/contrib/proflycee/doc/perroquet.csv
-2023/01/17 | 859565 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
-2023/01/17 | 234729 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
+2023/01/24 | 736 | macros/latex/contrib/proflycee/doc/perroquet.csv
+2023/01/24 | 860401 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
+2023/01/24 | 235332 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
2022/11/06 | 712614 | macros/latex/contrib/proflycee/doc/ProfLycee-old-doc.pdf
2022/11/06 | 192682 | macros/latex/contrib/proflycee/doc/ProfLycee-old-doc.tex
-2023/01/17 | 529 | macros/latex/contrib/proflycee/doc/testscript.py
+2023/01/24 | 529 | macros/latex/contrib/proflycee/doc/testscript.py
2022/08/10 | 439 | macros/latex/contrib/proflycee/README.md
2022/11/06 | 112967 | macros/latex/contrib/proflycee/tex/ProfLycee-old.sty
-2023/01/17 | 131832 | macros/latex/contrib/proflycee/tex/ProfLycee.sty
-2023/01/17 | 1810712 | macros/latex/contrib/proflycee.zip
+2023/01/24 | 132398 | macros/latex/contrib/proflycee/tex/ProfLycee.sty
+2023/01/24 | 1811687 | macros/latex/contrib/proflycee.zip
1996/02/05 | 1760 | macros/latex/contrib/progkeys/demo/demo.tex
1996/02/05 | 459 | macros/latex/contrib/progkeys/demo/prog1.tex
1996/02/05 | 347 | macros/latex/contrib/progkeys/demo/prog2.tex
@@ -234635,19 +234635,18 @@
2006/11/29 | 26492 | macros/latex/contrib/siam/soda2e.all
2006/11/29 | 27352 | macros/latex/contrib/siam/sodaptex.all
2010/07/03 | 234801 | macros/latex/contrib/siam.zip
-2003/05/05 | 382 | macros/latex/contrib/sidecap/Makefile
-2003/05/05 | 448 | macros/latex/contrib/sidecap/README
-2003/02/21 | 3615 | macros/latex/contrib/sidecap/sc-test1.tex
-2003/02/21 | 1788 | macros/latex/contrib/sidecap/sc-test2.tex
-2003/02/21 | 1158 | macros/latex/contrib/sidecap/sc-test3.tex
-2003/02/14 | 1215 | macros/latex/contrib/sidecap/sc-test4.tex
-2003/02/14 | 798 | macros/latex/contrib/sidecap/sc-test5.tex
-2003/02/21 | 2104 | macros/latex/contrib/sidecap/sc-test6.tex
-2003/02/21 | 3550 | macros/latex/contrib/sidecap/sc-test-common.tex
-2003/06/06 | 25427 | macros/latex/contrib/sidecap/sidecap.dtx
-2002/08/08 | 925 | macros/latex/contrib/sidecap/sidecap.ins
-2005/07/21 | 156630 | macros/latex/contrib/sidecap/sidecap.pdf
-2005/07/21 | 163100 | macros/latex/contrib/sidecap.zip
+2023/01/24 | 341 | macros/latex/contrib/sidecap/README.md
+2002/05/17 | 2800 | macros/latex/contrib/sidecap/scraggeddemo.tex
+2023/01/24 | 3615 | macros/latex/contrib/sidecap/sc-test1.tex
+2023/01/24 | 1788 | macros/latex/contrib/sidecap/sc-test2.tex
+2023/01/24 | 1158 | macros/latex/contrib/sidecap/sc-test3.tex
+2023/01/24 | 1215 | macros/latex/contrib/sidecap/sc-test4.tex
+2023/01/24 | 798 | macros/latex/contrib/sidecap/sc-test5.tex
+2023/01/24 | 2104 | macros/latex/contrib/sidecap/sc-test6.tex
+2023/01/24 | 24755 | macros/latex/contrib/sidecap/sidecap.dtx
+2023/01/24 | 925 | macros/latex/contrib/sidecap/sidecap.ins
+2023/01/24 | 325718 | macros/latex/contrib/sidecap/sidecap.pdf
+2023/01/24 | 329494 | macros/latex/contrib/sidecap.zip
2020/03/24 | 7069 | macros/latex/contrib/sidenotes/caesar_book.cls
2020/03/24 | 86126 | macros/latex/contrib/sidenotes/caesar_example.pdf
2020/03/24 | 6216 | macros/latex/contrib/sidenotes/caesar_example.tex
@@ -237925,7 +237924,7 @@
2023/01/22 | 13418 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-labelling.tex
2022/06/11 | 10307 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lines.tex
2023/01/23 | 1471 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-lua.tex
-2023/01/23 | 7861 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
+2023/01/24 | 7861 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
2023/01/22 | 12001 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-marking.tex
2023/01/23 | 10850 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-news.tex
2023/01/21 | 12703 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-others.tex
@@ -237941,51 +237940,52 @@
2022/04/18 | 18644 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-styles.tex
2023/01/15 | 17327 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-tools.tex
2022/06/11 | 22352 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-triangles.tex
-2023/01/23 | 1115481 | macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
-2023/01/23 | 21718 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
-2023/01/23 | 5854 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
-2023/01/23 | 3975 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
-2023/01/23 | 10203 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
-2023/01/23 | 7306 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
-2023/01/23 | 3948 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
-2023/01/23 | 4601 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
-2023/01/23 | 13272 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
-2023/01/23 | 14423 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
-2023/01/23 | 4375 | macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
-2023/01/23 | 1978 | macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
-2023/01/23 | 8993 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex
-2023/01/23 | 18295 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex
-2023/01/23 | 25592 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex
-2023/01/23 | 6717 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex
-2023/01/23 | 10839 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex
-2023/01/23 | 6765 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
-2023/01/23 | 6574 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
-2023/01/23 | 8983 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
-2023/01/23 | 3473 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
-2023/01/23 | 10450 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
-2023/01/23 | 18510 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
-2023/01/23 | 5343 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
-2023/01/23 | 6837 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
-2023/01/23 | 10652 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
-2023/01/23 | 4085 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
-2023/01/23 | 17804 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
-2023/01/23 | 11224 | macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
-2023/01/23 | 6526 | macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
-2023/01/23 | 3884 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex
-2023/01/23 | 3496 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex
-2023/01/23 | 19094 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex
-2023/01/23 | 13685 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex
-2023/01/23 | 3056 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
-2023/01/23 | 3497 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
-2023/01/23 | 1224 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
-2023/01/23 | 2268 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
-2023/01/23 | 18272 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
-2023/01/23 | 9000 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
-2023/01/23 | 2749 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
-2023/01/23 | 2987 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
-2023/01/23 | 5841 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
-2023/01/23 | 11597 | macros/latex/contrib/tkz/tkz-euclide/README.md
-2023/01/23 | 1300102 | macros/latex/contrib/tkz/tkz-euclide.zip
+2023/01/24 | 1052327 | macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
+2023/01/24 | 21718 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
+2023/01/24 | 5854 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
+2023/01/24 | 3975 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
+2023/01/24 | 10203 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
+2023/01/24 | 7306 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
+2023/01/24 | 3948 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
+2023/01/24 | 4601 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
+2023/01/24 | 13272 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
+2023/01/24 | 14423 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
+2023/01/24 | 4375 | macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
+2023/01/24 | 1978 | macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
+2023/01/24 | 8993 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex
+2023/01/24 | 18295 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex
+2023/01/24 | 25251 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex
+2023/01/24 | 6717 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex
+2023/01/24 | 10839 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex
+2023/01/24 | 6765 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
+2023/01/24 | 6574 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
+2023/01/24 | 8983 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
+2023/01/24 | 3473 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
+2023/01/24 | 10450 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
+2023/01/24 | 18510 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
+2023/01/24 | 5343 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
+2023/01/24 | 23353 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex
+2023/01/24 | 6837 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
+2023/01/24 | 10652 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
+2023/01/24 | 4085 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
+2023/01/24 | 17804 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
+2023/01/24 | 11224 | macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
+2023/01/24 | 6526 | macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
+2023/01/24 | 3884 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex
+2023/01/24 | 3496 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex
+2023/01/24 | 19094 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex
+2023/01/24 | 11100 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex
+2023/01/24 | 3056 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
+2023/01/24 | 3497 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
+2023/01/24 | 1224 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
+2023/01/24 | 2268 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
+2023/01/24 | 18272 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
+2023/01/24 | 9000 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
+2023/01/24 | 2749 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
+2023/01/24 | 2987 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
+2023/01/24 | 5841 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
+2023/01/24 | 11839 | macros/latex/contrib/tkz/tkz-euclide/README.md
+2023/01/24 | 1243317 | macros/latex/contrib/tkz/tkz-euclide.zip
2022/07/15 | 17886 | macros/latex/contrib/tkz/tkzexample/doc/latex/tkzexample.tex
2022/07/15 | 98599 | macros/latex/contrib/tkz/tkzexample/doc/tkzexample.pdf
2022/07/15 | 15954 | macros/latex/contrib/tkz/tkzexample/latex/tkzexample.sty
@@ -269417,23 +269417,6 @@
2009/07/10 | 2126151 | obsolete/macros/context/contrib/context-taspresent.zip
2002/12/17 | 13381 | obsolete/macros/generic/diagrams/barr/diagdoc.tex
2002/12/17 | 36904 | obsolete/macros/generic/diagrams/barr/diagram.tex
-2022/02/13 | 123427 | obsolete/macros/generic/expkv-cs/expkv-cs.dtx
-2022/02/13 | 470406 | obsolete/macros/generic/expkv-cs/expkv-cs.pdf
-2022/02/13 | 1296 | obsolete/macros/generic/expkv-cs/README.md
-2022/02/13 | 484706 | obsolete/macros/generic/expkv-cs.zip
-2022/01/29 | 86723 | obsolete/macros/generic/expkv-def/expkv-def.dtx
-2022/01/29 | 424547 | obsolete/macros/generic/expkv-def/expkv-def.pdf
-2022/01/29 | 1268 | obsolete/macros/generic/expkv-def/README.md
-2022/01/29 | 431295 | obsolete/macros/generic/expkv-def.zip
-2021/09/21 | 115615 | obsolete/macros/generic/expkv/expkv.dtx
-2021/09/21 | 490757 | obsolete/macros/generic/expkv/expkv.pdf
-2021/04/05 | 29651 | obsolete/macros/generic/expkv-opt/expkv-opt-2020-10-10.dtx
-2021/04/05 | 33095 | obsolete/macros/generic/expkv-opt/expkv-opt.dtx
-2021/04/05 | 268534 | obsolete/macros/generic/expkv-opt/expkv-opt.pdf
-2021/04/05 | 1126 | obsolete/macros/generic/expkv-opt/README.md
-2021/04/05 | 279098 | obsolete/macros/generic/expkv-opt.zip
-2021/09/21 | 1431 | obsolete/macros/generic/expkv/README.md
-2021/09/21 | 508252 | obsolete/macros/generic/expkv.zip
1993/01/18 | 9453 | obsolete/macros/generic/proofs/taylor/boxproof-old.tex
1999/12/02 | 21467 | obsolete/macros/generic/proofs/taylor/boxproof.tex
1990/08/29 | 12844 | obsolete/macros/latex209/contrib/aaai/aaai-doc.tex
@@ -287901,7 +287884,7 @@
2022/03/15 | 1034648 | systems/texlive/tlnet/archive/asymptote.armhf-linux.r62706.tar.xz
2019/02/28 | 526632 | systems/texlive/tlnet/archive/asymptote-by-example-zh-cn.doc.r15878.tar.xz
2019/02/28 | 388 | systems/texlive/tlnet/archive/asymptote-by-example-zh-cn.r15878.tar.xz
-2022/09/24 | 2383368 | systems/texlive/tlnet/archive/asymptote.doc.r64491.tar.xz
+2023/01/24 | 2383376 | systems/texlive/tlnet/archive/asymptote.doc.r65614.tar.xz
2019/02/28 | 373604 | systems/texlive/tlnet/archive/asymptote-faq-zh-cn.doc.r15878.tar.xz
2019/02/28 | 380 | systems/texlive/tlnet/archive/asymptote-faq-zh-cn.r15878.tar.xz
2022/03/10 | 1174236 | systems/texlive/tlnet/archive/asymptote.i386-cygwin.r62546.tar.xz
@@ -287910,7 +287893,7 @@
2022/03/21 | 1428832 | systems/texlive/tlnet/archive/asymptote.i386-solaris.r62823.tar.xz
2019/02/28 | 898452 | systems/texlive/tlnet/archive/asymptote-manual-zh-cn.doc.r15878.tar.xz
2019/02/28 | 400 | systems/texlive/tlnet/archive/asymptote-manual-zh-cn.r15878.tar.xz
-2022/09/24 | 360716 | systems/texlive/tlnet/archive/asymptote.r64491.tar.xz
+2023/01/24 | 360716 | systems/texlive/tlnet/archive/asymptote.r65614.tar.xz
2022/03/11 | 5460840 | systems/texlive/tlnet/archive/asymptote.universal-darwin.r62610.tar.xz
2022/03/09 | 7536576 | systems/texlive/tlnet/archive/asymptote.win32.r62530.tar.xz
2022/03/10 | 1163024 | systems/texlive/tlnet/archive/asymptote.x86_64-cygwin.r62545.tar.xz
@@ -288102,7 +288085,7 @@
2021/02/07 | 136588 | systems/texlive/tlnet/archive/babel-danish.doc.r57642.tar.xz
2021/02/07 | 2488 | systems/texlive/tlnet/archive/babel-danish.r57642.tar.xz
2021/02/07 | 5792 | systems/texlive/tlnet/archive/babel-danish.source.r57642.tar.xz
-2022/12/27 | 889104 | systems/texlive/tlnet/archive/babel.doc.r65366.tar.xz
+2023/01/24 | 903660 | systems/texlive/tlnet/archive/babel.doc.r65614.tar.xz
2021/08/30 | 157392 | systems/texlive/tlnet/archive/babel-dutch.doc.r60362.tar.xz
2021/08/30 | 2920 | systems/texlive/tlnet/archive/babel-dutch.r60362.tar.xz
2021/08/30 | 7968 | systems/texlive/tlnet/archive/babel-dutch.source.r60362.tar.xz
@@ -288188,7 +288171,7 @@
2021/07/10 | 146580 | systems/texlive/tlnet/archive/babel-portuges.doc.r59883.tar.xz
2021/07/10 | 2828 | systems/texlive/tlnet/archive/babel-portuges.r59883.tar.xz
2021/07/10 | 6692 | systems/texlive/tlnet/archive/babel-portuges.source.r59883.tar.xz
-2022/12/27 | 195500 | systems/texlive/tlnet/archive/babel.r65366.tar.xz
+2023/01/24 | 196076 | systems/texlive/tlnet/archive/babel.r65614.tar.xz
2021/04/07 | 113056 | systems/texlive/tlnet/archive/babel-romanian.doc.r58776.tar.xz
2021/04/07 | 2124 | systems/texlive/tlnet/archive/babel-romanian.r58776.tar.xz
2021/04/07 | 4308 | systems/texlive/tlnet/archive/babel-romanian.source.r58776.tar.xz
@@ -288219,7 +288202,7 @@
2021/11/07 | 209804 | systems/texlive/tlnet/archive/babel-sorbian.doc.r60975.tar.xz
2021/11/07 | 3156 | systems/texlive/tlnet/archive/babel-sorbian.r60975.tar.xz
2021/11/07 | 6328 | systems/texlive/tlnet/archive/babel-sorbian.source.r60975.tar.xz
-2022/12/27 | 723552 | systems/texlive/tlnet/archive/babel.source.r65366.tar.xz
+2023/01/24 | 725032 | systems/texlive/tlnet/archive/babel.source.r65614.tar.xz
2021/05/28 | 183140 | systems/texlive/tlnet/archive/babel-spanish.doc.r59367.tar.xz
2021/05/28 | 8876 | systems/texlive/tlnet/archive/babel-spanish.r59367.tar.xz
2021/05/28 | 29800 | systems/texlive/tlnet/archive/babel-spanish.source.r59367.tar.xz
@@ -290586,8 +290569,8 @@
2019/02/28 | 768 | systems/texlive/tlnet/archive/dickimaw.r32925.tar.xz
2019/02/28 | 19784 | systems/texlive/tlnet/archive/dictsym.doc.r20031.tar.xz
2019/02/28 | 31568 | systems/texlive/tlnet/archive/dictsym.r20031.tar.xz
-2023/01/17 | 1326872 | systems/texlive/tlnet/archive/diffcoeff.doc.r65559.tar.xz
-2023/01/17 | 11116 | systems/texlive/tlnet/archive/diffcoeff.r65559.tar.xz
+2023/01/24 | 1326872 | systems/texlive/tlnet/archive/diffcoeff.doc.r65614.tar.xz
+2023/01/24 | 11116 | systems/texlive/tlnet/archive/diffcoeff.r65614.tar.xz
2022/12/06 | 340 | systems/texlive/tlnet/archive/digestif.aarch64-linux.r65210.tar.xz
2022/12/06 | 344 | systems/texlive/tlnet/archive/digestif.amd64-freebsd.r65210.tar.xz
2022/12/06 | 344 | systems/texlive/tlnet/archive/digestif.amd64-netbsd.r65210.tar.xz
@@ -291043,13 +291026,13 @@
2022/03/02 | 1633908 | systems/texlive/tlnet/archive/dvisvgm.amd64-freebsd.r62332.tar.xz
2022/03/02 | 1797964 | systems/texlive/tlnet/archive/dvisvgm.amd64-netbsd.r62310.tar.xz
2022/04/21 | 1532360 | systems/texlive/tlnet/archive/dvisvgm.armhf-linux.r63092.tar.xz
-2022/08/24 | 107332 | systems/texlive/tlnet/archive/dvisvgm.doc.r64182.tar.xz
+2023/01/24 | 107332 | systems/texlive/tlnet/archive/dvisvgm.doc.r65614.tar.xz
2022/03/03 | 1765660 | systems/texlive/tlnet/archive/dvisvgm.i386-cygwin.r62359.tar.xz
2022/03/02 | 1584792 | systems/texlive/tlnet/archive/dvisvgm.i386-freebsd.r62332.tar.xz
2022/03/02 | 1889744 | systems/texlive/tlnet/archive/dvisvgm.i386-linux.r62330.tar.xz
2022/03/02 | 1778072 | systems/texlive/tlnet/archive/dvisvgm.i386-netbsd.r62310.tar.xz
2022/03/02 | 1936672 | systems/texlive/tlnet/archive/dvisvgm.i386-solaris.r62332.tar.xz
-2022/08/24 | 880 | systems/texlive/tlnet/archive/dvisvgm.r64182.tar.xz
+2023/01/24 | 880 | systems/texlive/tlnet/archive/dvisvgm.r65614.tar.xz
2022/03/05 | 2649428 | systems/texlive/tlnet/archive/dvisvgm.universal-darwin.r62421.tar.xz
2022/05/22 | 1518060 | systems/texlive/tlnet/archive/dvisvgm.win32.r63357.tar.xz
2022/03/03 | 1738740 | systems/texlive/tlnet/archive/dvisvgm.x86_64-cygwin.r62357.tar.xz
@@ -291624,18 +291607,18 @@
2022/05/18 | 7176 | systems/texlive/tlnet/archive/expex-acro.source.r63319.tar.xz
2019/02/28 | 473776 | systems/texlive/tlnet/archive/expex.doc.r44499.tar.xz
2019/02/28 | 19332 | systems/texlive/tlnet/archive/expex.r44499.tar.xz
-2022/02/14 | 457900 | systems/texlive/tlnet/archive/expkv-cs.doc.r62003.tar.xz
-2022/02/14 | 6036 | systems/texlive/tlnet/archive/expkv-cs.r62003.tar.xz
-2022/02/14 | 26964 | systems/texlive/tlnet/archive/expkv-cs.source.r62003.tar.xz
-2022/01/30 | 413008 | systems/texlive/tlnet/archive/expkv-def.doc.r61796.tar.xz
-2022/01/30 | 5552 | systems/texlive/tlnet/archive/expkv-def.r61796.tar.xz
-2022/01/30 | 18824 | systems/texlive/tlnet/archive/expkv-def.source.r61796.tar.xz
-2021/09/22 | 479908 | systems/texlive/tlnet/archive/expkv.doc.r60573.tar.xz
-2021/04/07 | 264172 | systems/texlive/tlnet/archive/expkv-opt.doc.r58772.tar.xz
-2021/04/07 | 2908 | systems/texlive/tlnet/archive/expkv-opt.r58772.tar.xz
-2021/04/07 | 9288 | systems/texlive/tlnet/archive/expkv-opt.source.r58772.tar.xz
-2021/09/22 | 5124 | systems/texlive/tlnet/archive/expkv.r60573.tar.xz
-2021/09/22 | 28296 | systems/texlive/tlnet/archive/expkv.source.r60573.tar.xz
+2023/01/24 | 457900 | systems/texlive/tlnet/archive/expkv-cs.doc.r65614.tar.xz
+2023/01/24 | 6068 | systems/texlive/tlnet/archive/expkv-cs.r65614.tar.xz
+2023/01/24 | 26964 | systems/texlive/tlnet/archive/expkv-cs.source.r65614.tar.xz
+2023/01/24 | 413012 | systems/texlive/tlnet/archive/expkv-def.doc.r65614.tar.xz
+2023/01/24 | 5588 | systems/texlive/tlnet/archive/expkv-def.r65614.tar.xz
+2023/01/24 | 18824 | systems/texlive/tlnet/archive/expkv-def.source.r65614.tar.xz
+2023/01/24 | 479908 | systems/texlive/tlnet/archive/expkv.doc.r65614.tar.xz
+2023/01/24 | 264172 | systems/texlive/tlnet/archive/expkv-opt.doc.r65614.tar.xz
+2023/01/24 | 2944 | systems/texlive/tlnet/archive/expkv-opt.r65614.tar.xz
+2023/01/24 | 9292 | systems/texlive/tlnet/archive/expkv-opt.source.r65614.tar.xz
+2023/01/24 | 5156 | systems/texlive/tlnet/archive/expkv.r65614.tar.xz
+2023/01/24 | 28300 | systems/texlive/tlnet/archive/expkv.source.r65614.tar.xz
2019/02/28 | 280332 | systems/texlive/tlnet/archive/export.doc.r27206.tar.xz
2019/02/28 | 6396 | systems/texlive/tlnet/archive/export.r27206.tar.xz
2019/02/28 | 9056 | systems/texlive/tlnet/archive/export.source.r27206.tar.xz
@@ -291884,9 +291867,9 @@
2019/08/06 | 202740 | systems/texlive/tlnet/archive/fixcmex.doc.r51825.tar.xz
2019/08/06 | 1400 | systems/texlive/tlnet/archive/fixcmex.r51825.tar.xz
2019/08/06 | 2868 | systems/texlive/tlnet/archive/fixcmex.source.r51825.tar.xz
-2022/10/28 | 261224 | systems/texlive/tlnet/archive/fixdif.doc.r64835.tar.xz
-2022/10/28 | 1812 | systems/texlive/tlnet/archive/fixdif.r64835.tar.xz
-2022/10/28 | 6988 | systems/texlive/tlnet/archive/fixdif.source.r64835.tar.xz
+2023/01/24 | 261224 | systems/texlive/tlnet/archive/fixdif.doc.r65614.tar.xz
+2023/01/24 | 1792 | systems/texlive/tlnet/archive/fixdif.r65614.tar.xz
+2023/01/24 | 6988 | systems/texlive/tlnet/archive/fixdif.source.r65614.tar.xz
2019/02/28 | 50024 | systems/texlive/tlnet/archive/fixfoot.doc.r17131.tar.xz
2019/02/28 | 3280 | systems/texlive/tlnet/archive/fixfoot.r17131.tar.xz
2022/07/24 | 286260 | systems/texlive/tlnet/archive/fixjfm.doc.r63967.tar.xz
@@ -292176,9 +292159,9 @@
2019/02/28 | 41296 | systems/texlive/tlnet/archive/frederika2016.r42157.tar.xz
2019/02/28 | 142332 | systems/texlive/tlnet/archive/frege.doc.r27417.tar.xz
2019/02/28 | 4528 | systems/texlive/tlnet/archive/frege.r27417.tar.xz
-2022/12/27 | 230184 | systems/texlive/tlnet/archive/frenchmath.doc.r65363.tar.xz
-2022/12/27 | 2776 | systems/texlive/tlnet/archive/frenchmath.r65363.tar.xz
-2022/12/27 | 13044 | systems/texlive/tlnet/archive/frenchmath.source.r65363.tar.xz
+2023/01/24 | 230184 | systems/texlive/tlnet/archive/frenchmath.doc.r65614.tar.xz
+2023/01/24 | 2780 | systems/texlive/tlnet/archive/frenchmath.r65614.tar.xz
+2023/01/24 | 13044 | systems/texlive/tlnet/archive/frenchmath.source.r65614.tar.xz
2020/10/20 | 191432 | systems/texlive/tlnet/archive/frimurer.doc.r56704.tar.xz
2020/10/20 | 15456 | systems/texlive/tlnet/archive/frimurer.r56704.tar.xz
2020/10/20 | 4184 | systems/texlive/tlnet/archive/frimurer.source.r56704.tar.xz
@@ -292959,9 +292942,9 @@
2020/01/29 | 9676 | systems/texlive/tlnet/archive/hycolor.source.r53584.tar.xz
2020/09/03 | 329064 | systems/texlive/tlnet/archive/hypdestopt.doc.r56253.tar.xz
2020/09/03 | 2772 | systems/texlive/tlnet/archive/hypdestopt.r56253.tar.xz
-2022/07/05 | 324844 | systems/texlive/tlnet/archive/hypdoc.doc.r63808.tar.xz
-2022/07/05 | 3552 | systems/texlive/tlnet/archive/hypdoc.r63808.tar.xz
-2022/07/05 | 8528 | systems/texlive/tlnet/archive/hypdoc.source.r63808.tar.xz
+2023/01/24 | 324844 | systems/texlive/tlnet/archive/hypdoc.doc.r65614.tar.xz
+2023/01/24 | 3556 | systems/texlive/tlnet/archive/hypdoc.r65614.tar.xz
+2023/01/24 | 8528 | systems/texlive/tlnet/archive/hypdoc.source.r65614.tar.xz
2019/12/21 | 471212 | systems/texlive/tlnet/archive/hypdvips.doc.r53197.tar.xz
2019/12/21 | 24028 | systems/texlive/tlnet/archive/hypdvips.r53197.tar.xz
2019/02/28 | 442692 | systems/texlive/tlnet/archive/hyperbar.doc.r48147.tar.xz
@@ -293736,8 +293719,8 @@
2022/08/30 | 2221448 | systems/texlive/tlnet/archive/latex2e-help-texinfo-fr.doc.r64228.tar.xz
2022/08/30 | 444 | systems/texlive/tlnet/archive/latex2e-help-texinfo-fr.r64228.tar.xz
2023/01/16 | 732 | systems/texlive/tlnet/archive/latex2e-help-texinfo.r65552.tar.xz
-2022/02/08 | 873272 | systems/texlive/tlnet/archive/latex2e-help-texinfo-spanish.doc.r61937.tar.xz
-2022/02/08 | 736 | systems/texlive/tlnet/archive/latex2e-help-texinfo-spanish.r61937.tar.xz
+2023/01/24 | 2013468 | systems/texlive/tlnet/archive/latex2e-help-texinfo-spanish.doc.r65614.tar.xz
+2023/01/24 | 740 | systems/texlive/tlnet/archive/latex2e-help-texinfo-spanish.r65614.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latex2man.aarch64-linux.r46208.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latex2man.amd64-freebsd.r16472.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/latex2man.amd64-netbsd.r30191.tar.xz
@@ -294782,13 +294765,13 @@
2019/02/28 | 340 | systems/texlive/tlnet/archive/make4ht.amd64-freebsd.r37750.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/make4ht.amd64-netbsd.r37750.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/make4ht.armhf-linux.r37750.tar.xz
-2022/04/06 | 177016 | systems/texlive/tlnet/archive/make4ht.doc.r62953.tar.xz
+2023/01/24 | 177020 | systems/texlive/tlnet/archive/make4ht.doc.r65613.tar.xz
2019/02/28 | 336 | systems/texlive/tlnet/archive/make4ht.i386-cygwin.r37750.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/make4ht.i386-freebsd.r37750.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/make4ht.i386-linux.r37750.tar.xz
2019/02/28 | 336 | systems/texlive/tlnet/archive/make4ht.i386-netbsd.r37750.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/make4ht.i386-solaris.r37750.tar.xz
-2022/04/06 | 51816 | systems/texlive/tlnet/archive/make4ht.r62953.tar.xz
+2023/01/24 | 51820 | systems/texlive/tlnet/archive/make4ht.r65613.tar.xz
2021/02/25 | 336 | systems/texlive/tlnet/archive/make4ht.universal-darwin.r57908.tar.xz
2019/02/28 | 680 | systems/texlive/tlnet/archive/make4ht.win32.r37750.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/make4ht.x86_64-cygwin.r37750.tar.xz
@@ -298079,8 +298062,8 @@
2019/12/12 | 6840 | systems/texlive/tlnet/archive/selinput.source.r53098.tar.xz
2019/02/28 | 509908 | systems/texlive/tlnet/archive/selnolig.doc.r38721.tar.xz
2019/02/28 | 54008 | systems/texlive/tlnet/archive/selnolig.r38721.tar.xz
-2022/12/04 | 420248 | systems/texlive/tlnet/archive/semantex.doc.r65183.tar.xz
-2022/12/04 | 26516 | systems/texlive/tlnet/archive/semantex.r65183.tar.xz
+2023/01/24 | 420252 | systems/texlive/tlnet/archive/semantex.doc.r65614.tar.xz
+2023/01/24 | 26516 | systems/texlive/tlnet/archive/semantex.r65614.tar.xz
2019/02/28 | 357820 | systems/texlive/tlnet/archive/semantic.doc.r15878.tar.xz
2020/01/31 | 270076 | systems/texlive/tlnet/archive/semantic-markup.doc.r53607.tar.xz
2020/01/31 | 2500 | systems/texlive/tlnet/archive/semantic-markup.r53607.tar.xz
@@ -298896,13 +298879,13 @@
2019/02/28 | 340 | systems/texlive/tlnet/archive/tex4ebook.amd64-freebsd.r37771.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/tex4ebook.amd64-netbsd.r37771.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/tex4ebook.armhf-linux.r37771.tar.xz
-2022/02/19 | 95544 | systems/texlive/tlnet/archive/tex4ebook.doc.r62076.tar.xz
+2023/01/24 | 95544 | systems/texlive/tlnet/archive/tex4ebook.doc.r65613.tar.xz
2019/02/28 | 336 | systems/texlive/tlnet/archive/tex4ebook.i386-cygwin.r37771.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/tex4ebook.i386-freebsd.r37771.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/tex4ebook.i386-linux.r37771.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/tex4ebook.i386-netbsd.r37771.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/tex4ebook.i386-solaris.r37771.tar.xz
-2022/02/19 | 17748 | systems/texlive/tlnet/archive/tex4ebook.r62076.tar.xz
+2023/01/24 | 17760 | systems/texlive/tlnet/archive/tex4ebook.r65613.tar.xz
2021/02/25 | 340 | systems/texlive/tlnet/archive/tex4ebook.universal-darwin.r57908.tar.xz
2019/02/28 | 684 | systems/texlive/tlnet/archive/tex4ebook.win32.r37771.tar.xz
2019/02/28 | 340 | systems/texlive/tlnet/archive/tex4ebook.x86_64-cygwin.r37771.tar.xz
@@ -299175,7 +299158,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
-2023/01/23 | 424228 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65605.tar.xz
+2023/01/24 | 424232 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65608.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz
2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz
@@ -299199,7 +299182,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
-2023/01/23 | 113672 | systems/texlive/tlnet/archive/texlive-scripts.r65605.tar.xz
+2023/01/24 | 113688 | systems/texlive/tlnet/archive/texlive-scripts.r65608.tar.xz
2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz
2022/11/29 | 36264 | systems/texlive/tlnet/archive/texlive-scripts.win32.r65128.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz
@@ -299698,8 +299681,8 @@
2021/01/22 | 8444 | systems/texlive/tlnet/archive/tkz-berge.r57485.tar.xz
2022/07/16 | 40180 | systems/texlive/tlnet/archive/tkz-doc.doc.r63902.tar.xz
2022/07/16 | 536 | systems/texlive/tlnet/archive/tkz-doc.r63902.tar.xz
-2022/09/24 | 1165688 | systems/texlive/tlnet/archive/tkz-euclide.doc.r64491.tar.xz
-2022/09/24 | 39184 | systems/texlive/tlnet/archive/tkz-euclide.r64491.tar.xz
+2023/01/24 | 1171368 | systems/texlive/tlnet/archive/tkz-euclide.doc.r65614.tar.xz
+2023/01/24 | 42236 | systems/texlive/tlnet/archive/tkz-euclide.r65614.tar.xz
2022/07/16 | 96832 | systems/texlive/tlnet/archive/tkzexample.doc.r63908.tar.xz
2022/07/16 | 3872 | systems/texlive/tlnet/archive/tkzexample.r63908.tar.xz
2022/02/09 | 749696 | systems/texlive/tlnet/archive/tkz-fct.doc.r61949.tar.xz
@@ -301076,16 +301059,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
2022/07/17 | 124404 | systems/texlive/tlnet/install-tl
-2023/01/23 | 5829287 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2023/01/23 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2023/01/23 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/01/24 | 5828967 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2023/01/24 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2023/01/24 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2021/04/11 | 4945 | systems/texlive/tlnet/install-tl-windows.bat
-2023/01/23 | 20438049 | systems/texlive/tlnet/install-tl-windows.exe
-2023/01/23 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2023/01/23 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2023/01/23 | 25513705 | systems/texlive/tlnet/install-tl.zip
-2023/01/23 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2023/01/23 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2023/01/24 | 20438062 | systems/texlive/tlnet/install-tl-windows.exe
+2023/01/24 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2023/01/24 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2023/01/24 | 25513708 | systems/texlive/tlnet/install-tl.zip
+2023/01/24 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2023/01/24 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2022/04/03 | 1229 | systems/texlive/tlnet/README.md
2022/04/03 | 0 | systems/texlive/tlnet/TEXLIVE_2022
2023/01/17 | 8401 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -301095,7 +301078,7 @@
2023/01/17 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2023/01/17 | 49938 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2023/01/22 | 7219 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2023/01/23 | 7220 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/01/11 | 216583 | 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
@@ -301138,12 +301121,12 @@
2021/05/16 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2021/12/21 | 5429 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2021/12/21 | 27582 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2023/01/23 | 18009387 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2023/01/23 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2023/01/24 | 18010059 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/01/24 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2022/04/18 | 86658 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2023/01/23 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2023/01/23 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2023/01/23 | 2446668 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2023/01/24 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2023/01/24 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2023/01/24 | 2444244 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2022/09/14 | 58922 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2022/10/04 | 42404 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2021/12/21 | 16130 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -311162,6 +311145,7 @@
2007/02/12 | 395234 | systems/win32/texshell32/WinTeXShell32.zip
2022/09/23 | 2895 | systems/win32/TLW64/00README.TLW64
2022/09/22 | 60444303 | systems/win32/TLW64/gs1000w64full-gpl.exe
+2023/01/23 | 1469767 | systems/win32/TLW64/pdftex.zip
2022/12/26 | 124716603 | systems/win32/TLW64/tl-win64.zip
1996/11/26 | 1822 | systems/win32/tsconfig/readme
1996/11/26 | 30343 | systems/win32/tsconfig/tsconfig.zip
@@ -311381,7 +311365,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
-2023/01/24 | 186 | timestamp
+2023/01/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 55fbb02442..fb5aeb1930 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index f114b30088..aa16d3e424 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,6 +1,280 @@
+2023/01/24 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
+2023/01/24 | 968 | macros/latex/contrib/proflycee/doc/cap.csv
+2023/01/24 | 96041 | macros/latex/contrib/l3experimental/l3galley.dtx
+2023/01/24 | 95544 | systems/texlive/tlnet/archive/tex4ebook.doc.r65613.tar.xz
+2023/01/24 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
+2023/01/24 | 9436 | macros/latex/contrib/l3kernel/l3flag.dtx
+2023/01/24 | 9292 | systems/texlive/tlnet/archive/expkv-opt.source.r65614.tar.xz
+2023/01/24 | 925 | macros/latex/contrib/sidecap/sidecap.ins
+2023/01/24 | 90470 | macros/latex/contrib/l3kernel/l3seq.dtx
+2023/01/24 | 903660 | systems/texlive/tlnet/archive/babel.doc.r65614.tar.xz
+2023/01/24 | 90018 | macros/latex/contrib/l3kernel/l3int.dtx
+2023/01/24 | 9000 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
+2023/01/24 | 8993 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex
+2023/01/24 | 8983 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
+2023/01/24 | 880 | systems/texlive/tlnet/archive/dvisvgm.r65614.tar.xz
+2023/01/24 | 87493 | macros/latex/contrib/l3kernel/l3coffins.dtx
+2023/01/24 | 860401 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
+2023/01/24 | 8528 | systems/texlive/tlnet/archive/hypdoc.source.r65614.tar.xz
+2023/01/24 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
+2023/01/24 | 84785 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
+2023/01/24 | 82707 | macros/latex/contrib/l3kernel/l3clist.dtx
2023/01/24 | 823710 | macros/latex/contrib/diffcoeff/diffcoeff.pdf
+2023/01/24 | 82195 | macros/latex/contrib/l3kernel/l3names.dtx
+2023/01/24 | 81614 | macros/latex/contrib/l3kernel/l3prefixes.pdf
+2023/01/24 | 798 | macros/latex/contrib/sidecap/sc-test5.tex
+2023/01/24 | 79792 | macros/latex/contrib/l3kernel/l3box.dtx
+2023/01/24 | 7861 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
+2023/01/24 | 78244 | macros/latex/contrib/l3kernel/l3str.dtx
+2023/01/24 | 7734 | macros/latex/contrib/l3experimental/CHANGELOG.md
+2023/01/24 | 76279 | macros/latex/contrib/l3kernel/l3skip.dtx
+2023/01/24 | 7454 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
+2023/01/24 | 74250 | macros/latex/contrib/l3kernel/l3msg.dtx
+2023/01/24 | 740 | systems/texlive/tlnet/archive/latex2e-help-texinfo-spanish.r65614.tar.xz
+2023/01/24 | 73835 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
+2023/01/24 | 736 | macros/latex/contrib/proflycee/doc/perroquet.csv
+2023/01/24 | 7323123 | macros/latex/contrib/l3kernel/source3.pdf
+2023/01/24 | 7306 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
+2023/01/24 | 725032 | systems/texlive/tlnet/archive/babel.source.r65614.tar.xz
+2023/01/24 | 70859 | macros/latex/contrib/l3kernel/expl3.dtx
+2023/01/24 | 70578 | macros/latex/contrib/l3kernel/l3fp.dtx
+2023/01/24 | 6988 | systems/texlive/tlnet/archive/fixdif.source.r65614.tar.xz
+2023/01/24 | 6837 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
+2023/01/24 | 68290 | macros/latex/contrib/l3kernel/l3candidates.dtx
+2023/01/24 | 679193 | macros/latex/contrib/l3experimental/l3draw-code.pdf
+2023/01/24 | 6765 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
+2023/01/24 | 6717 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex
+2023/01/24 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
+2023/01/24 | 66654 | macros/latex/contrib/l3kernel/l3prg.dtx
+2023/01/24 | 6574 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
+2023/01/24 | 6526 | macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
+2023/01/24 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
+2023/01/24 | 6433 | macros/latex/contrib/l3kernel/l3news06.tex
+2023/01/24 | 62840 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+2023/01/24 | 6267 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
+2023/01/24 | 622767 | macros/latex/contrib/l3kernel/expl3.pdf
+2023/01/24 | 6224 | macros/latex/contrib/l3kernel/l3.ins
+2023/01/24 | 6169 | macros/latex/contrib/l3kernel/l3term-glossary.tex
+2023/01/24 | 60878 | macros/latex/contrib/l3kernel/l3text-case.dtx
+2023/01/24 | 6068 | systems/texlive/tlnet/archive/expkv-cs.r65614.tar.xz
+2023/01/24 | 5854 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
+2023/01/24 | 5841 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
+2023/01/24 | 5828967 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2023/01/24 | 58083 | macros/latex/contrib/l3experimental/xgalley.dtx
+2023/01/24 | 57974 | macros/latex/contrib/l3kernel/l3prop.dtx
+2023/01/24 | 5653 | macros/latex/contrib/l3experimental/l3draw-layers.dtx
+2023/01/24 | 5588 | systems/texlive/tlnet/archive/expkv-def.r65614.tar.xz
+2023/01/24 | 557803 | macros/latex/contrib/l3kernel/l3doc.pdf
+2023/01/24 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
+2023/01/24 | 5343 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
+2023/01/24 | 529 | macros/latex/contrib/proflycee/doc/testscript.py
+2023/01/24 | 51820 | systems/texlive/tlnet/archive/make4ht.r65613.tar.xz
+2023/01/24 | 517619 | macros/latex/contrib/l3experimental/l3draw.pdf
+2023/01/24 | 5156 | systems/texlive/tlnet/archive/expkv.r65614.tar.xz
+2023/01/24 | 51059 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
+2023/01/24 | 51006 | macros/latex/contrib/l3kernel/l3text.dtx
+2023/01/24 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
+2023/01/24 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex
+2023/01/24 | 49311 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
+2023/01/24 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2023/01/24 | 4890 | macros/latex/contrib/l3kernel/l3news.tex
+2023/01/24 | 479908 | systems/texlive/tlnet/archive/expkv.doc.r65614.tar.xz
+2023/01/24 | 47216 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
+2023/01/24 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
+2023/01/24 | 4601 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
+2023/01/24 | 457900 | systems/texlive/tlnet/archive/expkv-cs.doc.r65614.tar.xz
+2023/01/24 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2023/01/24 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2023/01/24 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2023/01/24 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/01/24 | 4538 | macros/latex/contrib/l3kernel/l3legacy.dtx
+2023/01/24 | 45040 | macros/latex/contrib/l3kernel/l3prefixes.csv
+2023/01/24 | 4451432 | install/macros/latex/contrib/l3experimental.tds.zip
+2023/01/24 | 4448 | macros/latex/contrib/l3experimental/l3draw-state.dtx
+2023/01/24 | 4414253 | macros/latex/contrib/l3experimental.zip
+2023/01/24 | 4375 | macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
+2023/01/24 | 43537 | macros/latex/contrib/l3kernel/CHANGELOG.md
+2023/01/24 | 4323 | macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+2023/01/24 | 43212 | macros/latex/contrib/l3kernel/l3debug.dtx
+2023/01/24 | 4284 | macros/latex/contrib/l3experimental/README.md
+2023/01/24 | 42558 | macros/latex/contrib/l3experimental/l3draw.dtx
+2023/01/24 | 424232 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65608.tar.xz
+2023/01/24 | 42236 | systems/texlive/tlnet/archive/tkz-euclide.r65614.tar.xz
+2023/01/24 | 420252 | systems/texlive/tlnet/archive/semantex.doc.r65614.tar.xz
+2023/01/24 | 413012 | systems/texlive/tlnet/archive/expkv-def.doc.r65614.tar.xz
+2023/01/24 | 408825 | macros/latex/contrib/l3experimental/l3galley.pdf
+2023/01/24 | 4085 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
+2023/01/24 | 40704 | macros/latex/contrib/l3kernel/l3sort.dtx
+2023/01/24 | 404305 | macros/latex/contrib/l3experimental/l3bitset.pdf
+2023/01/24 | 4036706 | biblio/ctan-bibdata.zip
+2023/01/24 | 4011 | macros/latex/contrib/l3experimental/l3opacity.dtx
+2023/01/24 | 3975 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
+2023/01/24 | 395876 | macros/latex/contrib/l3kernel/l3news.pdf
+2023/01/24 | 3948 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
+2023/01/24 | 394409 | macros/latex/contrib/l3experimental/xcoffins.pdf
+2023/01/24 | 3929 | macros/latex/contrib/l3kernel/README.md
+2023/01/24 | 3884 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex
+2023/01/24 | 382072 | macros/latex/contrib/l3experimental/l3graphics.pdf
+2023/01/24 | 367940 | macros/latex/contrib/l3experimental/l3str-format.pdf
+2023/01/24 | 3641550 | biblio/ctan-bibdata/ctan.pdf
+2023/01/24 | 3615 | macros/latex/contrib/sidecap/sc-test1.tex
+2023/01/24 | 360716 | systems/texlive/tlnet/archive/asymptote.r65614.tar.xz
+2023/01/24 | 36026 | macros/latex/contrib/l3experimental/l3draw-points.dtx
+2023/01/24 | 3556 | systems/texlive/tlnet/archive/hypdoc.r65614.tar.xz
+2023/01/24 | 35441 | macros/latex/contrib/l3kernel/l3quark.dtx
+2023/01/24 | 35092 | macros/latex/contrib/l3experimental/xcoffins.dtx
+2023/01/24 | 3497 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
+2023/01/24 | 3496 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex
+2023/01/24 | 347982 | macros/latex/contrib/l3experimental/l3sys-shell.pdf
+2023/01/24 | 3473 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
2023/01/24 | 34593 | macros/latex/contrib/diffcoeff/diffcoeff.sty
+2023/01/24 | 341 | macros/latex/contrib/sidecap/README.md
+2023/01/24 | 34166 | macros/latex/contrib/l3kernel/l3intarray.dtx
+2023/01/24 | 33655 | macros/latex/contrib/l3kernel/l3sys.dtx
+2023/01/24 | 32 | macros/latex/contrib/proflycee/doc/basique.csv
+2023/01/24 | 329494 | macros/latex/contrib/sidecap.zip
+2023/01/24 | 325718 | macros/latex/contrib/sidecap/sidecap.pdf
+2023/01/24 | 32508 | macros/latex/contrib/l3experimental/l3draw-paths.dtx
+2023/01/24 | 324844 | systems/texlive/tlnet/archive/hypdoc.doc.r65614.tar.xz
+2023/01/24 | 32429 | macros/latex/contrib/l3kernel/l3cctab.dtx
+2023/01/24 | 32409 | macros/latex/contrib/l3kernel/l3unicode.dtx
+2023/01/24 | 31827 | macros/latex/contrib/l3experimental/l3str-format.dtx
+2023/01/24 | 313535 | macros/latex/contrib/l3experimental/l3opacity.pdf
+2023/01/24 | 308483 | macros/latex/contrib/l3experimental/l3benchmark.pdf
+2023/01/24 | 3056 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
+2023/01/24 | 304752 | macros/latex/contrib/l3kernel/l3regex.dtx
+2023/01/24 | 299636 | macros/latex/contrib/l3experimental/xgalley.pdf
+2023/01/24 | 2987 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
+2023/01/24 | 296239 | macros/latex/contrib/l3kernel/l3styleguide.pdf
+2023/01/24 | 2944 | systems/texlive/tlnet/archive/expkv-opt.r65614.tar.xz
+2023/01/24 | 28300 | systems/texlive/tlnet/archive/expkv.source.r65614.tar.xz
+2023/01/24 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex
+2023/01/24 | 2780 | systems/texlive/tlnet/archive/frenchmath.r65614.tar.xz
+2023/01/24 | 2761884 | biblio/ctan-bibdata/ctan.bib
+2023/01/24 | 2749 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
+2023/01/24 | 26964 | systems/texlive/tlnet/archive/expkv-cs.source.r65614.tar.xz
+2023/01/24 | 26737 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+2023/01/24 | 26516 | systems/texlive/tlnet/archive/semantex.r65614.tar.xz
+2023/01/24 | 264172 | systems/texlive/tlnet/archive/expkv-opt.doc.r65614.tar.xz
+2023/01/24 | 261224 | systems/texlive/tlnet/archive/fixdif.doc.r65614.tar.xz
+2023/01/24 | 25753 | macros/latex/contrib/l3experimental/l3graphics.dtx
+2023/01/24 | 25650 | macros/latex/contrib/l3kernel/l3fp-random.dtx
+2023/01/24 | 25513708 | systems/texlive/tlnet/install-tl.zip
+2023/01/24 | 25251 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex
+2023/01/24 | 250136 | macros/latex/contrib/l3kernel/l3news09.pdf
+2023/01/24 | 24841 | macros/latex/contrib/l3kernel/source3body.tex
+2023/01/24 | 24755 | macros/latex/contrib/sidecap/sidecap.dtx
+2023/01/24 | 2444244 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2023/01/24 | 242907 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+2023/01/24 | 2390 | macros/latex/contrib/l3kernel/l3docstrip.dtx
+2023/01/24 | 23866 | macros/latex/contrib/l3kernel/l3luatex.dtx
+2023/01/24 | 2383376 | systems/texlive/tlnet/archive/asymptote.doc.r65614.tar.xz
+2023/01/24 | 235332 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
+2023/01/24 | 23530 | macros/latex/contrib/l3kernel/l3deprecation.dtx
+2023/01/24 | 23353 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex
+2023/01/24 | 230184 | systems/texlive/tlnet/archive/frenchmath.doc.r65614.tar.xz
+2023/01/24 | 23011 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
+2023/01/24 | 2268 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
+2023/01/24 | 2229 | macros/latex/contrib/l3kernel/source3.tex
+2023/01/24 | 21718 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
+2023/01/24 | 21665 | macros/latex/contrib/l3kernel/l3text-purify.dtx
+2023/01/24 | 215443 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
+2023/01/24 | 2104 | macros/latex/contrib/sidecap/sc-test6.tex
+2023/01/24 | 204992 | macros/latex/contrib/l3kernel/l3news12.pdf
+2023/01/24 | 20451 | macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+2023/01/24 | 20438062 | systems/texlive/tlnet/install-tl-windows.exe
+2023/01/24 | 2013468 | systems/texlive/tlnet/archive/latex2e-help-texinfo-spanish.doc.r65614.tar.xz
+2023/01/24 | 1978 | macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
+2023/01/24 | 19641 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
+2023/01/24 | 196076 | systems/texlive/tlnet/archive/babel.r65614.tar.xz
+2023/01/24 | 19161 | macros/latex/contrib/l3kernel/l3pdf.dtx
+2023/01/24 | 19094 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex
+2023/01/24 | 1908 | macros/latex/contrib/l3kernel/interface3.tex
+2023/01/24 | 1906 | macros/latex/contrib/l3experimental/l3draw.ins
+2023/01/24 | 18824 | systems/texlive/tlnet/archive/expkv-def.source.r65614.tar.xz
+2023/01/24 | 18694 | macros/latex/contrib/l3experimental/l3bitset.dtx
+2023/01/24 | 18531 | macros/latex/contrib/l3kernel/l3fp-round.dtx
+2023/01/24 | 18510 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
+2023/01/24 | 18295 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex
+2023/01/24 | 18272 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
+2023/01/24 | 1811687 | macros/latex/contrib/proflycee.zip
+2023/01/24 | 18010059 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/01/24 | 1792 | systems/texlive/tlnet/archive/fixdif.r65614.tar.xz
+2023/01/24 | 1788 | macros/latex/contrib/sidecap/sc-test2.tex
+2023/01/24 | 17804 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
+2023/01/24 | 1779014 | macros/latex/contrib/l3kernel/interface3.pdf
+2023/01/24 | 17760 | systems/texlive/tlnet/archive/tex4ebook.r65613.tar.xz
+2023/01/24 | 177020 | systems/texlive/tlnet/archive/make4ht.doc.r65613.tar.xz
+2023/01/24 | 170076 | macros/latex/contrib/l3kernel/l3news11.pdf
+2023/01/24 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/01/24 | 16633 | macros/latex/contrib/l3kernel/l3text-map.dtx
+2023/01/24 | 16509 | macros/latex/contrib/l3experimental/l3benchmark.dtx
+2023/01/24 | 163456 | macros/latex/contrib/l3kernel/l3news08.pdf
+2023/01/24 | 1624 | macros/latex/contrib/l3experimental/xgalley.ins
+2023/01/24 | 1569 | macros/latex/contrib/l3experimental/xcoffins.ins
+2023/01/24 | 1565 | macros/latex/contrib/l3experimental/l3sys-shell.ins
+2023/01/24 | 1565 | macros/latex/contrib/l3experimental/l3bitset.ins
+2023/01/24 | 1564 | macros/latex/contrib/l3experimental/l3str.ins
+2023/01/24 | 1558 | macros/latex/contrib/l3experimental/l3benchmark.ins
+2023/01/24 | 155616 | macros/latex/contrib/l3kernel/l3doc.dtx
+2023/01/24 | 1553 | macros/latex/contrib/l3experimental/l3graphics.ins
+2023/01/24 | 1547 | macros/latex/contrib/l3experimental/l3opacity.ins
+2023/01/24 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2023/01/24 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2023/01/24 | 151818 | macros/latex/contrib/l3kernel/l3docstrip.pdf
+2023/01/24 | 151569 | macros/latex/contrib/l3kernel/l3news06.pdf
+2023/01/24 | 150674 | macros/latex/contrib/l3kernel/l3news02.pdf
+2023/01/24 | 150283 | macros/latex/contrib/l3kernel/l3news10.pdf
2023/01/24 | 1497 | macros/latex/contrib/diffcoeff/README.txt
+2023/01/24 | 14927 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
+2023/01/24 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
+2023/01/24 | 148706 | macros/latex/contrib/l3kernel/l3news03.pdf
+2023/01/24 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2023/01/24 | 145318 | macros/latex/contrib/l3kernel/l3tl.dtx
+2023/01/24 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2023/01/24 | 14423 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
+2023/01/24 | 14020560 | install/macros/latex/contrib/l3kernel.tds.zip
+2023/01/24 | 13761468 | macros/latex/contrib/l3kernel.zip
+2023/01/24 | 136649 | macros/latex/contrib/l3kernel/l3file.dtx
+2023/01/24 | 1360 | macros/latex/contrib/l3experimental/l3draw-code.tex
+2023/01/24 | 13272 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
+2023/01/24 | 1326872 | systems/texlive/tlnet/archive/diffcoeff.doc.r65614.tar.xz
+2023/01/24 | 132398 | macros/latex/contrib/proflycee/tex/ProfLycee.sty
+2023/01/24 | 13044 | systems/texlive/tlnet/archive/frenchmath.source.r65614.tar.xz
+2023/01/24 | 129434 | macros/latex/contrib/l3kernel/l3basics.dtx
+2023/01/24 | 128316 | macros/latex/contrib/l3kernel/l3news07.pdf
+2023/01/24 | 12783 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
+2023/01/24 | 127087 | macros/latex/contrib/l3kernel/l3keys.dtx
+2023/01/24 | 1243317 | macros/latex/contrib/tkz/tkz-euclide.zip
+2023/01/24 | 12361 | macros/latex/contrib/l3experimental/l3sys-shell.dtx
+2023/01/24 | 122710 | macros/latex/contrib/l3kernel/l3news01.pdf
+2023/01/24 | 1224 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
+2023/01/24 | 1215 | macros/latex/contrib/sidecap/sc-test4.tex
+2023/01/24 | 118855 | macros/latex/contrib/l3kernel/l3token.dtx
+2023/01/24 | 11884 | macros/latex/contrib/l3kernel/l3styleguide.tex
+2023/01/24 | 11839 | macros/latex/contrib/tkz/tkz-euclide/README.md
+2023/01/24 | 11781 | macros/latex/contrib/l3kernel/l3fparray.dtx
+2023/01/24 | 1171368 | systems/texlive/tlnet/archive/tkz-euclide.doc.r65614.tar.xz
+2023/01/24 | 1158 | macros/latex/contrib/sidecap/sc-test3.tex
+2023/01/24 | 114586 | macros/latex/contrib/l3kernel/l3news04.pdf
+2023/01/24 | 113688 | systems/texlive/tlnet/archive/texlive-scripts.r65608.tar.xz
+2023/01/24 | 113427 | macros/latex/contrib/l3kernel/l3str-convert.dtx
+2023/01/24 | 112485 | macros/latex/contrib/l3kernel/l3news05.pdf
+2023/01/24 | 11224 | macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
+2023/01/24 | 11116 | systems/texlive/tlnet/archive/diffcoeff.r65614.tar.xz
+2023/01/24 | 11100 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex
+2023/01/24 | 110994 | macros/latex/contrib/l3kernel/l3color.dtx
+2023/01/24 | 10839 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex
+2023/01/24 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex
+2023/01/24 | 107332 | systems/texlive/tlnet/archive/dvisvgm.doc.r65614.tar.xz
+2023/01/24 | 10652 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
+2023/01/24 | 106428 | macros/latex/contrib/l3kernel/l3expan.dtx
+2023/01/24 | 1052327 | macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
+2023/01/24 | 105029 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
+2023/01/24 | 10450 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
+2023/01/24 | 10203 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
+2023/01/24 | 10136 | macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+2023/01/24 | 10018 | macros/latex/contrib/l3experimental/l3draw-scopes.dtx
2023/01/23 | 99 | graphics/asymptote/base/asy_filetype.vim
2023/01/23 | 99993 | graphics/asymptote/LspCpp/third_party/rapidjson/doc/diagram/utilityclass.png
2023/01/23 | 9923 | graphics/asymptote/profiler.h
@@ -93,11 +367,8 @@
2023/01/23 | 9021 | graphics/asymptote/psfile.h
2023/01/23 | 901 | graphics/asymptote/virtualfieldaccess.cc
2023/01/23 | 900 | graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/range_formatting.h
-2023/01/23 | 9000 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
2023/01/23 | 8 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonchecker/fail16.json
-2023/01/23 | 8993 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex
2023/01/23 | 8993 | macros/latex/contrib/pagelayout/doc/banner.pdf
-2023/01/23 | 8983 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
2023/01/23 | 897 | graphics/asymptote/doc/flowchartdemo.asy
2023/01/23 | 896 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/maxLength.json
2023/01/23 | 895 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/maxLength.json
@@ -236,7 +507,6 @@
2023/01/23 | 78 | graphics/asymptote/examples/randompath3.asy
2023/01/23 | 787 | macros/latex/contrib/fixdif/README.md
2023/01/23 | 7869 | macros/latex/required/babel/base/babel.ins
-2023/01/23 | 7861 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
2023/01/23 | 784 | graphics/asymptote/LspCpp/third_party/uri/deps/CMakeLists.txt
2023/01/23 | 781 | graphics/asymptote/LspCpp/third_party/uri/deps/WORKSPACE
2023/01/23 | 77 | graphics/asymptote/tests/gc/string.asy
@@ -301,7 +571,6 @@
2023/01/23 | 73311 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
2023/01/23 | 7322 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/googletest-break-on-failure-unittest.py
2023/01/23 | 730 | graphics/asymptote/base/shaders/sum1.glsl
-2023/01/23 | 7306 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
2023/01/23 | 7304 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/include/gtest/internal/gtest-string.h
2023/01/23 | 7302 | graphics/asymptote/base/markers.asy
2023/01/23 | 72 | graphics/asymptote/tests/gc/pen.asy
@@ -314,6 +583,7 @@
2023/01/23 | 725 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/minProperties.json
2023/01/23 | 722 | graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/checkToStringStatus.h
2023/01/23 | 7222 | graphics/asymptote/GUI/pyUIClass/widg_addLabel.py
+2023/01/23 | 7220 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/01/23 | 721 | graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentPositionParams.h
2023/01/23 | 7218 | graphics/asymptote/LspCpp/third_party/rapidjson/test/perftest/schematest.cpp
2023/01/23 | 71994 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/Glew/CustomGL/glxew.h
@@ -366,7 +636,6 @@
2023/01/23 | 6849 | graphics/asymptote/LspCpp/third_party/rapidjson/example/archiver/archivertest.cpp
2023/01/23 | 683 | graphics/asymptote/GUI/res/icons/android-close.svg
2023/01/23 | 683 | graphics/asymptote/examples/fractaltree.asy
-2023/01/23 | 6837 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
2023/01/23 | 6818 | graphics/asymptote/LspCpp/third_party/rapidjson/CHANGELOG.md
2023/01/23 | 68126 | graphics/asymptote/prc/PRCTools/describePRC.cc
2023/01/23 | 680 | graphics/asymptote/tests/array/delete.asy
@@ -378,13 +647,11 @@
2023/01/23 | 677 | graphics/asymptote/doc/Bode.asy
2023/01/23 | 677 | graphics/asymptote/base/shaders/vertex.glsl
2023/01/23 | 6772 | graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/main.cc
-2023/01/23 | 6765 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
2023/01/23 | 6751 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/optional/format.json
2023/01/23 | 674 | graphics/asymptote/examples/sqrtx01.asy
2023/01/23 | 6732 | graphics/asymptote/LspCpp/third_party/rapidjson/include/rapidjson/stream.h
2023/01/23 | 6726 | graphics/asymptote/cudareflect/tinyexr/deps/miniz/examples/example3.c
2023/01/23 | 6725 | graphics/asymptote/guide.h
-2023/01/23 | 6717 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex
2023/01/23 | 6717 | graphics/asymptote/GUI/xasyOptions.py
2023/01/23 | 6714 | graphics/asymptote/base/shaders/fragment.glsl
2023/01/23 | 67146 | graphics/asymptote/GUI/xasy2asy.py
@@ -412,7 +679,6 @@
2023/01/23 | 657 | graphics/asymptote/examples/lowupint.asy
2023/01/23 | 657 | graphics/asymptote/examples/100d.views
2023/01/23 | 657 | graphics/asymptote/base/reload.js
-2023/01/23 | 6574 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
2023/01/23 | 6572 | graphics/asymptote/LspCpp/third_party/rapidjson/doc/misc/doxygenextra.css
2023/01/23 | 6553 | graphics/asymptote/cudareflect/tinyexr/examples/deepview/main.cc
2023/01/23 | 6552 | graphics/asymptote/GUI/windows/labelTextEditor.ui
@@ -421,7 +687,6 @@
2023/01/23 | 654 | graphics/asymptote/examples/limit.asy
2023/01/23 | 6543 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/googletest-list-tests-unittest.py
2023/01/23 | 6528 | graphics/asymptote/lspserv.h
-2023/01/23 | 6526 | macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
2023/01/23 | 6525 | graphics/asymptote/drawfill.h
2023/01/23 | 650 | graphics/asymptote/prcfile.h
2023/01/23 | 6503 | graphics/asymptote/tests/types/constructor.asy
@@ -531,13 +796,10 @@
2023/01/23 | 5883 | graphics/asymptote/Delaunay.cc
2023/01/23 | 586 | graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateAccessors.h
2023/01/23 | 586 | graphics/asymptote/GUI/xasyStrings.py
-2023/01/23 | 5854 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
2023/01/23 | 58477 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2023/01/23 | 5841 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
2023/01/23 | 5832 | graphics/asymptote/LspCpp/third_party/rapidjson/test/unittest/fwdtest.cpp
2023/01/23 | 582 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/data/glossary.json
2023/01/23 | 582 | graphics/asymptote/examples/cos3.asy
-2023/01/23 | 5829287 | systems/texlive/tlnet/install-tl-unx.tar.gz
2023/01/23 | 5820 | graphics/asymptote/cudareflect/IrradianceGenerator.vcxproj
2023/01/23 | 581 | graphics/asymptote/examples/BezierSaddle.asy
2023/01/23 | 5818 | graphics/asymptote/LspCpp/include/LibLsp/lsp/IProgressMonitor.h
@@ -605,7 +867,6 @@
2023/01/23 | 5360 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/samples/sample3_unittest.cc
2023/01/23 | 535 | graphics/asymptote/cudareflect/tinyexr/Makefile.llvm-mingw
2023/01/23 | 5358 | graphics/asymptote/LspCpp/src/lsp/working_files.cpp
-2023/01/23 | 5343 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
2023/01/23 | 533 | graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/generateToString.h
2023/01/23 | 533 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/test_savedialog.c
2023/01/23 | 53373 | graphics/asymptote/LspCpp/third_party/uri/deps/googlemock/test/gmock-more-actions_test.cc
@@ -690,7 +951,6 @@
2023/01/23 | 491 | graphics/asymptote/LspCpp/third_party/rapidjson/test/CMakeLists.txt
2023/01/23 | 4919 | graphics/asymptote/process.h
2023/01/23 | 4904 | graphics/asymptote/LspCpp/examples/StdIOServerExample.cpp
-2023/01/23 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2023/01/23 | 489 | graphics/asymptote/patches/gc-7.0nomem.patch
2023/01/23 | 489 | graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/resolveCompletionItem.h
2023/01/23 | 4898 | graphics/asymptote/LspCpp/include/LibLsp/lsp/utils.h
@@ -760,7 +1020,6 @@
2023/01/23 | 4608 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/optional/format.json
2023/01/23 | 4602 | graphics/asymptote/util.h
2023/01/23 | 4602 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/README.md
-2023/01/23 | 4601 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
2023/01/23 | 459 | graphics/asymptote/examples/hierarchy.asy
2023/01/23 | 4597 | graphics/asymptote/drawfill.cc
2023/01/23 | 45956 | systems/win32/miktex/tm/packages/lineno__source.tar.lzma
@@ -770,10 +1029,6 @@
2023/01/23 | 4578 | graphics/asymptote/doc/FAQ/m-post.pl
2023/01/23 | 45774 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
2023/01/23 | 4570 | graphics/asymptote/env.h
-2023/01/23 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2023/01/23 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2023/01/23 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2023/01/23 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2023/01/23 | 455799 | macros/latex/contrib/semantex.zip
2023/01/23 | 454 | graphics/asymptote/EXRFiles.h
2023/01/23 | 453 | graphics/asymptote/LspCpp/include/LibLsp/lsp/lsTextDocumentIdentifier.h
@@ -810,7 +1065,6 @@
2023/01/23 | 43830 | graphics/asymptote/LspCpp/third_party/uri/deps/docs/reference/testing.md
2023/01/23 | 4381 | graphics/asymptote/LspCpp/third_party/rapidjson/test/unittest/filestreamtest.cpp
2023/01/23 | 437 | graphics/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw
-2023/01/23 | 4375 | macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
2023/01/23 | 4375 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/draft-04/schema
2023/01/23 | 43724 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
2023/01/23 | 4371 | graphics/asymptote/cudareflect/kernel.cu
@@ -844,7 +1098,6 @@
2023/01/23 | 4247 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/samples/prime_tables.h
2023/01/23 | 4244 | graphics/asymptote/examples/fin.asy
2023/01/23 | 4242 | graphics/asymptote/tests/types/keyword.asy
-2023/01/23 | 424228 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65605.tar.xz
2023/01/23 | 423 | graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/doc.dir/DependInfo.cmake
2023/01/23 | 423 | graphics/asymptote/doc/log2graph.asy
2023/01/23 | 423 | graphics/asymptote/doc/helix.asy
@@ -885,7 +1138,6 @@
2023/01/23 | 40899 | graphics/asymptote/doc/FAQ/asy-faq.bfnn
2023/01/23 | 4088 | graphics/asymptote/base/plain_boxes.asy
2023/01/23 | 40876 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/googletest-port-test.cc
-2023/01/23 | 4085 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
2023/01/23 | 407 | graphics/asymptote/examples/parametricsurface.asy
2023/01/23 | 407 | graphics/asymptote/examples/BezierPatch.asy
2023/01/23 | 407 | graphics/asymptote/cudareflect/tinyexr/Makefile.gcc-mingw-msys
@@ -893,7 +1145,6 @@
2023/01/23 | 4067 | graphics/asymptote/doc/diatom.csv
2023/01/23 | 40665 | graphics/asymptote/examples/tvgen.asy
2023/01/23 | 4051 | graphics/asymptote/LspCpp/third_party/rapidjson/include/rapidjson/istreamwrapper.h
-2023/01/23 | 4037507 | biblio/ctan-bibdata.zip
2023/01/23 | 4021 | graphics/asymptote/LspCpp/include/LibLsp/lsp/lsp_diagnostic.h
2023/01/23 | 401 | graphics/asymptote/doc/image.asy
2023/01/23 | 401 | graphics/asymptote/cudareflect/tinyexr/test/unit/README.md
@@ -904,7 +1155,6 @@
2023/01/23 | 399977 | systems/win32/miktex/tm/packages/runcode__doc.tar.lzma
2023/01/23 | 398 | graphics/asymptote/examples/epix.asy
2023/01/23 | 398307 | macros/latex/contrib/semantex/semantex.pdf
-2023/01/23 | 3975 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
2023/01/23 | 396 | graphics/asymptote/doc/triangulate.asy
2023/01/23 | 396 | graphics/asymptote/doc/legend.asy
2023/01/23 | 3968 | graphics/asymptote/LspCpp/third_party/rapidjson/include/rapidjson/stringbuffer.h
@@ -913,7 +1163,6 @@
2023/01/23 | 3956 | graphics/asymptote/LspCpp/third_party/rapidjson/test/unittest/itoatest.cpp
2023/01/23 | 395524 | graphics/asymptote/doc/asymptote.texi
2023/01/23 | 39493 | macros/generic/expkv-bundle/pkg-cs.tex
-2023/01/23 | 3948 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
2023/01/23 | 394844 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
2023/01/23 | 39458 | graphics/asymptote/cudareflect/tinyexr/examples/common/cxxopts.hpp
2023/01/23 | 393 | graphics/asymptote/GUI/setup.py
@@ -926,7 +1175,6 @@
2023/01/23 | 38 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonchecker/fail26.json
2023/01/23 | 38 | graphics/asymptote/examples/spring0.asy
2023/01/23 | 388 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/src/common.h
-2023/01/23 | 3884 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex
2023/01/23 | 387 | macros/latex/contrib/hypdoc/README.md
2023/01/23 | 3870 | graphics/asymptote/LspCpp/third_party/uri/test/uri_parse_path_test.cpp
2023/01/23 | 3857 | graphics/asymptote/examples/pipes.asy
@@ -983,7 +1231,6 @@
2023/01/23 | 366 | graphics/asymptote/cudareflect/tinyexr.cc
2023/01/23 | 36540 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/include/gtest/gtest-printers.h
2023/01/23 | 36526 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.cpp
-2023/01/23 | 3642904 | biblio/ctan-bibdata/ctan.pdf
2023/01/23 | 3640 | graphics/asymptote/bbox3.h
2023/01/23 | 363 | graphics/asymptote/LspCpp/third_party/rapidjson/doc/npm.md
2023/01/23 | 3637 | graphics/asymptote/LspCpp/include/LibLsp/lsp/lsResponseError.h
@@ -1030,13 +1277,10 @@
2023/01/23 | 34 | graphics/asymptote/examples/teapotIBL.asy
2023/01/23 | 34 | graphics/asymptote/autogen.sh
2023/01/23 | 349 | graphics/asymptote/examples/logdown.asy
-2023/01/23 | 3497 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
-2023/01/23 | 3496 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex
2023/01/23 | 348 | graphics/asymptote/examples/RiemannSurface.asy
2023/01/23 | 3480 | graphics/asymptote/build-scripts/build-asymptote.dos
2023/01/23 | 347 | graphics/asymptote/LspCpp/third_party/uri/deps/googlemock/cmake/gmock.pc.in
2023/01/23 | 3477 | graphics/asymptote/LspCpp/include/LibLsp/lsp/CodeActionParams.h
-2023/01/23 | 3473 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
2023/01/23 | 3473 | macros/latex/contrib/pagelayout/README.md
2023/01/23 | 3472 | graphics/asymptote/picture.h
2023/01/23 | 3467 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/data/webapp.json
@@ -1160,7 +1404,6 @@
2023/01/23 | 3063 | graphics/asymptote/LspCpp/third_party/uri/src/detail/grammar.hpp
2023/01/23 | 30638 | graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/macro_map.h
2023/01/23 | 3060 | graphics/asymptote/LspCpp/third_party/rapidjson/test/unittest/CMakeLists.txt
-2023/01/23 | 3056 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
2023/01/23 | 30489 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
2023/01/23 | 303 | graphics/asymptote/examples/tensor.asy
2023/01/23 | 3036 | graphics/asymptote/LspCpp/third_party/utfcpp/tests/test_cpp11.cpp
@@ -1190,7 +1433,6 @@
2023/01/23 | 29900 | graphics/asymptote/LspCpp/third_party/uri/deps/docs/faq.md
2023/01/23 | 298 | graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-5ace655ef080932dcc7e4abc9eab1d4f82c845453464993dfa3eb6c5822a1621
2023/01/23 | 2989 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/dependencies.json
-2023/01/23 | 2987 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
2023/01/23 | 2982 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/samples/sample2.h
2023/01/23 | 297 | graphics/asymptote/build-scripts/README-binaries
2023/01/23 | 2979 | graphics/asymptote/doc/diatom.asy
@@ -1251,11 +1493,9 @@
2023/01/23 | 276 | graphics/asymptote/tests/bench/6000circles.asy
2023/01/23 | 27672 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
2023/01/23 | 2766 | graphics/asymptote/lnkX64IconFix.nsh
-2023/01/23 | 2761437 | biblio/ctan-bibdata/ctan.bib
2023/01/23 | 27562 | systems/win32/miktex/tm/packages/proflycee.tar.lzma
2023/01/23 | 2754 | macros/generic/expkv-bundle/impatient.tex
2023/01/23 | 2752879 | systems/win32/miktex/tm/packages/simpleicons.tar.lzma
-2023/01/23 | 2749 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
2023/01/23 | 2745 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/additionalProperties.json
2023/01/23 | 2745 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/additionalProperties.json
2023/01/23 | 2741 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/findOpenGLGlewGlut.lua
@@ -1323,11 +1563,9 @@
2023/01/23 | 256 | graphics/asymptote/doc/shadedtiling.asy
2023/01/23 | 25651 | graphics/asymptote/bezierpatch.cc
2023/01/23 | 2561 | graphics/asymptote/program.h
-2023/01/23 | 25592 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex
2023/01/23 | 25589 | graphics/asymptote/LspCpp/third_party/rapidjson/include/rapidjson/rapidjson.h
2023/01/23 | 2555 | graphics/asymptote/cudareflect/tinyexr/cmake/sanitizers/FindTSan.cmake
2023/01/23 | 2554 | graphics/asymptote/cudareflect/tinyexr/examples/ldr2exr/ldr2exr.cc
-2023/01/23 | 25513705 | systems/texlive/tlnet/install-tl.zip
2023/01/23 | 25503 | graphics/asymptote/LspCpp/third_party/uri/deps/googlemock/include/gmock/gmock-function-mocker.h
2023/01/23 | 254 | graphics/asymptote/examples/parametricelevation.asy
2023/01/23 | 254 | graphics/asymptote/examples/contextfonts.asy
@@ -1380,7 +1618,6 @@
2023/01/23 | 24483 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/googletest-json-output-unittest.py
2023/01/23 | 244814 | macros/latex/contrib/frenchmath.zip
2023/01/23 | 24474 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/googletest-listener-test.cc
-2023/01/23 | 2446668 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2023/01/23 | 2445 | graphics/asymptote/GUI/PrimitiveShape.py
2023/01/23 | 243 | graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/WorkspaceSymbolParams.h
2023/01/23 | 243 | graphics/asymptote/doc/cube.asy
@@ -1456,7 +1693,6 @@
2023/01/23 | 2277 | graphics/asymptote/base/texcolors.asy
2023/01/23 | 2276 | graphics/asymptote/prc/PRCTools/inflation.cc
2023/01/23 | 2272 | graphics/asymptote/cudareflect/tinyexr/examples/rgbe2exr/rgbe2exr.cc
-2023/01/23 | 2268 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
2023/01/23 | 2266 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/not.json
2023/01/23 | 2266 | graphics/asymptote/align.h
2023/01/23 | 22663 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/include/gtest/gtest-param-test.h
@@ -1507,7 +1743,6 @@
2023/01/23 | 217 | graphics/asymptote/LspCpp/include/LibLsp/JsonRpc/GCThreadContext.h
2023/01/23 | 2175 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/gtest_sole_header_test.cc
2023/01/23 | 2175 | graphics/asymptote/LspCpp/third_party/rapidjson/contrib/natvis/LICENSE
-2023/01/23 | 21718 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
2023/01/23 | 2164 | graphics/asymptote/frame.h
2023/01/23 | 216332 | systems/win32/miktex/tm/packages/exesheet__doc.tar.lzma
2023/01/23 | 2161 | graphics/asymptote/LspCpp/include/LibLsp/lsp/working_files.h
@@ -1559,7 +1794,6 @@
2023/01/23 | 205495 | graphics/asymptote/base/colormap.asy
2023/01/23 | 2053 | graphics/asymptote/LspCpp/third_party/uri/test/test_uri.hpp
2023/01/23 | 2045 | graphics/asymptote/LspCpp/third_party/rapidjson/include/rapidjson/internal/clzll.h
-2023/01/23 | 20438049 | systems/texlive/tlnet/install-tl-windows.exe
2023/01/23 | 2040 | graphics/asymptote/LspCpp/include/LibLsp/lsp/location_type.h
2023/01/23 | 2040 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/X11OpenGLWindow.h
2023/01/23 | 203 | graphics/asymptote/LspCpp/include/LibLsp/lsp/general/exit.h
@@ -1596,7 +1830,6 @@
2023/01/23 | 1985 | macros/latex/contrib/pagelayout/doc/example-book.tex
2023/01/23 | 198487 | graphics/asymptote/doc/CAD.pdf
2023/01/23 | 1982 | graphics/asymptote/inst.h
-2023/01/23 | 1978 | macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
2023/01/23 | 1977 | graphics/asymptote/LspCpp/third_party/uri/deps/googlemock/test/gmock-port_test.cc
2023/01/23 | 1975 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/enum.json
2023/01/23 | 1975 | graphics/asymptote/array.h
@@ -1643,7 +1876,6 @@
2023/01/23 | 19136 | graphics/asymptote/LspCpp/third_party/uri/deps/docs/primer.md
2023/01/23 | 191212 | systems/win32/miktex/tm/packages/proflycee__source.tar.lzma
2023/01/23 | 1910 | graphics/asymptote/examples/linearregression.asy
-2023/01/23 | 19094 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex
2023/01/23 | 19040 | macros/latex/contrib/pagelayout/LICENSE
2023/01/23 | 190044 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/DroidSans.ttf
2023/01/23 | 18 | graphics/asymptote/tests/output/circle.asy
@@ -1682,7 +1914,6 @@
2023/01/23 | 18578 | graphics/asymptote/application.cc
2023/01/23 | 1852 | graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/hover.h
2023/01/23 | 1851 | graphics/asymptote/drawclipbegin.h
-2023/01/23 | 18510 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
2023/01/23 | 184 | graphics/asymptote/examples/roll.asy
2023/01/23 | 18493 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
2023/01/23 | 18474 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/src/gtest-printers.cc
@@ -1699,9 +1930,7 @@
2023/01/23 | 1830 | graphics/asymptote/LspCpp/third_party/uri/src/detail/uri_percent_encode.hpp
2023/01/23 | 182 | graphics/asymptote/tests/string/find.asy
2023/01/23 | 182 | graphics/asymptote/examples/label3.asy
-2023/01/23 | 18295 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex
2023/01/23 | 1828 | graphics/asymptote/beziercurve.cc
-2023/01/23 | 18272 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
2023/01/23 | 182157 | macros/latex/contrib/semantex/semantex.tex
2023/01/23 | 1819 | graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/colorPresentation.h
2023/01/23 | 18197 | macros/generic/expkv-bundle/pkg-pop.tex
@@ -1710,7 +1939,6 @@
2023/01/23 | 18095 | graphics/asymptote/doc/asy-latex.dtx
2023/01/23 | 1808 | graphics/asymptote/GUI/res/icons.qrc
2023/01/23 | 1805 | graphics/asymptote/patches/cygwin_freeglut-3.0.0.patch
-2023/01/23 | 18009387 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
2023/01/23 | 17 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonchecker/fail2.json
2023/01/23 | 17993 | graphics/asymptote/LspCpp/third_party/rapidjson/doc/schema.md
2023/01/23 | 17992 | systems/win32/miktex/tm/packages/simpleicons__source.tar.lzma
@@ -1720,7 +1948,6 @@
2023/01/23 | 1794 | graphics/asymptote/fftw++.cc
2023/01/23 | 17907 | graphics/asymptote/LspCpp/third_party/rapidjson/test/unittest/writertest.cpp
2023/01/23 | 178 | graphics/asymptote/fftw++asy.cc
-2023/01/23 | 17804 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
2023/01/23 | 177 | graphics/asymptote/runpath.h
2023/01/23 | 177 | graphics/asymptote/examples/curvedlabel.asy
2023/01/23 | 17798 | graphics/asymptote/runfile.cc
@@ -1771,7 +1998,6 @@
2023/01/23 | 1688 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/ThirdPartyLibs/nativefiledialog/test/SConstruct
2023/01/23 | 167 | graphics/asymptote/cudareflect/tinyexr/examples/nornalmap/Makefile
2023/01/23 | 1678 | macros/latex/contrib/pagelayout/scripts/textestvis.1
-2023/01/23 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2023/01/23 | 1675 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/production.cc
2023/01/23 | 16705 | graphics/asymptote/cudareflect/tinyexr/deps/miniz/ChangeLog.md
2023/01/23 | 1666610 | graphics/asymptote/ChangeLog
@@ -1848,7 +2074,6 @@
2023/01/23 | 15451 | graphics/asymptote/types.h
2023/01/23 | 1544 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/divisibleBy.json
2023/01/23 | 1542 | graphics/asymptote/GUI/xasyUtils.py
-2023/01/23 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
2023/01/23 | 153 | graphics/asymptote/runlabel.h
2023/01/23 | 15393 | graphics/asymptote/LspCpp/third_party/rapidjson/doc/dom.zh-cn.md
2023/01/23 | 1538 | graphics/asymptote/LspCpp/third_party/uri/deps/googlemock/README.md
@@ -1858,7 +2083,6 @@
2023/01/23 | 1532 | graphics/asymptote/LspCpp/src/jsonrpc/MessageJsonHandler.cpp
2023/01/23 | 1531 | graphics/asymptote/LspCpp/third_party/uri/src/cmake_install.cmake
2023/01/23 | 15318 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/BUILD.bazel
-2023/01/23 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
2023/01/23 | 15277 | graphics/asymptote/base/flowchart.asy
2023/01/23 | 1525 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/multipleOf.json
2023/01/23 | 15253 | graphics/asymptote/runlabel.cc
@@ -1892,10 +2116,10 @@
2023/01/23 | 146 | graphics/asymptote/doc/slopefield1.asy
2023/01/23 | 146 | graphics/asymptote/cudareflect/tinyexr/examples/deepview/Makefile
2023/01/23 | 1469 | graphics/asymptote/doc/png/Makefile.in
+2023/01/23 | 1469767 | systems/win32/TLW64/pdftex.zip
2023/01/23 | 1467 | graphics/asymptote/GUI/res/icons/android-hand.svg
2023/01/23 | 14651 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/include/gtest/gtest-death-test.h
2023/01/23 | 1461 | graphics/asymptote/examples/logo3.asy
-2023/01/23 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
2023/01/23 | 145 | graphics/asymptote/examples/star.asy
2023/01/23 | 1457985 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
2023/01/23 | 14575 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/cmake/internal_utils.cmake
@@ -1906,12 +2130,10 @@
2023/01/23 | 1452 | graphics/asymptote/LspCpp/third_party/rapidjson/test/unittest/platformtest.cpp
2023/01/23 | 145103 | macros/latex/contrib/diffcoeff/diffcoeff.tex
2023/01/23 | 145014 | graphics/asymptote/LspCpp/third_party/uri/deps/docs/gmock_cook_book.md
-2023/01/23 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2023/01/23 | 144 | graphics/asymptote/doc/latexmkrc
2023/01/23 | 1449 | graphics/asymptote/GUI/SetCustomAnchor.py
2023/01/23 | 14454 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
2023/01/23 | 1443657 | macros/latex/contrib/diffcoeff.zip
-2023/01/23 | 14423 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
2023/01/23 | 1441 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonchecker/pass1.json
2023/01/23 | 143 | graphics/asymptote/tests/gc/label.asy
2023/01/23 | 1438 | graphics/asymptote/LspCpp/include/LibLsp/lsp/lsFormattingOptions.h
@@ -1958,7 +2180,6 @@
2023/01/23 | 1375 | graphics/asymptote/base/tree.asy
2023/01/23 | 13712 | macros/generic/expkv-bundle/comparison.tex
2023/01/23 | 136 | graphics/asymptote/examples/latticeshading.asy
-2023/01/23 | 13685 | macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex
2023/01/23 | 13663 | graphics/asymptote/doc/install-sh
2023/01/23 | 13663 | graphics/asymptote/doc/FAQ/install-sh
2023/01/23 | 13615 | graphics/asymptote/entry.h
@@ -1988,7 +2209,6 @@
2023/01/23 | 132 | graphics/asymptote/tests/string/length.asy
2023/01/23 | 132 | graphics/asymptote/cudareflect/tinyexr/test/unit/regression/poc-d5c9c893e559277a3320c196523095b94db93985620ac338d037487e0e613047_min
2023/01/23 | 132742 | graphics/asymptote/LspCpp/third_party/rapidjson/include/rapidjson/document.h
-2023/01/23 | 13272 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
2023/01/23 | 13217 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/type.json
2023/01/23 | 1318 | graphics/asymptote/LspCpp/include/LibLsp/lsp/ProcessIoService.h
2023/01/23 | 1318 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/OpenGLWindow/Win32InternalWindowData.h
@@ -2001,7 +2221,6 @@
2023/01/23 | 130982 | graphics/asymptote/ReleaseNotes
2023/01/23 | 13060 | graphics/asymptote/LspCpp/third_party/uri/deps/googletest/test/gtest-unittest-api_test.cc
2023/01/23 | 1302 | graphics/asymptote/GUI/res/icons/android-color-palette.svg
-2023/01/23 | 1300102 | macros/latex/contrib/tkz/tkz-euclide.zip
2023/01/23 | 12 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonchecker/fail33.json
2023/01/23 | 129 | graphics/asymptote/tests/gc/struct.asy
2023/01/23 | 129 | graphics/asymptote/base/shaders/screen.glsl
@@ -2060,7 +2279,6 @@
2023/01/23 | 12321 | graphics/asymptote/LspCpp/third_party/uri/deps/googlemock/test/gmock-cardinalities_test.cc
2023/01/23 | 1226 | graphics/asymptote/GUI/res/icons/triangle-stroked-15.svg
2023/01/23 | 12259 | graphics/asymptote/knot.h
-2023/01/23 | 1224 | macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
2023/01/23 | 121 | graphics/asymptote/doc/labelsquare.asy
2023/01/23 | 121 | graphics/asymptote/cudareflect/tinyexr/tinyexr.cc
2023/01/23 | 1219 | graphics/asymptote/LspCpp/include/LibLsp/lsp/general/lsClientCapabilities.h
@@ -2120,7 +2338,6 @@
2023/01/23 | 1162 | graphics/asymptote/cudareflect/tinyexr/deps/miniz/LICENSE
2023/01/23 | 116010 | graphics/asymptote/predicates.cc
2023/01/23 | 115 | graphics/asymptote/doc/onecontour.asy
-2023/01/23 | 11597 | macros/latex/contrib/tkz/tkz-euclide/README.md
2023/01/23 | 1158 | graphics/asymptote/LspCpp/include/LibLsp/lsp/extention/jdtls/codeActionResult.h
2023/01/23 | 115701 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
2023/01/23 | 1156 | graphics/asymptote/cudareflect/tinyexr/premake4.lua
@@ -2143,7 +2360,6 @@
2023/01/23 | 11373 | graphics/asymptote/base/plain_markers.asy
2023/01/23 | 1136 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/items.json
2023/01/23 | 1136 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft3/items.json
-2023/01/23 | 113672 | systems/texlive/tlnet/archive/texlive-scripts.r65605.tar.xz
2023/01/23 | 11360 | systems/win32/miktex/tm/packages/fancyvrb__source.tar.lzma
2023/01/23 | 113565 | graphics/asymptote/cudareflect/tinyexr/examples/common/stb_image_resize.h
2023/01/23 | 1131 | graphics/asymptote/gl-matrix-2.4.0-pruned/LICENSE.js
@@ -2152,7 +2368,6 @@
2023/01/23 | 1127425 | graphics/asymptote/cudareflect/tinyexr/asakusa.exr
2023/01/23 | 1126 | graphics/asymptote/coenv.cc
2023/01/23 | 11269 | graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/SemanticTokens.h
-2023/01/23 | 11224 | macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
2023/01/23 | 11221 | graphics/asymptote/jsfile.cc
2023/01/23 | 1120 | graphics/asymptote/examples/animations/wheel.asy
2023/01/23 | 1120 | graphics/asymptote/base/external.asy
@@ -2160,7 +2375,6 @@
2023/01/23 | 111 | graphics/asymptote/examples/shadestroke.asy
2023/01/23 | 1118 | graphics/asymptote/LspCpp/third_party/uri/deps/docs/samples.md
2023/01/23 | 1116 | graphics/asymptote/LspCpp/third_party/uri/test/valid_urls.txt
-2023/01/23 | 1115481 | macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
2023/01/23 | 1114 | graphics/asymptote/examples/laserlattice.asy
2023/01/23 | 11146 | graphics/asymptote/LspCpp/third_party/rapidjson/readme.md
2023/01/23 | 11123 | macros/latex/contrib/pagelayout/doc/example-text.pdf
@@ -2193,7 +2407,6 @@
2023/01/23 | 1088 | graphics/asymptote/examples/NURBSsphere.asy
2023/01/23 | 10850 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-news.tex
2023/01/23 | 10840 | graphics/asymptote/base/CAD.asy
-2023/01/23 | 10839 | macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex
2023/01/23 | 1082 | graphics/asymptote/patches/README
2023/01/23 | 107 | graphics/asymptote/LspCpp/third_party/uri/CMakeFiles/doc.dir/compiler_depend.ts
2023/01/23 | 1079 | graphics/asymptote/LspCpp/include/LibLsp/lsp/textDocument/prepareRename.h
@@ -2207,7 +2420,6 @@
2023/01/23 | 10675 | macros/generic/expkv-bundle/preamble-enverb.tex
2023/01/23 | 1066 | graphics/asymptote/LspCpp/LICENSE
2023/01/23 | 1065 | graphics/asymptote/examples/shellmethod.asy
-2023/01/23 | 10652 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
2023/01/23 | 1064 | macros/latex/contrib/pagelayout/doc/2x1.pdf
2023/01/23 | 10641 | graphics/asymptote/LspCpp/third_party/rapidjson/include/rapidjson/encodedstream.h
2023/01/23 | 1063 | graphics/asymptote/LspCpp/third_party/rapidjson/bin/jsonschema/tests/draft4/minimum.json
@@ -2233,7 +2445,6 @@
2023/01/23 | 104 | graphics/asymptote/examples/tiling.asy
2023/01/23 | 1047 | graphics/asymptote/GUI/res/icons/undo.svg
2023/01/23 | 10476 | graphics/asymptote/LspCpp/third_party/uri/deps/googlemock/include/gmock/gmock-nice-strict.h
-2023/01/23 | 10450 | macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
2023/01/23 | 1044671 | graphics/asymptote/cudareflect/tinyexr/examples/exrview/screenshots/exrview.png
2023/01/23 | 10445 | graphics/asymptote/INSTALL
2023/01/23 | 1043 | graphics/asymptote/GUI/res/icons/openpolygon.svg
@@ -2264,7 +2475,6 @@
2023/01/23 | 1022 | graphics/asymptote/GUI/res/icons/centerorigin.svg
2023/01/23 | 10224 | graphics/asymptote/tr.cc
2023/01/23 | 1020 | graphics/asymptote/flatguide.cc
-2023/01/23 | 10203 | macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
2023/01/23 | 1019 | graphics/asymptote/LspCpp/third_party/rapidjson/example/pretty/pretty.cpp
2023/01/23 | 10196 | graphics/asymptote/doc/CAD.tex
2023/01/23 | 10168 | graphics/asymptote/LspCpp/third_party/uri/test/uri_resolve_test.cpp
@@ -2750,7 +2960,6 @@
2023/01/22 | 72296 | macros/texinfo/texinfo/tp/Texinfo/Convert/DocBook.pm
2023/01/22 | 7225 | macros/texinfo/texinfo/tp/t/results/invalid_nestings/item_in_ref.pl
2023/01/22 | 7221 | macros/texinfo/texinfo/tp/t/results/sectioning/contents_at_end_document.pl
-2023/01/22 | 7219 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/01/22 | 7215 | macros/texinfo/texinfo/tp/Texinfo/XSLoader.pm
2023/01/22 | 72095 | macros/texinfo/texinfo/util/Makefile.in
2023/01/22 | 7204 | macros/texinfo/texinfo/tp/t/results/coverage_braces/form_feed_in_brace_commands.pl
@@ -6338,146 +6547,3 @@
2023/01/18 | 11883 | indexing/xindex/doc/tests/demo4.pdf
2023/01/18 | 114 | indexing/xindex/doc/tests/demo3.idx
2023/01/18 | 1048 | systems/texlive/tlnet/archive/gradient-text.r65567.tar.xz
-2023/01/17 | 9960319 | systems/win32/miktex/tm/packages/pgf__doc.tar.lzma
-2023/01/17 | 98515 | systems/win32/miktex/tm/packages/pyluatex__doc.tar.lzma
-2023/01/17 | 98187 | systems/doc/luatex/luatex-nodes.tex
-2023/01/17 | 978 | macros/latex/contrib/exesheet/README.md
-2023/01/17 | 9780 | systems/texlive/tlnet/archive/piton.r65557.tar.xz
-2023/01/17 | 968 | macros/latex/contrib/proflycee/doc/cap.csv
-2023/01/17 | 9249 | macros/latex/contrib/photobook/Makefile
-2023/01/17 | 9190 | macros/latex/contrib/ufrgscca/latex/ufrgscca-en-forms.def
-2023/01/17 | 91655 | macros/latex/contrib/exesheet/exesheet.dtx
-2023/01/17 | 891493 | systems/win32/miktex/tm/packages/l3backend__doc.tar.lzma
-2023/01/17 | 8818 | macros/latex/contrib/ufrgscca/latex/ufrgscca-en-coord.def
-2023/01/17 | 859565 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
-2023/01/17 | 824505 | systems/win32/miktex/tm/packages/tugboat__doc.tar.lzma
-2023/01/17 | 797802 | systems/win32/miktex/tm/packages/xstring__doc.tar.lzma
-2023/01/17 | 7733 | macros/latex/contrib/ufrgscca/latex/ufrgscca-curr-tab.sty
-2023/01/17 | 761651 | macros/xetex/latex/bidi/gull.jpg
-2023/01/17 | 7538 | systems/win32/miktex/tm/packages/firamath-otf__source.tar.lzma
-2023/01/17 | 7418 | macros/latex/contrib/ufrgscca/latex/ufrgscca.cls
-2023/01/17 | 736 | macros/latex/contrib/proflycee/doc/perroquet.csv
-2023/01/17 | 718200 | systems/win32/miktex/tm/packages/pgf.tar.lzma
-2023/01/17 | 6992 | systems/win32/miktex/tm/packages/luaquotes__source.tar.lzma
-2023/01/17 | 6918 | systems/win32/miktex/tm/packages/texfot.tar.lzma
-2023/01/17 | 67753 | systems/win32/miktex/tm/packages/letgut__source.tar.lzma
-2023/01/17 | 65386 | systems/win32/miktex/tm/packages/njuthesis__source.tar.lzma
-2023/01/17 | 63931 | macros/latex/contrib/ufrgscca/doc/ufrgscca.tex
-2023/01/17 | 6101 | macros/xetex/latex/bidi/bidi-doc-latex-pkgsupport.ltx
-2023/01/17 | 601436 | systems/win32/miktex/tm/packages/l3kernel__source.tar.lzma
-2023/01/17 | 5823 | macros/xetex/latex/bidi/bidi-doc-plain-basics.ltx
-2023/01/17 | 56548 | systems/win32/miktex/tm/packages/zennote__doc.tar.lzma
-2023/01/17 | 5605 | macros/latex/contrib/gradient-text/gradient-text.tex
-2023/01/17 | 552461 | macros/latex/contrib/ufrgscca/doc/ufrgscca.pdf
-2023/01/17 | 5515 | systems/win32/miktex/tm/packages/pyluatex.tar.lzma
-2023/01/17 | 550007 | macros/latex/contrib/ufrgscca.zip
-2023/01/17 | 54019 | systems/win32/miktex/tm/packages/diffcoeff__source.tar.lzma
-2023/01/17 | 53814 | systems/win32/miktex/tm/packages/tugboat__source.tar.lzma
-2023/01/17 | 535396 | systems/texlive/tlnet/archive/piton.doc.r65557.tar.xz
-2023/01/17 | 534 | macros/xetex/latex/bidi/bidi-doc.ltx
-2023/01/17 | 5328 | macros/latex/contrib/ufrgscca/latex/ufrgscca-curr.sty
-2023/01/17 | 53029 | systems/win32/miktex/tm/packages/letgut.tar.lzma
-2023/01/17 | 529 | macros/latex/contrib/proflycee/doc/testscript.py
-2023/01/17 | 527211 | systems/win32/miktex/tm/packages/xduts.tar.lzma
-2023/01/17 | 523853 | systems/win32/miktex/tm/packages/piton__doc.tar.lzma
-2023/01/17 | 523576 | systems/texlive/tlnet/archive/xduts.r65556.tar.xz
-2023/01/17 | 49938 | systems/texlive/tlnet/tlpkg/installer/config.guess
-2023/01/17 | 49316 | systems/doc/luatex/luatex-modifications.tex
-2023/01/17 | 4899 | systems/win32/miktex/tm/packages/pyluatex__source.tar.lzma
-2023/01/17 | 4890022 | install/macros/xetex/latex/bidi.tds.zip
-2023/01/17 | 4854 | macros/latex/contrib/ufrgscca/latex/ufrgscca-gen.sty
-2023/01/17 | 4704 | macros/latex/contrib/ufrgscca/README.md
-2023/01/17 | 46190 | systems/win32/miktex/tm/packages/l3packages__source.tar.lzma
-2023/01/17 | 457 | macros/latex/contrib/writeongrid/README.md
-2023/01/17 | 4547 | macros/xetex/latex/bidi/bidi-doc-latex-pkgs.ltx
-2023/01/17 | 44984 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-examples.tex
-2023/01/17 | 4497 | macros/xetex/latex/bidi/bidi-doc-latex-programming.ltx
-2023/01/17 | 4469104 | macros/xetex/latex/bidi.zip
-2023/01/17 | 43943 | systems/doc/luatex/luatex-fonts.tex
-2023/01/17 | 43737 | systems/win32/miktex/tm/packages/xduts__source.tar.lzma
-2023/01/17 | 43296 | systems/texlive/tlnet/archive/xduts.source.r65556.tar.xz
-2023/01/17 | 4212 | macros/latex/contrib/photobook/scripts/cls2tex.sh
-2023/01/17 | 419862 | systems/win32/miktex/tm/packages/luakeys__doc.tar.lzma
-2023/01/17 | 4116 | macros/latex/contrib/ufrgscca/latex/ufrgscca-curr-graph.sty
-2023/01/17 | 4071 | macros/latex/contrib/ufrgscca/latex/ufrgscca-ptBR-core.def
-2023/01/17 | 39134 | systems/win32/miktex/tm/packages/piton__source.tar.lzma
-2023/01/17 | 36983 | systems/doc/luatex/luatex-backend.tex
-2023/01/17 | 3683556 | macros/xetex/latex/bidi/bidi.pdf
-2023/01/17 | 3639 | systems/doc/luatex/luatex.tex
-2023/01/17 | 3596 | macros/xetex/latex/bidi/bidi-doc-preamble.ltx
-2023/01/17 | 33660 | systems/win32/miktex/tm/packages/l3backend__source.tar.lzma
-2023/01/17 | 3337 | systems/win32/miktex/tm/packages/luaquotes.tar.lzma
-2023/01/17 | 33301 | macros/latex/contrib/ufrgscca/latex/ufrgscca-coord.sty
-2023/01/17 | 32 | macros/latex/contrib/proflycee/doc/basique.csv
-2023/01/17 | 329598 | systems/win32/miktex/tm/packages/xduts__doc.tar.lzma
-2023/01/17 | 328236 | systems/texlive/tlnet/archive/xduts.doc.r65556.tar.xz
-2023/01/17 | 30454 | systems/win32/miktex/tm/packages/tugboat.tar.lzma
-2023/01/17 | 2936 | macros/xetex/latex/bidi/bidi-bibitem.pdf
-2023/01/17 | 28944 | systems/texlive/tlnet/archive/piton.source.r65557.tar.xz
-2023/01/17 | 28599 | systems/win32/miktex/tm/packages/texfot__doc.tar.lzma
-2023/01/17 | 281361 | macros/latex/contrib/exesheet/exesheet.pdf
-2023/01/17 | 2698 | macros/latex/contrib/ufrgscca/latex/ufrgscca-lists.sty
-2023/01/17 | 2601 | systems/win32/miktex/tm/packages/zennote__source.tar.lzma
-2023/01/17 | 2563534 | systems/win32/miktex/tm/packages/latex2e-help-texinfo__source.tar.lzma
-2023/01/17 | 2483 | macros/latex/contrib/ufrgscca/latex/ufrgscca-en-core.def
-2023/01/17 | 246278 | macros/latex/contrib/exesheet.zip
-2023/01/17 | 234729 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
-2023/01/17 | 23131 | macros/xetex/latex/bidi/bidi-doc-latex-basics.ltx
-2023/01/17 | 2225 | macros/latex/contrib/ufrgscca/latex/ufrgscca-en-base.def
-2023/01/17 | 22116 | systems/win32/miktex/tm/packages/l3packages.tar.lzma
-2023/01/17 | 2207 | macros/latex/contrib/ufrgscca/latex/ufrgscca-ptBR-base.def
-2023/01/17 | 2108 | macros/xetex/latex/bidi/bidi-doc-title.ltx
-2023/01/17 | 2085304 | systems/texlive/tlnet/archive/kpfonts-otf.doc.r65560.tar.xz
-2023/01/17 | 2073682 | systems/win32/miktex/tm/packages/kpfonts-otf__doc.tar.lzma
-2023/01/17 | 20696 | systems/win32/miktex/tm/packages/kpfonts-otf__source.tar.lzma
-2023/01/17 | 20487 | macros/latex/contrib/ufrgscca/latex/ufrgscca-ppc.sty
-2023/01/17 | 19642 | systems/win32/miktex/tm/packages/njuthesis.tar.lzma
-2023/01/17 | 1961 | macros/xetex/latex/bidi/bidi-doc-plain-programming.ltx
-2023/01/17 | 19521 | macros/latex/contrib/ufrgscca/latex/ufrgscca-forms.sty
-2023/01/17 | 1834934 | systems/win32/miktex/tm/packages/l3packages__doc.tar.lzma
-2023/01/17 | 1810712 | macros/latex/contrib/proflycee.zip
-2023/01/17 | 1786719 | systems/doc/luatex/luatex.pdf
-2023/01/17 | 17725 | systems/win32/miktex/tm/packages/luakeys__source.tar.lzma
-2023/01/17 | 176570 | macros/xetex/latex/bidi/bidi-doc.pdf
-2023/01/17 | 175555 | macros/latex/contrib/photobook.zip
-2023/01/17 | 174977 | systems/win32/miktex/tm/packages/l3kernel.tar.lzma
-2023/01/17 | 1742 | systems/win32/miktex/tm/packages/zennote.tar.lzma
-2023/01/17 | 1699594 | systems/win32/miktex/tm/packages/latex2e-help-texinfo.tar.lzma
-2023/01/17 | 1693 | macros/xetex/latex/bidi/picture.jpg
-2023/01/17 | 16520 | macros/latex/contrib/ufrgscca/latex/ufrgscca-abnt.sty
-2023/01/17 | 1590 | systems/win32/miktex/tm/packages/firamath-otf.tar.lzma
-2023/01/17 | 15745 | systems/win32/miktex/tm/packages/l3backend.tar.lzma
-2023/01/17 | 154144 | macros/latex/contrib/photobook/photobook.cls
-2023/01/17 | 1532 | macros/latex/contrib/gradient-text/gradient-text.sty
-2023/01/17 | 1522 | macros/latex/contrib/photobook/LICENSE
-2023/01/17 | 14438 | macros/latex/contrib/ufrgscca/latex/ufrgscca-ptBR-forms.def
-2023/01/17 | 14432 | systems/win32/miktex/tm/packages/luakeys.tar.lzma
-2023/01/17 | 14405 | macros/latex/contrib/ufrgscca/latex/ufrgscca-ptBR-coord.def
-2023/01/17 | 1417 | macros/xetex/latex/bidi/bidi-doc-intro.ltx
-2023/01/17 | 138172 | macros/latex/contrib/photobook/photobook.pdf
-2023/01/17 | 1352 | systems/texlive/tlnet/archive/firamath-otf.r65561.tar.xz
-2023/01/17 | 1338127 | systems/win32/miktex/tm/packages/letgut__doc.tar.lzma
-2023/01/17 | 1333 | macros/latex/contrib/gradient-text/README.md
-2023/01/17 | 132823 | macros/latex/contrib/gradient-text.zip
-2023/01/17 | 1326872 | systems/texlive/tlnet/archive/diffcoeff.doc.r65559.tar.xz
-2023/01/17 | 1323 | macros/xetex/latex/bidi/README
-2023/01/17 | 131832 | macros/latex/contrib/proflycee/tex/ProfLycee.sty
-2023/01/17 | 131484 | macros/latex/contrib/gradient-text/gradient-text.pdf
-2023/01/17 | 1273362 | systems/win32/miktex/tm/packages/diffcoeff__doc.tar.lzma
-2023/01/17 | 1251 | macros/latex/contrib/photobook/README.md
-2023/01/17 | 1200110 | systems/win32/miktex/tm/packages/njuthesis__doc.tar.lzma
-2023/01/17 | 11916526 | systems/win32/miktex/tm/packages/l3kernel__doc.tar.lzma
-2023/01/17 | 117276 | systems/texlive/tlnet/archive/firamath-otf.doc.r65561.tar.xz
-2023/01/17 | 11491 | macros/latex/contrib/ufrgscca/latex/ufrgscca-cover.sty
-2023/01/17 | 11472 | systems/win32/miktex/tm/packages/xstring.tar.lzma
-2023/01/17 | 11367 | macros/latex/contrib/ufrgscca/latex/ufrgscca-core.sty
-2023/01/17 | 11272 | systems/win32/miktex/tm/packages/diffcoeff.tar.lzma
-2023/01/17 | 11116 | systems/texlive/tlnet/archive/diffcoeff.r65559.tar.xz
-2023/01/17 | 110838 | systems/win32/miktex/tm/packages/firamath-otf__doc.tar.lzma
-2023/01/17 | 1101925 | systems/win32/miktex/tm/packages/kpfonts-otf.tar.lzma
-2023/01/17 | 1091368 | systems/texlive/tlnet/archive/kpfonts-otf.r65560.tar.xz
-2023/01/17 | 1078008 | macros/xetex/latex/bidi/bidi.dtx
-2023/01/17 | 10516 | macros/latex/contrib/photobook/scripts/make-images.sh
-2023/01/17 | 103285 | systems/win32/miktex/tm/packages/luaquotes__doc.tar.lzma
-2023/01/17 | 10308 | macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-angles.tex
-2023/01/17 | 10028 | systems/win32/miktex/tm/packages/piton.tar.lzma
diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib
index 0f8a1a1f66..508d623c45 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-01-2023, 02:00:56
+%% created at 25-01-2023, 02:00:15
%%
%% This file is provided under the terms of the LPPL v1.3 or
@@ -23583,7 +23583,7 @@
title = {The \texttt{expkv-bundle} package},
subtitle = {An expandable key=val implementation and friends},
author = {Jonathan P. Spratte},
- date = {2023-01-23},
+ date = {2023-01-24},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/generic/expkv-bundle},
@@ -23594,51 +23594,55 @@
title = {The \texttt{expkv-cs} package},
subtitle = {Define expandable key=val macros using expkv},
author = {Jonathan P. Spratte},
- date = {2023-01-23},
- version = {1.2},
+ date = {2023-01-24},
license = {lppl1.3c},
- mirror = {https://mirror.ctan.org/obsolete/macros/generic/expkv-cs},
+ mirror = {https://mirror.ctan.org/macros/generic/expkv-bundle},
url = {https://ctan.org/pkg/expkv-cs},
+ annotation = {As of January 2023, this package has been merged into
+ the .},
}
@manual{ctan-expkv-def,
title = {The \texttt{expkv-def} package},
subtitle = {A key-defining frontend for expkv},
author = {Jonathan P. Spratte},
- date = {2023-01-23},
- version = {0.9},
+ date = {2023-01-24},
license = {lppl1.3c},
- mirror = {https://mirror.ctan.org/obsolete/macros/generic/expkv-def},
+ mirror = {https://mirror.ctan.org/macros/generic/expkv-bundle},
url = {https://ctan.org/pkg/expkv-def},
+ annotation = {As of January 2023, this package has been merged into
+ the .},
}
@manual{ctan-expkv-opt,
title = {The \texttt{expkv-opt} package},
subtitle = {Parse class and package options with expkv},
author = {Jonathan P. Spratte},
- date = {2023-01-23},
- version = {0.2},
+ date = {2023-01-24},
license = {lppl1.3c},
- mirror = {https://mirror.ctan.org/obsolete/macros/generic/expkv-opt},
+ mirror = {https://mirror.ctan.org/macros/generic/expkv-bundle},
url = {https://ctan.org/pkg/expkv-opt},
+ annotation = {As of January 2023, this package has been merged into
+ the .},
}
@manual{ctan-expkv,
title = {The \texttt{expkv} package},
subtitle = {An expandable key=val implementation},
author = {Jonathan P. Spratte},
- date = {2023-01-23},
- version = {1.9a},
+ date = {2023-01-24},
license = {lppl1.3c},
- mirror = {https://mirror.ctan.org/obsolete/macros/generic/expkv},
+ mirror = {https://mirror.ctan.org/macros/generic/expkv-bundle},
url = {https://ctan.org/pkg/expkv},
+ annotation = {As of January 2023, this package has been merged into
+ the .},
}
@manual{ctan-expl3,
title = {The \texttt{expl3} package},
subtitle = {Wrapper package for experimental \LaTeX{}3},
author = {{The \LaTeX{} Project Team}},
- date = {2023-01-16},
+ date = {2023-01-24},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3kernel},
@@ -29175,7 +29179,7 @@
title = {The \texttt{gradient-text} package},
subtitle = {Decorate text with linear gradient colors},
author = {Sicheng Du},
- date = {2023-01-17},
+ date = {2023-01-24},
version = {1.2},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/gradient-text},
@@ -36213,7 +36217,7 @@
title = {The \texttt{l3docstrip} package},
subtitle = {Strip documentation in \LaTeX{}3 source},
author = {{The \LaTeX{} Project Team}},
- date = {2023-01-16},
+ date = {2023-01-24},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3kernel},
@@ -36224,7 +36228,7 @@
title = {The \texttt{l3experimental} package},
subtitle = {Experimental \LaTeX{}3 concepts},
author = {{The \LaTeX{} Project Team}},
- date = {2022-04-20},
+ date = {2023-01-24},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3experimental},
@@ -36235,7 +36239,7 @@
title = {The \texttt{l3kernel} package},
subtitle = {LaTeX3 programming conventions},
author = {{The \LaTeX{} Project Team}},
- date = {2023-01-16},
+ date = {2023-01-24},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3kernel},
@@ -36268,7 +36272,7 @@
title = {The \texttt{l3regex} package},
subtitle = {Regular expression facilities for \LaTeX{}},
author = {{The \LaTeX{} Project Team}},
- date = {2023-01-16},
+ date = {2023-01-24},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3kernel/l3regex.dtx},
@@ -49790,7 +49794,7 @@
title = {The \texttt{overarrows} package},
subtitle = {Custom extensible arrows over math expressions},
author = {Julien Labbé},
- date = {2023-01-19},
+ date = {2023-01-24},
version = {1.0.1},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/overarrows},
@@ -50033,7 +50037,7 @@
title = {The \texttt{pagelayout} package},
subtitle = {Layout graphic rich documents},
author = {Friedemann Bartels},
- date = {2023-01-23},
+ date = {2023-01-24},
version = {1.0.3},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/pagelayout},
@@ -53934,8 +53938,8 @@
title = {The \texttt{ProfLycee} package},
subtitle = {A \LaTeX{} package for French maths teachers in high school},
author = {Cédric Pierquet},
- date = {2023-01-17},
- version = {2.1.6},
+ date = {2023-01-24},
+ version = {2.1.7},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/proflycee},
url = {https://ctan.org/pkg/proflycee},
@@ -61417,11 +61421,16 @@
title = {The \texttt{sidecap} package},
subtitle = {Typeset captions sideways},
author = {Rolf Niepraschk and Hubert Gäßlein},
- date = {2016-06-24},
- version = {1.6f},
- license = {lppl},
+ date = {2023-01-24},
+ version = {1.7a},
+ license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/sidecap},
url = {https://ctan.org/pkg/sidecap},
+ annotation = {Defines environments called and
+ (analogous to figure and table)
+ to typeset captions sideways. Options include
+ , ,
+ and .},
}
@manual{ctan-sidenotes,
@@ -69453,8 +69462,8 @@
title = {The \texttt{tkz-euclide} package},
subtitle = {Tools for drawing Euclidean geometry},
author = {Alain Matthes},
- date = {2023-01-23},
- version = {5.00c},
+ date = {2023-01-24},
+ version = {5.01c},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/tkz/tkz-euclide},
url = {https://ctan.org/pkg/tkz-euclide},
@@ -75104,7 +75113,7 @@
title = {The \texttt{WriteOnGrid} package},
subtitle = {Write on grid lines},
author = {Cédric Pierquet},
- date = {2023-01-20},
+ date = {2023-01-24},
version = {0.1.1},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/writeongrid},
@@ -75334,7 +75343,7 @@
title = {The \texttt{xcoffins} package},
subtitle = {Rich boxed material for \LaTeX{} 3},
author = {{The \LaTeX{} Project Team}},
- date = {2022-04-20},
+ date = {2023-01-24},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3experimental},
@@ -75444,13 +75453,24 @@
title = {The \texttt{xduthesis} package},
subtitle = {Xe\LaTeX{} template for writing Xidian University Thesis},
author = {Fei Qi},
- date = {2023-01-23},
+ date = {2023-01-24},
version = {1.00},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/xduthesis},
url = {https://ctan.org/pkg/xduthesis},
}
+@manual{ctan-xduts,
+ title = {The \texttt{xduts} package},
+ subtitle = {Xidian University \TeX{} Suite},
+ author = {{Unknown}},
+ date = {2023-01-24},
+ version = {4.1.1.0},
+ license = {lppl1.3c},
+ mirror = {https://mirror.ctan.org/macros/xetex/latex/xduts},
+ url = {https://ctan.org/pkg/xduts},
+}
+
@manual{ctan-xdvi,
title = {The \texttt{xdvi} package},
subtitle = {A DVI previewer for the X Window System},
@@ -75842,7 +75862,7 @@
title = {The \texttt{xgalley} package},
subtitle = {Control text feeding onto the page},
author = {{The \LaTeX{} Project Team}},
- date = {2022-04-20},
+ date = {2023-01-24},
version = {},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/l3experimental/xgalley.dtx},
@@ -76329,17 +76349,6 @@
url = {https://ctan.org/pkg/xpunctuate},
}
-@manual{ctan-xput,
- title = {The \texttt{Xput} package},
- subtitle = {Declarative Desktop Publishing with \LaTeX{}},
- author = {Friedemann Bartels},
- date = {2023-01-02},
- version = {1.0.2},
- license = {lppl1.3c},
- mirror = {https://mirror.ctan.org/macros/latex/contrib/xput},
- url = {https://ctan.org/pkg/xput},
-}
-
@manual{ctan-xq,
title = {The \texttt{xq} package},
subtitle = {Support for writing about xiangqi},
diff --git a/biblio/ctan-bibdata/ctan.pdf b/biblio/ctan-bibdata/ctan.pdf
index 3c0d01f132..c71d41ec4e 100644
--- a/biblio/ctan-bibdata/ctan.pdf
+++ b/biblio/ctan-bibdata/ctan.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/CHANGELOG.md b/macros/latex/contrib/l3experimental/CHANGELOG.md
index 78831e5827..d147f91b32 100644
--- a/macros/latex/contrib/l3experimental/CHANGELOG.md
+++ b/macros/latex/contrib/l3experimental/CHANGELOG.md
@@ -7,6 +7,11 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2023-01-24]
+
+### Changed
+- Track `expl3` core changes
+
## [2022-04-20]
### Fixed
@@ -25,7 +30,7 @@ this project uses date-based 'snapshot' version identifiers.
## [2022-02-05]
### Changed
-- Documentation for horizontal coffin poles (see issue #1041)
+- Documentation for horizontal coffin poles (see issue [\#1041](https://github.com/latex3/latex3/issues/1041))
## [2021-11-12]
@@ -251,7 +256,8 @@ this project uses date-based 'snapshot' version identifiers.
- New `l3color` module using `xcolor`-like expression syntax
- New `l3draw` module, based on `pgf` layer of the TikZ system
-[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-20...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-01-24...HEAD
+[2023-01-24]: https://github.com/latex3/latex3/compare/2022-04-20...2023-01-24
[2022-04-20]: https://github.com/latex3/latex3/compare/2022-04-10...2022-04-20
[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-05...2022-04-10
[2022-02-05]: https://github.com/latex3/latex3/compare/2021-11-12...2022-02-05
diff --git a/macros/latex/contrib/l3experimental/README.md b/macros/latex/contrib/l3experimental/README.md
index 61893ee144..8b6fe49c3b 100644
--- a/macros/latex/contrib/l3experimental/README.md
+++ b/macros/latex/contrib/l3experimental/README.md
@@ -1,7 +1,7 @@
Experimental LaTeX3 Concepts
============================
-Release 2022-04-20
+Release 2023-01-24
Overview
--------
@@ -133,6 +133,6 @@ the [LaTeX-L list](#Discussion) should be used.
-----
-<p>Copyright (C) 1998-2004,2008-2012,2014-2022 The LaTeX Project <br />
+<p>Copyright (C) 1998-2004,2008-2012,2014-2023 The LaTeX Project <br />
<a href="http://latex-project.org/">http://latex-project.org/</a> <br />
All rights reserved.</p>
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.dtx b/macros/latex/contrib/l3experimental/l3benchmark.dtx
index a2cc6311a9..e3d41c8084 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.dtx
+++ b/macros/latex/contrib/l3experimental/l3benchmark.dtx
@@ -2,7 +2,7 @@
%
%% File: l3benchmark.dtx
%
-% Copyright (C) 2011,2012,2014-2022 The LaTeX Project
+% Copyright (C) 2011,2012,2014-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -122,7 +122,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3benchmark}{2022-04-20}{}
+\ProvidesExplPackage{l3benchmark}{2023-01-24}{}
{L3 Experimental benchmarking}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.ins b/macros/latex/contrib/l3experimental/l3benchmark.ins
index 7696fc105c..cfef0f0600 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.ins
+++ b/macros/latex/contrib/l3experimental/l3benchmark.ins
@@ -2,7 +2,7 @@
File: l3benchmark.ins
-Copyright (C) 2011,2018-2022 The LaTeX Project
+Copyright (C) 2011,2018-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2018-2022 The LaTeX Project
+Copyright (C) 2018-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.pdf b/macros/latex/contrib/l3experimental/l3benchmark.pdf
index cc2eafedb3..6d1815f3b0 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.pdf
+++ b/macros/latex/contrib/l3experimental/l3benchmark.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3bitset.dtx b/macros/latex/contrib/l3experimental/l3bitset.dtx
index 0038883adf..e4a40a7d7f 100644
--- a/macros/latex/contrib/l3experimental/l3bitset.dtx
+++ b/macros/latex/contrib/l3experimental/l3bitset.dtx
@@ -2,7 +2,7 @@
%
%% File: l3bitset.dtx
%
-% Copyright (C) 2020-2022 The LaTeX Project
+% Copyright (C) 2020-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
% \begin{documentation}
@@ -264,7 +264,7 @@
%<@@=bitset>
% \end{macrocode}
% \begin{macrocode}
-\ProvidesExplPackage{l3bitset}{2022-04-20}{}
+\ProvidesExplPackage{l3bitset}{2023-01-24}{}
{L3 Experimental bitset support}
% \end{macrocode}
% A bitset is a string variable.
@@ -579,7 +579,7 @@
}
\msg_new:nnn { bitset } { unknown-name }
{ The~name~'#2'~is~unknown~for~bitset~\tl_to_str:n {#1} }
-\prop_gput:Nnn \g_msg_module_name_prop { bitset } { LaTeX3 }
+\prop_gput:Nnn \g_msg_module_name_prop { bitset } { LaTeX }
\prop_gput:Nnn \g_msg_module_type_prop { bitset } { }
% \end{macrocode}
% \begin{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3bitset.pdf b/macros/latex/contrib/l3experimental/l3bitset.pdf
index 6be2638c8b..13daed2625 100644
--- a/macros/latex/contrib/l3experimental/l3bitset.pdf
+++ b/macros/latex/contrib/l3experimental/l3bitset.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
index 4059deb74c..504d92ce26 100644
--- a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-boxes.dtx
%
-% Copyright (C) 2018-2022 The LaTeX Project
+% Copyright (C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-code.pdf b/macros/latex/contrib/l3experimental/l3draw-code.pdf
index a980d5775f..0b8e93868c 100644
--- a/macros/latex/contrib/l3experimental/l3draw-code.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-layers.dtx b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
index bbdc422604..aa930cfcc7 100644
--- a/macros/latex/contrib/l3experimental/l3draw-layers.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-layers.dtx
%
-% Copyright (C) 2019-2022 The LaTeX Project
+% Copyright (C) 2019-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-paths.dtx b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
index 27252d36c4..7201051b82 100644
--- a/macros/latex/contrib/l3experimental/l3draw-paths.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-paths.dtx
%
-% Copyright (C) 2018-2022 The LaTeX Project
+% Copyright (C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-points.dtx b/macros/latex/contrib/l3experimental/l3draw-points.dtx
index d67f61cbcc..01b82b4a8e 100644
--- a/macros/latex/contrib/l3experimental/l3draw-points.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-points.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-points.dtx
%
-% Copyright (C) 2018-2022 The LaTeX Project
+% Copyright (C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
index 2a4968ba78..4663049adf 100644
--- a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-scopes.dtx
%
-% Copyright (C) 2018-2022 The LaTeX Project
+% Copyright (C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
index 91f16e362d..971a4236af 100644
--- a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-softpath.dtx
%
-% Copyright (C) 2018-2022 The LaTeX Project
+% Copyright (C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-state.dtx b/macros/latex/contrib/l3experimental/l3draw-state.dtx
index b4cdd7b1f3..defbbf9a92 100644
--- a/macros/latex/contrib/l3experimental/l3draw-state.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-state.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-state.dtx
%
-% Copyright (C) 2018-2022 The LaTeX Project
+% Copyright (C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
index 3461dd983c..23febfae6c 100644
--- a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-transforms.dtx
%
-% Copyright (C) 2018-2022 The LaTeX Project
+% Copyright (C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw.dtx b/macros/latex/contrib/l3experimental/l3draw.dtx
index 9dcca5c6f8..6affc2f427 100644
--- a/macros/latex/contrib/l3experimental/l3draw.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw.dtx
%
-% Copyright(C) 2018-2022 The LaTeX Project
+% Copyright(C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -110,7 +110,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -1173,7 +1173,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3draw}{2022-04-20}{}
+\ProvidesExplPackage{l3draw}{2023-01-24}{}
{L3 Experimental core drawing support}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3draw.ins b/macros/latex/contrib/l3experimental/l3draw.ins
index 411e17985f..7183607c2d 100644
--- a/macros/latex/contrib/l3experimental/l3draw.ins
+++ b/macros/latex/contrib/l3experimental/l3draw.ins
@@ -2,7 +2,7 @@
File: l3draw.ins
-Copyright (C) 2018-2022 The LaTeX Project
+Copyright (C) 2018-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2018-2022 The LaTeX Project
+Copyright (C) 2018-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3experimental/l3draw.pdf b/macros/latex/contrib/l3experimental/l3draw.pdf
index 36d736d883..e2eb79087d 100644
--- a/macros/latex/contrib/l3experimental/l3draw.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3galley.dtx b/macros/latex/contrib/l3experimental/l3galley.dtx
index 08bc173293..1770aa7fad 100644
--- a/macros/latex/contrib/l3experimental/l3galley.dtx
+++ b/macros/latex/contrib/l3experimental/l3galley.dtx
@@ -3,7 +3,7 @@
%% File: l3galley.dtx
%
% Copyright (C) 1999-2001,2004-2009 Frank Mittelbach
-% (C) 2010-2022 The LaTeX Project
+% (C) 2010-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -686,7 +686,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3galley}{2022-04-20}{}
+\ProvidesExplPackage{l3galley}{2023-01-24}{}
{L3 Experimental galley code}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3galley.pdf b/macros/latex/contrib/l3experimental/l3galley.pdf
index f191180826..4319a2d561 100644
--- a/macros/latex/contrib/l3experimental/l3galley.pdf
+++ b/macros/latex/contrib/l3experimental/l3galley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3graphics.dtx b/macros/latex/contrib/l3experimental/l3graphics.dtx
index 0a3556c5be..ed7f01717d 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.dtx
+++ b/macros/latex/contrib/l3experimental/l3graphics.dtx
@@ -2,7 +2,7 @@
%
%% File: l3graphics.dtx
%
-% Copyright (C) 2017-2022 The LaTeX Project
+% Copyright (C) 2017-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -185,7 +185,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3graphics}{2022-04-20}{}
+\ProvidesExplPackage{l3graphics}{2023-01-24}{}
{L3 Experimental graphics inclusion support}
% \end{macrocode}
%
@@ -532,7 +532,7 @@
\@@_include_auxi:e
{
\exp_args:Ne \str_tail:n
- { \str_foldcase:V \l_@@_ext_str }
+ { \str_casefold:V \l_@@_ext_str }
}
}
{ \@@_include_auxi:e { \l_@@_type_str } }
diff --git a/macros/latex/contrib/l3experimental/l3graphics.ins b/macros/latex/contrib/l3experimental/l3graphics.ins
index b126956cf7..40f03e569d 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.ins
+++ b/macros/latex/contrib/l3experimental/l3graphics.ins
@@ -1,6 +1,6 @@
\iffalse meta-comment
-File l3graphics.ins Copyright (C) 2017,2019-2022 The LaTeX Project
+File l3graphics.ins Copyright (C) 2017,2019-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -32,7 +32,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2019-2022 The LaTeX Project
+Copyright (C) 2019-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3experimental/l3graphics.pdf b/macros/latex/contrib/l3experimental/l3graphics.pdf
index cd16e12ff3..e763b0ec8f 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.pdf
+++ b/macros/latex/contrib/l3experimental/l3graphics.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3opacity.dtx b/macros/latex/contrib/l3experimental/l3opacity.dtx
index 0ad59425ff..eceff60d45 100644
--- a/macros/latex/contrib/l3experimental/l3opacity.dtx
+++ b/macros/latex/contrib/l3experimental/l3opacity.dtx
@@ -2,7 +2,7 @@
%
%% File: l3opacity.dtx
%
-% Copyright (C) 2021,2022 The LaTeX Project
+% Copyright (C) 2021-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -58,8 +58,7 @@
% limitations in terms of backends mean that it is not always possible
% to use a dedicated stack for tracking opacity. The best results when
% breaking pages are therefore likely to result using direct PDF output
-% (\pdfTeX{}, \LuaTeX{}) or with recent versions of \texttt{(x)dvipdfmx}:
-% these backends do offer the necessary support.
+% (\pdfTeX{}, \LuaTeX{}).
%
% For users of PostScript-based routes, note that there are security
% restrictions which can prevent opacity being available in output. In
@@ -97,7 +96,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3opacity}{2022-04-20}{}
+\ProvidesExplPackage{l3opacity}{2023-01-24}{}
{L3 Experimental opacity support}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3opacity.ins b/macros/latex/contrib/l3experimental/l3opacity.ins
index 770139895a..1a5e5de20a 100644
--- a/macros/latex/contrib/l3experimental/l3opacity.ins
+++ b/macros/latex/contrib/l3experimental/l3opacity.ins
@@ -2,7 +2,7 @@
File: l3opacity.ins
-Copyright (C) 2021,2022 The LaTeX Project
+Copyright (C) 2021-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2021,2022 The LaTeX Project
+Copyright (C) 2021-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3experimental/l3opacity.pdf b/macros/latex/contrib/l3experimental/l3opacity.pdf
index 46163501c3..4329f8c4d9 100644
--- a/macros/latex/contrib/l3experimental/l3opacity.pdf
+++ b/macros/latex/contrib/l3experimental/l3opacity.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3str-format.dtx b/macros/latex/contrib/l3experimental/l3str-format.dtx
index 6ca47a9693..5ab0724373 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.dtx
+++ b/macros/latex/contrib/l3experimental/l3str-format.dtx
@@ -2,7 +2,7 @@
%
%% File: l3str-format.dtx
%
-% Copyright (C) 2012-2022 The LaTeX Project
+% Copyright (C) 2012-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -166,7 +166,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3str-format}{2022-04-20}{}
+\ProvidesExplPackage{l3str-format}{2023-01-24}{}
{L3 Experimental string formatting}
% \end{macrocode}
%
@@ -969,7 +969,7 @@
{ Invalid~precision~'#1'~for~type~'#2'. }
\msg_new:nnn { str } { invalid-style-format }
{ Invalid~style~'#1'~for~type~'#2'. }
-\prop_gput:Nnn \g_msg_module_name_prop { str } { LaTeX3 }
+\prop_gput:Nnn \g_msg_module_name_prop { str } { LaTeX }
\prop_gput:Nnn \g_msg_module_type_prop { str } { }
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3str-format.pdf b/macros/latex/contrib/l3experimental/l3str-format.pdf
index 547cc3b557..fed8cd5755 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.pdf
+++ b/macros/latex/contrib/l3experimental/l3str-format.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3str.ins b/macros/latex/contrib/l3experimental/l3str.ins
index 812f6c30b4..fa070c69ec 100644
--- a/macros/latex/contrib/l3experimental/l3str.ins
+++ b/macros/latex/contrib/l3experimental/l3str.ins
@@ -2,7 +2,7 @@
File l3str.ins
-Copyright (C) 2011-2017,2019-2022 The LaTeX Project
+Copyright (C) 2011-2017,2019-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2011-2022 The LaTeX Project
+Copyright (C) 2011-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.dtx b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
index 3f8f711278..0f0852a95c 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.dtx
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
@@ -2,7 +2,7 @@
%
%% File: l3sys-shell.dtx
%
-% Copyright (C) 2018-2022 The LaTeX Project
+% Copyright (C) 2018-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -151,7 +151,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3sys-shell}{2022-04-20}{}
+\ProvidesExplPackage{l3sys-shell}{2023-01-24}{}
{L3 Experimental system shell functions}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.ins b/macros/latex/contrib/l3experimental/l3sys-shell.ins
index 0bf0dbb983..c546801d05 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.ins
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.ins
@@ -2,7 +2,7 @@
File: l3sys-shell.ins
-Copyright (C) 2018-2022 The LaTeX Project
+Copyright (C) 2018-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2018-2022 The LaTeX Project
+Copyright (C) 2018-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.pdf b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
index 2e673babe4..8d591b15e9 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.pdf
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xcoffins.dtx b/macros/latex/contrib/l3experimental/xcoffins.dtx
index 44a7913181..8794786d59 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.dtx
+++ b/macros/latex/contrib/l3experimental/xcoffins.dtx
@@ -2,7 +2,7 @@
%
%% File: xcoffins.dtx
%
-% Copyright (C) 2010-2012,2014,2016-2022 The LaTeX Project
+% Copyright (C) 2010-2012,2014,2016-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -53,7 +53,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -672,7 +672,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2022-04-20}{}
+\ProvidesExplPackage{xcoffins}{2023-01-24}{}
{L3 Experimental design level coffins}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/xcoffins.ins b/macros/latex/contrib/l3experimental/xcoffins.ins
index 0605a1ae32..224e77b5d6 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.ins
+++ b/macros/latex/contrib/l3experimental/xcoffins.ins
@@ -2,7 +2,7 @@
File: xcoffins.ins
-Copyright (C) 2010,2011,2012,2016,2017,2019-2022 The LaTeX Project
+Copyright (C) 2010,2011,2012,2016,2017,2019-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2010-2022 The LaTeX Project
+Copyright (C) 2010-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3experimental/xcoffins.pdf b/macros/latex/contrib/l3experimental/xcoffins.pdf
index 1cf45fa2ec..a2af833a39 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.pdf
+++ b/macros/latex/contrib/l3experimental/xcoffins.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xgalley.dtx b/macros/latex/contrib/l3experimental/xgalley.dtx
index 1d721dd590..4510cba15b 100644
--- a/macros/latex/contrib/l3experimental/xgalley.dtx
+++ b/macros/latex/contrib/l3experimental/xgalley.dtx
@@ -3,7 +3,7 @@
%% File: xgalley.dtx
%
% Copyright (C) 1999-2001,2004-2009 Frank Mittelbach
-% (C) 2010-2012,2014,2016-2022 The LaTeX Project
+% (C) 2010-2012,2014,2016-2023 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-04-20}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -731,7 +731,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2022-04-20}{}
+\ProvidesExplPackage{xgalley}{2023-01-24}{}
{L3 Experimental galley}
\RequirePackage{xtemplate,l3galley}
% \end{macrocode}
@@ -787,7 +787,6 @@
right-margin = \l_@@_right_margin_dim
}
{
- \AssignTemplateKeys
\galley_margins_set_absolute:nn \l_@@_left_margin_dim
\l_@@_right_margin_dim
}
@@ -801,7 +800,6 @@
right-margin = \l_@@_right_margin_dim
}
{
- \AssignTemplateKeys
\galley_margins_set_relative:nn \l_@@_left_margin_dim
\l_@@_right_margin_dim
}
@@ -850,7 +848,6 @@
lines = \l_@@_parshape_lines_int
}
{
- \AssignTemplateKeys
\bool_if:NTF \l_@@_parshape_on_left_bool
{
\galley_parshape_set_single:nVVN
@@ -874,7 +871,6 @@
lines = \l_@@_parshape_lines_int
}
{
- \AssignTemplateKeys
\clist_clear:N \l_@@_tmpa_clist
\clist_clear:N \l_@@_tmpb_clist
\prg_replicate:nn { \l_@@_parshape_lines_int }
@@ -961,7 +957,6 @@
}
}
{
- \AssignTemplateKeys
\int_set:Nn \tex_lefthyphenmin:D
{
\bool_if:NTF \l_galley_hyphen_enable_bool
@@ -1038,7 +1033,6 @@
stretch-last-line = \l_galley_par_stretch_last_bool
}
{
- \AssignTemplateKeys
\tl_clear:N \l_@@_justification_other_tl
\galley_interword_spacing_set:N \l_galley_fixed_spacing_bool
\bool_if:NTF \l_galley_par_stretch_last_bool
@@ -1171,7 +1165,6 @@
other-paragraphs = \@@_justification_other:
}
{
- \AssignTemplateKeys
\@@_justification_first:
\tl_set:Nn \l_@@_justification_other_tl
{ \@@_justification_other: }
@@ -1224,7 +1217,7 @@
relation-penalty = \l_@@_relation_penalty_int ,
tolerance = \l_galley_linebreak_tolerance_int
}
- { \AssignTemplateKeys }
+ { }
% \end{macrocode}
% The default values are set such that they are suitable for good
% quality typesetting. So the standard template changes nothing at
@@ -1280,7 +1273,6 @@
widow-penalty = \l_@@_widow_penalty_int
}
{
- \AssignTemplateKeys
\galley_club_penalties_set:V \l_@@_club_penalty_int
\galley_display_club_penalties_set:V \l_@@_display_club_penalty_int
\galley_display_widow_penalties_set:V \l_@@_display_widow_penalty_int
@@ -1357,7 +1349,6 @@
widow-penalty = \l_@@_widow_penalties_tl
}
{
- \AssignTemplateKeys
% \end{macrocode}
% The fuzz and interline penalties are handled explicitly as they have
% particular requirements.
@@ -1493,7 +1484,6 @@
space = \l_galley_display_begin_vspace_tl
}
{
- \AssignTemplateKeys
\tl_if_empty:NF \l_galley_display_begin_par_vpenalty_tl
{
\tl_set:Nx \l_galley_display_begin_par_vpenalty_tl
@@ -1523,7 +1513,6 @@
space = \l_galley_display_end_vspace_tl
}
{
- \AssignTemplateKeys
\tl_if_empty:NF \l_galley_display_end_par_vpenalty_tl
{
\tl_set:Nx \l_galley_display_end_par_vpenalty_tl
diff --git a/macros/latex/contrib/l3experimental/xgalley.ins b/macros/latex/contrib/l3experimental/xgalley.ins
index d497e29f94..82ae4c7728 100644
--- a/macros/latex/contrib/l3experimental/xgalley.ins
+++ b/macros/latex/contrib/l3experimental/xgalley.ins
@@ -2,7 +2,7 @@
File: xgalley.ins
-Copyright (C) 2010-2012,2016,2017,2019-2022 The LaTeX Project
+Copyright (C) 2010-2012,2016,2017,2019-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2010-2022 The LaTeX Project
+Copyright (C) 2010-2023 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/l3experimental/xgalley.pdf b/macros/latex/contrib/l3experimental/xgalley.pdf
index d9e7678c0e..f2cb9014a6 100644
--- a/macros/latex/contrib/l3experimental/xgalley.pdf
+++ b/macros/latex/contrib/l3experimental/xgalley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index 4c283b82b7..e4bea1dc23 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,19 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2023-01-24]
+
+### Added
+- Complete list of pdfTeX primitives
+
+### Fixed
+- Allow for multi-part BCP47 strings in case changing
+- Loading with plain TeX due to `\outer` status of `^^L`
+ issue [\#1161](https://github.com/latex3/latex3/issues/1161))
+
+### Changed
+- Leave catcode of `&` unchanged in code environment
+
## [2023-01-16]
### Added
@@ -1261,7 +1274,8 @@ this project uses date-based 'snapshot' version identifiers.
- Step functions have been added for dim variables,
e.g. `\dim_step_inline:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2023-01-16...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-01-24...HEAD
+[2023-01-24]: https://github.com/latex3/latex3/compare/2023-01-16...2023-01-24
[2023-01-16]: https://github.com/latex3/latex3/compare/2022-12-17...2023-01-16
[2022-12-17]: https://github.com/latex3/latex3/compare/2022-11-02...2022-12-17
[2022-11-02]: https://github.com/latex3/latex3/compare/2022-10-26...2022-11-02
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index 3f126324cd..e5354b3721 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2023-01-16
+Release 2023-01-24
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 65cdb5856f..20477df6ab 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2023-01-16}%
+\def\ExplFileDate{2023-01-24}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 768e654723..fbd84e6cbc 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index 88c6636a1c..4036c88f84 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index e926247871..7608abd885 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -54,7 +54,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-01-16}
+\date{Released 2023-01-24}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index 73e776fd67..a67333c13e 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index 2af707dfcb..d0a82dd956 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -336,7 +336,6 @@ Type H <return> for immediate help}\def~{\errmessage{%
\catcode 9 = \the\catcode 9\relax
\catcode 32 = \the\catcode 32\relax
\catcode 34 = \the\catcode 34\relax
- \catcode 38 = \the\catcode 38\relax
\catcode 58 = \the\catcode 58\relax
\catcode 94 = \the\catcode 94\relax
\catcode 95 = \the\catcode 95\relax
@@ -353,7 +352,6 @@ Type H <return> for immediate help}\def~{\errmessage{%
\catcode 9 = 9\relax
\catcode 32 = 9\relax
\catcode 34 = 12\relax
-\catcode 38 = 4\relax
\catcode 58 = 11\relax
\catcode 94 = 7\relax
\catcode 95 = 11\relax
@@ -386,7 +384,6 @@ Type H <return> for immediate help}\def~{\errmessage{%
\char_set_catcode:nn { 9 } { \char_value_catcode:n { 9 } }
\char_set_catcode:nn { 32 } { \char_value_catcode:n { 32 } }
\char_set_catcode:nn { 34 } { \char_value_catcode:n { 34 } }
- \char_set_catcode:nn { 38 } { \char_value_catcode:n { 38 } }
\char_set_catcode:nn { 58 } { \char_value_catcode:n { 58 } }
\char_set_catcode:nn { 94 } { \char_value_catcode:n { 94 } }
\char_set_catcode:nn { 95 } { \char_value_catcode:n { 95 } }
@@ -401,7 +398,6 @@ Type H <return> for immediate help}\def~{\errmessage{%
\char_set_catcode_ignore:n { 9 } % tab
\char_set_catcode_ignore:n { 32 } % space
\char_set_catcode_other:n { 34 } % double quote
- \char_set_catcode_alignment:n { 38 } % ampersand
\char_set_catcode_letter:n { 58 } % colon
\char_set_catcode_math_superscript:n { 94 } % circumflex
\char_set_catcode_letter:n { 95 } % underscore
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index f5185f3301..64e7dfc921 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index 603cfc015b..691215f2ec 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/contrib/l3kernel/l3cctab.dtx
index 83013ddd8f..7fb9f6baa5 100644
--- a/macros/latex/contrib/l3kernel/l3cctab.dtx
+++ b/macros/latex/contrib/l3kernel/l3cctab.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index c21504c29e..9cbe851c27 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index 8a4cc63d14..c14f49b957 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3color.dtx b/macros/latex/contrib/l3kernel/l3color.dtx
index 89ef8e7092..6cda94918c 100644
--- a/macros/latex/contrib/l3kernel/l3color.dtx
+++ b/macros/latex/contrib/l3kernel/l3color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index 310c985bc3..7064010a76 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index ba9ca055b0..b2383fc2d6 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index ae7118452a..fb79aabdab 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -85,7 +85,7 @@ and all files in that bundle must be distributed together.
% require you to do updates, if the class changes.}}
%
% \author{\Team}
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
% \maketitle
% \tableofcontents
%
diff --git a/macros/latex/contrib/l3kernel/l3doc.pdf b/macros/latex/contrib/l3kernel/l3doc.pdf
index 016969a70a..7f0751f545 100644
--- a/macros/latex/contrib/l3kernel/l3doc.pdf
+++ b/macros/latex/contrib/l3kernel/l3doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index 73c9e51da8..162cafb650 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index 0166bdd1ad..1de7fd29c2 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index 8e5d465881..cb01da408f 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index 1641376088..de1af91fa6 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index 3d100e5a35..8dde6fe7a6 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index 64bc45fd89..11326e5852 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index 5584dd5572..d9bca921ce 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index 1fca41c8cb..d6d6985101 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index 6231c87339..2e7482ca85 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index f006c44675..91959a5766 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index 620bdf53ca..009edc62a8 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index 0b24083ce6..c6908c53e1 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index 1c03b75cae..86396c9d68 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 99ab50e502..2c6a9bfa8c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index a5d78206d8..8eae112b79 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index 1bd57e7a4c..34a9a4afbf 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index 8883df1608..bc0d7aa98c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index 7b7009c919..a8b506aa0a 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index d8cf342000..db4697d6e6 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index 5dc3446b1a..b208fc179d 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index b42ea542b3..51124f232b 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index 3a03b242da..3dbb07e618 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index 56c141c713..f4fbb8a73b 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index b946650d54..02f5f0b84b 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index b8758ef326..433d2a2573 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index 1ce912a6a9..a8020d025d 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index 17d0bdaa6d..b3a30158f4 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -539,15 +539,16 @@
\@@_primitive:NN \pdfdestmargin \tex_pdfdestmargin:D
\@@_primitive:NN \pdfendlink \tex_pdfendlink:D
\@@_primitive:NN \pdfendthread \tex_pdfendthread:D
+ \@@_primitive:NN \pdffakespace \tex_pdffakespace:D
\@@_primitive:NN \pdffontattr \tex_pdffontattr:D
\@@_primitive:NN \pdffontname \tex_pdffontname:D
\@@_primitive:NN \pdffontobjnum \tex_pdffontobjnum:D
\@@_primitive:NN \pdfgamma \tex_pdfgamma:D
- \@@_primitive:NN \pdfimageapplygamma \tex_pdfimageapplygamma:D
- \@@_primitive:NN \pdfimagegamma \tex_pdfimagegamma:D
\@@_primitive:NN \pdfgentounicode \tex_pdfgentounicode:D
\@@_primitive:NN \pdfglyphtounicode \tex_pdfglyphtounicode:D
\@@_primitive:NN \pdfhorigin \tex_pdfhorigin:D
+ \@@_primitive:NN \pdfimageapplygamma \tex_pdfimageapplygamma:D
+ \@@_primitive:NN \pdfimagegamma \tex_pdfimagegamma:D
\@@_primitive:NN \pdfimagehicolor \tex_pdfimagehicolor:D
\@@_primitive:NN \pdfimageresolution \tex_pdfimageresolution:D
\@@_primitive:NN \pdfincludechars \tex_pdfincludechars:D
@@ -555,6 +556,9 @@
\@@_primitive:NN \pdfinclusionerrorlevel
\tex_pdfinclusionerrorlevel:D
\@@_primitive:NN \pdfinfo \tex_pdfinfo:D
+ \@@_primitive:NN \pdfinfoomitdate \tex_pdfinfoomitdate:D
+ \@@_primitive:NN \pdfinterwordspaceoff \tex_pdfinterwordspaceoff:D
+ \@@_primitive:NN \pdfinterwordspaceon \tex_pdfinterwordspaceon:D
\@@_primitive:NN \pdflastannot \tex_pdflastannot:D
\@@_primitive:NN \pdflastlink \tex_pdflastlink:D
\@@_primitive:NN \pdflastobj \tex_pdflastobj:D
@@ -565,11 +569,15 @@
\@@_primitive:NN \pdflastximagepages \tex_pdflastximagepages:D
\@@_primitive:NN \pdflinkmargin \tex_pdflinkmargin:D
\@@_primitive:NN \pdfliteral \tex_pdfliteral:D
+ \@@_primitive:NN \pdfmapfile \tex_pdfmapfile:D
+ \@@_primitive:NN \pdfmapline \tex_pdfmapline:D
\@@_primitive:NN \pdfmajorversion \tex_pdfmajorversion:D
\@@_primitive:NN \pdfminorversion \tex_pdfminorversion:D
\@@_primitive:NN \pdfnames \tex_pdfnames:D
+ \@@_primitive:NN \pdfnobuiltintounicode \tex_pdfnobuiltintounicode:D
\@@_primitive:NN \pdfobj \tex_pdfobj:D
\@@_primitive:NN \pdfobjcompresslevel \tex_pdfobjcompresslevel:D
+ \@@_primitive:NN \pdfomitcharset \tex_pdfomitcharset:D
\@@_primitive:NN \pdfoutline \tex_pdfoutline:D
\@@_primitive:NN \pdfoutput \tex_pdfoutput:D
\@@_primitive:NN \pdfpageattr \tex_pdfpageattr:D
@@ -583,14 +591,23 @@
\@@_primitive:NN \pdfrefximage \tex_pdfrefximage:D
\@@_primitive:NN \pdfrestore \tex_pdfrestore:D
\@@_primitive:NN \pdfretval \tex_pdfretval:D
+ \@@_primitive:NN \pdfrunninglinkoff \tex_pdfrunninglinkoff:D
+ \@@_primitive:NN \pdfrunninglinkon \tex_pdfrunninglinkon:D
\@@_primitive:NN \pdfsave \tex_pdfsave:D
\@@_primitive:NN \pdfsetmatrix \tex_pdfsetmatrix:D
\@@_primitive:NN \pdfstartlink \tex_pdfstartlink:D
\@@_primitive:NN \pdfstartthread \tex_pdfstartthread:D
\@@_primitive:NN \pdfsuppressptexinfo \tex_pdfsuppressptexinfo:D
+ \@@_primitive:NN \pdfsuppresswarningdupdest
+ \tex_pdfsuppresswarningdupdest:D
+ \@@_primitive:NN \pdfsuppresswarningdupmap
+ \tex_pdfsuppresswarningdupmap:D
+ \@@_primitive:NN \pdfsuppresswarningpagegroup
+ \tex_pdfsuppresswarningpagegroup:D
\@@_primitive:NN \pdfthread \tex_pdfthread:D
\@@_primitive:NN \pdfthreadmargin \tex_pdfthreadmargin:D
\@@_primitive:NN \pdftrailer \tex_pdftrailer:D
+ \@@_primitive:NN \pdftrailerid \tex_pdftrailerid:D
\@@_primitive:NN \pdfuniqueresname \tex_pdfuniqueresname:D
\@@_primitive:NN \pdfvorigin \tex_pdfvorigin:D
\@@_primitive:NN \pdfxform \tex_pdfxform:D
@@ -605,22 +622,28 @@
\@@_primitive:NN \ifpdfabsdim \tex_ifabsdim:D
\@@_primitive:NN \ifpdfabsnum \tex_ifabsnum:D
\@@_primitive:NN \ifpdfprimitive \tex_ifprimitive:D
+ \@@_primitive:NN \pdfadjustinterwordglue
+ \tex_adjustinterwordglue:D
\@@_primitive:NN \pdfadjustspacing \tex_adjustspacing:D
+ \@@_primitive:NN \pdfappendkern \tex_appendkern:D
\@@_primitive:NN \pdfcopyfont \tex_copyfont:D
\@@_primitive:NN \pdfdraftmode \tex_draftmode:D
\@@_primitive:NN \pdfeachlinedepth \tex_eachlinedepth:D
\@@_primitive:NN \pdfeachlineheight \tex_eachlineheight:D
\@@_primitive:NN \pdfelapsedtime \tex_elapsedtime:D
+ \@@_primitive:NN \pdfescapehex \tex_escapehex:D
+ \@@_primitive:NN \pdfescapename \tex_escapename:D
+ \@@_primitive:NN \pdfescapestring \tex_escapestring:D
\@@_primitive:NN \pdffirstlineheight \tex_firstlineheight:D
\@@_primitive:NN \pdffontexpand \tex_fontexpand:D
\@@_primitive:NN \pdffontsize \tex_fontsize:D
\@@_primitive:NN \pdfignoreddimen \tex_ignoreddimen:D
\@@_primitive:NN \pdfinsertht \tex_insertht:D
\@@_primitive:NN \pdflastlinedepth \tex_lastlinedepth:D
+ \@@_primitive:NN \pdflastmatch \tex_lastmatch:D
\@@_primitive:NN \pdflastxpos \tex_lastxpos:D
\@@_primitive:NN \pdflastypos \tex_lastypos:D
- \@@_primitive:NN \pdfmapfile \tex_mapfile:D
- \@@_primitive:NN \pdfmapline \tex_mapline:D
+ \@@_primitive:NN \pdfmatch \tex_match:D
\@@_primitive:NN \pdfnoligatures \tex_noligatures:D
\@@_primitive:NN \pdfnormaldeviate \tex_normaldeviate:D
\@@_primitive:NN \pdfpageheight \tex_pageheight:D
@@ -628,6 +651,7 @@
\@@_primitive:NN \pdfpkmode \tex_pkmode:D
\@@_primitive:NN \pdfpkresolution \tex_pkresolution:D
\@@_primitive:NN \pdfprimitive \tex_primitive:D
+ \@@_primitive:NN \pdfprependkern \tex_prependkern:D
\@@_primitive:NN \pdfprotrudechars \tex_protrudechars:D
\@@_primitive:NN \pdfpxdimen \tex_pxdimen:D
\@@_primitive:NN \pdfrandomseed \tex_randomseed:D
@@ -636,6 +660,7 @@
\@@_primitive:NN \pdfsetrandomseed \tex_setrandomseed:D
\@@_primitive:NN \pdfshellescape \tex_shellescape:D
\@@_primitive:NN \pdftracingfonts \tex_tracingfonts:D
+ \@@_primitive:NN \pdfunescapehex \tex_unescapehex:D
\@@_primitive:NN \pdfuniformdeviate \tex_uniformdeviate:D
% \end{macrocode}
% The version primitives are not related to PDF mode but are
@@ -650,12 +675,17 @@
% \begin{macrocode}
\@@_primitive:NN \efcode \tex_efcode:D
\@@_primitive:NN \ifincsname \tex_ifincsname:D
+ \@@_primitive:NN \knaccode \tex_knaccode:D
+ \@@_primitive:NN \knbccode \tex_knbccode:D
+ \@@_primitive:NN \knbscode \tex_knbscode:D
\@@_primitive:NN \leftmarginkern \tex_leftmarginkern:D
\@@_primitive:NN \letterspacefont \tex_letterspacefont:D
\@@_primitive:NN \lpcode \tex_lpcode:D
\@@_primitive:NN \quitvmode \tex_quitvmode:D
\@@_primitive:NN \rightmarginkern \tex_rightmarginkern:D
\@@_primitive:NN \rpcode \tex_rpcode:D
+ \@@_primitive:NN \shbscode \tex_shbscode:D
+ \@@_primitive:NN \stbscode \tex_stbscode:D
\@@_primitive:NN \synctex \tex_synctex:D
\@@_primitive:NN \tagcode \tex_tagcode:D
% \end{macrocode}
@@ -1376,8 +1406,8 @@
\tex_ifdefined:D \tex_pdftexversion:D 1 \tex_fi:D
\tex_ifdefined:D \tex_luatexversion:D 1 \tex_fi:D
= 0 %
- \tex_let:D \tex_mapfile:D \tex_undefined:D
- \tex_let:D \tex_mapline:D \tex_undefined:D
+ \tex_let:D \tex_pdfmapfile:D \tex_undefined:D
+ \tex_let:D \tex_pdfmapline:D \tex_undefined:D
\tex_fi:D
% \end{macrocode}
% A few packages do unfortunate things to date-related primitives.
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
index 6b66447386..d34f4618a4 100644
--- a/macros/latex/contrib/l3kernel/l3news.pdf
+++ b/macros/latex/contrib/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf
index 7fee9d047d..8b51ee3664 100644
--- a/macros/latex/contrib/l3kernel/l3news01.pdf
+++ b/macros/latex/contrib/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf
index 2325490d72..64f0bf8154 100644
--- a/macros/latex/contrib/l3kernel/l3news02.pdf
+++ b/macros/latex/contrib/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf
index ce94ae63a3..f58f57ab86 100644
--- a/macros/latex/contrib/l3kernel/l3news03.pdf
+++ b/macros/latex/contrib/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf
index 20a59c1e3d..91f36ea7a5 100644
--- a/macros/latex/contrib/l3kernel/l3news04.pdf
+++ b/macros/latex/contrib/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf
index c4cf762ccf..adda3bf11c 100644
--- a/macros/latex/contrib/l3kernel/l3news05.pdf
+++ b/macros/latex/contrib/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf
index 1a9743988d..fe7fa91ee9 100644
--- a/macros/latex/contrib/l3kernel/l3news06.pdf
+++ b/macros/latex/contrib/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf
index 129d8704b8..9619cb2c04 100644
--- a/macros/latex/contrib/l3kernel/l3news07.pdf
+++ b/macros/latex/contrib/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf
index 73faba2a2d..113a54209c 100644
--- a/macros/latex/contrib/l3kernel/l3news08.pdf
+++ b/macros/latex/contrib/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf
index a4d8adab6c..a1f79e3f88 100644
--- a/macros/latex/contrib/l3kernel/l3news09.pdf
+++ b/macros/latex/contrib/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf
index 31baf083a5..347446613e 100644
--- a/macros/latex/contrib/l3kernel/l3news10.pdf
+++ b/macros/latex/contrib/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf
index d432b0f476..5f6993d5f5 100644
--- a/macros/latex/contrib/l3kernel/l3news11.pdf
+++ b/macros/latex/contrib/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf
index 0e1c4ba74b..b2d4c4d58f 100644
--- a/macros/latex/contrib/l3kernel/l3news12.pdf
+++ b/macros/latex/contrib/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3pdf.dtx b/macros/latex/contrib/l3kernel/l3pdf.dtx
index 5cc0c00fc3..be7c366ef5 100644
--- a/macros/latex/contrib/l3kernel/l3pdf.dtx
+++ b/macros/latex/contrib/l3kernel/l3pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index 1ff2bcc456..6528db5c18 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index 26001779bc..752f1d8a34 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index 6ab2e702b8..d672f16049 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index 42e52d2c5a..1179f0d0c4 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index 31678c5311..15cacbe65c 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index e4ea0f9f15..c5c3762183 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index 3c9b209535..ec8e13958d 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index d925c1fc81..218355f679 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index eb847fa36f..2ae9043517 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index 008ca0b720..8fd858e5ef 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index 1b7b4b053b..88b1d321aa 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex
index a28a6688e7..b1eeda0c9e 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/contrib/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-01-16}
+\date{Released 2023-01-24}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index 0b79da1acb..d35865020d 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
index 9e704a62e1..d72444c0a9 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-01-16}
+\date{Released 2023-01-24}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 6acb1a597f..4820317747 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index 3219ad33e6..af5414dd9b 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex
index 2a2df3fb10..26bdd5ddda 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-01-16}
+\date{Released 2023-01-24}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
index c55ddfcd78..b405100b79 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -251,7 +251,11 @@
{
\cs_if_exist:cTF { @@_change_case_ #2 _ #5 -x- #3 :nnnn }
{ \@@_change_case_auxii:nnn {#1} {#2} { #5 -x- #3 } }
- { \@@_change_case_auxii:nnn {#1} {#2} {#4} }
+ {
+ \cs_if_exist:cTF { @@_change_case_ #2 _ #5 :nnnn }
+ { \@@_change_case_auxii:nnn {#1} {#2} {#5} }
+ { \@@_change_case_auxii:nnn {#1} {#2} {#4} }
+ }
}
\cs_new:Npn \@@_change_case_auxii:nnn #1#2#3
{
diff --git a/macros/latex/contrib/l3kernel/l3text-map.dtx b/macros/latex/contrib/l3kernel/l3text-map.dtx
index bf2a6f7d24..1d2c3a47e0 100644
--- a/macros/latex/contrib/l3kernel/l3text-map.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-map.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx
index 596f6b1423..9c6e391bf8 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
index 1255341dc4..adaf98274c 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index e3dd923289..2bc1938072 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index cb922e1a5f..5bf059a678 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index 96b9df2959..8a1ca75599 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
@@ -1571,6 +1571,8 @@
% auxiliaries reflects that.
% \begin{macrocode}
\group_begin:
+ \char_set_catcode_active:N \^^L
+ \cs_set:Npn ^^L { }
\if_int_odd:w 0
\sys_if_engine_luatex:T { 1 }
\sys_if_engine_xetex:T { 1 } \exp_stop_f:
@@ -1607,8 +1609,6 @@
% some standard \cs{if_false:} manipulation, while all of the \cs{exp_not:N}
% are required as there is an expansion in the setup.
% \begin{macrocode}
- \char_set_catcode_active:N \^^L
- \cs_set:Npn ^^L { }
\char_set_catcode_active:n { 0 }
\tl_set:Nn \l_@@_tmp_tl { \exp_not:N ^^@ \exp_not:N \or: }
\char_set_catcode_other:n { 0 }
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index 192ec4eb4a..27bf195fc6 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2023-01-16}
+% \date{Released 2023-01-24}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index e48d82b9e9..e1e7603896 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex
index 81a730453d..02c9a23511 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/contrib/l3kernel/source3.tex
@@ -53,7 +53,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2023-01-16}
+\date{Released 2023-01-24}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
index 73bc0db237..06baecf4b6 100644
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
+++ b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
index 31fe280f55..d8d6c134da 100644
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
+++ b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
@@ -5,14 +5,14 @@
% arara: lualatex: {shell: yes, synctex: no, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
\documentclass{article}
-\def\PLversion{2.1.6}
-\def\PLdate{17 Janvier 2023}
+\def\PLversion{2.1.7}
+\def\PLdate{23 Janvier 2023}
\usepackage[pythontex]{ProfLycee}
\usepackage{mathtools}
\usepackage{lualatex-math}
\usepackage{luatexbase}
\usepackage[math-style=french,bold-style=ISO]{fourier-otf}
-\usepackage{tkz-euclide}
+\usepackage[lua]{tkz-euclide}
\usepackage{tkz-tab}
\tikzstyle{every picture}+=[remember picture]
\usetikzlibrary{hobby}
@@ -423,7 +423,7 @@ L'idée est de conserver -- autant que faire se peut -- l'idée de \Cle{Clés} q
\item définies (en majorité) par défaut pour chaque commande.
\end{itemize}
-Pour certaines commandes, le système de \Cle{Clés} pose quelques soucis, de ce fait le fonctionnement est plus \textit{basique} avec un système d'\textsf{arguments} optionnels (entre \textsf{[\ldots]}) ou mandataires (entre \textsf{\{\ldots\}}).
+Pour certaines commandes, le système de \Cle{Clés} pose quelques soucis, de ce fait le fonctionnement est plus \textit{basique} avec un système d'\textsf{arguments} \textit{optionnels} (entre \textsf{[\ldots]}) ou \textit{obligatoires} (entre \textsf{\{\ldots\}}).
\smallskip
@@ -756,7 +756,7 @@ Quelques explications sur les \Cle{clés} et sur les arguments :
\item la clé \Cle{Précision} qui permet de spécifier le nombre de chiffres après la virgule de la solution ; \hfill{}défaut \Cle{2}
\item la clé (obligatoire !) \Cle{Intervalle} qui permet de préciser l'intervalle initial de recherche ;
\item la clé \Cle{Variable} qui permet de spécifier la variable de l'équation ;\hfill{}défaut \Cle{x}
- \item l'argument \textit{mandataire} est l'équation, sous la forme $f(\ldots)=k$ (ou $f(\ldots)$ pour $f(\ldots)=0$) ;
+ \item l'argument \textit{obligatoire} est l'équation, sous la forme $f(\ldots)=k$ (ou $f(\ldots)$ pour $f(\ldots)=0$) ;
\item l'argument \textit{optionnel} est la base de la \textit{<macro>} qui sert à stocker les valeurs :\hfill{}défaut \Cle{masolution}
\begin{itemize}
\item \ctex{\textbackslash<macro>d} pour la valeur approchée par défaut ;
@@ -832,7 +832,7 @@ Plusieurs \Cle{Clés} sont disponibles pour cette commande, relative donc à une
\smallskip
-Le premier argument mandataire est la fonction, en syntaxe \ctex{xint} et avec comme variable $x$, et le second la valeur de $k$.
+Le premier argument \textit{obligatoire} est la fonction, en syntaxe \ctex{xint} et avec comme variable $x$, et le second la valeur de $k$.
\end{codecles}
\begin{codetex}[]
@@ -911,7 +911,7 @@ Plusieurs \Cle{Clés} sont disponibles pour la commande du calcul d'un terme :
\smallskip
-L'argument mandataire est la fonction associée à la suite, en syntaxe \ctex{xint} et avec comme variable $x$.
+L'argument \textit{obligatoire} est la fonction associée à la suite, en syntaxe \ctex{xint} et avec comme variable $x$.
\end{codecles}
\begin{codetex}[listing only]
@@ -960,7 +960,7 @@ Plusieurs \Cle{Clés} sont disponibles pour la commande du seuil :
\smallskip
-Le premier argument mandataire est la fonction associée à la suite, en syntaxe \ctex{xint} et avec comme variable $x$, et le second est le seuil à dépasser.
+Le premier argument \textit{obligatoire} est la fonction associée à la suite, en syntaxe \ctex{xint} et avec comme variable $x$, et le second est le seuil à dépasser.
\end{codecles}
\begin{codetex}[]
@@ -1262,8 +1262,8 @@ Cette commande permet de rajouter une courbe sur le graphique (sans se soucier d
\begin{itemize}
\item \Cle{optionnels} qui sont - en \TikZ{} - les paramètres du tracé ;
- \item le premier mandataire, est - en langage \TikZ{} - l'expression de la fonction à tracer, donc avec \ctex{\textbackslash{}x} comme variable ;
- \item le second mandataire est le domaine du tracé , sous la forme \ctex{valxmin:valxmax}.
+ \item le premier \textit{obligatoire}, est - en langage \TikZ{} - l'expression de la fonction à tracer, donc avec \ctex{\textbackslash{}x} comme variable ;
+ \item le second \textit{obligatoire} est le domaine du tracé , sous la forme \ctex{valxmin:valxmax}.
\end{itemize}
\end{codecles}
@@ -1787,14 +1787,14 @@ Pour des raisons internes, le fonctionnement de la commande \ctex{aidesignetkzta
\end{codetex}
\begin{codecles}
-Les \Cle{Clés} pour le premier argument optionnel sont les mêmes que pour la version \textit{initiale} de la commande précédente.
+Les \Cle{Clés} pour le premier argument \textit{optionnel} sont les mêmes que pour la version \textit{initiale} de la commande précédente.
En ce qui concerne les autres arguments :
\begin{itemize}
- \item le deuxième argument, mandataire, est le numéro de la ligne à côté de laquelle placer le schéma ;
- \item le troisième argument, optionnel et valant \Cle{0.85} par défaut, est l'échelle à appliquer sur l'ensemble du schéma (à ajuster en fonction de la hauteur de la ligne) ;
- \item le quatrième argument, optionnel et valant \Cle{1.5} par défait, est lié à l'écart horizontal entre le bord de la ligne du tableau et le schéma.
+ \item le deuxième argument, \textit{obligatoire}, est le numéro de la ligne à côté de laquelle placer le schéma ;
+ \item le troisième argument, \textit{optionnel} et valant \Cle{0.85} par défaut, est l'échelle à appliquer sur l'ensemble du schéma (à ajuster en fonction de la hauteur de la ligne) ;
+ \item le quatrième argument, \textit{optionnel} et valant \Cle{1.5} par défait, est lié à l'écart horizontal entre le bord de la ligne du tableau et le schéma.
\end{itemize}
À noter que si l'un des arguments optionnels (le n°3 et/ou le n°4) sont utilisés, il vaut mieux préciser les 2 !
@@ -2167,8 +2167,8 @@ Plusieurs \Cle{arguments} sont disponibles :
\begin{itemize}
\item la version \textit{étoilée} qui permet de ne pas afficher les numéros de lignes ;
- \item le premier argument (optionnel), concerne la \Cle{largeur} de la \ctex{tcbox} ;\hfill{}défaut \Cle{\textbackslash linewidth}
- \item le second argument (mandataire), concerne des \Cle{options} de la \ctex{tcbox} en \textit{langage tcolorbox}, comme l'alignement.
+ \item le premier argument (\textit{optionnel}), concerne la \Cle{largeur} de la \ctex{tcbox} ;\hfill{}défaut \Cle{\textbackslash linewidth}
+ \item le second argument (\textit{obligatoire}), concerne des \Cle{options} de la \ctex{tcbox} en \textit{langage tcolorbox}, comme l'alignement.
\end{itemize}
\end{codecles}
@@ -2837,9 +2837,9 @@ Comme pour le pseudo-code, pas d'\textsf{autogobble}, donc commandes à aligner
Peu d'options pour ces commandes :
\begin{itemize}
- \item le premier, optionnel, est la \Cle{largeur} de la \ctex{tcbox} ;\hfill{}défaut \Cle{\textbackslash linewidth}
- \item le deuxième, mandataire, permet de spécifier le titre par la clé \Cle{titre}.\hfill{}défaut \Cle{Terminal Windows/UNiX/OSX}
- \item le troisième, optionnel, concerne les \Cle{options} de la \ctex{tcbox} en \textit{langage tcolorbox}.\hfill{}défaut \Cle{vide}
+ \item le premier, \textit{optionnel}, est la \Cle{largeur} de la \ctex{tcbox} ;\hfill{}défaut \Cle{\textbackslash linewidth}
+ \item le deuxième, \textit{obligatoire}, permet de spécifier le titre par la clé \Cle{titre}.\hfill{}défaut \Cle{Terminal Windows/UNiX/OSX}
+ \item le troisième, \textit{optionnel}, concerne les \Cle{options} de la \ctex{tcbox} en \textit{langage tcolorbox}.\hfill{}défaut \Cle{vide}
\end{itemize}
\end{codecles}
@@ -2937,8 +2937,8 @@ Peu d'options pour ces commandes :
\begin{itemize}
\item la version \textit{étoilée} qui permet de passer de la police \Cle{sffamily} à la police \Cle{ttfamily}, et donc dépendante des fontes du document ;
- \item le deuxième, optionnel, permet de rajouter des caractères après le code (comme un \textsf{espace}) ;\hfill{}défaut \Cle{vide}
- \item le troisième, mandataire, est le \textsf{code capytale} à afficher.
+ \item le deuxième, \textit{optionnel}, permet de rajouter des caractères après le code (comme un \textsf{espace}) ;\hfill{}défaut \Cle{vide}
+ \item le troisième, \textit{obligatoire}, est le \textsf{code capytale} à afficher.
\end{itemize}
\end{codecles}
@@ -3003,8 +3003,8 @@ Il s'agir d'un environnement créé en \ctex{tcolorbox}, et utilisant la présen
Peu de personnalisations pour ces commandes :
\begin{itemize}
- \item le premier argument, optionnel, permet de préciser la \textit{couleur} de la présentation ;\hfill{}défaut \Cle{ForestGreen}
- \item le second, mandataire, correspond aux éventuelles options liées à la \ctex{tcolorbox}.
+ \item le premier argument, \textit{optionnel}, permet de préciser la \textit{couleur} de la présentation ;\hfill{}défaut \Cle{ForestGreen}
+ \item le second, \textit{obligatoire}, correspond aux éventuelles options liées à la \ctex{tcolorbox}.
\end{itemize}
\end{codecles}
@@ -3044,7 +3044,6 @@ L'idée est d'obtenir un pavé droit, dans un environnement \TikZ, avec les nœu
\subsection{Commandes}
\begin{codetex}[listing only]
-...
\begin{tikzpicture}[options tikz]
\PaveTikz[options]
...
@@ -3061,6 +3060,7 @@ Quelques \Cle{clés} sont disponibles pour cette commande :
\item \Cle{Angle} : angle de fuite de la perspective ;\hfill{}défaut \Cle{30}
\item \Cle{Fuite} : coefficient de fuite de la perspective ;\hfill{}défaut \Cle{0.5}
\item \Cle{Sommets} : liste des sommets (avec délimiteur § !) ;\hfill{}défaut \Cle{A§B§C§D§E§F§G§H}
+ \item \Cle{Math} : booléen pour forcer le mode math des sommets ;\hfill{}défaut \Cle{false}
\item \Cle{Epaisseur} : épaisseur des arêtes (en \textit{langage simplifié} \TikZ) ;\hfill{}défaut \Cle{thick}
\item \Cle{Aff} : booléen pour afficher les noms des sommets ;\hfill{}défaut \Cle{false}
\item \Cle{Plein} : booléen pour ne pas afficher les arêtes \textit{invisibles} ;\hfill{}défaut \Cle{false}
@@ -3131,7 +3131,6 @@ L'idée est d'obtenir un tétraèdre, dans un environnement \TikZ, avec les nœu
\subsection{Commandes}
\begin{codetex}[listing only]
-...
\begin{tikzpicture}[options tikz]
\TetraedreTikz[options]
...
@@ -3148,6 +3147,7 @@ Quelques \Cle{clés} sont disponibles pour cette commande :
\item \Cle{Alpha} : angle \textit{du sommet de devant} ;\hfill{}défaut \Cle{40}
\item \Cle{Beta} : angle \textit{du sommet du haut} ;\hfill{}défaut \Cle{60}
\item \Cle{Sommets} : liste des sommets (avec délimiteur § !) ;\hfill{}défaut \Cle{A§B§C§D}
+ \item \Cle{Math} : booléen pour forcer le mode math des sommets ;\hfill{}défaut \Cle{false}
\item \Cle{Epaisseur} : épaisseur des arêtes (en \textit{langage simplifié} \TikZ) ;\hfill{}défaut \Cle{thick}
\item \Cle{Aff} : booléen pour afficher les noms des sommets ;\hfill{}défaut \Cle{false}
\item \Cle{Plein} : booléen pour ne pas afficher l'arête \textit{invisible} .\hfill{}défaut \Cle{false}
@@ -4176,8 +4176,8 @@ Cette commande permet de rajouter une courbe sur le graphique (sans se soucier d
\begin{itemize}
\item \Cle{optionnels} qui sont -- en \TikZ{} -- les paramètres du tracé ;
- \item le premier mandataire, est -- en langage \TikZ{} -- l'expression de la fonction à tracer, donc avec \ctex{\textbackslash{}x} comme variable ;
- \item le second mandataire est le domaine du tracé , sous la forme \ctex{valxmin:valxmax}.
+ \item le premier \textit{obligatoire}, est -- en langage \TikZ{} -- l'expression de la fonction à tracer, donc avec \ctex{\textbackslash{}x} comme variable ;
+ \item le second \textit{obligatoire} est le domaine du tracé , sous la forme \ctex{valxmin:valxmax}.
\end{itemize}
\end{codecles}
@@ -4996,8 +4996,8 @@ Peu de paramétrage pour ces commandes qui permettent de calculer $A_n^p$ et $C_
\begin{itemize}
\item les versions étoilées ne formatent pas le résultat grâce à \ctex{\textbackslash num} de \ctex{sinuitx} ;
\item le booléen \Cle{Formule} permet de présenter la formule avant le résultat ; \hfill~défaut \Cle{false}
- \item le premier argument, \textit{mandataire}, est la valeur de $p$ ;
- \item le second argument, \textit{mandataire}, est la valeur de $n$.
+ \item le premier argument, \textit{obligatoire}, est la valeur de $p$ ;
+ \item le second argument, \textit{obligatoire}, est la valeur de $n$.
\end{itemize}
\end{codecles}
@@ -5080,7 +5080,7 @@ Concernant la commande en elle même, peu de paramétrage :
\begin{itemize}
\item la version \textit{étoilée} qui permet de ne pas afficher de zéros avant pour \og compléter \fg{} ;
\item le booléen \Cle{AffBase} qui permet d'afficher ou non la base des nombres ; \hfill{}défaut \Cle{true}
- \item l'argument, mandataire, est le nombre entier à convertir.
+ \item l'argument, \textit{obligatoire}, est le nombre entier à convertir.
\end{itemize}
Le formatage est géré par \ctex{sinuitx}, le mieux est donc de positionner la commande dans un environnement mathématique.
@@ -5423,8 +5423,8 @@ L'idée est d'obtenir une commande pour \textit{simplifier} un calcul sous forme
Peu d'options pour ces commandes :
\begin{itemize}
-\item le premier argument, optionnel, permet de spécifier le mode de sortie de la fraction \textsf{[t]} pour \textsf{tfrac} et \textsf{[d]} pour \textsf{dfrac} ;
-\item le second, mandataire, est le \textsf{calcul} ou la \textsf{division} à convertir.
+\item le premier argument, \textit{optionnel}, permet de spécifier le mode de sortie de la fraction \textsf{[t]} pour \textsf{tfrac} et \textsf{[d]} pour \textsf{dfrac} ;
+\item le second, \textit{obligatoire}, est le \textsf{calcul} ou la \textsf{division} à convertir.
\end{itemize}
À noter que la macro est dans un bloc \ctex{ensuremath} donc les \ctex{\$...\$} ne sont pas nécessaires.
@@ -5518,13 +5518,13 @@ Les délimiteurs de l'ensemble créé sont toujours \textsf{\{~~\}}.
Peu d'options pour ces commandes :
\begin{itemize}
-\item le premier argument, optionnel, permet de spécifier les \Cle{Clés} :
+\item le premier argument, \textit{optionnel}, permet de spécifier les \Cle{Clés} :
\begin{itemize}
\item clé \Cle{Sep} qui correspond au délimiteur des éléments de l'ensemble ; \hfill{}défaut \Cle{;}
\item clé \Cle{Option} qui est un code (par exemple \textsf{strut}\dots) inséré avant les éléments ;\hfill{}défaut \Cle{vide}
\item un booléen \Cle{Mathpunct} qui permet de préciser si on utilise l'espacement mathématique \textsf{mathpunct};\hfill{}défaut \Cle{true}
\end{itemize}
-\item le second, mandataire, est la \textsf{liste} des éléments, séparés par \textsf{/}.
+\item le second, \textit{obligatoire}, est la \textsf{liste} des éléments, séparés par \textsf{/}.
\end{itemize}
\end{codecles}
@@ -5691,7 +5691,7 @@ Pour cette commande :
\begin{itemize}
\item le booléen \Cle{d} permet de forcer l'affichage en \ctex{displaystyle} ;\hfill{}défaut \Cle{false}
\item le booléen \Cle{Crochets} permet d'afficher le \textit{modulo} entre crochets plutôt qu'entre parenthèses ;\hfill{}défaut \Cle{false}
- \item l'argument mandataire est en écriture \textit{en ligne}.
+ \item l'argument \textit{obligatoire} est en écriture \textit{en ligne}.
\end{itemize}
\end{codecles}
@@ -6242,6 +6242,8 @@ La grille, créée en \TikZ, est portée par le rectangle de \og coins \fg{} $(0
\part{Historique}
+{\small \bverb|v 2.1.7|~:~~~~Ajout d'une clé \textsf{Math} pour les sommets des figures de l'espace (pages \pageref{pave} et \pageref{tetra})
+
{\small \bverb|v 2.1.6|~:~~~~Correction d'un bug lié au chargement de \textsf{hvlogos}, remplacé par \textsf{hologo}
{\small \bverb|v 2.1.5|~:~~~~Combinatoire avec arrangements et combinaisons (page \pageref{combinatoire})
diff --git a/macros/latex/contrib/proflycee/tex/ProfLycee.sty b/macros/latex/contrib/proflycee/tex/ProfLycee.sty
index bca822d00c..ba4d2535df 100644
--- a/macros/latex/contrib/proflycee/tex/ProfLycee.sty
+++ b/macros/latex/contrib/proflycee/tex/ProfLycee.sty
@@ -3,7 +3,8 @@
% or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{ProfLycee}[2023/01/17 2.1.6 Aide pour l'utilisation de LaTeX en lycee]
+\ProvidesPackage{ProfLycee}[2023/01/23 2.1.7 Aide pour l'utilisation de LaTeX en lycee]
+% 2.1.7 Option booléenne Math pour les figures pave/tetraèdre
% 2.1.6 Chargement de hologo à la place de hvlogos (bug potentiel avec \bm)
% 2.1.5 Ajout de commandes pour calculer arrangements et combinaisons
% 2.1.4 Ajout d'une commande pour résoudre de manière approchée une équation f(x)=k
@@ -936,7 +937,8 @@
Fuite=0.5,%
Epaisseur=thick,%
Sommets=A§B§C§D§E§F§G§H,%
- Cube=false
+ Cube=false,%
+ Math=false
}
\newcommand\PaveTikz[1][]{%
@@ -966,16 +968,16 @@
\coordinate (\PaveG) at ($(\PaveC) + (0,{\PFPaveHt})$) ;
\coordinate (\PaveH) at ($(\PaveD) + (0,{\PFPaveHt})$) ;
\ifboolKV[paramspave]{Aff}
- {\draw (\PaveA) node[below left] {\PaveA} ;
- \draw (\PaveB) node[below right] {\PaveB} ;
- \draw (\PaveC) node[above right] {\PaveC} ;
+ {\draw (\PaveA) node[below left] {\ifboolKV[paramspave]{Math}{$\PaveA$}{\PaveA}} ;
+ \draw (\PaveB) node[below right] {\ifboolKV[paramspave]{Math}{$\PaveB$}{\PaveB}} ;
+ \draw (\PaveC) node[above right] {\ifboolKV[paramspave]{Math}{$\PaveC$}{\PaveC}} ;
\ifboolKV[paramspave]{Plein}
{}
- {\draw (\PaveD) node[above left] {\PaveD} ;}
- \draw (\PaveE) node[below left] {\PaveE} ;
- \draw (\PaveF) node[below right] {\PaveF} ;
- \draw (\PaveG) node[above right] {\PaveG} ;
- \draw (\PaveH) node[above left] {\PaveH} ;}
+ {\draw (\PaveD) node[above left] {\ifboolKV[paramspave]{Math}{$\PaveD$}{\PaveD}} ;}
+ \draw (\PaveE) node[below left] {\ifboolKV[paramspave]{Math}{$\PaveE$}{\PaveE}} ;
+ \draw (\PaveF) node[below right] {\ifboolKV[paramspave]{Math}{$\PaveF$}{\PaveF}} ;
+ \draw (\PaveG) node[above right] {\ifboolKV[paramspave]{Math}{$\PaveG$}{\PaveG}} ;
+ \draw (\PaveH) node[above left] {\ifboolKV[paramspave]{Math}{$\PaveH$}{\PaveH}} ;}
{}%on affiche rien
\draw[\PFPaveThick] (\PaveA)--(\PaveB)--(\PaveF)--(\PaveE)--cycle
(\PaveB)--(\PaveC)--(\PaveG)--(\PaveF)--cycle
@@ -1006,6 +1008,7 @@
Beta=60,%
Epaisseur=thick,%
Sommets=A§B§C§D,%
+ Math=false
}
\newcommand\TetraedreTikz[1][]{%
@@ -1023,10 +1026,10 @@
\coordinate (\TetraC) at ({\PFTetraLg},0) ;
\coordinate (\TetraD) at ($(\TetraA) + ({\PFTetraBeta}:{\PFTetraHt})$) ;
\ifboolKV[paramstetra]{Aff}
- {\draw (\TetraA) node[left] {\TetraA} ;
- \draw (\TetraB) node[below] {\TetraB} ;
- \draw (\TetraC) node[right] {\TetraC} ;
- \draw (\TetraD) node[above] {\TetraD} ;}
+ {\draw (\TetraA) node[left] {\ifboolKV[paramstetra]{Math}{$\TetraA$}{\TetraA}} ;
+ \draw (\TetraB) node[below] {\ifboolKV[paramstetra]{Math}{$\TetraB$}{\TetraB}} ;
+ \draw (\TetraC) node[right] {\ifboolKV[paramstetra]{Math}{$\TetraC$}{\TetraC}} ;
+ \draw (\TetraD) node[above] {\ifboolKV[paramstetra]{Math}{$\TetraD$}{\TetraD}} ;}
{}%on affiche rien
\draw[\PFTetraThick] (\TetraA)--(\TetraD)--(\TetraC)--(\TetraB)--cycle
(\TetraD)--(\TetraB) ;
diff --git a/macros/latex/contrib/sidecap/Makefile b/macros/latex/contrib/sidecap/Makefile
deleted file mode 100644
index acdb8b2fdf..0000000000
--- a/macros/latex/contrib/sidecap/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-
-# Makefile for sidecap examples, 2003-02-21, RN
-
-LATEX = elatex
-
-ifneq ($(findstring pdf,$(MAKECMDGOALS)),)
- LATEX = pdfelatex
- PICS := $(PICS:.eps=.pdf)
-endif
-
-PS = sc-test1.ps sc-test2.ps sc-test3.ps sc-test4.ps sc-test5.ps sc-test6.ps
-
-all : $(PS)
-
-pdf : $(PS:.ps=.pdf)
-
-%.ps : %.dvi
- dvips -Pwww $< -o $@
-
-%.dvi %.pdf : %.tex sc-test-common.tex
- $(LATEX) $<
- $(LATEX) $<
-
diff --git a/macros/latex/contrib/sidecap/README b/macros/latex/contrib/sidecap/README.md
index 7838eedf0d..3ff7337544 100644
--- a/macros/latex/contrib/sidecap/README
+++ b/macros/latex/contrib/sidecap/README.md
@@ -1,3 +1,4 @@
+LaTeX package that defines figure/table environments with side labeling
The sidecap package.
@@ -5,11 +6,4 @@ This package defines the new environments SCfigure and SCtable, analogous to
figure and table, which make it easy to typeset captions sideways. The package
knows the options outercaption, innercaption, leftcaption and rightcaption.
-Please send enhancements and corrections to:
-
- Rolf Niepraschk, Rolf.Niepraschk@ptb.de
- Hubert Gaesslein,
-
- 2003/05/04
-
-
+2023/01/24
diff --git a/macros/latex/contrib/sidecap/sc-test-common.tex b/macros/latex/contrib/sidecap/sc-test-common.tex
deleted file mode 100644
index 22b5dd9ff8..0000000000
--- a/macros/latex/contrib/sidecap/sc-test-common.tex
+++ /dev/null
@@ -1,122 +0,0 @@
-
-% `sc-test-comon.tex', part of the LaTeX package `sidecap'
-% 2003-02-21
-% Rolf Niepraschk and Hubert G\"a\ss{}lein -- niepraschk@ptb.de
-
-\setlength{\emergencystretch}{20pt}
-\renewcommand{\textfraction}{0}
-\renewcommand{\topfraction}{1}
-\renewcommand{\bottomfraction}{1}
-\setcounter{bottomnumber}{4}
-\setcounter{topnumber}{4}
-\setcounter{totalnumber}{8}
-
-\errorcontextlines100
-
-\renewcommand\tablename{Tab.} \renewcommand\figurename{Fig.}
-
-\setlength{\belowcaptionskip}{\abovecaptionskip}
-
-\setlength\columnseprule{.4pt}
-
-\newcommand{\FIG}[2][]{%
- \begingroup
- \def\xxx{#1}%
- \ifx\xxx\empty
- \setlength{\unitlength}{\linewidth}%
- \addtolength{\unitlength}{-2\fboxrule}%
- \setlength{\unitlength}{.1\unitlength}%
- \else
- \setlength{\unitlength}{#1}%
- \fi%
- \setlength{\fboxsep}{0pt}%
- \ifcase#2\relax
- \or%
- \fbox{%
- \begin{picture}(4,6)%
- \put(1,5){\circle{1}}%
- \put(3,5){\circle{1}}%
- \put(2,3){\circle{1}}%
- \put(1,1){\circle{1}}%
- \put(3,1){\circle{1}}%
- \end{picture}}%
- \or%
- \fbox{%
- \begin{picture}(10,4)%
- \put(1,3){\circle{1}}%
- \put(9,3){\circle{1}}%
- \put(5,2){\circle{1}}%
- \put(1,1){\circle{1}}%
- \put(9,1){\circle{1}}%
- \end{picture}}%
- \or% (doesn't make a difference to use [b] or [t] or [c] here !!!)
- \begin{minipage}{5\unitlength}%
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text.
- \end{minipage}%
- \or% (doesn't make a difference to use [b] or [t] or [c] here !!!)
- \begin{minipage}{5\unitlength}%
- \strut
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text
- text text text text text text text text.
- \unskip\strut
- \end{minipage}%
- \fi
- \endgroup
-}
-
-\newcommand{\TABi}{%
- \begin{tabular}{@{} | c | c c c c c | @{}} \hline
- \multicolumn{1}{| c} {1}
- & 2 & 3 & 4 & 5 & 6 \\ \cline{2-6}
- 2 & 4 & 6 & 8 & 10 & 12 \\
- 3 & 6 & 9 & 12 & 15 & 18 \\
- 4 & 8 & 12 & 16 & 20 & 24 \\
- 5 & 10 & 15 & 20 & 25 & 30 \\
- 6 & 12 & 18 & 24 & 30 & 36 \\
- 7 & 14 & 21 & 28 & 35 & 42 \\
- 8 & 16 & 24 & 32 & 40 & 48 \\
- 9 & 18 & 27 & 36 & 45 & 54 \\
- 10 & 20 & 30 & 40 & 50 & 60 \\
- 11 & 22 & 33 & 44 & 55 & 66 \\
- 12 & 24 & 36 & 48 & 60 & 72 \\
- 13 & 26 & 39 & 52 & 65 & 78 \\
- 14 & 28 & 42 & 56 & 70 & 84 \\
- \hline
- \end{tabular}%
-}
-
-
-\newcommand{\CAPi}{%
- The dazed brown fox quickly gave 12345--67890 jumps!
- The dazed brown fox quickly gave 12345--67890 jumps!
-}
-
-\newcommand{\CAPii}{%
- The dazed brown fox quickly gave 12345--67890 jumps!
- The dazed brown fox quickly gave 12345--67890 jumps!
- The dazed brown fox quickly gave 12345--67890 jumps!
- The dazed brown fox quickly gave 12345--67890 jumps!
-}
-
-\newcommand{\SHORTCAPi}{%
- The dazed brown fox etc.}
-
-\newcommand*{\MARKER}
- {\noindent\strut\vrule\hrulefill~text area
- (\ifthenelse{\isodd{\thepage}}{odd}{even} page)~\hrulefill\vrule%
- \marginpar{\strut\vrule\hrulefill~margin area~\hrulefill\vrule}}
-
-\endinput
diff --git a/macros/latex/contrib/sidecap/scraggeddemo.tex b/macros/latex/contrib/sidecap/scraggeddemo.tex
new file mode 100644
index 0000000000..0b190108d5
--- /dev/null
+++ b/macros/latex/contrib/sidecap/scraggeddemo.tex
@@ -0,0 +1,128 @@
+
+% Rolf Niepraschk, 2002-05-18
+
+\listfiles
+
+\documentclass[12pt,a4paper,twoside]{article}
+\usepackage[bf,footnotesize]{caption2}
+%\usepackage[leftcaption,ragged]{sidecap}
+\usepackage[innercaption,ragged]{sidecap}
+%\usepackage[innercaption,raggedright,origragged]{sidecap}
+
+
+\renewcommand\tablename{Tab.} \renewcommand\figurename{Fig.}
+\setlength{\belowcaptionskip}{\abovecaptionskip}
+\setlength{\parindent}{0pt}
+
+% --- ???? -----
+\setcounter{topnumber}{4}
+\renewcommand{\topfraction}{.8}
+\setcounter{bottomnumber}{4}
+\renewcommand{\bottomfraction}{.7}
+\setcounter{totalnumber}{10}
+\renewcommand{\textfraction}{.1}
+\renewcommand\floatpagefraction{.7}
+
+\setlength\emergencystretch{20pt}
+
+\setlength\unitlength{1cm}
+\newcommand{\FIGi}{%
+ \fbox{%
+ \begin{picture}(4,6)
+ \put(1,5){\circle{1}}
+ \put(3,5){\circle{1}}
+ \put(2,3){\circle{1}}
+ \put(1,1){\circle{1}}
+ \put(3,1){\circle{1}}
+ \end{picture}}
+}
+
+\newcommand{\TABi}{%
+ \begin{tabular}{@{} | c | c c c c c | @{}} \hline
+ \multicolumn{1}{| c} {1}
+ & 2 & 3 & 4 & 5 & 6 \\ \cline{2-6}
+ 2 & 4 & 6 & 8 & 10 & 12 \\
+ 3 & 6 & 9 & 12 & 15 & 18 \\
+ 4 & 8 & 12 & 16 & 20 & 24 \\
+ 5 & 10 & 15 & 20 & 25 & 30 \\
+ 6 & 12 & 18 & 24 & 30 & 36 \\
+ 7 & 14 & 21 & 28 & 35 & 42 \\
+ 8 & 16 & 24 & 32 & 40 & 48 \\
+ 9 & 18 & 27 & 36 & 45 & 54 \\
+ 10 & 20 & 30 & 40 & 50 & 60 \\
+ 11 & 22 & 33 & 44 & 55 & 66 \\
+ 12 & 24 & 36 & 48 & 60 & 72 \\
+ 13 & 26 & 39 & 52 & 65 & 78 \\
+ 14 & 28 & 42 & 56 & 70 & 84 \\
+ \hline
+ \end{tabular}
+}
+
+\newcommand{\SHORTCAPi}{%
+ Schematischer Aufbau usw.}
+
+\newcommand{\CAPi}{%
+ Schematischer Aufbau eines Diodenlasers. Ober- und Unterseite des Kristalls
+ sind metallisch kontaktiert, die Vorder- und R\"uckseite verspiegelt. Die
+ Dicke der aktiven Zone (pn-\"ubergang) liegt in der Gr\"o{\ss}enordnung von
+ 5\,$\mu$m.}
+
+\makeatletter
+
+\newcommand*\justified{%
+ % \let\SC@justify\relax % geht nicht
+ \centering
+ }
+
+\makeatother
+
+\begin{document}
+
+\section*{The \texttt{SideCap} package (scraggeddemo)}
+
+\begin{figure}[bhp]
+ \centering
+ \FIGi%
+ \caption[\SHORTCAPi]{\CAPi}\label{fig:A}%
+\end{figure}
+
+\begin{SCfigure}[1.2][bhp]
+ \FIGi%
+ \caption[\SHORTCAPi]{\justified\CAPi}\label{fig:B}%
+\end{SCfigure}
+
+\begin{SCfigure}[1.2][bhp]
+ \FIGi%
+ \caption[\SHORTCAPi]{\CAPi}\label{fig:C}%
+\end{SCfigure}
+
+\begin{SCfigure}[][bhp]
+ \FIGi%
+ \caption[\SHORTCAPi]{\CAPi}\label{fig:D}%
+\end{SCfigure}
+
+\begin{SCtable}
+ \caption[\SHORTCAPi]{\CAPi}\label{tab:A}%
+ \FIGi%
+\end{SCtable}
+
+\begin{table}
+ \centering
+ \caption[\SHORTCAPi]{\CAPi}\label{tab:B}%
+ \TABi%
+\end{table}
+
+\begin{SCtable}
+ \caption[\SHORTCAPi]{\CAPi}\label{tab:C}%
+ \TABi%
+\end{SCtable}
+
+\end{document}
+
+
+
+
+
+
+
+
diff --git a/macros/latex/contrib/sidecap/sidecap.dtx b/macros/latex/contrib/sidecap/sidecap.dtx
index f42fa75e45..e23dd1d019 100644
--- a/macros/latex/contrib/sidecap/sidecap.dtx
+++ b/macros/latex/contrib/sidecap/sidecap.dtx
@@ -2,9 +2,8 @@
%% File: sidecap.dtx
%%
%
-%<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\ProvidesPackage{sidecap}
-%<package> [2003/06/06 v1.6f SideCap Package (RN/HjG)]
+%<package>\NeedsTeXFormat{LaTeX2e}[2022-06-01]
+%<package>\ProvidesPackage{sidecap}[2023/01/24 v1.7a SideCap Package (RN/HjG)]
%
%<*driver>
\documentclass{ltxdoc}
@@ -18,49 +17,34 @@
\end{document}
%</driver>
%
-% Copyright 1997--2003 Rolf Niepraschk and Hubert Gaesslein.
+% Copyright 1997--2016 Rolf Niepraschk and Hubert Gaesslein.
+% Copyright 2016--.. Rolf Niepraschk
% This program can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
-% version 1 of the License, or any later version.
+% version 1.3 of the License, or any later version.
%
+% This work has the LPPL maintenance status "author-maintained".
% \fi
%
-% \CheckSum{696}
+% \CheckSum{683}
%
% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-% \iffalse meta-comment
-% ===================================================================
-% @LaTeX-package-file{
-% author = {Rolf Niepraschk, Hubert G\"{a}\ss{}lein}
-% version = "1.6e",
-% date = "04 May 2003",
-% filename = "sidecap.sty",
-% email = "niepraschk@ptb.de (INTERNET)",
-% codetable = "ISO/ASCII",
-% keywords = "LaTeX2e, sideways caption, \SCfigure, \SCtable",
-% supported = "yes",
-% docstring = "LaTeX package which defines new environments
-% for easy typesetting sideways captions and
-% wide floats".
-% }
-% ===================================================================
-% \fi
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
%
% \MakeShortVerb{\|}
% \setlength\parindent{0pt}
@@ -188,7 +172,7 @@
% (which is initialized to 1.0).\\[.5\baselineskip]
% \meta{float} -- & optional; like the floating position parameter of the
% original table\slash figure environments.
-% Default is |tbp|.
+% Default is |tbp|.
% \end{tabular}
% \end{center}
%
@@ -249,7 +233,7 @@
\newcommand*{\SC@IDENT}{SC@\number\value{SC@C}}
\newcommand*\SC@label[1]{\gdef\SC@LABtext{#1}\ignorespaces}
\newcommand*\SC@orig@caption{} \newcommand*\SC@orig@label{}
-\newcommand*\sidecaptionsep{} \newcommand*\SC@pageref{}
+\newcommand*\sidecaptionsep{}
\edef\sidecaptionsep{\the\marginparsep}
\newcommand*\sidecaptionrelwidth{1.0}
\newcommand*\sidecaptionvpos[2]{% 2002/08/31
@@ -316,7 +300,7 @@
% \begin{macrocode}
\if@twoside
\newcommand*{\isSC@ODD}[2]{%
- \ifthenelse{\isodd{\SC@pageref{\SC@IDENT}}}{#1}{#2}}
+ \ifthenelse{\isodd{\pageref{\SC@IDENT}}}{#1}{#2}}
\else
\newcommand*{\isSC@ODD}[2]{#1}%
\fi
@@ -432,16 +416,18 @@
% More simple code for hyperref compatibilty (\cmd\hypergetpageref).}
% \changes{v1.6f (RN/HjG)}{2003/06/06}{Test for presence of package babel
% (\cmd\org@pageref).}
-% \begin{macrocode}
+% \changes{v1.7a (RN)}{2023/01/24}{%
+% Special handling with \cmd\SC@pageref is no longer necessary.}
+% \begin{macrocode}
\AtBeginDocument{%
\ifSC@origRagged\else
\@ifpackageloaded{ragged2e}{}%
{%
\IfFileExists{ragged2e.sty}{%
- \RequirePackage[NewParameters]{ragged2e}}%
+ \RequirePackage[NewParameters]{ragged2e}}%
{%
\PackageWarningNoLine{sidecap}{%
- Package `ragged2e' not found -- expect bad formatting}%
+ Package `ragged2e' not found -- expect bad formatting}%
}%
}
\fi
@@ -451,13 +437,6 @@
\let\RaggedRight\raggedright
\let\Centering\centering
}{}
- \@ifpackageloaded{hyperref}%
- {\let\SC@pageref=\hypergetpageref}%
- {%
- \@ifpackageloaded{babel}%
- {\let\SC@pageref=\org@pageref}%
- {\let\SC@pageref=\pageref}%
- }
}
% \end{macrocode}
%
@@ -730,11 +709,11 @@
\hrule \@height\z@\@depth\z@ %%% Testen, Doku. (Implementierung) !!!
%\show\SC@justify@caption
%%% \tracingall\tracingonline=0
- \SC@justify
- \let\@arrayparboxrestore\relax % sonst Blocksatz! (\@parboxrestore)
- \let\usecaptionmargin\relax % sonst Pseudo-Blocksatz, nicht-alternierend!
-% \isSC@ODD {\RaggedRight }{\RaggedLeft }
-%%% A B C
+ \SC@justify
+ \let\@arrayparboxrestore\relax % sonst Blocksatz! (\@parboxrestore)
+ \let\usecaptionmargin\relax % sonst Pseudo-Blocksatz, nicht-alternierend!
+% \isSC@ODD {\RaggedRight }{\RaggedLeft }
+%%% A B C
% \isSC@ODD{\typeout{xxxxx ungerade}}{\typeout{xxxxx gerade}}%
% \def\@makecaption##1##2{##1: ##2\endgraf}%
% \@parboxrestore
@@ -762,7 +741,7 @@
\ifx\SC@LABtext\@empty\else
\SC@orig@label{\SC@LABtext}\fi% \expandafter\protect
\fi
-%%% X Y Z
+%%% X Y Z
\hrule \@height\z@\@depth\z@
\endminipage}%
{\minipage[\SC@vpos]{\SC@BOXWD}%
diff --git a/macros/latex/contrib/sidecap/sidecap.pdf b/macros/latex/contrib/sidecap/sidecap.pdf
index 5482eef650..d8510924a4 100644
--- a/macros/latex/contrib/sidecap/sidecap.pdf
+++ b/macros/latex/contrib/sidecap/sidecap.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-euclide/README.md b/macros/latex/contrib/tkz/tkz-euclide/README.md
index c476d7a07f..a34b5244d2 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/README.md
+++ b/macros/latex/contrib/tkz/tkz-euclide/README.md
@@ -1,6 +1,6 @@
# tkz-euclide — for euclidean geometry
-Release 5.00c 2023/01/23
+Release 5.01c 2023/01/24
## Description
@@ -10,6 +10,7 @@ It uses a Cartesian coordinate system orthogonormal (unit 1cm)
as well as tools to define the unique coordinates of points and to
manipulate them. The idea is to allow you to follow step by step a construction
that would be done by hand as naturally as possible.
+Now tkz-euclide introduces a "lua" option which allows to do most of the calculations using "lua".
## Licence
@@ -63,6 +64,9 @@ Other examples, in French, are on my site.
## History
+
+- 5.01c Correction of the date of the file tkz-euclide.sty. Cleaned up the file tkz-tools-lua-math.tex. Added file tkz-obj-eu-points-spc.tex
+
- 5.00c Added the "lua" option to the package, allowing to perform most of the calculations with "lua". This saves time and precision;
- 4.25c. Remove \input{tkz-obj-eu-draw-triangles.tex} from the list of files to load.
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
index 1f4e33dd60..6b74c07eed 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/latex/TKZdoc-euclide-main.tex
@@ -22,10 +22,10 @@
]{tkz-doc}
%\usepackage{etoc}
\gdef\tkznameofpack{tkz-euclide}
-\gdef\tkzversionofpack{5.00c}
+\gdef\tkzversionofpack{5.01c}
\gdef\tkzdateofpack{\today}
\gdef\tkznameofdoc{doc-tkz-euclide}
-\gdef\tkzversionofdoc{5.00c}
+\gdef\tkzversionofdoc{5.01c}
\gdef\tkzdateofdoc{\today}
\gdef\tkzauthorofpack{Alain Matthes}
\gdef\tkzadressofauthor{}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf b/macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
index c24f592ca7..750038a99a 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
+++ b/macros/latex/contrib/tkz/tkz-euclide/doc/tkz-euclide.pdf
Binary files differ
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
index 3676422441..07e35c0cb9 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-angles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tool-eu-angles.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tool-eu-angles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzSetUpArc
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
index 8a9764d763..9f933d8177 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-circles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-draw-circles.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-draw-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzSetUpCircle
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
index 76f3a888be..d42d713738 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-compass.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-compass.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-compass.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Author Alain Matthes
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
index 216bc15fcb..0d02cb215e 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-lines.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-draw-lines.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-draw-lines.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
index eeffaecff2..ed09b0d08a 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-points.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-points.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-points.tex}
\makeatletter
%<--------------------------------------------------------------------------->
% tkzSetUpPoint définit la forme d'un point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
index a0f59a0a65..575a017e96 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-polygons.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-polygons.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-polygons.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Polygon
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
index fb995eead7..01e5a61fc1 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-protractor.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-protractor.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-protractor.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% !!! idea from Y. Combe !!!
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
index 685ee59242..389a660ce2 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-sectors.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-sectors.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-sectors.tex}
\makeatletter
%<----------------------- Sectors ------------------------------–>
\gdef\tkz@nums{0}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
index 2f5d97bc98..727fb8347d 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/drawings/tkz-draw-eu-show.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-show.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-show.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% finding specific points in a triangle
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
index 3e536edc33..918161e00b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-marks.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-lib-eu-marks.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-lib-eu-marks.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Création des symboles
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
index 522e205162..7beadbb97c 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/libs/tkz-lib-eu-shape.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-lib-eu-shape.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-lib-eu-shape.tex}
%<--------------------------------------------------------------------------–>
% Création des symboles
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex
index 9be8dd8be7..7c7f37823f 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-circles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-lua-circles.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-lua-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzCircle center and one point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex
index 1db32f48bf..048739354a 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-by.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-lua-points-by.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-lua-points-by.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Transformations Géométriques
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex
index 9ed94b26e0..85c1930bfe 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-spc.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
+\def\fileversion{5.01c}
\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-lua-points.tex}
+\typeout{2023/01/23 5.01c tkz-obj-lua-points.tex}
\makeatletter
%add ExCenter
%<--------------------------------------------------------------------------–>
@@ -47,21 +47,6 @@
\endgroup
}
-% \def\tkzDefCentroid(#1){%
-% \begingroup
-% \xdef\tkz@arg{}
-% \foreach \X in {#1}
-% {%
-% \ifx\tkzutil@empty\tkz@arg%
-% \xdef\tkz@arg{\X=1}
-% \else
-% \xdef\tkz@arg{\tkz@arg,\X=1}
-% \fi
-% }
-% \path[coordinate] (barycentric cs:\tkz@arg) coordinate (tkzPointResult);
-% \endgroup
-% }
-
%<--------------------------------------------------------------------------–>
% milieu de deux points
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex
index 73a3d9799f..95e2d24547 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points-with.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-lua-points-with.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-lua-points-with.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Vectors
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex
index 4a81392c5d..6fdd4d6670 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj-lua/tkz-obj-lua-points.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-lua-points.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-lua-points.tex}
\makeatletter
%<--------------------------------------------------------------------------->
% init def point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
index 3d2fedacc2..1ec777e71b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-axesmin.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-axesmin}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-axesmin}
\makeatletter
\def\removedot#1.{#1}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
index b4f7f8ebaf..b33e43bfc4 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles-by.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-circles.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzCircle center and one point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
index 4428f407f5..8f8f7ef830 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-circles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-circles.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-circles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzCircle center and one point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
index c6c1be300d..a25e114c83 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-grids.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-grids.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-grids.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Setup Grid
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
index 5d5e2934fe..e5a0f519af 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-lines.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-lines.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-lines.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% les lignes
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
index 2af038e957..8733eb999d 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-by.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-points-by.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-points-by.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Transformations Géométriques
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
index a5aa32776a..956ddddc8b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-rnd.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-points-rnd.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-points-rnd.tex}
%<--------------------------------------------------------------------------–>
\makeatletter
%<-------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex
new file mode 100644
index 0000000000..174342a444
--- /dev/null
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-spc.tex
@@ -0,0 +1,628 @@
+% tkz-obj-eu-points.tex
+% Copyright 2023 Alain Matthes
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+% This work has the LPPL maintenance status “maintained”.
+% The Current Maintainer of this work is Alain Matthes.
+
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-el-points.tex}
+\makeatletter
+%add ExCenter
+%<--------------------------------------------------------------------------–>
+% Specific points
+%<--------------------------------------------------------------------------–>
+% barycentre
+%<--------------------------------------------------------------------------–>
+\def\tkzDefBarycentricPoint(#1){%
+\begingroup
+ \path[coordinate] (barycentric cs:#1) coordinate (tkzPointResult);
+\endgroup
+}
+\let\tkzDefBCPoint\tkzDefBarycentricPoint
+
+%<--------------------------------------------------------------------------–>
+% milieu de deux points
+%<--------------------------------------------------------------------------–>
+% possible \coordinate (#3) at ($(#1)!0.5!(#2)$);
+%<--------------------------------------------------------------------------–>
+% \def\tkzDefMidPoint(#1,#2){%
+% \begingroup
+% \path (#1) -- (#2) coordinate[pos=.5](tkzPointResult);
+% \endgroup
+% }
+\def\tkzDefMidPoint(#1,#2){%
+\begingroup
+ \pgf@process{\pgfpointanchor{#1}{center}}%
+ \tkz@ax\pgf@x%
+ \tkz@ay\pgf@y%
+ \pgf@process{\pgfpointanchor{#2}{center}}%
+ \tkz@bx\pgf@x%
+ \tkz@by\pgf@y%
+ \advance\tkz@bx by\tkz@ax\relax%
+ \advance\tkz@by by\tkz@ay\relax%
+ \divide\tkz@bx by2\relax%
+ \divide\tkz@by by2\relax
+ \pgfcoordinate{tkzPointResult}{\pgfqpoint{\tkz@bx}{\tkz@by}}
+\endgroup
+}
+\def\tkz@DefMidPoint(#1,#2,#3,#4){%
+\begingroup
+ \tkz@ax#1%
+ \tkz@ay#2%
+ \tkz@bx#3%
+ \tkz@by#4%
+ \advance\tkz@bx by\tkz@ax\relax%
+ \advance\tkz@by by\tkz@ay\relax%
+ \divide\tkz@bx by2\relax%
+ \divide\tkz@by by2\relax
+ \pgfcoordinate{tkzPointResult}{\pgfqpoint{\tkz@bx}{\tkz@by}}
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+\def\tkz@simicenter{0}
+\pgfkeys{/tkzsimicenter/.cd,
+ ext/.code = \def\tkz@simicenter{0},
+ int/.code = \def\tkz@simicenter{1},
+ ext
+}%
+
+\def\tkzDefSimilitudeCenter{\pgfutil@ifnextchar[{\tkz@DefSimilitudeCenter}%
+ {\tkz@DefSimilitudeCenter[]}}
+\def\tkz@DefSimilitudeCenter[#1](#2,#3)(#4,#5){%
+\pgfqkeys{/tkzsimicenter}{#1}
+\begingroup
+\ifcase\tkz@simicenter%
+ \tkzDefExtSimilitudeCenter[#1](#2,#3)(#4,#5)
+ \or% 1
+ \tkzDefIntSimilitudeCenter[#1](#2,#3)(#4,#5)
+\fi
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% Internal Similitude center
+% Two circles have two similitude centers namely the internal center of
+% similitude Si and the external similitude center Se.
+%<--------------------------------------------------------------------------–>
+\def\tkz@numhomo{0}
+\pgfkeys{
+/tkzSimilitudeCenter/.cd,
+ node/.code = \def\tkz@numhomo{0},
+ R/.code = \def\tkz@numhomo{1},
+ node,
+ /tkzSimilitudeCenter/.unknown/.code = {\let\searchname=\pgfkeyscurrentname
+ \pgfkeysalso{\searchname/.try=#1, /tikz/\searchname/.retry=#1}}
+}
+\def\tkzDefIntSimilitudeCenter{\pgfutil@ifnextchar[{\tkz@DefIntSimilitudeCenter}{\tkz@DefIntSimilitudeCenter[]}}
+\def\tkz@DefIntSimilitudeCenter[#1](#2,#3)(#4,#5){%
+\begingroup
+\pgfqkeys{/tkzSimilitudeCenter}{#1}
+\ifcase\tkz@numhomo%
+ \tkz@@CalcLengthcm(#2,#3){tkz@rt}%
+ \tkz@@CalcLengthcm(#4,#5){tkz@rf}%
+ \or% 1
+ \def\tkz@rt{#3}%
+ \def\tkz@rf{#5}%
+\fi
+\pgfinterruptboundingbox
+ \path[coordinate](barycentric cs:#2=\tkz@rf,#4=\tkz@rt)coordinate (tkzPointResult);
+ \endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefIntHomotheticCenter\tkzDefIntSimilitudeCenter
+%<--------------------------------------------------------------------------–>
+% External Similitude center
+%<--------------------------------------------------------------------------–>
+\def\tkzDefExtSimilitudeCenter{\pgfutil@ifnextchar[{\tkz@DefExtSimilitudeCenter}{\tkz@DefExtSimilitudeCenter[]}}
+
+\def\tkz@DefExtSimilitudeCenter[#1](#2,#3)(#4,#5){%
+\begingroup
+\pgfqkeys{/tkzSimilitudeCenter}{#1}
+\ifcase\tkz@numhomo%
+ \tkz@@CalcLengthcm(#2,#3){tkz@rt}%
+ \tkz@@CalcLengthcm(#4,#5){tkz@rf}%
+ \or% 1
+ \def\tkz@rt{#3}%
+ \def\tkz@rf{#5}%
+\fi
+ \pgfinterruptboundingbox
+ \path[coordinate](barycentric cs:#2=-\tkz@rf,#4=\tkz@rt) coordinate(tkzPointResult);
+ \endpgfinterruptboundingbox
+\endgroup
+}
+
+\let\tkzDefExtHomotheticCenter\tkzDefExtSimilitudeCenter
+%<--------------------------------------------------------------------------–>
+% Harmonic Division
+%<--------------------------------------------------------------------------–>
+% A , B , C ,D CA/CB = DA/DB
+%<--------------------------------------------------------------------------–>
+\def\tkz@numdha{0}
+\pgfkeys{/tkzharmonic/.cd,
+ ext/.code = \def\tkz@numdha{0},
+ int/.code = \def\tkz@numdha{1},
+ both/.code = \def\tkz@numdha{2},
+ both,
+}%
+
+\def\tkzDivHarmonic{\pgfutil@ifnextchar[{\tkz@DivHarmonic}{\tkz@DivHarmonic[]}}
+\def\tkz@DivHarmonic[#1](#2){%
+\begingroup
+\pgfqkeys{/tkzharmonic}{#1}
+ \ifcase\tkz@numdha%
+ \tkzDefDivHarmonicExt(#2)
+ \or%
+ \tkzDefDivHarmonicInt(#2)
+ \or%
+ \tkzDefDivHarmonicBoth(#2)
+ \fi
+\endgroup
+}
+
+\def\tkzDefDivHarmonicExt(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+ \tkz@VecKOrth[](#1,#2) \tkzGetPoint{tkz@px}
+ \tkzDefMidPoint(tkz@px,#2) \tkzGetPoint{tkz@py}
+ \tkzInterLL(tkz@px,#3)(#1,tkz@py) \tkzGetPoint{tkz@pz}
+ \tkzInterLL(#2,tkz@pz)(#1,tkz@px) \tkzGetPoint{tkz@px}
+ \tkzInterLL(tkz@py,tkz@px)(#1,#2) \tkzGetPoint{tkzPointResult}
+\endpgfinterruptboundingbox
+\endgroup
+}
+
+\def\tkzDefDivHarmonicInt(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+ \tkz@VecKOrth[1](#1,#2) \tkzGetPoint{tkz@px}
+ \tkzDefMidPoint(tkz@px,#2) \tkzGetPoint{tkz@py}
+ \tkzInterLL(tkz@py,#3)(#1,tkz@px) \tkzGetPoint{tkz@pz}
+ \tkzInterLL(#2,tkz@pz)(#1,tkz@py) \tkzGetPoint{tkz@py}
+ \tkzInterLL(tkz@py,tkz@px)(#1,#2) \tkzGetPoint{tkzPointResult}
+\endpgfinterruptboundingbox
+\endgroup
+}
+
+\def\tkzDefDivHarmonicBoth(#1,#2,#3){%
+\begingroup
+\edef\tkz@k{\fpeval{#3}}
+ \path[coordinate] (barycentric cs:#1=1,#2={\tkz@k}) coordinate (tkzFirstPointResult);
+ \path[coordinate] (barycentric cs:#1=1,#2={-\tkz@k}) coordinate (tkzSecondPointResult);
+\endgroup
+}
+
+\let\tkzDefHarmonic\tkzDivHarmonic
+%<--------------------------------------------------------------------------–>
+% golden ratio
+%<--------------------------------------------------------------------------–>
+\def\tkzDefGoldenRatio(#1,#2){%
+\begingroup
+\tkzDefPointWith[linear,K=\tkzInvPhi](#1,#2)
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% triangle center
+%<--------------------------------------------------------------------------–>
+
+\def\tkz@numtc{0}
+\pgfkeys{/tkzDefTriangleCenter/.cd,
+ ortho/.code = \def\tkz@numtc{0},
+ orthic/.code = \def\tkz@numtc{0},
+ centroid/.code = \def\tkz@numtc{1},
+ median/.code = \def\tkz@numtc{1},
+ circum/.code = \def\tkz@numtc{2},
+ in/.code = \def\tkz@numtc{3},
+ ex/.code = \def\tkz@numtc{4},
+ euler/.code = \def\tkz@numtc{5},
+ symmedian/.code = \def\tkz@numtc{6},
+ lemoine/.code = \def\tkz@numtc{6},
+ grebe/.code = \def\tkz@numtc{6},
+ spieker/.code = \def\tkz@numtc{7},
+ gergonne/.code = \def\tkz@numtc{8},
+ nagel/.code = \def\tkz@numtc{9},
+ mittenpunkt/.code = \def\tkz@numtc{10},
+ feuerbach/.code = \def\tkz@numtc{11},
+ circum
+}
+\def\tkzDefTriangleCenter{\pgfutil@ifnextchar[{\tkz@DefTriangleCenter}{\tkz@DefTriangleCenter[]}}
+\def\tkz@DefTriangleCenter[#1](#2){%
+\begingroup
+\pgfqkeys{/tkzDefTriangleCenter}{#1}
+\ifcase\tkz@numtc%
+ \tkzOrthoCenter(#2)
+ \or% 1
+ \tkzCentroid(#2)
+ \or% 2
+ \tkzCircumCenter(#2)
+ \or% 3
+ \tkzInCenter(#2)
+ \or% 4
+ \tkzExCenter(#2)
+ \or% 5
+ \tkzEulerCenter(#2)
+ \or% 6
+ \tkzSymmedianCenter(#2)
+ \or% 7
+ \tkzSpiekerCenter(#2)
+ \or% 8
+ \tkzGergonneCenter(#2)
+ \or%9
+ \tkzNagelCenter(#2)
+ \or%10
+ \tkzMittenpunktCenter(#2)
+ \or%11
+ \tkzFeuerbachCenter(#2)
+ \fi
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% OrthoCenter
+%<--------------------------------------------------------------------------–>
+\def\tkzOrthoCenter(#1,#2,#3){%
+\begingroup
+ \pgfinterruptboundingbox
+ \tkzUProjection(#1,#2)(#3)
+ \pgfnodealias{ort@pta}{tkzPointResult}
+ \tkzUProjection(#1,#3)(#2)
+ \pgfnodealias{ort@ptb}{tkzPointResult}
+ \tkzInterLL(#2,ort@ptb)(#3,ort@pta)
+ \endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefOrthoCenter\tkzOrthoCenter
+%<--------------------------------------------------------------------------–>
+% GravityCenter modif 3.03
+%<--------------------------------------------------------------------------–>
+\def\tkzCentroid(#1,#2,#3){%
+\begingroup
+ \pgf@process{\pgfpointanchor{#1}{center}}%
+ \tkz@ax\pgf@x%
+ \tkz@ay\pgf@y%
+ \pgf@process{\pgfpointanchor{#2}{center}}%
+ \tkz@bx\pgf@x%
+ \tkz@by\pgf@y%
+ \pgf@process{\pgfpointanchor{#3}{center}}%
+ \tkz@cx\pgf@x%
+ \tkz@cy\pgf@y%
+ \advance\tkz@cx by\tkz@ax\relax%
+ \advance\tkz@cy by\tkz@ay\relax%
+ \advance\tkz@cx by\tkz@bx\relax%
+ \advance\tkz@cy by\tkz@by\relax%
+ \divide\tkz@cx by3\relax%
+ \divide\tkz@cy by3\relax
+ \pgfinterruptboundingbox
+ \pgfcoordinate{tkzPointResult}{\pgfqpoint{\tkz@cx}{\tkz@cy}}
+ \endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzBaryCenter\tkzCentroid
+
+%<--------------------------------------------------------------------------–>
+% CircumCenter
+%<--------------------------------------------------------------------------–>
+\def\tkzCircumCenter(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+ \tkzDefMediatorLine(#1,#2)
+ \pgf@process{\pgfpointanchor{tkzFirstPointResult}{center}}%
+ \tkz@ax\pgf@x%
+ \tkz@ay\pgf@y%
+ \pgf@process{\pgfpointanchor{tkzSecondPointResult}{center}}%
+ \tkz@bx\pgf@x%
+ \tkz@by\pgf@y%
+ \tkzDefMediatorLine(#1,#3)
+ \pgf@process{\pgfpointanchor{tkzFirstPointResult}{center}}%
+ \tkz@cx\pgf@x%
+ \tkz@cy\pgf@y%
+ \pgf@process{\pgfpointanchor{tkzSecondPointResult}{center}}%
+ \tkz@dx\pgf@x%
+ \tkz@dy\pgf@y%
+\tkzInterLLxy(\tkz@ax,\tkz@ay,\tkz@bx,\tkz@by)(\tkz@cx,\tkz@cy,\tkz@dx,\tkz@dy)%
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefCircumCenter\tkzCircumCenter
+%<--------------------------------------------------------------------------–>
+% InCenter
+%<--------------------------------------------------------------------------–>
+\def\tkzInCenter(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+\tkzDefBisectorLine(#3,#1,#2)
+\pgf@process{\pgfpointanchor{tkzPointResult}{center}}%
+\tkz@bx\pgf@x%
+\tkz@by\pgf@y%
+\tkzDefBisectorLine(#3,#2,#1)
+\pgf@process{\pgfpointanchor{tkzPointResult}{center}}%
+\tkz@dx\pgf@x%
+\tkz@dy\pgf@y%
+\pgf@process{\pgfpointanchor{#1}{center}}%
+\tkz@ax\pgf@x%
+\tkz@ay\pgf@y%
+\pgf@process{\pgfpointanchor{#2}{center}}%
+\tkz@cx\pgf@x%
+\tkz@cy\pgf@y%
+\tkzInterLLxy(\tkz@ax,\tkz@ay,\tkz@bx,\tkz@by)(\tkz@cx,\tkz@cy,\tkz@dx,\tkz@dy)%
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefInCenter\tkzInCenter
+%<--------------------------------------------------------------------------–>
+% ExCenter
+%<--------------------------------------------------------------------------–>
+\def\tkzExCenter(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+\tkzDefBisectorOutLine(#2,#1,#3)
+\pgf@process{\pgfpointanchor{tkzPointResult}{center}}%
+\tkz@bx\pgf@x%
+\tkz@by\pgf@y%
+\tkzDefBisectorOutLine(#2,#3,#1)
+\pgf@process{\pgfpointanchor{tkzPointResult}{center}}%
+\tkz@dx\pgf@x%
+\tkz@dy\pgf@y%
+\pgf@process{\pgfpointanchor{#1}{center}}%
+\tkz@ax\pgf@x%
+\tkz@ay\pgf@y%
+\pgf@process{\pgfpointanchor{#3}{center}}%
+\tkz@cx\pgf@x%
+\tkz@cy\pgf@y%
+\tkzInterLLxy(\tkz@ax,\tkz@ay,\tkz@bx,\tkz@by)(\tkz@cx,\tkz@cy,\tkz@dx,\tkz@dy)%
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefExCenter\tkzExCenter
+%<--------------------------------------------------------------------------–>
+% EulerCenter neuf points
+%<--------------------------------------------------------------------------–>
+\def\tkzEulerCenter(#1,#2,#3){%
+% mileu de orthocentre et centre cercle circonscrit
+% passe par les midpoints par les pieds des hauteurs
+\begingroup
+\pgfinterruptboundingbox
+\tkzDefMidPoint(#1,#2)
+\pgfnodealias{eu@mic}{tkzPointResult}
+\tkzDefMidPoint(#1,#3)
+\pgfnodealias{eu@mib}{tkzPointResult}
+\tkzDefMidPoint(#2,#3)
+\pgfnodealias{eu@mia}{tkzPointResult}
+\tkzCircumCenter(eu@mia,eu@mib,eu@mic)
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzNinePointCenter\tkzEulerCenter
+\let\tkzDefEulerCenter\tkzEulerCenter
+%<--------------------------------------------------------------------------–>
+%Symmedian center Lemoine point Grebe point K
+%<--------------------------------------------------------------------------–>
+\def\tkzSymmedianCenter(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+\tkzDefMidPoint(#2,#3)
+\pgfnodealias{eu@mic}{tkzPointResult}
+\tkzDefMidPoint(#1,#3)
+\pgfnodealias{eu@mib}{tkzPointResult}
+\tkzUProjection(#2,#3)(#1)
+\pgfnodealias{ort@pta}{tkzPointResult}
+\tkzDefMidPoint(#1,ort@pta)
+\pgfnodealias{eu@mid}{tkzPointResult}
+\tkzUProjection(#1,#3)(#2)
+\pgfnodealias{ort@ptb}{tkzPointResult}
+\tkzDefMidPoint(#2,ort@ptb)
+\pgfnodealias{eu@mie}{tkzPointResult}
+\tkzInterLL(eu@mic,eu@mid)(eu@mib,eu@mie)
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzLemoinePoint\tkzSymmedianCenter
+\let\tkzGrebePoint\tkzSymmedianCenter
+\let\tkzDefLemoinePoint\tkzLemoinePoint
+%<--------------------------------------------------------------------------–>
+% Spieker center
+%<--------------------------------------------------------------------------–>
+\def\tkzSpiekerCenter(#1,#2,#3){%
+\begingroup
+% we need to get the midpoints
+\pgfcoordinate{tkz@m3}{%
+ \pgfpointscale{0.5}{%
+ \pgfpointadd{\pgfpointanchor{#1}{center}}%
+ {\pgfpointanchor{#2}{center}}}}%
+\pgfcoordinate{tkz@m2}{%
+ \pgfpointscale{0.5}{%
+ \pgfpointadd{\pgfpointanchor{#1}{center}}%
+ {\pgfpointanchor{#3}{center}}}}%
+\pgfcoordinate{tkz@m1}{%
+ \pgfpointscale{0.5}{%
+ \pgfpointadd{\pgfpointanchor{#2}{center}}%
+ {\pgfpointanchor{#3}{center}}}}%
+\tkzInCenter(tkz@m1,tkz@m2,tkz@m3)
+\endgroup
+}
+\let\tkzDefSpiekerCenter\tkzSpiekerCenter
+%<--------------------------------------------------------------------------–>
+% Gergonne center Ge
+%<--------------------------------------------------------------------------–>
+\def\tkzGergonneCenter(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+\tkzInCenter(#1,#2,#3)
+\pgfnodealias{tkz@ptin}{tkzPointResult}
+\tkzUProjection(#2,#3)(tkz@ptin)
+\pgfnodealias{tkz@oca}{tkzPointResult}
+\tkzUProjection(#1,#3)(tkz@ptin)
+\pgfnodealias{tkz@ocb}{tkzPointResult}
+\tkzInterLL(#1,tkz@oca)(#2,tkz@ocb)
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefGergonneCenter\tkzGergonneCenter
+%<--------------------------------------------------------------------------–>
+% Nagel center Na
+%<--------------------------------------------------------------------------–>
+% INa = 3 IG. Nagel point % correction 02/02/20
+\def\tkzNagelCenter(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+\tkzDefExcentralTriangle(#1,#2,#3){tkz@a,tkz@b,tkz@c}
+\tkzUProjection(#2,#3)(tkz@a)
+\pgfnodealias{tkz@tgta}{tkzPointResult}
+\tkzUProjection(#1,#2)(tkz@c)
+\pgfnodealias{tkz@tgtc}{tkzPointResult}
+\tkzInterLL(#1,tkz@tgta)(#3,tkz@tgtc)
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefNagelCenter\tkzNagelCenter
+%<--------------------------------------------------------------------------–>
+% Mittenpunkt
+%<--------------------------------------------------------------------------–>
+\def\tkzMittenpunktCenter(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+\tkzExCenter(#2,#3,#1)
+\pgfnodealias{tkz@a}{tkzPointResult}
+\tkzExCenter(#3,#1,#2)
+\pgfnodealias{tkz@b}{tkzPointResult}
+\pgfcoordinate{tkz@ma}{%
+\pgfpointscale{0.5}{%
+\pgfpointadd{\pgfpointanchor{#1}{center}}{\pgfpointanchor{#2}{center}}}}%
+\pgfcoordinate{tkz@mb}{%
+\pgfpointscale{0.5}{%
+\pgfpointadd{\pgfpointanchor{#2}{center}}{\pgfpointanchor{#3}{center}}}}%
+\tkzInterLL(tkz@a,tkz@ma)(tkz@b,tkz@mb)
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefMittenpunktCenter\tkzMittenpunktCenter
+\let\tkzDefMiddlespoint\tkzMittenpunktCenter
+%<--------------------------------------------------------------------------–>
+% Feuerbach point
+%<--------------------------------------------------------------------------–>
+\def\tkzFeuerbachCenter(#1,#2,#3){%
+\begingroup
+\pgfinterruptboundingbox
+\tkzEulerCenter(#1,#2,#3)
+\pgfnodealias{tkz@euler}{tkzPointResult}
+\tkzInCenter(#1,#2,#3)
+\pgfnodealias{tkz@in}{tkzPointResult}
+\tkzUProjection(#2,#3)(tkzPointResult)
+\tkzInterLC(tkz@in,tkz@euler)(tkz@in,tkzPointResult)\tkzGetFirstPoint{tkz@fe}
+\tkzRenamePoint(tkz@fe){tkzPointResult}
+\endpgfinterruptboundingbox
+\endgroup
+}
+\let\tkzDefFeuerbachCenter\tkzFeuerbachCenter
+%<--------------------------------------------------------------------------–>
+% Orthogonal center
+%<--------------------------------------------------------------------------–>
+\def\tkzOrthogonalCenter(#1,#2){%
+\begingroup
+\pgfinterruptboundingbox
+\tkz@VecK[\tkz@koeff/(1+\tkz@koeff)](#1,#2)
+\pgfnodealias{tkzFirstPointResult}{tkzPointResult}
+\tkz@VecK[\tkz@koeff/(\tkz@koeff-1)](#1,#2)
+\pgfnodealias{tkzSecondPointResult}{tkzPointResult}
+\tkzDefMidPoint(tkzFirstPointResult,tkzSecondPointResult)
+\endpgfinterruptboundingbox
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% End Triangle center
+%<--------------------------------------------------------------------------–>
+%<--------------------------------------------------------------------------–>
+% Projection center of excircles
+%<--------------------------------------------------------------------------–>
+\def\tkzDefProjExcenter{\pgfutil@ifnextchar[{%
+ \tkz@DefProjExcenter}{%
+ \tkz@DefProjExcenter[]}
+ }
+\def\tkz@DefProjExcenter[#1](#2,#3,#4)(#5)#6{
+\begingroup
+ \SetUpPTTR{#1}
+ \foreach \name [count=\i] in {#5} {%
+ \global\expandafter\edef\csname tkz@pt\i\endcsname{\name}
+ }
+ \foreach \name [count=\i] in {#6} {%
+ \global\expandafter\edef\csname tkz@ppt\i\endcsname{\name}
+ }
+\tkzDefPointBy[projection=onto #3--#4 ](\tkz@pttr@name \csname tkz@pt1\endcsname)
+\pgfnodealias{\csname tkz@ppt1\endcsname\csname tkz@pt1\endcsname}{tkzPointResult}
+\tkzDefPointBy[projection=onto #3--#4 ](\tkz@pttr@name \csname tkz@pt2\endcsname)
+\pgfnodealias{\csname tkz@ppt1\endcsname\csname tkz@pt2\endcsname}{tkzPointResult}
+\tkzDefPointBy[projection=onto #3--#4 ](\tkz@pttr@name \csname tkz@pt3\endcsname)
+\pgfnodealias{\csname tkz@ppt1\endcsname\csname tkz@pt3\endcsname}{tkzPointResult}
+\tkzDefPointBy[projection=onto #2--#4 ](\tkz@pttr@name \csname tkz@pt1\endcsname)
+\pgfnodealias{\csname tkz@ppt2\endcsname\csname tkz@pt1\endcsname}{tkzPointResult}
+\tkzDefPointBy[projection=onto #2--#4 ](\tkz@pttr@name \csname tkz@pt2\endcsname)
+\pgfnodealias{\csname tkz@ppt2\endcsname\csname tkz@pt2\endcsname}{tkzPointResult}
+\tkzDefPointBy[projection=onto #2--#4 ](\tkz@pttr@name \csname tkz@pt3\endcsname)
+\pgfnodealias{\csname tkz@ppt2\endcsname\csname tkz@pt3\endcsname}{tkzPointResult}
+\tkzDefPointBy[projection=onto #3--#2 ](\tkz@pttr@name \csname tkz@pt1\endcsname)
+\pgfnodealias{\csname tkz@ppt3\endcsname\csname tkz@pt1\endcsname}{tkzPointResult}
+\tkzDefPointBy[projection=onto #3--#2 ](\tkz@pttr@name \csname tkz@pt2\endcsname)
+\pgfnodealias{\csname tkz@ppt3\endcsname\csname tkz@pt2\endcsname}{tkzPointResult}
+\tkzDefPointBy[projection=onto #3--#2 ](\tkz@pttr@name \csname tkz@pt3\endcsname)
+\pgfnodealias{\csname tkz@ppt3\endcsname\csname tkz@pt3\endcsname}{tkzPointResult}
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% Point on circle
+%<--------------------------------------------------------------------------–>
+\def\tkz@numptcirc{0}
+\pgfkeys{/tkzptcircle/.cd,
+through/.code args = {center #1 angle #2 point #3} { \def\tkz@center{#1}%
+ \def\tkz@angle{#2}%
+ \def\tkz@through{#3}%
+ \def\tkz@numptcirc{0}},
+R/.code args = {center #1 angle #2 radius #3} { \def\tkz@center{#1}%
+ \def\tkz@angle{#2}%
+ \def\tkz@radius{#3}%
+ \def\tkz@numptcirc{1}},
+through in rad/.code args = {center #1 angle #2 point #3} { \def\tkz@center{#1}%
+ \def\tkz@angle{#2}%
+ \def\tkz@through{#3}%
+ \def\tkz@numptcirc{2}},
+R in rad/.code args = {center #1 angle #2 radius #3} { \def\tkz@center{#1}%
+ \def\tkz@angle{#2}%
+ \def\tkz@radius{#3}%
+ \def\tkz@numptcirc{3}}
+}
+
+\def\tkzDefPointOnCircle{\pgfutil@ifnextchar[{\tkz@DefPointOnCircle}{%
+ \tkz@DefPointOnCircle[]}}
+\def\tkz@DefPointOnCircle[#1]{%
+\begingroup
+\pgfqkeys{/tkzptcircle}{#1}
+ \ifcase\tkz@numptcirc%
+ \tkz@@CalcLengthcm(\tkz@center,\tkz@through){tkz@radius}
+ \or% 1
+ \relax%
+ \or% 2
+ \pgfmathparse{\tkz@angle\space r}
+ \let\tkz@angle\pgfmathresult
+ \tkz@@CalcLengthcm(\tkz@center,\tkz@through){tkz@radius}
+ \or% 3
+ \pgfmathparse{\tkz@angle\space r}
+ \let\tkz@angle\pgfmathresult
+\fi
+\path (\tkz@center) --++(\tkz@angle:\tkz@radius) coordinate(tkzPointResult);
+\endgroup
+}
+%<--------------------------------------------------------------------------–>
+% Point on line
+%<--------------------------------------------------------------------------–>
+\def\tkzDefPointOnLine{\pgfutil@ifnextchar[{\tkz@DefPointOnLine}{\tkz@DefPointOnLine[]}}
+\def\tkz@DefPointOnLine[#1](#2,#3){%
+\begingroup
+\path (#2) to [#1] coordinate (tkzPointResult) (#3);
+\endgroup
+}
+
+\makeatother
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
index b650e32727..ca67655a39 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points-with.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-points-with.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-points-with.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Vectors
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
index 5a247848dd..0bda459739 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-points.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-points.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-points.tex}
\makeatletter
%<--------------------------------------------------------------------------->
% init def point
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
index 4c79826734..9ca855534e 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-polygons.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-polygons.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-polygons.tex}
% bug in regular polygon side 2020/03/09
\makeatletter
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
index 738221b1b6..d44ea8f24b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/obj/tkz-obj-eu-triangles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-triangles.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-triangles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% Triangle Equilateral
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg b/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
index a67e46e31a..f01d5808a3 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.cfg
@@ -16,9 +16,9 @@
% and save the file in a directory part of your TEXINPUTS environment
% variable.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-euclide.cfg}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-euclide.cfg}
%<------ colors ---------------------------------------–>
\def\tkz@backgroundcolor{white}
\def\tkz@textcolor{black}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty b/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
index 3b2c9f4365..454605887e 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tkz-euclide.sty
@@ -10,11 +10,11 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
%-------------------------------------------------------------------------------
-\def\fileversion{5.00c}
-\def\filedate{2023/11/03}
-\typeout{2023/11/03 5.00c tkz-euclide.sty}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-euclide.sty}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{tkz-euclide}[ 2023/11/03 5.00c for pure Euclidean Geometry ]
+\ProvidesPackage{tkz-euclide}[ 2023/01/24 5.01c for pure Euclidean Geometry ]
\newif\if@tkzlua
\@tkzluafalse
\DeclareOption{lua}{\@tkzluatrue}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex
index 69fd1110ab..34fb7cc894 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-angles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-lua-angles.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-lua-angles.tex}
\makeatletter
\def\tkzmathrotatepointaround#1#2#3{%
\pgf@process{%
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex
index c31c925187..e04b1b109f 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-base.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-lua-base.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-lua-base.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
\global\let\tkz@tmp@xa\tkz@init@xmin% modif 2016
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex
index 050697a1bb..49065c1711 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-intersections.tex
@@ -13,9 +13,9 @@
% The Current Maintainer of this work is Alain Matthes.
% utf8 encoding
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-lua-intersections.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-lua-intersections.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% intersection de deux lignes
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex
index 1a0491d599..67db5197aa 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools-lua/tkz-tools-lua-math.tex
@@ -10,105 +10,15 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-lua-math.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-lua-math.tex}
\makeatletter
%<-------------------------------------------------------------------------->
%<-------------------------------------------------------------------------->
% Lengths
%<-------------------------------------------------------------------------->
%<-------------------------------------------------------------------------->
-\begin{luacode*}
-complex = {} -- global complex numbers registry
-M = {} -- the module
-local mt = {} --metatable for complex numbers
-setmetatable(_ENV, {__index = complex})
- function new (r, i)
- local cp = {}
- cp = {r=r, i=i}
- return setmetatable(cp,mt)
- end
- M.new = new -- add 'new' to the module
- -- create constant 'i'
- M.i = new(0, 1)
-
- function M.add (c1, c2)
- return new(c1.r + c2.r, c1.i + c2.i)
- end
-
- function M.sub (c1, c2)
- return new(c1.r - c2.r, c1.i - c2.i)
- end
-
- function M.mul (c1, c2)
- return new(c1.r*c2.r - c1.i*c2.i, c1.r*c2.i + c1.i*c2.r)
- end
-
- function M.inv (c)
- local n = c.r^2 + c.i^2
- return new(c.r/n, -c.i/n)
- end
-
- function M.div (c1, c2)
- return M.mul(c1, M.inv(c2))
- end
-
- function M.re (c)
- return new(c.r,0)
- end
-
- function M.im (c)
- return new(c.i,0)
- end
-
- function M.mod (c)
- local n = c.r^2 + c.i^2
- return new(n,0)
- end
-
- function M.prinarg(c)
- local arg
- if c.r > 0 then
- arg = math.atan(c.i/c.r)
- elseif c.r < 0 and c.i >= 0 then
- arg = math.atan(c.i/c.r) + math.pi
- elseif c.r < 0 and c.i < 0 then
- arg = math.atan(c.i/c.r) - math.pi
- elseif c.r == 0 and c.i > 0 then
- arg = math.pi / 2
- elseif c.r == 0 and c.i < 0 then
- arg = - math.pi / 2
- else
- error("Principal argument not defined.")
- end
- return arg
- end
-
- function M.op (...)
- return ...
- end
-
- function M.tostring (c)
- if c.i ==0 then
- return string.format("%g", c.r)
- elseif c.i> 0 and c.i==1 then
- return string.format("%g+i", c.r)
- elseif c.i> 0 and c.i~=1 then
- return string.format("%g+%gi", c.r, c.i)
- else
- return string.format("%g%gi", c.r, c.i) --to avoid +-
- end
- end
-
- --Setting Metatable operations.
- mt.__add = M.add
- mt.__mul = M.mul
- mt.__sub = M.sub
- mt.__tostring = M.tostring
-\end{luacode*}
-
-
\begin{luacode*}
function normalize(angleA,angleB)
@@ -144,15 +54,6 @@ function tkzround(nb, ND)
end
\end{luacode*}
-\newcommand\cpxNew[2]{%
-\directlua{complex[\luastringN{#1}] = M.new(#2)}}
-\newcommand\cpxPrint[1]{%
-\directlua{tex.sprint(tostring(complex[\luastringN{#1}]))}}
-\newcommand\cpxAdd[3]{%
-\directlua{complex[\luastringN{#1}]%
- =M.add(complex[\luastringN{#2}],complex[\luastringN{#3}])}}
-
-
\def\tkz@Dec#1{%
\directlua{tex.print(string.format('\@percentchar.6f',#1))}
}
@@ -188,16 +89,8 @@ end
\let\tkzLog\tkz@Log
\let\tkzSin\tkz@Sin
\let\tkzCos\tkz@Cos
-% \tkzpointnormalised#
-% tkzCalcLength
-% \tkzGetLength
-% \tkzpttocm
-% \tkzcmtopt
-% \tkzFindSlope
-% option xfp
% \tkzpointnormalised normalise un point A-->A' tq ||v(OA')=1||
-% équivalent de \pgfpointnormalised avec fp
% example
% \tkzpointnormalised{%
% \pgfpointdiff{\pgfpointanchor{A}{center}}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
index 2276dead1a..b33696d375 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-BB.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-obj-eu-BB.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-obj-eu-BB.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
\def\tkzShowBB{\pgfutil@ifnextchar[{\tkz@ShowBB}{\tkz@ShowBB[]}}
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
index f8ec42d3e0..a8a5718257 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-angles.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-angles.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-angles.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
%<--------------------------------------------------------------------------–>
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
index 2311703363..f6659f9497 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-base.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-base.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-base.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
\global\let\tkz@tmp@xa\tkz@init@xmin% modif 2016
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
index 94995906f9..7bd18aef8e 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-colors.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-colors}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-colors}
\makeatletter
%<------ Initialisation of the colors with tkzSetUpColors ----------------->
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
index bb741fc59e..7b87707694 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-intersections.tex
@@ -13,9 +13,9 @@
% The Current Maintainer of this work is Alain Matthes.
% utf8 encoding
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-intersections.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-intersections.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% intersection de deux lignes
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
index 9ec079f092..e3929d1372 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-math.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-math.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-math.tex}
\makeatletter
%<-------------------------------------------------------------------------->
% \tkzpointnormalised#
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
index eb0dae14e6..22d16e3cf0 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-modules.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-utilities.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-utilities.tex}
\makeatletter
%<------------- % chargement des modules ---------------------------------->
\def\tkz@obj@all{angles,arcs,compass,defcircles,deflines,defpoints,defpointsby,defpointsrnd,defpointswith,polygons,protractor,sectors,show,triangles}%
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
index 3f52c84c28..7dcf0d8b8b 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-text.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-text.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-text.tex}
\makeatletter
%<--------------------------------------------------------------------------–>
% tkzText
diff --git a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
index eb9c52317f..4fbd81e204 100644
--- a/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
+++ b/macros/latex/contrib/tkz/tkz-euclide/latex/tools/tkz-tools-eu-utilities.tex
@@ -10,9 +10,9 @@
% This work has the LPPL maintenance status “maintained”.
% The Current Maintainer of this work is Alain Matthes.
-\def\fileversion{5.00c}
-\def\filedate{2023/01/23}
-\typeout{2023/01/23 5.00c tkz-tools-eu-utilities.tex}
+\def\fileversion{5.01c}
+\def\filedate{2023/01/24}
+\typeout{2023/01/24 5.01c tkz-tools-eu-utilities.tex}
\makeatletter
\pgfkeys{/tkzClip/.cd,
space/.store in = {\tkz@CLI@space},
diff --git a/obsolete/macros/generic/expkv-cs/README.md b/obsolete/macros/generic/expkv-cs/README.md
deleted file mode 100644
index 481d94ba34..0000000000
--- a/obsolete/macros/generic/expkv-cs/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
--------------------------------------------------------------------------------
-# expkv-cs -- define expandable key=val macros using expkv
-
-Version 2022-02-13 v1.2
-
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-
-Hosted at https://github.com/Skillmon/tex_expkv-cs
-
--------------------------------------------------------------------------------
-
-Copyright (C) 2020-2022 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
--------------------------------------------------------------------------------
-
-This provides means to define expandable key=val taking macros utilizing
-[`expkv`](https://github.com/Skillmon/tex_expkv). It is generic code and only
-requires `expkv` for its parsing. There is a LaTeX package `expkv-cs.sty`
-included to play nice on LaTeX's package loading system, but that package is not
-needed and does not provide more functionality than the generic code in
-`expkv-cs.tex`.
diff --git a/obsolete/macros/generic/expkv-cs/expkv-cs.dtx b/obsolete/macros/generic/expkv-cs/expkv-cs.dtx
deleted file mode 100644
index 561dec7af9..0000000000
--- a/obsolete/macros/generic/expkv-cs/expkv-cs.dtx
+++ /dev/null
@@ -1,3431 +0,0 @@
-% \iffalse meta-comment
-%
-% File: expkv-cs.dtx Copyright (C) 2020-2022 Jonathan P. Spratte
-%
-% This work may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% ------------------------------------------------------------------------------
-%
-%<*driver>^^A>>=
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-\input l3docstrip.tex
-\askforoverwritefalse
-\preamble
-
---------------------------------------------------------------
-expkv-cs -- define expandable key=val macros using expkv
-E-mail: jspratte@yahoo.de
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
---------------------------------------------------------------
-
-Copyright (C) 2020-2022 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
-This work consists of the file expkv-cs.dtx
-and the derived files expkv-cs.pdf
- expkv-cs.sty
- expkv-cs.tex
- t-expkv-cs.tex
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-\generate{\file{expkv-cs.sty}{\from{expkv-cs.dtx}{pkg}}}
-\generate{\file{expkv-cs.tex}{\from{expkv-cs.dtx}{tex}}}
-\generate{\file{t-expkv-cs.tex}{\from{expkv-cs.dtx}{ctx}}}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%
-\IfFileExists{expkv-cs.tex}{\input{expkv-cs.tex}}{}
-\ProvidesFile{expkv-cs.dtx}
- [\csname ekvcDate\endcsname\ define expandable key=val macros using expkv]
-\PassOptionsToPackage{full}{textcomp}
-\documentclass{l3doc}
-\RequirePackage[oldstylenums,nott]{kpfonts}
-\input{glyphtounicode}
-\pdfgentounicode=1
-\RequirePackage{tcolorbox}
-\newtcolorbox{exresult}[2][]
- {colback=expkvgrey!10!white,colframe=expkvgrey,fontupper=\small,width={#2},#1}
-\newtcbox\exres[1][]
- {
- colback=expkvgrey!10!white
- ,colframe=expkvgrey
- ,size=small
- ,nobeforeafter
- ,tcbox raise base
- ,fontupper=\small
- ,#1
- }
-\RequirePackage{listings}
-\RequirePackage{booktabs}
-\RequirePackage{array}
-\RequirePackage{collcell}
-\RequirePackage{siunitx}
-\RequirePackage{xcolor}
-\RequirePackage{caption}
-\RequirePackage{microtype}
-\RequirePackage{accsupp}
-\lstdefinelanguage{expkvc}[primitive]{TeX}
- {
- ,moretexcs=[4]^^A e-TeX
- {
- expanded,
- numexpr,
- protected,
- }
- ,moretexcs=[5]^^A plain/LaTeX
- {
- approx,
- begin,
- empty,
- item,
- LaTeX,
- makeatletter,makeatother,multicolumn,
- newcommand,newdimen,
- RequirePackage,
- rule,
- TeX,
- textit,texttt,
- usepackage,
- usemodule,
- }
- ,moretexcs=[6]^^A used packages
- {
- ^^A xfp
- fpeval,
- ^^A keyval
- setkeys,
- ^^A yax
- defactiveparameter,storevalue,setparameterlist
- }
- ,moretexcs=[2]^^A expkv-cs macros
- {
- ekvcSplit,ekvcSplitAndForward,ekvcSplitAndUse,
- ekvcHash,ekvcHashAndForward,ekvcHashAndUse,
- ekvcValue,ekvcValueFast,ekvcValueSplit,ekvcValueSplitFast,
- ekvcSecondaryKeys,
- ekvcChange,
- ekvcFlagNew,
- ekvcFlagHeight,
- ekvcFlagRaise,
- ekvcFlagSetTrue,ekvcFlagSetFalse,
- ekvcFlagIf,ekvcFlagIfRaised,
- ekvcFlagReset,
- ekvcFlagGetHeight,ekvcFlagGetHeights,
- ekvcPass
- }
- ,moretexcs=[3]^^A expkv-pkg macros
- {
- ^^A expkv
- ekvdef,ekvdefNoVal,^^A
- ekvlet,ekvletNoVal,ekvletkv,ekvletkvNoVal,^^A
- ekvdefunknown,ekvdefunknownNoVal,^^A
- ekvredirectunknown,ekvredirectunknownNoVal,^^A
- ekvset,ekvsetSneaked,^^A
- ekvsetdef,ekvsetSneakeddef,ekvsetdefSneaked,^^A
- ekvparse,^^A
- ekvVersion,ekvDate,^^A
- ekvifdefined,ekvifdefinedNoVal,ekvifdefinedset,^^A
- ekvbreak,ekvbreakPreSneak,ekvbreakPostSneak,^^A
- ekvsneak,ekvsneakPre,^^A
- ekvchangeset,^^A
- ekvoptarg,ekvoptargTF,^^A
- ekverr,
- ^^A expkv-def
- ekvdefinekeys
- }
- }
-\colorlet{codeparam}{cyan!65!black}
-\def\mylstwd{.55em}
-\lstset
- {
- ,language=expkvc
- ,flexiblecolumns=false
- ,basewidth=\mylstwd
- ,gobble=2
- ,basicstyle=\fontfamily{jkp}\itshape
- ,texcsstyle=*[1]{\bfseries\color{expkvgrey}} ^^A primitives
- ,texcsstyle=*[2]{\bfseries\color{expkvred}} ^^A expkv
- ,texcsstyle=*[3]{\color{expkvred}} ^^A expkv-pkg
- ,texcsstyle=*[4]{\bfseries\color{expkvgrey}} ^^A e-TeX
- ,texcsstyle=*[5]{\bfseries\color{expkvgrey}} ^^A plain/LaTeX macros
- ,texcsstyle=*[6]{} ^^A macros of other packages
- ,commentstyle=\color[gray]{0.4}
- ,literate=
- {\{} {{\CodeUpBf\{}}{1}
- {\}} {{\CodeUpBf\}}}{1}
- {$} {{\CodeUpBf\$}}{1}
- {[} {{\CodeUp[}}{1}
- {]} {{\CodeUp]}}{1}
- {(} {{\CodeUp(}}{1}
- {)} {{\CodeUp)}}{1}
- {*} {{$*$}}{1}
- {1} {{\CodeUp{1}}}{1}
- {2} {{\CodeUp{2}}}{1}
- {3} {{\CodeUp{3}}}{1}
- {4} {{\CodeUp{4}}}{1}
- {5} {{\CodeUp{5}}}{1}
- {6} {{\CodeUp{6}}}{1}
- {7} {{\CodeUp{7}}}{1}
- {8} {{\CodeUp{8}}}{1}
- {9} {{\CodeUp{9}}}{1}
- {0} {{\CodeUp{0}}}{1}
- {##} {{\CodeColored{codeparam}{1}{\#}}}{1}
- {##1}{{\CodeColored{codeparam}{2}{\#1}}}{2}
- {##2}{{\CodeColored{codeparam}{2}{\#2}}}{2}
- {##3}{{\CodeColored{codeparam}{2}{\#3}}}{2}
- {##4}{{\CodeColored{codeparam}{2}{\#4}}}{2}
- {##5}{{\CodeColored{codeparam}{2}{\#5}}}{2}
- {##6}{{\CodeColored{codeparam}{2}{\#6}}}{2}
- {##7}{{\CodeColored{codeparam}{2}{\#7}}}{2}
- {##8}{{\CodeColored{codeparam}{2}{\#8}}}{2}
- {##9}{{\CodeColored{codeparam}{2}{\#9}}}{2}
- {<key>}{{$\langle$}key{$\rangle$}}{5}
- {<set>}{{$\langle$}set{$\rangle$}}{5}
- {<set1>}{{$\langle$}set1{$\rangle$}}{6}
- {<set2>}{{$\langle$}set2{$\rangle$}}{6}
- ^^A,literate=*{<key>}{\key}{4}{<set>}{\set}{4}
- }
-\newcommand*\CodeColored[3]{\textcolor{#1}{\makebox[\dimexpr\mylstwd*#2]{#3}}}
-\newcommand*\CodeUpBf[1]{\makebox[\mylstwd]{\textup{\textbf{#1}}}}
-\newcommand*\CodeUp[1]{\makebox[\mylstwd]{\textup{#1}}}
-\RequirePackage{randtext}
-\let\metaORIG\meta
-\protected\def\meta #1{\texttt{\metaORIG{#1}}}
-\renewcommand*\thefootnote{\fnsymbol{footnote}}
-\definecolor{expkvred}{HTML}{9F393D}
-\colorlet{expkvgrey}{black!75}
-\makeatletter
-\newcommand*\example{\par\smallskip\noindent\textit{Example:} \ignorespaces}
-\newcommand*\expkv
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv}^^A
- \href{https://github.com/Skillmon/tex_expkv}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv}^^A
- }
-\newcommand*\expkvpkg[1]
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv-#1}^^A
- \href{https://github.com/Skillmon/tex_expkv-#1}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- {\color{expkvgrey}^^A
- \kern.05em\rule[-.1ex]{.08em}{1.2ex}\kern.05em\textsc{#1}^^A
- }^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv-#1}^^A
- }
-\newcommand*\expkvd{\expkvpkg{def}}
-\newcommand*\expkvc{\expkvpkg{cs}}
-\newcommand\kv{\meta{key}=\meta{value}}
-\newcommand\key{\meta{key}}
-\newcommand\val{\meta{value}}
-\newcommand\set{\meta{set}}
-\newcommand\enflong{\textcolor{black}{long}}
-\newcommand\alllong{\textcolor{gray}{long}}
-\newcommand\notlong{\textcolor{red!80!black}{long}}
-\newcommand\prefixes[1]
- {^^A
- \hfill
- \ifcase\numexpr#1\relax\or
- \enflong\or
- \alllong\or
- \notlong\fi
- }
-\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
-\DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
-\DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long,\z@}
-\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space,\advance}
-\DoNotIndex{\@,\unexpanded,\string,\expanded,\dimexpr,\global,\glueexpr,\hbox}
-\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef,\gdef,\newcount}
-\DoNotIndex{\number,\detokenize,\meaning,\lccode,\lowercase}
-\DoNotIndex{\^,\\,\@firstofone,\@firstoftwo,\@gobble,\@secondoftwo}
-\DoNotIndex{\ifcsname}
-\DoNotIndex{\ifx}
-\DoNotIndex{\ifodd}
-\DoNotIndex{\ifnum}
-\DoNotIndex{\ifdefined}
-\DoNotIndex{\iffalse}
-\DoNotIndex{\iftrue}
-\DoNotIndex{\else}
-\DoNotIndex{\fi}
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}}
-\makeatother
-\begin{document}
- \title
- {^^A
- \texorpdfstring
- {^^A
- \huge\expkvc
- \\[\medskipamount]
- \Large define expandable \kv\ macros using \expkv
- }{expkv-cs - define expandable key=val macros using expkv}^^A
- }
- \date{\ekvcDate\space v\ekvcVersion}
- \author{Jonathan P. Spratte\thanks{\protect\randomize{jspratte@yahoo.de}}}
- \DocInput{expkv-cs.dtx}
-\end{document}
-%</driver>^^A=<<
-% \fi
-%
-% \maketitle
-% \renewcommand*\thefootnote{\arabic{footnote}}
-%
-% \begin{abstract}
-% \noindent\parfillskip=0pt
-% \expkvc\ provides two small interfaces to define expandable \kv\ macros using
-% \expkv. It therefore lowers the entrance boundary to expandable \kv\ macros.
-% The stylised name is \expkvc\ but the files use \file{expkv-cs}, this is due
-% to CTAN-rules which don't allow \string| in package names since that is the
-% pipe symbol in *nix shells.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \begin{documentation}^^A>>=
-%
-% \section{Documentation}
-%
-% The \expkv\ package enables the new possibility of creating \kv\ macros which
-% are fully expandable. The creation of such macros is however cumbersome for
-% the average user. \expkvc\ tries to step in here. It provides interfaces to
-% define \kv\ macros without worrying too much about the implementation. In case
-% you're wondering now, the |cs| in \expkvc\ stands for control sequence,
-% because |def| was already taken by \expkvd\ and ``control sequence'' is the
-% term D.\,E.\,Knuth used in his \TeX book for named commands hence macros
-% (though he also used the term ``macro''). So \expkvc\ defines control
-% sequences for and with \expkv.
-%
-% There are two different approaches supported by this package. The first is
-% splitting the keys up into individual arguments, the second is providing all
-% the keys as a single argument to the underlying macro and getting an
-% individual \val\ by using a hash. Well, actually there is no real hash, just
-% some markers which are parsed, but this shouldn't be apparent to the user, the
-% behaviour matches that of a hash-table.
-%
-% In addition to these two methods of defining a macro with primary keys a way
-% to define secondary keys, which can reference the primary ones, is provided.
-% These secondary keys don't correspond to an argument or an entry in the hash
-% table directly but might come in handy for the average use case. Each macro
-% has its own set of primary and secondary keys.
-%
-% A word of advice you should consider: If your macro doesn't have to be
-% expandable (and often it doesn't) consider not using \expkvc. The interface
-% has some overhead (though it still is fast -- check \autoref{sec:speed}) and
-% the approach has its limits in versatility. If you don't need to be
-% expandable, you should consider either defining your keys manually using
-% \expkv\ or using \expkvd\ for convenience. Or you resort to another \kv\
-% interface. Nevertheless setting up macros with \expkvc, especially with
-% |\ekvcSplit|, is very convenient in my opinion, so if you just want to define
-% a single macro with just a few keys this might be the way to go.
-%
-% \expkvc\ is usable as generic code, as a \LaTeX\ package, and as a \ConTeXt\
-% module. It'll automatically load \expkv\ in the same mode as well. To use it,
-% just use one of
-% \begin{lstlisting}
-% \input expkv-cs % plainTeX
-% \usepackage{expkv-cs} % LaTeX
-% \usemodule[expkv-cs] % ConTeXt
-% \end{lstlisting}
-%
-%
-% \subsection{Define Macros and Primary Keys}\label{sec:define}
-%
-% All macros defined with \expkvc\ have to be previously undefined or have the
-% |\meaning| of |\relax|. This is necessary as there is no way to automatically
-% undefine keys once they are set up (neither \expkv\ nor \expkvc\ keep track of
-% defined keys) -- so to make sure there are no conflicts only new definitions
-% are allowed (that's not the case for individual keys, only for frontend
-% macros).
-%
-%
-% \subsubsection{Primary Keys}\label{sec:primaries}
-%
-% In the following descriptions there will be one argument named \meta{primary
-% keys}. This argument should be a \kv\ list where each \key\ will be one
-% primary key and \val\ the associated initial value. By default all keys are
-% defined short, but you can define long keys by prefixing \key\ with |long|
-% (\emph{e.g.}, \texttt{long name=Jonathan P. Spratte}). You only need |long| if
-% the key should be able to take an explicit |\par| token. Note however that
-% |long| keys are a microscopic grain faster (due to some internals of \expkvc).
-% Only if at least one of the keys was |long| the \meta{cs} in the following
-% defining macros will be |\long|. For obvious reasons there is no possibility
-% to define a macro or key as |\protected|.
-%
-% To allow keys not defined |long| which key names should start with |long|, you
-% can also use the prefix |short| (|short| and |long| are mutually exclusive,
-% which ever comes first defines the behaviour, the latter is considered part of
-% the key name). Note that this is the only reason for |short|'s existance,
-% essentially it does nothing.
-%
-% The consequence culminates in the following:
-% \begin{lstlisting}
-% \ekvcSplit\foo
-% {
-% long short = abc\par
-% ,short long = def
-% }
-% {#1#2}
-% \end{lstlisting}
-% will define a macro |\foo| that knows two primary keys, the first one is
-% called |short|, and accepts explicit |\par| tokens inside its values, the
-% second one is called |long| and will not accept |\par| tokens (leading to a
-% low level \TeX\ error). A description of |\ekvcSplit| follows shortly.
-%
-% There is one exception to these syntax rules of \meta{primary keys}: One can
-% include a key named |...| without a value. If this is found the \meta{cs} will
-% be defined |\long|. Any unknown keys found at use time will end up in a list
-% at this spot. See some examples in \autoref{sec:unknown}.
-%
-% At the moment \expkvc\ doesn't require any internal keys, but I can't foresee
-% whether this will be the case in the future as well, as it might turn out that
-% some features I deem useful can't be implemented without such internal keys.
-% Because of this, please don't use key names starting with
-% \texttt{EKVC\string|} as that should be the private name space.
-%
-%
-% \subsubsection{Split}
-%
-% The split variants will provide the key values as separate arguments. This
-% limits the number of keys for which this is truly useful.
-%
-% \begin{function}{\ekvcSplit}
-% \begin{syntax}
-% \cs{ekvcSplit}\meta{cs}\marg{primary keys}\marg{definition}
-% \end{syntax}
-% This defines \meta{cs} to be a macro taking one mandatory argument which
-% should contain a \kv\ list. The \meta{primary keys} will be defined for this
-% macro (see \autoref{sec:primaries}). The \meta{definition} is the code that
-% will be executed. You can access the \val\ of a \key\ by using a macro
-% parameter from |#1| to |#9|. The order of the macro parameters will be the
-% order provided in the \meta{primary keys} list (so |#1| is the \val\ of the
-% key defined first). With |\ekvcSplit| you can define macros using at most
-% nine primary keys.
-% \end{function}
-% \example The following defines a macro |\foo| that takes the keys |a| and |b|
-% and outputs their values in a textual form:\\
-% \begin{minipage}{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcSplit\foo{a=a,b=b}{a is #1.\par b is #2.\par}
-% \foo{}
-% \foo{b=e}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcSplit\foo{a=a,b=b}{a is #1.\par b is #2.\par}
-% \foo{}
-% \foo{b=e}
-% \end{exresult}
-%
-% \begin{function}{\ekvcSplitAndForward}
-% \begin{syntax}
-% \cs{ekvcSplitAndForward}\meta{cs}\marg{after}\marg{primary keys}
-% \end{syntax}
-% This defines \meta{cs} to be a macro taking one mandatory argument which
-% should contain a \kv\ list. You can use as many primary keys as you want
-% with this. The primary keys will be forwarded to \meta{after} as braced
-% arguments (as many as necessary for your primary keys). The order of the
-% braced arguments will be the order of your primary key definitions. In
-% \meta{after} you can use just a single control sequence, or some arbitrary
-% stuff which will be left in the input stream before your braced values (with
-% one set of braces stripped from \meta{after}), so both of the following
-% would be fine:
-% \begin{lstlisting}
-% \ekvcSplitAndForward\foo\foo@aux{keyA = A, keyB = B}
-% \ekvcSplitAndForward\foo{\foo@aux{more args}}{keyA = A, keyB = B}
-% \end{lstlisting}
-% \end{function}
-% \noindent
-% In the first case |\foo@aux| should take at least two arguments (|keyA| and
-% |keyB|), in the second case at least three (|more args|, |keyA|, and |keyB|).
-%
-% \begin{function}{\ekvcSplitAndUse}
-% \begin{syntax}
-% \cs{ekvcSplitAndUse}\meta{cs}\marg{primary keys}
-% \end{syntax}
-% This will roughly do the same as |\ekvcSplitAndForward|, but instead of
-% specifying what will be used after splitting the keys, \meta{cs} will use
-% what follows the \kv\ list. So its syntax will be
-% \end{function}
-% \begin{quote}
-% \ttfamily
-% \meta{cs}\{\key=\val, \ldots\}\marg{after}
-% \end{quote}
-% and the code in |after| should expect at least as many arguments as the number
-% of keys defined for \meta{cs}.
-%
-% \subsubsection{Hash}
-%
-% The hash variants will provide the key values as a single argument in which
-% you can access specific values using a special macro. The implementation might
-% be more convenient and scale better, \emph{but} it is slower (for a
-% rudimentary macro with a single key benchmarking was almost $1.7$ times
-% slower, the root of which being the key access with |\ekvcValue|, not the
-% parsing, and for a key access using |\ekvcValueFast| it was still about $1.2$
-% times slower). So if your macro uses less than ten primary keys, you should
-% consider using the split approach.
-%
-% \begin{function}{\ekvcHash}
-% \begin{syntax}
-% \cs{ekvcHash}\meta{cs}\marg{primary keys}\marg{definition}
-% \end{syntax}
-% This defines \meta{cs} to be a macro taking one mandatory argument which
-% should contain a \kv\ list. You can use as many primary keys as you want.
-% The primary keys will be forwarded as a single argument containing every key
-% to the underlying macro. The underlying macro is defined as
-% \meta{definition}, in which you can access the \val\ of a \key\ by using
-% \texttt{\cs[no-index]{ekvcValue}\{\key\}\{\#1\}}.
-% \end{function}
-% \example This defines an equivalent macro to the |\foo| defined with
-% |\ekvcSplit| earlier:\\
-% \begin{minipage}{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcHash\foo{a=a,b=b}{a is \ekvcValue{a}{#1}.\par
-% b is \ekvcValue{b}{#1}.\par}
-% \foo{}
-% \foo{b=e}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcHash\foo{a=a,b=b}{a is \ekvcValue{a}{#1}.\par
-% b is \ekvcValue{b}{#1}.\par}
-% \foo{}
-% \foo{b=e}
-% \end{exresult}
-%
-% \begin{function}{\ekvcHashAndForward}
-% \begin{syntax}
-% \cs{ekvcHashAndForward}\meta{cs}\marg{after}\marg{primary keys}
-% \end{syntax}
-% This defines \meta{cs} to be a macro taking one mandatory argument which
-% should contain a \kv\ list. You can use as many primary keys as you want.
-% The primary keys will be forwarded as a single argument containing every key
-% to \meta{after}. You can use a single macro for \meta{after} or use some
-% arbitrary stuff, which will be left in the input stream before the hashed
-% \kv\ list with one set of braces stripped. In the
-% macro called in \meta{after} you can access the \val\ of a \key\ by using
-% \texttt{\cs[no-index]{ekvcValue}\{\key\}\{\#1\}} (or whichever argument the
-% hashed \kv\ list will be).
-% \end{function}
-% \example This defines a macro |\foo| processing two keys, and passing the
-% result to |\foobar|:
-% \begin{lstlisting}
-% \ekvcHashAndForward\foo\foobar{a=a,b=b}
-% \newcommand*\foobar[1]{a is \ekvcValue{a}{#1}.\par
-% b is \ekvcValue{b}{#1}.\par}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvcHashAndUse}
-% \begin{syntax}
-% \cs{ekvcHashAndUse}\meta{cs}\marg{primary keys}
-% \end{syntax}
-% This will roughly do the same as |\ekvcHashAndForward|, but instead of
-% specifying what will be used after hashing the keys at install time,
-% \meta{cs} will use what follows the \kv\ list. So its syntax will be
-% \end{function}
-% \begin{quote}
-% \ttfamily
-% \meta{cs}\{\key=\val, \ldots\}\marg{after}
-% \end{quote}
-%
-% \begin{function}{\ekvcValue}
-% \begin{syntax}
-% \cs{ekvcValue}\{\key\}\marg{key list}
-% \end{syntax}
-% This is a safe way to access your keys in a hash variant. \key\
-% is the key which's \val\ you want to use out of the \meta{key list}.
-% \meta{key list} should be the key list argument forwarded to your underlying
-% macro by |\ekvcHash|, |\ekvcHashAndForward|, or |\ekvcHashAndUse|. It will
-% be tested whether the hash function to access that \key\ exists, the \key\
-% argument is not empty, and that the \meta{key list} really contains a \val\
-% of that \key. This macro needs exactly two steps of expansion and if used
-% inside of an |\edef| or |\expanded| context will protect the \val\ from
-% further expanding.
-% \end{function}
-%
-% \begin{function}{\ekvcValueFast}
-% \begin{syntax}
-% \cs{ekvcValueFast}\{\key\}\marg{key list}
-% \end{syntax}
-% This behaves just like |\ekvcValue|, but \emph{without any} safety tests. As
-% a result this is about $1.4$ times faster \emph{but} will throw low level
-% \TeX\ errors eventually if the hash function isn't defined or the \key\
-% isn't part of the \meta{key list} (\emph{e.g.}, because it was defined as a
-% key for another macro -- all macros share the same hash function per \key\
-% name). Use it if you know what you're doing. This macro needs exactly three
-% steps of expansion in the no-errors case.
-% \end{function}
-%
-% \begin{function}{\ekvcValueSplit}
-% \begin{syntax}
-% \cs{ekvcValueSplit}\{\key\}\marg{key list}\marg{next}
-% \end{syntax}
-% If you need a specific \key\ from a \meta{key list} more than once, it'll
-% be a good idea to only extract it once and from then on keep it as a
-% separate argument. Hence the macro \cs{ekvcValueSplit} will extract one
-% specific \key's value from the list and forward it as an argument to
-% \meta{next}, so the result
-% of this will be \meta{next}\marg{value}. This is roughly as fast as
-% |\ekvcValue| and runs the same tests.
-% \end{function}
-% \example The following defines a macro |\foo| which will take three keys.
-% Since the next parsing step will need the value of one of the keys multiple
-% times we split that key off the list (in this example the next step doesn't
-% use the key multiple times for simplicity though), and the entire list is
-% forwarded as the second argument:\\
-% \begin{minipage}{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcHash\foo{a=a,b=b,c=c}
-% {\ekvcValueSplit{a}{#1}\foobar{#1}}
-% \newcommand*\foobar[2]{a is #1.\par
-% b is \ekvcValue{b}{#2}.\par
-% c is \ekvcValue{c}{#2}.\par}
-% \foo{}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcHash\foo{a=a,b=b,c=c}
-% {\ekvcValueSplit{a}{#1}\foobar{#1}}
-% \newcommand*\foobar[2]{a is #1.\par
-% b is \ekvcValue{b}{#2}.\par
-% c is \ekvcValue{c}{#2}.\par}
-% \foo{}
-% \end{exresult}
-%
-% \begin{function}{\ekvcValueSplitFast}
-% \begin{syntax}
-% \cs{ekvcValueSplitFast}\{\key\}\marg{key list}\marg{next}
-% \end{syntax}
-% This behaves just like |\ekvcValueSplit|, but it won't run the same tests,
-% hence it is faster but more error prone, just like the relation between
-% |\ekvcValue| and |\ekvcValueFast|.
-% \end{function}
-%
-%
-% \subsection{Secondary Keys}\label{sec:secondaries}
-%
-% To remove some of the limitations with the approach that each primary key
-% matches an argument or hash entry, you can define secondary keys. Those have
-% to be defined for each macro individually but it doesn't matter whether that
-% macro was a split or a hash variant. If a secondary key references another key
-% it doesn't matter whether that other key is primary or secondary unless
-% otherwise specified.
-%
-% Secondary keys can have a prefix (like |long|) which are called |p|-type
-% prefix and must have a type (like |meta|) which are called |t|-type prefix.
-% Some types might require some |p|-prefixes, while others might forbid those.
-%
-% Please keep in mind that key names shouldn't start with \texttt{EKVC\string|}.
-%
-% \begin{function}{\ekvcSecondaryKeys}
-% \begin{syntax}
-% \cs{ekvcSecondaryKeys}\meta{cs}\{\kv, \ldots\}
-% \end{syntax}
-% This is the front facing macro to define secondary keys. For the macro
-% \meta{cs} define \key\ to have definition \val. The general syntax for \key\
-% should be
-% \begin{quote}\ttfamily\small
-% \meta{prefix} \meta{name}
-% \end{quote}
-% Where \meta{prefix} is a space separated list of optional |p|-type prefixes
-% followed by one |t|-type prefix. The syntax of \val\ is dependent on the
-% used |t|-prefix.
-% \end{function}
-%
-%
-% \subsubsection{\texttt{p}-type Prefixes}
-%
-% There is only one |p|-prefix available, which is |long|.
-%
-% \begin{function}{long}
-% The following key will be defined |\long|.
-% \end{function}
-%
-%
-% \subsubsection{\texttt{t}-type Prefixes}
-%
-% If you're familiar with \expkvd\ you'll notice that the |t|-type prefixes
-% provided here are much fewer. The expansion only concept doesn't allow for
-% great variety in the auto-defined keys.
-%
-% The syntax examples of the |t|-prefixes will show which |p|-prefix will be
-% automatically used by printing those black (\texttt{\enflong}), which
-% will be available in grey (\texttt{\alllong}), and which will be disallowed in
-% red (\texttt{\notlong}). This will be put flush right next to the syntax line.
-%
-% \begin{function}{meta}
-% \begin{syntax}
-% meta \key\ = \{\kv, \ldots\} \prefixes2
-% \end{syntax}
-% With a |meta| key you can set other keys. Whenever \key\ is used the keys in
-% the \kv\ list will be set to the values given there. You can use the \val\
-% given to \key\ by using |#1| in the \kv\ list. The keys in the \kv\ list can
-% be primary and secondary ones.
-% \end{function}
-%
-% \begin{function}{nmeta}
-% \begin{syntax}
-% nmeta \key\ = \{\kv, \ldots\} \prefixes3
-% \end{syntax}
-% An |nmeta| key is like a |meta| key, but it doesn't take a value, so the
-% \kv\ list is static.
-% \end{function}
-%
-% \begin{function}{alias}
-% \begin{syntax}
-% alias \key\ = \marg{key_2} \prefixes3
-% \end{syntax}
-% This assigns the definition of \meta{key_2} to \key. As a result \key\ is an
-% alias for \meta{key_2} behaving just the same. Both the value taking and the
-% |NoVal| version (that's \expkv\ slang for a key not accepting a value) will
-% be copied if they are defined when |alias| is used. Of course, \meta{key_2}
-% has to be defined, be it as a primary or secondary one.
-% \end{function}
-%
-% \begin{function}{default}
-% \begin{syntax}
-% default \key\ = \marg{default} \prefixes3
-% \end{syntax}
-% If \key\ is a defined value taking key, you can define a |NoVal| version
-% with this that will behave as if \key\ was given \meta{default} as its
-% \val. Note that this doesn't change the initial values of primary keys set
-% at definition time in |\ekvcSplit| and friends (see |\ekvcChange| in
-% \autoref{sec:change} for this). \key\ can be a primary or secondary key.
-% \end{function}
-%
-% \begin{function}{enum}
-% \begin{syntax}
-% enum \key\ = \marg{key_2}\{\val, \ldots\} \prefixes2
-% \end{syntax}
-% This defines \key\ to only accept the values given in the list of the second
-% argument of its definition. It forwards the position of \val\ in that list
-% to \meta{key_2} (zero-based). The \meta{key_2} has to already be defined
-% by the time an |enum| key is set up. Each \val\ in the list (and at use
-% time) is treated as a string, so no expansion takes place here.
-%
-% If you use |enum| twice on the same \key\ the new values will again start at
-% zero (so it is possible to define multiple values with the same outcome),
-% however since you can't skip values you'll have to use the same as in the
-% first call for values with just a single variant. There is no interface to
-% delete existing values.
-% \end{function}
-% \example First a small example that might give you an idea of what the
-% description above could mean:\\
-% \begin{minipage}[c]{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcSplit\foo{k-internal=-1}{#1}
-% \ekvcSecondaryKeys\foo
-% {enum k = {k-internal}{a,b,c}}
-% \foo{}\foo{k=a}\foo{k=b}\foo{k=c}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcSplit\foo{k-internal=-1}{#1}
-% \ekvcSecondaryKeys\foo
-% {enum k = {k-internal}{a,b,c}}
-% \foo{}\foo{k=a}\foo{k=b}\foo{k=c}
-% \end{exresult}
-% \example We can define a choice setup that might do different things based on
-% the choice encountered, and the numeric value is easy to parse using
-% |\ifcase|:\\
-% \begin{minipage}[c]{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcSplit\foo{k-internal=-1}
-% {%
-% \ifcase#1
-% is\or
-% This\or
-% easy%
-% \else
-% .%
-% \fi
-% }
-% \ekvcSecondaryKeys\foo
-% {enum k = {k-internal}{a,b,c}}
-% \foo{k=b} \foo{k=a} \foo{k=c}\foo{}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcSplit\foo{k-internal=-1}
-% {^^A
-% \ifcase#1
-% is\or
-% This\or
-% easy^^A
-% \else
-% .^^A
-% \fi
-% }
-% \ekvcSecondaryKeys\foo
-% {enum k = {k-internal}{a,b,c}}
-% \foo{k=b} \foo{k=a} \foo{k=c}\foo{}
-% \end{exresult}
-%
-% \begin{function}{aggregate}
-% \begin{syntax}
-% aggregate \key\ = \marg{primary}\marg{definition} \prefixes3
-% \end{syntax}
-% While all other key types replace the current value of the associated
-% \meta{primary} key, with |aggregate| you can create keys that append or
-% prepend (or whatever you like) the new value to the current one. The
-% value must be exactly two \TeX\ arguments, where \meta{primary} should
-% be the name of a \meta{primary} key, and \meta{definition} the way you want
-% to store the current and the new value. Inside \meta{definition} you
-% can use |#1| for the current, and |#2| for the new value. The
-% \meta{definition} will not expand any further during the entire parsing (so
-% this doesn't allow general processing of current and new values). The
-% resulting \key\ will inherit being either |short| or |long| from the
-% \meta{primary} key.
-% \end{function}
-% \example The following defines an internal key (|k-internal|), which is used
-% to build a comma separated list from each call of the user facing key (|k|):\\
-% \begin{minipage}[c]{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcSplit\foo
-% {k-internal=0,color=red}
-% {\textcolor{#2}{#1}}
-% \ekvcSecondaryKeys\foo
-% {aggregate k = {k-internal}{#1,#2}}
-% \foo{}\par
-% \foo{k=1,k=2,k=3,k=4}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcSplit\foo
-% {k-internal=0,color=red}
-% {\textcolor{#2}{#1}}
-% \ekvcSecondaryKeys\foo
-% {aggregate k = {k-internal}{#1,#2}}
-% \foo{}\par
-% \foo{k=1,k=2,k=3,k=4}
-% \end{exresult}
-%
-% But also more strange stuff could end there, like macros or using the same
-% value multiple times:
-% \begin{lstlisting}
-% \ekvcSecondaryKeys\foo
-% {aggregate k = {k-internal}{\old{#1}\new{#2\old{#1}}}}
-% \end{lstlisting}
-%
-%
-% \begin{function}{flag-bool}
-% \begin{syntax}
-% flag-bool \key\ = \meta{cs} \prefixes3
-% \end{syntax}
-% This is a secondary key that doesn't directly involve any of the primary or
-% secondary keys.
-% This defines \key\ to take a value, which should be either |true| or
-% |false|, and set the flag called \meta{cs} accordingly as a boolean.
-% If \meta{cs} isn't defined yet it will be initialised as a flag.
-% Please also read \autoref{sec:flags}.
-% \end{function}
-%
-% \begin{function}{flag-true,flag-false}
-% \begin{syntax}
-% flag-true \key\ = \meta{cs} \prefixes3
-% \end{syntax}
-% This is a secondary key that doesn't directly involve any of the primary or
-% secondary keys.
-% This defines \key\ to take no value and set the flag called \meta{cs} to
-% |true| or |false|, respectively.
-% If \meta{cs} isn't defined yet it will be initialised as a flag.
-% Please also read \autoref{sec:flags}.
-% \end{function}
-%
-% \begin{function}{flag-raise}
-% \begin{syntax}
-% flag-raise \key\ = \meta{cs} \prefixes3
-% \end{syntax}
-% This is a secondary key that doesn't directly involve any of the primary or
-% secondary keys.
-% This defines \key\ to take no value and raise the flag called \meta{cs}.
-% If \meta{cs} isn't defined yet it will be initialised as a flag.
-% Please also read \autoref{sec:flags}.
-% \end{function}
-%
-%
-% \subsection{Changing the Initial Values}\label{sec:change}
-%
-% \begin{function}{\ekvcChange}
-% \begin{syntax}
-% \cs{ekvcChange}\meta{cs}\{\kv,\ldots\}
-% \end{syntax}
-% This processes the \kv\ list for the macro \meta{cs} to set new defaults for
-% it (meaning the values used if you don't provide anything at use time, not
-% those specified with the |default| secondary key). \meta{cs} should be
-% defined with \expkvc\ (so with any of the methods in \autoref{sec:define}).
-% Inside the \kv\ list both primary and secondary keys can be used. If
-% \meta{cs} was defined |\long| earlier it will still be |\long|, every other
-% \TeX\ prefix will be stripped (but \expkvc\ doesn't support them anywhere
-% else so that should be fine). The resulting new defaults will be stored
-% inside the \meta{cs} locally (just as the original defaults were). If there
-% was an unknown key forwarding added to \meta{cs} (see \autoref{sec:unknown})
-% any unknown key will be stored inside the list of unknown keys as well.
-% |\ekvcChange| is not expandable!
-% \end{function}
-%
-% Consider the following example:\\
-% \begin{minipage}[c]{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcSplit\foo{a=a,b=b}{a is #1.\par b is #2.\par}
-% \begingroup
-% \ekvcChange\foo{b=B}
-% \foo{} % new defaults
-% \ekvcSecondaryKeys\foo{meta c={a={#1},b={#1}}}
-% \ekvcChange\foo{c=c}
-% \foo{} % newer defaults
-% \endgroup
-% \foo{} % initial defaults
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcSplit\foo{a=a,b=b}{a is #1.\par b is #2.\par}
-% \begingroup
-% \ekvcChange\foo{b=B}
-% \foo{}
-% \ekvcSecondaryKeys\foo{meta c={a={#1},b={#1}}}
-% \ekvcChange\foo{c=c}
-% \foo{}
-% \endgroup
-% \foo{}
-% \end{exresult}
-%
-% As a result with this the typical setup macro could be implemented:
-% \begin{lstlisting}
-% \ekvcHashAndUse\foo{key=a,key=b}
-% \newcommand*\foosetup{\ekvcChange\foo}
-% \end{lstlisting}
-% Of course the usage is limited to a single macro |\foo|, hence this might not
-% be as powerful as similar macros used with other \kv\ interfaces. But at least
-% a few similar macros could be grouped using the same key parsing macro
-% internally.
-%
-%
-% \subsection{Handling Unknown Keys}\label{sec:unknown}
-%
-% If your macro should handle unknown keys without directly throwing an error
-% you can use the special |...| marker in the \meta{primary keys} list. Since
-% those keys will be processed once by \expkv\ they will be forwarded
-% normalised: The key name will be the result of one |\detokenize|, the value
-% will be forwarded as \verb*| {|\meta{value}\verb*|} |, so with spaces around
-% one set of braces (this way, most other \kv\ implementations should parse the
-% correct input).
-%
-% The exact behaviour differs slightly between the two variants (as all keys
-% do). The behaviour inside the split variants will be similar to normal primary
-% keys, the $n$-th argument (corresponding to the position of |...| inside the
-% primary keys list) will contain any unknown key encountered while parsing the
-% argument. And inside the split variant you can use a primary key named |...|
-% at the same time.
-%
-% \example The following will forward any unknown key to |\includegraphics| to
-% control the appearance while processing its own keys:\\
-% \begin{minipage}{.6\linewidth}
-% \begin{lstlisting}
-% \newcommand*\foo{\ekvoptarg\fooKV{}}
-% \ekvcSplitAndForward\fooKV\fooOUT
-% {
-% a=a
-% ,...
-% ,b=b
-% ,...={}
-% }
-% \newcommand\fooOUT[5]
-% {%
-% a is #1 and b is #3.\par
-% \includegraphics[{#2}]{#5}\par
-% \texttt{...} is #4.\par
-% }
-% \foo[width=.5\linewidth, b=c,
-% ...={a stupid key name, but works}]
-% {example-image-duck}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.4\linewidth}
-% \newcommand*\foo{\ekvoptarg\fooKV{}}
-% \ekvcSplitAndForward\fooKV\fooOUT
-% {
-% a=a
-% ,...
-% ,b=b
-% ,...={}
-% }
-% \newcommand\fooOUT[5]
-% {%
-% a is #1 and b is #3.\par
-% \includegraphics[{#2}]{#5}\par
-% \texttt{...} is #4.\par
-% }
-% \foo[width=.5\linewidth, b=c,
-% ...={a stupid key name, but works}]
-% {example-image-duck}
-% \end{exresult}
-%
-% Inside the hash variants the unknown keys list will be put inside the hash
-% named |...| (we have to use some name, so why not this). As a consequence a
-% primary key named |...| would clash with the unknown key handler. If you still
-% used such a key it would remove any unknown key stored there until that point
-% and replace the list with its value.
-%
-% \example The following is more or less equivalent to the example above, but
-% with the hash variant, and it will not contain the primary |...| key. We have
-% to make sure that |\includegraphics| sees the \kv\ list, so need to expand
-% |\ekvcValue{...}{#1}| before |\includegraphics| parses it.\\
-% \begin{minipage}{.76\linewidth}
-% \begin{lstlisting}
-% \newcommand*\foo{\ekvoptarg\fooKV{}}
-% \ekvcHashAndForward\fooKV\fooOUT
-% {a=a, b=b, ...}
-% \newcommand\fooOUT[2]
-% {%
-% a is \ekvcValue{a}{#1} and
-% b is \ekvcValue{b}{#1}.\par
-% \expanded{\noexpand\includegraphics
-% [{\ekvcValue{...}{#1}}]}
-% {#2}\par
-% }
-% \foo[width=\linewidth, b=c]
-% {example-image-duck-portrait}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.24\linewidth}
-% \newcommand*\foo{\ekvoptarg\fooKV{}}
-% \ekvcHashAndForward\fooKV\fooOUT
-% {a=a, b=b, ...}
-% \newcommand\fooOUT[2]
-% {%
-% a is \ekvcValue{a}{#1} and
-% b is \ekvcValue{b}{#1}.\par
-% \expanded{\noexpand\includegraphics
-% [{\ekvcValue{...}{#1}}]}
-% {#2}\par
-% }
-% \foo[width=\linewidth, b=c]
-% {example-image-duck-portrait}
-% \end{exresult}
-%
-%
-% \subsection{Flags}\label{sec:flags}
-%
-% The idea of flags is taken from \pkg{expl3}. They provide a way to store
-% numerical information expandably, however only incrementing and accessing
-% works expandably, decrementing is unexpandable. A flag has a height, which
-% is a numerical value, and which can be raised by $1$. Flags come at a high
-% computational cost (accessing them is slow and they require more memory than
-% normal \TeX\ data types like registers, both getting linearly worse with the
-% height), so don't use them if not necessary.
-%
-% The state of flags is always changed locally to the current group, but not to
-% the current macro, so if you're using one of the |t|-types involving flags
-% bear in mind that they can affect other macros using the same flags at the
-% current group level!
-%
-% \expkvc\ provides some macros to access, alter, and use flags. Flags of
-% \expkvc\ don't share a name space with the flags of \pkg{expl3}.
-%
-% \begin{function}{\ekvcFlagNew}
-% \begin{syntax}
-% \cs{ekvcFlagNew}\meta{flag}
-% \end{syntax}
-% This initialises the macro \meta{flag} as a new flag. It isn't checked
-% whether the macro \meta{flag} is currently undefined. A \meta{flag} will
-% expand to the flag's current height with a trailing space (so you can use it
-% directly with |\ifnum| for example and it will terminate the number scanning
-% on its own).
-% \end{function}
-%
-% All other macros dealing with flags take as a parameter a macro defined as a
-% \meta{flag} with |\ekvcFlagNew|.
-%
-% \begin{function}{\ekvcFlagHeight}
-% \begin{syntax}
-% \cs{ekvcFlagHeight}\meta{flag}
-% \end{syntax}
-% This expands to the current height of \meta{flag} in a single step of
-% expansion (without a trailing space).
-% \end{function}
-%
-% \begin{function}{\ekvcFlagRaise}
-% \begin{syntax}
-% \cs{ekvcFlagRaise}\meta{flag}
-% \end{syntax}
-% This expandably raises the height of \meta{flag} by $1$.
-% \end{function}
-%
-% \begin{function}{\ekvcFlagSetTrue,\ekvcFlagSetFalse}
-% \begin{syntax}
-% \cs{ekvcFlagSetTrue}\meta{flag}
-% \end{syntax}
-% By interpreting an even value as false and an odd value as true we can use a
-% flag as a boolean. This expandably sets \meta{flag} to true or false,
-% respectively, by raising it if necessary.
-% \end{function}
-%
-% \begin{function}{\ekvcFlagIf}
-% \begin{syntax}
-% \cs{ekvcFlagIf}\meta{flag}\marg{true}\marg{false}
-% \end{syntax}
-% This interprets a \meta{flag} as a boolean and expands to either \meta{true}
-% or \meta{false}.
-% \end{function}
-%
-% \begin{function}{\ekvcFlagIfRaised}
-% \begin{syntax}
-% \cs{ekvcFlagIfRaised}\meta{flag}\marg{true}\marg{false}
-% \end{syntax}
-% This tests whether the \meta{flag} is raised, meaning it has a height
-% greater than zero, and if so expands to \meta{true} else to \meta{false}.
-% \end{function}
-%
-% \begin{function}{\ekvcFlagReset}
-% \begin{syntax}
-% \cs{ekvcFlagReset}\meta{flag}
-% \end{syntax}
-% This resets a flag (so restores its height to $0$). This operation is
-% \emph{not} expandable and done locally. If you really intend to use flags
-% you can reset them every now and then to keep the performance hit low.
-% \end{function}
-%
-% \begin{function}{\ekvcFlagGetHeight}
-% \begin{syntax}
-% \cs{ekvcFlagGetHeight}\meta{flag}\marg{next}
-% \end{syntax}
-% This retrieves the current height of the \meta{flag} and provides it as a
-% braced argument to \meta{next}, leaving \meta{next}\marg{height} in the
-% input stream.
-% \end{function}
-%
-% \begin{function}{\ekvcFlagGetHeights}
-% \begin{syntax}
-% \cs{ekvcFlagGetHeights}\marg{flag-list}\marg{next}
-% \end{syntax}
-% This retrieves the current height of each \meta{flag} in the
-% \meta{flag-list} and provides them as a single argument to \meta{next}.
-% Inside that argument each height is enclosed in a set of braces
-% individually. The \meta{flag-list} is just a single argument containing the
-% \meta{flag}s.
-% So a usage like
-% \texttt
-% {^^A
-% \cs[no-index]{ekvcFlagGetHeights}\hskip0pt^^A
-% \{\cs[no-index]{myflagA}\cs[no-index]{myflagB}\}\hskip0pt^^A
-% \{\cs[no-index]{stuff}\}^^A
-% }
-% will expand to
-% \texttt{\cs[no-index]{stuff}\{\marg{height-A}\marg{height-B}\}}.
-% \end{function}
-%
-%
-% \subsection{Further Examples}\label{sec:examples}
-%
-% How could a documentation be a good documentation without enough basic
-% examples? Say we want to define a small macro expanding to some character
-% description (who knows why this has to be expandable?). A character
-% description will not have too many items to it, so we use |\ekvcSplit| (the
-% comments with the parameter numbers are of course not necessary and just ease
-% reading the example).
-% \begin{lstlisting}
-% \ekvcSplit\character
-% {
-% name=John Doe, % #1
-% age=any, % #2
-% nationality=the Universe, % #3
-% hobby=to exist, % #4
-% type=Mister, % #5
-% pronoun=He, % #6
-% possessive=his, % #7
-% }
-% {#1 is a #5 from #3. #6 is of #2 age and #7 hobby is #4.\par}
-% \end{lstlisting}
-% Also we want to give some short cuts so that it's easier to describe several
-% persons.
-% \begin{lstlisting}
-% \ekvcSecondaryKeys\character
-% {
-% alias pro = pronoun,
-% alias pos = possessive,
-% nmeta me =
-% {
-% name=Jonathan,
-% age=a young,
-% nationality=Germany,
-% hobby=\TeX\ coding,
-% },
-% meta lady =
-% {type=Lady, pronoun=She, possessive=her, name=Jane Doe, #1},
-% nmeta paulo =
-% {
-% name=Paulo,
-% type=duck,
-% age=a young,
-% nationality=Brazil,
-% hobby=to quack,
-% }
-% }
-% \end{lstlisting}
-% Now we can describe people using
-% \begin{lstlisting}
-% \character{}
-% \character{me}
-% \character{paulo}
-% \character
-% {lady={name=Evelyn,nationality=Ireland,age=the best,hobby=reading}}
-% \character
-% {
-% name=Our sun, type=star, nationality=our solar system, pro=It,
-% age=an old, pos=its, hobby=shining
-% }
-% \end{lstlisting}
-% As one might see, the |lady| key could actually have been an |nmeta| key as
-% well, as all that is done with the argument is using it as a \kv\ list.
-%
-% The result of only the first two usages would be:
-% \begin{exresult}{\linewidth}
-% \ekvcSplit\character
-% {
-% name=John Doe,
-% age=any,
-% nationality=the Universe,
-% hobby=to exist,
-% type=Mister,
-% pronoun=He,
-% possessive=his,
-% }
-% {#1 is a #5 from #3. #6 is of #2 age and #7 hobby is #4.\par}
-% \ekvcSecondaryKeys\character
-% {
-% alias pro = pronoun,
-% alias pos = possessive,
-% nmeta me =
-% {
-% name=Jonathan,
-% age=a young,
-% nationality=Germany,
-% hobby=\TeX\ coding,
-% },
-% meta lady =
-% {type=Lady, pronoun=She, possessive=her, name=Jane Doe, #1},
-% nmeta paulo =
-% {
-% name=Paulo,
-% type=duck,
-% age=a young,
-% nationality=Brazil,
-% hobby=to quack,
-% }
-% }
-% \character{}
-% \character{me}
-% \end{exresult}
-%
-% Using \pkg{xparse} or \expkv's \cs{ekvoptarg} or \cs{ekvoptargTF} and
-% forwarding arguments one can easily define \kv\ macros with actual optional
-% and mandatory arguments as well. A small nonsense example (which should
-% perhaps use |\ekvcSplitAndForward| instead of |\ekvcHashAndForward| since it
-% only uses four keys and one other argument -- and isn't expandable since it
-% uses a \env{tabular} environment, so it would've been better to use a more
-% feature rich \kv\ interface most likely, \emph{e.g.}, the one provided by
-% \expkvd):
-% \begin{lstlisting}
-% \makeatletter
-% \newcommand*\nonsense{\ekvoptarg\nonsense@a{}}
-% \ekvcHashAndForward\nonsense@a\nonsense@b
-% {
-% keyA = A,
-% keyB = B,
-% keyC = c,
-% keyD = d,
-% }
-% \newcommand*\nonsense@b[2]
-% {%
-% \begin{tabular}{lll}
-% key & A & \ekvcValue{keyA}{#1} \\
-% & B & \ekvcValue{keyB}{#1} \\
-% & C & \ekvcValue{keyC}{#1} \\
-% & D & \ekvcValue{keyD}{#1} \\
-% \multicolumn{2}{l}{mandatory} & #2 \\
-% \end{tabular}%
-% }
-% \makeatother
-% \end{lstlisting}
-% And then we would be able to do some nonsense
-% \begin{lstlisting}
-% \nonsense{}
-% \nonsense[keyA=hihi]{haha}
-% \nonsense[keyA=hihi, keyB=A]{hehe}
-% \nonsense[keyC=huhu, keyA=hihi, keyB=A]{haha}
-% \end{lstlisting}
-% resulting in
-% \begin{exresult}{\linewidth}
-% \makeatletter
-% \newcommand*\nonsense{\ekvoptarg\nonsense@a{}}
-% \ekvcHashAndForward\nonsense@a\nonsense@b
-% {
-% keyA = A,
-% keyB = B,
-% keyC = c,
-% keyD = d,
-% }
-% \newcommand*\nonsense@b[2]
-% {%
-% \begin{tabular}{lll}
-% key & A & \ekvcValue{keyA}{#1} \\
-% & B & \ekvcValue{keyB}{#1} \\
-% & C & \ekvcValue{keyC}{#1} \\
-% & D & \ekvcValue{keyD}{#1} \\
-% \multicolumn{2}{l}{mandatory} & #2 \\
-% \end{tabular}%
-% }
-% \makeatother
-% \nonsense{}
-% \nonsense[keyA=hihi]{haha}
-% \nonsense[keyA=hihi, keyB=A]{hehe}
-% \nonsense[keyC=huhu, keyA=hihi, keyB=A]{haha}
-% \end{exresult}
-%
-%
-% \subsection{Freedom for Keys!}
-%
-% If this was the \TeX book this subsection would have a double bend sign. Not
-% because it is overly complicated, but because it shows things which could
-% break \expkvc's expandability and its alignment safety. This is for
-% experienced users wanting to get the most flexibility and knowing what they
-% are doing.
-%
-% In case you're wondering, it is possible to define other keys than the
-% primaries and the secondary types listed in \autoref{sec:secondaries} for a
-% macro defined with \expkvc\ by using the low-level interface of \expkv\ or
-% even the interface provided by \expkvd. The set name used for \expkvc's keys
-% is the macro name, including the leading backslash, or more precisely
-% |\string|\meta{cs} is used. This can be exploited to define additional keys
-% with arbitrary code. Consider the following \emph{bad} example:
-% \begin{lstlisting}
-% \ekvcSplit\foo{a=A,b=B}{a is #1.\par b is #2\par}
-% \protected\ekvdef{\string\foo}{c}{\def\fooC{#1}}
-% \end{lstlisting}
-% This would define a key named |c| that will store its value inside a macro.
-% The issue with this is that this can't be done expandably. As a result, the
-% macro |\foo| isn't always expandable any more (not that bad if this was never
-% required; killjoy if it was) and as soon as the key |c| is used, it is also no
-% longer alignment safe\footnote{This means that the \kv-list can't contain
-% alignment markers that are not inside an additional set of braces if used
-% inside a \TeX\ alignment.}
-% (might be bad depending on the usage).
-%
-% So why do I show you this? Because we could as well do something useful like
-% create a key that pre-parses the input and after that passes the parsed value
-% on. This parsing would have to be completely expandable though. For the
-% pass-on part we can use the following function:
-%
-% \begin{function}{\ekvcPass}
-% \begin{syntax}
-% \cs{ekvcPass}\meta{cs}\marg{key}\marg{value}
-% \end{syntax}
-% This passes \meta{value} on to \meta{key} for the \expkvc-macro \meta{cs}.
-% It should be used inside the key parsing of a macro defined with \expkvc,
-% else this most likely results in a low level \TeX\ error. You can't forward
-% anything to the special unknown key handler |...| as that is no defined key.
-% \end{function}
-%
-% With this we could for example split the value of a key at a hyphen and pass
-% the parts to different keys:\\
-% \begin{minipage}[c]{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcSplit\foo{a=A,b=B}{a is #1.\par b is #2.\par}
-% \ekvdef{\string\foo}{c}{\fooSplit#1\par}
-% \def\fooSplit#1-#2\par
-% {\ekvcPass\foo{a}{#1}\ekvcPass\foo{b}{#2}}
-% \foo{}
-% \foo{c=1-2}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcSplit\foo{a=A,b=B}{a is #1.\par b is #2.\par}
-% \ekvdef{\string\foo}{c}{\fooSplit#1\par}
-% \def\fooSplit#1-#2\par{\ekvcPass\foo{a}{#1}\ekvcPass\foo{b}{#2}}
-% \foo{}
-% \foo{c=1-2}
-% \end{exresult}
-%
-% Additionally, there is a more general version of the |aggregate| secondary key
-% type (described in \autoref{sec:secondaries}), namely the |process| key type:
-%
-% \begin{function}{process}
-% \begin{syntax}
-% process \key\ = \marg{primary}\marg{definition} \prefixes2
-% \end{syntax}
-% This will grab the current value of a \meta{primary} key as |#1| (without
-% changing the current value) and the new value as |#2| and leave all the
-% processing to \meta{definition}. You should use |\ekvcPass| to forward the
-% values afterwards. Unlike |aggregate| you can specify whether the \key\
-% should be long or not, this isn't inherited from the \meta{primary} key.
-% Keep in mind that you could easily break things here if your code does not
-% work by expansion.
-% \end{function}
-% \example We could define a key that only accepts values greater than the
-% current value with this:\\
-% \begin{minipage}[c]{.75\linewidth}
-% \begin{lstlisting}
-% \ekvcSplit\foo{internal=5}{a is #1.\par}
-% \ekvcSecondaryKeys\foo
-% {
-% process a={internal}
-% {%
-% \ifnum#1<#2
-% \ekvcPass\foo{internal}{#2}%
-% \fi
-% }
-% }
-% \foo{a=1}
-% \foo{a=5}
-% \foo{a=9}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \ekvcSplit\foo{internal=5}{a is #1.\par}
-% \ekvcSecondaryKeys\foo
-% {process a={internal}{\ifnum#1<#2 \ekvcPass\foo{internal}{#2}\fi}}
-% \foo{a=1}
-% \foo{a=5}
-% \foo{a=9}
-% \end{exresult}
-%
-%
-% \subsection{Speed Considerations}\label{sec:speed}
-%
-% As already mentioned in the introduction there are some speed considerations
-% implied if you choose to define macros via \expkvc. However the overhead isn't
-% the factor which should hinder you to use \expkvc\ if you found a reasonable
-% use case. The key-parsing is still faster than with most other \kv\ packages
-% (see the ``Comparisons'' subsection in the \expkv\ documentation).
-%
-% The speed considerations in this subsection use the first example of
-% \autoref{sec:examples} as the benchmark. So we have seven keys and a short
-% sentence which should be typeset. For comparisons I use the following
-% equivalent \expkvd\ definitions. Each result is the average between changing
-% no keys from their initial values and altering four. Furthermore I'll compare
-% three variants of \expkvc\ with the \expkvd\ definitions, namely the split
-% example from above, a hash variant using |\ekvcValue| and a hash variant using
-% |\ekvcValueFast|.
-% \begin{lstlisting}
-% \usepackage{expkv-def}
-% \ekvdefinekeys{keys}
-% {%
-% ,store name = \KEYSname
-% ,initial name = John Doe
-% ,store age = \KEYSage
-% ,initial age = any
-% ,store nationality = \KEYSnationality
-% ,initial nationality = the Universe
-% ,store hobby = \KEYShobby
-% ,initial hobby = to exist
-% ,store type = \KEYStype
-% ,initial type = Mister
-% ,store pronoun = \KEYSpronoun
-% ,initial pronoun = He
-% ,store possessive = \KEYSpossessive
-% ,initial possessive = his
-% }
-% \newcommand*\KEYS[1]
-% {%
-% \begingroup
-% \ekvset{keys}{#1}%
-% \KEYSname\ is a \KEYStype\ from \KEYSnationality.
-% \KEYSpronoun\ is of \KEYSage\ age and
-% \KEYSpossessive\ hobby is \KEYShobby.%
-% \endgroup
-% }
-% \end{lstlisting}
-%
-% The first comparison removes the typesetting part from all the definitions, so
-% that only the key parsing is compared. In this comparison the |\ekvcValue|
-% and |\ekvcValueFast| variants will not differ, as they are exactly the same
-% until the key usage. We find that the split approach is $1.4$ times slower
-% than the \expkvd\ setup and the hash variants end up in the middle at $1.17$
-% times slower.
-%
-% Next we put the typesetting part back in. Every call of the macros will
-% typeset the sentences into a box register in horizontal mode. With the
-% typesetting part (which includes the accessing of values) the fastest remains
-% the \expkvd\ definitions, but split is close at $1.16$ times slower, followed
-% by the hash variant with fast accesses at $1.36$ times slower, and the safe
-% hash access variant ranks in the slowest $1.8$ times slower than \expkvd.
-%
-% Just in case you're wondering now, a simple macro taking seven arguments is
-% $30$ to $40$ times faster than any of those in the argument grabbing and \kv\
-% parsing part and only $1.5$ to $2.8$ times faster if the typesetting part is
-% factored in. So the real choke isn't the parsing.
-%
-% So to summarise this, if you have a use case for expandable \kv\
-% parsing macros you should go on and define them using \expkvc. If you just
-% want to define a simple macro with a few keys |\ekvcSplit| might be the
-% easiest interface there is. If you have a reasonable use case for \kv\ parsing
-% macros but defining them expandable isn't necessary for your use you should
-% take advantage of the greater flexibility of non-expandable \kv\ setups (but
-% if you're after maximum speed there aren't that many \kv\ parsers beating
-% \expkvc). And if you are after maximum performance maybe ditching the \kv\
-% interface altogether is a good idea, but depending on the number of arguments
-% your interface might get convoluted.
-%
-%
-% \subsection{Useless Macros}
-%
-% Perhaps these macros aren't completely useless, but I figured from a user's
-% point of view I wouldn't know what I should do with these.
-%
-% \begin{function}{\ekvcDate,\ekvcVersion}
-% These two macros store the version and the date of the package/generic code.
-% \end{function}
-%
-%
-% \subsection{Bugs}
-%
-% Of course I don't think there are any bugs (who would knowingly distribute
-% buggy software as long as he isn't a multi-million dollar corporation?). But
-% if you find some please let me know. For this one might find my email address
-% on the first page or file an issue on Github:
-% \url{https://github.com/Skillmon/tex_expkv-cs}
-%
-%
-% \subsection{License}
-%
-% Copyright \textcopyright\ 2020\unless\ifnum\year=2020--\the\year\fi\
-% Jonathan P. Spratte
-%
-% \medskip\noindent
-% This work may be distributed and/or modified under the conditions of the
-% \LaTeX\ Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% \url{http://www.latex-project.org/lppl.txt}
-%
-% \noindent
-% This work is ``maintained'' (as per LPPL maintenance status) by
-%
-% \mbox{Jonathan P. Spratte}.
-%
-% \end{documentation}^^A=<<
-%
-% \begin{implementation}^^A>>=
-%
-% \clearpage
-%
-% \section{Implementation}^^A>>=
-%^^A the LaTeX package >>=
-% \subsection{The \LaTeX\ Package}
-% Just like for \expkv\ we provide a small \LaTeX\ package that sets up things
-% such that we behave nicely on \LaTeX\ packages and files system. It'll
-% |\input| the generic code which implements the functionality.
-% \gobbledocstriptag
-%<*pkg>
-% \begin{macrocode}
-\RequirePackage{expkv}
-\def\ekvc@tmp
- {%
- \ProvidesFile{expkv-cs.tex}%
- [%
- \ekvcDate\space v\ekvcVersion\space
- define expandable key=val macros using expkv%
- ]%
- }
-\input{expkv-cs.tex}
-\ProvidesPackage{expkv-cs}%
- [%
- \ekvcDate\space v\ekvcVersion\space
- define expandable key=val macros using expkv%
- ]
-% \end{macrocode}
-% \gobbledocstriptag
-%</pkg>
-%^^A=<<
-%^^A the ConTeXt module >>=
-% \subsection{The \ConTeXt\ module}
-% \gobbledocstriptag
-%<*ctx>
-% \begin{macrocode}
-\writestatus{loading}{ConTeXt User Module / expkv-cs}
-\usemodule[expkv]
-\unprotect
-\input expkv-cs.tex
-\writestatus{loading}
- {ConTeXt User Module / expkv-cs / Version \ekvcVersion\space loaded}
-\protect\endinput
-% \end{macrocode}
-% \gobbledocstriptag
-%</ctx>
-%^^A=<<
-%^^A main file >>=
-% \subsection{The Generic Code}
-% The rest of this implementation will be the generic code.
-% \gobbledocstriptag
-%<*tex>
-%
-% Load \expkv\ if the package didn't already do so -- since \expkv\ has
-% safeguards against being loaded twice this does no harm and the overhead
-% isn't that big. Also we reuse some of the internals of \expkv\ to save us from
-% retyping them.
-% \begin{macrocode}
-\input expkv
-% \end{macrocode}
-%
-% We make sure that \file{expkv-cs.tex} is only input once:
-% \begin{macrocode}
-\expandafter\ifx\csname ekvcVersion\endcsname\relax
-\else
- \expandafter\endinput
-\fi
-% \end{macrocode}
-%
-% \begin{macro}{\ekvcVersion,\ekvcDate}
-% We're on our first input, so lets store the version and date in a macro.
-% \begin{macrocode}
-\def\ekvcVersion{1.2}
-\def\ekvcDate{2022-02-13}
-% \end{macrocode}
-% \end{macro}
-%
-% If the \LaTeX\ format is loaded we want to be a good file and report back who
-% we are, for this the package will have defined |\ekvc@tmp| to use
-% |\ProvidesFile|, else this will expand to a |\relax| and do no harm.
-% \begin{macrocode}
-\csname ekvc@tmp\endcsname
-% \end{macrocode}
-%
-% Store the category code of |@| to later be able to reset it and change it to
-% 11 for now.
-% \begin{macrocode}
-\expandafter\chardef\csname ekvc@tmp\endcsname=\catcode`\@
-\catcode`\@=11
-% \end{macrocode}
-% |\ekvc@tmp| will be reused later, but we don't need it to ever store
-% information long-term after \expkvc\ was initialized.
-%
-% \begin{macro}[internal]{\ekvc@tripledots}
-% This macro just serves as a marker for a comparison to allow the syntax
-% for the unknown key handlers.
-% \begin{macrocode}
-\def\ekvc@tripledots{...}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@keycount}
-% We'll need to keep count how many keys must be defined for each macro in the
-% |split| variants.
-% \begin{macrocode}
-\newcount\ekvc@keycount
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@long,\ekvc@any@long}
-% Some macros will have to be defined long. These two will be let to |\long|
-% when this should be the case.
-% \begin{macrocode}
-\let\ekvc@long\ekv@empty
-\let\ekvc@any@long\ekv@empty
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@ifdefined}
-% We want to test whether a macro is already defined. This test checks for a
-% defined macro that isn't |\relax|.
-% \begin{macrocode}
-\long\def\ekvc@ifdefined#1%
- {%
- \ifdefined#1%
- \ifx\relax#1%
- \ekv@fi@gobble
- \fi
- \@firstofone
- \ekv@fi@firstoftwo
- \fi
- \@secondoftwo
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@ekvset@pre@expander,
-% \ekvc@ekvset@pre@expander@a,
-% \ekvc@ekvset@pre@expander@b
-% }
-% This macro expands |\ekvset| twice so that the first two steps of expansion
-% don't have to be made every time the \expkvc\ macros are used. We have to do
-% a little magic trick to get the macro parameter |#1| for the macro
-% definition this is used in, even though we're calling |\unexpanded|. We do
-% that by splitting the expanded |\ekvset| at some marks and place |##1| in
-% between. At this spot we also add |\ekv@alignsafe| and |\ekv@endalignsafe|
-% to ensure that macros created with \expkvc\ are alignment safe.
-% \begin{macrocode}
-\def\ekvc@ekvset@pre@expander#1%
- {%
- \expandafter\ekvc@ekvset@pre@expander@a\ekvset{#1}\ekvc@stop\ekvc@stop
- }
-\def\ekvc@ekvset@pre@expander@a
- {%
- \expandafter\ekvc@ekvset@pre@expander@b
- }
-\def\ekvc@ekvset@pre@expander@b#1\ekvc@stop#2\ekvc@stop
- {%
- \ekv@unexpanded\expandafter{\ekv@alignsafe}%
- \ekv@unexpanded{#1}##1\ekv@unexpanded{#2}%
- \ekv@unexpanded\expandafter{\ekv@endalignsafe}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcSplitAndUse}
-% The first user macro we want to set up can be reused for
-% \cs[no-index]{ekvcSplitAndForward} and \cs[no-index]{ekvcSplit}. We'll split
-% this one up so that the test whether the macro is already defined doesn't
-% run twice.
-% \begin{macrocode}
-\protected\long\def\ekvcSplitAndUse#1#2%
- {%
- \let\ekvc@helpers@needed\@firstoftwo
- \ekvc@ifdefined#1%
- {\ekvc@err@already@defined#1}%
- {\ekvcSplitAndUse@#1{}{#2}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvcSplitAndUse@}
-% The actual macro setting up things. We need to set some variables, forward
-% the key list to |\ekvc@SetupSplitKeys|, and afterwards define the front
-% facing macro to call |\ekvset| and put the initials and the argument sorting
-% macro behind it. The internals |\ekvc@any@long|, |\ekvc@initials| and
-% |\ekvc@keycount| will be set correctly by |\ekvc@SetupSplitKeys|.
-% \begin{macrocode}
-\protected\long\def\ekvcSplitAndUse@#1#2#3%
- {%
- \edef\ekvc@set{\string#1}%
- \ekvc@SetupSplitKeys{#3}%
- \ekvc@helpers@needed
- {%
- \ekvc@any@long\edef#1##1%
- {%
- \expandafter\ekvc@ekvset@pre@expander\expandafter{\ekvc@set}%
- \ekv@unexpanded\expandafter
- {\csname ekvc@split@\the\ekvc@keycount\endcsname}%
- \ekv@unexpanded\expandafter{\ekvc@initials{}#2}%
- }%
- }%
- {%
- \ekvc@any@long\edef#1##1%
- {%
- \expandafter\ekvc@ekvset@pre@expander\expandafter{\ekvc@set}%
- \ekv@unexpanded{#2}%
- \ekv@unexpanded\expandafter{\ekvc@initials}%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\ekvcSplitAndForward}
-% This just reuses |\ekvcSplitAndUse@| with a non-empty second argument,
-% resulting in that argument to be called after the splitting.
-% \begin{macrocode}
-\protected\long\def\ekvcSplitAndForward#1#2#3%
- {%
- \let\ekvc@helpers@needed\@firstoftwo
- \ekvc@ifdefined#1%
- {\ekvc@err@already@defined#1}%
- {\ekvcSplitAndUse@#1{{#2}}{#3}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcSplit}
-% The first half is just |\ekvcSplitAndForward| then we define the macro to
-% which the parsed key list is forwarded. There we need to allow for up to
-% nine arguments.
-% \begin{macrocode}
-\protected\long\def\ekvcSplit#1#2#3%
- {%
- \let\ekvc@helpers@needed\@secondoftwo
- \ekvc@ifdefined#1%
- {\ekvc@err@already@defined#1}%
- {%
- \expandafter
- \ekvcSplitAndUse@\expandafter#1\csname ekvc@\string#1\endcsname{#2}%
- \ifnum\ekvc@keycount<1
- \ekvc@any@long\expandafter\def\csname ekvc@\string#1\endcsname{#3}%
- \else
- \ifnum\ekvc@keycount>9
- \ekvc@err@toomany{#1}%
- \let#1\ekvc@undefined
- \else
- \ekvcSplit@build@argspec
- \ekvc@any@long\expandafter
- \def\csname ekvc@\string#1\expandafter\endcsname\ekvc@tmp{#3}%
- \fi
- \fi
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvcSplit@build@argspec,\ekvcSplit@build@argspec@}
-% \begin{macrocode}
-\protected\def\ekvcSplit@build@argspec
- {%
- \begingroup
- \edef\ekvc@tmp
- {\endgroup\def\ekv@unexpanded{\ekvc@tmp}{\ekvcSplit@build@argspec@{1}}}%
- \ekvc@tmp
- }
-\def\ekvcSplit@build@argspec@#1%
- {%
- \ifnum#1>\ekvc@keycount
- \ekv@fi@gobble
- \fi
- \@firstofone
- {%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@#1\endcsname####}#1%
- \expandafter\ekvcSplit@build@argspec@\expandafter{\the\numexpr#1+1}%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@SetupSplitKeys, \ekvc@SetupSplitKeys@a, \ekvc@SetupSplitKeys@b,
-% \ekvc@SetupSplitKeys@c, \ekvc@SetupSplitKeys@d, \ekvc@SetupSplitKeys@e,
-% \ekvc@SetupSplitKeys@check@unknown,\ekvc@SetupSplitKeys@unknown
-% }
-% These macros parse the list of keys and set up the key macros. First we need
-% to initialise some macros and start |\ekvparse|.
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupSplitKeys
- {%
- \ekvc@keycount=\ekv@zero
- \let\ekvc@any@long\ekv@empty
- \let\ekvc@initials\ekv@empty
- \ekvparse\ekvc@SetupSplitKeys@check@unknown\ekvc@SetupSplitKeys@a
- }
-% \end{macrocode}
-% Then we need to step the key counter for each key. Also we have to check
-% whether this key has a |long| prefix so we initialise |\ekvc@long|.
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupSplitKeys@a#1%
- {\expandafter\ekvc@SetupSplitKeys@b\detokenize{#1}\ekvc@stop}
-\protected\def\ekvc@SetupSplitKeys@b#1\ekvc@stop
- {%
- \advance\ekvc@keycount1
- \let\ekvc@long\ekv@empty
- \ekvc@ifspace{#1}%
- {\ekvc@SetupSplitKeys@c#1\ekvc@stop}%
- {\ekvc@SetupSplitKeys@d{#1}}%
- }
-% \end{macrocode}
-% If there was a space, there might be a prefix. If so call the prefix macro,
-% else call the next step |\ekvc@SetupSplitKeys@d| which will define the key
-% macro and add the key's value to the initials list.
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupSplitKeys@c#1 #2\ekvc@stop
- {%
- \ekv@ifdefined{ekvc@split@p@#1}%
- {\csname ekvc@split@p@#1\endcsname{#2}}%
- {\ekvc@SetupSplitKeys@d{#1 #2}}%
- }
-% \end{macrocode}
-% The inner definition is grouped, because we don't want to actually define
-% the marks we build with |\csname|. We have to append the value to the
-% |\ekvc@initials| list here with the correct split mark. The key macro will
-% read everything up to those split marks and change the value following it to
-% the value given to the key. Additionally we'll need a sorting macro for each
-% key count in use so we set it up with |\ekvc@setup@splitmacro|.
-% \begin{macrocode}
-\protected\def\ekvc@SetupSplitKeys@d
- {%
- \begingroup\expandafter\endgroup
- \expandafter\ekvc@SetupSplitKeys@e
- \csname ekvc@splitmark@\the\ekvc@keycount\endcsname
- }
-\protected\long\def\ekvc@SetupSplitKeys@e#1#2#3%
- {%
- \long\def\ekvc@tmp##1##2#1##3{##2#1{##1}}%
-% \end{macrocode}
-% The short variant needs a bit of special treatment. The key macro will be
-% short to throw the correct error, but since there might be long macros
-% somewhere the reordering of arguments needs to be long, so for short keys we
-% use a two step approach, first grabbing only the short argument, then
-% reordering.
-% \begin{macrocode}
- \unless\ifx\ekvc@long\long
- \expandafter\let\csname ekvc@\ekvc@set(#2)\endcsname\ekvc@tmp
- \edef\ekvc@tmp##1%
- {%
- \ekv@unexpanded\expandafter{\csname ekvc@\ekvc@set(#2)\endcsname}%
- {##1}%
- }%
- \fi
- \ekvlet\ekvc@set{#2}\ekvc@tmp
- \edef\ekvc@initials{\ekv@unexpanded\expandafter{\ekvc@initials#1{#3}}}%
- \ekvc@helpers@needed
- {\expandafter\ekvc@setup@splitmacro\expandafter{\the\ekvc@keycount}}%
- {}%
- }
-% \end{macrocode}
-% If no value was provided this could either be an error, or the unknown key
-% forwarding. We have to check this (comparing against |...| inside
-% |\ekvc@tripledots|) and if this is the unknown key list type, set it up
-% accordingly (advancing the key count and setting up the unknown handlers of
-% \expkv). Else we simply throw an error and ignore the incident.
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupSplitKeys@check@unknown#1%
- {%
- \begingroup
- \edef\ekvc@tmp{\detokenize{#1}}%
- \expandafter
- \endgroup
- \ifx\ekvc@tripledots\ekvc@tmp
- \advance\ekvc@keycount1
-% \end{macrocode}
-% The |\begingroup\expandafter\endgroup| ensures that the split mark isn't
-% actually defined (even if it just were with meaning |\relax|).
-% \begin{macrocode}
- \begingroup\expandafter\endgroup
- \expandafter\ekvc@SetupSplitKeys@unknown
- \csname ekvc@splitmark@\the\ekvc@keycount\endcsname
- \let\ekvc@any@long\long
- \else
- \ekvc@err@value@required{#1}%
- \fi
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupSplitKeys@unknown#1%
- {%
- \long\expandafter\def\csname\ekv@name\ekvc@set{}u\endcsname##1##2##3#1##4%
- {##3#1{##4,##2= {##1} }}%
- \long\expandafter\def\csname\ekv@name\ekvc@set{}uN\endcsname##1##2#1##3%
- {##2#1{##3,##1}}%
- \edef\ekvc@initials{\ekv@unexpanded\expandafter{\ekvc@initials#1{}}}%
- \ekvc@helpers@needed
- {\expandafter\ekvc@setup@splitmacro\expandafter{\the\ekvc@keycount}}%
- {}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@split@p@long}
-% The |long| prefix lets the internals |\ekvc@long| and |\ekvc@any@long| to
-% |\long| so that the key macro will be long.
-% \begin{macrocode}
-\protected\def\ekvc@split@p@long
- {%
- \let\ekvc@long\long
- \let\ekvc@any@long\long
- \ekvc@SetupSplitKeys@d
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@split@p@short}
-% The |short| prefix does essentially nothing, it is only provided to allow
-% key names starting with |long| that aren't |\long|.
-% \begin{macrocode}
-\def\ekvc@split@p@short{\ekvc@SetupSplitKeys@d}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@defarggobbler}
-% This is needed to define a macro with 1-9 parameters programmatically.
-% \LaTeX's \cs[no-index]{newcommand} does something similar for example.
-% \begin{macrocode}
-\protected\def\ekvc@defarggobbler#1{\def\ekvc@tmp##1#1##2##{##1#1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@setup@splitmacro,
-% \ekvc@split@1, \ekvc@split@2, \ekvc@split@3,
-% \ekvc@split@4, \ekvc@split@5, \ekvc@split@6,
-% \ekvc@split@7
-% }
-% Since the first few split macros are different from the others we manually
-% set those up now. All the others will be defined as needed (always
-% globally). The split macros just read up until the correct split mark, move
-% that argument into a list and reinsert the rest, calling the next split
-% macro afterwards.
-% \begin{macrocode}
-\begingroup
-\edef\ekvc@tmp
- {%
- \long\gdef\ekv@unexpanded\expandafter{\csname ekvc@split@1\endcsname}%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}%
- ##1##2##3%
- {##3{##1}##2}%
- \long\gdef\ekv@unexpanded\expandafter{\csname ekvc@split@2\endcsname}%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
- ##3##4%
- {##4{##1}{##2}##3}%
- \long\gdef\ekv@unexpanded\expandafter{\csname ekvc@split@3\endcsname}%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
- ##4##5%
- {##5{##1}{##2}{##3}##4}%
- \long\gdef\ekv@unexpanded\expandafter{\csname ekvc@split@4\endcsname}%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@4\endcsname}##4%
- ##5##6%
- {##6{##1}{##2}{##3}{##4}##5}%
- \long\gdef\ekv@unexpanded\expandafter{\csname ekvc@split@5\endcsname}%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@4\endcsname}##4%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@5\endcsname}##5%
- ##6##7%
- {##7{##1}{##2}{##3}{##4}{##5}##6}%
- \long\gdef\ekv@unexpanded\expandafter{\csname ekvc@split@6\endcsname}%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@4\endcsname}##4%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@5\endcsname}##5%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@6\endcsname}##6%
- ##7##8%
- {##8{##1}{##2}{##3}{##4}{##5}{##6}##7}%
- \long\gdef\ekv@unexpanded\expandafter{\csname ekvc@split@7\endcsname}%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@4\endcsname}##4%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@5\endcsname}##5%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@6\endcsname}##6%
- \ekv@unexpanded\expandafter{\csname ekvc@splitmark@7\endcsname}##7%
- ##8##9%
- {##9{##1}{##2}{##3}{##4}{##5}{##6}{##7}##8}%
- }
-\ekvc@tmp
-\endgroup
-\protected\def\ekvc@setup@splitmacro#1%
- {%
- \ekv@ifdefined{ekvc@split@#1}{}%
- {%
- \begingroup
- \edef\ekvc@tmp
- {%
- \long\gdef
- \ekv@unexpanded\expandafter{\csname ekvc@split@#1\endcsname}%
- ####1%
- \ekv@unexpanded\expandafter
- {\csname ekvc@splitmark@#1\endcsname}%
- ####2####3%
- {%
- \ekv@unexpanded\expandafter
- {\csname ekvc@split@\the\numexpr#1-1\relax\endcsname}%
- ####1{{####2}####3}%
- }%
- }%
- \ekvc@tmp
- \endgroup
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcHashAndUse}
-% |\ekvcHashAndUse| works just like |\ekvcSplitAndUse|.
-% \begin{macrocode}
-\protected\long\def\ekvcHashAndUse#1#2%
- {%
- \let\ekvc@helpers@needed\@firstoftwo
- \ekvc@ifdefined#1%
- {\ekvc@err@already@defined#1}%
- {\ekvcHashAndUse@#1{}{#2}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvcHashAndUse@}
-% This is more or less the same as |\ekvcSplitAndUse@|. Instead of an empty
-% group we place a marker after the initials, we don't use the sorting macros
-% of |split|, but instead pack all the values in one argument.
-% \begin{macrocode}
-\protected\long\def\ekvcHashAndUse@#1#2#3%
- {%
- \edef\ekvc@set{\string#1}%
- \ekvc@SetupHashKeys{#3}%
- \ekvc@helpers@needed
- {%
- \ekvc@any@long\edef#1##1%
- {%
- \expandafter\ekvc@ekvset@pre@expander\expandafter{\ekvc@set}%
- \ekv@unexpanded{\ekvc@hash@pack@argument}%
- \ekv@unexpanded\expandafter{\ekvc@initials\ekvc@stop#2}%
- }%
- }%
- {%
- \ekvc@any@long\edef#1##1%
- {%
- \expandafter\ekvc@ekvset@pre@expander\expandafter{\ekvc@set}%
- \ekv@unexpanded{#2}%
- \ekv@unexpanded\expandafter{\ekvc@initials\ekvc@stop}%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcHashAndForward}
-% |\ekvcHashAndForward| works just like |\ekvcSplitAndForward|.
-% \begin{macrocode}
-\protected\long\def\ekvcHashAndForward#1#2#3%
- {%
- \let\ekvc@helpers@needed\@firstoftwo
- \ekvc@ifdefined#1%
- {\ekvc@err@already@defined#1}%
- {\ekvcHashAndUse@#1{{#2}}{#3}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcHash}
-% |\ekvcHash| does the same as |\ekvcSplit|, but has the advantage of not
-% needing to count arguments, so the definition of the internal macro is a bit
-% more straight forward.
-% \begin{macrocode}
-\protected\long\def\ekvcHash#1#2#3%
- {%
- \let\ekvc@helpers@needed\@secondoftwo
- \ekvc@ifdefined#1%
- {\ekvc@err@already@defined#1}%
- {%
- \expandafter
- \ekvcHashAndUse@\expandafter#1\csname ekvc@\string#1\endcsname{#2}%
- \ekvc@any@long\expandafter\def\csname ekvc@\string#1\endcsname
- ##1\ekvc@stop
- {#3}%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@hash@pack@argument}
-% All this macro does is pack the values into one argument and forward that to
-% the next macro.
-% \begin{macrocode}
-\long\def\ekvc@hash@pack@argument#1\ekvc@stop#2{#2{#1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@SetupHashKeys,\ekvc@SetupHashKeys@a,\ekvc@SetupHashKeys@b,
-% \ekvc@SetupHashKeys@c,\ekvc@SetupHashKeys@d,\ekvc@SetupHashKeys@e,
-% \ekvc@SetupHashKeys@check@unknown,\ekvc@SetupHashKeys@unknown
-% }
-% This should look awfully familiar as well, since it's just the same as for
-% the split keys with a few other names here and there.
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupHashKeys#1%
- {%
- \let\ekvc@any@long\ekv@empty
- \let\ekvc@initials\ekv@empty
- \ekvparse\ekvc@SetupHashKeys@check@unknown\ekvc@SetupHashKeys@a{#1}%
- }
-\protected\long\def\ekvc@SetupHashKeys@a#1%
- {\expandafter\ekvc@SetupHashKeys@b\detokenize{#1}\ekvc@stop}
-\protected\def\ekvc@SetupHashKeys@b#1\ekvc@stop
- {%
- \let\ekvc@long\ekv@empty
- \ekvc@ifspace{#1}%
- {\ekvc@SetupHashKeys@c#1\ekvc@stop}%
- {\ekvc@SetupHashKeys@d{#1}}%
- }
-\protected\def\ekvc@SetupHashKeys@c#1 #2\ekvc@stop
- {%
- \ekv@ifdefined{ekvc@hash@p@#1}%
- {\csname ekvc@hash@p@#1\endcsname{#2}}%
- {\ekvc@SetupHashKeys@d{#1 #2}}%
- }
-% \end{macrocode}
-% Again we build the marker, this time instead of a numbered one a named
-% hashmark, inside a group to not actually define the macro used as a marker.
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupHashKeys@d#1%
- {%
- \begingroup\expandafter\endgroup
- \expandafter\ekvc@SetupHashKeys@e\csname ekvc@hashmark@#1\endcsname{#1}%
- }
-% \end{macrocode}
-% Yes, even the defining macro looks awfully familiar. Instead of numbered we
-% have named marks. Still the key macros grab everything up to their
-% respective mark and reorder the arguments. The same quirk is applied for
-% short keys. And instead of the |\ekvc@setup@splitmacro| we use
-% |\ekvc@setup@hashmacro|.
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupHashKeys@e#1#2#3%
- {%
- \long\def\ekvc@tmp##1##2#1##3{##2#1{##1}}%
- \unless\ifx\ekvc@long\long
- \expandafter\let\csname ekvc@\ekvc@set(#2)\endcsname\ekvc@tmp
- \edef\ekvc@tmp##1%
- {%
- \ekv@unexpanded\expandafter{\csname ekvc@\ekvc@set(#2)\endcsname}%
- {##1}%
- }%
- \fi
- \ekvlet\ekvc@set{#2}\ekvc@tmp
- \edef\ekvc@initials{\ekv@unexpanded\expandafter{\ekvc@initials#1{#3}}}%
- \ekvc@setup@hashmacro{#2}%
- }
-% \end{macrocode}
-% \begin{macrocode}
-\protected\long\def\ekvc@SetupHashKeys@check@unknown#1%
- {%
- \begingroup
- \edef\ekvc@tmp{\detokenize{#1}}%
- \expandafter
- \endgroup
- \ifx\ekvc@tripledots\ekvc@tmp
- \ekvc@SetupHashKeys@unknown
- \let\ekvc@any@long\long
- \else
- \ekvc@err@value@required{#1}%
- \fi
- }
-% \end{macrocode}
-% \begin{macrocode}
-\def\ekvc@SetupHashKeys@unknown#1%
- {%
- \protected\def\ekvc@SetupHashKeys@unknown
- {%
- \expandafter
- \let\csname\ekv@name\ekvc@set{}u\endcsname\ekvc@hash@unknown@kv
- \expandafter
- \let\csname\ekv@name\ekvc@set{}uN\endcsname\ekvc@hash@unknown@k
- \edef\ekvc@initials{\ekv@unexpanded\expandafter{\ekvc@initials#1{}}}%
- \ekvc@setup@hashmacro{...}%
- }%
- \long\def\ekvc@hash@unknown@kv##1##2##3#1##4{##3#1{##4,##2= {##1} }}%
- \long\def\ekvc@hash@unknown@k##1##2#1##3{##2#1{##3,##1}}%
- }
-\expandafter\ekvc@SetupHashKeys@unknown
- \csname ekvc@hashmark@\ekvc@tripledots\endcsname
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@hash@p@long}
-% Nothing astonishing here either.
-% \begin{macrocode}
-\protected\def\ekvc@hash@p@long
- {%
- \let\ekvc@long\long
- \let\ekvc@any@long\long
- \ekvc@SetupHashKeys@d
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@hash@p@short}
-% The |short| prefix does essentially nothing, it is only provided to allow
-% key names starting with |long| that aren't |\long|.
-% \begin{macrocode}
-\def\ekvc@hash@p@short{\ekvc@SetupHashKeys@d}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@setup@hashmacro}
-% The safe hash macros will be executed inside of an |\unexpanded| expansion
-% context, so they have to insert braces for that once they are done.
-% Most of the tests which have to be executed will already be done, but we
-% have to play safe if the hash doesn't show up in the hash list. Therefore we
-% use some |\ekvc@mark|s and |\ekvc@stop| to throw errors if the hash isn't
-% found in the right place. The fast variants have an easier life and just
-% return the correct value.
-% \begin{macrocode}
-\protected\def\ekvc@setup@hashmacro#1%
- {%
- \ekv@ifdefined{ekvc@fasthash@#1}{}%
- {%
- \begingroup
- \edef\ekvc@tmp
- {%
- \long\gdef
- \ekv@unexpanded\expandafter{\csname ekvc@fasthash@#1\endcsname}%
- ####1%
- \ekv@unexpanded\expandafter
- {\csname ekvc@hashmark@#1\endcsname}%
- ####2####3\ekv@unexpanded{\ekvc@stop}%
- {####2}%
- \long\gdef
- \ekv@unexpanded\expandafter{\csname ekvc@safehash@#1\endcsname}%
- ####1%
- {%
- \ekv@unexpanded\expandafter
- {\csname ekvc@@safehash@#1\endcsname}%
- ####1\ekv@unexpanded{\ekvc@mark}{}%
- \ekv@unexpanded\expandafter
- {%
- \csname ekvc@hashmark@#1\endcsname{}%
- \ekvc@mark{\ekvc@err@missing@hash{#1}}\ekvc@stop
- }%
- }%
- \long\gdef
- \ekv@unexpanded\expandafter
- {\csname ekvc@@safehash@#1\endcsname}%
- ####1%
- \ekv@unexpanded\expandafter
- {\csname ekvc@hashmark@#1\endcsname}%
- ####2####3\ekv@unexpanded{\ekvc@mark}####4####5%
- \ekv@unexpanded{\ekvc@stop}%
- {%
- ####4{####2}%
- }%
- \long\gdef\ekv@unexpanded\expandafter
- {\csname ekvc@fastsplithash@#1\endcsname}%
- ####1%
- \ekv@unexpanded\expandafter
- {\csname ekvc@hashmark@#1\endcsname}%
- ####2####3\ekv@unexpanded{\ekvc@stop}####4%
- {%
- ####4{####2}%
- }%
- \long\gdef\ekv@unexpanded\expandafter
- {\csname ekvc@safesplithash@#1\endcsname}####1%
- {%
- \ekv@unexpanded\expandafter
- {\csname ekvc@@safesplithash@#1\endcsname}%
- ####1\ekv@unexpanded{\ekvc@mark\ekvc@safe@after@hash}%
- \ekv@unexpanded\expandafter
- {%
- \csname ekvc@hashmark@#1\endcsname{}%
- \ekvc@mark
- {\ekvc@err@missing@hash{#1}\ekvc@safe@after@hash}%
- \ekvc@stop
- }%
- }%
- \long\gdef\ekv@unexpanded\expandafter
- {\csname ekvc@@safesplithash@#1\endcsname}%
- ####1%
- \ekv@unexpanded\expandafter
- {\csname ekvc@hashmark@#1\endcsname}%
- ####2####3\ekv@unexpanded{\ekvc@mark}####4####5%
- \ekv@unexpanded{\ekvc@stop}%
- {%
- ####4{####2}%
- }%
- }%
- \ekvc@tmp
- \endgroup
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcValue}
-% \begin{macro}[internal]{\ekvcValue@}
-% All this does is a few consistency checks on the first argument (not empty,
-% hash macro exists) and then call that hash-grabbing macro that will also
-% test whether the hash is inside of |#2| or not.
-% \begin{macrocode}
-\long\def\ekvcValue#1%
- {%
- \ekv@unexpanded
- \expandafter\ekvcValue@\detokenize{#1}\ekvc@stop
- }
-\def\ekvcValue@#1\ekvc@stop
- {%
- \ekv@ifdefined{ekvc@safehash@#1}%
- {\csname ekvc@safehash@#1\endcsname}%
- {\ekvc@err@unknown@hash{#1}\@firstoftwo{{}}}%
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\ekvcValueFast}
-% To be as fast as possible, this doesn't test for anything, assuming the user
-% knows best.
-% \begin{macrocode}
-\long\def\ekvcValueFast#1#2%
- {\csname ekvc@fasthash@\detokenize{#1}\endcsname#2\ekvc@stop}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcValueSplit}
-% \begin{macro}[internal]{\ekvcValueSplit@,\ekvcValueSplit@recover}
-% This splits off a single value.
-% \begin{macrocode}
-\long\def\ekvcValueSplit#1%
- {\expandafter\ekvcValueSplit@\detokenize{#1}\ekvc@stop}
-\def\ekvcValueSplit@#1\ekvc@stop
- {%
- \ekv@ifdefined{ekvc@safesplithash@#1}%
- {\csname ekvc@safesplithash@#1\endcsname}%
- {\ekvc@err@unknown@hash{#1}\ekvcValueSplit@recover}%
- }
-\long\def\ekvcValueSplit@recover#1#2{#2{}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@safe@after@hash}
-% \begin{macrocode}
-\long\def\ekvc@safe@after@hash#1#2%
- {%
- #2{#1}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcValueSplitFast}
-% Again a fast approach which doesn't provide too many safety measurements.
-% This needs to build the hash function and expand it before passing the
-% results to the next control sequence. The first step only builds the control
-% sequence.
-% \begin{macrocode}
-\long\def\ekvcValueSplitFast#1#2%
- {\csname ekvc@fastsplithash@\detokenize{#1}\endcsname#2\ekvc@stop}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@safehash@,\ekvc@fasthash@,
-% \ekvc@safesplithash@,\ekvc@fastsplithash@
-% }
-% At least in the empty hash case we can provide a meaningful error message
-% without affecting performance by just defining the macro that would be build
-% in that case. There is of course a downside to this, the error will not be
-% thrown by |\ekvcValueFast| in three expansion steps. The safe hash variant
-% has to also stop the |\unexpanded| expansion.
-% \begin{macrocode}
-\long\def\ekvc@safehash@#1{\ekvc@err@empty@hash{}}
-\long\def\ekvc@fasthash@#1\ekvc@stop{\ekvc@err@empty@hash}
-\long\def\ekvc@safesplithash@#1#2{\ekvc@err@empty@hash#2{}}
-\long\def\ekvc@fastsplithash@#1\ekvc@stop#2{\ekvc@err@empty@hash#2{}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcSecondaryKeys}
-% \begin{macro}[internal]
-% {\ekvcSecondaryKeys@a,\ekvcSecondaryKeys@b,\ekvcSecondaryKeys@c}
-% The secondary keys are defined pretty similar to the way the originals are,
-% but here we also introduce some key types (those have a |@t@| in their name)
-% additionally to the prefixes.
-% \begin{macrocode}
-\protected\long\def\ekvcSecondaryKeys#1#2%
- {%
- \edef\ekvc@set{\string#1}%
- \ekvparse\ekvc@err@value@required\ekvcSecondaryKeys@a{#2}%
- }
-\protected\long\def\ekvcSecondaryKeys@a#1%
- {\expandafter\ekvcSecondaryKeys@b\detokenize{#1}\ekvc@stop}
-\protected\def\ekvcSecondaryKeys@b#1\ekvc@stop
- {%
- \let\ekvc@long\ekv@empty
- \ekvc@ifspace{#1}%
- {\ekvcSecondaryKeys@c#1\ekvc@stop}%
- {\ekvc@err@missing@type{#1}\@gobble}%
- }
-\protected\def\ekvcSecondaryKeys@c#1 #2\ekvc@stop
- {%
- \ekv@ifdefined{ekvc@p@#1}%
- {\csname ekvc@p@#1\endcsname}%
- {%
- \ekv@ifdefined{ekvc@t@#1}%
- {\csname ekvc@t@#1\endcsname}%
- {\ekvc@err@unknown@keytype{#1}\@firstoftwo\@gobble}%
- }%
- {#2}%
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\ekvcChange}
-% This can be used to change the defaults of an \expkvc\ defined macro. It
-% checks whether there is a set with the correct name and that the macro is
-% defined. If both is true the real work is done by |\ekvc@change|.
-% \begin{macrocode}
-\protected\long\def\ekvcChange#1%
- {%
- \ekvifdefinedset{\string#1}%
- {%
- \ekvc@ifdefined#1%
- {\ekvc@change#1}%
- {\ekvc@err@no@key@macro#1\@gobble}%
- }%
- {\ekvc@err@no@key@macro#1\@gobble}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@change ,\ekvc@change@a,\ekvc@change@b,
-% \ekvc@change@c,\ekvc@change@d,\ekvc@change@e
-% }
-% First we need to see whether the macro is currently |\long|. For this we get
-% the meaning and will parse it. |#1| is the macro name in which we want to
-% change the defaults.
-% \begin{macrocode}
-\protected\def\ekvc@change#1%
- {\expandafter\ekvc@change@a\meaning#1\ekv@stop#1}
-% \end{macrocode}
-% A temporary definition to get the stringified |macro:|. |##1| will be the
-% list of prefixes, we don't care for the exact contents of |##2| and |##3|.
-% \begin{macrocode}
-\def\ekvc@change@a#1%
- {%
- \protected\def\ekvc@change@a##1#1##2->##3\ekv@stop
- {%
- \ekvc@change@iflong{##1}%
- {\ekvc@change@b{}}%
- {\ekvc@change@b{\long}}%
- }%
- }
-\expandafter\ekvc@change@a\expandafter{\detokenize{macro:}}
-% \end{macrocode}
-% Next we expand the macro once to get its contents (including the current
-% default values with their markers) and place |\ekvc@stop| instead of an
-% argument as a marker for the last step. |#1| is either |\long| or empty,
-% |#2| is the macro.
-% \begin{macrocode}
-\protected\def\ekvc@change@b#1#2%
- {\expandafter\ekvc@change@c\expandafter{#2\ekvc@stop}{#1}#2}
-% \end{macrocode}
-% Here we place an unbalanced closing brace after the expansion of the macro.
-% Then we just parse the \kv-list with |\ekvset|, that will exchange the
-% values behind the markers. Once those are changed we give control to
-% |\ekvc@change@d|. The |\ekvset| step might horribly fail if the user defined
-% some keys that don't behave nice. |#1| is the expansion of the macro, |#2|
-% is either |\long| or empty, |#3| is the macro, and |#4| is the \kv-list
-% containing the new defaults.
-% \begin{macrocode}
-\ekv@exparg{\protected\long\def\ekvc@change@c#1#2#3#4}%
- {%
- \expandafter\iffalse\expandafter{\expandafter{\expandafter\fi
- \ekvset{\string#3}{#4}%
- \ekvc@change@d{#2}{#3}%
- #1%
- }}%
- }
-% \end{macrocode}
-% The final step needs to put an unbalanced opening brace after |\edef|. Also
-% we have to protect everything from further expanding with the exception of
-% the redefined macro's argument, which is why we placed the |\ekvc@stop|
-% earlier. Then we need to also protect the rest of the contents from further
-% expanding using |\unexpanded| with another unbalanced opening brace.
-% |#1| will be either empty or |\long| and |#2| is the macro.
-% \begin{macrocode}
-\protected\def\ekvc@change@d#1#2%
- {#1\edef#2##1{\expandafter\ekvc@change@e\iffalse}\fi}
-\long\def\ekvc@change@e#1\ekvc@stop
- {\ekv@unexpanded{#1}##1\ekv@unexpanded\expandafter{\iffalse}\fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@change@iflong,\ekvc@change@iflong@}
-% Checking whether a string contains the string representation of |\long| can
-% be done by gobbling everything up to the first |\long| and checking whether
-% the result is completely empty. We need a temporary macro to get the result
-% of |\string\long| inside the definitions.
-% \begin{macrocode}
-\def\ekvc@change@iflong#1%
- {%
- \protected\def\ekvc@change@iflong##1%
- {\expandafter\ekv@ifempty\expandafter{\ekvc@change@iflong@##1#1}}%
- \def\ekvc@change@iflong@##1#1{}
- }
-\expandafter\ekvc@change@iflong\expandafter{\string\long}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcPass}
-% This macro can be used to pass a value to a key of some macro (this way
-% more complicated key codes are possible that in the end pass processed
-% values on to some macro). The implemantation is pretty straight forward.
-% \begin{macrocode}
-\long\def\ekvcPass#1#2%
- {%
- \ekvifdefined{\string#1}{#2}%
- {\csname\ekv@name{\string#1}{#2}\endcsname}%
- {\ekvc@err@unknown@key@or@macro{#1}{#2}\@gobble}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Secondary Key Types}
-%
-% \begin{macro}[internal]{\ekvc@p@long,\ekvc@after@ptype}
-% The prefixes are pretty straight forward again. Just set |\ekvc@long| and
-% forward to the |@t@| type.
-% \begin{macrocode}
-\protected\def\ekvc@p@long#1%
- {%
- \ekvc@ifspace{#1}%
- {%
- \let\ekvc@long\long
- \ekvc@after@ptype#1\ekvc@stop
- }%
- {\ekvc@err@missing@type{long #1}\@gobble}%
- }
-\protected\def\ekvc@after@ptype#1 #2\ekvc@stop
- {%
- \ekv@ifdefined{ekvc@t@#1}%
- {\csname ekvc@t@#1\endcsname{#2}}%
- {\ekvc@err@unknown@keytype{#1}\@gobble}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@t@meta, \ekvc@t@nmeta,
-% \ekvc@type@meta, \ekvc@type@meta@a, \ekvc@type@meta@b
-% }
-% The |meta| and |nmeta| key types use a nested |\ekvset| to set other keys in
-% the same macro's \set.
-% \begin{macrocode}
-\protected\def\ekvc@t@meta
- {%
- \edef\ekvc@tmp{\ekvc@set}%
- \expandafter\ekvc@type@meta\expandafter{\ekvc@tmp}\ekvc@long{##1}\ekvlet
- }
-\protected\def\ekvc@t@nmeta#1%
- {%
- \ekvc@assert@not@long{nmeta #1}%
- \edef\ekvc@tmp{\ekvc@set}%
- \expandafter\ekvc@type@meta\expandafter{\ekvc@tmp}{}{}\ekvletNoVal{#1}%
- }
-\protected\long\def\ekvc@type@meta#1#2#3#4#5#6%
- {%
- \expandafter\ekvc@type@meta@a\expandafter{\ekvset{#1}{#6}}{#2}{#3}%
- #4\ekvc@set{#5}\ekvc@tmp
- }
-\protected\def\ekvc@type@meta@a
- {%
- \expandafter\ekvc@type@meta@b\expandafter
- }
-\protected\long\def\ekvc@type@meta@b#1#2#3%
- {%
- #2\def\ekvc@tmp#3{#1}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@t@alias}
-% |alias| just checks whether there is a key and/or |NoVal| key defined with
-% the target name and |\let| the key to those.
-% \begin{macrocode}
-\protected\def\ekvc@t@alias#1#2%
- {%
- \ekvc@assert@not@long{alias #1}%
- \let\ekvc@tmp\@firstofone
- \ekvifdefined\ekvc@set{#2}%
- {%
- \ekvletkv\ekvc@set{#1}\ekvc@set{#2}%
- \let\ekvc@tmp\@gobble
- }%
- {}%
- \ekvifdefinedNoVal\ekvc@set{#2}%
- {%
- \ekvletkvNoVal\ekvc@set{#1}\ekvc@set{#2}%
- \let\ekvc@tmp\@gobble
- }%
- {}%
- \ekvc@tmp{\ekvc@err@unknown@key{#2}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@t@default}
-% The |default| key can be used to set a |NoVal| key for an existing key. It
-% will just pass the \val\ to the key macro of that other key.
-% \begin{macrocode}
-\protected\long\def\ekvc@t@default#1#2%
- {%
- \ekvifdefined\ekvc@set{#1}%
- {%
- \ekvc@assert@not@long{default #1}%
- \edef\ekvc@tmp
- {%
- \ekv@unexpanded\expandafter
- {\csname\ekv@name\ekvc@set{#1}\endcsname{#2}}%
- }%
- \ekvletNoVal\ekvc@set{#1}\ekvc@tmp
- }%
- {\ekvc@err@unknown@key{#1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@t@enum}
-% \begin{macro}[internal]
-% {\ekvc@type@enum,\ekvc@h@enum,\ekvc@h@enum@,\ekvc@enum@name}
-% Enums don't need to apply special trickery to make the parts of the names
-% retrievable, so unlike in \expkvd\ we don't need catcode juggling.
-% The setup of an |enum| requires unpacking the value in two different
-% arguments so we need an auxiliary here.
-% \begin{macrocode}
-\def\ekvc@enum@name#1#2#3{ekvc#1(#2)#3}
-\protected\long\def\ekvc@t@enum#1#2%
- {\ekvc@assert@twoargs{#2}{enum #1}{\ekvc@type@enum{#1}#2}}
-\protected\long\def\ekvc@type@enum#1#2%
- {%
- \ekvifdefined\ekvc@set{#2}%
- {%
-% \end{macrocode}
-% At run time we need another helper and we need to expand the current
-% |\ekvc@set| now. The helper will build a control sequence from each given
-% value, those will be set up in the |\ekvcsvloop|.
-% \begin{macrocode}
- \ekvc@long\edef\ekvc@tmp##1%
- {%
- \ekv@unexpanded{\expandafter\ekvc@h@enum\detokenize}{##1}%
- \ekv@unexpanded{\ekvc@stop}%
- {\ekvc@set}{#1}%
- }%
- \ekvlet\ekvc@set{#1}\ekvc@tmp
- \def\ekvc@tmp{0}%
- \expandafter\ekvcsvloop\expandafter
- {%
- \expandafter\ekvc@type@enum@
- \csname\ekv@name\ekvc@set{#2}\endcsname
- {#1}%
- }%
- }%
- {%
- \ekvc@err@unknown@key{#2}%
- \@gobble
- }%
- }
-% \end{macrocode}
-% Here |#1| will be the key-macro of the underlying primary or secondary key,
-% |#2| is the |enum| key's name, and |#3| will be the choice. The rest is
-% pretty obvious.
-% \begin{macrocode}
-\ekv@exparg{\protected\long\def\ekvc@type@enum@#1#2#3}%
- {%
- \expandafter\expandafter\expandafter\edef\expandafter
- \csname\ekvc@enum@name\ekvc@set{#2}{\detokenize{#3}}\endcsname
- {\ekv@unexpanded{#1}{\ekvc@tmp}}%
- \edef\ekvc@tmp{\the\numexpr\ekvc@tmp+1\relax}%
- }
-% \end{macrocode}
-% The use-time helper will check if the macro for the passed in choice exists,
-% if it doesn't throws an error, else calls that macro which will set the
-% correct value.
-% \begin{macrocode}
-\ekv@if@lastnamedcs
- {%
- \ekv@exparg{\def\ekvc@h@enum#1\ekvc@stop#2#3}%
- {%
- \expandafter\ifcsname\ekvc@enum@name{#2}{#3}{#1}\endcsname
- \expandafter\ekvc@h@enum@\lastnamedcs
- \fi
- \ekvc@err@unknown@enum{#2}{#3}{#1}%
- }
- \def\ekvc@h@enum@#1\fi\ekvc@err@unknown@enum#2#3#4%
- {%
- \fi
- \ifx#1\relax
- \ekvc@err@unknown@enum{#2}{#3}{#4}%
- \expandafter\@gobble
- \fi
- #1%
- }
- }
- {%
- \def\ekvc@h@enum#1%
- {%
- \def\ekvc@h@enum##1\ekvc@stop##2##3%
- {%
- \expandafter\ekvc@h@enum@
- \csname\ifcsname#1\endcsname#1\else relax\fi\endcsname
- {##2}{##3}{##1}%
- }%
- }
- \expandafter\ekvc@h@enum\expandafter{\ekvc@enum@name{#2}{#3}{#1}}
- \def\ekvc@h@enum@#1#2#3#4%
- {%
- \ifx#1\relax
- \ekvc@err@unknown@enum{#2}{#3}{#4}%
- \expandafter\@gobble
- \fi
- #1%
- }
- }
-% \end{macrocode}
-% We don't need |\ekvc@enum@name| anymore, so let's undefine it.
-% \begin{macrocode}
-\let\ekvc@enum@name\ekvc@undefined
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@t@aggregate}
-% Aggregating isn't easy to define. We'll have to extract the correct mark for
-% the specified key, branch correctly for short and long keys, and use a small
-% hack to have the correct arguments on the user interface (|#1| as the
-% current contents, |#2| as the new value). This is split into a few steps
-% here.
-%
-% First, assert that the user input is well-behaved.
-% \begin{macrocode}
-\protected\def\ekvc@t@aggregate#1%
- {%
- \ekvc@assert@not@long{aggregate #1}%
- \ekvc@type@aggregate
- \ekvc@type@aggregate@long\ekvc@type@aggregate@short
- {process}%
- {#1}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvc@type@aggregate,\ekvc@type@aggregate@a,\ekvc@type@aggregate@b}
-% The next step stores the user defined processing in a temporary macro that's
-% used to do the parameter number swapping later. It also builds the names of
-% the key macro and the helper which would be used for processing a short key.
-% \begin{macrocode}
-\protected\long\def\ekvc@type@aggregate#1#2#3#4#5%
- {%
- \ekvc@assert@twoargs{#5}{#3 #4}{\ekvc@type@aggregate@a#1#2{#4}#5}%
- }
-\protected\long\def\ekvc@type@aggregate@a#1#2#3#4#5%
- {%
- \ekvifdefined\ekvc@set{#4}%
- {%
- \def\ekvc@type@aggregate@tmp##1##2{#5}%
- \begingroup\expandafter\endgroup
- \expandafter\ekvc@type@aggregate@b
- \csname\ekv@name\ekvc@set{#4}\expandafter\endcsname
- \csname ekvc@\ekvc@set(#4)\endcsname
- #1#2%
- {#3}%
- }%
- {\ekvc@err@unknown@key{#4}}%
- }
-\protected\long\def\ekvc@type@aggregate@b#1#2#3#4%
- {%
- \ekvc@type@aggregate@check@long#1#2%
- {#3#1}%
- {#4#2}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@type@aggregate@check@long,
-% \ekvc@type@aggregate@check@long@a,\ekvc@type@aggregate@check@long@b
-% }
-% To check whether the primary key is long we see whether its |\meaning|
-% contains the helper which would only be there for short keys. For this we
-% have to get the stringified name of the internal (using |\detokenize|),
-% and afterwards get the |\meaning| of the macro. A temporary helper does the
-% real test by gobbling and forwarding the result to |\ekv@ifempty|.
-% \begin{macrocode}
-\protected\long\def\ekvc@type@aggregate@check@long#1#2%
- {\expandafter\ekvc@type@aggregate@check@long@a\detokenize{#2}\ekv@stop#1}
-\protected\long\def\ekvc@type@aggregate@check@long@a#1\ekv@stop#2%
- {%
- \def\ekvc@type@aggregate@check@long@@##1#1{}%
- \expandafter\ekvc@type@aggregate@check@long@b\meaning#2\ekv@stop{#1}%
- }
-\protected\def\ekvc@type@aggregate@check@long@b#1\ekv@stop#2%
- {\expandafter\ekv@ifempty\expandafter{\ekvc@type@aggregate@check@long@@#1#2}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@type@aggregate@long,\ekvc@type@aggregate@long@}
-% The long variant just builds the split mark we extract, uses the hack to
-% swap argument order, and then does the definition via |\ekvlet| and a
-% temporary macro.
-% \begin{macrocode}
-\protected\long\def\ekvc@type@aggregate@long#1%
- {%
- \begingroup\expandafter\endgroup\expandafter
- \ekvc@type@aggregate@long@
- \csname\ekvc@extract@mark#1\expandafter\endcsname
- \expandafter{\ekvc@type@aggregate@tmp{##3}{##1}}%
- }
-\protected\long\def\ekvc@type@aggregate@long@#1#2#3%
- {%
- \long\def\ekvc@type@aggregate@tmp##1##2#1##3{##2#1{#2}}
- \ekvlet\ekvc@set{#3}\ekvc@type@aggregate@tmp
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvc@type@aggregate@short,\ekvc@type@aggregate@short@}
-% The short variant will have to build the marker and the name of the helper
-% function, and swap the user argument order. Hence here are a few more
-% |\expandafter|s involved. But afterwards we can do the definition of the key
-% and the helper macro directly.
-% \begin{macrocode}
-\protected\long\def\ekvc@type@aggregate@short#1#2%
- {%
- \begingroup\expandafter\endgroup\expandafter
- \ekvc@type@aggregate@short@
- \csname\ekvc@extract@mark#1\expandafter\endcsname
- \csname ekvc@\ekvc@set(#2)\expandafter\endcsname
- \expandafter{\ekvc@type@aggregate@tmp{##3}{##1}}%
- {#2}%
- }
-\protected\long\def\ekvc@type@aggregate@short@#1#2#3#4%
- {%
- \ekvdef\ekvc@set{#4}{#2{##1}}%
- \long\def#2##1##2#1##3{##2#1{#3}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@t@process}
-% The |process| type can reuse much of |aggregate|, just the last step of
-% definition differ.
-% \begin{macrocode}
-\protected\def\ekvc@t@process
- {%
- \ifx\ekvc@long\long
- \ekv@fi@firstoftwo
- \fi
- \@secondoftwo
- {%
- \ekvc@type@aggregate
- \ekvc@type@process@long\ekvc@type@process@long
- }%
- {%
- \ekvc@type@aggregate
- \ekvc@type@process@short\ekvc@type@process@short
- }%
- {process}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@type@process@long,\ekvc@type@process@long@}
-% This defines a temporary macro to grab the current value (found after the
-% marker |#1|), executes the user code and puts everything back to where it
-% belongs. Then |\ekvlet| is used to assign that meaning to the key macro.
-% \begin{macrocode}
-\protected\long\def\ekvc@type@process@long#1%
- {%
- \begingroup\expandafter\endgroup\expandafter
- \ekvc@type@process@long@
- \csname\ekvc@extract@mark#1\expandafter\endcsname
- \expandafter{\ekvc@type@aggregate@tmp{##3}{##1}}%
- }
-\protected\long\def\ekvc@type@process@long@#1#2#3%
- {%
- \long\def\ekvc@type@aggregate@tmp##1##2#1##3{#2##2#1{##3}}%
- \ekvlet\ekvc@set{#3}\ekvc@type@aggregate@tmp
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@type@process@short,\ekvc@type@process@short@}
-% We define the key macro directly to just grab the argument once and forward
-% it to the auxiliary. That one does essentially the same as the long variant.
-% \begin{macrocode}
-\protected\long\def\ekvc@type@process@short#1#2%
- {%
- \begingroup\expandafter\endgroup\expandafter
- \ekvc@type@process@short@
- \csname\ekvc@extract@mark#1\expandafter\endcsname
- \csname ekvc@\ekvc@set(#2)\expandafter\endcsname
- \expandafter{\ekvc@type@aggregate@tmp{##3}{##1}}%
- {#2}%
- }
-\protected\long\def\ekvc@type@process@short@#1#2#3#4%
- {%
- \ekvdef\ekvc@set{#4}{#2{##1}}%
- \long\def#2##1##2#1##3{#3##2#1{##3}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@t@flag-bool}
-% \begin{macrocode}
-\protected\expandafter\def\csname ekvc@t@flag-bool\endcsname#1#2%
- {%
- \ekvc@assert@not@long{flag-bool #1}%
- \unless\ifdefined#2\ekvcFlagNew#2\fi
- \ekvdef\ekvc@set{#1}%
- {%
- \ekv@ifdefined{ekvc@flag@set@##1}%
- {%
- \csname ekvc@flag@set@##1\expandafter\endcsname
- \ekvcFlagHeight#2\ekv@stop#2%
- }%
- {\ekvc@err@invalid@bool{##1}}%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvc@t@flag-true,\ekvc@t@flag-false,\ekvc@t@flag-raise,\ekvc@type@flag}
-% \begin{macrocode}
-\protected\def\ekvc@type@flag#1#2#3#4%
- {%
- \ekvc@assert@not@long{flag-#1 #3}%
- \unless\ifdefined#4\ekvcFlagNew#4\fi
- \ekv@exparg{\ekvdefNoVal\ekvc@set{#3}}{#2#4}%
- }
-\protected\expandafter\def\csname ekvc@t@flag-true\endcsname
- {\ekvc@type@flag{true}\ekvcFlagSetTrue}
-\protected\expandafter\def\csname ekvc@t@flag-false\endcsname
- {\ekvc@type@flag{false}\ekvcFlagSetFalse}
-\protected\expandafter\def\csname ekvc@t@flag-raise\endcsname
- {\ekvc@type@flag{raise}\ekvcFlagRaise}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Flags}
-%
-% The basic idea of flags is to store information by the fact that \TeX\
-% expandably assigns the meaning |\relax| to undefined control sequences which
-% were built with |\csname|. This mechanism is borrowed from \pkg{expl3}.
-%
-% \begin{macro}[internal]{\ekvc@flag@name,\ekvc@flag@namescheme}
-% Flags follow a simple naming scheme which we define here. |\ekvc@flag@name|
-% will store the name of an internal function that is used to build names of
-% the second naming scheme defined by |\ekvc@flag@namescheme|.
-% \begin{macrocode}
-\def\ekvc@flag@name{ekvcf\string}
-\def\ekvc@flag@namescheme#1#2{ekvch#2#1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagHeight}
-% For semantic reasons we use |\number| with another name.
-% \begin{macrocode}
-\let\ekvcFlagHeight\number
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagNew}
-% This macro defines a new flag. It stores the function build with the
-% |\ekvc@flag@name| naming scheme after the internal function
-% |\ekvc@flag@height| that'll determine the current flag height. It'll also
-% define the macro named via |\ekvc@flag@name| to build names according to
-% |\ekvc@flag@namescheme|.
-% \begin{macrocode}
-\protected\def\ekvcFlagNew#1%
- {%
- \edef#1%
- {%
- \ekv@unexpanded{\ekvc@flag@height}%
- \ekv@unexpanded\expandafter{\csname\ekvc@flag@name#1\endcsname}%
- }%
- \ekv@expargtwice
- {\expandafter\def\csname\ekvc@flag@name#1\endcsname##1}%
- {\expandafter\ekvc@flag@namescheme\expandafter{\string#1}{##1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@flag@height,\ekvc@flag@height@}
-% This macro gets the height of a flag by a simple loop. The first loop
-% iteration differs a bit from the following in that it doesn't have to get
-% the current iteration count. The space at the end of |\ekvc@flag@height|
-% ends the |\number| evaluation.
-% \begin{macrocode}
-\def\ekvc@flag@height#1%
- {%
- \ifcsname#10\endcsname
- \ekvc@flag@height@1\ekv@stop#1%
- \fi
- \@firstofone{0} % leave this space
- }
-\def\ekvc@flag@height@#1\ekv@stop#2\fi\@firstofone#3%
- {%
- \fi
- \ifcsname#2{#1}\endcsname
- \expandafter\ekvc@flag@height@\the\numexpr#1+1\relax\ekv@stop#2%
- \fi
- \@firstofone{#1}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagRaise}
-% Raising a flag simply means letting the |\ekvc@flag@namescheme| macro for
-% the current height to relax. The result of raising a flag is that its height
-% is bigger by $1$.
-% \begin{macrocode}
-\ekv@exparg{\def\ekvcFlagRaise#1}%
- {%
- \expandafter\expandafter\expandafter\@gobble\expandafter
- \csname\ekvc@flag@namescheme{\string#1}{\ekvcFlagHeight#1}\endcsname
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagSetTrue,\ekvcFlagSetFalse}
-% \begin{macro}[internal]{\ekvc@flag@set@true,\ekvc@flag@set@false}
-% A flag is considered true if its current height is odd, and as false if it
-% is even. Therefore |\ekvcFlagSetTrue| and |\ekvcFlagSetFalse| only need to
-% raise the flag if the opposing boolean value is the current one.
-% \begin{macrocode}
-\def\ekvcFlagSetTrue#1%
- {\expandafter\ekvc@flag@set@true\ekvcFlagHeight#1\ekv@stop#1}
-\def\ekvcFlagSetFalse#1%
- {\expandafter\ekvc@flag@set@false\ekvcFlagHeight#1\ekv@stop#1}
-% \end{macrocode}
-% We can expand |\ekvc@flag@namescheme| at definition time here, which is why
-% we're using a temporary definition to set up |\ekvc@flag@set@true| and
-% |\ekvc@flag@set@false|.
-% \begin{macrocode}
-\def\ekvc@flag@set@true#1%
- {%
- \def\ekvc@flag@set@true##1\ekv@stop##2%
- {%
- \ifodd##1
- \ekv@fi@gobble
- \fi
- \@firstofone{\expandafter\@gobble\csname#1\endcsname}%
- }%
- \def\ekvc@flag@set@false##1\ekv@stop##2%
- {%
- \ifodd##1
- \ekv@fi@firstofone
- \fi
- \@gobble{\expandafter\@gobble\csname#1\endcsname}%
- }%
- }
-\expandafter\ekvc@flag@set@true\expandafter
- {\ekvc@flag@namescheme{\string#2}{#1}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagIf}
-% As already explained, truthiness is defined as a flag's height being odd, so
-% we just branch accordingly here.
-% \begin{macrocode}
-\def\ekvcFlagIf#1%
- {%
- \ifodd#1%
- \ekv@fi@firstoftwo
- \fi
- \@secondoftwo
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagIfRaised}
-% This macro uses flags as a switch, if a flag's current height is bigger than
-% $0$ this test yields true.
-% \begin{macrocode}
-\ekv@exparg{\def\ekvcFlagIfRaised#1}%
- {%
- \expandafter\ifcsname\ekvc@flag@namescheme{\string#1}0\endcsname
- \ekv@fi@firstoftwo
- \fi
- \@secondoftwo
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagReset}
-% \begin{macro}[internal]{\ekvc@flag@reset,\ekvc@flag@reset@}
-% Resetting works by locally letting all the defined internal macros named
-% after |\ekvc@flag@namescheme| to undefined.
-% \begin{macrocode}
-\protected\def\ekvcFlagReset#1%
- {\expandafter\ekvc@flag@reset\csname\ekvc@flag@name#1\endcsname}
-\protected\def\ekvc@flag@reset#1%
- {%
- \ifcsname#10\endcsname
- \expandafter\let\csname#10\endcsname\ekvc@undefined
- \ekvc@flag@reset@1\ekv@stop#1%
- \fi
- }
-\protected\def\ekvc@flag@reset@#1\ekv@stop#2\fi
- {%
- \fi
- \ifcsname#2{#1}\endcsname
- \expandafter\let\csname#2{#1}\endcsname\ekvc@undefined
- \expandafter\ekvc@flag@reset@\the\numexpr#1+1\relax\ekv@stop#2%
- \fi
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagGetHeight}
-% \begin{macro}[internal]{\ekvc@flag@get@height@single}
-% These are just small helpers, first getting the height of the flag and then
-% passing it on to the user supplied code.
-% \begin{macrocode}
-\def\ekvcFlagGetHeight#1%
- {\expandafter\ekvc@flag@get@height@single\ekvcFlagHeight#1\ekv@stop}
-\long\def\ekvc@flag@get@height@single#1\ekv@stop#2{#2{#1}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\ekvcFlagGetHeights}
-% \begin{macro}[internal]
-% {\ekvc@flag@get@heights,\ekvc@flag@get@heights@,\ekvc@flag@get@heights@done}
-% This works by a simple loop that stops at |\ekv@stop|. As long as that
-% marker isn't hit, get the next flags height and put it into a list after
-% |\ekv@stop|. |\ekvc@flag@get@heights@| uses the same marker name for the
-% end of the height, which shouldn't clash in any case. Once we're done we
-% remove the remainder of the current iteration and leave the user supplied
-% code in the input stream with all the flags' heights as a single argument.
-% \begin{macrocode}
-\def\ekvcFlagGetHeights#1%
- {%
- \ekvc@flag@get@heights#1\ekv@stop{}%
- }
-\def\ekvc@flag@get@heights#1%
- {%
- \ekv@gobbleto@stop#1\ekvc@flag@get@heights@done\ekv@stop
- \expandafter\ekvc@flag@get@heights@\ekvcFlagHeight#1\ekv@stop
- }
-\def\ekvc@flag@get@heights@#1\ekv@stop#2\ekv@stop#3%
- {\ekvc@flag@get@heights#2\ekv@stop{#3{#1}}}
-\long\def\ekvc@flag@get@heights@done
- \ekv@stop
- \expandafter\ekvc@flag@get@heights@\ekvcFlagHeight\ekv@stop\ekv@stop#1#2%
- {#2{#1}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsubsection{Helper Macros}
-%
-% \begin{macro}[internal]{\ekvc@ifspace,\ekvc@ifspace@}
-% A test which can be reduced to an if-empty by gobbling everything up to the
-% first space.
-% \begin{macrocode}
-\long\def\ekvc@ifspace#1%
- {%
- \ekvc@ifspace@#1 \ekv@ifempty@B
- \ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- }
-\long\def\ekvc@ifspace@#1 % keep this space
- {%
- \ekv@ifempty@\ekv@ifempty@A
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@ifnottwoargs,\ekvc@ifempty@gtwo}
-% Used to test whether a token list contains exactly two \TeX\ arguments.
-% \begin{macrocode}
-\long\def\ekvc@ifnottwoargs#1%
- {%
- \ekvc@ifempty@gtwo#1\ekv@ifempty@B
- \ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- }
-\long\def\ekvc@ifempty@gtwo#1#2{\ekv@ifempty@\ekv@ifempty@A}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@extract@mark,\ekvc@extract@mark@}
-% This is used to extract the mark of a split or hash key from its definition.
-% This is kind of fragile, it assumes |#1| is always a macro used for hashing
-% or splitting. Also it assumes that the escape character is a backslash.
-% \begin{macrocode}
-\def\ekvc@extract@mark#1{\expandafter\ekvc@extract@mark@\meaning#1\ekv@stop}
-\begingroup
-\lccode`;=`#
-\lccode`/=`\\
-\lowercase{\endgroup
-\def\ekvc@extract@mark@#1:#2/#3 ;#4\ekv@stop{#3}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Assertions}
-% \begin{macro}[internal]{\ekvc@assert@not@long}
-% Some keys don't want to be |long| and we have to educate the user, so let's
-% throw an error if someone wanted these to be long.
-% \begin{macrocode}
-\long\def\ekvc@assert@not@long#1{\ifx\ekvc@long\long\ekvc@err@no@long{#1}\fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@assert@twoargs}
-% Some keys need exactly two arguments as their definition, so we have to
-% somehow assert this.
-% \begin{macrocode}
-\protected\long\def\ekvc@assert@twoargs#1#2%
- {\ekvc@ifnottwoargs{#1}{\ekvc@err@not@two{#2}}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Messages}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@err@toomany,\ekvc@err@value@required,\ekvc@err@missing@type,
-% \ekvc@err@already@defined,\ekvc@err@no@key@macro,
-% \ekvc@err@not@two
-% }
-% Boring unexpandable error messages.
-% \begin{macrocode}
-\protected\def\ekvc@err@toomany#1%
- {%
- \errmessage{expkv-cs Error: Too many keys for macro `\string#1'}%
- }
-\protected\long\def\ekvc@err@value@required#1%
- {%
- \errmessage{expkv-cs Error: Missing value for key `\ekv@unexpanded{#1}'}%
- }
-\protected\long\def\ekvc@err@missing@type#1%
- {%
- \errmessage
- {expkv-cs Error: Missing type for secondary key `\ekv@unexpanded{#1}'}%
- }
-\protected\long\def\ekvc@err@no@long#1%
- {%
- \errmessage
- {expkv-cs Error: prefix `long' not accepted for `\ekv@unexpanded{#1}'}%
- }
-\protected\long\def\ekvc@err@already@defined#1%
- {%
- \errmessage{expkv-cs Error: Macro `\string#1' already defined}%
- }
-\protected\long\def\ekvc@err@unknown@keytype#1%
- {%
- \errmessage{expkv-cs Error: Unknown key type `\ekv@unexpanded{#1}'}%
- }
-\protected\long\def\ekvc@err@unknown@key#1%
- {%
- \errmessage
- {expkv-cs Error: Unknown key `\ekv@unexpanded{#1}' for macro `\ekvc@set'}%
- }
-\protected\long\def\ekvc@err@no@key@macro#1%
- {\errmessage{expkv-cs Error: \string#1 is no key=val macro}}
-\protected\long\def\ekvc@err@not@two#1%
- {%
- \errmessage
- {%
- expkv-cs Error: Definition of `\ekv@unexpanded{#1}' doesn't contain
- exactly two arguments%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvc@err}
-% We need a way to throw error messages expandably in some contexts.
-% \begin{macrocode}
-\ekv@exparg{\long\def\ekvc@err#1}{\ekverr{expkv-cs}{#1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvc@err@unknown@hash,\ekvc@err@empty@hash,\ekvc@err@missing@hash,
-% \ekvc@err@invalid@bool,\ekvc@err@unknown@enum
-% }
-% And here are the expandable error messages.
-% \begin{macrocode}
-\long\def\ekvc@err@unknown@hash#1{\ekvc@err{unknown hash `#1'}}
-\long\def\ekvc@err@missing@hash#1{\ekvc@err{hash `#1' not found}}
-\long\def\ekvc@err@empty@hash{\ekvc@err{empty hash}}
-\def\ekvc@err@invalid@bool#1{\ekvc@err{invalid boolean value `#1'}}
-\long\def\ekvc@err@unknown@key@or@macro#1#2%
- {\ekvc@err{unknown key `#2' for macro #1}}
-\def\ekvc@err@unknown@enum#1#2#3%
- {\ekvc@err{unknown value `#3' for enum `#2' in macro #1}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% Now everything that's left is to reset the category code of |@|.
-% \begin{macrocode}
-\catcode`\@=\ekvc@tmp
-% \end{macrocode}
-%
-% \gobbledocstriptag
-%</tex>
-%^^A=<<
-%
-%^^A=<<
-%
-% \end{implementation}^^A=<<
-%
-% \clearpage
-% \PrintIndex
-%
-\endinput
-%
-^^A vim: ft=tex fdm=marker fmr=>>=,=<<
diff --git a/obsolete/macros/generic/expkv-cs/expkv-cs.pdf b/obsolete/macros/generic/expkv-cs/expkv-cs.pdf
deleted file mode 100644
index 0c37223ebf..0000000000
--- a/obsolete/macros/generic/expkv-cs/expkv-cs.pdf
+++ /dev/null
Binary files differ
diff --git a/obsolete/macros/generic/expkv-def/README.md b/obsolete/macros/generic/expkv-def/README.md
deleted file mode 100644
index 79a69057e4..0000000000
--- a/obsolete/macros/generic/expkv-def/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
--------------------------------------------------------------------------------
-# expkv-def -- a key-defining frontend for expkv
-
-Version 2022-01-29 v0.9
-
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-
-Hosted at https://github.com/Skillmon/tex_expkv-def
-
--------------------------------------------------------------------------------
-
-Copyright (C) 2020-2021 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
--------------------------------------------------------------------------------
-
-This provides a key=val frontend to define keys for
-[`expkv`](https://github.com/Skillmon/tex_expkv). It is generic code and only
-requires `expkv` for its parsing. There is a LaTeX package `expkv-def.sty`
-included to play nice on LaTeX's package loading system, but that package is not
-needed and does not provide more functionality than the generic code in
-`expkv-def.tex`.
diff --git a/obsolete/macros/generic/expkv-def/expkv-def.dtx b/obsolete/macros/generic/expkv-def/expkv-def.dtx
deleted file mode 100644
index 059c7dda01..0000000000
--- a/obsolete/macros/generic/expkv-def/expkv-def.dtx
+++ /dev/null
@@ -1,2493 +0,0 @@
-% \iffalse meta-comment
-%
-% File: expkv-def.dtx Copyright (C) 2020-2022 Jonathan P. Spratte
-%
-% This work may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% ------------------------------------------------------------------------------
-%
-%<*driver>^^A>>=
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-\input l3docstrip.tex
-\askforoverwritefalse
-\preamble
-
---------------------------------------------------------------
-expkv-def -- a key-defining frontend for expkv
-E-mail: jspratte@yahoo.de
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
---------------------------------------------------------------
-
-Copyright (C) 2020-2022 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
-This work consists of the file expkv-def.dtx
-and the derived files expkv-def.pdf
- expkv-def.sty
- expkv-def.tex
- t-expkv-def.tex
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-\generate{\file{expkv-def.sty}{\from{expkv-def.dtx}{pkg}}}
-\generate{\file{expkv-def.tex}{\from{expkv-def.dtx}{tex}}}
-\generate{\file{t-expkv-def.tex}{\from{expkv-def.dtx}{ctx}}}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%
-\IfFileExists{expkv-def.tex}{\input{expkv-def.tex}}{}
-\ProvidesFile{expkv-def.dtx}
- [\csname ekvdDate\endcsname\ a key-defining frontend for expkv]
-\PassOptionsToPackage{full}{textcomp}
-\documentclass{l3doc}
-\RequirePackage[oldstylenums,nott]{kpfonts}
-\input{glyphtounicode}
-\pdfgentounicode=1
-\RequirePackage{tcolorbox}
-\newtcolorbox{exresult}[2][]
- {colback=expkvgrey!10!white,colframe=expkvgrey,fontupper=\small,width={#2},#1}
-\newtcbox\exres[1][]
- {
- colback=expkvgrey!10!white
- ,colframe=expkvgrey
- ,size=small
- ,nobeforeafter
- ,tcbox raise base
- ,fontupper=\small
- ,#1
- }
-\RequirePackage{listings}
-\RequirePackage{booktabs}
-\RequirePackage{array}
-\RequirePackage{collcell}
-\RequirePackage{siunitx}
-\RequirePackage{xcolor}
-\RequirePackage{caption}
-\RequirePackage{microtype}
-\RequirePackage{accsupp}
-\lstdefinelanguage{expkvd}[primitive]{TeX}
- {
- ,moretexcs=[4]^^A e-TeX
- {
- expanded,
- numexpr,
- protected,
- }
- ,moretexcs=[5]^^A plain/LaTeX
- {
- approx,
- begin,
- empty,
- item,
- LaTeX,
- makeatletter,makeatother,
- newcommand,newdimen,
- RequirePackage,
- rule,
- TeX,
- textit,texttt,
- usepackage,
- }
- ,moretexcs=[6]^^A used packages
- {
- ^^A xfp
- fpeval,
- ^^A keyval
- setkeys,
- ^^A yax
- defactiveparameter,storevalue,setparameterlist
- }
- ,moretexcs=[2]^^A expkv-def macros
- {
- ekvdefinekeys
- }
- ,moretexcs=[3]^^A expkv-pkg macros
- {
- ^^A expkv
- ekvdef,ekvdefNoVal,^^A
- ekvlet,ekvletNoVal,ekvletkv,ekvletkvNoVal,^^A
- ekvdefunknown,ekvdefunknownNoVal,^^A
- ekvredirectunknown,ekvredirectunknownNoVal,^^A
- ekvset,ekvsetSneaked,^^A
- ekvsetdef,ekvsetSneakeddef,ekvsetdefSneaked,^^A
- ekvparse,^^A
- ekvVersion,ekvDate,^^A
- ekvifdefined,ekvifdefinedNoVal,ekvifdefinedset,^^A
- ekvbreak,ekvbreakPreSneak,ekvbreakPostSneak,^^A
- ekvsneak,ekvsneakPre,^^A
- ekvchangeset,^^A
- ekvoptarg,ekvoptargTF,^^A
- ekverr,
- ^^A expkv-cs
- ekvcSecondaryKeys,ekvcSplitAndForward,
- }
- }
-\colorlet{codeparam}{cyan!65!black}
-\def\mylstwd{.55em}
-\lstset
- {
- ,language=expkvd
- ,flexiblecolumns=false
- ,basewidth=\mylstwd
- ,gobble=2
- ,basicstyle=\fontfamily{jkp}\itshape
- ,texcsstyle=*[1]{\bfseries\color{expkvgrey}} ^^A primitives
- ,texcsstyle=*[2]{\bfseries\color{expkvred}} ^^A expkv
- ,texcsstyle=*[3]{\color{expkvred}} ^^A expkv-pkg
- ,texcsstyle=*[4]{\bfseries\color{expkvgrey}} ^^A e-TeX
- ,texcsstyle=*[5]{\bfseries\color{expkvgrey}} ^^A plain/LaTeX macros
- ,texcsstyle=*[6]{} ^^A macros of other packages
- ,commentstyle=\color[gray]{0.4}
- ,literate=
- {\{} {{\CodeUpBf\{}}{1}
- {\}} {{\CodeUpBf\}}}{1}
- {$} {{\CodeUpBf\$}}{1}
- {[} {{\CodeUp[}}{1}
- {]} {{\CodeUp]}}{1}
- {(} {{\CodeUp(}}{1}
- {)} {{\CodeUp)}}{1}
- {*} {{$*$}}{1}
- {1} {{\CodeUp{1}}}{1}
- {2} {{\CodeUp{2}}}{1}
- {3} {{\CodeUp{3}}}{1}
- {4} {{\CodeUp{4}}}{1}
- {5} {{\CodeUp{5}}}{1}
- {6} {{\CodeUp{6}}}{1}
- {7} {{\CodeUp{7}}}{1}
- {8} {{\CodeUp{8}}}{1}
- {9} {{\CodeUp{9}}}{1}
- {0} {{\CodeUp{0}}}{1}
- {##} {{\CodeColored{codeparam}{1}{\#}}}{1}
- {##1}{{\CodeColored{codeparam}{2}{\#1}}}{2}
- {##2}{{\CodeColored{codeparam}{2}{\#2}}}{2}
- {##3}{{\CodeColored{codeparam}{2}{\#3}}}{2}
- {##4}{{\CodeColored{codeparam}{2}{\#4}}}{2}
- {##5}{{\CodeColored{codeparam}{2}{\#5}}}{2}
- {##6}{{\CodeColored{codeparam}{2}{\#6}}}{2}
- {##7}{{\CodeColored{codeparam}{2}{\#7}}}{2}
- {##8}{{\CodeColored{codeparam}{2}{\#8}}}{2}
- {##9}{{\CodeColored{codeparam}{2}{\#9}}}{2}
- {<key>}{{$\langle$}key{$\rangle$}}{5}
- {<set>}{{$\langle$}set{$\rangle$}}{5}
- {<set1>}{{$\langle$}set1{$\rangle$}}{6}
- {<set2>}{{$\langle$}set2{$\rangle$}}{6}
- ^^A,literate=*{<key>}{\key}{4}{<set>}{\set}{4}
- }
-\newcommand*\CodeColored[3]{\textcolor{#1}{\makebox[\dimexpr\mylstwd*#2]{#3}}}
-\newcommand*\CodeUpBf[1]{\makebox[\mylstwd]{\textup{\textbf{#1}}}}
-\newcommand*\CodeUp[1]{\makebox[\mylstwd]{\textup{#1}}}
-\RequirePackage{randtext}
-\let\metaORIG\meta
-\protected\def\meta #1{\texttt{\metaORIG{#1}}}
-\renewcommand*\thefootnote{\fnsymbol{footnote}}
-\definecolor{expkvred}{HTML}{9F393D}
-\colorlet{expkvgrey}{black!75}
-\makeatletter
-\newcommand*\expkv
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv}^^A
- \href{https://github.com/Skillmon/tex_expkv}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv}^^A
- }
-\newcommand*\expkvd
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv-def}^^A
- \href{https://github.com/Skillmon/tex_expkv-def}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- {\color{expkvgrey}^^A
- \kern.05em\rule[-.1ex]{.08em}{1.2ex}\kern.05em\textsc{def}^^A
- }^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv-def}^^A
- }
-\newcommand\kv{\meta{key}=\meta{value}}
-\newcommand\key{\meta{key}}
-\newcommand\val{\meta{value}}
-\newcommand\set{\meta{set}}
-\newcommand\enfprefix{\textcolor{black}}
-\newcommand\allprefix{\textcolor{gray}}
-\newcommand\notprefix{\textcolor{red!80!black}}
-\newcommand\printprefix[2]
- {^^A
- \ifcase\numexpr#1\relax\or
- \enfprefix{#2}\or
- \allprefix{#2}\or
- \notprefix{#2}\fi
- }
-\newcommand\prefixes[4]
- {^^A
- \hfill
- \printprefix{#1}{new}
- \printprefix{#2}{also}
- \printprefix{#3}{protected}
- \printprefix{#4}{long}^^A
- }
-\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
-\DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
-\DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long}
-\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
-\DoNotIndex{\@,\unexpanded,\string,\expanded,\dimexpr,\global,\glueexpr,\hbox}
-\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef,\@firstofone}
-\DoNotIndex{\@firstoftwo,\@gobble,\@secondoftwo,\meaning,\detokenize}
-\DoNotIndex{\romannumeral,\^}
-\DoNotIndex{\ifcsname}
-\DoNotIndex{\ifx}
-\DoNotIndex{\ifdefined}
-\DoNotIndex{\iffalse}
-\DoNotIndex{\iftrue}
-\DoNotIndex{\else}
-\DoNotIndex{\fi}
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}}
-\makeatother
-\begin{document}
- \title
- {^^A
- \texorpdfstring
- {^^A
- \huge\expkvd
- \\[\medskipamount]
- \Large a key-defining frontend for \expkv
- }{expkv-def - a key-defining frontend for expkv}^^A
- }
- \date{\ekvdDate\space v\ekvdVersion}
- \author{Jonathan P. Spratte\thanks{\protect\randomize{jspratte@yahoo.de}}}
- \DocInput{expkv-def.dtx}
-\end{document}
-%</driver>^^A=<<
-% \fi
-%
-% \maketitle
-% \renewcommand*\thefootnote{\arabic{footnote}}
-%
-% \begin{abstract}
-% \noindent\parfillskip=0pt
-% \expkvd\ provides a small \kv\ interface to define keys for \expkv. Key-types
-% are declared using prefixes, similar to static typed languages. The stylised
-% name is \expkvd\ but the files use \file{expkv-def}, this is due to CTAN-rules
-% which don't allow \string| in package names since that is the pipe symbol in
-% *nix shells.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \begin{documentation}^^A>>=
-%
-% \section{Documentation}
-%
-% Since the trend for the last couple of years goes to defining keys for a \kv\
-% interface using a \kv\ interface, I thought that maybe providing such an
-% interface for \expkv\ will make it more attractive for actual use, besides its
-% unique selling points of being fully expandable, and fast and reliable. But at
-% the same time I don't want to widen \expkv's initial scope. So here it is
-% \expkvd, go define \kv\ interfaces with \kv\ interfaces.
-%
-% Unlike many of the other established \kv\ interfaces to define keys, \expkvd\
-% works using prefixes instead of suffixes (\emph{e.g.}, |.tl_set:N| of
-% \pkg{l3keys}) or directory like handlers (\emph{e.g.}, |/.store in| of
-% \pkg{pgfkeys}). This was decided as a personal preference, more over in \TeX\
-% parsing for the first space is way easier than parsing for the last one.
-% \expkvd's prefixes are sorted into two categories: |p|-type, which are
-% equivalent to \TeX's prefixes like |\long|, and |t|-type defining the type of
-% the key. For a description of the available |p|-prefixes take a look at
-% \autoref{sec:prefix:p}, the |t|-prefixes are described in
-% \autoref{sec:prefix:t}.
-%
-% \expkvd\ is usable as generic code, as a \LaTeX\ package, and as a \ConTeXt\
-% module. It'll automatically load \expkv\ in the same mode as well. To use it,
-% just use one of
-% \begin{lstlisting}
-% \input expkv-def % plainTeX
-% \usepackage{expkv-def} % LaTeX
-% \usemodule[expkv-def] % ConTeXt
-% \end{lstlisting}
-%
-% \subsection{Macros}
-% Apart from version and date containers there is only a single user-facing
-% macro, and that should be used to define keys.
-%
-% \begin{function}{\ekvdefinekeys}
-% \begin{syntax}
-% \cs{ekvdefinekeys}\marg{set}\{\kv, \ldots\}
-% \end{syntax}
-% In \set, define \key\ to have definition \val. The general syntax for \key\
-% should be
-% \begin{quote}\ttfamily\small
-% \meta{prefix} \meta{name}
-% \end{quote}
-% Where \meta{prefix} is a space separated list of optional |p|-type prefixes
-% followed by one |t|-type prefix. The syntax of \val\ is dependent on the
-% used |t|-prefix.
-% \end{function}
-%
-% \begin{function}{\ekvdDate,\ekvdVersion}
-% These two macros store the version and date of the package.
-% \end{function}
-%
-% \subsection{Prefixes}
-% As already said there are |p|-prefixes and |t|-prefixes. Not every |p|-prefix
-% is allowed for all |t|-prefixes.
-%
-% \subsubsection{\texttt{p}-Prefixes}\label{sec:prefix:p}
-% The two |p|-type prefixes |long| and |protected| are pretty simple by nature,
-% so their description is pretty simple. They affect the \key\ at use-time, so
-% omitting |long| doesn't mean that a \meta{definition} can't contain a |\par|
-% token, only that the \key\ will not accept a |\par| in \val. On the other
-% hand |new| and |also| might be simple on first sight as well, but their rules
-% are a bit more complicated.
-%
-% \begin{function}{also}
-% The following key type will be \emph{added} to an existing \key's
-% definition. You can't add a type taking an argument at use time to an
-% existing key which doesn't take an argument and vice versa. Also you'll get
-% an error if you try to add an action which isn't allowed to be either |long|
-% or |protected| to a key which already is |long| or |protected| (the opposite
-% order would be suboptimal as well, but can't be really captured with the
-% current code).
-%
-% A key already defined as |long| or |protected| will stay |long| or
-% |protected|, but you can as well add |long| or |protected| with the |also|
-% definition.
-%
-% As a small example, suppose you want to create a boolean key, but
-% additionally to setting a boolean value you want to execute some more code
-% as well, you can use the following
-% \begin{lstlisting}
-% \ekvdefinekeys{also-example}
-% {
-% bool key = \ifmybool
-% ,also code key = \domystuff{#1}
-% }
-% \end{lstlisting}
-%
-% If you use |also| on a |choice|, |bool|, |invbool|, or |boolpair| key it is
-% tried to determine if the key already is of one of those types. If this test
-% is true the declared choices will be added to the possible choices but the
-% key's definition will not be changed other than that. If that wouldn't have
-% been done, the callbacks of the different choices could get called multiple
-% times.
-% \end{function}
-%
-% \begin{function}{protected,protect}
-% The following key will be defined |\protected|. Note that key-types which
-% can't be defined expandable will always use |\protected|.
-% \end{function}
-%
-% \begin{function}{long}
-% The following key will be defined |\long|.
-% \end{function}
-%
-% \begin{function}{new}
-% The following key must be new (so previously undefined). An error is thrown
-% if it is already defined and the new definition is ignored. |new| only
-% asserts that there are no conflicts between |NoVal| keys and other |NoVal|
-% keys or value taking keys and other value taking keys. For example you can
-% use the following without an error:
-% \begin{lstlisting}
-% \ekvdefinekeys{new-example}
-% {
-% code key = \domystuffwitharg{#1}
-% ,new noval key = \domystuffwithoutarg
-% }
-% \end{lstlisting}
-% \end{function}
-%
-% \subsubsection{\texttt{t}-Prefixes}\label{sec:prefix:t}
-% Since the |p|-type prefixes apply to some of the |t|-prefixes automatically
-% but sometimes one might be disallowed we need some way to highlight this
-% behaviour. In the following an enforced prefix will be printed black
-% (\texttt{\enfprefix{protected}}), allowed prefixes will be grey
-% (\texttt{\allprefix{protected}}), and disallowed prefixes will be red
-% (\texttt{\notprefix{protected}}). This will be put flush-right in the syntax
-% showing line.
-%
-% \begin{function}{code,ecode}
-% \begin{syntax}
-% code \key\ = \marg{definition} \prefixes2222
-% \end{syntax}
-% Define \key\ to expand to \meta{definition}. The \key\ will require a \val\
-% for which you can use |#1| inside \meta{definition}. The |ecode| variant
-% will fully expand \meta{definition} inside an |\edef|.
-% \end{function}
-%
-% \begin{function}{noval,enoval}
-% \begin{syntax}
-% noval \key\ = \marg{definition} \prefixes2223
-% \end{syntax}
-% The |noval| type defines \key\ to expand to \meta{definition}. The \key\
-% will not take a \val. |enoval| fully expands \meta{definition} inside an
-% |\edef|.
-% \end{function}
-%
-% \begin{function}{default,qdefault,odefault,fdefault,edefault}
-% \begin{syntax}
-% default \key\ = \marg{definition} \prefixes3223
-% \end{syntax}
-% This serves to place a default \val\ for a \key\ that takes an argument, the
-% \key\ can be of any argument-grabbing kind, and when used without a \val\
-% it will be passed \meta{definition} instead. The |qdefault| variant will
-% expand the \key's code once, so will be slightly quicker, but not change if
-% you redefine \key. |odefault| is just another name for |qdefault|. The
-% |fdefault| version will expand the key code until a non-expandable token or
-% a space is found, a space would be gobbled.\footnotemark{} The |edefault| on
-% the other hand fully expands the \key-code with \meta{definition} as its
-% argument inside of an |\edef|.
-% \end{function}
-% \footnotetext
-% {^^A
-% For those familiar with \TeX-coding: This uses a
-% \cs[no-index]{romannumeral}-expansion.
-% }
-%
-% \begin{function}{initial,oinitial,finitial,einitial}
-% \begin{syntax}
-% initial \key\ = \{\val\} \prefixes3333
-% initial \key
-% \end{syntax}
-% With |initial| you can set an initial \val\ for an already defined argument
-% taking \key. It'll just call the key-macro of \key\ and pass it \val. The
-% |einitial| variant will expand \val\ using an |\edef| expansion prior to
-% passing it to the key-macro and the |oinitial| variant will expand the first
-% token in \val\ once. |finitial| will expand \val\ until a non-expandable
-% token or a space is found, a space would be
-% gobbled.\footnotemark
-%
-% If you don't provide a value (and no equals sign) a |noval| \key\ of the
-% same name is called once (or, if you specified a |default| for a value
-% taking key that would be used).
-% \end{function}
-% \footnotetext{Again using \cs[no-index]{romannumeral}.}
-%
-% \begin{function}{bool,gbool,boolTF,gboolTF}
-% \begin{syntax}
-% bool \key\ = \meta{cs} \prefixes2223
-% \end{syntax}
-% The \meta{cs} should be a single control sequence, such as |\iffoo|.
-% This will define \key\ to be a boolean key, which only takes the values
-% |true| or |false| and will throw an error for other values. If the key is
-% used without a \val\ it'll have the same effect as if you use
-% \texttt{\key=true}. |bool| and |gbool| will behave like \TeX-ifs so either
-% be |\iftrue| or |\iffalse|. The |boolTF| and |gboolTF| variants will both
-% take two arguments and if true the first will be used else the second, so
-% they are always either |\@firstoftwo| or |\@secondoftwo|. The variants with
-% a leading |g| will set the control sequence globally, the others locally. If
-% \meta{cs} is not yet defined it'll be initialised as the |false| version.
-% Note that the initialisation is \emph{not} done with |\newif|, so you will
-% not be able to do |\footrue| outside of the \kv\ interface, but you could
-% use |\newif| yourself. Even if the \key\ will not be |\protected| the
-% commands which execute the |true| or |false| choice will be, so the usage
-% should be safe in an expansion context (\emph{e.g.}, you can use
-% \texttt{edefault \key\ = false} without an issue to change the default
-% behaviour to execute the |false| choice). Internally a |bool| \key\ is the
-% same as a |choice| key which is set up to handle |true| and |false| as
-% choices.
-% \end{function}
-%
-% \begin{function}{invbool,ginvbool,invboolTF,ginvboolTF}
-% \begin{syntax}
-% bool \key\ = \meta{cs} \prefixes2223
-% \end{syntax}
-% These are inverse boolean keys, they behave like |bool| and friends but set
-% the opposite meaning to the macro \meta{cs} in each case. So if
-% \texttt{key=true} is used |invbool| will set \meta{cs} to |\iffalse| and
-% vice versa.
-% \end{function}
-%
-% \begin{function}{boolpair,gboolpair,boolpairTF,gboolpairTF}
-% \begin{syntax}
-% boolpair \key\ = \meta{cs_1}\meta{cs_2} \prefixes2223
-% \end{syntax}
-% The |boolpair| key type behaves like both |bool| and |invbool|, the
-% \meta{cs_1} will be set to the meaning according to the rules of |bool|, and
-% \meta{cs_2} will be set to the opposite.
-% \end{function}
-%
-% \begin{function}{store,estore,gstore,xstore}
-% \begin{syntax}
-% store \key\ = \meta{cs} \prefixes2212
-% \end{syntax}
-% The \meta{cs} should be a single control sequence, such as |\foo|.
-% This will define \key\ to store \val\ inside of the control sequence. If
-% \meta{cs} isn't yet defined it will be initialised as empty. The variants
-% behave similarly to their |\def|, |\edef|, |\gdef|, and |\xdef|
-% counterparts, but |store| and |gstore| will allow you to store macro
-% parameters inside of them by using |\unexpanded|.
-% \end{function}
-%
-% \begin{function}{data,edata,gdata,xdata}
-% \begin{syntax}
-% data \key\ = \meta{cs} \prefixes2212
-% \end{syntax}
-% The \meta{cs} should be a single control sequence, such as |\foo|. This will
-% define \key\ to store \val\ inside of the control sequence. But unlike the
-% |store| type, the macro \meta{cs} will be a switch at the same time, it'll
-% take two arguments and if \key\ was used expands to the first argument
-% followed by \val\ in braces, if \key\ was not used \meta{cs} will expand to
-% the second argument (so behave like |\@secondoftwo|). The idea is that with
-% this type you can define a key which should be typeset formatted. The
-% |edata| and |xdata| variants will fully expand \val, the |gdata| and |xdata|
-% variants will store \val\ inside \meta{cs} globally. The |p|-prefixes will
-% only affect the key-macro, \meta{cs} will always be expandable and |\long|.
-% \end{function}
-%
-% \begin{function}{dataT,edataT,gdataT,xdataT}
-% \begin{syntax}
-% dataT \key\ = \meta{cs} \prefixes2212
-% \end{syntax}
-% Just like |data|, but instead of \meta{cs} grabbing two arguments it'll only
-% grab one, so by default it'll behave like |\@gobble|, and if a \val\ was
-% given to \key\ the \meta{cs} will behave like |\@firstofone| appended by
-% \marg{value}.
-% \end{function}
-%
-% \begin{function}{int,eint,gint,xint}
-% \begin{syntax}
-% int \key\ = \meta{cs} \prefixes2212
-% \end{syntax}
-% The \meta{cs} should be a single control sequence, such as |\foo|.
-% An |int| key will be a \TeX-count register. If \meta{cs} isn't defined yet,
-% |\newcount| will be used to initialise it. The |eint| and |xint| versions
-% will use |\numexpr| to allow basic computations in their \val. The |gint|
-% and |xint| variants set the register globally.
-% \end{function}
-%
-% \begin{function}{dimen,edimen,gdimen,xdimen}
-% \begin{syntax}
-% dimen \key\ = \meta{cs} \prefixes2212
-% \end{syntax}
-% The \meta{cs} should be a single control sequence, such as |\foo|.
-% This is just like |int| but uses a dimen register, |\newdimen| and
-% |\dimexpr| instead.
-% \end{function}
-%
-% \begin{function}{skip,eskip,gskip,xskip}
-% \begin{syntax}
-% skip \key\ = \meta{cs} \prefixes2212
-% \end{syntax}
-% The \meta{cs} should be a single control sequence, such as |\foo|.
-% This is just like |int| but uses a skip register, |\newskip| and |\glueexpr|
-% instead.
-% \end{function}
-%
-% \begin{function}{toks,gtoks,apptoks,gapptoks,pretoks,gpretoks}
-% \begin{syntax}
-% toks \key\ = \meta{cs} \prefixes2212
-% \end{syntax}
-% The \meta{cs} should be a single control sequence, such as |\foo|.
-% Store \val\ inside of a toks-register. The |g| variants use |\global|, the
-% |app| variants append \val\ to the contents of that register, the |pre|
-% variants will prepend \val. If \meta{cs} is not yet defined it will be
-% initialised with |\newtoks|.
-% \end{function}
-%
-% \begin{function}{box,gbox}
-% \begin{syntax}
-% box \key\ = \meta{cs} \prefixes2212
-% \end{syntax}
-% The \meta{cs} should be a single control sequence, such as |\foo|.
-% Typesets \val\ into a |\hbox| and stores the result in a box register. The
-% boxes are colour safe. \expkvd\ doesn't provide a |vbox| type.
-% \end{function}
-%
-% \begin{function}{meta}
-% \begin{syntax}
-% meta \key\ = \{\kv, \ldots\} \prefixes2222
-% \end{syntax}
-% This key type can set other keys, you can access the \val\ which was passed
-% to \key\ inside the \kv\ list with |#1|. It works by calling a sub-|\ekvset|
-% on the \kv\ list, so a |set| key will only affect that \kv\ list and not the
-% current |\ekvset|. Since it runs in a separate |\ekvset| you can't use
-% |\ekvsneak| using keys or similar macros in the way you normally could.
-% \end{function}
-%
-% \begin{function}{nmeta}
-% \begin{syntax}
-% nmeta \key\ = \{\kv, \ldots\} \prefixes2223
-% \end{syntax}
-% This key type can set other keys, the difference to |meta| is, that this key
-% doesn't take a value, so the \kv\ list is static.
-% \end{function}
-%
-% \begin{function}{smeta}
-% \begin{syntax}
-% smeta \key\ = \marg{set}\{\kv, \ldots\} \prefixes2222
-% \end{syntax}
-% Yet another |meta| variant. An |smeta| key will take a \val\ which you can
-% access using |#1|, but it sets the \kv\ list inside of \set, so is equal to
-% \texttt{\cs[no-index]{ekvset}\marg{set}\{\kv, \ldots\}}.
-% \end{function}
-%
-% \begin{function}{snmeta}
-% \begin{syntax}
-% snmeta \key\ = \marg{set}\{\kv, \ldots\} \prefixes2223
-% \end{syntax}
-% And the last |meta| variant. |snmeta| is a combination of |smeta| and
-% |nmeta|. It doesn't take an argument and sets the \kv\ list inside of \set.
-% \end{function}
-%
-% \begin{function}{set}
-% \begin{syntax}
-% set \key\ = \marg{set} \prefixes2233
-% \end{syntax}
-% This will define \key\ to change the set of the current |\ekvset|
-% invocation to \set. You can omit \set\ (including the equals sign),
-% which is the same as using \texttt{set \key\ = \{\key\}}. The created |set|
-% key will not take a \val. Note that just like in \expkv\ it'll not be
-% checked whether \set\ is defined and you'll get a low-level \TeX\ error if
-% you use an undefined \set.
-% \end{function}
-%
-% \begin{function}{choice}
-% \begin{syntax}
-% choice \key\ = \{\val=\meta{definition}, \ldots\} \prefixes2223
-% \end{syntax}
-% Defines \key\ to be a |choice| key, meaning it will only accept a limited
-% set of values. You should define each possible \val\ inside of the
-% \val=\meta{definition} list. If a defined \val\ is passed to \key\ the
-% \meta{definition} will be left in the input stream. You can make
-% individual values |protected| inside the \val=\meta{definition} list. By
-% default a |choice| key is expandable, an undefined \val\ will throw an error
-% in an expandable way (but see the |unknown-choice| prefix). You can add
-% additional choices after the \key\ was created by using |choice| again for
-% the same \key, redefining choices is possible the same way, but there is no
-% interface to remove certain choices.
-% \end{function}
-%
-% \begin{function}{choice-store}
-% \begin{syntax}
-% choice-store \key\ = \meta{cs}\{\val, \ldots\} \prefixes2223
-% \end{syntax}
-% This is defines a special type of |choice| key that'll store the given
-% choice inside the macro \meta{cs} (so \meta{cs} should be a single control
-% sequence name such as |\foo|). Since storing inside a macro can't be done
-% expandably every choice-code is |\protected|, you might define the
-% |choice-store| key itself as |protected| as well if you want. Since the
-% definition of each choice is predefined with this key type the choice list
-% should just be a comma separated list of valid choices.
-% \end{function}
-% This means that the following |choice| and |choice-store| keys are equivalent
-% at use time:
-% \begin{lstlisting}
-% \newcommand*\mya{}
-% \ekvdefinekeys{example}
-% {
-% choice key1 = {a=\def\mya{a}, b=\def\mya{b}, c=\def\mya{c}}
-% ,choice-store key2 = \mya{a,b,c}
-% }
-% \end{lstlisting}
-%
-% \begin{function}{choice-enum}
-% \begin{syntax}
-% choice-enum \key\ = \meta{cs}\{\val, \ldots\} \prefixes2223
-% \end{syntax}
-% This is similar to |choice-store|, the differences are: \meta{cs} should be
-% a count-register or is initialised as such if the \meta{cs} is undefined
-% (via |\newcount|); instead of the value the position of the value in the
-% given list is stored in this register (zero-based).
-% \end{function}
-% This means that the following |choice| and |choice-enum| keys are equivalent
-% at use time:
-% \begin{lstlisting}
-% \newcount\myb
-% \ekvdefinekeys{example}
-% {
-% choice key1 = {a={\myb=0 }, b={\myb=1 }, c={\myb=2 }}
-% ,choice-enum key2 = \myb{a,b,c}
-% }
-% \end{lstlisting}
-%
-% \begin{function}{unknown-choice}
-% \begin{syntax}
-% unknown-choice \key\ = \marg{definition} \prefixes2323
-% \end{syntax}
-% By default an unknown \val\ passed to a |choice| or |bool| key will throw an
-% error. However, with this prefix you can define an alternative action which
-% should be executed if \key\ received an unknown choice. In \meta{definition}
-% you can refer to the choice which was passed in with |#1|.
-% \end{function}
-%
-% \begin{function}{unknown code}
-% \begin{syntax}
-% unknown code = \marg{definition} \prefixes2322
-% \end{syntax}
-% By default \expkv\ throws errors when it encounters unknown keys in a set.
-% With the |unknown| prefix you can define handlers that deal with undefined
-% keys, instead of a \key\ name you have to specify a subtype for this prefix,
-% here the subtype is |code|.\par
-% With |unknown code| the \meta{definition} is used for unknown keys which
-% were provided a value (so corresponds to |\ekvdefunknown|), you can access
-% the key name with |#1| and the value with |#2|.\footnotemark
-% \end{function}
-% \footnotetext
-% {^^A
-% There is some trickery involved to get this more intuitive argument order
-% without any performance hit if you compare this to
-% \cs[no-index]{ekvdefunknown} directly.^^A
-% }
-%
-% \begin{function}{unknown noval}
-% \begin{syntax}
-% unknown noval = \marg{definition} \prefixes2323
-% \end{syntax}
-% This is like |unknown code| but uses \meta{definition} for unknown keys to
-% which no value was passed (so corresponds to |\ekvdefunknownNoVal|). You can
-% access the key name with |#1|.
-% \end{function}
-%
-% \begin{function}{unknown redirect-code}
-% \begin{syntax}
-% unknown redirect-code = \marg{set-list} \prefixes2331
-% \end{syntax}
-% This uses a predefined action for |unknown code|. Instead of throwing an
-% error, it is tried to find the \key\ in each \set\ in the comma separated
-% \meta{set-list}. The first found match will be used and the remaining
-% options from the list discarded. If the \key\ isn't found in any \set\ an
-% expandable error will be thrown eventually. Internally \expkv's
-% |\ekvredirectunknown| will be used.
-% \end{function}
-%
-% \begin{function}{unknown redirect-noval}
-% \begin{syntax}
-% unknown redirect-noval = \marg{set-list} \prefixes2333
-% \end{syntax}
-% This behaves just like |unknown redirect-code| but will set up means to
-% forward keys for |unknown noval|. Internally \expkv's
-% |\ekvredirectunknownNoVal| will be used.
-% \end{function}
-%
-% \begin{function}{unknown redirect}
-% \begin{syntax}
-% unknown redirect = \marg{set-list} \prefixes2333
-% \end{syntax}
-% This is a short cut to apply both, |unknown redirect-code| and
-% |unknown redirect-noval|, as a result you might get doubled error messages,
-% one from each.
-% \end{function}
-%
-% \subsection{Bugs}
-% I don't think there are any (but every developer says that), if you find some
-% please let me know, either via the email address on the first page or on
-% GitHub:
-% \url{https://github.com/Skillmon/tex_expkv-def}
-%
-% \subsection{Example}
-% The following is an example code defining each base key-type once. Please
-% admire the very creative key-name examples.
-%
-% \begin{lstlisting}
-% \ekvdefinekeys{example}
-% {
-% long code keyA = #1
-% ,noval keyA = NoVal given
-% ,bool keyB = \keyB
-% ,boolTF keyC = \keyC
-% ,store keyD = \keyD
-% ,data keyE = \keyE
-% ,dataT keyF = \keyF
-% ,int keyG = \keyG
-% ,dimen keyH = \keyH
-% ,skip keyI = \keyI
-% ,toks keyJ = \keyJ
-% ,default keyJ = \empty test
-% ,new box keyK = \keyK
-% ,qdefault keyK = K
-% ,choice keyL =
-% {
-% protected 1 = \texttt{a}
-% ,2 = b
-% ,3 = c
-% ,4 = d
-% ,5 = e
-% }
-% ,edefault keyL = 2
-% ,meta keyM = {keyA={#1},keyB=false}
-% ,invbool keyN = \keyN
-% ,boolpair keyO = \keyOa\keyOb
-% }
-% \end{lstlisting}
-%
-% \bigskip
-% Since the |data| type might be a bit strange, here is another usage example
-% for it.
-% \begin{lstlisting}
-% \ekvdefinekeys{ex}
-% {
-% data name = \Pname
-% ,data age = \Page
-% ,dataT hobby = \Phobby
-% }
-% \newcommand\Person[1]
-% {%
-% \begingroup
-% \ekvset{ex}{#1}%
-% \begin{description}
-% \item[\Pname{}{\errmessage{A person requires a name}}]
-% \item[Age] \Page{\textit}{\errmessage{A person requires an age}}
-% \Phobby{\item[Hobbies]}
-% \end{description}
-% \endgroup
-% }
-% \Person{name=Jonathan P. Spratte, age=young, hobby=\TeX\ coding}
-% \Person{name=Some User, age=unknown, hobby=Reading Documentation}
-% \Person{name=Anybody, age=any}
-% \end{lstlisting}
-% In this example a person should have a name and an age, but doesn't have to
-% have hobbies. The name will be displayed as the description item and the age
-% in Italics. If a person has no hobbies the description item will be silently
-% left out. The result of the above code looks like this:
-%
-% \begin{exresult}{\linewidth}
-% \ekvdefinekeys{ex}
-% {
-% data name = \Pname
-% ,data age = \Page
-% ,dataT hobby = \Phobby
-% }
-% \newcommand\Person[1]
-% {%
-% \begingroup
-% \ekvset{ex}{#1}%
-% \begin{description}
-% \item[\Pname{}{\errmessage{A person requires a name}}]
-% \item[Age] \Page{\textit}{\errmessage{A person requires an age}}
-% \Phobby{\item[Hobbies]}
-% \end{description}
-% \endgroup
-% }
-% \Person{name=Jonathan P. Spratte, age=young, hobby=\TeX\ coding}
-% \Person{name=Some User, age=unknown, hobby=Reading Documentation}
-% \Person{name=Anybody, age=any}
-% \end{exresult}
-%
-% \subsection{License}
-%
-% Copyright \textcopyright\ 2020\unless\ifnum\year=2020--\the\year\fi\
-% Jonathan P. Spratte
-%
-% \medskip\noindent
-% This work may be distributed and/or modified under the conditions of the
-% \LaTeX\ Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% \url{http://www.latex-project.org/lppl.txt}
-%
-% \noindent
-% This work is ``maintained'' (as per LPPL maintenance status) by
-%
-% \mbox{Jonathan P. Spratte}.
-%
-% \end{documentation}^^A=<<
-%
-% \begin{implementation}^^A>>=
-%
-% \clearpage
-%
-% \section{Implementation}^^A>>=
-%^^A the LaTeX package >>=
-% \subsection{The \LaTeX\ Package}
-% Just like for \expkv\ we provide a small \LaTeX\ package that sets up things
-% such that we behave nicely on \LaTeX\ packages and files system. It'll
-% |\input| the generic code which implements the functionality.
-% \gobbledocstriptag
-%<*pkg>
-% \begin{macrocode}
-\RequirePackage{expkv}
-\def\ekvd@tmp
- {%
- \ProvidesFile{expkv-def.tex}%
- [\ekvdDate\space v\ekvdVersion\space a key-defining frontend for expkv]%
- }
-\input{expkv-def.tex}
-\ProvidesPackage{expkv-def}%
- [\ekvdDate\space v\ekvdVersion\space a key-defining frontend for expkv]
-% \end{macrocode}
-% \gobbledocstriptag
-%</pkg>
-%^^A=<<
-%^^A the ConTeXt module >>=
-% \subsection{The \ConTeXt\ module}
-% \gobbledocstriptag
-%<*ctx>
-% \begin{macrocode}
-\writestatus{loading}{ConTeXt User Module / expkv-def}
-\usemodule[expkv]
-\unprotect
-\input expkv-def.tex
-\writestatus{loading}
- {ConTeXt User Module / expkv-def / Version \ekvdVersion\space loaded}
-\protect\endinput
-% \end{macrocode}
-% \gobbledocstriptag
-%</ctx>
-%^^A=<<
-%^^A main file >>=
-% \subsection{The Generic Code}
-% The rest of this implementation will be the generic code.
-% \gobbledocstriptag
-%<*tex>
-%
-% Load \expkv\ if the package didn't already do so -- since \expkv\ has
-% safeguards against being loaded twice this does no harm and the overhead
-% isn't that big. Also we reuse some of the internals of \expkv\ to save us from
-% retyping them.
-% \begin{macrocode}
-\input expkv
-% \end{macrocode}
-%
-% We make sure that \file{expkv-def.tex} is only input once:
-% \begin{macrocode}
-\expandafter\ifx\csname ekvdVersion\endcsname\relax
-\else
- \expandafter\endinput
-\fi
-% \end{macrocode}
-%
-% \begin{macro}{\ekvdVersion,\ekvdDate}
-% We're on our first input, so lets store the version and date in a macro.
-% \begin{macrocode}
-\def\ekvdVersion{0.9}
-\def\ekvdDate{2022-01-29}
-% \end{macrocode}
-% \end{macro}
-%
-% If the \LaTeX\ format is loaded we want to be a good file and report back who
-% we are, for this the package will have defined |\ekvd@tmp| to use
-% |\ProvidesFile|, else this will expand to a |\relax| and do no harm.
-% \begin{macrocode}
-\csname ekvd@tmp\endcsname
-% \end{macrocode}
-%
-% Store the category code of |@| to later be able to reset it and change it to
-% 11 for now.
-% \begin{macrocode}
-\expandafter\chardef\csname ekvd@tmp\endcsname=\catcode`\@
-\catcode`\@=11
-% \end{macrocode}
-% |\ekvd@tmp| will be reused later to handle expansion during the key
-% defining. But we don't need it to ever store information long-term after
-% \expkvd\ was initialized.
-%
-% \begin{macro}[internal]{\ekvd@ifprimitive}
-% \begin{macrocode}
-\protected\long\def\ekvd@ifprimitive#1%
- {%
- \begingroup
- \edef\ekvd@tmpa{\string #1}%
- \edef\ekvd@tmpb{\meaning#1}%
- \expandafter
- \endgroup
- \ifx\ekvd@tmpa\ekvd@tmpb
- \ekv@fi@firstoftwo
- \fi
- \@secondoftwo
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvd@long,\ekvd@prot,\ekvd@clear@prefixes,\ekvd@ifalso}
-% \expkvd\ will use |\ekvd@long|, |\ekvd@prot|, and |\ekvd@ifalso| to store
-% whether a key should be defined as |\long| or |\protected| or adds an action
-% to an existing key, and we have to clear them for every new key. By default
-% |long| and |protected| will just be empty, |ifalso| will be
-% |\@secondoftwo|, and |ifnew| will just use its third argument.
-% \begin{macrocode}
-\protected\def\ekvd@clear@prefixes
- {%
- \let\ekvd@long\ekv@empty
- \let\ekvd@prot\ekv@empty
- \let\ekvd@ifalso\@secondoftwo
- \long\def\ekvd@ifnew##1##2##3{##3}%
- }
-\ekvd@clear@prefixes
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvdefinekeys}
-% This is the one front-facing macro which provides the interface to define
-% keys. It's using |\ekvparse| to handle the \kv\ list, the interpretation will
-% be done by |\ekvd@noarg| and |\ekvd@|. The \set\ for which the keys should be
-% defined is stored in |\ekvd@set|.
-% \begin{macrocode}
-\protected\def\ekvdefinekeys#1%
- {%
- \def\ekvd@set{#1}%
- \ekvparse\ekvd@noarg\ekvd@arg
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@noarg,\ekvd@arg,\ekvd@handle}
-% |\ekvd@noarg| and |\ekvd@arg| store whether there was a value in the \kv\
-% pair. |\ekvd@handle| has to test whether there is a space inside the key and
-% if so calls the prefix grabbing routine, else we throw an error and ignore the
-% key.
-% \begin{macrocode}
-\protected\long\def\ekvd@noarg#1%
- {%
- \let\ekvd@ifnoarg\@firstoftwo
- \expandafter\ekvd@handle\detokenize{#1}\ekvd@stop{}%
- }
-\protected\long\def\ekvd@arg#1%
- {%
- \let\ekvd@ifnoarg\@secondoftwo
- \expandafter\ekvd@handle\detokenize{#1}\ekvd@stop
- }
-\protected\long\def\ekvd@handle#1\ekvd@stop#2%
- {%
- \ekvd@clear@prefixes
- \def\ekvd@cur{#1}%
- \ekvd@ifspace{#1}%
- {\ekvd@prefix\ekv@mark#1\ekv@stop{#2}}%
- \ekvd@err@missing@type
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@prefix,\ekvd@prefix@}
-% \expkvd\ separates prefixes into two groups, the first being prefixes in the
-% \TeX\ sense (|long| and |protected|) which use |@p@| in their name, the other
-% being key-types (|code|, |int|, \emph{etc.}) which use |@t@| instead.
-% |\ekvd@prefix| splits at the first space and checks whether its a |@p@|
-% or |@t@| type prefix. If it is neither throw an error and gobble the
-% definition (the value).
-% \begin{macrocode}
-\protected\def\ekvd@prefix#1 {\ekv@strip{#1}\ekvd@prefix@\ekv@mark}
-\protected\def\ekvd@prefix@#1#2\ekv@stop
- {%
- \ekv@ifdefined{ekvd@t@#1}%
- {\ekv@strip{#2}{\csname ekvd@t@#1\endcsname}}%
- {%
- \ekv@ifdefined{ekvd@p@#1}%
- {\csname ekvd@p@#1\endcsname\ekvd@prefix@after@p{#2}}%
- {\ekvd@err@undefined@prefix{#1}\@gobble}%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@prefix@after@p}
-% The |@p@| type prefixes are all just modifying a following |@t@| type, so they
-% will need to search for another prefix. This is true for all of them, so we
-% use a macro to handle this. It'll throw an error if there is no other prefix.
-% \begin{macrocode}
-\protected\def\ekvd@prefix@after@p#1%
- {%
- \ekvd@ifspace{#1}%
- {\ekvd@prefix#1\ekv@stop}%
- {\ekvd@err@missing@type\@gobble}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvd@p@long,\ekvd@p@protected,\ekvd@p@protect,\ekvd@p@also,\ekvd@p@new}
-% Define the |@p@| type prefixes, they all just store some information in a
-% temporary macro.
-% \begin{macrocode}
-\protected\def\ekvd@p@long{\let\ekvd@long\long}
-\protected\def\ekvd@p@protected{\let\ekvd@prot\protected}
-\let\ekvd@p@protect\ekvd@p@protected
-\protected\def\ekvd@p@also{\let\ekvd@ifalso\@firstoftwo}
-\protected\def\ekvd@p@new{\let\ekvd@ifnew\ekvd@assert@new}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Key Types}
-%
-% \begin{macro}[internal]{\ekvd@type@set,\ekvd@t@set}
-% The |set| type is quite straight forward, just define a |NoVal| key to call
-% |\ekvchangeset|.
-% \begin{macrocode}
-\protected\def\ekvd@type@set#1#2%
- {%
- \ekvd@assert@not@long
- \ekvd@assert@not@protected
- \ekvd@ifnew{NoVal}{#1}%
- {%
- \ekv@ifempty{#2}%
- {\ekvd@err@missing@definition}%
- {%
- \ekvd@ifalso
- {%
- \ekv@expargtwice{\ekvd@add@noval{#1}}%
- {\ekvchangeset{#2}}%
- \ekvd@assert@not@protected@also
- }%
- {\ekv@expargtwice{\ekvdefNoVal\ekvd@set{#1}}{\ekvchangeset{#2}}}%
- }%
- }%
- }
-\protected\def\ekvd@t@set#1#2%
- {%
- \ekvd@ifnoarg
- {\ekvd@type@set{#1}{#1}}%
- {\ekvd@type@set{#1}{#2}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@type@noval,\ekvd@t@noval,\ekvd@t@enoval}
-% Another pretty simple type, |noval| just needs to assert that there is a
-% definition and that |long| wasn't specified.
-% There are types where the difference in the variants is so small, that we
-% define a common handler for them, those common handlers are named with
-% |@type@|. |noval| and |enoval| are so similar that we can use such a |@type@|
-% macro, even if we could've done |noval| in a slightly faster way without it.
-% \begin{macrocode}
-\protected\long\def\ekvd@type@noval#1#2#3%
- {%
- \ekvd@ifnew{NoVal}{#2}%
- {%
- \ekvd@assert@arg
- {%
- \ekvd@assert@not@long
- \ekvd@prot#1\ekvd@tmp{#3}%
- \ekvd@ifalso
- {\ekv@exparg{\ekvd@add@noval{#2}}\ekvd@tmp{}}%
- {\ekvletNoVal\ekvd@set{#2}\ekvd@tmp}%
- }%
- }%
- }
-\protected\def\ekvd@t@noval{\ekvd@type@noval\def}
-\protected\def\ekvd@t@enoval{\ekvd@type@noval\edef}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@type@code,\ekvd@t@code,\ekvd@t@ecode}
-% |code| is simple as well, |ecode| has to use |\edef| on a temporary macro,
-% since \expkv\ doesn't provide an |\ekvedef|.
-% \begin{macrocode}
-\protected\long\def\ekvd@type@code#1#2#3%
- {%
- \ekvd@ifnew{}{#2}%
- {%
- \ekvd@assert@arg
- {%
- \ekvd@prot\ekvd@long#1\ekvd@tmp##1{#3}%
- \ekvd@ifalso
- {\ekv@exparg{\ekvd@add@val{#2}}{\ekvd@tmp{##1}}{}}%
- {\ekvlet\ekvd@set{#2}\ekvd@tmp}%
- }%
- }%
- }
-\protected\def\ekvd@t@code{\ekvd@type@code\def}
-\protected\def\ekvd@t@ecode{\ekvd@type@code\edef}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@type@default,\ekvd@t@default,\ekvd@t@qdefault,\ekvd@t@odefault,
-% \ekvd@t@fdefault
-% }
-% |\ekvd@type@default| asserts there was an argument, also the key for which one
-% wants to set a default has to be already defined (this is not so important for
-% |default|, but |qdefault| requires is). If everything is good, |\edef| a
-% temporary macro that expands |\ekvd@set| and the |\csname| for the key, and in
-% the case of |qdefault| does the first expansion step of the key-macro.
-% \begin{macrocode}
-\protected\long\def\ekvd@type@default#1#2#3#4%
- {%
- \ekvd@assert@arg
- {%
- \ekvifdefined\ekvd@set{#3}%
- {%
- \ekvd@assert@not@new
- \ekvd@assert@not@long
- \ekvd@prot\edef\ekvd@tmp
- {%
- \ekv@unexpanded\expandafter#1%
- {#2\csname\ekv@name\ekvd@set{#3}\endcsname{#4}}%
- }%
- \ekvd@ifalso
- {\ekv@exparg{\ekvd@add@noval{#3}}\ekvd@tmp{}}%
- {\ekvletNoVal\ekvd@set{#3}\ekvd@tmp}%
- }%
- {\ekvd@err@undefined@key{#3}}%
- }%
- }
-\protected\def\ekvd@t@default{\ekvd@type@default{}{}}
-\protected\def\ekvd@t@qdefault{\ekvd@type@default{\expandafter\expandafter}{}}
-\let\ekvd@t@odefault\ekvd@t@qdefault
-\protected\def\ekvd@t@fdefault{\ekvd@type@default{}{\romannumeral`\^^@}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@t@edefault}
-% |edefault| is too different from |default| and |qdefault| to reuse the
-% |@type@| macro, as it doesn't need |\unexpanded| inside of |\edef|.
-% \begin{macrocode}
-\protected\long\def\ekvd@t@edefault#1#2%
- {%
- \ekvd@assert@arg
- {%
- \ekvifdefined\ekvd@set{#1}%
- {%
- \ekvd@assert@not@new
- \ekvd@assert@not@long
- \ekvd@prot\edef\ekvd@tmp
- {\csname\ekv@name\ekvd@set{#1}\endcsname{#2}}%
- \ekvd@ifalso
- {\ekv@exparg{\ekvd@add@noval{#1}}\ekvd@tmp{}}%
- {\ekvletNoVal\ekvd@set{#1}\ekvd@tmp}%
- }%
- {\ekvd@err@undefined@key{#1}}%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvd@t@initial,\ekvd@t@oinitial,\ekvd@t@finitial,\ekvd@t@einitial}
-% \begin{macrocode}
-\long\def\ekvd@type@initial#1#2#3#4%
- {%
- \ekvd@assert@not@new
- \ekvd@assert@not@also
- \ekvd@assert@not@long
- \ekvd@assert@not@protected
- \ekvd@ifnoarg
- {%
- \ekvifdefinedNoVal\ekvd@set{#3}%
- {\csname\ekv@name\ekvd@set{#3}N\endcsname}%
- {\ekvd@err@undefined@noval{#3}}%
- }%
- {%
- \ekvifdefined\ekvd@set{#3}%
- {%
- #1{#2#4}%
- \csname\ekv@name\ekvd@set{#3}\expandafter\endcsname\expandafter
- {\ekvd@tmp}%
- }%
- {\ekvd@err@undefined@key{#3}}%
- }%
- }
-\def\ekvd@t@initial{\ekvd@type@initial{\def\ekvd@tmp}{}}
-\def\ekvd@t@oinitial{\ekvd@type@initial{\ekv@exparg{\def\ekvd@tmp}}{}}
-\def\ekvd@t@einitial{\ekvd@type@initial{\edef\ekvd@tmp}{}}
-\def\ekvd@t@finitial
- {\ekvd@type@initial{\ekv@exparg{\def\ekvd@tmp}}{\romannumeral`\^^@}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@type@bool,\ekvd@t@bool,\ekvd@t@gbool,\ekvd@t@boolTF,\ekvd@t@gboolTF,
-% \ekvd@t@invbool,\ekvd@t@ginvbool,\ekvd@t@invboolTF,\ekvd@t@ginvboolTF,
-% }
-% The boolean types are a quicker version of a |choice| that accept |true| and
-% |false|, and set up the |NoVal| action to be identical to \texttt{\key=true}.
-% The |true| and |false| actions are always just |\let|ting the macro in |#7| to
-% some other macro (\emph{e.g.}, \cs[no-index]{iftrue}).
-% \begin{macrocode}
-\protected\def\ekvd@type@bool#1#2#3#4#5%
- {%
- \ekvd@ifnew{}{#4}%
- {%
- \ekvd@ifnew{NoVal}{#4}%
- {%
- \ekvd@assert@filledarg{#5}%
- {%
- \ekvd@newlet#5#3%
- \ekvd@type@choice{#4}%
- \protected\ekvdefNoVal\ekvd@set{#4}{#1\let#5#2}%
- \protected\expandafter\def
- \csname\ekvd@choice@name\ekvd@set{#4}{true}\endcsname
- {#1\let#5#2}%
- \protected\expandafter\def
- \csname\ekvd@choice@name\ekvd@set{#4}{false}\endcsname
- {#1\let#5#3}%
- }%
- }%
- }%
- }
-\protected\def\ekvd@t@bool{\ekvd@type@bool{}\iftrue\iffalse}
-\protected\def\ekvd@t@gbool{\ekvd@type@bool\global\iftrue\iffalse}
-\protected\def\ekvd@t@boolTF{\ekvd@type@bool{}\@firstoftwo\@secondoftwo}
-\protected\def\ekvd@t@gboolTF{\ekvd@type@bool\global\@firstoftwo\@secondoftwo}
-\protected\def\ekvd@t@invbool{\ekvd@type@bool{}\iffalse\iftrue}
-\protected\def\ekvd@t@ginvbool{\ekvd@type@bool\global\iffalse\iftrue}
-\protected\def\ekvd@t@invboolTF{\ekvd@type@bool{}\@secondoftwo\@firstoftwo}
-\protected\def\ekvd@t@ginvboolTF
- {\ekvd@type@bool\global\@secondoftwo\@firstoftwo}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@type@boolpair,
-% \ekvd@t@boolpair,\ekvd@t@gboolpair,\ekvd@t@boolpairTF,\ekvd@t@gboolpairTF
-% }
-% The boolean pair types are essentially the same as the boolean types, but set
-% two macros instead of one.
-% \begin{macrocode}
-\protected\def\ekvd@type@boolpair#1#2#3#4#5#6%
- {%
- \ekvd@ifnew{}{#4}%
- {%
- \ekvd@ifnew{NoVal}{#4}%
- {%
- \ekvd@newlet#5#3%
- \ekvd@newlet#6#2%
- \ekvd@type@choice{#4}%
- \protected\ekvdefNoVal\ekvd@set{#4}{#1\let#5#2#1\let#6#3}%
- \protected\expandafter\def
- \csname\ekvd@choice@name\ekvd@set{#4}{true}\endcsname
- {#1\let#5#2#1\let#6#3}%
- \protected\expandafter\def
- \csname\ekvd@choice@name\ekvd@set{#4}{false}\endcsname
- {#1\let#5#3#1\let#6#2}%
- }%
- }%
- }
-\protected\def\ekvd@t@boolpair#1#2%
- {\ekvd@assert@twoargs{#2}{\ekvd@type@boolpair{}\iftrue\iffalse{#1}#2}}
-\protected\def\ekvd@t@gboolpair#1#2%
- {\ekvd@assert@twoargs{#2}{\ekvd@type@boolpair\global\iftrue\iffalse{#1}#2}}
-\protected\def\ekvd@t@boolpairTF#1#2%
- {%
- \ekvd@assert@twoargs{#2}%
- {\ekvd@type@boolpair{}\@firstoftwo\@secondoftwo{#1}#2}%
- }
-\protected\def\ekvd@t@gboolpairTF#1#2%
- {%
- \ekvd@assert@twoargs{#2}%
- {\ekvd@type@boolpair\global\@firstoftwo\@secondoftwo{#1}#2}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@type@data,\ekvd@t@data,\ekvd@t@gdata,\ekvd@t@dataT,\ekvd@t@gdataT
-% }
-% \begin{macrocode}
-\protected\def\ekvd@type@data#1#2#3#4#5#6%
- {%
- \ekvd@ifnew{}{#5}%
- {%
- \ekvd@assert@filledarg{#6}%
- {%
- \ekvd@newlet#6#1%
- \ekvd@ifalso
- {%
- \let\ekvd@prot\protected
- \ekvd@add@val{#5}{\long#2#6####1#3{####1{#4}}}{}%
- }%
- {%
- \protected\ekvd@long\ekvdef\ekvd@set{#5}%
- {\long#2#6####1#3{####1{#4}}}%
- }%
- }%
- }%
- }
-\protected\def\ekvd@t@data
- {\ekvd@type@data\@secondoftwo\edef{####2}{\ekv@unexpanded{##1}}}
-\protected\def\ekvd@t@edata{\ekvd@type@data\@secondoftwo\edef{####2}{##1}}
-\protected\def\ekvd@t@gdata
- {\ekvd@type@data\@secondoftwo\xdef{####2}{\ekv@unexpanded{##1}}}
-\protected\def\ekvd@t@xdata{\ekvd@type@data\@secondoftwo\xdef{####2}{##1}}
-\protected\def\ekvd@t@dataT
- {\ekvd@type@data\@gobble\edef{}{\ekv@unexpanded{##1}}}
-\protected\def\ekvd@t@edataT{\ekvd@type@data\@gobble\edef{}{##1}}
-\protected\def\ekvd@t@gdataT
- {\ekvd@type@data\@gobble\xdef{}{\ekv@unexpanded{##1}}}
-\protected\def\ekvd@t@xdataT{\ekvd@type@data\@gobble\xdef{}{##1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@type@box,\ekvd@t@box,\ekvd@t@gbox}
-% Set up our boxes. Though we're a generic package we want to be colour safe, so
-% we put an additional grouping level inside the box contents, for the case that
-% someone uses \pkg{color}. |\ekvd@newreg| is a small wrapper which tests
-% whether the first argument is defined and if not does
-% |\csname new#2\endcsname#1|.
-% \begin{macrocode}
-\protected\def\ekvd@type@box#1#2#3%
- {%
- \ekvd@ifnew{}{#2}%
- {%
- \ekvd@assert@filledarg{#3}%
- {%
- \ekvd@newreg#3{box}%
- \ekvd@ifalso
- {%
- \let\ekvd@prot\protected
- \ekvd@add@val{#2}{#1\setbox#3=\hbox{\begingroup##1\endgroup}}{}%
- }%
- {%
- \protected\ekvd@long\ekvdef\ekvd@set{#2}%
- {#1\setbox#3=\hbox{\begingroup##1\endgroup}}%
- }%
- }%
- }%
- }
-\protected\def\ekvd@t@box{\ekvd@type@box{}}
-\protected\def\ekvd@t@gbox{\ekvd@type@box\global}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@type@toks,\ekvd@t@toks,\ekvd@t@gtoks}
-% Similar to |box|, but set the |toks|.
-% \begin{macrocode}
-\protected\def\ekvd@type@toks#1#2#3%
- {%
- \ekvd@ifnew{}{#2}%
- {%
- \ekvd@assert@filledarg{#3}%
- {%
- \ekvd@newreg#3{toks}%
- \ekvd@ifalso
- {%
- \let\ekvd@prot\protected
- \ekvd@add@val{#2}{#1#3={##1}}{}%
- }%
- {\protected\ekvd@long\ekvdef\ekvd@set{#2}{#1#3={##1}}}%
- }%
- }%
- }
-\protected\def\ekvd@t@toks{\ekvd@type@toks{}}
-\protected\def\ekvd@t@gtoks{\ekvd@type@toks\global}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@type@preapptoks,\ekvd@t@apptoks,\ekvd@t@gapptoks}
-% Just like |toks|, but expand the current contents of the |toks| register to
-% append the new contents.
-% \begin{macrocode}
-\ekvd@ifprimitive\toksapp
- {%
- \protected\def\ekvd@type@preapptoks#1#2#3%
- {%
- \ekvd@ifnew{}{#2}%
- {%
- \ekvd@assert@filledarg{#3}%
- {%
- \ekvd@newreg#3{toks}%
- \ekvd@ifalso
- {%
- \let\ekvd@prot\protected
- \ekvd@add@val{#2}{#1#3{##1}}{}%
- }%
- {\protected\ekvd@long\ekvdef\ekvd@set{#2}{#1#3{##1}}}%
- }%
- }%
- }
- \protected\def\ekvd@t@apptoks{\ekvd@type@preapptoks\toksapp}
- \protected\def\ekvd@t@gapptoks{\ekvd@type@preapptoks\gtoksapp}
- \protected\def\ekvd@t@pretoks{\ekvd@type@preapptoks\tokspre}
- \protected\def\ekvd@t@gpretoks{\ekvd@type@preapptoks\gtokspre}
- }
- {%
- \protected\def\ekvd@type@apptoks#1#2#3%
- {%
- \ekvd@ifnew{}{#2}%
- {%
- \ekvd@assert@filledarg{#3}%
- {%
- \ekvd@newreg#3{toks}%
- \ekvd@ifalso
- {%
- \let\ekvd@prot\protected
- \ekvd@add@val{#2}{#1#3=\expandafter{\the#3##1}}{}%
- }%
- {%
- \protected\ekvd@long\ekvdef\ekvd@set{#2}%
- {#1#3=\expandafter{\the#3##1}}%
- }%
- }%
- }%
- }
- \protected\def\ekvd@t@apptoks{\ekvd@type@apptoks{}}
- \protected\def\ekvd@t@gapptoks{\ekvd@type@apptoks\global}
- \newtoks\ekvd@toks
- \protected\def\ekvd@type@pretoks#1#2#3%
- {%
- \ekvd@ifnew{}{#2}%
- {%
- \ekvd@assert@filledarg{#3}%
- {%
- \ekvd@newreg#3{toks}%
- \ekvd@ifalso
- {%
- \let\ekvd@prot\protected
- \ekvd@add@val{#2}%
- {%
- \ekvd@toks={##1}%
- #1#3=\expandafter{\the\expandafter\ekvd@toks\the#3}%
- }%
- {}%
- }%
- {%
- \protected\ekvd@long\ekvdef\ekvd@set{#2}%
- {%
- \ekvd@toks={##1}%
- #1#3=\expandafter{\the\expandafter\ekvd@toks\the#3}%
- }%
- }%
- }%
- }%
- }
- \protected\def\ekvd@t@pretoks{\ekvd@type@pretoks{}}
- \protected\def\ekvd@t@gpretoks{\ekvd@type@pretoks\global}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@type@reg,\ekvd@t@int,\ekvd@t@eint,\ekvd@t@gint,\ekvd@t@xint,
-% \ekvd@t@dimen,\ekvd@t@edimen,\ekvd@t@gdimen,\ekvd@t@xdimen,
-% \ekvd@t@skip,\ekvd@t@eskip,\ekvd@t@gskip,\ekvd@t@xskip
-% }
-% The |\ekvd@type@reg| can handle all the types for which the assignment will
-% just be \texttt{\meta{register}=\meta{value}}.
-% \begin{macrocode}
-\protected\def\ekvd@type@reg#1#2#3#4#5#6%
- {%
- \ekvd@ifnew{}{#5}%
- {%
- \ekvd@assert@filledarg{#6}%
- {%
- \ekvd@newreg#6{#1}%
- \ekvd@ifalso
- {%
- \let\evkd@prot\protected
- \ekvd@add@val{#5}{#2#6=#3##1#4\relax}{}%
- }%
- {\protected\ekvd@long\ekvdef\ekvd@set{#5}{#2#6=#3##1#4\relax}}%
- }%
- }%
- }
-\protected\def\ekvd@t@int{\ekvd@type@reg{count}{}{}{}}
-\protected\def\ekvd@t@eint{\ekvd@type@reg{count}{}\numexpr\relax}
-\protected\def\ekvd@t@gint{\ekvd@type@reg{count}\global{}{}}
-\protected\def\ekvd@t@xint{\ekvd@type@reg{count}\global\numexpr\relax}
-\protected\def\ekvd@t@dimen{\ekvd@type@reg{dimen}{}{}{}}
-\protected\def\ekvd@t@edimen{\ekvd@type@reg{dimen}{}\dimexpr\relax}
-\protected\def\ekvd@t@gdimen{\ekvd@type@reg{dimen}\global{}{}}
-\protected\def\ekvd@t@xdimen{\ekvd@type@reg{dimen}\global\dimexpr\relax}
-\protected\def\ekvd@t@skip{\ekvd@type@reg{skip}{}{}{}}
-\protected\def\ekvd@t@eskip{\ekvd@type@reg{skip}{}\glueexpr\relax}
-\protected\def\ekvd@t@gskip{\ekvd@type@reg{skip}\global{}{}}
-\protected\def\ekvd@t@xskip{\ekvd@type@reg{skip}\global\glueexpr\relax}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@type@store,\ekvd@t@store,\ekvd@t@gstore}
-% The none-expanding |store| types use an |\edef| or |\xdef| and |\unexpanded|
-% to be able to also store |#| easily.
-% \begin{macrocode}
-\protected\def\ekvd@type@store#1#2#3#4%
- {%
- \ekvd@ifnew{}{#3}%
- {%
- \ekvd@assert@filledarg{#4}%
- {%
- \ekvd@newlet#4\ekv@empty
- \ekvd@ifalso
- {%
- \let\ekvd@prot\protected
- \ekvd@add@val{#3}{#1#4{#2}}{}%
- }%
- {\protected\ekvd@long\ekvdef\ekvd@set{#3}{#1#4{#2}}}%
- }%
- }%
- }
-\protected\def\ekvd@t@store{\ekvd@type@store\edef{\ekv@unexpanded{##1}}}
-\protected\def\ekvd@t@gstore{\ekvd@type@store\xdef{\ekv@unexpanded{##1}}}
-\protected\def\ekvd@t@estore{\ekvd@type@store\edef{##1}}
-\protected\def\ekvd@t@xstore{\ekvd@type@store\xdef{##1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@type@meta,\ekvd@type@meta@a,\ekvd@type@meta@b,\ekvd@type@meta@c,
-% \ekvd@t@meta,\ekvd@t@nmeta
-% }
-% |meta| sets up things such that another instance of |\ekvset| will be run on
-% the argument, with the same \set.
-% \begin{macrocode}
-\protected\long\def\ekvd@type@meta#1#2#3#4#5#6#7%
- {%
- \ekvd@ifnew{#1}{#6}%
- {%
- \ekvd@assert@filledarg{#7}%
- {%
- \edef\ekvd@tmp{\ekvd@set}%
- \expandafter\ekvd@type@meta@a\expandafter{\ekvd@tmp}{#7}{#2}%
- \ekvd@ifalso
- {\ekv@exparg{#3{#6}}{\ekvd@tmp#4}{#5}}%
- {\csname ekvlet#1\endcsname\ekvd@set{#6}\ekvd@tmp}%
- }%
- }%
- }
-\protected\long\def\ekvd@type@meta@a#1#2%
- {%
- \expandafter\ekvd@type@meta@b\expandafter{\ekvset{#1}{#2}}%
- }
-\protected\def\ekvd@type@meta@b
- {%
- \expandafter\ekvd@type@meta@c\expandafter
- }
-\protected\long\def\ekvd@type@meta@c#1#2%
- {%
- \ekvd@prot\ekvd@long\def\ekvd@tmp#2{#1}%
- }
-\protected\def\ekvd@t@meta{\ekvd@type@meta{}{##1}\ekvd@add@val{{##1}}{}}
-\protected\def\ekvd@t@nmeta
- {%
- \ekvd@assert@not@long
- \ekvd@type@meta{NoVal}{}\ekvd@add@noval{}\ekvd@assert@not@long@also
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvd@type@smeta,\ekvd@type@smeta@,\ekvd@t@smeta,\ekvd@t@snmeta}
-% |smeta| is pretty similar to |meta|, but needs two arguments inside of \val,
-% such that the first is the \set\ for which the sub-|\ekvset| and the second is
-% the \kv\ list.
-% \begin{macrocode}
-\protected\long\def\ekvd@type@smeta#1#2#3#4#5#6#7%
- {%
- \ekvd@ifnew{#1}{#6}%
- {%
- \ekvd@assert@twoargs{#7}%
- {%
- \ekvd@type@meta@a#7{#2}%
- \ekvd@ifalso
- {\ekv@exparg{#3{#6}}{\ekvd@tmp#4}{#5}}%
- {\csname ekvlet#1\endcsname\ekvd@set{#6}\ekvd@tmp}%
- }%
- }%
- }
-\protected\def\ekvd@t@smeta{\ekvd@type@smeta{}{##1}\ekvd@add@val{{##1}}{}}
-\protected\def\ekvd@t@snmeta
- {%
- \ekvd@assert@not@long
- \ekvd@type@smeta{NoVal}{}\ekvd@add@noval{}\ekvd@assert@not@long@also
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@type@choice,
-% \ekvd@populate@choice,\ekvd@populate@choice@,\ekvd@populate@choice@noarg,
-% \ekvd@choice@prefix,\ekvd@choice@prefix@,\ekvd@choice@prefix@done,
-% \ekvd@choice@p@protected,\ekvd@choice@p@protect,
-% \ekvd@choice@p@long,\ekvd@choice@p@long@,
-% \ekvd@t@choice
-% }
-% The |choice| type is by far the most complex type, as we have to run a
-% sub-parser on the choice-definition list, which should support the |@p@| type
-% prefixes as well (but |long| will always throw an error, as they are not
-% allowed to be long). |\ekvd@type@choice| will just define the choice-key, the
-% handling of the choices definition will be done by |\ekvd@populate@choice|.
-% \begin{macrocode}
-\protected\def\ekvd@type@choice#1%
- {%
- \ekvd@assert@not@long
- \ekv@expargtwice{\ekvd@prot\def\ekvd@tmp##1}%
- {%
- \expandafter\expandafter\expandafter
- \ekvd@h@choice
- \expandafter\expandafter\expandafter
- {\expandafter\ekvd@choice@name\expandafter{\ekvd@set}{#1}{##1}}%
- }%
- \ekvd@ifalso
- {%
- \ekvd@assert@val{#1}%
- {%
- \ekvd@if@not@already@choice{#1}%
- {%
- \ekv@exparg
- {%
- \expandafter\ekvd@add@aux
- \csname\ekv@name\ekvd@set{#1}\endcsname{{##1}}{#1}%
- }%
- {\ekvd@tmp{##1}}%
- {\ekvd@long\ekvdef}\ekvd@assert@not@long@also
- }%
- }%
- }%
- {\ekvlet\ekvd@set{#1}\ekvd@tmp}%
- }
-% \end{macrocode}
-% |\ekvd@populate@choice| just uses |\ekvparse| and then gives control to
-% |\ekvd@populate@choice@noarg|, which throws an error, and
-% |\ekvd@populate@choice@|.
-% \begin{macrocode}
-\protected\def\ekvd@populate@choice
- {%
- \ekvparse\ekvd@populate@choice@noarg\ekvd@populate@choice@
- }
-\protected\long\def\ekvd@populate@choice@noarg#1%
- {%
- \expandafter\ekvd@err@missing@definition@msg\expandafter{\ekvd@cur : #1}%
- }
-% \end{macrocode}
-% |\ekvd@populate@choice@| runs the prefix-test, if there is none we can
-% directly define the choice, for that |\ekvd@set@choice| will expand to the
-% current choice-key's name, which will have been defined by |\ekvd@t@choice|.
-% If there is a prefix run the prefix grabbing routine, which was altered for
-% |@type@choice|.
-% \begin{macrocode}
-\protected\long\def\ekvd@populate@choice@#1#2%
- {%
- \ekvd@clear@prefixes
- \ekvd@ifspace{#1}%
- {\ekvd@choice@prefix{\ekv@mark#1}\ekv@mark#1\ekv@stop}%
- {%
- \expandafter\edef
- \csname\ekvd@choice@name\ekvd@set\ekvd@set@choice{#1}\endcsname
- }%
- {\unexpanded{#2}}%
- }
-\protected\def\ekvd@choice@prefix#1#2
- {%
- \ekv@strip{#2}{\ekvd@choice@prefix@{#1}}\ekv@mark
- }
-\protected\def\ekvd@choice@prefix@#1#2#3\ekv@stop
- {%
- \ekv@ifdefined{ekvd@choice@p@#2}%
- {%
- \csname ekvd@choice@p@#2\endcsname
- \ekvd@ifspace{#3}%
- {\ekvd@choice@prefix{#3}#3\ekv@stop}%
- {\ekvd@choice@prefix@done{#3}}%
- }%
- {\ekvd@choice@prefix@done{#1}}%
- }
-\protected\def\ekvd@choice@prefix@done#1%
- {%
- \ekvd@prot\expandafter\edef
- \csname
- \ekv@strip{#1}{\ekvd@choice@name\ekvd@set\ekvd@set@choice}%
- \endcsname
- }
-\protected\def\ekvd@choice@p@protected{\let\ekvd@prot\protected}
-\let\ekvd@choice@p@protect\ekvd@choice@p@protected
-\protected\def\ekvd@choice@invalid@p#1\ekvd@ifspace#2%
- {%
- \expandafter\ekvd@choice@invalid@p@\expandafter{\ekv@gobble@mark#2}{#1}%
- \ekvd@ifspace{#2}%
- }
-\protected\def\ekvd@choice@invalid@p@#1#2%
- {%
- \expandafter\ekvd@err@no@prefix@msg\expandafter{\ekvd@cur : #2 #1}{#2}%
- }
-\protected\def\ekvd@choice@p@long{\ekvd@choice@invalid@p{long}}%
-\protected\def\ekvd@choice@p@also{\ekvd@choice@invalid@p{also}}%
-\protected\def\ekvd@choice@p@new{\ekvd@choice@invalid@p{new}}%
-% \end{macrocode}
-% Finally we're able to set up the |@t@choice| macro, which has to store the
-% current choice-key's name, define the key, and parse the available choices.
-% \begin{macrocode}
-\protected\long\def\ekvd@t@choice#1#2%
- {%
- \ekvd@ifnew{}{#1}%
- {%
- \ekvd@assert@arg
- {%
- \ekvd@type@choice{#1}%
- \def\ekvd@set@choice{#1}%
- \ekvd@populate@choice{#2}%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@t@choice-store,\ekvd@t@choice-enum}
-% These two types define a special kind of |choice| key and are quite similar,
-% the only difference is what the different choices do (hence they use a
-% shared initialisation which differs in the chosen |populate| step).
-% \begin{macrocode}
-\protected\long\expandafter\def\csname ekvd@t@choice-store\endcsname
- {\ekvd@type@choicespecial\ekvd@populate@choicestore}
-\protected\long\expandafter\def\csname ekvd@t@choice-enum\endcsname
- {\ekvd@type@choicespecial\ekvd@populate@choiceenum}
-% \end{macrocode}
-% \begin{macro}[internal]{\ekvd@type@choicespecial}
-% Initialise similar to a |choice| key. The difference is that we require two
-% arguments (which we assert), a macro to store things in, and a |csv|-list
-% containing the allowed values. |#1| is the |populate| macro according to the
-% type used.
-% \begin{macrocode}
-\protected\long\def\ekvd@type@choicespecial#1#2#3%
- {%
- \ekvd@ifnew{}{#2}%
- {%
- \ekvd@assert@twoargs{#3}%
- {%
- \ekvd@type@choice{#2}%
- \def\ekvd@set@choice{#2}%
- #1#3%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}[internal]
-% {\ekvd@populate@choicestore,\ekvd@populate@choicestore@}
-% We initialise the storing macro if it doesn't yet exist, and then we loop
-% over the value list. The |\edef|s with |\unexpanded| are both necessary to
-% be able to store macro parameter tokens (the outer protects at define time,
-% the inner at use time).
-% \begin{macrocode}
-\protected\long\def\ekvd@populate@choicestore#1%
- {%
- \ekvd@newlet#1\ekv@empty
- \ekvcsvloop{\ekvd@populate@choicestore@#1}%
- }
-\protected\long\def\ekvd@populate@choicestore@#1#2%
- {%
- \protected\expandafter\edef
- \csname\ekvd@choice@name\ekvd@set\ekvd@set@choice{#2}\endcsname
- {\unexpanded{\edef#1{\unexpanded{#2}}}}%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}[internal]
-% {\ekvd@populate@choiceenum,\ekvd@populate@choiceenum@}
-% This is similar to the population of a |choice-store| type, but instead of
-% storing the values in a macro this initialises a count and stores the
-% position of the value in the list inside that count (zero-indexed). The
-% space is necessary to terminate the number scanning, which is the reason we
-% use |\@firstofone| (so that the space after the macro name isn't gobbled by
-% \TeX).
-% \begin{macrocode}
-\protected\long\def\ekvd@populate@choiceenum#1%
- {%
- \ekvd@newreg#1{count}%
- \def\ekvd@tmp{0}%
- \ekvcsvloop{\ekvd@populate@choiceenum@#1}%
- }
-\protected\long\def\ekvd@populate@choiceenum@#1#2%
- {%
- \protected\expandafter\edef
- \csname\ekvd@choice@name\ekvd@set\ekvd@set@choice{#2}\endcsname
- {#1=\@firstofone{\ekvd@tmp} }%
- \edef\ekvd@tmp{\the\numexpr\ekvd@tmp+1\relax}%
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@t@unknown-choice}
-% \begin{macrocode}
-\protected\long\expandafter\def\csname ekvd@t@unknown-choice\endcsname#1#2%
- {%
- \ekvd@assert@new@for@name{\ekvd@unknown@choice@name\ekvd@set{#1}}%
- {%
- \ekvd@assert@arg
- {%
- \ekvd@assert@not@long
- \ekvd@assert@not@also
- \ekvd@prot\expandafter
- \def\csname\ekvd@unknown@choice@name\ekvd@set{#1}\endcsname##1{#2}%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvd@t@unknown,\ekvd@type@unknown@code,\ekvd@type@unknown@noval}
-% The |unknown| type has different subtypes which would be the key names for
-% other types. It is first checked whether that subtype is defined, if it
-% isn't throw an error, else use that subtype.
-% \begin{macrocode}
-\protected\long\def\ekvd@t@unknown#1#2%
- {%
- \ekv@ifdefined{ekvd@type@unknown@\detokenize{#1}}%
- {\csname ekvd@type@unknown@\detokenize{#1}\endcsname{#2}}%
- \ekvd@err@misused@unknown
- }
-% \end{macrocode}
-% The |unknown noval| type can use |\ekvdefunknownNoVal| directly (after
-% asserting some prefixes).
-% \begin{macrocode}
-\protected\long\def\ekvd@type@unknown@noval#1%
- {%
- \ekvd@assert@new@for@name{\ekv@name\ekvd@set{}uN}%
- {%
- \ekvd@assert@arg
- {%
- \ekvd@assert@not@also
- \ekvd@assert@not@long
- \ekvd@prot\ekvdefunknownNoVal\ekvd@set{#1}%
- }%
- }%
- }
-% \end{macrocode}
-% The |unknown code| type uses some trickery during the definition in order to
-% swap out |#1| and |#2| in the user supplied definition. This is done via a
-% temporary macro that stores the definition but gets the parameter numbers
-% reversed while the real definition is done.
-% \begin{macrocode}
-\protected\long\def\ekvd@type@unknown@code#1%
- {%
- \ekvd@assert@new@for@name{\ekv@name\ekvd@set{}u}%
- {%
- \ekvd@assert@arg
- {%
- \ekvd@assert@not@also
- \begingroup
- \def\ekvd@tmp##1##2{#1}%
- \ekv@exparg
- {%
- \endgroup
- \ekvd@prot\ekvd@long\ekvdefunknown\ekvd@set
- }%
- {\ekvd@tmp{##2}{##1}}%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@type@unknown@redirect,
-% \ekvd@type@unknown@redirect-code,
-% \ekvd@type@unknown@redirect-noval
-% }
-% The |unknown redirect| types also just forward to |\ekvredirectunknown|
-% after asserting some prefixes.
-% \begin{macrocode}
-\protected\edef\ekvd@type@unknown@redirect#1%
- {%
- \expandafter\noexpand\csname ekvd@type@unknown@redirect-code\endcsname{#1}%
- \expandafter\noexpand\csname ekvd@type@unknown@redirect-noval\endcsname{#1}%
- }
-\protected\expandafter\def\csname ekvd@type@unknown@redirect-code\endcsname#1%
- {%
- \ekvd@assert@new@for@name{\ekv@name\ekvd@set{}u}%
- {%
- \ekvd@assert@arg
- {%
- \ekvd@assert@not@also
- \ekvd@assert@not@protected
- \expandafter\ekvredirectunknown\expandafter{\ekvd@set}{#1}%
- }%
- }%
- }
-\protected\expandafter\def\csname ekvd@type@unknown@redirect-noval\endcsname#1%
- {%
- \ekvd@assert@new@for@name{\ekv@name\ekvd@set{}uN}%
- {%
- \ekvd@assert@arg
- {%
- \ekvd@assert@not@also
- \ekvd@assert@not@protected
- \ekvd@assert@not@long
- \expandafter\ekvredirectunknownNoVal\expandafter{\ekvd@set}{#1}%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Key Type Helpers}
-% There are some keys that might need helpers during their execution (not during
-% their definition, which are gathered as |@type@| macros). These helpers are
-% named |@h@|.
-%
-% \begin{macro}[internal]{\ekvd@h@choice,\ekvd@h@choice@}
-% The |choice| helper will just test whether the given choice was defined, if
-% not throw an error expandably, else call the macro which stores the code for
-% this choice.
-% \begin{macrocode}
-\def\ekvd@h@choice#1%
- {%
- \expandafter\ekvd@h@choice@
- \csname\ifcsname#1\endcsname#1\else relax\fi\endcsname
- {#1}%
- }
-\def\ekvd@h@choice@#1#2%
- {%
- \ifx#1\relax
- \ekvd@err@choice@invalid{#2}%
- \expandafter\@gobble
- \fi
- #1%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Handling \texttt{also}}
-%
-% \begin{macro}[internal]
-% {\ekvd@add@val,\ekvd@add@noval,\ekvd@add@aux,\ekvd@add@aux@}
-% \begin{macrocode}
-\protected\long\def\ekvd@add@val#1#2#3%
- {%
- \ekvd@assert@val{#1}%
- {%
- \expandafter\ekvd@add@aux\csname\ekv@name\ekvd@set{#1}\endcsname{{##1}}%
- {#1}{#2}{\ekvd@long\ekvdef}{#3}%
- }%
- }
-\protected\long\def\ekvd@add@noval#1#2#3%
- {%
- \ekvd@assert@noval{#1}%
- {%
- \expandafter\ekvd@add@aux\csname\ekv@name\ekvd@set{#1}N\endcsname{}%
- {#1}{#2}\ekvdefNoVal{#3}%
- }%
- }
-\protected\long\def\ekvd@add@aux#1#2%
- {%
- \ekvd@extract@prefixes#1%
- \expandafter\ekvd@add@aux@\expandafter{#1#2}%
- }
-\protected\long\def\ekvd@add@aux@#1#2#3#4#5%
- {%
- #5%
- \ekvd@prot#4\ekvd@set{#2}{#1#3}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@extract@prefixes,\ekvd@extract@prefixes@,
-% \ekvd@extract@prefixes@long,\ekvd@extract@prefixes@prot
-% }
-% This macro checks which prefixes were used for the definition of a macro and
-% sets |\ekvd@long| and |\ekvd@prot| accordingly.
-% \begin{macrocode}
-\protected\def\ekvd@extract@prefixes#1%
- {%
- \expandafter\ekvd@extract@prefixes@\meaning#1\ekvd@stop
- }
-% \end{macrocode}
-% In the following definition |#1| will get replaced by |macro:|, |#2| by
-% |\long| and |#3| by |\protected| (in each, all tokens will have category
-% other). This allows us to parse the |\meaning| of a macro for those strings.
-% \begin{macrocode}
-\protected\def\ekvd@extract@prefixes@#1#2#3%
- {%
- \protected\def\ekvd@extract@prefixes@##1#1##2\ekvd@stop
- {%
- \ekvd@extract@prefixes@long
- ##1\ekvd@mark\@firstofone#2\ekvd@mark\@gobble\ekvd@stop
- {\let\ekvd@long\long}%
- \ekvd@extract@prefixes@prot
- ##1\ekvd@mark\@firstofone#3\ekvd@mark\@gobble\ekvd@stop
- {\let\ekvd@prot\protected}%
- }%
- \protected\def\ekvd@extract@prefixes@long##1#2##2\ekvd@mark##3##4\ekvd@stop
- {##3}%
- \protected\def\ekvd@extract@prefixes@prot##1#3##2\ekvd@mark##3##4\ekvd@stop
- {##3}%
- }
-% \end{macrocode}
-% We use a temporary macro to expand the three arguments of
-% |\ekvd@extract@prefixes@|, which will set up the real meaning of itself and
-% the parsing for |\long| and |\protected|.
-% \begin{macrocode}
-\begingroup
-\edef\ekvd@tmp
- {%
- \endgroup
- \ekvd@extract@prefixes@
- {\detokenize{macro:}}%
- {\string\long}%
- {\string\protected}%
- }
-\ekvd@tmp
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Tests}
-%
-% \begin{macro}[internal]{\ekvd@newlet,\ekvd@newreg}
-% These macros test whether a control sequence is defined, if it isn't they
-% define it, either via |\let| or via the correct \cs[no-index]{new\meta{reg}}.
-% \begin{macrocode}
-\protected\def\ekvd@newlet#1#2%
- {%
- \ifdefined#1\ekv@fi@gobble\fi\@firstofone{\let#1#2}%
- }
-\protected\def\ekvd@newreg#1#2%
- {%
- \ifdefined#1\ekv@fi@gobble\fi\@firstofone{\csname new#2\endcsname#1}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekvd@assert@twoargs,\ekvd@ifnottwoargs,\ekvd@ifempty@gtwo}
-% A test for exactly two tokens can be reduced for an empty-test after gobbling
-% two tokens, in the case that there are fewer tokens than two in the argument,
-% only macros will be gobbled that are needed for the true branch, which doesn't
-% hurt, and if there are more this will not be empty.
-% \begin{macrocode}
-\long\def\ekvd@assert@twoargs#1%
- {%
- \ekvd@ifnottwoargs{#1}{\ekvd@err@missing@definition}%
- }
-\long\def\ekvd@ifnottwoargs#1%
- {%
- \ekvd@ifempty@gtwo#1\ekv@ifempty@B
- \ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- }
-\long\def\ekvd@ifempty@gtwo#1#2{\ekv@ifempty@\ekv@ifempty@A}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@assert@val,\ekvd@assert@val@,\ekvd@assert@noval,\ekvd@assert@noval@,
-% \ekvd@extract@args,\ekvd@extracted@args,\ekvd@one@arg@string
-% }
-% Assert that a given key is defined as a value taking key or a |NoVal| key with
-% the correct argument structure, respectively.
-% \begin{macrocode}
-\protected\def\ekvd@assert@val#1%
- {%
- \ekvifdefined\ekvd@set{#1}%
- {\expandafter\ekvd@assert@val@\csname\ekv@name\ekvd@set{#1}\endcsname}%
- {%
- \ekvifdefinedNoVal\ekvd@set{#1}%
- \ekvd@err@add@val@on@noval
- {\ekvd@err@undefined@key{#1}}%
- \@gobble
- }%
- }
-\protected\def\ekvd@assert@val@#1%
- {%
- \expandafter\ekvd@extract@args\meaning#1\ekvd@stop
- \unless\ifx\ekvd@extracted@args\ekvd@one@arg@string
- \ekvd@err@unsupported@arg
- \fi
- \@firstofone
- }%
-\protected\def\ekvd@assert@noval#1%
- {%
- \ekvifdefinedNoVal\ekvd@set{#1}%
- {\expandafter\ekvd@assert@noval@\csname\ekv@name\ekvd@set{#1}N\endcsname}%
- {%
- \ekvifdefined\ekvd@set{#1}%
- \ekvd@err@add@noval@on@val
- {\ekvd@err@undefined@key{#1}}%
- \@gobble
- }%
- }
-\protected\def\ekvd@assert@noval@#1%
- {%
- \expandafter\ekvd@extract@args\meaning#1\ekvd@stop
- \unless\ifx\ekvd@extracted@args\ekv@empty
- \ekvd@err@unsupported@arg
- \fi
- \@firstofone
- }
-\protected\def\ekvd@extract@args#1%
- {%
- \protected\def\ekvd@extract@args##1#1##2->##3\ekvd@stop
- {\def\ekvd@extracted@args{##2}}%
- }
-\expandafter\ekvd@extract@args\expandafter{\detokenize{macro:}}
-\edef\ekvd@one@arg@string{\string#1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@assert@arg,\ekvd@assert@arg@msg,\ekvd@ifnoarg}
-% There is no need to actually define |\ekvd@ifnoarg| here, as it will be set by
-% either |\ekvd@arg| or |\ekvd@noarg|.
-% \begin{macrocode}
-\def\ekvd@assert@arg{\ekvd@ifnoarg\ekvd@err@missing@definition}
-\long\def\ekvd@assert@arg@msg#1%
- {%
- \ekvd@ifnoarg{\ekvd@err@missing@definition@msg{#1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@assert@filledarg,\ekvd@ifnoarg@or@empty}
-% \begin{macrocode}
-\long\def\ekvd@assert@filledarg#1%
- {%
- \ekvd@ifnoarg@or@empty{#1}\ekvd@err@missing@definition
- }
-\long\def\ekvd@ifnoarg@or@empty#1%
- {%
- \ekvd@ifnoarg
- \@firstoftwo
- {\ekv@ifempty{#1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@assert@not@long,\ekvd@assert@not@protected,\ekvd@assert@not@also
-% \ekvd@assert@not@long@also,\ekvd@assert@not@protected@also,
-% \ekvd@assert@new,\ekvd@assert@not@new
-% }
-% Some key-types don't want to be |also|, |\long| or |\protected|, so we provide
-% macros to test this and throw an error, this could be silently ignored but now
-% users will learn to not use unnecessary stuff which slows the compilation
-% down.
-% \begin{macrocode}
-\def\ekvd@assert@not@long{\ifx\ekvd@long\long\ekvd@err@no@prefix{long}\fi}
-\def\ekvd@assert@not@protected
- {\ifx\ekvd@prot\protected\ekvd@err@no@prefix{protected}\fi}
-\def\ekvd@assert@not@also{\ekvd@ifalso{\ekvd@err@no@prefix{also}}{}}
-\def\ekvd@assert@not@long@also
- {\ifx\ekvd@long\long\ekvd@err@no@prefix@also{long}\fi}
-\def\ekvd@assert@not@protected@also
- {\ifx\ekvd@prot\protected\ekvd@err@no@prefix@also{protected}\fi}
-\def\ekvd@assert@new#1#2%
- {\csname ekvifdefined#1\endcsname\ekvd@set{#2}{\ekvd@err@not@new}}
-\def\ekvd@assert@not@new
- {\ifx\ekvd@ifnew\ekvd@assert@new\ekvd@err@no@prefix{new}\fi}
-\def\ekvd@assert@new@for@name#1%
- {%
- \ifx\ekvd@ifnew\ekvd@assert@new
- \ekv@fi@firstoftwo
- \fi
- \@secondoftwo
- {\ekv@ifdefined{#1}\ekvd@err@not@new}%
- \@firstofone
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@if@not@already@choice, \ekvd@if@not@already@choice@a,
-% \ekvd@if@not@already@choice@b
-% }
-% It is bad to use |also| on a key that already contains a |choice|, as both
-% choices would share the same valid values and thus lead to each callback being
-% used twice. The following is a rudimentary test against this.
-% \begin{macrocode}
-\protected\def\ekvd@if@not@already@choice#1%
- {%
- \expandafter\ekvd@if@not@already@choice@a
- \csname\ekv@name\ekvd@set{#1}\endcsname
- {}\ekvd@h@choice\ekvd@stop
- }
-\protected\def\ekvd@if@not@already@choice@a
- {%
- \expandafter\ekvd@if@not@already@choice@b
- }
-\long\protected\def\ekvd@if@not@already@choice@b#1\ekvd@h@choice#2\ekvd@stop
- {%
- \ekv@ifempty{#2}\@firstofone\@gobble
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@ifspace,\ekvd@ifspace@}
-% Yet another test which can be reduced to an if-empty, this time by gobbling
-% everything up to the first space.
-% \begin{macrocode}
-\long\def\ekvd@ifspace#1%
- {%
- \ekvd@ifspace@#1 \ekv@ifempty@B
- \ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- }
-\long\def\ekvd@ifspace@#1 % keep this space
- {%
- \ekv@ifempty@\ekv@ifempty@A
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Messages}
-%
-% Most messages of \expkvd\ are not expandable, since they only appear during
-% key-definition, which is not expandable anyway.
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@errm,\ekvd@err@missing@definition,\ekvd@err@missing@definition@msg,
-% \ekvd@err@missing@type,\ekvd@err@undefined@prefix,\ekvd@err@undefined@key,
-% \ekvd@err@no@prefix,\ekvd@err@no@prefix@msg,\ekvd@err@no@prefix@also,
-% \ekvd@err@add@val@on@noval,\ekvd@err@add@noval@on@val,
-% \ekvd@err@unsupported@arg,\ekvd@err@not@new
-% }
-% The non-expandable error messages are boring, so here they are:
-% \begin{macrocode}
-\protected\def\ekvd@errm#1{\errmessage{expkv-def Error: #1}}
-\protected\def\ekvd@err@missing@definition
- {\ekvd@errm{Missing definition for key `\ekvd@cur'}}
-\protected\def\ekvd@err@missing@definition@msg#1%
- {\ekvd@errm{Missing definition for key `\ekv@unexpanded{#1}'}}
-\protected\def\ekvd@err@missing@type
- {\ekvd@errm{Missing type prefix for key `\ekvd@cur'}}
-\protected\def\ekvd@err@undefined@prefix#1%
- {%
- \ekvd@errm
- {%
- Undefined prefix `\ekv@unexpanded{#1}' found while processing
- `\ekvd@cur'%
- }%
- }
-\protected\def\ekvd@err@undefined@key#1%
- {%
- \ekvd@errm
- {Undefined key `\ekv@unexpanded{#1}' found while processing `\ekvd@cur'}%
- }
-\protected\def\ekvd@err@undefined@noval#1%
- {%
- \ekvd@errm
- {%
- Undefined noval key `\unexpanded{#1}' found while processing
- `\ekvd@cur'%
- }%
- }
-\protected\def\ekvd@err@no@prefix#1%
- {\ekvd@errm{prefix `#1' not accepted in `\ekvd@cur'}}
-\protected\def\ekvd@err@no@prefix@msg#1#2%
- {\ekvd@errm{prefix `#2' not accepted in `\ekv@unexpanded{#1}'}}
-\protected\def\ekvd@err@no@prefix@also#1%
- {\ekvd@errm{`\ekvd@cur' not allowed with a `#1' key}}
-\protected\def\ekvd@err@add@val@on@noval
- {\ekvd@errm{`\ekvd@cur' not allowed with a NoVal key}}
-\protected\def\ekvd@err@add@noval@on@val
- {\ekvd@errm{`\ekvd@cur' not allowed with a value taking key}}
-\protected\def\ekvd@err@unsupported@arg\fi\@firstofone#1%
- {%
- \fi
- \ekvd@errm
- {%
- Existing key-macro has the unsupported argument string
- `\ekvd@extracted@args' for key `\ekvd@cur'%
- }%
- }
-\protected\def\ekvd@err@not@new
- {\ekvd@errm{The key for `\ekvd@cur' is already defined}}
-\protected\long\def\ekvd@err@misused@unknown
- {\ekvd@errm{Misuse of the unknown type found while processing `\ekvd@cur'}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvd@err@choice@invalid,\ekvd@err@choice@invalid@,\ekvd@choice@name,
-% \ekvd@unknown@choice@name
-% }
-% |\ekvd@err@choice@invalid| will have to use this mechanism to throw its
-% message. Also we have to retrieve the name parts of the choice in an easy way,
-% so we use parentheses of catcode 8 here, which should suffice in most cases to
-% allow for a correct separation.
-% \begin{macrocode}
-\def\ekvd@err@choice@invalid#1%
- {%
- \ekvd@err@choice@invalid@#1%
- }
-\begingroup
-\catcode40=8
-\catcode41=8
-\@firstofone{\endgroup
-\def\ekvd@choice@name#1#2#3%
- {%
- ekvd#1(#2)\detokenize{#3}%
- }
-\def\ekvd@unknown@choice@name#1#2%
- {%
- ekvd:u:#1(#2)%
- }
-\def\ekvd@err@choice@invalid@ ekvd#1(#2)\detokenize#3%
- {%
- \ekv@ifdefined{\ekvd@unknown@choice@name{#1}{#2}}%
- {\csname\ekvd@unknown@choice@name{#1}{#2}\endcsname{#3}}%
- {\ekvd@err{invalid choice `#3' for `#2' in set `#1'}}%
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@err}
-% The expandable error messages use |\ekvd@err|, which is just like |\ekv@err|
-% from \expkv. It uses a runaway argument to start the error message.
-% \begin{macrocode}
-\ekv@exparg{\long\def\ekvd@err#1}{\ekverr{expkv-def}{#1}}
-% \end{macrocode}
-% \end{macro}
-%
-% Now everything that's left is to reset the category code of |@|.
-% \begin{macrocode}
-\catcode`\@=\ekvd@tmp
-% \end{macrocode}
-%
-% \gobbledocstriptag
-%</tex>
-%^^A=<<
-%
-%^^A=<<
-%
-% \end{implementation}^^A=<<
-%
-% \clearpage
-% \PrintIndex
-%
-\endinput
-%
-^^A vim: ft=tex fdm=marker fmr=>>=,=<<
diff --git a/obsolete/macros/generic/expkv-def/expkv-def.pdf b/obsolete/macros/generic/expkv-def/expkv-def.pdf
deleted file mode 100644
index ea5678d280..0000000000
--- a/obsolete/macros/generic/expkv-def/expkv-def.pdf
+++ /dev/null
Binary files differ
diff --git a/obsolete/macros/generic/expkv-opt/README.md b/obsolete/macros/generic/expkv-opt/README.md
deleted file mode 100644
index 447c4a87da..0000000000
--- a/obsolete/macros/generic/expkv-opt/README.md
+++ /dev/null
@@ -1,29 +0,0 @@
--------------------------------------------------------------------------------
-# expkv-opt -- parse class and package options with expkv
-
-Version 2021-04-04 v0.2
-
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-
-Hosted at https://github.com/Skillmon/tex_expkv-opt
-
--------------------------------------------------------------------------------
-
-Copyright (C) 2020 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
--------------------------------------------------------------------------------
-
-This package allows to parse key=val options for LaTeX classes and packages
-using [`expkv`](https://github.com/Skillmon/tex_expkv). It handles global and
-local options completely separately. The only required package is `expkv`.
diff --git a/obsolete/macros/generic/expkv-opt/expkv-opt-2020-10-10.dtx b/obsolete/macros/generic/expkv-opt/expkv-opt-2020-10-10.dtx
deleted file mode 100644
index ab2dcec41a..0000000000
--- a/obsolete/macros/generic/expkv-opt/expkv-opt-2020-10-10.dtx
+++ /dev/null
@@ -1,938 +0,0 @@
-% \iffalse meta-comment
-%
-% File: expkv-opt.dtx Copyright (C) 2020 Jonathan P. Spratte
-%
-% This work may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% ------------------------------------------------------------------------------
-%
-%<*driver>^^A>>=
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-\input l3docstrip.tex
-\askforoverwritefalse
-\preamble
-
---------------------------------------------------------------
-expkv-opt -- parse class and package options with expkv
-E-mail: jspratte@yahoo.de
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
---------------------------------------------------------------
-
-Copyright (C) 2020 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
-This work consists of the file expkv-opt.dtx
-and the derived files expkv-opt.pdf
- expkv-opt.sty
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-\generate{\file{expkv-opt-2020-10-10.sty}{\from{expkv-opt-2020-10-10.dtx}{pkg}}}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%
-\IfFileExists{expkv-opt.sty}{\RequirePackage{expkv-opt}}{}
-\ProvidesFile{expkv-opt.dtx}
- [\csname ekvoDate\endcsname\ parse class and package options with expkv]
-\PassOptionsToPackage{full}{textcomp}
-\documentclass{l3doc}
-\RequirePackage[oldstylenums,nott]{kpfonts}
-\input{glyphtounicode}
-\pdfgentounicode=1
-\RequirePackage{listings}
-\RequirePackage{booktabs}
-\RequirePackage{array}
-\RequirePackage{collcell}
-\RequirePackage{siunitx}
-\RequirePackage{xcolor}
-\RequirePackage{caption}
-\RequirePackage{microtype}
-\RequirePackage{accsupp}
-\lstset
- {
- ,flexiblecolumns=false
- ,basewidth=.53em
- ,gobble=2
- ,basicstyle=\fontfamily{jkp}\itshape
- ,morekeywords=^^A
- {^^A
- \ekvoProcessLocalOptions,
- \ekvoProcessGlobalOptions,
- \ekvoProcessUnusedGlobalOptions,
- \ekvoProcessOptionsList,
- \ekvoUseUnknownHandlers
- }
- ,morecomment=[l]\%
- ,commentstyle=\color[gray]{0.4}
- ,literate={\{}{{\CodeSymbol\{}}{1}
- {\}}{{\CodeSymbol\}}}{1}
- ^^A,literate=*{<key>}{\key}{4}{<set>}{\set}{4}
- }
-\newcommand*\CodeSymbol[1]{\textbf{#1}}
-\RequirePackage{randtext}
-\let\metaORIG\meta
-\protected\def\meta #1{\texttt{\metaORIG{#1}}}
-\renewcommand*\thefootnote{\fnsymbol{footnote}}
-\definecolor{expkvred}{HTML}{9F393D}
-\colorlet{expkvgrey}{black!75}
-\makeatletter
-\newcommand*\expkv
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv}^^A
- \href{https://github.com/Skillmon/tex_expkv}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv}^^A
- }
-\newcommand*\expkvpkg[1]
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv-#1}^^A
- \href{https://github.com/Skillmon/tex_expkv-#1}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- {\color{expkvgrey}^^A
- \kern.05em\rule[-.1ex]{.08em}{1.2ex}\kern.05em\textsc{#1}^^A
- }^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv-#1}^^A
- }
-\newcommand*\expkvd{\expkvpkg{def}}
-\newcommand*\expkvc{\expkvpkg{cs}}
-\newcommand*\expkvo{\expkvpkg{opt}}
-\newcommand\kv{\meta{key}=\meta{value}}
-\newcommand\key{\meta{key}}
-\newcommand\val{\meta{value}}
-\newcommand\set{\meta{set}}
-\newcommand\enfprot{\textcolor{black}{protected}}
-\newcommand\allprot{\textcolor{gray}{protected}}
-\newcommand\notprot{\textcolor{red!80!black}{protected}}
-\newcommand\enflong{\textcolor{black}{long}}
-\newcommand\alllong{\textcolor{gray}{long}}
-\newcommand\notlong{\textcolor{red!80!black}{long}}
-\newcommand\prefixes[2]
- {^^A
- \hfill
- \ifcase\numexpr#1\relax\or
- \enfprot\or
- \allprot\or
- \notprot\fi\space
- \ifcase\numexpr#2\relax\or
- \enflong\or
- \alllong\or
- \notlong\fi
- }
-\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
-\DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
-\DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long}
-\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
-\DoNotIndex{\@,\unexpanded,\string,\expanded,\dimexpr,\global,\glueexpr,\hbox}
-\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef,\@firstofone}
-\DoNotIndex{\@firstoftwo,\@gobble,\@secondoftwo,\AtEndOfPackage,\newcommand}
-\DoNotIndex{\PackageError,\@classoptionslist,\@clsextension,\@currext}
-\DoNotIndex{\@currname,\@empty,\@gobbletwo,\@onlypreamble,\@unprocessedoptions}
-\DoNotIndex{\@unusedoptionlist}
-\DoNotIndex{\ifcsname}
-\DoNotIndex{\ifx}
-\DoNotIndex{\ifdefined}
-\DoNotIndex{\iffalse}
-\DoNotIndex{\iftrue}
-\DoNotIndex{\else}
-\DoNotIndex{\fi}
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}}
-\makeatother
-\begin{document}
- \title
- {^^A
- \texorpdfstring
- {^^A
- \huge\expkvo
- \\[\medskipamount]
- \Large parse class and package options with \expkv
- }{expkv-opt - parse class and package options with expkv}^^A
- }
- \date{\ekvoDate\space v\ekvoVersion}
- \author{Jonathan P. Spratte\thanks{\protect\randomize{jspratte@yahoo.de}}}
- \DocInput{expkv-opt.dtx}
-\end{document}
-%</driver>^^A=<<
-% \fi
-%
-% \maketitle
-% \renewcommand*\thefootnote{\arabic{footnote}}
-%
-% \begin{abstract}
-% \noindent\parfillskip=0pt
-% \expkvo\ provides option parsing for classes and packages in \LaTeXe\ based on
-% \expkv. Global and local options are parsed individually by different
-% commands. The stylised name is \expkvo\ but the files use \file{expkv-opt},
-% this is due to CTAN-rules which don't allow \string| in package names since
-% that is the pipe symbol in *nix shells.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \begin{documentation}^^A>>=
-%
-% \section{Documentation}
-%
-% The \expkv\ family provides at its core a \kv\ parser and additionally
-% packages, one to conveniently define new keys (\expkvd) and another to build
-% expandable \kv\ taking control sequences (\expkvc). Still missing from the mix
-% was a solution to parse \LaTeXe\ class and package options, a gap that's
-% hereby filled with \expkvo.
-%
-% \expkvo\ shouldn't place any restrictions on the keys, but note that parts of
-% \LaTeXe\ can break if the \kv\ list contains braces. This includes the global
-% options list depending on which class you're using. Also keep in mind that
-% every value provided should be save from an |\edef| expansion, as the space
-% stripping code of \LaTeXe\ options (which is applied before \expkvo\ takes
-% control) uses such an expansion.
-%
-% The package can be loaded with
-% \begin{lstlisting}
-% \usepackage{expkv-opt}
-% \end{lstlisting}
-% Unlike the other packages in the \expkv\ family, \expkvo\ is only provided as
-% a \LaTeX\ package.
-%
-% Before reading this documentation you should read \expkv's documentation and
-% might want to also read the documentation of \expkvd.
-%
-%
-% \subsection{Macros}
-%
-% \expkvo's behaviour if it encounters a defined or an undefined \key\ depends
-% on which list is being parsed and whether the current file is a class or not.
-% Of course in every case a defined \key's callback will be invoked but an
-% additional action might be executed. For this reason the rule set of every
-% macro will be given below the short description which list it will parse.
-%
-% During each of the processing macros the current list element (not separated
-% in \key\ and \val\ but as a whole) is stored within the macro
-% \cs{CurrentOption}.
-%
-% \begin{function}{\ekvoProcessLocalOptions}
-% \begin{syntax}
-% \cs{ekvoProcessLocalOptions}\marg{set}
-% \end{syntax}
-% This parses the options which are directly passed to the current class or
-% package for an \expkv\ \set.
-% \end{function}
-% \begin{description}
-% \item[Class:]
-% \begin{description}
-% \item[defined] \emph{nothing}
-% \item[undefined]
-% add the key to the list of unused global options (if the local option
-% list matches the option list of the main class)
-% \end{description}
-% \item[Package:]
-% \begin{description}
-% \item[defined] \emph{nothing}
-% \item[undefined] throw an error
-% \end{description}
-% \end{description}
-%
-% \begin{function}{\ekvoProcessGlobalOptions}
-% \begin{syntax}
-% \cs{ekvoProcessGlobalOptions}\marg{set}
-% \end{syntax}
-% In \LaTeXe\ the options given to |\documentclass| are global options. This
-% macro processes the global options for an \expkv\ \set.
-% \end{function}
-% \begin{description}
-% \item[Class:]
-% \begin{description}
-% \item[defined] remove the option from the list of unused global options
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \item[Package:]
-% \begin{description}
-% \item[defined] remove the option from the list of unused global options
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \end{description}
-%
-% \begin{function}{\ekvoProcessUnusedGlobalOptions}
-% \begin{syntax}
-% \cs{ekvoProcessUnusedGlobalOptions}\marg{set}
-% \end{syntax}
-% If you want to, instead of parsing all global options, you can parse only
-% those global options which weren't yet used by another package or class.
-% \end{function}
-% \begin{description}
-% \item[Class:]
-% \begin{description}
-% \item[defined] remove the option from the list of unused global options
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \item[Package:]
-% \begin{description}
-% \item[defined] remove the option from the list of unused global options
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \end{description}
-%
-% \begin{function}{\ekvoProcessOptionsList}
-% \begin{syntax}
-% \cs{ekvoProcessOptionsList}\meta{list}\marg{set}
-% \end{syntax}
-% Process the \kv\ list stored in the macro \meta{list}.
-% \end{function}
-% \begin{description}
-% \item[Class:]
-% \begin{description}
-% \item[defined] \emph{nothing}
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \item[Package:]
-% \begin{description}
-% \item[defined] \emph{nothing}
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \end{description}
-%
-% \begin{function}{\ekvoUseUnknownHandlers}
-% \begin{syntax}
-% \cs{ekvoUseUnknownHandlers}\meta{cs_1}\meta{cs_2}
-% \end{syntax}
-% With this macro you can change the action \expkvo\ executes if it encounters
-% an undefined \key\ for the next (and only the next) list processing macro.
-% The macro \meta{cs_1} will be called if an undefined \key\ without a \val\
-% is encountered and get one argument, being the \key. Analogous the macro
-% \meta{cs_2} will be called if an undefined \key\ with a \val\ was specified.
-% It will get two arguments, the first being the \key\ and the second the
-% \val.
-% \end{function}
-%
-% \begin{function}{\ekvoVersion,\ekvoDate}
-% These two macros store the version and date of the package.
-% \end{function}
-%
-%
-% \subsection{Example}
-%
-% Let's say we want to create a package that changes the way footnotes are
-% displayed in \LaTeX. For this it will essentially just redefine
-% \cs[no-index]{thefootnote} and we'll call this package \pkg{ex-footnote}.
-% First we report back which package we are:
-% \begin{lstlisting}
-% \ProvidesPackage{ex-footnote}[2020-02-02 v1 change footnotes]
-% \end{lstlisting}
-% Next we'll need to provide the options we want the package to have.
-% \begin{lstlisting}
-% \RequirePackage{color}
-% \RequirePackage{expkv-opt} % also loads expkv
-% \ekvdef{ex-footnote}{color}{\def\exfn@color{#1}}
-% \ekvdef{ex-footnote}{format}{\def\exfn@format{#1}}
-% \end{lstlisting}
-% We can provide initial values just by defining the two macros storing the
-% value.
-% \begin{lstlisting}
-% \newcommand*\exfn@color{}
-% \newcommand*\exfn@format{arabic}
-% \end{lstlisting}
-% Next we need to process the options given to the package. The package should
-% only obey options directly passed to it, so we're only using
-% |\ekvoProcessLocalOptions|:
-% \begin{lstlisting}
-% \ekvoProcessLocalOptions{ex-footnote}
-% \end{lstlisting}
-% Now everything that's still missing is actually changing the way footnotes
-% appear:
-% \begin{lstlisting}
-% \renewcommand*\thefootnote
-% {%
-% \ifx\exfn@color\@empty
-% \csname\exfn@format\endcsname{footnote}%
-% \else
-% \textcolor{\exfn@color}{\csname\exfn@format\endcsname{footnote}}%
-% \fi
-% }
-% \end{lstlisting}
-% \bigskip
-%
-% \noindent
-% So the complete code of the package would look like this:
-% \begin{lstlisting}
-% \ProvidesPackage{ex-footnote}[2020-02-02 v1 change footnotes]
-%
-% \RequirePackage{color}
-% \RequirePackage{expkv-opt} % also loads expkv
-%
-% \ekvdef{ex-footnote}{color}{\def\exfn@color{#1}}
-% \ekvdef{ex-footnote}{format}{\def\exfn@format{#1}}
-% \newcommand*\exfn@color{}
-% \newcommand*\exfn@format{arabic}
-%
-% \ekvoProcessLocalOptions{ex-footnote}
-%
-% \renewcommand*\thefootnote
-% {%
-% \ifx\exfn@color\@empty
-% \csname\exfn@format\endcsname{footnote}%
-% \else
-% \textcolor{\exfn@color}{\csname\exfn@format\endcsname{footnote}}%
-% \fi
-% }
-% \end{lstlisting}
-% \bigskip
-%
-% \noindent
-% And it could be used with one of the following lines:
-% \begin{lstlisting}
-% \usepackage{ex-footnote}
-% \usepackage[format=fnsymbol]{ex-footnote}
-% \usepackage[color=green]{ex-footnote}
-% \usepackage[color=red,format=roman]{ex-footnote}
-% \end{lstlisting}
-%
-%
-% \subsection{Bugs}
-%
-% If you happen to find bugs, it'd be great if you let me know. Just write me an
-% email (see the front page) or submit a bug report on GitHub:
-% \url{https://github.com/Skillmon/tex_expkv-opt}
-%
-%
-% \subsection{License}
-%
-% Copyright \textcopyright\ 2020\unless\ifnum\year=2020--\the\year\fi\
-% Jonathan P. Spratte
-%
-% \medskip\noindent
-% This work may be distributed and/or modified under the conditions of the
-% \LaTeX\ Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% \url{http://www.latex-project.org/lppl.txt}
-%
-% \noindent
-% This work is ``maintained'' (as per LPPL maintenance status) by
-%
-% \mbox{Jonathan P. Spratte}.
-%
-% \end{documentation}^^A=<<
-%
-% \begin{implementation}^^A>>=
-%
-% \clearpage
-%
-%
-% \section{Implementation}
-%
-% \gobbledocstriptag
-%<*pkg>
-% Start the package with the typical \LaTeX\ standards.
-%
-% \begin{macro}{\ekvoVersion,\ekvoDate}
-% Store the packages version and date in two macros.
-% \begin{macrocode}
-\newcommand*\ekvoVersion{0.1b}
-\newcommand*\ekvoDate{2020-10-10}
-% \end{macrocode}
-% \end{macro}
-% And we report who we are and what we need.
-% \begin{macrocode}
-\ProvidesPackage{expkv-opt}
- [%
- \ekvoDate\space v\ekvoVersion\space
- parse class and package options with expkv%
- ]
-\RequirePackage{expkv}
-% \end{macrocode}
-%
-%
-% \subsection{Loop}
-%
-% \begin{macro}[internal]
-% {\ekvo@CurrentOption@loop,\ekvo@CurrentOption@loop@,\ekvo@end@loop}
-% We'll need some loop which can iterate over a comma separated list. The loop
-% is very basic and only works for commas of category~12. First we insert the
-% delimiters for the actual loop.
-% \begin{macrocode}
-\protected\long\def\ekvo@CurrentOption@loop#1#2%
- {%
- \ekvo@CurrentOption@loop@#2\ekv@mark#1,\ekv@stop,\ekvo@tail
- }
-% \end{macrocode}
-% The actual loop checks whether the final element has been read and if so
-% ends the loop. Else blank elements are ignored, |\CurrentOption| is set and
-% the macro which parses the list elements called. Then call the next
-% iteration.
-% \begin{macrocode}
-\long\def\ekvo@CurrentOption@loop@#1#2,%
- {%
- \ekv@gobble@from@mark@to@stop#2\ekvo@end@loop\ekv@stop
- \ekv@ifblank{#2}%
- {}%
- {%
- \edef\CurrentOption{\unexpanded\expandafter{\@gobble#2}}%
- #1{#2}%
- }%
- \ekvo@CurrentOption@loop@#1\ekv@mark
- }
-\long\def\ekvo@end@loop#1\ekvo@tail{}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Tests}
-%
-% \begin{macro}[internal]{\ekvo@ifx@TF,\ekvo@ifx@F}
-% We'll need branching |\ifx| tests so that user input containing unbalanced
-% \TeX\ ifs doesn't break (at least not because of us, everything else is the
-% fault of \LaTeXe).
-% \begin{macrocode}
-\def\ekvo@ifx@TF#1#2{\ifx#1#2\ekv@fi@firstoftwo\fi\@secondoftwo}
-\def\ekvo@ifx@F#1#2{\ifx#1#2\ekv@fi@gobble\fi\@firstofone}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@do@with@set,\ekvo@name,\ekvo@setname}
-% This test checks whether the \set\ is defined. If it is we store it in
-% |\ekvo@setname| and set |\ekvo@name| to a short cut to get the \key's
-% callback name. Next we execute the code in |#2|, if the \set\ isn't defined
-% |#2| is gobbled.
-% \begin{macrocode}
-\protected\def\ekvo@do@with@set#1#2%
- {%
- \ekvifdefinedset{#1}%
- {%
- \expandafter
- \let\expandafter\ekvo@name\csname\ekv@undefined@set{#1}\endcsname
- \def\ekvo@setname{#1}%
- #2%
- }%
- {\ekvo@err@undefined@set{#1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Key handlers}
-%
-% \expkvo\ uses handlers specifying what happens if a parsed \key\ is defined or
-% undefined.
-%
-% \begin{macro}[internal]
-% {\ekvo@handle@undefined@k@pkg,\ekvo@handle@undefined@kv@pkg}
-% The case for undefined keys in a local list of a package is easy, just throw
-% appropriate errors.
-% \begin{macrocode}
-\protected\long\def\ekvo@handle@undefined@k@pkg#1%
- {%
- \ekv@ifdefined{\ekvo@name{#1}}%
- {\ekvo@err@value@required{#1}}%
- {\ekvo@err@undefined@key{#1}}%
- }
-\def\ekvo@handle@undefined@kv@pkg#1#2%
- {%
- \ekv@ifdefined{\ekvo@name{#1}N}%
- {\ekvo@err@value@forbidden{#1}}%
- {\ekvo@err@undefined@key{#1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvo@addto@unused@one,\ekvo@addto@unused@two,
-% \ekvo@rmfrom@unused@one,\ekvo@rmfrom@unused@two
-% }
-% These macros will add or remove the |\CurrentOption| to or from the list of
-% unused global options.
-% \begin{macrocode}
-\long\def\ekvo@addto@unused@one#1{\ekvo@addto@list\@unusedoptionlist}
-\long\def\ekvo@addto@unused@two#1#2{\ekvo@addto@list\@unusedoptionlist}
-\long\def\ekvo@rmfrom@unused@one#1{\ekvo@rmfrom@list\@unusedoptionlist}
-\long\def\ekvo@rmfrom@unused@two#1#2{\ekvo@rmfrom@list\@unusedoptionlist}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}[internal]
-% {
-% \ekvo@set@handlers@local,\ekvo@set@handlers@global,
-% \ekvo@set@handlers@unusedglobal,\ekvo@set@handlers@list
-% }
-% These macros are boring. They just set up the handlers to respect the rules
-% documented earlier.
-% \begin{macrocode}
-\protected\def\ekvo@set@handlers@local
- {%
- \ekvo@if@need@handlers
- {%
- \ifx\@currext\@clsextension
- \ifx\@classoptionslist\relax
- \let\ekvo@handle@undefined@k\@gobble
- \let\ekvo@handle@undefined@kv\@gobbletwo
- \else
- \expandafter
- \ifx\csname opt@\@currname.\@currext\endcsname\@classoptionslist
- \let\ekvo@handle@undefined@k\ekvo@addto@unused@one
- \let\ekvo@handle@undefined@kv\ekvo@addto@unused@two
- \else
- \let\ekvo@handle@undefined@k\@gobble
- \let\ekvo@handle@undefined@kv\@gobbletwo
- \fi
- \fi
- \else
- \let\ekvo@handle@undefined@k\ekvo@handle@undefined@k@pkg
- \let\ekvo@handle@undefined@kv\ekvo@handle@undefined@kv@pkg
- \fi
- }%
- }
-\protected\def\ekvo@set@handlers@global
- {%
- \unless\ifx\@unusedoptionlist\@empty
- \let\ekvo@handle@defined@k\ekvo@rmfrom@unused@one
- \let\ekvo@handle@defined@kv\ekvo@rmfrom@unused@two
- \fi
- \ekvo@if@need@handlers
- {%
- \let\ekvo@handle@undefined@k\@gobble
- \let\ekvo@handle@undefined@kv\@gobbletwo
- }%
- }
-\protected\def\ekvo@set@handlers@unusedglobal
- {%
- \ekvo@if@need@handlers
- {%
- \let\ekvo@handle@undefined@k\ekvo@addto@unused@one
- \let\ekvo@handle@undefined@kv\ekvo@addto@unused@two
- \let\@unusedoptionlist\@empty
- \@gobbletwo
- }%
- \@firstofone
- {%
- \let\ekvo@handle@defined@k\ekvo@rmfrom@unused@one
- \let\ekvo@handle@defined@kv\ekvo@rmfrom@unused@two
- }%
- }
-\protected\def\ekvo@set@handlers@list
- {%
- \ekvo@if@need@handlers
- {%
- \let\ekvo@handle@undefined@k\@gobble
- \let\ekvo@handle@undefined@kv\@gobbletwo
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@if@need@handlers,\ekvo@dont@need@handlers}
-% If the user specifies handlers this macro will be let to
-% |\ekvo@dont@need@handlers|, which will act like |\@gobble| and also let it
-% to |\@firstofone| afterwards.
-% \begin{macrocode}
-\let\ekvo@if@need@handlers\@firstofone
-\protected\long\def\ekvo@dont@need@handlers#1%
- {%
- \let\ekvo@if@need@handlers\@firstofone
- }%
-% \end{macrocode}
-% \end{macro}
-%
-% We have to set the default for the handlers of defined keys, because they
-% don't necessarily get defined before a list is parsed.
-% \begin{macrocode}
-\let\ekvo@handle@defined@k\@gobble
-\let\ekvo@handle@defined@kv\@gobbletwo
-% \end{macrocode}
-%
-%
-% \subsection{Processing list elements}
-%
-% \begin{macro}[internal]{\ekvo@process@common}
-% All the key processing frontend macros use the same basic structure. |#1|
-% will be a simple test, deciding whether the list will really be parsed or
-% not, |#3| will be the \set, and |#2| will be the individual code of the
-% frontend macro which should be executed if both the test in |#1| is true and
-% the \set\ is defined.
-% \begin{macrocode}
-\protected\def\ekvo@process@common#1#2#3%
- {%
- #1{\ekvo@do@with@set{#3}{#2}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@process@list}
-% This macro only expands the list holding macro and forwards it to the
-% loop macro.
-% \begin{macrocode}
-\protected\def\ekvo@process@list#1%
- {%
- \expandafter\ekvo@CurrentOption@loop\expandafter{#1}\ekvo@parse
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@parse}
-% This macro calls internals of |\ekvparse| such that the code splitting at
-% commas isn't executed, else this is equivalent to
-% |\ekvparse\ekvo@set@k\ekvo@set@kv{#1}|.
-% \begin{macrocode}
-\protected\long\def\ekvo@parse#1%
- {%
- \ekv@eq@other#1\ekv@nil\ekv@mark\ekv@parse@eq@other@a
- =\ekv@mark\ekv@parse@eq@active
- \ekvo@set@k\ekvo@set@kv
- \ekvo@tail
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@set@k,\ekvo@set@kv}
-% These two macros check whether the key is defined and if so call the handler
-% for defined keys and execute the key, else the handler for undefined keys is
-% called. They have to clean up a bit of code which is left by |\ekvo@parse|.
-% \begin{macrocode}
-\protected\def\ekvo@set@k#1#2\ekvo@tail
- {%
- \ekv@ifdefined{\ekvo@name{#1}N}%
- {%
- \ekvo@handle@defined@k{#1}%
- \csname\ekvo@name{#1}N\endcsname
- }%
- {\ekvo@handle@undefined@k{#1}}%
- }
-\protected\def\ekvo@set@kv#1#2#3\ekvo@tail
- {%
- \ekv@ifdefined{\ekvo@name{#1}}%
- {%
- \ekvo@handle@defined@kv{#1}{#2}%
- \csname\ekvo@name{#1}\endcsname{#2}%
- }%
- {\ekvo@handle@undefined@kv{#1}{#2}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{List variable helpers}
-%
-% \begin{macro}[internal]{\ekvo@addto@list}
-% This macro is rather simple. If the list to which the |\CurrentOption|
-% should be added is empty we can just let the list to the |\CurrentOption|.
-% Else we have to expand the list once and the |\CurrentOption| once.
-% \begin{macrocode}
-\protected\def\ekvo@addto@list#1%
- {%
- \ekvo@ifx@TF#1\@empty
- {\let#1\CurrentOption}%
- {%
- \edef#1%
- {%
- \unexpanded\expandafter{#1},%
- \unexpanded\expandafter{\CurrentOption}%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@rmfrom@list,\ekvo@rmfrom@list@}
-% This works by looping over every list item and comparing it to
-% |\ekvo@curropt| which stores the real |\CurrentOption|. This is
-% comparatively slow, but works for items containing braces unlike what
-% \LaTeXe\ does. We could be faster for items not containing braces, though.
-% \begin{macrocode}
-\protected\def\ekvo@rmfrom@list#1%
- {%
- \ekvo@ifx@F#1\@empty
- {%
- \let\ekvo@tmp@list\@empty
- \let\ekvo@curropt\CurrentOption
- \expandafter\ekvo@CurrentOption@loop\expandafter{#1}\ekvo@rmfrom@list@
- \let\CurrentOption\ekvo@curropt
- \let#1\ekvo@tmp@list
- }%
- }
-\protected\long\def\ekvo@rmfrom@list@#1%
- {%
- \ekvo@ifx@F\CurrentOption\ekvo@curropt
- {\ekvo@addto@list\ekvo@tmp@list}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Errors}
-%
-% \begin{macro}[internal]
-% {
-% \ekvo@err@undefined@key,\ekvo@err@value@required,
-% \ekvo@err@value@forbidden,\ekvo@err@undefined@set
-% }
-% Just some macros to throw errors in the few cases an error has to be thrown.
-% \begin{macrocode}
-\protected\def\ekvo@err@undefined@key#1%
- {%
- \PackageError{expkv-opt}{Undefined key `#1' in set `\ekvo@setname'}{}%
- }
-\protected\def\ekvo@err@value@required#1%
- {%
- \PackageError{expkv-opt}%
- {Value required for key `#1' in set `\ekvo@setname'}%
- {}%
- }
-\protected\def\ekvo@err@value@forbidden#1%
- {%
- \PackageError{expkv-opt}%
- {Value forbidden for key `#1' in set `\ekvo@setname'}%
- {}%
- }
-\protected\def\ekvo@err@undefined@set#1%
- {%
- \PackageError{expkv-opt}%
- {Undefined set `#1'}%
- {The set for which you try to parse options isn't defined in expkv.}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{User Interface}
-%
-% The user interface macros just put together the bits and pieces.
-% \begin{macro}{\ekvoProcessLocalOptions}
-% \begin{macrocode}
-\protected\def\ekvoProcessLocalOptions
- {%
- \ekvo@process@common
- {\ekv@ifdefined{opt@\@currname.\@currext}\@firstofone\@gobble}%
- {%
- \ekvo@set@handlers@local
- \expandafter
- \ekvo@process@list\csname opt@\@currname.\@currext\endcsname
- \AtEndOfPackage{\let\@unprocessedoptions\relax}%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ekvoProcessGlobalOptions}
-% \begin{macrocode}
-\protected\def\ekvoProcessGlobalOptions
- {%
- \ekvo@process@common{\ekvo@ifx@F\@classoptionslist\relax}%
- {%
- \ekvo@set@handlers@global
- \ekvo@process@list\@classoptionslist
- \let\ekvo@handle@defined@k\@gobble
- \let\ekvo@handle@defined@kv\@gobbletwo
- }%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ekvoProcessUnusedGlobalOptions}
-% \begin{macrocode}
-\protected\def\ekvoProcessUnusedGlobalOptions
- {%
- \ekvo@process@common{\ekvo@ifx@F\@unusedoptionlist\@empty}%
- {%
- \let\ekvo@tmp@list\@unusedoptionlist
- \ekvo@set@handlers@unusedglobal
- \ekvo@process@list\ekvo@tmp@list
- \let\ekvo@handle@defined@k\@gobble
- \let\ekvo@handle@defined@kv\@gobbletwo
- }%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ekvoProcessOptionsList}
-% \begin{macrocode}
-\protected\def\ekvoProcessOptionsList#1%
- {%
- \ekvo@process@common{\ekvo@ifx@F#1\@empty}%
- {%
- \ekvo@set@handlers@list
- \ekvo@process@list#1%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ekvoUseUnknownHandlers}
-% \begin{macrocode}
-\protected\def\ekvoUseUnknownHandlers#1#2%
- {%
- \let\ekvo@handle@undefined@k#1\relax
- \let\ekvo@handle@undefined@kv#2\relax
- \let\ekvo@if@need@handlers\ekvo@dont@need@handlers
- }
-% \end{macrocode}
-% \end{macro}
-%
-% All user interface macros should be only used in the preamble.
-% \begin{macrocode}
-\@onlypreamble\ekvoProcessLocalOptions
-\@onlypreamble\ekvoProcessGlobalOptions
-\@onlypreamble\ekvoProcessUnusedGlobalOptions
-\@onlypreamble\ekvoProcessOptionsList
-\@onlypreamble\ekvoUseUnknownHandlers
-% \end{macrocode}
-%
-% \gobbledocstriptag
-%</pkg>
-%
-% \end{implementation}^^A=<<
-%
-% \clearpage
-% \PrintIndex
-%
-% \Finale
-\endinput
-%
-^^A vim: ft=tex fdm=marker fmr=>>=,=<<
diff --git a/obsolete/macros/generic/expkv-opt/expkv-opt.dtx b/obsolete/macros/generic/expkv-opt/expkv-opt.dtx
deleted file mode 100644
index 22a9a9b0c3..0000000000
--- a/obsolete/macros/generic/expkv-opt/expkv-opt.dtx
+++ /dev/null
@@ -1,1012 +0,0 @@
-% \iffalse meta-comment
-%
-% File: expkv-opt.dtx Copyright (C) 2020 Jonathan P. Spratte
-%
-% This work may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% ------------------------------------------------------------------------------
-%
-%<*driver>^^A>>=
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-\input l3docstrip.tex
-\askforoverwritefalse
-\preamble
-
---------------------------------------------------------------
-expkv-opt -- parse class and package options with expkv
-E-mail: jspratte@yahoo.de
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
---------------------------------------------------------------
-
-Copyright (C) 2020 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
-This work consists of the file expkv-opt.dtx
-and the derived files expkv-opt.pdf
- expkv-opt.sty
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-\generate{\file{expkv-opt.sty}{\from{expkv-opt.dtx}{pkg}}}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%
-\IfFileExists{expkv-opt.sty}{\RequirePackage{expkv-opt}}{}
-\ProvidesFile{expkv-opt.dtx}
- [\csname ekvoDate\endcsname\ parse class and package options with expkv]
-\PassOptionsToPackage{full}{textcomp}
-\documentclass{l3doc}
-\RequirePackage[oldstylenums,nott]{kpfonts}
-\input{glyphtounicode}
-\pdfgentounicode=1
-\RequirePackage{listings}
-\RequirePackage{booktabs}
-\RequirePackage{array}
-\RequirePackage{collcell}
-\RequirePackage{siunitx}
-\RequirePackage{xcolor}
-\RequirePackage{caption}
-\RequirePackage{microtype}
-\RequirePackage{accsupp}
-\lstset
- {
- ,flexiblecolumns=false
- ,basewidth=.53em
- ,gobble=2
- ,basicstyle=\fontfamily{jkp}\itshape
- ,morekeywords=^^A
- {^^A
- \ekvoProcessLocalOptions,
- \ekvoProcessGlobalOptions,
- \ekvoProcessUnusedGlobalOptions,
- \ekvoProcessOptionsList,
- \ekvoUseUnknownHandlers
- }
- ,morecomment=[l]\%
- ,commentstyle=\color[gray]{0.4}
- ,literate={\{}{{\CodeSymbol\{}}{1}
- {\}}{{\CodeSymbol\}}}{1}
- ^^A,literate=*{<key>}{\key}{4}{<set>}{\set}{4}
- }
-\newcommand*\CodeSymbol[1]{\textbf{#1}}
-\RequirePackage{randtext}
-\let\metaORIG\meta
-\protected\def\meta #1{\texttt{\metaORIG{#1}}}
-\renewcommand*\thefootnote{\fnsymbol{footnote}}
-\definecolor{expkvred}{HTML}{9F393D}
-\colorlet{expkvgrey}{black!75}
-\makeatletter
-\newcommand*\expkv
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv}^^A
- \href{https://github.com/Skillmon/tex_expkv}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv}^^A
- }
-\newcommand*\expkvpkg[1]
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv-#1}^^A
- \href{https://github.com/Skillmon/tex_expkv-#1}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- {\color{expkvgrey}^^A
- \kern.05em\rule[-.1ex]{.08em}{1.2ex}\kern.05em\textsc{#1}^^A
- }^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv-#1}^^A
- }
-\newcommand*\expkvd{\expkvpkg{def}}
-\newcommand*\expkvc{\expkvpkg{cs}}
-\newcommand*\expkvo{\expkvpkg{opt}}
-\newcommand\kv{\meta{key}=\meta{value}}
-\newcommand\key{\meta{key}}
-\newcommand\val{\meta{value}}
-\newcommand\set{\meta{set}}
-\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
-\DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
-\DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long}
-\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
-\DoNotIndex{\@,\unexpanded,\string,\expanded,\dimexpr,\global,\glueexpr,\hbox}
-\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef,\@firstofone}
-\DoNotIndex{\@firstoftwo,\@gobble,\@secondoftwo,\AtEndOfPackage,\newcommand}
-\DoNotIndex{\PackageError,\@classoptionslist,\@clsextension,\@currext}
-\DoNotIndex{\@currname,\@empty,\@gobbletwo,\@onlypreamble,\@raw@classoptionslist}
-\DoNotIndex{\@unprocessedoptions,\@unusedoptionlist}
-\DoNotIndex{\DeclareRelease,\DeclareCurrentRelease,\IfFormatAtLeastTF}
-\DoNotIndex{\PackageWarning,\requestedLaTeXdate,\@ifstar}
-\DoNotIndex{\pkgcls@parse@date@arg,\pkgcls@targetdate,\pkgcls@targetlabel}
-\DoNotIndex{\ifcsname}
-\DoNotIndex{\ifx}
-\DoNotIndex{\ifdefined}
-\DoNotIndex{\iffalse}
-\DoNotIndex{\iftrue}
-\DoNotIndex{\ifnum}
-\DoNotIndex{\else}
-\DoNotIndex{\fi}
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
-\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}}
-\makeatother
-\begin{document}
- \title
- {^^A
- \texorpdfstring
- {^^A
- \huge\expkvo
- \\[\medskipamount]
- \Large parse class and package options with \expkv
- }{expkv-opt - parse class and package options with expkv}^^A
- }
- \date{\ekvoDate\space v\ekvoVersion}
- \author{Jonathan P. Spratte\thanks{\protect\randomize{jspratte@yahoo.de}}}
- \DocInput{expkv-opt.dtx}
-\end{document}
-%</driver>^^A=<<
-% \fi
-%
-% \maketitle
-% \renewcommand*\thefootnote{\arabic{footnote}}
-%
-% \begin{abstract}
-% \noindent\parfillskip=0pt
-% \expkvo\ provides option parsing for classes and packages in \LaTeXe\ based on
-% \expkv. Global and local options are parsed individually by different
-% commands. The stylised name is \expkvo\ but the files use \file{expkv-opt},
-% this is due to CTAN-rules which don't allow \string| in package names since
-% that is the pipe symbol in *nix shells.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \begin{documentation}^^A>>=
-%
-% \section{Documentation}
-%
-% The \expkv\ family provides at its core a \kv\ parser and additionally
-% packages, one to conveniently define new keys (\expkvd) and another to build
-% expandable \kv\ taking control sequences (\expkvc). Still missing from the mix
-% was a solution to parse \LaTeXe\ class and package options, a gap that's
-% hereby filled with \expkvo.
-%
-% With the 2021-05-01 release of \LaTeXe\ there were some very interesting
-% changes to the package and class options code. It is now possible to use
-% braces inside the options, and we can access options without them being
-% preprocessed. As a result, some but not all restrictions were lifted from the
-% possible option usage. What will still fail is things that aren't save from an
-% |\edef| expansion. One thing that doesn't work any more is the possibility to
-% parse the unused option list, because that one doesn't contain the full
-% information any more.
-%
-% \expkvo\ will fall back to v0.1 if the kernel is older than 2021-05-01.
-% \expkvo\ shouldn't place any restrictions on the keys, historic shortcomings
-% of the kernel cannot be helped though, so the supported things vary with the
-% kernel version. The one thing that \expkvo\ doesn't support, which \expkv\
-% alone would, is active commas. But there is no good reason why a comma could
-% be active in the preamble.
-%
-% The package can be loaded with
-% \begin{lstlisting}
-% \usepackage{expkv-opt}
-% \end{lstlisting}
-% and if you need a specific version you can use \LaTeXe's rollback support, so
-% to load v0.1 explicitly use:
-% \begin{lstlisting}
-% \usepackage{expkv-opt}[=v0.1]
-% \end{lstlisting}
-% which will load the latest subversion of v0.1
-% (this shouldn't be done by a package author, but only by a user on a
-% single-document basis if there are some incompatibilities, which is unlikely)
-% Unlike the other packages in the \expkv\ family, \expkvo\ is only provided as
-% a \LaTeX\ package.
-%
-% Before reading this documentation you should read \expkv's documentation and
-% might want to also read the documentation of \expkvd.
-%
-%
-% \subsection{Macros}
-%
-% \expkvo's behaviour if it encounters a defined or an undefined \key\ depends
-% on which list is being parsed and whether the current file is a class or not.
-% Of course in every case a defined \key's callback will be invoked but an
-% additional action might be executed. For this reason the rule set of every
-% macro will be given below the short description which list it will parse.
-%
-% During each of the processing macros the current list element (not processed
-% in any way) is stored within the macro \cs{CurrentOption}.
-%
-% \begin{function}{\ekvoProcessLocalOptions}
-% \begin{syntax}
-% \cs{ekvoProcessLocalOptions}\marg{set}
-% \end{syntax}
-% This parses the options which are directly passed to the current class or
-% package for an \expkv\ \set.
-% \end{function}
-% \begin{description}
-% \item[Class:]
-% \begin{description}
-% \item[defined] \emph{nothing}
-% \item[undefined]
-% add the key to the list of unused global options (if the local option
-% list matches the option list of the main class)
-% \end{description}
-% \item[Package:]
-% \begin{description}
-% \item[defined] \emph{nothing}
-% \item[undefined] throw an error
-% \end{description}
-% \end{description}
-%
-% \begin{function}{\ekvoProcessGlobalOptions}
-% \begin{syntax}
-% \cs{ekvoProcessGlobalOptions}\marg{set}
-% \end{syntax}
-% In \LaTeXe\ the options given to |\documentclass| are global options. This
-% macro processes the global options for an \expkv\ \set.
-% \end{function}
-% \begin{description}
-% \item[Class:]
-% \begin{description}
-% \item[defined] remove the option from the list of unused global options
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \item[Package:]
-% \begin{description}
-% \item[defined] remove the option from the list of unused global options
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \end{description}
-%
-% \begin{function}{\ekvoProcessUnusedGlobalOptions}
-% \begin{syntax}
-% \cs{ekvoProcessUnusedGlobalOptions}\marg{set}
-% \end{syntax}
-% This does no longer work with \LaTeXe\ kernels starting from 2021-05-01,
-% since the handling of the unused option list changed and no longer includes
-% the values. As a result this will throw a warning and else will be ignored.
-% \end{function}
-%
-% \begin{function}{\ekvoProcessOptionsList}
-% \begin{syntax}
-% \cs{ekvoProcessOptionsList}\meta{list}\marg{set}
-% \end{syntax}
-% Process the \kv\ list stored in the macro \meta{list}.
-% \end{function}
-% \begin{description}
-% \item[Class:]
-% \begin{description}
-% \item[defined] \emph{nothing}
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \item[Package:]
-% \begin{description}
-% \item[defined] \emph{nothing}
-% \item[undefined] \emph{nothing}
-% \end{description}
-% \end{description}
-%
-% \begin{function}{\ekvoUseUnknownHandlers}
-% \begin{syntax}
-% \cs{ekvoUseUnknownHandlers}\meta{cs_1}\meta{cs_2}\quad{\normalfont\itshape or}
-% \cs{ekvoUseUnknownHandlers}*
-% \end{syntax}
-% With this macro you can change the action \expkvo\ executes if it encounters
-% an undefined \key\ for the next (and only the next) list processing macro.
-% The macro \meta{cs_1} will be called if an undefined \key\ without a \val\
-% is encountered and get one argument, being the \key. Analogous the macro
-% \meta{cs_2} will be called if an undefined \key\ with a \val\ was specified.
-% It will get two arguments, the first being the \key\ and the second the
-% \val.\par
-% If you use the starred variant, it'll not take further arguments. In this
-% case the undefined handlers defined via |\ekvdefunknown| and
-% |\ekvdefunknownNoVal| in the parsing set get used, and if those aren't
-% available they'll simply do nothing.
-% \end{function}
-%
-% \begin{function}{\ekvoVersion,\ekvoDate}
-% These two macros store the version and date of the package.
-% \end{function}
-%
-%
-% \subsection{Example}
-%
-% Let's say we want to create a package that changes the way footnotes are
-% displayed in \LaTeX. For this it will essentially just redefine
-% \cs[no-index]{thefootnote} and we'll call this package \pkg{ex-footnote}.
-% First we report back which package we are:
-% \begin{lstlisting}
-% \ProvidesPackage{ex-footnote}[2020-02-02 v1 change footnotes]
-% \end{lstlisting}
-% Next we'll need to provide the options we want the package to have.
-% \begin{lstlisting}
-% \RequirePackage{color}
-% \RequirePackage{expkv-opt} % also loads expkv
-% \ekvdef{ex-footnote}{color}{\def\exfn@color{#1}}
-% \ekvdef{ex-footnote}{format}{\def\exfn@format{#1}}
-% \end{lstlisting}
-% We can provide initial values just by defining the two macros storing the
-% value.
-% \begin{lstlisting}
-% \newcommand*\exfn@color{}
-% \newcommand*\exfn@format{arabic}
-% \end{lstlisting}
-% Next we need to process the options given to the package. The package should
-% only obey options directly passed to it, so we're only using
-% |\ekvoProcessLocalOptions|:
-% \begin{lstlisting}
-% \ekvoProcessLocalOptions{ex-footnote}
-% \end{lstlisting}
-% Now everything that's still missing is actually changing the way footnotes
-% appear:
-% \begin{lstlisting}
-% \renewcommand*\thefootnote
-% {%
-% \ifx\exfn@color\@empty
-% \csname\exfn@format\endcsname{footnote}%
-% \else
-% \textcolor{\exfn@color}{\csname\exfn@format\endcsname{footnote}}%
-% \fi
-% }
-% \end{lstlisting}
-% \bigskip
-%
-% \noindent
-% So the complete code of the package would look like this:
-% \begin{lstlisting}
-% \ProvidesPackage{ex-footnote}[2020-02-02 v1 change footnotes]
-%
-% \RequirePackage{color}
-% \RequirePackage{expkv-opt} % also loads expkv
-%
-% \ekvdef{ex-footnote}{color}{\def\exfn@color{#1}}
-% \ekvdef{ex-footnote}{format}{\def\exfn@format{#1}}
-% \newcommand*\exfn@color{}
-% \newcommand*\exfn@format{arabic}
-%
-% \ekvoProcessLocalOptions{ex-footnote}
-%
-% \renewcommand*\thefootnote
-% {%
-% \ifx\exfn@color\@empty
-% \csname\exfn@format\endcsname{footnote}%
-% \else
-% \textcolor{\exfn@color}{\csname\exfn@format\endcsname{footnote}}%
-% \fi
-% }
-% \end{lstlisting}
-% \bigskip
-%
-% \noindent
-% And it could be used with one of the following lines:
-% \begin{lstlisting}
-% \usepackage{ex-footnote}
-% \usepackage[format=fnsymbol]{ex-footnote}
-% \usepackage[color=green]{ex-footnote}
-% \usepackage[color=red,format=roman]{ex-footnote}
-% \end{lstlisting}
-%
-%
-% \subsection{Bugs}
-%
-% If you happen to find bugs, it'd be great if you let me know. Just write me an
-% email (see the front page) or submit a bug report on GitHub:
-% \url{https://github.com/Skillmon/tex_expkv-opt}
-%
-%
-% \subsection{License}
-%
-% Copyright \textcopyright\ 2020\unless\ifnum\year=2020--\the\year\fi\
-% Jonathan P. Spratte
-%
-% \medskip\noindent
-% This work may be distributed and/or modified under the conditions of the
-% \LaTeX\ Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% \url{http://www.latex-project.org/lppl.txt}
-%
-% \noindent
-% This work is ``maintained'' (as per LPPL maintenance status) by
-%
-% \mbox{Jonathan P. Spratte}.
-%
-% \end{documentation}^^A=<<
-%
-% \begin{implementation}^^A>>=
-%
-% \clearpage
-%
-%
-% \section{Implementation}
-%
-% \gobbledocstriptag
-%<*pkg>
-%
-% First we check whether the \LaTeXe\ kernel supports raw options. If it doesn't
-% we check whether a specific version was requested, and if that's not the case
-% we manually run |\pkgcls@parse@date@arg| with the last version that supported
-% non-raw options.
-% \begin{macrocode}
-\IfFormatAtLeastTF{2021/05/01}
- {}
- {%
- \ifx\pkgcls@targetlabel\@empty
- \ifnum\requestedLaTeXdate=\pkgcls@targetdate
- \pkgcls@parse@date@arg{=v0.1}%
- \fi
- \fi
- }
-% \end{macrocode}
-% Then we tell \LaTeXe\ where to find which release so that the package rollback
-% code of \LaTeXe\ can do its thing.
-% \begin{macrocode}
-\DeclareRelease{v0.1}{2020/10/10}{expkv-opt-2020-10-10.sty}
-\DeclareCurrentRelease{v0.2}{2021/04/04}
-% \end{macrocode}
-%
-% Start the package with the typical \LaTeX\ standards.
-%
-% \begin{macro}{\ekvoVersion,\ekvoDate}
-% Store the packages version and date in two macros.
-% \begin{macrocode}
-\newcommand*\ekvoVersion{0.2}
-\newcommand*\ekvoDate{2021-04-04}
-% \end{macrocode}
-% \end{macro}
-% And we report who we are and what we need.
-% \begin{macrocode}
-\ProvidesPackage{expkv-opt}
- [%
- \ekvoDate\space v\ekvoVersion\space
- parse class and package options with expkv%
- ]
-\RequirePackage{expkv}
-% \end{macrocode}
-%
-%
-% \subsection{Loop}
-%
-% \begin{macro}[internal]
-% {\ekvo@CurrentOption@loop,\ekvo@CurrentOption@loop@,\ekvo@end@loop}
-% We'll need some loop which can iterate over a comma separated list. The loop
-% is very basic and only works for commas of category~12. First we insert the
-% delimiters for the actual loop.
-% \begin{macrocode}
-\protected\long\def\ekvo@CurrentOption@loop#1#2%
- {%
- \ekvo@CurrentOption@loop@#2\ekv@mark#1,\ekv@stop,\ekvo@tail
- }
-% \end{macrocode}
-% The actual loop checks whether the final element has been read and if so
-% ends the loop. Else blank elements are ignored, |\CurrentOption| is set and
-% the macro which parses the list elements called. Then call the next
-% iteration.
-% \begin{macrocode}
-\long\def\ekvo@CurrentOption@loop@#1#2,%
- {%
- \ekv@gobble@from@mark@to@stop#2\ekvo@end@loop\ekv@stop
- \ekv@ifblank{#2}%
- {}%
- {%
- \edef\CurrentOption{\unexpanded\expandafter{\@gobble#2}}%
- #1{#2}%
- }%
- \ekvo@CurrentOption@loop@#1\ekv@mark
- }
-\long\def\ekvo@end@loop#1\ekvo@tail{}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Tests}
-%
-% \begin{macro}[internal]{\ekvo@ifx@TF,\ekvo@ifx@F}
-% We'll need branching |\ifx| tests so that user input containing unbalanced
-% \TeX\ ifs doesn't break (at least not because of us, everything else is the
-% fault of \LaTeXe).
-% \begin{macrocode}
-\def\ekvo@ifx@TF#1#2{\ifx#1#2\ekv@fi@firstoftwo\fi\@secondoftwo}
-\def\ekvo@ifx@F#1#2{\ifx#1#2\ekv@fi@gobble\fi\@firstofone}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@do@with@set,\ekvo@name,\ekvo@setname}
-% This test checks whether the \set\ is defined. If it is we store it in
-% |\ekvo@setname| and set |\ekvo@name| to a short cut to get the \key's
-% callback name. Next we execute the code in |#2|, if the \set\ isn't defined
-% |#2| is gobbled.
-% \begin{macrocode}
-\protected\def\ekvo@do@with@set#1#2%
- {%
- \ekvifdefinedset{#1}%
- {%
- \expandafter
- \let\expandafter\ekvo@name\csname\ekv@undefined@set{#1}\endcsname
- \def\ekvo@setname{#1}%
- #2%
- }%
- {\ekvo@err@undefined@set{#1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Key handlers}
-%
-% \expkvo\ uses handlers specifying what happens if a parsed \key\ is defined or
-% undefined.
-%
-% \begin{macro}[internal]
-% {\ekvo@handle@undefined@k@pkg,\ekvo@handle@undefined@kv@pkg}
-% The case for undefined keys in a local list of a package is easy, just throw
-% appropriate errors.
-% \begin{macrocode}
-\protected\long\def\ekvo@handle@undefined@k@pkg#1%
- {%
- \ekv@ifdefined{\ekvo@name{#1}}%
- {\ekvo@err@value@required{#1}}%
- {\ekvo@err@undefined@key{#1}}%
- }
-\def\ekvo@handle@undefined@kv@pkg#1#2%
- {%
- \ekv@ifdefined{\ekvo@name{#1}N}%
- {\ekvo@err@value@forbidden{#1}}%
- {\ekvo@err@undefined@key{#1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvo@addto@unused@one,\ekvo@addto@unused@two,
-% \ekvo@rmfrom@unused@one,\ekvo@rmfrom@unused@two
-% }
-% These macros will add or remove the |\CurrentOption| to or from the list of
-% unused global options. Since |\ekvo@do@unusedoptionlist| will have some
-% overhead before calling the list changing macro in filtering the current
-% option, we use an optimization here in that we check whether the list is
-% empty before calling the |rmfrom| function.
-% \begin{macrocode}
-\long\def\ekvo@addto@unused@one#1{\ekvo@do@unusedoptionlist\ekvo@addto@list}
-\long\def\ekvo@addto@unused@two#1#2{\ekvo@do@unusedoptionlist\ekvo@addto@list}
-\long\def\ekvo@rmfrom@unused@one#1%
- {%
- \ekvo@ifx@F\@unusedoptionlist\@empty
- {\ekvo@do@unusedoptionlist\ekvo@rmfrom@list}%
- }
-\long\def\ekvo@rmfrom@unused@two#1#2%
- {%
- \ekvo@ifx@F\@unusedoptionlist\@empty
- {\ekvo@do@unusedoptionlist\ekvo@rmfrom@list}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvo@do@unusedoptionlist,
-% \ekvo@prepare@unusedoption,
-% \ekvo@prepare@unusedoption@a,
-% \ekvo@prepare@unusedoption@b,
-% \ekvo@prepare@unusedoption@c
-% }
-% The way the new \LaTeXe\ kernel handles the unused option list changed. Now
-% not the entire |\CurrentOption| is listed, but just everything up to the
-% first equals sign, and spaces got zapped, doesn't matter whether the raw
-% option list gets used or not. So we have to zap spaces and remove everything
-% from the first equals sign onwards. The code used here will fail if the
-% current option contains an |\ekv@mark| or |\ekv@stop| before the first
-% equals sign (this seems rather unlikely).
-% \begin{macrocode}
-\protected\def\ekvo@do@unusedoptionlist#1%
- {%
- \let\ekvo@unpreparedCurrentOption\CurrentOption
- \edef\CurrentOption
- {\expandafter\ekvo@prepare@unusedoption\CurrentOption=\ekv@mark}%
- #1\@unusedoptionlist
- \let\CurrentOption\ekvo@unpreparedCurrentOption
- }
-\def\ekvo@prepare@unusedoption{\ekvo@prepare@unusedoption@a\@empty}
-\def\ekvo@prepare@unusedoption@a#1%
- {%
- \long\def\ekvo@prepare@unusedoption@a##1=##2\ekv@mark
- {%
- \ekvo@prepare@unusedoption@b##1\ekv@stop
- \ekv@mark\ekvo@prepare@unusedoption@b
- #1\ekv@mark\ekvo@prepare@unusedoption@c
- }%
- }
-\ekvo@prepare@unusedoption@a{ }
-\long\def\ekvo@prepare@unusedoption@b#1 #2\ekv@mark#3{#3#1#2\ekv@mark#3}
-\long\def\ekvo@prepare@unusedoption@c
- #1\ekv@stop
- \ekv@mark\ekvo@prepare@unusedoption@b\ekv@mark\ekvo@prepare@unusedoption@c
- {\unexpanded\expandafter{#1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekvo@set@handlers@local,\ekvo@set@handlers@global,
-% \ekvo@set@handlers@list
-% }
-% These macros are boring. They just set up the handlers to respect the rules
-% documented earlier.
-% \begin{macrocode}
-\protected\def\ekvo@set@handlers@local
- {%
- \ekvo@if@need@handlers
- {%
- \ifx\@currext\@clsextension
- \ifx\@classoptionslist\relax
- \let\ekvo@handle@undefined@k\@gobble
- \let\ekvo@handle@undefined@kv\@gobbletwo
- \else
- \expandafter
- \ifx
- \csname @raw@opt@\@currname.\@currext\endcsname
- \@raw@classoptionslist
- \let\ekvo@handle@undefined@k\ekvo@addto@unused@one
- \let\ekvo@handle@undefined@kv\ekvo@addto@unused@two
- \else
- \let\ekvo@handle@undefined@k\@gobble
- \let\ekvo@handle@undefined@kv\@gobbletwo
- \fi
- \fi
- \else
- \let\ekvo@handle@undefined@k\ekvo@handle@undefined@k@pkg
- \let\ekvo@handle@undefined@kv\ekvo@handle@undefined@kv@pkg
- \fi
- }%
- }
-\protected\def\ekvo@set@handlers@global
- {%
- \unless\ifx\@unusedoptionlist\@empty
- \let\ekvo@handle@defined@k\ekvo@rmfrom@unused@one
- \let\ekvo@handle@defined@kv\ekvo@rmfrom@unused@two
- \fi
- \ekvo@if@need@handlers
- {%
- \let\ekvo@handle@undefined@k\@gobble
- \let\ekvo@handle@undefined@kv\@gobbletwo
- }%
- }
-\protected\def\ekvo@set@handlers@list
- {%
- \ekvo@if@need@handlers
- {%
- \let\ekvo@handle@undefined@k\@gobble
- \let\ekvo@handle@undefined@kv\@gobbletwo
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@if@need@handlers,\ekvo@dont@need@handlers}
-% If the user specifies handlers this macro will be let to
-% |\ekvo@dont@need@handlers|, which will act like |\@gobble| and also let it
-% to |\@firstofone| afterwards.
-% \begin{macrocode}
-\let\ekvo@if@need@handlers\@firstofone
-\protected\long\def\ekvo@dont@need@handlers#1%
- {%
- \let\ekvo@if@need@handlers\@firstofone
- }%
-% \end{macrocode}
-% \end{macro}
-%
-% We have to set the default for the handlers of defined keys, because they
-% don't necessarily get defined before a list is parsed.
-% \begin{macrocode}
-\let\ekvo@handle@defined@k\@gobble
-\let\ekvo@handle@defined@kv\@gobbletwo
-% \end{macrocode}
-%
-%
-% \subsection{Processing list elements}
-%
-% \begin{macro}[internal]{\ekvo@process@common}
-% All the key processing frontend macros use the same basic structure. |#1|
-% will be a simple test, deciding whether the list will really be parsed or
-% not, |#3| will be the \set, and |#2| will be the individual code of the
-% frontend macro which should be executed if both the test in |#1| is true and
-% the \set\ is defined.
-% \begin{macrocode}
-\protected\def\ekvo@process@common#1#2#3%
- {%
- #1{\ekvo@do@with@set{#3}{#2}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@process@list}
-% This macro only expands the list holding macro and forwards it to the
-% loop macro.
-% \begin{macrocode}
-\protected\def\ekvo@process@list#1%
- {%
- \expandafter\ekvo@CurrentOption@loop\expandafter{#1}\ekvo@parse
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@parse}
-% This macro calls internals of |\ekvparse| such that the code splitting at
-% commas isn't executed, else this is equivalent to
-% |\ekvparse\ekvo@set@k\ekvo@set@kv{#1}|.
-% \begin{macrocode}
-\protected\long\def\ekvo@parse#1%
- {%
- \ekv@eq@other#1\ekv@nil\ekv@mark\ekv@parse@eq@other@a
- =\ekv@mark\ekv@parse@eq@active
- \ekvo@set@k\ekvo@set@kv
- \ekvo@tail
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@set@k,\ekvo@set@kv}
-% These two macros check whether the key is defined and if so call the handler
-% for defined keys and execute the key, else the handler for undefined keys is
-% called. They have to clean up a bit of code which is left by |\ekvo@parse|.
-% \begin{macrocode}
-\protected\def\ekvo@set@k#1#2\ekvo@tail
- {%
- \ekv@ifdefined{\ekvo@name{#1}N}%
- {%
- \ekvo@handle@defined@k{#1}%
- \csname\ekvo@name{#1}N\endcsname
- }%
- {\ekvo@handle@undefined@k{#1}}%
- }
-\protected\def\ekvo@set@kv#1#2#3\ekvo@tail
- {%
- \ekv@ifdefined{\ekvo@name{#1}}%
- {%
- \ekvo@handle@defined@kv{#1}{#2}%
- \csname\ekvo@name{#1}\endcsname{#2}%
- }%
- {\ekvo@handle@undefined@kv{#1}{#2}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{List variable helpers}
-%
-% \begin{macro}[internal]{\ekvo@addto@list}
-% This macro is rather simple. If the list to which the |\CurrentOption|
-% should be added is empty we can just let the list to the |\CurrentOption|.
-% Else we have to expand the list once and the |\CurrentOption| once.
-% \begin{macrocode}
-\protected\def\ekvo@addto@list#1%
- {%
- \ekvo@ifx@TF#1\@empty
- {\let#1\CurrentOption}%
- {%
- \edef#1%
- {%
- \unexpanded\expandafter{#1},%
- \unexpanded\expandafter{\CurrentOption}%
- }%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvo@rmfrom@list,\ekvo@rmfrom@list@}
-% This works by looping over every list item and comparing it to
-% |\ekvo@curropt| which stores the real |\CurrentOption|. This is
-% comparatively slow, but works for items containing braces unlike what
-% \LaTeXe\ does. We could be faster for items not containing braces, though.
-% \begin{macrocode}
-\protected\def\ekvo@rmfrom@list#1%
- {%
- \ekvo@ifx@F#1\@empty
- {%
- \let\ekvo@tmp@list\@empty
- \let\ekvo@curropt\CurrentOption
- \expandafter\ekvo@CurrentOption@loop\expandafter{#1}\ekvo@rmfrom@list@
- \let\CurrentOption\ekvo@curropt
- \let#1\ekvo@tmp@list
- }%
- }
-\protected\long\def\ekvo@rmfrom@list@#1%
- {%
- \ekvo@ifx@F\CurrentOption\ekvo@curropt
- {\ekvo@addto@list\ekvo@tmp@list}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Errors}
-%
-% \begin{macro}[internal]
-% {
-% \ekvo@err@undefined@key,\ekvo@err@value@required,
-% \ekvo@err@value@forbidden,\ekvo@err@undefined@set
-% }
-% Just some macros to throw errors in the few cases an error has to be thrown.
-% \begin{macrocode}
-\protected\def\ekvo@err@undefined@key#1%
- {%
- \PackageError{expkv-opt}{Undefined key `#1' in set `\ekvo@setname'}{}%
- }
-\protected\def\ekvo@err@value@required#1%
- {%
- \PackageError{expkv-opt}%
- {Value required for key `#1' in set `\ekvo@setname'}%
- {}%
- }
-\protected\def\ekvo@err@value@forbidden#1%
- {%
- \PackageError{expkv-opt}%
- {Value forbidden for key `#1' in set `\ekvo@setname'}%
- {}%
- }
-\protected\def\ekvo@err@undefined@set#1%
- {%
- \PackageError{expkv-opt}%
- {Undefined set `#1'}%
- {The set for which you try to parse options isn't defined in expkv.}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{User Interface}
-%
-% The user interface macros just put together the bits and pieces.
-% \begin{macro}{\ekvoProcessLocalOptions}
-% \begin{macrocode}
-\protected\def\ekvoProcessLocalOptions
- {%
- \ekvo@process@common
- {\ekv@ifdefined{@raw@opt@\@currname.\@currext}\@firstofone\@gobble}%
- {%
- \ekvo@set@handlers@local
- \expandafter
- \ekvo@process@list\csname @raw@opt@\@currname.\@currext\endcsname
- \AtEndOfPackage{\let\@unprocessedoptions\relax}%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ekvoProcessGlobalOptions}
-% \begin{macrocode}
-\protected\def\ekvoProcessGlobalOptions
- {%
- \ekvo@process@common{\ekvo@ifx@F\@classoptionslist\relax}%
- {%
- \ekvo@set@handlers@global
- \ekvo@process@list\@raw@classoptionslist
- \let\ekvo@handle@defined@k\@gobble
- \let\ekvo@handle@defined@kv\@gobbletwo
- }%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ekvoProcessUnusedGlobalOptions}
-% \begin{macrocode}
-\protected\def\ekvoProcessUnusedGlobalOptions#1%
- {%
- \PackageWarning{expkv-opt}%
- {This macro no longer works because of changes in the LaTeX2e kernel.}%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ekvoProcessOptionsList}
-% \begin{macrocode}
-\protected\def\ekvoProcessOptionsList#1%
- {%
- \ekvo@process@common{\ekvo@ifx@F#1\@empty}%
- {%
- \ekvo@set@handlers@list
- \ekvo@process@list#1%
- }%
- }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ekvoUseUnknownHandlers}
-% \begin{macrocode}
-\protected\def\ekvoUseUnknownHandlers
- {\@ifstar\ekvoUseUnknownHandlers@s\ekvoUseUnknownHandlers@n}
-\protected\def\ekvoUseUnknownHandlers@s
- {%
- \def\ekvo@handle@undefined@k
- {%
- \ekv@ifdefined{\ekvo@name{}uN}%
- {\csname\ekvo@name{}uN\endcsname}%
- {\@gobble}%
- }%
- \long\def\ekvo@handle@undefined@kv##1##2%
- {%
- \ekv@ifdefined{\ekvo@name{}u}%
- {\csname\ekvo@name{}u\endcsname{##2}{##1}}%
- {}%
- }%
- \let\ekvo@if@need@handlers\ekvo@dont@need@handlers
- }
-\protected\def\ekvoUseUnknownHandlers@n#1#2%
- {%
- \let\ekvo@handle@undefined@k#1\relax
- \let\ekvo@handle@undefined@kv#2\relax
- \let\ekvo@if@need@handlers\ekvo@dont@need@handlers
- }
-% \end{macrocode}
-% \end{macro}
-%
-% All user interface macros should be only used in the preamble.
-% \begin{macrocode}
-\@onlypreamble\ekvoProcessLocalOptions
-\@onlypreamble\ekvoProcessGlobalOptions
-\@onlypreamble\ekvoProcessUnusedGlobalOptions
-\@onlypreamble\ekvoProcessOptionsList
-\@onlypreamble\ekvoUseUnknownHandlers
-% \end{macrocode}
-%
-% \gobbledocstriptag
-%</pkg>
-%
-% \end{implementation}^^A=<<
-%
-% \clearpage
-% \PrintIndex
-%
-% \Finale
-\endinput
-%
-^^A vim: ft=tex fdm=marker fmr=>>=,=<<
diff --git a/obsolete/macros/generic/expkv-opt/expkv-opt.pdf b/obsolete/macros/generic/expkv-opt/expkv-opt.pdf
deleted file mode 100644
index 5ecded074a..0000000000
--- a/obsolete/macros/generic/expkv-opt/expkv-opt.pdf
+++ /dev/null
Binary files differ
diff --git a/obsolete/macros/generic/expkv/README.md b/obsolete/macros/generic/expkv/README.md
deleted file mode 100644
index ccfa3194b3..0000000000
--- a/obsolete/macros/generic/expkv/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
--------------------------------------------------------------------------------
-# expkv -- an expandable key=val implementation
-
-Version 2021-09-20 v1.9a
-
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-
-Hosted at https://github.com/Skillmon/tex_expkv
-
--------------------------------------------------------------------------------
-
-Copyright (C) 2020-2021 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
--------------------------------------------------------------------------------
-
-This provides an expandable key=val implementation that is somewhat fast, but
-not the fastest key=val implementation available. It is generic code and
-completely self-contained. There is a LaTeX package `expkv.sty` included to play
-nice on LaTeX's package loading system, but that package is not needed and does
-not provide more functionality than the generic code in `expkv.tex`.
-
-A key-defining interface that is not as rudimentary as the macros provided in
-this package is contained in expkv-def:
-https://github.com/Skillmon/tex_expkv-def
diff --git a/obsolete/macros/generic/expkv/expkv.dtx b/obsolete/macros/generic/expkv/expkv.dtx
deleted file mode 100644
index 8651ad97a3..0000000000
--- a/obsolete/macros/generic/expkv/expkv.dtx
+++ /dev/null
@@ -1,2980 +0,0 @@
-% \iffalse meta-comment
-%
-% File: expkv.dtx Copyright (C) 2020-2021 Jonathan P. Spratte
-%
-% This work may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% ------------------------------------------------------------------------------
-%
-%<*driver>^^A>>=
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-\input l3docstrip.tex
-\askforoverwritefalse
-\preamble
-
---------------------------------------------------------------
-expkv -- an expandable key=val implementation
-E-mail: jspratte@yahoo.de
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
---------------------------------------------------------------
-
-Copyright (C) 2020-2021 Jonathan P. Spratte
-
-This work may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this license or
-(at your option) any later version. The latest version of this license is in
-the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Jonathan P. Spratte.
-
-This work consists of the file expkv.dtx
-and the derived files expkv.pdf
- expkv.sty
- expkv.tex
- t-expkv.tex
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-\generate{\file{expkv.sty}{\from{expkv.dtx}{pkg}}}
-\generate{\file{expkv.tex}{\from{expkv.dtx}{tex}}}
-\generate{\file{t-expkv.tex}{\from{expkv.dtx}{ctx}}}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%
-\IfFileExists{expkv.tex}{\input{expkv.tex}}{}
-\ProvidesFile{expkv.dtx}
- [\csname ekvDate\endcsname\ an expandable key=val implementation]
-\PassOptionsToPackage{full}{textcomp}
-\documentclass{l3doc}
-\RequirePackage[oldstylenums,nott]{kpfonts}
-\input{glyphtounicode}
-\pdfgentounicode=1
-\RequirePackage{xfp} ^^A required for an example
-\RequirePackage{listings}
-\RequirePackage{booktabs}
-\RequirePackage{array}
-\RequirePackage{collcell}
-\RequirePackage{siunitx}
-\DeclareSIUnit\ops{ops}
-\RequirePackage{xcolor}
-\RequirePackage{caption}
-\RequirePackage{microtype}
-\RequirePackage{accsupp}
-\RequirePackage{enumitem}
-\RequirePackage{tcolorbox}
-\newtcolorbox{exresult}[2][]
- {colback=expkvgrey!10!white,colframe=expkvgrey,fontupper=\small,width={#2},#1}
-\newtcbox\exres[1][]
- {
- colback=expkvgrey!10!white
- ,colframe=expkvgrey
- ,size=small
- ,nobeforeafter
- ,tcbox raise base
- ,fontupper=\small
- ,#1
- }
-\def\mylstwd{.55em}
-\lstdefinelanguage{expkv}[primitive]{TeX}
- {
- ,moretexcs=[4]^^A e-TeX
- {
- expanded,
- numexpr,
- protected,
- }
- ,moretexcs=[5]^^A plain/LaTeX/ConTeXt
- {
- approx,
- begin,
- empty,
- item,
- LaTeX,
- makeatletter,makeatother,
- newcommand,newdimen,
- RequirePackage,
- rule,
- TeX,
- textit,texttt,
- usepackage,
- usemodule,
- }
- ,moretexcs=[6]^^A used packages
- {
- ^^A xfp
- fpeval,
- ^^A keyval
- setkeys,
- ^^A yax
- defactiveparameter,storevalue,setparameterlist
- }
- ,moretexcs=[2]^^A expkv macros
- {
- ekvdef,ekvdefNoVal,^^A
- ekvlet,ekvletNoVal,ekvletkv,ekvletkvNoVal,^^A
- ekvdefunknown,ekvdefunknownNoVal,^^A
- ekvredirectunknown,ekvredirectunknownNoVal,^^A
- ekvset,ekvsetSneaked,^^A
- ekvsetdef,ekvsetSneakeddef,ekvsetdefSneaked,^^A
- ekvparse,^^A
- ekvVersion,ekvDate,^^A
- ekvifdefined,ekvifdefinedNoVal,ekvifdefinedset,^^A
- ekvbreak,ekvbreakPreSneak,ekvbreakPostSneak,^^A
- ekvsneak,ekvsneakPre,^^A
- ekvchangeset,^^A
- ekvoptarg,ekvoptargTF,^^A
- ekverr
- }
- ,moretexcs=[3]^^A expkv-pkg macros
- {
- ^^A expkv-cs
- ekvcSecondaryKeys,ekvcSplitAndForward,
- ^^A expkv-def
- ekvdefinekeys
- }
- }
-\colorlet{codeparam}{cyan!65!black}
-\lstset
- {
- ,language=expkv
- ,flexiblecolumns=false
- ,basewidth=\mylstwd
- ,gobble=2
- ,basicstyle=\fontfamily{jkp}\itshape
- ,texcsstyle=*[1]{\bfseries\color{expkvgrey}} ^^A primitives
- ,texcsstyle=*[2]{\bfseries\color{expkvred}} ^^A expkv
- ,texcsstyle=*[3]{\color{expkvred}} ^^A expkv-pkg
- ,texcsstyle=*[4]{\bfseries\color{expkvgrey}} ^^A e-TeX
- ,texcsstyle=*[5]{\bfseries\color{expkvgrey}} ^^A plain/LaTeX macros
- ,texcsstyle=*[6]{} ^^A macros of other packages
- ,commentstyle=\color[gray]{0.4}
- ,literate=
- {\{} {{\CodeUpBf\{}}{1}
- {\}} {{\CodeUpBf\}}}{1}
- {$} {{\CodeUpBf\$}}{1}
- {[} {{\CodeUp[}}{1}
- {]} {{\CodeUp]}}{1}
- {(} {{\CodeUp(}}{1}
- {)} {{\CodeUp)}}{1}
- {*} {{$*$}}{1}
- {1} {{\CodeUp{1}}}{1}
- {2} {{\CodeUp{2}}}{1}
- {3} {{\CodeUp{3}}}{1}
- {4} {{\CodeUp{4}}}{1}
- {5} {{\CodeUp{5}}}{1}
- {6} {{\CodeUp{6}}}{1}
- {7} {{\CodeUp{7}}}{1}
- {8} {{\CodeUp{8}}}{1}
- {9} {{\CodeUp{9}}}{1}
- {0} {{\CodeUp{0}}}{1}
- {##} {{\CodeColored{codeparam}{1}{\#}}}{1}
- {##1}{{\CodeColored{codeparam}{2}{\#1}}}{2}
- {##2}{{\CodeColored{codeparam}{2}{\#2}}}{2}
- {##3}{{\CodeColored{codeparam}{2}{\#3}}}{2}
- {##4}{{\CodeColored{codeparam}{2}{\#4}}}{2}
- {##5}{{\CodeColored{codeparam}{2}{\#5}}}{2}
- {##6}{{\CodeColored{codeparam}{2}{\#6}}}{2}
- {##7}{{\CodeColored{codeparam}{2}{\#7}}}{2}
- {##8}{{\CodeColored{codeparam}{2}{\#8}}}{2}
- {##9}{{\CodeColored{codeparam}{2}{\#9}}}{2}
- {<key>}{{$\langle$}key{$\rangle$}}{5}
- {<set>}{{$\langle$}set{$\rangle$}}{5}
- {<set1>}{{$\langle$}set1{$\rangle$}}{6}
- {<set2>}{{$\langle$}set2{$\rangle$}}{6}
- ^^A,literate=*{<key>}{\key}{4}{<set>}{\set}{4}
- }
-\newcommand*\CodeColored[3]{\textcolor{#1}{\makebox[\dimexpr\mylstwd*#2]{#3}}}
-\newcommand*\CodeUpBf[1]{\makebox[\mylstwd]{\textup{\textbf{#1}}}}
-\newcommand*\CodeUp[1]{\makebox[\mylstwd]{\textup{#1}}}
-\RequirePackage{randtext}
-\let\metaORIG\meta
-\protected\def\meta #1{\texttt{\metaORIG{#1}}}
-\renewcommand*\thefootnote{\fnsymbol{footnote}}
-\definecolor{expkvred}{HTML}{9F393D}
-\colorlet{expkvgrey}{black!75}
-\makeatletter
-\newcommand*\example{\par\smallskip\noindent\textit{Example:} \ignorespaces}
-\newcommand*\expFormat
- {^^A
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex\hbox{{\color{expkvgrey}P}}^^A
- }^^A
- }
-\newcommand*\kvstyle
- {^^A
- \normalfont\rmfamily\bfseries\color{expkvred}^^A
- }
-\newcommand*\expkv
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv}^^A
- \href{https://github.com/Skillmon/tex_expkv}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv}^^A
- }
-\newcommand*\expkvpkg[1]
- {^^A
- \texorpdfstring
- {^^A
- \mbox
- {^^A
- \BeginAccSupp{ActualText=expkv-#1}^^A
- \href{https://github.com/Skillmon/tex_expkv-#1}
- {^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- {\color{expkvgrey}^^A
- \kern.05em\rule[-.1ex]{.08em}{1.2ex}\kern.05em\textsc{#1}^^A
- }^^A
- }^^A
- \EndAccSupp{}^^A
- }^^A
- }
- {expkv-#1}^^A
- }
-\newcommand*\expkvd{\expkvpkg{def}}
-\newcommand*\expkvc{\expkvpkg{cs}}
-\newcommand*\expkvo{\expkvpkg{opt}}
-\ExplSyntaxOn
-\newcommand*\pkglogo[1]
- {
- \texorpdfstring
- {
- \mbox
- {
- \BeginAccSupp{ActualText=#1}
- \rmfamily
- \str_case:nn {#1}
- {
- {yax}
- {
- Y\kern-.1em
- \raise.15em\hbox{\scshape a}
- \kern-.1em \lower.15em\hbox{X}%
- }
- }
- \EndAccSupp{}
- }
- }
- {#1}
- }
-\newcommand*\yax{\pkglogo{yax}}
-\ExplSyntaxOff
-\newcommand\kv{\meta{key}=\meta{value}}
-\newcommand\key{\meta{key}}
-\newcommand\val{\meta{value}}
-\newcommand\set{\meta{set}}
-\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
-\DoNotIndex{\directlua}
-\DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
-\DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long}
-\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
-\DoNotIndex{\^,\@,\unexpanded,\string,\expanded,\detokenize,\meaning}
-\DoNotIndex{\lastnamedcs,\romannumeral,\z@}
-\DoNotIndex{\noexpand,\normalexpanded,\normalunexpanded}
-\DoNotIndex{\par,\protect}
-\DoNotIndex{\unprotect}
-\DoNotIndex{\writestatus}
-\DoNotIndex{\ifcsname}
-\DoNotIndex{\ifx}
-\DoNotIndex{\iffalse}
-\DoNotIndex{\ifnum}
-\DoNotIndex{\else}
-\DoNotIndex{\fi}
-\@gobble\fi ^^A ignoring \ifx etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx etc., but only one \fi
-\@gobble\fi ^^A ignoring \ifx etc., but only one \fi
-\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}}
-\newcommand*\pmso[1] ^^A poor man's strike out
- {^^A
- \leavevmode
- \begingroup
- \sbox0{#1}^^A
- \rlap{\vrule height .6ex depth -.5ex width \wd0\relax}^^A
- \usebox0\relax
- \endgroup
- }
-\makeatother
-\begin{document}
- \title
- {^^A
- \texorpdfstring
- {^^A
- \huge\expkv
- \\[\medskipamount]
- \Large an {\expFormat}andable
- \meta{{\kvstyle k}\kern-.05em ey}=^^A
- \meta{{\kvstyle v}\kern-.05em alue}
- implementation^^A
- }{expkv - an expandable <key>=<value> implementation}^^A
- }
- \date{\ekvDate\space v\ekvVersion}
- \author{Jonathan P. Spratte\thanks{\protect\randomize{jspratte@yahoo.de}}}
- \DocInput{expkv.dtx}
-\end{document}
-%</driver>^^A=<<
-% \fi
-%
-% \maketitle
-% \renewcommand*\thefootnote{\arabic{footnote}}
-%
-% \begin{abstract}
-% \noindent\parfillskip=0pt
-% \expkv\ provides a small interface for \kv\ parsing. The parsing macro is
-% \emph{fully expandable}, the \meta{code} of your keys might be not. \expkv\ is
-% \emph{swift}, close to the fastest \kv\ implementation. However it is the
-% fastest which copes with active commas and equal signs and doesn't strip
-% braces accidentally.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \begin{documentation}^^A>>=
-%
-% \section{Documentation}
-%
-% \expkv\ provides an expandable \kv\ parser. The \kv\ pairs should be given as
-% a comma separated list and the separator between a \key\ and the associated
-% \val\ should be an equal sign. Both, the commas and the equal signs, might be
-% of category 12 (other) or 13 (active). To support this is necessary as for
-% example \pkg{babel} turns characters active for some languages, for instance
-% the equal sign is turned active for Turkish.
-%
-% \expkv\ is usable as generic code, as a \LaTeX\ package or as a \ConTeXt\
-% module. To use it, just use one of:
-% \begin{lstlisting}
-% \input expkv % plainTeX
-% \usepackage{expkv} % LaTeX
-% \usemodule[expkv] % ConTeXt
-% \end{lstlisting}
-% Both the \LaTeX\ package and the \ConTeXt\ module don't do more than
-% \file{expkv.tex}, except calling |\ProvidesPackage| and setting things up such
-% that \file{expkv.tex} will use |\ProvidesFile|, or printing some status
-% information. The \ConTeXt\ support is not thoroughly tested, though (since I
-% don't use \ConTeXt\ myself I don't know if there are additional pitfalls I
-% wasn't aware of).
-%
-% In the \expkv\ family are other packages contained which provide additional
-% functionality. Those packages currently are:
-% \begin{description}[format=\expkvpkg]
-% \item[def]
-% a key-defining frontend for \expkv\ using a \kv\ syntax
-% \item[cs]
-% define expandable \kv\ macros using \expkv
-% \item[opt]
-% parse package and class options with \expkv
-% \end{description}
-% Note that while the package names are stylised with a vertical rule, their
-% names are all lower case with a hyphen (\emph{e.g.}, \file{expkv-def}).
-%
-% A list of concise comparisons to other \kv\ packages is contained in
-% \autoref{sec:cmp}.
-%
-% \subsection{Setting up Keys}\label{sec:define}
-% \expkv\ provides a rather simple approach to setting up keys, similar to
-% \pkg{keyval}. However there is an auxiliary package named \expkvd\ which
-% provides a more sophisticated interface, similar to well established packages
-% like \pkg{pgfkeys} or \pkg{l3keys}.
-%
-% Keys in \expkv\ (as in almost all other \kv\ implementations) belong to a
-% \emph{set} such that different sets can contain keys of the same name. Unlike
-% many other implementations \expkv\ doesn't provide means to set a default
-% value, instead we have keys that take values and keys that don't (the latter
-% are called |NoVal| keys by \expkv), but both can have the same name (on the
-% user level).
-%
-% The following macros are available to define new keys. Those macros containing
-% ``|def|'' in their name can be prefixed by anything allowed to prefix |\def|
-% (but \emph{don't} use |\outer|, keys defined with it won't ever be usable),
-% prefixes allowed for |\let| can prefix those with ``|let|'' in their name,
-% accordingly. Neither \set\ nor \key\ are allowed to be empty for new keys.
-% \set\ will be used as is inside of |\csname ...\endcsname| and \key\ will get
-% |\detokenize|d. Also \set\ should not contain an explicit |\par| token.
-%
-% \begin{function}{\ekvdef}
-% \begin{syntax}
-% \cs{ekvdef}\marg{set}\marg{key}\marg{code}
-% \end{syntax}
-% Defines a \key\ taking a value in a \set\ to expand to \meta{code}. In
-% \meta{code} you can use |#1| to refer to the given value.
-% \end{function}
-% \example Define |text| in |foo| to store the value inside |\foo@text|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \protected\long\ekvdef{foo}{text}{\def\foo@text{#1}}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvdefNoVal}
-% \begin{syntax}
-% \cs{ekvdefNoVal}\marg{set}\marg{key}\marg{code}
-% \end{syntax}
-% Defines a no value taking \key\ in a \set\ to expand to \meta{code}.
-% \end{function}
-% \example Define |bool| in |foo| to set |\iffoo@bool| to |true|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \protected\ekvdefNoVal{foo}{bool}{\foo@booltrue}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvlet}
-% \begin{syntax}
-% \cs{ekvlet}\marg{set}\marg{key}\meta{cs}
-% \end{syntax}
-% Let the value taking \key\ in \set\ to \meta{cs}, there are no checks on
-% \meta{cs} enforced, but the code should expect the value as a single braced
-% argument directly following it.
-% \end{function}
-% \example Let |cmd| in |foo| do the same as |\foo@cmd|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvlet{foo}{cmd}\foo@cmd
-% \end{lstlisting}
-%
-% \begin{function}{\ekvletNoVal}
-% \begin{syntax}
-% \cs{ekvletNoVal}\marg{set}\marg{key}\meta{cs}
-% \end{syntax}
-% Let the no value taking \key\ in \set\ to \meta{cs}, it is not checked
-% whether \meta{cs} exists or that it takes no parameter.
-% \end{function}
-% \example See above.
-%
-% \begin{function}{\ekvletkv}
-% \begin{syntax}
-% \cs{ekvletkv}\marg{set}\marg{key}\marg{set2}\marg{key2}
-% \end{syntax}
-% Let the \key\ in \set\ to \meta{key2} in \meta{set2}, it is not checked
-% whether that second key exists (but take a look at
-% \cs[no-index]{ekvifdefined}).
-% \end{function}
-% \example Let |B| in |bar| be an alias for |A| in |foo|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvletkv{bar}{B}{foo}{A}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvletkvNoVal}
-% \begin{syntax}
-% \cs{ekvletkvNoVal}\marg{set}\marg{key}\marg{set2}\marg{key2}
-% \end{syntax}
-% Let the \key\ in \set\ to \meta{key2} in \meta{set2}, it is not checked
-% whether that second key exists (but take a look at
-% \cs[no-index]{ekvifdefinedNoVal}).
-% \end{function}
-% \example See above.
-%
-% \begin{function}{\ekvdefunknown}
-% \begin{syntax}
-% \cs{ekvdefunknown}\marg{set}\marg{code}
-% \end{syntax}
-% By default an error will be thrown if an unknown \key\ is encountered. With
-% this macro you can define \meta{code} that will be executed for a given
-% \set\ when an unknown \key\ with a \val\ was encountered instead of throwing
-% an error. You can refer to the given \val\ with |#1| and to the unknown
-% \key's name with |#2| in \meta{code}.\footnotemark{}
-% |\ekvdefunknown| and |\ekvredirectunknown| are mutually exclusive,
-% you can't use both.
-% \end{function}
-% \footnotetext{That order is correct, this way the code is faster.}
-% \example Also search |bar| for undefined keys of set |foo|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \long\ekvdefunknown{foo}{\ekvset{bar}{#2={#1}}}
-% \end{lstlisting}
-% This example differs from using |\ekvredirectunknown{foo}{bar}| (see below) in
-% that also the unknown-key handler of the |bar| set will be triggered, error
-% messages for undefined keys will look different, and this is slower than using
-% |\ekvredirectunknown|.
-%
-% \begin{function}{\ekvdefunknownNoVal}
-% \begin{syntax}
-% \cs{ekvdefunknownNoVal}\marg{set}\marg{code}
-% \end{syntax}
-% As already explained for \cs[no-index]{ekvdefunknown}, \expkv\ would throw
-% an error when encountering an unknown \key. With this you can instead let it
-% execute \meta{code} if an unknown |NoVal| \key\ was encountered. You can
-% refer to the given \key\ with |#1| in \meta{code}.
-% |\ekvdefunknownNoVal| and |\ekvredirectunknownNoVal| are mutually exclusive,
-% you can't use both.
-% \end{function}
-% \example Also search |bar| for undefined keys of set |foo|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvdefunknownNoVal{foo}{\ekvset{bar}{#1}}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvredirectunknown}
-% \begin{syntax}
-% \cs{ekvredirectunknown}\marg{set}\marg{set-list}
-% \end{syntax}
-% This is a short cut to set up a special |\ekvdefunknown| for \set\ that will
-% check each set in the comma separated \meta{set-list} for the unknown \key.
-% You can't use prefixes (so no |\long| or |\protected|) with this macro, the
-% resulting unknown-key handler will always be |\long|. The first set in the
-% \meta{set-list} has highest priority. Once the \key\ is found the remaining
-% sets are discarded, if the \key\ isn't found in any set an error will be
-% thrown eventually. Note that the error messages are affected by the use of
-% this macro, in particular, it isn't checked whether a |NoVal| key of the
-% same name is defined in order to throw an |unwanted value| error.
-% |\ekvdefunknown| and |\ekvredirectunknown| are mutually exclusive,
-% you can't use both.
-% \end{function}
-% \example For every key not defined in the set |foo| also search the sets |bar|
-% and |baz|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvredirectunknown{foo}{bar, baz}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvredirectunknownNoVal}
-% \begin{syntax}
-% \cs{ekvredirectunknownNoVal}\marg{set}\marg{set-list}
-% \end{syntax}
-% This behaves just like |\ekvredirectunknown| and does the same but for the
-% |NoVal| keys. Again no prefixes are supported. Note that the error messages
-% are affected by the use of this macro, in particular, it isn't checked
-% whether a normal key of the same name is defined in order to throw a
-% |missing value| error.
-% |\ekvdefunknownNoVal| and |\ekvredirectunknownNoVal| are mutually exclusive,
-% you can't use both.
-% \end{function}
-% \example See above.
-%
-% \subsection{Parsing Keys}
-%
-% \begin{function}{\ekvset}
-% \begin{syntax}
-% \cs{ekvset}\marg{set}\{\kv,\ldots\}
-% \end{syntax}
-% Splits \kv\ pairs on commas. From both \key\ and \val\ up to one space is
-% stripped from both ends, if then only a braced group remains the braces are
-% stripped as well. So |\ekvset{foo}{bar=baz}| and
-% |\ekvset{foo}{ {bar}= {baz} }| will both do
-% \texttt{\cs[no-index]{\meta{foobarcode}}\{baz\}}, so you can hide commas,
-% equal signs and spaces at the ends of either \key\ or \val\ by putting
-% braces around them. If you omit the equal sign the code of the key created
-% with the |NoVal| variants described in \autoref{sec:define} will be
-% executed. If \kv\ contains more than a single unhidden equal sign, it will
-% be split at the first one and the others are considered part of the value.
-% |\ekvset| should be nestable.
-%
-% |\ekvset| is currently \emph{not} alignment safe.\footnotemark\ As a result,
-% key names and values that contain an |&| must be wrapped in braces when
-% |\ekvset| is used inside an alignment (like \LaTeXe's |tabular| environment)
-% or you have to create a wrapper that ensures an alignment safe context.
-% \end{function}
-% \footnotetext{This might change in the future, I've not decided yet.}
-% \example Parse |key=arg, key| in the set |foo|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvset{foo}{key=arg, key}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvsetSneaked}
-% \begin{syntax}
-% \cs{ekvsetSneaked}\marg{set}\marg{sneak}\{\kv,\ldots\}
-% \end{syntax}
-% Just like \cs[no-index]{ekvset}, this macro parses the \kv\ pairs within the
-% given \set. But \cs[no-index]{ekvsetSneaked} will behave as if
-% \cs[no-index]{ekvsneak} has been called with \meta{sneak} as its argument as
-% the first action.
-% \end{function}
-% \example Parse |key=arg, key| in the set |foo| with |\afterwards| sneaked out:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvsetSneaked{foo}{\afterwards}{key=arg, key}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvsetdef}
-% \begin{syntax}
-% \cs{ekvsetdef}\meta{cs}\marg{set}
-% \end{syntax}
-% With this function you can define a shorthand macro \meta{cs} to parse keys
-% of a specified \set. It is always defined |\long|, but if you need to you
-% can also prefix it with |\global|. The resulting macro is faster than but
-% else equivalent to the idiomatic definition:\par
-% \texttt
-% {\string\long\string\def\meta{cs}\#1\{\string\ekvset\marg{set}\{\#1\}\}}
-% \end{function}
-% \example Define the macro |\foosetup| to parse keys in the set |foo| and use
-% it to parse |key=arg, key|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvsetdef\foosetup{foo}
-% \foosetup{key=arg, key}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvsetSneakeddef}
-% \begin{syntax}
-% \cs{ekvsetSneakeddef}\meta{cs}\marg{set}
-% \end{syntax}
-% Just like \cs[no-index]{ekvsetdef} this defines a shorthand macro \meta{cs},
-% but this macro will make it a shorthand for \cs[no-index]{ekvsetSneaked},
-% meaning that \meta{cs} will take two arguments, the first being stuff that
-% should be given to \cs[no-index]{ekvsneak} and the second the \kv\ list. The
-% resulting macro is faster than but else equivalent to the idiomatic
-% definition:\par
-% \texttt
-% {%
-% \string\long\string\def\meta{cs}\#1\#2\{^^A
-% \string\ekvsetSneaked\marg{set}\{\#1\}\{\#2\}\}^^A
-% }
-% \end{function}
-% \example Define the macro |\foothings| to parse keys in the set |foo| and
-% accept a sneaked argument, then use it to parse |key=arg, key| and sneak
-% |\afterwards|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvsetSneakeddef\foothings{foo}
-% \foothings{\afterwards}{key=arg, key}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvsetdefSneaked}
-% \begin{syntax}
-% \cs{ekvsetdefSneaked}\meta{cs}\marg{set}\marg{sneaked}
-% \end{syntax}
-% And this one behaves like \cs[no-index]{ekvsetSneakeddef} but with a fixed
-% \meta{sneaked} argument. So the resulting macro is faster than but else
-% equivalent to the idiomatic definition:\par
-% \texttt
-% {%
-% \string\long\string\def\meta{cs}\#1\{^^A
-% \string\ekvsetSneaked\marg{set}\marg{sneaked}\{\#1\}\}^^A
-% }
-% \end{function}
-% \example Define the macro |\barthing| to parse keys in the set |bar| and
-% always execute |\afterwards| afterwards, then use it to parse |key=arg, key|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvsetdefSneaked\barthing{bar}{\afterwards}
-% \barthing{key=arg, key}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvparse}
-% \begin{syntax}
-% \cs{ekvparse}\marg{code1}\marg{code2}\{\kv,\ldots\}
-% \end{syntax}
-% This macro parses the \kv\ pairs and provides those list elements which are
-% only keys as an argument to \meta{code1}, and those which are a \kv\ pair
-% to \meta{code2} as two arguments. It is fully expandable as well and returns
-% each element of the parsed list in |\unexpanded|, which has no effect
-% outside of an |\expanded| or |\edef| context.
-% Also |\ekvparse| expands in exactly two steps of expansion.
-% You can use multiple tokens in \meta{code1} and \meta{code2} or just a
-% single control sequence name. In both cases the found \key\ and \val\ are
-% provided as a brace group following them.
-%
-% |\ekvparse| is alignment safe, meaning that you don't have to take any
-% precautions if it is used inside an alignment context (like \LaTeXe's
-% |tabular| environment) and any key or value can contain an |&|.
-%
-% |\ekvbreak|, |\ekvsneak|, and |\ekvchangeset| and their relatives don't work
-% in |\ekvparse|. It is analogue to \pkg{expl3}'s |\keyval_parse:NNn|, but
-% not with the same parsing rules -- |\keyval_parse:NNn| throws an error on
-% multiple equal signs per \kv\ pair and on empty \key\ names in a \kv\ pair,
-% both of which |\ekvparse| doesn't deal with.
-% \end{function}
-% \example
-% \begin{lstlisting}
-% \ekvparse{\handlekey{S}}{\handlekeyval{S}}{foo = bar, key, baz={zzz}}
-% \end{lstlisting}
-% would be equivalent to
-% \begin{lstlisting}
-% \handlekeyval{S}{foo}{bar}\handlekey{S}{key}\handlekeyval{S}{baz}{zzz}
-% \end{lstlisting}
-% and afterwards |\handlekey| and |\handlekeyval| would have to further handle
-% the \key. There are no macros like these two contained in \expkv, you have
-% to set them up yourself if you want to use |\ekvparse| (of course the names
-% might differ). If you need the results of |\ekvparse| as the argument for
-% another macro, you should use |\expanded|, or expand |\ekvparse| twice, as
-% only then the input stream will contain the output above:
-% \begin{lstlisting}
-% \expandafter\parse\expanded{\ekvparse\k\kv{foo = bar, key, baz={zzz}}}
-% \end{lstlisting}
-% or
-% \begin{lstlisting}
-% \expandafter\expandafter\expandafter
-% \parse\ekvparse\k\kv{foo = bar, key, baz={zzz}}
-% \end{lstlisting}
-% would both expand to
-% \begin{lstlisting}
-% \parse\kv{foo}{bar}\k{key}\kv{baz}{zzz}
-% \end{lstlisting}
-%
-% \subsection{Other Macros}
-%
-% \expkv\ provides some other macros which might be of interest.
-%
-% \begin{function}{\ekvVersion,\ekvDate}
-% These two macros store the version and date of the package.
-% \end{function}
-%
-% \begin{function}{\ekvifdefined,\ekvifdefinedNoVal}
-% \begin{syntax}
-% \cs{ekvifdefined}\marg{set}\marg{key}\marg{true}\marg{false}
-% \cs{ekvifdefinedNoVal}\marg{set}\marg{key}\marg{true}\marg{false}
-% \end{syntax}
-% These two macros test whether there is a \key\ in \set. It is false if
-% either a hash table entry doesn't exist for that key or its meaning is
-% |\relax|.
-% \end{function}
-% \example Check whether the key |special| is already defined in set |foo|, if
-% it isn't input a file that contains more key definitions:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvifdefined{foo}{special}{}{\input{foo.morekeys.tex}}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvifdefinedset}
-% \begin{syntax}
-% \cs{ekvifdefinedset}\marg{set}\marg{true}\marg{false}
-% \end{syntax}
-% This macro tests whether \set\ is defined (which it is if at least one key
-% was defined for it). If it is \meta{true} will be run, else \meta{false}.
-% \end{function}
-% \example Check whether the set |VeRyUnLiKeLy| is already defined, if so throw
-% an error, else do nothing:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvifdefinedset{VeRyUnLiKeLy}
-% {\errmessage{VeRyUnLiKeLy already defined}}{}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvbreak,\ekvbreakPreSneak,\ekvbreakPostSneak}
-% \begin{syntax}
-% \cs{ekvbreak}\marg{after}
-% \end{syntax}
-% Gobbles the remainder of the current |\ekvset| macro and its argument list
-% and reinserts \meta{after}. So this can be used to break out of |\ekvset|.
-% The first variant will also gobble anything that has been sneaked out using
-% |\ekvsneak| or |\ekvsneakPre|, while |\ekvbreakPreSneak| will put
-% \meta{after} before anything that has been smuggled and |\ekvbreakPostSneak|
-% will put \meta{after} after the stuff that has been sneaked out.
-% \end{function}
-% \example Define a key |abort| that will stop key parsing inside the set |foo|
-% and execute |\foo@aborted|, or if it got a value |\foo@aborted@with|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvdefNoVal{foo}{abort}{\ekvbreak{\foo@aborted}}
-% \ekvdef{foo}{abort}{\ekvbreak{\foo@aborted@with{#1}}}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvsneak,\ekvsneakPre}
-% \begin{syntax}
-% \cs{ekvsneak}\marg{after}
-% \end{syntax}
-% Puts \meta{after} after the effects of |\ekvset|. The first variant will put
-% \meta{after} after any other tokens which might have been sneaked before,
-% while |\ekvsneakPre| will put \meta{after} before other smuggled stuff.
-% This reads and reinserts the remainder of the current |\ekvset| macro and
-% its argument list to do its job. After |\ekvset| has parsed the entire \kv\
-% list everything that has been |\ekvsneak|ed will be left in the input
-% stream. A small usage example is shown in \autoref{sec:sneakex}.
-% \end{function}
-% \example Define a key |secret| in the set |foo| that will sneak out
-% |\foo@secretly@sneaked|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvdefNoVal{foo}{secret}{\ekvsneak{\foo@secretly@sneaked}}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvchangeset}
-% \begin{syntax}
-% \cs{ekvchangeset}\marg{new-set}
-% \end{syntax}
-% Replaces the current set with \meta{new-set}, so for the rest of the current
-% |\ekvset| call, that call behaves as if it was called with
-% \texttt{\cs[no-index]{ekvset}\marg{new-set}}. It is comparable to using
-% \texttt{\meta{key}/.cd} in \pkg{pgfkeys}.
-% \end{function}
-% \example Define a key |cd| in set |foo| that will change to another set as
-% specified in the value, if the set is undefined it'll stop the parsing and
-% throw an error as defined in the macro |\foo@cd@error|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \ekvdef{foo}{cd}
-% {\ekvifdefinedset{#1}{\ekvchangeset{#1}}{\ekvbreak{\foo@cd@error}}}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvoptarg}
-% \begin{syntax}
-% \cs{ekvoptarg}\marg{next}\marg{default}
-% \end{syntax}
-% This macro will check for a following optional argument in brackets (|[]|)
-% expandably. After the optional argument there has to be a mandatory one. The
-% code in \meta{next} should expect two arguments (the processed optional
-% argument and the mandatory one). If there was an optional argument the
-% result will be \meta{next}\marg{optional}\meta{mandatory} (so the optional
-% argument will be wrapped in braces, the mandatory argument will be
-% untouched). If there was no optional argument the result will be
-% \meta{next}\marg{default}\marg{mandatory} (so the default will be used and
-% the mandatory argument will be wrapped in braces after being read once -- if
-% it was already wrapped it is effectively unchanged).
-% \end{function}
-% |\ekvoptarg| expands in exactly two steps, grabs all the arguments only at the
-% second expansion step, and is alignment safe. It has its limitations however.
-% It can't tell the difference between |[| and |{[}|, so it doesn't work if the
-% mandatory argument is a single bracket. Also if the optional argument should
-% contain a nested closing bracket, the optional argument has to use nested
-% braces like so: |[{arg]ument}]|.
-% \example Say we have a macro that should take an optional argument defaulting
-% to 1:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \newcommand\foo{\ekvoptarg\@foo{1}}
-% \newcommand\@foo[2]{Mandatory: #2\par Optional: #1}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvoptargTF}
-% \begin{syntax}
-% \cs{ekvoptargTF}\marg{true}\marg{false}
-% \end{syntax}
-% This macro is similar to |\ekvoptarg|, but will result in
-% \meta{true}\marg{optional}\meta{mandatory} or \meta{false}\marg{mandatory}
-% instead of placing a default value.
-% \end{function}
-% |\ekvoptargTF| expands in exactly two steps, grabs all the arguments only at
-% the second expansion step, and is alignment safe. It has the same limitations
-% as |\ekvoptarg|.
-% \example Say we have a macro that should behave differently depending on
-% whether there was an optional argument or not. This could be done with:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \newcommand\foo{\ekvoptargTF\foo@a\foo@b}
-% \newcommand\foo@a[2]{Mandatory: #2\par Optional: #1}
-% \newcommand\foo@b[1]{Mandatory: #1\par No optional.}
-% \end{lstlisting}
-%
-% \begin{function}{\ekvcsvloop}
-% \begin{syntax}
-% \cs{ekvcsvloop}\marg{code}\marg{csv-list}
-% \end{syntax}
-% This loops over the comma separated items in \meta{csv-list} and, after
-% stripping spaces from either end of \meta{item} and removing at most one set
-% of outer braces, leaves
-% \texttt
-% {^^A
-% \cs[no-index]{unexpanded}\hskip0pt
-% \{\hskip0pt
-% \meta{code}\hskip0pt
-% \marg{item}\hskip0pt
-% \}^^A
-% }
-% for each list item in the input stream. Blank elements are ignored (if you
-% need a blank element it should be given as |{}|). It supports both active
-% commas and commas of category other. You could consider it as a watered down
-% version of |\ekvparse|. However it is not alignment safe, which you could
-% achieve by nesting it in |\expanded| (since the braces around the argument
-% of |\expanded| will hide |&|s from \TeX's alignment parsing).
-% \end{function}
-% \example The following splits a comma separated list and prints it in a
-% typewriter font with parentheses around each element.\\
-% \begin{minipage}{.75\linewidth}
-% \begin{lstlisting}
-% \newcommand*\myprocessor[1]{\texttt{(#1)}}
-% \ekvcsvloop\myprocessor{abc,def,ghi}\par
-% \ekvcsvloop\myprocessor{1,,2,,3,,4}\par
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \newcommand*\myprocessor[1]{\texttt{(#1)}}
-% \ekvcsvloop\myprocessor{abc,def,ghi}\par
-% \ekvcsvloop\myprocessor{1,,2,,3,,4}\par
-% \end{exresult}
-%
-% \begin{function}{\ekverr}
-% \begin{syntax}
-% \cs{ekverr}\marg{package}\marg{message}
-% \end{syntax}
-% This macro will throw an error fully expandably.\footnotemark\ The error
-% length is limited to a total length of 69~characters, and since ten
-% characters will be added for the formatting (\verb*|! | and
-% \verb*| Error: |) that leaves us with a total length for \meta{package} plus
-% \meta{message} of 59~characters. If the message gets longer \TeX\ will only
-% display the first 69~characters and append |\ETC.| to the end.
-%
-% Neither \meta{package} nor \meta{message} expand any further. Also
-% \meta{package} must not contain an explicit |\par| token or the token
-% |\thanks@jfbu|. No such restriction applies to \meta{message}.
-%
-% If |^^J| is set up as the |\newlinechar| (which is the case in \LaTeXe\ but
-% not in plain \TeX\ by default) you can use that to introduce line breaks in
-% your error message. However that doesn't change the message length limit.
-% \end{function}
-% \footnotetext{The used mechanism was to the best of my knowledge first
-% implemented by Jean-François Burnol.}
-% After your own error message some further text will be placed. The
-% formatting of that text will look good if |^^J| is the |\newlinechar|, else
-% not so much. That text will read:
-% \begin{verbatim}
-% ! Paragraph ended before \<an-expandable-macro>
-% completed due to above exception. If the error
-% summary is not comprehensible see the package
-% documentation.
-% I will try to recover now. If you're in inter-
-% active mode hit <return> at the ? prompt and I
-% continue hoping recovery was complete.
-% \end{verbatim}
-% Any clean up has to be done by you, |\ekverr| will expand to nothing after
-% throwing the error message.
-%
-% In \ConTeXt\ this macro works differently. While still being fully expandable,
-% it doesn't have the character count limitation and doesn't impose restrictions
-% on \meta{package}. It will not display the additional text and adding line
-% breaks is not possible.
-% \example Say we set up a small calculation which works with user input. In our
-% calculation we need a division, so have to watch out for division by zero. If
-% we detect such a case we throw an error and do the recovery by using the
-% biggest integer allowed in \TeX\ as the result.
-% \begin{lstlisting}
-% \newcommand*\mydivision[2]
-% {%
-% \the\numexpr
-% \ifnum\numexpr#2=0 % space here on purpose
-% \ekverr{my}{division by 0. Setting result to 2147483647.}%
-% 2147483647%
-% \else
-% (#1)/(#2)%
-% \fi
-% \relax
-% }
-% $(10+5)/(3-3)\approx\mydivision{10+5}{3-3}$
-% \end{lstlisting}
-% If that code gets executed the following will be the terminal output
-% \begin{verbatim}
-% Runaway argument?
-% ! my Error: division by 0. Setting result to 2147483647.
-% ! Paragraph ended before \<an-expandable-macro>
-% completed due to above exception. If the error
-% summary is not comprehensible see the package
-% documentation.
-% I will try to recover now. If you're in inter-
-% active mode hit <return> at the ? prompt and I
-% continue hoping recovery was complete.
-% <to be read again>
-% \par
-% l.15 $(10+5)/(3-3)\approx\mydivision{10+5}{3-3}
-% $
-% ?
-% \end{verbatim}
-% and the output would contain
-% \exres{$(10+5)/(3-3)\approx2147483647$}
-% if we continued the \TeX\ run at the prompt.
-%
-% \bigskip
-%
-% \begin{function}{\ekv@name,\ekv@name@set,\ekv@name@key}
-% \begin{syntax}
-% \cs{ekv@name}\marg{set}\marg{key}
-% \cs{ekv@name@set}\marg{set}
-% \cs{ekv@name@key}\marg{key}
-% \end{syntax}
-% The names of the macros that correspond to a key in a set are build with
-% these macros. The name is built from two blocks, one that is formatting the
-% \set\ name (|\ekv@name@set|) and one for formatting the \key\ name
-% (|\ekv@name@key|). To get the actual name the argument to |\ekv@name@key|
-% must be |\detokenize|d. Both blocks are put together (with the necessary
-% |\detokenize|) by |\ekv@name|.
-% For |NoVal| keys an additional |N| gets appended irrespective of these
-% macros' definition, so their name is
-% \texttt{\cs[no-index]{ekv@name}\marg{set}\marg{key}N}.\par
-% You can use these macros to implement additional functionality or access key
-% macros outside of \expkv, but \emph{don't} change them! \expkv\ relies on
-% their exact definitions internally.
-% \end{function}
-% \example Execute the callback of the |NoVal| key |key| in set |foo|:
-% \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
-% \csname\ekv@name{foo}{key}N\endcsname
-% \end{lstlisting}
-%
-% \subsection{Examples}
-%
-% \subsubsection{Standard Use-Case}
-%
-% Say we have a macro for which we want to create a \kv\ interface. The macro
-% has a parameter, which is stored in the dimension |\ourdim| having a default
-% value from its initialisation. Now we want to be able to change that dimension
-% with the |width| key to some specified value. For that we'd do
-% \begin{lstlisting}
-% \newdimen\ourdim
-% \ourdim=150pt
-% \protected\ekvdef{our}{width}{\ourdim=#1\relax}
-% \end{lstlisting}
-% as you can see, we use the set |our| here. We want the key to behave different
-% if no value is specified. In that case the key should not use its initial
-% value, but be smart and determine the available space from
-% \cs[no-index]{hsize}, so we also define
-% \begin{lstlisting}
-% \protected\ekvdefNoVal{our}{width}{\ourdim=.9\hsize}
-% \end{lstlisting}
-% Now we set up our macro to use this \kv\ interface
-% \begin{lstlisting}
-% \protected\def\ourmacro#1%
-% {\begingroup\ekvset{our}{#1}\the\ourdim\endgroup}
-% \end{lstlisting}
-% Finally we can use our macro like in the following\\
-% \begin{minipage}{.5\linewidth}
-% \begin{lstlisting}
-% \ourmacro{}\par
-% \ourmacro{width}\par
-% \ourmacro{width=5pt}\par
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.5\linewidth}
-% \newdimen\ourdim\ourdim=150pt
-% \protected\ekvdef{our}{width}{\ourdim=#1\relax}^^A
-% \protected\ekvdefNoVal{our}{width}{\ourdim=.9\hsize}^^A
-% \protected\def\ourmacro#1^^A
-% {\begingroup\ekvset{our}{#1}\the\ourdim\endgroup}^^A
-% \ourmacro{}\par
-% \ourmacro{width}\par
-% \ourmacro{width=5pt}\par
-% \end{exresult}
-%
-% \paragraph{The same keys using \protect\expkvd}
-% Using \expkvd\ we can set up the equivalent key using a \kv\ interface, after
-% the following we could use |\ourmacro| in the same way as above. \expkvd\ will
-% allocate and initialise |\ourdim| and define the |width| key |\protected| for
-% us, so the result will be exactly the same -- with the exception that the
-% default will use |\ourdim=.9\hsize\relax| instead.
-% \begin{lstlisting}
-% \input expkv-def % or \usepackage{expkv-def}
-% \ekvdefinekeys{our}
-% {
-% dimen width = \ourdim,
-% qdefault width = .9\hsize,
-% initial width = 150pt
-% }
-% \end{lstlisting}
-%
-% \subsubsection{A Macro to Draw Rules}
-%
-% Another small example could be a \kv\ driven |\rule| alternative, because I
-% keep forgetting the correct order of its arguments. First we define the keys
-% (and initialize the macros used to store the keys):
-% \begin{lstlisting}
-% \makeatletter
-% \newcommand*\myrule@ht{1ex}
-% \newcommand*\myrule@wd{0.1em}
-% \newcommand*\myrule@raise{\z@}
-% \protected\ekvdef{myrule}{ht}{\def\myrule@ht{#1}}
-% \protected\ekvdef{myrule}{wd}{\def\myrule@wd{#1}}
-% \protected\ekvdef{myrule}{raise}{\def\myrule@raise{#1}}
-% \protected\ekvdef{myrule}{lower}{\def\myrule@raise{-#1}}
-% \end{lstlisting}
-% Then we define a macro to change the defaults outside of |\myrule| and
-% |\myrule| itself:
-% \begin{lstlisting}
-% \ekvsetdef\myruleset{myrule}
-% \newcommand*\myrule[1][]
-% {\begingroup\myruleset{#1}\myrule@out\endgroup}
-% \end{lstlisting}
-% And finally the output:
-% \begin{lstlisting}
-% \newcommand*\myrule@out{\rule[\myrule@raise]\myrule@wd\myrule@ht}
-% \makeatother
-% \end{lstlisting}
-% And we can use it:\\
-% \begin{minipage}{.5\linewidth}
-% \begin{lstlisting}
-% a\myrule\par
-% a\myrule[ht=2ex,lower=.5ex]\par
-% \myruleset{wd=5pt}
-% a\myrule
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.5\linewidth}
-% \makeatletter
-% \newcommand*\myrule@ht{1ex}
-% \newcommand*\myrule@wd{0.1em}
-% \newcommand*\myrule@raise{\z@}
-% \protected\ekvdef{myrule}{ht}{\def\myrule@ht{#1}}
-% \protected\ekvdef{myrule}{wd}{\def\myrule@wd{#1}}
-% \protected\ekvdef{myrule}{raise}{\def\myrule@raise{#1}}
-% \protected\ekvdef{myrule}{lower}{\def\myrule@raise{-#1}}
-% \ekvsetdef\myruleset{myrule}
-% \newcommand*\myrule[1][]{\begingroup\myruleset{#1}\myrule@out\endgroup}
-% \newcommand*\myrule@out{\rule[\myrule@raise]\myrule@wd\myrule@ht}
-% \makeatother
-% a\myrule\par
-% a\myrule[ht=2ex,lower=.5ex]\par
-% \myruleset{wd=5pt}
-% a\myrule
-% \end{exresult}
-%
-%
-% \subsubsection{An Expandable \kv\ Macro Using \cs[no-index]{ekvsneak}}
-% \label{sec:sneakex}
-%
-% Let's set up an expandable macro, that uses a \kv\ interface. The problems
-% we'll face for this are:
-% \begin{enumerate}
-% \item ignoring duplicate keys
-% \item default values for keys which weren't used
-% \item providing the values as the correct argument to a macro (ordered)
-% \end{enumerate}
-%
-% First we need to decide which \kv\ parsing macro we want to do this with,
-% |\ekvset| or |\ekvparse|. For this example we also want to show the
-% usage of |\ekvsneak|, hence we'll choose |\ekvset|. And we'll have to use
-% |\ekvset| such that it builds a parsable list for our macro internals. To
-% gain back control after |\ekvset| is done we have to put an internal of our
-% macro at the start of that list, so we use an internal key that uses
-% |\ekvsneakPre| after any user input.
-%
-% To ignore duplicates will be easy if the value of the key used last will be
-% put first in the list, so the following will use |\ekvsneakPre| for the
-% user-level keys. If we wanted some key for which the first usage should be the
-% binding one we would use |\ekvsneak| instead for that key.
-%
-% Providing default values can be done in different ways, we'll use a simple
-% approach in which we'll just put the outcome of our keys if they were used
-% with default values before the parsing list terminator.
-%
-% Ordering the keys can be done simply by searching for a specific token for
-% each argument which acts like a flag, so our sneaked out values will include
-% specific tokens acting as markers.
-%
-% Now that we have answers for our technical problems, we have to decide what
-% our example macro should do. How about we define a macro that calculates the
-% sine of a number and rounds that to a specified precision? As a small extra
-% this macro should understand input in radian and degree and the used
-% trigonometric function should be selectable as well. For the hard part of this
-% task (expandably evaluating trigonometric functions) we'll use the \pkg{xfp}
-% package.
-%
-% First we set up our keys according to our earlier considerations and set up
-% the user facing macro |\sine|. The end marker of the parsing list will be a
-% |\sine@stop| token, which we don't need to define and we put our defaults
-% right before it. The user macro |\sine| uses |\ekvoptargTF| to check for the
-% optional argument short cutting to the final step if no optional argument was
-% found. This way we safe some time in this case, though we have to specify the
-% default values twice.
-%
-% \begin{lstlisting}
-% \RequirePackage{xfp}
-% \makeatletter
-% \ekvdef{expex}{f}{\ekvsneakPre{\f{#1}}}
-% \ekvdef{expex}{round}{\ekvsneakPre{\rnd{#1}}}
-% \ekvdefNoVal{expex}{degree}{\ekvsneakPre{\deg{d}}}
-% \ekvdefNoVal{expex}{radian}{\ekvsneakPre{\deg{}}}
-% \ekvdefNoVal{expex}{internal}{\ekvsneakPre{\sine@rnd}}
-% \newcommand*\sine{\ekvoptargTF\sine@args{\sine@final{sin}{d}{3}}}
-% \newcommand*\sine@args[2]
-% {\ekvset{expex}{#1,internal}\rnd{3}\deg{d}\f{sin}\sine@stop{#2}}
-% \end{lstlisting}
-%
-% Now we need to define some internal macros to extract the value of each key's
-% last usage (remember that this will be the group after the first special
-% flag-token). For that we use one delimited macro per key.
-% \begin{lstlisting}
-% \def\sine@rnd#1\rnd#2#3\sine@stop{\sine@deg#1#3\sine@stop{#2}}
-% \def\sine@deg#1\deg#2#3\sine@stop{\sine@f#1#3\sine@stop{#2}}
-% \def\sine@f#1\f#2#3\sine@stop{\sine@final{#2}}
-% \end{lstlisting}
-% After the macros |\sine@rnd|, |\sine@deg|, and |\sine@f| the macro
-% |\sine@final| will see
-% \texttt
-% {^^A
-% \cs[no-index]{sine@final}^^A
-% \marg{f}\marg{degree/radian}\marg{round}\marg{num}^^A
-% }.
-% Now |\sine@final| has to expandably deal with those arguments such that the
-% |\fpeval| macro of \pkg{xfp} gets the correct input. Luckily this is pretty
-% straight forward in this example. In |\fpeval| the trigonometric functions
-% have names such as |sin| or |cos| and the degree taking variants |sind| or
-% |cosd|. And since the |degree| key puts a |d| in |#2| and the |radian| key
-% leaves |#2| empty all we have to do to get the correct function name is stick
-% the two together.
-% \begin{lstlisting}
-% \newcommand*\sine@final[4]{\fpeval{round(#1#2(#4),#3)}}
-% \makeatother
-% \end{lstlisting}
-% Let's test our macro:\\
-% \begin{minipage}{.75\linewidth}
-% \begin{lstlisting}[gobble=4]
-% \sine{60}\par
-% \sine[round=10]{60}\par
-% \sine[f=cos,radian]{pi}\par
-% \edef\myval{\sine[f=tan]{1}}\texttt{\meaning\myval}
-% \end{lstlisting}
-% \end{minipage}^^A
-% \begin{exresult}[nobeforeafter,box align=center]{.25\linewidth}
-% \makeatletter
-% \ekvdef{expex}{f}{\ekvsneakPre{\f{#1}}}^^A
-% \ekvdef{expex}{round}{\ekvsneakPre{\rnd{#1}}}^^A
-% \ekvdefNoVal{expex}{degree}{\ekvsneakPre{\deg{d}}}^^A
-% \ekvdefNoVal{expex}{radian}{\ekvsneakPre{\deg{}}}^^A
-% \ekvdefNoVal{expex}{internal}{\ekvsneakPre{\sine@rnd}}^^A
-% \newcommand*\sine{\ekvoptargTF\sine@args{\sine@final{sin}{d}{3}}}
-% \newcommand*\sine@args[2]
-% {\ekvset{expex}{#1,internal}\rnd{3}\deg{d}\f{sin}\sine@stop{#2}}
-% \def\sine@rnd#1\rnd#2#3\sine@stop{\sine@deg#1#3\sine@stop{#2}}^^A
-% \def\sine@deg#1\deg#2#3\sine@stop{\sine@f#1#3\sine@stop{#2}}^^A
-% \def\sine@f#1\f#2#3\sine@stop{\sine@final{#2}}^^A
-% \newcommand*\sine@final[4]{\fpeval{round(#1#2(#4),#3)}}^^A
-% \makeatother
-% \sine{60}\par
-% \sine[round=10]{60}\par
-% \sine[f=cos,radian]{pi}\par
-% \edef\myval{\sine[f=tan]{1}}\texttt{\meaning\myval}
-% \end{exresult}
-%
-% \paragraph{The same macro using \protect\expkvc}
-% Using \expkvc\ we can set up something equivalent with a bit less code. The
-% implementation chosen in \expkvc\ is more efficient than the example above and
-% way easier to code for the user.
-% \begin{lstlisting}
-% \makeatletter
-% \newcommand*\sine{\ekvoptargTF\sine@a{\sine@b{sin}{d}{3}}}
-% \ekvcSplitAndForward\sine@a\sine@b
-% {
-% f=sin,
-% unit=d,
-% round=3,
-% }
-% \ekvcSecondaryKeys\sine@a
-% {
-% nmeta degree={unit=d},
-% nmeta radian={unit={}},
-% }
-% \newcommand*\sine@b[4]{\fpeval{round(#1#2(#4),#3)}}
-% \makeatother
-% \end{lstlisting}
-% The resulting macro will behave just like the one previously defined, but will
-% have an additional |unit| key, since in \expkvc\ every argument must have a
-% value taking key which defines it.
-%
-%
-% \subsection{Error Messages}
-%
-% \expkv\ should only send messages in case of errors, there are no warnings and
-% no info messages. In this subsection those errors are listed.
-%
-% \subsubsection{Load Time}
-%
-% \file{expkv.tex} checks whether \eTeX\ and the |\expanded| primitive are
-% available. If it isn't, an error will be thrown using |\errmessage|:
-% \begin{lstlisting}
-% ! expkv Error: e-TeX and \expanded required.
-% \end{lstlisting}
-%
-% \subsubsection{Defining Keys}
-%
-% If you get any error from \expkv\ while you're trying to define a key, the
-% definition will be aborted and gobbled.
-%
-% If you try to define a key with an empty set name you'll get:
-% \begin{lstlisting}
-% ! expkv Error: empty set name not allowed.
-% \end{lstlisting}
-%
-% Similarly, if you try to define a key with an empty key name:
-% \begin{lstlisting}
-% ! expkv Error: empty key name not allowed.
-% \end{lstlisting}
-%
-% Both of these messages are done in a way that doesn't throw additional errors
-% due to |\global|, |\long|, etc., not being used correctly if you prefixed one
-% of the defining macros.
-%
-% \subsubsection{Using Keys}
-%
-% This subsubsection contains the errors thrown during |\ekvset|. The errors are
-% thrown in an expandable manner using |\ekverr|. In the following messages
-% \lstinline|<key>| gets replaced with the problematic key's name, and
-% \lstinline|<set>| with the corresponding set. If any errors during \kv\
-% handling are encountered, the entry in the comma separated list will be
-% omitted after the error is thrown and the next \kv\ pair will be parsed.
-%
-% If you're using an undefined key you'll get:
-% \begin{lstlisting}
-% Runaway argument?
-% ! expkv Error: unknown key `<key>' in set `<set>'
-% \end{lstlisting}
-%
-% If you're using a key for which only a normal version and no |NoVal| version
-% is defined, but don't provide a value, you'll get:
-% \begin{lstlisting}
-% Runaway argument?
-% ! expkv Error: missing value for `<key>' in set `<set>'
-% \end{lstlisting}
-%
-% If you're using a key for which only a |NoVal| version and no normal version
-% is defined, but provide a value, you'll get:
-% \begin{lstlisting}
-% Runaway argument?
-% ! expkv Error: unwanted value for `<key>' in set `<set>'
-% \end{lstlisting}
-%
-% If you're using an undefined key in a set for which |\ekvredirectunknown| was
-% used, and the key isn't found in any of the other sets as well, you'll get:
-% \begin{lstlisting}
-% Runaway argument?
-% ! expkv Error: no key `<key>' in sets {<set1>}{<set2>}...
-% \end{lstlisting}
-%
-% If you're using an undefined |NoVal| key in a set for which
-% |\ekvredirectunknownNoVal| was used, and the key isn't found in any of the
-% other sets as well, you'll get:
-% \begin{lstlisting}
-% Runaway argument?
-% ! expkv Error: no NoVal key `<key>' in sets {<set1>}{<set2>}...
-% \end{lstlisting}
-%
-% If you're using a set for which you never executed one of the defining macros
-% from \autoref{sec:define} you'll get a low level \TeX\ error, as that isn't
-% actively tested by the parser (and hence will lead to undefined behaviour and
-% not be gracefully ignored). The error will look like
-% \begin{lstlisting}[language={}]
-% ! Missing \endcsname inserted.
-% <to be read again>
-% \! expkv Error: Set `<set>' undefined.
-% \end{lstlisting}
-%
-% \subsection{Bugs}
-%
-% Just like \pkg{keyval}, \expkv\ is bug free. But if you find \pmso{bugs}hidden
-% features\footnote{Thanks, David!} you can tell me about them either via mail
-% (see the first page) or directly on GitHub if you have an account there:
-% \url{https://github.com/Skillmon/tex_expkv}
-%
-% \subsection{Comparisons}\label{sec:cmp}
-%
-% This subsection makes some basic comparison between \expkv\ and other \kv\
-% packages. The comparisons are really concise, regarding speed, feature range
-% (without listing the features of each package), and bugs and misfeatures.
-%
-% Comparisons of speed are done with a very simple test key and the help of the
-% \pkg{l3benchmark} package. The key and its usage should be equivalent to
-% \begin{lstlisting}
-% \protected\ekvdef{test}{height}{\def\myheight{#1}}
-% \ekvsetdef\expkvtest{test}
-% \expkvtest{ height = 6 }
-% \end{lstlisting}
-% and only the usage of the key, not its definition, is benchmarked. For the
-% impatient, the essence of these comparisons regarding speed and buggy
-% behaviour is contained in \autoref{tab:comp}.
-%
-% As far as I know \expkv\ is the only fully expandable \kv\ parser. I tried to
-% compare \expkv\ to every \kv\ package listed on
-% \href{https://ctan.org/topic/keyval}{CTAN}, however, one might notice that
-% some of those are missing from this list. That's because I didn't get the
-% others to work due to bugs, or because they just provide wrappers around other
-% packages in this list.
-%
-% In this subsection is no benchmark of |\ekvparse| and |\keyval_parse:NNn|
-% contained, as most other packages don't provide equivalent features to my
-% knowledge. |\ekvparse| is slightly faster than |\ekvset|, but keep in mind
-% that it does less. The same is true for |\keyval_parse:NNn| compared to
-% |\keys_set:nn| of \pkg{expl3} (where the difference is much bigger). Comparing
-% just the two, |\ekvparse| is a tad faster than |\keyval_parse:NNn| because of
-% the two tests (for empty key names and only a single equal sign) which are
-% omitted.
-%
-% \paragraph{\pkg{keyval}} is about \SIrange{30}{40}{\percent} faster and has a
-% comparable feature set (actually a bit smaller since \expkv\ supports
-% unknown-key handlers and redirection to other sets) just a slightly different
-% way how it handles keys without values. That might be considered a drawback,
-% as it limits the versatility, but also as an advantage, as it might reduce
-% doubled code. Keep in mind that as soon as someone loads \pkg{xkeyval} the
-% performance of \pkg{keyval} gets replaced by \pkg{xkeyval}'s.
-%
-% Also \pkg{keyval} has a bug, which unfortunately can't really be resolved
-% without breaking backwards compatibility for \emph{many} documents, namely it
-% strips braces from the argument before stripping spaces if the argument isn't
-% surrounded by spaces, also it might strip more than one set of braces. Hence
-% all of the following are equivalent in their outcome, though the last two
-% lines should result in something different than the first two:
-% \begin{lstlisting}[belowskip=0pt]
-% \setkeys{foo}{bar=baz}
-% \setkeys{foo}{bar= {baz}}
-% \setkeys{foo}{bar={ baz}} % should be ` baz'
-% \setkeys{foo}{bar={{baz}}} % should be `{baz}'
-% \end{lstlisting}
-%
-% \paragraph{\pkg{xkeyval}} is roughly twenty times slower, but it provides more
-% functionality, e.g., it has choice keys, boolean keys, and so on. It contains
-% the same bug as \pkg{keyval} as it has to be compatible with it by design (it
-% replaces \pkg{keyval}'s frontend), but also adds even more cases in which
-% braces are stripped that shouldn't be stripped, worsening the situation.
-%
-% \paragraph{\pkg{ltxkeys}} is no longer compatible with the \LaTeX\ kernel
-% starting with the release 2020-10-01. It is over 380 times slower -- which is
-% funny, because it aims to be ``[\ldots] faster [\ldots] than these earlier
-% packages [referring to \pkg{keyval} and \pkg{xkeyval}].'' It needs more time
-% to parse zero~keys than five of the packages in this comparison need to parse
-% 100~keys. Since it aims to have a bigger feature set than \pkg{xkeyval}, it
-% most definitely also has a bigger feature set than \expkv. Also, it can't
-% parse |\long| input, so as soon as your values contain a |\par|, it'll throw
-% errors. Furthermore, \pkg{ltxkeys} doesn't strip outer braces at all by
-% design, which, imho, is a weird design choice. In addition \pkg{ltxkeys} loads
-% \pkg{catoptions} which is known to introduce bugs (e.g., see
-% \url{https://tex.stackexchange.com/questions/461783}). Because it is no longer
-% compatible with the kernel, I stop benchmarking it (so the numbers listed here
-% and in \autoref{tab:comp} regarding \pkg{ltxkeys} were last updated on
-% 2020-10-05).
-%
-% \paragraph{\pkg{l3keys}} is around four and a half times slower, but has an,
-% imho, great interface to define keys. It strips \emph{all} outer spaces, even
-% if somehow multiple spaces ended up on either end. It offers more features,
-% but is pretty much bound to \pkg{expl3} code. Whether that's a drawback is up
-% to you.
-%
-% \paragraph{\pkg{pgfkeys}} is around \num{2.7} times slower for one key if one
-% uses the |/|\meta{path}|/.cd| syntax and almost \SI{20}{\percent} slower if
-% one uses |\pgfqkeys|, but has an \emph{enormous} feature set.
-% To get the best performance |\pgfqkeys| was used in the benchmark. This
-% reduces the overhead for setting the base directory of the benchmark keys by
-% about \SI{43}{\ops} (so both $p_0$ and $T_0$ would be about \SI{43}{\ops}
-% bigger if |\pgfkeys{|\meta{path}|/.cd,|\meta{keys}|}| was used instead).
-% It has the same or a very similar bug \pkg{keyval} has. The brace bug (and
-% also the category fragility) can be fixed by \pkg{pgfkeyx}, but this package
-% was last updated in 2012 and it slows down |\pgfkeys| by factor~\num{8}. Also
-% \pkg{pgfkeyx} is no longer compatible with versions of \pkg{pgfkeys} newer
-% than 2020-05-25.
-%
-% \paragraph{\pkg{kvsetkeys} with \pkg{kvdefinekeys}} is about \num{4.4} times
-% slower, but it works even if commas and equals have category codes different
-% from 12 (just as some other packages in this list). Else the features of the
-% keys are equal to those of \pkg{keyval}, the parser has more features, though.
-%
-% \paragraph{\pkg{options}} is \num{1.7} times slower for only a single value.
-% It has a much bigger feature set. Unfortunately it also suffers from the
-% premature unbracing bug \pkg{keyval} has.
-%
-% \paragraph{\pkg{simplekv}} is hard to compare because I don't speak French (so
-% I don't understand the documentation). There was an update released on
-% 2020-04-27 which greatly improved the package's performance and adds
-% functionality so that it can be used more like most of the other \kv\
-% packages. It has problems with stripping braces and spaces in a hard to
-% predict manner just like \pkg{keyval}. Also, while it tries to be robust
-% against category code changes of commas and equal signs, the used mechanism
-% fails if the \kv\ list already got tokenised. Regarding unknown keys it got a
-% very interesting behaviour. It doesn't throw an error, but stores the \val\ in
-% a new entry accessible with \cs[no-index]{useKV}. Also if you omit \val\ it
-% stores |true| for that \key. For up to three keys, \expkv\ is a bit faster,
-% for more keys \pkg{simplekv} takes the lead.
-%
-% \paragraph{\protect\yax} is over twenty times slower. It has a pretty
-% strange syntax for the \TeX-world, imho, and again a direct equivalent is hard
-% to define (don't understand me wrong, I don't say I don't like the syntax,
-% it's just atypical). It has the premature unbracing bug, too. Also somehow
-% loading \yax\ broke \pkg{options} for me. The tested definition was:
-% \begin{lstlisting}[belowskip=0pt]
-% \usepackage{yax}
-% \defactiveparameter yax {\storevalue\myheight yax:height } % setup
-% \setparameterlist{yax}{ height = 6 } % benchmark
-% \end{lstlisting}
-%
-% \begin{table}
-% \def\fnsym{\textcolor{red!80!black}{*}}%
-% \sisetup{round-precision=1, round-mode=places}%
-% \begingroup
-% \centering
-% \newcommand*\yes{\textcolor{red!80!black} {yes}}^^A
-% \newcommand*\no {\textcolor{green!80!black}{no}}^^A
-% \caption[Comparison of \kv\ packages]
-% {^^A
-% Comparison of \kv\ packages. The packages are ordered from
-% fastest to slowest for one \kv\ pair. Benchmarking was done using
-% \pkg{l3benchmark} and the scripts in the \file{Benchmarks} folder
-% of the \href{https://github.com/Skillmon/tex_expkv}{git repository}.
-% The columns $p_i$ are the polynomial coefficients of a linear fit to the
-% run-time, $p_0$ can be interpreted as the overhead for initialisation
-% and $p_1$ the cost per key. The $T_0$ column is the actual mean ops
-% needed for an empty list argument, as the linear fit doesn't match that
-% point well in general. The column ``BB'' lists whether the
-% parsing is affected by some sort of brace bug, ``CF'' stands for
-% category code fragile and lists whether the parsing breaks with active
-% commas or equal signs.^^A
-% \label{tab:comp}^^A
-% }
-% \begin{tabular}
-% {>{\collectcell\pkg}l<{\endcollectcell}*3{S[table-format=4.1]}ccc}
-% \toprule
-% \rmfamily Package & {$p_1$} & {$p_0$} & {$T_0$}& BB & CF & Date \\
-% \midrule
-% keyval & 13.742 & 1.486 & 7.254 & \yes & \yes & 2014-10-28 \\
-% \expkv & 19.701 & 2.169 & 6.592 & \no & \no & 2020-10-10 \\
-% simplekv & 18.334 & 6.971 & 17.710 & \yes & \yes & 2020-04-27 \\
-% pgfkeys & 24.274 & 1.725 & 10.650 & \yes & \yes & 2020-09-05 \\
-% options & 23.600 & 15.638 & 20.830 & \yes & \yes & 2015-03-01 \\
-% kvsetkeys & {\fnsym} & {\fnsym} & 40.290 & \no & \no & 2019-12-15 \\
-% l3keys & 71.309 & 33.131 & 31.590 & \no & \no & 2020-09-24 \\
-% xkeyval & 253.563 & 202.246 & 168.300 & \yes & \yes & 2014-12-03 \\
-% \yax & 421.853 & 157.003 & 114.700 & \yes & \yes & 2010-01-22 \\
-% ltxkeys & 3400.142 & 4737.958 & 5368.000 & \no & \no & 2012-11-17 \\
-% \bottomrule
-% \end{tabular}
-% \par
-% \endgroup
-% \medskip
-% \fnsym For \pkg{kvsetkeys} the linear model used for the other
-% packages is a poor fit, \pkg{kvsetkeys} seems to have approximately
-% quadratic run-time, the coefficients of the second degree polynomial fit are
-% $p_2=\num{8.240}$, $p_1=\num{44.862}$, and $p_0=\num{60.793}$. Of course the
-% other packages might not really have linear run-time, but at least from 1~to
-% 20~keys the fits don't seem too bad. If one extrapolates the fits for 100
-% \kv\ pairs one finds that most of them match pretty well, the exception
-% being \pkg{ltxkeys}, which behaves quadratic as well with
-% $p_2=\num{23.500}$, $p_1=\num{2906.634}$, and $p_0=\num{6547.489}$.
-% \end{table}
-%
-% \subsection{License}
-%
-% Copyright \textcopyright\ 2020\unless\ifnum\year=2020--\the\year\fi\
-% Jonathan P. Spratte
-%
-% \medskip\noindent
-% This work may be distributed and/or modified under the conditions of the
-% \LaTeX\ Project Public License (LPPL), either version 1.3c of this license or
-% (at your option) any later version. The latest version of this license is in
-% the file:
-%
-% \url{http://www.latex-project.org/lppl.txt}
-%
-% \noindent
-% This work is ``maintained'' (as per LPPL maintenance status) by
-%
-% \mbox{Jonathan P. Spratte}.
-%
-% \end{documentation}^^A=<<
-%
-% \begin{implementation}^^A>>=
-%
-% \clearpage
-%
-% \section{Implementation}^^A>>=
-%^^A the LaTeX package >>=
-% \subsection{The \LaTeX\ Package}
-% First we set up the \LaTeX\ package. That one doesn't really do much except
-% |\input|ting the generic code and identifying itself as a package.
-% \gobbledocstriptag
-%<*pkg>
-% \begin{macrocode}
-\def\ekv@tmp
- {%
- \ProvidesFile{expkv.tex}%
- [\ekvDate\space v\ekvVersion\space an expandable key=val implementation]%
- }
-\input{expkv.tex}
-\ProvidesPackage{expkv}%
- [\ekvDate\space v\ekvVersion\space an expandable key=val implementation]
-% \end{macrocode}
-% \gobbledocstriptag
-%</pkg>
-%^^A=<<
-%^^A the ConTeXt module >>=
-% \subsection{The \ConTeXt\ module}
-% This is pretty straight forward, we just have to change the error throwing
-% mechanism for \ConTeXt\ (the approach taken for plain and \LaTeX\ breaks in
-% \ConTeXt, effectively breaking \ConTeXt, dropping you in an interactive \TeX\
-% session with almost no means of escape).
-% \gobbledocstriptag
-%<*ctx>
-% \begin{macrocode}
-\writestatus{loading}{ConTeXt User Module / expkv}
-\unprotect
-\input expkv.tex
-\long\def\ekv@err@collect#1\par#2%
- {\directlua{tex.error[[\detokenize{#2} Error: #1]]}}
-\writestatus{loading}
- {ConTeXt User Module / expkv / Version \ekvVersion\space loaded}
-\protect\endinput
-% \end{macrocode}
-% \gobbledocstriptag
-%</ctx>
-%^^A=<<
-%^^A main file >>=
-% \subsection{The Generic Code}
-% The rest of this implementation will be the generic code.
-% \gobbledocstriptag
-%<*tex>
-%
-% We make sure that it's only input once:
-% \begin{macrocode}
-\expandafter\ifx\csname ekvVersion\endcsname\relax
-\else
- \expandafter\endinput
-\fi
-% \end{macrocode}
-%
-% Check whether \eTeX\ and |\expanded| are available -- \expkv\ requires \eTeX.
-% \begin{macrocode}
-\begingroup
- \edef\ekvtmpa{\string\expanded}
- \edef\ekvtmpb{\meaning\expanded}
- \expandafter
-\endgroup
-\ifx\ekvtmpa\ekvtmpb
- \expandafter\let\csname ekv@expanded\endcsname\expanded
- \expandafter\let\csname ekv@unexpanded\endcsname\unexpanded
-\else
- \begingroup
- \edef\ekvtmpa{\string\expanded}
- \edef\ekvtmpb{\meaning\normalexpanded}
- \expandafter
- \endgroup
- \ifx\ekvtmpa\ekvtmpb
- \expandafter\let\csname ekv@expanded\endcsname\normalexpanded
- \expandafter\let\csname ekv@unexpanded\endcsname\normalunexpanded
- \else
- \errmessage
- {expkv Error: e-TeX and the \noexpand\expanded primitive required}%
- \expandafter\endinput
- \fi
-\fi
-% \end{macrocode}
-%
-% \begin{macro}{\ekvVersion,\ekvDate}
-% We're on our first input, so lets store the version and date in a macro.
-% \begin{macrocode}
-\def\ekvVersion{1.9a}
-\def\ekvDate{2021-09-20}
-% \end{macrocode}
-% \end{macro}
-%
-% If the \LaTeX\ format is loaded we want to be a good file and report back who
-% we are, for this the package will have defined |\ekv@tmp| to use
-% |\ProvidesFile|, else this will expand to a |\relax| and do no harm.
-% \begin{macrocode}
-\csname ekv@tmp\endcsname
-% \end{macrocode}
-%
-% Store the category code of |@| to later be able to reset it and change it to
-% 11 for now.
-% \begin{macrocode}
-\expandafter\chardef\csname ekv@tmp\endcsname=\catcode`\@
-\catcode`\@=11
-% \end{macrocode}
-% |\ekv@tmp| might later be reused to gobble any prefixes which might be
-% provided to |\ekvdef| and similar in case the names are invalid, we just
-% temporarily use it here as means to store the current category code of |@| to
-% restore it at the end of the file, we never care for the actual definition of
-% it.
-%
-% \begin{macro}[internal]{\ekv@if@lastnamedcs}
-% If the primitive |\lastnamedcs| is available, we can be a bit faster than
-% without it. So we test for this and save the test's result in this macro.
-% \begin{macrocode}
-\begingroup
- \edef\ekv@tmpa{\string \lastnamedcs}
- \edef\ekv@tmpb{\meaning\lastnamedcs}
- \ifx\ekv@tmpa\ekv@tmpb
- \def\ekv@if@lastnamedcs{\long\def\ekv@if@lastnamedcs##1##2{##1}}
- \else
- \def\ekv@if@lastnamedcs{\long\def\ekv@if@lastnamedcs##1##2{##2}}
- \fi
- \expandafter
-\endgroup
-\ekv@if@lastnamedcs
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@empty}
-% Sometimes we have to introduce a token to prevent accidental brace stripping.
-% This token would then need to be removed by |\@gobble| or similar. Instead we
-% can use |\ekv@empty| which will just expand to nothing, that is faster than
-% gobbling an argument.
-% \begin{macrocode}
-\def\ekv@empty{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \@gobble,\@firstofone,\@firstoftwo,\@secondoftwo,
-% \ekv@fi@gobble,\ekv@fi@firstofone,\ekv@fi@firstoftwo,\ekv@fi@secondoftwo,
-% \ekv@gobble@mark,\ekv@gobbleto@stop,\ekv@gobble@from@mark@to@stop
-% }
-% Since branching tests are often more versatile than |\if...\else...\fi|
-% constructs, we define helpers that are branching pretty fast. Also here are
-% some other utility functions that just grab some tokens. The ones that are
-% also contained in \LaTeX\ don't use the |ekv| prefix. Not all of the ones
-% defined here are really needed by \expkv\ but are provided because packages
-% like \expkvd\ or \expkvo\ need them (and I don't want to define them in each
-% package which might need them).
-% \begin{macrocode}
-\long\def\@gobble#1{}
-\long\def\@firstofone#1{#1}
-\long\def\@firstoftwo#1#2{#1}
-\long\def\@secondoftwo#1#2{#2}
-\long\def\ekv@fi@gobble\fi\@firstofone#1{\fi}
-\long\def\ekv@fi@firstofone\fi\@gobble#1{\fi#1}
-\long\def\ekv@fi@firstoftwo\fi\@secondoftwo#1#2{\fi#1}
-\long\def\ekv@fi@secondoftwo\fi\@firstoftwo#1#2{\fi#2}
-\def\ekv@gobble@mark\ekv@mark{}
-\long\def\ekv@gobbleto@stop#1\ekv@stop{}
-\long\def\ekv@gobble@from@mark@to@stop\ekv@mark#1\ekv@stop{}
-% \end{macrocode}
-% \end{macro}
-% As you can see |\ekv@gobbleto@stop| uses a special marker |\ekv@stop|. The
-% package will use three such markers, the one you've seen already, |\ekv@mark|
-% and |\ekv@nil|. Contrarily to how for instance \pkg{expl3} does things, we
-% don't define them, as we don't need them to have an actual meaning. This has
-% the advantage that if they somehow get expanded -- which should never happen
-% if things work out -- they'll throw an error directly.
-%
-% \begin{macro}[internal]
-% {
-% \ekv@ifempty,\ekv@ifempty@,\ekv@ifempty@true,\ekv@ifempty@false,
-% \ekv@ifempty@true@F,\ekv@ifempty@true@F@gobble,
-% \ekv@ifempty@true@F@gobbletwo
-% }
-% We can test for a lot of things building on an if-empty test, so lets define a
-% really fast one. Since some tests might have reversed logic (true if something
-% is not empty) we also set up macros for the reversed branches.
-% \begin{macrocode}
-\long\def\ekv@ifempty#1%
- {%
- \ekv@ifempty@\ekv@ifempty@A#1\ekv@ifempty@B\ekv@ifempty@true
- \ekv@ifempty@A\ekv@ifempty@B\@secondoftwo
- }
-\long\def\ekv@ifempty@#1\ekv@ifempty@A\ekv@ifempty@B{}
-\long\def\ekv@ifempty@true\ekv@ifempty@A\ekv@ifempty@B\@secondoftwo#1#2{#1}
-\long\def\ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo#1#2{#2}
-\long\def\ekv@ifempty@true@F\ekv@ifempty@A\ekv@ifempty@B\@firstofone#1{}
-\long\def\ekv@ifempty@true@F@gobble\ekv@ifempty@A\ekv@ifempty@B\@firstofone#1#2%
- {}
-\long\def\ekv@ifempty@true@F@gobbletwo
- \ekv@ifempty@A\ekv@ifempty@B\@firstofone#1#2#3%
- {}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@ifblank,\ekv@ifblank@}
-% The obvious test that can be based on an if-empty is if-blank, meaning a test
-% checking whether the argument is empty or consists only of spaces. Our version
-% here will be tweaked a bit, as we want to check this, but with one leading
-% |\ekv@mark| token that is to be ignored. The wrapper |\ekv@ifblank| will not
-% be used by \expkv\ for speed reasons but \expkvo\ uses it.
-% \begin{macrocode}
-\long\def\ekv@ifblank#1%
- {%
- \ekv@ifblank@#1\ekv@nil\ekv@ifempty@B\ekv@ifempty@true
- \ekv@ifempty@A\ekv@ifempty@B\@secondoftwo
- }
-\long\def\ekv@ifblank@\ekv@mark#1{\ekv@ifempty@\ekv@ifempty@A}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@ifdefined}
-% We'll need to check whether something is defined quite frequently, so why not
-% define a macro that does this. The following test is expandable and pretty
-% fast. The version with |\lastnamedcs| is the fastest version to test for an
-% undefined macro I know of (that considers both undefined macros and those with
-% the meaning |\relax|).
-% \begin{macrocode}
-\ekv@if@lastnamedcs
- {%
- \long\def\ekv@ifdefined#1{\ifcsname#1\endcsname\ekv@ifdef@\fi\@secondoftwo}
- \def\ekv@ifdef@\fi\@secondoftwo
- {%
- \fi
- \expandafter\ifx\lastnamedcs\relax
- \ekv@fi@secondoftwo
- \fi
- \@firstoftwo
- }
- }
- {%
- \long\def\ekv@ifdefined#1%
- {%
- \ifcsname#1\endcsname\ekv@ifdef@\fi\ekv@ifdef@false#1\endcsname\relax
- \ekv@fi@secondoftwo
- \fi
- \@firstoftwo
- }
- \def\ekv@ifdef@\fi\ekv@ifdef@false{\fi\expandafter\ifx\csname}
- \long\def\ekv@ifdef@false
- #1\endcsname\relax\ekv@fi@secondoftwo\fi\@firstoftwo#2#3%
- {#3}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@strip,\ekv@strip@a,\ekv@strip@b,\ekv@strip@c}
-% We borrow some ideas of \pkg{expl3}'s \pkg{l3tl} to strip spaces
-% from keys and values. This |\ekv@strip| also strips one level of outer braces
-% \emph{after} stripping spaces, so an input of | {abc} | becomes |abc| after
-% stripping. It should be used with |#1| prefixed by |\ekv@mark|. Also this
-% implementation at most strips \emph{one} space from both sides (which should
-% be fine most of the time, since \TeX\ reads consecutive spaces as a single one
-% during tokenisation).
-% \begin{macrocode}
-\def\ekv@strip#1%
- {%
- \long\def\ekv@strip##1%
- {%
- \ekv@strip@a
- ##1\ekv@nil
- \ekv@mark#1%
- #1\ekv@nil
- }%
- \long\def\ekv@strip@a##1\ekv@mark#1{\ekv@strip@b##1\ekv@mark}%
- }
-\ekv@strip{ }
-\long\def\ekv@strip@b#1 \ekv@nil{\ekv@strip@c#1\ekv@nil}
-\long\def\ekv@strip@c\ekv@mark#1\ekv@nil\ekv@mark#2\ekv@nil#3{#3{#1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekv@exparg,\ekv@exparg@,\ekv@expargtwice,\ekv@expargtwice@,\ekv@zero}
-% To reduce some code doublets while gaining some speed (and also as convenience
-% for other packages in the family), it is often useful to expand the first
-% token in a definition once. Let's define a wrapper for this.
-%
-% Also, to end a |\romannumeral| expansion, we want to use |\z@|, which is
-% contained in both plain \TeX\ and \LaTeX, but we use a private name for it to
-% make it easier to spot and hence easier to manage.
-% \begin{macrocode}
-\let\ekv@zero\z@
-\long\def\ekv@exparg#1#2{\expandafter\ekv@exparg@\expandafter{#2}{#1}}
-\long\def\ekv@exparg@#1#2{#2{#1}}%
-\long\def\ekv@expargtwice#1#2{\expandafter\ekv@expargtwice@\expandafter{#2}{#1}}
-\def\ekv@expargtwice@{\expandafter\ekv@exparg@\expandafter}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvcsvloop}
-% \begin{macro}[internal]{\ekv@csv@loop@active,\ekv@csv@loop@active@end}
-% An |\ekvcsvloop| will just loop over a csv list in a simple manner. First we
-% split at active commas (gives better performance this way), next we have to
-% check whether we're at the end of the list (checking for |\ekv@stop|). If
-% not we go on splitting at commas of category other.
-% \begin{macrocode}
-\begingroup
-\def\ekvcsvloop#1{%
-\endgroup
-\long\def\ekvcsvloop##1##2%
- {\ekv@csv@loop@active{##1}\ekv@mark##2#1\ekv@stop#1}
-% \end{macrocode}
-% This does the same as |\ekv@csv@loop| but for active commas.
-% \begin{macrocode}
-\long\def\ekv@csv@loop@active##1##2#1%
- {%
- \ekv@gobble@from@mark@to@stop##2\ekv@csv@loop@active@end\ekv@stop
- \ekv@csv@loop{##1}##2,\ekv@stop,%
- }%
-\long\def\ekv@csv@loop@active@end
- \ekv@stop
- \ekv@csv@loop##1\ekv@mark\ekv@stop,\ekv@stop,%
- {}%
-}
-% \end{macrocode}
-% Do the definitions with the weird catcode.
-% \begin{macrocode}
-\catcode`\,=13
-\ekvcsvloop,
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@csv@loop,\ekv@csv@loop@do,\ekv@csv@loop@end}
-% We use temporary macros and an |\expandafter| chain to preexpand
-% |\ekv@strip| here. After splitting at other commas we check again for end
-% the end of the sublist, check for blank elements which should be ignored,
-% and else strip spaces and execute the user code (protecting it from further
-% expanding with |\unexpanded|).
-% \begin{macrocode}
-\def\ekv@csv@loop#1%
- {%
- \long\def\ekv@csv@loop##1##2,%
- {%
- \ekv@gobble@from@mark@to@stop##2\ekv@csv@loop@end\ekv@stop
- \ekv@ifblank@##2\ekv@nil\ekv@ifempty@B\ekv@csv@loop@blank
- \ekv@ifempty@A\ekv@ifempty@B
- #1\ekv@csv@loop@do{##1}%
- }%
- }
-\expandafter\ekv@csv@loop\expandafter{\ekv@strip{#2}}
-\long\def\ekv@csv@loop@do#1#2{\ekv@unexpanded{#2{#1}}\ekv@csv@loop{#2}\ekv@mark}
-\def\ekv@csv@loop@end#1%
- {%
- \long\def\ekv@csv@loop@end
- \ekv@stop
- \ekv@ifblank@\ekv@mark\ekv@stop\ekv@nil\ekv@ifempty@B\ekv@csv@loop@blank
- \ekv@ifempty@A\ekv@ifempty@B
- #1\ekv@csv@loop@do##1%
- {\ekv@csv@loop@active{##1}\ekv@mark}%
- }
-\expandafter\ekv@csv@loop@end\expandafter{\ekv@strip{\ekv@mark\ekv@stop}}
-\long\expandafter\def\expandafter\ekv@csv@loop@blank
- \expandafter\ekv@ifempty@A\expandafter\ekv@ifempty@B
- \ekv@strip{\ekv@mark#1}\ekv@csv@loop@do#2%
- {\ekv@csv@loop{#2}\ekv@mark}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekv@name,\ekv@name@set,\ekv@name@key}
-% The keys will all follow the same naming scheme, so we define it here.
-% \begin{macrocode}
-\def\ekv@name@set#1{ekv#1(}
-\long\def\ekv@name@key#1{#1)}
-\edef\ekv@name
- {%
- \ekv@unexpanded\expandafter{\ekv@name@set{#1}}%
- \ekv@unexpanded\expandafter{\ekv@name@key{\detokenize{#2}}}%
- }
-\long\ekv@exparg{\def\ekv@name#1#2}{\ekv@name}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@undefined@set}
-% We can misuse the macro name we use to expandably store the set-name in a
-% single token -- since this increases performance drastically, especially for
-% long set-names -- to throw a more meaningful error message in case a set isn't
-% defined. The name of |\ekv@undefined@set| is a little bit misleading, as it is
-% called in either case inside of |\csname|, but the result will be a control
-% sequence with meaning |\relax| if the set is undefined, hence will break the
-% |\csname| building the key-macro which will throw the error message.
-% \begin{macrocode}
-\def\ekv@undefined@set#1{! expkv Error: Set `#1' undefined.}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@checkvalid}
-% We place some restrictions on the allowed names, though, namely sets and
-% keys are not allowed to be empty -- blanks are fine (meaning \mbox{set-
-% or} key-names consisting of spaces). The |\def\ekv@tmp| gobbles any \TeX\
-% prefixes which would otherwise throw errors. This will, however, break the
-% package if an |\outer| has been gobbled this way. I consider that good,
-% because keys shouldn't be defined |\outer| anyways.
-% \begin{macrocode}
-\edef\ekv@checkvalid
- {%
- \ekv@unexpanded\expandafter{\ekv@ifempty{#1}}%
- \ekv@unexpanded
- {{%
- \def\ekv@tmp{}%
- \errmessage{expkv Error: empty set name not allowed}%
- }}%
- {%
- \ekv@unexpanded\expandafter{\ekv@ifempty{#2}}%
- \ekv@unexpanded
- {%
- {%
- \def\ekv@tmp{}%
- \errmessage{expkv Error: empty key name not allowed}%
- }%
- \@secondoftwo
- }%
- }%
- \ekv@unexpanded{\@gobble}%
- }
-\ekv@exparg{\protected\def\ekv@checkvalid#1#2}{\ekv@checkvalid}%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvifdefined,\ekvifdefinedNoVal}
-% And provide user-level macros to test whether a key is defined.
-% \begin{macrocode}
-\ekv@expargtwice{\long\def\ekvifdefined#1#2}%
- {\expandafter\ekv@ifdefined\expandafter{\ekv@name{#1}{#2}}}
-\ekv@expargtwice{\long\def\ekvifdefinedNoVal#1#2}%
- {\expandafter\ekv@ifdefined\expandafter{\ekv@name{#1}{#2}N}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \ekvdef,\ekvdefNoVal,\ekvlet,\ekvletNoVal,\ekvletkv,\ekvletkvNoVal,
-% \ekvdefunknown,\ekvdefunknownNoVal
-% }
-% Set up the key defining macros |\ekvdef| etc. We use temporary macros to set
-% these up with a few expansions already done.
-% \begin{macrocode}
-\def\ekvdef#1#2#3#4%
- {%
- \protected\long\def\ekvdef##1##2##3%
- {#1{\expandafter\def\csname#2\endcsname####1{##3}#3}}%
- \protected\long\def\ekvdefNoVal##1##2##3%
- {#1{\expandafter\def\csname#2N\endcsname{##3}#3}}%
- \protected\long\def\ekvlet##1##2##3%
- {#1{\expandafter\let\csname#2\endcsname##3#3}}%
- \protected\long\def\ekvletNoVal##1##2##3%
- {#1{\expandafter\let\csname#2N\endcsname##3#3}}%
- \ekv@expargtwice{\protected\long\def\ekvdefunknown##1##2}%
- {%
- \romannumeral
- \expandafter\ekv@exparg@\expandafter
- {%
- \expandafter\expandafter\expandafter
- \def\expandafter\csname\ekv@name{##1}{}u\endcsname####1####2{##2}%
- #3%
- }%
- {\ekv@zero\ekv@checkvalid{##1}.}%
- }%
- \ekv@expargtwice{\protected\long\def\ekvdefunknownNoVal##1##2}%
- {%
- \romannumeral
- \expandafter\ekv@exparg@\expandafter
- {%
- \expandafter\expandafter\expandafter
- \def\expandafter\csname\ekv@name{##1}{}uN\endcsname####1{##2}%
- #3%
- }%
- {\ekv@zero\ekv@checkvalid{##1}.}%
- }%
- \protected\long\def\ekvletkv##1##2##3##4%
- {%
- #1%
- {%
- \expandafter\let\csname#2\expandafter\endcsname
- \csname#4\endcsname
- #3%
- }%
- }%
- \protected\long\def\ekvletkvNoVal##1##2##3##4%
- {%
- #1%
- {%
- \expandafter\let\csname#2N\expandafter\endcsname
- \csname#4N\endcsname
- #3%
- }%
- }%
- }
-\edef\ekvdefNoVal
- {%
- {\ekv@unexpanded\expandafter{\ekv@checkvalid{#1}{#2}}}%
- {\ekv@unexpanded\expandafter{\ekv@name{#1}{#2}}}%
- {%
- \ekv@unexpanded{\expandafter\ekv@defsetmacro\csname}%
- \ekv@unexpanded\expandafter{\ekv@undefined@set{#1}\endcsname{#1}}%
- }%
- {\ekv@unexpanded\expandafter{\ekv@name{#3}{#4}}}%
- }
-\expandafter\ekvdef\ekvdefNoVal
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvredirectunknown,\ekvredirectunknownNoVal}
-% \begin{macro}[internal]
-% {
-% \ekv@defredirectunknown,\ekv@redirectunknown@aux,
-% \ekv@redirectunknownNoVal@aux
-% }
-% The redirection macros prepare the unknown function by looping over the
-% provided list of sets and leaving a |\ekv@redirect@kv| or |\ekv@redirect@k|
-% for each set. Only the first of these internals will receive the \key\ and
-% \val\ as arguments.
-% \begin{macrocode}
-\protected\def\ekvredirectunknown
- {%
- \ekv@defredirectunknown
- \ekv@redirect@kv
- \ekv@err@redirect@kv@notfound
- {\long\ekvdefunknown}%
- \ekv@redirectunknown@aux
- }
-\protected\def\ekvredirectunknownNoVal
- {%
- \ekv@defredirectunknown
- \ekv@redirect@k
- \ekv@err@redirect@k@notfound
- \ekvdefunknownNoVal
- \ekv@redirectunknownNoVal@aux
- }
-\protected\def\ekv@defredirectunknown#1#2#3#4#5#6%
- {%
- \begingroup
- \edef\ekv@tmp
- {%
- \ekvcsvloop#1{#6}%
- \ekv@unexpanded{#2}%
- {\ekvcsvloop{}{#5,#6}}%
- }%
- \ekv@expargtwice
- {\endgroup#3{#5}}%
- {\expandafter#4\ekv@tmp\ekv@stop}%
- }
-\def\ekv@redirectunknown@aux#1{#1{##1}{##2}}
-\def\ekv@redirectunknownNoVal@aux#1{#1{##1}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekv@redirect@k,\ekv@redirect@k@a,\ekv@redirect@k@a@,
-% \ekv@redirect@k@b,\ekv@redirect@k@c,\ekv@redirect@k@d,
-% \ekv@redirect@kv,\ekv@redirect@kv@a,\ekv@redirect@kv@a@,
-% \ekv@redirect@kv@b,\ekv@redirect@kv@c,\ekv@redirect@kv@d
-% }
-% The redirect code works by some simple loop over all the sets, which we
-% already preprocessed in |\ekv@defredirectunknown|. For some optimisation we
-% blow this up a bit code wise, essentially, all this does is |\ekvifdefined|
-% or |\ekvifdefinedNoVal| in each set, if there is a match gobble the
-% remainder of the specified sets and execute the key macro, else go on with
-% the next set (to which the \key\ and \val\ are forwarded).
-%
-% First we set up some code which is different depending on |\lastnamedcs|
-% being available or not. All this is stored in a temporary macro to have
-% pre-expanded |\ekv@name| constellations ready.
-% \begin{macrocode}
-\def\ekv@redirect@k#1#2#3#4%
- {%
- \ekv@if@lastnamedcs
- {%
- \def\ekv@redirect@k##1##2##3%
- {%
- \ifcsname#1\endcsname\ekv@redirect@k@a\fi
- ##3{##1}%
- }%
- \def\ekv@redirect@k@a\fi{\fi\expandafter\ekv@redirect@k@b\lastnamedcs}%
- \long\def\ekv@redirect@kv##1##2##3##4%
- {%
- \ifcsname#2\endcsname\ekv@redirect@kv@a\fi\@gobble{##1}%
- ##4{##1}{##2}%
- }%
- \def\ekv@redirect@kv@a\fi\@gobble
- {\fi\expandafter\ekv@redirect@kv@b\lastnamedcs}%
- }
- {%
- \def\ekv@redirect@k##1##2##3%
- {%
- \ifcsname#1\endcsname\ekv@redirect@k@a\fi\ekv@redirect@k@a@
- #1\endcsname
- ##3{##1}%
- }%
- \def\ekv@redirect@k@a@#3\endcsname{}%
- \def\ekv@redirect@k@a\fi\ekv@redirect@k@a@
- {\fi\expandafter\ekv@redirect@k@b\csname}%
- \long\def\ekv@redirect@kv##1##2##3##4%
- {%
- \ifcsname#2\endcsname\ekv@redirect@kv@a\fi\ekv@redirect@kv@a@
- #2\endcsname{##1}%
- ##4{##1}{##2}%
- }%
- \long\def\ekv@redirect@kv@a@#4\endcsname##3{}%
- \def\ekv@redirect@kv@a\fi\ekv@redirect@kv@a@
- {\fi\expandafter\ekv@redirect@kv@b\csname}%
- }%
- }
-% \end{macrocode}
-% The key name given to this loop will already be |\detokenize|d by |\ekvset|,
-% so we can safely remove the |\detokenize| here for some performance gain.
-% \begin{macrocode}
-\def\ekv@redirect@kv#1\detokenize#2#3\ekv@stop{\ekv@unexpanded{#1#2#3}}
-\edef\ekv@redirect@kv
- {%
- {\expandafter\ekv@redirect@kv\ekv@name{#2}{#1}N\ekv@stop}%
- {\expandafter\ekv@redirect@kv\ekv@name{#3}{#2}\ekv@stop}%
- {\expandafter\ekv@redirect@kv\ekv@name{#1}{#2}N\ekv@stop}%
- {\expandafter\ekv@redirect@kv\ekv@name{#1}{#2}\ekv@stop}%
- }
-% \end{macrocode}
-% Everything is ready to make the real definitions.
-% \begin{macrocode}
-\expandafter\ekv@redirect@k\ekv@redirect@kv
-% \end{macrocode}
-% The remaining macros here are independent on |\lastnamedcs|, starting from
-% the |@b| we know that there is a hash table entry, and get the macro as a
-% parameter. We still have to test whether the macro is |\relax|, depending on
-% the result of that test we have to either remove the remainder of the
-% current test, or the remainder of the set list and invoke the macro.
-% \begin{macrocode}
-\def\ekv@redirect@k@b#1%
- {\ifx\relax#1\ekv@redirect@k@c\fi\ekv@redirect@k@d#1}
-\def\ekv@redirect@k@c\fi\ekv@redirect@k@d#1{\fi}
-\def\ekv@redirect@k@d#1#2\ekv@stop{#1}
-\def\ekv@redirect@kv@b#1%
- {\ifx\relax#1\ekv@redirect@kv@c\fi\ekv@redirect@kv@d#1}
-\long\def\ekv@redirect@kv@c\fi\ekv@redirect@kv@d#1#2{\fi}
-\long\def\ekv@redirect@kv@d#1#2#3\ekv@stop{#1{#2}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@defsetmacro}
-% In order to enhance the speed the set name given to |\ekvset| will be turned
-% into a control sequence pretty early, so we have to define that control
-% sequence.
-% \begin{macrocode}
-\edef\ekv@defsetmacro
- {%
- \ekv@unexpanded{\ifx#1\relax\edef#1##1}%
- {%
- \ekv@unexpanded\expandafter{\ekv@name@set{#2}}%
- \ekv@unexpanded\expandafter{\ekv@name@key{##1}}%
- }%
- \ekv@unexpanded{\fi}%
- }
-\ekv@exparg{\protected\def\ekv@defsetmacro#1#2}{\ekv@defsetmacro}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvifdefinedset}
-% \begin{macrocode}
-\ekv@expargtwice{\def\ekvifdefinedset#1}%
- {\expandafter\ekv@ifdefined\expandafter{\ekv@undefined@set{#1}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvset}
-% Set up |\ekvset|, which should not be affected by active commas and equal
-% signs. The equal signs are a bit harder to cope with and we'll do that later,
-% but the active commas can be handled by just doing two comma-splitting loops
-% one at actives one at others. That's why we define |\ekvset| here with a
-% temporary meaning just to set up the things with two different category codes.
-% |#1| will be a \texttt{,\textsubscript{13}} and |#2| will be a
-% \texttt{=\textsubscript{13}}.
-% \begin{macrocode}
-\begingroup
-\def\ekvset#1#2{%
-\endgroup
-\ekv@exparg{\long\def\ekvset##1##2}%
- {%
- \expandafter\expandafter\expandafter
- \ekv@set\expandafter\csname\ekv@undefined@set{##1}\endcsname
- \ekv@mark##2#1\ekv@stop#1{}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@set}
-% |\ekv@set| will split the \kv\ list at active commas. Then it has to check
-% whether there were unprotected other commas and resplit there.
-% \begin{macrocode}
-\long\def\ekv@set##1##2#1%
- {%
-% \end{macrocode}
-% Test whether we're at the end, if so invoke |\ekv@endset|,
-% \begin{macrocode}
- \ekv@gobble@from@mark@to@stop##2\ekv@endset\ekv@stop
-% \end{macrocode}
-% else go on with other commas.
-% \begin{macrocode}
- \ekv@set@other##1##2,\ekv@stop,%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@endset}
-% |\ekv@endset| is a hungry little macro. It will eat everything that remains
-% of |\ekv@set| and unbrace the sneaked stuff.
-% \begin{macrocode}
-\long\def\ekv@endset
- \ekv@stop\ekv@set@other##1\ekv@mark\ekv@stop,\ekv@stop,##2%
- {##2}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@eq@other,\ekv@eq@active}
-% Splitting at equal signs will be done in a way that checks whether there is
-% an equal sign and splits at the same time. This gets quite messy and the
-% code might look complicated, but this is pretty fast (faster than first
-% checking for an equal sign and splitting if one is found). The splitting
-% code will be adapted for |\ekvset| and |\ekvparse| to get the most speed,
-% but some of these macros don't require such adaptions. |\ekv@eq@other| and
-% |\ekv@eq@active| will split the argument at the first equal sign and insert
-% the macro which comes after the first following |\ekv@mark|. This allows for
-% fast branching based on \TeX's argument grabbing rules and we don't have to
-% split after the branching if the equal sign was there.
-% \begin{macrocode}
-\long\def\ekv@eq@other##1=##2\ekv@mark##3{##3##1\ekv@stop\ekv@mark##2}
-\long\def\ekv@eq@active##1#2##2\ekv@mark##3{##3##1\ekv@stop\ekv@mark##2}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@set@other}
-% The macro |\ekv@set@other| is guaranteed to get only single \kv\ pairs.
-% \begin{macrocode}
-\long\def\ekv@set@other##1##2,%
- {%
-% \end{macrocode}
-% First we test whether we're done.
-% \begin{macrocode}
- \ekv@gobble@from@mark@to@stop##2\ekv@endset@other\ekv@stop
-% \end{macrocode}
-% If not we split at the equal sign of category other.
-% \begin{macrocode}
- \ekv@eq@other##2\ekv@nil\ekv@mark\ekv@set@eq@other@a
- =\ekv@mark\ekv@set@eq@active
-% \end{macrocode}
-% And insert the set name for the next recursion step of |\ekv@set@other|.
-% \begin{macrocode}
- ##1%
- \ekv@mark
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@set@eq@other@a, \ekv@set@eq@other@b}
-% The first of these two macros runs the split-test for equal signs of
-% category active. It will only be inserted if the \kv\ pair contained at
-% least one equal sign of category other and |##1| will contain everything up
-% to that equal sign.
-% \begin{macrocode}
-\long\def\ekv@set@eq@other@a##1\ekv@stop
- {%
- \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@other@active
- #2\ekv@mark\ekv@set@eq@other@b
- }
-% \end{macrocode}
-% The second macro will have been called by |\ekv@eq@active| if no active
-% equal sign was found. All it does is remove the excess tokens of that
-% test and forward the \kv\ pair to |\ekv@set@pair|. Normally we would have to
-% also gobble an additional |\ekv@mark| after |\ekv@stop|, but this mark is
-% needed to delimit |\ekv@set@pair|'s argument anyway, so we just leave it
-% there.
-% \begin{macrocode}
-\ekv@exparg
- {%
- \long\def\ekv@set@eq@other@b
- ##1\ekv@nil\ekv@mark\ekv@set@eq@other@active\ekv@stop\ekv@mark
- ##2\ekv@nil=\ekv@mark\ekv@set@eq@active
- }%
- {\ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2\ekv@nil}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@set@eq@other@active}
-% |\ekv@set@eq@other@active| will be called if the \kv\ pair was wrongly
-% split on an equal sign of category other but has an earlier equal sign of
-% category active. |##1| will be the contents up to the active equal sign and
-% |##2| everything that remains until the first found other equal sign. It has
-% to reinsert the equal sign and forward things to |\ekv@set@pair|.
-% \begin{macrocode}
-\ekv@exparg
- {%
- \long\def\ekv@set@eq@other@active
- ##1\ekv@stop##2\ekv@nil#2\ekv@mark
- \ekv@set@eq@other@b\ekv@mark##3=\ekv@mark\ekv@set@eq@active
- }%
- {\ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2=##3}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@set@eq@active, \ekv@set@eq@active@}
-% |\ekv@set@eq@active| will be called when there was no equal sign of category
-% other in the \kv\ pair. It removes the excess tokens of the prior test and
-% split-checks for an active equal sign.
-% \begin{macrocode}
-\long\def\ekv@set@eq@active
- ##1\ekv@nil\ekv@mark\ekv@set@eq@other@a\ekv@stop\ekv@mark
- {%
- \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@active@
- #2\ekv@mark\ekv@set@noeq
- }
-% \end{macrocode}
-% If an active equal sign was found in |\ekv@set@eq@active| we'll have to pass
-% the now split \kv\ pair on to |\ekv@set@pair|.
-% \begin{macrocode}
-\ekv@exparg
- {\long\def\ekv@set@eq@active@##1\ekv@stop##2\ekv@nil#2\ekv@mark\ekv@set@noeq}%
- {\ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2\ekv@nil}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@set@noeq}
-% If no active equal sign was found by |\ekv@set@eq@active| there is no equal
-% sign contained in the parsed list entry. In that case we have to check
-% whether the entry is blank in order to ignore it (in which case we'll have
-% to gobble the set-name which was put after these tests by |\ekv@set@other|).
-% Else this is a |NoVal| key and the entry is passed on to |\ekv@set@key|.
-% \begin{macrocode}
-\edef\ekv@set@noeq
- {%
- \ekv@unexpanded
- {%
- \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@set@was@blank
- \ekv@ifempty@A\ekv@ifempty@B
- }%
- \ekv@unexpanded\expandafter
- {\ekv@strip{##1}{\expandafter\ekv@set@key\detokenize}\ekv@mark}%
- }
-\ekv@exparg
- {%
- \long\def\ekv@set@noeq
- ##1\ekv@nil\ekv@mark\ekv@set@eq@active@\ekv@stop\ekv@mark
- }%
- {\ekv@set@noeq}
-\expandafter\def\expandafter\ekv@set@was@blank
- \expandafter\ekv@ifempty@A\expandafter\ekv@ifempty@B
- \ekv@strip{\ekv@mark##1}##2\ekv@mark
- {\ekv@set@other}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@endset@other}
-% All that's left for |\ekv@set@other| is the macro which breaks the recursion
-% loop at the end. This is done by gobbling all the remaining tokens.
-% \begin{macrocode}
-\long\def\ekv@endset@other
- \ekv@stop
- \ekv@eq@other\ekv@mark\ekv@stop\ekv@nil\ekv@mark\ekv@set@eq@other@a
- =\ekv@mark\ekv@set@eq@active
- {\ekv@set}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvbreak,\ekvbreakPreSneak,\ekvbreakPostSneak}
-% Provide macros that can completely stop the parsing of |\ekvset|, who knows
-% what it'll be useful for.
-% \begin{macrocode}
-\long\def\ekvbreak##1##2\ekv@stop#1##3{##1}
-\long\def\ekvbreakPreSneak ##1##2\ekv@stop#1##3{##1##3}
-\long\def\ekvbreakPostSneak##1##2\ekv@stop#1##3{##3##1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvsneak,\ekvsneakPre}
-% One last thing we want to do for |\ekvset| is to provide macros that just
-% smuggle stuff after |\ekvset|'s effects.
-% \begin{macrocode}
-\long\def\ekvsneak##1##2\ekv@stop#1##3{##2\ekv@stop#1{##3##1}}
-\long\def\ekvsneakPre##1##2\ekv@stop#1##3{##2\ekv@stop#1{##1##3}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvparse}
-% Additionally to the |\ekvset| macro we also want to provide an |\ekvparse|
-% macro, that has the same scope as |\keyval_parse:NNn| from \pkg{expl3}.
-% This is pretty analogue to the |\ekvset| implementation, we just put an
-% |\unexpanded| here and there instead of other macros to stop the |\expanded|
-% on our output. The |\unexpanded\expanded{{...}}| ensures that the material
-% is in an alignment safe group at all time, and that it doesn't expand any
-% further in an |\edef| or |\expanded| context.
-% \begin{macrocode}
-\long\def\ekvparse##1##2##3%
- {%
- \ekv@unexpanded\ekv@expanded
- {{\ekv@parse{##1}{##2}\ekv@mark##3#1\ekv@stop#1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@parse}
-% \begin{macrocode}
-\long\def\ekv@parse##1##2##3#1%
- {%
- \ekv@gobble@from@mark@to@stop##3\ekv@endparse\ekv@stop
- \ekv@parse@other{##1}{##2}##3,\ekv@stop,%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@endparse}
-% \begin{macrocode}
-\long\def\ekv@endparse
- \ekv@stop\ekv@parse@other##1\ekv@mark\ekv@stop,\ekv@stop,%
- {}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@parse@other}
-% \begin{macrocode}
-\long\def\ekv@parse@other##1##2##3,%
- {%
- \ekv@gobble@from@mark@to@stop##3\ekv@endparse@other\ekv@stop
- \ekv@eq@other##3\ekv@nil\ekv@mark\ekv@parse@eq@other@a
- =\ekv@mark\ekv@parse@eq@active
- {##1}{##2}%
- \ekv@mark
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@parse@eq@other@a,\ekv@parse@eq@other@b}
-% \begin{macrocode}
-\long\def\ekv@parse@eq@other@a##1\ekv@stop
- {%
- \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active
- #2\ekv@mark\ekv@parse@eq@other@b
- }
-\ekv@exparg
- {%
- \long\def\ekv@parse@eq@other@b
- ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active\ekv@stop\ekv@mark
- ##2\ekv@nil=\ekv@mark\ekv@parse@eq@active
- }%
- {\ekv@strip{##1}\ekv@parse@pair##2\ekv@nil}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@parse@eq@other@active}
-% \begin{macrocode}
-\ekv@exparg
- {%
- \long\def\ekv@parse@eq@other@active
- ##1\ekv@stop##2\ekv@nil#2\ekv@mark
- \ekv@parse@eq@other@b\ekv@mark##3=\ekv@mark\ekv@parse@eq@active
- }%
- {\ekv@strip{##1}\ekv@parse@pair##2=##3}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@parse@eq@active,\ekv@parse@eq@active@}
-% \begin{macrocode}
-\long\def\ekv@parse@eq@active
- ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@a\ekv@stop\ekv@mark
- {%
- \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@active@
- #2\ekv@mark\ekv@parse@noeq
- }
-\ekv@exparg
- {\long\def\ekv@parse@eq@active@##1\ekv@stop##2#2\ekv@mark\ekv@parse@noeq}%
- {\ekv@strip{##1}\ekv@parse@pair##2}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@parse@noeq}
-% \begin{macrocode}
-\edef\ekv@parse@noeq
- {%
- \ekv@unexpanded
- {%
- \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@parse@was@blank
- \ekv@ifempty@A\ekv@ifempty@B
- }%
- \ekv@unexpanded\expandafter{\ekv@strip{##1}\ekv@parse@key}%
- }
-\ekv@exparg
- {%
- \long\def\ekv@parse@noeq
- ##1\ekv@nil\ekv@mark\ekv@parse@eq@active@\ekv@stop\ekv@mark
- }%
- {\ekv@parse@noeq}
-\expandafter\def\expandafter\ekv@parse@was@blank
- \expandafter\ekv@ifempty@A\expandafter\ekv@ifempty@B
- \ekv@strip{\ekv@mark##1}\ekv@parse@key
- {\ekv@parse@other}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@endparse@other}
-% \begin{macrocode}
-\long\def\ekv@endparse@other
- \ekv@stop
- \ekv@eq@other\ekv@mark\ekv@stop\ekv@nil\ekv@mark\ekv@parse@eq@other@a
- =\ekv@mark\ekv@parse@eq@active
- {\ekv@parse}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@parse@pair,\ekv@parse@pair@}
-% \begin{macrocode}
-\ekv@exparg{\long\def\ekv@parse@pair##1##2\ekv@nil}%
- {\ekv@strip{##2}\ekv@parse@pair@{##1}}
-\long\def\ekv@parse@pair@##1##2##3##4%
- {%
- \ekv@unexpanded{##4{##2}{##1}}%
- \ekv@parse@other{##3}{##4}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@parse@key}
-% \begin{macrocode}
-\long\def\ekv@parse@key##1##2%
- {%
- \ekv@unexpanded{##2{##1}}%
- \ekv@parse@other{##2}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% Finally really setting things up with |\ekvset|'s temporary meaning:
-% \begin{macrocode}
-}
-\catcode`\,=13
-\catcode`\==13
-\ekvset,=
-% \end{macrocode}
-%
-% \begin{macro}{\ekvsetSneaked}
-% This macro can be defined just by expanding |\ekvsneak| once after expanding
-% |\ekvset|. To expand everything as much as possible early on we use a
-% temporary definition.
-% \begin{macrocode}
-\edef\ekvsetSneaked
- {%
- \ekv@unexpanded{\ekvsneak{#2}}%
- \ekv@unexpanded\expandafter{\ekvset{#1}{#3}}%
- }
-\ekv@expargtwice{\long\def\ekvsetSneaked#1#2#3}{\ekvsetSneaked}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvchangeset}
-% Provide a macro that is able to switch out the current \set\ in |\ekvset|.
-% This operation allows something similar to \pkg{pgfkeys}'s
-% \texttt{\meta{key}/.cd} mechanism. However this operation can be more
-% expensive than |/.cd| as we can't just redefine some token to reflect this,
-% but have to switch out the set expandably, so this works similar to the
-% |\ekvsneak| macros reading and reinserting things, but it only has to read and
-% reinsert the remainder of the current key's replacement code.
-% \begin{macrocode}
-\ekv@exparg{\def\ekvchangeset#1}%
- {%
- \expandafter\expandafter\expandafter
- \ekv@changeset\expandafter\csname\ekv@undefined@set{#1}\endcsname\ekv@empty
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@changeset}
-% This macro does the real change-out of |\ekvchangeset|. |#2| will have a
-% leading |\ekv@empty| so that braces aren't stripped accidentally, but that
-% will not hurt and just expand to nothing in one step.
-% \begin{macrocode}
-\long\def\ekv@changeset#1#2\ekv@set@other#3{#2\ekv@set@other#1}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}[internal]
-% {
-% \ekv@set@pair,\ekv@set@pair@a,\ekv@set@pair@b,\ekv@set@pair@c,
-% \ekv@set@pair@d,\ekv@set@pair@e
-% }
-% |\ekv@set@pair| gets invoked with the space and brace stripped and
-% |\detokenize|d key-name as its first, the value as the second, and the set
-% name as the third argument. It provides tests for the key-macros and
-% everything to be able to throw meaningful error messages if it isn't
-% defined. We have two routes here, one if |\lastnamedcs| is defined and one
-% if it isn't. The big difference is that if it is we can omit a |\csname| and
-% instead just expand |\lastnamedcs| once to get the control sequence.
-% If the macro is defined the value will be space and brace stripped and the
-% key-macro called. Else branch into the error handling provided by
-% |\ekv@set@pair|.
-% \begin{macrocode}
-\ekv@if@lastnamedcs
- {%
- \long\def\ekv@set@pair#1\ekv@mark#2\ekv@nil#3%
- {%
- \ifcsname #3{#1}\endcsname\ekv@set@pair@a\fi\@secondoftwo
- {#2}%
- {%
- \ifcsname #3{}u\endcsname\ekv@set@pair@a\fi\@secondoftwo
- {#2}%
- {%
- \ekv@ifdefined{#3{#1}N}%
- \ekv@err@noarg
- \ekv@err@unknown
- #3%
- }%
- {#1}%
- }%
- \ekv@set@other#3%
- }
- \def\ekv@set@pair@a\fi\@secondoftwo
- {\fi\expandafter\ekv@set@pair@b\lastnamedcs}
- }
- {%
- \long\def\ekv@set@pair#1\ekv@mark#2\ekv@nil#3%
- {%
- \ifcsname #3{#1}\endcsname
- \ekv@set@pair@a\fi\ekv@set@pair@c#3{#1}\endcsname
- {#2}%
- {%
- \ifcsname #3{}u\endcsname
- \ekv@set@pair@a\fi\ekv@set@pair@c#3{}u\endcsname
- {#2}%
- {%
- \ekv@ifdefined{#3{#1}N}%
- \ekv@err@noarg
- \ekv@err@unknown
- #3%
- }%
- {#1}%
- }%
- \ekv@set@other#3%
- }
- \def\ekv@set@pair@a\fi\ekv@set@pair@c{\fi\expandafter\ekv@set@pair@b\csname}
- \long\def\ekv@set@pair@c#1\endcsname#2#3{#3}
- }
-\long\def\ekv@set@pair@b#1%
- {%
- \ifx#1\relax
- \ekv@set@pair@e
- \fi
- \ekv@set@pair@d#1%
- }
-\ekv@exparg{\long\def\ekv@set@pair@d#1#2#3}{\ekv@strip{#2}#1}
-\long\def\ekv@set@pair@e\fi\ekv@set@pair@d#1#2#3{\fi#3}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {\ekv@set@key,\ekv@set@key@a,\ekv@set@key@b,\ekv@set@key@c}
-% Analogous to |\ekv@set@pair|, |\ekv@set@key| builds the |NoVal| key-macro and
-% provides an error-branch. |\ekv@set@key@| will test whether the key-macro is
-% defined and if so call it, else the errors are thrown.
-% \begin{macrocode}
-\ekv@if@lastnamedcs
- {%
- \long\def\ekv@set@key#1\ekv@mark#2%
- {%
- \ifcsname #2{#1}N\endcsname\ekv@set@key@a\fi\@firstofone
- {%
- \ifcsname #2{}uN\endcsname\ekv@set@key@a\fi\@firstofone
- {%
- \ekv@ifdefined{#2{#1}}%
- \ekv@err@reqval
- \ekv@err@unknown
- #2%
- }%
- {#1}%
- }%
- \ekv@set@other#2%
- }
- \def\ekv@set@key@a\fi\@firstofone{\fi\expandafter\ekv@set@key@b\lastnamedcs}
- }
- {%
- \long\def\ekv@set@key#1\ekv@mark#2%
- {%
- \ifcsname #2{#1}N\endcsname
- \ekv@set@key@a\fi\ekv@set@key@c#2{#1}N\endcsname
- {%
- \ifcsname #2{}uN\endcsname
- \ekv@set@key@a\fi\ekv@set@key@c#2{}uN\endcsname
- {%
- \ekv@ifdefined{#2{#1}}%
- \ekv@err@reqval
- \ekv@err@unknown
- #2%
- }%
- {#1}%
- }%
- \ekv@set@other#2%
- }
- \def\ekv@set@key@a\fi\ekv@set@key@c{\fi\expandafter\ekv@set@key@b\csname}
- \long\def\ekv@set@key@c#1N\endcsname#2{#2}
- }
-\long\def\ekv@set@key@b#1%
- {%
- \ifx#1\relax
- \ekv@fi@secondoftwo
- \fi
- \@firstoftwo#1%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvsetdef}
-% Provide a macro to define a shorthand to use |\ekvset| on a specified \set.
-% To gain the maximum speed |\ekvset| is expanded twice by
-% |\ekv@exparg| so that during runtime the macro storing the set name
-% is already built and one |\expandafter| doesn't have to be used.
-% \begin{macrocode}
-\ekv@expargtwice{\protected\def\ekvsetdef#1#2}%
- {%
- \romannumeral
- \ekv@exparg{\ekv@zero\ekv@exparg{\long\def#1##1}}%
- {\ekvset{#2}{##1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvsetSneakeddef,\ekvsetdefSneaked}
-% And do the same for |\ekvsetSneaked| in the two possible ways, with a fixed
-% sneaked argument and with a flexible one.
-% \begin{macrocode}
-\ekv@expargtwice{\protected\def\ekvsetSneakeddef#1#2}%
- {%
- \romannumeral
- \ekv@exparg{\ekv@zero\ekv@exparg{\long\def#1##1##2}}%
- {\ekvsetSneaked{#2}{##1}{##2}}%
- }
-\ekv@expargtwice{\protected\def\ekvsetdefSneaked#1#2#3}%
- {%
- \romannumeral
- \ekv@exparg{\ekv@zero\ekv@exparg{\long\def#1##1}}%
- {\ekvsetSneaked{#2}{#3}{##1}}%
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@alignsafe,\ekv@endalignsafe}
-% These macros protect the usage of ampersands inside of alignment contexts.
-% \begin{macrocode}
-\begingroup
-\catcode`\^^@=2
-\@firstofone{\endgroup
- \def\ekv@alignsafe{\romannumeral\iffalse{\fi`^^@ }
-}
-\def\ekv@endalignsafe{\ifnum`{=\ekv@zero}\fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekvoptarg,\ekvoptargTF}
-% Provide macros to expandably collect an optional argument in brackets. The
-% macros here are pretty simple in nature compared to \pkg{xparse}'s
-% possibilities (they don't care for nested bracket levels).
-%
-% We start with a temporary definition to pre-expand |\ekv@alignsafe| (will be
-% |#1|) and |\ekv@endalignsafe| (will be |#2|). As |\ekv@alignsafe| starts with
-% a |\romannumeral| we use that to also control the number of steps needed
-% instead of adding another |\romannumeral|. For this we have to remove the
-% space token from the end of |\ekv@alignsafe|'s definition.
-% \begin{macrocode}
-\begingroup
-\def\ekvoptarg#1#2{%
-\endgroup
-% \end{macrocode}
-% The real definition starts an expansion context and afterwards grabs the
-% arguments. |#1| will be the next step, |#2| the default value, and |#3| might
-% be an opening bracket, or the mandatory argument. We check for the opening
-% bracket, if it is found grab the optional argument, else leave |#1{#2}| in the
-% input stream after ending the expansion context.
-% \begin{macrocode}
-\def\ekvoptarg{#1\ekv@optarg@a}
-\long\def\ekv@optarg@a##1##2##3%
- {%
- \ekv@optarg@if\ekv@mark##3\ekv@mark\ekv@optarg@b\ekv@mark[\ekv@mark
- #2%
- \@firstofone{ ##1}{##2}{##3}%
- }%
-% \end{macrocode}
-% The other variant of this will do roughly the same. Here, |#1| will be the
-% next step if an optional argument is found, |#2| the next step else, and |#3|
-% might be the opening bracket or mandatory argument.
-% \begin{macrocode}
-\def\ekvoptargTF{#1\ekv@optargTF@a}
-\long\def\ekv@optargTF@a##1##2##3%
- {%
- \ekv@optarg@if\ekv@mark##3\ekv@mark\ekv@optargTF@b{##1}\ekv@mark[\ekv@mark
- #2%
- \@firstofone{ ##2}{##3}%
- }
-% \end{macrocode}
-% The two macros to grab the optional argument have to remove the remainder of
-% the test and the wrong next step as well as grabbing the argument.
-% \begin{macrocode}
-\long\def\ekv@optarg@b\ekv@mark[\ekv@mark\ifnum`##1\fi\@firstofone##2##3##4##5]%
- {#2##2{##5}}
-\long\def\ekv@optargTF@b
- ##1\ekv@mark[\ekv@mark\ifnum`##2\fi\@firstofone##3##4##5]%
- {#2 ##1{##5}}
-}
-% \end{macrocode}
-% Do the definitions and add the test macro. We use |\ekv@strip| to remove the
-% trailing space from the definition of |\ekv@alignsafe|.
-% \begin{macrocode}
-\ekv@exparg
- {%
- \expandafter\ekv@strip\expandafter
- {\expandafter\ekv@mark\ekv@alignsafe}%
- \ekvoptarg
- }%
- \ekv@endalignsafe
-\long\def\ekv@optarg@if#1\ekv@mark[\ekv@mark{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ekverr}
-% \begin{macro}[internal]{\ekv@err@collect,\ekv@err@cleanup}
-% Since |\ekvset| is fully expandable as long as the code of the keys is (which
-% is unlikely) we want to somehow throw expandable errors, in our case via
-% a runaway argument (to my knowledge the first version of this method was
-% implemented by Jean-François Burnol, many thanks to him). The first step is to
-% ensure that the second argument (which might contain user input) doesn't
-% contain tokens we use as delimiters (in this case |\par|), this will be done
-% by the front facing macro |\ekverr|. But first we set some other things up.
-%
-% We use a temporary definition for |\ekverr| to get multiple consecutive
-% spaces. Then we set up the macro that will collect the error and the macro
-% that will throw the error. The latter will have an unreasonable long name.
-% This way we can convey more information. Though the information in the macro
-% name is static and has to be somewhat general to fit every occurence. The
-% important bit is that the long named macro has a delimited argument and is
-% short which will throw the error at the |\par| at the end of
-% |\ekv@err@collect|. This macro has the drawback that it will only print nicely
-% if the |\newlinechar| is |^^J|.
-% \begin{macrocode}
-\def\ekv@err@cleanup\par{}
-\def\ekv@err@collect#1%
- {%
- \def\ekv@err@collect##1\par##2%
- {%
- \expandafter
- \ekv@err@cleanup
- #1! ##2 Error: ##1\par
- }%
- \def#1##1\thanks@jfbu{}%
- }
-\def\ekverr{ }
-\expandafter\ekv@err@collect\csname <an-expandable-macro>^^J%
- completed due to above exception. \ekverr If the error^^J%
- summary is \ekverr not comprehensible \ekverr see the package^^J%
- documentation.^^J%
- I will try to recover now. \ekverr If you're in inter-^^J%
- active mode hit <return> \ekverr at the ? prompt and I^^J%
- continue hoping recovery\endcsname
-% \end{macrocode}
-% \begin{macrocode}
-\long\def\ekverr#1#2{\expandafter\ekv@err@collect\detokenize{#2}\par{#1}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@err}
-% We define a shorthand to throw errors in \expkv.
-% \begin{macrocode}
-\ekv@exparg{\long\def\ekv@err#1}{\ekverr{expkv}{#1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]
-% {
-% \ekv@err@common,\ekv@err@common@,
-% \ekv@err@unknown,\ekv@err@noarg,\ekv@err@reqval
-% }
-% Now we can use |\ekv@err| to set up some error messages so that we can later
-% use those instead of the full strings.
-% \begin{macrocode}
-\long\def\ekv@err@common #1#2{\expandafter\ekv@err@common@\string#2{#1}}
-\ekv@exparg{\long\def\ekv@err@common@#1`#2' #3.#4#5}%
- {\ekv@err{#4 `#5' in set `#2'}}
-\ekv@exparg{\long\def\ekv@err@unknown#1}{\ekv@err@common{unknown key}{#1}}
-\ekv@exparg{\long\def\ekv@err@noarg #1}
- {\ekv@err@common{unwanted value for}{#1}}
-\ekv@exparg{\long\def\ekv@err@reqval #1}{\ekv@err@common{missing value for}{#1}}
-\ekv@exparg{\long\def\ekv@err@redirect@kv@notfound#1#2#3\ekv@stop}%
- {\ekv@err{no key `#2' in sets #3}}
-\ekv@exparg{\def\ekv@err@redirect@k@notfound#1#2\ekv@stop}%
- {\ekv@err{no NoVal key `#1' in sets #2}}
-% \end{macrocode}
-% \end{macro}
-%
-% Now everything that's left is to reset the category code of |@|.
-% \begin{macrocode}
-\catcode`\@=\ekv@tmp
-% \end{macrocode}
-%
-% \gobbledocstriptag
-%</tex>
-%^^A=<<
-%
-%^^A=<<
-%
-% \end{implementation}^^A=<<
-%
-% \clearpage
-% \PrintIndex
-%
-\endinput
-%
-^^A vim: ft=tex fdm=marker fmr=>>=,=<<
diff --git a/obsolete/macros/generic/expkv/expkv.pdf b/obsolete/macros/generic/expkv/expkv.pdf
deleted file mode 100644
index 2da6f6dada..0000000000
--- a/obsolete/macros/generic/expkv/expkv.pdf
+++ /dev/null
Binary files differ
diff --git a/systems/doc/luatex/luatex-modifications.tex b/systems/doc/luatex/luatex-modifications.tex
index d6dffe2740..1dd85597aa 100644
--- a/systems/doc/luatex/luatex-modifications.tex
+++ b/systems/doc/luatex/luatex-modifications.tex
@@ -1,4 +1,4 @@
-% language=uk engine=luatex runpath=texruns:manuals/luatex
+% language=us engine=luatex runpath=texruns:manuals/luatex
\environment luatex-style
@@ -1146,7 +1146,7 @@ so a separate grouping related stack is used. A side effect is that there can be
paragraphs with only a local par node followed by direction synchronization
nodes. Paragraphs like that are seen as empty paragraphs and therefore ignored.
Because \type {\noindent} doesn't inject anything but a \type {\indent} injects
-an box, paragraphs with only an indent and directions are handles as paragraphs
+an box, paragraphs with only an indent and directions are handled as paragraphs
with content.
\stopsubsection
@@ -1407,6 +1407,26 @@ incompatible. We already expose some more details.
\stopsubsection
+\startsubsection[title=Hyperlinks]
+
+\topicindex {hyperlinks}
+
+There is an experimental feature that makes multi|-|line hyper links behave a
+little better, fixing some side effects that showed up in r2l typesetting but
+also can surface in l2r. Because this got unnoticed till 2023, and because it
+depends bit on how macro packages deal with hyper links, the fix is currently
+under parameter control:
+
+\starttyping
+\pdfvariable linking = 1
+\stoptyping
+
+That way (we hope) legacy documents come out as expected, whatever those
+expectations are. One of the aspects dealt with concerns (unusual) left and right
+skips.
+
+\stopsubsection
+
\stopsection
\stopchapter
diff --git a/systems/doc/luatex/luatex.pdf b/systems/doc/luatex/luatex.pdf
index a64c02e039..2df0e1617c 100644
--- a/systems/doc/luatex/luatex.pdf
+++ b/systems/doc/luatex/luatex.pdf
Binary files differ
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index 26603310df..80cefb9f51 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -34,6 +34,7 @@ $mirrors = {
'Iran' => {
'http://ctan.yazd.ac.ir/' => 1,
'https://ctan.asis.sh/' => 1,
+ 'https://mirror.bardia.tech/ctan/' => 1,
},
'Japan' => {
'http://ring.airnet.ne.jp/archives/text/CTAN/' => 1,
@@ -134,7 +135,6 @@ $mirrors = {
},
'Portugal' => {
'https://ftp.eq.uc.pt/software/TeX/' => 1,
- 'https://mirrors.up.pt/pub/CTAN/' => 1,
},
'Romania' => {
'https://mirrors.nxthost.com/ctan/' => 1,
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index dd50931e24..6645990e63 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/2022
-depend revision/65606
+depend revision/65613
name 00texlive.image
category TLCore
-revision 65599
+revision 65614
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
@@ -4696,7 +4696,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 65605
+revision 65608
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
@@ -25215,7 +25215,7 @@ catalogue-version 0.1c
name asymptote
category TLCore
-revision 64491
+revision 65614
shortdesc 2D and 3D TeX-Aware Vector Graphics Language
longdesc Asymptote is a powerful descriptive vector graphics language
longdesc for technical drawing, inspired by MetaPost but with an
@@ -25224,9 +25224,9 @@ longdesc same high-quality level of typesetting that LaTeX does for
longdesc scientific text.
depend asymptote.ARCH
containersize 360716
-containerchecksum 1371f2d7717f22ba7693f22637a25cc4ecf24dae7fea8e4e30165d51d10457e92122b67a1f4b275c465d72bb76e0ea9948dfcb59392a8a473e8c2b178763803b
-doccontainersize 2383368
-doccontainerchecksum 6f89d7339e2dc79c173e8be371569d3637de044f8ec645c1469c2a466d32a0a778152dd75aa2e93054d154110b103087a834b5177c0f3691732178e0cea76ed6
+containerchecksum ddf7359a4fc9f4528e5d1894d23890d8d1d377a49a408019fb1756c4528da3f3e4c1a17e46234611c32c204eb6d6416d3d85991163478fce02679fb80146826f
+doccontainersize 2383376
+doccontainerchecksum c1b9280a0e4519aad6d9d27790deba65295a51206876dab98e3b7deed65bbc18609721d0e5eeb7e223660217edaa69125fa97f88747db1c08976a69a879c4740
docfiles size=1311
texmf-dist/doc/asymptote/CAD.pdf details="Using Asymptote for 2D CAD"
texmf-dist/doc/asymptote/TeXShopAndAsymptote.pdf
@@ -25762,7 +25762,7 @@ catalogue-contact-repository https://github.com/vectorgraphics/asymptote
catalogue-ctan /graphics/asymptote
catalogue-license lgpl3
catalogue-topics graphics graphics-engn
-catalogue-version 2.83
+catalogue-version 2.84
name asymptote-by-example-zh-cn
category Package
@@ -28279,7 +28279,7 @@ catalogue-version 1.0
name babel
category Package
-revision 65366
+revision 65614
shortdesc Multilingual support for LaTeX, LuaLaTeX, XeLaTeX, and Plain TeX
relocated 1
longdesc This package manages culturally-determined typographical (and
@@ -28292,22 +28292,22 @@ longdesc has to be done for each language. Included is also a set of ini
longdesc files for about 250 languages. Many language styles work with
longdesc pdfLaTeX, as well as with XeLaTeX and LuaLaTeX, out of the box.
longdesc A few even work with plain formats.
-containersize 195500
-containerchecksum 0ca65b27764337da447f3f76ab39d10cf4fad62998fd72032c8c8e5ab6401f4d1ac03c17424231656a62635f87927e62ec1abda31690fd76ffcb4182d7a72de0
-doccontainersize 889104
-doccontainerchecksum 44fa3b8265ef78e8b618e3d4b5d6a5f8b0b66b7aee5c7acf1d4f48e5fc3f85669dea3080956819cd7791c3f9e551d93cf53ceb36c407099e666a60bf4eec9296
-docfiles size=222
+containersize 196076
+containerchecksum cabf4ec50e73480eafbe8f6b4760faa07583394bd263b4556d96f5fe2e98232c0980a98a1fc0122fca8e514512851fd4457962590b3c4646f88bc6e5d005338a
+doccontainersize 903660
+doccontainerchecksum 53cf42429dbefffbd67e6f2f7c1b14fc0540a80f3701d630dde36c525e82e073e0787ad3cd833a44e168a3fa9cad217693b28298e5f564899c54410f9f2f5fda
+docfiles size=226
RELOC/doc/latex/babel/README.md details="Readme"
RELOC/doc/latex/babel/babel.pdf details="Package documentation"
-srccontainersize 723552
-srccontainerchecksum 6dfd5157844412e08d9adc87e2c4436d4e12a96a509eca3737c331788229bb720f5e60e3aa9224141dba9bc60e3e59f59a1730325608d798f5911e560fafae37
-srcfiles size=402
+srccontainersize 725032
+srccontainerchecksum 4b9652a908048875b042ef1a7ea775dc5edeb38c4f41011ea15f1c77f0efe32bb3cc1d8761702e712ee37f3a20ac577038e54af6f0b020de4e526923c4c6ce25
+srcfiles size=403
RELOC/source/latex/babel/babel.dtx
RELOC/source/latex/babel/babel.ins
RELOC/source/latex/babel/bbcompat.dtx
RELOC/source/latex/babel/bbidxglo.dtx
RELOC/source/latex/babel/locale.zip
-runfiles size=1035
+runfiles size=1036
RELOC/makeindex/babel/bbglo.ist
RELOC/makeindex/babel/bbind.ist
RELOC/tex/generic/babel/UKenglish.sty
@@ -29064,7 +29064,7 @@ catalogue-contact-repository https://github.com/latex3/babel
catalogue-ctan /macros/latex/required/babel/base
catalogue-license lppl1.3
catalogue-topics multilingual
-catalogue-version 3.84
+catalogue-version 3.85
name babel-albanian
category Package
@@ -94054,7 +94054,7 @@ catalogue-topics font font-symbol font-type1 linguistic
name diffcoeff
category Package
-revision 65559
+revision 65614
shortdesc Write differential coefficients easily and consistently
relocated 1
longdesc This package allows the easy and consistent writing of
@@ -94068,9 +94068,9 @@ longdesc The package is built on xtemplate and the configurability it
longdesc enables, extending to differentials (including simple line
longdesc elements) and jacobians.
containersize 11116
-containerchecksum f034e1e470dad26e1de89a2fe5fe4bb98f4d11ce5257e5e57466d9ea869b7fb64241ee9c613ab9abcd9cbe960ef08375057822e44a7130154f97400688cb92b9
+containerchecksum 6fe1c4769619374aed112510cec9d540603d13e79555418b86b5bb9784d4de57ac9ec374a35cfeba23e72fe4979ec4f21d164afb505afeb4c9af5b05d26390bb
doccontainersize 1326872
-doccontainerchecksum 64a24566236da01dc5b797f0dad20537347ff30d93e4f734b09cd9d8dcbb3e938dcb6f7b1145557c0b7377971322bc4984eb2adba2a11eb7bac0577fc1c5df67
+doccontainerchecksum bead98c0750aa9b0f231a647318d7a03ce188c625af49ee35974a46cf993eb9c0a92eac6dec7708c1897228898affcec1ac67ec9e6880e572c3615c029844a89
docfiles size=451
RELOC/doc/latex/diffcoeff/README.txt details="Readme"
RELOC/doc/latex/diffcoeff/diffcoeff.pdf details="Package documentation"
@@ -94086,7 +94086,7 @@ catalogue-also derivative
catalogue-ctan /macros/latex/contrib/diffcoeff
catalogue-license lppl1.3c
catalogue-topics maths expl3
-catalogue-version 5.1
+catalogue-version 5.2
name digestif
category Package
@@ -102897,7 +102897,7 @@ catalogue-version 1.6
name dvisvgm
category TLCore
-revision 64182
+revision 65614
shortdesc Convert DVI, EPS, and PDF files to Scalable Vector Graphics format (SVG)
longdesc Dvisvgm is a command line utility that converts TeX DVI as well
longdesc as EPS and PDF files to the XML-based Scalable Vector Graphics
@@ -102914,9 +102914,9 @@ longdesc the kpathsea library. For more detailed information, see the
longdesc project page.
depend dvisvgm.ARCH
containersize 880
-containerchecksum 2d491a901e151b23542aa956f7587fa36f93e43f25199868974f8b4d785d2ca1a5f4a1b92537764d28514e1919d18becf9a5cf5aa5c8eadc0637452dda93eb8d
+containerchecksum d8f5a3bf232b8c8e6e353b85a0113a68b02356ff16f9a7ef0d85162f64d182672e00da98b3f8ef3f84be21cc3beec79d50b0426288d2c2baab897583df2d73d0
doccontainersize 107332
-doccontainerchecksum 6abb236d807295d2e367a7589bbc64e42c6f8bf35cb7998487038acc17b50cc00d49bf4d22f8f061a77e604c3063d598fb48836085cb7b759fbf9479f49d4796
+doccontainerchecksum de8713033c3e6d7a7d3631afdc86970a4fbd6b5c0eaae22c2b50db5b940324b52fc6e4c8e0632b08372b98eff4f6a72d4e963c3ab102466d86e4db1db4f97c48
docfiles size=42
texmf-dist/doc/man/man1/dvisvgm.1
texmf-dist/doc/man/man1/dvisvgm.man1.pdf
@@ -102927,7 +102927,7 @@ catalogue-contact-repository https://github.com/mgieseki/dvisvgm
catalogue-ctan /dviware/dvisvgm
catalogue-license gpl3+
catalogue-topics dvi-proc
-catalogue-version 2.14
+catalogue-version 3.0.1
name dvisvgm.aarch64-linux
category TLCore
@@ -116710,7 +116710,7 @@ catalogue-version 0.0.2
name expkv
category Package
-revision 60573
+revision 65614
shortdesc An expandable key=val implementation
relocated 1
longdesc expkv is a minimalistic but fast and expandable <key>=<val>
@@ -116722,16 +116722,17 @@ longdesc for the entries in the <key=val list>. expkv has predictable
longdesc brace-stripping behaviour and handles commas and equal signs
longdesc with category codes 12 and 13 correctly. A key-defining
longdesc interface that is not as rudimentary as the macros provided in
-longdesc this package is contained in expkv-def.
-containersize 5124
-containerchecksum 18aa7282095f5c5f3664b9ff138f129acbebbeb16f5f550aad594a62eded5f08dcfee2efa9b34327c1fb5c6976e782361d2c372088c73b48d934bce1febbe068
+longdesc this package is contained in expkv-def. This package is now
+longdesc available as part of the expkv-bundle.
+containersize 5156
+containerchecksum 6c9c80a910d58d6ea8aea1f81755f571d2f6440cd1ad5149de3cab9ef2d5951b5554156011e70b900147ca6e5b767d158d344908f15649eb72aae2d94cba73b3
doccontainersize 479908
-doccontainerchecksum 2111b0638d5954b396b4e30d5a36fd078ee99477c378fb61537c8fb6365b39c1990965af8f1a3435ad088344374de329659b4822756299951585c6e19749d891
+doccontainerchecksum 9032e2ff7f220db75bb5ded244abf1dd94359bab140ff89e5139f9484aa815f04ab323f618a684467a1df4eb10ba4cec7f02673dbd09d4cb5ee15b2dc413ae61
docfiles size=121
RELOC/doc/latex/expkv/README.md details="Readme"
RELOC/doc/latex/expkv/expkv.pdf details="Package documentation"
-srccontainersize 28296
-srccontainerchecksum 9bddbc840021b8036b180bc8bf28cc2368dd705114e90bc5c511a8e666fc2e182ec3ea6d777ba6f5b712e4aa0cc30c03418a0aa6749ca77bc990a93fef39da22
+srccontainersize 28300
+srccontainerchecksum 22b593677bcdb63771c34e24f03f9e7ea616ecfa78b3a7c4ab8f3208d029c100e333e7221ca7d270a0fc2ed7a8bd592260b1b76631dc0b2ed68ec94e5e2294ad
srcfiles size=29
RELOC/source/latex/expkv/expkv.dtx
runfiles size=8
@@ -116740,14 +116741,14 @@ runfiles size=8
RELOC/tex/latex/expkv/expkv.sty
catalogue-also expkv-def
catalogue-contact-repository https://github.com/Skillmon/tex_expkv
-catalogue-ctan /macros/generic/expkv
+catalogue-ctan /obsolete/macros/generic/expkv
catalogue-license lppl1.3c
catalogue-topics keyval
catalogue-version 1.9a
name expkv-cs
category Package
-revision 62003
+revision 65614
shortdesc Define expandable key=val macros using expkv
relocated 1
longdesc This package is a frontend to define expandable macros with
@@ -116764,16 +116765,17 @@ longdesc parsing. A LaTeX package expkv-cs.sty is included to play
longdesc nicely on LaTeX's package loading system, but that package is
longdesc not needed and does not provide more functionality than the
longdesc generic code in expkv-cs.tex. Note: In this context, "cs"
-longdesc stands for "control sequence" (i.e.: macro).
-containersize 6036
-containerchecksum 2d2b736151dbd3df233d848c8b430985491da3e9b5212b34088ad0932bff4fa2e51bc50b9763da2aba76407ce18a085a839d5308e259d81e2d4d2e6e50356020
+longdesc stands for "control sequence" (i.e.: macro). This package is
+longdesc now available as part of the expkv-bundle.
+containersize 6068
+containerchecksum 7b19ae76b6f8788e052cf06ad350a3fadfb213c990bcbe21c4632a713db76f2a09ad273a5780914d4b8120ce10cb9be3676bf70b51153afc1d21ef1b71d363f4
doccontainersize 457900
-doccontainerchecksum 4375db000d07c40d1da239a1abaac2a7ac753f75c36d2bfccaab94f82c067d886395f37c8a4413034adfb3f2f49251dc21b09e5f5dcded9a4fff7d609efc084a
+doccontainerchecksum 5a0f518ede894e3f0c27aeec7f3d906dbd61d353bb49d24b8c301a0cc333b5a72c56ee54e698a8020358cb6ec11b3bdc3945b6d437cfb1c22fbed8d7f1a239fc
docfiles size=116
RELOC/doc/latex/expkv-cs/README.md details="Readme"
RELOC/doc/latex/expkv-cs/expkv-cs.pdf details="Package documentation"
srccontainersize 26964
-srccontainerchecksum 43078d5499d8f2586be022bda7d77c9a9678686bd633eaf790faf289a3e6bb583ed4f66f65a6f4c64f3d8f594652be326f5a05a5cdeecf43e7d3ed6694d53a1d
+srccontainerchecksum 877b718451784d5b7dc602c685b149c4695b65f17acb980ac84e06a5a73ce54f846a2a7f5dba54233db8b7ce40c46b90afeb48b29d2e9d900c90ec0ca4aa28b8
srcfiles size=31
RELOC/source/latex/expkv-cs/expkv-cs.dtx
runfiles size=11
@@ -116782,14 +116784,14 @@ runfiles size=11
RELOC/tex/latex/expkv-cs/expkv-cs.sty
catalogue-also expkv expkv-def
catalogue-contact-repository https://github.com/Skillmon/tex_expkv-cs
-catalogue-ctan /macros/generic/expkv-cs
+catalogue-ctan /obsolete/macros/generic/expkv-cs
catalogue-license lppl1.3c
catalogue-topics keyval macro-supp macro-gen
catalogue-version 1.2
name expkv-def
category Package
-revision 61796
+revision 65614
shortdesc A key-defining frontend for expkv
relocated 1
longdesc This package provides a key=val interface to define keys for
@@ -116800,16 +116802,17 @@ longdesc l3keys. expkv-def is generic code and only requires expkv for
longdesc its parsing. There is a LaTeX package expkv-def.sty included to
longdesc play nicely on LaTeX's package loading system, but that package
longdesc is not needed and does not provide more functionality than the
-longdesc generic code in expkv-def.tex.
-containersize 5552
-containerchecksum e783fff82e60385cf5f6bf71df65fe7f78e96cb872a1219d5a525583160d5dd1ca04951f9e57fcff5894fb5e81ecb86771cf485df45a528a6437040f4b22345d
-doccontainersize 413008
-doccontainerchecksum 675f3593096ca214caf706dbd65f8c2a6fc3b334b83ad2e04c3eec562cb940ebe0839108a7c27a4a9d99ab3ce3137d0e195a6ca35f148e1a790d3054f2f4b35b
+longdesc generic code in expkv-def.tex. This package is now available as
+longdesc part of the expkv-bundle.
+containersize 5588
+containerchecksum 2d7d450885fca75fda5bede7911dae663df16f1da13a3d77bd9018aef83203d754e301ab047eb6c2d3a02d4e58e030888891371b3aa54140e954a83400dc9833
+doccontainersize 413012
+doccontainerchecksum 93754d6e31a5f2b283d162a0a22ca55473119f41457d325727630e20e1d080c7d25bc0d95710be44999c4f01944ae0d9d7679126ba7afc7479002182f913aef6
docfiles size=105
RELOC/doc/latex/expkv-def/README.md details="Readme"
RELOC/doc/latex/expkv-def/expkv-def.pdf details="Package documentation"
srccontainersize 18824
-srccontainerchecksum 52387ba0731a46eaa32792cf1f552116a82357ac23f13235dc3013944435c157736800278047424a6151a47bce3fdedd104af5ab03ca08a097d421e96c75e1f7
+srccontainerchecksum 6268cdf3192df67427fbe70ad7a1fbee495fa84f312a020fb74830b8a50b937521b9cfc270fd5d73f50e2455c722d7832b11f712823c0535c52bb4f237c8d5c9
srcfiles size=22
RELOC/source/latex/expkv-def/expkv-def.dtx
runfiles size=10
@@ -116818,30 +116821,31 @@ runfiles size=10
RELOC/tex/latex/expkv-def/expkv-def.sty
catalogue-also expkv
catalogue-contact-repository https://github.com/Skillmon/tex_expkv-def
-catalogue-ctan /macros/generic/expkv-def
+catalogue-ctan /obsolete/macros/generic/expkv-def
catalogue-license lppl1.3c
catalogue-topics keyval
catalogue-version 0.9
name expkv-opt
category Package
-revision 58772
+revision 65614
shortdesc Parse class and package options with expkv
relocated 1
longdesc This package provides option parsing for classes and packages
longdesc in LaTeX2e based on expkv. Global and local options are parsed
longdesc individually by different commands. The package supports
longdesc key=value options and keys without a value. expkv is the only
-longdesc required package.
-containersize 2908
-containerchecksum 8b6203aaeb7a2c86c355a67ad02857d5ddacf5e85f04143b0f0225c2fb4a00c1f6e88b6b1c5a872c1c092680ffbfb19148c8a97e8537babe97b969355b63fce0
+longdesc required package. This package is now available as part of the
+longdesc expkv-bundle.
+containersize 2944
+containerchecksum a603d3fbb734b915030156399848177f1bea011faa71f548cb829e7b44723cbf2cc2795f3995f6a75f6cdef7bf7f18cefde413a546504a6dddfc99a2c81d6af0
doccontainersize 264172
-doccontainerchecksum 12312e21d7d15e9ba60800243cebe4b7ab2ea52a31c37f25446b6fe0ef413e9d33d4066d139b3fca1375dc9cfe357a65ec58e7ef1d3b28472da368dedac3213c
+doccontainerchecksum e9d6fa6e0940f49cbf8302bc0faf94ce95e638adc773e4e4ad6a6e8f947038c3590810df1871b009cb246348f1d147950353d6dfd90675b0c6a549feb5bb8ffe
docfiles size=67
RELOC/doc/generic/expkv-opt/README.md details="Readme"
RELOC/doc/generic/expkv-opt/expkv-opt.pdf details="Package documentation"
-srccontainersize 9288
-srccontainerchecksum 4fe886ef42bd181f521015225b92ae15a16d9b2d34001119f49bc417cddead7fccd437b0f4263c1f24525060a7f94f423db38fc8f677212fb330f690eaf9a676
+srccontainersize 9292
+srccontainerchecksum ad262df3cb14c55c4ca10808e63c0a14afcf0ea837a5a0f6b9a0d6fecc0792337c68d6ebf3efa1d6fff8052158588f14a801278f20c63e0e6367f2e42a30e8bc
srcfiles size=17
RELOC/source/generic/expkv-opt/expkv-opt-2020-10-10.dtx
RELOC/source/generic/expkv-opt/expkv-opt.dtx
@@ -116850,7 +116854,7 @@ runfiles size=6
RELOC/tex/generic/expkv-opt/expkv-opt.sty
catalogue-also expkv
catalogue-contact-repository https://github.com/Skillmon/tex_expkv-opt
-catalogue-ctan /macros/generic/expkv-opt
+catalogue-ctan /obsolete/macros/generic/expkv-opt
catalogue-license lppl1.3c
catalogue-topics keyval
catalogue-version 0.2
@@ -125059,24 +125063,24 @@ catalogue-version 1.1
name fixdif
category Package
-revision 64835
+revision 65614
shortdesc Macros for typesetting differential operators
relocated 1
longdesc This package redefines the \d command in LaTeX and provides an
longdesc interface to define new commands for differential operators. It
longdesc is compatible with pdfTeX, XeTeX and LuaTeX, and can also be
longdesc used with the unicode-math package.
-containersize 1812
-containerchecksum bf27ebfc5e138f0bc1bd3089147c0ba822f46cfbc559e53e1d066a0b764d267de9148d492abb14bbab6d22a54eaa65bb0a7fb8378628b186b12c5caf2edd03b4
+containersize 1792
+containerchecksum 6e76d25f2be0afcff2f51f537070800a54e23684ab78d8cacaaf116c9a29e01faa2a54b973badd08a235dbd3ffd0a62d80bac19d15b7149deaae753a27ff6aa1
doccontainersize 261224
-doccontainerchecksum eb81a3dbfaf3d50f1d6f99f343a92d69eebb23a02a37e09fba804c0e32e794f1046734702ba8f1a202af453e042f405733fccd6fb750b3da1dde2ff473708c79
+doccontainerchecksum cdfaeaaad0cea3dfe62f4e522b21cb919ca79dbd224a687f9ba12ab4d378f8f8902e8cdfb466e89976e7192adc4cb110dc91f6bda148a2222f88c545c239c292
docfiles size=70
RELOC/doc/latex/fixdif/README.md details="Readme"
RELOC/doc/latex/fixdif/fixdif-zh-cn.pdf details="Package documentation (Chinese)" language="zh"
RELOC/doc/latex/fixdif/fixdif-zh-cn.tex
RELOC/doc/latex/fixdif/fixdif.pdf details="Package documentation (English)"
srccontainersize 6988
-srccontainerchecksum 165dccd63c11c3eb7541a767a1429f572493041a69e3f0fefc3f491fe3e3d923a473f3592e2d3fcc2297174f29fbe42e474025081c3a0050455f8954a183299a
+srccontainerchecksum a4adeb4caec7683cee697b8caa497b02f5ab26aab01c6efef958cae68ba9b09c24a792a3bf70adf241fd6e719eedf6ee71f0b8bb10b3b83508683d114c2610b3
srcfiles size=7
RELOC/source/latex/fixdif/fixdif.dtx
RELOC/source/latex/fixdif/fixdif.ins
@@ -125085,11 +125089,10 @@ runfiles size=1
catalogue-contact-bugs https://github.com/AlphaZTX/fixdif/issues
catalogue-contact-development https://www.ctan.org/author/zhang-tx
catalogue-contact-repository https://github.com/AlphaZTX/fixdif
-catalogue-contact-support https://github.com/CTeX-org/forum
catalogue-ctan /macros/latex/contrib/fixdif
catalogue-license lppl1.3c
catalogue-topics maths
-catalogue-version 1.4b
+catalogue-version 1.5
name fixfoot
category Package
@@ -130391,7 +130394,7 @@ catalogue-version 1.3
name frenchmath
category Package
-revision 65363
+revision 65614
shortdesc Typesetting mathematics according to French rules
relocated 1
longdesc The package provides: capital letters in roman (upright shape)
@@ -130402,15 +130405,15 @@ longdesc before a semicolon and around square brackets, some useful
longdesc macros and aliases for symbols used in France: \infeg, \supeg,
longdesc \paral, ... several macros for writing french operator names
longdesc like pgcd, ppcm, Card, rg, Vect, ...
-containersize 2776
-containerchecksum 4cef48d6de4fe0fb33c0ec402ac1587e397d6d793e2599f69701e6ea587603c282e7a045da8002aed6d9f8b1bb006ffdb87f3eb88260f96c1ff3eaeb802decba
+containersize 2780
+containerchecksum 2934bf06a5ddfc9f8228fa34bbf42b47cd8319fb3fac65b9b25fbe7482c92ead6b066e3918ea935cd001967cc85f8fa4730020ea7988b45e45b02e671a3d49ac
doccontainersize 230184
-doccontainerchecksum 6cc04bb2f1bd4bbf5405450ad79057d1e3591afb1c4dbafd1b22d450e6003ba47a4a7517534dc0b23f94fc1ea8c70f28d0703e862d261eeb6737debba15c6b95
+doccontainerchecksum 34ad61bdd94839682ca34ed0cd0367737031057039981eb63593b6c951cd27ec0ee7ab80fd85532599ec5d2de7310326af5ad5ea2200596a2823749e4fd97dcc
docfiles size=65
RELOC/doc/latex/frenchmath/README.md details="Readme"
RELOC/doc/latex/frenchmath/frenchmath.pdf details="Package documentation" language="fr"
srccontainersize 13044
-srccontainerchecksum a539fa620fe43b8c5159ed7cec25df941a673aa8cb3914d7ecaaff045e7d1b911a3a39ce8cdb30afa4c66b9a9dc4bc85de096c032fa2fa10ee2f7041d9bd018a
+srccontainerchecksum 7457ffb5a7939a85a985be44c65ce4a16de873d2c7c43a670461970c90c43449d41f488547c69e701d2ec1d378aa26073706b0f628b6eb1039792d1ccb812c24
srcfiles size=11
RELOC/source/latex/frenchmath/frenchmath.dtx
RELOC/source/latex/frenchmath/frenchmath.ins
@@ -130419,7 +130422,7 @@ runfiles size=3
catalogue-ctan /macros/latex/contrib/frenchmath
catalogue-license lppl1.3
catalogue-topics maths french
-catalogue-version 2.3
+catalogue-version 2.4
name frimurer
category Package
@@ -145478,21 +145481,21 @@ catalogue-version 2.7
name hypdoc
category Package
-revision 63808
+revision 65614
shortdesc Hyper extensions for doc.sty
relocated 1
longdesc This package adds hypertext features to the package doc that is
longdesc used in the documentation system of LaTeX2e. Bookmarks are
longdesc added and references are linked as far as possible.
-containersize 3552
-containerchecksum 4548bd373db79c702c18f37c22932c8f06168caf0a3a2504becf9a614670dfe2151bb06ded5697b5f9af950124227bec1b52be899b096698f1855d64b05b1ffd
+containersize 3556
+containerchecksum 6a0906e7cca733d9af52ca4b05d96276b8b4dea731892f09a9a074f7638246ee1397e03d49a0fd0771ca8242f785c3fd9e5ae6878a4d16760ec32ebd95a42251
doccontainersize 324844
-doccontainerchecksum 871e666881ae541eed39e7464a151f23b6d4cc89dca269440aa3d813408cc273fab0a93de8e4ddbdd1d232290995388a0a7838a8990874d7640e9140996acf2a
+doccontainerchecksum ef008fb98ab515cdfa51d09bfa14f1b6a139f0e24b47408734092eda033d2637bd7d6855a3438fd9b94c69f64cc1ab8bbb41fae20726832b8c70ee8d12bbbf45
docfiles size=83
RELOC/doc/latex/hypdoc/README.md details="Readme"
RELOC/doc/latex/hypdoc/hypdoc.pdf details="Package documentation"
srccontainersize 8528
-srccontainerchecksum b1896e5ebdb8fa5048d1645c2d1a067c33314cd9edbf21a5f572c0ec1828db6050943fc7c9f19dc8522fd9ee810e5527304f3503ad8f4b71f378eb46cdcfe4b1
+srccontainerchecksum 389164b7e9080f677435e216b5cc69d7041697f71b533dcf62cb9528d3f1ff0d67692cb1e5784c1242d682dc41db5f0260d30a01d5f1dfb2c48465b6c2783a88
srcfiles size=9
RELOC/source/latex/hypdoc/hypdoc.dtx
runfiles size=3
@@ -145502,7 +145505,7 @@ catalogue-contact-repository https://github.com/ho-tex/hypdoc
catalogue-ctan /macros/latex/contrib/hypdoc
catalogue-license lppl1.3c
catalogue-topics doc-supp hyper
-catalogue-version 1.17
+catalogue-version 1.18
name hypdvips
category Package
@@ -175456,7 +175459,7 @@ catalogue-topics ref-latex documentation french-doc
name latex2e-help-texinfo-spanish
category Package
-revision 61937
+revision 65614
catalogue latex2e-help-texinfo
shortdesc Unofficial reference manual covering LaTeX2e
relocated 1
@@ -175467,16 +175470,15 @@ longdesc development, and details of getting involved are to be found on
longdesc the package home page. A French translation is available as a
longdesc separate package. All the other formats in the distribution are
longdesc derived from the Texinfo source, as usual.
-containersize 736
-containerchecksum 30d0f3b0d2f7ce86b7c6e2bc69034a7776403951aed97e0a3d9bf3c5ed0b22e7a448153e40145b429c72a9b8f5908fbd70a683f60fa98339349d0779e9329d6a
-doccontainersize 873272
-doccontainerchecksum 52960e408e53170648aa3f8978ad0a4cd6e65657e3491f249006114883f7d5f06ef339aa8ce6035815c5d20da1e4d0fbcbd5192c525fe9ac92631642dafae2ee
-docfiles size=758
+containersize 740
+containerchecksum 870c8f3af54ac42df5f4958669cf730cd16084c985f0b377c5aba9d526b8f7be14b367791d2c0a1f1a715739390ab63777ff2a92e7f9aad09897c8bbecff495e
+doccontainersize 2013468
+doccontainerchecksum 4c751a7305e089dab61bf991436ab1e612cfca0d17e416e21d659c04ef32eeb2d14dbeb09d63649a2b79f842766a218c43ae2c6fbeeba5549f039f991049a79d
+docfiles size=1982
RELOC/doc/info/latex2e-es.info
RELOC/doc/latex/latex2e-help-texinfo-spanish/latex2e-es.dbk
RELOC/doc/latex/latex2e-help-texinfo-spanish/latex2e-es.html details="HTML conversion of the source (Spanish)" language="es"
- RELOC/doc/latex/latex2e-help-texinfo-spanish/latex2e-es.pdf
- RELOC/doc/latex/latex2e-help-texinfo-spanish/latex2e-es.texi
+ RELOC/doc/latex/latex2e-help-texinfo-spanish/latex2e-es.pdf details="PDF conversion of the source (Spanish)" language="es"
RELOC/doc/latex/latex2e-help-texinfo-spanish/latex2e-es.txt
RELOC/doc/latex/latex2e-help-texinfo-spanish/latex2e-es.xml
catalogue-contact-bugs https://puszcza.gnu.org.ua/bugs/?group=latexrefman
@@ -198482,17 +198484,18 @@ catalogue-version 1.0
name make4ht
category Package
-revision 62953
+revision 65613
shortdesc A build system for tex4ht
longdesc make4ht is a simple build system for tex4ht, a TeX to XML
longdesc converter. It provides a command line tool that drives the
longdesc conversion process. It also provides a library which can be
longdesc used to create customized conversion tools.
depend make4ht.ARCH
-containersize 51816
-containerchecksum 591b69770285fee1f3bd407e176b6e783ccca6d217a0f147780da9c535a4ae7e87e95a8a9bd3a220b342a3397df3845934e229ecf7f2bea0085acf94983461a1
-doccontainersize 177016
-doccontainerchecksum b83f6cb2d6b514e4514512f803c916f943b2b915d4a1de02e0f1c304072e41e673317c02e43f777159ff60a775a9ccdff528277885c5305110383c2ac4022d12
+depend tex4ht
+containersize 51820
+containerchecksum e9286cd93a60fcdfa00243f47d0d7c43cc2ee87e9ac84274f86513cd8dda02a9d9c2e557d2d140aa6272e8c8118f6a4112ee4969d667c2e7677ca69a9f3a3e9e
+doccontainersize 177020
+doccontainerchecksum f9a5130c1d09f66026140c67b167a74842fa71a3d69c8e9d7e314c2a987b958d5978b1ce4d8fdab31fcacfc4a4de8f5f4591274b63e78173969cfe10d9d12516
docfiles size=72
texmf-dist/doc/support/make4ht/README details="Readme"
texmf-dist/doc/support/make4ht/changelog.tex
@@ -281008,7 +281011,7 @@ catalogue-version 0.302
name semantex
category Package
-revision 65183
+revision 65614
shortdesc Semantic, keyval-based mathematics
relocated 1
longdesc The SemanTeX package for LaTeX delivers a more semantic,
@@ -281026,9 +281029,9 @@ longdesc it at this point should be safe. Still, suggestions, ideas, and
longdesc bug reports are more than welcome!
depend semtex
containersize 26516
-containerchecksum 057b229640da956b4c36653cc1e4057317d9fb2123a69aa144078b52192a2aa8d43660a41124fd91b147ebba5473ca43c30a70fc55881daa52f6b7ded05666b3
-doccontainersize 420248
-doccontainerchecksum 6cddaebc42ce355e536fc515b726cc6344f885efd67041b564a4b8c2bd297969aa5aded0a989c5a4b3a30d574af977e44880e2ef8be8d3fae052ef44c9d6b2f9
+containerchecksum 110354e10f5fdadc7886670cf4ead51e3a0c6f48221b81461ec0c3f95402f3f4c6b3ec10bf47dab5aeab600a602ff4bff37750702cf10383befa219ee891ca53
+doccontainersize 420252
+doccontainerchecksum 35d2b28b013697f85750a5253190cfc660358177b5339005fe8337f6a9e455e31baffad7d0c45c51808efca7f8931982f7673b7fafef8df779f1d3a41d1601b5
docfiles size=144
RELOC/doc/latex/semantex/README.md details="Readme"
RELOC/doc/latex/semantex/semantex.pdf details="Package documentation"
@@ -281041,7 +281044,7 @@ catalogue-contact-repository https://github.com/sorsted/SemanTeX
catalogue-ctan /macros/latex/contrib/semantex
catalogue-license lppl1.3c
catalogue-topics maths expl3
-catalogue-version 0.523
+catalogue-version 0.525
name semantic
category Package
@@ -300481,16 +300484,18 @@ binfiles arch=x86_64-solaris size=107
name tex4ebook
category Package
-revision 62076
+revision 65613
shortdesc Converter from LaTeX to ebook formats
longdesc This is a bundle of Lua scripts and LaTeX packages for
longdesc conversion of LaTeX files to ebook formats such as epub, mobi
longdesc and epub3. tex4ht is used as the conversion engine.
+depend make4ht
depend tex4ebook.ARCH
-containersize 17748
-containerchecksum ce9a19544d63fdec5e37fd129bfc87c6fa7c35ebfd719a703b9ba59dfd4ddcded42d03d075f2fd80730a5f295b2393c083098e5782b3a0ab2cbace335bb78c50
+depend tex4ht
+containersize 17760
+containerchecksum 87627daa382e1a560ee32ebe6d7f43d7a64e5f02cf8701b37b32380e226342a1b7809e59a148bac51194bd5a9f9c4d57a2a60f0cf245db361a2a5a61367b4918
doccontainersize 95544
-doccontainerchecksum 08bfe7b1ca1b245174df6b4e4a1640ba0cf7c5c821ed76cb9b85b512055088354ab0d59383b5973720fd83b298efae795f46a61c7cc95c2816edd57408c4efd7
+doccontainerchecksum ce4f4f50a3348ebb891a547e68eeb50400f59681ebf146d104aeec566cafa7a5752c3ebbe8163ab822f774617961a91fa497880456058934c5ba00589f5d9850
docfiles size=36
texmf-dist/doc/support/tex4ebook/README details="Readme"
texmf-dist/doc/support/tex4ebook/changelog.tex
@@ -311543,7 +311548,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 65605
+revision 65608
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.
@@ -311551,10 +311556,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 113672
-containerchecksum e19acc3416704f0dcd98113563d29dac824027521700c18ea218467ba5f261c71cd78272c9563c2ee8bad319163d7263d1a6119e36f6813259b5ab9b713fd9dd
-doccontainersize 424228
-doccontainerchecksum 904fb042462b1df89383d42e1b5e2a2c1d22d5c97621aec3536f413cc81f2c8edba80542262da4fa26b45a797c90dab9ac51d6134cdbb906129a8fa72446e0bf
+containersize 113688
+containerchecksum bd2405608872924dd93ee3c1b6615ccc4cdfb5368b85225cf6b188bb66292af41c34da51549d98fe920633394bc29b957243ba1439e6cd421cdde3df30bab2ce
+doccontainersize 424232
+doccontainerchecksum 726462f0d0c293331f9af064d7afff392a0435177f8cbbf77be3bea22a8701dc97eea27eb2af9422072ac8c5d7ff1b0dc14fee95d45a2b5f5e03c18dd57e78f9
docfiles size=533
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
@@ -320445,18 +320450,18 @@ catalogue-version 1.45c
name tkz-euclide
category Package
-revision 64491
+revision 65614
shortdesc Tools for drawing Euclidean geometry
relocated 1
longdesc The tkz-euclide package is a set of files designed to give math
longdesc teachers and students easy access to the programming of
longdesc Euclidean geometry with TikZ.
-containersize 39184
-containerchecksum 2361529e4dac444618e2ec83d76631ea2b5b601de6e2685afd7f3d92f4b656a970694630ddf177da86845e19dcc959ace5d339bb377944f7e04f9fc580efb3c5
-doccontainersize 1165688
-doccontainerchecksum 4e9a14b8a7c8e5e3420a0d5628262314b97f0c05bba1a9cfb2a9e94e3663909c35b4a2c52fdaf8908d8feb4a669264501ec94d22442ce26a5a1c3a8d33a713c7
-docfiles size=389
- RELOC/doc/latex/tkz-euclide/README.md details="Readme" language="en"
+containersize 42236
+containerchecksum dae166bfbe87aea5afa561765871ea45242ac15b97992475b373948b6f0a75d0ebba5d8018d5c49cc74ba6f4bb1cff2ef014af6965a439fb0576021b09542356
+doccontainersize 1171368
+doccontainerchecksum 06958ae20174e029e5ce14aa6530a876182e2389f0e3fc3935aa8403b0c3f2ea0d1498852e092281c06d938536ebf1b6f1c97f58e879eb2af3a6bc4b0e9e90a1
+docfiles size=391
+ RELOC/doc/latex/tkz-euclide/README.md details="Readme"
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-FAQ.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-angles.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-circleby.tex
@@ -320472,6 +320477,7 @@ docfiles size=389
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-intersection.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-labelling.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-lines.tex
+ RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-lua.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-main.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-marking.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-news.tex
@@ -320488,8 +320494,17 @@ docfiles size=389
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-styles.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-tools.tex
RELOC/doc/latex/tkz-euclide/TKZdoc-euclide-triangles.tex
- RELOC/doc/latex/tkz-euclide/tkz-euclide.pdf details="Package documentation" language="en"
-runfiles size=84
+ RELOC/doc/latex/tkz-euclide/tkz-euclide.pdf details="Package documentation"
+runfiles size=109
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-angles.tex
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-circles.tex
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-compass.tex
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-lines.tex
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-points.tex
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-polygons.tex
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-protractor.tex
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-sectors.tex
+ RELOC/tex/latex/tkz-euclide/tkz-draw-eu-show.tex
RELOC/tex/latex/tkz-euclide/tkz-euclide.cfg
RELOC/tex/latex/tkz-euclide/tkz-euclide.sty
RELOC/tex/latex/tkz-euclide/tkz-lib-eu-marks.tex
@@ -320497,24 +320512,19 @@ runfiles size=84
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-axesmin.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-circles-by.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-circles.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-compass.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-draw-angles.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-draw-circles.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-draw-lines.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-draw-points.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-draw-polygons.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-grids.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-lines.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-points-by.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-points-rnd.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-points-spc.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-points-with.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-points.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-polygons.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-protractor.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-sectors.tex
- RELOC/tex/latex/tkz-euclide/tkz-obj-eu-show.tex
RELOC/tex/latex/tkz-euclide/tkz-obj-eu-triangles.tex
+ RELOC/tex/latex/tkz-euclide/tkz-obj-lua-circles.tex
+ RELOC/tex/latex/tkz-euclide/tkz-obj-lua-points-by.tex
+ RELOC/tex/latex/tkz-euclide/tkz-obj-lua-points-spc.tex
+ RELOC/tex/latex/tkz-euclide/tkz-obj-lua-points-with.tex
+ RELOC/tex/latex/tkz-euclide/tkz-obj-lua-points.tex
RELOC/tex/latex/tkz-euclide/tkz-tools-eu-BB.tex
RELOC/tex/latex/tkz-euclide/tkz-tools-eu-angles.tex
RELOC/tex/latex/tkz-euclide/tkz-tools-eu-base.tex
@@ -320524,13 +320534,16 @@ runfiles size=84
RELOC/tex/latex/tkz-euclide/tkz-tools-eu-modules.tex
RELOC/tex/latex/tkz-euclide/tkz-tools-eu-text.tex
RELOC/tex/latex/tkz-euclide/tkz-tools-eu-utilities.tex
+ RELOC/tex/latex/tkz-euclide/tkz-tools-lua-angles.tex
+ RELOC/tex/latex/tkz-euclide/tkz-tools-lua-base.tex
+ RELOC/tex/latex/tkz-euclide/tkz-tools-lua-intersections.tex
+ RELOC/tex/latex/tkz-euclide/tkz-tools-lua-math.tex
catalogue-also eukleides pst-eucl
catalogue-contact-home http://altermundus.fr
-catalogue-contact-repository https://github.com/tkz-sty/tkz-euclide
catalogue-ctan /macros/latex/contrib/tkz/tkz-euclide
catalogue-license lppl1.3
catalogue-topics maths graphics-use
-catalogue-version 4.25c
+catalogue-version 5.00c
name tkz-fct
category Package
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index efee123fc1..25e70575b8 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-1049e37c3d95528caf7dae6ce516cb73 texlive.tlpdb
+bf08b73415a39b499dc082bda5632abf texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 33c1af02c1..f528ff230f 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-0efa8cf477975056447cc746ab3f547586977ce14961d4b5b37b77fa4b6c2b2ccb492feaececcd64366b5cdd88165d2e2d064e14a4b91bae527a770941b7a422 texlive.tlpdb
+55bf6963252ed2162b5a6850bd124c75c89ddec4ec6c339c191c35fb0ad314f013e4ef2cdf1b8b5d79fbdacfa23a2c737d0358443de9aaf5a92061add5c4b990 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index e9df554b1f..0eebc18135 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
@@ -1,10 +1,10 @@
-----BEGIN PGP SIGNATURE-----
-iQEcBAEBCgAGBQJjzdpUAAoJEEzhh34ZQ4xwVeEIAJmbcnbFNehAiv6ktYVhzXCA
-4xDE2KaUDToxYcnXLnpd9/XN86qHeTHPDkxvodLWQSiAfHKYjU1/N9jiHQwoqm2g
-n8QNRb2Yzop+Y1wb8M244zJqYdOye2kpBMXOkjrNGwPHLutpnB8/kSMeee9rbLU8
-a20PE18p/zwVSuIt9hYr5TgtZaPYDd8+DHv2jHwu0gM5ih+dmAbx9b8xezEKHrtI
-hTZHoCFsKvkIM2UnB1fUgfnYjtrE51n0dXlxlNGrY0VM5IoAI3jh36YSbv7kBHtR
-5J3ZY6Brg4Tzno9H4VXEYxCxkOB9/WopSrZwfRe6mzv0MaLvO7s0R795rr7QCN8=
-=g7Mi
+iQEcBAEBCgAGBQJjzyxKAAoJEEzhh34ZQ4xwJ8QH/0VknHCiGeMWAl68YT39GCo8
+wMds0kqwoOkb4mZWYYiud4CzihpJHRYYjzgrVIGBPIozV9fcG1uLlYPw4hyeoYRy
+2ECWpwGz33/VCuKRr0AtZPXfKV+fIahYymjUfCax2380M7S+rwOU+aQB8gjiAQsf
+8amC1zRWYILSavW0tWlaE16UzBqpyarQUHUf/veB5gtWo6lENLFiWsiohS5SZUT3
+LZXONWpFcTLHqGF7Yfc0XcpVgSAuCW6PHFGbNDL0B35v8EI7Sq7w2hxAjNpcm5o2
+S0BrzxtPhMDj+fnYAMvcpCoBhZ8vv2jxELEwkYT19VjVlvyMLEJ4c+QnQUo9gno=
+=485G
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 36fc71f0f1..76cc679adc 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 f3a67466ce..b0968dee85 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:
-2023-01-24-02-02
+2023-01-25-02-02